diff --git a/tools/esp8266/app.cpp b/tools/esp8266/app.cpp index f9eb7814..8404428b 100644 --- a/tools/esp8266/app.cpp +++ b/tools/esp8266/app.cpp @@ -40,7 +40,7 @@ void app::setup(uint32_t timeout) { #ifndef AP_ONLY setupMqtt(); #endif - mSys->setup(&mConfig); + mSys->setup(mConfig.amplifierPower, mConfig.pinIrq, mConfig.pinCe, mConfig.pinCs); mWebInst = new web(this, &mSysConfig, &mConfig, &mStat, mVersion); mWebInst->setup(); @@ -291,12 +291,12 @@ bool app::buildPayload(uint8_t id) { for(uint8_t i = 0; i < mPayload[id].maxPackId; i ++) { if(mPayload[id].len[i] > 0) { if(i == (mPayload[id].maxPackId-1)) { - crc = Ahoy::crc16(mPayload[id].data[i], mPayload[id].len[i] - 2, crc); + crc = ah::crc16(mPayload[id].data[i], mPayload[id].len[i] - 2, crc); crcRcv = (mPayload[id].data[i][mPayload[id].len[i] - 2] << 8) | (mPayload[id].data[i][mPayload[id].len[i] - 1]); } else - crc = Ahoy::crc16(mPayload[id].data[i], mPayload[id].len[i], crc); + crc = ah::crc16(mPayload[id].data[i], mPayload[id].len[i], crc); } yield(); } @@ -367,28 +367,30 @@ void app::processPayload(bool retransmit) { DPRINTLN(DBG_DEBUG, F("procPyld: max: ") + String(mPayload[iv->id].maxPackId)); record_t<> *rec = iv->getRecordStruct(mPayload[iv->id].txCmd); // choose the parser mPayload[iv->id].complete = true; - if(mPayload[iv->id].txId == (TX_REQ_INFO + 0x80)) - mStat.rxSuccess++; uint8_t payload[128]; - uint8_t offs = 0; + uint8_t payloadLen = 0; memset(payload, 0, 128); for(uint8_t i = 0; i < (mPayload[iv->id].maxPackId); i ++) { - memcpy(&payload[offs], mPayload[iv->id].data[i], (mPayload[iv->id].len[i])); - offs += (mPayload[iv->id].len[i]); + memcpy(&payload[payloadLen], mPayload[iv->id].data[i], (mPayload[iv->id].len[i])); + payloadLen += (mPayload[iv->id].len[i]); yield(); } - offs-=2; + payloadLen-=2; + if(mConfig.serialDebug) { - DPRINT(DBG_INFO, F("Payload (") + String(offs) + "): "); - mSys->Radio.dumpBuf(NULL, payload, offs); + DPRINT(DBG_INFO, F("Payload (") + String(payloadLen) + "): "); + mSys->Radio.dumpBuf(NULL, payload, payloadLen); } if(NULL == rec) DPRINTLN(DBG_ERROR, F("record is NULL!")); - else { + else if((rec->pyldLen == payloadLen) || (0 == rec->pyldLen)) { + if(mPayload[iv->id].txId == (TX_REQ_INFO + 0x80)) + mStat.rxSuccess++; + rec->ts = mPayload[iv->id].ts + ((TIMEZONE + offsetDayLightSaving(mUtcTimestamp)) * 3600); for(uint8_t i = 0; i < rec->length; i++) { iv->addValue(i, payload, rec); @@ -420,7 +422,7 @@ void app::processPayload(bool retransmit) { } } } - + if(iv->isProducing(mTimestamp, rec)){ snprintf(topic, 32 + MAX_NAME_LENGTH, "%s/available_text", iv->name); snprintf(val, 32, DEF_MQTT_IV_MESSAGE_INVERTER_AVAIL_AND_PRODUCED); @@ -440,11 +442,11 @@ void app::processPayload(bool retransmit) { snprintf(topic, 32 + MAX_NAME_LENGTH, "%s/last_success", iv->name); snprintf(val, 48, "%i", iv->getLastTs(rec) * 1000); mMqtt.sendMsg(topic, val); - + yield(); } - } - } + } + } } // total values (sum of all inverters) @@ -466,6 +468,10 @@ void app::processPayload(bool retransmit) { } } } + else { + DPRINTLN(DBG_ERROR, F("plausibility check failed, expected ") + String(rec->pyldLen) + F(" bytes")); + mStat.rxFail++; + } iv->setQueuedCmdFinished(); @@ -736,9 +742,9 @@ void app::loadDefaultConfig(void) { // nrf24 mConfig.sendInterval = SEND_INTERVAL; mConfig.maxRetransPerPyld = DEF_MAX_RETRANS_PER_PYLD; - mConfig.pinCs = DEF_RF24_CS_PIN; - mConfig.pinCe = DEF_RF24_CE_PIN; - mConfig.pinIrq = DEF_RF24_IRQ_PIN; + mConfig.pinCs = DEF_CS_PIN; + mConfig.pinCe = DEF_CE_PIN; + mConfig.pinIrq = DEF_IRQ_PIN; mConfig.amplifierPower = DEF_AMPLIFIERPOWER & 0x03; // ntp diff --git a/tools/esp8266/app.h b/tools/esp8266/app.h index 1f4b09f3..bf8dad56 100644 --- a/tools/esp8266/app.h +++ b/tools/esp8266/app.h @@ -37,10 +37,7 @@ #define __MQTT_AFTER_RX__ // versendet die MQTT Daten sobald die WR daten Aufbereitet wurden ( gehört eigentlich ins Setup ) // #define __MQTT_NO_DISCOVERCONFIG__ // das versenden der MQTTDiscoveryConfig abschalten ( gehört eigentlich ins Setup ) -typedef CircularBuffer BufferType; -typedef HmRadio RadioType; -typedef Inverter InverterType; -typedef HmSystem HmSystemType; +typedef HmSystem HmSystemType; typedef struct { @@ -190,7 +187,6 @@ class app { bool buildPayload(uint8_t id); void processPayload(bool retransmit); - void processPayload(bool retransmit, uint8_t cmd); const char* getFieldDeviceClass(uint8_t fieldId); const char* getFieldStateClass(uint8_t fieldId); @@ -204,7 +200,7 @@ class app { while(length > 0) { len = (length < 32) ? length : 32; mEep->read(start, buf, len); - crc = Ahoy::crc16(buf, len, crc); + crc = ah::crc16(buf, len, crc); start += len; length -= len; } diff --git a/tools/esp8266/config.h b/tools/esp8266/config.h index d09c9f86..7ec77084 100644 --- a/tools/esp8266/config.h +++ b/tools/esp8266/config.h @@ -41,9 +41,9 @@ #define DEF_DEVICE_NAME "AHOY-DTU" // default pinout (GPIO Number) -#define DEF_RF24_CS_PIN 15 -#define DEF_RF24_CE_PIN 2 -#define DEF_RF24_IRQ_PIN 0 +#define DEF_CS_PIN 15 +#define DEF_CE_PIN 2 +#define DEF_IRQ_PIN 0 // default NRF24 power, possible values (0 - 3) #define DEF_AMPLIFIERPOWER 1 diff --git a/tools/esp8266/crc.cpp b/tools/esp8266/crc.cpp index 879af286..6e341924 100644 --- a/tools/esp8266/crc.cpp +++ b/tools/esp8266/crc.cpp @@ -1,11 +1,11 @@ //----------------------------------------------------------------------------- -// 2022 Ahoy, https://www.mikrocontroller.net/topic/525778 +// 2022 Ahoy, https://github.com/lumpapu/ahoy // Creative Commons - http://creativecommons.org/licenses/by-nc-sa/3.0/de/ //----------------------------------------------------------------------------- #include "crc.h" -namespace Ahoy { +namespace ah { uint8_t crc8(uint8_t buf[], uint8_t len) { uint8_t crc = CRC8_INIT; for(uint8_t i = 0; i < len; i++) { diff --git a/tools/esp8266/crc.h b/tools/esp8266/crc.h index ef7be1f8..03f93444 100644 --- a/tools/esp8266/crc.h +++ b/tools/esp8266/crc.h @@ -1,5 +1,5 @@ //----------------------------------------------------------------------------- -// 2022 Ahoy, https://www.mikrocontroller.net/topic/525778 +// 2022 Ahoy, https://github.com/lumpapu/ahoy // Creative Commons - http://creativecommons.org/licenses/by-nc-sa/3.0/de/ //----------------------------------------------------------------------------- @@ -14,7 +14,7 @@ #define CRC16_MODBUS_POLYNOM 0xA001 -namespace Ahoy { +namespace ah { uint8_t crc8(uint8_t buf[], uint8_t len); uint16_t crc16(uint8_t buf[], uint8_t len, uint16_t start = 0xffff); } diff --git a/tools/esp8266/defines.h b/tools/esp8266/defines.h index 8d48716a..5c7ccff8 100644 --- a/tools/esp8266/defines.h +++ b/tools/esp8266/defines.h @@ -13,7 +13,7 @@ //------------------------------------- #define VERSION_MAJOR 0 #define VERSION_MINOR 5 -#define VERSION_PATCH 20 +#define VERSION_PATCH 21 //------------------------------------- diff --git a/tools/esp8266/hmDefines.h b/tools/esp8266/hmDefines.h index 4fd8bd5f..96f896e8 100644 --- a/tools/esp8266/hmDefines.h +++ b/tools/esp8266/hmDefines.h @@ -1,5 +1,5 @@ //----------------------------------------------------------------------------- -// 2022 Ahoy, https://www.mikrocontroller.net/topic/525778 +// 2022 Ahoy, https://github.com/lumpapu/ahoy // Creative Commons - http://creativecommons.org/licenses/by-nc-sa/3.0/de/ //----------------------------------------------------------------------------- @@ -98,6 +98,7 @@ const byteAssign_t InfoAssignment[] = { { FLD_HW_ID, UNIT_NONE, CH0, 8, 2, 1 } }; #define HMINFO_LIST_LEN (sizeof(InfoAssignment) / sizeof(byteAssign_t)) +#define HMINFO_PAYLOAD_LEN 14 const byteAssign_t SystemConfigParaAssignment[] = { { FLD_ACT_ACTIVE_PWR_LIMIT, UNIT_PCT, CH0, 2, 2, 10 }/*, @@ -105,11 +106,13 @@ const byteAssign_t SystemConfigParaAssignment[] = { { FLD_ACT_PF, UNIT_NONE, CH0, 6, 2, 1000 }*/ }; #define HMSYSTEM_LIST_LEN (sizeof(SystemConfigParaAssignment) / sizeof(byteAssign_t)) +#define HMSYSTEM_PAYLOAD_LEN 0 // 0: means check off const byteAssign_t AlarmDataAssignment[] = { { FLD_LAST_ALARM_CODE, UNIT_NONE, CH0, 0, 2, 1 } }; #define HMALARMDATA_LIST_LEN (sizeof(AlarmDataAssignment) / sizeof(byteAssign_t)) +#define HMALARMDATA_PAYLOAD_LEN 0 // 0: means check off @@ -137,7 +140,8 @@ const byteAssign_t hm1chAssignment[] = { { FLD_PDC, UNIT_W, CH0, CALC_PDC_CH0, 0, CMD_CALC }, { FLD_EFF, UNIT_PCT, CH0, CALC_EFF_CH0, 0, CMD_CALC } }; -#define HM1CH_LIST_LEN (sizeof(hm1chAssignment) / sizeof(byteAssign_t)) +#define HM1CH_LIST_LEN (sizeof(hm1chAssignment) / sizeof(byteAssign_t)) +#define HM1CH_PAYLOAD_LEN 30 //------------------------------------- @@ -172,7 +176,8 @@ const byteAssign_t hm2chAssignment[] = { { FLD_EFF, UNIT_PCT, CH0, CALC_EFF_CH0, 0, CMD_CALC } }; -#define HM2CH_LIST_LEN (sizeof(hm2chAssignment) / sizeof(byteAssign_t)) +#define HM2CH_LIST_LEN (sizeof(hm2chAssignment) / sizeof(byteAssign_t)) +#define HM2CH_PAYLOAD_LEN 42 //------------------------------------- @@ -220,7 +225,8 @@ const byteAssign_t hm4chAssignment[] = { { FLD_PDC, UNIT_W, CH0, CALC_PDC_CH0, 0, CMD_CALC }, { FLD_EFF, UNIT_PCT, CH0, CALC_EFF_CH0, 0, CMD_CALC } }; -#define HM4CH_LIST_LEN (sizeof(hm4chAssignment) / sizeof(byteAssign_t)) +#define HM4CH_LIST_LEN (sizeof(hm4chAssignment) / sizeof(byteAssign_t)) +#define HM4CH_PAYLOAD_LEN 62 #endif /*__HM_DEFINES_H__*/ diff --git a/tools/esp8266/hmInverter.h b/tools/esp8266/hmInverter.h index aeeacde1..d1806e98 100644 --- a/tools/esp8266/hmInverter.h +++ b/tools/esp8266/hmInverter.h @@ -61,6 +61,7 @@ struct record_t { uint8_t length; // length of the assignment list T *record; // data pointer uint32_t ts; // timestamp of last received payload + uint8_t pyldLen; // expected payload length for plausibility check }; class CommandAbstract { @@ -242,10 +243,16 @@ class Inverter { val <<= 8; val |= buf[ptr]; } while(++ptr != end); - if ((REC_TYP)(div) > 1) - rec->record[pos] = (REC_TYP)(val) / (REC_TYP)(div); - else - rec->record[pos] = (REC_TYP)(val); + if(FLD_T == rec->assign[pos].fieldId) { + // temperature is a signed value! + rec->record[pos] = (REC_TYP)((int16_t)val) / (REC_TYP)(div); + } + else { + if ((REC_TYP)(div) > 1) + rec->record[pos] = (REC_TYP)(val) / (REC_TYP)(div); + else + rec->record[pos] = (REC_TYP)(val); + } } } @@ -348,37 +355,44 @@ class Inverter { switch (cmd) { case RealTimeRunData_Debug: if (INV_TYPE_1CH == type) { - rec->length = (uint8_t)(HM1CH_LIST_LEN); - rec->assign = (byteAssign_t *)hm1chAssignment; - channels = 1; + rec->length = (uint8_t)(HM1CH_LIST_LEN); + rec->assign = (byteAssign_t *)hm1chAssignment; + rec->pyldLen = HM1CH_PAYLOAD_LEN; + channels = 1; } else if (INV_TYPE_2CH == type) { - rec->length = (uint8_t)(HM2CH_LIST_LEN); - rec->assign = (byteAssign_t *)hm2chAssignment; - channels = 2; + rec->length = (uint8_t)(HM2CH_LIST_LEN); + rec->assign = (byteAssign_t *)hm2chAssignment; + rec->pyldLen = HM2CH_PAYLOAD_LEN; + channels = 2; } else if (INV_TYPE_4CH == type) { - rec->length = (uint8_t)(HM4CH_LIST_LEN); - rec->assign = (byteAssign_t *)hm4chAssignment; - channels = 4; + rec->length = (uint8_t)(HM4CH_LIST_LEN); + rec->assign = (byteAssign_t *)hm4chAssignment; + rec->pyldLen = HM4CH_PAYLOAD_LEN; + channels = 4; } else { - rec->length = 0; - rec->assign = NULL; - channels = 0; + rec->length = 0; + rec->assign = NULL; + rec->pyldLen = 0; + channels = 0; } break; case InverterDevInform_All: - rec->length = (uint8_t)(HMINFO_LIST_LEN); - rec->assign = (byteAssign_t *)InfoAssignment; + rec->length = (uint8_t)(HMINFO_LIST_LEN); + rec->assign = (byteAssign_t *)InfoAssignment; + rec->pyldLen = HMINFO_PAYLOAD_LEN; break; case SystemConfigPara: - rec->length = (uint8_t)(HMSYSTEM_LIST_LEN); - rec->assign = (byteAssign_t *)SystemConfigParaAssignment; + rec->length = (uint8_t)(HMSYSTEM_LIST_LEN); + rec->assign = (byteAssign_t *)SystemConfigParaAssignment; + rec->pyldLen = HMSYSTEM_PAYLOAD_LEN; break; case AlarmData: - rec->length = (uint8_t)(HMALARMDATA_LIST_LEN); - rec->assign = (byteAssign_t *)AlarmDataAssignment; + rec->length = (uint8_t)(HMALARMDATA_LIST_LEN); + rec->assign = (byteAssign_t *)AlarmDataAssignment; + rec->pyldLen = HMALARMDATA_PAYLOAD_LEN; break; default: DPRINTLN(DBG_INFO, F("initAssignment: Parser not implemented")); diff --git a/tools/esp8266/hmRadio.h b/tools/esp8266/hmRadio.h index 737aa15a..048c5255 100644 --- a/tools/esp8266/hmRadio.h +++ b/tools/esp8266/hmRadio.h @@ -1,5 +1,5 @@ //----------------------------------------------------------------------------- -// 2022 Ahoy, https://www.mikrocontroller.net/topic/525778 +// 2022 Ahoy, https://github.com/lumpapu/ahoy // Creative Commons - http://creativecommons.org/licenses/by-nc-sa/3.0/de/ //----------------------------------------------------------------------------- @@ -8,9 +8,20 @@ #include "dbg.h" #include -#include #include "crc.h" +#ifndef DISABLE_IRQ + #if defined(ESP8266) || defined(ESP32) + #define DISABLE_IRQ noInterrupts() + #define RESTORE_IRQ interrupts() + #else + #define DISABLE_IRQ \ + uint8_t sreg = SREG; \ + cli(); + #define RESTORE_IRQ \ + SREG = sreg; + #endif +#endif //#define CHANNEL_HOP // switch between channels or use static channel to send #define DEFAULT_RECV_CHANNEL 3 @@ -54,7 +65,7 @@ const char* const rf24AmpPowerNames[] = {"MIN", "LOW", "HIGH", "MAX"}; //----------------------------------------------------------------------------- // HM Radio class //----------------------------------------------------------------------------- -template +template class HmRadio { public: HmRadio() : mNrf24(CE_PIN, CS_PIN, SPI_SPEED) { @@ -84,32 +95,31 @@ class HmRadio { } ~HmRadio() {} - void setup(config_t *config, BUFFER *ctrl) { + void setup(BUFFER *ctrl, uint8_t ampPwr = RF24_PA_LOW, uint8_t irq = IRQ_PIN, uint8_t ce = CE_PIN, uint8_t cs = CS_PIN) { DPRINTLN(DBG_VERBOSE, F("hmRadio.h:setup")); - pinMode(config->pinIrq, INPUT_PULLUP); - + pinMode(irq, INPUT_PULLUP); mBufCtrl = ctrl; - mSerialDebug = config->serialDebug; - uint32_t DTU_SN = 0x87654321; + + uint32_t dtuSn = 0x87654321; uint32_t chipID = 0; // will be filled with last 3 bytes of MAC -#ifdef ESP32 + #ifdef ESP32 uint64_t MAC = ESP.getEfuseMac(); chipID = ((MAC >> 8) & 0xFF0000) | ((MAC >> 24) & 0xFF00) | ((MAC >> 40) & 0xFF); -#else + #else chipID = ESP.getChipId(); -#endif + #endif if(chipID) { - DTU_SN = 0x80000000; // the first digit is an 8 for DTU production year 2022, the rest is filled with the ESP chipID in decimal + dtuSn = 0x80000000; // the first digit is an 8 for DTU production year 2022, the rest is filled with the ESP chipID in decimal for(int i = 0; i < 7; i++) { - DTU_SN |= (chipID % 10) << (i * 4); + dtuSn |= (chipID % 10) << (i * 4); chipID /= 10; } } // change the byte order of the DTU serial number and append the required 0x01 at the end - DTU_RADIO_ID = ((uint64_t)(((DTU_SN >> 24) & 0xFF) | ((DTU_SN >> 8) & 0xFF00) | ((DTU_SN << 8) & 0xFF0000) | ((DTU_SN << 24) & 0xFF000000)) << 8) | 0x01; + DTU_RADIO_ID = ((uint64_t)(((dtuSn >> 24) & 0xFF) | ((dtuSn >> 8) & 0xFF00) | ((dtuSn << 8) & 0xFF0000) | ((dtuSn << 24) & 0xFF000000)) << 8) | 0x01; - mNrf24.begin(config->pinCe, config->pinCs); + mNrf24.begin(ce, cs); mNrf24.setRetries(0, 0); mNrf24.setChannel(DEFAULT_RECV_CHANNEL); @@ -125,8 +135,8 @@ class HmRadio { mNrf24.maskIRQ(true, true, false); DPRINT(DBG_INFO, F("RF24 Amp Pwr: RF24_PA_")); - DPRINTLN(DBG_INFO, String(rf24AmpPowerNames[config->amplifierPower])); - mNrf24.setPALevel(config->amplifierPower & 0x03); + DPRINTLN(DBG_INFO, String(rf24AmpPowerNames[ampPwr])); + mNrf24.setPALevel(ampPwr & 0x03); mNrf24.startListening(); DPRINTLN(DBG_INFO, F("Radio Config:")); @@ -169,6 +179,10 @@ class HmRadio { RESTORE_IRQ; } + void enableDebug() { + mSerialDebug = true; + } + void handleIntr(void) { //DPRINTLN(DBG_VERBOSE, F("hmRadio.h:handleIntr")); mIrqRcvd = true; @@ -195,12 +209,12 @@ class HmRadio { } // crc control data - uint16_t crc = Ahoy::crc16(&mTxBuf[10], cnt); + uint16_t crc = ah::crc16(&mTxBuf[10], cnt); mTxBuf[10 + cnt++] = (crc >> 8) & 0xff; mTxBuf[10 + cnt++] = (crc ) & 0xff; // crc over all - mTxBuf[10 + cnt] = Ahoy::crc8(mTxBuf, 10 + cnt); + mTxBuf[10 + cnt] = ah::crc8(mTxBuf, 10 + cnt); sendPacket(invId, mTxBuf, 10 + cnt + 1, true); } @@ -215,10 +229,10 @@ class HmRadio { mTxBuf[18] = (alarmMesId >> 8) & 0xff; mTxBuf[19] = (alarmMesId ) & 0xff; } - uint16_t crc = Ahoy::crc16(&mTxBuf[10], 14); + uint16_t crc = ah::crc16(&mTxBuf[10], 14); mTxBuf[24] = (crc >> 8) & 0xff; mTxBuf[25] = (crc ) & 0xff; - mTxBuf[26] = Ahoy::crc8(mTxBuf, 26); + mTxBuf[26] = ah::crc8(mTxBuf, 26); sendPacket(invId, mTxBuf, 27, true); } @@ -231,7 +245,7 @@ class HmRadio { CP_U32_BigEndian(&mTxBuf[5], (DTU_RADIO_ID >> 8)); mTxBuf[9] = pid; if(calcCrc) { - mTxBuf[10] = Ahoy::crc8(mTxBuf, 10); + mTxBuf[10] = ah::crc8(mTxBuf, 10); sendPacket(invId, mTxBuf, 11, false); } } @@ -245,7 +259,7 @@ class HmRadio { buf[i-1] = (buf[i] << 1) | (buf[i+1] >> 7); } - uint8_t crc = Ahoy::crc8(buf, *len-1); + uint8_t crc = ah::crc8(buf, *len-1); bool valid = (crc == buf[*len-1]); return valid; diff --git a/tools/esp8266/hmSystem.h b/tools/esp8266/hmSystem.h index eb246ccb..ee7c180c 100644 --- a/tools/esp8266/hmSystem.h +++ b/tools/esp8266/hmSystem.h @@ -1,5 +1,5 @@ //----------------------------------------------------------------------------- -// 2022 Ahoy, https://www.mikrocontroller.net/topic/525778 +// 2022 Ahoy, https://github.com/lumpapu/ahoy // Creative Commons - http://creativecommons.org/licenses/by-nc-sa/3.0/de/ //----------------------------------------------------------------------------- @@ -7,12 +7,13 @@ #define __HM_SYSTEM_H__ #include "hmInverter.h" -#ifndef NO_RADIO #include "hmRadio.h" -#endif +#include "CircularBuffer.h" +typedef CircularBuffer BufferType; +typedef HmRadio RadioType; -template > +template > class HmSystem { public: typedef RADIO RadioType; @@ -28,9 +29,12 @@ class HmSystem { // TODO: cleanup } - void setup(config_t *config) { - DPRINTLN(DBG_VERBOSE, F("hmSystem.h:setup")); - Radio.setup(config, &BufCtrl); + void setup() { + Radio.setup(&BufCtrl); + } + + void setup(uint8_t ampPwr, uint8_t irqPin, uint8_t cePin, uint8_t csPin) { + Radio.setup(&BufCtrl, ampPwr, irqPin, cePin, csPin); } INVERTERTYPE *addInverter(const char *name, uint64_t serial, uint16_t chMaxPwr[]) { @@ -96,6 +100,10 @@ class HmSystem { return mNumInv; } + void enableDebug() { + Radio.enableDebug(); + } + private: INVERTERTYPE mInverter[MAX_INVERTER]; uint8_t mNumInv; diff --git a/tools/esp8266/html/index.html b/tools/esp8266/html/index.html index b84cef61..69665cfe 100644 --- a/tools/esp8266/html/index.html +++ b/tools/esp8266/html/index.html @@ -46,15 +46,15 @@

Every seconds the values are updated

- This project was started from this discussion. (Mikrocontroller.net)
New updates can be found on Github: https://github.com/lumapu/ahoy

- Please report issues using the feature provided by Github
-
- Discuss with us on Discord -
+ Please report issues in Github
+ Discuss with us on Discord
+ Support this project: Donate

Creative Commons - https://creativecommons.org/licenses/by-nc-sa/3.0/de/
- Check the licenses which are published on https://github.com/lumapu/ahoy as well

+ Check the licenses which are published on https://github.com/lumapu/ahoy as well


+ + This project was started from this discussion. (Mikrocontroller.net)