#include "StateController.h" #include "ApplicationController.h" #include "types.h" 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 QVariantList msg; msg.append(static_cast(ID_TD_BLOOD_PRIME_PROGRESS_DATA)); msg.append(Can_Id::eChlid_TD_Sync); msg.append(BLOOD_PRIME_VOLUME_ML); msg.append(accumulatedVolML); msg.append(primeTimeOutS); msg.append(pauseCountDownS); _isBroadcastListReady = false; _broadcastMessages.append(msg); _isBroadcastListReady = true; } 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; msg.append(static_cast(ID_TD_TREATMENT_SET_POINTS)); msg.append(Can_Id::eChlid_TD_Sync); msg.append(bloodFlowMLPM); msg.append(dialFlowMLPM); msg.append(dialTempC); _isBroadcastListReady = false; _broadcastMessages.append(msg); _isBroadcastListReady = true; } 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; msg.append(static_cast(ID_TD_TREATMENT_STATE_DATA)); msg.append(Can_Id::eChlid_TD_Sync); for (auto item: txStates) { msg.append(item);} _isBroadcastListReady = false; _broadcastMessages.append(msg); _isBroadcastListReady = true; } 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; msg.append(static_cast(ID_TD_FLUID_BOLUS_DATA)); msg.append(Can_Id::eChlid_TD_Sync); msg.append(_treatmentParams.fluidBlousVolumeML); msg.append(_treatmentStatus.accumFluidBolusDeliveredML); msg.append(_treatmentStatus.totalFluidBolusDeliveredML); msg.append(ENABLE_BOLUS); _isBroadcastListReady = false; _broadcastMessages.append(msg); _isBroadcastListReady = true; } 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 handleUIResponseMessage(ID_TD_PRESSURE_LIMIT_WIDEN_RESP, ACCEPT_VALUE); } // TODO update the pressures float h2ArtPresMMHG = 12.2; float h14VenPresMMHG = 80.1; quint32 presLimitState = 1; qint32 h2ArtMinLimitMMHG = MIN_ART_PRES_LIMIT_MMHG; qint32 h2ArtMaxLimitMMHG = MAX_ART_PRES_LIMIT_MMHG; qint32 h14VenMinLimitMMGH = MIN_VEN_PRES_LIMIT_MMHG; qint32 h14VenMaxLimitMMHG = MAX_VEN_PRES_LIMIT_MMHG; float h2ArtLongFilterPresMMHG = -23.0; float h14VenLongFilterPresMMHG = 67.5; float tmpPresMMHG = 45.03; float tmpLongFilter = 45.5; float tmpMinLimitMMHG = MIN_TMP_PRES_LIMIT_MMHG; float tmpMaxLimitMMHG = MAX_TMP_PRES_LIMIT_MMHG; float h23BaroPresPSI = 14.2l; if ((++broadcastCounter % NUM_OF_COUNTS_TIMER_BC_EMIT != 0) && (BCType == BC_DELAYED)) { return; } QVariantList msg; msg.append(static_cast(ID_TD_PRESSURE_DATA)); msg.append(Can_Id::eChlid_TD_Sync); msg.append(h2ArtPresMMHG); msg.append(h14VenPresMMHG); msg.append(presLimitState); msg.append(h2ArtMinLimitMMHG); msg.append(h2ArtMaxLimitMMHG); msg.append(h14VenMinLimitMMGH); msg.append(h14VenMaxLimitMMHG); msg.append(h2ArtLongFilterPresMMHG); msg.append(h14VenLongFilterPresMMHG); msg.append(tmpPresMMHG); msg.append(tmpLongFilter); msg.append(tmpMinLimitMMHG); msg.append(tmpMaxLimitMMHG); msg.append(h23BaroPresPSI); _isBroadcastListReady = false; _broadcastMessages.append(msg); _isBroadcastListReady = true; } void StateController::handleTreatmentTimeProcessAndBroadcastData(const Broadcast_Type BCType) { static quint32 broadcastCounter = 12; if (_treatmentStatus.fluidBolusState == FLUID_BOLUS_IDLE_STATE) { _treatmentStatus.treatmentElapsedTimeMS += QOBJECT_TIMER_TIMEOUT_MS; } if ((++broadcastCounter % NUM_OF_COUNTS_TIMER_BC_EMIT != 0) && (BCType == BC_DELAYED)) { return; } quint32 prescribedTimeS = _treatmentParams.treatmentDurationMin * SECONDS_PER_MINUTE; quint32 elapsedTimeS = _treatmentStatus.treatmentElapsedTimeMS / MILLISECONDS_PER_SECOND; quint32 remainingTimeS = prescribedTimeS - elapsedTimeS; //qDebug() << "Times" << prescribedTimeS << elapsedTimeS << remainingTimeS; QVariantList msg; msg.append(static_cast(ID_TD_TREATMENT_TIME_DATA)); msg.append(Can_Id::eChlid_TD_Sync); msg.append(prescribedTimeS); msg.append(elapsedTimeS); msg.append(remainingTimeS); _isBroadcastListReady = false; _broadcastMessages.append(msg); _isBroadcastListReady = true; } 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(dialBypass); msg.append(dummyFloat); _isBroadcastListReady = false; _broadcastMessages.append(msg); _isBroadcastListReady = true; } 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)); // Only count for UF when the dialysis state is in UF if (_treatmentStatus.dialysisSubState == DIALYSIS_UF_STATE) { _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::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 settings" << 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; }