Index: sources/canbus/MessageDispatcher.cpp =================================================================== diff -u -r7777127f3b60d5f884cd07adc9d586353d914f69 -rb5afbc61af03dd2e84acf8439cb6be1f022a2921 --- sources/canbus/MessageDispatcher.cpp (.../MessageDispatcher.cpp) (revision 7777127f3b60d5f884cd07adc9d586353d914f69) +++ sources/canbus/MessageDispatcher.cpp (.../MessageDispatcher.cpp) (revision b5afbc61af03dd2e84acf8439cb6be1f022a2921) @@ -1,15 +1,15 @@ /*! * - * Copyright (c) 2019-2020 Diality Inc. - All Rights Reserved. + * Copyright (c) 2020-2022 Diality Inc. - All Rights Reserved. * \copyright * THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN * WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. * - * \file MessageDispatcher.cpp - * \author (last) Behrouz NematiPour - * \date (last) 31-Aug-2020 - * \author (original) Behrouz NematiPour - * \date (original) 26-Aug-2020 + * \file MessageDispatcher.cpp + * \author (last) Behrouz NematiPour + * \date (last) 18-Apr-2022 + * \author (original) Behrouz NematiPour + * \date (original) 26-Aug-2020 * */ #include "MessageDispatcher.h" @@ -45,10 +45,10 @@ if ( _init ) return false; _init = true; - // runs in DriveWatcher thread + // runs in the thread initConnections(); - LOG_EVENT("UI," + tr("%1 Initialized").arg(metaObject()->className())); + LOG_DEBUG(tr("%1 Initialized").arg(metaObject()->className())); return true; } @@ -75,11 +75,11 @@ */ void MessageDispatcher::quit() { - // coco begin validated: Application termination is not correctly done in coco!!! + // disabled coco begin validated: Application termination is not correctly done in coco!!! // it has been tested and works perfectly fine in normal run. quitThread(); // validated } -// coco end +// disabled coco end /*! * \brief Message Handler connections definition @@ -103,6 +103,10 @@ connect(&_MessageAcknowModel , SIGNAL(didFailedTransmit( Sequence )), this , SLOT( onFailedTransmit( Sequence ))); + // Application Settings are ready + connect(&_ApplicationController, SIGNAL(didSettingsDone ()), + this , SLOT( onSettingsDone ())); + // ---- Signal/Slots ADJUST_TRANSMT_MODEL_BRIDGE_CONNECTIONS(_ApplicationController) ACTION_RECEIVE_MODEL_BRIDGE_CONNECTIONS(_interpreter ) @@ -128,38 +132,38 @@ /*! * \brief MessageDispatcher::quitThread - * \details Moves this object to main thread to be handled by QApplicaiton + * \details Moves this object to main thread to be handled by QApplication * And to be destroyed there. */ void MessageDispatcher::quitThread() { - // coco begin validated: Application termination is not correctly done in coco!!! + // disabled coco begin validated: Application termination is not correctly done in coco!!! // it has been tested and works perfectly fine in normal run. if ( ! _thread ) return; // runs in thread moveToThread(qApp->thread()); // validated } -// coco end +// disabled coco end /*! * \brief MessageDispatcher::onFrameReceive - * \details Upon message has been received over CANBUS this slot will be called + * \details Upon message has been received over CANBus this slot will be called * by FrameInterface::didFrameReceive signal to process the frame * Upon completion of collected all the required frames * on successful interpretation of the message, emits didActionReceived signal. * The message will be removed from list of the channel vCan_Id messages. - * \param vCan_Id - CANBUS channel of the frame + * \param vCan_Id - CANBus channel of the frame * \param vPayload - Payload of the frame */ void MessageDispatcher::onFrameReceive(Can_Id vCan_Id, const QByteArray &vPayload) { // Append a message to the list - // coco begin validated: if empty (first condition) is true, it must never check for the complete (second condition) + // disabled coco begin validated: if empty (first condition) is true, it must never check for the complete (second condition) // because if the list is empty there is no last() item if (_messageList[vCan_Id].isEmpty() || _messageList[vCan_Id].last().isComplete()) { - // coco end + // disabled coco end _messageList[vCan_Id].append(Message()); } @@ -201,10 +205,10 @@ */ void MessageDispatcher::onFailedTransmit(Sequence vSequence) { - // coco begin validated: Is a placeholder and has not been implemented yet + // disabled coco begin validated: Is a placeholder and has not been implemented yet emit didFailedTransmit(vSequence); } -// coco end +// disabled coco end /*! * \brief MessageDispatcher::onActionTransmit @@ -219,6 +223,17 @@ } /*! + * \brief MessageDispatcher::onSettingsDone + * \details The slot to handle didSettingsDone signal of the ApplicationController + */ +void MessageDispatcher::onSettingsDone() +{ + _interpreter.updateUnhandledMessages(); +} + +// ---------------------------------------------------------------------------------------------------- + +/*! * \brief MessageDispatcher::onAdjustment * \details This method transmits the Blood/Dialysate Adjustment Denali message. * \param vData - Data model contains Blood Flow Rate @@ -248,19 +263,6 @@ /*! * \brief MessageDispatcher::onAdjustment - * \details This method transmits the Ultrafiltration Adjustment Denali message. - * \param vData - Data model contains treatment ultrafiltration adjustment volume - * \return void - */ -void MessageDispatcher::onAdjustment(const AdjustUltrafiltrationInitRequestData &vData) -{ - QVariantList mData; - mData += vData.volume; - onActionTransmit(GuiActionType::ID_AdjustUltrafiltrationInitReq, mData); -} - -/*! - * \brief MessageDispatcher::onAdjustment * \details This method transmits the Ultrafiltration State Adjustment Denali message. * \param vData - Data model contains treatment ultrafiltration state adjustment * \return void @@ -301,19 +303,6 @@ /*! * \brief MessageDispatcher::onAdjustment - * \details This method transmits the StartTreatment request message. - * \param vData - Data model contains the start treatment request information. - * \return void - */ -void MessageDispatcher::onAdjustment(const StartTreatmentRequestData &vData) -{ - QVariantList mData; - mData += vData.request; - onActionTransmit(GuiActionType::ID_StartTreatmentReq, mData); -} - -/*! - * \brief MessageDispatcher::onAdjustment * \details This method transmits the Alarm Request Silence message. * \param vData - Data model contains the silence request information. * \return void @@ -326,6 +315,7 @@ } /** + * \brief MessageDispatcher::onAdjustment * \details This method transmits the User Action Denali message. * \param vData - Data model contains User Action on the alarm dialog. * \return void @@ -337,48 +327,48 @@ onActionTransmit(GuiActionType::ID_AlarmUserActionReq, mData); } -/*! +/** * \brief MessageDispatcher::onAdjustment - * \details This method transmits the Alarm Acknowledge Request message. - * \param vData - Data model contains the user acknowledge request information. + * \details This method transmits the Alarm Active List Request denali message. + * \param vData - Data model contains Alarm Active List payload. * \return void */ -/* // coco begin validated: Manually tested. This model class is a placeholder and there is no use case for this now. -void MessageDispatcher::onAdjustment(const AlarmClearedConditionRequestData &vData) +void MessageDispatcher::onAdjustment(const AlarmActiveListRequestData &) { QVariantList mData; - mData += vData.alarmID; - onActionTransmit(GuiActionType::ID_AlarmClearedConditionReq, mData); + onActionTransmit(GuiActionType::ID_AlarmActiveListReq, mData); } -// coco end */ /*! * \brief MessageDispatcher::onAdjustment - * \details This method transmits the Confirm Treatment request message. - * \param vData - Data model contains the confirm treatment request + * \details This method transmits the DG Set Date Time Denali message. + * \details This method transmits the request to set the alarm volume. + * \param vData - Data model contains the alarm volume * \return void */ -void MessageDispatcher::onAdjustment(const ConfirmTreatmentRequestData &vData) +void MessageDispatcher::onAdjustment(const AdjustHDAlarmVolumeRequestData &vData) { QVariantList mData; - mData += vData.request; - onActionTransmit(GuiActionType::ID_ConfirmTreatmentReq, mData); + const int hw2ui = 20; // HD vol range is [1-5] and we show [20%-100%] to user (100 / 5). + mData += vData.volume / hw2ui; + onActionTransmit(GuiActionType::ID_AlarmVolumeSetReq, mData); } /*! * \brief MessageDispatcher::onAdjustment - * \details This method transmits the End Treatment request message. - * \param vData - Data model contains the end treatment request + * \details This method transmits the Alarm Acknowledge Request message. + * \param vData - Data model contains the user acknowledge request information. * \return void */ -void MessageDispatcher::onAdjustment(const EndTreatmentRequestData &vData) +/* // disabled coco begin validated: Manually tested. This model class is a placeholder and there is no use case for this now. +void MessageDispatcher::onAdjustment(const AlarmClearedConditionRequestData &vData) { - Q_UNUSED(vData) QVariantList mData; - onActionTransmit(GuiActionType::ID_EndTreatmentReq, mData); + mData += vData.alarmID; + onActionTransmit(GuiActionType::ID_AlarmClearedConditionReq, mData); } +// disabled coco end */ - /** * \details This method transmits the Saline Bolus Adjustment Denali message. * \param vData - Data model contains treatment Saline Bolus adjustment state. @@ -403,8 +393,102 @@ onActionTransmit(GuiActionType::ID_AdjustHeparinReq, mData); } +/** + * \details This method transmits the Rinseback Adjustment Denali message. + * \param vData - Data model contains treatment Rinseback adjustment state. + * \return void + */ +void MessageDispatcher::onAdjustment(const AdjustRinsebackRequestData &vData) +{ + QVariantList mData; + mData += vData.requestedState; + onActionTransmit(GuiActionType::ID_AdjustRinsebackReq, mData); +} + +/** + * \details This method transmits the Recirculate Adjustment Denali message. + * \param vData - Data model contains treatment Recirculate adjustment state. + * \return void + */ +void MessageDispatcher::onAdjustment(const AdjustRecirculateRequestData &vData) +{ + QVariantList mData; + mData += vData.requestedState; + onActionTransmit(GuiActionType::ID_AdjustRecirculateReq, mData); +} + +/** + * \details This method transmits the Treatment End Adjustment Denali message. + * \param vData - Data model contains treatment end adjustment state. + * \return void + */ +void MessageDispatcher::onAdjustment(const AdjustTreatmentEndRequestData &vData) +{ + QVariantList mData; + mData += vData.requestedState; + onActionTransmit(GuiActionType::ID_AdjustTreatmentEndReq, mData); +} + /*! * \brief MessageDispatcher::onAdjustment + * \details This method transmits the HD Version Denali message. + * \param vData - Data model contains HD Version state. + * \return void + */ +void MessageDispatcher::onAdjustment(const AdjustVersionsRequestData &vData) +{ + QVariantList mData; + mData += QVariant::fromValue(vData.ver_major); + mData += QVariant::fromValue(vData.ver_minor); + mData += QVariant::fromValue(vData.ver_micro); + mData += QVariant::fromValue(vData.ver_revis); + mData += QVariant::fromValue(vData.ver_comp ); + onActionTransmit(GuiActionType::ID_AdjustVersionsUIReq, mData); +} + +/*! + * \brief MessageDispatcher::onAdjustment + * \details This method transmits the HD Version Denali message. + * \param vData - Data model contains HD Version state. + * \return void + */ +void MessageDispatcher::onAdjustment(const AdjustVersionsResponseData &vData) +{ + QVariantList mData; + mData += QVariant::fromValue(vData.ver_major); + mData += QVariant::fromValue(vData.ver_minor); + mData += QVariant::fromValue(vData.ver_micro); + mData += QVariant::fromValue(vData.ver_revis); + mData += QVariant::fromValue(vData.ver_comp ); + onActionTransmit(GuiActionType::ID_AdjustVersionsUIRsp, mData); +} + +/*! + * \brief MessageDispatcher::onAdjustment + * \details This method transmits the DG Set Date Time Denali message. + * \param vData - Data model contains the epoch time + * \return void + */ +void MessageDispatcher::onAdjustment(const AdjustServiceDatesRequestData &) +{ + QVariantList mData; + onActionTransmit(GuiActionType::ID_AdjustServiceDatesReq, mData); +} + +/*! + * \brief MessageDispatcher::onAdjustment + * \details This method transmits the Disposables Removal Confirm Adjustment Denali message. + * \param vData - Data model contains Service Mode adjustment. + * \return void + */ +void MessageDispatcher::onAdjustment(const AdjustServiceModeRequestData &) +{ + QVariantList mData; + onActionTransmit(GuiActionType::ID_AdjustServiceModeReq, mData); +} + +/*! + * \brief MessageDispatcher::onAdjustment * \details This method transmits the Pressures Limits Adjustment Denali message. * \param vData - Data model contains treatment Pressures Limits adjustment. * \return void @@ -419,12 +503,25 @@ onActionTransmit(GuiActionType::ID_AdjustPressuresLimitsReq, mData); } +/*! + * \brief MessageDispatcher::onAdjustment + * \details This method transmits the InitTreatment request message. + * \param vData - Data model contains the init treatment request information. + * \return void + */ +void MessageDispatcher::onAdjustment(const AdjustInitTreatmentRequestData &vData) +{ + QVariantList mData; + mData += vData.requestedState; + onActionTransmit(GuiActionType::ID_AdjustInitTreatmentReq, mData); +} + /** * \details This method transmits the Treatment Parameter request message. * \param vData - Data model contains treatment parameter adjustment data structure * \return void */ -void MessageDispatcher::onAdjustment(const AdjustTreatmentParametersRequestData &vData) +void MessageDispatcher::onAdjustment(const AdjustParametersValidationRequestData &vData) { QVariantList mData; mData += vData.bloodFlowRate ; @@ -435,6 +532,7 @@ mData += vData.acidConcentrate ; mData += vData.bicarbonateConcentrate ; mData += vData.dialyzerType ; + mData += vData.heparinType ; mData += vData.bloodPressureMeasureInterval ; mData += vData.rinsebackFlowRate ; mData += vData.arterialPressureLimitLow ; @@ -445,19 +543,258 @@ mData += vData.heparinBolusVolume ; mData += vData.dialysateTemp ; - onActionTransmit(GuiActionType::ID_CreateTreatmentReq, mData); + onActionTransmit(GuiActionType::ID_AdjustParametersValidationReq, mData); } +/*! + * \brief MessageDispatcher::onAdjustment + * \details This method transmits the Confirm Treatment request message. + * \param vData - Data model contains the confirm treatment request + * \return void + */ +void MessageDispatcher::onAdjustment(const AdjustParametersConfirmRequestData &vData) +{ + QVariantList mData; + mData += vData.requestedState; + onActionTransmit(GuiActionType::ID_AdjustParametersConfirmReq, mData); +} /*! + * \brief MessageDispatcher::onAdjustment + * \details This method transmits the Water Sample Adjustment Denali message. + * \param vData - Data model contains Water Sample adjustment. + * \return void + */ +void MessageDispatcher::onAdjustment(const AdjustWaterSampleRequestData &vData) +{ + QVariantList mData; + mData += vData.requestedState; + onActionTransmit(GuiActionType::ID_AdjustWaterSampleReq, mData); +} + +/*! + * \brief MessageDispatcher::onAdjustment + * \details This method transmits the Water Sample Result Adjustment Denali message. + * \param vData - Data model contains Water Sample Result adjustment. + * \return void + */ +void MessageDispatcher::onAdjustment(const AdjustWaterSampleResultRequestData &vData) +{ + QVariantList mData; + mData += vData.requestedState; + onActionTransmit(GuiActionType::ID_AdjustWaterSampleResultReq, mData); +} + +/*! + * \brief MessageDispatcher::onAdjustment + * \details This method transmits the Consumables Confirm Adjustment Denali message. + * \param vData - Data model contains Consumables Confirm adjustment. + * \return void + */ +void MessageDispatcher::onAdjustment(const AdjustConsumablesConfirmRequestData &) +{ + QVariantList mData; + onActionTransmit(GuiActionType::ID_AdjustConsumablesConfirmReq, mData); +} + +/*! + * \brief MessageDispatcher::onAdjustment + * \details This method transmits the Disposables Confirm Adjustment Denali message. + * \param vData - Data model contains Disposables Confirm adjustment. + * \return void + */ +void MessageDispatcher::onAdjustment(const AdjustDisposablesConfirmRequestData &) +{ + QVariantList mData; + onActionTransmit(GuiActionType::ID_AdjustDisposablesConfirmReq, mData); +} + +/*! + * \brief MessageDispatcher::onAdjustment + * \details This method transmits the Disposables Prime Adjustment Denali message. + * \param vData - Data model contains Disposables Prime adjustment. + * \return void + */ +void MessageDispatcher::onAdjustment(const AdjustDisposablesPrimeRequestData &) +{ + QVariantList mData; + onActionTransmit(GuiActionType::ID_AdjustDisposablesPrimeReq, mData); +} + +/*! + * \brief MessageDispatcher::onAdjustment + * \details This method transmits the Patient Connection Begin Adjustment Denali message. + * \param vData - Data model contains Patient Connection Begin adjustment. + * \return void + */ +void MessageDispatcher::onAdjustment(const AdjustPatientConnectionBeginRequestData &) +{ + QVariantList mData; + onActionTransmit(GuiActionType::ID_AdjustPatientConnectionBeginReq, mData); +} + +/*! + * \brief MessageDispatcher::onAdjustment + * \details This method transmits the Ultrafiltration Adjustment Denali message. + * \param vData - Data model contains treatment ultrafiltration adjustment volume + * \return void + */ +void MessageDispatcher::onAdjustment(const AdjustUltrafiltrationInitRequestData &vData) +{ + QVariantList mData; + mData += vData.volume; + onActionTransmit(GuiActionType::ID_AdjustUltrafiltrationInitReq, mData); +} + +/*! + * \brief MessageDispatcher::onAdjustment + * \details This method transmits the Patient Connection Confirm Adjustment Denali message. + * \param vData - Data model contains Patient Connection Confirm adjustment. + * \return void + */ +void MessageDispatcher::onAdjustment(const AdjustPatientConnectionConfirmRequestData &) +{ + QVariantList mData; + onActionTransmit(GuiActionType::ID_AdjustPatientConnectionConfirmReq, mData); +} + +/*! + * \brief MessageDispatcher::onAdjustment + * \details This method transmits the Start Treatment Adjustment Denali message. + * \param vData - Data model contains Start Treatment adjustment. + * \return void + */ +void MessageDispatcher::onAdjustment(const AdjustStartTreatmentRequestData &) +{ + QVariantList mData; + onActionTransmit(GuiActionType::ID_AdjustStartTreatmentReq, mData); +} + +/*! + * \brief MessageDispatcher::onAdjustment + * \details This method transmits the Patient Disconnection Confirm Adjustment Denali message. + * \param vData - Data model contains Patient Disconnection Confirm adjustment. + * \return void + */ +void MessageDispatcher::onAdjustment(const AdjustPatientDisconnectionConfirmRequestData &) +{ + QVariantList mData; + onActionTransmit(GuiActionType::ID_AdjustPatientDisconnectionConfirmReq, mData); +} + +/*! + * \brief MessageDispatcher::onAdjustment + * \details This method transmits the Disposables Removal Confirm Adjustment Denali message. + * \param vData - Data model contains Disposables Removal Confirm adjustment. + * \return void + */ +void MessageDispatcher::onAdjustment(const AdjustDisposablesRemovalConfirmRequestData &) +{ + QVariantList mData; + onActionTransmit(GuiActionType::ID_AdjustDisposablesRemovalConfirmReq, mData); +} + +/*! + * \brief MessageDispatcher::onAdjustment + * \details This method transmits the Treatment Log Adjustment Denali message. + * \param vData - Data model contains Treatment Log adjustment. + * \return void + */ +void MessageDispatcher::onAdjustment(const AdjustTreatmentLogRequestData &) +{ + QVariantList mData; + onActionTransmit(GuiActionType::ID_AdjustTreatmentLogReq, mData); +} + +/*! + * \brief MessageDispatcher::onAdjustment + * \details This method transmits the HD Set Date Time Denali message. + * \param vData - Data model contains the epoch time + * \return void + */ +void MessageDispatcher::onAdjustment(const AdjustHDDateTimeRequestData &vData) +{ + QVariantList mData; + mData += vData.mEpoch ; + onActionTransmit(GuiActionType::ID_AdjustHDDateTimeReq, mData); +} + +/*! + * \brief MessageDispatcher::onAdjustment + * \details This method transmits the DG Set Date Time Denali message. + * \param vData - Data model contains the epoch time + * \return void + */ +void MessageDispatcher::onAdjustment(const AdjustDGDateTimeRequestData &vData) +{ + QVariantList mData; + mData += vData.mEpoch ; + onActionTransmit(GuiActionType::ID_AdjustDGDateTimeReq, mData); +} + +/*! + * \brief MessageDispatcher::onAdjustment + * \details This method transmits the Disinfect request Denali message. + * \param vData - Data model contains the epoch time + * \return void + */ +void MessageDispatcher::onAdjustment(const AdjustDisinfectRequestData &vData) +{ + QVariantList mData; + mData += vData.mState; + onActionTransmit(GuiActionType::ID_AdjustDisinfectReq, mData); +} + +/*! + * \brief MessageDispatcher::onAdjustment + * \details This method transmits the Chemical Confirm request Denali message. + * \param vData - Data model contains the epoch time + * \return void + */ +void MessageDispatcher::onAdjustment(const AdjustChemicalConfirmRequestData &) +{ + QVariantList mData; + onActionTransmit(GuiActionType::ID_AdjustChemicalConfirmReq, mData); +} + +/*! + * \brief MessageDispatcher::onAdjustment + * \details This method transmits the UI power on self test final result + * \param vData - Data model contains the final result of the UI POST + * \return void + */ +void MessageDispatcher::onAdjustment(const AdjustUIPostFinalResultRequestData &vData) +{ + QVariantList mData; + mData += vData.mResult; + onActionTransmit(GuiActionType::ID_UIPostFinalResultData, mData); +} + +/*! + * \brief MessageDispatcher::onAdjustment + * \details This method transmits the UI Generic User Confirmation result. + * \param vData - Data model contains the Generic User Confirmation result. + * \return void + */ +void MessageDispatcher::onAdjustment(const DuetConfirmUIrData &vData) +{ + QVariantList mData; + mData += vData.mId; + mData += vData.mConfirm; + onActionTransmit(GuiActionType::ID_DuetConfirmUIr, mData); +} + +// ---------------------------------------------------------------------------------------------------- + +/*! * \brief MessageDispatcher::actionTransmit * \details This method is called by slot MessageDispatcher::onActionTransmit * which emits didFrameTransmit on successful interpretation of the requested message * and successfully creating of frame(s). * \param vActionId - The ActionID of the message * \param vData - The data of the Message */ -void MessageDispatcher::actionTransmit(GuiActionType vActionId, const QVariantList &vData, Sequence vSequence) +void MessageDispatcher::actionTransmit(GuiActionType vActionId, const QVariantList &vData, Sequence vSequence, Can_Id vCanId) { txCount(); if (vSequence == 0) { // initialize @@ -468,9 +805,9 @@ } QByteArray mData; - - if (! _interpreter.interpretMessage(vActionId, vData, mData)) { - LOG_DEBUG(QString("Incorrect Message, can't be interpreted, %1").arg(Format::toHexString(vActionId))); // TODO : LogInfo Improvement + Can_Id canid = vCanId; + if (! _interpreter.interpretMessage(vActionId, vData, mData, canid)) { + LOG_DEBUG(QString("Incorrect Message, cannot be interpreted, %1").arg(Format::toHexString(vActionId))); // TODO : LogInfo Improvement return; } @@ -480,28 +817,30 @@ bool mNeedsAcknow = needsAcknow(vActionId); if (mNeedsAcknow) { mSequence = -mSequence; + #ifndef DISABLE_ACKNOW_CHECKIN_MESSAGE_LOG LOG_EVENT(tr("UI,Ack Req, Sq:%1, ID:%2").arg(mSequence).arg(Format::toHexString(vActionId))); + #endif #ifdef DEBUG_ACKBACK_HD_TO_UI qDebug() << tr(" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UI AckReq : %1 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ").arg(mSequence); #endif } - // coco begin validated: Has been tested manually but in this function this can't be false because the message interpreter is doing the same validation. + // disabled coco begin validated: Has been tested manually but in this function this cannot be false because the message interpreter is doing the same validation. // still checking here in case the logic has changed therefore buildFrame should still validate the message for developer safety. if ( ! _builder.buildFrames(vActionId, mData, frameList, mSequence) ) { - LOG_DEBUG(QString("Incorrect Message can't be built")); // TODO : LogInfo Improvement + LOG_DEBUG(QString("Incorrect Message cannot be built")); // TODO : LogInfo Improvement return; } - // coco end + // disabled coco end if (mNeedsAcknow) { // NOTE : here vSequence should be used which is not negative // because when we get the Acknow it is not the negative // since it does not need Re-Acknow // and this is the sequence number which will be used // to remove the message from the Acknow list. - emit didAcknowTransmit(eChlid_UI_HD, vSequence, frameList); + emit didAcknowTransmit(canid, vSequence, frameList); } - framesTransmit(eChlid_UI_HD, frameList); + framesTransmit(canid, frameList); } /*! @@ -520,7 +859,7 @@ /*! * \brief MessageDispatcher::buildMessage * \details Calls the messageBuilder buildMessage method. - * \param vCan_Id - CANBUS channel of the frame + * \param vCan_Id - CANBus channel of the frame * \param vPayload - Payload of the frame * \return false on error */ @@ -539,6 +878,69 @@ } /*! + * \brief MessageDispatcher::checkAcknowReceived + * \details check if the message was an acknowledge. + * \param vMessage - The received message + * \param vSrcText - The source entity identifier text + * \return true if the message is Acknow + */ +bool MessageDispatcher::checkAcknowReceived(const Message &vMessage, const QString &vSrcText) +{ + 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(vSrcText).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; +} + +/*! + * \brief MessageDispatcher::checkAcknowTransmit + * \details Sends the Ack message. + * \param vMessage - the received message which to check if it may need Ack. + * \param vSrcText - the source of the message which needs Ack. + * \return returns true if the message needs an Ack (Negative Sequence) + */ +bool MessageDispatcher::checkAcknowTransmit(const Message &vMessage, const QString &vSrcText) +{ + bool ok = false; + GuiActionType mActionId = vMessage.actionId; + Sequence mSequence = vMessage.sequence; + + // UI shall acknowledge the messages is intended for UI. + if ( ! needsAcknow(vMessage.can_id)) return ok; // false + + if (mSequence < 0) { + ok = true; + #ifndef DISABLE_ACKNOW_CHECKIN_MESSAGE_LOG + LOG_EVENT(tr("%1,Ack Req, Sq:%2, ID:%3").arg(vSrcText).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. + QString dstText; + Can_Id dstID = MessageInterpreter::identifyDestination(vMessage.can_id, &dstText); + actionTransmit(GuiActionType::ID_Acknow, {}, -mSequence, dstID); + #ifndef DISABLE_ACKNOW_CHECKIN_MESSAGE_LOG + LOG_EVENT(tr("UI,Ack Bak, Sq:%1, Dst:%2").arg(-mSequence).arg(dstText)); + #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 * Regarding the Message Id and the sequence emit different signals @@ -550,39 +952,19 @@ { bool ok = false; QVariantList mData; - Sequence mSequence = vMessage.sequence; - // coco begin validated: Has been validated manually. If MessageInterpreter::interpretMessage fails, this also returns false - if (_interpreter.interpretMessage(vMessage, mData)) { - // coco end - ok = true; - GuiActionType mActionId = vMessage.actionId; - switch (mActionId) { - case GuiActionType::ID_Acknow: - LOG_EVENT(tr("HD,Ack Bak, Sq:%1").arg(mSequence)); - #ifdef DEBUG_ACKBACK_HD_TO_UI - qDebug() << tr(" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ HD AckBak : %1 %2 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ ").arg(mSequence).arg(vMessage.actionId); - #endif - emit didAcknowReceive(mSequence); - break; + QString srcText; + MessageInterpreter::identifySource(vMessage.can_id, &srcText); + if ( ! checkAcknowReceived(vMessage, srcText) ) { // check if the message was an acknowledge. + checkAcknowTransmit(vMessage, srcText); // then if needs acknow send it immediately. + } - default: - if (mSequence < 0) { - LOG_EVENT(tr("HD,Ack Req, Sq:%1, ID:%2").arg(mSequence).arg(Format::toHexString(mActionId))); - #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); - LOG_EVENT(tr("UI,Ack Bak, Sq:%1").arg(-mSequence)); - #ifdef DEBUG_ACKBACK_HD_TO_UI - qDebug() << tr(" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UI AckBak : %1 %2 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ ").arg(-mSequence).arg(vMessage.actionId); - #endif - } - emit didActionReceive(mActionId, mData); - break; - - } + // disabled coco begin validated: Has been validated manually. If MessageInterpreter::interpretMessage fails, this also returns false + if ( _interpreter.interpretMessage( vMessage, mData ) ) { + ok = true; + emit didActionReceive(vMessage.actionId, mData); } + // disabled coco end + _messageList[vMessage.can_id].removeLast(); return ok; } @@ -594,15 +976,15 @@ */ Sequence MessageDispatcher::rxCount() { - // coco begin validated: has been manually validated since it requires so many received messages to reset the seq + // disabled coco begin validated: has been manually validated since it requires so many received messages to reset the seq if ( _rxSequence < SEQUENCE_MAX ) { ++_rxSequence; } else { _rxSequence = 1; } return _rxSequence; } -// coco end +// disabled coco end /*! * \brief MessageDispatcher::txCount @@ -611,15 +993,15 @@ */ Sequence MessageDispatcher::txCount() { - // coco begin validated: has been manually validated since it requires so many received messages to reset the seq + // disabled coco begin validated: has been manually validated since it requires so many received messages to reset the seq if ( _txSequence < SEQUENCE_MAX ) { ++_txSequence; } else { _txSequence = 1; } return _txSequence; } -// coco end +// disabled coco end /*! * \brief MessageDispatcher::needsAcknow @@ -631,3 +1013,27 @@ { return _needsAcknow.contains(vActionId); } + +/*! + * \brief MessageDispatcher::needsAcknow + * \details List of the CAN channels which need Acknow + * \param vCan_Id - The message CANBus id + * \return true if needs an Acknow + */ +bool MessageDispatcher::needsAcknow(Can_Id vCan_Id) +{ + bool ok = true; + switch(vCan_Id) { // list if the channels UI shall not Ack + case eChlid_HD_DG : // 0x008, ///< HD => DG + case eChlid_DG_HD : // 0x010, ///< DG => HD + case eDialin_HD : // 0x400, ///< dialin => HD + case eHD_Dialin : // 0x401, ///< HD => dialin + case eDialin_DG : // 0x402, ///< dialin => DG + case eDG_Dialin : // 0x403, ///< DG => dialin + ok = false; break; + + default: break; + } + + return ok; +}