only allocate dedicated scan messages for answered scan requests

This commit is contained in:
john30
2015-11-08 12:50:06 +01:00
parent 2d721a3e84
commit 181ba4d3c1
2 changed files with 26 additions and 11 deletions
+21 -9
View File
@@ -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;
} }
+5 -2
View File
@@ -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;