Index: sources/StateController.cpp =================================================================== diff -u -rbb3ff2c95ef0529f6251e7097ffdb19d8e7554f1 -r9112857b7ae9f1f849847b28aed3468e0b0cacd2 --- sources/StateController.cpp (.../StateController.cpp) (revision bb3ff2c95ef0529f6251e7097ffdb19d8e7554f1) +++ sources/StateController.cpp (.../StateController.cpp) (revision 9112857b7ae9f1f849847b28aed3468e0b0cacd2) @@ -57,6 +57,7 @@ case ID_UI_PRESSURE_LIMITS_CHANGE_RQST: case ID_UI_ALARM_USER_ACTION_RQST: case ID_USER_BLOOD_DIAL_RATE_CHANGE_RQST: + case ID_UI_HEPARIN_PAUSE_RESUME_RQST: _treatmentRcvdMessages[receivedMsgID] = msg[1]; break; @@ -107,6 +108,8 @@ case ID_HD_TREATMENT_LOG_RESP: case ID_HD_POST_TREATMENT_NEXT_CMD_RESP: case ID_UI_DISPOSABLE_REMOVAL_CONFIRM_RESP: + case ID_HD_HEPARIN_VOLUME_BC: + case ID_HD_HEPARIN_PAUSE_RESUME_RESP: // Do nothing break; } @@ -234,11 +237,6 @@ _isSendListReady = false; _sendMessages.append(resp); _isSendListReady = true; - - qDebug() << "Treatment params from TPAR" << _treatmentParams.bloodFlowRateMLPM - << _treatmentParams.dialysateFlowRateMLPM << _treatmentParams.txDurationMins - << _treatmentParams.dialysateTemperatureC << _treatmentParams.rinsebackFlowRateMLPM - << _treatmentParams.venousPresLimitWindowMMHG; } else if (!_treatmentParams.hasTxParamsBeenInitialized) { _treatmentParams.bloodFlowRateMLPM = DEF_TX_PARAM_BLOOD_FLOW_RATE_MLPM; @@ -489,6 +487,18 @@ _isSendListReady = true; } +void StateController::prepareHeparinVolumeBroadcastData() +{ + QVariantList msg; + msg.append(static_cast(ID_HD_HEPARIN_VOLUME_BC)); + msg.append(Can_Id::eChlid_HD_Sync); + msg.append(_treatmentVars.cumHeparinDisVolML); + msg.append(_treatmentParams.heparinBolusVolML); + _isSendListReady = false; + _sendMessages.append(msg); + _isSendListReady = true; +} + void StateController::handleTreatmentTimeChangeRequest(const QVariant &payload) { quint32 accept = REJECT_VALUE; @@ -978,20 +988,71 @@ msg.append(_treatmentParams.heparinBolusVolML); msg.append(_treatmentParams.heparinDispenseRateMLHR); msg.append(_treatmentParams.heparinPreStopMin); - msg.append(0.0); + msg.append(_treatmentVars.cumHeparinDisVolML); msg.append(_treatmentParams.heparinType); msg.append(_treatmentVars.curArtPresMMHG); msg.append(_treatmentVars.curVenPresMMHG); - msg.append(1234); - msg.append(1); + msg.append(static_cast(DEVICE_ID)); + msg.append(static_cast(PASS_RESULT)); _isSendListReady = false; _sendMessages.append(msg); _isSendListReady = true; } +void StateController::handleHeparinStatus(quint32 &heparinSubState) +{ + enum Heparin_Cmds { + HEPARIN_CMD_PAUSE = 0, + HEPARIN_CMD_RESUME = 1, + // This is an enum in firmware but this is the default here to make sure + // the heparin button is not turned off by by sending the off state + // if heparin is selected + HEPARIN_CMD_NOT_CALLED = 2, + }; + + static Heparin_Cmds hepCmd = HEPARIN_CMD_NOT_CALLED; + + heparinSubState = HEPARIN_OFF_SUBSTATE; + + if (!_treatmentRcvdMessages[ID_UI_HEPARIN_PAUSE_RESUME_RQST].isNull()) { + quint32 accept = ACCEPT_VALUE; + qint32 hepIndex = 0; + Types::U32 cmd; + GetValue(_treatmentRcvdMessages[ID_UI_HEPARIN_PAUSE_RESUME_RQST].toByteArray(), hepIndex, cmd); + + hepCmd = static_cast(cmd.value); + _treatmentRcvdMessages[ID_UI_HEPARIN_PAUSE_RESUME_RQST].clear(); + + QVariantList resp; + resp.append(static_cast(ID_HD_HEPARIN_PAUSE_RESUME_RESP)); + resp.append(Can_Id::eChlid_HD_UI); + resp.append(accept); + resp.append(0); + _isSendListReady = false; + _sendMessages.append(resp); + _isSendListReady = true; + } + + if (hepCmd == HEPARIN_CMD_PAUSE) { + heparinSubState = HEPARIN_PAUSED_SUBSTATE; + return; + } + + if (_treatmentParams.heparinDispenseRateMLHR != 0 && _treatmentParams.heparinBolusVolML != 0) { + if (_treatmentVars.cumHeparinDisVolML < _treatmentParams.heparinBolusVolML) { + heparinSubState = HEPARIN_DISPENSING_SUBSTATE; + _treatmentVars.cumHeparinDisVolML += (_treatmentParams.heparinDispenseRateMLHR * QOBJECT_TIMER_TIMEOUT_MS) / (MINUTES_PER_HOUR * SECONDS_PER_MINUTE * MILLISECONDS_PER_SECOND); + } + else { + heparinSubState = HEPARIN_COMPLETED_SUBSTATE; + _treatmentVars.cumHeparinDisVolML = _treatmentParams.heparinBolusVolML; + } + } +} + // ----------- State transition methods ---------------- // void StateController::onIdleStateChange(bool active) { @@ -1741,6 +1802,7 @@ auto inEntry = [=](){ _treatmentVars.broadcastIntervalCount = 0; _treatmentVars.cumSalineVolML = 0; + _treatmentVars.cumHeparinDisVolML = 0.0; _treatmentVars.prescribedTreatmentTimeS = _treatmentParams.txDurationMins * SECONDS_PER_MINUTE; _treatmentVars.treatmentElapsedTimeS = (_treatmentVars.prescribedTreatmentTimeS < DEF_TX_ELAPSED_TIME_S ? 0 : DEF_TX_ELAPSED_TIME_S); @@ -1750,6 +1812,8 @@ _treatmentVars.prescribedUFRate = _treatmentVars.prescribedMaxUFVolML / _treatmentParams.txDurationMins; _treatmentVars.refUFVolumeML = (_treatmentVars.treatmentElapsedTimeS / SECONDS_PER_MINUTE) * _treatmentVars.prescribedUFRate; + _treatmentVars.cumHeparinDisVolML = (_treatmentParams.heparinDispenseRateMLHR / (MINUTES_PER_HOUR * SECONDS_PER_MINUTE)) * _treatmentVars.treatmentElapsedTimeS; + qDebug() << "Treatment UF start vals" << _treatmentVars.txParamsUFVolL << _treatmentVars.prescribedUFRate << _treatmentVars.prescribedMaxUFVolML @@ -1775,6 +1839,7 @@ quint32 ufSubState = UF_RUNNING_STATE; quint32 salineSubState = SALINE_BOLUS_IDLE_STATE; quint32 bloodFlowMLPM = _treatmentParams.bloodFlowRateMLPM; + quint32 hepSubState = HEPARIN_OFF_SUBSTATE; if (!_treatmentRcvdMessages[ID_UI_SALINE_BOLUS_RQST].isNull()) { qint32 resultIndex = 0; @@ -1813,6 +1878,10 @@ } } + if (salineSubState == SALINE_BOLUS_IDLE_STATE) { + handleHeparinStatus(hepSubState); + } + 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(); @@ -1821,7 +1890,6 @@ if (_treatmentVars.remainingTreatmentTimeS <= 0 ) { qint64 currentTimeEpoch64 = QDateTime::currentSecsSinceEpoch(); _treatmentVars.treatmentEndTimeEpoch = static_cast(currentTimeEpoch64); - status = STATE_ON_EXIT; } @@ -1838,7 +1906,7 @@ generateOcclusionPresureValues(false, _treatmentVars.broadcastIntervalCount); 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}); + QList txStates({DIALYSIS_SUB_STATE, ufSubState, salineSubState, hepSubState, 0, 0, 0, 0, 0, 0, 0}); prepareStatesBroadcastData(ID_HD_TX_STATES_BC, txStates); prepareOcclusionBroadcastData(); prepareTreatmentTimeBroadcastData(); @@ -1847,6 +1915,7 @@ prepareDialysateOutFlowBroadcastData(); prepareTreatmentParamsRangesBroadcastData(false); // In treatment updated the lastest changes prepareSalineBolusBroadcastData(cumSalineVolML, bolSalineVolML); + prepareHeparinVolumeBroadcastData(); } if (!_treatmentRcvdMessages[ID_UI_CONFIRM_RESP].isNull()) {