Index: drydemo.pro.user =================================================================== diff -u -r61e26e538aae580369385eb78a966e74240d79c4 -r8aa65ae1bbef5f6121783026efeeb99114c14414 --- drydemo.pro.user (.../drydemo.pro.user) (revision 61e26e538aae580369385eb78a966e74240d79c4) +++ drydemo.pro.user (.../drydemo.pro.user) (revision 8aa65ae1bbef5f6121783026efeeb99114c14414) @@ -1,6 +1,6 @@ - + EnvironmentId @@ -469,42 +469,42 @@ /home/denali/Projects/tmp/build/build-denali-Qt_5_15_10_iMX8-Debug/denali /home/denali/Projects/tmp/build/build-denali-Qt_5_15_10_iMX8-Debug/denali /home/denali/Projects/tmp/build/build-denali-Qt_5_15_10_iMX8-Debug/denali + /home/denali/Projects/tmp/build/build-denali-Qt_5_15_10_iMX8-Debug/denali /home/denali/Projects/tmp/build/build-denali-Qt_5_15_10_iMX8-Release/denali + /home/denali/Projects/tmp/build/build-denali-Qt_5_15_10_iMX8-Release/denali /home/denali/Projects/tmp/build/build-denali-Qt_5_15_10_iMX8-Debug/denali /home/denali/Projects/tmp/build/build-denali-Qt_5_15_10_iMX8-Debug/denali /home/denali/Projects/tmp/build/build-denali-Qt_5_15_10_iMX8-Debug/denali - /home/denali/Projects/tmp/build/build-denali-Qt_5_15_10_iMX8-Release/denali /home/denali/Projects/tmp/build/build-denali-Qt_5_15_10_iMX8-Debug/denali /home/denali/Projects/tmp/build/build-denali-Qt_5_15_10_iMX8-Debug/denali /home/denali/Projects/tmp/build/build-denali-Qt_5_15_10_iMX8-Debug/denali /home/denali/Projects/tmp/build/build-denali-Qt_5_15_10_iMX8-Debug/denali - /home/denali/Projects/tmp/build/build-denali-Qt_5_15_10_iMX8-Release/denali /home/denali/Projects/tmp/build/build-denali-Qt_5_15_10_iMX8-Debug/denali /home/denali/Projects/tmp/build/build-denali-Qt_5_15_10_iMX8-Release/denali + /home/denali/Projects/tmp/build/build-denali-Qt_5_15_10_iMX8-Release/denali /home/denali/Projects/tmp/build/build-denali-Qt_5_15_10_iMX8-Debug/denali /home/denali/Projects/tmp/build/build-denali-Qt_5_15_10_iMX8-Debug/denali - /home/denali/Projects/tmp/build/build-denali-Qt_5_15_10_iMX8-Debug/denali - 192.168.137.30 192.168.137.25 - 192.168.137.170 + 192.168.137.30 192.168.10.186 + 192.168.137.170 192.168.10.167 - 192.168.10.159 192.168.137.210 - 192.168.10.138 + 192.168.10.159 192.168.10.228 192.168.10.228 - 192.168.137.247 - 192.168.137.202 - 192.168.137.36 + 192.168.10.138 192.168.137.125 + 192.168.137.36 + 192.168.137.202 + 192.168.137.247 + 192.168.137.3 + 192.168.137.24 + 192.168.40.23 192.168.137.170 192.168.137.26 - 192.168.40.23 - 192.168.137.24 - 192.168.137.3 192.168.10.186 @@ -532,7 +532,6 @@ /opt/b2qt/3.1.18/sysroots /opt/b2qt/3.1.18/sysroots - /opt/b2qt/3.1.18/sysroots /opt/b2qt/3.1.18/sysroots/x86_64-pokysdk-linux /opt/b2qt/3.1.18/sysroots /opt/b2qt/3.1.18/sysroots @@ -550,49 +549,50 @@ /opt/b2qt/3.1.18/sysroots /opt/b2qt/3.1.18/sysroots /opt/b2qt/3.1.18/sysroots + /opt/b2qt/3.1.18/sysroots - 2023-02-02T02:30:48.337 2023-02-02T02:13:54.596 - 2023-01-27T10:15:15.423 + 2023-02-02T02:30:48.337 2023-01-18T17:47:08.797 + 2023-01-27T10:15:15.423 2023-02-02T19:40:15.813 - 2023-01-24T18:19:13.179 2023-02-02T01:52:20.307 - 2023-02-02T09:06:00.862 - 2023-01-17T18:18:03.749 + 2023-01-24T18:19:13.179 2023-01-17T18:06:25.579 - 2023-02-02T02:26:33.738 - 2023-02-02T01:46:50.167 - 2023-02-01T03:23:15.710 + 2023-01-17T18:18:03.749 + 2023-02-02T09:06:00.862 2023-02-02T02:07:25.922 + 2023-02-01T03:23:15.710 + 2023-02-02T01:46:50.167 + 2023-02-02T02:26:33.738 + 2023-02-02T02:40:56.627 + 2023-02-02T02:05:29.947 + 2023-01-24T17:29:54.849 2023-01-27T09:45:11.898 2023-02-01T05:00:56.449 - 2023-01-24T17:29:54.849 - 2023-02-02T02:05:29.947 - 2023-02-02T02:40:56.627 2023-01-18T20:13:36.296 - 2023-02-02T02:31:01.000 2023-02-02T02:14:08.000 - 2023-01-27T10:15:08.000 + 2023-02-02T02:31:01.000 2023-01-18T17:47:04.000 + 2023-01-27T10:15:08.000 2023-02-02T19:39:36.000 - 2023-01-24T18:18:58.000 2023-02-02T01:52:16.000 - 2023-02-02T09:05:22.000 - 2023-01-17T18:17:25.000 + 2023-01-24T18:18:58.000 2023-01-17T18:05:42.000 - 2023-02-02T02:26:46.000 - 2023-02-02T01:47:02.000 - 2023-02-01T03:23:28.000 + 2023-01-17T18:17:25.000 + 2023-02-02T09:05:22.000 2023-02-02T02:07:21.000 + 2023-02-01T03:23:28.000 + 2023-02-02T01:47:02.000 + 2023-02-02T02:26:46.000 + 2023-02-02T02:41:10.000 + 2023-02-02T02:05:42.000 + 2023-01-24T17:30:03.000 2023-01-27T09:44:58.000 2023-02-01T05:00:51.000 - 2023-01-24T17:30:03.000 - 2023-02-02T02:05:42.000 - 2023-02-02T02:41:10.000 2023-01-18T20:13:33.000 Index: sources/MessageGlobals.h =================================================================== diff -u -r4533fba9bf69d25de21536b849b5d9cb09d959ee -r8aa65ae1bbef5f6121783026efeeb99114c14414 --- sources/MessageGlobals.h (.../MessageGlobals.h) (revision 4533fba9bf69d25de21536b849b5d9cb09d959ee) +++ sources/MessageGlobals.h (.../MessageGlobals.h) (revision 8aa65ae1bbef5f6121783026efeeb99114c14414) @@ -156,6 +156,10 @@ ID_TD_ULTRAFILTRATION_CHANGE_CONFIRM_RESP = 0x6700, ID_UI_BOLUS_VOLUME_CHANGE_RQST = 0x7400, ID_TD_BOLUS_VOLUME_CHANGE_RESP = 0x7500, + ID_UI_DURATION_VALIDATE_RQST = 0x7600, + ID_TD_DURATION_VALIDATE_RESP = 0x7700, + ID_UI_DURATION_CONFIRM_RQST = 0x7800, + ID_TD_DURATION_CONFIRM_RESP = 0x7900, ID_UI_TREATMENT_SET_POINTS_CHANGE_RQST = 0x7A00, ID_TD_TREATMENT_SET_POINTS_CHANGE_RESP = 0x7B00, ID_UI_TREATMENT_SET_POINT_BLOOD_FLOW_CHANGE_RQST = 0x7C00, Index: sources/drydemo/DryDemoDefines.h =================================================================== diff -u -r4533fba9bf69d25de21536b849b5d9cb09d959ee -r8aa65ae1bbef5f6121783026efeeb99114c14414 --- sources/drydemo/DryDemoDefines.h (.../DryDemoDefines.h) (revision 4533fba9bf69d25de21536b849b5d9cb09d959ee) +++ sources/drydemo/DryDemoDefines.h (.../DryDemoDefines.h) (revision 8aa65ae1bbef5f6121783026efeeb99114c14414) @@ -44,7 +44,7 @@ #define ACID_TYPES_SODIUM 137 #define DEF_TX_ELAPSED_TIME_S (2 * MINUTES_PER_HOUR) * SECONDS_PER_MINUTE -#define DEF_TX_PARAM_PRESCRIBED_DUR_MIN ((4 * MINUTES_PER_HOUR) + 30) +#define DEF_TX_PARAM_PRESCRIBED_DUR_MIN (4 * MINUTES_PER_HOUR) //((4 * MINUTES_PER_HOUR) + 30) // TODO why 30 extra minutes #define DEF_TX_PARAM_PRESCRIBED_DUR_S DEF_TX_PARAM_PRESCRIBED_DUR_MIN * SECONDS_PER_MINUTE #define DEF_TX_PARAM_UF_VOLUME_L 2.0 #define DEF_TX_PARAM_BLOOD_FLOW_RATE_MLPM 400 @@ -71,6 +71,7 @@ // Initiate treatment #define INITIATE_TREATMENT 1 #define ALLOW_DIALYSATE_DELIVER 1 +#define BYPASS_DIALYSATE_DELIVER 0 // Treatment defines #define BLOOD_PRIME_VOLUME_ML (106.6 + 40) @@ -162,6 +163,7 @@ enum Reject_Reasons { REQUEST_REJECT_REASON_NONE = 0, REQUEST_REJECT_REASON_INVALID_TREATMENT_STATE = 4, + REQUEST_REJECT_REASON_TREATMENT_TIME_OUT_OF_RANGE = 6, REQUEST_REJECT_REASON_TREATMENT_TIME_LESS_THAN_CURRENT = 7, REQUEST_REJECT_REASON_UF_VOLUME_OUT_OF_RANGE = 11, REQUEST_REJECT_REASON_UF_RATE_OUT_OF_RANGE = 12, Index: sources/drydemo/StateController.cpp =================================================================== diff -u -r4533fba9bf69d25de21536b849b5d9cb09d959ee -r8aa65ae1bbef5f6121783026efeeb99114c14414 --- sources/drydemo/StateController.cpp (.../StateController.cpp) (revision 4533fba9bf69d25de21536b849b5d9cb09d959ee) +++ sources/drydemo/StateController.cpp (.../StateController.cpp) (revision 8aa65ae1bbef5f6121783026efeeb99114c14414) @@ -55,6 +55,8 @@ case ID_UI_UF_PAUSE_RESUME_RQST: case ID_UI_TREATMENT_UF_VOLUME_VALIDATE_RQST: case ID_UI_ULTRAFILTRATION_CHANGE_CONFIRM_RQST: + case ID_UI_DURATION_VALIDATE_RQST: + case ID_UI_DURATION_CONFIRM_RQST: _treatmentRcvdMessages[receivedMsgID] = msg[1]; break; @@ -96,26 +98,22 @@ case ID_TD_TREATMENT_UF_VOLUME_VALIDATE_RESP: case ID_TD_TREATMENT_PARAM_RANGES_DATA: case ID_TD_ULTRAFILTRATION_CHANGE_CONFIRM_RESP: + case ID_TD_DURATION_VALIDATE_RESP: + case ID_TD_DURATION_CONFIRM_RESP: // Do nothing break; } } void StateController::timerEvent(QTimerEvent *) { - if (!_dryDemo.isRunning()){ - _dryDemo.start(); - } + if (!_dryDemo.isRunning()){ _dryDemo.start(); } _dryDemo.submitEvent("TimeoutEvent"); - if (_isBroadcastListReady){ - sendMessages(true); - } + if (_isBroadcastListReady){ sendMessages(true); } - if (_isSendListReady){ - sendMessages(false); - } + if (_isSendListReady){ sendMessages(false); } //if (! _treatmentRcvdMessages[ID_UI_CONFIRMATION_RESULT_RESP].isNull()){ // // Check for the user request message from the dry-deme menu @@ -130,17 +128,13 @@ { QList msgList = _broadcastMessages; - if (isBroadcast){ - _broadcastMessages.clear(); - } + if (isBroadcast){ _broadcastMessages.clear(); } else{ msgList = _sendMessages; _sendMessages.clear(); } - for (auto item: msgList){ - emit _ApplicationController.didActionTransmit(item); - } + for (auto item: msgList){ emit _ApplicationController.didActionTransmit(item); } } void StateController::handleDryDemoMenuRequestMessage() @@ -155,17 +149,13 @@ void StateController::handleBackToStandbyEvent(State_Status &status) { - //_dryDemo.connectToEvent(_back2StandbyEvent, [&status](const QScxmlEvent &event) { - // qDebug() << "Event invoked:" << event.name(); - // status = STATE_ON_ENTRY; - //}, Qt::UniqueConnection); + if (_treatmentRcvdMessages[ID_UI_CONFIRMATION_RESULT_RESP].isNull()) { return; } - if (! _treatmentRcvdMessages[ID_UI_CONFIRMATION_RESULT_RESP].isNull()){ - // Check for the user request message from the dry-demo menu - handleDryDemoMenuRequestMessage(); - _treatmentStatus.stateTransitionEvent = "T_Back_2_SB"; - status = STATE_ON_EXIT; - } + // Check for the user request message from the dry-demo menu + handleDryDemoMenuRequestMessage(); + _treatmentStatus.stateTransitionEvent = "T_Back_2_SB"; + status = STATE_ON_EXIT; + _treatmentRcvdMessages[ID_UI_CONFIRMATION_RESULT_RESP].clear(); } // ----------- State transition methods ---------------- // @@ -177,7 +167,6 @@ handleTDOpModeTransitionBroadcastData(MODE_STAN, 0, BC_IMMEDIATELY); setTreatmentParametersToDefault(); resetDryDemoVariables(); - status = STATE_ON_ACTION; qDebug() << "Standby on entry"; }; @@ -378,10 +367,11 @@ handleTDOpModeTransitionBroadcastData(MODE_TREA, 0, BC_DELAYED); txStates = {_treatmentStatus.txState, 0, _treatmentStatus.dialysisSubState, 0, 0, 0, 0, 0, _treatmentStatus.fluidBolusState, 0}; handleTreatmentStatesBroadcastData(txStates, BC_DELAYED); - handleTDPressureProcessAndBroadcastData(BC_DELAYED); + // Fluid bolus functions handleFluidBolusRequestMessage(); if (_treatmentStatus.fluidBolusState == FLUID_BOLUS_SALINE_IN_PROGRESS_STATE){ handleFluidBolusFluidDelivery(_treatmentParams.bloodFlowRateMLPM); } handleFluidBolusBroadcastData(BC_DELAYED); + // Broadcast functions handleTreatmentTimeProcessAndBroadcastData(BC_DELAYED); handleTreatmentPrescriptionEditRequestMessage(); handleSetPointBloodFlowChange(_treatmentParams.bloodFlowRateMLPM, hasFlowChngeRequested); @@ -391,11 +381,16 @@ handleDDConductivityBroadcastData(BC_DELAYED); handleSetPointDialysateFlowChange(); handleSetPointDialysateTemperatureChange(); - handleUltrafiltrationBroadcastData(BC_DELAYED); + handleTDPressureProcessAndBroadcastData(BC_DELAYED); + // UF functions funcntios handleUltrafiltrationPauseResume(); handleUltrafiltrationVolumeChangeValidation(); - handleTreatmentSettingBroadcastData(BC_DELAYED); handleUltrafiltrationVolumeChangeConfirm(); + handleUltrafiltrationBroadcastData(BC_DELAYED); + // Tx Time setting functions + handleTreatmentSettingBroadcastData(BC_DELAYED); + handleTreatmentTimeChangeValidation(); + handleTreatmentTimeChangeConfirm(); if ((_treatmentStatus.treatmentElapsedTimeMS / MILLISECONDS_PER_SECOND) >= (_treatmentParams.treatmentDurationMin * SECONDS_PER_MINUTE)) { _treatmentStatus.stateTransitionEvent = "T_Tx_2_TE"; status = STATE_ON_EXIT; @@ -455,20 +450,18 @@ void StateController::handleInitiateTreatmentRequestMessage(State_Status &status) { - if (! _treatmentRcvdMessages[ID_INITIATE_TREATMENT].isNull()){ + if (_treatmentRcvdMessages[ID_INITIATE_TREATMENT].isNull()){ return; } - quint32 treatmentStatus = extractU32DataFromReceivedMessage(ID_INITIATE_TREATMENT, 0); - User_Command_ID cmdID = CMD_STAND_BY; + quint32 treatmentStatus = extractU32DataFromReceivedMessage(ID_INITIATE_TREATMENT, 0); + User_Command_ID cmdID = CMD_STAND_BY; - // The initiate payload message payload. By default assume we are going back to standby - if (treatmentStatus == INITIATE_TREATMENT) { cmdID = CMD_PRE_TX; } - - _treatmentStatus.stateTransitionEvent = _transitionEventsFromStandby[cmdID][0].toString(); - _treatmentRcvdMessages[ID_INITIATE_TREATMENT].clear(); - handleUIResponseMessage(ID_TD_RESP_INITIATE_TREATMENT, ACCEPT_VALUE); - // Set the state to be on exit because the state has to exit - status = STATE_ON_EXIT; - } + // The initiate payload message payload. By default assume we are going back to standby + if (treatmentStatus == INITIATE_TREATMENT) { cmdID = CMD_PRE_TX; } + _treatmentStatus.stateTransitionEvent = _transitionEventsFromStandby[cmdID][0].toString(); + _treatmentRcvdMessages[ID_INITIATE_TREATMENT].clear(); + handleUIResponseMessage(ID_TD_RESP_INITIATE_TREATMENT, ACCEPT_VALUE); + // Set the state to be on exit because the state has to exit + status = STATE_ON_EXIT; } void StateController::handleTDOpModeTransitionBroadcastData(const TD_OP_MODE mode, const quint32 subMode, const Broadcast_Type BCType) @@ -628,7 +621,6 @@ { _treatmentStatus.hasTxParamsBeenInitialized = false; _treatmentStatus.treatmentElapsedTimeMS = DEF_TX_ELAPSED_TIME_S * MILLISECONDS_PER_SECOND; - _treatmentStatus.remainingTreatmentTimeS = DEF_TX_PARAM_PRESCRIBED_DUR_S - (_treatmentStatus.treatmentElapsedTimeMS / MILLISECONDS_PER_SECOND); _treatmentStatus.stateTransitionEvent = ""; _treatmentStatus.totalFluidBolusDeliveredML = 0.0; _treatmentStatus.accumFluidBolusDeliveredML = 0.0; Index: sources/drydemo/StateController.h =================================================================== diff -u -r4533fba9bf69d25de21536b849b5d9cb09d959ee -r8aa65ae1bbef5f6121783026efeeb99114c14414 --- sources/drydemo/StateController.h (.../StateController.h) (revision 4533fba9bf69d25de21536b849b5d9cb09d959ee) +++ sources/drydemo/StateController.h (.../StateController.h) (revision 8aa65ae1bbef5f6121783026efeeb99114c14414) @@ -34,20 +34,25 @@ struct Treatment_Status_Vars { bool hasTxParamsBeenInitialized; quint32 treatmentElapsedTimeMS; - quint32 remainingTreatmentTimeS; // TODO remove - quint32 prescribedTreatmentTimeS; // TODO remove User_Command_ID userCmd; QString stateTransitionEvent; float accumFluidBolusDeliveredML; float totalFluidBolusDeliveredML; Fluid_Bolus_States fluidBolusState; Treatment_States txState; Dialysis_States dialysisSubState; + // UF variables float presUFRateMLPM; float ufVolDeliveredL; bool validateUFVolReceived; float validateUFVolGoalL; float validateUFRateLHR; + // Tx dur variables + bool validateTxDurReceived; + quint32 validateTxDurMin; + quint32 validateHepDurMin; + // Alarm variabls + bool isAnAlarmActive; }; struct Treatment_Params { @@ -140,6 +145,8 @@ void handleUltrafiltrationVolumeChangeValidation(); void handleTreatmentSettingBroadcastData(const Broadcast_Type BCType); void handleUltrafiltrationVolumeChangeConfirm(); + void handleTreatmentTimeChangeValidation(); + void handleTreatmentTimeChangeConfirm(); // Treatment end methods Index: sources/drydemo/StateControllerTreatment.cpp =================================================================== diff -u -r4533fba9bf69d25de21536b849b5d9cb09d959ee -r8aa65ae1bbef5f6121783026efeeb99114c14414 --- sources/drydemo/StateControllerTreatment.cpp (.../StateControllerTreatment.cpp) (revision 4533fba9bf69d25de21536b849b5d9cb09d959ee) +++ sources/drydemo/StateControllerTreatment.cpp (.../StateControllerTreatment.cpp) (revision 8aa65ae1bbef5f6121783026efeeb99114c14414) @@ -20,7 +20,6 @@ void StateController::handleBloodPrimeBroadcastData(const float accumulatedVolML, const quint32 primeTimeOutS, const quint32 pauseCountDownS, const Broadcast_Type BCType) { static quint32 broadcastCounter = 0; - if ((++broadcastCounter % NUM_OF_COUNTS_TIMER_BC_EMIT != 0) && (BCType == BC_DELAYED)) { return; } // Broadcast @@ -90,17 +89,14 @@ _treatmentParams.dialysateFlowRateMLPM = DEF_TX_PARAM_DIAL_FLOW_RATE_MLPM; _treatmentParams.treatmentDurationMin = DEF_TX_PARAM_PRESCRIBED_DUR_MIN; _treatmentParams.dialysateTemperatureC = DEF_TX_PARAM_DIA_TEMPERATURE_C; - _treatmentParams.treatmentDurationMin = DEF_TX_PARAM_PRESCRIBED_DUR_MIN; _treatmentParams.fluidBlousVolumeML = DEF_TX_PARAM_SALINE_BOLUS_VOL_ML; _treatmentParams.ufVolumeL = DEF_TX_PARAM_UF_VOLUME_L; } void StateController::initializeTreatmentTimeAndUltrafiltration() { - // The default elapsed time is 2 hours becasue the default tx duration is 4 hours. If the prescribed is less than 2 hours, 0 the elapsed - if ((_treatmentParams.treatmentDurationMin * SECONDS_PER_MINUTE) < DEF_TX_ELAPSED_TIME_S){ _treatmentStatus.treatmentElapsedTimeMS = 0; } + if (_treatmentStatus.hasTxParamsBeenInitialized) { _treatmentStatus.treatmentElapsedTimeMS = 0; } _treatmentStatus.presUFRateMLPM = (_treatmentParams.ufVolumeL * MILLILITERS_PER_LITER) / (static_cast(_treatmentParams.treatmentDurationMin)); - _treatmentStatus.prescribedTreatmentTimeS = _treatmentParams.treatmentDurationMin / SECONDS_PER_MINUTE; float presUFVolL = _treatmentParams.ufVolumeL; float presUFRateLHR = presUFVolL / (static_cast(_treatmentParams.treatmentDurationMin) / static_cast(MINUTES_PER_HOUR)); @@ -111,12 +107,10 @@ qDebug() << "UF Init" << presUFRateLHR << UFVolLMS << _treatmentStatus.ufVolDeliveredL; } - void StateController::handleTreatmentSetpointsBroadcastData(const quint32 bloodFlowMLPM, const quint32 dialFlowMLPM, const float dialTempC, const Broadcast_Type BCType) { static quint32 broadcastCounter = 3; - if ((++broadcastCounter % NUM_OF_COUNTS_TIMER_BC_EMIT != 0) && (BCType == BC_DELAYED)) { return; } QVariantList msg; @@ -131,7 +125,6 @@ void StateController::handleTreatmentStatesBroadcastData(const QList &txStates, const Broadcast_Type BCType) { static quint32 broadcastCounter = 0; - if ((++broadcastCounter % NUN_OF_COUNTS_QART_BC_EMIT != 0) && (BCType == BC_DELAYED)) { return; } QVariantList msg; @@ -154,12 +147,10 @@ _treatmentStatus.fluidBolusState = FLUID_BOLUS_IDLE_STATE; if (fluidBolusCmd == FLUID_BOLUS_START_CMD){ - _treatmentStatus.fluidBolusState = FLUID_BOLUS_SALINE_IN_PROGRESS_STATE; - _treatmentStatus.dialysisSubState = DIALYSIS_UF_FLUID_BOLUS_STATE; + _treatmentStatus.fluidBolusState = FLUID_BOLUS_SALINE_IN_PROGRESS_STATE; + _treatmentStatus.dialysisSubState = DIALYSIS_UF_FLUID_BOLUS_STATE; } - else { - _treatmentStatus.totalFluidBolusDeliveredML += _treatmentStatus.accumFluidBolusDeliveredML; - } + else { _treatmentStatus.totalFluidBolusDeliveredML += _treatmentStatus.accumFluidBolusDeliveredML; } _treatmentRcvdMessages[ID_UI_FLUID_BOLUS_RQST].clear(); handleUIResponseMessage(ID_TD_FLUID_BOLUS_RESP, ACCEPT_VALUE, {static_cast(REQUEST_REJECT_REASON_NONE), @@ -187,6 +178,7 @@ if (deliveredFluidML >= _treatmentParams.fluidBlousVolumeML) { _treatmentStatus.fluidBolusState = FLUID_BOLUS_IDLE_STATE; + _treatmentStatus.dialysisSubState = DIALYSIS_UF_STATE; _treatmentStatus.accumFluidBolusDeliveredML = 0.0; _treatmentStatus.totalFluidBolusDeliveredML += _treatmentStatus.accumFluidBolusDeliveredML; } @@ -197,7 +189,6 @@ void StateController::handleFluidBolusBroadcastData(const Broadcast_Type BCType) { static quint32 broadcastCounter = 5; - if ((++broadcastCounter % NUM_OF_COUNTS_TIMER_BC_EMIT != 0) && (BCType == BC_DELAYED)) { return; } QVariantList msg; @@ -215,7 +206,6 @@ void StateController::handleTDPressureProcessAndBroadcastData(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 @@ -265,9 +255,8 @@ void StateController::handleTreatmentTimeProcessAndBroadcastData(const Broadcast_Type BCType) { static quint32 broadcastCounter = 12; - if (_treatmentStatus.fluidBolusState == FLUID_BOLUS_IDLE_STATE) { - _treatmentStatus.treatmentElapsedTimeMS += QOBJECT_TIMER_TIMEOUT_MS; + _treatmentStatus.treatmentElapsedTimeMS += QOBJECT_TIMER_TIMEOUT_MS; } if ((++broadcastCounter % NUM_OF_COUNTS_TIMER_BC_EMIT != 0) && (BCType == BC_DELAYED)) { return; } @@ -276,7 +265,7 @@ quint32 elapsedTimeS = _treatmentStatus.treatmentElapsedTimeMS / MILLISECONDS_PER_SECOND; quint32 remainingTimeS = prescribedTimeS - elapsedTimeS; - //qDebug() << "Times" << prescribedTimeS << elapsedTimeS << remainingTimeS; + qDebug() << "Times" << prescribedTimeS << elapsedTimeS << remainingTimeS; QVariantList msg; msg.append(static_cast(ID_TD_TREATMENT_TIME_DATA)); @@ -366,18 +355,18 @@ 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 = (_treatmentStatus.fluidBolusState == FLUID_BOLUS_SALINE_IN_PROGRESS_STATE ? BYPASS_DIALYSATE_DELIVER : ALLOW_DIALYSATE_DELIVER); QVariantList msg; msg.append(static_cast(ID_DD_GEN_DIALYSATE_MODE_DATA)); msg.append(Can_Id::eChlid_DD_Sync); msg.append(dummyData); msg.append(dummyData); - msg.append(ALLOW_DIALYSATE_DELIVER); + msg.append(dialBypass); msg.append(dummyFloat); _isBroadcastListReady = false; _broadcastMessages.append(msg); @@ -399,7 +388,6 @@ void StateController::handleDDConductivityBroadcastData(const Broadcast_Type BCType) { static quint32 broadcastCounter = 22; - if ((++broadcastCounter % NUM_OF_COUNTS_TIMER_BC_EMIT != 0) && (BCType == BC_DELAYED)) { return; } float d27Cond = 250.63; @@ -420,16 +408,16 @@ void StateController::handleTDBloodPressureBroadcastData(const Broadcast_Type BCType) { static quint32 broadcastCounter = 22; - if ((++broadcastCounter % NUM_OF_COUNTS_TIMER_BC_EMIT != 0) && (BCType == BC_DELAYED)) { return; } // TODO copmlete } void StateController::handleUltrafiltrationBroadcastData(const Broadcast_Type BCType) { static quint32 broadcastCounter = 31; - if ((++broadcastCounter % NUM_OF_COUNTS_TIMER_BC_EMIT != 0) && (BCType == BC_DELAYED)) { return; } + // Only count for UF when the dialysis state is in UF + if (_treatmentStatus.dialysisSubState != DIALYSIS_UF_STATE) { return; } float presUFVolL = _treatmentParams.ufVolumeL; float presUFRateLHR = presUFVolL / (static_cast(_treatmentParams.treatmentDurationMin) / static_cast(MINUTES_PER_HOUR)); @@ -468,30 +456,28 @@ { if (_treatmentRcvdMessages[ID_UI_UF_PAUSE_RESUME_RQST].isNull()){ return; } - quint32 cmd = extractU32DataFromReceivedMessage(ID_UI_UF_PAUSE_RESUME_RQST, 0); + quint32 cmd = extractU32DataFromReceivedMessage(ID_UI_UF_PAUSE_RESUME_RQST, 0); + quint32 acceptReject = REJECT_VALUE; QVariantList reason; if (_treatmentStatus.txState == TREAT_DIALYSIS_STATE) { // Assume the default state is UF state _treatmentStatus.dialysisSubState = DIALYSIS_UF_STATE; _treatmentStatus.dialysisSubState = (cmd == 0 ? DIALYSIS_UF_PAUSED_STATE : _treatmentStatus.dialysisSubState); + acceptReject = ACCEPT_VALUE; } - else if (_treatmentStatus.txState != TREAT_DIALYSIS_STATE) { - reason.append(static_cast(REQUEST_REJECT_REASON_INVALID_TREATMENT_STATE)); - } + else if (_treatmentStatus.txState != TREAT_DIALYSIS_STATE) { reason.append(REQUEST_REJECT_REASON_INVALID_TREATMENT_STATE); } else { - quint32 r = static_cast(REQUEST_REJECT_REASON_UF_NOT_PAUSED); - - r = (cmd == 0 ? static_cast(REQUEST_REJECT_REASON_UF_NOT_IN_PROGESS) : r); + quint32 r = (cmd == 0 ? REQUEST_REJECT_REASON_UF_NOT_IN_PROGESS : REQUEST_REJECT_REASON_UF_NOT_PAUSED); reason.append(r); } - handleUIResponseMessage(ID_TD_UF_PAUSE_RESUME_RESP, ACCEPT_VALUE, reason); + handleUIResponseMessage(ID_TD_UF_PAUSE_RESUME_RESP, acceptReject, reason); _treatmentRcvdMessages[ID_UI_UF_PAUSE_RESUME_RQST].clear(); } void StateController::handleUltrafiltrationVolumeChangeValidation() { - if (_treatmentRcvdMessages[ID_UI_TREATMENT_UF_VOLUME_VALIDATE_RQST].isNull()){ return; } + if (_treatmentRcvdMessages[ID_UI_TREATMENT_UF_VOLUME_VALIDATE_RQST].isNull()) { return; } QVariantList reason = {REQUEST_REJECT_REASON_NONE, 0.0, 0.0}; quint32 rejReasIndex = 0; quint32 ufGoalIndex = 1; @@ -538,7 +524,6 @@ void StateController::handleTreatmentSettingBroadcastData(const Broadcast_Type BCType) { static quint32 broadcastCounter = 38; - if ((++broadcastCounter % NUM_OF_COUNTS_TIMER_BC_EMIT != 0) && (BCType == BC_DELAYED)) { return; } quint32 elapsedTimeMin = _treatmentStatus.treatmentElapsedTimeMS / static_cast(SECONDS_PER_MINUTE * MILLISECONDS_PER_SECOND); @@ -553,8 +538,8 @@ float maxUFVol1ML = minUFVolML + (static_cast(_treatmentParams.treatmentDurationMin - elapsedTimeMin) * MAX_UF_RATE_MLPM); float maxUFVol2ML = (_treatmentStatus.presUFRateMLPM > 0.0 ? minUFVolML + static_cast(MAX_TX_TIME_MINS - elapsedTimeMin - 1) : minUFVolML); float maxUFVolML = qMax(maxUFVol1ML, maxUFVol2ML); - //qDebug() << "TIME seetingt" << elapsedTimeMin << minTxTimeMin << maxTxTime1Min << maxTxTime2Min << maxTxTimeMin - // << maxUFVol1ML << maxUFVol2ML << maxUFVolML; + qDebug() << "TIME settings" << elapsedTimeMin << minTxTimeMin << maxTxTime1Min << maxTxTime2Min << maxTxTimeMin + << maxUFVol1ML << maxUFVol2ML << maxUFVolML; QVariantList msg; msg.append(static_cast(ID_TD_TREATMENT_PARAM_RANGES_DATA)); @@ -572,31 +557,124 @@ void StateController::handleUltrafiltrationVolumeChangeConfirm() { - if (_treatmentRcvdMessages[ID_UI_ULTRAFILTRATION_CHANGE_CONFIRM_RQST].isNull()){ return; } + if (_treatmentRcvdMessages[ID_UI_ULTRAFILTRATION_CHANGE_CONFIRM_RQST].isNull()) { return; } QVariantList reason; quint32 acceptReject = REJECT_VALUE; - float roundedUFRateLHR = qRound(_treatmentStatus.validateUFRateLHR * 100.0) / 100.0; - float requestedUFVolL = extractF32DataFromReceivedMessage(ID_UI_ULTRAFILTRATION_CHANGE_CONFIRM_RQST, 0); - float requestedUFRateLHR = extractF32DataFromReceivedMessage(ID_UI_ULTRAFILTRATION_CHANGE_CONFIRM_RQST, 4); - bool isUFVolInRange = (qAbs(requestedUFVolL - _treatmentStatus.validateUFVolGoalL) < NEARLY_ZERO ? true : false); - bool isUFRateInRange = (qAbs(requestedUFRateLHR - roundedUFRateLHR) < NEARLY_ZERO ? true : false); + float roundedUFRateLHR = qRound(_treatmentStatus.validateUFRateLHR * 100.0) / 100.0; + float requestedUFVolL = extractF32DataFromReceivedMessage(ID_UI_ULTRAFILTRATION_CHANGE_CONFIRM_RQST, 0); + float requestedUFRateLHR = extractF32DataFromReceivedMessage(ID_UI_ULTRAFILTRATION_CHANGE_CONFIRM_RQST, 4); + bool isUFVolInRange = (qAbs(requestedUFVolL - _treatmentStatus.validateUFVolGoalL) < NEARLY_ZERO ? true : false); + bool isUFRateInRange = (qAbs(requestedUFRateLHR - roundedUFRateLHR) < NEARLY_ZERO ? true : false); qDebug() << "UF CONFI" << roundedUFRateLHR << requestedUFVolL << requestedUFRateLHR << isUFVolInRange << isUFRateInRange << qAbs(requestedUFRateLHR - roundedUFRateLHR); if (_treatmentStatus.validateUFVolReceived && isUFVolInRange && isUFRateInRange) { _treatmentParams.ufVolumeL = _treatmentStatus.validateUFVolGoalL; // Calcuate the new UF rate after the volume change - _treatmentStatus.presUFRateMLPM = (_treatmentParams.ufVolumeL * MILLILITERS_PER_LITER) / (static_cast(_treatmentParams.treatmentDurationMin)); + _treatmentStatus.presUFRateMLPM = (_treatmentStatus.validateUFRateLHR * MILLILITERS_PER_LITER) / (static_cast(MINUTES_PER_HOUR)); _treatmentStatus.validateUFRateLHR = 0.0; _treatmentStatus.validateUFVolGoalL = 0.0; _treatmentStatus.validateUFVolReceived = false; acceptReject = ACCEPT_VALUE; } - else if (!_treatmentStatus.validateUFVolReceived) { reason.append(REQUEST_REJECT_REASON_CONFIRMATION_NOT_EXPECTED); } + else if (!_treatmentStatus.validateUFVolReceived) { reason.append(REQUEST_REJECT_REASON_CONFIRMATION_NOT_EXPECTED); } else { reason.append(REQUEST_REJECT_REASON_CONFIRMATION_MISMATCH); } handleUIResponseMessage(ID_TD_ULTRAFILTRATION_CHANGE_CONFIRM_RESP, acceptReject, reason); _treatmentRcvdMessages[ID_UI_ULTRAFILTRATION_CHANGE_CONFIRM_RQST].clear(); } +void StateController::handleTreatmentTimeChangeValidation() +{ + if (_treatmentRcvdMessages[ID_UI_DURATION_VALIDATE_RQST].isNull()) { return; } + QVariantList reason = {REQUEST_REJECT_REASON_NONE, 0, 0, 0.0, 0.0}; + quint32 acceptReject = REJECT_VALUE; + quint32 rejReasIndex = 0; + quint32 txDurMinsIndex = 1; + quint32 hepDurMinsIndex = 2; + quint32 ufGoalIndex = 3; + quint32 ufRateIndex = 4; + + float prescribedUFVolML = _treatmentParams.ufVolumeL * static_cast(MILLILITERS_PER_LITER); + float elapsedTxTimeMin = _treatmentStatus.treatmentElapsedTimeMS / static_cast(MILLISECONDS_PER_SECOND * SECONDS_PER_MINUTE); + float measUFVolML = _treatmentStatus.ufVolDeliveredL * static_cast(MILLILITERS_PER_LITER); + float remainingUFVolML = prescribedUFVolML - measUFVolML; + quint32 requestedTxDurMin = extractU32DataFromReceivedMessage(ID_UI_DURATION_VALIDATE_RQST, 0); + quint32 txHepDiffMin = 0; + qDebug() << "Tx Dur1" << prescribedUFVolML << elapsedTxTimeMin << measUFVolML << remainingUFVolML << requestedTxDurMin; + reason[txDurMinsIndex] = requestedTxDurMin; + + if ((requestedTxDurMin >= MIN_TX_TIME_MINS) && (requestedTxDurMin <= MAX_TX_TIME_MINS)) { + if (static_cast(requestedTxDurMin) > elapsedTxTimeMin) { + if (remainingUFVolML < 0.0) { remainingUFVolML = 0.0; } + float remainingTxTimeMin = static_cast(requestedTxDurMin) - elapsedTxTimeMin; + float newUFRateMLPM = remainingUFVolML / remainingTxTimeMin; + reason[ufGoalIndex] = prescribedUFVolML / static_cast(MILLILITERS_PER_LITER); + reason[ufRateIndex] = (newUFRateMLPM * static_cast(MINUTES_PER_HOUR)) / static_cast(MILLILITERS_PER_LITER); + + if (newUFRateMLPM <= MAX_UF_RATE_MLPM) { + if (_treatmentParams.treatmentDurationMin > _treatmentParams.heparinDeliveryDurationMin) { + txHepDiffMin = _treatmentParams.treatmentDurationMin - _treatmentParams.heparinDeliveryDurationMin; + qDebug() << "Here" << _treatmentParams.treatmentDurationMin << _treatmentParams.heparinDeliveryDurationMin; + } + if (requestedTxDurMin > txHepDiffMin) { + _treatmentStatus.validateHepDurMin = requestedTxDurMin - txHepDiffMin; + } + else { _treatmentStatus.validateHepDurMin = 0; } + + reason[hepDurMinsIndex] = _treatmentStatus.validateHepDurMin; + acceptReject = ACCEPT_VALUE; + + qDebug() << "Hep time" << txHepDiffMin << requestedTxDurMin << _treatmentParams.heparinDeliveryDurationMin; + qDebug() << "Tx Dur2" << remainingTxTimeMin << newUFRateMLPM << reason[ufGoalIndex] << reason[ufRateIndex] << reason[ufRateIndex]; + + _treatmentStatus.validateTxDurReceived = true; + _treatmentStatus.validateTxDurMin = requestedTxDurMin; + _treatmentStatus.validateUFRateLHR = (newUFRateMLPM * static_cast(MINUTES_PER_HOUR)) / static_cast(MILLILITERS_PER_LITER); + _treatmentStatus.validateHepDurMin = _treatmentStatus.validateHepDurMin; + } + else { reason[rejReasIndex] = REQUEST_REJECT_REASON_UF_RATE_OUT_OF_RANGE; } + } + else { reason[rejReasIndex] = REQUEST_REJECT_REASON_TREATMENT_TIME_LESS_THAN_CURRENT; } + } + else { reason[rejReasIndex] = REQUEST_REJECT_REASON_TREATMENT_TIME_OUT_OF_RANGE; } + + handleUIResponseMessage(ID_TD_DURATION_VALIDATE_RESP, acceptReject, reason); + _treatmentRcvdMessages[ID_UI_DURATION_VALIDATE_RQST].clear(); +} + +void StateController::handleTreatmentTimeChangeConfirm() +{ + if (_treatmentRcvdMessages[ID_UI_DURATION_CONFIRM_RQST].isNull()) { return; } + QVariantList reason; + quint32 acceptReject = REJECT_VALUE; + + float roundedUFRateLHR = qRound(_treatmentStatus.validateUFRateLHR * 100.0) / 100.0; + quint32 requestedTxDurMin = extractU32DataFromReceivedMessage(ID_UI_DURATION_CONFIRM_RQST, 0); + quint32 requestedHepDurMin = extractU32DataFromReceivedMessage(ID_UI_DURATION_CONFIRM_RQST, 4); + float requestedUFRateLHR = extractF32DataFromReceivedMessage(ID_UI_DURATION_CONFIRM_RQST, 8); + bool isUFRateInRage = (qAbs(requestedUFRateLHR - roundedUFRateLHR) < NEARLY_ZERO ? true : false); + + qDebug() << "Tx Dur Confirm" << roundedUFRateLHR << requestedTxDurMin << requestedHepDurMin << requestedUFRateLHR << isUFRateInRage; + + if ((_treatmentStatus.validateTxDurReceived) && (requestedTxDurMin == _treatmentStatus.validateTxDurMin) && + (isUFRateInRage) && (requestedHepDurMin == _treatmentStatus.validateHepDurMin)) { + _treatmentParams.treatmentDurationMin = _treatmentStatus.validateTxDurMin; + _treatmentParams.heparinDeliveryDurationMin = _treatmentStatus.validateHepDurMin; + _treatmentStatus.presUFRateMLPM = (_treatmentStatus.validateUFRateLHR * MILLILITERS_PER_LITER) / (static_cast(MINUTES_PER_HOUR)); + acceptReject = ACCEPT_VALUE; + // Reset the validation values + _treatmentStatus.validateTxDurReceived = false; + _treatmentStatus.validateHepDurMin = 0; + _treatmentStatus.validateTxDurMin = 0; + _treatmentStatus.validateUFRateLHR = 0.0; + } + else if (!_treatmentStatus.validateTxDurReceived) { reason.append(REQUEST_REJECT_REASON_CONFIRMATION_NOT_EXPECTED); } + else { reason.append(REQUEST_REJECT_REASON_CONFIRMATION_MISMATCH); } + + handleUIResponseMessage(ID_TD_DURATION_CONFIRM_RESP, acceptReject, reason); + _treatmentRcvdMessages[ID_UI_DURATION_CONFIRM_RQST].clear(); +} + +