Index: drydemo.pro.user =================================================================== diff -u -r521f29cb7dcd0de352dd744292488380e07cb9e3 -re8edefcae8e47854198b06c1a65e4e45da5f3afc --- drydemo.pro.user (.../drydemo.pro.user) (revision 521f29cb7dcd0de352dd744292488380e07cb9e3) +++ drydemo.pro.user (.../drydemo.pro.user) (revision e8edefcae8e47854198b06c1a65e4e45da5f3afc) @@ -1,14 +1,14 @@ - + EnvironmentId {d3e165e0-350b-4c5e-a5f5-6e3e06ca0990} ProjectExplorer.Project.ActiveTarget - 0 + 1 ProjectExplorer.Project.EditorSettings @@ -293,7 +293,7 @@ Qt 5.15.10 (iMX8) Qt 5.15.10 (iMX8) {ada4083c-13b6-4ac8-a486-71ff00b060da} - 1 + 0 0 0 Index: sources/drydemo/DryDemoDefines.h =================================================================== diff -u -r521f29cb7dcd0de352dd744292488380e07cb9e3 -re8edefcae8e47854198b06c1a65e4e45da5f3afc --- sources/drydemo/DryDemoDefines.h (.../DryDemoDefines.h) (revision 521f29cb7dcd0de352dd744292488380e07cb9e3) +++ sources/drydemo/DryDemoDefines.h (.../DryDemoDefines.h) (revision e8edefcae8e47854198b06c1a65e4e45da5f3afc) @@ -123,23 +123,28 @@ #define RECIRC_WARN_BEFORE_TIMEOUT_MIN 10 // Alarm defines +enum { + BLOOD_PUMP_NOT_RUNNING = 0, + BLOOD_PUMP_IS_RUNNING = 1, +}; + #define ALARM_TABLE_PRIORITY_INDEX 0 #define ALARM_TABLE_PROPERTIES_INDEX 1 #define ALARM_TABLE_TX_PAUSE_INDEX 2 +#define ALARM_TABLE_BLOOD_PUMP_RUN_INDEX 3 #define ALARM_TRANS_TO_TX_PAUSE 1 #define ALARM_NOT_TRANS_TO_TX_PAUSE 0 #define TRIG_LOW_VEN_ALARM_TIMEOUT_MS (3 * SECONDS_PER_MINUTE * MILLISECONDS_PER_SECOND) -#define CLEAR_DIAL_PROPOR_TIMEOUT_MS (10 * MILLISECONDS_PER_SECOND) +#define CLEAR_DIAL_PROPOR_TIMEOUT_MS (3 * SECONDS_PER_MINUTE * MILLISECONDS_PER_SECOND) #define ALARM_NO_ALARM_PROPERTIES 0 #define ALARM_STOP_TX_PROPERTIES 6 #define ALARM_USE_DEFAULT_PROPERTIES -999 #define ALARM_REPLACE_ACID_PROPERTIES 112 -#define ALARM_RECIRC_WARN_PROPERTIES 112 #define ALARM_RECIR_TIMEOUT_RPOPERTIES 26 #define ALARM_LOW_VENOUS_PROPERTIES 2 #define ALARM_RECIRC_WARN_PROPERTIES 112 #define ALARM_REPLACE_BICARB_PROPERTIES 112 -#define ALARM_DIAL_PROPOR_PROPERTIES 10 +#define ALARM_DIAL_PROPOR_PROPERTIES 76 #define ALARM_TX_MOD_CHNG_PROPERTIES 2 #define ALARM_LOW_BICARB_PROPERTIES 112 #define ALARM_TD_END_OF_TX_PROPERTIES 248 Index: sources/drydemo/StateController.cpp =================================================================== diff -u -r521f29cb7dcd0de352dd744292488380e07cb9e3 -re8edefcae8e47854198b06c1a65e4e45da5f3afc --- sources/drydemo/StateController.cpp (.../StateController.cpp) (revision 521f29cb7dcd0de352dd744292488380e07cb9e3) +++ sources/drydemo/StateController.cpp (.../StateController.cpp) (revision e8edefcae8e47854198b06c1a65e4e45da5f3afc) @@ -39,19 +39,19 @@ _transitionEventsFromStandby[CMD_POST_TX ] = {"T_SB_2_Posttx" , static_cast(MODE_POST)}; // Alarms specs and properties - _alarmTriggerSpecs[ALARM_ID_NO_ALARM ] = {ALARM_PRIORITY_NONE , ALARM_NO_ALARM_PROPERTIES , ALARM_NOT_TRANS_TO_TX_PAUSE }; - _alarmTriggerSpecs[ALARM_ID_TD_VENOUS_PRESSURE_LOW ] = {ALARM_PRIORITY_HIGH , ALARM_LOW_VENOUS_PROPERTIES , ALARM_TRANS_TO_TX_PAUSE }; - _alarmTriggerSpecs[ALARM_ID_TD_TREATMENT_STOPPED_BY_USER ] = {ALARM_PRIORITY_HIGH , ALARM_STOP_TX_PROPERTIES , ALARM_TRANS_TO_TX_PAUSE }; - _alarmTriggerSpecs[ALARM_ID_TD_RECIRC_TIMEOUT_WARNING ] = {ALARM_PRIORITY_LOW , ALARM_RECIRC_WARN_PROPERTIES , ALARM_NOT_TRANS_TO_TX_PAUSE }; - _alarmTriggerSpecs[ALARM_ID_TD_RECIRC_TIMEOUT ] = {ALARM_PRIORITY_HIGH , ALARM_RECIR_TIMEOUT_RPOPERTIES , ALARM_NOT_TRANS_TO_TX_PAUSE }; - _alarmTriggerSpecs[ALARM_ID_DD_BICARBONATE_CARTRIDGE_LOW_LEVEL ] = {ALARM_PRIORITY_MEDIUM , ALARM_LOW_BICARB_PROPERTIES , ALARM_TRANS_TO_TX_PAUSE }; - _alarmTriggerSpecs[ALARM_ID_TD_TREATMENT_MODALITY_CHANGE ] = {ALARM_PRIORITY_MEDIUM , ALARM_TX_MOD_CHNG_PROPERTIES , ALARM_TRANS_TO_TX_PAUSE }; - _alarmTriggerSpecs[ALARM_ID_DD_REPLACE_ACID_CONCENTRATE ] = {ALARM_PRIORITY_MEDIUM , ALARM_REPLACE_ACID_PROPERTIES , ALARM_TRANS_TO_TX_PAUSE }; - _alarmTriggerSpecs[ALARM_ID_DD_REPLACE_BICARB_CARTRIDGE ] = {ALARM_PRIORITY_MEDIUM , ALARM_REPLACE_BICARB_PROPERTIES , ALARM_TRANS_TO_TX_PAUSE }; - _alarmTriggerSpecs[ALARM_ID_TD_DIALYSATE_PROPORTIONING_IN_PROGRESS ] = {ALARM_PRIORITY_MEDIUM , ALARM_DIAL_PROPOR_PROPERTIES , ALARM_TRANS_TO_TX_PAUSE }; - _alarmTriggerSpecs[ALARM_ID_TD_END_OF_TREATMENT ] = {ALARM_PRIORITY_LOW , ALARM_TD_END_OF_TX_PROPERTIES , ALARM_NOT_TRANS_TO_TX_PAUSE }; - _alarmTriggerSpecs[ALARM_ID_TD_END_OF_TREATMENT_TIMEOUT ] = {ALARM_PRIORITY_HIGH , ALARM_TD_END_OF_TX_TIMEOUT_PROPERTIES , ALARM_NOT_TRANS_TO_TX_PAUSE }; - _alarmTriggerSpecs[ALARM_ID_TD_HDF_SUBMODE_CHANGE ] = {ALARM_PRIORITY_MEDIUM , ALARM_ID_TD_HDF_SUBMODE_CHGE_PROPERTIES , ALARM_TRANS_TO_TX_PAUSE }; + _alarmTriggerSpecs[ALARM_ID_NO_ALARM ] = {ALARM_PRIORITY_NONE , ALARM_NO_ALARM_PROPERTIES , ALARM_NOT_TRANS_TO_TX_PAUSE , BLOOD_PUMP_NOT_RUNNING}; + _alarmTriggerSpecs[ALARM_ID_TD_VENOUS_PRESSURE_LOW ] = {ALARM_PRIORITY_HIGH , ALARM_LOW_VENOUS_PROPERTIES , ALARM_TRANS_TO_TX_PAUSE , BLOOD_PUMP_NOT_RUNNING}; + _alarmTriggerSpecs[ALARM_ID_TD_TREATMENT_STOPPED_BY_USER ] = {ALARM_PRIORITY_HIGH , ALARM_STOP_TX_PROPERTIES , ALARM_TRANS_TO_TX_PAUSE , BLOOD_PUMP_NOT_RUNNING}; + _alarmTriggerSpecs[ALARM_ID_TD_RECIRC_TIMEOUT_WARNING ] = {ALARM_PRIORITY_LOW , ALARM_RECIRC_WARN_PROPERTIES , ALARM_NOT_TRANS_TO_TX_PAUSE , BLOOD_PUMP_NOT_RUNNING}; + _alarmTriggerSpecs[ALARM_ID_TD_RECIRC_TIMEOUT ] = {ALARM_PRIORITY_HIGH , ALARM_RECIR_TIMEOUT_RPOPERTIES , ALARM_NOT_TRANS_TO_TX_PAUSE , BLOOD_PUMP_NOT_RUNNING}; + _alarmTriggerSpecs[ALARM_ID_DD_BICARBONATE_CARTRIDGE_LOW_LEVEL ] = {ALARM_PRIORITY_MEDIUM , ALARM_LOW_BICARB_PROPERTIES , ALARM_TRANS_TO_TX_PAUSE , BLOOD_PUMP_IS_RUNNING }; + _alarmTriggerSpecs[ALARM_ID_TD_TREATMENT_MODALITY_CHANGE ] = {ALARM_PRIORITY_MEDIUM , ALARM_TX_MOD_CHNG_PROPERTIES , ALARM_TRANS_TO_TX_PAUSE , BLOOD_PUMP_NOT_RUNNING}; + _alarmTriggerSpecs[ALARM_ID_DD_REPLACE_ACID_CONCENTRATE ] = {ALARM_PRIORITY_MEDIUM , ALARM_REPLACE_ACID_PROPERTIES , ALARM_TRANS_TO_TX_PAUSE , BLOOD_PUMP_IS_RUNNING }; + _alarmTriggerSpecs[ALARM_ID_DD_REPLACE_BICARB_CARTRIDGE ] = {ALARM_PRIORITY_MEDIUM , ALARM_REPLACE_BICARB_PROPERTIES , ALARM_TRANS_TO_TX_PAUSE , BLOOD_PUMP_IS_RUNNING }; + _alarmTriggerSpecs[ALARM_ID_TD_DIALYSATE_PROPORTIONING_IN_PROGRESS ] = {ALARM_PRIORITY_MEDIUM , ALARM_DIAL_PROPOR_PROPERTIES , ALARM_TRANS_TO_TX_PAUSE , BLOOD_PUMP_IS_RUNNING }; + _alarmTriggerSpecs[ALARM_ID_TD_END_OF_TREATMENT ] = {ALARM_PRIORITY_LOW , ALARM_TD_END_OF_TX_PROPERTIES , ALARM_NOT_TRANS_TO_TX_PAUSE , BLOOD_PUMP_NOT_RUNNING}; + _alarmTriggerSpecs[ALARM_ID_TD_END_OF_TREATMENT_TIMEOUT ] = {ALARM_PRIORITY_HIGH , ALARM_TD_END_OF_TX_TIMEOUT_PROPERTIES , ALARM_NOT_TRANS_TO_TX_PAUSE , BLOOD_PUMP_NOT_RUNNING}; + _alarmTriggerSpecs[ALARM_ID_TD_HDF_SUBMODE_CHANGE ] = {ALARM_PRIORITY_MEDIUM , ALARM_ID_TD_HDF_SUBMODE_CHGE_PROPERTIES , ALARM_TRANS_TO_TX_PAUSE , BLOOD_PUMP_IS_RUNNING }; } void StateController::quit() @@ -250,7 +250,7 @@ }; auto onExit = [=](){ - qDebug() << "Standby in exit"; + qDebug() << "Standby on exit"; _dryDemo.submitEvent(_treatmentStatus.stateTransitionEvent); status = STATE_ON_ENTRY; }; @@ -300,7 +300,7 @@ }; auto onExit = [=](){ - qDebug() << "PreTx in exit"; + qDebug() << "PreTx on exit"; _dryDemo.submitEvent(_treatmentStatus.stateTransitionEvent); status = STATE_ON_ENTRY; }; @@ -355,7 +355,7 @@ handleVitalsDataRquest(); // Water Sample handleTDWaterSampleResultRequest(); - if (_treatmentSubStates.fluidBolusState == FLUID_BOLUS_SALINE_IN_PROGRESS_STATE){ + if (_treatmentSubStates.fluidBolusState == FLUID_BOLUS_SALINE_IN_PROGRESS_STATE) { handleFluidBolusFluidDelivery(currBloodFlowMLPM); handleFluidBolusBroadcastData(BC_DELAYED); // If fluid bolus is in progress, do not run the blood prime @@ -398,6 +398,8 @@ hasFlowChngeRequested = false; _treatmentSubStates.txState = TREAT_START_STATE; _treatmentStatus.isBloodPumpRunning = true; + _treatmentHDFVars.hdfIsRequested = _treatmentHDFVars.hdfPrevIsRequested; + _treatmentStatus.isDialysateInBypass = false; handleTreatmentStatesBroadcastData(BC_IMMEDIATELY); // Start with UF state in dialysis _treatmentSubStates.dialysisSubState = DIALYSIS_UF_STATE; @@ -475,7 +477,7 @@ }; auto onExit = [=](){ - qDebug() << "Tx in exit"; + qDebug() << "Tx on exit"; status = STATE_ON_ENTRY; if (_treatmentStatus.userCmd == CMD_TX_STOP) { triggerAnAlarm(ALARM_ID_TD_TREATMENT_STOPPED_BY_USER); @@ -504,8 +506,13 @@ _treatmentStatus.txPauseBloodSittingCounter = 0; _treatmentSubStates.dialysisSubState = DIALYSIS_UF_PAUSED_STATE; _treatmentSubStates.txState = TREAT_PAUSED_STATE; + _treatmentStatus.isDialysateInBypass = true; + _treatmentHDFVars.hdfPrevIsRequested = _treatmentHDFVars.hdfIsRequested; + _treatmentHDFVars.hdfIsRequested = false; handleTDOpModeTransitionBroadcastData(MODE_TREA, 0, BC_IMMEDIATELY); handleTreatmentStatesBroadcastData(BC_IMMEDIATELY); + // Send treatment pause values in treatment end to make sure the countdown is not non-zero to be sent to the alarm + handleTreatmentPauseBroadcastData(BC_IMMEDIATELY, true); status = STATE_ON_ACTION; qDebug() << "Tx pause on entry"; }; @@ -521,14 +528,24 @@ handleChemsReplacementAlarmsSequence(status); handleTDOpModeTransitionBroadcastData(MODE_TREA, 0, BC_DELAYED); // Broadcast methods - handleTreatmentPauseBroadcastData(BC_DELAYED); + if ((_treatmentStatus.activeTopAlarm != ALARM_ID_NO_ALARM) && (_alarmTriggerSpecs.contains(_treatmentStatus.activeTopAlarm))) { + if (_alarmTriggerSpecs[_treatmentStatus.activeTopAlarm][ALARM_TABLE_BLOOD_PUMP_RUN_INDEX] == BLOOD_PUMP_NOT_RUNNING) { + handleTreatmentPauseBroadcastData(BC_DELAYED); + } + } + // HDF methods + handleHDFBroadcastData(BC_DELAYED); + handleHDFTreatment(); // Pressure methods handlePressureLimitState(); handleTDPressureBroadcastData(BC_DELAYED); handleDeterminePressureLimits(); handleWidenPressureLimitsMessage(); + handlePressureLimitsChangeRequest(); // Dialysate is in bypass (set the flag to true because we in tx pause and we have to baypas dialysate) - handleDDGenDialysateModeBroadcastData(BC_DELAYED, true); + handleDDGenDialysateModeBroadcastData(BC_DELAYED); + handleTreatmentSetpointsBroadcastData(_treatmentParams.bloodFlowRateMLPM, _treatmentParams.dialysateFlowRateMLPM, + _treatmentParams.dialysateTemperatureC, BC_DELAYED); // UF is in pause handleUltrafiltrationBroadcastData(BC_DELAYED); // Vitals methods @@ -547,7 +564,7 @@ }; auto onExit = [=](){ - qDebug() << "Tx pasue in exit"; + qDebug() << "Tx pasue on exit"; // Set the pressure to close upon exiting the treatment pause handleSignalInitiatePressureStabilization(USE_NORMAL_STABILIZATION_PERIOD); _dryDemo.submitEvent(_treatmentStatus.stateTransitionEvent); @@ -605,7 +622,7 @@ }; auto onExit = [=](){ - qDebug() << "Tx rinseback in exit"; + qDebug() << "Tx rinseback on exit"; _dryDemo.submitEvent(_treatmentStatus.stateTransitionEvent); status = STATE_ON_ENTRY; }; @@ -658,7 +675,7 @@ }; auto onExit = [=](){ - qDebug() << "Tx recirc in exit"; + qDebug() << "Tx recirc on exit"; _dryDemo.submitEvent(_treatmentStatus.stateTransitionEvent); status = STATE_ON_ENTRY; }; @@ -685,8 +702,10 @@ _treatmentStatus.treatmentEndTimeoutAlarmCtr = _elapsedTimeCtr; handleTDOpModeTransitionBroadcastData(MODE_TREA, 0, BC_IMMEDIATELY); handleTreatmentStatesBroadcastData(BC_IMMEDIATELY); + // Send treatment pause values in treatment end to make sure the countdown is not non-zero to be sent to the alarm + handleTreatmentPauseBroadcastData(BC_IMMEDIATELY, true); status = STATE_ON_ACTION; - qDebug() << "Tx End on entry"; + qDebug() << "Tx end on entry"; }; auto onAction = [=](){ @@ -716,7 +735,7 @@ }; auto onExit = [=](){ - qDebug() << "Tx in exit"; + qDebug() << "Tx end on exit"; _dryDemo.submitEvent(_treatmentStatus.stateTransitionEvent); status = STATE_ON_ENTRY; }; Index: sources/drydemo/StateController.h =================================================================== diff -u -r521f29cb7dcd0de352dd744292488380e07cb9e3 -re8edefcae8e47854198b06c1a65e4e45da5f3afc --- sources/drydemo/StateController.h (.../StateController.h) (revision 521f29cb7dcd0de352dd744292488380e07cb9e3) +++ sources/drydemo/StateController.h (.../StateController.h) (revision e8edefcae8e47854198b06c1a65e4e45da5f3afc) @@ -67,6 +67,7 @@ quint32 rinsebackTimerCounter; quint32 rinsebackAdditionalTimerCounter; float rinsebackTgtVolPlusAddVolML; + bool isRecircAllowed; // Recirculation variables bool hasRecircBeenRequested; quint32 recircTimerCounter; @@ -88,6 +89,8 @@ quint32 bicartDepresInProgress; // Treatment end quint32 treatmentEndTimeoutAlarmCtr; + // Dialysate flow + bool isDialysateInBypass; }; struct Treatment_HDF_vars { @@ -99,6 +102,7 @@ quint32 hdfControlTimeCtr; bool hdfHasMaxVolumeBeenReached; bool hdfIsRequested; + bool hdfPrevIsRequested; }; struct Pressure_Vars { @@ -260,7 +264,7 @@ void handleTreatmentTimeProcessAndBroadcastData(const Broadcast_Type BCType); void handleTreatmentPrescriptionEditRequestMessage(); void handleSetPointBloodFlowChange(quint32 &bloodFlowMLPM, bool &hasBloodFlowChanged); - void handleDDGenDialysateModeBroadcastData(const Broadcast_Type BCType, const bool isDialysateBypass = false); + void handleDDGenDialysateModeBroadcastData(const Broadcast_Type BCType); void handleSetPointDialysateFlowChange(); void handleDDConductivityBroadcastData(const Broadcast_Type BCType); void handleUltrafiltrationBroadcastData(const Broadcast_Type BCType); @@ -271,7 +275,7 @@ void handleUltrafiltrationVolumeChangeConfirm(); void handleTreatmentTimeChangeValidation(); void handleTreatmentTimeChangeConfirm(); - void handleTreatmentPauseBroadcastData(const Broadcast_Type BCType); + void handleTreatmentPauseBroadcastData(const Broadcast_Type BCType, const bool zeroCounter = false); // Treatment pressure methods void handlePressureLimitState(); void handleUpdatePressureLimitWindows(); Index: sources/drydemo/StateControllerHDFTreatment.cpp =================================================================== diff -u -r521f29cb7dcd0de352dd744292488380e07cb9e3 -re8edefcae8e47854198b06c1a65e4e45da5f3afc --- sources/drydemo/StateControllerHDFTreatment.cpp (.../StateControllerHDFTreatment.cpp) (revision 521f29cb7dcd0de352dd744292488380e07cb9e3) +++ sources/drydemo/StateControllerHDFTreatment.cpp (.../StateControllerHDFTreatment.cpp) (revision e8edefcae8e47854198b06c1a65e4e45da5f3afc) @@ -13,6 +13,7 @@ _treatmentHDFVars.hdfControlTimeCtr = 0; _treatmentHDFVars.hdfHasMaxVolumeBeenReached = false; _treatmentHDFVars.hdfIsRequested = true; + _treatmentHDFVars.hdfPrevIsRequested = true; } float StateController::handleHDFCheckRate(const float proposedRateMLPM, const bool initRate) @@ -107,8 +108,10 @@ newHDFDilution = extractU32DataFromReceivedMessage(ID_UI_HDF_ADJUSTMENT_RQST, HDF_ADJ_MSG_DILUTION_INDEX); _treatmentParams.hdfSubstitutionFluidVolumeL = extractF32DataFromReceivedMessage(ID_UI_HDF_ADJUSTMENT_RQST, HDF_ADJ_MSG_FLUID_VOL_INDEX); - // Trigger the submode change if the dilution mode has changed - if (_treatmentParams.hdfDilution != newHDFDilution) { triggerAnAlarm(ALARM_ID_TD_HDF_SUBMODE_CHANGE); } + // Trigger the submode change if the dilution mode has changed. Set HDF to pause until the alarm is cleared + if (_treatmentParams.hdfDilution != newHDFDilution) { + triggerAnAlarm(ALARM_ID_TD_HDF_SUBMODE_CHANGE); + } _treatmentParams.hdfDilution = newHDFDilution; acceptReject = ACCEPT_VALUE; Index: sources/drydemo/StateControllerRinseback.cpp =================================================================== diff -u -r0deaf8f3e192a0ecde953ab65efc1ded1c06269b -re8edefcae8e47854198b06c1a65e4e45da5f3afc --- sources/drydemo/StateControllerRinseback.cpp (.../StateControllerRinseback.cpp) (revision 0deaf8f3e192a0ecde953ab65efc1ded1c06269b) +++ sources/drydemo/StateControllerRinseback.cpp (.../StateControllerRinseback.cpp) (revision e8edefcae8e47854198b06c1a65e4e45da5f3afc) @@ -167,7 +167,6 @@ 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; - bool isRecircAllowed = true; if (_treatmentStatus.isRinsebackComplete || (_treatmentStatus.rinsebackTimerCounter == 0)) { countdownS = 0; @@ -183,7 +182,7 @@ msg.append(rinsebackTimeoutS); msg.append(countdownS); msg.append(static_cast(_treatmentStatus.isRinsebackComplete)); - msg.append(static_cast(isRecircAllowed)); // Is recirculation allowed? TODO check this + msg.append(static_cast(_treatmentStatus.isRecircAllowed)); _isBroadcastListReady = false; _broadcastMessages.append(msg); _isBroadcastListReady = true; Index: sources/drydemo/StateControllerStandby.cpp =================================================================== diff -u -r521f29cb7dcd0de352dd744292488380e07cb9e3 -re8edefcae8e47854198b06c1a65e4e45da5f3afc --- sources/drydemo/StateControllerStandby.cpp (.../StateControllerStandby.cpp) (revision 521f29cb7dcd0de352dd744292488380e07cb9e3) +++ sources/drydemo/StateControllerStandby.cpp (.../StateControllerStandby.cpp) (revision e8edefcae8e47854198b06c1a65e4e45da5f3afc) @@ -106,6 +106,8 @@ _treatmentStatus.isBloodPumpRunning = false; _treatmentStatus.txPauseSeqAlarmState = SEQ_ALARM_NO_ALARM; _treatmentStatus.txPauseBloodSittingCounter = 0; + _treatmentStatus.isRecircAllowed = true; + _treatmentStatus.isDialysateInBypass = false; // Initialize alarm varibales to be alarm no alarm _treatmentStatus.activeTopAlarm = ALARM_ID_NO_ALARM; _treatmentStatus.activeAlarmProperty = _alarmTriggerSpecs[ALARM_ID_NO_ALARM][ALARM_TABLE_PROPERTIES_INDEX].toInt(); @@ -202,6 +204,8 @@ case ALARM_USER_ACTION_RINSEBACK: handleSendUIConfirmationMessage(GENERIC_CONFIRM_ID_RINSEBACK, GENERIC_CONFIRM_CMD_REQUEST_OPEN); + // Recirculation is not allowed in rinseback + _treatmentStatus.isRecircAllowed = false; break; case ALARM_USER_ACTION_TEMPOARY_BREAK: @@ -211,6 +215,8 @@ case ALARM_USER_ACTION_END_TREATMENT: handleSendUIConfirmationMessage(GENERIC_CONFIRM_ID_TREATMENT_END, GENERIC_CONFIRM_CMD_REQUEST_OPEN); _treatmentStatus.stateTransitionEvent = "T_TP_2_RB"; + // Recirculation is not allowed in end treatment option + _treatmentStatus.isRecircAllowed = false; break; default: @@ -352,6 +358,8 @@ else if (activeState == "Treatment_Rinseback") { _treatmentStatus.stateTransitionEvent = "T_RB_2_Posttx"; } else if (activeState == "Treatment_End") { _treatmentStatus.stateTransitionEvent = "T_TE_2_RB"; } else if (activeState == "Treatment_Pause") { _treatmentStatus.stateTransitionEvent = "T_TP_2_RB"; } + // Reciculation is not allowed in end treatment + _treatmentStatus.isRecircAllowed = false; _uiConfirmMessages[confirmID].confirmStatus = CONFIRMATION_REQUEST_STATUS_UNUSED; status = STATE_ON_EXIT; qDebug() << "Event" << activeState << _treatmentStatus.stateTransitionEvent << _dryDemo.activeStateNames(true); Index: sources/drydemo/StateControllerTreatment.cpp =================================================================== diff -u -r521f29cb7dcd0de352dd744292488380e07cb9e3 -re8edefcae8e47854198b06c1a65e4e45da5f3afc --- sources/drydemo/StateControllerTreatment.cpp (.../StateControllerTreatment.cpp) (revision 521f29cb7dcd0de352dd744292488380e07cb9e3) +++ sources/drydemo/StateControllerTreatment.cpp (.../StateControllerTreatment.cpp) (revision e8edefcae8e47854198b06c1a65e4e45da5f3afc) @@ -122,15 +122,16 @@ _treatmentSubStates.prevDialysisSubState = _treatmentSubStates.dialysisSubState; _treatmentSubStates.fluidBolusState = FLUID_BOLUS_SALINE_IN_PROGRESS_STATE; _treatmentSubStates.dialysisSubState = DIALYSIS_UF_PAUSED_STATE; //DIALYSIS_UF_FLUID_BOLUS_STATE; // TODO UI goes to pause + _treatmentStatus.isDialysateInBypass = true; } else { _treatmentStatus.totalFluidBolusDeliveredML += _treatmentStatus.accumFluidBolusDeliveredML; _treatmentSubStates.dialysisSubState = _treatmentSubStates.prevDialysisSubState; + _treatmentStatus.isDialysateInBypass = false; } _treatmentRcvdMessages[ID_UI_FLUID_BOLUS_RQST].clear(); - handleUIResponseMessage(ID_TD_FLUID_BOLUS_RESP, ACCEPT_VALUE, {static_cast(REQUEST_REJECT_REASON_NONE), - _treatmentParams.fluidBlousVolumeML}); + handleUIResponseMessage(ID_TD_FLUID_BOLUS_RESP, ACCEPT_VALUE, {REQUEST_REJECT_REASON_NONE, _treatmentParams.fluidBlousVolumeML}); } if (!_treatmentRcvdMessages[ID_UI_BOLUS_VOLUME_CHANGE_RQST].isNull()) { @@ -156,6 +157,7 @@ _treatmentSubStates.dialysisSubState = _treatmentSubStates.prevDialysisSubState; _treatmentStatus.totalFluidBolusDeliveredML += _treatmentStatus.accumFluidBolusDeliveredML; _treatmentStatus.accumFluidBolusDeliveredML = 0.0; + _treatmentStatus.isDialysateInBypass = false; // Immediately broadcast the results to be updated handleFluidBolusBroadcastData(BC_IMMEDIATELY); } Index: sources/drydemo/StateControllerTreatmentBroadcasts.cpp =================================================================== diff -u -r521f29cb7dcd0de352dd744292488380e07cb9e3 -re8edefcae8e47854198b06c1a65e4e45da5f3afc --- sources/drydemo/StateControllerTreatmentBroadcasts.cpp (.../StateControllerTreatmentBroadcasts.cpp) (revision 521f29cb7dcd0de352dd744292488380e07cb9e3) +++ sources/drydemo/StateControllerTreatmentBroadcasts.cpp (.../StateControllerTreatmentBroadcasts.cpp) (revision e8edefcae8e47854198b06c1a65e4e45da5f3afc) @@ -27,10 +27,12 @@ static quint32 broadcastCounter = 3; if ((++broadcastCounter % NUM_OF_COUNTS_TIMER_BC_EMIT != 0) && (BCType == BC_DELAYED)) { return; } + quint32 localDialFlowMLPM = (_treatmentStatus.isDialysateInBypass ? 0 : dialFlowMLPM); + QVariantList msg; msg.append(static_cast(ID_TD_TREATMENT_SET_POINTS)); msg.append(Can_Id::eChlid_TD_Sync); - msg.append(bloodFlowMLPM); msg.append(dialFlowMLPM); msg.append(dialTempC); + msg.append(bloodFlowMLPM); msg.append(localDialFlowMLPM); msg.append(dialTempC); _isBroadcastListReady = false; _broadcastMessages.append(msg); _isBroadcastListReady = true; @@ -158,16 +160,16 @@ _isBroadcastListReady = true; } -void StateController::handleDDGenDialysateModeBroadcastData(const Broadcast_Type BCType, const bool isDialysateBypass) +void StateController::handleDDGenDialysateModeBroadcastData(const Broadcast_Type BCType) { static quint32 broadcastCounter = 15; if ((++broadcastCounter % NUM_OF_COUNTS_TIMER_BC_EMIT != 0) && (BCType == BC_DELAYED)) { return; } quint32 dummyData = 1; float dummyFloat = 150.2; - quint32 dialBypass = (_treatmentSubStates.fluidBolusState != FLUID_BOLUS_IDLE_STATE ? BYPASS_DIALYSATE_DELIVER : ALLOW_DIALYSATE_DELIVER); + quint32 dialBypass = ALLOW_DIALYSATE_DELIVER; //(_treatmentSubStates.fluidBolusState != FLUID_BOLUS_IDLE_STATE ? BYPASS_DIALYSATE_DELIVER : ALLOW_DIALYSATE_DELIVER); // NOTE: when we go to treatment pause we should be in bypass while fluid bolus is still in idle so used this exception - if (isDialysateBypass) { dialBypass = BYPASS_DIALYSATE_DELIVER; } + if (_treatmentStatus.isDialysateInBypass) { dialBypass = BYPASS_DIALYSATE_DELIVER; } QVariantList msg; msg.append(static_cast(ID_DD_GEN_DIALYSATE_MODE_DATA)); @@ -186,7 +188,7 @@ static quint32 broadcastCounter = 22; if ((++broadcastCounter % NUM_OF_COUNTS_TIMER_BC_EMIT != 0) && (BCType == BC_DELAYED)) { return; } - float d27Cond = 250.63; + float d27Cond = 13.2; QVariantList msg; msg.append(static_cast(ID_DD_CONDUCTIVITY_DATA)); @@ -277,7 +279,7 @@ _isBroadcastListReady = true; } -void StateController::handleTreatmentPauseBroadcastData(const Broadcast_Type BCType) +void StateController::handleTreatmentPauseBroadcastData(const Broadcast_Type BCType, const bool zeroCounter) { static quint32 broadcastCounter = 90; if ((++broadcastCounter % NUM_OF_COUNTS_TIMER_BC_EMIT != 0) && (BCType == BC_DELAYED)) { return; } @@ -286,6 +288,9 @@ quint32 countdownMS = (_treatmentStatus.txPauseBloodSittingCounter >= MAX_TIME_BLOOD_SITTING ? 0 : (MAX_TIME_BLOOD_SITTING - _treatmentStatus.txPauseBloodSittingCounter) / (MILLISECONDS_PER_SECOND / QOBJECT_TIMER_TIMEOUT_MS)); + // Zero the counter to make sure they do not show up + if (zeroCounter) { timeoutMS = 0; countdownMS = 0; } + QVariantList msg; msg.append(static_cast(ID_TD_TREATMENT_PAUSED_TIMER_DATA)); msg.append(Can_Id::eChlid_TD_Sync);