Index: sources/MessageGlobals.h =================================================================== diff -u -r4d0fc455e6307639e72db490721c7768a487c014 -r6c0428ed8c6430924d54d5a42c45c8ec0c16c7c2 --- sources/MessageGlobals.h (.../MessageGlobals.h) (revision 4d0fc455e6307639e72db490721c7768a487c014) +++ sources/MessageGlobals.h (.../MessageGlobals.h) (revision 6c0428ed8c6430924d54d5a42c45c8ec0c16c7c2) @@ -184,16 +184,20 @@ ID_TD_BLOOD_PRIME_CMD_RESP = 0x9900, ID_UI_ADJUST_START_TREATMENT_RQST = 0xA100, ID_TD_ADJUST_START_TREATMENT_RESP = 0xA200, + ID_UI_WATER_SAMPLE_RESULT_RQST = 0xA300, ID_UI_PRESSURE_LIMIT_WIDEN_RQST = 0xA400, ID_TD_PRESSURE_LIMIT_WIDEN_RESP = 0xA500, ID_UI_RECIRCULATE_RQST = 0xA600, ID_TD_RECIRCULATE_RESP = 0xA700, ID_TD_RECIRCULATE_DATA = 0xA800, + ID_TD_WATER_SAMPLE_RESULT_RESP = 0xAB00, ID_TD_UI_GENERIC_CONFIRMATION_RQST = 0xB500, ID_UI_CONFIRMATION_RESULT_RESP = 0xB600, ID_UI_VITALS_ADJUSTMENT_RQST = 0xB800, ID_TD_VITALS_ADJUSTMENT_RESP = 0xB900, ID_TD_HEMODIAFILTRATION_DATA = 0xBC00, + ID_UI_PAUSE_SUB_FLOW_RQST = 0xBD00, + ID_TD_PAUSE_SUB_FLOW_RESP = 0xBE00, ID_UI_HDF_ADJUSTMENT_RQST = 0xC100, ID_TD_HDF_ADJUSTMENT_RESP = 0xC200, ID_TD_DRY_BICART_DISCONNECT_DATA = 0xC400, Index: sources/drydemo/DryDemoDefines.h =================================================================== diff -u -r4d0fc455e6307639e72db490721c7768a487c014 -r6c0428ed8c6430924d54d5a42c45c8ec0c16c7c2 --- sources/drydemo/DryDemoDefines.h (.../DryDemoDefines.h) (revision 4d0fc455e6307639e72db490721c7768a487c014) +++ sources/drydemo/DryDemoDefines.h (.../DryDemoDefines.h) (revision 6c0428ed8c6430924d54d5a42c45c8ec0c16c7c2) @@ -156,8 +156,9 @@ // HDF defines #define HDF_MAX_FILTRATION_FRACTION 0.35 #define HDF_MAX_TMP 400.0 -#define HDF_MAX_RATE 200.0 +#define HDF_MAX_RATE_MLPM 200.0 #define HDF_CONTROL_INT_CTR (4 * MILLISECONDS_PER_SECOND) / QOBJECT_TIMER_TIMEOUT_MS +#define HDF_START_RATE_MLPM 50.0 enum User_Command_ID { CMD_NONE = -1, Index: sources/drydemo/StateController.cpp =================================================================== diff -u -r4d0fc455e6307639e72db490721c7768a487c014 -r6c0428ed8c6430924d54d5a42c45c8ec0c16c7c2 --- sources/drydemo/StateController.cpp (.../StateController.cpp) (revision 4d0fc455e6307639e72db490721c7768a487c014) +++ sources/drydemo/StateController.cpp (.../StateController.cpp) (revision 6c0428ed8c6430924d54d5a42c45c8ec0c16c7c2) @@ -87,6 +87,8 @@ case ID_UI_PRESSURE_LIMITS_CHANGE_RQST: case ID_UI_DRY_BICART_DISCONNECT_RQST: case ID_UI_HDF_ADJUSTMENT_RQST: + case ID_UI_WATER_SAMPLE_RESULT_RQST: + case ID_UI_PAUSE_SUB_FLOW_RQST: if (msg.length() < RCVD_MSG_PAYLOAD_MIN_LEN) { qDebug() << "Msg with incomplete payload" << msg; return; } _treatmentRcvdMessages[receivedMsgID] = msg[RCVD_MSG_PAYLOAD_INDEX]; break; @@ -153,6 +155,8 @@ case ID_TD_DRY_BICART_DISCONNECT_DATA: case ID_TD_DRY_BICART_DISCONNECT_RESP: case ID_TD_HDF_ADJUSTMENT_RESP: + case ID_TD_WATER_SAMPLE_RESULT_RESP: + case ID_TD_PAUSE_SUB_FLOW_RESP: // Do nothing break; } @@ -258,6 +262,7 @@ handleSetupTubingSetConnectionsRequestMessage(); handleVitalsDataRquest(); + handleTDWaterSampleResultRequest(); if (! _treatmentRcvdMessages[ID_UI_ADJUST_DISPOSABLES_CONFIRM_RQST].isNull()){ _treatmentRcvdMessages[ID_UI_ADJUST_DISPOSABLES_CONFIRM_RQST].clear(); @@ -330,7 +335,9 @@ // Pressure methods handleFluidBolusRequestMessage(); // Vitals method - handleVitalsDataRquest(); + handleVitalsDataRquest(); + // Water Sample + handleTDWaterSampleResultRequest(); if (_treatmentSubStates.fluidBolusState == FLUID_BOLUS_SALINE_IN_PROGRESS_STATE){ handleFluidBolusFluidDelivery(currBloodFlowMLPM); handleFluidBolusBroadcastData(BC_DELAYED); @@ -434,9 +441,12 @@ handleVitalsAdjustmentMessage(); handleVitalsDataRquest(); // HDF methods - handleTreatmentHDF(); - handleHemodialfiltrationBroadcastData(BC_DELAYED); + handleHDFTreatment(); + handleHDFBroadcastData(BC_DELAYED); handleHDFAdjustmentRequestMessage(); + hadnleHDFPauseResumeRequestMessage(); + // Water sample methods + handleTDWaterSampleResultRequest(); // Treatment complete condition if ((_treatmentStatus.treatmentElapsedTimeMS / MILLISECONDS_PER_SECOND) > (_treatmentParams.treatmentDurationMin * SECONDS_PER_MINUTE)) { @@ -500,6 +510,8 @@ handleUltrafiltrationBroadcastData(BC_DELAYED); // Vitals methods handleVitalsDataRquest(); + // Water sample methods + handleTDWaterSampleResultRequest(); }; auto onExit = [=](){ @@ -549,6 +561,8 @@ handleWidenPressureLimitsMessage(); // Vitals handleVitalsDataRquest(); + // Water sample methods + handleTDWaterSampleResultRequest(); handleUIConfirmMessage(GENERIC_CONFIRM_ID_TREATMENT_END, status); if (_treatmentStatus.hasRecircBeenRequested) { _treatmentStatus.stateTransitionEvent = "T_RB_2_RC"; @@ -601,6 +615,8 @@ handleAlarmUserAction(status); // Vitals handleVitalsDataRquest(); + // Water sample methods + handleTDWaterSampleResultRequest(); if (_treatmentStatus.hasResumeTxBeenRequested) { _treatmentStatus.stateTransitionEvent = "T_RC_2_BP"; status = STATE_ON_EXIT; @@ -641,6 +657,8 @@ handleTreatmentStatesBroadcastData(BC_DELAYED); // Vitals handleVitalsDataRquest(); + // Water sample methods + handleTDWaterSampleResultRequest(); }; auto onExit = [=](){ Index: sources/drydemo/StateController.h =================================================================== diff -u -r4d0fc455e6307639e72db490721c7768a487c014 -r6c0428ed8c6430924d54d5a42c45c8ec0c16c7c2 --- sources/drydemo/StateController.h (.../StateController.h) (revision 4d0fc455e6307639e72db490721c7768a487c014) +++ sources/drydemo/StateController.h (.../StateController.h) (revision 6c0428ed8c6430924d54d5a42c45c8ec0c16c7c2) @@ -210,7 +210,7 @@ void handleBackToStandbyEvent(State_Status &status); quint32 extractU32DataFromReceivedMessage(const Can::Message_ID_Enum msgID, qint32 index); float extractF32DataFromReceivedMessage(const Can::Message_ID_Enum msgID, qint32 index); - void triggerAnAlarm(Alarm_List alarmID); + void triggerAnAlarm(const Alarm_List alarmID); void handleAlarmUserAction(State_Status &status, bool isFromTxPause = false); void handleTriggeredAlarmsToTxPause(State_Status &status); void handleChemsReplacementAlarmsSequence(State_Status &status); @@ -220,6 +220,7 @@ void handleUIConfirmMessage(const Generic_Confirm_Id confirmID, State_Status &status); bool hasUIConfirmMessageTimedout(const Generic_Confirm_Id confirmID); void handleSendUIConfirmationMessage(const Generic_Confirm_Id confirmID, const Generic_Confirm_Command confirmCmd, const Reject_Reasons rejectReason = REQUEST_REJECT_REASON_NONE); + void handleTDWaterSampleResultRequest(); // Pre-treatment methods void handleSetupTubingSetConnectionsRequestMessage(); @@ -267,10 +268,11 @@ // HDF Treatment methods void initializeTreatmentHDFVariables(); - float handleCheckHDFRate(const float proposedRateMLPM); - void handleTreatmentHDF(); - void handleHemodialfiltrationBroadcastData(const Broadcast_Type BCType); + float handleHDFCheckRate(const float proposedRateMLPM, const bool initRate); + void handleHDFTreatment(); + void handleHDFBroadcastData(const Broadcast_Type BCType); void handleHDFAdjustmentRequestMessage(); + void hadnleHDFPauseResumeRequestMessage(); // Treatment pause methods void handleDryBicartBroadcastData(const Broadcast_Type BCType); Index: sources/drydemo/StateControllerHDFTreatment.cpp =================================================================== diff -u -r4d0fc455e6307639e72db490721c7768a487c014 -r6c0428ed8c6430924d54d5a42c45c8ec0c16c7c2 --- sources/drydemo/StateControllerHDFTreatment.cpp (.../StateControllerHDFTreatment.cpp) (revision 4d0fc455e6307639e72db490721c7768a487c014) +++ sources/drydemo/StateControllerHDFTreatment.cpp (.../StateControllerHDFTreatment.cpp) (revision 6c0428ed8c6430924d54d5a42c45c8ec0c16c7c2) @@ -9,45 +9,48 @@ _treatmentHDFVars.hdfManualRateMLPM = 0.0; // TODO assuming manual rate is 0 for now _treatmentHDFVars.hdfControlState = TD_HDF_PAUSED; _treatmentHDFVars.hdfMaxFiltrationFraction = HDF_MAX_FILTRATION_FRACTION; - _treatmentHDFVars.hdfCurrentRateMLPM = 0.5; + _treatmentHDFVars.hdfCurrentRateMLPM = HDF_START_RATE_MLPM; _treatmentHDFVars.hdfControlTimeCtr = 0; _treatmentHDFVars.hdfHasMaxVolumeBeenReached = false; _treatmentHDFVars.hdfIsRequested = true; } -float StateController::handleCheckHDFRate(const float proposedRateMLPM) +float StateController::handleHDFCheckRate(const float proposedRateMLPM, const bool initRate) { + if (initRate) { _treatmentHDFVars.hdfCurrentRateMLPM = HDF_START_RATE_MLPM; } + float hdfMaxRateMLPM = (_treatmentHDFVars.hdfMaxFiltrationFraction * _treatmentParams.bloodFlowRateMLPM) - _treatmentStatus.presUFRateMLPM; - if (hdfMaxRateMLPM > HDF_MAX_RATE) { hdfMaxRateMLPM = HDF_MAX_RATE; } + if (hdfMaxRateMLPM > HDF_MAX_RATE_MLPM) { hdfMaxRateMLPM = HDF_MAX_RATE_MLPM; } float newRateMLPM = (_treatmentHDFVars.hdfCurrentRateMLPM > proposedRateMLPM ? hdfMaxRateMLPM : _treatmentHDFVars.hdfCurrentRateMLPM); qDebug() << "HDF rate" << hdfMaxRateMLPM << newRateMLPM; return newRateMLPM; } -void StateController::handleTreatmentHDF() +void StateController::handleHDFTreatment() { if (_treatmentParams.treatmentModality != TREATMENT_MODALITY_HDF_ONLINE_FLUID) { return; } // _treatmentSubStates.txState = TREATMENT_HDF_STATE; TODo fix when UI fixed it switch (_treatmentHDFVars.hdfControlState) { case TD_HDF_PAUSED: if (!_treatmentHDFVars.hdfHasMaxVolumeBeenReached && _treatmentHDFVars.hdfIsRequested) { _treatmentHDFVars.hdfControlState = TD_HDF_RUNNING; - _treatmentHDFVars.hdfCurrentRateMLPM = handleCheckHDFRate(_treatmentHDFVars.hdfCurrentRateMLPM); + _treatmentHDFVars.hdfCurrentRateMLPM = handleHDFCheckRate(_treatmentHDFVars.hdfCurrentRateMLPM, true); } break; case TD_HDF_RUNNING: if (!_treatmentHDFVars.hdfIsRequested) { _treatmentHDFVars.hdfCurrentRateMLPM = 0.0; _treatmentHDFVars.hdfControlState = TD_HDF_PAUSED; + qDebug() << "Pause" << _treatmentHDFVars.hdfIsRequested; } else { if (++_treatmentHDFVars.hdfControlTimeCtr % static_cast(HDF_CONTROL_INT_CTR) != 0 ) { return; } if (_treatmentHDFVars.hdfManualRateMLPM <= NEARLY_ZERO) { - _treatmentHDFVars.hdfCurrentRateMLPM = handleCheckHDFRate(_treatmentHDFVars.hdfCurrentRateMLPM); + _treatmentHDFVars.hdfCurrentRateMLPM = handleHDFCheckRate(_treatmentHDFVars.hdfCurrentRateMLPM, false); } _treatmentHDFVars.hdfCurrentVolumeML += (static_cast(HDF_CONTROL_INT_CTR) / static_cast(SECONDS_PER_MINUTE)) * _treatmentHDFVars.hdfCurrentRateMLPM; @@ -56,7 +59,7 @@ _treatmentHDFVars.hdfHasMaxVolumeBeenReached << _treatmentHDFVars.hdfIsRequested << HDF_CONTROL_INT_CTR; if (_treatmentHDFVars.hdfCurrentVolumeML > _treatmentParams.hdfSubstitutionFluidVolumeL * MILLILITERS_PER_LITER) { - qDebug() << "volume HDF" << _treatmentHDFVars.hdfCurrentVolumeML; + qDebug() << "volume HDF" << _treatmentHDFVars.hdfCurrentVolumeML << _treatmentParams.hdfSubstitutionFluidVolumeL * MILLILITERS_PER_LITER; _treatmentHDFVars.hdfHasMaxVolumeBeenReached = true; _treatmentHDFVars.hdfCurrentRateMLPM = 0.0; _treatmentHDFVars.hdfControlState = TD_HDF_PAUSED; @@ -70,7 +73,7 @@ } } -void StateController::handleHemodialfiltrationBroadcastData(const Broadcast_Type BCType) +void StateController::handleHDFBroadcastData(const Broadcast_Type BCType) { static quint32 broadcastCounter = 50; if ((++broadcastCounter % NUM_OF_COUNTS_TIMER_BC_EMIT != 0) && (BCType == BC_DELAYED)) { return; } @@ -114,3 +117,17 @@ // TODo check the reject reasons handleUIResponseMessage(ID_TD_HDF_ADJUSTMENT_RESP, acceptReject, reason); } + +void StateController::hadnleHDFPauseResumeRequestMessage() +{ + if (_treatmentRcvdMessages[ID_UI_PAUSE_SUB_FLOW_RQST].isNull()) { return; } + quint32 acceptReject = REJECT_VALUE; + quint32 pauseResume = extractU32DataFromReceivedMessage(ID_UI_PAUSE_SUB_FLOW_RQST, 0); + + _treatmentHDFVars.hdfIsRequested = static_cast(pauseResume); + // TODo check the reject reasons + acceptReject = ACCEPT_VALUE; + _treatmentRcvdMessages[ID_UI_PAUSE_SUB_FLOW_RQST].clear(); + handleUIResponseMessage(ID_TD_PAUSE_SUB_FLOW_RESP, acceptReject); + +} Index: sources/drydemo/StateControllerPreTreatment.cpp =================================================================== diff -u -rbf271a558491a83b39eb30748784f1b744736dd2 -r6c0428ed8c6430924d54d5a42c45c8ec0c16c7c2 --- sources/drydemo/StateControllerPreTreatment.cpp (.../StateControllerPreTreatment.cpp) (revision bf271a558491a83b39eb30748784f1b744736dd2) +++ sources/drydemo/StateControllerPreTreatment.cpp (.../StateControllerPreTreatment.cpp) (revision 6c0428ed8c6430924d54d5a42c45c8ec0c16c7c2) @@ -7,9 +7,9 @@ void StateController::handleSetupTubingSetConnectionsRequestMessage() { if (_treatmentRcvdMessages[ID_UI_SETUP_TUBING_SET_CONNECTIONS_CONFIRM_RQST].isNull()) { return; } - quint32 acceptReject = ACCEPT_VALUE; + qDebug() << "D6"; // TODO implement reject reason handleUIResponseMessage(ID_TD_SETUP_TUBING_SET_CONNECTIONS_CONFIRM_RESP, acceptReject); _treatmentRcvdMessages[ID_UI_SETUP_TUBING_SET_CONNECTIONS_CONFIRM_RQST].clear(); Index: sources/drydemo/StateControllerStandby.cpp =================================================================== diff -u -r4d0fc455e6307639e72db490721c7768a487c014 -r6c0428ed8c6430924d54d5a42c45c8ec0c16c7c2 --- sources/drydemo/StateControllerStandby.cpp (.../StateControllerStandby.cpp) (revision 4d0fc455e6307639e72db490721c7768a487c014) +++ sources/drydemo/StateControllerStandby.cpp (.../StateControllerStandby.cpp) (revision 6c0428ed8c6430924d54d5a42c45c8ec0c16c7c2) @@ -133,7 +133,7 @@ _treatmentStatus.bicartTotal = 100; } -void StateController::triggerAnAlarm(Alarm_List alarmID) +void StateController::triggerAnAlarm(const Alarm_List alarmID) { if (!_alarmTriggerSpecs.contains(alarmID)) { return; } @@ -367,3 +367,19 @@ _sendMessages.append(resp); _isSendListReady = true; } + +void StateController::handleTDWaterSampleResultRequest() +{ + if (_treatmentRcvdMessages[ID_UI_WATER_SAMPLE_RESULT_RQST].isNull()) { return; } + QVariantList reason; + quint32 acceptReject = ACCEPT_VALUE; + float chlorineLevel = extractF32DataFromReceivedMessage(ID_UI_WATER_SAMPLE_RESULT_RQST, 0); + + reason.append(REQUEST_REJECT_REASON_NONE); + reason.append(chlorineLevel); + + // TODO check range. + handleUIResponseMessage(ID_TD_WATER_SAMPLE_RESULT_RESP, acceptReject, reason); + _treatmentRcvdMessages[ID_UI_WATER_SAMPLE_RESULT_RQST].clear(); +} +