Browse Source

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
pull/1163/head
lumapu 1 year ago
parent
commit
b06f8e98a4
  1. 7
      src/CHANGES.md
  2. 4
      src/app.cpp
  3. 20
      src/app.h
  4. 1
      src/appInterface.h
  5. 12
      src/config/config.h
  6. 6
      src/config/settings.h
  7. 2
      src/defines.h
  8. 6
      src/hms/cmt2300a.h
  9. 17
      src/hms/esp32_3wSpi.h
  10. 9
      src/hms/hmsRadio.h
  11. 57
      src/web/RestApi.h
  12. 8
      src/web/html/index.html
  13. 24
      src/web/html/setup.html
  14. 4
      src/web/html/style.css
  15. 45
      src/web/html/system.html
  16. 2
      src/web/html/visualization.html
  17. 10
      src/web/web.h

7
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

4
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)

20
src/app.h

@ -45,11 +45,11 @@ typedef HmSystem<MAX_NUM_INVERTERS> HmSystemType;
typedef HmPayload<HmSystemType, HmRadio<>> PayloadType;
typedef MiPayload<HmSystemType, HmRadio<>> MiPayloadType;
#ifdef ESP32
typedef CmtRadio<esp32_3wSpi<>> CmtRadioType;
typedef CmtRadio<esp32_3wSpi> CmtRadioType;
typedef HmsPayload<HmSystemType, CmtRadioType> HmsPayloadType;
#endif
typedef Web<HmSystemType> WebType;
typedef RestApi<HmSystemType, HmRadio<>> RestApiType;
typedef RestApi<HmSystemType> RestApiType;
typedef PubMqtt<HmSystemType> PubMqttType;
typedef PubSerial<HmSystemType> 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() {

1
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

12
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

6
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;

2
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 {

6
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]);

17
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 CSB_PIN=5, uint8_t FCSB_PIN=4> //, 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);

9
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();
}

57
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<class HMSYSTEM, class HMRADIO>
template<class HMSYSTEM>
class RestApi {
public:
RestApi() {
@ -42,11 +42,14 @@ class RestApi {
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;
mSrv = srv;
mSys = sys;
mRadio = radio;
mRadioNrf = (HmRadio<>*)mApp->getRadioObj(true);
#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_POST, std::bind(&RestApi::onApiPost, this, std::placeholders::_1)).onBody(
@ -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<esp32_3wSpi> *mRadioCmt;
#endif
AsyncWebServer *mSrv;
settings_t *mConfig;

8
src/web/html/index.html

@ -19,7 +19,6 @@
<div id="warn_info"></div>
</p>
<div class="hr"></div>
<div id="note">
<h3>Support this project:</h3>
<ul>
@ -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;

24
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]])
)
])
);

4
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);
}

45
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"];

2
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 + "&nbsp;%"))),
ml("div", {class: "col a-c"}, "Active Power Control: " + ((obj.power_limit_read == 65535) ? "n/a" : (obj.power_limit_read + "&nbsp;%"))),
ml("div", {class: "col a-c"}, ml("span", { class: "pointer", onclick: function() {
getAjax("/api/inverter/alarm/" + obj.id, parseIvAlarm);
}}, ("Alarms: " + obj.alarm_cnt))),

10
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 HMSYSTEM>
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;
}
}

Loading…
Cancel
Save