This commit is contained in:
Gunnar Skjold
2024-08-02 19:59:30 +02:00
parent d49b8c3839
commit ac32f74eba
9 changed files with 49 additions and 8 deletions

View File

@@ -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;
};

View File

@@ -8,6 +8,16 @@
#include <Stream.h>
#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;
};

View File

@@ -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();