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;