avoid cancelling request if part of the message is repeated
This commit is contained in:
@@ -112,7 +112,7 @@ result_t BusHandler::sendAndWait(SymbolString& master, SymbolString& slave)
|
||||
|
||||
for (int sendRetries=m_failedSendRetries+1, lostRetries=m_busLostRetries+1; sendRetries>=0; sendRetries--) {
|
||||
m_requests.add(request);
|
||||
bool success = request->wait(5);
|
||||
bool success = request->wait(1); // 1 second is still 3 times the theoretical worst-case request duration
|
||||
if (success == false)
|
||||
m_requests.remove(request);
|
||||
result = success == true ? request->m_result : RESULT_ERR_TIMEOUT;
|
||||
@@ -326,7 +326,7 @@ result_t BusHandler::handleSymbol()
|
||||
m_nextSendPos = 0;
|
||||
m_command.clear();
|
||||
if (m_request != NULL)
|
||||
return setState(bs_sendCmd, RESULT_ERR_NAK);
|
||||
return setState(bs_sendCmd, RESULT_ERR_NAK, true);
|
||||
|
||||
return setState(bs_recvCmd, RESULT_ERR_NAK);
|
||||
}
|
||||
@@ -383,7 +383,7 @@ result_t BusHandler::handleSymbol()
|
||||
if (m_repeat == false) {
|
||||
m_repeat = true;
|
||||
m_response.clear();
|
||||
return setState(bs_recvRes, RESULT_ERR_NAK);
|
||||
return setState(bs_recvRes, RESULT_ERR_NAK, true);
|
||||
}
|
||||
return setState(bs_skip, RESULT_ERR_NAK);
|
||||
}
|
||||
@@ -430,15 +430,11 @@ result_t BusHandler::handleSymbol()
|
||||
return RESULT_OK;
|
||||
}
|
||||
|
||||
result_t BusHandler::setState(BusState state, result_t result)
|
||||
result_t BusHandler::setState(BusState state, result_t result, bool firstRepetition)
|
||||
{
|
||||
if (m_request != NULL) {
|
||||
if (result != RESULT_OK) {
|
||||
if (state == bs_sendSyn || (result != RESULT_OK && firstRepetition == false)) {
|
||||
L.log(bus, debug, "notify request: %s", getResultCode(result));
|
||||
m_request->notify(result);
|
||||
m_request = NULL;
|
||||
} else if (state == bs_sendSyn) {
|
||||
L.log(bus, debug, "notify request (syn): %s", getResultCode(result));
|
||||
m_request->m_slave = m_response; // TODO nicer
|
||||
m_request->notify(result);
|
||||
m_request = NULL;
|
||||
|
||||
@@ -95,6 +95,7 @@ public:
|
||||
|
||||
/**
|
||||
* @brief Wait for notification.
|
||||
* @param timeout the maximum time to wait in seconds.
|
||||
* @return the result code.
|
||||
*/
|
||||
bool wait(int timeout);
|
||||
@@ -189,9 +190,10 @@ private:
|
||||
* @brief Set a new @a BusState and add a log message if necessary.
|
||||
* @param state the new @a BusState.
|
||||
* @param result the result code.
|
||||
* @param firstRepetition true if the first repetition of a message part is being started.
|
||||
* @return the result code.
|
||||
*/
|
||||
result_t setState(BusState state, result_t result);
|
||||
result_t setState(BusState state, result_t result, bool firstRepetition=false);
|
||||
|
||||
/**
|
||||
* @brief Called when a passive reception was successfully completed.
|
||||
|
||||
Reference in New Issue
Block a user