Index: sources/canbus/MessageInterpreter.cpp =================================================================== diff -u -ra6abc05918a15924460d2b9358365b3eeedf1d1c -r4d322070769e54c059b020f18215dca88c90acd7 --- sources/canbus/MessageInterpreter.cpp (.../MessageInterpreter.cpp) (revision a6abc05918a15924460d2b9358365b3eeedf1d1c) +++ sources/canbus/MessageInterpreter.cpp (.../MessageInterpreter.cpp) (revision 4d322070769e54c059b020f18215dca88c90acd7) @@ -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); @@ -144,9 +162,9 @@ QString mActionIdHexString = Format::toHexString(vMessage.actionId, false, eLenMessageIDDigits); QString logMessage = tr("Unhandled Message ID (HD)") + '\n' + QString("%1 # %2 %3") - .arg(int(vMessage.can_id), 3, 16, QChar('0')) - .arg(mActionIdHexString) - .arg(QString(vMessage.data.toHex('.'))); + .arg(int(vMessage.can_id), 3, 16, QChar('0')) + .arg(mActionIdHexString) + .arg(QString(vMessage.data.toHex('.'))); LOG_DEBUG(logMessage); } @@ -187,11 +205,11 @@ vPayload.clear(); int length = vData.length(); + // 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 - case Gui::GuiActionType::ID_KeepAlive: // len: 255, can have any len if ( length ) { // this message has a variable length vPayload = Format::fromVariant(vData[0]); @@ -206,68 +224,33 @@ 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_AlarmSilenceReq: - if ( ! length ) { logInvalidLength(vActionId); return false; } - vPayload = Format::fromVariant(vData); - LOG_EVENT(AlarmSilenceRequestData::toString(vData)); - break; - - case Gui::GuiActionType::ID_CreateTreatmentReq: { - if ( ! length ) { logInvalidLength(vActionId); return false; } - vPayload = Format::fromVariant(vData); - MAdjustTreatmentParametersRequest params; - params.fromVariantList(vData); - LOG_EVENT(params.toString()); - } break; - - default: { + 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_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)); ok = false; - } break; - + break; } return ok; } @@ -327,41 +310,52 @@ 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_Saline : ok = notify(vMessage, vData, Gui::GuiActionType::ID_Saline ); 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_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_AdjustUltrafiltrationStateRsp : ok = notify(vMessage, vData, Gui::GuiActionType::ID_AdjustUltrafiltrationStateRsp ); 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_CreateTreatmentRsp : ok = createTreatmentRespData (vMessage, vData); break; - // unhandles messages: these will only be logged as received message + 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; @@ -442,83 +436,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 @@ -567,25 +484,3 @@ return ok; } - -/*! - * \brief MessageInterpreter::createTreatmentRespData - * Checks the validity of the create treatment response data. - * \param vMessage - The message - * \param vData - the output data - * \return true if ok, false otherwise - */ -bool MessageInterpreter::createTreatmentRespData(const Message &vMessage, QVariantList &vData) { - bool ok = false; - if ( ! isValidMessage(vMessage, Gui::GuiActionType::ID_CreateTreatmentRsp) ) return ok; - - Model::MTreatmentParametersResponse mData; - ok = mData.fromByteArray(vMessage.data); - LOG_DATUM(mData.toString()); - - mData.toVariantList(vData); - emit didActionReceive(mData.data()); - - return ok; - -}