Index: sources/drydemo/StateControllerStandby.cpp =================================================================== diff -u -r3a1edf1c2dc6f68d32af3adeeee4a59bbac739c5 -r7094c1e2387d63fc7fb9d6d9a09ea0aee3c71420 --- sources/drydemo/StateControllerStandby.cpp (.../StateControllerStandby.cpp) (revision 3a1edf1c2dc6f68d32af3adeeee4a59bbac739c5) +++ sources/drydemo/StateControllerStandby.cpp (.../StateControllerStandby.cpp) (revision 7094c1e2387d63fc7fb9d6d9a09ea0aee3c71420) @@ -97,8 +97,9 @@ _treatmentSubStates.rinsebackState = RINSEBACK_STOP_INIT_STATE; _treatmentStatus.ufVolDeliveredL = 0.0; _treatmentStatus.hasRecircBeenRequested = false; - _treatmentStatus.lowVenousAlarmTimeoutCtr = 0; + _treatmentStatus.triggerAlarmTimeoutCtr = 0; _treatmentStatus.isBloodPumpRunning = false; + _treatmentStatus.txPauseSeqAlarmState = SEQ_ALARM_NO_ALARM; // Initialize pressure vars _pressureVars.presLimitState = PRESSURE_LIMITS_STATE_OFF; _pressureVars.presStabilizeTimePeriod = USE_NORMAL_STABILIZATION_PERIOD; @@ -204,13 +205,73 @@ } } -void StateController::handleTriggerLowVenousAlarmInTx() +void StateController::handleChemsReplacementAlarmsSequence(State_Status &status) { - _treatmentStatus.lowVenousAlarmTimeoutCtr++; + quint32 elapsedTimeMS; - if ((_treatmentStatus.lowVenousAlarmTimeoutCtr * QOBJECT_TIMER_TIMEOUT_MS) == TRIG_LOW_VEN_ALARM_TIMEOUT_MS) - { - triggerAnAlarm(ALARM_ID_TD_VENOUS_PRESSURE_LOW); + switch (_treatmentStatus.txPauseSeqAlarmState) { + case SEQ_ALARM_TRIGGER_RPLC_ACID: + if (_treatmentStatus.activeTopAlarm != ALARM_ID_NO_ALARM) { return; } + triggerAnAlarm(ALARM_ID_DD_REPLACE_ACID_CONCENTRATE); + _treatmentStatus.txPauseSeqAlarmState = SEQ_ALARM_TRIGGER_RPLC_BICARB; + break; + + case SEQ_ALARM_TRIGGER_RPLC_BICARB: + if (_treatmentStatus.activeTopAlarm == ALARM_ID_DD_REPLACE_ACID_CONCENTRATE) { return; } + triggerAnAlarm(ALARM_ID_DD_BICARBONATE_CARTRIDGE_LOW_LEVEL); + _treatmentStatus.txPauseSeqAlarmState = SEQ_ALARM_PROCESS_DRAIN_SCREEN; + // Stay in treatment pause since there is a sequence of alarms to trigger next + status = STATE_ON_ACTION; + break; + + case SEQ_ALARM_PROCESS_DRAIN_SCREEN: + // TODO wait for the drain screen message. IMPLEMENT + triggerAnAlarm(ALARM_ID_DD_REPLACE_BICARB_CARTRIDGE); + _treatmentStatus.txPauseSeqAlarmState = SEQ_ALARM_DRY_BICARB_CARTRIDGE; + // Stay in treatment pause since there is a sequence of alarms to trigger next + status = STATE_ON_ACTION; + break; + + case SEQ_ALARM_DRY_BICARB_CARTRIDGE: + if (_treatmentStatus.activeTopAlarm == ALARM_ID_DD_REPLACE_BICARB_CARTRIDGE) { return; } + triggerAnAlarm(ALARM_ID_TD_DIALYSATE_PROPORTIONING_IN_PROGRESS); + _treatmentStatus.triggerAlarmTimeoutCtr = _elapsedTimeCtr; + _treatmentStatus.txPauseSeqAlarmState = SEQ_ALARM_PROPORTIONING_IN_PROG; + // Stay in treatment pause since there is a sequence of alarms to trigger next + status = STATE_ON_ACTION; + break; + + case SEQ_ALARM_PROPORTIONING_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) { + // This alarm is cleared automatically + triggerAnAlarm(ALARM_ID_NO_ALARM); + _treatmentStatus.triggerAlarmTimeoutCtr = _elapsedTimeCtr; + _treatmentStatus.txPauseSeqAlarmState = SEQ_ALARM_LOW_VENOUS; + _treatmentSubStates.dialysisSubState = DIALYSIS_UF_STATE; + _treatmentSubStates.txState = TREAT_DIALYSIS_STATE; + _treatmentStatus.stateTransitionEvent = "T_TP_2_Tx"; + // Done with the acid/bicarb replacement alarms exit treatment pause + status = STATE_ON_EXIT; + } + break; + + case SEQ_ALARM_LOW_VENOUS: + elapsedTimeMS = (_elapsedTimeCtr - _treatmentStatus.triggerAlarmTimeoutCtr) * QOBJECT_TIMER_TIMEOUT_MS; + if (elapsedTimeMS == TRIG_LOW_VEN_ALARM_TIMEOUT_MS) { + triggerAnAlarm(ALARM_ID_TD_VENOUS_PRESSURE_LOW); + _treatmentStatus.triggerAlarmTimeoutCtr = _elapsedTimeCtr; + _treatmentStatus.txPauseSeqAlarmState = SEQ_ALARM_NO_ALARM; + // Done with the sequence of acid/bicarb alarms. Trigger low venous and do not change the state because + // another method in treatment will transition to treatment pause. This alarm triggeres in treament, not treatment pause + } + break; + + case SEQ_ALARM_NO_ALARM: + default: + // Do nothing + break; } } @@ -227,7 +288,7 @@ QString activeState = activeStates[0]; _treatmentStatus.stateTransitionEvent = (activeState == "Treatment_Recirculate" ? "T_RC_2_TE" : "T_RB_2_TE"); status = STATE_ON_EXIT; - qDebug() << "Event" << _treatmentStatus.stateTransitionEvent << _dryDemo.activeStateNames(true); + qDebug() << "Event" << _treatmentStatus.stateTransitionEvent << _dryDemo.activeStateNames(true); // TODO remove } handleSendUIConfirmationMessage(confirmID, cmd); _uiConfirmMessages.remove(confirmID); @@ -264,10 +325,7 @@ resp.append(confirmID); resp.append(confirmCmd); resp.append(rejectReason); - resp.append(0.0); - resp.append(0.0); - resp.append(0.0); - resp.append(0.0); + resp.append(0.0); resp.append(0.0); resp.append(0.0); resp.append(0.0); _isSendListReady = false; _sendMessages.append(resp); _isSendListReady = true;