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--) {
|
for (int sendRetries=m_failedSendRetries+1, lostRetries=m_busLostRetries+1; sendRetries>=0; sendRetries--) {
|
||||||
m_requests.add(request);
|
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)
|
if (success == false)
|
||||||
m_requests.remove(request);
|
m_requests.remove(request);
|
||||||
result = success == true ? request->m_result : RESULT_ERR_TIMEOUT;
|
result = success == true ? request->m_result : RESULT_ERR_TIMEOUT;
|
||||||
@@ -326,7 +326,7 @@ result_t BusHandler::handleSymbol()
|
|||||||
m_nextSendPos = 0;
|
m_nextSendPos = 0;
|
||||||
m_command.clear();
|
m_command.clear();
|
||||||
if (m_request != NULL)
|
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);
|
return setState(bs_recvCmd, RESULT_ERR_NAK);
|
||||||
}
|
}
|
||||||
@@ -383,7 +383,7 @@ result_t BusHandler::handleSymbol()
|
|||||||
if (m_repeat == false) {
|
if (m_repeat == false) {
|
||||||
m_repeat = true;
|
m_repeat = true;
|
||||||
m_response.clear();
|
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);
|
return setState(bs_skip, RESULT_ERR_NAK);
|
||||||
}
|
}
|
||||||
@@ -430,15 +430,11 @@ result_t BusHandler::handleSymbol()
|
|||||||
return RESULT_OK;
|
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 (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));
|
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->m_slave = m_response; // TODO nicer
|
||||||
m_request->notify(result);
|
m_request->notify(result);
|
||||||
m_request = NULL;
|
m_request = NULL;
|
||||||
|
|||||||
@@ -95,6 +95,7 @@ public:
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Wait for notification.
|
* @brief Wait for notification.
|
||||||
|
* @param timeout the maximum time to wait in seconds.
|
||||||
* @return the result code.
|
* @return the result code.
|
||||||
*/
|
*/
|
||||||
bool wait(int timeout);
|
bool wait(int timeout);
|
||||||
@@ -189,9 +190,10 @@ private:
|
|||||||
* @brief Set a new @a BusState and add a log message if necessary.
|
* @brief Set a new @a BusState and add a log message if necessary.
|
||||||
* @param state the new @a BusState.
|
* @param state the new @a BusState.
|
||||||
* @param result the result code.
|
* @param result the result code.
|
||||||
|
* @param firstRepetition true if the first repetition of a message part is being started.
|
||||||
* @return the result code.
|
* @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.
|
* @brief Called when a passive reception was successfully completed.
|
||||||
|
|||||||
Reference in New Issue
Block a user