only allocate dedicated scan messages for answered scan requests
This commit is contained in:
@@ -96,6 +96,11 @@ 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) {
|
||||||
|
if (m_message==m_messageMap->getScanMessage()) {
|
||||||
|
Message* message = m_messageMap->getScanMessage(dstAddress);
|
||||||
|
if (message!=NULL)
|
||||||
|
m_message = message;
|
||||||
|
}
|
||||||
result = m_message->decode(pt_slaveData, slave, scanResult, 0, true); // decode data
|
result = m_message->decode(pt_slaveData, slave, scanResult, 0, true); // decode data
|
||||||
}
|
}
|
||||||
if (result < RESULT_OK) {
|
if (result < RESULT_OK) {
|
||||||
@@ -799,6 +804,10 @@ result_t BusHandler::startScan(bool full)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Message* scanMessage = m_messages->getScanMessage();
|
||||||
|
if (scanMessage==NULL)
|
||||||
|
return RESULT_ERR_NOTFOUND;
|
||||||
|
|
||||||
m_scanResults.clear();
|
m_scanResults.clear();
|
||||||
|
|
||||||
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
|
||||||
@@ -810,10 +819,7 @@ result_t BusHandler::startScan(bool full)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
Message* scanMessage = m_messages->getScanMessage(slave);
|
ScanRequest* request = new ScanRequest(m_messages, scanMessage, messages, this);
|
||||||
if (scanMessage==NULL)
|
|
||||||
continue;
|
|
||||||
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) {
|
||||||
delete request;
|
delete request;
|
||||||
@@ -887,19 +893,25 @@ 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;
|
||||||
Message* message = m_messages->getScanMessage(dstAddress);
|
Message* scanMessage = m_messages->getScanMessage();
|
||||||
if (message==NULL) {
|
if (scanMessage==NULL) {
|
||||||
return RESULT_ERR_NOTFOUND;
|
return RESULT_ERR_NOTFOUND;
|
||||||
}
|
}
|
||||||
istringstream input;
|
istringstream input;
|
||||||
SymbolString master;
|
SymbolString master;
|
||||||
result_t result = message->prepareMaster(m_ownMasterAddress, master, input, UI_FIELD_SEPARATOR, dstAddress);
|
result_t result = scanMessage->prepareMaster(m_ownMasterAddress, master, input, UI_FIELD_SEPARATOR, dstAddress);
|
||||||
if (result==RESULT_OK)
|
if (result==RESULT_OK) {
|
||||||
result = sendAndWait(master, slave);
|
result = sendAndWait(master, slave);
|
||||||
|
if (result==RESULT_OK) {
|
||||||
|
Message* message = m_messages->getScanMessage(dstAddress);
|
||||||
|
if (message!=NULL)
|
||||||
|
scanMessage = message;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (result==RESULT_OK) {
|
if (result==RESULT_OK) {
|
||||||
m_seenAddresses[dstAddress] |= SCANNED;
|
m_seenAddresses[dstAddress] |= SCANNED;
|
||||||
ostringstream output;
|
ostringstream output;
|
||||||
message->decode(master, slave, output); // just to update the cached data
|
scanMessage->decode(master, slave, output); // just to update the cached data
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -179,8 +179,8 @@ public:
|
|||||||
* @param messages the optional secondary query @a Message instances (to be queried only when the primary was successful).
|
* @param messages the optional secondary query @a Message instances (to be queried only when the primary was successful).
|
||||||
* @param busHandler the @a BusHandler instance to notify of final scan result.
|
* @param busHandler the @a BusHandler instance to notify of final scan result.
|
||||||
*/
|
*/
|
||||||
ScanRequest(Message* message, deque<Message*> messages, BusHandler* busHandler)
|
ScanRequest(MessageMap* messageMap, Message* message, deque<Message*> messages, BusHandler* busHandler)
|
||||||
: BusRequest(m_master, true), m_message(message), m_messages(messages), m_busHandler(busHandler) {}
|
: BusRequest(m_master, true), m_messageMap(messageMap), m_message(message), m_messages(messages), m_busHandler(busHandler) {}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Destructor.
|
* Destructor.
|
||||||
@@ -200,6 +200,9 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
/** the @a MessageMap instance. */
|
||||||
|
MessageMap* m_messageMap;
|
||||||
|
|
||||||
/** the escaped master data @a SymbolString. */
|
/** the escaped master data @a SymbolString. */
|
||||||
SymbolString m_master;
|
SymbolString m_master;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user