avoid endless scanning of slaves that do not answer

This commit is contained in:
john30
2015-11-15 10:39:31 +01:00
parent ff7cf810e1
commit 2877559f7f
2 changed files with 30 additions and 16 deletions
+19 -9
View File
@@ -108,10 +108,11 @@ bool ScanRequest::notify(result_t result, SymbolString& slave)
logInfo(lf_bus, "scan %2.2x timed out", dstAddress); logInfo(lf_bus, "scan %2.2x timed out", dstAddress);
else else
logError(lf_bus, "scan %2.2x failed: %s", dstAddress, getResultCode(result)); logError(lf_bus, "scan %2.2x failed: %s", dstAddress, getResultCode(result));
m_busHandler->addScanResult(dstAddress, "", result);
return false; return false;
} }
m_busHandler->addScanResult(dstAddress, scanResult.str()); m_busHandler->addScanResult(dstAddress, scanResult.str(), result);
// check for remaining secondary messages // check for remaining secondary messages
if (m_messages.empty()) { if (m_messages.empty()) {
@@ -828,10 +829,15 @@ result_t BusHandler::startScan(bool full)
return RESULT_OK; 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; if (result==RESULT_ERR_NO_SIGNAL)
logNotice(lf_bus, "scan %2.2x: %s", dstAddress, result.c_str()); 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()) if (m_scanResults.find(dstAddress) == m_scanResults.end())
m_scanResults[dstAddress] = result; m_scanResults[dstAddress] = result;
else else
@@ -854,7 +860,7 @@ void BusHandler::formatScanResult(ostringstream& output)
if (first) { if (first) {
// fallback to autoscan results // fallback to autoscan results
for (unsigned char slave = 1; slave != 0; slave++) { // 0 is known to be a master 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); Message* message = m_messages->getScanMessage(slave);
if (message!=NULL && message->getLastUpdateTime()>0) { if (message!=NULL && message->getLastUpdateTime()>0) {
if (first) if (first)
@@ -884,7 +890,7 @@ void BusHandler::formatSeenInfo(ostringstream& output)
} }
if ((m_seenAddresses[slave]&SEEN)!=0) if ((m_seenAddresses[slave]&SEEN)!=0)
output << ", seen"; output << ", seen";
if ((m_seenAddresses[slave]&SCANNED)!=0) { if ((m_seenAddresses[slave]&SCAN_DONE)!=0) {
output << ", scanned"; output << ", scanned";
Message* message = m_messages->getScanMessage(slave); Message* message = m_messages->getScanMessage(slave);
if (message!=NULL && message->getLastUpdateTime()>0) { 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)) if (!isValidAddress(dstAddress, false) || isMaster(dstAddress))
return RESULT_ERR_INVALID_ADDR; return RESULT_ERR_INVALID_ADDR;
m_seenAddresses[dstAddress] |= SCAN_INIT;
Message* scanMessage = m_messages->getScanMessage(); Message* scanMessage = m_messages->getScanMessage();
if (scanMessage==NULL) { if (scanMessage==NULL) {
return RESULT_ERR_NOTFOUND; return RESULT_ERR_NOTFOUND;
@@ -921,9 +928,10 @@ result_t BusHandler::scanAndWait(unsigned char dstAddress, SymbolString& slave)
if (message!=NULL) if (message!=NULL)
scanMessage = message; scanMessage = message;
} }
if (result!=RESULT_ERR_NO_SIGNAL)
m_seenAddresses[dstAddress] |= SCAN_DONE;
} }
if (result==RESULT_OK) { if (result==RESULT_OK) {
m_seenAddresses[dstAddress] |= SCANNED;
ostringstream output; ostringstream output;
scanMessage->decode(master, slave, output); // just to update the cached data 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)) if (!isValidAddress(lastAddress, false) || isMaster(lastAddress))
continue; continue;
if ((m_seenAddresses[lastAddress]&(SEEN|LOAD_INIT))==SEEN) { if ((m_seenAddresses[lastAddress]&(SEEN|LOAD_INIT))==SEEN) {
scanned = m_seenAddresses[lastAddress]&SCANNED; scanned = (m_seenAddresses[lastAddress]&SCAN_INIT)!=0;
return lastAddress; return lastAddress;
} }
unsigned char master = getMasterAddress(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 lastAddress;
}
} }
return SYN; return SYN;
} }
+11 -7
View File
@@ -67,16 +67,19 @@ enum BusState {
}; };
/** bit for the seen state: seen. */ /** bit for the seen state: seen. */
#define SEEN 1 #define SEEN 0x01
/** bit for the seen state: scanned. */ /** bit for the seen state: scan initiated. */
#define SCANNED 2 #define SCAN_INIT 0x02
/** bit for the seen state: scan finished. */
#define SCAN_DONE 0x04
/** bit for the seen state: configuration loading initiated. */ /** bit for the seen state: configuration loading initiated. */
#define LOAD_INIT 4 #define LOAD_INIT 0x08
/** bit for the seen state: configuration loaded. */ /** bit for the seen state: configuration loaded. */
#define LOAD_DONE 8 #define LOAD_DONE 0x10
class BusHandler; class BusHandler;
@@ -331,9 +334,10 @@ public:
/** /**
* Add a scan result @a string for a scanned slave address. * Add a scan result @a string for a scanned slave address.
* @param dstAddress the 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. * Format the scan result to the @a ostringstream.