Skip to content

Commit

Permalink
Feature: add unique prefix to VE.Direct messages
Browse files Browse the repository at this point in the history
  • Loading branch information
schlimmchen committed Apr 2, 2024
1 parent 8abf614 commit 187f197
Show file tree
Hide file tree
Showing 4 changed files with 21 additions and 21 deletions.
22 changes: 12 additions & 10 deletions lib/VeDirectFrameHandler/VeDirectFrameHandler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -72,21 +72,23 @@ VeDirectFrameHandler::VeDirectFrameHandler() :
{
}

void VeDirectFrameHandler::init(int8_t rx, int8_t tx, Print* msgOut, bool verboseLogging, uint16_t hwSerialPort)
void VeDirectFrameHandler::init(char const* who, int8_t rx, int8_t tx, Print* msgOut, bool verboseLogging, uint16_t hwSerialPort)
{
_vedirectSerial = std::make_unique<HardwareSerial>(hwSerialPort);
_vedirectSerial->begin(19200, SERIAL_8N1, rx, tx);
_vedirectSerial->flush();
_msgOut = msgOut;
_verboseLogging = verboseLogging;
_debugIn = 0;
snprintf(_logId, sizeof(_logId), "[VE.Direct %s %d/%d]", who, rx, tx);
if (_verboseLogging) { _msgOut->printf("%s init complete\r\n", _logId); }
}

