From 80a105f293a95beaa3e78504295ff4e3bc4c7d50 Mon Sep 17 00:00:00 2001 From: john30 Date: Sat, 16 May 2020 09:51:19 +0200 Subject: [PATCH 1/5] compiler warning --- src/lib/ebus/test/test_filereader.cpp | 6 +++--- src/lib/ebus/test/test_message.cpp | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/lib/ebus/test/test_filereader.cpp b/src/lib/ebus/test/test_filereader.cpp index 95c53d21..dabb69d2 100755 --- a/src/lib/ebus/test/test_filereader.cpp +++ b/src/lib/ebus/test/test_filereader.cpp @@ -110,7 +110,7 @@ class TestReader : public MappedFileReader { return RESULT_ERR_INVALID_ARG; } cout << "read line " << static_cast(baseLine + lineNo) << ": split OK" << endl; - string resultline[3] = resultlines[lineNo - 1]; + string* resultline = resultlines[lineNo - 1]; if (row->empty()) { cout << " result empty"; if (resultline[0] == "") { @@ -123,7 +123,7 @@ class TestReader : public MappedFileReader { } bool error = false; - string colnames[3] = resultlines[0]; + string* colnames = resultlines[0]; map& defaults = getDefaults()[""]; for (size_t colIdx = 0; colIdx < 3; colIdx++) { string col = colnames[colIdx]; @@ -145,7 +145,7 @@ class TestReader : public MappedFileReader { } for (size_t subIdx = 0; subIdx < subRows->size(); subIdx++) { - string resultsubline[4] = resultsublines[lineNo - 1][subIdx]; + string* resultsubline = resultsublines[lineNo - 1][subIdx]; *row = (*subRows)[subIdx]; if (row->empty()) { cout << " sub " << subIdx << " result empty"; diff --git a/src/lib/ebus/test/test_message.cpp b/src/lib/ebus/test/test_message.cpp index aea4f361..f62d774c 100644 --- a/src/lib/ebus/test/test_message.cpp +++ b/src/lib/ebus/test/test_message.cpp @@ -217,7 +217,7 @@ int main() { mstrs.resize(1); sstrs.resize(1); for (unsigned int i = 0; i < sizeof(checks) / sizeof(checks[0]); i++) { - string check[5] = checks[i]; + string* check = checks[i]; string inputStr = check[1]; string flags = check[4]; bool isTemplate = flags == "template"; From 5e97d0864da15e7b3aa1956de5c97a3707a4dcdb Mon Sep 17 00:00:00 2001 From: john30 Date: Sat, 16 May 2020 09:51:48 +0200 Subject: [PATCH 2/5] compiler warning, add another test for exp --- src/lib/ebus/test/test_data.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/lib/ebus/test/test_data.cpp b/src/lib/ebus/test/test_data.cpp index 13b812dc..9ab465ee 100755 --- a/src/lib/ebus/test/test_data.cpp +++ b/src/lib/ebus/test/test_data.cpp @@ -415,6 +415,7 @@ int main() { {"x,,exp", "-32.767", "10feffff04681103c2", "00", ""}, {"x,,exp,1000", "-0.000090000", "10feffff04ec51b8bd", "00", ""}, {"x,,exp,-100", "-9", "10feffff04ec51b8bd", "00", ""}, + {"x,,exp", "0.25", "10feffff040000803e", "00", ""}, {"x,,exp", "-", "10feffff040000c07f", "00", "W"}, {"x,,exr", "-0.09", "10feffff04bdb851ec", "00", ""}, {"x,,exr", "0.0", "10feffff0400000000", "00", ""}, @@ -528,7 +529,7 @@ int main() { templates->readLineFromStream(&dummystr, __FILE__, false, &lineNo, &row, &errorDescription, false, nullptr, nullptr); const DataField* fields = nullptr; for (unsigned int i = 0; i < sizeof(checks) / sizeof(checks[0]); i++) { - string check[5] = checks[i]; + string* check = checks[i]; istringstream isstr(check[0]); string expectStr = check[1]; MasterSymbolString mstr; From 6168af1f5aa47ec3e6cbb8b6f4a1c757445fe301 Mon Sep 17 00:00:00 2001 From: john30 Date: Sat, 11 Apr 2020 15:30:20 +0200 Subject: [PATCH 3/5] allow trailing "*" as wildcard for circuit and name in /list topic --- src/ebusd/mqtthandler.cpp | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/ebusd/mqtthandler.cpp b/src/ebusd/mqtthandler.cpp index 5c38db73..82e7c362 100644 --- a/src/ebusd/mqtthandler.cpp +++ b/src/ebusd/mqtthandler.cpp @@ -647,9 +647,21 @@ void MqttHandler::notifyTopic(const string& topic, const string& data) { if (isList) { logOtherInfo("mqtt", "received list topic for %s %s", circuit.c_str(), name.c_str()); deque messages; - m_messages->findAll(circuit, name, m_levels, true, true, true, true, true, true, 0, 0, false, &messages); + bool circuitPrefix = circuit.length()>0 && circuit.find_last_of('*')==circuit.length()-1; + if (circuitPrefix) { + circuit = circuit.substr(0, circuit.length()-1); + } + bool namePrefix = name.length()>0 && name.find_last_of('*')==name.length()-1; + if (namePrefix) { + name = name.substr(0, name.length()-1); + } + m_messages->findAll(circuit, name, m_levels, !(circuitPrefix || namePrefix), true, true, true, true, true, 0, 0, false, &messages); bool onlyWithData = !data.empty(); for (const auto message : messages) { + if (circuitPrefix && (message->getCircuit().substr(0, circuit.length())!=circuit || !namePrefix && name.length()>0 && message->getName()!=name) + || namePrefix && (message->getName().substr(0, name.length())!=name || !circuitPrefix && circuit.length()>0 && message->getCircuit()!=circuit)) { + continue; + } time_t lastup = message->getLastUpdateTime(); if (onlyWithData && lastup == 0) { continue; From edfe09a38362a50189d5b62a1e5915a05f8bb4d2 Mon Sep 17 00:00:00 2001 From: john30 Date: Sat, 11 Apr 2020 15:36:24 +0200 Subject: [PATCH 4/5] add global/scan topic revealing status of --scanconfig option initiated scan (fixes #304) --- src/ebusd/datahandler.h | 6 ++++++ src/ebusd/mainloop.cpp | 16 ++++++++++++++++ src/ebusd/mqtthandler.cpp | 11 ++++++++++- src/ebusd/mqtthandler.h | 8 +++++++- 4 files changed, 39 insertions(+), 2 deletions(-) mode change 100644 => 100755 src/ebusd/mqtthandler.cpp diff --git a/src/ebusd/datahandler.h b/src/ebusd/datahandler.h index 253386c6..64af17bb 100755 --- a/src/ebusd/datahandler.h +++ b/src/ebusd/datahandler.h @@ -160,6 +160,12 @@ class DataSink : virtual public DataHandler { */ virtual void notifyUpdateCheckResult(const string& checkResult) {} + /** + * Notify the sink of the latest scan status. + * @param scanStatus a string describing the scan status. + */ + virtual void notifyScanStatus(const string& scanStatus) {} + protected: /** the allowed access levels. */ string m_levels; diff --git a/src/ebusd/mainloop.cpp b/src/ebusd/mainloop.cpp index a295e41f..a2579527 100644 --- a/src/ebusd/mainloop.cpp +++ b/src/ebusd/mainloop.cpp @@ -217,6 +217,7 @@ void MainLoop::run() { time_t lastTaskRun, now, start, lastSignal = 0, since, sinkSince = 1, nextCheckRun; int taskDelay = 5; symbol_t lastScanAddress = 0; // 0 is known to be a master + string lastScanStatus = "."; time(&now); start = now; lastTaskRun = now; @@ -252,12 +253,16 @@ void MainLoop::run() { } if (m_scanConfig) { bool loadDelay = false; + string scanStatus = lastScanStatus; if (m_initialScan != ESC && reload && m_busHandler->hasSignal()) { loadDelay = true; result_t result; if (m_initialScan == SYN) { logNotice(lf_main, "starting initial full scan"); result = m_busHandler->startScan(true, "*"); + if (result == RESULT_OK) { + scanStatus = "running"; + } } else if (m_initialScan == BROADCAST) { logNotice(lf_main, "starting initial broadcast scan"); Message* message = m_messages->getScanMessage(BROADCAST); @@ -280,6 +285,7 @@ void MainLoop::run() { if (m_busHandler->formatScanResult(m_initialScan, false, &ret)) { logNotice(lf_main, "initial scan result: %s", ret.str().c_str()); } + scanStatus = "running"; } } if (result != RESULT_OK) { @@ -294,7 +300,11 @@ void MainLoop::run() { if (lastScanAddress == SYN) { taskDelay = 5; lastScanAddress = 0; + scanStatus = "finished"; } else { + if (scanStatus!="running") { + scanStatus = "running"; + } nextCheckRun = now + CHECK_INITIAL_DELAY; result_t result = m_busHandler->scanAndWait(lastScanAddress, true); taskDelay = (result == RESULT_ERR_NO_SIGNAL) ? 10 : 1; @@ -305,6 +315,12 @@ void MainLoop::run() { } } } + if (scanStatus != lastScanStatus && !dataSinks.empty()) { + lastScanStatus = scanStatus; + for (const auto dataSink : dataSinks) { + dataSink->notifyScanStatus(scanStatus); + } + } } else if (reload && m_busHandler->hasSignal()) { reload = false; // execute initial instructions diff --git a/src/ebusd/mqtthandler.cpp b/src/ebusd/mqtthandler.cpp old mode 100644 new mode 100755 index 82e7c362..45722fe6 --- a/src/ebusd/mqtthandler.cpp +++ b/src/ebusd/mqtthandler.cpp @@ -441,7 +441,7 @@ void on_message( MqttHandler::MqttHandler(UserInfo* userInfo, BusHandler* busHandler, MessageMap* messages) : DataSink(userInfo, "mqtt"), DataSource(busHandler), WaitThread(), m_messages(messages), m_connected(false), - m_initialConnectFailed(false), m_lastUpdateCheckResult("."), m_lastErrorLogTime(0) { + m_initialConnectFailed(false), m_lastUpdateCheckResult("."), m_lastScanStatus("."), m_lastErrorLogTime(0) { m_publishByField = false; m_mosquitto = nullptr; if (g_topicFields.empty()) { @@ -722,6 +722,14 @@ void MqttHandler::notifyUpdateCheckResult(const string& checkResult) { } } +void MqttHandler::notifyScanStatus(const string& scanStatus) { + if (scanStatus != m_lastScanStatus) { + m_lastScanStatus = scanStatus; + const string sep = (g_publishFormat & OF_JSON) ? "\"" : ""; + publishTopic(m_globalTopic+"scan", sep + (scanStatus.empty() ? "OK" : scanStatus) + sep, true); + } +} + void MqttHandler::run() { time_t lastTaskRun, now, start, lastSignal = 0, lastUpdates = 0; bool signal = false; @@ -798,6 +806,7 @@ void MqttHandler::run() { } } publishTopic(signalTopic, "false", true); + publishTopic(m_globalTopic+"scan", "", true); // clear retain of scan status } bool MqttHandler::handleTraffic(bool allowReconnect) { diff --git a/src/ebusd/mqtthandler.h b/src/ebusd/mqtthandler.h index 12f70cf5..b432d30b 100644 --- a/src/ebusd/mqtthandler.h +++ b/src/ebusd/mqtthandler.h @@ -91,7 +91,10 @@ class MqttHandler : public DataSink, public DataSource, public WaitThread { // @copydoc void notifyUpdateCheckResult(const string& checkResult) override; - protected: + // @copydoc + void notifyScanStatus(const string& scanStatus) override; + +protected: // @copydoc void run() override; @@ -159,6 +162,9 @@ class MqttHandler : public DataSink, public DataSource, public WaitThread { /** the last update check result. */ string m_lastUpdateCheckResult; + /** the last scan status. */ + string m_lastScanStatus; + /** the last system time when a communication error was logged. */ time_t m_lastErrorLogTime; }; From 4569b042662310f5445ffa31f77a2ee383639ea0 Mon Sep 17 00:00:00 2001 From: john30 Date: Sun, 6 Dec 2020 11:40:28 +0100 Subject: [PATCH 5/5] add debug defines --- CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index deb5ce96..9771bb88 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -27,6 +27,7 @@ if(NOT REVISION) endif(NOT REVISION) set(CMAKE_CXX_STANDARD 11) +set(CMAKE_CXX_FLAGS_DEBUG_INIT "-g -O0 -ggdb") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") set(CMAKE_INSTALL_PREFIX "") include(GNUInstallDirs)