Index: sources/drydemo/DryDemoDefines.h =================================================================== diff -u -rc52253ab5fc73e9b59d9cd99eada3d526d799987 -r38521851fd3271aa9a8965067d15daaba0db4b2e --- sources/drydemo/DryDemoDefines.h (.../DryDemoDefines.h) (revision c52253ab5fc73e9b59d9cd99eada3d526d799987) +++ sources/drydemo/DryDemoDefines.h (.../DryDemoDefines.h) (revision 38521851fd3271aa9a8965067d15daaba0db4b2e) @@ -1,6 +1,5 @@ #pragma once -// TODO REMOVE // General defines #define UI_MSG_BB_STATUS_INDEX 4 #define UI_MSG_BB_PAYLOAD_ID 0x63 @@ -13,7 +12,6 @@ #define ACCEPT_VALUE 1 #define REJECT_VALUE 0 #define NEARLY_ZERO 0.00000001 -#define PASS_RESULT 1 // TODO remove #define DEVICE_ID 1234 #define UI_CONFIRM_RESP_TIMOUT_MS (SECONDS_PER_MINUTE * MILLISECONDS_PER_SECOND) #define RCVD_MSG_MSG_ID_INDEX 0 @@ -60,14 +58,25 @@ #define DEF_TX_DIASTOLIC_PRESSURE 80 #define DEF_TX_HEART_BEAT 100 -// Arterial /Venous limits +// Arterial /Venous limits & Baro +#define DEF_BARO_PRES_PSI 14.2 +#define DEF_ART_LONG_FILT_PRES_MMHG 0.0 +#define DEF_VEN_LONG_FILT_PRES_MMHG 0.0 +#define DEF_TMP_LONG_FILT_PRES_MMHG 0.0 #define MIN_ART_PRES_LIMIT_MMHG -300.0 #define MAX_ART_PRES_LIMIT_MMHG 100.0 #define MIN_VEN_PRES_LIMIT_MMHG 20.0 #define MAX_VEN_PRES_LIMIT_MMHG 400.0 -#define MAX_TMP_PRES_LIMIT_MMHG 100.0 #define MIN_TMP_PRES_LIMIT_MMHG -500.0 -#define OCCLUSION_STABLE_TIME_COUNT (10 * MILLISECONDS_PER_SECOND) / QOBJECT_TIMER_TIMEOUT_MS +#define MAX_TMP_PRES_LIMIT_MMHG 100.0 +#define SHORT_MOVING_AVG_SIZE MILLISECONDS_PER_SECOND / QOBJECT_TIMER_TIMEOUT_MS +#define PRES_LIMIT_SHORT_STABE_TIME_MS (10 * MILLISECONDS_PER_SECOND) +#define PRES_LIMIT_STABE_TIME_MS (60 * MILLISECONDS_PER_SECOND) +#define PRES_LIMIT_RESTABILIZE_TIME_MS (15 * SECONDS_PER_MINUTE * MILLISECONDS_PER_SECOND) +#define ART_PRES_LIMIT_WINDOW_MMHG 50 +#define VEN_PRES_LIMIT_WINDOW_MMHG 50 +#define VEN_PRES_LIMIT_ASYMM_MMHG 35 +#define TMP_PRES_LIMIT_WINDOW_MMHG 20 // Initiate treatment #define INITIATE_TREATMENT 1 @@ -213,6 +222,21 @@ TREATMENT_END_FLUID_BOLUS_STATE = 2, }; +// Pressure limits +enum Pressure_Limits_States { + PRESSURE_LIMITS_STATE_OFF = 0, + PRESSURE_LIMITS_STATE_IDLE = 1, + PRESSURE_LIMITS_STATE_WIDE = 2, + PRESSURE_LIMITS_STATE_STABILIZATION = 3, + PRESSURE_LIMITS_STATE_STABLE = 4, +}; + +enum Pressure_Stabilization_Periods { + STABILIZATION_PERIOD_OFF = 0, + USE_SHORT_STABILIZATION_PERIOD = 1, + USE_NORMAL_STABILIZATION_PERIOD = 2, +}; + enum State_Status { STATE_ON_ENTRY = 0, STATE_ON_ACTION, @@ -233,11 +257,11 @@ }; enum Alarm_User_Actions { - ALARM_USER_ACTION_RESUME = 0, - ALARM_USER_ACTION_RINSEBACK = 1, - ALARM_USER_ACTION_END_TREATMENT = 2, - ALARM_USER_ACTION_ACK = 3, - ALARM_USER_ACTION_TEMPOARY_BREAK = 4, + ALARM_USER_ACTION_RESUME = 0, + ALARM_USER_ACTION_RINSEBACK = 1, + ALARM_USER_ACTION_END_TREATMENT = 2, + ALARM_USER_ACTION_ACK = 3, + ALARM_USER_ACTION_TEMPOARY_BREAK = 4, }; enum Alarm_List { Index: sources/drydemo/StateController.cpp =================================================================== diff -u -rc52253ab5fc73e9b59d9cd99eada3d526d799987 -r38521851fd3271aa9a8965067d15daaba0db4b2e --- sources/drydemo/StateController.cpp (.../StateController.cpp) (revision c52253ab5fc73e9b59d9cd99eada3d526d799987) +++ sources/drydemo/StateController.cpp (.../StateController.cpp) (revision 38521851fd3271aa9a8965067d15daaba0db4b2e) @@ -277,6 +277,7 @@ currBloodFlowMLPM = BLOOD_PRIME_START_FLOW_MLPM; resume = true; hasFlowChngeRequested = false; + _treatmentStatus.isBloodPumpRunning = true; _treatmentSubStates.bloodPrimeState = BLOOD_PRIME_RAMP_STATE; _treatmentSubStates.txState = TREAT_BLOOD_PRIME_STATE; handleTreatmentStatesBroadcastData(BC_IMMEDIATELY); @@ -291,7 +292,8 @@ handleBackToStandbyEvent(status); handleBloodPrimePauseResume(resume); handleSetPointBloodFlowChange(currBloodFlowMLPM, hasFlowChngeRequested); - handleTDPressureProcessAndBroadcastData(BC_DELAYED); + handleTDPressureBroadcastData(BC_DELAYED); + handlePressureLimitState(); handleFluidBolusRequestMessage(); if (_treatmentSubStates.fluidBolusState == FLUID_BOLUS_SALINE_IN_PROGRESS_STATE){ handleFluidBolusFluidDelivery(currBloodFlowMLPM); @@ -335,6 +337,7 @@ auto onEntry = [=](){ hasFlowChngeRequested = false; _treatmentSubStates.txState = TREAT_START_STATE; + _treatmentStatus.isBloodPumpRunning = true; handleTreatmentStatesBroadcastData(BC_IMMEDIATELY); // Start with UF state in dialysis _treatmentSubStates.dialysisSubState = DIALYSIS_UF_STATE; @@ -373,7 +376,9 @@ handleDDConductivityBroadcastData(BC_DELAYED); handleSetPointDialysateFlowChange(); handleSetPointDialysateTemperatureChange(); - handleTDPressureProcessAndBroadcastData(BC_DELAYED); + handlePressureLimitState(); + handleTDPressureBroadcastData(BC_DELAYED); + handleDeterminePressureLimits(); // UF functions funcntios handleUltrafiltrationPauseResume(); handleUltrafiltrationVolumeChangeValidation(); @@ -434,6 +439,7 @@ handleBackToStandbyEvent(status); handleAlarmUserAction(status, true); handleTDOpModeTransitionBroadcastData(MODE_TREA, 0, BC_DELAYED); + handlePressureLimitState(); handleTreatmentStatesBroadcastData(BC_DELAYED); }; @@ -474,7 +480,8 @@ handleRinsebackRequestMessage(); handleRinsebackDelivery(); handleRinsebackBroadcastData(BC_DELAYED); - handleTDPressureProcessAndBroadcastData(BC_DELAYED); + handlePressureLimitState(); + handleTDPressureBroadcastData(BC_DELAYED); handleUIConfirmMessage(GENERIC_CONFIRM_ID_TREATMENT_END, status); if (_treatmentStatus.hasRecircBeenRequested) { _treatmentStatus.stateTransitionEvent = "T_RB_2_RC"; Index: sources/drydemo/StateController.h =================================================================== diff -u -rc52253ab5fc73e9b59d9cd99eada3d526d799987 -r38521851fd3271aa9a8965067d15daaba0db4b2e --- sources/drydemo/StateController.h (.../StateController.h) (revision c52253ab5fc73e9b59d9cd99eada3d526d799987) +++ sources/drydemo/StateController.h (.../StateController.h) (revision 38521851fd3271aa9a8965067d15daaba0db4b2e) @@ -35,6 +35,8 @@ User_Command_ID userCmd; QString stateTransitionEvent; bool requestTreatmentReset; + // Blood pump + bool isBloodPumpRunning; // Treatment time variable(s) quint32 treatmentElapsedTimeMS; bool isTreatmentComplete; @@ -71,6 +73,37 @@ bool hasRecircTimeoutAlarmBeenTrig; }; + struct Pressure_Vars { + Pressure_Limits_States presLimitState; + Pressure_Stabilization_Periods presStabilizeTime; + quint32 presStabilizationTimerCtr; + quint32 presStabilizeTimeoutMS; + // Arterial + float arterialRawMMHG[SHORT_MOVING_AVG_SIZE]; + quint32 arterialIndex; + float arterialRunningSumMMHG; + qint32 arterialMinLimitMMHG; + qint32 arterialMaxLimitMMHG; + float arterialFilteredMMHG; + qint32 arterialStableMMHG; + // Venous + float venousRawMMHG[SHORT_MOVING_AVG_SIZE]; + quint32 venousIndex; + float venousRunningSumMMHG; + qint32 venousMinLimitMMHG; + qint32 venousMaxLimitMMHG; + float venousFilteredMMHG; + qint32 venousStableMMHG; + // TMP + float tmpRawMMHG[SHORT_MOVING_AVG_SIZE]; + quint32 tmpIndex; + float tmpRunningSumMMHG; + float tmpMinLimitMMHG; + float tmpMaxLimitMMHG; + float tmpFilteredMMHG; + qint32 tmpStableMMHG; + }; + struct Treatment_Sub_State_Vars { Treatment_States txState; Blood_Prime_States bloodPrimeState; @@ -109,19 +142,20 @@ float ufVolumeL; }; - QHash _transitionEventsFromStandby; - QHash _alarmTriggerSpecs; - QList _broadcastMessages; - QList _sendMessages; - QHash _treatmentRcvdMessages; - QHash _uiConfirmMessages; - QRandomGenerator _randNumGenerator; - Treatment_Params _treatmentParams; - Treatment_Status_Vars _treatmentStatus; - Treatment_Sub_State_Vars _treatmentSubStates; - bool _isBroadcastListReady; // TODO use a mutex? - bool _isSendListReady; // Todo use a mutex? - drydemoXMLStates _dryDemo; + QHash _transitionEventsFromStandby; + QHash _alarmTriggerSpecs; + QList _broadcastMessages; + QList _sendMessages; + QHash _treatmentRcvdMessages; + QHash _uiConfirmMessages; + QRandomGenerator _randNumGenerator; + Pressure_Vars _pressureVars; + Treatment_Params _treatmentParams; + Treatment_Status_Vars _treatmentStatus; + Treatment_Sub_State_Vars _treatmentSubStates; + bool _isBroadcastListReady; // TODO use a mutex? + bool _isSendListReady; // Todo use a mutex? + drydemoXMLStates _dryDemo; // CAN function(s) void sendMessages(bool isBroadcast); @@ -171,7 +205,7 @@ void handleFluidBolusRequestMessage(); void handleFluidBolusFluidDelivery(const quint32 bloodFlowMLPM); void handleFluidBolusBroadcastData(const Broadcast_Type BCType); - void handleTDPressureProcessAndBroadcastData(const Broadcast_Type BCType); + void handleTDPressureBroadcastData(const Broadcast_Type BCType); void handleTreatmentTimeProcessAndBroadcastData(const Broadcast_Type BCType); void handleTreatmentPrescriptionEditRequestMessage(); void handleSetPointBloodFlowChange(quint32 &bloodFlowMLPM, bool &hasBloodFlowChanged); @@ -187,6 +221,10 @@ void handleUltrafiltrationVolumeChangeConfirm(); void handleTreatmentTimeChangeValidation(); void handleTreatmentTimeChangeConfirm(); + void handlePressureLimitState(); + void handleUpdatePressureLimitWindows(); + void handleDeterminePressureLimits(); + void handleWidenPressureLimitsMessage(); // Treatment rinseback methods void initializeRinseback(); Index: sources/drydemo/StateControllerStandby.cpp =================================================================== diff -u -rc52253ab5fc73e9b59d9cd99eada3d526d799987 -r38521851fd3271aa9a8965067d15daaba0db4b2e --- sources/drydemo/StateControllerStandby.cpp (.../StateControllerStandby.cpp) (revision c52253ab5fc73e9b59d9cd99eada3d526d799987) +++ sources/drydemo/StateControllerStandby.cpp (.../StateControllerStandby.cpp) (revision 38521851fd3271aa9a8965067d15daaba0db4b2e) @@ -98,6 +98,27 @@ _treatmentStatus.ufVolDeliveredL = 0.0; _treatmentStatus.hasRecircBeenRequested = false; _treatmentStatus.lowVenousAlarmTimeoutCtr = 0; + _treatmentStatus.isBloodPumpRunning = false; + // Initialize pressure vars + _pressureVars.presLimitState = PRESSURE_LIMITS_STATE_OFF; + _pressureVars.presStabilizeTime = USE_NORMAL_STABILIZATION_PERIOD; + _pressureVars.arterialIndex = 0; + _pressureVars.arterialRunningSumMMHG = 0.0; + _pressureVars.arterialMinLimitMMHG = MIN_ART_PRES_LIMIT_MMHG; + _pressureVars.arterialMaxLimitMMHG = MAX_ART_PRES_LIMIT_MMHG; + std::fill(std::begin(_pressureVars.arterialRawMMHG), std::end(_pressureVars.arterialRawMMHG), 0); + + _pressureVars.venousIndex = 0; + _pressureVars.venousRunningSumMMHG = 0.0; + _pressureVars.venousMinLimitMMHG = MIN_VEN_PRES_LIMIT_MMHG; + _pressureVars.venousMaxLimitMMHG = MAX_VEN_PRES_LIMIT_MMHG; + std::fill(std::begin(_pressureVars.venousRawMMHG), std::end(_pressureVars.venousRawMMHG), 0); + + _pressureVars.tmpIndex = 0; + _pressureVars.tmpRunningSumMMHG = 0.0; + _pressureVars.tmpMinLimitMMHG = MIN_TMP_PRES_LIMIT_MMHG; + _pressureVars.tmpMaxLimitMMHG = MAX_TMP_PRES_LIMIT_MMHG; + std::fill(std::begin(_pressureVars.tmpRawMMHG), std::end(_pressureVars.tmpRawMMHG), 0); } void StateController::triggerAnAlarm(Alarm_List alarmID) Index: sources/drydemo/StateControllerTreatment.cpp =================================================================== diff -u -rc52253ab5fc73e9b59d9cd99eada3d526d799987 -r38521851fd3271aa9a8965067d15daaba0db4b2e --- sources/drydemo/StateControllerTreatment.cpp (.../StateControllerTreatment.cpp) (revision c52253ab5fc73e9b59d9cd99eada3d526d799987) +++ sources/drydemo/StateControllerTreatment.cpp (.../StateControllerTreatment.cpp) (revision 38521851fd3271aa9a8965067d15daaba0db4b2e) @@ -38,6 +38,8 @@ static quint32 pauseCountDownS = 0; static quint32 elapsedTimeSincePauseS = 0; static quint32 controlCounter = 0; + // Assume the blood pump is running unless the pause button has been resumed + _treatmentStatus.isBloodPumpRunning = true; if (!resume) { // If the user has pressed pause, then do the countdown and broadcast @@ -46,6 +48,8 @@ primeTimeoutS = BLOOD_PRIME_PAUSE_TIMEOUT_S; pauseCountDownS = ( elapsedTimeSincePauseS / MILLISECONDS_PER_SECOND < BLOOD_PRIME_PAUSE_TIMEOUT_S ? BLOOD_PRIME_PAUSE_TIMEOUT_S - elapsedTimeSincePauseS / MILLISECONDS_PER_SECOND : pauseCountDownS ); handleBloodPrimeBroadcastData(accumBloodVolML, primeTimeoutS, pauseCountDownS, BC_DELAYED); + // Blood prime has been paused so the blood pump is not running + _treatmentStatus.isBloodPumpRunning = false; return; } @@ -149,7 +153,7 @@ // Immediately broadcast the results to be updated handleFluidBolusBroadcastData(BC_IMMEDIATELY); } - qDebug() << "Bolus" << _treatmentStatus.accumFluidBolusDeliveredML << _treatmentStatus.totalFluidBolusDeliveredML; + //qDebug() << "Bolus" << _treatmentStatus.accumFluidBolusDeliveredML << _treatmentStatus.totalFluidBolusDeliveredML; } void StateController::handleTreatmentPrescriptionEditRequestMessage() @@ -181,12 +185,7 @@ resp.append(0); GetValue(payload.toByteArray(), index, u32Var); - qDebug() << "Old conc" << _treatmentParams.acidConcentrate; - if (_treatmentParams.acidConcentrate != u32Var.value) { - qDebug() << "New conc" << _treatmentParams.acidConcentrate; - triggerAnAlarm(ALARM_ID_TD_REPLACE_ACID_JUG); - } - + if (_treatmentParams.acidConcentrate != u32Var.value) { triggerAnAlarm(ALARM_ID_TD_REPLACE_ACID_JUG); } _treatmentParams.acidConcentrate = u32Var.value; resp.append(0); @@ -448,5 +447,145 @@ _treatmentRcvdMessages[ID_UI_DURATION_CONFIRM_RQST].clear(); } +void StateController::handlePressureLimitState() +{ + switch (_pressureVars.presLimitState) { + case PRESSURE_LIMITS_STATE_OFF: + if ((_treatmentSubStates.txState > TREAT_START_STATE) && (_treatmentSubStates.txState != TREAT_RECIRC_STATE)) { + _pressureVars.presLimitState = PRESSURE_LIMITS_STATE_IDLE; + } + break; + case PRESSURE_LIMITS_STATE_IDLE: + // TODO do we want to show the blood prime ramp? + _pressureVars.presLimitState = PRESSURE_LIMITS_STATE_WIDE; + break; + case PRESSURE_LIMITS_STATE_WIDE: + 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.presLimitState = PRESSURE_LIMITS_STATE_STABILIZATION; + } + else if (_treatmentSubStates.txState == TREAT_RECIRC_STATE) { _pressureVars.presLimitState = PRESSURE_LIMITS_STATE_OFF; } + break; + + case PRESSURE_LIMITS_STATE_STABILIZATION: + // Assume the stabilization timeout is normal timeout + _pressureVars.presStabilizeTimeoutMS = PRES_LIMIT_STABE_TIME_MS; + _pressureVars.presStabilizationTimerCtr++; + if (_pressureVars.presLimitState == PRESSURE_LIMITS_STATE_STABILIZATION) { + _pressureVars.presStabilizeTimeoutMS = PRES_LIMIT_SHORT_STABE_TIME_MS; + } + + 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; + } + else if ((_pressureVars.presStabilizationTimerCtr * QOBJECT_TIMER_TIMEOUT_MS) >= _pressureVars.presStabilizeTimeoutMS) { + handleUpdatePressureLimitWindows(); + _pressureVars.presStabilizationTimerCtr = 0; + _pressureVars.presStabilizeTime = USE_NORMAL_STABILIZATION_PERIOD; + _pressureVars.presLimitState = PRESSURE_LIMITS_STATE_STABLE; + } + break; + + case PRESSURE_LIMITS_STATE_STABLE: + _pressureVars.presStabilizationTimerCtr++; + 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.presLimitState = PRESSURE_LIMITS_STATE_STABILIZATION; + } + break; + + default: + // Do nothing + break; + } + + qDebug() << "Pres Steat" << _pressureVars.presLimitState << _treatmentStatus.isBloodPumpRunning << _pressureVars.presStabilizeTimeoutMS + << _pressureVars.presStabilizationTimerCtr * QOBJECT_TIMER_TIMEOUT_MS << _treatmentSubStates.txState ; +} + +void StateController::handleUpdatePressureLimitWindows() +{ + float artMMHG; + float venMMHG; + float tmpMMHG; + + if (_pressureVars.presStabilizeTime == USE_SHORT_STABILIZATION_PERIOD) { + artMMHG = _pressureVars.arterialFilteredMMHG; + venMMHG = _pressureVars.venousFilteredMMHG; + tmpMMHG = _pressureVars.tmpFilteredMMHG; + } + else { + // TODO need to do the long filtered? + artMMHG = _pressureVars.arterialFilteredMMHG; + venMMHG = _pressureVars.venousFilteredMMHG; + tmpMMHG = _pressureVars.tmpFilteredMMHG; + } + + _pressureVars.arterialStableMMHG = (artMMHG < 0.0 ? static_cast(artMMHG - 0.5) : static_cast(artMMHG + 0.5)); + _pressureVars.venousStableMMHG = (venMMHG < 0.0 ? static_cast(venMMHG - 0.5) : static_cast(venMMHG + 0.5)); + _pressureVars.tmpStableMMHG = (tmpMMHG < 0.0 ? static_cast(tmpMMHG - 0.5) : static_cast(tmpMMHG + 0.5)); +} + +void StateController::handleDeterminePressureLimits() +{ + if (_pressureVars.presLimitState == PRESSURE_LIMITS_STATE_STABLE) { + qint32 artOffsetMMHG = static_cast(ART_PRES_LIMIT_WINDOW_MMHG) / 2; + qint32 venMinOffsetMMHG = static_cast(VEN_PRES_LIMIT_ASYMM_MMHG); + qint32 venMaxOffsetMMHG = static_cast(VEN_PRES_LIMIT_WINDOW_MMHG) - venMinOffsetMMHG; + qint32 tmpOffsetMMHG = static_cast(TMP_PRES_LIMIT_WINDOW_MMHG) / 2; + + _pressureVars.arterialMinLimitMMHG = _pressureVars.arterialStableMMHG - artOffsetMMHG; + _pressureVars.arterialMinLimitMMHG = qMax(_pressureVars.arterialMinLimitMMHG, static_cast(MIN_ART_PRES_LIMIT_MMHG)); + + _pressureVars.arterialMaxLimitMMHG = _pressureVars.arterialStableMMHG + artOffsetMMHG; + _pressureVars.arterialMaxLimitMMHG = qMin(_pressureVars.arterialMaxLimitMMHG, static_cast(MAX_ART_PRES_LIMIT_MMHG)); + + _pressureVars.venousMinLimitMMHG = _pressureVars.venousStableMMHG - venMinOffsetMMHG; + _pressureVars.venousMinLimitMMHG = qMax(_pressureVars.venousMinLimitMMHG, static_cast(MIN_VEN_PRES_LIMIT_MMHG)); + + _pressureVars.venousMaxLimitMMHG = _pressureVars.venousStableMMHG + venMaxOffsetMMHG; + _pressureVars.venousMaxLimitMMHG = qMin(_pressureVars.venousMaxLimitMMHG, static_cast(MAX_VEN_PRES_LIMIT_MMHG)); + + _pressureVars.tmpMinLimitMMHG = _pressureVars.tmpStableMMHG - tmpOffsetMMHG; + _pressureVars.tmpMinLimitMMHG = qMax(_pressureVars.tmpMinLimitMMHG, static_cast(MIN_TMP_PRES_LIMIT_MMHG)); + + _pressureVars.tmpMaxLimitMMHG = _pressureVars.tmpStableMMHG + tmpOffsetMMHG; + _pressureVars.tmpMaxLimitMMHG = qMin(_pressureVars.tmpMaxLimitMMHG, static_cast(MAX_TMP_PRES_LIMIT_MMHG)); + } + else { + _pressureVars.arterialMinLimitMMHG = MIN_ART_PRES_LIMIT_MMHG; + _pressureVars.arterialMaxLimitMMHG = MAX_ART_PRES_LIMIT_MMHG; + + _pressureVars.venousMinLimitMMHG = MIN_VEN_PRES_LIMIT_MMHG; + _pressureVars.venousMaxLimitMMHG = MAX_VEN_PRES_LIMIT_MMHG; + + _pressureVars.tmpMinLimitMMHG = MIN_TMP_PRES_LIMIT_MMHG; + _pressureVars.tmpMaxLimitMMHG = MAX_TMP_PRES_LIMIT_MMHG; + } +} + + +void StateController::handleWidenPressureLimitsMessage() +{ + 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); + } +} + + + + Index: sources/drydemo/StateControllerTreatmentBroadcasts.cpp =================================================================== diff -u -rc52253ab5fc73e9b59d9cd99eada3d526d799987 -r38521851fd3271aa9a8965067d15daaba0db4b2e --- sources/drydemo/StateControllerTreatmentBroadcasts.cpp (.../StateControllerTreatmentBroadcasts.cpp) (revision c52253ab5fc73e9b59d9cd99eada3d526d799987) +++ sources/drydemo/StateControllerTreatmentBroadcasts.cpp (.../StateControllerTreatmentBroadcasts.cpp) (revision 38521851fd3271aa9a8965067d15daaba0db4b2e) @@ -76,50 +76,57 @@ _isBroadcastListReady = true; } -void StateController::handleTDPressureProcessAndBroadcastData(const Broadcast_Type BCType) +void StateController::handleTDPressureBroadcastData(const Broadcast_Type BCType) { static quint32 broadcastCounter = 10; - 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); - } + // Arterial calculations + float arterialRandomMMHG = _randNumGenerator.generateDouble() * (_pressureVars.arterialMinLimitMMHG - _pressureVars.arterialMaxLimitMMHG) + + _pressureVars.arterialMaxLimitMMHG; + float arterialPevMMHG = _pressureVars.arterialRawMMHG[_pressureVars.arterialIndex]; - // TODO update the pressures - float h2ArtPresMMHG = 12.2; - float h14VenPresMMHG = 80.1; - quint32 presLimitState = 1; - qint32 h2ArtMinLimitMMHG = MIN_ART_PRES_LIMIT_MMHG; - qint32 h2ArtMaxLimitMMHG = MAX_ART_PRES_LIMIT_MMHG; - qint32 h14VenMinLimitMMGH = MIN_VEN_PRES_LIMIT_MMHG; - qint32 h14VenMaxLimitMMHG = MAX_VEN_PRES_LIMIT_MMHG; - float h2ArtLongFilterPresMMHG = -23.0; - float h14VenLongFilterPresMMHG = 67.5; - float tmpPresMMHG = 45.03; - float tmpLongFilter = 45.5; - float tmpMinLimitMMHG = MIN_TMP_PRES_LIMIT_MMHG; - float tmpMaxLimitMMHG = MAX_TMP_PRES_LIMIT_MMHG; - float h23BaroPresPSI = 14.2l; + _pressureVars.arterialRawMMHG[_pressureVars.arterialIndex] = arterialRandomMMHG; + _pressureVars.arterialRunningSumMMHG = _pressureVars.arterialRunningSumMMHG - arterialPevMMHG + arterialRandomMMHG; + _pressureVars.arterialIndex = (_pressureVars.arterialIndex < SHORT_MOVING_AVG_SIZE - 1 ? _pressureVars.arterialIndex + 1 : 0); + // Venous calculations + float venousRandomMMHG = _randNumGenerator.generateDouble() * (_pressureVars.venousMinLimitMMHG - _pressureVars.venousMaxLimitMMHG) + + _pressureVars.venousMaxLimitMMHG; + float venousPevMMHG = _pressureVars.venousRawMMHG[_pressureVars.venousIndex]; + _pressureVars.venousRawMMHG[_pressureVars.venousIndex] = venousRandomMMHG; + _pressureVars.venousRunningSumMMHG = _pressureVars.venousRunningSumMMHG - venousPevMMHG + venousRandomMMHG; + _pressureVars.venousIndex = (_pressureVars.venousIndex < SHORT_MOVING_AVG_SIZE - 1 ? _pressureVars.venousIndex + 1 : 0); + // TMP calculations + float tmpRandomMMHG = _randNumGenerator.generateDouble() * (_pressureVars.tmpMinLimitMMHG - _pressureVars.tmpMaxLimitMMHG) + + _pressureVars.tmpMaxLimitMMHG; + float tmpPevMMHG = _pressureVars.tmpRawMMHG[_pressureVars.tmpIndex]; + + _pressureVars.tmpRawMMHG[_pressureVars.tmpIndex] = tmpRandomMMHG; + _pressureVars.tmpRunningSumMMHG = _pressureVars.tmpRunningSumMMHG - tmpPevMMHG + tmpRandomMMHG; + _pressureVars.tmpIndex = (_pressureVars.tmpIndex < SHORT_MOVING_AVG_SIZE - 1 ? _pressureVars.tmpIndex + 1 : 0); + if ((++broadcastCounter % NUM_OF_COUNTS_TIMER_BC_EMIT != 0) && (BCType == BC_DELAYED)) { return; } + _pressureVars.arterialFilteredMMHG = _pressureVars.arterialRunningSumMMHG / static_cast(SHORT_MOVING_AVG_SIZE); + _pressureVars.venousFilteredMMHG = _pressureVars.venousRunningSumMMHG / static_cast(SHORT_MOVING_AVG_SIZE); + _pressureVars.tmpFilteredMMHG = _pressureVars.tmpRunningSumMMHG / static_cast(SHORT_MOVING_AVG_SIZE); + QVariantList msg; msg.append(static_cast(ID_TD_PRESSURE_DATA)); msg.append(Can_Id::eChlid_TD_Sync); - msg.append(h2ArtPresMMHG); - msg.append(h14VenPresMMHG); - msg.append(presLimitState); - msg.append(h2ArtMinLimitMMHG); - msg.append(h2ArtMaxLimitMMHG); - msg.append(h14VenMinLimitMMGH); - msg.append(h14VenMaxLimitMMHG); - msg.append(h2ArtLongFilterPresMMHG); - msg.append(h14VenLongFilterPresMMHG); - msg.append(tmpPresMMHG); - msg.append(tmpLongFilter); - msg.append(tmpMinLimitMMHG); - msg.append(tmpMaxLimitMMHG); - msg.append(h23BaroPresPSI); + msg.append(_pressureVars.arterialFilteredMMHG); + msg.append(_pressureVars.venousFilteredMMHG); + msg.append(_pressureVars.presLimitState); + msg.append(_pressureVars.arterialMinLimitMMHG); + msg.append(_pressureVars.arterialMaxLimitMMHG); + msg.append(_pressureVars.venousMinLimitMMHG); + msg.append(_pressureVars.venousMaxLimitMMHG); + msg.append(DEF_ART_LONG_FILT_PRES_MMHG); + msg.append(DEF_VEN_LONG_FILT_PRES_MMHG); + msg.append(_pressureVars.tmpFilteredMMHG); + msg.append(DEF_TMP_LONG_FILT_PRES_MMHG); + msg.append(_pressureVars.tmpMinLimitMMHG); + msg.append(_pressureVars.tmpMaxLimitMMHG); + msg.append(DEF_BARO_PRES_PSI); _isBroadcastListReady = false; _broadcastMessages.append(msg); _isBroadcastListReady = true;