diff --git a/src/ebusd/bushandler.cpp b/src/ebusd/bushandler.cpp index 0d89b014..04eed0b4 100644 --- a/src/ebusd/bushandler.cpp +++ b/src/ebusd/bushandler.cpp @@ -144,6 +144,7 @@ bool ScanRequest::notify(result_t result, SymbolString& slave) if (m_slaves.empty()) { logNotice(lf_bus, "scan finished"); + m_busHandler->setScanFinished(); return false; } if (m_messages.empty()) { @@ -155,6 +156,7 @@ bool ScanRequest::notify(result_t result, SymbolString& slave) m_message = m_messages.front(); m_messages.pop_front(); if (prepare(m_master[0]) < RESULT_OK) { + m_busHandler->setScanFinished(); return false; // give up } return true; @@ -690,12 +692,11 @@ result_t BusHandler::setState(BusState state, result_t result, bool firstRepetit if (restart) { m_currentRequest->m_busLostRetries = 0; m_nextRequests.push(m_currentRequest); - } - else if (m_currentRequest->m_deleteOnFinish) + } else if (m_currentRequest->m_deleteOnFinish) { delete m_currentRequest; - else + } else { m_finishedRequests.push(m_currentRequest); - + } m_currentRequest = NULL; } } @@ -860,6 +861,7 @@ result_t BusHandler::startScan(bool full) delete request; return result==RESULT_ERR_EOF ? RESULT_EMPTY : result; } + m_runningScans++; m_nextRequests.push(request); return RESULT_OK; } @@ -874,8 +876,17 @@ void BusHandler::setScanResult(unsigned char dstAddress, string str) } } +void BusHandler::setScanFinished() +{ + if (m_runningScans>0) + m_runningScans--; +} + void BusHandler::formatScanResult(ostringstream& output) { + if (m_runningScans>0) { + output << static_cast(m_runningScans) << " scan(s) still running" << endl; + } bool first = true; for (unsigned char slave = 1; slave != 0; slave++) { // 0 is known to be a master map::iterator it = m_scanResults.find(slave); diff --git a/src/ebusd/bushandler.h b/src/ebusd/bushandler.h index f378296e..f6e7f40f 100644 --- a/src/ebusd/bushandler.h +++ b/src/ebusd/bushandler.h @@ -322,7 +322,7 @@ public: m_masterCount(1), m_autoLockCount(lockCount==0), m_lockCount(lockCount<=3 ? 3 : lockCount), m_remainLockCount(m_autoLockCount), m_generateSynInterval(generateSyn ? SYN_TIMEOUT*getMasterNumber(ownAddress)+SYMBOL_DURATION : 0), m_pollInterval(pollInterval), m_lastReceive(0), m_lastPoll(0), - m_currentRequest(NULL), m_nextSendPos(0), + m_currentRequest(NULL), m_runningScans(0), m_nextSendPos(0), m_symPerSec(0), m_maxSymPerSec(0), m_state(bs_noSignal), m_repeat(false), m_command(false), m_commandCrcValid(false), m_response(false), m_responseCrcValid(false), @@ -369,6 +369,11 @@ public: */ void setScanResult(unsigned char dstAddress, string str); + /** + * Called from @a ScanRequest upon completion. + */ + void setScanFinished(); + /** * Format the scan result to the @a ostringstream. * @param output the @a ostringstream to format the scan result to. @@ -530,6 +535,9 @@ private: /** the queue of @a BusRequests that are already finished. */ Queue m_finishedRequests; + /** the number of scan request currently running. */ + unsigned int m_runningScans; + /** the offset of the next symbol that needs to be sent from the command or response, * (only relevant if m_request is set and state is @a bs_command or @a bs_response). */ unsigned char m_nextSendPos;