Index: sources/drydemo/StateControllerStandby.cpp =================================================================== diff -u -rb13dd2b30889640ebf03f54414f536ca5c8d2dc7 -rbf271a558491a83b39eb30748784f1b744736dd2 --- sources/drydemo/StateControllerStandby.cpp (.../StateControllerStandby.cpp) (revision b13dd2b30889640ebf03f54414f536ca5c8d2dc7) +++ sources/drydemo/StateControllerStandby.cpp (.../StateControllerStandby.cpp) (revision bf271a558491a83b39eb30748784f1b744736dd2) @@ -6,7 +6,8 @@ bool StateController::handleDryDemoMenuRequestMessage() { - quint32 msgPayload = extractU32DataFromReceivedMessage(ID_UI_CONFIRMATION_RESULT_RESP, 0); + qint32 index = 0; + quint32 msgPayload = extractU32DataFromReceivedMessage(ID_UI_CONFIRMATION_RESULT_RESP, index); if (msgPayload != UI_MSG_BB_PAYLOAD_ID) { if (msgPayload < NUM_OF_GENERIC_CONFIRM_IDS) { quint32 confirmStatus = extractU32DataFromReceivedMessage(ID_UI_CONFIRMATION_RESULT_RESP, UI_MSG_BB_STATUS_INDEX); @@ -102,24 +103,34 @@ _treatmentStatus.txPauseSeqAlarmState = SEQ_ALARM_NO_ALARM; // Initialize pressure vars _pressureVars.presLimitState = PRESSURE_LIMITS_STATE_OFF; - _pressureVars.presStabilizeTimePeriod = USE_NORMAL_STABILIZATION_PERIOD; + _pressureVars.presStabilizeTimePeriod = USE_NORMAL_STABILIZATION_PERIOD; _pressureVars.arterialIndex = 0; _pressureVars.arterialRunningSumMMHG = 0.0; _pressureVars.arterialMinLimitMMHG = MIN_ART_PRES_LIMIT_MMHG; _pressureVars.arterialMaxLimitMMHG = MAX_ART_PRES_LIMIT_MMHG; + _pressureVars.arterialPresLimitWindowMMHG = static_cast(ART_PRES_LIMIT_WINDOW_MMHG); std::fill(std::begin(_pressureVars.arterialRawMMHG), std::end(_pressureVars.arterialRawMMHG), 0); _pressureVars.venousIndex = 0; _pressureVars.venousRunningSumMMHG = 0.0; _pressureVars.venousMinLimitMMHG = MIN_VEN_PRES_LIMIT_MMHG; _pressureVars.venousMaxLimitMMHG = MAX_VEN_PRES_LIMIT_MMHG; + _pressureVars.venousPresLowLimitWindowMMHG = static_cast(VEN_PRES_LOW_LIMIT_WINDOW_MMHG); + _pressureVars.venousPresHighLimitWindowMMHG = static_cast(VEN_PRES_HIGH_LIMIT_WINDOW_MMHG); std::fill(std::begin(_pressureVars.venousRawMMHG), std::end(_pressureVars.venousRawMMHG), 0); _pressureVars.tmpIndex = 0; _pressureVars.tmpRunningSumMMHG = 0.0; _pressureVars.tmpMinLimitMMHG = MIN_TMP_PRES_LIMIT_MMHG; _pressureVars.tmpMaxLimitMMHG = MAX_TMP_PRES_LIMIT_MMHG; + _pressureVars.tmpPresLimitWindowMMHG = static_cast(TMP_PRES_LIMIT_WINDOW_MMHG); std::fill(std::begin(_pressureVars.tmpRawMMHG), std::end(_pressureVars.tmpRawMMHG), 0); + + _treatmentStatus.bicartAction = DRY_BICART_ACTION_DONE; + _treatmentStatus.bicartDrainInProgress = DRY_BICART_DRIN_IN_PROGRESS; + _treatmentStatus.bicartDepresInProgress = 0; + _treatmentStatus.bicartProgress = 0; + _treatmentStatus.bicartTotal = 100; } void StateController::triggerAnAlarm(Alarm_List alarmID) @@ -213,35 +224,62 @@ 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; + _treatmentStatus.txPauseSeqAlarmState = SEQ_ALARM_PROPORTIONING_ACID_IN_PROG; + _treatmentStatus.bicartAction = DRY_BICART_ACTION_DRAIN; + _treatmentStatus.bicartDrainInProgress = DRY_BICART_DRIN_IN_PROGRESS; break; - case SEQ_ALARM_TRIGGER_RPLC_BICARB: + case SEQ_ALARM_PROPORTIONING_ACID_IN_PROG: if (_treatmentStatus.activeTopAlarm == ALARM_ID_DD_REPLACE_ACID_CONCENTRATE) { return; } + if (_treatmentStatus.activeTopAlarm == ALARM_ID_NO_ALARM) { + _treatmentStatus.triggerAlarmTimeoutCtr = _elapsedTimeCtr; + triggerAnAlarm(ALARM_ID_TD_DIALYSATE_PROPORTIONING_IN_PROGRESS); + } + // 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) { + // Proportioning alarm is cleared automatically + triggerAnAlarm(ALARM_ID_NO_ALARM); + _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_NO_ALARM) { triggerAnAlarm(ALARM_ID_NO_ALARM); return; } triggerAnAlarm(ALARM_ID_DD_BICARBONATE_CARTRIDGE_LOW_LEVEL); - _treatmentStatus.txPauseSeqAlarmState = SEQ_ALARM_PROCESS_DRAIN_SCREEN; + // Set the bicart screen to start draining automatically + _treatmentStatus.bicartDrainInProgress = DRY_BICART_DRIN_IN_PROGRESS; + _treatmentStatus.bicartProgress = 0; + _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; + 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; + if (_treatmentStatus.activeTopAlarm == ALARM_ID_DD_BICARBONATE_CARTRIDGE_LOW_LEVEL) { return; } + handleDryBicartBroadcastData(BC_DELAYED); + handleDryBicartActionRequest(); + if (_treatmentStatus.bicartAction == DRY_BICART_ACTION_DONE) { + triggerAnAlarm(ALARM_ID_DD_REPLACE_BICARB_CARTRIDGE); + _treatmentStatus.txPauseSeqAlarmState = SEQ_ALARM_TRIGGER_RPLC_BICARB; + // 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: + case SEQ_ALARM_TRIGGER_RPLC_BICARB: + // Make sure acid alarm is cleared first if (_treatmentStatus.activeTopAlarm == ALARM_ID_DD_REPLACE_BICARB_CARTRIDGE) { return; } triggerAnAlarm(ALARM_ID_TD_DIALYSATE_PROPORTIONING_IN_PROGRESS); + _treatmentStatus.txPauseSeqAlarmState = SEQ_ALARM_PROPORTIONING_BICARB_IN_PROG; _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: + 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) {