Index: LeahiDryDemoXMLStates.scxml
===================================================================
diff -u -ra271469db538bfc35eba9a56308760893ecbc68e -rfb3e70cb47f3d22f31f68358c1bda69cce9cd248
--- LeahiDryDemoXMLStates.scxml (.../LeahiDryDemoXMLStates.scxml) (revision a271469db538bfc35eba9a56308760893ecbc68e)
+++ LeahiDryDemoXMLStates.scxml (.../LeahiDryDemoXMLStates.scxml) (revision fb3e70cb47f3d22f31f68358c1bda69cce9cd248)
@@ -13,7 +13,7 @@
-
+
@@ -45,7 +45,7 @@
-
+
@@ -79,6 +79,9 @@
+
+
+
Index: sources/drydemo/DryDemoDefines.h
===================================================================
diff -u -rbb80bbccaf1c911be48493868c18c656d84b2ec1 -rfb3e70cb47f3d22f31f68358c1bda69cce9cd248
--- sources/drydemo/DryDemoDefines.h (.../DryDemoDefines.h) (revision bb80bbccaf1c911be48493868c18c656d84b2ec1)
+++ sources/drydemo/DryDemoDefines.h (.../DryDemoDefines.h) (revision fb3e70cb47f3d22f31f68358c1bda69cce9cd248)
@@ -21,7 +21,7 @@
#define DEFAULT_TIMEOUT_S 10
#define QOBJECT_TIMER_TIMEOUT_MS 100
#define PROGRESS_TIME_BC_INTERVAL_MS 1000
-#define PRORGESS_TIME_BC_QART_INT_MS 250
+#define PRORGESS_TIME_BC_QART_INT_MS 300
#define NUM_OF_COUNTS_TIMER_BC_EMIT (PROGRESS_TIME_BC_INTERVAL_MS / QOBJECT_TIMER_TIMEOUT_MS)
#define NUN_OF_COUNTS_QART_BC_EMIT (PRORGESS_TIME_BC_QART_INT_MS / QOBJECT_TIMER_TIMEOUT_MS)
#define NUM_OF_COUNTS_TIMER_2_CONTROL (PROGRESS_TIME_BC_INTERVAL_MS / QOBJECT_TIMER_TIMEOUT_MS)
@@ -108,11 +108,18 @@
#define FLUID_BOLUS_START_CMD 1
#define ENABLE_BOLUS 1
+// Recirc defines
+#define RECIRC_TIMEOUT_MIN 30
+#define RECIRC_WARN_BEFORE_TIMEOUT_MIN 10
+
// Alarms
#define ALARM_TABLE_PRIORITY_INDEX 0
#define ALARM_TABLE_PROPERTIES_INDEX 1
#define ALARM_NO_ALARM_PROPERTIES 0
#define ALARM_STOP_TX_PROPERTIES 6
+#define ALARM_REPLACE_ACID_PROPERTIES 112
+#define ALARM_RECIRC_WARN_PROPERTIES 112
+#define ALARM_RECIR_TIMEOUT_RPOPERTIES 26
enum User_Command_ID {
CMD_NONE = -1,
@@ -144,8 +151,7 @@
TREAT_DIALYSIS_PAUSED_STATE = 9,
};
-enum Blood_Prime_States
-{
+enum Blood_Prime_States {
BLOOD_PRIME_RAMP_STATE = 0,
BLOOD_PRIME_RUN_STATE = 1,
BLOOD_PRIME_PAUSED_STATE = 2,
@@ -173,8 +179,7 @@
RINSEBACK_RUN_ADDITIONAL_STATE = 4,
};
-enum Requested_Rinseback_User_Actions
-{
+enum Requested_Rinseback_User_Actions {
REQUESTED_USER_ACTION_RINSEBACK_CONFIRM_START = 0,
REQUESTED_USER_ACTION_RINSEBACK_INCREASE_RATE = 1,
REQUESTED_USER_ACTION_RINSEBACK_DECREASE_RATE = 2,
@@ -192,15 +197,20 @@
TREATMENT_RECIRC_RECONNECT_PATIENT_STATE = 3,
};
-enum Requested_Treatment_Recirc_User_Actions
-{
+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 Treatment_End_States {
+ TREATMENT_END_WAIT_FOR_RINSEBACK_STATE = 0,
+ TREATMENT_END_PAUSED_STATE = 1,
+ TREATMENT_END_FLUID_BOLUS_STATE = 2,
+};
+
enum State_Status {
STATE_ON_ENTRY = 0,
STATE_ON_ACTION,
@@ -230,11 +240,13 @@
enum Alarm_List {
ALARM_ID_NO_ALARM = 0,
+ ALARM_ID_TD_REPLACE_ACID_JUG = 88,
ALARM_ID_TD_TREATMENT_STOPPED_BY_USER = 96,
+ ALARM_ID_TD_RECIRC_TIMEOUT_WARNING = 199,
+ ALARM_ID_TD_RECIRC_TIMEOUT = 200,
};
-enum Generic_Confirm_Id
-{
+enum Generic_Confirm_Id {
GENERIC_CONFIRM_ID_NONE = 0,
GENERIC_CONFIRM_ID_SHUT_DOWN = 1,
GENERIC_CONFIRM_ID_TREATMENT_END = 2,
@@ -243,16 +255,14 @@
NUM_OF_GENERIC_CONFIRM_IDS = 5,
};
-enum Generic_Confirm_Command
-{
+enum Generic_Confirm_Command {
GENERIC_CONFIRM_CMD_REQUEST_OPEN = 0,
GENERIC_CONFIRM_CMD_TIMEOUT_CLOSE = 1,
GENERIC_CONFIRM_CMD_REJECT = 2,
GENERIC_CONFIRM_CMD_ACCEPT_CLOSE = 3,
};
-enum Confirmation_Status
-{
+enum Confirmation_Status {
CONFIRMATION_REQUEST_STATUS_REJECTED = 0,
CONFIRMATION_REQUEST_STATUS_ACCEPTED,
CONFIRMATION_REQUEST_STATUS_TIMEOUT,
Index: sources/drydemo/StateController.cpp
===================================================================
diff -u -rbb80bbccaf1c911be48493868c18c656d84b2ec1 -rfb3e70cb47f3d22f31f68358c1bda69cce9cd248
--- sources/drydemo/StateController.cpp (.../StateController.cpp) (revision bb80bbccaf1c911be48493868c18c656d84b2ec1)
+++ sources/drydemo/StateController.cpp (.../StateController.cpp) (revision fb3e70cb47f3d22f31f68358c1bda69cce9cd248)
@@ -39,10 +39,11 @@
_transitionEventsFromStandby[CMD_END_TX ] = {"T_SB_2_TE" , static_cast(MODE_TREA)};
// Alarms specs and properties
- _alarmTriggerSpecs[ALARM_ID_NO_ALARM ] = {ALARM_PRIORITY_NONE, ALARM_NO_ALARM_PROPERTIES};
- _alarmTriggerSpecs[ALARM_ID_TD_TREATMENT_STOPPED_BY_USER ] = {ALARM_PRIORITY_HIGH, ALARM_STOP_TX_PROPERTIES};
-
- //connect(&_dryDemo, &QScxmlStateMachine::runningChanged, this, &StateController::onBackToStanbyEvent); // TODO remove
+ _alarmTriggerSpecs[ALARM_ID_NO_ALARM ] = {ALARM_PRIORITY_NONE, ALARM_NO_ALARM_PROPERTIES };
+ _alarmTriggerSpecs[ALARM_ID_TD_REPLACE_ACID_JUG ] = {ALARM_PRIORITY_HIGH, ALARM_REPLACE_ACID_PROPERTIES };
+ _alarmTriggerSpecs[ALARM_ID_TD_TREATMENT_STOPPED_BY_USER ] = {ALARM_PRIORITY_HIGH, ALARM_STOP_TX_PROPERTIES };
+ _alarmTriggerSpecs[ALARM_ID_TD_RECIRC_TIMEOUT_WARNING ] = {ALARM_PRIORITY_LOW, ALARM_RECIRC_WARN_PROPERTIES };
+ _alarmTriggerSpecs[ALARM_ID_TD_RECIRC_TIMEOUT ] = {ALARM_PRIORITY_HIGH, ALARM_RECIR_TIMEOUT_RPOPERTIES };
}
void StateController::quit()
@@ -138,13 +139,6 @@
if (_isBroadcastListReady){ sendMessages(true); }
if (_isSendListReady){ sendMessages(false); }
-
- //if (! _treatmentRcvdMessages[ID_UI_CONFIRMATION_RESULT_RESP].isNull()){
- // // Check for the user request message from the dry-deme menu
- // handleDryDemoMenuRequestMessage();
- //}
-
- //qDebug() << "Active State" << _dryDemo.activeStateNames();
}
// ---------------------- Private methods ------------------ //
@@ -271,8 +265,8 @@
currBloodFlowMLPM = BLOOD_PRIME_START_FLOW_MLPM;
resume = true;
hasFlowChngeRequested = false;
- _treatmentSubStates.bloodPrimeStates = BLOOD_PRIME_RAMP_STATE;
- _treatmentSubStates.txStates = TREAT_BLOOD_PRIME_STATE;
+ _treatmentSubStates.bloodPrimeState = BLOOD_PRIME_RAMP_STATE;
+ _treatmentSubStates.txState = TREAT_BLOOD_PRIME_STATE;
handleTreatmentStatesBroadcastData(BC_IMMEDIATELY);
rampStepML = getBloodPrimeRampStepML();
status = STATE_ON_ACTION;
@@ -281,7 +275,6 @@
auto onAction = [=](){
status = STATE_ON_ACTION;
- //txStates = {TREAT_BLOOD_PRIME_STATE, pauseResumeState, 0, 0, 0, 0, 0, 0, _treatmentSubStates.fluidBolusState, 0};
handleTreatmentStatesBroadcastData(BC_DELAYED);
handleBackToStandbyEvent(status);
@@ -291,7 +284,7 @@
quint32 resumeStatus = extractU32DataFromReceivedMessage(ID_UI_BLOOD_PRIME_CMD_RQST, 0);
resume = (resumeStatus == BLOOD_PRIME_RESUME ? true : false);
- _treatmentSubStates.bloodPrimeStates = (resumeStatus == BLOOD_PRIME_RESUME ? BLOOD_PRIME_RUN_STATE : BLOOD_PRIME_PAUSED_STATE);
+ _treatmentSubStates.bloodPrimeState = (resumeStatus == BLOOD_PRIME_RESUME ? BLOOD_PRIME_RUN_STATE : BLOOD_PRIME_PAUSED_STATE);
// Send the results immediately
handleTreatmentStatesBroadcastData(BC_IMMEDIATELY);
_treatmentRcvdMessages[ID_UI_BLOOD_PRIME_CMD_RQST].clear();
@@ -317,6 +310,7 @@
status = STATE_ON_EXIT;
// Send the final volume value prior to trnasiotining to treatment
handleBloodPrimeBroadcastData(accumBloodVolML, 0, 0, BC_IMMEDIATELY);
+ qDebug() << "Vol" << accumBloodVolML;
}
};
@@ -338,21 +332,21 @@
static State_Status status = STATE_ON_ENTRY;
static bool hasFlowChngeRequested = false;
- if (_treatmentStatus.requestTreatmentReset) { status = STATE_ON_ENTRY; _treatmentStatus.requestTreatmentReset = false; }
+ //if (_treatmentStatus.requestTreatmentReset) { status = STATE_ON_ENTRY; _treatmentStatus.requestTreatmentReset = false; }
auto onEntry = [=](){
hasFlowChngeRequested = false;
// Start with UF state in dialysis
_treatmentSubStates.dialysisSubState = DIALYSIS_UF_STATE;
- _treatmentSubStates.txStates = TREAT_DIALYSIS_STATE;
+ _treatmentSubStates.txState = TREAT_DIALYSIS_STATE;
handleTDOpModeTransitionBroadcastData(MODE_TREA, 0, BC_IMMEDIATELY);
handleTreatmentStatesBroadcastData(BC_IMMEDIATELY);
handleTreatmentSetpointsBroadcastData(_treatmentParams.bloodFlowRateMLPM, _treatmentParams.dialysateFlowRateMLPM,
_treatmentParams.dialysateTemperatureC, BC_IMMEDIATELY);
handleDDConductivityBroadcastData(BC_IMMEDIATELY);
handleTreatmentTimeProcessAndBroadcastData(BC_IMMEDIATELY);
handleDDGenDialysateModeBroadcastData(BC_IMMEDIATELY);
- initializeTreatmentTimeAndUltrafiltration();
+ if (_treatmentStatus.requestTreatmentReset) { initializeTreatmentTimeAndUltrafiltration(); }
handleTreatmentSettingBroadcastData(BC_IMMEDIATELY);
status = STATE_ON_ACTION;
qDebug() << "Tx on entry";
@@ -400,9 +394,9 @@
qDebug() << "Tx in exit";
status = STATE_ON_ENTRY;
if (_treatmentStatus.userCmd == CMD_END_TX) {
- _treatmentStatus.stateTransitionEvent = "T_Tx_2_TP";
- status = STATE_ON_ACTION;
- _treatmentStatus.userCmd = CMD_NONE;
+ _treatmentStatus.stateTransitionEvent = "T_Tx_2_TP";
+ _treatmentStatus.requestTreatmentReset = false;
+ _treatmentStatus.userCmd = CMD_NONE;
}
_dryDemo.submitEvent(_treatmentStatus.stateTransitionEvent);
};
@@ -417,13 +411,12 @@
void StateController::onTreatmentPauseStateChange(bool active)
{
static State_Status status = STATE_ON_ENTRY;
- //static QList txStates;
auto onEntry = [=](){
triggerAnAlarm(ALARM_ID_TD_TREATMENT_STOPPED_BY_USER);
// Start with UF state in dialysis
_treatmentSubStates.dialysisSubState = DIALYSIS_UF_PAUSED_STATE;
- _treatmentSubStates.txStates = TREAT_PAUSED_STATE;
+ _treatmentSubStates.txState = TREAT_PAUSED_STATE;
handleTDOpModeTransitionBroadcastData(MODE_TREA, 0, BC_IMMEDIATELY);
handleTreatmentStatesBroadcastData(BC_IMMEDIATELY);
status = STATE_ON_ACTION;
@@ -433,7 +426,7 @@
auto onAction = [=](){
status = STATE_ON_ACTION;
handleBackToStandbyEvent(status);
- handleAlarmUserAction(status);
+ handleAlarmUserAction(status, true);
handleTDOpModeTransitionBroadcastData(MODE_TREA, 0, BC_DELAYED);
handleTreatmentStatesBroadcastData(BC_DELAYED);
};
@@ -457,8 +450,8 @@
auto onEntry = [=](){
// Start with UF state in dialysis
_treatmentSubStates.dialysisSubState = DIALYSIS_UF_PAUSED_STATE;
- _treatmentSubStates.txStates = TREAT_RINSEBACK_STATE;
- _treatmentSubStates.rinsebackState = RINSEBACK_STOP_INIT_STATE;
+ _treatmentSubStates.txState = TREAT_RINSEBACK_STATE;
+ _treatmentSubStates.rinsebackState = RINSEBACK_STOP_INIT_STATE;
handleTDOpModeTransitionBroadcastData(MODE_TREA, 0, BC_IMMEDIATELY);
initializeRinseback();
handleTreatmentStatesBroadcastData(BC_IMMEDIATELY);
@@ -495,26 +488,41 @@
case STATE_ON_EXIT : if (active) onExit (); break;
}
}
+
void StateController::onTreatmentRecriculateStateChange(bool active)
{
static State_Status status = STATE_ON_ENTRY;
auto onEntry = [=](){
- // Start with UF state in dialysis
- _treatmentSubStates.dialysisSubState = DIALYSIS_UF_STATE;
- _treatmentSubStates.txStates = TREAT_RECIRC_STATE;
- _treatmentSubStates.recircState = TREATMENT_RECIRC_DISCONNECT_PATIENT_STATE;
+ _treatmentSubStates.txState = TREAT_START_STATE;
+ handleTreatmentStatesBroadcastData(BC_IMMEDIATELY);
+ _treatmentSubStates.txState = TREAT_RECIRC_STATE;
+ _treatmentSubStates.recircState = TREATMENT_RECIRC_DISCONNECT_PATIENT_STATE;
+ initializeRecirc();
handleTDOpModeTransitionBroadcastData(MODE_TREA, 0, BC_IMMEDIATELY);
handleTreatmentStatesBroadcastData(BC_IMMEDIATELY);
+ handleRecircBroadcastData(BC_IMMEDIATELY);
status = STATE_ON_ACTION;
qDebug() << "Tx recirc on entry";
};
auto onAction = [=](){
status = STATE_ON_ACTION;
+ _treatmentStatus.recircTimerCounter++;
handleBackToStandbyEvent(status);
handleTDOpModeTransitionBroadcastData(MODE_TREA, 0, BC_DELAYED);
+ handleRecircRequestMessage();
handleTreatmentStatesBroadcastData(BC_DELAYED);
+ handleRecircBroadcastData(BC_DELAYED);
+ handleTreatmentSetpointsBroadcastData(_treatmentParams.bloodFlowRateMLPM, _treatmentParams.dialysateFlowRateMLPM,
+ _treatmentParams.dialysateTemperatureC, BC_DELAYED);
+ handleUIConfirmMessage(GENERIC_CONFIRM_ID_TREATMENT_END, status);
+ handleRecircTimeout();
+ handleAlarmUserAction(status);
+ if (_treatmentStatus.hasResumeTxBeenRequested) {
+ _treatmentStatus.stateTransitionEvent = "T_RC_2_BP";
+ status = STATE_ON_EXIT;
+ }
};
auto onExit = [=](){
@@ -535,6 +543,9 @@
static State_Status status = STATE_ON_ENTRY;
auto onEntry = [=](){
+ _treatmentSubStates.txState = TREAT_END_STATE;
+ _treatmentSubStates.txEndState = TREATMENT_END_WAIT_FOR_RINSEBACK_STATE;
+ _treatmentStatus.isTreatmentComplete = true;
handleTDOpModeTransitionBroadcastData(MODE_TREA, 0, BC_IMMEDIATELY);
handleTreatmentStatesBroadcastData(BC_IMMEDIATELY);
status = STATE_ON_ACTION;
Index: sources/drydemo/StateController.h
===================================================================
diff -u -rbb80bbccaf1c911be48493868c18c656d84b2ec1 -rfb3e70cb47f3d22f31f68358c1bda69cce9cd248
--- sources/drydemo/StateController.h (.../StateController.h) (revision bb80bbccaf1c911be48493868c18c656d84b2ec1)
+++ sources/drydemo/StateController.h (.../StateController.h) (revision fb3e70cb47f3d22f31f68358c1bda69cce9cd248)
@@ -63,15 +63,21 @@
float rinsebackTgtVolPlusAddVolML;
// Recirculation variables
bool hasRecircBeenRequested;
+ quint32 recircTimerCounter;
+ quint32 recircTimeoutS;
+ bool hasResumeTxBeenRequested;
+ bool hasRecircWarnAlarmBeenTrig;
+ bool hasRecircTimeoutAlarmBeenTrig;
};
struct Treatment_Sub_State_Vars {
- Treatment_States txStates;
- Blood_Prime_States bloodPrimeStates;
- Fluid_Bolus_States fluidBolusState;
- Dialysis_States dialysisSubState;
- Rinseback_States rinsebackState;
- Recirculate_States recircState;
+ Treatment_States txState;
+ Blood_Prime_States bloodPrimeState;
+ Fluid_Bolus_States fluidBolusState;
+ Dialysis_States dialysisSubState;
+ Rinseback_States rinsebackState;
+ Recirculate_States recircState;
+ Treatment_End_States txEndState;
};
struct Treatment_Params {
@@ -139,7 +145,7 @@
quint32 extractU32DataFromReceivedMessage(const Can::Message_ID_Enum msgID, qint32 index);
float extractF32DataFromReceivedMessage(const Can::Message_ID_Enum msgID, qint32 index);
void triggerAnAlarm(Alarm_List alarmID);
- void handleAlarmUserAction(State_Status &status);
+ void handleAlarmUserAction(State_Status &status, bool isFromTxPause = false);
// Standby methods
void handleInitiateTreatmentRequestMessage(State_Status &status);
@@ -186,6 +192,7 @@
// Treatment recirculation methods
void initializeRecirc();
void handleRecircRequestMessage();
+ void handleRecircTimeout();
void handleRecircBroadcastData(const Broadcast_Type BCType);
// Treatment end methods
Index: sources/drydemo/StateControllerRecirc.cpp
===================================================================
diff -u -rbb80bbccaf1c911be48493868c18c656d84b2ec1 -rfb3e70cb47f3d22f31f68358c1bda69cce9cd248
--- sources/drydemo/StateControllerRecirc.cpp (.../StateControllerRecirc.cpp) (revision bb80bbccaf1c911be48493868c18c656d84b2ec1)
+++ sources/drydemo/StateControllerRecirc.cpp (.../StateControllerRecirc.cpp) (revision fb3e70cb47f3d22f31f68358c1bda69cce9cd248)
@@ -5,7 +5,11 @@
void StateController::initializeRecirc()
{
-
+ _treatmentStatus.recircTimerCounter = 0;
+ _treatmentStatus.recircTimeoutS = RECIRC_TIMEOUT_MIN * SECONDS_PER_MINUTE;
+ _treatmentStatus.hasResumeTxBeenRequested = false;
+ _treatmentStatus.hasRecircWarnAlarmBeenTrig = false;
+ _treatmentStatus.hasRecircTimeoutAlarmBeenTrig = false;
}
void StateController::handleRecircRequestMessage()
@@ -23,28 +27,83 @@
}
switch (recircCmd) {
- case REQUESTED_USER_ACTION_TX_RECIRC_RECONNECT :
- break;
- case REQUESTED_USER_ACTION_TX_RECIRC_CONFIRM_RECONNECT :
- break;
- case REQUESTED_USER_ACTION_TX_RECIRC_RESUME_RC :
- break;
- case REQUESTED_USER_ACTION_TX_RECIRC_END_TREATMENT :
- break;
- case REQUESTED_USER_ACTION_TX_RECIRC_CONFIRM_DISCONNECT :
- break;
- default:
- // Do nothing
- break;
+ case REQUESTED_USER_ACTION_TX_RECIRC_RECONNECT:
+ if (_treatmentSubStates.recircState == TREATMENT_RECIRC_RECIRC_STATE) {
+ _treatmentSubStates.recircState = TREATMENT_RECIRC_RECONNECT_PATIENT_STATE;
+ }
+ else { reason.append(REQUEST_REJECT_REASON_ACTION_DISABLED_IN_CURRENT_STATE); }
+ break;
+
+ case REQUESTED_USER_ACTION_TX_RECIRC_CONFIRM_RECONNECT:
+ if (_treatmentSubStates.recircState == TREATMENT_RECIRC_RECONNECT_PATIENT_STATE) {
+ _treatmentSubStates.recircState = TREATMENT_RECIRC_RECONNECT_PATIENT_STATE;
+ _treatmentStatus.hasResumeTxBeenRequested = true;
+ }
+ // TODO check if recirc is allowed
+ else { reason.append(REQUEST_REJECT_REASON_ACTION_DISABLED_IN_CURRENT_STATE); }
+ break;
+
+ case REQUESTED_USER_ACTION_TX_RECIRC_RESUME_RC:
+ if (_treatmentSubStates.recircState == TREATMENT_RECIRC_STOPPED_STATE) {
+ _treatmentSubStates.recircState = TREATMENT_RECIRC_RECIRC_STATE;
+ }
+ else { reason.append(REQUEST_REJECT_REASON_ACTION_DISABLED_IN_CURRENT_STATE); }
+ break;
+
+ case REQUESTED_USER_ACTION_TX_RECIRC_END_TREATMENT:
+ handleSendUIConfirmationMessage(GENERIC_CONFIRM_ID_TREATMENT_END, GENERIC_CONFIRM_CMD_REQUEST_OPEN);
+ break;
+
+ case REQUESTED_USER_ACTION_TX_RECIRC_CONFIRM_DISCONNECT:
+ if (_treatmentSubStates.recircState == TREATMENT_RECIRC_DISCONNECT_PATIENT_STATE) {
+ _treatmentSubStates.recircState = TREATMENT_RECIRC_RECIRC_STATE;
+ }
+ else { reason.append(REQUEST_REJECT_REASON_ACTION_DISABLED_IN_CURRENT_STATE); }
+ break;
+
+ default:
+ // Do nothing
+ break;
}
handleUIResponseMessage(ID_TD_RECIRCULATE_RESP, acceptReject, reason);
_treatmentRcvdMessages[ID_UI_RECIRCULATE_RQST].clear();
}
+void StateController::handleRecircTimeout()
+{
+ if (_treatmentSubStates.recircState != TREATMENT_RECIRC_RECIRC_STATE ) { return; }
+
+ quint32 recircElapsedTimeS = (_treatmentStatus.recircTimerCounter * QOBJECT_TIMER_TIMEOUT_MS) / MILLISECONDS_PER_SECOND;
+ quint32 warningTimeS = _treatmentStatus.recircTimeoutS - (RECIRC_WARN_BEFORE_TIMEOUT_MIN * SECONDS_PER_MINUTE);
+ Q_UNUSED(warningTimeS)
+
+ //if ((recircElapsedTimeS >= warningTimeS) && (_treatmentStatus.activeAlarm != ALARM_ID_TD_RECIRC_TIMEOUT_WARNING)) {
+ if ((recircElapsedTimeS >= 20) && !_treatmentStatus.hasRecircWarnAlarmBeenTrig) {
+ _treatmentStatus.hasRecircWarnAlarmBeenTrig = true;
+ triggerAnAlarm(ALARM_ID_TD_RECIRC_TIMEOUT_WARNING);
+ }
+
+ //if ((recircElapsedTimeS >= _treatmentStatus.recircTimeoutS) && (_treatmentStatus.activeAlarm != ALARM_ID_TD_RECIRC_TIMEOUT)) {
+ if ((recircElapsedTimeS >= 30) && !_treatmentStatus.hasRecircTimeoutAlarmBeenTrig) {
+ _treatmentStatus.hasRecircTimeoutAlarmBeenTrig = true;
+ triggerAnAlarm(ALARM_ID_TD_RECIRC_TIMEOUT);
+ }
+}
+
void StateController::handleRecircBroadcastData(const Broadcast_Type BCType)
{
static quint32 broadcastCounter = 52;
if ((++broadcastCounter % NUM_OF_COUNTS_TIMER_BC_EMIT != 0) && (BCType == BC_DELAYED)) { return; }
+ quint32 elapsedTimeS = (_treatmentStatus.recircTimerCounter * QOBJECT_TIMER_TIMEOUT_MS) / MILLISECONDS_PER_SECOND;
+ quint32 countdownS = (elapsedTimeS < _treatmentStatus.recircTimeoutS ? _treatmentStatus.recircTimeoutS - elapsedTimeS : 0);
+
+ QVariantList msg;
+ msg.append(static_cast(ID_TD_RECIRCULATE_DATA));
+ msg.append(Can_Id::eChlid_TD_Sync);
+ msg.append(countdownS);
+ _isBroadcastListReady = false;
+ _broadcastMessages.append(msg);
+ _isBroadcastListReady = true;
}
Index: sources/drydemo/StateControllerRinseback.cpp
===================================================================
diff -u -rbb80bbccaf1c911be48493868c18c656d84b2ec1 -rfb3e70cb47f3d22f31f68358c1bda69cce9cd248
--- sources/drydemo/StateControllerRinseback.cpp (.../StateControllerRinseback.cpp) (revision bb80bbccaf1c911be48493868c18c656d84b2ec1)
+++ sources/drydemo/StateControllerRinseback.cpp (.../StateControllerRinseback.cpp) (revision fb3e70cb47f3d22f31f68358c1bda69cce9cd248)
@@ -41,7 +41,7 @@
case REQUESTED_USER_ACTION_RINSEBACK_INCREASE_RATE:
if ((_treatmentStatus.rinsebackFlowMLPM + RINSEBACK_ADJ_FLOW_RATE_MLPM) <= RINSEBACK_MAX_RLOW_RATE_MLPM) {
if (_treatmentSubStates.rinsebackState == RINSEBACK_RUN_STATE) {
- acceptReject = ACCEPT_VALUE;
+ acceptReject = ACCEPT_VALUE;
_treatmentStatus.rinsebackFlowMLPM += RINSEBACK_ADJ_FLOW_RATE_MLPM;
}
else { reason.append(REQUEST_REJECT_REASON_ACTION_DISABLED_IN_CURRENT_STATE); }
Index: sources/drydemo/StateControllerStandby.cpp
===================================================================
diff -u -rbb80bbccaf1c911be48493868c18c656d84b2ec1 -rfb3e70cb47f3d22f31f68358c1bda69cce9cd248
--- sources/drydemo/StateControllerStandby.cpp (.../StateControllerStandby.cpp) (revision bb80bbccaf1c911be48493868c18c656d84b2ec1)
+++ sources/drydemo/StateControllerStandby.cpp (.../StateControllerStandby.cpp) (revision fb3e70cb47f3d22f31f68358c1bda69cce9cd248)
@@ -16,7 +16,6 @@
}
return false;
}
-
msgPayload = extractU32DataFromReceivedMessage(ID_UI_CONFIRMATION_RESULT_RESP, UI_MSG_BB_STATUS_INDEX);
_treatmentStatus.userCmd = static_cast(msgPayload);
_treatmentRcvdMessages[ID_UI_CONFIRMATION_RESULT_RESP].clear();
@@ -78,7 +77,7 @@
_treatmentStatus.totalFluidBolusDeliveredML = 0.0;
_treatmentStatus.accumFluidBolusDeliveredML = 0.0;
_treatmentSubStates.fluidBolusState = FLUID_BOLUS_IDLE_STATE;
- _treatmentSubStates.txStates = TREAT_START_STATE;
+ _treatmentSubStates.txState = TREAT_START_STATE;
_treatmentSubStates.rinsebackState = RINSEBACK_STOP_INIT_STATE;
_treatmentStatus.ufVolDeliveredL = 0.0;
_treatmentStatus.hasRecircBeenRequested = false;
@@ -106,35 +105,42 @@
_isSendListReady = true;
}
-void StateController::handleAlarmUserAction(State_Status &status)
+void StateController::handleAlarmUserAction(State_Status &status, bool isFromTxPause)
{
if (_treatmentRcvdMessages[ID_UI_ALARM_USER_ACTION_REQUEST].isNull()) { return; }
quint32 userAction = extractU32DataFromReceivedMessage(ID_UI_ALARM_USER_ACTION_REQUEST, 0);
switch (userAction) {
case ALARM_USER_ACTION_RESUME:
- _treatmentSubStates.dialysisSubState = DIALYSIS_UF_STATE;
- _treatmentSubStates.txStates = TREAT_DIALYSIS_STATE;
- _treatmentStatus.stateTransitionEvent = "T_TP_2_Tx";
+ // If we are in treatment pause return back to treatment, otherwise just clear the alarm
+ if (isFromTxPause) {
+ _treatmentSubStates.dialysisSubState = DIALYSIS_UF_STATE;
+ _treatmentSubStates.txState = TREAT_DIALYSIS_STATE;
+ _treatmentStatus.stateTransitionEvent = "T_TP_2_Tx";
+ // User action has been selected so do not stay in treatment pause
+ status = STATE_ON_EXIT;
+ }
break;
case ALARM_USER_ACTION_RINSEBACK:
case ALARM_USER_ACTION_TEMPOARY_BREAK:
_treatmentStatus.stateTransitionEvent = "T_TP_2_RB";
+ // User action has been selected so do not stay in treatment pause
+ status = STATE_ON_EXIT;
break;
case ALARM_USER_ACTION_END_TREATMENT:
_treatmentStatus.stateTransitionEvent = "T_TP_2_TE";
+ // User action has been selected so do not stay in treatment pause
+ status = STATE_ON_EXIT;
break;
default:
// Do nothing
break;
}
- // User action has been selected so do not stay in treatment pause
- status = STATE_ON_EXIT;
triggerAnAlarm(ALARM_ID_NO_ALARM);
QVariantList msg;
@@ -158,8 +164,12 @@
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";
+ QStringList activeStates = _dryDemo.activeStateNames(true);
+ QString activeState = activeStates[0];
+ _treatmentStatus.stateTransitionEvent = (activeState == "Treatment_Recirculate" ? "T_RC_2_TE" : "T_RB_2_TE");
+ //_treatmentStatus.stateTransitionEvent = "T_RB_2_TE";
status = STATE_ON_EXIT;
+ qDebug() << "Event" << _treatmentStatus.stateTransitionEvent << _dryDemo.activeStateNames(true);
}
handleSendUIConfirmationMessage(confirmID, cmd);
_uiConfirmMessages.remove(confirmID);
Index: sources/drydemo/StateControllerTreatment.cpp
===================================================================
diff -u -rbb80bbccaf1c911be48493868c18c656d84b2ec1 -rfb3e70cb47f3d22f31f68358c1bda69cce9cd248
--- sources/drydemo/StateControllerTreatment.cpp (.../StateControllerTreatment.cpp) (revision bb80bbccaf1c911be48493868c18c656d84b2ec1)
+++ sources/drydemo/StateControllerTreatment.cpp (.../StateControllerTreatment.cpp) (revision fb3e70cb47f3d22f31f68358c1bda69cce9cd248)
@@ -9,7 +9,7 @@
{
qint32 setBPRateMLPM = _treatmentParams.bloodFlowRateMLPM - BLOOD_PRIME_START_FLOW_MLPM;
float rampRateS = ((BLOOD_PRIME_VOLUME_ML / (setBPRateMLPM + BLOOD_PRIME_VOLUME_ML) / BLOOD_PRIME_START_FLOW_MLPM) / 2.0) * SECONDS_PER_MINUTE;
- qDebug() << "Step cal" << _treatmentParams.bloodFlowRateMLPM << setBPRateMLPM << rampRateS;
+ // qDebug() << "Step cal" << _treatmentParams.bloodFlowRateMLPM << setBPRateMLPM << rampRateS;
rampRateS = (rampRateS < SECONDS_PER_MINUTE ? SECONDS_PER_MINUTE : rampRateS);
float rampStepML = setBPRateMLPM / rampRateS;
@@ -42,7 +42,7 @@
// If the user has changed the flow then do not control (ramp) the steps
currBloodFlowMLPM += rampStepML;
- qDebug() << "Flow calc" << currBloodFlowMLPM;
+ // qDebug() << "Flow calc" << currBloodFlowMLPM;
if (rampStepML < 0){
// If the ramp is negative, check the current flow not be less than target and if it is, set it to min
@@ -244,14 +244,14 @@
quint32 acceptReject = REJECT_VALUE;
QVariantList reason;
- if (_treatmentSubStates.txStates == TREAT_DIALYSIS_STATE) {
+ if (_treatmentSubStates.txState == TREAT_DIALYSIS_STATE) {
// Assume the default state is UF state
_treatmentSubStates.dialysisSubState = DIALYSIS_UF_STATE;
_treatmentSubStates.dialysisSubState = (cmd == 0 ? DIALYSIS_UF_PAUSED_STATE : _treatmentSubStates.dialysisSubState);
acceptReject = ACCEPT_VALUE;
qDebug() << "UF Pa" << _treatmentSubStates.dialysisSubState;
}
- else if (_treatmentSubStates.txStates != TREAT_DIALYSIS_STATE) { reason.append(REQUEST_REJECT_REASON_INVALID_TREATMENT_STATE); }
+ else if (_treatmentSubStates.txState != TREAT_DIALYSIS_STATE) { reason.append(REQUEST_REJECT_REASON_INVALID_TREATMENT_STATE); }
else {
quint32 r = (cmd == 0 ? REQUEST_REJECT_REASON_UF_NOT_IN_PROGESS : REQUEST_REJECT_REASON_UF_NOT_PAUSED);
reason.append(r);
Index: sources/drydemo/StateControllerTreatmentBroadcasts.cpp
===================================================================
diff -u -rbb80bbccaf1c911be48493868c18c656d84b2ec1 -rfb3e70cb47f3d22f31f68358c1bda69cce9cd248
--- sources/drydemo/StateControllerTreatmentBroadcasts.cpp (.../StateControllerTreatmentBroadcasts.cpp) (revision bb80bbccaf1c911be48493868c18c656d84b2ec1)
+++ sources/drydemo/StateControllerTreatmentBroadcasts.cpp (.../StateControllerTreatmentBroadcasts.cpp) (revision fb3e70cb47f3d22f31f68358c1bda69cce9cd248)
@@ -44,15 +44,14 @@
QVariantList msg;
msg.append(static_cast(ID_TD_TREATMENT_STATE_DATA));
msg.append(Can_Id::eChlid_TD_Sync);
-
- msg.append(_treatmentSubStates.txStates);
- msg.append(_treatmentSubStates.bloodPrimeStates);
+ msg.append(_treatmentSubStates.txState);
+ msg.append(_treatmentSubStates.bloodPrimeState);
msg.append(_treatmentSubStates.dialysisSubState);
msg.append(0); // TODO add ISO UF
msg.append(0); // TODO add treatment paused
msg.append(_treatmentSubStates.rinsebackState);
msg.append(_treatmentSubStates.recircState);
- msg.append(0); // TODO add treatment end
+ msg.append(_treatmentSubStates.txEndState);
msg.append(_treatmentSubStates.fluidBolusState);
msg.append(0); // Heparin state
_isBroadcastListReady = false;