diff --git a/src/ebusd/bushandler.cpp b/src/ebusd/bushandler.cpp index 5dd6b1bb..382a31de 100644 --- a/src/ebusd/bushandler.cpp +++ b/src/ebusd/bushandler.cpp @@ -108,10 +108,11 @@ bool ScanRequest::notify(result_t result, SymbolString& slave) logInfo(lf_bus, "scan %2.2x timed out", dstAddress); else logError(lf_bus, "scan %2.2x failed: %s", dstAddress, getResultCode(result)); + m_busHandler->addScanResult(dstAddress, "", result); return false; } - m_busHandler->addScanResult(dstAddress, scanResult.str()); + m_busHandler->addScanResult(dstAddress, scanResult.str(), result); // check for remaining secondary messages if (m_messages.empty()) { @@ -828,10 +829,15 @@ result_t BusHandler::startScan(bool full) return RESULT_OK; } -void BusHandler::addScanResult(unsigned char dstAddress, string result) +void BusHandler::addScanResult(unsigned char dstAddress, string str, result_t result) { - m_seenAddresses[dstAddress] |= SCANNED; - logNotice(lf_bus, "scan %2.2x: %s", dstAddress, result.c_str()); + if (result==RESULT_ERR_NO_SIGNAL) + return; + m_seenAddresses[dstAddress] |= SCAN_INIT; + if (result!=RESULT_OK) + return; + m_seenAddresses[dstAddress] |= SCAN_DONE; + logNotice(lf_bus, "scan %2.2x: %s", dstAddress, str.c_str()); if (m_scanResults.find(dstAddress) == m_scanResults.end()) m_scanResults[dstAddress] = result; else @@ -854,7 +860,7 @@ void BusHandler::formatScanResult(ostringstream& output) if (first) { // fallback to autoscan results for (unsigned char slave = 1; slave != 0; slave++) { // 0 is known to be a master - if (isValidAddress(slave, false) && !isMaster(slave) && (m_seenAddresses[slave]&SCANNED)!=0) { + if (isValidAddress(slave, false) && !isMaster(slave) && (m_seenAddresses[slave]&SCAN_DONE)!=0) { Message* message = m_messages->getScanMessage(slave); if (message!=NULL && message->getLastUpdateTime()>0) { if (first) @@ -884,7 +890,7 @@ void BusHandler::formatSeenInfo(ostringstream& output) } if ((m_seenAddresses[slave]&SEEN)!=0) output << ", seen"; - if ((m_seenAddresses[slave]&SCANNED)!=0) { + if ((m_seenAddresses[slave]&SCAN_DONE)!=0) { output << ", scanned"; Message* message = m_messages->getScanMessage(slave); if (message!=NULL && message->getLastUpdateTime()>0) { @@ -907,6 +913,7 @@ result_t BusHandler::scanAndWait(unsigned char dstAddress, SymbolString& slave) { if (!isValidAddress(dstAddress, false) || isMaster(dstAddress)) return RESULT_ERR_INVALID_ADDR; + m_seenAddresses[dstAddress] |= SCAN_INIT; Message* scanMessage = m_messages->getScanMessage(); if (scanMessage==NULL) { return RESULT_ERR_NOTFOUND; @@ -921,9 +928,10 @@ result_t BusHandler::scanAndWait(unsigned char dstAddress, SymbolString& slave) if (message!=NULL) scanMessage = message; } + if (result!=RESULT_ERR_NO_SIGNAL) + m_seenAddresses[dstAddress] |= SCAN_DONE; } if (result==RESULT_OK) { - m_seenAddresses[dstAddress] |= SCANNED; ostringstream output; scanMessage->decode(master, slave, output); // just to update the cached data } @@ -959,12 +967,14 @@ unsigned char BusHandler::getNextScanAddress(unsigned char lastAddress, bool& sc if (!isValidAddress(lastAddress, false) || isMaster(lastAddress)) continue; if ((m_seenAddresses[lastAddress]&(SEEN|LOAD_INIT))==SEEN) { - scanned = m_seenAddresses[lastAddress]&SCANNED; + scanned = (m_seenAddresses[lastAddress]&SCAN_INIT)!=0; return lastAddress; } unsigned char master = getMasterAddress(lastAddress); - if (master!=SYN && (m_seenAddresses[master]&SEEN)!=0 && (m_seenAddresses[lastAddress]&LOAD_INIT)==0) + if (master!=SYN && (m_seenAddresses[master]&SEEN)!=0 && (m_seenAddresses[lastAddress]&LOAD_INIT)==0) { + scanned = (m_seenAddresses[lastAddress]&SCAN_INIT)!=0; return lastAddress; + } } return SYN; } diff --git a/src/ebusd/bushandler.h b/src/ebusd/bushandler.h index 27e3c54b..43a554ed 100644 --- a/src/ebusd/bushandler.h +++ b/src/ebusd/bushandler.h @@ -67,16 +67,19 @@ enum BusState { }; /** bit for the seen state: seen. */ -#define SEEN 1 +#define SEEN 0x01 -/** bit for the seen state: scanned. */ -#define SCANNED 2 +/** bit for the seen state: scan initiated. */ +#define SCAN_INIT 0x02 + +/** bit for the seen state: scan finished. */ +#define SCAN_DONE 0x04 /** bit for the seen state: configuration loading initiated. */ -#define LOAD_INIT 4 +#define LOAD_INIT 0x08 /** bit for the seen state: configuration loaded. */ -#define LOAD_DONE 8 +#define LOAD_DONE 0x10 class BusHandler; @@ -331,9 +334,10 @@ public: /** * Add a scan result @a string for a scanned slave address. * @param dstAddress the scanned slave address. - * @param result the scan result @a string to add. + * @param str the scan result @a string to add. + * @param result the scan result code. */ - void addScanResult(unsigned char dstAddress, string result); + void addScanResult(unsigned char dstAddress, string str, result_t result); /** * Format the scan result to the @a ostringstream.