Index: sources/MessageGlobals.h =================================================================== diff -u -ra271469db538bfc35eba9a56308760893ecbc68e -rc52253ab5fc73e9b59d9cd99eada3d526d799987 --- sources/MessageGlobals.h (.../MessageGlobals.h) (revision a271469db538bfc35eba9a56308760893ecbc68e) +++ sources/MessageGlobals.h (.../MessageGlobals.h) (revision c52253ab5fc73e9b59d9cd99eada3d526d799987) @@ -132,6 +132,7 @@ ID_ALARM_STATUS_DATA = 0x0100, ID_ALARM_CLEARED = 0x0300, ID_UI_ALARM_USER_ACTION_REQUEST = 0x0600, + ID_UI_CHECK_IN = 0x1000, ID_TD_OP_MODE_DATA = 0x1200, ID_DD_CONDUCTIVITY_DATA = 0x1F00, ID_TD_PRESSURE_DATA = 0x2400, @@ -188,6 +189,7 @@ ID_TD_RECIRCULATE_DATA = 0xA800, ID_TD_UI_GENERIC_CONFIRMATION_REQUEST = 0xB500, ID_UI_CONFIRMATION_RESULT_RESP = 0xB600, + ID_ACK_MESSAGE_THAT_REQUIRES_ACK = 0xFFFF, }; enum TD_OP_MODE { Index: sources/canbus/MessageInterpreter.cpp =================================================================== diff -u -rb9f4ddeb2dec3019b87c712bfe64b8df1d4b328c -rc52253ab5fc73e9b59d9cd99eada3d526d799987 --- sources/canbus/MessageInterpreter.cpp (.../MessageInterpreter.cpp) (revision b9f4ddeb2dec3019b87c712bfe64b8df1d4b328c) +++ sources/canbus/MessageInterpreter.cpp (.../MessageInterpreter.cpp) (revision c52253ab5fc73e9b59d9cd99eada3d526d799987) @@ -487,8 +487,9 @@ quint16 id = vMessage.actionId; QString logString = QString("%1,").arg(id,4,16); QVariantList logVariant; + // Append the message ID and the sequence number logVariant.append(id); - //qDebug() << "Raw" << vMessage.actionId << vMessage.sequence; + logVariant.append(vMessage.sequence); if (_messageList.contains(id)) { ok = true; QStringList items = _messageList[id]; @@ -498,8 +499,6 @@ if (i == 0) { QString ID; switch (identifySource(vMessage.can_id, &ID)) { - //case Can_Source::eCan_HD: logString += ID + ",~" + item; break; - //case Can_Source::eCan_DG: logString += ID + ",~" + item; break; case Can_Source::eCan_DI: logString += ID + ",~" + item; break; default : logString += ID + ",~" + item; break; } @@ -549,10 +548,10 @@ } } LOG_APPED(logString); - if ((id != 0x1000) && (id != 0xFFFF) ) { - // Message 0x0700 is UI check in. It is not needed to be processed for dry demo + if (id != ID_ACK_MESSAGE_THAT_REQUIRES_ACK) { // Message 0xFFFF is the ack message and it is not needed to be processed for dry demo - qDebug() << "Message" << logString; + // Print the messages except the check in message + if (id != ID_UI_CHECK_IN) { qDebug() << "Message" << logString; } emit didUnhandledMsgReady(logVariant); } } Index: sources/drydemo/DryDemoDefines.h =================================================================== diff -u -rb9f4ddeb2dec3019b87c712bfe64b8df1d4b328c -rc52253ab5fc73e9b59d9cd99eada3d526d799987 --- sources/drydemo/DryDemoDefines.h (.../DryDemoDefines.h) (revision b9f4ddeb2dec3019b87c712bfe64b8df1d4b328c) +++ sources/drydemo/DryDemoDefines.h (.../DryDemoDefines.h) (revision c52253ab5fc73e9b59d9cd99eada3d526d799987) @@ -16,6 +16,9 @@ #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 +#define RCVD_MSG_SQNC_INDEX 1 +#define RCVD_MSG_PAYLOAD_INDEX 2 // Timer event defines #define DEFAULT_TIMEOUT_S 10 @@ -40,13 +43,8 @@ #define MIN_UF_RATE_MLPM 0.0 #define MAX_UF_RATE_MLPM (2000.0 / MINUTES_PER_HOUR) -#define ACID_TYPES_1251_1_K 1.0 // TODO remove? -#define ACID_TYPES_CALCIUM 2.5 -#define ACID_TYPES_BICARB 33 -#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) //((4 * MINUTES_PER_HOUR) + 30) // TODO why 30 extra minutes +#define DEF_TX_PARAM_PRESCRIBED_DUR_MIN (4 * MINUTES_PER_HOUR) #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 @@ -115,13 +113,15 @@ #define ALARM_TABLE_PRIORITY_INDEX 0 #define ALARM_TABLE_PROPERTIES_INDEX 1 #define ALARM_TABLE_TX_PAUSE_INDEX 2 +#define ALARM_TRANS_TO_TX_PAUSE 1 +#define ALARM_NOT_TRANS_TO_TX_PAUSE 0 +#define TRIG_LOW_VEN_ALARM_TIMEOUT_MS (5 * SECONDS_PER_MINUTE * MILLISECONDS_PER_SECOND) #define ALARM_NO_ALARM_PROPERTIES 0 #define ALARM_STOP_TX_PROPERTIES 6 #define ALARM_REPLACE_ACID_PROPERTIES 112 #define ALARM_RECIRC_WARN_PROPERTIES 112 #define ALARM_RECIR_TIMEOUT_RPOPERTIES 26 -#define ALARM_TRANS_TO_TX_PAUSE 1 -#define ALARM_NOT_TRANS_TO_TX_PAUSE 0 +#define ALARM_LOW_VENOUS_PROPERTIES 2 enum User_Command_ID { CMD_NONE = -1, @@ -242,6 +242,7 @@ enum Alarm_List { ALARM_ID_NO_ALARM = 0, + ALARM_ID_TD_VENOUS_PRESSURE_LOW = 47, ALARM_ID_TD_REPLACE_ACID_JUG = 88, ALARM_ID_TD_TREATMENT_STOPPED_BY_USER = 96, ALARM_ID_TD_RECIRC_TIMEOUT_WARNING = 199, Index: sources/drydemo/StateController.cpp =================================================================== diff -u -rb9f4ddeb2dec3019b87c712bfe64b8df1d4b328c -rc52253ab5fc73e9b59d9cd99eada3d526d799987 --- sources/drydemo/StateController.cpp (.../StateController.cpp) (revision b9f4ddeb2dec3019b87c712bfe64b8df1d4b328c) +++ sources/drydemo/StateController.cpp (.../StateController.cpp) (revision c52253ab5fc73e9b59d9cd99eada3d526d799987) @@ -32,14 +32,14 @@ _transitionEventsFromStandby[CMD_PRE_TX ] = {"T_SB_2_Pretx", static_cast(MODE_PRET)}; _transitionEventsFromStandby[CMD_BLOOD_PRIME ] = {"T_SB_2_BP" , static_cast(MODE_TREA)}; _transitionEventsFromStandby[CMD_MAIN_TX ] = {"T_SB_2_Tx" , static_cast(MODE_TREA)}; - _transitionEventsFromStandby[CMD_RINSEBACK ] = {"T_SB_2_RB" , static_cast(MODE_TREA)}; _transitionEventsFromStandby[CMD_RICIRCULATE ] = {"T_SB_2_RC" , static_cast(MODE_TREA)}; _transitionEventsFromStandby[CMD_END_TX ] = {"T_SB_2_TE" , static_cast(MODE_TREA)}; // Alarms specs and properties _alarmTriggerSpecs[ALARM_ID_NO_ALARM ] = {ALARM_PRIORITY_NONE, ALARM_NO_ALARM_PROPERTIES , ALARM_NOT_TRANS_TO_TX_PAUSE}; + _alarmTriggerSpecs[ALARM_ID_TD_VENOUS_PRESSURE_LOW ] = {ALARM_PRIORITY_HIGH, ALARM_LOW_VENOUS_PROPERTIES , ALARM_TRANS_TO_TX_PAUSE }; _alarmTriggerSpecs[ALARM_ID_TD_REPLACE_ACID_JUG ] = {ALARM_PRIORITY_HIGH, ALARM_REPLACE_ACID_PROPERTIES , ALARM_TRANS_TO_TX_PAUSE }; _alarmTriggerSpecs[ALARM_ID_TD_TREATMENT_STOPPED_BY_USER ] = {ALARM_PRIORITY_HIGH, ALARM_STOP_TX_PROPERTIES , ALARM_TRANS_TO_TX_PAUSE }; _alarmTriggerSpecs[ALARM_ID_TD_RECIRC_TIMEOUT_WARNING ] = {ALARM_PRIORITY_LOW , ALARM_RECIRC_WARN_PROPERTIES , ALARM_NOT_TRANS_TO_TX_PAUSE}; @@ -53,8 +53,12 @@ void StateController::doStateControllerUnhandledMsgReceived(const QVariantList &msg) { - MessageID receivedMsgID = static_cast(msg[0].toUInt()); // TODO check the length before reading the index + // If the message is empty do not process it. The message variant list must at least contain the message ID as well as the + // sequence number + if (msg.isEmpty()) { return; } + MessageID receivedMsgID = static_cast(msg[RCVD_MSG_MSG_ID_INDEX].toUInt()); // TODO check the length before reading the index + switch(receivedMsgID) { case ID_INITIATE_TREATMENT: @@ -75,9 +79,14 @@ case ID_UI_ALARM_USER_ACTION_REQUEST: case ID_UI_RINSEBACK_CMD_RQST: case ID_UI_RECIRCULATE_RQST: - _treatmentRcvdMessages[receivedMsgID] = msg[1]; + _treatmentRcvdMessages[receivedMsgID] = msg[RCVD_MSG_PAYLOAD_INDEX]; break; + case ID_UI_CHECK_IN: + // For UI check in add the sequence to the the received messages. For check in, the sequence is x -1 and sent back to ack + _treatmentRcvdMessages[receivedMsgID] = msg[RCVD_MSG_SQNC_INDEX]; + break; + //// These messages do not have a payload in from UI so a fake payload is added to be consumed //// and processed case ID_UI_ADJUST_DISPOSABLES_CONFIRM_RQST: @@ -125,6 +134,7 @@ case ID_TD_UI_GENERIC_CONFIRMATION_REQUEST: case ID_TD_RECIRCULATE_RESP: case ID_TD_RECIRCULATE_DATA: + case ID_ACK_MESSAGE_THAT_REQUIRES_ACK: // Do nothing break; } @@ -139,6 +149,9 @@ if (_isBroadcastListReady){ sendMessages(true); } if (_isSendListReady){ sendMessages(false); } + + // Ack UI check in message once received. This is to prevent alarm 100 from UI + handleUICheckInMessage(); } // ---------------------- Private methods ------------------ // @@ -151,7 +164,6 @@ msgList = _sendMessages; _sendMessages.clear(); } - for (auto item: msgList){ emit _ApplicationController.didActionTransmit(item); } } @@ -303,7 +315,7 @@ }; auto onExit = [=](){ - //qDebug() << "Blood prime on exit"; + qDebug() << "Blood prime on exit"; _dryDemo.submitEvent(_treatmentStatus.stateTransitionEvent); status = STATE_ON_ENTRY; }; @@ -349,7 +361,7 @@ handleTreatmentStatesBroadcastData(BC_DELAYED); // Fluid bolus functions handleFluidBolusRequestMessage(); - if (_treatmentSubStates.fluidBolusState == FLUID_BOLUS_SALINE_IN_PROGRESS_STATE) { handleFluidBolusFluidDelivery(_treatmentParams.bloodFlowRateMLPM); } + handleFluidBolusFluidDelivery(_treatmentParams.bloodFlowRateMLPM); handleFluidBolusBroadcastData(BC_DELAYED); // Broadcast functions handleTreatmentTimeProcessAndBroadcastData(BC_DELAYED); @@ -371,8 +383,10 @@ handleTreatmentSettingBroadcastData(BC_DELAYED); handleTreatmentTimeChangeValidation(); handleTreatmentTimeChangeConfirm(); + // Alarm methods handleTriggeredAlarmsToTxPause(status); - + handleTriggerLowVenousAlarmInTx(); + // Treatment complete condition if ((_treatmentStatus.treatmentElapsedTimeMS / MILLISECONDS_PER_SECOND) > (_treatmentParams.treatmentDurationMin * SECONDS_PER_MINUTE)) { // Treatment is complete Index: sources/drydemo/StateController.h =================================================================== diff -u -rb9f4ddeb2dec3019b87c712bfe64b8df1d4b328c -rc52253ab5fc73e9b59d9cd99eada3d526d799987 --- sources/drydemo/StateController.h (.../StateController.h) (revision b9f4ddeb2dec3019b87c712bfe64b8df1d4b328c) +++ sources/drydemo/StateController.h (.../StateController.h) (revision c52253ab5fc73e9b59d9cd99eada3d526d799987) @@ -53,6 +53,7 @@ quint32 validateHepDurMin; // Alarm variables Alarm_List activeTopAlarm; + quint32 lowVenousAlarmTimeoutCtr; // Rinseback variables quint32 rinsebackFlowMLPM; float rinsebackAccumVolML; @@ -125,6 +126,7 @@ // CAN function(s) void sendMessages(bool isBroadcast); bool handleDryDemoMenuRequestMessage(); + void handleUICheckInMessage(); // State handlers void onStandbyStateChange(bool active); @@ -147,6 +149,7 @@ void triggerAnAlarm(Alarm_List alarmID); void handleAlarmUserAction(State_Status &status, bool isFromTxPause = false); void handleTriggeredAlarmsToTxPause(State_Status &status); + void handleTriggerLowVenousAlarmInTx(); // Standby methods void handleInitiateTreatmentRequestMessage(State_Status &status); Index: sources/drydemo/StateControllerStandby.cpp =================================================================== diff -u -rb9f4ddeb2dec3019b87c712bfe64b8df1d4b328c -rc52253ab5fc73e9b59d9cd99eada3d526d799987 --- sources/drydemo/StateControllerStandby.cpp (.../StateControllerStandby.cpp) (revision b9f4ddeb2dec3019b87c712bfe64b8df1d4b328c) +++ sources/drydemo/StateControllerStandby.cpp (.../StateControllerStandby.cpp) (revision c52253ab5fc73e9b59d9cd99eada3d526d799987) @@ -33,6 +33,22 @@ _treatmentRcvdMessages[ID_UI_CONFIRMATION_RESULT_RESP].clear(); } +void StateController::handleUICheckInMessage() +{ + if (_treatmentRcvdMessages[ID_UI_CHECK_IN].isNull()) { return; } + + qint32 index = 0; + Types::S16 seq; + GetValue(_treatmentRcvdMessages[ID_UI_CHECK_IN].toByteArray(), index, seq); + + qint16 sequence = seq.value * -1; + QVariantList resp; + resp.append(static_cast(ID_ACK_MESSAGE_THAT_REQUIRES_ACK)); + resp.append(Can_Id::eChlid_TD_UI); + resp.append(sequence); + _treatmentRcvdMessages[ID_UI_CHECK_IN].clear(); +} + void StateController::handleInitiateTreatmentRequestMessage(State_Status &status) { if (_treatmentRcvdMessages[ID_INITIATE_TREATMENT].isNull()){ return; } @@ -81,6 +97,7 @@ _treatmentSubStates.rinsebackState = RINSEBACK_STOP_INIT_STATE; _treatmentStatus.ufVolDeliveredL = 0.0; _treatmentStatus.hasRecircBeenRequested = false; + _treatmentStatus.lowVenousAlarmTimeoutCtr = 0; } void StateController::triggerAnAlarm(Alarm_List alarmID) @@ -166,6 +183,16 @@ } } +void StateController::handleTriggerLowVenousAlarmInTx() +{ + _treatmentStatus.lowVenousAlarmTimeoutCtr++; + + if ((_treatmentStatus.lowVenousAlarmTimeoutCtr * QOBJECT_TIMER_TIMEOUT_MS) == TRIG_LOW_VEN_ALARM_TIMEOUT_MS) + { + triggerAnAlarm(ALARM_ID_TD_VENOUS_PRESSURE_LOW); + } +} + void StateController::handleUIConfirmMessage(const Generic_Confirm_Id confirmID, State_Status &status) { if (!_uiConfirmMessages.contains(confirmID)) { return; } @@ -176,9 +203,8 @@ case GENERIC_CONFIRM_ID_TREATMENT_END: if (_uiConfirmMessages[confirmID][UI_CONFIRM_MSG_STATUS_INDEX].toUInt() == CONFIRMATION_REQUEST_STATUS_ACCEPTED) { QStringList activeStates = _dryDemo.activeStateNames(true); - QString activeState = activeStates[0]; + QString activeState = activeStates[0]; _treatmentStatus.stateTransitionEvent = (activeState == "Treatment_Recirculate" ? "T_RC_2_TE" : "T_RB_2_TE"); - //_treatmentStatus.stateTransitionEvent = "T_RB_2_TE"; status = STATE_ON_EXIT; qDebug() << "Event" << _treatmentStatus.stateTransitionEvent << _dryDemo.activeStateNames(true); } Index: sources/drydemo/StateControllerTreatment.cpp =================================================================== diff -u -rb9f4ddeb2dec3019b87c712bfe64b8df1d4b328c -rc52253ab5fc73e9b59d9cd99eada3d526d799987 --- sources/drydemo/StateControllerTreatment.cpp (.../StateControllerTreatment.cpp) (revision b9f4ddeb2dec3019b87c712bfe64b8df1d4b328c) +++ sources/drydemo/StateControllerTreatment.cpp (.../StateControllerTreatment.cpp) (revision c52253ab5fc73e9b59d9cd99eada3d526d799987) @@ -95,9 +95,9 @@ if (_treatmentStatus.hasTxParamsBeenInitialized) { _treatmentStatus.treatmentElapsedTimeMS = 0; } _treatmentStatus.presUFRateMLPM = (_treatmentParams.ufVolumeL * MILLILITERS_PER_LITER) / (static_cast(_treatmentParams.treatmentDurationMin)); - float presUFVolL = _treatmentParams.ufVolumeL; - float presUFRateLHR = presUFVolL / (static_cast(_treatmentParams.treatmentDurationMin) / static_cast(MINUTES_PER_HOUR)); - float UFVolLMS = presUFRateLHR / (static_cast(MINUTES_PER_HOUR * SECONDS_PER_MINUTE * MILLISECONDS_PER_SECOND)); + float presUFVolL = _treatmentParams.ufVolumeL; + float presUFRateLHR = presUFVolL / (static_cast(_treatmentParams.treatmentDurationMin) / static_cast(MINUTES_PER_HOUR)); + float UFVolLMS = presUFRateLHR / (static_cast(MINUTES_PER_HOUR * SECONDS_PER_MINUTE * MILLISECONDS_PER_SECOND)); _treatmentStatus.ufVolDeliveredL = UFVolLMS * _treatmentStatus.treatmentElapsedTimeMS; @@ -107,7 +107,6 @@ void StateController::handleFluidBolusRequestMessage() { if (! _treatmentRcvdMessages[ID_UI_FLUID_BOLUS_RQST].isNull()){ - quint32 fluidBolusCmd = extractU32DataFromReceivedMessage(ID_UI_FLUID_BOLUS_RQST, 0); // Assume the fluid bolus is not in progress @@ -125,7 +124,6 @@ } if (! _treatmentRcvdMessages[ID_UI_BOLUS_VOLUME_CHANGE_RQST].isNull()){ - quint32 fluidBolusVolML = extractU32DataFromReceivedMessage(ID_UI_BOLUS_VOLUME_CHANGE_RQST, 0); // TODO Check the range of the requested bolus volume @@ -137,20 +135,21 @@ void StateController::handleFluidBolusFluidDelivery(const quint32 bloodFlowMLPM) { + if (_treatmentSubStates.fluidBolusState != FLUID_BOLUS_SALINE_IN_PROGRESS_STATE) { return; } + float timeSinceLastTimeMin = static_cast(QOBJECT_TIMER_TIMEOUT_MS) / static_cast(MILLISECONDS_PER_SECOND * SECONDS_PER_MINUTE); _treatmentStatus.accumFluidBolusDeliveredML += static_cast(bloodFlowMLPM) * timeSinceLastTimeMin; - float deliveredFluidML = qAbs(_treatmentStatus.totalFluidBolusDeliveredML - _treatmentStatus.accumFluidBolusDeliveredML); - - if (deliveredFluidML >= _treatmentParams.fluidBlousVolumeML) { + if (_treatmentStatus.accumFluidBolusDeliveredML >= _treatmentParams.fluidBlousVolumeML) { _treatmentSubStates.fluidBolusState = FLUID_BOLUS_IDLE_STATE; _treatmentSubStates.dialysisSubState = DIALYSIS_UF_STATE; - _treatmentStatus.accumFluidBolusDeliveredML = 0.0; _treatmentStatus.totalFluidBolusDeliveredML += _treatmentStatus.accumFluidBolusDeliveredML; + _treatmentStatus.accumFluidBolusDeliveredML = 0.0; + // Immediately broadcast the results to be updated + handleFluidBolusBroadcastData(BC_IMMEDIATELY); } - - qDebug() << "Bolus" << deliveredFluidML << _treatmentStatus.accumFluidBolusDeliveredML << _treatmentStatus.totalFluidBolusDeliveredML; + qDebug() << "Bolus" << _treatmentStatus.accumFluidBolusDeliveredML << _treatmentStatus.totalFluidBolusDeliveredML; } void StateController::handleTreatmentPrescriptionEditRequestMessage() @@ -308,8 +307,8 @@ float newUFRatMLPM = remainingUFVolML / remainingTreatmentTimeMin; reason[ufRateIndex] = (newUFRatMLPM * static_cast(MINUTES_PER_HOUR)) / (static_cast(MILLILITERS_PER_LITER)); - qDebug() << "UF" << remainingUFVolML << remainingTreatmentTimeMin << newUFRatMLPM; - if (newUFRatMLPM <+ MAX_UF_RATE_MLPM) { + qDebug() << "UF" << remainingUFVolML << remainingTreatmentTimeMin << newUFRatMLPM << reason[ufRateIndex]; + if (newUFRatMLPM <= MAX_UF_RATE_MLPM) { acceptReject = ACCEPT_VALUE; _treatmentStatus.validateUFVolReceived = true; _treatmentStatus.validateUFVolGoalL = requestedUFVolL; @@ -344,7 +343,7 @@ if (_treatmentStatus.validateUFVolReceived && isUFVolInRange && isUFRateInRange) { _treatmentParams.ufVolumeL = _treatmentStatus.validateUFVolGoalL; // Calcuate the new UF rate after the volume change - _treatmentStatus.presUFRateMLPM = (_treatmentStatus.validateUFRateLHR * MILLILITERS_PER_LITER) / (static_cast(MINUTES_PER_HOUR)); + _treatmentStatus.presUFRateMLPM = (_treatmentStatus.validateUFRateLHR * static_cast(MILLILITERS_PER_LITER)) / (static_cast(MINUTES_PER_HOUR)); _treatmentStatus.validateUFRateLHR = 0.0; _treatmentStatus.validateUFVolGoalL = 0.0; _treatmentStatus.validateUFVolReceived = false; Index: sources/drydemo/StateControllerTreatmentBroadcasts.cpp =================================================================== diff -u -rfb3e70cb47f3d22f31f68358c1bda69cce9cd248 -rc52253ab5fc73e9b59d9cd99eada3d526d799987 --- sources/drydemo/StateControllerTreatmentBroadcasts.cpp (.../StateControllerTreatmentBroadcasts.cpp) (revision fb3e70cb47f3d22f31f68358c1bda69cce9cd248) +++ sources/drydemo/StateControllerTreatmentBroadcasts.cpp (.../StateControllerTreatmentBroadcasts.cpp) (revision c52253ab5fc73e9b59d9cd99eada3d526d799987) @@ -205,16 +205,15 @@ if ((++broadcastCounter % NUM_OF_COUNTS_TIMER_BC_EMIT != 0) && (BCType == BC_DELAYED)) { return; } float presUFVolL = _treatmentParams.ufVolumeL; - float presUFRateLHR = presUFVolL / (static_cast(_treatmentParams.treatmentDurationMin) / static_cast(MINUTES_PER_HOUR)); - float targetUFRateLHR = (_treatmentStatus.presUFRateMLPM * MINUTES_PER_HOUR) / static_cast(MILLILITERS_PER_LITER); - float UFVolLMS = presUFRateLHR / (static_cast(MINUTES_PER_HOUR * SECONDS_PER_MINUTE * MILLISECONDS_PER_SECOND)); + float targetUFRateLHR = (_treatmentStatus.presUFRateMLPM * static_cast(MINUTES_PER_HOUR)) / static_cast(MILLILITERS_PER_LITER); + float UFVolLMS = targetUFRateLHR / (static_cast(MINUTES_PER_HOUR * SECONDS_PER_MINUTE * MILLISECONDS_PER_SECOND)); // Only count for UF when the dialysis state is in UF if (_treatmentSubStates.dialysisSubState == DIALYSIS_UF_STATE) { _treatmentStatus.ufVolDeliveredL += UFVolLMS * PROGRESS_TIME_BC_INTERVAL_MS; } - //qDebug() << "UF" << presUFRateLHR << targetUFRateLHR << UFVolLMS << _treatmentStatus.ufVolDeliveredL; + //qDebug() << "UF Broadcast" << _treatmentStatus.presUFRateMLPM << presUFVolL << targetUFRateLHR << UFVolLMS << _treatmentStatus.ufVolDeliveredL; QVariantList msg; msg.append(static_cast(ID_TD_ULTRAFILTRATION_DATA));