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];
|
unsigned char dstAddress = m_master[1];
|
||||||
ostringstream scanResult;
|
ostringstream scanResult;
|
||||||
if (result == RESULT_OK) {
|
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_OK) {
|
||||||
if (result == RESULT_ERR_TIMEOUT)
|
if (result == RESULT_ERR_TIMEOUT)
|
||||||
@@ -140,6 +140,7 @@ void BusHandler::clear()
|
|||||||
{
|
{
|
||||||
m_loadedFiles.clear();
|
m_loadedFiles.clear();
|
||||||
memset(m_seenAddresses, 0, sizeof(m_seenAddresses));
|
memset(m_seenAddresses, 0, sizeof(m_seenAddresses));
|
||||||
|
m_masterCount = 1;
|
||||||
m_scanResults.clear();
|
m_scanResults.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -789,19 +790,14 @@ void BusHandler::receiveCompleted()
|
|||||||
|
|
||||||
result_t BusHandler::startScan(bool full)
|
result_t BusHandler::startScan(bool full)
|
||||||
{
|
{
|
||||||
Message* scanMessage = m_messages->getScanMessage();
|
|
||||||
deque<Message*> messages = m_messages->findAll("scan", "");
|
deque<Message*> messages = m_messages->findAll("scan", "");
|
||||||
for (deque<Message*>::iterator it = messages.begin(); it < messages.end();) {
|
for (deque<Message*>::iterator it = messages.begin(); it < messages.end();) {
|
||||||
Message* message = *it++;
|
Message* message = *it++;
|
||||||
if (message->getId()[0] == 0x07 && message->getId()[1] == 0x04) {
|
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
|
messages.erase(it - 1); // query pb 0x07 / sb 0x04 only once
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (scanMessage == NULL)
|
|
||||||
return RESULT_ERR_NOTFOUND;
|
|
||||||
|
|
||||||
m_scanResults.clear();
|
m_scanResults.clear();
|
||||||
|
|
||||||
@@ -814,6 +810,9 @@ result_t BusHandler::startScan(bool full)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Message* scanMessage = m_messages->getScanMessage(slave);
|
||||||
|
if (scanMessage==NULL)
|
||||||
|
continue;
|
||||||
ScanRequest* request = new ScanRequest(scanMessage, messages, this);
|
ScanRequest* request = new ScanRequest(scanMessage, messages, this);
|
||||||
result_t result = request->prepare(m_ownMasterAddress, slave);
|
result_t result = request->prepare(m_ownMasterAddress, slave);
|
||||||
if (result != RESULT_OK) {
|
if (result != RESULT_OK) {
|
||||||
@@ -828,7 +827,7 @@ result_t BusHandler::startScan(bool full)
|
|||||||
void BusHandler::addScanResult(unsigned char dstAddress, string result)
|
void BusHandler::addScanResult(unsigned char dstAddress, string result)
|
||||||
{
|
{
|
||||||
m_seenAddresses[dstAddress] |= SCANNED;
|
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())
|
if (m_scanResults.find(dstAddress) == m_scanResults.end())
|
||||||
m_scanResults[dstAddress] = result;
|
m_scanResults[dstAddress] = result;
|
||||||
else
|
else
|
||||||
@@ -845,8 +844,7 @@ void BusHandler::formatScanResult(ostringstream& output)
|
|||||||
first = false;
|
first = false;
|
||||||
else
|
else
|
||||||
output << endl;
|
output << endl;
|
||||||
output << hex << setw(2) << setfill('0') << static_cast<unsigned>(slave) << UI_FIELD_SEPARATOR;
|
output << hex << setw(2) << setfill('0') << static_cast<unsigned>(slave) << it->second;
|
||||||
output << it->second;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -869,7 +867,7 @@ void BusHandler::formatSeenInfo(ostringstream& output)
|
|||||||
if ((m_seenAddresses[address]&SCANNED)!=0) {
|
if ((m_seenAddresses[address]&SCANNED)!=0) {
|
||||||
output << ", scanned";
|
output << ", scanned";
|
||||||
Message* message = m_messages->getScanMessage(address);
|
Message* message = m_messages->getScanMessage(address);
|
||||||
if (message!=NULL) {
|
if (message!=NULL && message->getLastUpdateTime()>0) {
|
||||||
// add detailed scan info: Manufacturer ID SW HW
|
// add detailed scan info: Manufacturer ID SW HW
|
||||||
output << " \"";
|
output << " \"";
|
||||||
result_t result = message->decodeLastData(output, OF_VERBOSE);
|
result_t result = message->decodeLastData(output, OF_VERBOSE);
|
||||||
@@ -879,7 +877,7 @@ void BusHandler::formatSeenInfo(ostringstream& output)
|
|||||||
output << "\"";
|
output << "\"";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ((m_seenAddresses[address]&LOADED)!=0)
|
if ((m_seenAddresses[address]&LOAD_DONE)!=0)
|
||||||
output << ", loaded \"" << m_loadedFiles[address] << "\"";
|
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)
|
if (lastAddress==SYN)
|
||||||
return SYN;
|
return SYN;
|
||||||
while (++lastAddress!=0) { // 0 is known to be a master
|
while (++lastAddress!=0) { // 0 is known to be a master
|
||||||
if (!isValidAddress(lastAddress, false) || isMaster(lastAddress))
|
if (!isValidAddress(lastAddress, false) || isMaster(lastAddress))
|
||||||
continue;
|
continue;
|
||||||
if ((m_seenAddresses[lastAddress]&(SEEN|SCANNED))==SEEN)
|
if ((m_seenAddresses[lastAddress]&(SEEN|LOAD_INIT))==SEEN) {
|
||||||
|
scanned = m_seenAddresses[lastAddress]&SCANNED;
|
||||||
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]&SCANNED)==0)
|
if (master!=SYN && (m_seenAddresses[master]&SEEN)!=0 && (m_seenAddresses[lastAddress]&LOAD_INIT)==0)
|
||||||
return lastAddress;
|
return lastAddress;
|
||||||
}
|
}
|
||||||
return SYN;
|
return SYN;
|
||||||
}
|
}
|
||||||
|
|
||||||
void BusHandler::setScanConfigLoaded(unsigned char address, string file) {
|
void BusHandler::setScanConfigLoaded(unsigned char address, bool completed, string file) {
|
||||||
m_seenAddresses[address] |= LOADED;
|
m_seenAddresses[address] |= LOAD_INIT;
|
||||||
m_loadedFiles[address] = file;
|
if (completed) {
|
||||||
|
m_seenAddresses[address] |= LOAD_DONE;
|
||||||
|
m_loadedFiles[address] = file;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -72,8 +72,11 @@ enum BusState {
|
|||||||
/** bit for the seen state: scanned. */
|
/** bit for the seen state: scanned. */
|
||||||
#define SCANNED 2
|
#define SCANNED 2
|
||||||
|
|
||||||
|
/** bit for the seen state: configuration loading initiated. */
|
||||||
|
#define LOAD_INIT 4
|
||||||
|
|
||||||
/** bit for the seen state: configuration loaded. */
|
/** bit for the seen state: configuration loaded. */
|
||||||
#define LOADED 4
|
#define LOAD_DONE 8
|
||||||
|
|
||||||
class BusHandler;
|
class BusHandler;
|
||||||
|
|
||||||
@@ -389,14 +392,15 @@ public:
|
|||||||
* @param lastAddress the last returned slave address, or 0 for returning the first one.
|
* @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.
|
* @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.
|
* Set the state of the participant to configuration @a LOADED.
|
||||||
* @param address the slave address.
|
* @param address the slave address.
|
||||||
|
* @param completed true when loading was completed.
|
||||||
* @param file the file from which the configuration was loaded.
|
* @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:
|
private:
|
||||||
|
|
||||||
|
|||||||
+21
-9
@@ -112,25 +112,37 @@ void MainLoop::run()
|
|||||||
} else if (now > lastTaskRun+taskDelay) {
|
} else if (now > lastTaskRun+taskDelay) {
|
||||||
logDebug(lf_main, "performing regular tasks");
|
logDebug(lf_main, "performing regular tasks");
|
||||||
if (m_scanConfig) {
|
if (m_scanConfig) {
|
||||||
lastScanAddress = m_busHandler->getNextScanAddress(lastScanAddress);
|
bool scanned = false;
|
||||||
|
lastScanAddress = m_busHandler->getNextScanAddress(lastScanAddress, scanned);
|
||||||
if (lastScanAddress==SYN) {
|
if (lastScanAddress==SYN) {
|
||||||
taskDelay = 5;
|
taskDelay = 5;
|
||||||
lastScanAddress = 0;
|
lastScanAddress = 0;
|
||||||
} else {
|
} else {
|
||||||
SymbolString slave(false);
|
SymbolString slave(false);
|
||||||
result_t result = m_busHandler->scanAndWait(lastScanAddress, slave);
|
if (scanned) {
|
||||||
taskDelay = (result == RESULT_ERR_NO_SIGNAL) ? 10 : 1;
|
Message* message = m_messages->getScanMessage(lastScanAddress);
|
||||||
if (result!=RESULT_OK)
|
slave = message->getLastSlaveData();
|
||||||
logError(lf_main, "scan config %2.2x message: %s", lastScanAddress, getResultCode(result));
|
scanned = message->getLastUpdateTime()>0;
|
||||||
else {
|
}
|
||||||
logInfo(lf_main, "scan config %2.2x message received", lastScanAddress);
|
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;
|
string file;
|
||||||
result = loadScanConfigFile(m_messages, lastScanAddress, slave, file);
|
result_t result = loadScanConfigFile(m_messages, lastScanAddress, slave, file);
|
||||||
if (result!=RESULT_OK)
|
if (result!=RESULT_OK)
|
||||||
logError(lf_main, "scan config %2.2x file: %s", lastScanAddress, getResultCode(result));
|
logError(lf_main, "scan config %2.2x file: %s", lastScanAddress, getResultCode(result));
|
||||||
else {
|
else {
|
||||||
logInfo(lf_main, "scan config %2.2x file loaded", lastScanAddress);
|
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