avoid endless scanning of slaves that do not answer
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
+11
-7
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user