Index: LeahiDryDemoXMLStates.scxml =================================================================== diff -u -r6e845078107f7d15a3e471be421d5bce31fc51da -ra271469db538bfc35eba9a56308760893ecbc68e --- LeahiDryDemoXMLStates.scxml (.../LeahiDryDemoXMLStates.scxml) (revision 6e845078107f7d15a3e471be421d5bce31fc51da) +++ LeahiDryDemoXMLStates.scxml (.../LeahiDryDemoXMLStates.scxml) (revision a271469db538bfc35eba9a56308760893ecbc68e) @@ -13,13 +13,13 @@ - + - + @@ -45,7 +45,7 @@ - + @@ -56,7 +56,7 @@ - + @@ -69,6 +69,9 @@ + + + Index: drydemo.pro =================================================================== diff -u -r6e845078107f7d15a3e471be421d5bce31fc51da -ra271469db538bfc35eba9a56308760893ecbc68e --- drydemo.pro (.../drydemo.pro) (revision 6e845078107f7d15a3e471be421d5bce31fc51da) +++ drydemo.pro (.../drydemo.pro) (revision a271469db538bfc35eba9a56308760893ecbc68e) @@ -101,6 +101,7 @@ sources/ApplicationController.cpp \ \ # ---------- States ---------- sources/drydemo/StateController.cpp \ + sources/drydemo/StateControllerRecirc.cpp \ sources/drydemo/StateControllerRinseback.cpp \ sources/drydemo/StateControllerStandby.cpp \ sources/drydemo/StateControllerTreatment.cpp \ Index: sources/MessageGlobals.h =================================================================== diff -u -r6e845078107f7d15a3e471be421d5bce31fc51da -ra271469db538bfc35eba9a56308760893ecbc68e --- sources/MessageGlobals.h (.../MessageGlobals.h) (revision 6e845078107f7d15a3e471be421d5bce31fc51da) +++ sources/MessageGlobals.h (.../MessageGlobals.h) (revision a271469db538bfc35eba9a56308760893ecbc68e) @@ -183,6 +183,9 @@ ID_TD_ADJUST_START_TREATMENT_RESP = 0xA200, ID_UI_PRESSURE_LIMIT_WIDEN_RQST = 0xA400, ID_TD_PRESSURE_LIMIT_WIDEN_RESP = 0xA500, + ID_UI_RECIRCULATE_RQST = 0xA600, + ID_TD_RECIRCULATE_RESP = 0xA700, + ID_TD_RECIRCULATE_DATA = 0xA800, ID_TD_UI_GENERIC_CONFIRMATION_REQUEST = 0xB500, ID_UI_CONFIRMATION_RESULT_RESP = 0xB600, }; Index: sources/drydemo/DryDemoDefines.h =================================================================== diff -u -r6e845078107f7d15a3e471be421d5bce31fc51da -ra271469db538bfc35eba9a56308760893ecbc68e --- sources/drydemo/DryDemoDefines.h (.../DryDemoDefines.h) (revision 6e845078107f7d15a3e471be421d5bce31fc51da) +++ sources/drydemo/DryDemoDefines.h (.../DryDemoDefines.h) (revision a271469db538bfc35eba9a56308760893ecbc68e) @@ -4,16 +4,18 @@ // General defines #define UI_MSG_BB_STATUS_INDEX 4 #define UI_MSG_BB_PAYLOAD_ID 0x63 +#define UI_CONFIRM_MSG_TIMESTAMP_INDEX 0 +#define UI_CONFIRM_MSG_STATUS_INDEX 1 #define SECONDS_PER_MINUTE 60 #define MINUTES_PER_HOUR 60 #define MILLISECONDS_PER_SECOND 1000 #define MILLILITERS_PER_LITER 1000 #define ACCEPT_VALUE 1 #define REJECT_VALUE 0 #define NEARLY_ZERO 0.00000001 -#define CONFIRM_CMD_ACCEPT_CLOSE 3 // TODo remove #define PASS_RESULT 1 // TODO remove #define DEVICE_ID 1234 +#define UI_CONFIRM_RESP_TIMOUT_MS (SECONDS_PER_MINUTE * MILLISECONDS_PER_SECOND) // Timer event defines #define DEFAULT_TIMEOUT_S 10 @@ -100,6 +102,8 @@ #define RINSEBACK_MAX_RLOW_RATE_MLPM 500 #define RINSEBACK_ADJ_FLOW_RATE_MLPM 10 #define RINSEBACK_BACK_MAX_TIME_MS (5 * SECONDS_PER_MINUTE * MILLISECONDS_PER_SECOND) +#define RINSEBACK_ADDITION_VOL_ML 50 +#define RINSEBACK_MAX_ADDITION_TIME_MS (25 * MILLISECONDS_PER_SECOND) #define RINSEBACK_END_TREATMENT_SIGNAL 999 // TODO remove? // Fluid Bolus defines @@ -175,6 +179,22 @@ REQUESTED_USER_ACTION_RINSEBACK_END_TREATMENT = 7, }; +enum Recirculate_States { + TREATMENT_RECIRC_DISCONNECT_PATIENT_STATE = 0, + TREATMENT_RECIRC_RECIRC_STATE = 1, + TREATMENT_RECIRC_STOPPED_STATE = 2, + TREATMENT_RECIRC_RECONNECT_PATIENT_STATE = 3, +}; + +enum Requested_Treatment_Recirc_User_Actions +{ + REQUESTED_USER_ACTION_TX_RECIRC_RECONNECT = 0, + REQUESTED_USER_ACTION_TX_RECIRC_CONFIRM_RECONNECT = 1, + REQUESTED_USER_ACTION_TX_RECIRC_RESUME_RC = 2, + REQUESTED_USER_ACTION_TX_RECIRC_END_TREATMENT = 3, + REQUESTED_USER_ACTION_TX_RECIRC_CONFIRM_DISCONNECT = 4, +}; + enum State_Status { STATE_ON_ENTRY = 0, STATE_ON_ACTION, @@ -214,6 +234,7 @@ GENERIC_CONFIRM_ID_TREATMENT_END = 2, GENERIC_CONFIRM_ID_RINSEBACK = 3, GENERIC_CONFIRM_ID_TEMPORARY_BREAK = 4, + NUM_OF_GENERIC_CONFIRM_IDS = 5, }; enum Generic_Confirm_Command @@ -245,6 +266,8 @@ REQUEST_REJECT_REASON_UF_NOT_PAUSED = 15, REQUEST_REJECT_REASON_PARAM_OUT_OF_RANGE = 17, REQUEST_REJECT_REASON_ACTION_DISABLED_IN_CURRENT_STATE = 21, + REQUEST_REJECT_REASON_ALARM_IS_ACTIVE = 22, + REQUEST_REJECT_REASON_TREATMENT_IS_COMPLETED = 24, REQUEST_REJECT_REASON_CONFIRMATION_NOT_EXPECTED = 58, REQUEST_REJECT_REASON_CONFIRMATION_MISMATCH = 59, }; Index: sources/drydemo/StateController.cpp =================================================================== diff -u -r6e845078107f7d15a3e471be421d5bce31fc51da -ra271469db538bfc35eba9a56308760893ecbc68e --- sources/drydemo/StateController.cpp (.../StateController.cpp) (revision 6e845078107f7d15a3e471be421d5bce31fc51da) +++ sources/drydemo/StateController.cpp (.../StateController.cpp) (revision a271469db538bfc35eba9a56308760893ecbc68e) @@ -73,6 +73,7 @@ case ID_UI_DURATION_CONFIRM_RQST: case ID_UI_ALARM_USER_ACTION_REQUEST: case ID_UI_RINSEBACK_CMD_RQST: + case ID_UI_RECIRCULATE_RQST: _treatmentRcvdMessages[receivedMsgID] = msg[1]; break; @@ -121,6 +122,8 @@ case ID_TD_RINSEBACK_CMD_RESP: case ID_TD_RINSEBACK_DATA: case ID_TD_UI_GENERIC_CONFIRMATION_REQUEST: + case ID_TD_RECIRCULATE_RESP: + case ID_TD_RECIRCULATE_DATA: // Do nothing break; } @@ -398,6 +401,8 @@ handleTreatmentTimeChangeConfirm(); if ((_treatmentStatus.treatmentElapsedTimeMS / MILLISECONDS_PER_SECOND) > (_treatmentParams.treatmentDurationMin * SECONDS_PER_MINUTE)) { + // Treatment is complete + _treatmentStatus.isTreatmentComplete = true; _treatmentStatus.stateTransitionEvent = "T_Tx_2_TE"; status = STATE_ON_EXIT; } @@ -470,11 +475,11 @@ // Start with UF state in dialysis _treatmentStatus.dialysisSubState = DIALYSIS_UF_PAUSED_STATE; _treatmentStatus.txState = TREAT_RINSEBACK_STATE; - _treatmentStatus.rinsebackStates = RINSEBACK_STOP_INIT_STATE; + _treatmentStatus.rinsebackState = RINSEBACK_STOP_INIT_STATE; handleTDOpModeTransitionBroadcastData(MODE_TREA, 0, BC_IMMEDIATELY); txStates = {TREAT_START_STATE, 0, _treatmentStatus.dialysisSubState, 0, 0, 0, 0, 0, 0, 0}; handleTreatmentStatesBroadcastData(txStates, BC_IMMEDIATELY); - txStates = {_treatmentStatus.txState, 0, _treatmentStatus.dialysisSubState, 0, 0, _treatmentStatus.rinsebackStates, 0, 0, 0, 0}; + txStates = {_treatmentStatus.txState, 0, _treatmentStatus.dialysisSubState, 0, 0, _treatmentStatus.rinsebackState, 0, 0, 0, 0}; initializeRinseback(); handleTreatmentStatesBroadcastData(txStates, BC_IMMEDIATELY); handleRinsebackBroadcastData(BC_IMMEDIATELY); @@ -486,12 +491,17 @@ status = STATE_ON_ACTION; handleBackToStandbyEvent(status); handleTDOpModeTransitionBroadcastData(MODE_TREA, 0, BC_DELAYED); - txStates = {_treatmentStatus.txState, 0, _treatmentStatus.dialysisSubState, 0, 0, _treatmentStatus.rinsebackStates, 0, 0, 0, 0}; + txStates = {_treatmentStatus.txState, 0, _treatmentStatus.dialysisSubState, 0, 0, _treatmentStatus.rinsebackState, 0, 0, 0, 0}; handleTreatmentStatesBroadcastData(txStates, BC_DELAYED); handleRinsebackRequestMessage(); handleRinsebackDelivery(); handleRinsebackBroadcastData(BC_DELAYED); handleTDPressureProcessAndBroadcastData(BC_DELAYED); + handleUIConfirmMessage(GENERIC_CONFIRM_ID_TREATMENT_END, status); + if (_treatmentStatus.hasRecircBeenRequested) { + _treatmentStatus.stateTransitionEvent = "T_RB_2_RC"; + status = STATE_ON_EXIT; + } }; auto onExit = [=](){ @@ -514,26 +524,27 @@ auto onEntry = [=](){ // Start with UF state in dialysis _treatmentStatus.dialysisSubState = DIALYSIS_UF_STATE; - _treatmentStatus.txState = TREAT_DIALYSIS_STATE; + _treatmentStatus.txState = TREAT_RECIRC_STATE; + _treatmentStatus.recircState = TREATMENT_RECIRC_DISCONNECT_PATIENT_STATE; handleTDOpModeTransitionBroadcastData(MODE_TREA, 0, BC_IMMEDIATELY); txStates = {TREAT_START_STATE, 0, _treatmentStatus.dialysisSubState, 0, 0, 0, 0, 0, 0, 0}; handleTreatmentStatesBroadcastData(txStates, BC_IMMEDIATELY); - txStates = {_treatmentStatus.txState, 0, _treatmentStatus.dialysisSubState, 0, 0, 0, 0, 0, 0, 0}; + txStates = {_treatmentStatus.txState, 0, _treatmentStatus.dialysisSubState, 0, 0, 0, _treatmentStatus.recircState, 0, 0, 0}; handleTreatmentStatesBroadcastData(txStates, BC_IMMEDIATELY); status = STATE_ON_ACTION; - qDebug() << "Tx pause on entry"; + qDebug() << "Tx recric on entry"; }; auto onAction = [=](){ status = STATE_ON_ACTION; handleBackToStandbyEvent(status); handleTDOpModeTransitionBroadcastData(MODE_TREA, 0, BC_DELAYED); - txStates = {_treatmentStatus.txState, 0, _treatmentStatus.dialysisSubState, 0, 0, 0, 0, 0, _treatmentStatus.fluidBolusState, 0}; + txStates = {_treatmentStatus.txState, 0, _treatmentStatus.dialysisSubState, 0, 0, 0, _treatmentStatus.recircState, 0, 0, 0}; handleTreatmentStatesBroadcastData(txStates, BC_DELAYED); }; auto onExit = [=](){ - qDebug() << "Tx pasue in exit"; + qDebug() << "Tx recric in exit"; _dryDemo.submitEvent(_treatmentStatus.stateTransitionEvent); status = STATE_ON_ENTRY; }; Index: sources/drydemo/StateController.h =================================================================== diff -u -r6e845078107f7d15a3e471be421d5bce31fc51da -ra271469db538bfc35eba9a56308760893ecbc68e --- sources/drydemo/StateController.h (.../StateController.h) (revision 6e845078107f7d15a3e471be421d5bce31fc51da) +++ sources/drydemo/StateController.h (.../StateController.h) (revision a271469db538bfc35eba9a56308760893ecbc68e) @@ -37,6 +37,7 @@ bool requestTreatmentReset; // Treatment time variable(s) quint32 treatmentElapsedTimeMS; + bool isTreatmentComplete; // Fluid bolus Fluid_Bolus_States fluidBolusState; float accumFluidBolusDeliveredML; @@ -57,12 +58,17 @@ // Alarm variables Alarm_List activeAlarm; // Rinseback variables - Rinseback_States rinsebackStates; + Rinseback_States rinsebackState; quint32 rinsebackFlowMLPM; - float accumRinsebackVolML; - float additionalRinsebackVolML; + float rinsebackAccumVolML; + float rinsebackAdditionalVolML; bool isRinsebackComplete; quint32 rinsebackTimerCounter; + quint32 rinsebackAdditionalTimerCounter; + float rinsebackTgtVolPlusAddVolML; + // Recirculation variables + bool hasRecircBeenRequested; + Recirculate_States recircState; }; struct Treatment_Params { @@ -98,6 +104,7 @@ QList _broadcastMessages; QList _sendMessages; QHash _treatmentRcvdMessages; + QHash _uiConfirmMessages; QRandomGenerator _randNumGenerator; Treatment_Params _treatmentParams; Treatment_Status_Vars _treatmentStatus; @@ -132,6 +139,8 @@ // Standby methods void handleInitiateTreatmentRequestMessage(State_Status &status); + void handleUIConfirmMessage(const Generic_Confirm_Id confirmID, State_Status &status); + bool hasUIConfirmMessageTimedout(const Generic_Confirm_Id confirmID); void handleSendUIConfirmationMessage(const Generic_Confirm_Id confirmID, const Generic_Confirm_Command confirmCmd, const Reject_Reasons rejectReason = REQUEST_REJECT_REASON_NONE); // Blood prime methods @@ -170,6 +179,11 @@ void handleRinsebackDelivery(); void handleRinsebackBroadcastData(const Broadcast_Type BCType); + // Treatment recirculation methods + void initializeRecirc(); + void handleRecircRequestMessage(); + void handleRecircBroadcastData(const Broadcast_Type BCType); + // Treatment end methods }; Index: sources/drydemo/StateControllerRecirc.cpp =================================================================== diff -u --- sources/drydemo/StateControllerRecirc.cpp (revision 0) +++ sources/drydemo/StateControllerRecirc.cpp (revision a271469db538bfc35eba9a56308760893ecbc68e) @@ -0,0 +1,34 @@ + +#include "StateController.h" +#include "ApplicationController.h" +#include "types.h" + +void StateController::initializeRecirc() +{ + +} + +void StateController::handleRecircRequestMessage() +{ + if (_treatmentRcvdMessages[ID_UI_RECIRCULATE_RQST].isNull()) { return; } + QVariantList reason; + quint32 acceptReject = REJECT_VALUE; + //quint32 recircCmd = extractU32DataFromReceivedMessage(ID_UI_RECIRCULATE_RQST, 0); + + if (_treatmentStatus.activeAlarm != ALARM_ID_NO_ALARM) { + reason.append(REQUEST_REJECT_REASON_ALARM_IS_ACTIVE); + handleUIResponseMessage(ID_TD_RECIRCULATE_RESP, acceptReject, reason); + _treatmentRcvdMessages[ID_UI_RECIRCULATE_RQST].clear(); + return; + } + + handleUIResponseMessage(ID_TD_RECIRCULATE_RESP, acceptReject, reason); + _treatmentRcvdMessages[ID_UI_RECIRCULATE_RQST].clear(); +} + +void StateController::handleRecircBroadcastData(const Broadcast_Type BCType) +{ + static quint32 broadcastCounter = 52; + if ((++broadcastCounter % NUM_OF_COUNTS_TIMER_BC_EMIT != 0) && (BCType == BC_DELAYED)) { return; } + +} 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); Index: sources/drydemo/StateControllerStandby.cpp =================================================================== diff -u -r6e845078107f7d15a3e471be421d5bce31fc51da -ra271469db538bfc35eba9a56308760893ecbc68e --- sources/drydemo/StateControllerStandby.cpp (.../StateControllerStandby.cpp) (revision 6e845078107f7d15a3e471be421d5bce31fc51da) +++ sources/drydemo/StateControllerStandby.cpp (.../StateControllerStandby.cpp) (revision a271469db538bfc35eba9a56308760893ecbc68e) @@ -1,3 +1,4 @@ +#include #include "StateController.h" #include "ApplicationController.h" @@ -6,7 +7,15 @@ bool StateController::handleDryDemoMenuRequestMessage() { quint32 msgPayload = extractU32DataFromReceivedMessage(ID_UI_CONFIRMATION_RESULT_RESP, 0); - if (msgPayload != UI_MSG_BB_PAYLOAD_ID) { return false; } + 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); + qint64 currentTimeMS = QDateTime::currentMSecsSinceEpoch(); + _uiConfirmMessages[static_cast(msgPayload)] = {currentTimeMS, static_cast(confirmStatus)}; + _treatmentRcvdMessages[ID_UI_CONFIRMATION_RESULT_RESP].clear(); + } + return false; + } msgPayload = extractU32DataFromReceivedMessage(ID_UI_CONFIRMATION_RESULT_RESP, UI_MSG_BB_STATUS_INDEX); _treatmentStatus.userCmd = static_cast(msgPayload); @@ -63,14 +72,16 @@ { _treatmentStatus.hasTxParamsBeenInitialized = false; _treatmentStatus.requestTreatmentReset = true; + _treatmentStatus.isTreatmentComplete = false; _treatmentStatus.treatmentElapsedTimeMS = DEF_TX_ELAPSED_TIME_S * MILLISECONDS_PER_SECOND; _treatmentStatus.stateTransitionEvent = ""; _treatmentStatus.totalFluidBolusDeliveredML = 0.0; _treatmentStatus.accumFluidBolusDeliveredML = 0.0; _treatmentStatus.fluidBolusState = FLUID_BOLUS_IDLE_STATE; _treatmentStatus.txState = TREAT_START_STATE; - _treatmentStatus.rinsebackStates = RINSEBACK_STOP_INIT_STATE; + _treatmentStatus.rinsebackState = RINSEBACK_STOP_INIT_STATE; _treatmentStatus.ufVolDeliveredL = 0.0; + _treatmentStatus.hasRecircBeenRequested = false; } void StateController::triggerAnAlarm(Alarm_List alarmID) @@ -116,6 +127,10 @@ case ALARM_USER_ACTION_END_TREATMENT: _treatmentStatus.stateTransitionEvent = "T_TP_2_TE"; break; + + default: + // Do nothing + break; } // User action has been selected so do not stay in treatment pause @@ -134,6 +149,45 @@ _treatmentRcvdMessages[ID_UI_ALARM_USER_ACTION_REQUEST].clear(); } +void StateController::handleUIConfirmMessage(const Generic_Confirm_Id confirmID, State_Status &status) +{ + if (!_uiConfirmMessages.contains(confirmID)) { return; } + + Generic_Confirm_Command cmd = (hasUIConfirmMessageTimedout(confirmID) ? GENERIC_CONFIRM_CMD_TIMEOUT_CLOSE : GENERIC_CONFIRM_CMD_ACCEPT_CLOSE); + + switch (confirmID) { + case GENERIC_CONFIRM_ID_TREATMENT_END: + if (_uiConfirmMessages[confirmID][UI_CONFIRM_MSG_STATUS_INDEX].toUInt() == CONFIRMATION_REQUEST_STATUS_ACCEPTED) { + _treatmentStatus.stateTransitionEvent = "T_RB_2_TE"; + status = STATE_ON_EXIT; + } + handleSendUIConfirmationMessage(confirmID, cmd); + _uiConfirmMessages.remove(confirmID); + break; + + case GENERIC_CONFIRM_ID_RINSEBACK: + break; + + case GENERIC_CONFIRM_ID_TEMPORARY_BREAK: + break; + + default: + case GENERIC_CONFIRM_ID_NONE: + case GENERIC_CONFIRM_ID_SHUT_DOWN: + // Do nothing + break; + } +} + +bool StateController::hasUIConfirmMessageTimedout(const Generic_Confirm_Id confirmID) +{ + qint64 currentTimeMS = QDateTime::currentMSecsSinceEpoch(); + qint64 startTimeMS = _uiConfirmMessages[confirmID][UI_CONFIRM_MSG_TIMESTAMP_INDEX].toInt(); + bool status = (currentTimeMS - startTimeMS > UI_CONFIRM_RESP_TIMOUT_MS ? true : false); + + return status; +} + void StateController::handleSendUIConfirmationMessage(const Generic_Confirm_Id confirmID, const Generic_Confirm_Command confirmCmd, const Reject_Reasons rejectReason) { QVariantList resp;