Index: LeahiDryDemoXMLStates.scxml =================================================================== diff -u -rfb3e70cb47f3d22f31f68358c1bda69cce9cd248 -r0deaf8f3e192a0ecde953ab65efc1ded1c06269b --- LeahiDryDemoXMLStates.scxml (.../LeahiDryDemoXMLStates.scxml) (revision fb3e70cb47f3d22f31f68358c1bda69cce9cd248) +++ LeahiDryDemoXMLStates.scxml (.../LeahiDryDemoXMLStates.scxml) (revision 0deaf8f3e192a0ecde953ab65efc1ded1c06269b) @@ -2,86 +2,96 @@ - + - + - + - + - + - + - + - + + + + - + - + - + - + - + - + + + + - + - + - + - + - - + + - + - + - - + + + + + + Index: drydemo.pro =================================================================== diff -u -rbf271a558491a83b39eb30748784f1b744736dd2 -r0deaf8f3e192a0ecde953ab65efc1ded1c06269b --- drydemo.pro (.../drydemo.pro) (revision bf271a558491a83b39eb30748784f1b744736dd2) +++ drydemo.pro (.../drydemo.pro) (revision 0deaf8f3e192a0ecde953ab65efc1ded1c06269b) @@ -102,6 +102,7 @@ \ # ---------- States ---------- sources/drydemo/StateController.cpp \ sources/drydemo/StateControllerHDFTreatment.cpp \ + sources/drydemo/StateControllerPostTreatment.cpp \ sources/drydemo/StateControllerPreTreatment.cpp \ sources/drydemo/StateControllerRecirc.cpp \ sources/drydemo/StateControllerRinseback.cpp \ Index: drydemo.pro.user =================================================================== diff -u -r4624d7657d342248336c1ff16edfae614c335728 -r0deaf8f3e192a0ecde953ab65efc1ded1c06269b --- drydemo.pro.user (.../drydemo.pro.user) (revision 4624d7657d342248336c1ff16edfae614c335728) +++ drydemo.pro.user (.../drydemo.pro.user) (revision 0deaf8f3e192a0ecde953ab65efc1ded1c06269b) @@ -1,6 +1,6 @@ - + EnvironmentId @@ -293,7 +293,7 @@ Qt 5.15.10 (iMX8) Qt 5.15.10 (iMX8) {ada4083c-13b6-4ac8-a486-71ff00b060da} - 0 + 1 0 0 Index: sources/MessageGlobals.h =================================================================== diff -u -r6c0428ed8c6430924d54d5a42c45c8ec0c16c7c2 -r0deaf8f3e192a0ecde953ab65efc1ded1c06269b --- sources/MessageGlobals.h (.../MessageGlobals.h) (revision 6c0428ed8c6430924d54d5a42c45c8ec0c16c7c2) +++ sources/MessageGlobals.h (.../MessageGlobals.h) (revision 0deaf8f3e192a0ecde953ab65efc1ded1c06269b) @@ -174,6 +174,8 @@ ID_TD_TREATMENT_SET_POINT_DIALYSATE_FLOW_CHANGE_RESP = 0x7F00, ID_UI_TREATMENT_SET_POINT_DIALYSATE_TEMP_CHANGE_RQST = 0x8000, ID_TD_TREATMENT_SET_POINT_DIALYSATE_TEMP_CHANGE_RESP = 0x8100, + ID_TD_END_TREATMENT_RQST = 0x8D00, + ID_TD_END_TREATMENT_RESP = 0x8E00, ID_TD_RINSEBACK_DATA = 0x8F00, ID_UI_RINSEBACK_CMD_RQST = 0x9000, ID_TD_RINSEBACK_CMD_RESP = 0x9100, Index: sources/drydemo/DryDemoDefines.h =================================================================== diff -u -r4624d7657d342248336c1ff16edfae614c335728 -r0deaf8f3e192a0ecde953ab65efc1ded1c06269b --- sources/drydemo/DryDemoDefines.h (.../DryDemoDefines.h) (revision 4624d7657d342248336c1ff16edfae614c335728) +++ sources/drydemo/DryDemoDefines.h (.../DryDemoDefines.h) (revision 0deaf8f3e192a0ecde953ab65efc1ded1c06269b) @@ -123,25 +123,27 @@ #define RECIRC_WARN_BEFORE_TIMEOUT_MIN 10 // Alarm defines -#define ALARM_TABLE_PRIORITY_INDEX 0 -#define ALARM_TABLE_PROPERTIES_INDEX 1 -#define ALARM_TABLE_TX_PAUSE_INDEX 2 -#define ALARM_TRANS_TO_TX_PAUSE 1 -#define ALARM_NOT_TRANS_TO_TX_PAUSE 0 -#define TRIG_LOW_VEN_ALARM_TIMEOUT_MS (3 * SECONDS_PER_MINUTE * MILLISECONDS_PER_SECOND) -#define CLEAR_DIAL_PROPOR_TIMEOUT_MS (10 * MILLISECONDS_PER_SECOND) -#define ALARM_NO_ALARM_PROPERTIES 0 -#define ALARM_STOP_TX_PROPERTIES 6 -#define ALARM_USE_DEFAULT_PROPERTIES -999 -#define ALARM_REPLACE_ACID_PROPERTIES 112 -#define ALARM_RECIRC_WARN_PROPERTIES 112 -#define ALARM_RECIR_TIMEOUT_RPOPERTIES 26 -#define ALARM_LOW_VENOUS_PROPERTIES 2 -#define ALARM_RECIRC_WARN_PROPERTIES 112 -#define ALARM_REPLACE_BICARB_PROPERTIES 112 -#define ALARM_DIAL_PROPOR_PROPERTIES 10 -#define ALARM_TX_MOD_CHNG_PROPERTIES 2 -#define ALARM_LOW_BICARB_PROPERTIES 112 +#define ALARM_TABLE_PRIORITY_INDEX 0 +#define ALARM_TABLE_PROPERTIES_INDEX 1 +#define ALARM_TABLE_TX_PAUSE_INDEX 2 +#define ALARM_TRANS_TO_TX_PAUSE 1 +#define ALARM_NOT_TRANS_TO_TX_PAUSE 0 +#define TRIG_LOW_VEN_ALARM_TIMEOUT_MS (3 * SECONDS_PER_MINUTE * MILLISECONDS_PER_SECOND) +#define CLEAR_DIAL_PROPOR_TIMEOUT_MS (10 * MILLISECONDS_PER_SECOND) +#define ALARM_NO_ALARM_PROPERTIES 0 +#define ALARM_STOP_TX_PROPERTIES 6 +#define ALARM_USE_DEFAULT_PROPERTIES -999 +#define ALARM_REPLACE_ACID_PROPERTIES 112 +#define ALARM_RECIRC_WARN_PROPERTIES 112 +#define ALARM_RECIR_TIMEOUT_RPOPERTIES 26 +#define ALARM_LOW_VENOUS_PROPERTIES 2 +#define ALARM_RECIRC_WARN_PROPERTIES 112 +#define ALARM_REPLACE_BICARB_PROPERTIES 112 +#define ALARM_DIAL_PROPOR_PROPERTIES 10 +#define ALARM_TX_MOD_CHNG_PROPERTIES 2 +#define ALARM_LOW_BICARB_PROPERTIES 112 +#define ALARM_TD_END_OF_TX_PROPERTIES 248 +#define ALARM_TD_END_OF_TX_TIMEOUT_PROPERTIES 88 // Dry bicart defines #define DRY_BICART_DRIN_IN_PROGRESS 1 @@ -159,6 +161,9 @@ #define HDF_CONTROL_INT_CTR (4 * MILLISECONDS_PER_SECOND) / QOBJECT_TIMER_TIMEOUT_MS #define HDF_START_RATE_MLPM 50.0 +// Treatment end defines +#define TREATMENT_END_TIMEOUT_ALARM_MS 10000 //(10 * SECONDS_PER_MINUTE * MILLISECONDS_PER_SECOND) + enum User_Command_ID { CMD_NONE = -1, CMD_STAND_BY = 0, @@ -167,8 +172,11 @@ CMD_MAIN_TX = 3, CMD_RINSEBACK = 4, CMD_RICIRCULATE = 5, - CMD_END_TX = 6, + CMD_TX_STOP = 6, + CMD_END_TX = 7, + CMD_POST_TX = 8, + CMD_DISINFECTION = 12, CMD_HIGH_PRIO_ALARM = 13, CMD_MEDIUM_PRIO_ALARM = 14, @@ -225,11 +233,10 @@ REQUESTED_USER_ACTION_RINSEBACK_DECREASE_RATE = 2, REQUESTED_USER_ACTION_RINSEBACK_PAUSE = 3, REQUESTED_USER_ACTION_RINSEBACK_RESUME = 4, - REQUESTED_USER_ACTION_RINSEBACK_END = 5, - REQUESTED_USER_ACTION_RINSEBACK_ADDITIONAL = 6, - REQUESTED_USER_ACTION_RINSEBACK_CONFIRM_RECIRCULATE = 7, - REQUESTED_USER_ACTION_RINSEBACK_END_TREATMENT = 8, - REQUESTED_USER_ACTION_RINSEBACK_BACK_TO_TREATMENT = 9, + REQUESTED_USER_ACTION_RINSEBACK_ADDITIONAL = 5, + REQUESTED_USER_ACTION_RINSEBACK_CONFIRM_RECIRCULATE = 6, + REQUESTED_USER_ACTION_RINSEBACK_END_TREATMENT = 7, + REQUESTED_USER_ACTION_RINSEBACK_BACK_TO_TREATMENT = 8, }; enum Recirculate_States { @@ -345,6 +352,8 @@ ALARM_ID_DD_REPLACE_BICARB_CARTRIDGE = 248, ALARM_ID_DD_REPLACE_ACID_CONCENTRATE = 249, ALARM_ID_TD_DIALYSATE_PROPORTIONING_IN_PROGRESS = 250, + ALARM_ID_TD_END_OF_TREATMENT = 251, + ALARM_ID_TD_END_OF_TREATMENT_TIMEOUT = 252, }; enum Generic_Confirm_Id { Index: sources/drydemo/StateController.cpp =================================================================== diff -u -r4624d7657d342248336c1ff16edfae614c335728 -r0deaf8f3e192a0ecde953ab65efc1ded1c06269b --- sources/drydemo/StateController.cpp (.../StateController.cpp) (revision 4624d7657d342248336c1ff16edfae614c335728) +++ sources/drydemo/StateController.cpp (.../StateController.cpp) (revision 0deaf8f3e192a0ecde953ab65efc1ded1c06269b) @@ -21,33 +21,37 @@ _dryDemo.connectToState("Pre_Tx" , this, &StateController::onPretreatmentStateChange ); _dryDemo.connectToState("Blood_Prime" , this, &StateController::onBloodPrimeStateChange ); _dryDemo.connectToState("Treatment" , this, &StateController::onTreatmentStateChange ); - _dryDemo.connectToState("Treatment_Pause" , this, &StateController::onTreatmentPauseStateChange ); _dryDemo.connectToState("Treatment_Rinseback" , this, &StateController::onTreatmentRinsebackStateChange ); _dryDemo.connectToState("Treatment_Recirculate" , this, &StateController::onTreatmentRecriculateStateChange ); _dryDemo.connectToState("Treatment_End" , this, &StateController::onTreatmentEndStateChange ); + _dryDemo.connectToState("Post_Tx" , this, &StateController::onPostTreatmentStateChange ); // Transition to standby commands and events _transitionEventsFromStandby.clear(); - _transitionEventsFromStandby[CMD_STAND_BY ] = {"T_Back_2_SB" , static_cast(MODE_STAN)}; - _transitionEventsFromStandby[CMD_PRE_TX ] = {"T_SB_2_Pretx", static_cast(MODE_PRET)}; - _transitionEventsFromStandby[CMD_BLOOD_PRIME ] = {"T_SB_2_BP" , static_cast(MODE_TREA)}; - _transitionEventsFromStandby[CMD_MAIN_TX ] = {"T_SB_2_Tx" , static_cast(MODE_TREA)}; - _transitionEventsFromStandby[CMD_RINSEBACK ] = {"T_SB_2_RB" , static_cast(MODE_TREA)}; - _transitionEventsFromStandby[CMD_RICIRCULATE ] = {"T_SB_2_RC" , static_cast(MODE_TREA)}; - _transitionEventsFromStandby[CMD_END_TX ] = {"T_SB_2_TE" , static_cast(MODE_TREA)}; + _transitionEventsFromStandby[CMD_STAND_BY ] = {"T_Back_2_SB" , static_cast(MODE_STAN)}; + _transitionEventsFromStandby[CMD_PRE_TX ] = {"T_SB_2_Pretx" , static_cast(MODE_PRET)}; + _transitionEventsFromStandby[CMD_BLOOD_PRIME ] = {"T_SB_2_BP" , static_cast(MODE_TREA)}; + _transitionEventsFromStandby[CMD_MAIN_TX ] = {"T_SB_2_Tx" , static_cast(MODE_TREA)}; + _transitionEventsFromStandby[CMD_RINSEBACK ] = {"T_SB_2_RB" , static_cast(MODE_TREA)}; + _transitionEventsFromStandby[CMD_RICIRCULATE ] = {"T_SB_2_RC" , static_cast(MODE_TREA)}; + _transitionEventsFromStandby[CMD_END_TX ] = {"T_SB_2_TE" , static_cast(MODE_TREA)}; + _transitionEventsFromStandby[CMD_POST_TX ] = {"T_SB_2_Posttx" , static_cast(MODE_POST)}; // Alarms specs and properties - _alarmTriggerSpecs[ALARM_ID_NO_ALARM ] = {ALARM_PRIORITY_NONE , ALARM_NO_ALARM_PROPERTIES , ALARM_NOT_TRANS_TO_TX_PAUSE}; - _alarmTriggerSpecs[ALARM_ID_TD_VENOUS_PRESSURE_LOW ] = {ALARM_PRIORITY_HIGH , ALARM_LOW_VENOUS_PROPERTIES , ALARM_TRANS_TO_TX_PAUSE }; - _alarmTriggerSpecs[ALARM_ID_TD_TREATMENT_STOPPED_BY_USER ] = {ALARM_PRIORITY_HIGH , ALARM_STOP_TX_PROPERTIES , ALARM_TRANS_TO_TX_PAUSE }; - _alarmTriggerSpecs[ALARM_ID_TD_RECIRC_TIMEOUT_WARNING ] = {ALARM_PRIORITY_LOW , ALARM_RECIRC_WARN_PROPERTIES , ALARM_NOT_TRANS_TO_TX_PAUSE}; - _alarmTriggerSpecs[ALARM_ID_TD_RECIRC_TIMEOUT ] = {ALARM_PRIORITY_HIGH , ALARM_RECIR_TIMEOUT_RPOPERTIES , ALARM_NOT_TRANS_TO_TX_PAUSE}; - _alarmTriggerSpecs[ALARM_ID_DD_BICARBONATE_CARTRIDGE_LOW_LEVEL ] = {ALARM_PRIORITY_MEDIUM , ALARM_LOW_BICARB_PROPERTIES , ALARM_TRANS_TO_TX_PAUSE }; - _alarmTriggerSpecs[ALARM_ID_TD_TREATMENT_MODALITY_CHANGE ] = {ALARM_PRIORITY_MEDIUM , ALARM_TX_MOD_CHNG_PROPERTIES , ALARM_TRANS_TO_TX_PAUSE }; - _alarmTriggerSpecs[ALARM_ID_DD_REPLACE_ACID_CONCENTRATE ] = {ALARM_PRIORITY_MEDIUM , ALARM_REPLACE_ACID_PROPERTIES , ALARM_TRANS_TO_TX_PAUSE }; - _alarmTriggerSpecs[ALARM_ID_DD_REPLACE_BICARB_CARTRIDGE ] = {ALARM_PRIORITY_MEDIUM , ALARM_REPLACE_BICARB_PROPERTIES , ALARM_TRANS_TO_TX_PAUSE }; - _alarmTriggerSpecs[ALARM_ID_TD_DIALYSATE_PROPORTIONING_IN_PROGRESS ] = {ALARM_PRIORITY_MEDIUM , ALARM_DIAL_PROPOR_PROPERTIES , ALARM_TRANS_TO_TX_PAUSE }; + _alarmTriggerSpecs[ALARM_ID_NO_ALARM ] = {ALARM_PRIORITY_NONE , ALARM_NO_ALARM_PROPERTIES , ALARM_NOT_TRANS_TO_TX_PAUSE }; + _alarmTriggerSpecs[ALARM_ID_TD_VENOUS_PRESSURE_LOW ] = {ALARM_PRIORITY_HIGH , ALARM_LOW_VENOUS_PROPERTIES , ALARM_TRANS_TO_TX_PAUSE }; + _alarmTriggerSpecs[ALARM_ID_TD_TREATMENT_STOPPED_BY_USER ] = {ALARM_PRIORITY_HIGH , ALARM_STOP_TX_PROPERTIES , ALARM_TRANS_TO_TX_PAUSE }; + _alarmTriggerSpecs[ALARM_ID_TD_RECIRC_TIMEOUT_WARNING ] = {ALARM_PRIORITY_LOW , ALARM_RECIRC_WARN_PROPERTIES , ALARM_NOT_TRANS_TO_TX_PAUSE }; + _alarmTriggerSpecs[ALARM_ID_TD_RECIRC_TIMEOUT ] = {ALARM_PRIORITY_HIGH , ALARM_RECIR_TIMEOUT_RPOPERTIES , ALARM_NOT_TRANS_TO_TX_PAUSE }; + _alarmTriggerSpecs[ALARM_ID_DD_BICARBONATE_CARTRIDGE_LOW_LEVEL ] = {ALARM_PRIORITY_MEDIUM , ALARM_LOW_BICARB_PROPERTIES , ALARM_TRANS_TO_TX_PAUSE }; + _alarmTriggerSpecs[ALARM_ID_TD_TREATMENT_MODALITY_CHANGE ] = {ALARM_PRIORITY_MEDIUM , ALARM_TX_MOD_CHNG_PROPERTIES , ALARM_TRANS_TO_TX_PAUSE }; + _alarmTriggerSpecs[ALARM_ID_DD_REPLACE_ACID_CONCENTRATE ] = {ALARM_PRIORITY_MEDIUM , ALARM_REPLACE_ACID_PROPERTIES , ALARM_TRANS_TO_TX_PAUSE }; + _alarmTriggerSpecs[ALARM_ID_DD_REPLACE_BICARB_CARTRIDGE ] = {ALARM_PRIORITY_MEDIUM , ALARM_REPLACE_BICARB_PROPERTIES , ALARM_TRANS_TO_TX_PAUSE }; + _alarmTriggerSpecs[ALARM_ID_TD_DIALYSATE_PROPORTIONING_IN_PROGRESS ] = {ALARM_PRIORITY_MEDIUM , ALARM_DIAL_PROPOR_PROPERTIES , ALARM_TRANS_TO_TX_PAUSE }; + _alarmTriggerSpecs[ALARM_ID_TD_END_OF_TREATMENT ] = {ALARM_PRIORITY_MEDIUM , ALARM_TD_END_OF_TX_PROPERTIES , ALARM_NOT_TRANS_TO_TX_PAUSE }; + _alarmTriggerSpecs[ALARM_ID_TD_END_OF_TREATMENT_TIMEOUT ] = {ALARM_PRIORITY_MEDIUM , ALARM_TD_END_OF_TX_TIMEOUT_PROPERTIES , ALARM_NOT_TRANS_TO_TX_PAUSE }; + } void StateController::quit() @@ -106,6 +110,7 @@ case ID_UI_PRESSURE_LIMIT_WIDEN_RQST: case ID_UI_BLOOD_PRESSURE_RQST: case ID_UI_SETUP_TUBING_SET_CONNECTIONS_CONFIRM_RQST: + case ID_TD_END_TREATMENT_RQST: _treatmentRcvdMessages[receivedMsgID] = 0; break; @@ -157,6 +162,7 @@ case ID_TD_HDF_ADJUSTMENT_RESP: case ID_TD_WATER_SAMPLE_RESULT_RESP: case ID_TD_PAUSE_SUB_FLOW_RESP: + case ID_TD_END_TREATMENT_RESP: // Do nothing break; } @@ -200,8 +206,8 @@ auto onEntry = [=](){ handleTDOpModeTransitionBroadcastData(MODE_STAN, 0, BC_IMMEDIATELY); - setTreatmentParametersToDefault(); - resetDryDemoVariables(); + initializeTreatmentParametersToDefault(); + initializeDryDemoVariables(); initializeTreatmentHDFVariables(); // Clear all the alarms triggerAnAlarm(ALARM_ID_NO_ALARM); @@ -462,7 +468,7 @@ auto onExit = [=](){ qDebug() << "Tx in exit"; status = STATE_ON_ENTRY; - if (_treatmentStatus.userCmd == CMD_END_TX) { + if (_treatmentStatus.userCmd == CMD_TX_STOP) { triggerAnAlarm(ALARM_ID_TD_TREATMENT_STOPPED_BY_USER); _treatmentStatus.stateTransitionEvent = "T_Tx_2_TP"; _treatmentStatus.requestTreatmentReset = false; @@ -649,27 +655,47 @@ void StateController::onTreatmentEndStateChange(bool active) { - static State_Status status = STATE_ON_ENTRY; + static State_Status status = STATE_ON_ENTRY; + static bool hasFlowChngeRequested = false; auto onEntry = [=](){ - _treatmentSubStates.txState = TREAT_END_STATE; - _treatmentSubStates.txEndState = TREATMENT_END_WAIT_FOR_RINSEBACK_STATE; - _treatmentStatus.isTreatmentComplete = true; + triggerAnAlarm(ALARM_ID_TD_END_OF_TREATMENT); + _treatmentSubStates.txState = TREAT_START_STATE; + handleTreatmentStatesBroadcastData(BC_IMMEDIATELY); + _treatmentSubStates.txState = TREAT_DIALYSIS_STATE; + _treatmentSubStates.txEndState = TREATMENT_END_WAIT_FOR_RINSEBACK_STATE; + _treatmentStatus.isTreatmentComplete = true; + _treatmentStatus.treatmentEndTimeoutAlarmCtr = _elapsedTimeCtr; handleTDOpModeTransitionBroadcastData(MODE_TREA, 0, BC_IMMEDIATELY); handleTreatmentStatesBroadcastData(BC_IMMEDIATELY); status = STATE_ON_ACTION; qDebug() << "Tx End on entry"; }; auto onAction = [=](){ - status = STATE_ON_ACTION; + _treatmentSubStates.txState = TREAT_END_STATE; + status = STATE_ON_ACTION; handleBackToStandbyEvent(status); handleTDOpModeTransitionBroadcastData(MODE_TREA, 0, BC_DELAYED); handleTreatmentStatesBroadcastData(BC_DELAYED); - // Vitals + // Alarm methods + handleAlarmUserAction(status, false); + // Fluid bolus methods + handleFluidBolusRequestMessage(); + handleFluidBolusFluidDelivery(_treatmentParams.bloodFlowRateMLPM); + handleFluidBolusBroadcastData(BC_DELAYED); + // Set point methods + handleSetPointBloodFlowChange(_treatmentParams.bloodFlowRateMLPM, hasFlowChngeRequested); + handleTreatmentSetpointsBroadcastData(_treatmentParams.bloodFlowRateMLPM, _treatmentParams.dialysateFlowRateMLPM, + _treatmentParams.dialysateTemperatureC, BC_DELAYED); + // Vitals method handleVitalsDataRquest(); // Water sample methods handleTDWaterSampleResultRequest(); + // Treatment end request method + handleTreatmentEndRequestMessage(status); + handleTreatmentEndTimeout(); + handleUIConfirmMessage(GENERIC_CONFIRM_ID_TREATMENT_END, status); }; auto onExit = [=](){ @@ -685,6 +711,41 @@ } } +void StateController::onPostTreatmentStateChange(bool active) +{ + static State_Status status = STATE_ON_ENTRY; + + auto onEntry = [=](){ + status = STATE_ON_ACTION; + handleBackToStandbyEvent(status); + handleTDOpModeTransitionBroadcastData(MODE_POST, 0, BC_DELAYED); + handleTreatmentStatesBroadcastData(BC_IMMEDIATELY); + qDebug() << "Post Tx on entry"; + }; + + auto onAction = [=](){ + status = STATE_ON_ACTION; + handleBackToStandbyEvent(status); + handleTDOpModeTransitionBroadcastData(MODE_POST, 0, BC_DELAYED); + // Vitals + handleVitalsDataRquest(); + // Water sample methods + handleTDWaterSampleResultRequest(); + }; + + auto onExit = [=](){ + qDebug() << "Post Tx on exit"; + _dryDemo.submitEvent(_treatmentStatus.stateTransitionEvent); + status = STATE_ON_ENTRY; + }; + + switch (status) { // TODO macro it later + case STATE_ON_ENTRY : if (active) onEntry (); break; + case STATE_ON_ACTION: if (active) onAction(); break; + case STATE_ON_EXIT : if (active) onExit (); break; + } +} + // ************* Hepler functions ************* // void StateController::handleTDOpModeTransitionBroadcastData(const TD_OP_MODE mode, const quint32 subMode, const Broadcast_Type BCType) Index: sources/drydemo/StateController.h =================================================================== diff -u -r4624d7657d342248336c1ff16edfae614c335728 -r0deaf8f3e192a0ecde953ab65efc1ded1c06269b --- sources/drydemo/StateController.h (.../StateController.h) (revision 4624d7657d342248336c1ff16edfae614c335728) +++ sources/drydemo/StateController.h (.../StateController.h) (revision 0deaf8f3e192a0ecde953ab65efc1ded1c06269b) @@ -85,6 +85,8 @@ float bicartProgress; quint32 bicartDrainInProgress; quint32 bicartDepresInProgress; + // Treatment end + quint32 treatmentEndTimeoutAlarmCtr; }; struct Treatment_HDF_vars { @@ -208,12 +210,13 @@ void onTreatmentRinsebackStateChange(bool active); void onTreatmentRecriculateStateChange(bool active); void onTreatmentEndStateChange(bool active); + void onPostTreatmentStateChange(bool active); // Helper methods void handleTDOpModeTransitionBroadcastData(const Can::TD_OP_MODE mode, const quint32 subMode, const Broadcast_Type BCType); void setTreatmentParametersFromUI(const QVariant &payload); // TODO move the implementation to pretx cpp void handleUIResponseMessage(const Can::Message_ID_Enum msgID, const quint32 acceptReject, const QVariantList &rejectReasons = {}); - void resetDryDemoVariables(); + void initializeDryDemoVariables(); void handleBackToStandbyEvent(State_Status &status); quint32 extractU32DataFromReceivedMessage(const Can::Message_ID_Enum msgID, qint32 index); float extractF32DataFromReceivedMessage(const Can::Message_ID_Enum msgID, qint32 index); @@ -242,7 +245,7 @@ void handleBloodPrimeVolML(const bool resume, const float rampStepML, const bool hasFlowChanged, quint32 &currBloodFlowMLPM, float &accumBloodVolML); // Treatment methods - void setTreatmentParametersToDefault(); + void initializeTreatmentParametersToDefault(); void initializeTreatmentTimeAndUltrafiltration(); void handleTreatmentSetpointsBroadcastData(const quint32 bloodFlowMLPM, const quint32 dialFlowMLPM, const float dialTempC, const Broadcast_Type BCType); void handleTreatmentStatesBroadcastData(const Broadcast_Type BCType); @@ -301,5 +304,6 @@ void handleRecircBroadcastData(const Broadcast_Type BCType); // Treatment end methods - + void handleTreatmentEndRequestMessage(State_Status &status); + void handleTreatmentEndTimeout(); }; Index: sources/drydemo/StateControllerPostTreatment.cpp =================================================================== diff -u --- sources/drydemo/StateControllerPostTreatment.cpp (revision 0) +++ sources/drydemo/StateControllerPostTreatment.cpp (revision 0deaf8f3e192a0ecde953ab65efc1ded1c06269b) @@ -0,0 +1,4 @@ + +#include "StateController.h" +#include "ApplicationController.h" +#include "types.h" Index: sources/drydemo/StateControllerRinseback.cpp =================================================================== diff -u -rbf271a558491a83b39eb30748784f1b744736dd2 -r0deaf8f3e192a0ecde953ab65efc1ded1c06269b --- sources/drydemo/StateControllerRinseback.cpp (.../StateControllerRinseback.cpp) (revision bf271a558491a83b39eb30748784f1b744736dd2) +++ sources/drydemo/StateControllerRinseback.cpp (.../StateControllerRinseback.cpp) (revision 0deaf8f3e192a0ecde953ab65efc1ded1c06269b) @@ -95,12 +95,14 @@ } // TODO implement recirc allowed too else { + acceptReject = ACCEPT_VALUE; _treatmentStatus.hasRecircBeenRequested = true; } break; case REQUESTED_USER_ACTION_RINSEBACK_END_TREATMENT: handleSendUIConfirmationMessage(GENERIC_CONFIRM_ID_TREATMENT_END, GENERIC_CONFIRM_CMD_REQUEST_OPEN); + acceptReject = ACCEPT_VALUE; break; default: Index: sources/drydemo/StateControllerStandby.cpp =================================================================== diff -u -r4624d7657d342248336c1ff16edfae614c335728 -r0deaf8f3e192a0ecde953ab65efc1ded1c06269b --- sources/drydemo/StateControllerStandby.cpp (.../StateControllerStandby.cpp) (revision 4624d7657d342248336c1ff16edfae614c335728) +++ sources/drydemo/StateControllerStandby.cpp (.../StateControllerStandby.cpp) (revision 0deaf8f3e192a0ecde953ab65efc1ded1c06269b) @@ -15,7 +15,6 @@ Generic_Confirm_Id id = static_cast(msgPayload); Confirmation_Status status = static_cast(confirmStatus); - // TODO why the reject is sent anways? _uiConfirmMessages[id].confirmStatus = status; qDebug() << "New Message Confirm" << id << status; _treatmentRcvdMessages[ID_UI_CONFIRMATION_RESULT_RESP].clear(); @@ -89,7 +88,7 @@ _isSendListReady = true; } -void StateController::resetDryDemoVariables() +void StateController::initializeDryDemoVariables() { _treatmentStatus.hasTxParamsBeenInitialized = false; _treatmentStatus.requestTreatmentReset = true; @@ -195,9 +194,15 @@ triggerAnAlarm(ALARM_ID_NO_ALARM); break; + case ALARM_USER_ACTION_ACK: + triggerAnAlarm(ALARM_ID_NO_ALARM); + break; + case ALARM_USER_ACTION_RINSEBACK: case ALARM_USER_ACTION_TEMPOARY_BREAK: handleSendUIConfirmationMessage(GENERIC_CONFIRM_ID_RINSEBACK, GENERIC_CONFIRM_CMD_REQUEST_OPEN); + // Set the flag to go to recirculate + if (userAction == ALARM_USER_ACTION_TEMPOARY_BREAK) { _treatmentStatus.hasRecircBeenRequested = true; } break; case ALARM_USER_ACTION_END_TREATMENT: @@ -245,7 +250,7 @@ } // Wait for a couple of seconds to simulate like the conductivity is getting in range elapsedTimeMS = (_elapsedTimeCtr - _treatmentStatus.triggerAlarmTimeoutCtr) * QOBJECT_TIMER_TIMEOUT_MS; - if (elapsedTimeMS == CLEAR_DIAL_PROPOR_TIMEOUT_MS) { + if (elapsedTimeMS >= CLEAR_DIAL_PROPOR_TIMEOUT_MS) { // Proportioning alarm is cleared automatically triggerAnAlarm(ALARM_ID_NO_ALARM); _treatmentStatus.txPauseSeqAlarmState = SEQ_ALARM_DRY_BICARB_CARTRIDGE; @@ -289,7 +294,7 @@ case SEQ_ALARM_PROPORTIONING_BICARB_IN_PROG: // Wait for a couple of seconds to simulate like the conductivity is getting in range elapsedTimeMS = (_elapsedTimeCtr - _treatmentStatus.triggerAlarmTimeoutCtr) * QOBJECT_TIMER_TIMEOUT_MS; - if (elapsedTimeMS == CLEAR_DIAL_PROPOR_TIMEOUT_MS) { + if (elapsedTimeMS >= CLEAR_DIAL_PROPOR_TIMEOUT_MS) { // This alarm is cleared automatically triggerAnAlarm(ALARM_ID_NO_ALARM); _treatmentStatus.triggerAlarmTimeoutCtr = _elapsedTimeCtr; @@ -330,29 +335,24 @@ return; } - // TODO why the reject is sent anways? - //if (_uiConfirmMessages[confirmID].confirmStatus == CONFIRMATION_REQUEST_STATUS_REJECTED) { - // handleSendUIConfirmationMessage(confirmID, GENERIC_CONFIRM_CMD_ACCEPT_CLOSE); - // qDebug() << "Reject"; - // _uiConfirmMessages[confirmID].confirmStatus = CONFIRMATION_REQUEST_STATUS_UNUSED; - // return; - //} - // TODO uncomment - + if (_uiConfirmMessages[confirmID].confirmStatus == CONFIRMATION_REQUEST_STATUS_REJECTED) { + handleSendUIConfirmationMessage(confirmID, GENERIC_CONFIRM_CMD_ACCEPT_CLOSE); + _uiConfirmMessages[confirmID].confirmStatus = CONFIRMATION_REQUEST_STATUS_UNUSED; + qDebug() << "Reject"; + return; + } switch (confirmID) { case GENERIC_CONFIRM_ID_TREATMENT_END: if (_uiConfirmMessages[confirmID].confirmStatus == CONFIRMATION_REQUEST_STATUS_ACCEPTED) { QStringList activeStates = _dryDemo.activeStateNames(true); // Check if there is at least one value in the string list to prevent segmentatoin fault QString activeState = (activeStates.length() >= 1 ? activeStates[0] : ""); - if (activeState == "Treatment_Recirculate") { - _treatmentStatus.stateTransitionEvent = "T_RC_2_TE"; - } - else if (activeState == "Treatment_Rinseback") { - _treatmentStatus.stateTransitionEvent = "T_RB_2_TE"; - } - status = STATE_ON_EXIT; + if (activeState == "Treatment_Recirculate") { _treatmentStatus.stateTransitionEvent = "T_RC_2_Posttx"; } + else if (activeState == "Treatment_Rinseback") { _treatmentStatus.stateTransitionEvent = "T_RB_2_Posttx"; } + else if (activeState == "Treatment_End") { _treatmentStatus.stateTransitionEvent = "T_TE_2_RB"; } + else if (activeState == "Treatment_Pause") { _treatmentStatus.stateTransitionEvent = "T_TP_2_RB"; } _uiConfirmMessages[confirmID].confirmStatus = CONFIRMATION_REQUEST_STATUS_UNUSED; + status = STATE_ON_EXIT; qDebug() << "Event" << activeState << _treatmentStatus.stateTransitionEvent << _dryDemo.activeStateNames(true); handleSendUIConfirmationMessage(confirmID, GENERIC_CONFIRM_CMD_ACCEPT_CLOSE); triggerAnAlarm(ALARM_ID_NO_ALARM); @@ -394,7 +394,9 @@ void StateController::handleSendUIConfirmationMessage(const Generic_Confirm_Id confirmID, const Generic_Confirm_Command confirmCmd, const Reject_Reasons rejectReason) { qDebug() << "Sneding" << confirmID; - _uiConfirmMessages[confirmID].startTimeMS = QDateTime::currentMSecsSinceEpoch(); + _uiConfirmMessages[confirmID].startTimeMS = QDateTime::currentMSecsSinceEpoch(); + // Setting the confirm status to pending because the default status is rejected + _uiConfirmMessages[confirmID].confirmStatus = CONFIRMATION_REQUEST_STATUS_PENDING; QVariantList resp; resp.append(static_cast(ID_TD_UI_GENERIC_CONFIRMATION_RQST)); Index: sources/drydemo/StateControllerTreatment.cpp =================================================================== diff -u -r4624d7657d342248336c1ff16edfae614c335728 -r0deaf8f3e192a0ecde953ab65efc1ded1c06269b --- sources/drydemo/StateControllerTreatment.cpp (.../StateControllerTreatment.cpp) (revision 4624d7657d342248336c1ff16edfae614c335728) +++ sources/drydemo/StateControllerTreatment.cpp (.../StateControllerTreatment.cpp) (revision 0deaf8f3e192a0ecde953ab65efc1ded1c06269b) @@ -80,7 +80,7 @@ //qDebug() << "Current" << currBloodFlowMLPM << _treatmentParams.bloodFlowRateMLPM << controlCounter << accumBloodVolML; } -void StateController::setTreatmentParametersToDefault() +void StateController::initializeTreatmentParametersToDefault() { // TODO complete the list as we go _treatmentParams.finalConfirmation = true; @@ -698,9 +698,28 @@ handleUIResponseMessage(ID_TD_DRY_BICART_DISCONNECT_RESP, ACCEPT_VALUE); } +// TREATMENT END +void StateController::handleTreatmentEndRequestMessage(State_Status &status) +{ + if (_treatmentRcvdMessages[ID_TD_END_TREATMENT_RQST].isNull()) { return; } + _treatmentStatus.stateTransitionEvent = "T_TE_2_RB"; + status = STATE_ON_EXIT; + _treatmentRcvdMessages[ID_TD_END_TREATMENT_RQST].clear(); + handleUIResponseMessage(ID_TD_END_TREATMENT_RESP, ACCEPT_VALUE); +} +void StateController::handleTreatmentEndTimeout() +{ + quint32 elapsedTimeMS = (_elapsedTimeCtr - _treatmentStatus.treatmentEndTimeoutAlarmCtr) * QOBJECT_TIMER_TIMEOUT_MS; + if (elapsedTimeMS == TREATMENT_END_TIMEOUT_ALARM_MS) { + triggerAnAlarm(ALARM_ID_TD_END_OF_TREATMENT_TIMEOUT); + } +} + + +