diff --git a/lib/MeterCommunicators/include/KmpCommunicator.h b/lib/MeterCommunicators/include/KmpCommunicator.h index 7c392571..b880db8b 100644 --- a/lib/MeterCommunicators/include/KmpCommunicator.h +++ b/lib/MeterCommunicators/include/KmpCommunicator.h @@ -30,6 +30,11 @@ public: void configure(MeterConfig&); bool loop(); AmsData* getData(AmsData& meterState); + int getLastError(); + bool isConfigChanged() { return false; } + void getCurrentConfig(MeterConfig& meterConfig) { + meterConfig = this->meterConfig; + } private: KmpTalker* talker = NULL; }; diff --git a/lib/MeterCommunicators/include/KmpTalker.h b/lib/MeterCommunicators/include/KmpTalker.h index 4ddd0ecf..9a219de5 100644 --- a/lib/MeterCommunicators/include/KmpTalker.h +++ b/lib/MeterCommunicators/include/KmpTalker.h @@ -8,6 +8,16 @@ #include +#define DATA_PARSE_OK 0 +#define DATA_PARSE_FAIL -1 +#define DATA_PARSE_INCOMPLETE -2 +#define DATA_PARSE_FOOTER_CHECKSUM_ERROR -5 + +struct KmpParserContext { + uint8_t type; + uint16_t length; +}; + struct KmpDataHolder { uint32_t activeImportPower = 0, reactiveImportPower = 0, activeExportPower = 0, reactiveExportPower = 0; float l1voltage = 0, l2voltage = 0, l3voltage = 0, l1current = 0, l2current = 0, l3current = 0; @@ -22,7 +32,25 @@ struct KmpDataHolder { class KmpTalker { public: - KmpTalker(Stream *hanSerial); + KmpTalker(Stream *hanSerial, uint8_t* hanBuffer, uint16_t hanBufferSize); bool loop(); void getData(KmpDataHolder& data); + int getLastError(); + +private: + Stream *hanSerial; + uint8_t *hanBuffer = NULL; + uint16_t hanBufferSize = 0; + + bool dataAvailable = false; + int len = 0; + int pos = DATA_PARSE_INCOMPLETE; + int lastError = DATA_PARSE_OK; + bool serialInit = false; + + uint64_t lastUpdate = 0; + uint8_t batch = 0; + KmpParserContext ctx; + + KmpDataHolder state; }; diff --git a/lib/MeterCommunicators/src/KmpCommunicator.cpp b/lib/MeterCommunicators/src/KmpCommunicator.cpp index 6e5cab21..eedc8ec2 100644 --- a/lib/MeterCommunicators/src/KmpCommunicator.cpp +++ b/lib/MeterCommunicators/src/KmpCommunicator.cpp @@ -13,15 +13,28 @@ void KmpCommunicator::configure(MeterConfig& meterConfig) { this->meterConfig = meterConfig; this->configChanged = false; setupHanPort(meterConfig.baud, meterConfig.parity, meterConfig.invert, false); - talker = new KmpTalker(hanSerial); + talker = new KmpTalker(hanSerial, hanBuffer, hanBufferSize); } bool KmpCommunicator::loop() { uint64_t now = millis64(); - return talker->loop(); + bool ret = talker->loop(); + if(ret) { + #if defined(AMS_REMOTE_DEBUG) + if (debugger->isActive(RemoteDebug::VERBOSE)) + #endif + debugger->printf_P(PSTR("Successful loop\n")); + Serial.flush(); + } + return ret; +} + +int KmpCommunicator::getLastError() { + return talker == NULL ? DATA_PARSE_FAIL : talker->getLastError(); } AmsData* KmpCommunicator::getData(AmsData& meterState) { + if(talker == NULL) return NULL; KmpDataHolder kmpData; talker->getData(kmpData); AmsData* data = new AmsData(); diff --git a/precompiled/esp32/libKmpTalker.a b/precompiled/esp32/libKmpTalker.a index 28a45cd6..a9b4e81c 100644 Binary files a/precompiled/esp32/libKmpTalker.a and b/precompiled/esp32/libKmpTalker.a differ diff --git a/precompiled/esp32c3/libKmpTalker.a b/precompiled/esp32c3/libKmpTalker.a index 0c25ec66..bbd6a847 100644 Binary files a/precompiled/esp32c3/libKmpTalker.a and b/precompiled/esp32c3/libKmpTalker.a differ diff --git a/precompiled/esp32s2/libKmpTalker.a b/precompiled/esp32s2/libKmpTalker.a index db28dae2..cbf94838 100644 Binary files a/precompiled/esp32s2/libKmpTalker.a and b/precompiled/esp32s2/libKmpTalker.a differ diff --git a/precompiled/esp32s3/libKmpTalker.a b/precompiled/esp32s3/libKmpTalker.a index d911c079..7e43c0ca 100644 Binary files a/precompiled/esp32s3/libKmpTalker.a and b/precompiled/esp32s3/libKmpTalker.a differ diff --git a/precompiled/esp8266/libKmpTalker.a b/precompiled/esp8266/libKmpTalker.a index ada53dd7..0bdbd4bf 100644 Binary files a/precompiled/esp8266/libKmpTalker.a and b/precompiled/esp8266/libKmpTalker.a differ diff --git a/src/AmsToMqttBridge.cpp b/src/AmsToMqttBridge.cpp index c0725537..cf7db7ac 100644 --- a/src/AmsToMqttBridge.cpp +++ b/src/AmsToMqttBridge.cpp @@ -283,11 +283,6 @@ void rxerr(int err) { if(passiveMc != NULL) { passiveMc->rxerr(err); } - #if defined(AMS_KMP) - if(kmpMc != NULL) { - kmpMc->rxerr(err); - } - #endif } #endif