mirror of
https://github.com/lumapu/ahoy.git
synced 2025-06-14 00:21:44 +02:00
0.7.50
* moved MqTT info to `system` * added CMT info for ESP32 devices * improved CMT settings, now `SCLK` and `SDIO` are configurable #1046, #1150 * changed `Power-Limit` in live-view to `Active Power Control` * increase length of update file selector #1132
This commit is contained in:
parent
581a64a48e
commit
b06f8e98a4
17 changed files with 139 additions and 107 deletions
|
@ -1,5 +1,12 @@
|
||||||
# Development Changes
|
# Development Changes
|
||||||
|
|
||||||
|
## 0.7.50 - 2023-09-12
|
||||||
|
* moved MqTT info to `system`
|
||||||
|
* added CMT info for ESP32 devices
|
||||||
|
* improved CMT settings, now `SCLK` and `SDIO` are configurable #1046, #1150
|
||||||
|
* changed `Power-Limit` in live-view to `Active Power Control`
|
||||||
|
* increase length of update file selector #1132
|
||||||
|
|
||||||
## 0.7.49 - 2023-09-11
|
## 0.7.49 - 2023-09-11
|
||||||
* merge PR: symbolic icons for mono displays, PR #1136
|
* merge PR: symbolic icons for mono displays, PR #1136
|
||||||
* merge MI code restructuring PR #1145
|
* merge MI code restructuring PR #1145
|
||||||
|
|
|
@ -42,7 +42,7 @@ void app::setup() {
|
||||||
}
|
}
|
||||||
#if defined(ESP32)
|
#if defined(ESP32)
|
||||||
if(mConfig->cmt.enabled) {
|
if(mConfig->cmt.enabled) {
|
||||||
mCmtRadio.setup(mConfig->cmt.pinCsb, mConfig->cmt.pinFcsb, false);
|
mCmtRadio.setup(mConfig->cmt.pinSclk, mConfig->cmt.pinSdio, mConfig->cmt.pinCsb, mConfig->cmt.pinFcsb, false);
|
||||||
mCmtRadio.enableDebug();
|
mCmtRadio.enableDebug();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -111,7 +111,7 @@ void app::setup() {
|
||||||
mWeb.setup(this, &mSys, mConfig);
|
mWeb.setup(this, &mSys, mConfig);
|
||||||
mWeb.setProtection(strlen(mConfig->sys.adminPwd) != 0);
|
mWeb.setProtection(strlen(mConfig->sys.adminPwd) != 0);
|
||||||
|
|
||||||
mApi.setup(this, &mSys, &mNrfRadio, mWeb.getWebSrvPtr(), mConfig);
|
mApi.setup(this, &mSys, mWeb.getWebSrvPtr(), mConfig);
|
||||||
|
|
||||||
// Plugins
|
// Plugins
|
||||||
if (mConfig->plugin.display.type != 0)
|
if (mConfig->plugin.display.type != 0)
|
||||||
|
|
20
src/app.h
20
src/app.h
|
@ -45,11 +45,11 @@ typedef HmSystem<MAX_NUM_INVERTERS> HmSystemType;
|
||||||
typedef HmPayload<HmSystemType, HmRadio<>> PayloadType;
|
typedef HmPayload<HmSystemType, HmRadio<>> PayloadType;
|
||||||
typedef MiPayload<HmSystemType, HmRadio<>> MiPayloadType;
|
typedef MiPayload<HmSystemType, HmRadio<>> MiPayloadType;
|
||||||
#ifdef ESP32
|
#ifdef ESP32
|
||||||
typedef CmtRadio<esp32_3wSpi<>> CmtRadioType;
|
typedef CmtRadio<esp32_3wSpi> CmtRadioType;
|
||||||
typedef HmsPayload<HmSystemType, CmtRadioType> HmsPayloadType;
|
typedef HmsPayload<HmSystemType, CmtRadioType> HmsPayloadType;
|
||||||
#endif
|
#endif
|
||||||
typedef Web<HmSystemType> WebType;
|
typedef Web<HmSystemType> WebType;
|
||||||
typedef RestApi<HmSystemType, HmRadio<>> RestApiType;
|
typedef RestApi<HmSystemType> RestApiType;
|
||||||
typedef PubMqtt<HmSystemType> PubMqttType;
|
typedef PubMqtt<HmSystemType> PubMqttType;
|
||||||
typedef PubSerial<HmSystemType> PubSerialType;
|
typedef PubSerial<HmSystemType> PubSerialType;
|
||||||
|
|
||||||
|
@ -75,17 +75,21 @@ class app : public IApp, public ah::Scheduler {
|
||||||
void handleIntr(void) {
|
void handleIntr(void) {
|
||||||
mNrfRadio.handleIntr();
|
mNrfRadio.handleIntr();
|
||||||
}
|
}
|
||||||
const HmRadio<>& getNrfRadioObj(void) const {
|
void* getRadioObj(bool nrf) {
|
||||||
return mNrfRadio;
|
if(nrf)
|
||||||
|
return (void*)&mNrfRadio;
|
||||||
|
else {
|
||||||
|
#ifdef ESP32
|
||||||
|
return (void*)&mCmtRadio;
|
||||||
|
#else
|
||||||
|
return NULL;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef ESP32
|
#ifdef ESP32
|
||||||
void handleHmsIntr(void) {
|
void handleHmsIntr(void) {
|
||||||
mCmtRadio.handleIntr();
|
mCmtRadio.handleIntr();
|
||||||
}
|
}
|
||||||
const CmtRadioType& getCmtRadioObj(void) const {
|
|
||||||
return mCmtRadio;
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
uint32_t getUptime() {
|
uint32_t getUptime() {
|
||||||
|
|
|
@ -68,6 +68,7 @@ class IApp {
|
||||||
virtual void getNrfRadioCounters(uint32_t *sendCnt, uint32_t *retransmits) = 0;
|
virtual void getNrfRadioCounters(uint32_t *sendCnt, uint32_t *retransmits) = 0;
|
||||||
//virtual void getCmtRadioCounters(uint32_t *sendCnt, uint32_t *retransmits) = 0;
|
//virtual void getCmtRadioCounters(uint32_t *sendCnt, uint32_t *retransmits) = 0;
|
||||||
|
|
||||||
|
virtual void* getRadioObj(bool nrf) = 0;
|
||||||
#if defined(ESP32)
|
#if defined(ESP32)
|
||||||
//virtual const CmtRadioType& getCmtRadioObj(void) const = 0;
|
//virtual const CmtRadioType& getCmtRadioObj(void) const = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -74,15 +74,21 @@
|
||||||
#define DEF_NRF_IRQ_PIN 16
|
#define DEF_NRF_IRQ_PIN 16
|
||||||
#endif
|
#endif
|
||||||
#ifndef DEF_NRF_MISO_PIN
|
#ifndef DEF_NRF_MISO_PIN
|
||||||
#define DEF_NRF_MISO_PIN 19
|
#define DEF_NRF_MISO_PIN 12
|
||||||
#endif
|
#endif
|
||||||
#ifndef DEF_NRF_MOSI_PIN
|
#ifndef DEF_NRF_MOSI_PIN
|
||||||
#define DEF_NRF_MOSI_PIN 23
|
#define DEF_NRF_MOSI_PIN 13
|
||||||
#endif
|
#endif
|
||||||
#ifndef DEF_NRF_SCLK_PIN
|
#ifndef DEF_NRF_SCLK_PIN
|
||||||
#define DEF_NRF_SCLK_PIN 18
|
#define DEF_NRF_SCLK_PIN 14
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef DEF_CMT_SCLK
|
||||||
|
#define DEF_CMT_SCLK 18
|
||||||
|
#endif
|
||||||
|
#ifndef DEF_CMT_SDIO
|
||||||
|
#define DEF_CMT_SDIO 23
|
||||||
|
#endif
|
||||||
#ifndef DEF_CMT_CSB
|
#ifndef DEF_CMT_CSB
|
||||||
#define DEF_CMT_CSB 27
|
#define DEF_CMT_CSB 27
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -94,6 +94,8 @@ typedef struct {
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
bool enabled;
|
bool enabled;
|
||||||
|
uint8_t pinSclk;
|
||||||
|
uint8_t pinSdio;
|
||||||
uint8_t pinCsb;
|
uint8_t pinCsb;
|
||||||
uint8_t pinFcsb;
|
uint8_t pinFcsb;
|
||||||
uint8_t pinIrq;
|
uint8_t pinIrq;
|
||||||
|
@ -395,10 +397,14 @@ class settings {
|
||||||
mCfg.nrf.enabled = true;
|
mCfg.nrf.enabled = true;
|
||||||
|
|
||||||
#if defined(ESP32)
|
#if defined(ESP32)
|
||||||
|
mCfg.cmt.pinSclk = DEF_CMT_SCLK;
|
||||||
|
mCfg.cmt.pinSdio = DEF_CMT_SDIO;
|
||||||
mCfg.cmt.pinCsb = DEF_CMT_CSB;
|
mCfg.cmt.pinCsb = DEF_CMT_CSB;
|
||||||
mCfg.cmt.pinFcsb = DEF_CMT_FCSB;
|
mCfg.cmt.pinFcsb = DEF_CMT_FCSB;
|
||||||
mCfg.cmt.pinIrq = DEF_CMT_IRQ;
|
mCfg.cmt.pinIrq = DEF_CMT_IRQ;
|
||||||
#else
|
#else
|
||||||
|
mCfg.cmt.pinSclk = DEF_PIN_OFF;
|
||||||
|
mCfg.cmt.pinSdio = DEF_PIN_OFF;
|
||||||
mCfg.cmt.pinCsb = DEF_PIN_OFF;
|
mCfg.cmt.pinCsb = DEF_PIN_OFF;
|
||||||
mCfg.cmt.pinFcsb = DEF_PIN_OFF;
|
mCfg.cmt.pinFcsb = DEF_PIN_OFF;
|
||||||
mCfg.cmt.pinIrq = DEF_PIN_OFF;
|
mCfg.cmt.pinIrq = DEF_PIN_OFF;
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
//-------------------------------------
|
//-------------------------------------
|
||||||
#define VERSION_MAJOR 0
|
#define VERSION_MAJOR 0
|
||||||
#define VERSION_MINOR 7
|
#define VERSION_MINOR 7
|
||||||
#define VERSION_PATCH 49
|
#define VERSION_PATCH 50
|
||||||
|
|
||||||
//-------------------------------------
|
//-------------------------------------
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
|
|
@ -184,8 +184,8 @@ class Cmt2300a {
|
||||||
public:
|
public:
|
||||||
Cmt2300a() {}
|
Cmt2300a() {}
|
||||||
|
|
||||||
void setup(uint8_t pinCsb, uint8_t pinFcsb) {
|
void setup(uint8_t pinSclk, uint8_t pinSdio, uint8_t pinCsb, uint8_t pinFcsb) {
|
||||||
mSpi.setup(pinCsb, pinFcsb);
|
mSpi.setup(pinSclk, pinSdio, pinCsb, pinFcsb);
|
||||||
init();
|
init();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -315,6 +315,8 @@ class Cmt2300a {
|
||||||
|
|
||||||
mSpi.writeReg(CMT2300A_CUS_MODE_STA, 0x52);
|
mSpi.writeReg(CMT2300A_CUS_MODE_STA, 0x52);
|
||||||
mSpi.writeReg(0x62, 0x20);
|
mSpi.writeReg(0x62, 0x20);
|
||||||
|
if(mSpi.readReg(0x62) != 0x20)
|
||||||
|
return false; // not connected!
|
||||||
|
|
||||||
for(uint8_t i = 0; i < 0x60; i++) {
|
for(uint8_t i = 0; i < 0x60; i++) {
|
||||||
mSpi.writeReg(i, cmtConfig[i]);
|
mSpi.writeReg(i, cmtConfig[i]);
|
||||||
|
|
|
@ -11,14 +11,6 @@
|
||||||
#include "driver/spi_master.h"
|
#include "driver/spi_master.h"
|
||||||
#include "esp_rom_gpio.h" // for esp_rom_gpio_connect_out_signal
|
#include "esp_rom_gpio.h" // for esp_rom_gpio_connect_out_signal
|
||||||
|
|
||||||
#if CONFIG_IDF_TARGET_ESP32S3
|
|
||||||
#define CLK_PIN 6
|
|
||||||
#define MOSI_PIN 5
|
|
||||||
#else
|
|
||||||
#define CLK_PIN 18
|
|
||||||
#define MOSI_PIN 23
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define SPI_CLK 1 * 1000 * 1000 // 1MHz
|
#define SPI_CLK 1 * 1000 * 1000 // 1MHz
|
||||||
|
|
||||||
#define SPI_PARAM_LOCK() \
|
#define SPI_PARAM_LOCK() \
|
||||||
|
@ -31,19 +23,18 @@
|
||||||
// it is simply the first externally usable hardware SPI master controller
|
// it is simply the first externally usable hardware SPI master controller
|
||||||
#define SPI_CMT SPI2_HOST
|
#define SPI_CMT SPI2_HOST
|
||||||
|
|
||||||
template<uint8_t CSB_PIN=5, uint8_t FCSB_PIN=4> //, uint8_t GPIO3_PIN=15>
|
|
||||||
class esp32_3wSpi {
|
class esp32_3wSpi {
|
||||||
public:
|
public:
|
||||||
esp32_3wSpi() {
|
esp32_3wSpi() {
|
||||||
mInitialized = false;
|
mInitialized = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void setup(uint8_t pinCsb = CSB_PIN, uint8_t pinFcsb = FCSB_PIN) { //, uint8_t pinGpio3 = GPIO3_PIN) {
|
void setup(uint8_t pinSclk = DEF_CMT_SCLK, uint8_t pinSdio = DEF_CMT_SDIO, uint8_t pinCsb = DEF_CMT_CSB, uint8_t pinFcsb = DEF_CMT_FCSB) {
|
||||||
paramLock = xSemaphoreCreateMutex();
|
paramLock = xSemaphoreCreateMutex();
|
||||||
spi_bus_config_t buscfg = {
|
spi_bus_config_t buscfg = {
|
||||||
.mosi_io_num = MOSI_PIN,
|
.mosi_io_num = pinSdio,
|
||||||
.miso_io_num = -1, // single wire MOSI/MISO
|
.miso_io_num = -1, // single wire MOSI/MISO
|
||||||
.sclk_io_num = CLK_PIN,
|
.sclk_io_num = pinSclk,
|
||||||
.quadwp_io_num = -1,
|
.quadwp_io_num = -1,
|
||||||
.quadhd_io_num = -1,
|
.quadhd_io_num = -1,
|
||||||
.max_transfer_sz = 32,
|
.max_transfer_sz = 32,
|
||||||
|
@ -83,7 +74,7 @@ class esp32_3wSpi {
|
||||||
};
|
};
|
||||||
ESP_ERROR_CHECK(spi_bus_add_device(SPI_CMT, &devcfg2, &spi_fifo));
|
ESP_ERROR_CHECK(spi_bus_add_device(SPI_CMT, &devcfg2, &spi_fifo));
|
||||||
|
|
||||||
esp_rom_gpio_connect_out_signal(MOSI_PIN, spi_periph_signal[SPI_CMT].spid_out, true, false);
|
esp_rom_gpio_connect_out_signal(pinSdio, spi_periph_signal[SPI_CMT].spid_out, true, false);
|
||||||
delay(100);
|
delay(100);
|
||||||
|
|
||||||
//pinMode(pinGpio3, INPUT);
|
//pinMode(pinGpio3, INPUT);
|
||||||
|
@ -162,13 +153,13 @@ class esp32_3wSpi {
|
||||||
.rx_buffer = &rx_data
|
.rx_buffer = &rx_data
|
||||||
};
|
};
|
||||||
|
|
||||||
SPI_PARAM_LOCK();
|
SPI_PARAM_LOCK();
|
||||||
for(uint8_t i = 0; i < len; i++) {
|
for(uint8_t i = 0; i < len; i++) {
|
||||||
ESP_ERROR_CHECK(spi_device_polling_transmit(spi_fifo, &t));
|
ESP_ERROR_CHECK(spi_device_polling_transmit(spi_fifo, &t));
|
||||||
delayMicroseconds(4); // > 4 us
|
delayMicroseconds(4); // > 4 us
|
||||||
buf[i] = rx_data;
|
buf[i] = rx_data;
|
||||||
}
|
}
|
||||||
SPI_PARAM_UNLOCK();
|
SPI_PARAM_UNLOCK();
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -29,8 +29,8 @@ class CmtRadio {
|
||||||
mCmtAvail = false;
|
mCmtAvail = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void setup(uint8_t pinCsb, uint8_t pinFcsb, bool genDtuSn = true) {
|
void setup(uint8_t pinSclk, uint8_t pinSdio, uint8_t pinCsb, uint8_t pinFcsb, bool genDtuSn = true) {
|
||||||
mCmt.setup(pinCsb, pinFcsb);
|
mCmt.setup(pinSclk, pinSdio, pinCsb, pinFcsb);
|
||||||
reset(genDtuSn);
|
reset(genDtuSn);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -64,7 +64,7 @@ class CmtRadio {
|
||||||
mSerialDebug = true;
|
mSerialDebug = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool cmtIsAvail() {
|
bool isConnected() {
|
||||||
return mCmtAvail;
|
return mCmtAvail;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -151,8 +151,7 @@ class CmtRadio {
|
||||||
if(!mCmt.reset()) {
|
if(!mCmt.reset()) {
|
||||||
mCmtAvail = false;
|
mCmtAvail = false;
|
||||||
DPRINTLN(DBG_WARN, F("Initializing CMT2300A failed!"));
|
DPRINTLN(DBG_WARN, F("Initializing CMT2300A failed!"));
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
mCmtAvail = true;
|
mCmtAvail = true;
|
||||||
mCmt.goRx();
|
mCmt.goRx();
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,7 +31,7 @@ const uint8_t acList[] = {FLD_UAC, FLD_IAC, FLD_PAC, FLD_F, FLD_PF, FLD_T, FLD_Y
|
||||||
const uint8_t acListHmt[] = {FLD_UAC_1N, FLD_IAC_1, FLD_PAC, FLD_F, FLD_PF, FLD_T, FLD_YT, FLD_YD, FLD_PDC, FLD_EFF, FLD_Q, FLD_MP};
|
const uint8_t acListHmt[] = {FLD_UAC_1N, FLD_IAC_1, FLD_PAC, FLD_F, FLD_PF, FLD_T, FLD_YT, FLD_YD, FLD_PDC, FLD_EFF, FLD_Q, FLD_MP};
|
||||||
const uint8_t dcList[] = {FLD_UDC, FLD_IDC, FLD_PDC, FLD_YD, FLD_YT, FLD_IRR, FLD_MP};
|
const uint8_t dcList[] = {FLD_UDC, FLD_IDC, FLD_PDC, FLD_YD, FLD_YT, FLD_IRR, FLD_MP};
|
||||||
|
|
||||||
template<class HMSYSTEM, class HMRADIO>
|
template<class HMSYSTEM>
|
||||||
class RestApi {
|
class RestApi {
|
||||||
public:
|
public:
|
||||||
RestApi() {
|
RestApi() {
|
||||||
|
@ -42,12 +42,15 @@ class RestApi {
|
||||||
nr = 0;
|
nr = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void setup(IApp *app, HMSYSTEM *sys, HMRADIO *radio, AsyncWebServer *srv, settings_t *config) {
|
void setup(IApp *app, HMSYSTEM *sys, AsyncWebServer *srv, settings_t *config) {
|
||||||
mApp = app;
|
mApp = app;
|
||||||
mSrv = srv;
|
mSrv = srv;
|
||||||
mSys = sys;
|
mSys = sys;
|
||||||
mRadio = radio;
|
mRadioNrf = (HmRadio<>*)mApp->getRadioObj(true);
|
||||||
mConfig = config;
|
#if defined(ESP32)
|
||||||
|
mRadioCmt = (CmtRadio<esp32_3wSpi>*)mApp->getRadioObj(false);
|
||||||
|
#endif
|
||||||
|
mConfig = config;
|
||||||
mSrv->on("/api", HTTP_GET, std::bind(&RestApi::onApi, this, std::placeholders::_1));
|
mSrv->on("/api", HTTP_GET, std::bind(&RestApi::onApi, this, std::placeholders::_1));
|
||||||
mSrv->on("/api", HTTP_POST, std::bind(&RestApi::onApiPost, this, std::placeholders::_1)).onBody(
|
mSrv->on("/api", HTTP_POST, std::bind(&RestApi::onApiPost, this, std::placeholders::_1)).onBody(
|
||||||
std::bind(&RestApi::onApiPostBody, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4, std::placeholders::_5));
|
std::bind(&RestApi::onApiPostBody, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4, std::placeholders::_5));
|
||||||
|
@ -238,10 +241,11 @@ class RestApi {
|
||||||
obj[F("sketch_used")] = ESP.getSketchSize() / 1024; // in kb
|
obj[F("sketch_used")] = ESP.getSketchSize() / 1024; // in kb
|
||||||
getGeneric(request, obj);
|
getGeneric(request, obj);
|
||||||
|
|
||||||
getRadioNrf(obj.createNestedObject(F("radio")));
|
getRadioNrf(obj.createNestedObject(F("radioNrf")));
|
||||||
#if defined(ESP32)
|
#if defined(ESP32)
|
||||||
getRadioCmtInfo(obj.createNestedObject(F("radioCmt")));
|
getRadioCmtInfo(obj.createNestedObject(F("radioCmt")));
|
||||||
#endif
|
#endif
|
||||||
|
getMqttInfo(obj.createNestedObject(F("mqtt")));
|
||||||
getStatistics(obj.createNestedObject(F("statistics")));
|
getStatistics(obj.createNestedObject(F("statistics")));
|
||||||
|
|
||||||
#if defined(ESP32)
|
#if defined(ESP32)
|
||||||
|
@ -313,8 +317,8 @@ class RestApi {
|
||||||
obj[F("rx_fail")] = stat->rxFail;
|
obj[F("rx_fail")] = stat->rxFail;
|
||||||
obj[F("rx_fail_answer")] = stat->rxFailNoAnser;
|
obj[F("rx_fail_answer")] = stat->rxFailNoAnser;
|
||||||
obj[F("frame_cnt")] = stat->frmCnt;
|
obj[F("frame_cnt")] = stat->frmCnt;
|
||||||
obj[F("tx_cnt")] = mRadio->mSendCnt;
|
obj[F("tx_cnt")] = mRadioNrf->mSendCnt;
|
||||||
obj[F("retransmits")] = mRadio->mRetransmits;
|
obj[F("retransmits")] = mRadioNrf->mRetransmits;
|
||||||
}
|
}
|
||||||
|
|
||||||
void getInverterList(JsonObject obj) {
|
void getInverterList(JsonObject obj) {
|
||||||
|
@ -495,6 +499,8 @@ class RestApi {
|
||||||
|
|
||||||
#if defined(ESP32)
|
#if defined(ESP32)
|
||||||
void getRadioCmt(JsonObject obj) {
|
void getRadioCmt(JsonObject obj) {
|
||||||
|
obj[F("sclk")] = mConfig->cmt.pinSclk;
|
||||||
|
obj[F("sdio")] = mConfig->cmt.pinSdio;
|
||||||
obj[F("csb")] = mConfig->cmt.pinCsb;
|
obj[F("csb")] = mConfig->cmt.pinCsb;
|
||||||
obj[F("fcsb")] = mConfig->cmt.pinFcsb;
|
obj[F("fcsb")] = mConfig->cmt.pinFcsb;
|
||||||
obj[F("gpio3")] = mConfig->cmt.pinIrq;
|
obj[F("gpio3")] = mConfig->cmt.pinIrq;
|
||||||
|
@ -503,15 +509,16 @@ class RestApi {
|
||||||
|
|
||||||
void getRadioCmtInfo(JsonObject obj) {
|
void getRadioCmtInfo(JsonObject obj) {
|
||||||
obj[F("en")] = (bool) mConfig->cmt.enabled;
|
obj[F("en")] = (bool) mConfig->cmt.enabled;
|
||||||
|
obj[F("isconnected")] = mRadioCmt->isConnected();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void getRadioNrf(JsonObject obj) {
|
void getRadioNrf(JsonObject obj) {
|
||||||
obj[F("power_level")] = mConfig->nrf.amplifierPower;
|
|
||||||
obj[F("isconnected")] = mRadio->isChipConnected();
|
|
||||||
//obj[F("DataRate")] = mRadio->getDataRate();
|
|
||||||
//obj[F("isPVariant")] = mRadio->isPVariant();
|
|
||||||
obj[F("en")] = (bool) mConfig->nrf.enabled;
|
obj[F("en")] = (bool) mConfig->nrf.enabled;
|
||||||
|
obj[F("isconnected")] = mRadioNrf->isChipConnected();
|
||||||
|
obj[F("power_level")] = mConfig->nrf.amplifierPower;
|
||||||
|
obj[F("dataRate")] = mRadioNrf->getDataRate();
|
||||||
|
//obj[F("isPVariant")] = mRadioNrf->isPVariant();
|
||||||
}
|
}
|
||||||
|
|
||||||
void getSerial(JsonObject obj) {
|
void getSerial(JsonObject obj) {
|
||||||
|
@ -543,6 +550,14 @@ class RestApi {
|
||||||
obj[F("disp_bsy")] = (mConfig->plugin.display.type < 10) ? DEF_PIN_OFF : mConfig->plugin.display.disp_busy;
|
obj[F("disp_bsy")] = (mConfig->plugin.display.type < 10) ? DEF_PIN_OFF : mConfig->plugin.display.disp_busy;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void getMqttInfo(JsonObject obj) {
|
||||||
|
obj[F("enabled")] = (mConfig->mqtt.broker[0] != '\0');
|
||||||
|
obj[F("connected")] = mApp->getMqttIsConnected();
|
||||||
|
obj[F("tx_cnt")] = mApp->getMqttTxCnt();
|
||||||
|
obj[F("rx_cnt")] = mApp->getMqttRxCnt();
|
||||||
|
obj[F("interval")] = mConfig->mqtt.interval;
|
||||||
|
}
|
||||||
|
|
||||||
void getIndex(AsyncWebServerRequest *request, JsonObject obj) {
|
void getIndex(AsyncWebServerRequest *request, JsonObject obj) {
|
||||||
getGeneric(request, obj.createNestedObject(F("generic")));
|
getGeneric(request, obj.createNestedObject(F("generic")));
|
||||||
obj[F("ts_now")] = mApp->getTimestamp();
|
obj[F("ts_now")] = mApp->getTimestamp();
|
||||||
|
@ -569,9 +584,9 @@ class RestApi {
|
||||||
}
|
}
|
||||||
|
|
||||||
JsonArray warn = obj.createNestedArray(F("warnings"));
|
JsonArray warn = obj.createNestedArray(F("warnings"));
|
||||||
if(!mRadio->isChipConnected() && mConfig->nrf.enabled)
|
if(!mRadioNrf->isChipConnected() && mConfig->nrf.enabled)
|
||||||
warn.add(F("your NRF24 module can't be reached, check the wiring, pinout and enable"));
|
warn.add(F("your NRF24 module can't be reached, check the wiring, pinout and enable"));
|
||||||
else if(!mRadio->isPVariant() && mConfig->nrf.enabled)
|
else if(!mRadioNrf->isPVariant() && mConfig->nrf.enabled)
|
||||||
warn.add(F("your NRF24 module isn't a plus version(+), maybe incompatible"));
|
warn.add(F("your NRF24 module isn't a plus version(+), maybe incompatible"));
|
||||||
if(!mApp->getSettingsValid())
|
if(!mApp->getSettingsValid())
|
||||||
warn.add(F("your settings are invalid"));
|
warn.add(F("your settings are invalid"));
|
||||||
|
@ -579,19 +594,6 @@ class RestApi {
|
||||||
warn.add(F("reboot your ESP to apply all your configuration changes"));
|
warn.add(F("reboot your ESP to apply all your configuration changes"));
|
||||||
if(0 == mApp->getTimestamp())
|
if(0 == mApp->getTimestamp())
|
||||||
warn.add(F("time not set. No communication to inverter possible"));
|
warn.add(F("time not set. No communication to inverter possible"));
|
||||||
|
|
||||||
|
|
||||||
/*if(0 == mSys->getNumInverters())
|
|
||||||
warn.add(F("no inverter configured"));*/
|
|
||||||
|
|
||||||
if((!mApp->getMqttIsConnected()) && (String(mConfig->mqtt.broker).length() > 0))
|
|
||||||
warn.add(F("MQTT is not connected"));
|
|
||||||
|
|
||||||
JsonArray info = obj.createNestedArray(F("infos"));
|
|
||||||
if(mApp->getMqttIsConnected())
|
|
||||||
info.add(F("MQTT is connected, ") + String(mApp->getMqttTxCnt()) + F(" packets sent, ") + String(mApp->getMqttRxCnt()) + F(" packets received"));
|
|
||||||
if(mConfig->mqtt.interval > 0)
|
|
||||||
info.add(F("MQTT publishes in a fixed interval of ") + String(mConfig->mqtt.interval) + F(" seconds"));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void getSetup(AsyncWebServerRequest *request, JsonObject obj) {
|
void getSetup(AsyncWebServerRequest *request, JsonObject obj) {
|
||||||
|
@ -729,7 +731,10 @@ class RestApi {
|
||||||
|
|
||||||
IApp *mApp;
|
IApp *mApp;
|
||||||
HMSYSTEM *mSys;
|
HMSYSTEM *mSys;
|
||||||
HMRADIO *mRadio;
|
HmRadio<> *mRadioNrf;
|
||||||
|
#if defined(ESP32)
|
||||||
|
CmtRadio<esp32_3wSpi> *mRadioCmt;
|
||||||
|
#endif
|
||||||
AsyncWebServer *mSrv;
|
AsyncWebServer *mSrv;
|
||||||
settings_t *mConfig;
|
settings_t *mConfig;
|
||||||
|
|
||||||
|
|
|
@ -19,7 +19,6 @@
|
||||||
<div id="warn_info"></div>
|
<div id="warn_info"></div>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<div class="hr"></div>
|
|
||||||
<div id="note">
|
<div id="note">
|
||||||
<h3>Support this project:</h3>
|
<h3>Support this project:</h3>
|
||||||
<ul>
|
<ul>
|
||||||
|
@ -157,14 +156,11 @@
|
||||||
document.getElementById("iv").replaceChildren(p);
|
document.getElementById("iv").replaceChildren(p);
|
||||||
}
|
}
|
||||||
|
|
||||||
function parseWarnInfo(warn, success) {
|
function parseWarn(warn) {
|
||||||
var p = div(["none"]);
|
var p = div(["none"]);
|
||||||
for(var w of warn) {
|
for(var w of warn) {
|
||||||
p.append(svg(iconWarn, 30, 30, "icon icon-warn"), span(w), br());
|
p.append(svg(iconWarn, 30, 30, "icon icon-warn"), span(w), br());
|
||||||
}
|
}
|
||||||
for(var i of success) {
|
|
||||||
p.append(svg(iconSuccess, 30, 30, "icon icon-success"), span(i), br());
|
|
||||||
}
|
|
||||||
|
|
||||||
if(commInfo.length > 0)
|
if(commInfo.length > 0)
|
||||||
p.append(svg(iconInfo, 30, 30, "icon icon-info"), span(commInfo), br());
|
p.append(svg(iconInfo, 30, 30, "icon icon-info"), span(commInfo), br());
|
||||||
|
@ -197,7 +193,7 @@
|
||||||
parseGeneric(obj["generic"]);
|
parseGeneric(obj["generic"]);
|
||||||
parseSys(obj);
|
parseSys(obj);
|
||||||
parseIv(obj["inverter"]);
|
parseIv(obj["inverter"]);
|
||||||
parseWarnInfo(obj["warnings"], obj["infos"]);
|
parseWarn(obj["warnings"]);
|
||||||
if(exeOnce) {
|
if(exeOnce) {
|
||||||
window.setInterval("tick()", 1000);
|
window.setInterval("tick()", 1000);
|
||||||
exeOnce = false;
|
exeOnce = false;
|
||||||
|
|
|
@ -376,26 +376,26 @@
|
||||||
[3, "RX (GPIO3)"],
|
[3, "RX (GPIO3)"],
|
||||||
[4, "GPIO4"],
|
[4, "GPIO4"],
|
||||||
[5, "GPIO5"],
|
[5, "GPIO5"],
|
||||||
[12, "GPIO12"],
|
[12, "GPIO12 (HSPI MISO)"],
|
||||||
[13, "GPIO13"],
|
[13, "GPIO13 (HSPI MOSI)"],
|
||||||
[14, "GPIO14"],
|
[14, "GPIO14 (HSPI SCLK)"],
|
||||||
[15, "GPIO15"],
|
[15, "GPIO15"],
|
||||||
[16, "GPIO16"],
|
[16, "GPIO16"],
|
||||||
[17, "GPIO17"],
|
[17, "GPIO17"],
|
||||||
[18, "GPIO18"],
|
[18, "GPIO18 (VSPI SCLK)"],
|
||||||
[19, "GPIO19"],
|
[19, "GPIO19 (VSPI MISO)"],
|
||||||
[21, "GPIO21 (SDA)"],
|
[21, "GPIO21 (SDA)"],
|
||||||
[22, "GPIO22 (SCL)"],
|
[22, "GPIO22 (SCL)"],
|
||||||
[23, "GPIO23"],
|
[23, "GPIO23 (VSPI MOSI)"],
|
||||||
[25, "GPIO25"],
|
[25, "GPIO25"],
|
||||||
[26, "GPIO26"],
|
[26, "GPIO26"],
|
||||||
[27, "GPIO27"],
|
[27, "GPIO27"],
|
||||||
[32, "GPIO32"],
|
[32, "GPIO32"],
|
||||||
[33, "GPIO33"],
|
[33, "GPIO33"],
|
||||||
[34, "GPIO34"],
|
[34, "GPIO34 (in only)"],
|
||||||
[35, "GPIO35"],
|
[35, "GPIO35 (in only)"],
|
||||||
[36, "VP (GPIO36)"],
|
[36, "VP (GPIO36, in only)"],
|
||||||
[39, "VN (GPIO39)"]
|
[39, "VN (GPIO39, in only)"]
|
||||||
];
|
];
|
||||||
var esp32s3pins = [
|
var esp32s3pins = [
|
||||||
[255, "off / default"],
|
[255, "off / default"],
|
||||||
|
@ -811,13 +811,13 @@
|
||||||
ml("div", {class: "col-4 col-sm-9"}, en)
|
ml("div", {class: "col-4 col-sm-9"}, en)
|
||||||
])
|
])
|
||||||
);
|
);
|
||||||
pins = [['csb', 'pinCsb'], ['fcsb', 'pinFcsb'], ['gpio3', 'pinGpio3']];
|
pins = [['sclk', 'pinCmtSclk'], ['sdio', 'pinSdio'], ['csb', 'pinCsb'], ['fcsb', 'pinFcsb'], ['gpio3', 'pinGpio3']];
|
||||||
for(p of pins) {
|
for(p of pins) {
|
||||||
e.append(
|
e.append(
|
||||||
ml("div", {class: "row mb-3"}, [
|
ml("div", {class: "row mb-3"}, [
|
||||||
ml("div", {class: "col-12 col-sm-3 my-2"}, p[0].toUpperCase()),
|
ml("div", {class: "col-12 col-sm-3 my-2"}, p[0].toUpperCase()),
|
||||||
ml("div", {class: "col-12 col-sm-9"},
|
ml("div", {class: "col-12 col-sm-9"},
|
||||||
sel(p[1], ("ESP8266" == type) ? esp8266pins : ("ESP32-S3" == system["chip_model"]) ? esp32s3pins : esp32pins, obj[p[0]])
|
sel(p[1], ("ESP32-S3" == system["chip_model"]) ? esp32s3pins : esp32pins, obj[p[0]])
|
||||||
)
|
)
|
||||||
])
|
])
|
||||||
);
|
);
|
||||||
|
|
|
@ -20,6 +20,10 @@ fieldset, input[type=submit], .btn {
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
input[type=file] {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
#live span {
|
#live span {
|
||||||
color: var(--fg2);
|
color: var(--fg2);
|
||||||
}
|
}
|
||||||
|
|
|
@ -63,19 +63,29 @@
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
function parseRadio(obj, stat) {
|
function parseRadio(obj) {
|
||||||
const pa = ["MIN (recommended)", "LOW", "HIGH", "MAX"];
|
const pa = ["MIN (recommended)", "LOW", "HIGH", "MAX"];
|
||||||
|
const dr = ["1 M", "2 M", "250 k"]
|
||||||
|
|
||||||
if(obj.en)
|
if(obj.radioNrf.en)
|
||||||
lines = [
|
lines = [
|
||||||
tr("NRF24L01", badge(obj.isconnected, ((obj.isconnected) ? "" : "not ") + "connected")),
|
tr("NRF24L01", badge(obj.radioNrf.isconnected, ((obj.radioNrf.isconnected) ? "" : "not ") + "connected")),
|
||||||
tr("Power Level", pa[obj.power_level])
|
tr("NRF24 Power Level", pa[obj.radioNrf.power_level]),
|
||||||
|
tr("NRF24 Data Rate", dr[obj.radioNrf.dataRate] + "bps")
|
||||||
];
|
];
|
||||||
else
|
else
|
||||||
lines = tr("NRF24L01", badge(false, "not enabled"));
|
lines = [tr("NRF24L01", badge(false, "not enabled"))];
|
||||||
|
|
||||||
|
/*IF_ESP32*/
|
||||||
|
if(obj.radioCmt.en)
|
||||||
|
lines.push(tr("CMT2300A", badge(obj.radioCmt.isconnected, ((obj.radioCmt.isconnected) ? "" : "not ") + "connected")));
|
||||||
|
else
|
||||||
|
lines.push(tr("CMT2300A", badge(false, "not enabled")));
|
||||||
|
/*ENDIF_ESP32*/
|
||||||
|
|
||||||
|
var stat = obj.statistics;
|
||||||
document.getElementById("info").append(
|
document.getElementById("info").append(
|
||||||
headline("NRF Radio"),
|
headline("Radio"),
|
||||||
ml("table", {class: "table"},
|
ml("table", {class: "table"},
|
||||||
ml("tbody", {}, lines)
|
ml("tbody", {}, lines)
|
||||||
),
|
),
|
||||||
|
@ -94,23 +104,24 @@
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*IF_ESP32*/
|
function parseMqtt(obj) {
|
||||||
function parseCmt(obj) {
|
if(obj.enabled) {
|
||||||
if(obj.en)
|
|
||||||
lines = [
|
lines = [
|
||||||
tr("CMT2300A", badge(obj.isconnected, ((obj.isconnected) ? "" : "not ") + "connected"))
|
tr("connected", badge(obj.connected, ((obj.connected) ? "true" : "false"))),
|
||||||
|
tr("#TX", obj.tx_cnt),
|
||||||
|
tr("#RX", obj.rx_cnt)
|
||||||
];
|
];
|
||||||
else
|
|
||||||
lines = tr("CMT2300A", badge(false, "not enabled"));
|
} else
|
||||||
|
lines = tr("enabled", badge(false, "false"));
|
||||||
|
|
||||||
document.getElementById("info").append(
|
document.getElementById("info").append(
|
||||||
headline("CMT Radio"),
|
headline("MqTT"),
|
||||||
ml("table", {class: "table"},
|
ml("table", {class: "table"},
|
||||||
ml("tbody", {}, lines)
|
ml("tbody", {}, lines)
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
/*ENDIF_ESP32*/
|
|
||||||
|
|
||||||
function parseIndex(obj) {
|
function parseIndex(obj) {
|
||||||
if(obj.ts_sunrise > 0) {
|
if(obj.ts_sunrise > 0) {
|
||||||
|
@ -140,11 +151,9 @@
|
||||||
document.getElementsByTagName('head')[0].appendChild(meta);
|
document.getElementsByTagName('head')[0].appendChild(meta);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
parseRadio(obj.system);
|
||||||
|
parseMqtt(obj.system.mqtt);
|
||||||
parseSysInfo(obj["system"]);
|
parseSysInfo(obj["system"]);
|
||||||
parseRadio(obj["system"]["radio"], obj["system"]["statistics"]);
|
|
||||||
/*IF_ESP32*/
|
|
||||||
parseCmt(obj["system"]["radioCmt"]);
|
|
||||||
/*ENDIF_ESP32*/
|
|
||||||
getAjax('/api/index', parseIndex);
|
getAjax('/api/index', parseIndex);
|
||||||
}
|
}
|
||||||
document.getElementById("html").innerHTML = obj["html"];
|
document.getElementById("html").innerHTML = obj["html"];
|
||||||
|
|
|
@ -105,7 +105,7 @@
|
||||||
ml("div", {class: "col mx-2 mx-md-1"}, ml("span", { class: "pointer", onclick: function() {
|
ml("div", {class: "col mx-2 mx-md-1"}, ml("span", { class: "pointer", onclick: function() {
|
||||||
getAjax("/api/inverter/version/" + obj.id, parseIvVersion);
|
getAjax("/api/inverter/version/" + obj.id, parseIvVersion);
|
||||||
}}, obj.name)),
|
}}, obj.name)),
|
||||||
ml("div", {class: "col a-c"}, "Power limit " + ((obj.power_limit_read == 65535) ? "n/a" : (obj.power_limit_read + " %"))),
|
ml("div", {class: "col a-c"}, "Active Power Control: " + ((obj.power_limit_read == 65535) ? "n/a" : (obj.power_limit_read + " %"))),
|
||||||
ml("div", {class: "col a-c"}, ml("span", { class: "pointer", onclick: function() {
|
ml("div", {class: "col a-c"}, ml("span", { class: "pointer", onclick: function() {
|
||||||
getAjax("/api/inverter/alarm/" + obj.id, parseIvAlarm);
|
getAjax("/api/inverter/alarm/" + obj.id, parseIvAlarm);
|
||||||
}}, ("Alarms: " + obj.alarm_cnt))),
|
}}, ("Alarms: " + obj.alarm_cnt))),
|
||||||
|
|
|
@ -38,7 +38,7 @@
|
||||||
|
|
||||||
#define WEB_SERIAL_BUF_SIZE 2048
|
#define WEB_SERIAL_BUF_SIZE 2048
|
||||||
|
|
||||||
const char* const pinArgNames[] = {"pinCs", "pinCe", "pinIrq", "pinSclk", "pinMosi", "pinMiso", "pinLed0", "pinLed1", "pinLedHighActive", "pinCsb", "pinFcsb", "pinGpio3"};
|
const char* const pinArgNames[] = {"pinCs", "pinCe", "pinIrq", "pinSclk", "pinMosi", "pinMiso", "pinLed0", "pinLed1", "pinLedHighActive", "pinCmtSclk", "pinSdio", "pinCsb", "pinFcsb", "pinGpio3"};
|
||||||
|
|
||||||
template <class HMSYSTEM>
|
template <class HMSYSTEM>
|
||||||
class Web {
|
class Web {
|
||||||
|
@ -555,9 +555,11 @@ class Web {
|
||||||
case 6: mConfig->led.led0 = pin; break;
|
case 6: mConfig->led.led0 = pin; break;
|
||||||
case 7: mConfig->led.led1 = pin; break;
|
case 7: mConfig->led.led1 = pin; break;
|
||||||
case 8: mConfig->led.led_high_active = pin; break; // this is not really a pin but a polarity, but handling it close to here makes sense
|
case 8: mConfig->led.led_high_active = pin; break; // this is not really a pin but a polarity, but handling it close to here makes sense
|
||||||
case 9: mConfig->cmt.pinCsb = pin; break;
|
case 9: mConfig->cmt.pinSclk = pin; break;
|
||||||
case 10: mConfig->cmt.pinFcsb = pin; break;
|
case 10: mConfig->cmt.pinSdio = pin; break;
|
||||||
case 11: mConfig->cmt.pinIrq = pin; break;
|
case 11: mConfig->cmt.pinCsb = pin; break;
|
||||||
|
case 12: mConfig->cmt.pinFcsb = pin; break;
|
||||||
|
case 13: mConfig->cmt.pinIrq = pin; break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue