Index: sources/drydemo/DryDemoDefines.h =================================================================== diff -u -r38521851fd3271aa9a8965067d15daaba0db4b2e -r3a1edf1c2dc6f68d32af3adeeee4a59bbac739c5 --- sources/drydemo/DryDemoDefines.h (.../DryDemoDefines.h) (revision 38521851fd3271aa9a8965067d15daaba0db4b2e) +++ sources/drydemo/DryDemoDefines.h (.../DryDemoDefines.h) (revision 3a1edf1c2dc6f68d32af3adeeee4a59bbac739c5) @@ -77,6 +77,7 @@ #define VEN_PRES_LIMIT_WINDOW_MMHG 50 #define VEN_PRES_LIMIT_ASYMM_MMHG 35 #define TMP_PRES_LIMIT_WINDOW_MMHG 20 +#define PRES_LIMIT_MIN_STABE_TIME_MS (PRES_LIMIT_STABE_TIME_MS - PRES_LIMIT_SHORT_STABE_TIME_MS) // Initiate treatment #define INITIATE_TREATMENT 1 Index: sources/drydemo/StateController.cpp =================================================================== diff -u -r38521851fd3271aa9a8965067d15daaba0db4b2e -r3a1edf1c2dc6f68d32af3adeeee4a59bbac739c5 --- sources/drydemo/StateController.cpp (.../StateController.cpp) (revision 38521851fd3271aa9a8965067d15daaba0db4b2e) +++ sources/drydemo/StateController.cpp (.../StateController.cpp) (revision 3a1edf1c2dc6f68d32af3adeeee4a59bbac739c5) @@ -14,7 +14,8 @@ startTimer(QOBJECT_TIMER_TIMEOUT_MS); connect(&_ApplicationController, SIGNAL(didUnhandledMsgAppController(const QVariantList &)), this , SLOT(doStateControllerUnhandledMsgReceived(const QVariantList &))); - + // Reset the elapsed time counter + _elapsedTimeCtr = 0; // State machine methods _dryDemo.connectToState("Standby" , this, &StateController::onStandbyStateChange ); _dryDemo.connectToState("Pre_Tx" , this, &StateController::onPretreatmentStateChange ); @@ -142,6 +143,8 @@ void StateController::timerEvent(QTimerEvent *) { + _elapsedTimeCtr++; + if (!_dryDemo.isRunning()){ _dryDemo.start(); } _dryDemo.submitEvent("TimeoutEvent"); @@ -292,8 +295,9 @@ handleBackToStandbyEvent(status); handleBloodPrimePauseResume(resume); handleSetPointBloodFlowChange(currBloodFlowMLPM, hasFlowChngeRequested); - handleTDPressureBroadcastData(BC_DELAYED); handlePressureLimitState(); + handleTDPressureBroadcastData(BC_DELAYED); + handleDeterminePressureLimits(); handleFluidBolusRequestMessage(); if (_treatmentSubStates.fluidBolusState == FLUID_BOLUS_SALINE_IN_PROGRESS_STATE){ handleFluidBolusFluidDelivery(currBloodFlowMLPM); @@ -440,11 +444,14 @@ handleAlarmUserAction(status, true); handleTDOpModeTransitionBroadcastData(MODE_TREA, 0, BC_DELAYED); handlePressureLimitState(); - handleTreatmentStatesBroadcastData(BC_DELAYED); + handleTDPressureBroadcastData(BC_DELAYED); + handleDeterminePressureLimits(); }; auto onExit = [=](){ qDebug() << "Tx pasue in exit"; + // Set the pressure to close upon exiting the treatment pause + handleSignalInitiatePressureStabilization(USE_NORMAL_STABILIZATION_PERIOD); _dryDemo.submitEvent(_treatmentStatus.stateTransitionEvent); status = STATE_ON_ENTRY; }; @@ -461,7 +468,9 @@ auto onEntry = [=](){ // Start with UF state in dialysis + _treatmentSubStates.txState = TREAT_START_STATE; _treatmentSubStates.dialysisSubState = DIALYSIS_UF_PAUSED_STATE; + handleTreatmentStatesBroadcastData(BC_IMMEDIATELY); _treatmentSubStates.txState = TREAT_RINSEBACK_STATE; _treatmentSubStates.rinsebackState = RINSEBACK_STOP_INIT_STATE; handleTDOpModeTransitionBroadcastData(MODE_TREA, 0, BC_IMMEDIATELY); @@ -482,6 +491,7 @@ handleRinsebackBroadcastData(BC_DELAYED); handlePressureLimitState(); handleTDPressureBroadcastData(BC_DELAYED); + handleDeterminePressureLimits(); handleUIConfirmMessage(GENERIC_CONFIRM_ID_TREATMENT_END, status); if (_treatmentStatus.hasRecircBeenRequested) { _treatmentStatus.stateTransitionEvent = "T_RB_2_RC"; Index: sources/drydemo/StateController.h =================================================================== diff -u -r38521851fd3271aa9a8965067d15daaba0db4b2e -r3a1edf1c2dc6f68d32af3adeeee4a59bbac739c5 --- sources/drydemo/StateController.h (.../StateController.h) (revision 38521851fd3271aa9a8965067d15daaba0db4b2e) +++ sources/drydemo/StateController.h (.../StateController.h) (revision 3a1edf1c2dc6f68d32af3adeeee4a59bbac739c5) @@ -75,7 +75,7 @@ struct Pressure_Vars { Pressure_Limits_States presLimitState; - Pressure_Stabilization_Periods presStabilizeTime; + Pressure_Stabilization_Periods presStabilizeTimePeriod; quint32 presStabilizationTimerCtr; quint32 presStabilizeTimeoutMS; // Arterial @@ -155,6 +155,7 @@ Treatment_Sub_State_Vars _treatmentSubStates; bool _isBroadcastListReady; // TODO use a mutex? bool _isSendListReady; // Todo use a mutex? + quint32 _elapsedTimeCtr; drydemoXMLStates _dryDemo; // CAN function(s) @@ -221,9 +222,11 @@ void handleUltrafiltrationVolumeChangeConfirm(); void handleTreatmentTimeChangeValidation(); void handleTreatmentTimeChangeConfirm(); + // Treatment pressure methods void handlePressureLimitState(); void handleUpdatePressureLimitWindows(); void handleDeterminePressureLimits(); + void handleSignalInitiatePressureStabilization(const Pressure_Stabilization_Periods period); void handleWidenPressureLimitsMessage(); // Treatment rinseback methods Index: sources/drydemo/StateControllerRecirc.cpp =================================================================== diff -u -rb9f4ddeb2dec3019b87c712bfe64b8df1d4b328c -r3a1edf1c2dc6f68d32af3adeeee4a59bbac739c5 --- sources/drydemo/StateControllerRecirc.cpp (.../StateControllerRecirc.cpp) (revision b9f4ddeb2dec3019b87c712bfe64b8df1d4b328c) +++ sources/drydemo/StateControllerRecirc.cpp (.../StateControllerRecirc.cpp) (revision 3a1edf1c2dc6f68d32af3adeeee4a59bbac739c5) @@ -10,6 +10,7 @@ _treatmentStatus.hasResumeTxBeenRequested = false; _treatmentStatus.hasRecircWarnAlarmBeenTrig = false; _treatmentStatus.hasRecircTimeoutAlarmBeenTrig = false; + _treatmentStatus.isBloodPumpRunning = true; } void StateController::handleRecircRequestMessage() Index: sources/drydemo/StateControllerRinseback.cpp =================================================================== diff -u -rb9f4ddeb2dec3019b87c712bfe64b8df1d4b328c -r3a1edf1c2dc6f68d32af3adeeee4a59bbac739c5 --- sources/drydemo/StateControllerRinseback.cpp (.../StateControllerRinseback.cpp) (revision b9f4ddeb2dec3019b87c712bfe64b8df1d4b328c) +++ sources/drydemo/StateControllerRinseback.cpp (.../StateControllerRinseback.cpp) (revision 3a1edf1c2dc6f68d32af3adeeee4a59bbac739c5) @@ -13,6 +13,7 @@ _treatmentStatus.rinsebackTimerCounter = 0; _treatmentStatus.rinsebackAdditionalTimerCounter = 0; _treatmentStatus.rinsebackTgtVolPlusAddVolML = _treatmentParams.rinsebackVolumeML; + _treatmentStatus.isBloodPumpRunning = true; } void StateController::handleRinsebackRequestMessage() Index: sources/drydemo/StateControllerStandby.cpp =================================================================== diff -u -r38521851fd3271aa9a8965067d15daaba0db4b2e -r3a1edf1c2dc6f68d32af3adeeee4a59bbac739c5 --- sources/drydemo/StateControllerStandby.cpp (.../StateControllerStandby.cpp) (revision 38521851fd3271aa9a8965067d15daaba0db4b2e) +++ sources/drydemo/StateControllerStandby.cpp (.../StateControllerStandby.cpp) (revision 3a1edf1c2dc6f68d32af3adeeee4a59bbac739c5) @@ -101,7 +101,7 @@ _treatmentStatus.isBloodPumpRunning = false; // Initialize pressure vars _pressureVars.presLimitState = PRESSURE_LIMITS_STATE_OFF; - _pressureVars.presStabilizeTime = USE_NORMAL_STABILIZATION_PERIOD; + _pressureVars.presStabilizeTimePeriod = USE_NORMAL_STABILIZATION_PERIOD; _pressureVars.arterialIndex = 0; _pressureVars.arterialRunningSumMMHG = 0.0; _pressureVars.arterialMinLimitMMHG = MIN_ART_PRES_LIMIT_MMHG; Index: sources/drydemo/StateControllerTreatment.cpp =================================================================== diff -u -r38521851fd3271aa9a8965067d15daaba0db4b2e -r3a1edf1c2dc6f68d32af3adeeee4a59bbac739c5 --- sources/drydemo/StateControllerTreatment.cpp (.../StateControllerTreatment.cpp) (revision 38521851fd3271aa9a8965067d15daaba0db4b2e) +++ sources/drydemo/StateControllerTreatment.cpp (.../StateControllerTreatment.cpp) (revision 3a1edf1c2dc6f68d32af3adeeee4a59bbac739c5) @@ -110,9 +110,10 @@ void StateController::handleFluidBolusRequestMessage() { - if (! _treatmentRcvdMessages[ID_UI_FLUID_BOLUS_RQST].isNull()){ + if (!_treatmentRcvdMessages[ID_UI_FLUID_BOLUS_RQST].isNull()){ quint32 fluidBolusCmd = extractU32DataFromReceivedMessage(ID_UI_FLUID_BOLUS_RQST, 0); - + // Regardless of starting or stoping the bolus, widen the range + handleSignalInitiatePressureStabilization(USE_NORMAL_STABILIZATION_PERIOD); // Assume the fluid bolus is not in progress _treatmentSubStates.fluidBolusState = FLUID_BOLUS_IDLE_STATE; @@ -127,7 +128,7 @@ _treatmentParams.fluidBlousVolumeML}); } - if (! _treatmentRcvdMessages[ID_UI_BOLUS_VOLUME_CHANGE_RQST].isNull()){ + if (!_treatmentRcvdMessages[ID_UI_BOLUS_VOLUME_CHANGE_RQST].isNull()){ quint32 fluidBolusVolML = extractU32DataFromReceivedMessage(ID_UI_BOLUS_VOLUME_CHANGE_RQST, 0); // TODO Check the range of the requested bolus volume @@ -465,7 +466,7 @@ if (!_treatmentStatus.isBloodPumpRunning) { _pressureVars.presLimitState = PRESSURE_LIMITS_STATE_IDLE; } else if ((_treatmentSubStates.txState == TREAT_DIALYSIS_STATE) || (_treatmentSubStates.txState == TREAT_PAUSED_STATE)) { _pressureVars.presStabilizationTimerCtr = 0; - _pressureVars.presStabilizeTime = USE_NORMAL_STABILIZATION_PERIOD; + _pressureVars.presStabilizeTimePeriod = USE_NORMAL_STABILIZATION_PERIOD; _pressureVars.presLimitState = PRESSURE_LIMITS_STATE_STABILIZATION; } else if (_treatmentSubStates.txState == TREAT_RECIRC_STATE) { _pressureVars.presLimitState = PRESSURE_LIMITS_STATE_OFF; } @@ -486,7 +487,7 @@ else if ((_pressureVars.presStabilizationTimerCtr * QOBJECT_TIMER_TIMEOUT_MS) >= _pressureVars.presStabilizeTimeoutMS) { handleUpdatePressureLimitWindows(); _pressureVars.presStabilizationTimerCtr = 0; - _pressureVars.presStabilizeTime = USE_NORMAL_STABILIZATION_PERIOD; + _pressureVars.presStabilizeTimePeriod = USE_NORMAL_STABILIZATION_PERIOD; _pressureVars.presLimitState = PRESSURE_LIMITS_STATE_STABLE; } break; @@ -496,12 +497,11 @@ if (!_treatmentStatus.isBloodPumpRunning) { _pressureVars.presLimitState = PRESSURE_LIMITS_STATE_IDLE; } else if ((_treatmentSubStates.txState != TREAT_DIALYSIS_STATE) && (_treatmentSubStates.txState != TREAT_PAUSED_STATE)) { _pressureVars.presLimitState = PRESSURE_LIMITS_STATE_WIDE; - qDebug() << "WIDEW" << _pressureVars.presLimitState; } else if ((_pressureVars.presStabilizationTimerCtr * QOBJECT_TIMER_TIMEOUT_MS) >= PRES_LIMIT_RESTABILIZE_TIME_MS) { handleUpdatePressureLimitWindows(); _pressureVars.presStabilizationTimerCtr = 0; - _pressureVars.presStabilizeTime = STABILIZATION_PERIOD_OFF; + _pressureVars.presStabilizeTimePeriod = STABILIZATION_PERIOD_OFF; _pressureVars.presLimitState = PRESSURE_LIMITS_STATE_STABILIZATION; } break; @@ -521,7 +521,7 @@ float venMMHG; float tmpMMHG; - if (_pressureVars.presStabilizeTime == USE_SHORT_STABILIZATION_PERIOD) { + if (_pressureVars.presStabilizeTimePeriod == USE_SHORT_STABILIZATION_PERIOD) { artMMHG = _pressureVars.arterialFilteredMMHG; venMMHG = _pressureVars.venousFilteredMMHG; tmpMMHG = _pressureVars.tmpFilteredMMHG; @@ -576,10 +576,29 @@ } } +void StateController::handleSignalInitiatePressureStabilization(const Pressure_Stabilization_Periods period) +{ + if (_pressureVars.presLimitState == PRESSURE_LIMITS_STATE_STABILIZATION) { + quint32 currentTimeMS = _elapsedTimeCtr * QOBJECT_TIMER_TIMEOUT_MS; + quint32 presStabilizTimeMS = _pressureVars.presStabilizationTimerCtr * QOBJECT_TIMER_TIMEOUT_MS; + quint32 expiredTimeMS = (currentTimeMS >= presStabilizTimeMS ? presStabilizTimeMS - currentTimeMS : (0xFFFFFFFF - presStabilizTimeMS) + currentTimeMS + 1); + qDebug() << "Pressure ranges" << currentTimeMS << presStabilizTimeMS << expiredTimeMS; + if ((expiredTimeMS > PRES_LIMIT_MIN_STABE_TIME_MS) || (period == USE_NORMAL_STABILIZATION_PERIOD)) { + _pressureVars.presStabilizeTimePeriod = period; + _pressureVars.presStabilizationTimerCtr = 0; + } + } + else if (_pressureVars.presLimitState == PRESSURE_LIMITS_STATE_STABLE) { + _pressureVars.presStabilizeTimePeriod = period; + _pressureVars.presLimitState = PRESSURE_LIMITS_STATE_STABILIZATION; + _pressureVars.presStabilizationTimerCtr = 0; + } +} + void StateController::handleWidenPressureLimitsMessage() { - if (! _treatmentRcvdMessages[ID_UI_PRESSURE_LIMIT_WIDEN_RQST].isNull()){ + if (! _treatmentRcvdMessages[ID_UI_PRESSURE_LIMIT_WIDEN_RQST].isNull()) { _treatmentRcvdMessages[ID_UI_PRESSURE_LIMIT_WIDEN_RQST].clear(); // TODo address the increase per request handleUIResponseMessage(ID_TD_PRESSURE_LIMIT_WIDEN_RESP, ACCEPT_VALUE); @@ -589,3 +608,5 @@ + +