Index: LeahiDryDemoXMLStates.scxml =================================================================== diff -u -rbec9c9856c333399aa5abaf18d2799f6fbc95da3 -r61e26e538aae580369385eb78a966e74240d79c4 --- LeahiDryDemoXMLStates.scxml (.../LeahiDryDemoXMLStates.scxml) (revision bec9c9856c333399aa5abaf18d2799f6fbc95da3) +++ LeahiDryDemoXMLStates.scxml (.../LeahiDryDemoXMLStates.scxml) (revision 61e26e538aae580369385eb78a966e74240d79c4) @@ -1,31 +1,39 @@ - - + + - + - + + + + - + - - + + - + + + + + + Index: drydemo.pro =================================================================== diff -u -rbec9c9856c333399aa5abaf18d2799f6fbc95da3 -r61e26e538aae580369385eb78a966e74240d79c4 --- drydemo.pro (.../drydemo.pro) (revision bec9c9856c333399aa5abaf18d2799f6fbc95da3) +++ drydemo.pro (.../drydemo.pro) (revision 61e26e538aae580369385eb78a966e74240d79c4) @@ -54,21 +54,21 @@ sources/utility \ sources/abstract \ sources/model \ + sources/drydemo \ sources/model/settings \ HEADERS += \ \ # Main + \ # ---------- States ---------- + sources/drydemo/StateController.h \ sources/main.h \ sources/Threads.h \ sources/MainTimer.h \ sources/ApplicationPost.h \ # TODO clean up sources/MessageGlobals.h \ \ # Controllers sources/ApplicationController.h \ - sources/model/MessageDefines.h \ sources/storage/Settings.h \ - \ # ---------- States ---------- - sources/StateController.h \ sources/model/MAbstract.h \ # TODO is this needed? sources/model/settings/MSettings.h \ \ # CANBus @@ -98,10 +98,10 @@ sources/ApplicationPost.cpp \ \ # Controllers sources/ApplicationController.cpp \ - sources/model/MessageDefines.cpp \ - sources/storage/Settings.cpp \ \ # ---------- States ---------- - sources/StateController.cpp \ + sources/drydemo/StateController.cpp \ + sources/drydemo/StateControllerTreatment.cpp \ + sources/storage/Settings.cpp \ \ # ---------- Models ---------- sources/model/MAbstract.cpp \ \ # ---------- Models - settings Index: drydemo.pro.user =================================================================== diff -u -rbec9c9856c333399aa5abaf18d2799f6fbc95da3 -r61e26e538aae580369385eb78a966e74240d79c4 --- drydemo.pro.user (.../drydemo.pro.user) (revision bec9c9856c333399aa5abaf18d2799f6fbc95da3) +++ drydemo.pro.user (.../drydemo.pro.user) (revision 61e26e538aae580369385eb78a966e74240d79c4) @@ -1,6 +1,6 @@ - + EnvironmentId @@ -468,36 +468,26 @@ /home/denali/Projects/tmp/build/build-denali-Qt_5_15_10_iMX8-Debug/denali /home/denali/Projects/tmp/build/build-denali-Qt_5_15_10_iMX8-Debug/denali /home/denali/Projects/tmp/build/build-denali-Qt_5_15_10_iMX8-Debug/denali - /home/denali/Projects/tmp/build/build-denali-Qt_5_15_10_iMX8-Release/denali /home/denali/Projects/tmp/build/build-denali-Qt_5_15_10_iMX8-Debug/denali /home/denali/Projects/tmp/build/build-denali-Qt_5_15_10_iMX8-Release/denali /home/denali/Projects/tmp/build/build-denali-Qt_5_15_10_iMX8-Debug/denali /home/denali/Projects/tmp/build/build-denali-Qt_5_15_10_iMX8-Debug/denali /home/denali/Projects/tmp/build/build-denali-Qt_5_15_10_iMX8-Debug/denali + /home/denali/Projects/tmp/build/build-denali-Qt_5_15_10_iMX8-Release/denali /home/denali/Projects/tmp/build/build-denali-Qt_5_15_10_iMX8-Debug/denali /home/denali/Projects/tmp/build/build-denali-Qt_5_15_10_iMX8-Debug/denali /home/denali/Projects/tmp/build/build-denali-Qt_5_15_10_iMX8-Debug/denali /home/denali/Projects/tmp/build/build-denali-Qt_5_15_10_iMX8-Debug/denali + /home/denali/Projects/tmp/build/build-denali-Qt_5_15_10_iMX8-Release/denali /home/denali/Projects/tmp/build/build-denali-Qt_5_15_10_iMX8-Debug/denali /home/denali/Projects/tmp/build/build-denali-Qt_5_15_10_iMX8-Release/denali /home/denali/Projects/tmp/build/build-denali-Qt_5_15_10_iMX8-Debug/denali /home/denali/Projects/tmp/build/build-denali-Qt_5_15_10_iMX8-Debug/denali - /home/denali/Projects/tmp/build/build-denali-Qt_5_15_10_iMX8-Release/denali /home/denali/Projects/tmp/build/build-denali-Qt_5_15_10_iMX8-Debug/denali - 192.168.137.247 - 192.168.137.36 - 192.168.137.125 - 192.168.137.202 - 192.168.40.23 - 192.168.137.24 - 192.168.137.170 - 192.168.137.26 - 192.168.137.3 - 192.168.10.186 - 192.168.137.25 192.168.137.30 + 192.168.137.25 192.168.137.170 192.168.10.186 192.168.10.167 @@ -506,6 +496,16 @@ 192.168.10.138 192.168.10.228 192.168.10.228 + 192.168.137.247 + 192.168.137.202 + 192.168.137.36 + 192.168.137.125 + 192.168.137.170 + 192.168.137.26 + 192.168.40.23 + 192.168.137.24 + 192.168.137.3 + 192.168.10.186 /home/root @@ -533,67 +533,67 @@ /opt/b2qt/3.1.18/sysroots /opt/b2qt/3.1.18/sysroots /opt/b2qt/3.1.18/sysroots + /opt/b2qt/3.1.18/sysroots/x86_64-pokysdk-linux /opt/b2qt/3.1.18/sysroots /opt/b2qt/3.1.18/sysroots /opt/b2qt/3.1.18/sysroots /opt/b2qt/3.1.18/sysroots + /opt/b2qt/3.1.18/sysroots/x86_64-pokysdk-linux + /opt/b2qt/3.1.18/sysroots/x86_64-pokysdk-linux /opt/b2qt/3.1.18/sysroots /opt/b2qt/3.1.18/sysroots /opt/b2qt/3.1.18/sysroots /opt/b2qt/3.1.18/sysroots /opt/b2qt/3.1.18/sysroots /opt/b2qt/3.1.18/sysroots - /opt/b2qt/3.1.18/sysroots/x86_64-pokysdk-linux /opt/b2qt/3.1.18/sysroots /opt/b2qt/3.1.18/sysroots /opt/b2qt/3.1.18/sysroots /opt/b2qt/3.1.18/sysroots - /opt/b2qt/3.1.18/sysroots/x86_64-pokysdk-linux - /opt/b2qt/3.1.18/sysroots/x86_64-pokysdk-linux - 2023-02-02T02:26:33.738 - 2023-02-01T03:23:15.710 - 2023-02-02T02:07:25.922 - 2023-02-02T01:46:50.167 - 2023-01-24T17:29:54.849 - 2023-02-02T02:05:29.947 - 2023-01-27T09:45:11.898 - 2023-02-01T05:00:56.449 - 2023-02-02T02:40:56.627 - 2023-01-18T20:13:36.296 - 2023-02-02T02:13:54.596 2023-02-02T02:30:48.337 + 2023-02-02T02:13:54.596 2023-01-27T10:15:15.423 2023-01-18T17:47:08.797 2023-02-02T19:40:15.813 2023-01-24T18:19:13.179 2023-02-02T01:52:20.307 2023-02-02T09:06:00.862 - 2023-01-17T18:06:25.579 2023-01-17T18:18:03.749 + 2023-01-17T18:06:25.579 + 2023-02-02T02:26:33.738 + 2023-02-02T01:46:50.167 + 2023-02-01T03:23:15.710 + 2023-02-02T02:07:25.922 + 2023-01-27T09:45:11.898 + 2023-02-01T05:00:56.449 + 2023-01-24T17:29:54.849 + 2023-02-02T02:05:29.947 + 2023-02-02T02:40:56.627 + 2023-01-18T20:13:36.296 - 2023-02-02T02:26:46.000 - 2023-02-01T03:23:28.000 - 2023-02-02T02:07:21.000 - 2023-02-02T01:47:02.000 - 2023-01-24T17:30:03.000 - 2023-02-02T02:05:42.000 - 2023-01-27T09:44:58.000 - 2023-02-01T05:00:51.000 - 2023-02-02T02:41:10.000 - 2023-01-18T20:13:33.000 - 2023-02-02T02:14:08.000 2023-02-02T02:31:01.000 + 2023-02-02T02:14:08.000 2023-01-27T10:15:08.000 2023-01-18T17:47:04.000 2023-02-02T19:39:36.000 2023-01-24T18:18:58.000 2023-02-02T01:52:16.000 2023-02-02T09:05:22.000 - 2023-01-17T18:05:42.000 2023-01-17T18:17:25.000 + 2023-01-17T18:05:42.000 + 2023-02-02T02:26:46.000 + 2023-02-02T01:47:02.000 + 2023-02-01T03:23:28.000 + 2023-02-02T02:07:21.000 + 2023-01-27T09:44:58.000 + 2023-02-01T05:00:51.000 + 2023-01-24T17:30:03.000 + 2023-02-02T02:05:42.000 + 2023-02-02T02:41:10.000 + 2023-01-18T20:13:33.000 2 Index: sources/MessageGlobals.h =================================================================== diff -u -rbec9c9856c333399aa5abaf18d2799f6fbc95da3 -r61e26e538aae580369385eb78a966e74240d79c4 --- sources/MessageGlobals.h (.../MessageGlobals.h) (revision bec9c9856c333399aa5abaf18d2799f6fbc95da3) +++ sources/MessageGlobals.h (.../MessageGlobals.h) (revision 61e26e538aae580369385eb78a966e74240d79c4) @@ -128,21 +128,25 @@ }; enum Message_ID_Enum { - ID_NONE = 0x0000, - ID_TD_OP_MODE_DATA = 0x1200, - ID_INITIATE_TREATMENT = 0x4500, - ID_TD_RESP_INITIATE_TREATMENT = 0x4600, - ID_UI_ADJUST_DISPOSABLES_CONFIRM_RQST = 0x9200, - ID_TD_ADJUST_DISPOSSABLES_CONFIRM_RESP = 0x9300, - ID_TD_TREATMENT_STATE_DATA = 0x3C00, - ID_UI_TREATMENT_PARAMS_TO_VALIDATE = 0x3F00, - ID_TD_RESP_TREATMENT_PARAMS_TO_VALIDATE = 0x4000, - ID_TD_BLOOD_PRIME_PROGRESS_DATA = 0x9700, - ID_UI_BLOOD_PRIME_CMD_RQST = 0x9800, - ID_TD_BLOOD_PRIME_CMD_RESP = 0x9900, - ID_UI_ADJUST_START_TREATMENT_RQST = 0xA100, - ID_TD_ADJUST_START_TREATMENT_RESP = 0xA200, - ID_UI_CONFIRMATION_RESULT_RESP = 0xB600, + ID_NONE = 0x0000, + ID_TD_OP_MODE_DATA = 0x1200, + ID_TD_TREATMENT_TIME_DATA = 0x3B00, + ID_TD_TREATMENT_STATE_DATA = 0x3C00, + ID_UI_TREATMENT_PARAMS_TO_VALIDATE = 0x3F00, + ID_TD_RESP_TREATMENT_PARAMS_TO_VALIDATE = 0x4000, + ID_INITIATE_TREATMENT = 0x4500, + ID_TD_RESP_INITIATE_TREATMENT = 0x4600, + ID_TD_TREATMENT_SET_POINTS = 0x4F00, + ID_UI_TREATMENT_SET_POINT_BLOOD_FLOW_CHANGE_RQST = 0x7C00, + ID_TD_TREATMENT_SET_POINT_BLOOD_FLOW_CHANGE_RESP = 0x7D00, + ID_UI_ADJUST_DISPOSABLES_CONFIRM_RQST = 0x9200, + ID_TD_ADJUST_DISPOSSABLES_CONFIRM_RESP = 0x9300, + ID_TD_BLOOD_PRIME_PROGRESS_DATA = 0x9700, + ID_UI_BLOOD_PRIME_CMD_RQST = 0x9800, + ID_TD_BLOOD_PRIME_CMD_RESP = 0x9900, + ID_UI_ADJUST_START_TREATMENT_RQST = 0xA100, + ID_TD_ADJUST_START_TREATMENT_RESP = 0xA200, + ID_UI_CONFIRMATION_RESULT_RESP = 0xB600, }; enum TD_OP_MODE { Fisheye: Tag 61e26e538aae580369385eb78a966e74240d79c4 refers to a dead (removed) revision in file `sources/StateController.cpp'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 61e26e538aae580369385eb78a966e74240d79c4 refers to a dead (removed) revision in file `sources/StateController.h'. Fisheye: No comparison available. Pass `N' to diff? Index: sources/drydemo/StateController.cpp =================================================================== diff -u --- sources/drydemo/StateController.cpp (revision 0) +++ sources/drydemo/StateController.cpp (revision 61e26e538aae580369385eb78a966e74240d79c4) @@ -0,0 +1,576 @@ + +#include +#include +#include + +#include "StateController.h" +#include "ApplicationController.h" +#include "types.h" + +StateController::StateController(QObject *parent) : QObject(parent) {} + +void StateController::init() +{ + startTimer(QOBJECT_TIMER_TIMEOUT_MS); + connect(&_ApplicationController, SIGNAL(didUnhandledMsgAppController(const QVariantList &)), + this , SLOT(doStateControllerUnhandledMsgReceived(const QVariantList &))); + + _dryDemo.connectToState("Standby" , this, &StateController::onStandbyStateChange ); + _dryDemo.connectToState("Pre_Tx" , this, &StateController::onPretreatmentStateChange ); + _dryDemo.connectToState("Blood_Prime" , this, &StateController::onBloodPrimeStateChange ); + _dryDemo.connectToState("Treatment" , this, &StateController::onTreatmentStateChange ); + //_dryDemo.connectToState("Disposables" , this, &StateController::onDisposablesStateChange ); + //_dryDemo.connectToState("System_Prime" , this, &StateController::onSystemPrimeStateChange ); + //_dryDemo.connectToState("BP_HR" , this, &StateController::onBPHRStateChange ); + //_dryDemo.connectToState("Ultrafiltraion" , this, &StateController::onUltrafiltrationStateChange ); + //_dryDemo.connectToState("Connection" , this, &StateController::onConnectionStateChange ); + + //_dryDemo.connectToState("Start_Tx" , this, &StateController::onStartTreatmentStateChange ); + //_dryDemo.connectToState("Blood_Prime" , this, &StateController::onTreatmentBloodPrimeStateChange); + //_dryDemo.connectToState("Treatment" , this, &StateController::onTreatmentTreatmentStateChange ); + + //_dryDemo.connectToState("End_Tx" , this, &StateController::onEndTreatmentStateChange ); + //_dryDemo.connectToState("Post_Tx" , this, &StateController::onPostTreatmentStateChange ); + //_dryDemo.connectToState("Disinfect" , this, &StateController::onDisinfectStateChange ); + + _transitionEventsFromStandby.clear(); + _transitionEventsFromStandby[CMD_PRE_TX ] = "T_SB_2_Pretx"; + _transitionEventsFromStandby[CMD_BLOOD_PRIME ] = "T_SB_2_BP"; + _transitionEventsFromStandby[CMD_MAIN_TX ] = "T_SB_2_Tx"; + //_transitionEventsFromStandby[CMD_CONSUMABLES ] = "Transition_2_Consumables"; + //_transitionEventsFromStandby[CMD_DISPOSABLES ] = "Transition_2_Disposables"; + //_transitionEventsFromStandby[CMD_SYSTEM_PRIME ] = "Transition_2_Sys_Prime"; + //_transitionEventsFromStandby[CMD_BP_HR ] = "Transition_2_BP_HR"; + //_transitionEventsFromStandby[CMD_ULTRAFILTRATION] = "Transition_2_Ultrafiltraion"; + //_transitionEventsFromStandby[CMD_CONNECTION ] = "Transition_2_Patient_Connection"; + //_transitionEventsFromStandby[CMD_START_TX ] = "Transition_2_Start_Tx"; + //_transitionEventsFromStandby[CMD_END_TX ] = "Transition_2_End_Tx"; + //_transitionEventsFromStandby[CMD_DISINFECTION ] = "Transition_2_Disinfect"; + +} + +void StateController::quit() +{ + // TODo fill up +} + +void StateController::doStateControllerUnhandledMsgReceived(const QVariantList &msg) +{ + MessageID receivedMsgID = static_cast(msg[0].toUInt()); + + switch(receivedMsgID) + { + case ID_INITIATE_TREATMENT: + case ID_UI_TREATMENT_PARAMS_TO_VALIDATE: + case ID_UI_BLOOD_PRIME_CMD_RQST: + case ID_UI_CONFIRMATION_RESULT_RESP: + case ID_UI_TREATMENT_SET_POINT_BLOOD_FLOW_CHANGE_RQST: + //case ID_UI_TX_PARAMS_RQST: + //case ID_UI_CONFIRM_RESP: + //case ID_UI_RINSEBACK_CMD_RQST: + //case ID_SAMPLE_WATER_RESULT: + //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: + //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; + + //// These messages do not have a payload in from UI so a fake payload is added to be consumed + //// and processed + case ID_UI_ADJUST_DISPOSABLES_CONFIRM_RQST: + case ID_UI_ADJUST_START_TREATMENT_RQST: + //case ID_UI_TREATMENT_LOG_RQST: + //case ID_UI_POST_TREATMNET_NEXT_RQST: + //case ID_UI_DISPOSABLE_REMOVAL_CONFIRM_RQST: + _treatmentRcvdMessages[receivedMsgID] = 0; + break; + + //case ID_UI_TX_END_RQST: + //case ID_UI_CONSUMABLES_INSTALL: + //case ID_UI_INTALLATION_CONFIRM: + //case ID_UI_PATIENT_CONNECTION_RQST: + //case ID_UI_PATIENT_CONNECTION_CONF_RQST: + //case ID_UI_START_TX_RQST: + //case ID_UI_SERVICE_MODE_RQST: + // _hasUserConfirmedToProceed = true; + // break; + + case ID_NONE: + case ID_TD_OP_MODE_DATA: + case ID_TD_TREATMENT_STATE_DATA: + case ID_TD_RESP_INITIATE_TREATMENT: + case ID_TD_ADJUST_DISPOSSABLES_CONFIRM_RESP: + case ID_TD_RESP_TREATMENT_PARAMS_TO_VALIDATE: + case ID_TD_BLOOD_PRIME_PROGRESS_DATA: + case ID_TD_BLOOD_PRIME_CMD_RESP: + case ID_TD_ADJUST_START_TREATMENT_RESP: + case ID_TD_TREATMENT_SET_POINT_BLOOD_FLOW_CHANGE_RESP: + case ID_TD_TREATMENT_SET_POINTS: + case ID_TD_TREATMENT_TIME_DATA: + // Do nothing + break; + } +} + +void StateController::timerEvent(QTimerEvent *) +{ + if (!_dryDemo.isRunning()) { + _dryDemo.start(); + } + + _dryDemo.submitEvent("TimeoutEvent"); + + if (_isBroadcastListReady) { + sendMessages(true); + } + + if (_isSendListReady) { + sendMessages(false); + } + + if (! _treatmentRcvdMessages[ID_UI_CONFIRMATION_RESULT_RESP].isNull()){ + // Check for the user request message from the dry-deme menu + handleDryDemoMenuRequestMessage(); + _dryDemo.submitEvent(_back2StandbyEvent); + } +} + +// ---------------------- Private methods ------------------ // +void StateController::sendMessages(bool isBroadcast) +{ + QList msgList = _broadcastMessages; + + if (isBroadcast){ + _broadcastMessages.clear(); + } + else{ + msgList = _sendMessages; + _sendMessages.clear(); + } + + for (auto item: msgList){ + emit _ApplicationController.didActionTransmit(item); + } +} + +void StateController::handleDryDemoMenuRequestMessage() +{ + qint32 IDIndex = 0; + Types::U32 param; + GetValue(_treatmentRcvdMessages[ID_UI_CONFIRMATION_RESULT_RESP].toByteArray(), IDIndex, param); + if (param.value != UI_MSG_BB_PAYLOAD_ID) { return; } + + IDIndex = UI_MSG_BB_STATUS_INDEX; + GetValue(_treatmentRcvdMessages[ID_UI_CONFIRMATION_RESULT_RESP].toByteArray(), IDIndex, param); + _treatmentStatus.userCmd = static_cast(param.value); + _treatmentRcvdMessages[ID_UI_CONFIRMATION_RESULT_RESP].clear(); +} + +void StateController::handleBackToStandbyEvent(State_Status &status) +{ + _dryDemo.connectToEvent(_back2StandbyEvent, [&status](const QScxmlEvent &event) { + qDebug() << "Event invoked:" << event.name(); + status = STATE_ON_EXIT; + }); + + +} + + + +// ----------- State transition methods ---------------- // +void StateController::onStandbyStateChange(bool active) +{ + static State_Status status = STATE_ON_ENTRY; + + auto inEntry = [=](){ + handleTDOpModeTransitionBroadcastData(MODE_STAN, 0); + setTreatmentParametersToDefault(); + resetDryDemoVariables(); + + status = STATE_ON_ACTION; + + qDebug() << "Standby on entry"; + }; + + auto inAction = [=](){ + status = STATE_ON_ACTION; + + if (! _treatmentRcvdMessages[ID_INITIATE_TREATMENT].isNull()){ + _treatmentRcvdMessages[ID_INITIATE_TREATMENT].clear(); + + QVariantList resp; + resp.append(static_cast(ID_TD_RESP_INITIATE_TREATMENT)); + resp.append(Can_Id::eChlid_TD_UI); + resp.append(1); + resp.append(0); + _isSendListReady = false; + _sendMessages.append(resp); + _isSendListReady = true; + _dryDemo.submitEvent(_transitionEventsFromStandby[CMD_PRE_TX]); + status = STATE_ON_EXIT; + } + + if (_treatmentStatus.userCmd != CMD_NONE){ + if ((_treatmentStatus.userCmd > CMD_STAND_BY) && (_treatmentStatus.userCmd <= CMD_DISINFECTION)) { + qDebug() << "Submit event" << _transitionEventsFromStandby[_treatmentStatus.userCmd]; + _dryDemo.submitEvent(_transitionEventsFromStandby[_treatmentStatus.userCmd]); + _treatmentStatus.userCmd = CMD_NONE; + status = STATE_ON_EXIT; + } + } + }; + + auto inExit = [=](){ + qDebug() << "Standby in exit"; + status = STATE_ON_ENTRY; + }; + + switch (status) { // TODO macro it later + case STATE_ON_ENTRY : if (active) inEntry (); break; + case STATE_ON_ACTION: if (active) inAction(); break; + case STATE_ON_EXIT : if (active) inExit (); break; + } +} + +void StateController::onPretreatmentStateChange(bool active) +{ + static State_Status status = STATE_ON_ENTRY; + + auto inEntry = [=](){ + handleTDOpModeTransitionBroadcastData(MODE_PRET, 0); + + status = STATE_ON_ACTION; + + qDebug() << "PreTx on entry"; + }; + + auto inAction = [=](){ + if (! _treatmentRcvdMessages[ID_UI_ADJUST_DISPOSABLES_CONFIRM_RQST].isNull()){ + _treatmentRcvdMessages[ID_UI_ADJUST_DISPOSABLES_CONFIRM_RQST].clear(); + + QVariantList resp; + resp.append(static_cast(ID_TD_ADJUST_DISPOSSABLES_CONFIRM_RESP)); + resp.append(Can_Id::eChlid_TD_UI); + resp.append(1); + resp.append(0); + _isSendListReady = false; + _sendMessages.append(resp); + _isSendListReady = true; + } + + if (! _treatmentRcvdMessages[ID_UI_TREATMENT_PARAMS_TO_VALIDATE].isNull()){ + setTreatmentParametersFromUI(_treatmentRcvdMessages[ID_UI_TREATMENT_PARAMS_TO_VALIDATE]); + _treatmentRcvdMessages[ID_UI_TREATMENT_PARAMS_TO_VALIDATE].clear(); + } + + status = STATE_ON_ACTION; + + if (! _treatmentRcvdMessages[ID_UI_ADJUST_START_TREATMENT_RQST].isNull()){ + _treatmentRcvdMessages[ID_UI_ADJUST_START_TREATMENT_RQST].clear(); + sendStartTxResponse(); + status = STATE_ON_EXIT; + _dryDemo.submitEvent("T_Pretx_2_BP"); + } + }; + + auto inExit = [=](){ + qDebug() << "PreTx in exit"; + status = STATE_ON_ENTRY; + }; + + switch (status) { // TODO macro it later + case STATE_ON_ENTRY : if (active) inEntry (); break; + case STATE_ON_ACTION: if (active) inAction(); break; + case STATE_ON_EXIT : if (active) inExit (); break; + } +} + +void StateController::onBloodPrimeStateChange(bool active) +{ + static State_Status status = STATE_ON_ENTRY; + static float accumBloodVolML = 0.0; + static quint32 currBloodFlowMLPM = BLOOD_PRIME_START_FLOW_MLPM; + static bool resume = true; + + auto inEntry = [=](){ + handleTDOpModeTransitionBroadcastData(MODE_TREA, 0); + handleBloodPrimeBroadcastData(0.0, 0, 0, true); + accumBloodVolML = 0.0; + currBloodFlowMLPM = BLOOD_PRIME_START_FLOW_MLPM; + resume = true; + + quint32 bloodPrimeStateRamp = 1; + QList txStates = {TREAT_BLOOD_PRIME_STATE, bloodPrimeStateRamp, 0, 0, 0, 0, 0, 0, 0, 0}; + handleTreatmentStatesBroadcastData(txStates); + status = STATE_ON_ACTION; + + qDebug() << "Blood prime on entry"; + }; + + auto inAction = [=](){ + if (! _treatmentRcvdMessages[ID_UI_BLOOD_PRIME_CMD_RQST].isNull()){ + QVariantList resp; + qint32 index = 0; + Types::U32 u32Var; + resp.append(static_cast(ID_TD_BLOOD_PRIME_CMD_RESP)); + resp.append(Can_Id::eChlid_TD_UI); + resp.append(ACCEPT_VALUE); + resp.append(0); + _isSendListReady = false; + _sendMessages.append(resp); + _isSendListReady = true; + GetValue(_treatmentRcvdMessages[ID_UI_BLOOD_PRIME_CMD_RQST].toByteArray(), index, u32Var); + resume = (u32Var.value == 1 ? true : false); + quint32 state = (u32Var.value == 1 ? 1 : 2); + + QVariantList msg; + msg.append(static_cast(ID_TD_TREATMENT_STATE_DATA)); + msg.append(Can_Id::eChlid_TD_Sync); + msg.append(1); msg.append(state); msg.append(0); msg.append(0); msg.append(0); msg.append(0); msg.append(0); msg.append(0); + msg.append(0); msg.append(0); + _isBroadcastListReady = false; + _broadcastMessages.append(msg); + _isBroadcastListReady = true; + + _treatmentRcvdMessages[ID_UI_BLOOD_PRIME_CMD_RQST].clear(); + } + + if (! _treatmentRcvdMessages[ID_UI_TREATMENT_SET_POINT_BLOOD_FLOW_CHANGE_RQST].isNull()){ + qint32 index = 0; + Types::U32 u32Var; + GetValue(_treatmentRcvdMessages[ID_UI_TREATMENT_SET_POINT_BLOOD_FLOW_CHANGE_RQST].toByteArray(), index, u32Var); + quint32 var = u32Var.value; + handleBloodPrimeFlowChangeRequest(var, currBloodFlowMLPM); + //qDebug() << "FLow" << currBloodFlowMLPM; + + _treatmentRcvdMessages[ID_UI_TREATMENT_SET_POINT_BLOOD_FLOW_CHANGE_RQST].clear(); + } + + //_dryDemo.connectToEvent("T_Back_2_SB", [](const QScxmlEvent &event) { + // qDebug() << "Event invoked:" << event.name(); + // status = STATE_ON_EXIT; + //}); + handleBackToStandbyEvent(status); + + handleBloodPrimeVolML(resume, currBloodFlowMLPM, accumBloodVolML); + handleTreatmentSetpointsBroadcastData(currBloodFlowMLPM, _treatmentParams.dialysateFlowRateMLPM, _treatmentParams.dialysateTemperatureC); + + status = STATE_ON_ACTION; + + + if (accumBloodVolML > BLOOD_PRIME_VOLUME_ML) { + status = STATE_ON_EXIT; + qDebug() << "VOL" << accumBloodVolML; + _dryDemo.submitEvent("T_BP_2_Tx"); + } + }; + + auto inExit = [=](){ + //qDebug() << "Blood prime on exit"; + status = STATE_ON_ENTRY; + }; + + switch (status) { // TODO macro it later + case STATE_ON_ENTRY : if (active) inEntry (); break; + case STATE_ON_ACTION: if (active) inAction(); break; + case STATE_ON_EXIT : if (active) inExit (); break; + } +} + +void StateController::onTreatmentStateChange(bool active) +{ + static State_Status status = STATE_ON_ENTRY; + + auto inEntry = [=](){ + handleTDOpModeTransitionBroadcastData(MODE_TREA, 0); + QVariantList msg; + msg.append(static_cast(ID_TD_TREATMENT_STATE_DATA)); + msg.append(Can_Id::eChlid_TD_Sync); + msg.append(2); msg.append(0); msg.append(0); msg.append(0); msg.append(0); msg.append(0); msg.append(0); msg.append(0); + msg.append(0); msg.append(0); + _isBroadcastListReady = false; + _broadcastMessages.append(msg); + _isBroadcastListReady = true; + + + status = STATE_ON_ACTION; + + qDebug() << "Tx on entry"; + }; + + auto inAction = [=](){ + status = STATE_ON_ACTION; + + + handleBackToStandbyEvent(status); + + }; + + auto inExit = [=](){ + qDebug() << "Tx in exit"; + status = STATE_ON_ENTRY; + }; + + switch (status) { // TODO macro it later + case STATE_ON_ENTRY : if (active) inEntry (); break; + case STATE_ON_ACTION: if (active) inAction(); break; + case STATE_ON_EXIT : if (active) inExit (); break; + } +} + + + +void StateController::handleTDOpModeTransitionBroadcastData(Can::TD_OP_MODE mode, quint32 subMode) +{ + QVariantList msg; + msg.append(static_cast(ID_TD_OP_MODE_DATA)); + msg.append(Can_Id::eChlid_TD_Sync); + msg.append(mode); + msg.append(subMode); + _isBroadcastListReady = false; + _broadcastMessages.append(msg); + _isBroadcastListReady = true; +} + +void StateController::setTreatmentParametersFromUI(const QVariant &payload) +{ + QVariantList resp; + resp.append(static_cast(ID_TD_RESP_TREATMENT_PARAMS_TO_VALIDATE)); + resp.append(Can_Id::eChlid_TD_UI); + resp.append(ACCEPT_VALUE); + + qint32 index = 0; + Types::U32 u32Var; + Types::F32 f32Var; + + GetValue(payload.toByteArray(), index, u32Var); + _treatmentParams.finalConfirmation = u32Var.value; + resp.append(0); + + GetValue(payload.toByteArray(), index, u32Var); + _treatmentParams.treatmentModality = u32Var.value; + resp.append(0); + + GetValue(payload.toByteArray(), index, u32Var); + _treatmentParams.hdfDilution = u32Var.value; + resp.append(0); + + GetValue(payload.toByteArray(), index, u32Var); + _treatmentParams.bloodFlowRateMLPM = u32Var.value; + resp.append(0); + + GetValue(payload.toByteArray(), index, u32Var); + _treatmentParams.dialysateFlowRateMLPM = u32Var.value; + resp.append(0); + + GetValue(payload.toByteArray(), index, u32Var); + _treatmentParams.treatmentDurationMin = u32Var.value; + resp.append(0); + + GetValue(payload.toByteArray(), index, u32Var); + _treatmentParams.heparinDeliveryDurationMin = u32Var.value; + resp.append(0); + + GetValue(payload.toByteArray(), index, u32Var); + _treatmentParams.heparinType = u32Var.value; + resp.append(0); + + GetValue(payload.toByteArray(), index, u32Var); + _treatmentParams.dryBicarbCartSize = u32Var.value; + resp.append(0); + + GetValue(payload.toByteArray(), index, u32Var); + _treatmentParams.sodiumMEQL = u32Var.value; + resp.append(0); + + GetValue(payload.toByteArray(), index, u32Var); + _treatmentParams.bicarbobateMEQL = u32Var.value; + resp.append(0); + + GetValue(payload.toByteArray(), index, u32Var); + _treatmentParams.dialyzerType = u32Var.value; + resp.append(0); + + GetValue(payload.toByteArray(), index, u32Var); + _treatmentParams.fluidBlousVolumeML = u32Var.value; + resp.append(0); + + GetValue(payload.toByteArray(), index, u32Var); + _treatmentParams.bloodPressureIntervalMin = u32Var.value; + resp.append(0); + + GetValue(payload.toByteArray(), index, u32Var); + _treatmentParams.rinsebackVolumeML = u32Var.value; + resp.append(0); + + GetValue(payload.toByteArray(), index, u32Var); + _treatmentParams.hepatitisBStatus = u32Var.value; + resp.append(0); + + GetValue(payload.toByteArray(), index, u32Var); + _treatmentParams.acidConcentrate = u32Var.value; + resp.append(0); + + GetValue(payload.toByteArray(), index, f32Var); + _treatmentParams.substitutionFluidVolumeL = f32Var.value; + resp.append(0); + + GetValue(payload.toByteArray(), index, f32Var); + _treatmentParams.heparinBolusVolumeML = f32Var.value; + resp.append(0); + + GetValue(payload.toByteArray(), index, f32Var); + _treatmentParams.heparinDeliveryRateMLHR = f32Var.value; + resp.append(0); + + GetValue(payload.toByteArray(), index, f32Var); + _treatmentParams.dialysateTemperatureC = f32Var.value; + resp.append(0); + + GetValue(payload.toByteArray(), index, f32Var); + _treatmentParams.acidKConcentrateConversionFactor = f32Var.value; + resp.append(0); + + GetValue(payload.toByteArray(), index, f32Var); + _treatmentParams.ufPreWeightKG = f32Var.value; + resp.append(0); + + GetValue(payload.toByteArray(), index, f32Var); + _treatmentParams.ufEstimatedTargetWeightKG = f32Var.value; + resp.append(0); + + GetValue(payload.toByteArray(), index, f32Var); + _treatmentParams.ufVolumeL = f32Var.value; + resp.append(0); + + _treatmentStatus.hasTxParamsBeenInitialized = true; + + _isSendListReady = false; + _sendMessages.append(resp); + _isSendListReady = true; +} + +void StateController::sendStartTxResponse() +{ + QVariantList resp; + resp.append(static_cast(ID_TD_ADJUST_START_TREATMENT_RESP)); + resp.append(Can_Id::eChlid_TD_UI); + resp.append(ACCEPT_VALUE); + resp.append(0); + _isSendListReady = false; + _sendMessages.append(resp); + _isSendListReady = true; +} + +void StateController::resetDryDemoVariables() +{ + _treatmentStatus.hasTxParamsBeenInitialized = false; + _treatmentStatus.treatmentElapsedTimeS = DEF_TX_ELAPSED_TIME_S; + _treatmentStatus.remainingTreatmentTimeS = DEF_TX_PARAM_PRESCRIBED_DUR_S - _treatmentStatus.treatmentElapsedTimeS; +} Index: sources/drydemo/StateController.h =================================================================== diff -u --- sources/drydemo/StateController.h (revision 0) +++ sources/drydemo/StateController.h (revision 61e26e538aae580369385eb78a966e74240d79c4) @@ -0,0 +1,245 @@ +#pragma once + + +#include +#include +#include + +#include "main.h" +#include "MessageGlobals.h" +#include "LeahiDryDemoXMLStates.h" + +#define _StateController StateController::I() + +// TODO check illegal state transition + +class StateController : public QObject +{ + Q_OBJECT + SINGLETON(StateController) + +public: + void init(); // TODO move these in slots + void quit(); + +public slots: + void doStateControllerUnhandledMsgReceived(const QVariantList &msg); + +protected: + void timerEvent(QTimerEvent *) override; + +private: + + // TODO REMOVE + // General defines + #define UI_MSG_BB_STATUS_INDEX 4 + #define UI_MSG_BB_PAYLOAD_ID 0x63 + #define SECONDS_PER_MINUTE 60 + #define MINUTES_PER_HOUR 60 + #define MILLISECONDS_PER_SECOND 1000 + #define MILLILITERS_PER_LITER 1000 + #define ACCEPT_VALUE 1 + #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 + #define QOBJECT_TIMER_TIMEOUT_MS 100 + #define PROGRESS_TIME_BC_INTERVAL_MS 1000 + #define NUM_OF_COUNTS_TIMER_BC_EMIT (PROGRESS_TIME_BC_INTERVAL_MS / QOBJECT_TIMER_TIMEOUT_MS) + #define NUM_OF_COUNTS_TO_BC_MSG 3 + + // Treatment params + #define MIN_DIAL_RATE_MLPM 100 + #define MAX_DIAL_RATE_MLPM 600 + #define MIN_BLOOD_RATE_MLPM 100 + #define MAX_BLOOD_RATE_MLPM 500 + #define MIN_TX_TIME_MINS (1 * MINUTES_PER_HOUR) + #define MAX_TX_TIME_MINS (8 * MINUTES_PER_HOUR) + #define MIN_UF_VOL_L 0.0 + #define MAX_UF_VOL_L 8.0 + #define MAX_UF_VOL_ML (MAX_UF_VOL_L * MILLILITERS_PER_LITER) + #define MIN_UF_RATE_MLPM 0.0 + #define MAX_UF_RATE_MLPM (2000.0 / MINUTES_PER_HOUR) + + #define ACID_TYPES_1251_1_K 1.0 + #define ACID_TYPES_CALCIUM 2.5 + #define ACID_TYPES_BICARB 33 + #define ACID_TYPES_SODIUM 137 + + #define DEF_TX_ELAPSED_TIME_S (2 * MINUTES_PER_HOUR) * SECONDS_PER_MINUTE + #define DEF_TX_PARAM_PRESCRIBED_DUR_MIN ((4 * MINUTES_PER_HOUR) + 30) + #define DEF_TX_PARAM_PRESCRIBED_DUR_S DEF_TX_PARAM_PRESCRIBED_DUR_MIN * SECONDS_PER_MINUTE + #define DEF_TX_PARAM_UF_VOLUME_L 2.0 + #define DEF_TX_PARAM_BLOOD_FLOW_RATE_MLPM 400 + #define DEF_TX_PARAM_DIAL_FLOW_RATE_MLPM 600 + #define DEF_TX_PARAM_SALINE_BOLUS_VOL_ML 200 + #define DEF_TX_PARAM_RINSEBACK_FLOW_RATE_MLPM 250 + #define DEF_TX_PARAM_ART_PRES_LIMIT_WIN_MMHG 120 + #define DEF_TX_PARAM_VEN_PRES_LIMIT_WIN_MMHG 100 + #define DEF_TX_PARAM_VEN_PRES_LIMIT_ASYM_WIN_MMHG 20 + #define DEF_TX_PARAM_DIA_TEMPERATURE_C 37.0 + + // Arterial /Venous limits + #define MIN_ART_PRES_LIMIT_MMHG -300.0 + #define MAX_ART_PRES_LIMIT_MMHG 100.0 + #define MIN_VEN_PRES_LIMIT_MMHG 0.0 + #define MAX_VEN_PRES_LIMIT_MMHG 400.0 + #define OCCLUSION_STABLE_TIME_COUNT (10 * MILLISECONDS_PER_SECOND) / QOBJECT_TIMER_TIMEOUT_MS + + // Treatment defines + #define BLOOD_PRIME_VOLUME_ML (106.6 + 40) + #define BLOOD_PRIME_START_FLOW_MLPM 250 + #define BLOOD_PRIME_FLOW_CHNG_MLPM 25 + #define FLOW_INTEGRATOR (1.0 / (SECONDS_PER_MINUTE * (MILLISECONDS_PER_SECOND / QOBJECT_TIMER_TIMEOUT_MS))) + #define MAX_DIALYSATE_VOLUME_ML 150000 + #define BLOOD_PRIME_PAUSE_TIMEOUT_S (5 * SECONDS_PER_MINUTE) + + // Treatment substates + #define BLOOD_RPIME_SUB_STATE 1 + #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 + #define UF_RUNNING_STATE 1 + + // Rinseback defines + #define RINSEBACK_MIN_FLOW_RATE_MLPM 100 + #define RINSEBACK_MAX_RLOW_RATE_MLPM 300 + #define RINSEBACK_ADJ_FLOW_RATE_MLPM 25 + #define RINSEBACK_BACK_MAX_TIME_S (5 * SECONDS_PER_MINUTE) + #define RINSEBACK_END_TREATMENT_SIGNAL 999 + #define RINSEBACK_STOP_INIT_STATE 0 + #define RINSEBACK_RUN_STATE 1 + #define RINSEBACK_PAUSE_STATE 2 + #define RINSEBACK_STOP_STATE 3 + + // Saline Bolus defines + #define SALINE_BOLUS_IDLE_STATE 0 + #define SALINE_BOLUS_IN_PROG_STATE 2 + #define SALINE_BOLUS_MAX_DELIVERED 3 + + #define SALINE_BOLUS_START_CMD 1 + #define SALINE_BOLUS_MAX_VOL_ML 800 + #define SALINE_BOLUS_TARGET_FLOW_MLPM 250 + + enum Treatment_States { + TREAT_START_STATE = 0, + TREAT_BLOOD_PRIME_STATE = 1, + TREAT_DIALYSIS_STATE = 2, + TREAT_PAUSED_STATE = 3, + TREAT_RINSEBACK_STATE = 4, + TREAT_RECIRC_STATE = 5, + TREAT_END_STATE = 6, + TREAT_ISO_UF_STATE = 7, + TREAT_SALINE_BOLUS_STATE = 8, + TREAT_DIALYSIS_PAUSED_STATE = 9, + }; + + enum User_Command_ID { + CMD_NONE = -1, + CMD_STAND_BY = 0, + CMD_PRE_TX = 1, + CMD_BLOOD_PRIME = 2, + CMD_MAIN_TX = 3, + + CMD_END_TX = 11, + CMD_DISINFECTION = 12, + CMD_HIGH_PRIO_ALARM = 13, + CMD_MEDIUM_PRIO_ALARM = 14, + CMD_LOW_PRIO_ALARM = 15, + NUM_OF_USER_CMDS = 16, + }; + + enum State_Status { + STATE_ON_ENTRY = 0, + STATE_ON_ACTION, + STATE_ON_EXIT, + }; + + struct Treatment_Status_Vars { + bool hasTxParamsBeenInitialized; + quint32 treatmentElapsedTimeS; + quint32 remainingTreatmentTimeS; + quint32 prescribedTreatmentTimeS; + User_Command_ID userCmd; + }; + + struct Treatment_Params { + bool finalConfirmation; + quint32 treatmentModality; + quint32 hdfDilution; + quint32 bloodFlowRateMLPM; + quint32 dialysateFlowRateMLPM; + quint32 treatmentDurationMin; + quint32 heparinDeliveryDurationMin; + quint32 heparinType; + quint32 dryBicarbCartSize; + quint32 sodiumMEQL; + quint32 bicarbobateMEQL; + quint32 dialyzerType; + quint32 fluidBlousVolumeML; + quint32 bloodPressureIntervalMin; + quint32 rinsebackVolumeML; + quint32 hepatitisBStatus; + quint32 acidConcentrate; + float substitutionFluidVolumeL; + float heparinBolusVolumeML; + float heparinDeliveryRateMLHR; + float dialysateTemperatureC; + float acidKConcentrateConversionFactor; + float ufPreWeightKG; + float ufEstimatedTargetWeightKG; + float ufVolumeL; + }; + + QString _back2StandbyEvent = "T_Back_2_SB"; + QHash_transitionEventsFromStandby; + QList _broadcastMessages; + QList _sendMessages; + QHash _treatmentRcvdMessages; + QRandomGenerator _randNumGenerator; + Treatment_Params _treatmentParams; + Treatment_Status_Vars _treatmentStatus; + bool _isBroadcastListReady; // TODO use a mutex? + bool _isSendListReady; // Todo use a mutex? + bool _hasUserConfirmedToProceed; + drydemoXMLStates _dryDemo; + + // CAN function(s) + void sendMessages(bool isBroadcast); + void handleDryDemoMenuRequestMessage(); + + // State handlers + void onStandbyStateChange(bool active); + void onPretreatmentStateChange(bool active); + void onBloodPrimeStateChange(bool active); + void onTreatmentStateChange(bool active); + + // Helper functions + void handleTDOpModeTransitionBroadcastData(Can::TD_OP_MODE mode, quint32 subMode); + void setTreatmentParametersFromUI(const QVariant &payload); // TODO move the implementation to pretx cpp + void sendStartTxResponse(); + void resetDryDemoVariables(); + void handleBackToStandbyEvent(State_Status &status); + + // Blood prime methods + void handleBloodPrimeBroadcastData(float accumulatedVolML, quint32 primeTimeOutS, quint32 pauseCountDownS, bool initBC); + void handleBloodPrimeVolML(bool resume, quint32 &currBlodFlowMLPM, float &accumBloodVolML); + void handleBloodPrimeFlowChangeRequest(quint32 requestedFlowMLPM, quint32 &currBloodFlowMLPM); + + // Treatment methods + void setTreatmentParametersToDefault(); + void handleTreatmentSetpointsBroadcastData(quint32 bloodFlowMLPM, quint32 dialFlowMLPM, float dialTempC); + void handleTreatmentStatesBroadcastData(const QList &txStates); +}; Index: sources/drydemo/StateControllerTreatment.cpp =================================================================== diff -u --- sources/drydemo/StateControllerTreatment.cpp (revision 0) +++ sources/drydemo/StateControllerTreatment.cpp (revision 61e26e538aae580369385eb78a966e74240d79c4) @@ -0,0 +1,127 @@ + +#include "StateController.h" +#include "ApplicationController.h" +#include "types.h" + +void StateController::handleBloodPrimeBroadcastData(float accumulatedVolML, quint32 primeTimeOutS, quint32 pauseCountDownS, bool initBC) +{ + static quint32 broadcastCounter = 0; + + if ((++broadcastCounter % NUM_OF_COUNTS_TIMER_BC_EMIT != 0) && (!initBC)) { 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::handleBloodPrimeVolML(bool resume, quint32 &currBloodFlowMLPM, float &accumBloodVolML) +{ + static quint32 primeTimeoutS = 0; + static quint32 pauseCountDownS = 0; + static quint32 elapsedTimeSincePauseS = 0; + + if (!resume) { + elapsedTimeSincePauseS += (QOBJECT_TIMER_TIMEOUT_MS); + primeTimeoutS = BLOOD_PRIME_PAUSE_TIMEOUT_S; + pauseCountDownS = ( elapsedTimeSincePauseS / MILLISECONDS_PER_SECOND < BLOOD_PRIME_PAUSE_TIMEOUT_S ? BLOOD_PRIME_PAUSE_TIMEOUT_S - elapsedTimeSincePauseS / MILLISECONDS_PER_SECOND : pauseCountDownS ); + handleBloodPrimeBroadcastData(accumBloodVolML, primeTimeoutS, pauseCountDownS, false); + qDebug() << "Count" << primeTimeoutS << pauseCountDownS << elapsedTimeSincePauseS; + return; + } + + //prepareOcclusionBroadcastData(); + //prepareTreatmentParamsRangesBroadcastData(true); // Reset the params and get ready for a new treatment + + if (currBloodFlowMLPM < _treatmentParams.bloodFlowRateMLPM) { + // If interim blood flow is less than the target blood flow, keep adding + // to the blood flow ramp + currBloodFlowMLPM += BLOOD_PRIME_FLOW_CHNG_MLPM; + } + + if (currBloodFlowMLPM >= _treatmentParams.bloodFlowRateMLPM) { + // If the interim blood flow is >= target blood flow: + // If target blood flow is less than 250 which is the starting flow in blood prime, + // then keep subtracting the target (e.g. target 110 and we start from 250 mL/min) + // If the target blood flow is > than 250 mL/min set the interim flow to target blood flow + if (_treatmentParams.bloodFlowRateMLPM < BLOOD_PRIME_START_FLOW_MLPM) { + currBloodFlowMLPM -= BLOOD_PRIME_FLOW_CHNG_MLPM; + + if (currBloodFlowMLPM <= _treatmentParams.bloodFlowRateMLPM) { currBloodFlowMLPM = _treatmentParams.bloodFlowRateMLPM; } + } + else { currBloodFlowMLPM = _treatmentParams.bloodFlowRateMLPM; } + } + + accumBloodVolML += (currBloodFlowMLPM * FLOW_INTEGRATOR); + + primeTimeoutS = 0; + pauseCountDownS = 0; + elapsedTimeSincePauseS = 0; + handleBloodPrimeBroadcastData(accumBloodVolML, primeTimeoutS, pauseCountDownS, false); + //qDebug() << "Current" << currBloodFlowMLPM << _treatmentParams.bloodFlowRateMLPM; +} + +void StateController::handleBloodPrimeFlowChangeRequest(quint32 requestedFlowMLPM, quint32 &currBloodFlowMLPM) +{ + currBloodFlowMLPM = requestedFlowMLPM; + + QVariantList resp; + resp.append(static_cast(ID_TD_TREATMENT_SET_POINT_BLOOD_FLOW_CHANGE_RESP)); + resp.append(Can_Id::eChlid_TD_UI); + resp.append(ACCEPT_VALUE); + resp.append(0); + _isSendListReady = false; + _sendMessages.append(resp); + _isSendListReady = true; + +} + +void StateController::setTreatmentParametersToDefault() +{ + // TODO complete the list as we go + _treatmentParams.finalConfirmation = true; + _treatmentParams.treatmentModality = 0; // TODO set the actual enum value + _treatmentParams.bloodFlowRateMLPM = DEF_TX_PARAM_BLOOD_FLOW_RATE_MLPM; + _treatmentParams.dialysateFlowRateMLPM = DEF_TX_PARAM_DIAL_FLOW_RATE_MLPM; + _treatmentParams.treatmentDurationMin = DEF_TX_PARAM_PRESCRIBED_DUR_MIN; + _treatmentParams.dialysateTemperatureC = DEF_TX_PARAM_DIA_TEMPERATURE_C; + _treatmentParams.treatmentDurationMin = DEF_TX_PARAM_PRESCRIBED_DUR_MIN; +} + +void StateController::handleTreatmentSetpointsBroadcastData(quint32 bloodFlowMLPM, quint32 dialFlowMLPM, float dialTempC) +{ + static quint32 broadcastCounter = 0; + + if (++broadcastCounter % NUM_OF_COUNTS_TIMER_BC_EMIT != 0) { 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) +{ + 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; + +} Fisheye: Tag 61e26e538aae580369385eb78a966e74240d79c4 refers to a dead (removed) revision in file `sources/model/MessageDefines.cpp'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 61e26e538aae580369385eb78a966e74240d79c4 refers to a dead (removed) revision in file `sources/model/MessageDefines.h'. Fisheye: No comparison available. Pass `N' to diff?