From 0325625a56f98a30cf795efa4acdd3d63ba75a50 Mon Sep 17 00:00:00 2001 From: john30 Date: Sat, 6 Dec 2014 22:01:12 +0100 Subject: [PATCH] avoid cancelling request if part of the message is repeated --- src/ebusd/bushandler.cpp | 14 +++++--------- src/ebusd/bushandler.h | 4 +++- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/src/ebusd/bushandler.cpp b/src/ebusd/bushandler.cpp index f66e562f..16216d7b 100644 --- a/src/ebusd/bushandler.cpp +++ b/src/ebusd/bushandler.cpp @@ -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; diff --git a/src/ebusd/bushandler.h b/src/ebusd/bushandler.h index d77eba91..1fd75a92 100644 --- a/src/ebusd/bushandler.h +++ b/src/ebusd/bushandler.h @@ -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.