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)