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;