Index: sources/drydemo/StateControllerTreatment.cpp =================================================================== diff -u -r6d7f1800f7f56813c0824df509487f527a4026b2 -r9edc9ba3995ca25a29bb74eeeae71f7d72965284 --- sources/drydemo/StateControllerTreatment.cpp (.../StateControllerTreatment.cpp) (revision 6d7f1800f7f56813c0824df509487f527a4026b2) +++ sources/drydemo/StateControllerTreatment.cpp (.../StateControllerTreatment.cpp) (revision 9edc9ba3995ca25a29bb74eeeae71f7d72965284) @@ -92,8 +92,25 @@ _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; } + _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)); + + _treatmentStatus.ufVolDeliveredL = UFVolLMS * _treatmentStatus.treatmentElapsedTimeMS; + + qDebug() << "UF Init" << presUFRateLHR << UFVolLMS << _treatmentStatus.ufVolDeliveredL; +} + + void StateController::handleTreatmentSetpointsBroadcastData(const quint32 bloodFlowMLPM, const quint32 dialFlowMLPM, const float dialTempC, const Broadcast_Type BCType) { @@ -114,15 +131,13 @@ { static quint32 broadcastCounter = 0; - if ((++broadcastCounter % NUM_OF_COUNTS_TIMER_BC_EMIT != 0) && (BCType == BC_DELAYED)) { return; } + if ((++broadcastCounter % NUN_OF_COUNTS_QART_BC_EMIT != 0) && (BCType == BC_DELAYED)) { return; } QVariantList msg; msg.append(static_cast(ID_TD_TREATMENT_STATE_DATA)); msg.append(Can_Id::eChlid_TD_Sync); - for (auto item: txStates) { - msg.append(item); - } + for (auto item: txStates) { msg.append(item);} _isBroadcastListReady = false; _broadcastMessages.append(msg); _isBroadcastListReady = true; @@ -139,14 +154,26 @@ if (fluidBolusCmd == FLUID_BOLUS_START_CMD){ _treatmentStatus.fluidBolusState = FLUID_BOLUS_SALINE_IN_PROGRESS_STATE; + _treatmentStatus.dialysisSubState = DIALYSIS_UF_FLUID_BOLUS_STATE; } else { _treatmentStatus.totalFluidBolusDeliveredML += _treatmentStatus.accumFluidBolusDeliveredML; } _treatmentRcvdMessages[ID_UI_FLUID_BOLUS_RQST].clear(); - handleUIResponseMessage(ID_TD_FLUID_BOLUS_RESP, ACCEPT_VALUE); + handleUIResponseMessage(ID_TD_FLUID_BOLUS_RESP, ACCEPT_VALUE, {static_cast(REQUEST_REJECT_REASON_NONE), + _treatmentParams.fluidBlousVolumeML}); } + + 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 + _treatmentParams.fluidBlousVolumeML = fluidBolusVolML; + _treatmentRcvdMessages[ID_UI_BOLUS_VOLUME_CHANGE_RQST].clear(); + handleUIResponseMessage(ID_TD_BOLUS_VOLUME_CHANGE_RESP, ACCEPT_VALUE); + } } void StateController::handleFluidBolusFluidDelivery(const quint32 bloodFlowMLPM) @@ -159,13 +186,13 @@ if (deliveredFluidML >= _treatmentParams.fluidBlousVolumeML) { _treatmentStatus.fluidBolusState = FLUID_BOLUS_IDLE_STATE; + _treatmentStatus.accumFluidBolusDeliveredML = 0.0; _treatmentStatus.totalFluidBolusDeliveredML += _treatmentStatus.accumFluidBolusDeliveredML; } qDebug() << "Bolus" << deliveredFluidML << _treatmentStatus.accumFluidBolusDeliveredML << _treatmentStatus.totalFluidBolusDeliveredML; } - void StateController::handleFluidBolusBroadcastData(const Broadcast_Type BCType) { static quint32 broadcastCounter = 5; @@ -178,7 +205,7 @@ msg.append(_treatmentParams.fluidBlousVolumeML); msg.append(_treatmentStatus.accumFluidBolusDeliveredML); msg.append(_treatmentStatus.totalFluidBolusDeliveredML); - msg.append(0); + msg.append(ENABLE_BOLUS); _isBroadcastListReady = false; _broadcastMessages.append(msg); _isBroadcastListReady = true; @@ -324,15 +351,15 @@ void StateController::handleSetPointBloodFlowChange(quint32 &bloodFlowMLPM, bool &hasBloodFlowChanged) { - if (! _treatmentRcvdMessages[ID_UI_TREATMENT_SET_POINT_BLOOD_FLOW_CHANGE_RQST].isNull()){ - // TODO do we need to check the range - bloodFlowMLPM = extractU32DataFromReceivedMessage(ID_UI_TREATMENT_SET_POINT_BLOOD_FLOW_CHANGE_RQST, 0); - handleUIResponseMessage(ID_TD_TREATMENT_SET_POINT_BLOOD_FLOW_CHANGE_RESP, ACCEPT_VALUE); - hasBloodFlowChanged = true; - handleTreatmentSetpointsBroadcastData(bloodFlowMLPM, _treatmentParams.dialysateFlowRateMLPM, - _treatmentParams.dialysateTemperatureC, BC_IMMEDIATELY); - _treatmentRcvdMessages[ID_UI_TREATMENT_SET_POINT_BLOOD_FLOW_CHANGE_RQST].clear(); - } + if (_treatmentRcvdMessages[ID_UI_TREATMENT_SET_POINT_BLOOD_FLOW_CHANGE_RQST].isNull()) { return; } + + // TODO do we need to check the range + bloodFlowMLPM = extractU32DataFromReceivedMessage(ID_UI_TREATMENT_SET_POINT_BLOOD_FLOW_CHANGE_RQST, 0); + handleUIResponseMessage(ID_TD_TREATMENT_SET_POINT_BLOOD_FLOW_CHANGE_RESP, ACCEPT_VALUE); + hasBloodFlowChanged = true; + handleTreatmentSetpointsBroadcastData(bloodFlowMLPM, _treatmentParams.dialysateFlowRateMLPM, + _treatmentParams.dialysateTemperatureC, BC_IMMEDIATELY); + _treatmentRcvdMessages[ID_UI_TREATMENT_SET_POINT_BLOOD_FLOW_CHANGE_RQST].clear(); } void StateController::handleDDGenDialysateModeBroadcastData(const Broadcast_Type BCType) @@ -358,14 +385,112 @@ void StateController::handleSetPointDialysateFlowChange() { - if (! _treatmentRcvdMessages[ID_UI_TREATMENT_SET_POINT_DIALYSATE_FLOW_CHANGE_RQST].isNull()){ - // TODO do we need to check the range - _treatmentParams.dialysateFlowRateMLPM = extractU32DataFromReceivedMessage(ID_UI_TREATMENT_SET_POINT_DIALYSATE_FLOW_CHANGE_RQST, 0); - handleUIResponseMessage(ID_TD_TREATMENT_SET_POINT_BLOOD_FLOW_CHANGE_RESP, ACCEPT_VALUE); - handleTreatmentSetpointsBroadcastData(_treatmentParams.bloodFlowRateMLPM, _treatmentParams.dialysateFlowRateMLPM, - _treatmentParams.dialysateTemperatureC, BC_IMMEDIATELY); - _treatmentRcvdMessages[ID_TD_TREATMENT_SET_POINT_DIALYSATE_FLOW_CHANGE_RESP].clear(); + if (_treatmentRcvdMessages[ID_UI_TREATMENT_SET_POINT_DIALYSATE_FLOW_CHANGE_RQST].isNull()) { return; } + + // TODO do we need to check the range + _treatmentParams.dialysateFlowRateMLPM = extractU32DataFromReceivedMessage(ID_UI_TREATMENT_SET_POINT_DIALYSATE_FLOW_CHANGE_RQST, 0); + handleUIResponseMessage(ID_TD_TREATMENT_SET_POINT_BLOOD_FLOW_CHANGE_RESP, ACCEPT_VALUE); + handleTreatmentSetpointsBroadcastData(_treatmentParams.bloodFlowRateMLPM, _treatmentParams.dialysateFlowRateMLPM, + _treatmentParams.dialysateTemperatureC, BC_IMMEDIATELY); + _treatmentRcvdMessages[ID_UI_TREATMENT_SET_POINT_DIALYSATE_FLOW_CHANGE_RQST].clear(); +} + +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; + + 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); + _isBroadcastListReady = false; + _broadcastMessages.append(msg); + _isBroadcastListReady = true; +} + +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; } + + 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)); + + _treatmentStatus.ufVolDeliveredL += UFVolLMS * PROGRESS_TIME_BC_INTERVAL_MS; + + //qDebug() << "UF" << presUFRateLHR << targetUFRateLHR << UFVolLMS << _treatmentStatus.ufVolDeliveredL; + + QVariantList msg; + msg.append(static_cast(ID_TD_ULTRAFILTRATION_DATA)); + msg.append(Can_Id::eChlid_TD_Sync); + msg.append(presUFVolL); + msg.append(targetUFRateLHR); + msg.append(_treatmentStatus.ufVolDeliveredL); + msg.append(static_cast(_treatmentStatus.dialysisSubState)); + _isBroadcastListReady = false; + _broadcastMessages.append(msg); + _isBroadcastListReady = true; +} + +void StateController::handleSetPointDialysateTemperatureChange() +{ + if (_treatmentRcvdMessages[ID_UI_TREATMENT_SET_POINT_DIALYSATE_TEMP_CHANGE_RQST].isNull()){ return; } + + // TODO range check + _treatmentParams.dialysateTemperatureC = extractF32DataFromReceivedMessage(ID_UI_TREATMENT_SET_POINT_DIALYSATE_TEMP_CHANGE_RQST, 0); + handleUIResponseMessage(ID_TD_TREATMENT_SET_POINT_DIALYSATE_TEMP_CHANGE_RESP, ACCEPT_VALUE); + handleTreatmentSetpointsBroadcastData(_treatmentParams.bloodFlowRateMLPM, _treatmentParams.dialysateFlowRateMLPM, + _treatmentParams.dialysateTemperatureC, BC_IMMEDIATELY); + _treatmentRcvdMessages[ID_UI_TREATMENT_SET_POINT_DIALYSATE_TEMP_CHANGE_RQST].clear(); +} + +void StateController::handleUltrafiltrationPauseResume() +{ + if (_treatmentRcvdMessages[ID_UI_UF_PAUSE_RESUME_RQST].isNull()){ return; } + + quint32 cmd = extractU32DataFromReceivedMessage(ID_UI_UF_PAUSE_RESUME_RQST, 0); + 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); } + else if (_treatmentStatus.txState != TREAT_DIALYSIS_STATE) { + reason.append(static_cast(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); + reason.append(r); + } + handleUIResponseMessage(ID_TD_UF_PAUSE_RESUME_RESP, ACCEPT_VALUE, reason); + _treatmentRcvdMessages[ID_UI_UF_PAUSE_RESUME_RQST].clear(); } +void StateController::handleUltrafiltrationVolumeChangeRequest() +{ +} + +