Index: sources/drydemo/StateControllerTreatment.cpp =================================================================== diff -u -r9edc9ba3995ca25a29bb74eeeae71f7d72965284 -r4533fba9bf69d25de21536b849b5d9cb09d959ee --- sources/drydemo/StateControllerTreatment.cpp (.../StateControllerTreatment.cpp) (revision 9edc9ba3995ca25a29bb74eeeae71f7d72965284) +++ sources/drydemo/StateControllerTreatment.cpp (.../StateControllerTreatment.cpp) (revision 4533fba9bf69d25de21536b849b5d9cb09d959ee) @@ -99,7 +99,8 @@ { // 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)); + _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)); @@ -488,9 +489,114 @@ _treatmentRcvdMessages[ID_UI_UF_PAUSE_RESUME_RQST].clear(); } -void StateController::handleUltrafiltrationVolumeChangeRequest() +void StateController::handleUltrafiltrationVolumeChangeValidation() { + 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; + quint32 ufRateIndex = 2; + quint32 acceptReject = REJECT_VALUE; + float elapsedTimeMin = _treatmentStatus.treatmentElapsedTimeMS / static_cast(SECONDS_PER_MINUTE * MILLISECONDS_PER_SECOND); + float measuredUFVolML = _treatmentStatus.ufVolDeliveredL * static_cast(MILLILITERS_PER_LITER); + float treatmentDurMin = static_cast(_treatmentParams.treatmentDurationMin); + float requestedUFVolL = extractF32DataFromReceivedMessage(ID_UI_TREATMENT_UF_VOLUME_VALIDATE_RQST, 0); + float requestedUFVolML = requestedUFVolL * static_cast(MILLILITERS_PER_LITER); + + reason[ufGoalIndex] = requestedUFVolL; + + qDebug() << "UF CLAC" << elapsedTimeMin << measuredUFVolML << treatmentDurMin << requestedUFVolL << requestedUFVolML; + + if ((requestedUFVolL >= MIN_UF_VOL_L) && (requestedUFVolL <= MAX_UF_VOL_L)){ + if (requestedUFVolML > measuredUFVolML) { + if (treatmentDurMin > elapsedTimeMin) { + float remainingUFVolML = requestedUFVolML - measuredUFVolML; + float remainingTreatmentTimeMin = treatmentDurMin - elapsedTimeMin; + 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) { + acceptReject = ACCEPT_VALUE; + _treatmentStatus.validateUFVolReceived = true; + _treatmentStatus.validateUFVolGoalL = requestedUFVolL; + _treatmentStatus.validateUFRateLHR = (newUFRatMLPM * static_cast(MINUTES_PER_HOUR)) / (static_cast(MILLILITERS_PER_LITER)); + } + else { reason[rejReasIndex] = REQUEST_REJECT_REASON_TREATMENT_TIME_LESS_THAN_CURRENT; } + } + else { reason[rejReasIndex] = REQUEST_REJECT_REASON_TREATMENT_TIME_LESS_THAN_CURRENT; } + } + else { reason[rejReasIndex] = REQUEST_REJECT_REASON_UF_VOLUME_OUT_OF_RANGE; } + } + else { reason[rejReasIndex] = REQUEST_REJECT_REASON_UF_VOLUME_OUT_OF_RANGE; } + + handleUIResponseMessage(ID_TD_TREATMENT_UF_VOLUME_VALIDATE_RESP, acceptReject, reason); + _treatmentRcvdMessages[ID_UI_TREATMENT_UF_VOLUME_VALIDATE_RQST].clear(); } +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); + // NOTE: min tx time macro was converted to quint32 to prevent compilation error in qMax + quint32 minTxTimeMin = qMax(elapsedTimeMin + 2, static_cast(MIN_TX_TIME_MINS)); + // TOOD fix maxTime once firmware is done + quint32 maxTxTime1Min = minTxTimeMin; // TODO add the UF to it + quint32 maxTxTime2Min = MAX_TX_TIME_MINS; + quint32 maxTxTimeMin = qMax(maxTxTime1Min, maxTxTime2Min); + + float minUFVolML = 0.0; // TODO check with firmware for min + 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; + + QVariantList msg; + msg.append(static_cast(ID_TD_TREATMENT_PARAM_RANGES_DATA)); + msg.append(Can_Id::eChlid_TD_Sync); + msg.append(minTxTimeMin); + msg.append(maxTxTimeMin); + msg.append(minUFVolML); + msg.append(maxUFVolML); + msg.append(MIN_DIAL_RATE_MLPM); + msg.append(MAX_DIAL_RATE_MLPM); + _isBroadcastListReady = false; + _broadcastMessages.append(msg); + _isBroadcastListReady = true; +} + +void StateController::handleUltrafiltrationVolumeChangeConfirm() +{ + 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); + + 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.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 { reason.append(REQUEST_REJECT_REASON_CONFIRMATION_MISMATCH); } + + handleUIResponseMessage(ID_TD_ULTRAFILTRATION_CHANGE_CONFIRM_RESP, acceptReject, reason); + _treatmentRcvdMessages[ID_UI_ULTRAFILTRATION_CHANGE_CONFIRM_RQST].clear(); +} +