From 95ef2f907e0fc2c8264e54968b82fc8c63bdb8f5 Mon Sep 17 00:00:00 2001 From: Bernhard Kirchen Date: Fri, 16 May 2025 21:55:30 +0200 Subject: [PATCH] switch VE.Direct library to DTU_LOG macros --- .../VeDirectFrameHandler.cpp | 60 +++++--------- .../VeDirectFrameHandler.h | 5 +- .../VeDirectFrameHexHandler.cpp | 21 ++--- .../VeDirectMpptController.cpp | 78 +++++++------------ .../VeDirectMpptController.h | 3 +- .../VeDirectShuntController.cpp | 6 +- .../VeDirectShuntController.h | 3 +- src/battery/victronsmartshunt/Provider.cpp | 2 +- src/solarcharger/victron/Provider.cpp | 2 +- 9 files changed, 70 insertions(+), 110 deletions(-) diff --git a/lib/VeDirectFrameHandler/VeDirectFrameHandler.cpp b/lib/VeDirectFrameHandler/VeDirectFrameHandler.cpp index 97549ed0..e35b8005 100644 --- a/lib/VeDirectFrameHandler/VeDirectFrameHandler.cpp +++ b/lib/VeDirectFrameHandler/VeDirectFrameHandler.cpp @@ -35,20 +35,16 @@ #include #include "VeDirectFrameHandler.h" +#include // The name of the record that contains the checksum. static constexpr char checksumTagName[] = "CHECKSUM"; -class Silent : public Print { - public: - size_t write(uint8_t c) final { return 0; } -}; - -static Silent MessageOutputDummy; +static const char* TAG = "veDirect"; +#define SUBTAG _logId template VeDirectFrameHandler::VeDirectFrameHandler() : - _msgOut(&MessageOutputDummy), _lastUpdate(0), _state(State::IDLE), _checksum(0), @@ -64,8 +60,7 @@ VeDirectFrameHandler::VeDirectFrameHandler() : } template -void VeDirectFrameHandler::init(char const* who, gpio_num_t rx, gpio_num_t tx, - Print* msgOut, bool verboseLogging, uint8_t hwSerialPort) +void VeDirectFrameHandler::init(char const* who, gpio_num_t rx, gpio_num_t tx, uint8_t hwSerialPort) { _vedirectSerial = std::make_unique(hwSerialPort); _vedirectSerial->setRxBufferSize(512); // increased from default (256) to 512 Byte to avoid overflow @@ -73,25 +68,17 @@ void VeDirectFrameHandler::init(char const* who, gpio_num_t rx, gpio_num_t tx _vedirectSerial->begin(19200, SERIAL_8N1, rx, tx); _vedirectSerial->flush(); _canSend = (tx != GPIO_NUM_NC); - _msgOut = msgOut; - _verboseLogging = verboseLogging; _debugIn = 0; _startUpPassed = false; // to obtain a complete dataset after a new start or restart _dataValid = false; // data is not valid on start or restart - snprintf(_logId, sizeof(_logId), "[VE.Direct %s %d/%d]", who, rx, tx); - if (_verboseLogging) { _msgOut->printf("%s init complete\r\n", _logId); } + snprintf(_logId, sizeof(_logId), "[%s %d/%d]", who, rx, tx); + DTU_LOGI("init complete"); } template void VeDirectFrameHandler::dumpDebugBuffer() { - _msgOut->printf("%s serial input (%d Bytes):", _logId, _debugIn); - for (int i = 0; i < _debugIn; ++i) { - if (i % 16 == 0) { - _msgOut->printf("\r\n%s", _logId); - } - _msgOut->printf(" %02x", _debugBuffer[i]); - } - _msgOut->println(""); + DTU_LOGD("received serial input (%d Bytes)", _debugIn); + LogHelper::dumpBytes(TAG, _logId, _debugBuffer.data(), _debugIn); _debugIn = 0; } @@ -121,9 +108,8 @@ void VeDirectFrameHandler::loop() // if such a large gap is observed, reset the state machine so it tries // to decode a new frame / hex messages once more data arrives. if ((State::IDLE != _state) && ((millis() - _lastByteMillis) > 500)) { - _msgOut->printf("%s Resetting state machine (was %d) after timeout\r\n", - _logId, static_cast(_state)); - if (_verboseLogging) { dumpDebugBuffer(); } + DTU_LOGW("Resetting state machine (was %d) after timeout", static_cast(_state)); + dumpDebugBuffer(); reset(); } } @@ -153,15 +139,15 @@ static bool isValidChar(uint8_t inbyte) template void VeDirectFrameHandler::rxData(uint8_t inbyte) { - if (_verboseLogging) { + if (esp_log_level_get(TAG) >= ESP_LOG_VERBOSE) { _debugBuffer[_debugIn] = inbyte; _debugIn = (_debugIn + 1) % _debugBuffer.size(); if (0 == _debugIn) { - _msgOut->printf("%s ERROR: debug buffer overrun!\r\n", _logId); + DTU_LOGE("debug buffer overrun!"); } } if (_state != State::CHECKSUM && !isValidChar(inbyte)) { - _msgOut->printf("%s non-ASCII character 0x%02x, invalid frame\r\n", _logId, inbyte); + DTU_LOGW("non-ASCII character 0x%02x, invalid frame", inbyte); reset(); return; } @@ -238,7 +224,7 @@ void VeDirectFrameHandler::rxData(uint8_t inbyte) break; case State::CHECKSUM: { - if (_verboseLogging) { dumpDebugBuffer(); } + dumpDebugBuffer(); if (_checksum == 0) { _frameContainsFieldV = false; @@ -263,7 +249,7 @@ void VeDirectFrameHandler::rxData(uint8_t inbyte) frameValidEvent(); } else { - _msgOut->printf("%s checksum 0x%02x != 0x00, invalid frame\r\n", _logId, _checksum); + DTU_LOGW("checksum 0x%02x != 0x00, invalid frame", _checksum); } reset(); break; @@ -279,10 +265,7 @@ void VeDirectFrameHandler::rxData(uint8_t inbyte) */ template void VeDirectFrameHandler::processTextData(std::string const& name, std::string const& value) { - if (_verboseLogging) { - _msgOut->printf("%s Text Data '%s' = '%s'\r\n", - _logId, name.c_str(), value.c_str()); - } + DTU_LOGD("Text Data '%s' = '%s'", name.c_str(), value.c_str()); if (processTextDataDerived(name, value)) { return; } @@ -320,8 +303,7 @@ void VeDirectFrameHandler::processTextData(std::string const& name, std::stri return; } - _msgOut->printf("%s Unknown text data '%s' (value '%s')\r\n", - _logId, name.c_str(), value.c_str()); + DTU_LOGI("Unknown text data '%s' (value '%s')", name.c_str(), value.c_str()); } /* @@ -338,9 +320,9 @@ typename VeDirectFrameHandler::State VeDirectFrameHandler::hexRxEvent(uint // now we can analyse the hex message _hexBuffer[_hexSize] = '\0'; VeDirectHexData data; - if (disassembleHexData(data) && !hexDataHandler(data) && _verboseLogging) { - _msgOut->printf("%s Unhandled Hex %s Response, addr: 0x%04X (%s), " - "value: 0x%08X, flags: 0x%02X\r\n", _logId, + if (disassembleHexData(data) && !hexDataHandler(data)) { + DTU_LOGI("Unhandled Hex %s Response, addr: 0x%04X (%s), " + "value: 0x%08X, flags: 0x%02X", data.getResponseAsString().data(), static_cast(data.addr), data.getRegisterAsString().data(), @@ -355,7 +337,7 @@ typename VeDirectFrameHandler::State VeDirectFrameHandler::hexRxEvent(uint _hexBuffer[_hexSize++]=inbyte; if (_hexSize>=VE_MAX_HEX_LEN) { // oops -buffer overflow - something went wrong, we abort - _msgOut->printf("%s hexRx buffer overflow - aborting read\r\n", _logId); + DTU_LOGE("hexRx buffer overflow - aborting read"); _hexSize=0; ret = State::IDLE; } diff --git a/lib/VeDirectFrameHandler/VeDirectFrameHandler.h b/lib/VeDirectFrameHandler/VeDirectFrameHandler.h index 76b6ae17..15ed05c4 100644 --- a/lib/VeDirectFrameHandler/VeDirectFrameHandler.h +++ b/lib/VeDirectFrameHandler/VeDirectFrameHandler.h @@ -32,12 +32,9 @@ public: protected: VeDirectFrameHandler(); - void init(char const* who, gpio_num_t rx, gpio_num_t tx, Print* msgOut, - bool verboseLogging, uint8_t hwSerialPort); + void init(char const* who, gpio_num_t rx, gpio_num_t tx, uint8_t hwSerialPort); virtual bool hexDataHandler(VeDirectHexData const &data) { return false; } // handles the disassembled hex response - bool _verboseLogging; - Print* _msgOut; uint32_t _lastUpdate; // timestamp of frame containing field "V" T _tmpFrame; diff --git a/lib/VeDirectFrameHandler/VeDirectFrameHexHandler.cpp b/lib/VeDirectFrameHandler/VeDirectFrameHexHandler.cpp index 8256f1ea..ee429c40 100644 --- a/lib/VeDirectFrameHandler/VeDirectFrameHexHandler.cpp +++ b/lib/VeDirectFrameHandler/VeDirectFrameHexHandler.cpp @@ -16,6 +16,10 @@ HexHandler.cpp */ #include #include "VeDirectFrameHandler.h" +#include + +static const char* TAG = "veDirect"; +#define SUBTAG _logId /* * calcHexFrameCheckSum() @@ -122,8 +126,9 @@ bool VeDirectFrameHandler::disassembleHexData(VeDirectHexData &data) { } } - if (!state) - _msgOut->printf("%s failed to disassemble the hex message: %s\r\n", _logId, buffer); + if (!state) { + DTU_LOGE("failed to disassemble the hex message: %s", buffer); + } return (state); } @@ -212,15 +217,13 @@ bool VeDirectFrameHandler::sendHexCommand(VeDirectHexCommand cmd, VeDirectHex String send = txData + "\n"; // hex command end byte _vedirectSerial->write(send.c_str(), send.length()); - if (_verboseLogging) { - auto blen = _vedirectSerial->availableForWrite(); - _msgOut->printf("%s Sending Hex Command: %s, Free FIFO-Buffer: %u\r\n", - _logId, txData.c_str(), blen); - } + auto blen = _vedirectSerial->availableForWrite(); + DTU_LOGD("Sending Hex Command: %s, Free FIFO-Buffer: %u", txData.c_str(), blen); } - if (!ret) - _msgOut->printf("%s send hex command fault: %s\r\n", _logId, txData.c_str()); + if (!ret) { + DTU_LOGE("send hex command fault: %s", txData.c_str()); + } return (ret); } diff --git a/lib/VeDirectFrameHandler/VeDirectMpptController.cpp b/lib/VeDirectFrameHandler/VeDirectMpptController.cpp index 99ae69ff..790e557c 100644 --- a/lib/VeDirectFrameHandler/VeDirectMpptController.cpp +++ b/lib/VeDirectFrameHandler/VeDirectMpptController.cpp @@ -9,14 +9,16 @@ #include #include "VeDirectMpptController.h" +#include //#define PROCESS_NETWORK_STATE -void VeDirectMpptController::init(gpio_num_t rx, gpio_num_t tx, Print* msgOut, - bool verboseLogging, uint8_t hwSerialPort) +static const char* TAG = "veDirect"; +#define SUBTAG _logId + +void VeDirectMpptController::init(gpio_num_t rx, gpio_num_t tx, uint8_t hwSerialPort) { - VeDirectFrameHandler::init("MPPT", rx, tx, msgOut, - verboseLogging, hwSerialPort); + VeDirectFrameHandler::init("MPPT", rx, tx, hwSerialPort); } bool VeDirectMpptController::processTextDataDerived(std::string const& name, std::string const& value) @@ -174,39 +176,31 @@ bool VeDirectMpptController::hexDataHandler(VeDirectHexData const &data) { _tmpFrame.MpptTemperatureMilliCelsius = { millis(), static_cast(data.value) * 10 }; - if (_verboseLogging) { - _msgOut->printf("%s Hex Data: MPPT Temperature (0x%04X): %.2f°C\r\n", - _logId, regLog, - _tmpFrame.MpptTemperatureMilliCelsius.second / 1000.0); - } + ESP_LOGD(TAG, "%s Hex Data: MPPT Temperature (0x%04X): %.2f°C", + _logId, regLog, + _tmpFrame.MpptTemperatureMilliCelsius.second / 1000.0); return true; break; case VeDirectHexRegister::SmartBatterySenseTemperature: if (data.value == 0xFFFF) { - if (_verboseLogging) { - _msgOut->printf("%s Hex Data: Smart Battery Sense Temperature is not available\r\n", _logId); - } + ESP_LOGD(TAG, "%s Hex Data: Smart Battery Sense Temperature is not available", _logId); return true; // we know what to do with it, and we decided to ignore the value } _tmpFrame.SmartBatterySenseTemperatureMilliCelsius = { millis(), static_cast(data.value) * 10 - 273150 }; - if (_verboseLogging) { - _msgOut->printf("%s Hex Data: Smart Battery Sense Temperature (0x%04X): %.2f°C\r\n", - _logId, regLog, - _tmpFrame.SmartBatterySenseTemperatureMilliCelsius.second / 1000.0); - } + ESP_LOGD(TAG, "%s Hex Data: Smart Battery Sense Temperature (0x%04X): %.2f°C", + _logId, regLog, + _tmpFrame.SmartBatterySenseTemperatureMilliCelsius.second / 1000.0); return true; break; case VeDirectHexRegister::NetworkTotalDcInputPower: if (data.value == 0xFFFFFFFF) { - if (_verboseLogging) { - _msgOut->printf("%s Hex Data: Network total DC power value " - "indicates non-networked controller\r\n", _logId); - } + ESP_LOGD(TAG, "%s Hex Data: Network total DC power value " + "indicates non-networked controller", _logId); _tmpFrame.NetworkTotalDcInputPowerMilliWatts = { 0, 0 }; return true; // we know what to do with it, and we decided to ignore the value } @@ -214,22 +208,18 @@ bool VeDirectMpptController::hexDataHandler(VeDirectHexData const &data) { _tmpFrame.NetworkTotalDcInputPowerMilliWatts = { millis(), data.value * 10 }; - if (_verboseLogging) { - _msgOut->printf("%s Hex Data: Network Total DC Power (0x%04X): %.2fW\r\n", - _logId, regLog, - _tmpFrame.NetworkTotalDcInputPowerMilliWatts.second / 1000.0); - } + ESP_LOGD(TAG, "%s Hex Data: Network Total DC Power (0x%04X): %.2fW", + _logId, regLog, + _tmpFrame.NetworkTotalDcInputPowerMilliWatts.second / 1000.0); return true; break; case VeDirectHexRegister::BatteryAbsorptionVoltage: _tmpFrame.BatteryAbsorptionMilliVolt = { millis(), static_cast(data.value) * 10 }; - if (_verboseLogging) { - _msgOut->printf("%s Hex Data: MPPT Absorption Voltage (0x%04X): %.2fV\r\n", - _logId, regLog, - _tmpFrame.BatteryAbsorptionMilliVolt.second / 1000.0); - } + ESP_LOGD(TAG, "%s Hex Data: MPPT Absorption Voltage (0x%04X): %.2fV", + _logId, regLog, + _tmpFrame.BatteryAbsorptionMilliVolt.second / 1000.0); return true; break; @@ -237,11 +227,9 @@ bool VeDirectMpptController::hexDataHandler(VeDirectHexData const &data) { _tmpFrame.BatteryFloatMilliVolt = { millis(), static_cast(data.value) * 10 }; - if (_verboseLogging) { - _msgOut->printf("%s Hex Data: MPPT Float Voltage (0x%04X): %.2fV\r\n", - _logId, regLog, - _tmpFrame.BatteryFloatMilliVolt.second / 1000.0); - } + ESP_LOGD(TAG, "%s Hex Data: MPPT Float Voltage (0x%04X): %.2fV", + _logId, regLog, + _tmpFrame.BatteryFloatMilliVolt.second / 1000.0); return true; break; @@ -250,10 +238,8 @@ bool VeDirectMpptController::hexDataHandler(VeDirectHexData const &data) { _tmpFrame.NetworkInfo = { millis(), static_cast(data.value) }; - if (_verboseLogging) { - _msgOut->printf("%s Hex Data: Network Info (0x%04X): 0x%X\r\n", - _logId, regLog, data.value); - } + ESP_LOGD(TAG, "%s Hex Data: Network Info (0x%04X): 0x%X", + _logId, regLog, data.value); return true; break; @@ -261,10 +247,8 @@ bool VeDirectMpptController::hexDataHandler(VeDirectHexData const &data) { _tmpFrame.NetworkMode = { millis(), static_cast(data.value) }; - if (_verboseLogging) { - _msgOut->printf("%s Hex Data: Network Mode (0x%04X): 0x%X\r\n", - _logId, regLog, data.value); - } + ESP_LOGD(TAG, "%s Hex Data: Network Mode (0x%04X): 0x%X", + _logId, regLog, data.value); return true; break; @@ -272,10 +256,8 @@ bool VeDirectMpptController::hexDataHandler(VeDirectHexData const &data) { _tmpFrame.NetworkStatus = { millis(), static_cast(data.value) }; - if (_verboseLogging) { - _msgOut->printf("%s Hex Data: Network Status (0x%04X): 0x%X\r\n", - _logId, regLog, data.value); - } + ESP_LOGD(TAG, "%s Hex Data: Network Status (0x%04X): 0x%X", + _logId, regLog, data.value); return true; break; #endif // PROCESS_NETWORK_STATE diff --git a/lib/VeDirectFrameHandler/VeDirectMpptController.h b/lib/VeDirectFrameHandler/VeDirectMpptController.h index f3170113..6c301356 100644 --- a/lib/VeDirectFrameHandler/VeDirectMpptController.h +++ b/lib/VeDirectFrameHandler/VeDirectMpptController.h @@ -46,8 +46,7 @@ class VeDirectMpptController : public VeDirectFrameHandler { public: VeDirectMpptController() = default; - void init(gpio_num_t rx, gpio_num_t tx, Print* msgOut, - bool verboseLogging, uint8_t hwSerialPort); + void init(gpio_num_t rx, gpio_num_t tx, uint8_t hwSerialPort); using data_t = veMpptStruct; diff --git a/lib/VeDirectFrameHandler/VeDirectShuntController.cpp b/lib/VeDirectFrameHandler/VeDirectShuntController.cpp index affbfda3..2a428c1e 100644 --- a/lib/VeDirectFrameHandler/VeDirectShuntController.cpp +++ b/lib/VeDirectFrameHandler/VeDirectShuntController.cpp @@ -3,11 +3,9 @@ VeDirectShuntController VeDirectShunt; -void VeDirectShuntController::init(gpio_num_t rx, gpio_num_t tx, Print* msgOut, - bool verboseLogging, uint8_t hwSerialPort) +void VeDirectShuntController::init(gpio_num_t rx, gpio_num_t tx, uint8_t hwSerialPort) { - VeDirectFrameHandler::init("SmartShunt", rx, tx, msgOut, - verboseLogging, hwSerialPort); + VeDirectFrameHandler::init("SmartShunt", rx, tx, hwSerialPort); } bool VeDirectShuntController::processTextDataDerived(std::string const& name, std::string const& value) diff --git a/lib/VeDirectFrameHandler/VeDirectShuntController.h b/lib/VeDirectFrameHandler/VeDirectShuntController.h index 84fb5e81..a200d779 100644 --- a/lib/VeDirectFrameHandler/VeDirectShuntController.h +++ b/lib/VeDirectFrameHandler/VeDirectShuntController.h @@ -8,8 +8,7 @@ class VeDirectShuntController : public VeDirectFrameHandler { public: VeDirectShuntController() = default; - void init(gpio_num_t rx, gpio_num_t tx, Print* msgOut, - bool verboseLogging, uint8_t hwSerialPort); + void init(gpio_num_t rx, gpio_num_t tx, uint8_t hwSerialPort); using data_t = veShuntStruct; diff --git a/src/battery/victronsmartshunt/Provider.cpp b/src/battery/victronsmartshunt/Provider.cpp index 530b4e31..d7a8769a 100644 --- a/src/battery/victronsmartshunt/Provider.cpp +++ b/src/battery/victronsmartshunt/Provider.cpp @@ -31,7 +31,7 @@ bool Provider::init(bool verboseLogging) auto oHwSerialPort = SerialPortManager.allocatePort(_serialPortOwner); if (!oHwSerialPort) { return false; } - VeDirectShunt.init(pin.battery_rx, pin.battery_tx, &MessageOutput, verboseLogging, *oHwSerialPort); + VeDirectShunt.init(pin.battery_rx, pin.battery_tx, *oHwSerialPort); return true; } diff --git a/src/solarcharger/victron/Provider.cpp b/src/solarcharger/victron/Provider.cpp index fa026b3a..0808cee2 100644 --- a/src/solarcharger/victron/Provider.cpp +++ b/src/solarcharger/victron/Provider.cpp @@ -57,7 +57,7 @@ bool Provider::initController(gpio_num_t rx, gpio_num_t tx, bool logging, _serialPortOwners.push_back(owner); auto upController = std::make_unique(); - upController->init(rx, tx, &MessageOutput, logging, *oHwSerialPort); + upController->init(rx, tx, *oHwSerialPort); _controllers.push_back(std::move(upController)); return true; }