Index: drydemo.pro.user =================================================================== diff -u -r5fe7e8bab66c3bed059ba84dd5092ea94ed736bc -r9112857b7ae9f1f849847b28aed3468e0b0cacd2 --- drydemo.pro.user (.../drydemo.pro.user) (revision 5fe7e8bab66c3bed059ba84dd5092ea94ed736bc) +++ drydemo.pro.user (.../drydemo.pro.user) (revision 9112857b7ae9f1f849847b28aed3468e0b0cacd2) @@ -1,6 +1,6 @@ - + EnvironmentId Index: sources/MessageGlobals.h =================================================================== diff -u -rbb3ff2c95ef0529f6251e7097ffdb19d8e7554f1 -r9112857b7ae9f1f849847b28aed3468e0b0cacd2 --- sources/MessageGlobals.h (.../MessageGlobals.h) (revision bb3ff2c95ef0529f6251e7097ffdb19d8e7554f1) +++ sources/MessageGlobals.h (.../MessageGlobals.h) (revision 9112857b7ae9f1f849847b28aed3468e0b0cacd2) @@ -145,6 +145,9 @@ ID_HD_PRIMING_TIME_BC = 0x4300, ID_UI_PRESSURE_LIMITS_CHANGE_RQST = 0x4600, ID_HD_PRESSURE_LIMITS_CHANGE_RESP = 0x4700, + ID_UI_HEPARIN_PAUSE_RESUME_RQST = 0x4B00, + ID_HD_HEPARIN_PAUSE_RESUME_RESP = 0X4C00, + ID_HD_HEPARIN_VOLUME_BC = 0x4D00, ID_UI_SET_UF_VOLUME_RQST = 0x4F00, ID_HD_SET_UF_VOLUME_RESP = 0x5000, ID_UI_RINSEBACK_CMD_RQST = 0x5200, 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()) { Index: sources/StateController.h =================================================================== diff -u -rbb3ff2c95ef0529f6251e7097ffdb19d8e7554f1 -r9112857b7ae9f1f849847b28aed3468e0b0cacd2 --- sources/StateController.h (.../StateController.h) (revision bb3ff2c95ef0529f6251e7097ffdb19d8e7554f1) +++ sources/StateController.h (.../StateController.h) (revision 9112857b7ae9f1f849847b28aed3468e0b0cacd2) @@ -40,6 +40,8 @@ #define REJECT_VALUE 0 #define START_TX_FROM_MSG_38 1 #define CONFIRM_CMD_ACCEPT_CLOSE 3 + #define PASS_RESULT 1 + #define DEVICE_ID 1234 // Timer event defines #define DEFAULT_TIMEOUT_S 10 @@ -98,6 +100,11 @@ #define DIALYSIS_SUB_STATE 2 #define RINSEBACK_SUBSTATE 4 #define TX_END_SUB_STATE 6 + // Heparin substates + #define HEPARIN_OFF_SUBSTATE 0 + #define HEPARIN_PAUSED_SUBSTATE 2 + #define HEPARIN_DISPENSING_SUBSTATE 4 + #define HEPARIN_COMPLETED_SUBSTATE 5 // Ultrafiltration substates #define UF_PAUSESD_STATE 0 @@ -206,6 +213,8 @@ // Treatment start and end times quint32 treatmentStarTimeEpoch; quint32 treatmentEndTimeEpoch; + // Accumulated heparin dispensed volume in milliters + float cumHeparinDisVolML; }; QHash_transitionEventsFromIdle; @@ -235,6 +244,7 @@ void prepareRinsebackBroadcastData(const QList &volsML, const QList &payload); void prepareTreatmentTimeChangeResponse(quint32 accept, quint32 txDurS, float maxUFvolML); void prepareSalineBolusBroadcastData(float cumSalineVolML, float bolSalineVolML); + void prepareHeparinVolumeBroadcastData(); void handleTreatmentTimeChangeRequest(const QVariant &payload); qint32 handleMsgBBPayload(const QVariant &payload); @@ -250,6 +260,7 @@ void handlePressureChangeReqeust(const QVariant &payload); void handleBloodDialRateChangeRequest(const QVariant &payload); void handleTreatmentLogRequest(); + void handleHeparinStatus(quint32 &heparinSubState); // State handlers void onIdleStateChange(bool active);