void VeDirectFrameHandler::dumpDebugBuffer() {
_msgOut->printf("[VE.Direct] serial input (%d Bytes):", _debugIn);
_msgOut->printf("%s serial input (%d Bytes):", _logId, _debugIn);
for (int i = 0; i < _debugIn; ++i) {
if (i % 16 == 0) {
_msgOut->printf("\r\n[VE.Direct]");
_msgOut->printf("\r\n%s", _logId);
}
_msgOut->printf(" %02x", _debugBuffer[i]);
}
Expand All @@ -105,7 +107,7 @@ void VeDirectFrameHandler::loop()
// if such a large gap is observed, reset the state machine so it tries
// to decode a new frame once more data arrives.
if (IDLE != _state && _lastByteMillis + 500 < millis()) {
_msgOut->printf("[VE.Direct] Resetting state machine (was %d) after timeout\r\n", _state);
_msgOut->printf("%s Resetting state machine (was %d) after timeout\r\n", _logId, _state);
if (_verboseLogging) { dumpDebugBuffer(); }
_checksum = 0;
_state = IDLE;
Expand All @@ -123,7 +125,7 @@ void VeDirectFrameHandler::rxData(uint8_t inbyte)
_debugBuffer[_debugIn] = inbyte;
_debugIn = (_debugIn + 1) % _debugBuffer.size();
if (0 == _debugIn) {
_msgOut->println("[VE.Direct] ERROR: debug buffer overrun!");
_msgOut->printf("%s ERROR: debug buffer overrun!\r\n", _logId);
}
}

Expand Down Expand Up @@ -201,7 +203,7 @@ void VeDirectFrameHandler::rxData(uint8_t inbyte)
{
bool valid = _checksum == 0;
if (!valid) {
_msgOut->printf("[VE.Direct] checksum 0x%02x != 0, invalid frame\r\n", _checksum);
_msgOut->printf("%s checksum 0x%02x != 0, invalid frame\r\n", _logId, _checksum);
}
if (_verboseLogging) { dumpDebugBuffer(); }
_checksum = 0;
Expand All @@ -219,10 +221,10 @@ void VeDirectFrameHandler::rxData(uint8_t inbyte)
* textRxEvent
* This function is called every time a new name/value is successfully parsed. It writes the values to the temporary buffer.
*/
bool VeDirectFrameHandler::textRxEvent(std::string const& who, char* name, char* value, veStruct& frame) {
bool VeDirectFrameHandler::textRxEvent(char* name, char* value, veStruct& frame) {
if (_verboseLogging) {
_msgOut->printf("[Victron %s] Text Event %s: Value: %s\r\n",
who.c_str(), name, value );
_msgOut->printf("%s Text Event %s: Value: %s\r\n",
_logId, name, value );
}

if (strcmp(name, "PID") == 0) {
Expand Down Expand Up @@ -271,7 +273,7 @@ int VeDirectFrameHandler::hexRxEvent(uint8_t inbyte) {
default:
_hexSize++;
if (_hexSize>=VE_MAX_HEX_LEN) { // oops -buffer overflow - something went wrong, we abort
_msgOut->println("[VE.Direct] hexRx buffer overflow - aborting read");
_msgOut->printf("%s hexRx buffer overflow - aborting read\r\n", _logId);
_hexSize=0;
ret=IDLE;
}
Expand Down
8 changes: 5 additions & 3 deletions lib/VeDirectFrameHandler/VeDirectFrameHandler.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,13 @@

class VeDirectFrameHandler {
public:
VeDirectFrameHandler();
virtual void init(int8_t rx, int8_t tx, Print* msgOut, bool verboseLogging, uint16_t hwSerialPort);
void loop(); // main loop to read ve.direct data
uint32_t getLastUpdate() const; // timestamp of last successful frame read

protected:
VeDirectFrameHandler();
void init(char const* who, int8_t rx, int8_t tx, Print* msgOut, bool verboseLogging, uint16_t hwSerialPort);

bool _verboseLogging;
Print* _msgOut;
uint32_t _lastUpdate;
Expand All @@ -43,7 +44,7 @@ class VeDirectFrameHandler {
frozen::string const& getPidAsString() const; // product ID as string
} veStruct;

bool textRxEvent(std::string const& who, char* name, char* value, veStruct& frame);
bool textRxEvent(char* name, char* value, veStruct& frame);
bool isDataValid(veStruct const& frame) const; // return true if data valid and not outdated

template<typename T, size_t L>
Expand Down Expand Up @@ -76,4 +77,5 @@ class VeDirectFrameHandler {
std::array<uint8_t, 512> _debugBuffer;
unsigned _debugIn;
uint32_t _lastByteMillis;
char _logId[32];
};
5 changes: 2 additions & 3 deletions lib/VeDirectFrameHandler/VeDirectMpptController.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,8 @@

void VeDirectMpptController::init(int8_t rx, int8_t tx, Print* msgOut, bool verboseLogging, uint16_t hwSerialPort)
{
VeDirectFrameHandler::init(rx, tx, msgOut, verboseLogging, hwSerialPort);
VeDirectFrameHandler::init("MPPT", rx, tx, msgOut, verboseLogging, hwSerialPort);
_spData = std::make_shared<veMpptStruct>();
if (_verboseLogging) { _msgOut->println("Finished init MPPTController"); }
}

bool VeDirectMpptController::isDataValid() const {
Expand All @@ -14,7 +13,7 @@ bool VeDirectMpptController::isDataValid() const {

void VeDirectMpptController::textRxEvent(char* name, char* value)
{
if (VeDirectFrameHandler::textRxEvent("MPPT", name, value, _tmpFrame)) {
if (VeDirectFrameHandler::textRxEvent(name, value, _tmpFrame)) {
return;
}

Expand Down
7 changes: 2 additions & 5 deletions lib/VeDirectFrameHandler/VeDirectShuntController.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,15 +9,12 @@ VeDirectShuntController::VeDirectShuntController()

void VeDirectShuntController::init(int8_t rx, int8_t tx, Print* msgOut, bool verboseLogging)
{
VeDirectFrameHandler::init(rx, tx, msgOut, verboseLogging, 2);
if (_verboseLogging) {
_msgOut->println("Finished init ShuntController");
}
VeDirectFrameHandler::init("SmartShunt", rx, tx, msgOut, verboseLogging, 2);
}

void VeDirectShuntController::textRxEvent(char* name, char* value)
{
if (VeDirectFrameHandler::textRxEvent("SmartShunt", name, value, _tmpFrame)) {
if (VeDirectFrameHandler::textRxEvent(name, value, _tmpFrame)) {
return;
}

Expand Down

0 comments on commit 187f197

Please sign in to comment.