Index: sources/canbus/MessageDispatcher.cpp =================================================================== diff -u -rf734248435a849bf26d13f6e78d0ad4c1002d019 -r61f16c988a159401c92730b4cbfca5085c77222f --- sources/canbus/MessageDispatcher.cpp (.../MessageDispatcher.cpp) (revision f734248435a849bf26d13f6e78d0ad4c1002d019) +++ sources/canbus/MessageDispatcher.cpp (.../MessageDispatcher.cpp) (revision 61f16c988a159401c92730b4cbfca5085c77222f) @@ -45,7 +45,7 @@ if ( _init ) return false; _init = true; - // runs in DriveWatcher thread + // runs in the thread initConnections(); LOG_DEBUG("UI," + tr("%1 Initialized").arg(metaObject()->className())); @@ -789,6 +789,49 @@ return true; } +bool MessageDispatcher::checkAcknowReceived(const Message &vMessage, const char *src) +{ + GuiActionType mActionId = vMessage.actionId; + Sequence mSequence = vMessage.sequence; + bool ok = false; + if ( mActionId == GuiActionType::ID_Acknow ) { + ok = true; + #ifndef DISABLE_ACKNOW_CHECKIN_MESSAGE_LOG + LOG_EVENT(tr("%1,Ack Bak, Sq:%2").arg(src).arg(mSequence)); + #endif + #ifdef DEBUG_ACKBACK_HD_TO_UI + qDebug() << tr(" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ HD AckBak : %1 %2 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ ").arg(mSequence).arg(vMessage.actionId); + #endif + emit didAcknowReceive(mSequence); + } + return ok; +} + +bool MessageDispatcher::checkAcknowTransmit(const Message &vMessage, const char *src) +{ + bool ok = false; + GuiActionType mActionId = vMessage.actionId; + Sequence mSequence = vMessage.sequence; + if (mSequence < 0) { + ok = true; + #ifndef DISABLE_ACKNOW_CHECKIN_MESSAGE_LOG + LOG_EVENT(tr("%1,Ack Req, Sq:%2, ID:%3").arg(src).arg(mSequence).arg(Format::toHexString(mActionId))); + #endif + #ifdef DEBUG_ACKBACK_HD_TO_UI + qDebug() << tr(" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ HD AckReq : %1 %2 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ ").arg(mSequence).arg(vMessage.actionId); + #endif + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UI AckBak is immediately handled at the same place. + actionTransmit(GuiActionType::ID_Acknow, {}, -mSequence); + #ifndef DISABLE_ACKNOW_CHECKIN_MESSAGE_LOG + LOG_EVENT(tr("UI,Ack Bak, Sq:%1").arg(-mSequence)); + #endif + #ifdef DEBUG_ACKBACK_HD_TO_UI + qDebug() << tr(" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UI AckBak : %1 %2 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ ").arg(-mSequence).arg(vMessage.actionId); + #endif + } + return ok; +} + /*! * \brief MessageDispatcher::interpretMessage * \details Calls the MessageInterpreter interpretMessage method @@ -801,47 +844,19 @@ { bool ok = false; QVariantList mData; - Sequence mSequence = vMessage.sequence; - Can_Source src = MessageInterpreter::identifySource(vMessage.can_id); - QString ids = (src == Can_Source::eCan_HD) ? "HD" : ((src == Can_Source::eCan_DG) ? "DG" : "XX"); + Can_Source srcID = MessageInterpreter::identifySource(vMessage.can_id); + const char *srcText = (srcID == Can_Source::eCan_HD) ? "HD" : ((srcID == Can_Source::eCan_DG) ? "DG" : "XX"); + if ( ! checkAcknowReceived(vMessage, srcText) ) { // check if the message was an acknowledge. + checkAcknowTransmit(vMessage, srcText); // then if needs acknow send it immediately. + } + // coco begin validated: Has been validated manually. If MessageInterpreter::interpretMessage fails, this also returns false - if (_interpreter.interpretMessage(vMessage, mData)) { - // coco end + if ( _interpreter.interpretMessage( vMessage, mData ) ) { ok = true; - GuiActionType mActionId = vMessage.actionId; - switch (mActionId) { - case GuiActionType::ID_Acknow: - #ifndef DISABLE_ACKNOW_CHECKIN_MESSAGE_LOG - LOG_EVENT(tr("%1,Ack Bak, Sq:%2").arg(ids).arg(mSequence)); - #endif - #ifdef DEBUG_ACKBACK_HD_TO_UI - qDebug() << tr(" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ HD AckBak : %1 %2 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ ").arg(mSequence).arg(vMessage.actionId); - #endif - emit didAcknowReceive(mSequence); - break; - - default: - if (mSequence < 0) { - #ifndef DISABLE_ACKNOW_CHECKIN_MESSAGE_LOG - LOG_EVENT(tr("%1,Ack Req, Sq:%2, ID:%3").arg(ids).arg(mSequence).arg(Format::toHexString(mActionId))); - #endif - #ifdef DEBUG_ACKBACK_HD_TO_UI - qDebug() << tr(" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ HD AckReq : %1 %2 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ ").arg(mSequence).arg(vMessage.actionId); - #endif - // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UI AckBak is immediately handled at the same place. - actionTransmit(GuiActionType::ID_Acknow, {}, -mSequence); - #ifndef DISABLE_ACKNOW_CHECKIN_MESSAGE_LOG - LOG_EVENT(tr("UI,Ack Bak, Sq:%1").arg(-mSequence)); - #endif - #ifdef DEBUG_ACKBACK_HD_TO_UI - qDebug() << tr(" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UI AckBak : %1 %2 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ ").arg(-mSequence).arg(vMessage.actionId); - #endif - } - emit didActionReceive(mActionId, mData); - break; - - } + emit didActionReceive(vMessage.actionId, mData); } + // coco end + _messageList[vMessage.can_id].removeLast(); return ok; }