use individual scan message, also reset masterCount in clear(), fix for logging and info result, split load state into load init and done
This commit is contained in:
+20
-17
@@ -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<Message*> messages = m_messages->findAll("scan", "");
|
||||
for (deque<Message*>::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<unsigned>(slave) << UI_FIELD_SEPARATOR;
|
||||
output << it->second;
|
||||
output << hex << setw(2) << setfill('0') << static_cast<unsigned>(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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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:
|
||||
|
||||
|
||||
+21
-9
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user