Index: sources/canbus/MessageInterpreter.cpp =================================================================== diff -u -r595ede3b4cf5a1f5c06a04d1db99a0674ae742bd -r7710fea4486a639caaa3c510add0eac0bcd4ddcc --- sources/canbus/MessageInterpreter.cpp (.../MessageInterpreter.cpp) (revision 595ede3b4cf5a1f5c06a04d1db99a0674ae742bd) +++ sources/canbus/MessageInterpreter.cpp (.../MessageInterpreter.cpp) (revision 7710fea4486a639caaa3c510add0eac0bcd4ddcc) @@ -25,8 +25,26 @@ using namespace Can; using namespace Model; -#define DEBUG_RECEIVE_SIGNAL(vID, vMODEL) //qDebug() << vID << vMODEL; +#define DEBUG_RECEIVE_SIGNAL(vID, vMODEL) // qDebug() << vID << vMODEL; + +// a macro to simplify the transmit message +// would be better later to be replaced by a template method +// like the notify method of received messages +#define INTERPRET_RECEIVED_MESSAGE(vMODEL) \ + if ( ! length ) { logInvalidLength(vActionId); return false; } \ + vPayload = Format::fromVariant(vData); \ + LOG_EVENT(vMODEL::toString(vData)); \ + DEBUG_RECEIVE_SIGNAL(0, typeid(vMODEL).name()) + +// another version of the INTERPRET_RECEIVED_MESSAGE for empty messages +// same later improvements apply to this MACRO as well. +#define INTERPRET_RECVD_MT_MESSAGE(vMODEL) \ + if ( length ) { logInvalidLength(vActionId); return false; } \ + vPayload = Format::fromVariant(vData); \ + LOG_EVENT(vMODEL::toString(vData)); \ + DEBUG_RECEIVE_SIGNAL(0, typeid(vMODEL).name()) + /*! * \brief MessageInterpreter::MessageInterpreter * \details Constructor @@ -57,7 +75,7 @@ // coco begin validated : Tested manually. This code will never go false // because the isValidMessage is catching errors. // only is checking here for developer safety if logic has changed. - if ( ! ok ) return false; + if ( ! ok ) return false; // coco end emit didActionReceive(tModel.data()); logReceivedMessage(tModel); @@ -187,7 +205,7 @@ vPayload.clear(); int length = vData.length(); - LOG_EVENT(QString("%0").arg(vActionId)); + // DEBUG: LOG_EVENT(QString("0x%0").arg(vActionId, 4, 16,QChar('0'))); switch (vActionId) { // notice we are in transmit mode case Gui::GuiActionType::ID_Acknow: // len: 0, can have zero len break; // No data, Just registered @@ -206,96 +224,29 @@ LOG_EVENT(mSenderID + QString("RawData")); break; - case Gui::GuiActionType::ID_PowerOff: - if ( ! length ) { logInvalidLength(vActionId); return false; } - vPayload += Format::fromVariant(vData); - LOG_EVENT(AdjustPowerOffRequestData::toString(vData)); - break; - - case Gui::GuiActionType::ID_AdjustBloodDialysateReq: - if ( ! length ) { logInvalidLength(vActionId); return false; } - vPayload = Format::fromVariant(vData); - LOG_EVENT(AdjustBloodDialysateRequestData::toString(vData)); - break; - - case Gui::GuiActionType::ID_AdjustDurationReq: - if ( ! length ) { logInvalidLength(vActionId); return false; } - vPayload = Format::fromVariant(vData); - LOG_EVENT(AdjustDurationRequestData::toString(vData)); - break; - - case Gui::GuiActionType::ID_AdjustUltrafiltrationStateReq: - if ( ! length ) { logInvalidLength(vActionId); return false; } - vPayload = Format::fromVariant(vData); - LOG_EVENT(AdjustUltrafiltrationStateRequestData::toString(vData)); - break; - - case Gui::GuiActionType::ID_AdjustUltrafiltrationEditReq: - if ( ! length ) { logInvalidLength(vActionId); return false; } - vPayload = Format::fromVariant(vData); - LOG_EVENT(AdjustUltrafiltrationEditRequestData::toString(vData)); - break; - - case Gui::GuiActionType::ID_AdjustUltrafiltrationConfirmReq: - if ( ! length ) { logInvalidLength(vActionId); return false; } - vPayload = Format::fromVariant(vData); - LOG_EVENT(AdjustUltrafiltrationConfirmRequestData::toString(vData)); - break; - - case Gui::GuiActionType::ID_AdjustSalineReq: - if ( ! length ) { logInvalidLength(vActionId); return false; } - vPayload = Format::fromVariant(vData); - LOG_EVENT(AdjustSalineRequestData::toString(vData)); - break; - - case Gui::GuiActionType::ID_AdjustHeparinReq: - if ( ! length ) { logInvalidLength(vActionId); return false; } - vPayload = Format::fromVariant(vData); - LOG_EVENT(AdjustHeparinRequestData::toString(vData)); - break; - - case Gui::GuiActionType::ID_AdjustPressuresLimitsReq: - if ( ! length ) { logInvalidLength(vActionId); return false; } - vPayload = Format::fromVariant(vData); - LOG_EVENT(AdjustPressuresLimitsRequestData::toString(vData)); - break; - - case Gui::GuiActionType::ID_AlarmSilenceReq: - if ( ! length ) { logInvalidLength(vActionId); return false; } - vPayload = Format::fromVariant(vData); - LOG_EVENT(AlarmSilenceRequestData::toString(vData)); - break; - - case Gui::GuiActionType::ID_AlarmUserAckReq: - if ( ! length ) { logInvalidLength(vActionId); return false; } - vPayload = Format::fromVariant(vData); - LOG_EVENT(AlarmAcknowledgeRequestData::toString(vData)); - break; - - case Gui::GuiActionType::ID_StartTreatmentReq: - if ( ! length ) { logInvalidLength(vActionId); return false; } - vPayload = Format::fromVariant(vData); - LOG_EVENT(StartTreatmentRequestData::toString(vData)); - break; - - case Gui::GuiActionType::ID_ConfirmTreatmentReq: - if ( ! length ) { logInvalidLength(vActionId); return false; } - vPayload = Format::fromVariant(vData); - LOG_EVENT(ConfirmTreatmentRequestData::toString(vData)); - break; - - case Gui::GuiActionType::ID_EndTreatmentReq: - if ( length != 0 ) { logInvalidLength(vActionId); return false; } - vPayload = Format::fromVariant(vData); - LOG_EVENT(EndTreatmentRequestData::toString(vData)); - break; - - case Gui::GuiActionType::ID_CreateTreatmentReq: - if ( ! length ) { logInvalidLength(vActionId); return false; } - vPayload = Format::fromVariant(vData); - LOG_EVENT(AdjustTreatmentParametersRequestData::toString(vData)); - break; - + case Gui::GuiActionType::ID_PowerOff : INTERPRET_RECEIVED_MESSAGE(AdjustPowerOffRequestData ); break; + // in-treatment + case Gui::GuiActionType::ID_AdjustDurationReq : INTERPRET_RECEIVED_MESSAGE(AdjustDurationRequestData ); break; + case Gui::GuiActionType::ID_AdjustBloodDialysateReq : INTERPRET_RECEIVED_MESSAGE(AdjustBloodDialysateRequestData ); break; + case Gui::GuiActionType::ID_AdjustPressuresLimitsReq : INTERPRET_RECEIVED_MESSAGE(AdjustPressuresLimitsRequestData ); break; + case Gui::GuiActionType::ID_AdjustSalineReq : INTERPRET_RECEIVED_MESSAGE(AdjustSalineRequestData ); break; + case Gui::GuiActionType::ID_AdjustHeparinReq : INTERPRET_RECEIVED_MESSAGE(AdjustHeparinRequestData ); break; + // in-treatment - ultrafiltration + case Gui::GuiActionType::ID_AdjustUltrafiltrationInitReq : INTERPRET_RECEIVED_MESSAGE(AdjustUltrafiltrationInitRequestData ); break; + case Gui::GuiActionType::ID_AdjustUltrafiltrationStateReq : INTERPRET_RECEIVED_MESSAGE(AdjustUltrafiltrationStateRequestData ); break; + case Gui::GuiActionType::ID_AdjustUltrafiltrationEditReq : INTERPRET_RECEIVED_MESSAGE(AdjustUltrafiltrationEditRequestData ); break; + case Gui::GuiActionType::ID_AdjustUltrafiltrationConfirmReq : INTERPRET_RECEIVED_MESSAGE(AdjustUltrafiltrationConfirmRequestData ); break; + // pre-Treatment + case Gui::GuiActionType::ID_StartTreatmentReq : INTERPRET_RECEIVED_MESSAGE(StartTreatmentRequestData ); break; + case Gui::GuiActionType::ID_ConfirmTreatmentReq : INTERPRET_RECEIVED_MESSAGE(ConfirmTreatmentRequestData ); break; + case Gui::GuiActionType::ID_EndTreatmentReq : INTERPRET_RECVD_MT_MESSAGE(EndTreatmentRequestData ); break; + case Gui::GuiActionType::ID_CreateTreatmentReq : INTERPRET_RECEIVED_MESSAGE(AdjustTreatmentParametersRequestData ); break; + // alarms + case Gui::GuiActionType::ID_AlarmSilenceReq : INTERPRET_RECEIVED_MESSAGE(AlarmSilenceRequestData ); break; + case Gui::GuiActionType::ID_AlarmUserActionReq : INTERPRET_RECEIVED_MESSAGE(AlarmUserActionRequestData ); break; + // coco begin validated: Manually tested. This model class is a placeholder for the message 63(0x3F00) and there is no use case for this now. + case Gui::GuiActionType::ID_AlarmClearedConditionReq : INTERPRET_RECEIVED_MESSAGE(AlarmClearedConditionRequestData ); break; + // coco end default: QString mActionIdHexString = Format::toHexString(vActionId); LOG_DEBUG(mSenderID + tr("Unknown transmit Message with ID '%1'").arg(mActionIdHexString)); @@ -360,47 +311,53 @@ case Gui::GuiActionType::ID_CANBusFaultCount : ok = canbusFaultCountData (vMessage, vData); break; // TODO : implement notify<>() // ----- Datum - case Gui::GuiActionType::ID_TreatmentTime : ok = notify(vMessage, vData, Gui::GuiActionType::ID_TreatmentTime ); break; - case Gui::GuiActionType::ID_BloodFlow : ok = notify(vMessage, vData, Gui::GuiActionType::ID_BloodFlow ); break; - case Gui::GuiActionType::ID_DialysateInletFlow : ok = notify(vMessage, vData, Gui::GuiActionType::ID_DialysateInletFlow ); break; - case Gui::GuiActionType::ID_DialysateOutletFlow : ok = notify(vMessage, vData, Gui::GuiActionType::ID_DialysateOutletFlow ); break; - case Gui::GuiActionType::ID_TreatmentRanges : ok = notify(vMessage, vData, Gui::GuiActionType::ID_TreatmentRanges ); break; - case Gui::GuiActionType::ID_PressureOcclusion : ok = notify(vMessage, vData, Gui::GuiActionType::ID_PressureOcclusion ); break; - case Gui::GuiActionType::ID_TreatmentStates : ok = notify(vMessage, vData, Gui::GuiActionType::ID_TreatmentStates ); break; - case Gui::GuiActionType::ID_PrimingData : ok = notify(vMessage, vData, Gui::GuiActionType::ID_PrimingData ); break; - case Gui::GuiActionType::ID_Saline : ok = notify(vMessage, vData, Gui::GuiActionType::ID_Saline ); break; - case Gui::GuiActionType::ID_Heparin : ok = notify(vMessage, vData, Gui::GuiActionType::ID_Heparin ); break; + case Gui::GuiActionType::ID_TreatmentTime : ok = notify(vMessage, vData, Gui::GuiActionType::ID_TreatmentTime ); break; + case Gui::GuiActionType::ID_BloodFlow : ok = notify(vMessage, vData, Gui::GuiActionType::ID_BloodFlow ); break; + case Gui::GuiActionType::ID_DialysateInletFlow : ok = notify(vMessage, vData, Gui::GuiActionType::ID_DialysateInletFlow ); break; + case Gui::GuiActionType::ID_DialysateOutletFlow : ok = notify(vMessage, vData, Gui::GuiActionType::ID_DialysateOutletFlow ); break; + case Gui::GuiActionType::ID_TreatmentRanges : ok = notify(vMessage, vData, Gui::GuiActionType::ID_TreatmentRanges ); break; + case Gui::GuiActionType::ID_PressureOcclusion : ok = notify(vMessage, vData, Gui::GuiActionType::ID_PressureOcclusion ); break; + case Gui::GuiActionType::ID_TreatmentStates : ok = notify(vMessage, vData, Gui::GuiActionType::ID_TreatmentStates ); break; + case Gui::GuiActionType::ID_PrimingData : ok = notify(vMessage, vData, Gui::GuiActionType::ID_PrimingData ); break; + case Gui::GuiActionType::ID_Saline : ok = notify(vMessage, vData, Gui::GuiActionType::ID_Saline ); break; + case Gui::GuiActionType::ID_Heparin : ok = notify(vMessage, vData, Gui::GuiActionType::ID_Heparin ); break; // ----- Events - case Gui::GuiActionType::ID_HDOperationModeData : ok = notify(vMessage, vData, Gui::GuiActionType::ID_HDOperationModeData ); break; - case Gui::GuiActionType::ID_HDDebugText : ok = notify(vMessage, vData, Gui::GuiActionType::ID_HDDebugText ); break; + case Gui::GuiActionType::ID_HDOperationModeData : ok = notify(vMessage, vData, Gui::GuiActionType::ID_HDOperationModeData ); break; + case Gui::GuiActionType::ID_HDDebugText : ok = notify(vMessage, vData, Gui::GuiActionType::ID_HDDebugText ); break; - case Gui::GuiActionType::ID_Acknow : ok = true; break; // TODO : implement notify<>() - case Gui::GuiActionType::ID_PowerOff : ok = notify(vMessage, vData, Gui::GuiActionType::ID_PowerOff ); break; - case Gui::GuiActionType::ID_ShuttingDown : ok = true; LOG_EVENT("HD,ShuttingDown"); break; // TODO : implement notify<>() - case Gui::GuiActionType::ID_AlarmStatus : ok = alarmStatus (vMessage, vData); break; // TODO : implement notify<>() - case Gui::GuiActionType::ID_AlarmTriggered : ok = alarmTriggered (vMessage, vData); break; // TODO : implement notify<>() - case Gui::GuiActionType::ID_AlarmCleared : ok = alarmCleared (vMessage, vData); break; // TODO : implement notify<>() - case Gui::GuiActionType::ID_CreateTreatmentRsp : ok = notify(vMessage, vData, Gui::GuiActionType::ID_CreateTreatmentRsp ); break; + case Gui::GuiActionType::ID_Acknow : ok = true; break; // TODO : implement notify<>() + case Gui::GuiActionType::ID_PowerOff : ok = notify(vMessage, vData, Gui::GuiActionType::ID_PowerOff ); break; + case Gui::GuiActionType::ID_ShuttingDown : ok = true; LOG_EVENT("HD,ShuttingDown"); break; // TODO : implement notify<>() + case Gui::GuiActionType::ID_CreateTreatmentRsp : ok = notify(vMessage, vData, Gui::GuiActionType::ID_CreateTreatmentRsp ); break; // Adjustment Response Messages case Gui::GuiActionType::ID_AdjustDurationRsp : ok = notify(vMessage, vData, Gui::GuiActionType::ID_AdjustDurationRsp ); break; case Gui::GuiActionType::ID_AdjustBloodDialysateRsp : ok = notify(vMessage, vData, Gui::GuiActionType::ID_AdjustBloodDialysateRsp ); break; + case Gui::GuiActionType::ID_AdjustPressuresLimitsRsp : ok = notify(vMessage, vData, Gui::GuiActionType::ID_AdjustPressuresLimitsRsp ); break; case Gui::GuiActionType::ID_AdjustSalineRsp : ok = notify(vMessage, vData, Gui::GuiActionType::ID_AdjustSalineRsp ); break; + case Gui::GuiActionType::ID_AdjustUltrafiltrationInitRsp : ok = notify(vMessage, vData, Gui::GuiActionType::ID_AdjustUltrafiltrationInitRsp ); break; case Gui::GuiActionType::ID_AdjustUltrafiltrationStateRsp : ok = notify(vMessage, vData, Gui::GuiActionType::ID_AdjustUltrafiltrationStateRsp ); break; - case Gui::GuiActionType::ID_AdjustPressuresLimitsRsp : ok = notify(vMessage, vData, Gui::GuiActionType::ID_AdjustPressuresLimitsRsp ); break; case Gui::GuiActionType::ID_AdjustHeparinRsp : ok = notify(vMessage, vData, Gui::GuiActionType::ID_AdjustHeparinRsp ); break; // these need to be standard and use notify as well case Gui::GuiActionType::ID_AdjustUltrafiltrationEditRsp : ok = adjustUltrafiltrationEdit (vMessage, vData); break; // TODO : implement notify<>() case Gui::GuiActionType::ID_AdjustUltrafiltrationConfirmRsp : ok = adjustUltrafiltrationConfirm (vMessage, vData); break; // TODO : implement notify<>() - case Gui::GuiActionType::ID_StartTreatmentRsp : ok = notify (vMessage, vData, Gui::GuiActionType::ID_StartTreatmentRsp ); break; - case Gui::GuiActionType::ID_EndTreatmentRsp : ok = notify (vMessage, vData, Gui::GuiActionType::ID_EndTreatmentRsp ); break; + case Gui::GuiActionType::ID_StartTreatmentRsp : ok = notify(vMessage, vData, Gui::GuiActionType::ID_StartTreatmentRsp ); break; + case Gui::GuiActionType::ID_EndTreatmentRsp : ok = notify(vMessage, vData, Gui::GuiActionType::ID_EndTreatmentRsp ); break; + // Alarms + case Gui::GuiActionType::ID_AlarmStatus : ok = notify(vMessage, vData, Gui::GuiActionType::ID_AlarmStatus ); break; + case Gui::GuiActionType::ID_AlarmTriggered : ok = notify(vMessage, vData, Gui::GuiActionType::ID_AlarmTriggered ); break; + case Gui::GuiActionType::ID_AlarmCleared : ok = notify(vMessage, vData, Gui::GuiActionType::ID_AlarmCleared ); break; + // coco begin validated: Manually tested. This model class is a placeholder for the message 63(0x3F00) and there is no use case for this now. + case Gui::GuiActionType::ID_AlarmClearedConditionRsp : ok = notify(vMessage, vData, Gui::GuiActionType::ID_AlarmClearedConditionRsp ); break; + // coco end + // unhandles messages: these will only be logged as received message // there has nothing been defined for these messages. - default : printUnhandled (vMessage ); break; + default : printUnhandled(vMessage); break; } return ok; @@ -481,83 +438,6 @@ return ok; } -// ---------- ---------- ---------- ---------- ---------- Events ---------- ---------- ---------- ---------- ---------- // -// ---------- ---------- ---------- ---------- ---------- - HD ---------- ---------- ---------- ---------- ---------- // - -/*! - * \brief MessageInterpreter::alarmStatus - * \details This method interprets Alarm Status message data - * in vMessage of type Message. - * \param vMessage - The vMessage of type Message which contains all the data, - * require to be interpreted. - * \param vData - Alarm Status data - * \return true if the data can be extracted as defined for Alarm Status Message ID - */ -bool MessageInterpreter::alarmStatus(const Message &vMessage, QVariantList &vData) { - // TODO : review other methods - bool ok = false; - if ( ! isValidMessage(vMessage, Gui::GuiActionType::ID_AlarmStatus) ) return ok; - - Model::MAlarmStatus mData; - ok = mData.fromByteArray(vMessage.data); - LOG_EVENT("HD," + mData.toString()); // TODO: Not Standard - - mData.toVariantList(vData); - emit didActionReceive(mData.data()); - - return ok; -} - -/*! - * \brief MessageInterpreter::alarmTriggered - * \details This method interprets Alarm Triggered message data - * in vMessage of type Message. - * \param vMessage - The vMessage of type Message which contains all the data, - * require to be interpreted. - * \param vData - Alarm Triggered data - * \return true if the data can be extracted as defined for Alarm Triggered Message ID - */ -bool MessageInterpreter::alarmTriggered(const Message &vMessage, QVariantList &vData) -{ - // TODO : review other methods - bool ok = false; - if ( ! isValidMessage(vMessage, Gui::GuiActionType::ID_AlarmTriggered) ) return ok; - - Model::MAlarmTriggered mData; - ok = mData.fromByteArray(vMessage.data); - LOG_EVENT("HD," + mData.toString()); // TODO: Not Standard - - mData.toVariantList(vData); - emit didActionReceive(mData.data()); - - return ok; -} - -/*! - * \brief MessageInterpreter::alarmCleared - * \details This method interprets Alarm Cleared message data - * in vMessage of type Message. - * \param vMessage - The vMessage of type Message which contains all the data, - * require to be interpreted. - * \param vData - Alarm Cleared data - * \return true if the data can be extracted as defined for Alarm Cleared Message ID - */ -bool MessageInterpreter::alarmCleared(const Message &vMessage, QVariantList &vData) -{ - // TODO : review other methods - bool ok = false; - if ( ! isValidMessage(vMessage, Gui::GuiActionType::ID_AlarmCleared) ) return ok; - - Model::MAlarmCleared mData; - ok = mData.fromByteArray(vMessage.data); - LOG_EVENT("HD," + mData.toString()); - - mData.toVariantList(vData); - emit didActionReceive(mData.data()); - - return ok; -} - // ---------- ---------- ---------- ---------- ---------- Adjustments ---------- ---------- ---------- ---------- ---------- // /*! * \brief MessageInterpreter::adjustUltrafiltrationEditData