From 592cf2c069ee36c88a7cc606fc4b451f77dfbc03 Mon Sep 17 00:00:00 2001 From: john30 Date: Sat, 7 Nov 2015 19:08:55 +0100 Subject: [PATCH] use individual scan message, also reset masterCount in clear(), fix for logging and info result, split load state into load init and done --- src/ebusd/bushandler.cpp | 37 ++++++++++++++++++++----------------- src/ebusd/bushandler.h | 10 +++++++--- src/ebusd/mainloop.cpp | 30 +++++++++++++++++++++--------- 3 files changed, 48 insertions(+), 29 deletions(-) diff --git a/src/ebusd/bushandler.cpp b/src/ebusd/bushandler.cpp index ca04c7b2..f404eebd 100644 --- a/src/ebusd/bushandler.cpp +++ b/src/ebusd/bushandler.cpp @@ -96,7 +96,7 @@ bool ScanRequest::notify(result_t result, SymbolString& slave) unsigned char dstAddress = m_master[1]; ostringstream scanResult; if (result == RESULT_OK) { - result = m_message->decode(pt_slaveData, slave, scanResult); // decode data + result = m_message->decode(pt_slaveData, slave, scanResult, 0, true); // decode data } if (result < RESULT_OK) { if (result == RESULT_ERR_TIMEOUT) @@ -140,6 +140,7 @@ void BusHandler::clear() { m_loadedFiles.clear(); memset(m_seenAddresses, 0, sizeof(m_seenAddresses)); + m_masterCount = 1; m_scanResults.clear(); } @@ -789,19 +790,14 @@ void BusHandler::receiveCompleted() result_t BusHandler::startScan(bool full) { - Message* scanMessage = m_messages->getScanMessage(); deque messages = m_messages->findAll("scan", ""); for (deque::iterator it = messages.begin(); it < messages.end();) { Message* message = *it++; if (message->getId()[0] == 0x07 && message->getId()[1] == 0x04) { - if (scanMessage == NULL) - scanMessage = message; messages.erase(it - 1); // query pb 0x07 / sb 0x04 only once break; } } - if (scanMessage == NULL) - return RESULT_ERR_NOTFOUND; m_scanResults.clear(); @@ -814,6 +810,9 @@ result_t BusHandler::startScan(bool full) continue; } + Message* scanMessage = m_messages->getScanMessage(slave); + if (scanMessage==NULL) + continue; ScanRequest* request = new ScanRequest(scanMessage, messages, this); result_t result = request->prepare(m_ownMasterAddress, slave); if (result != RESULT_OK) { @@ -828,7 +827,7 @@ result_t BusHandler::startScan(bool full) void BusHandler::addScanResult(unsigned char dstAddress, string result) { m_seenAddresses[dstAddress] |= SCANNED; - logNotice(lf_bus, "scan %2.2x: %s", result.c_str()); + logNotice(lf_bus, "scan %2.2x: %s", dstAddress, result.c_str()); if (m_scanResults.find(dstAddress) == m_scanResults.end()) m_scanResults[dstAddress] = result; else @@ -845,8 +844,7 @@ void BusHandler::formatScanResult(ostringstream& output) first = false; else output << endl; - output << hex << setw(2) << setfill('0') << static_cast(slave) << UI_FIELD_SEPARATOR; - output << it->second; + output << hex << setw(2) << setfill('0') << static_cast(slave) << it->second; } } } @@ -869,7 +867,7 @@ void BusHandler::formatSeenInfo(ostringstream& output) if ((m_seenAddresses[address]&SCANNED)!=0) { output << ", scanned"; Message* message = m_messages->getScanMessage(address); - if (message!=NULL) { + if (message!=NULL && message->getLastUpdateTime()>0) { // add detailed scan info: Manufacturer ID SW HW output << " \""; result_t result = message->decodeLastData(output, OF_VERBOSE); @@ -879,7 +877,7 @@ void BusHandler::formatSeenInfo(ostringstream& output) output << "\""; } } - if ((m_seenAddresses[address]&LOADED)!=0) + if ((m_seenAddresses[address]&LOAD_DONE)!=0) output << ", loaded \"" << m_loadedFiles[address] << "\""; } } @@ -928,22 +926,27 @@ void BusHandler::formatGrabResult(ostringstream& output) } } -unsigned char BusHandler::getNextScanAddress(unsigned char lastAddress) { +unsigned char BusHandler::getNextScanAddress(unsigned char lastAddress, bool& scanned) { if (lastAddress==SYN) return SYN; while (++lastAddress!=0) { // 0 is known to be a master if (!isValidAddress(lastAddress, false) || isMaster(lastAddress)) continue; - if ((m_seenAddresses[lastAddress]&(SEEN|SCANNED))==SEEN) + if ((m_seenAddresses[lastAddress]&(SEEN|LOAD_INIT))==SEEN) { + scanned = m_seenAddresses[lastAddress]&SCANNED; return lastAddress; + } unsigned char master = getMasterAddress(lastAddress); - if (master!=SYN && (m_seenAddresses[master]&SEEN)!=0 && (m_seenAddresses[lastAddress]&SCANNED)==0) + if (master!=SYN && (m_seenAddresses[master]&SEEN)!=0 && (m_seenAddresses[lastAddress]&LOAD_INIT)==0) return lastAddress; } return SYN; } -void BusHandler::setScanConfigLoaded(unsigned char address, string file) { - m_seenAddresses[address] |= LOADED; - m_loadedFiles[address] = file; +void BusHandler::setScanConfigLoaded(unsigned char address, bool completed, string file) { + m_seenAddresses[address] |= LOAD_INIT; + if (completed) { + m_seenAddresses[address] |= LOAD_DONE; + m_loadedFiles[address] = file; + } } diff --git a/src/ebusd/bushandler.h b/src/ebusd/bushandler.h index 598756fb..5cbaf398 100644 --- a/src/ebusd/bushandler.h +++ b/src/ebusd/bushandler.h @@ -72,8 +72,11 @@ enum BusState { /** bit for the seen state: scanned. */ #define SCANNED 2 +/** bit for the seen state: configuration loading initiated. */ +#define LOAD_INIT 4 + /** bit for the seen state: configuration loaded. */ -#define LOADED 4 +#define LOAD_DONE 8 class BusHandler; @@ -389,14 +392,15 @@ public: * @param lastAddress the last returned slave address, or 0 for returning the first one. * @return the next slave address that still needs to be scanned, or @a SYN. */ - unsigned char getNextScanAddress(unsigned char lastAddress); + unsigned char getNextScanAddress(unsigned char lastAddress, bool& scanned); /** * Set the state of the participant to configuration @a LOADED. * @param address the slave address. + * @param completed true when loading was completed. * @param file the file from which the configuration was loaded. */ - void setScanConfigLoaded(unsigned char address, string file); + void setScanConfigLoaded(unsigned char address, bool completed, string file); private: diff --git a/src/ebusd/mainloop.cpp b/src/ebusd/mainloop.cpp index 2dd12ea2..91a405bf 100644 --- a/src/ebusd/mainloop.cpp +++ b/src/ebusd/mainloop.cpp @@ -112,25 +112,37 @@ void MainLoop::run() } else if (now > lastTaskRun+taskDelay) { logDebug(lf_main, "performing regular tasks"); if (m_scanConfig) { - lastScanAddress = m_busHandler->getNextScanAddress(lastScanAddress); + bool scanned = false; + lastScanAddress = m_busHandler->getNextScanAddress(lastScanAddress, scanned); if (lastScanAddress==SYN) { taskDelay = 5; lastScanAddress = 0; } else { SymbolString slave(false); - result_t result = m_busHandler->scanAndWait(lastScanAddress, slave); - taskDelay = (result == RESULT_ERR_NO_SIGNAL) ? 10 : 1; - if (result!=RESULT_OK) - logError(lf_main, "scan config %2.2x message: %s", lastScanAddress, getResultCode(result)); - else { - logInfo(lf_main, "scan config %2.2x message received", lastScanAddress); + if (scanned) { + Message* message = m_messages->getScanMessage(lastScanAddress); + slave = message->getLastSlaveData(); + scanned = message->getLastUpdateTime()>0; + } + if (!scanned) { + result_t result = m_busHandler->scanAndWait(lastScanAddress, slave); + taskDelay = (result == RESULT_ERR_NO_SIGNAL) ? 10 : 1; + if (result!=RESULT_OK) + logError(lf_main, "scan config %2.2x message: %s", lastScanAddress, getResultCode(result)); + else { + scanned = true; + logInfo(lf_main, "scan config %2.2x message received", lastScanAddress); + } + } + if (scanned) { + m_busHandler->setScanConfigLoaded(lastScanAddress, false, ""); string file; - result = loadScanConfigFile(m_messages, lastScanAddress, slave, file); + result_t result = loadScanConfigFile(m_messages, lastScanAddress, slave, file); if (result!=RESULT_OK) logError(lf_main, "scan config %2.2x file: %s", lastScanAddress, getResultCode(result)); else { logInfo(lf_main, "scan config %2.2x file loaded", lastScanAddress); - m_busHandler->setScanConfigLoaded(lastScanAddress, file); + m_busHandler->setScanConfigLoaded(lastScanAddress, true, file); } } }