Index: sources/StateController.cpp =================================================================== diff -u -r7936e751fe1cd3517d0d548b53fef41f41b4db4a -rad35b27c3ec3ea357b6173df5ab8793c3378af6e --- sources/StateController.cpp (.../StateController.cpp) (revision 7936e751fe1cd3517d0d548b53fef41f41b4db4a) +++ sources/StateController.cpp (.../StateController.cpp) (revision ad35b27c3ec3ea357b6173df5ab8793c3378af6e) @@ -52,6 +52,7 @@ case ID_UI_SET_UF_VOLUME_RQST: case ID_USER_TX_TIME_CHANGES_RQST: case ID_UI_CONFIRM_TX_PARAMS: + case ID_UI_SALINE_BOLUS_RQST: _treatmentRcvdMessages[receivedMsgID] = msg[1]; break; @@ -86,6 +87,7 @@ case ID_HD_BLOOD_PRIME_BC: case ID_HD_RINSEBACK_CMD_RESP: case ID_HD_RINSEBACK_DATA_BC: + case ID_HD_SALINE_BOLUS_BC: // Do nothing break; } @@ -446,6 +448,20 @@ _isSendListReady = true; } +void StateController::prepareSalineBolusBroadcastData(float cumSalineVolML, float bolSalineVolML) +{ + QVariantList resp; + resp.append(static_cast(ID_HD_SALINE_BOLUS_BC)); + resp.append(Can_Id::eChlid_HD_Sync); + resp.append(_treatmentParams.salineBolusVolML); + resp.append(cumSalineVolML); + resp.append(bolSalineVolML); + resp.append(0.0); resp.append(0.0); resp.append(0); + _isSendListReady = false; + _sendMessages.append(resp); + _isSendListReady = true; +} + void StateController::handleTreatmentTimeChangeRequest(const QVariant &payload) { quint32 accept = REJECT_VALUE; @@ -693,6 +709,8 @@ static State_Status status = STATE_ON_ENTRY; auto inEntry = [=](){ + _treatmentVars.broadcastIntervalCount = 0; + prepareHDModeTransitionBroadcastData(MODE_STAN, 0); // Send the pre treatment states to reset so it starts from the right state @@ -727,6 +745,22 @@ }; auto inAction = [=](){ + _treatmentVars.broadcastIntervalCount++; + + // Keep sending the default status once a second + if (_treatmentVars.broadcastIntervalCount % NUM_OF_COUNTS_TIMER_BC_EMIT == 0) { + prepareHDModeTransitionBroadcastData(MODE_STAN, 0); + // Send the pre treatment states to reset so it starts from the right state + QList preTxStates({0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}); + prepareStatesBroadcastData(ID_PRE_TX_STATES_BC, preTxStates); + + // Send the treatment params in Idle too. This is to make sure if the user + // jumped to the Ultrafiltration page the min and max UF volumes are set prior to it. + QVariant emptyVar; + setTreatmentParams(false, emptyVar); + prepareTreatmentParamsRangesBroadcastData(); + } + bool isMsgBBRequested = false; if (!_treatmentRcvdMessages[ID_UI_CONFIRM_RESP].isNull()) { @@ -1353,7 +1387,10 @@ void StateController::onTreatmentTreatmentStateChange(bool active) { - static State_Status status = STATE_ON_ENTRY; + static State_Status status = STATE_ON_ENTRY; + static bool isSalineBolRqstd = false; + static float cumSalineVolML = 0.0; + static float bolSalineVolML = 0.0; auto inEntry = [=](){ _treatmentVars.prescribedTreatmentTimeS = _treatmentParams.txDurationMins * SECONDS_PER_MINUTE; @@ -1375,29 +1412,59 @@ _treatmentVars.prescribedTreatmentTimeS, _treatmentVars.prescribedMaxUFVolML); - status = STATE_ON_ACTION; + status = STATE_ON_ACTION; + isSalineBolRqstd = false; + cumSalineVolML = 0.0; + bolSalineVolML = 0.0; }; auto inAction = [=](){ _treatmentVars.broadcastIntervalCount++; + quint32 ufSubState = UF_RUNNING_STATE; + quint32 salineSubState = SALINE_BOLUS_IDLE_STATE; + quint32 bloodFlowMLPM = _treatmentParams.bloodFlowRateMLPM; + + if (!_treatmentRcvdMessages[ID_UI_SALINE_BOLUS_RQST].isNull()) { + qint32 resultIndex = 0; + Types::U32 param; + GetValue(_treatmentRcvdMessages[ID_UI_SALINE_BOLUS_RQST].toByteArray(), resultIndex, param); + + isSalineBolRqstd = false; + bolSalineVolML = 0.0; + if ((param.value == SALINE_BOLUS_START_CMD) && (cumSalineVolML < SALINE_BOLUS_MAX_VOL_ML)) { + isSalineBolRqstd = true; + } + _treatmentRcvdMessages[ID_UI_SALINE_BOLUS_RQST].clear(); + } + float timeSinceLastCallMS = static_cast(QOBJECT_TIMER_TIMEOUT_MS) / static_cast(MILLISECONDS_PER_SECOND); - _treatmentVars.refUFVolumeML += (timeSinceLastCallMS / SECONDS_PER_MINUTE) * _treatmentVars.prescribedUFRate; - _treatmentVars.measUFVolumeML = _treatmentVars.refUFVolumeML; - //qDebug() << "UF Value" << _treatmentVars.measUFVolumeML << _treatmentVars.refUFVolumeML << _treatmentVars.prescribedUFRate; - if (_treatmentVars.broadcastIntervalCount % NUM_OF_COUNTS_TIMER_BC_EMIT == 0) { - QList txStates({DIALYSIS_SUB_STATE, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0}); - prepareStatesBroadcastData(ID_HD_TX_STATES_BC, txStates); - prepareOcclusionBroadcastData(); - prepareTreatmentTimeBroadcastData(); - prepareBloodFlowBroadcastData(_treatmentParams.bloodFlowRateMLPM); - prepareDialysateFlowBroadcastData(); - prepareDialysateOutFlowBroadcastData(); - prepareTreatmentParamsRangesBroadcastData(); + if (!isSalineBolRqstd) { + _treatmentVars.refUFVolumeML += (timeSinceLastCallMS / SECONDS_PER_MINUTE) * _treatmentVars.prescribedUFRate; + _treatmentVars.measUFVolumeML = _treatmentVars.refUFVolumeML; } - //qDebug() << "Target treatment" << _treatmentVars.prescribedTreatmentTimeS; + else { + salineSubState = SALINE_BOLUS_IN_PROG_STATE; + bloodFlowMLPM = SALINE_BOLUS_TARGET_FLOW_MLPM; + bolSalineVolML += bloodFlowMLPM * (timeSinceLastCallMS / SECONDS_PER_MINUTE); + cumSalineVolML += bloodFlowMLPM * (timeSinceLastCallMS / SECONDS_PER_MINUTE); + if (bolSalineVolML >= _treatmentParams.salineBolusVolML) { + salineSubState = SALINE_BOLUS_IDLE_STATE; + bolSalineVolML = 0.0; + isSalineBolRqstd = false; + } + else if (cumSalineVolML >= SALINE_BOLUS_MAX_VOL_ML) { + salineSubState = SALINE_BOLUS_MAX_DELIVERED; + bolSalineVolML = 0.0; + isSalineBolRqstd= false; + } + + qDebug() << "Saline" << bloodFlowMLPM << bolSalineVolML << cumSalineVolML; + } + + if (!_treatmentRcvdMessages[ID_USER_TX_TIME_CHANGES_RQST].isNull()) { handleTreatmentTimeChangeRequest(_treatmentRcvdMessages[ID_USER_TX_TIME_CHANGES_RQST]); _treatmentRcvdMessages[ID_USER_TX_TIME_CHANGES_RQST].clear(); @@ -1407,6 +1474,18 @@ status = STATE_ON_EXIT; } + if (_treatmentVars.broadcastIntervalCount % NUM_OF_COUNTS_TIMER_BC_EMIT == 0) { + QList txStates({DIALYSIS_SUB_STATE, ufSubState, salineSubState, 0, 0, 0, 0, 0, 0, 0, 0}); + prepareStatesBroadcastData(ID_HD_TX_STATES_BC, txStates); + prepareOcclusionBroadcastData(); + prepareTreatmentTimeBroadcastData(); + prepareBloodFlowBroadcastData(bloodFlowMLPM); + prepareDialysateFlowBroadcastData(); + prepareDialysateOutFlowBroadcastData(); + prepareTreatmentParamsRangesBroadcastData(); + prepareSalineBolusBroadcastData(cumSalineVolML, bolSalineVolML); + } + if (!_treatmentRcvdMessages[ID_UI_CONFIRM_RESP].isNull()) { status = STATE_ON_ENTRY; _dryDemo.submitEvent("Transition_back_2_idle");