Skip to content

Commit

Permalink
ve.diect with hex asnync messages
Browse files Browse the repository at this point in the history
ignore async hex messeage on older devices
  • Loading branch information
helgeerbe committed Apr 17, 2023
1 parent 40cee1f commit b8e06bf
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 9 deletions.
33 changes: 25 additions & 8 deletions lib/VeDirectFrameHandler/VeDirectFrameHandler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ VeDirectFrameHandler::VeDirectFrameHandler() :
_state(IDLE),
_checksum(0),
_textPointer(0),
_hexSize(0),
_name(""),
_value(""),
_tmpFrame(),
Expand Down Expand Up @@ -99,7 +100,9 @@ void VeDirectFrameHandler::rxData(uint8_t inbyte)
{
//if (mStop) return;
if ( (inbyte == ':') && (_state != CHECKSUM) ) {
_state = RECORD_HEX;
_prevState = _state; //hex frame can interrupt TEXT
_state = RECORD_HEX;
_hexSize = 0;
}
if (_state != RECORD_HEX) {
_checksum += inbyte;
Expand Down Expand Up @@ -177,10 +180,7 @@ void VeDirectFrameHandler::rxData(uint8_t inbyte)
break;
}
case RECORD_HEX:
if (hexRxEvent(inbyte)) {
_checksum = 0;
_state = IDLE;
}
_state = hexRxEvent(inbyte);
break;
}
}
Expand Down Expand Up @@ -279,10 +279,27 @@ void VeDirectFrameHandler::logE(const char * module, const char * error) {

/*
* hexRxEvent
* This function included for continuity and possible future use.
* This function records hex answers or async messages
*/
bool VeDirectFrameHandler::hexRxEvent(uint8_t inbyte) {
return true; // stubbed out for future
int VeDirectFrameHandler::hexRxEvent(uint8_t inbyte) {
int ret=RECORD_HEX; // default - continue recording until end of frame

switch (inbyte) {
case '\n':
// restore previous state
ret=_prevState;
break;

default:
_hexSize++;
if (_hexSize>=VE_MAX_HEX_LEN) { // oops -buffer overflow - something went wrong, we abort
logE(MODULE,"hexRx buffer overflow - aborting read");
_hexSize=0;
ret=IDLE;
}
}

return ret;
}

bool VeDirectFrameHandler::isDataValid() {
Expand Down
6 changes: 5 additions & 1 deletion lib/VeDirectFrameHandler/VeDirectFrameHandler.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@

#define VE_MAX_NAME_LEN 9 // VE.Direct Protocol: max name size is 9 including /0
#define VE_MAX_VALUE_LEN 33 // VE.Direct Protocol: max value size is 33 including /0
#define VE_MAX_HEX_LEN 100 // Maximum size of hex frame - max payload 34 byte (=68 char) + safe buffer


typedef struct {
uint16_t PID; // product id
Expand Down Expand Up @@ -69,12 +71,14 @@ class VeDirectFrameHandler {
void textRxEvent(char *, char *);
void frameEndEvent(bool); // copy temp struct to public struct
void logE(const char *, const char *);
bool hexRxEvent(uint8_t);
int hexRxEvent(uint8_t);

//bool mStop; // not sure what Victron uses this for, not using
int _state; // current state
int _prevState; // previous state
uint8_t _checksum; // checksum value
char * _textPointer; // pointer to the private buffer we're writing to, name or value
int _hexSize; // length of hex buffer
char _name[VE_MAX_VALUE_LEN]; // buffer for the field name
char _value[VE_MAX_VALUE_LEN]; // buffer for the field value
veStruct _tmpFrame{}; // private struct for received name and value pairs
Expand Down

0 comments on commit b8e06bf

Please sign in to comment.