From 7140574c370d01267270436a24a9f693f89bb4ba Mon Sep 17 00:00:00 2001 From: helgeerbe Date: Fri, 19 Aug 2022 15:53:18 +0200 Subject: [PATCH] sk --- .../VeDirectFrameHandler.cpp | 52 ++++++++++--------- .../VeDirectFrameHandler.h | 14 ++--- src/WebApi_ws_vedirect_live.cpp | 7 +-- 3 files changed, 40 insertions(+), 33 deletions(-) diff --git a/lib/VeDirectFrameHandler/VeDirectFrameHandler.cpp b/lib/VeDirectFrameHandler/VeDirectFrameHandler.cpp index 87e8587a..73c8189d 100644 --- a/lib/VeDirectFrameHandler/VeDirectFrameHandler.cpp +++ b/lib/VeDirectFrameHandler/VeDirectFrameHandler.cpp @@ -41,6 +41,8 @@ char MODULE[] = "VE.Frame"; // Victron seems to use this to find out where loggi // The name of the record that contains the checksum. static constexpr char checksumTagName[] = "CHECKSUM"; +HardwareSerial VedirectSerial(1); + VeDirectFrameHandler VeDirect; VeDirectFrameHandler::VeDirectFrameHandler() : @@ -51,32 +53,35 @@ VeDirectFrameHandler::VeDirectFrameHandler() : veEnd(0), mState(IDLE), mChecksum(0), - mTextPointer(0), + idx(0), tempName(), - tempValue() + tempValue(), + _pollInterval(5), + _lastPoll(0) { } void VeDirectFrameHandler::init() { - Serial2.begin(19200, SERIAL_8N1, VICTRON_PIN_RX, VICTRON_PIN_TX); - Serial2.flush(); + VedirectSerial.begin(19200, SERIAL_8N1, VICTRON_PIN_RX, VICTRON_PIN_TX); + VedirectSerial.flush(); } -void VeDirectFrameHandler::setPollInterval(uint32_t interval) +void VeDirectFrameHandler::setPollInterval(unsigned long interval) { _pollInterval = interval; } void VeDirectFrameHandler::loop() { - unsigned long now = millis(); - _frameEnd = false; + polltime = _pollInterval; - if ((millis() - getLastUpdate()) > (_pollInterval * 1000)) { - while ( Serial2.available() && (!_frameEnd) && (millis() - now < 500)) { - rxData(Serial2.read()); - } + if ((millis() - getLastUpdate()) < _pollInterval * 1000) { + return; + } + + while ( VedirectSerial.available()) { + rxData(VedirectSerial.read()); } } @@ -109,8 +114,8 @@ void VeDirectFrameHandler::rxData(uint8_t inbyte) } break; case RECORD_BEGIN: - mTextPointer = mName; - *mTextPointer++ = inbyte; + idx = 0; + mName[idx++] = inbyte; mState = RECORD_NAME; break; case RECORD_NAME: @@ -118,20 +123,20 @@ void VeDirectFrameHandler::rxData(uint8_t inbyte) switch(inbyte) { case '\t': // the Checksum record indicates a EOR - if ( mTextPointer < (mName + sizeof(mName)) ) { - *mTextPointer = 0; /* Zero terminate */ + if ( idx < sizeof(mName) ) { + mName[idx] = 0; /* Zero terminate */ if (strcmp(mName, checksumTagName) == 0) { mState = CHECKSUM; break; } } - mTextPointer = mValue; /* Reset value pointer */ + idx = 0; /* Reset value pointer */ mState = RECORD_VALUE; break; default: // add byte to name, but do no overflow - if ( mTextPointer < (mName + sizeof(mName)) ) - *mTextPointer++ = inbyte; + if ( idx < sizeof(mName) ) + mName[idx++] = inbyte; break; } break; @@ -140,8 +145,8 @@ void VeDirectFrameHandler::rxData(uint8_t inbyte) switch(inbyte) { case '\n': // forward record, only if it could be stored completely - if ( mTextPointer < (mValue + sizeof(mValue)) ) { - *mTextPointer = 0; // make zero ended + if ( idx < sizeof(mValue) ) { + mValue[idx] = 0; // make zero ended textRxEvent(mName, mValue); } mState = RECORD_BEGIN; @@ -150,8 +155,8 @@ void VeDirectFrameHandler::rxData(uint8_t inbyte) break; default: // add byte to value, but do no overflow - if ( mTextPointer < (mValue + sizeof(mValue)) ) - *mTextPointer++ = inbyte; + if ( idx < sizeof(mValue) ) + mValue[idx++] = inbyte; break; } break; @@ -213,7 +218,6 @@ void VeDirectFrameHandler::frameEndEvent(bool valid) { setLastUpdate(); } frameIndex = 0; // reset frame - _frameEnd = true; } /* @@ -236,7 +240,7 @@ bool VeDirectFrameHandler::hexRxEvent(uint8_t inbyte) { return true; // stubbed out for future } -uint32_t VeDirectFrameHandler::getLastUpdate() +unsigned long VeDirectFrameHandler::getLastUpdate() { return _lastPoll; } diff --git a/lib/VeDirectFrameHandler/VeDirectFrameHandler.h b/lib/VeDirectFrameHandler/VeDirectFrameHandler.h index 0ded5b9d..07cfc945 100644 --- a/lib/VeDirectFrameHandler/VeDirectFrameHandler.h +++ b/lib/VeDirectFrameHandler/VeDirectFrameHandler.h @@ -24,15 +24,17 @@ const byte buffLen = 40; // Maximum number of lines possi #define VICTRON_PIN_RX 22 #endif + + class VeDirectFrameHandler { public: VeDirectFrameHandler(); void init(); - void setPollInterval(uint32_t interval); + void setPollInterval(unsigned long interval); void loop(); - uint32_t getLastUpdate(); + unsigned long getLastUpdate(); void setLastUpdate(); String getPidAsString(const char* pid); String getCsAsString(const char* pid); @@ -45,6 +47,7 @@ public: int frameIndex; // which line of the frame are we on int veEnd; // current size (end) of the public buffer + unsigned long polltime=0; private: //bool mStop; // not sure what Victron uses this for, not using @@ -62,7 +65,7 @@ private: uint8_t mChecksum; // checksum value - char * mTextPointer; // pointer to the private buffer we're writing to, name or value + int idx; // index to the private buffer we're writing to, name or value char mName[9]; // buffer for the field name char mValue[33]; // buffer for the field value @@ -74,9 +77,8 @@ private: void frameEndEvent(bool); void logE(const char *, const char *); bool hexRxEvent(uint8_t); - uint32_t _pollInterval; - uint32_t _lastPoll = 0; - bool _frameEnd = false; + unsigned long _pollInterval; + unsigned long _lastPoll; }; extern VeDirectFrameHandler VeDirect; diff --git a/src/WebApi_ws_vedirect_live.cpp b/src/WebApi_ws_vedirect_live.cpp index e8fd5ce9..ebd10667 100644 --- a/src/WebApi_ws_vedirect_live.cpp +++ b/src/WebApi_ws_vedirect_live.cpp @@ -48,7 +48,7 @@ void WebApiWsVedirectLiveClass::loop() // Update on ve.direct change or at least after 10 seconds if (millis() - _lastWsPublish > (10 * 1000) || (maxTimeStamp != _newestVedirectTimestamp)) { - DynamicJsonDocument root(40960); + DynamicJsonDocument root(1024); JsonVariant var = root; generateJsonResponse(var); @@ -111,7 +111,8 @@ void WebApiWsVedirectLiveClass::generateJsonResponse(JsonVariant& root) root[F(VeDirect.veName[i])] = VeDirect.veValue[i]; } } - + root[F("polltime")] = VeDirect.polltime; + root[F("VE.end")] = VeDirect.veEnd; if (VeDirect.getLastUpdate() > _newestVedirectTimestamp) { _newestVedirectTimestamp = VeDirect.getLastUpdate(); } @@ -132,7 +133,7 @@ void WebApiWsVedirectLiveClass::onWebsocketEvent(AsyncWebSocket* server, AsyncWe void WebApiWsVedirectLiveClass::onLivedataStatus(AsyncWebServerRequest* request) { - AsyncJsonResponse* response = new AsyncJsonResponse(false, 40960U); + AsyncJsonResponse* response = new AsyncJsonResponse(false, 1024U); JsonVariant root = response->getRoot().as(); generateJsonResponse(root);