diff --git a/src/CHANGES.md b/src/CHANGES.md index fd8f2e50..e85814ed 100644 --- a/src/CHANGES.md +++ b/src/CHANGES.md @@ -1,5 +1,12 @@ # 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 * merge PR: symbolic icons for mono displays, PR #1136 * merge MI code restructuring PR #1145 diff --git a/src/app.cpp b/src/app.cpp index 8cefcb38..42f0f352 100644 --- a/src/app.cpp +++ b/src/app.cpp @@ -42,7 +42,7 @@ void app::setup() { } #if defined(ESP32) 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(); } #endif @@ -111,7 +111,7 @@ void app::setup() { mWeb.setup(this, &mSys, mConfig); mWeb.setProtection(strlen(mConfig->sys.adminPwd) != 0); - mApi.setup(this, &mSys, &mNrfRadio, mWeb.getWebSrvPtr(), mConfig); + mApi.setup(this, &mSys, mWeb.getWebSrvPtr(), mConfig); // Plugins if (mConfig->plugin.display.type != 0) diff --git a/src/app.h b/src/app.h index b5dccdae..39eeb331 100644 --- a/src/app.h +++ b/src/app.h @@ -45,11 +45,11 @@ typedef HmSystem HmSystemType; typedef HmPayload> PayloadType; typedef MiPayload> MiPayloadType; #ifdef ESP32 -typedef CmtRadio> CmtRadioType; +typedef CmtRadio CmtRadioType; typedef HmsPayload HmsPayloadType; #endif typedef Web WebType; -typedef RestApi> RestApiType; +typedef RestApi RestApiType; typedef PubMqtt PubMqttType; typedef PubSerial PubSerialType; @@ -75,17 +75,21 @@ class app : public IApp, public ah::Scheduler { void handleIntr(void) { mNrfRadio.handleIntr(); } - const HmRadio<>& getNrfRadioObj(void) const { - return mNrfRadio; + void* getRadioObj(bool nrf) { + if(nrf) + return (void*)&mNrfRadio; + else { + #ifdef ESP32 + return (void*)&mCmtRadio; + #else + return NULL; + #endif + } } - #ifdef ESP32 void handleHmsIntr(void) { mCmtRadio.handleIntr(); } - const CmtRadioType& getCmtRadioObj(void) const { - return mCmtRadio; - } #endif uint32_t getUptime() { diff --git a/src/appInterface.h b/src/appInterface.h index a44d884d..a7299f7e 100644 --- a/src/appInterface.h +++ b/src/appInterface.h @@ -68,6 +68,7 @@ class IApp { virtual void getNrfRadioCounters(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) //virtual const CmtRadioType& getCmtRadioObj(void) const = 0; #endif diff --git a/src/config/config.h b/src/config/config.h index 54686ab8..ad3a73b1 100644 --- a/src/config/config.h +++ b/src/config/config.h @@ -74,15 +74,21 @@ #define DEF_NRF_IRQ_PIN 16 #endif #ifndef DEF_NRF_MISO_PIN - #define DEF_NRF_MISO_PIN 19 + #define DEF_NRF_MISO_PIN 12 #endif #ifndef DEF_NRF_MOSI_PIN - #define DEF_NRF_MOSI_PIN 23 + #define DEF_NRF_MOSI_PIN 13 #endif #ifndef DEF_NRF_SCLK_PIN - #define DEF_NRF_SCLK_PIN 18 + #define DEF_NRF_SCLK_PIN 14 #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 #define DEF_CMT_CSB 27 #endif diff --git a/src/config/settings.h b/src/config/settings.h index 99da3265..ec774352 100644 --- a/src/config/settings.h +++ b/src/config/settings.h @@ -94,6 +94,8 @@ typedef struct { typedef struct { bool enabled; + uint8_t pinSclk; + uint8_t pinSdio; uint8_t pinCsb; uint8_t pinFcsb; uint8_t pinIrq; @@ -395,10 +397,14 @@ class settings { mCfg.nrf.enabled = true; #if defined(ESP32) + mCfg.cmt.pinSclk = DEF_CMT_SCLK; + mCfg.cmt.pinSdio = DEF_CMT_SDIO; mCfg.cmt.pinCsb = DEF_CMT_CSB; mCfg.cmt.pinFcsb = DEF_CMT_FCSB; mCfg.cmt.pinIrq = DEF_CMT_IRQ; #else + mCfg.cmt.pinSclk = DEF_PIN_OFF; + mCfg.cmt.pinSdio = DEF_PIN_OFF; mCfg.cmt.pinCsb = DEF_PIN_OFF; mCfg.cmt.pinFcsb = DEF_PIN_OFF; mCfg.cmt.pinIrq = DEF_PIN_OFF; diff --git a/src/defines.h b/src/defines.h index 8172b4bf..2d9f983c 100644 --- a/src/defines.h +++ b/src/defines.h @@ -13,7 +13,7 @@ //------------------------------------- #define VERSION_MAJOR 0 #define VERSION_MINOR 7 -#define VERSION_PATCH 49 +#define VERSION_PATCH 50 //------------------------------------- typedef struct { diff --git a/src/hms/cmt2300a.h b/src/hms/cmt2300a.h index f27ce3c3..d99875b9 100644 --- a/src/hms/cmt2300a.h +++ b/src/hms/cmt2300a.h @@ -184,8 +184,8 @@ class Cmt2300a { public: Cmt2300a() {} - void setup(uint8_t pinCsb, uint8_t pinFcsb) { - mSpi.setup(pinCsb, pinFcsb); + void setup(uint8_t pinSclk, uint8_t pinSdio, uint8_t pinCsb, uint8_t pinFcsb) { + mSpi.setup(pinSclk, pinSdio, pinCsb, pinFcsb); init(); } @@ -315,6 +315,8 @@ class Cmt2300a { mSpi.writeReg(CMT2300A_CUS_MODE_STA, 0x52); mSpi.writeReg(0x62, 0x20); + if(mSpi.readReg(0x62) != 0x20) + return false; // not connected! for(uint8_t i = 0; i < 0x60; i++) { mSpi.writeReg(i, cmtConfig[i]); diff --git a/src/hms/esp32_3wSpi.h b/src/hms/esp32_3wSpi.h index 080e2251..4fe47497 100644 --- a/src/hms/esp32_3wSpi.h +++ b/src/hms/esp32_3wSpi.h @@ -11,14 +11,6 @@ #include "driver/spi_master.h" #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_PARAM_LOCK() \ @@ -31,19 +23,18 @@ // it is simply the first externally usable hardware SPI master controller #define SPI_CMT SPI2_HOST -template //, uint8_t GPIO3_PIN=15> class esp32_3wSpi { public: esp32_3wSpi() { 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(); spi_bus_config_t buscfg = { - .mosi_io_num = MOSI_PIN, + .mosi_io_num = pinSdio, .miso_io_num = -1, // single wire MOSI/MISO - .sclk_io_num = CLK_PIN, + .sclk_io_num = pinSclk, .quadwp_io_num = -1, .quadhd_io_num = -1, .max_transfer_sz = 32, @@ -83,7 +74,7 @@ class esp32_3wSpi { }; 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); //pinMode(pinGpio3, INPUT); @@ -162,13 +153,13 @@ class esp32_3wSpi { .rx_buffer = &rx_data }; - SPI_PARAM_LOCK(); + SPI_PARAM_LOCK(); for(uint8_t i = 0; i < len; i++) { ESP_ERROR_CHECK(spi_device_polling_transmit(spi_fifo, &t)); delayMicroseconds(4); // > 4 us buf[i] = rx_data; } - SPI_PARAM_UNLOCK(); + SPI_PARAM_UNLOCK(); } private: diff --git a/src/hms/hmsRadio.h b/src/hms/hmsRadio.h index c515ae0e..9b1323de 100644 --- a/src/hms/hmsRadio.h +++ b/src/hms/hmsRadio.h @@ -29,8 +29,8 @@ class CmtRadio { mCmtAvail = false; } - void setup(uint8_t pinCsb, uint8_t pinFcsb, bool genDtuSn = true) { - mCmt.setup(pinCsb, pinFcsb); + void setup(uint8_t pinSclk, uint8_t pinSdio, uint8_t pinCsb, uint8_t pinFcsb, bool genDtuSn = true) { + mCmt.setup(pinSclk, pinSdio, pinCsb, pinFcsb); reset(genDtuSn); } @@ -64,7 +64,7 @@ class CmtRadio { mSerialDebug = true; } - bool cmtIsAvail() { + bool isConnected() { return mCmtAvail; } @@ -151,8 +151,7 @@ class CmtRadio { if(!mCmt.reset()) { mCmtAvail = false; DPRINTLN(DBG_WARN, F("Initializing CMT2300A failed!")); - } - else { + } else { mCmtAvail = true; mCmt.goRx(); } diff --git a/src/web/RestApi.h b/src/web/RestApi.h index aea16517..24122748 100644 --- a/src/web/RestApi.h +++ b/src/web/RestApi.h @@ -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 dcList[] = {FLD_UDC, FLD_IDC, FLD_PDC, FLD_YD, FLD_YT, FLD_IRR, FLD_MP}; -template +template class RestApi { public: RestApi() { @@ -42,12 +42,15 @@ class RestApi { nr = 0; } - void setup(IApp *app, HMSYSTEM *sys, HMRADIO *radio, AsyncWebServer *srv, settings_t *config) { - mApp = app; - mSrv = srv; - mSys = sys; - mRadio = radio; - mConfig = config; + void setup(IApp *app, HMSYSTEM *sys, AsyncWebServer *srv, settings_t *config) { + mApp = app; + mSrv = srv; + mSys = sys; + mRadioNrf = (HmRadio<>*)mApp->getRadioObj(true); + #if defined(ESP32) + mRadioCmt = (CmtRadio*)mApp->getRadioObj(false); + #endif + mConfig = config; 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( 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 getGeneric(request, obj); - getRadioNrf(obj.createNestedObject(F("radio"))); + getRadioNrf(obj.createNestedObject(F("radioNrf"))); #if defined(ESP32) getRadioCmtInfo(obj.createNestedObject(F("radioCmt"))); #endif + getMqttInfo(obj.createNestedObject(F("mqtt"))); getStatistics(obj.createNestedObject(F("statistics"))); #if defined(ESP32) @@ -313,8 +317,8 @@ class RestApi { obj[F("rx_fail")] = stat->rxFail; obj[F("rx_fail_answer")] = stat->rxFailNoAnser; obj[F("frame_cnt")] = stat->frmCnt; - obj[F("tx_cnt")] = mRadio->mSendCnt; - obj[F("retransmits")] = mRadio->mRetransmits; + obj[F("tx_cnt")] = mRadioNrf->mSendCnt; + obj[F("retransmits")] = mRadioNrf->mRetransmits; } void getInverterList(JsonObject obj) { @@ -495,6 +499,8 @@ class RestApi { #if defined(ESP32) void getRadioCmt(JsonObject obj) { + obj[F("sclk")] = mConfig->cmt.pinSclk; + obj[F("sdio")] = mConfig->cmt.pinSdio; obj[F("csb")] = mConfig->cmt.pinCsb; obj[F("fcsb")] = mConfig->cmt.pinFcsb; obj[F("gpio3")] = mConfig->cmt.pinIrq; @@ -503,15 +509,16 @@ class RestApi { void getRadioCmtInfo(JsonObject obj) { obj[F("en")] = (bool) mConfig->cmt.enabled; + obj[F("isconnected")] = mRadioCmt->isConnected(); } #endif 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("isconnected")] = mRadioNrf->isChipConnected(); + obj[F("power_level")] = mConfig->nrf.amplifierPower; + obj[F("dataRate")] = mRadioNrf->getDataRate(); + //obj[F("isPVariant")] = mRadioNrf->isPVariant(); } 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; } + 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) { getGeneric(request, obj.createNestedObject(F("generic"))); obj[F("ts_now")] = mApp->getTimestamp(); @@ -569,9 +584,9 @@ class RestApi { } 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")); - 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")); if(!mApp->getSettingsValid()) 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")); if(0 == mApp->getTimestamp()) 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) { @@ -729,7 +731,10 @@ class RestApi { IApp *mApp; HMSYSTEM *mSys; - HMRADIO *mRadio; + HmRadio<> *mRadioNrf; + #if defined(ESP32) + CmtRadio *mRadioCmt; + #endif AsyncWebServer *mSrv; settings_t *mConfig; diff --git a/src/web/html/index.html b/src/web/html/index.html index a7c79c25..088d6410 100644 --- a/src/web/html/index.html +++ b/src/web/html/index.html @@ -19,7 +19,6 @@

