Index: sources/drydemo/StateControllerRinseback.cpp =================================================================== diff -u -r6e845078107f7d15a3e471be421d5bce31fc51da -ra271469db538bfc35eba9a56308760893ecbc68e --- sources/drydemo/StateControllerRinseback.cpp (.../StateControllerRinseback.cpp) (revision 6e845078107f7d15a3e471be421d5bce31fc51da) +++ sources/drydemo/StateControllerRinseback.cpp (.../StateControllerRinseback.cpp) (revision a271469db538bfc35eba9a56308760893ecbc68e) @@ -6,33 +6,41 @@ void StateController::initializeRinseback() { - _treatmentStatus.rinsebackFlowMLPM = DEF_TX_PARAM_RINSEBACK_FLOW_RATE_MLPM; - _treatmentStatus.accumFluidBolusDeliveredML = 0.0; - _treatmentStatus.additionalRinsebackVolML = _treatmentParams.rinsebackVolumeML; - _treatmentStatus.isRinsebackComplete = false; - _treatmentStatus.rinsebackTimerCounter = 0; + _treatmentStatus.rinsebackFlowMLPM = DEF_TX_PARAM_RINSEBACK_FLOW_RATE_MLPM; + _treatmentStatus.rinsebackAccumVolML = 0.0; + _treatmentStatus.rinsebackAdditionalVolML = _treatmentParams.rinsebackVolumeML; + _treatmentStatus.isRinsebackComplete = false; + _treatmentStatus.rinsebackTimerCounter = 0; + _treatmentStatus.rinsebackAdditionalTimerCounter = 0; + _treatmentStatus.rinsebackTgtVolPlusAddVolML = _treatmentParams.rinsebackVolumeML; } void StateController::handleRinsebackRequestMessage() { - // TODO should we check if an alarm is active? if (_treatmentRcvdMessages[ID_UI_RINSEBACK_CMD_RQST].isNull()) { return; } QVariantList reason; quint32 acceptReject = REJECT_VALUE; quint32 rinsebackCmd = extractU32DataFromReceivedMessage(ID_UI_RINSEBACK_CMD_RQST, 0); + if (_treatmentStatus.activeAlarm != ALARM_ID_NO_ALARM) { + reason.append(REQUEST_REJECT_REASON_ALARM_IS_ACTIVE); + handleUIResponseMessage(ID_TD_RINSEBACK_CMD_RESP, acceptReject, reason); + _treatmentRcvdMessages[ID_UI_RINSEBACK_CMD_RQST].clear(); + return; + } + switch (rinsebackCmd) { case REQUESTED_USER_ACTION_RINSEBACK_CONFIRM_START: - if (_treatmentStatus.rinsebackStates == RINSEBACK_STOP_INIT_STATE) { + if (_treatmentStatus.rinsebackState == RINSEBACK_STOP_INIT_STATE) { acceptReject = ACCEPT_VALUE; - _treatmentStatus.rinsebackStates = RINSEBACK_RUN_STATE; + _treatmentStatus.rinsebackState = RINSEBACK_RUN_STATE; } else { reason.append(REQUEST_REJECT_REASON_ACTION_DISABLED_IN_CURRENT_STATE); } break; case REQUESTED_USER_ACTION_RINSEBACK_INCREASE_RATE: if ((_treatmentStatus.rinsebackFlowMLPM + RINSEBACK_ADJ_FLOW_RATE_MLPM) <= RINSEBACK_MAX_RLOW_RATE_MLPM) { - if (_treatmentStatus.rinsebackStates == RINSEBACK_RUN_STATE) { + if (_treatmentStatus.rinsebackState == RINSEBACK_RUN_STATE) { acceptReject = ACCEPT_VALUE; _treatmentStatus.rinsebackFlowMLPM += RINSEBACK_ADJ_FLOW_RATE_MLPM; } @@ -43,7 +51,7 @@ case REQUESTED_USER_ACTION_RINSEBACK_DECREASE_RATE: if ((_treatmentStatus.rinsebackFlowMLPM - RINSEBACK_ADJ_FLOW_RATE_MLPM) >= RINSEBACK_MIN_FLOW_RATE_MLPM) { - if (_treatmentStatus.rinsebackStates == RINSEBACK_RUN_STATE) { + if (_treatmentStatus.rinsebackState == RINSEBACK_RUN_STATE) { acceptReject = ACCEPT_VALUE; _treatmentStatus.rinsebackFlowMLPM -= RINSEBACK_ADJ_FLOW_RATE_MLPM; } @@ -53,30 +61,49 @@ break; case REQUESTED_USER_ACTION_RINSEBACK_PAUSE: - if (_treatmentStatus.rinsebackStates == RINSEBACK_RUN_STATE) { - acceptReject = ACCEPT_VALUE; - _treatmentStatus.rinsebackStates = RINSEBACK_PAUSED_STATE; + if (_treatmentStatus.rinsebackState == RINSEBACK_RUN_STATE) { + acceptReject = ACCEPT_VALUE; + _treatmentStatus.rinsebackState = RINSEBACK_PAUSED_STATE; } else { reason.append(REQUEST_REJECT_REASON_ACTION_DISABLED_IN_CURRENT_STATE); } break; case REQUESTED_USER_ACTION_RINSEBACK_RESUME: - if (_treatmentStatus.rinsebackStates == RINSEBACK_PAUSED_STATE) { - acceptReject = ACCEPT_VALUE; - _treatmentStatus.rinsebackStates = RINSEBACK_RUN_STATE; + if (_treatmentStatus.rinsebackState == RINSEBACK_PAUSED_STATE) { + acceptReject = ACCEPT_VALUE; + _treatmentStatus.rinsebackState = RINSEBACK_RUN_STATE; } else { reason.append(REQUEST_REJECT_REASON_ACTION_DISABLED_IN_CURRENT_STATE); } break; case REQUESTED_USER_ACTION_RINSEBACK_ADDITIONAL: + if (_treatmentStatus.rinsebackState == RINSEBACK_STOP_STATE) { + acceptReject = ACCEPT_VALUE; + _treatmentStatus.rinsebackState = RINSEBACK_RUN_ADDITIONAL_STATE; + } + else { reason.append(REQUEST_REJECT_REASON_ACTION_DISABLED_IN_CURRENT_STATE); } break; case REQUESTED_USER_ACTION_RINSEBACK_CONFIRM_RECIRCULATE: + if(_treatmentStatus.isTreatmentComplete) { + reason.append(REQUEST_REJECT_REASON_TREATMENT_IS_COMPLETED); + } + else if (_treatmentStatus.rinsebackState != RINSEBACK_STOP_STATE) { + reason.append(REQUEST_REJECT_REASON_ACTION_DISABLED_IN_CURRENT_STATE); + } + // TODO implement recirc allowed too + else { + _treatmentStatus.hasRecircBeenRequested = true; + } break; case REQUESTED_USER_ACTION_RINSEBACK_END_TREATMENT: handleSendUIConfirmationMessage(GENERIC_CONFIRM_ID_TREATMENT_END, GENERIC_CONFIRM_CMD_REQUEST_OPEN); break; + + default: + // Do nothing + break; } handleUIResponseMessage(ID_TD_RINSEBACK_CMD_RESP, acceptReject, reason); @@ -87,13 +114,44 @@ { _treatmentStatus.rinsebackTimerCounter++; - if (_treatmentStatus.rinsebackStates == RINSEBACK_RUN_STATE) { - _treatmentStatus.accumRinsebackVolML += _treatmentStatus.rinsebackFlowMLPM * RINSEBACK_FLOW_INTEGRATOR; - } + // TODO should we alarm if we timedout? - if (_treatmentStatus.accumRinsebackVolML >= _treatmentParams.rinsebackVolumeML) { - _treatmentStatus.rinsebackStates = RINSEBACK_STOP_STATE; - _treatmentStatus.additionalRinsebackVolML = _treatmentStatus.accumRinsebackVolML; + switch (_treatmentStatus.rinsebackState) { + case RINSEBACK_RUN_STATE: + _treatmentStatus.rinsebackAccumVolML += _treatmentStatus.rinsebackFlowMLPM * RINSEBACK_FLOW_INTEGRATOR; + _treatmentStatus.rinsebackTimerCounter = 0; + if (_treatmentStatus.rinsebackAccumVolML >= _treatmentParams.rinsebackVolumeML) { + _treatmentStatus.rinsebackState = RINSEBACK_STOP_STATE; + _treatmentStatus.rinsebackTgtVolPlusAddVolML = _treatmentStatus.rinsebackAccumVolML; + } + break; + + case RINSEBACK_STOP_STATE: + if ((_treatmentStatus.rinsebackTimerCounter * QOBJECT_TIMER_TIMEOUT_MS < RINSEBACK_BACK_MAX_TIME_MS) || + (_treatmentStatus.rinsebackAccumVolML >= _treatmentParams.rinsebackVolumeML)) { + _treatmentStatus.rinsebackAdditionalTimerCounter = 0; + _treatmentStatus.rinsebackAdditionalVolML = 0.0; + _treatmentStatus.rinsebackTgtVolPlusAddVolML += RINSEBACK_ADDITION_VOL_ML; + } + break; + + case RINSEBACK_RUN_ADDITIONAL_STATE: + _treatmentStatus.rinsebackAdditionalTimerCounter++; + _treatmentStatus.rinsebackTimerCounter = 0; + _treatmentStatus.rinsebackAccumVolML += _treatmentStatus.rinsebackFlowMLPM * RINSEBACK_FLOW_INTEGRATOR; + _treatmentStatus.rinsebackAdditionalVolML += _treatmentStatus.rinsebackFlowMLPM * RINSEBACK_FLOW_INTEGRATOR; + if (_treatmentStatus.rinsebackAdditionalVolML >= RINSEBACK_ADDITION_VOL_ML) { + _treatmentStatus.rinsebackState = RINSEBACK_STOP_STATE; + } + // TODO add alarm? + if (_treatmentStatus.rinsebackAdditionalTimerCounter * QOBJECT_TIMER_TIMEOUT_MS > RINSEBACK_MAX_ADDITION_TIME_MS) { + _treatmentStatus.rinsebackState = RINSEBACK_STOP_STATE; + } + break; + + default: + // Do nothing + break; } } @@ -104,7 +162,7 @@ quint32 rinsebackTimeoutS = RINSEBACK_BACK_MAX_TIME_MS / MILLISECONDS_PER_SECOND; quint32 rinsebackTimerCounterMS = _treatmentStatus.rinsebackTimerCounter * QOBJECT_TIMER_TIMEOUT_MS; - quint32 countdownS = ( rinsebackTimerCounterMS <= RINSEBACK_BACK_MAX_TIME_MS ? RINSEBACK_BACK_MAX_TIME_MS - rinsebackTimerCounterMS : 0) / MILLISECONDS_PER_SECOND; + quint32 countdownS = (rinsebackTimerCounterMS <= RINSEBACK_BACK_MAX_TIME_MS ? RINSEBACK_BACK_MAX_TIME_MS - rinsebackTimerCounterMS : 0) / MILLISECONDS_PER_SECOND; bool isRecircAllowed = true; if (_treatmentStatus.isRinsebackComplete || (_treatmentStatus.rinsebackTimerCounter == 0)) { @@ -115,8 +173,8 @@ QVariantList msg; msg.append(static_cast(ID_TD_RINSEBACK_DATA)); msg.append(Can_Id::eChlid_TD_Sync); - msg.append(_treatmentStatus.additionalRinsebackVolML); - msg.append(_treatmentStatus.accumRinsebackVolML); + msg.append(_treatmentStatus.rinsebackAdditionalVolML); + msg.append(_treatmentStatus.rinsebackAccumVolML); msg.append(_treatmentStatus.rinsebackFlowMLPM); msg.append(rinsebackTimeoutS); msg.append(countdownS);