Index: drydemo.pro =================================================================== diff -u -ra271469db538bfc35eba9a56308760893ecbc68e -rbf271a558491a83b39eb30748784f1b744736dd2 --- drydemo.pro (.../drydemo.pro) (revision a271469db538bfc35eba9a56308760893ecbc68e) +++ drydemo.pro (.../drydemo.pro) (revision bf271a558491a83b39eb30748784f1b744736dd2) @@ -101,6 +101,8 @@ sources/ApplicationController.cpp \ \ # ---------- States ---------- sources/drydemo/StateController.cpp \ + sources/drydemo/StateControllerHDFTreatment.cpp \ + sources/drydemo/StateControllerPreTreatment.cpp \ sources/drydemo/StateControllerRecirc.cpp \ sources/drydemo/StateControllerRinseback.cpp \ sources/drydemo/StateControllerStandby.cpp \ Index: sources/MessageGlobals.h =================================================================== diff -u -rb13dd2b30889640ebf03f54414f536ca5c8d2dc7 -rbf271a558491a83b39eb30748784f1b744736dd2 --- sources/MessageGlobals.h (.../MessageGlobals.h) (revision b13dd2b30889640ebf03f54414f536ca5c8d2dc7) +++ sources/MessageGlobals.h (.../MessageGlobals.h) (revision bf271a558491a83b39eb30748784f1b744736dd2) @@ -158,6 +158,8 @@ ID_TD_BLOOD_PRESSURE_DATA = 0x6500, ID_UI_ULTRAFILTRATION_CHANGE_CONFIRM_RQST = 0x6600, ID_TD_ULTRAFILTRATION_CHANGE_CONFIRM_RESP = 0x6700, + ID_UI_PRESSURE_LIMITS_CHANGE_RQST = 0x7200, + ID_TD_PRESSURE_LIMITS_CHANGE_RESP = 0x7300, ID_UI_BOLUS_VOLUME_CHANGE_RQST = 0x7400, ID_TD_BOLUS_VOLUME_CHANGE_RESP = 0x7500, ID_UI_DURATION_VALIDATE_RQST = 0x7600, @@ -191,6 +193,12 @@ ID_UI_CONFIRMATION_RESULT_RESP = 0xB600, ID_UI_VITALS_ADJUSTMENT_RQST = 0xB800, ID_TD_VITALS_ADJUSTMENT_RESP = 0xB900, + ID_TD_HEMODIAFILTRATION_DATA = 0xBC00, + ID_TD_DRY_BICART_DISCONNECT_DATA = 0xC400, + ID_UI_DRY_BICART_DISCONNECT_RQST = 0xC500, + ID_TD_DRY_BICART_DISCONNECT_RESP = 0xC600, + ID_UI_SETUP_TUBING_SET_CONNECTIONS_CONFIRM_RQST = 0xD600, + ID_TD_SETUP_TUBING_SET_CONNECTIONS_CONFIRM_RESP = 0xD700, ID_ACK_MESSAGE_THAT_REQUIRES_ACK = 0xFFFF, }; Index: sources/drydemo/DryDemoDefines.h =================================================================== diff -u -rb13dd2b30889640ebf03f54414f536ca5c8d2dc7 -rbf271a558491a83b39eb30748784f1b744736dd2 --- sources/drydemo/DryDemoDefines.h (.../DryDemoDefines.h) (revision b13dd2b30889640ebf03f54414f536ca5c8d2dc7) +++ sources/drydemo/DryDemoDefines.h (.../DryDemoDefines.h) (revision bf271a558491a83b39eb30748784f1b744736dd2) @@ -12,7 +12,7 @@ #define ACCEPT_VALUE 1 #define REJECT_VALUE 0 #define NEARLY_ZERO 0.00000001 -#define DEVICE_ID 1234 +#define ONE_HUNDRED_PCT 100 #define UI_CONFIRM_RESP_TIMOUT_MS (SECONDS_PER_MINUTE * MILLISECONDS_PER_SECOND) #define RCVD_MSG_MSG_ID_INDEX 0 #define RCVD_MSG_SQNC_INDEX 1 @@ -54,9 +54,6 @@ #define DEF_TX_PARAM_VEN_PRES_LIMIT_ASYM_WIN_MMHG 20 #define DEF_TX_PARAM_DIA_TEMPERATURE_C 37.0 #define DEF_TX_PARAM_BLOOD_PRES_INTERVAL_MIN (30 * MINUTES_PER_HOUR * MILLISECONDS_PER_SECOND) -#define DEF_TX_SYSTOLIC_PRES 120 -#define DEF_TX_DIASTOLIC_PRES 80 -#define DEF_TX_HEART_BEAT 100 // Arterial /Venous limits & Baro #define DEF_BARO_PRES_PSI 14.2 @@ -74,52 +71,58 @@ #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 VEN_PRES_HIGH_LIMIT_WINDOW_MMHG 50 +#define VEN_PRES_LOW_LIMIT_WINDOW_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) +// Vitals +#define DEF_TX_SYSTOLIC_PRES_MMHG 120 +#define DEF_TX_DIASTOLIC_PRES_MMHG 80 +#define DEF_TX_HEART_BEAT 100 +#define VITALS_MEAS_TIME_INT_INDEX 16 + // Initiate treatment -#define INITIATE_TREATMENT 1 -#define ALLOW_DIALYSATE_DELIVER 1 -#define BYPASS_DIALYSATE_DELIVER 0 -#define TRIGGER_STOP_ALARM_TIME_MS (2 * MILLISECONDS_PER_SECOND) +#define INITIATE_TREATMENT 1 +#define ALLOW_DIALYSATE_DELIVER 1 +#define BYPASS_DIALYSATE_DELIVER 0 +#define TRIGGER_STOP_ALARM_TIME_MS (2 * MILLISECONDS_PER_SECOND) // Treatment defines -#define BLOOD_PRIME_VOLUME_ML (106.6 + 40) -#define BLOOD_PRIME_START_FLOW_MLPM 250 -#define BLOOD_PRIME_FLOW_INTEGRATOR (1.0 / (SECONDS_PER_MINUTE * (MILLISECONDS_PER_SECOND / QOBJECT_TIMER_TIMEOUT_MS))) -#define BLOOD_PRIME_PAUSE_TIMEOUT_S (5 * SECONDS_PER_MINUTE) -#define BLOOD_PRIME_RESUME 1 +#define BLOOD_PRIME_VOLUME_ML (106.6 + 40) +#define BLOOD_PRIME_START_FLOW_MLPM 250 +#define BLOOD_PRIME_FLOW_INTEGRATOR (1.0 / (SECONDS_PER_MINUTE * (MILLISECONDS_PER_SECOND / QOBJECT_TIMER_TIMEOUT_MS))) +#define BLOOD_PRIME_PAUSE_TIMEOUT_S (5 * SECONDS_PER_MINUTE) +#define BLOOD_PRIME_RESUME 1 // Heparin substates -#define HEPARIN_OFF_SUBSTATE 0 -#define HEPARIN_PAUSED_SUBSTATE 2 -#define HEPARIN_DISPENSING_SUBSTATE 4 -#define HEPARIN_COMPLETED_SUBSTATE 5 +#define HEPARIN_OFF_SUBSTATE 0 +#define HEPARIN_PAUSED_SUBSTATE 2 +#define HEPARIN_DISPENSING_SUBSTATE 4 +#define HEPARIN_COMPLETED_SUBSTATE 5 // Ultrafiltration substates -#define UF_PAUSESD_STATE 0 -#define UF_RUNNING_STATE 1 +#define UF_PAUSESD_STATE 0 +#define UF_RUNNING_STATE 1 // Rinseback defines -#define RINSEBACK_FLOW_INTEGRATOR 1.0 / (SECONDS_PER_MINUTE * (MILLISECONDS_PER_SECOND / QOBJECT_TIMER_TIMEOUT_MS)) -#define RINSEBACK_MIN_FLOW_RATE_MLPM 100 -#define RINSEBACK_MAX_RLOW_RATE_MLPM 500 -#define RINSEBACK_ADJ_FLOW_RATE_MLPM 10 -#define RINSEBACK_BACK_MAX_TIME_MS (5 * SECONDS_PER_MINUTE * MILLISECONDS_PER_SECOND) -#define RINSEBACK_ADDITION_VOL_ML 50 -#define RINSEBACK_MAX_ADDITION_TIME_MS (25 * MILLISECONDS_PER_SECOND) +#define RINSEBACK_FLOW_INTEGRATOR 1.0 / (SECONDS_PER_MINUTE * (MILLISECONDS_PER_SECOND / QOBJECT_TIMER_TIMEOUT_MS)) +#define RINSEBACK_MIN_FLOW_RATE_MLPM 100 +#define RINSEBACK_MAX_RLOW_RATE_MLPM 500 +#define RINSEBACK_ADJ_FLOW_RATE_MLPM 10 +#define RINSEBACK_BACK_MAX_TIME_MS (5 * SECONDS_PER_MINUTE * MILLISECONDS_PER_SECOND) +#define RINSEBACK_ADDITION_VOL_ML 50 +#define RINSEBACK_MAX_ADDITION_TIME_MS (25 * MILLISECONDS_PER_SECOND) // Fluid Bolus defines -#define FLUID_BOLUS_START_CMD 1 -#define ENABLE_BOLUS 1 +#define FLUID_BOLUS_START_CMD 1 +#define ENABLE_BOLUS 1 // Recirc defines -#define RECIRC_TIMEOUT_MIN 30 -#define RECIRC_WARN_BEFORE_TIMEOUT_MIN 10 +#define RECIRC_TIMEOUT_MIN 30 +#define RECIRC_WARN_BEFORE_TIMEOUT_MIN 10 -// Alarms +// Alarm defines #define ALARM_TABLE_PRIORITY_INDEX 0 #define ALARM_TABLE_PROPERTIES_INDEX 1 #define ALARM_TABLE_TX_PAUSE_INDEX 2 @@ -136,7 +139,17 @@ #define ALARM_RECIRC_WARN_PROPERTIES 112 #define ALARM_REPLACE_BICARB_PROPERTIES 112 #define ALARM_DIAL_PROPOR_PROPERTIES 10 +#define ALARM_TX_MOD_CHNG_PROPERTIES 2 +// Dry bicart defines +#define DRY_BICART_DRIN_IN_PROGRESS 1 +#define DRY_BICART_DEPRES_IN_PROGRESS 1 +#define DRY_BICART_DRIN_NOT_IN_PROGRESS 0 +#define DRY_BICART_DEPRES_NOT_IN_PROGRESS 0 +#define DRY_BICART_CLOSE_SCREEN 0 +#define DRY_BICART_OPEN_SCREEN 1 +#define DRY_BICART_PCT_PROG_TIME_MS (20 * MILLISECONDS_PER_SECOND) + enum User_Command_ID { CMD_NONE = -1, CMD_STAND_BY = 0, @@ -202,9 +215,11 @@ REQUESTED_USER_ACTION_RINSEBACK_DECREASE_RATE = 2, REQUESTED_USER_ACTION_RINSEBACK_PAUSE = 3, REQUESTED_USER_ACTION_RINSEBACK_RESUME = 4, - REQUESTED_USER_ACTION_RINSEBACK_ADDITIONAL = 5, - REQUESTED_USER_ACTION_RINSEBACK_CONFIRM_RECIRCULATE = 6, - REQUESTED_USER_ACTION_RINSEBACK_END_TREATMENT = 7, + REQUESTED_USER_ACTION_RINSEBACK_END = 5, + REQUESTED_USER_ACTION_RINSEBACK_ADDITIONAL = 6, + REQUESTED_USER_ACTION_RINSEBACK_CONFIRM_RECIRCULATE = 7, + REQUESTED_USER_ACTION_RINSEBACK_END_TREATMENT = 8, + REQUESTED_USER_ACTION_RINSEBACK_BACK_TO_TREATMENT = 9, }; enum Recirculate_States { @@ -231,11 +246,12 @@ enum Treatment_Pause_Sequential_Alarms { SEQ_ALARM_NO_ALARM = 0, SEQ_ALARM_TRIGGER_RPLC_ACID = 1, - SEQ_ALARM_TRIGGER_RPLC_BICARB = 2, - SEQ_ALARM_PROCESS_DRAIN_SCREEN = 3, - SEQ_ALARM_DRY_BICARB_CARTRIDGE = 4, - SEQ_ALARM_PROPORTIONING_IN_PROG = 5, - SEQ_ALARM_LOW_VENOUS = 6, + SEQ_ALARM_PROPORTIONING_ACID_IN_PROG = 2, + SEQ_ALARM_DRY_BICARB_CARTRIDGE = 3, + SEQ_ALARM_PROCESS_DRAIN_SCREEN = 4, + SEQ_ALARM_TRIGGER_RPLC_BICARB = 5, + SEQ_ALARM_PROPORTIONING_BICARB_IN_PROG = 6, + SEQ_ALARM_LOW_VENOUS = 7, }; enum Treatment_Modality_Types @@ -261,6 +277,21 @@ USE_NORMAL_STABILIZATION_PERIOD = 2, }; +// HDF states +enum HDF_States { + HDF_UF_STATE = 0, + HDF_UF_PAUSED_STATE = 1, + HDF_UF_FLUID_BOLUS_STATE = 2, +}; + +// Dry bicart status +enum Dry_Bicart_Action { + DRY_BICART_ACTION_DRAIN = 0, + DRY_BICART_ACTION_DEPRESSURIZE = 1, + DRY_BICART_ACTION_CANCEL = 2, + DRY_BICART_ACTION_DONE = 3, +}; + enum State_Status { STATE_ON_ENTRY = 0, STATE_ON_ACTION, @@ -295,6 +326,7 @@ ALARM_ID_TD_RECIRC_TIMEOUT_WARNING = 199, ALARM_ID_TD_RECIRC_TIMEOUT = 200, ALARM_ID_DD_BICARBONATE_CARTRIDGE_LOW_LEVEL = 244, + ALARM_ID_TD_TREATMENT_MODALITY_CHANGE = 247, ALARM_ID_DD_REPLACE_BICARB_CARTRIDGE = 248, ALARM_ID_DD_REPLACE_ACID_CONCENTRATE = 249, ALARM_ID_TD_DIALYSATE_PROPORTIONING_IN_PROGRESS = 250, Index: sources/drydemo/StateController.cpp =================================================================== diff -u -rb13dd2b30889640ebf03f54414f536ca5c8d2dc7 -rbf271a558491a83b39eb30748784f1b744736dd2 --- sources/drydemo/StateController.cpp (.../StateController.cpp) (revision b13dd2b30889640ebf03f54414f536ca5c8d2dc7) +++ sources/drydemo/StateController.cpp (.../StateController.cpp) (revision bf271a558491a83b39eb30748784f1b744736dd2) @@ -44,6 +44,7 @@ _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_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 }; @@ -82,7 +83,9 @@ case ID_UI_ALARM_USER_ACTION_REQUEST: case ID_UI_RINSEBACK_CMD_RQST: case ID_UI_RECIRCULATE_RQST: - case ID_UI_VITALS_ADJUSTMENT_RQST: + case ID_UI_VITALS_ADJUSTMENT_RQST: + case ID_UI_PRESSURE_LIMITS_CHANGE_RQST: + case ID_UI_DRY_BICART_DISCONNECT_RQST: _treatmentRcvdMessages[receivedMsgID] = msg[RCVD_MSG_PAYLOAD_INDEX]; break; @@ -97,6 +100,7 @@ case ID_UI_ADJUST_START_TREATMENT_RQST: case ID_UI_PRESSURE_LIMIT_WIDEN_RQST: case ID_UI_BLOOD_PRESSURE_RQST: + case ID_UI_SETUP_TUBING_SET_CONNECTIONS_CONFIRM_RQST: _treatmentRcvdMessages[receivedMsgID] = 0; break; @@ -140,6 +144,11 @@ case ID_TD_RECIRCULATE_DATA: case ID_ACK_MESSAGE_THAT_REQUIRES_ACK: case ID_TD_VITALS_ADJUSTMENT_RESP: + case ID_TD_SETUP_TUBING_SET_CONNECTIONS_CONFIRM_RESP: + case ID_TD_HEMODIAFILTRATION_DATA: + case ID_TD_PRESSURE_LIMITS_CHANGE_RESP: + case ID_TD_DRY_BICART_DISCONNECT_DATA: + case ID_TD_DRY_BICART_DISCONNECT_RESP: // Do nothing break; } @@ -236,6 +245,8 @@ handleBackToStandbyEvent(status); handleInitiateTreatmentRequestMessage(status); + handleSetupTubingSetConnectionsRequestMessage(); + if (! _treatmentRcvdMessages[ID_UI_ADJUST_DISPOSABLES_CONFIRM_RQST].isNull()){ _treatmentRcvdMessages[ID_UI_ADJUST_DISPOSABLES_CONFIRM_RQST].clear(); handleUIResponseMessage(ID_TD_ADJUST_DISPOSSABLES_CONFIRM_RESP, ACCEPT_VALUE); @@ -288,7 +299,7 @@ _treatmentSubStates.bloodPrimeState = BLOOD_PRIME_RAMP_STATE; _treatmentSubStates.txState = TREAT_BLOOD_PRIME_STATE; handleTreatmentStatesBroadcastData(BC_IMMEDIATELY); - rampStepML = getBloodPrimeRampStepML(); + rampStepML = handleBloodPrimeGetRampStepML(); status = STATE_ON_ACTION; qDebug() << "Blood prime on entry"; }; @@ -373,11 +384,11 @@ handleBackToStandbyEvent(status); handleTDOpModeTransitionBroadcastData(MODE_TREA, 0, BC_DELAYED); handleTreatmentStatesBroadcastData(BC_DELAYED); - // Fluid bolus functions + // Fluid bolus methods handleFluidBolusRequestMessage(); handleFluidBolusFluidDelivery(_treatmentParams.bloodFlowRateMLPM); handleFluidBolusBroadcastData(BC_DELAYED); - // Broadcast functions + // Broadcast methods handleTreatmentTimeProcessAndBroadcastData(BC_DELAYED); handleTreatmentPrescriptionEditRequestMessage(); handleSetPointBloodFlowChange(_treatmentParams.bloodFlowRateMLPM, hasFlowChngeRequested); @@ -387,26 +398,30 @@ handleDDConductivityBroadcastData(BC_DELAYED); handleSetPointDialysateFlowChange(); handleSetPointDialysateTemperatureChange(); - // Pressure functions + // Pressure methods handlePressureLimitState(); handleTDPressureBroadcastData(BC_DELAYED); handleDeterminePressureLimits(); handleWidenPressureLimitsMessage(); - // UF functions functions + handlePressureLimitsChangeRequest(); + // UF functions methods handleUltrafiltrationPauseResume(); handleUltrafiltrationVolumeChangeValidation(); handleUltrafiltrationVolumeChangeConfirm(); handleUltrafiltrationBroadcastData(BC_DELAYED); - // Tx Time setting functions + // Tx Time setting methods handleTreatmentSettingBroadcastData(BC_DELAYED); handleTreatmentTimeChangeValidation(); handleTreatmentTimeChangeConfirm(); // Alarm methods handleChemsReplacementAlarmsSequence(status); handleTriggeredAlarmsToTxPause(status); - // Vitals functions + // Vitals methods handleVitalsAdjustmentMessage(); handleVitalsDataRquest(); + // HDF methods + handleTreatmentHDF(); + handleHemodialfiltrationBroadcastData(BC_DELAYED); // Treatment complete condition if ((_treatmentStatus.treatmentElapsedTimeMS / MILLISECONDS_PER_SECOND) > (_treatmentParams.treatmentDurationMin * SECONDS_PER_MINUTE)) { Index: sources/drydemo/StateController.h =================================================================== diff -u -rb13dd2b30889640ebf03f54414f536ca5c8d2dc7 -rbf271a558491a83b39eb30748784f1b744736dd2 --- sources/drydemo/StateController.h (.../StateController.h) (revision b13dd2b30889640ebf03f54414f536ca5c8d2dc7) +++ sources/drydemo/StateController.h (.../StateController.h) (revision bf271a558491a83b39eb30748784f1b744736dd2) @@ -35,7 +35,7 @@ User_Command_ID userCmd; QString stateTransitionEvent; bool requestTreatmentReset; - // Blood pump + // Blood pump variables bool isBloodPumpRunning; // Treatment time variable(s) quint32 treatmentElapsedTimeMS; @@ -72,13 +72,25 @@ bool hasResumeTxBeenRequested; bool hasRecircWarnAlarmBeenTrig; bool hasRecircTimeoutAlarmBeenTrig; - // Vitals alarm limits - quint32 systolicBPLowAlarmLimit; - quint32 systolicBPHighAlarmLimit; - quint32 heartRateLowAlarmLimit; - quint32 heartRateHighAlarmLimit; + // Vitals alarm limits variables (not used right now) + quint32 systolicBPLowAlarmLimit; + quint32 systolicBPHighAlarmLimit; + quint32 heartRateLowAlarmLimit; + quint32 heartRateHighAlarmLimit; + // Dry bicart update variables + Dry_Bicart_Action bicartAction; + quint32 bicartShowDialog; + quint32 bicartTotal; + float bicartProgress; + quint32 bicartDrainInProgress; + quint32 bicartDepresInProgress; }; + struct HDF_vars { + float hdfManualRateMLPM; + float hdfCurrentVolumeML; + }; + struct Pressure_Vars { Pressure_Limits_States presLimitState; Pressure_Stabilization_Periods presStabilizeTimePeriod; @@ -92,6 +104,7 @@ qint32 arterialMaxLimitMMHG; float arterialFilteredMMHG; qint32 arterialStableMMHG; + qint32 arterialPresLimitWindowMMHG; // Venous float venousRawMMHG[SHORT_MOVING_AVG_SIZE]; quint32 venousIndex; @@ -100,6 +113,8 @@ qint32 venousMaxLimitMMHG; float venousFilteredMMHG; qint32 venousStableMMHG; + qint32 venousPresLowLimitWindowMMHG; + qint32 venousPresHighLimitWindowMMHG; // TMP float tmpRawMMHG[SHORT_MOVING_AVG_SIZE]; quint32 tmpIndex; @@ -108,6 +123,7 @@ float tmpMaxLimitMMHG; float tmpFilteredMMHG; qint32 tmpStableMMHG; + qint32 tmpPresLimitWindowMMHG; }; struct Treatment_Sub_State_Vars { @@ -198,8 +214,11 @@ bool hasUIConfirmMessageTimedout(const Generic_Confirm_Id confirmID); void handleSendUIConfirmationMessage(const Generic_Confirm_Id confirmID, const Generic_Confirm_Command confirmCmd, const Reject_Reasons rejectReason = REQUEST_REJECT_REASON_NONE); + // Pre-treatment methods + void handleSetupTubingSetConnectionsRequestMessage(); + // Blood prime methods - float getBloodPrimeRampStepML(); + float handleBloodPrimeGetRampStepML(); void handleBloodPrimePauseResume(bool &resume); void handleBloodPrimeBroadcastData(const float accumulatedVolML, const quint32 primeTimeOutS, const quint32 pauseCountDownS, const Broadcast_Type BCType); void handleBloodPrimeVolML(const bool resume, const float rampStepML, const bool hasFlowChanged, quint32 &currBloodFlowMLPM, float &accumBloodVolML); @@ -233,11 +252,20 @@ void handleDeterminePressureLimits(); void handleSignalInitiatePressureStabilization(const Pressure_Stabilization_Periods period); void handleWidenPressureLimitsMessage(); - // Treatment vitals + void handlePressureLimitsChangeRequest(); + // Treatment vitals methods void handleVitalsAdjustmentMessage(); void handleVitalsBroadcastData(); void handleVitalsDataRquest(); + // HDF Treatment methods + void handleTreatmentHDF(); + void handleHemodialfiltrationBroadcastData(const Broadcast_Type BCType); + + // Treatment pause methods + void handleDryBicartBroadcastData(const Broadcast_Type BCType); + void handleDryBicartActionRequest(); + // Treatment rinseback methods void initializeRinseback(); void handleRinsebackRequestMessage(); Index: sources/drydemo/StateControllerHDFTreatment.cpp =================================================================== diff -u --- sources/drydemo/StateControllerHDFTreatment.cpp (revision 0) +++ sources/drydemo/StateControllerHDFTreatment.cpp (revision bf271a558491a83b39eb30748784f1b744736dd2) @@ -0,0 +1,34 @@ + +#include "StateController.h" +#include "ApplicationController.h" +#include "types.h" + +void StateController::handleTreatmentHDF() +{ + if (_treatmentParams.treatmentModality == TREATMENT_MODALITY_HDF_ONLINE_FLUID) { + // _treatmentSubStates.txState = TREATMENT_HDF_STATE; + } +} + +void StateController::handleHemodialfiltrationBroadcastData(const Broadcast_Type BCType) +{ + static quint32 broadcastCounter = 50; + if ((++broadcastCounter % NUM_OF_COUNTS_TIMER_BC_EMIT != 0) && (BCType == BC_DELAYED)) { return; } + + QVariantList msg; + msg.append(static_cast(ID_TD_HEMODIAFILTRATION_DATA)); + msg.append(Can_Id::eChlid_TD_Sync); + msg.append(0); + msg.append(1); + msg.append(1.2); + msg.append(5.2); + + msg.append(5.2); + msg.append(5.2); + msg.append(5.2); + msg.append(5.2); + msg.append(0); + _isBroadcastListReady = false; + _broadcastMessages.append(msg); + _isBroadcastListReady = true; +} Index: sources/drydemo/StateControllerPreTreatment.cpp =================================================================== diff -u --- sources/drydemo/StateControllerPreTreatment.cpp (revision 0) +++ sources/drydemo/StateControllerPreTreatment.cpp (revision bf271a558491a83b39eb30748784f1b744736dd2) @@ -0,0 +1,16 @@ + +#include "StateController.h" +#include "ApplicationController.h" +#include "types.h" + + +void StateController::handleSetupTubingSetConnectionsRequestMessage() +{ + if (_treatmentRcvdMessages[ID_UI_SETUP_TUBING_SET_CONNECTIONS_CONFIRM_RQST].isNull()) { return; } + + quint32 acceptReject = ACCEPT_VALUE; + + // TODO implement reject reason + handleUIResponseMessage(ID_TD_SETUP_TUBING_SET_CONNECTIONS_CONFIRM_RESP, acceptReject); + _treatmentRcvdMessages[ID_UI_SETUP_TUBING_SET_CONNECTIONS_CONFIRM_RQST].clear(); +} Index: sources/drydemo/StateControllerRecirc.cpp =================================================================== diff -u -r3a1edf1c2dc6f68d32af3adeeee4a59bbac739c5 -rbf271a558491a83b39eb30748784f1b744736dd2 --- sources/drydemo/StateControllerRecirc.cpp (.../StateControllerRecirc.cpp) (revision 3a1edf1c2dc6f68d32af3adeeee4a59bbac739c5) +++ sources/drydemo/StateControllerRecirc.cpp (.../StateControllerRecirc.cpp) (revision bf271a558491a83b39eb30748784f1b744736dd2) @@ -18,7 +18,8 @@ if (_treatmentRcvdMessages[ID_UI_RECIRCULATE_RQST].isNull()) { return; } QVariantList reason; quint32 acceptReject = REJECT_VALUE; - quint32 recircCmd = extractU32DataFromReceivedMessage(ID_UI_RECIRCULATE_RQST, 0); + qint32 index = 0; + quint32 recircCmd = extractU32DataFromReceivedMessage(ID_UI_RECIRCULATE_RQST, index); if (_treatmentStatus.activeTopAlarm != ALARM_ID_NO_ALARM) { reason.append(REQUEST_REJECT_REASON_ALARM_IS_ACTIVE); Index: sources/drydemo/StateControllerRinseback.cpp =================================================================== diff -u -r3a1edf1c2dc6f68d32af3adeeee4a59bbac739c5 -rbf271a558491a83b39eb30748784f1b744736dd2 --- sources/drydemo/StateControllerRinseback.cpp (.../StateControllerRinseback.cpp) (revision 3a1edf1c2dc6f68d32af3adeeee4a59bbac739c5) +++ sources/drydemo/StateControllerRinseback.cpp (.../StateControllerRinseback.cpp) (revision bf271a558491a83b39eb30748784f1b744736dd2) @@ -21,7 +21,8 @@ if (_treatmentRcvdMessages[ID_UI_RINSEBACK_CMD_RQST].isNull()) { return; } QVariantList reason; quint32 acceptReject = REJECT_VALUE; - quint32 rinsebackCmd = extractU32DataFromReceivedMessage(ID_UI_RINSEBACK_CMD_RQST, 0); + qint32 index = 0; + quint32 rinsebackCmd = extractU32DataFromReceivedMessage(ID_UI_RINSEBACK_CMD_RQST, index); if (_treatmentStatus.activeTopAlarm != ALARM_ID_NO_ALARM) { reason.append(REQUEST_REJECT_REASON_ALARM_IS_ACTIVE); Index: sources/drydemo/StateControllerStandby.cpp =================================================================== diff -u -rb13dd2b30889640ebf03f54414f536ca5c8d2dc7 -rbf271a558491a83b39eb30748784f1b744736dd2 --- sources/drydemo/StateControllerStandby.cpp (.../StateControllerStandby.cpp) (revision b13dd2b30889640ebf03f54414f536ca5c8d2dc7) +++ sources/drydemo/StateControllerStandby.cpp (.../StateControllerStandby.cpp) (revision bf271a558491a83b39eb30748784f1b744736dd2) @@ -6,7 +6,8 @@ bool StateController::handleDryDemoMenuRequestMessage() { - quint32 msgPayload = extractU32DataFromReceivedMessage(ID_UI_CONFIRMATION_RESULT_RESP, 0); + qint32 index = 0; + quint32 msgPayload = extractU32DataFromReceivedMessage(ID_UI_CONFIRMATION_RESULT_RESP, index); if (msgPayload != UI_MSG_BB_PAYLOAD_ID) { if (msgPayload < NUM_OF_GENERIC_CONFIRM_IDS) { quint32 confirmStatus = extractU32DataFromReceivedMessage(ID_UI_CONFIRMATION_RESULT_RESP, UI_MSG_BB_STATUS_INDEX); @@ -102,24 +103,34 @@ _treatmentStatus.txPauseSeqAlarmState = SEQ_ALARM_NO_ALARM; // Initialize pressure vars _pressureVars.presLimitState = PRESSURE_LIMITS_STATE_OFF; - _pressureVars.presStabilizeTimePeriod = USE_NORMAL_STABILIZATION_PERIOD; + _pressureVars.presStabilizeTimePeriod = 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; + _pressureVars.arterialPresLimitWindowMMHG = static_cast(ART_PRES_LIMIT_WINDOW_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; + _pressureVars.venousPresLowLimitWindowMMHG = static_cast(VEN_PRES_LOW_LIMIT_WINDOW_MMHG); + _pressureVars.venousPresHighLimitWindowMMHG = static_cast(VEN_PRES_HIGH_LIMIT_WINDOW_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; + _pressureVars.tmpPresLimitWindowMMHG = static_cast(TMP_PRES_LIMIT_WINDOW_MMHG); std::fill(std::begin(_pressureVars.tmpRawMMHG), std::end(_pressureVars.tmpRawMMHG), 0); + + _treatmentStatus.bicartAction = DRY_BICART_ACTION_DONE; + _treatmentStatus.bicartDrainInProgress = DRY_BICART_DRIN_IN_PROGRESS; + _treatmentStatus.bicartDepresInProgress = 0; + _treatmentStatus.bicartProgress = 0; + _treatmentStatus.bicartTotal = 100; } void StateController::triggerAnAlarm(Alarm_List alarmID) @@ -213,35 +224,62 @@ case SEQ_ALARM_TRIGGER_RPLC_ACID: if (_treatmentStatus.activeTopAlarm != ALARM_ID_NO_ALARM) { return; } triggerAnAlarm(ALARM_ID_DD_REPLACE_ACID_CONCENTRATE); - _treatmentStatus.txPauseSeqAlarmState = SEQ_ALARM_TRIGGER_RPLC_BICARB; + _treatmentStatus.txPauseSeqAlarmState = SEQ_ALARM_PROPORTIONING_ACID_IN_PROG; + _treatmentStatus.bicartAction = DRY_BICART_ACTION_DRAIN; + _treatmentStatus.bicartDrainInProgress = DRY_BICART_DRIN_IN_PROGRESS; break; - case SEQ_ALARM_TRIGGER_RPLC_BICARB: + case SEQ_ALARM_PROPORTIONING_ACID_IN_PROG: if (_treatmentStatus.activeTopAlarm == ALARM_ID_DD_REPLACE_ACID_CONCENTRATE) { return; } + if (_treatmentStatus.activeTopAlarm == ALARM_ID_NO_ALARM) { + _treatmentStatus.triggerAlarmTimeoutCtr = _elapsedTimeCtr; + triggerAnAlarm(ALARM_ID_TD_DIALYSATE_PROPORTIONING_IN_PROGRESS); + } + // Wait for a couple of seconds to simulate like the conductivity is getting in range + elapsedTimeMS = (_elapsedTimeCtr - _treatmentStatus.triggerAlarmTimeoutCtr) * QOBJECT_TIMER_TIMEOUT_MS; + if (elapsedTimeMS == CLEAR_DIAL_PROPOR_TIMEOUT_MS) { + // Proportioning alarm is cleared automatically + triggerAnAlarm(ALARM_ID_NO_ALARM); + _treatmentStatus.txPauseSeqAlarmState = SEQ_ALARM_DRY_BICARB_CARTRIDGE; + // Stay in treatment pause since there is a sequence of alarms to trigger next + status = STATE_ON_ACTION; + } + break; + + case SEQ_ALARM_DRY_BICARB_CARTRIDGE: + //if (_treatmentStatus.activeTopAlarm != ALARM_ID_NO_ALARM) { triggerAnAlarm(ALARM_ID_NO_ALARM); return; } triggerAnAlarm(ALARM_ID_DD_BICARBONATE_CARTRIDGE_LOW_LEVEL); - _treatmentStatus.txPauseSeqAlarmState = SEQ_ALARM_PROCESS_DRAIN_SCREEN; + // Set the bicart screen to start draining automatically + _treatmentStatus.bicartDrainInProgress = DRY_BICART_DRIN_IN_PROGRESS; + _treatmentStatus.bicartProgress = 0; + _treatmentStatus.txPauseSeqAlarmState = SEQ_ALARM_PROCESS_DRAIN_SCREEN; // Stay in treatment pause since there is a sequence of alarms to trigger next - status = STATE_ON_ACTION; + status = STATE_ON_ACTION; break; case SEQ_ALARM_PROCESS_DRAIN_SCREEN: - // TODO wait for the drain screen message. IMPLEMENT - triggerAnAlarm(ALARM_ID_DD_REPLACE_BICARB_CARTRIDGE); - _treatmentStatus.txPauseSeqAlarmState = SEQ_ALARM_DRY_BICARB_CARTRIDGE; - // Stay in treatment pause since there is a sequence of alarms to trigger next - status = STATE_ON_ACTION; + if (_treatmentStatus.activeTopAlarm == ALARM_ID_DD_BICARBONATE_CARTRIDGE_LOW_LEVEL) { return; } + handleDryBicartBroadcastData(BC_DELAYED); + handleDryBicartActionRequest(); + if (_treatmentStatus.bicartAction == DRY_BICART_ACTION_DONE) { + triggerAnAlarm(ALARM_ID_DD_REPLACE_BICARB_CARTRIDGE); + _treatmentStatus.txPauseSeqAlarmState = SEQ_ALARM_TRIGGER_RPLC_BICARB; + // Stay in treatment pause since there is a sequence of alarms to trigger next + status = STATE_ON_ACTION; + } break; - case SEQ_ALARM_DRY_BICARB_CARTRIDGE: + case SEQ_ALARM_TRIGGER_RPLC_BICARB: + // Make sure acid alarm is cleared first if (_treatmentStatus.activeTopAlarm == ALARM_ID_DD_REPLACE_BICARB_CARTRIDGE) { return; } triggerAnAlarm(ALARM_ID_TD_DIALYSATE_PROPORTIONING_IN_PROGRESS); + _treatmentStatus.txPauseSeqAlarmState = SEQ_ALARM_PROPORTIONING_BICARB_IN_PROG; _treatmentStatus.triggerAlarmTimeoutCtr = _elapsedTimeCtr; - _treatmentStatus.txPauseSeqAlarmState = SEQ_ALARM_PROPORTIONING_IN_PROG; // Stay in treatment pause since there is a sequence of alarms to trigger next status = STATE_ON_ACTION; break; - case SEQ_ALARM_PROPORTIONING_IN_PROG: + case SEQ_ALARM_PROPORTIONING_BICARB_IN_PROG: // Wait for a couple of seconds to simulate like the conductivity is getting in range elapsedTimeMS = (_elapsedTimeCtr - _treatmentStatus.triggerAlarmTimeoutCtr) * QOBJECT_TIMER_TIMEOUT_MS; if (elapsedTimeMS == CLEAR_DIAL_PROPOR_TIMEOUT_MS) { Index: sources/drydemo/StateControllerTreatment.cpp =================================================================== diff -u -rb13dd2b30889640ebf03f54414f536ca5c8d2dc7 -rbf271a558491a83b39eb30748784f1b744736dd2 --- sources/drydemo/StateControllerTreatment.cpp (.../StateControllerTreatment.cpp) (revision b13dd2b30889640ebf03f54414f536ca5c8d2dc7) +++ sources/drydemo/StateControllerTreatment.cpp (.../StateControllerTreatment.cpp) (revision bf271a558491a83b39eb30748784f1b744736dd2) @@ -5,7 +5,7 @@ #include "ApplicationController.h" #include "types.h" -float StateController::getBloodPrimeRampStepML() +float StateController::handleBloodPrimeGetRampStepML() { 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; @@ -541,10 +541,10 @@ 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; + qint32 artOffsetMMHG = _pressureVars.arterialPresLimitWindowMMHG / 2; + qint32 venMinOffsetMMHG = _pressureVars.venousPresHighLimitWindowMMHG; + qint32 venMaxOffsetMMHG = _pressureVars.venousPresLowLimitWindowMMHG - venMinOffsetMMHG; + qint32 tmpOffsetMMHG = _pressureVars.tmpPresLimitWindowMMHG / 2; _pressureVars.arterialMinLimitMMHG = _pressureVars.arterialStableMMHG - artOffsetMMHG; _pressureVars.arterialMinLimitMMHG = qMax(_pressureVars.arterialMinLimitMMHG, static_cast(MIN_ART_PRES_LIMIT_MMHG)); @@ -603,11 +603,34 @@ handleUIResponseMessage(ID_TD_PRESSURE_LIMIT_WIDEN_RESP, ACCEPT_VALUE); } +void StateController::handlePressureLimitsChangeRequest() +{ + if (_treatmentRcvdMessages[ID_UI_PRESSURE_LIMITS_CHANGE_RQST].isNull()) { return; } + QVariantList reason; + quint32 acceptReject = REJECT_VALUE; + + // TODO implement reject reasons + _pressureVars.arterialPresLimitWindowMMHG = static_cast(extractU32DataFromReceivedMessage(ID_UI_PRESSURE_LIMITS_CHANGE_RQST, 0)); + _pressureVars.venousPresHighLimitWindowMMHG = static_cast(extractU32DataFromReceivedMessage(ID_UI_PRESSURE_LIMITS_CHANGE_RQST, 4)); + _pressureVars.venousPresLowLimitWindowMMHG = static_cast(extractU32DataFromReceivedMessage(ID_UI_PRESSURE_LIMITS_CHANGE_RQST, 8)); + _pressureVars.tmpPresLimitWindowMMHG = static_cast(extractU32DataFromReceivedMessage(ID_UI_PRESSURE_LIMITS_CHANGE_RQST, 12)); + handleUpdatePressureLimitWindows(); + + acceptReject = ACCEPT_VALUE; + reason.append(REQUEST_REJECT_REASON_NONE); + reason.append(REQUEST_REJECT_REASON_NONE); + reason.append(REQUEST_REJECT_REASON_NONE); + reason.append(REQUEST_REJECT_REASON_NONE); + + _treatmentRcvdMessages[ID_UI_PRESSURE_LIMITS_CHANGE_RQST].clear(); + handleUIResponseMessage(ID_TD_PRESSURE_LIMITS_CHANGE_RESP, acceptReject, reason); +} + void StateController::handleVitalsAdjustmentMessage() { if (_treatmentRcvdMessages[ID_UI_VITALS_ADJUSTMENT_RQST].isNull()) { return; } - quint32 vitalIntMIN = extractU32DataFromReceivedMessage(ID_UI_VITALS_ADJUSTMENT_RQST, 16); + quint32 vitalIntMIN = extractU32DataFromReceivedMessage(ID_UI_VITALS_ADJUSTMENT_RQST, VITALS_MEAS_TIME_INT_INDEX); quint32 acceptReject = ACCEPT_VALUE; QVariantList reason; // TODO implement the reject reasons @@ -633,9 +656,50 @@ handleVitalsBroadcastData(); } +// TREATMENT PAUSE +void StateController::handleDryBicartActionRequest() +{ + if (_treatmentRcvdMessages[ID_UI_DRY_BICART_DISCONNECT_RQST].isNull()) { return; } + quint32 dryBicartAction = extractU32DataFromReceivedMessage(ID_UI_DRY_BICART_DISCONNECT_RQST, 0); + _treatmentStatus.bicartAction = static_cast(dryBicartAction); + switch (_treatmentStatus.bicartAction) { + case DRY_BICART_ACTION_DRAIN: + // If either of drain or depressurization commands were selected, set the progress to 0 as it is a new start + _treatmentStatus.bicartDrainInProgress = DRY_BICART_DRIN_IN_PROGRESS; + _treatmentStatus.bicartProgress = 0; + break; + case DRY_BICART_ACTION_DEPRESSURIZE: + _treatmentStatus.bicartDepresInProgress = DRY_BICART_DEPRES_IN_PROGRESS; + _treatmentStatus.bicartProgress = 0; + break; + case DRY_BICART_ACTION_CANCEL: + // If cancel is selected cancel both (in case cancle was selected) + // Set the progress to 0 + _treatmentStatus.bicartDrainInProgress = DRY_BICART_DRIN_NOT_IN_PROGRESS; + _treatmentStatus.bicartDepresInProgress = DRY_BICART_DEPRES_NOT_IN_PROGRESS; + _treatmentStatus.bicartProgress = 0; + break; + case DRY_BICART_ACTION_DONE: + default: + // Do nothing + break; + } + // Broadcast the results of the action immediately + handleDryBicartBroadcastData(BC_IMMEDIATELY); + + _treatmentRcvdMessages[ID_UI_DRY_BICART_DISCONNECT_RQST].clear(); + handleUIResponseMessage(ID_TD_DRY_BICART_DISCONNECT_RESP, ACCEPT_VALUE); +} + + + + + + + Index: sources/drydemo/StateControllerTreatmentBroadcasts.cpp =================================================================== diff -u -rb13dd2b30889640ebf03f54414f536ca5c8d2dc7 -rbf271a558491a83b39eb30748784f1b744736dd2 --- sources/drydemo/StateControllerTreatmentBroadcasts.cpp (.../StateControllerTreatmentBroadcasts.cpp) (revision b13dd2b30889640ebf03f54414f536ca5c8d2dc7) +++ sources/drydemo/StateControllerTreatmentBroadcasts.cpp (.../StateControllerTreatmentBroadcasts.cpp) (revision bf271a558491a83b39eb30748784f1b744736dd2) @@ -189,11 +189,8 @@ QVariantList msg; msg.append(static_cast(ID_DD_CONDUCTIVITY_DATA)); msg.append(Can_Id::eChlid_DD_Sync); - msg.append(0.0); - msg.append(d27Cond); - msg.append(0.0); - msg.append(0.0); - msg.append(0.0); + msg.append(0.0); msg.append(d27Cond); msg.append(0.0); + msg.append(0.0); msg.append(0.0); _isBroadcastListReady = false; _broadcastMessages.append(msg); _isBroadcastListReady = true; @@ -263,9 +260,9 @@ void StateController::handleVitalsBroadcastData() { - quint32 systolic = _randNumGenerator.global()->bounded(DEF_TX_SYSTOLIC_PRES - 20, DEF_TX_SYSTOLIC_PRES ); - quint32 diastolic = _randNumGenerator.global()->bounded(DEF_TX_DIASTOLIC_PRES - 20, DEF_TX_DIASTOLIC_PRES); - quint32 heartBeat = _randNumGenerator.global()->bounded(DEF_TX_HEART_BEAT - 20, DEF_TX_HEART_BEAT); + quint32 systolic = _randNumGenerator.global()->bounded(DEF_TX_SYSTOLIC_PRES_MMHG - 20, DEF_TX_SYSTOLIC_PRES_MMHG ); + quint32 diastolic = _randNumGenerator.global()->bounded(DEF_TX_DIASTOLIC_PRES_MMHG - 20, DEF_TX_DIASTOLIC_PRES_MMHG); + quint32 heartBeat = _randNumGenerator.global()->bounded(DEF_TX_HEART_BEAT - 20, DEF_TX_HEART_BEAT); QVariantList msg; msg.append(static_cast(ID_TD_BLOOD_PRESSURE_DATA)); @@ -278,4 +275,38 @@ _isBroadcastListReady = true; } +// TREATMENT PAUSE +void StateController::handleDryBicartBroadcastData(const Broadcast_Type BCType) +{ + static quint32 broadcastCounter = 53; + if ((_treatmentStatus.bicartDrainInProgress == DRY_BICART_DRIN_IN_PROGRESS) || (_treatmentStatus.bicartDepresInProgress == DRY_BICART_DEPRES_IN_PROGRESS)) { + float progress = static_cast(QOBJECT_TIMER_TIMEOUT_MS) / static_cast(DRY_BICART_PCT_PROG_TIME_MS); + _treatmentStatus.bicartProgress += progress * ONE_HUNDRED_PCT; + if (_treatmentStatus.bicartProgress >= ONE_HUNDRED_PCT) { _treatmentStatus.bicartProgress = ONE_HUNDRED_PCT; } + } + + if (_treatmentStatus.bicartProgress >= ONE_HUNDRED_PCT) { + // The bicart progress is 100% make both options not available until a new request comes in + _treatmentStatus.bicartDrainInProgress = DRY_BICART_DRIN_NOT_IN_PROGRESS; + _treatmentStatus.bicartDepresInProgress = DRY_BICART_DEPRES_NOT_IN_PROGRESS; + } + + if ((++broadcastCounter % NUM_OF_COUNTS_TIMER_BC_EMIT != 0) && (BCType == BC_DELAYED)) { return; } + + quint32 bicarbShowDialog = (_treatmentStatus.bicartAction == DRY_BICART_ACTION_DONE ? DRY_BICART_CLOSE_SCREEN : DRY_BICART_OPEN_SCREEN); + + QVariantList msg; + msg.append(static_cast(ID_TD_DRY_BICART_DISCONNECT_DATA)); + msg.append(Can_Id::eChlid_TD_Sync); + msg.append(bicarbShowDialog); + msg.append(_treatmentStatus.bicartTotal); + msg.append(static_cast(_treatmentStatus.bicartProgress)); + msg.append(_treatmentStatus.bicartDrainInProgress); + msg.append(_treatmentStatus.bicartDepresInProgress); + _isBroadcastListReady = false; + _broadcastMessages.append(msg); + _isBroadcastListReady = true; +} + +