-

Support this project:

    @@ -157,14 +156,11 @@ document.getElementById("iv").replaceChildren(p); } - function parseWarnInfo(warn, success) { + function parseWarn(warn) { var p = div(["none"]); for(var w of warn) { 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) p.append(svg(iconInfo, 30, 30, "icon icon-info"), span(commInfo), br()); @@ -197,7 +193,7 @@ parseGeneric(obj["generic"]); parseSys(obj); parseIv(obj["inverter"]); - parseWarnInfo(obj["warnings"], obj["infos"]); + parseWarn(obj["warnings"]); if(exeOnce) { window.setInterval("tick()", 1000); exeOnce = false; diff --git a/src/web/html/setup.html b/src/web/html/setup.html index 7ae2a952..69090ea5 100644 --- a/src/web/html/setup.html +++ b/src/web/html/setup.html @@ -376,26 +376,26 @@ [3, "RX (GPIO3)"], [4, "GPIO4"], [5, "GPIO5"], - [12, "GPIO12"], - [13, "GPIO13"], - [14, "GPIO14"], + [12, "GPIO12 (HSPI MISO)"], + [13, "GPIO13 (HSPI MOSI)"], + [14, "GPIO14 (HSPI SCLK)"], [15, "GPIO15"], [16, "GPIO16"], [17, "GPIO17"], - [18, "GPIO18"], - [19, "GPIO19"], + [18, "GPIO18 (VSPI SCLK)"], + [19, "GPIO19 (VSPI MISO)"], [21, "GPIO21 (SDA)"], [22, "GPIO22 (SCL)"], - [23, "GPIO23"], + [23, "GPIO23 (VSPI MOSI)"], [25, "GPIO25"], [26, "GPIO26"], [27, "GPIO27"], [32, "GPIO32"], [33, "GPIO33"], - [34, "GPIO34"], - [35, "GPIO35"], - [36, "VP (GPIO36)"], - [39, "VN (GPIO39)"] + [34, "GPIO34 (in only)"], + [35, "GPIO35 (in only)"], + [36, "VP (GPIO36, in only)"], + [39, "VN (GPIO39, in only)"] ]; var esp32s3pins = [ [255, "off / default"], @@ -811,13 +811,13 @@ 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) { e.append( 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-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]]) ) ]) ); diff --git a/src/web/html/style.css b/src/web/html/style.css index 9824b723..4be30110 100644 --- a/src/web/html/style.css +++ b/src/web/html/style.css @@ -20,6 +20,10 @@ fieldset, input[type=submit], .btn { border-radius: 4px; } +input[type=file] { + width: 100%; +} + #live span { color: var(--fg2); } diff --git a/src/web/html/system.html b/src/web/html/system.html index 1cd828b6..11be689a 100644 --- a/src/web/html/system.html +++ b/src/web/html/system.html @@ -63,19 +63,29 @@ ]); } - function parseRadio(obj, stat) { + function parseRadio(obj) { const pa = ["MIN (recommended)", "LOW", "HIGH", "MAX"]; + const dr = ["1 M", "2 M", "250 k"] - if(obj.en) + if(obj.radioNrf.en) lines = [ - tr("NRF24L01", badge(obj.isconnected, ((obj.isconnected) ? "" : "not ") + "connected")), - tr("Power Level", pa[obj.power_level]) + tr("NRF24L01", badge(obj.radioNrf.isconnected, ((obj.radioNrf.isconnected) ? "" : "not ") + "connected")), + tr("NRF24 Power Level", pa[obj.radioNrf.power_level]), + tr("NRF24 Data Rate", dr[obj.radioNrf.dataRate] + "bps") ]; 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( - headline("NRF Radio"), + headline("Radio"), ml("table", {class: "table"}, ml("tbody", {}, lines) ), @@ -94,23 +104,24 @@ ); } - /*IF_ESP32*/ - function parseCmt(obj) { - if(obj.en) + function parseMqtt(obj) { + if(obj.enabled) { 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( - headline("CMT Radio"), + headline("MqTT"), ml("table", {class: "table"}, ml("tbody", {}, lines) ) ); } - /*ENDIF_ESP32*/ function parseIndex(obj) { if(obj.ts_sunrise > 0) { @@ -140,11 +151,9 @@ document.getElementsByTagName('head')[0].appendChild(meta); } else { + parseRadio(obj.system); + parseMqtt(obj.system.mqtt); parseSysInfo(obj["system"]); - parseRadio(obj["system"]["radio"], obj["system"]["statistics"]); - /*IF_ESP32*/ - parseCmt(obj["system"]["radioCmt"]); - /*ENDIF_ESP32*/ getAjax('/api/index', parseIndex); } document.getElementById("html").innerHTML = obj["html"]; diff --git a/src/web/html/visualization.html b/src/web/html/visualization.html index 03ff4083..0b3efefd 100644 --- a/src/web/html/visualization.html +++ b/src/web/html/visualization.html @@ -105,7 +105,7 @@ ml("div", {class: "col mx-2 mx-md-1"}, ml("span", { class: "pointer", onclick: function() { getAjax("/api/inverter/version/" + obj.id, parseIvVersion); }}, 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() { getAjax("/api/inverter/alarm/" + obj.id, parseIvAlarm); }}, ("Alarms: " + obj.alarm_cnt))), diff --git a/src/web/web.h b/src/web/web.h index d4f5d069..efce1494 100644 --- a/src/web/web.h +++ b/src/web/web.h @@ -38,7 +38,7 @@ #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 Web { @@ -555,9 +555,11 @@ class Web { case 6: mConfig->led.led0 = 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 9: mConfig->cmt.pinCsb = pin; break; - case 10: mConfig->cmt.pinFcsb = pin; break; - case 11: mConfig->cmt.pinIrq = pin; break; + case 9: mConfig->cmt.pinSclk = pin; break; + case 10: mConfig->cmt.pinSdio = pin; break; + case 11: mConfig->cmt.pinCsb = pin; break; + case 12: mConfig->cmt.pinFcsb = pin; break; + case 13: mConfig->cmt.pinIrq = pin; break; } }