Index: LeahiDryDemoXMLStates.scxml
===================================================================
diff -u -r47baa703592f0e21098cb21c0ed267de4e958b2f -rbec9c9856c333399aa5abaf18d2799f6fbc95da3
--- LeahiDryDemoXMLStates.scxml (.../LeahiDryDemoXMLStates.scxml) (revision 47baa703592f0e21098cb21c0ed267de4e958b2f)
+++ LeahiDryDemoXMLStates.scxml (.../LeahiDryDemoXMLStates.scxml) (revision bec9c9856c333399aa5abaf18d2799f6fbc95da3)
@@ -2,142 +2,30 @@
-
-
-
-
-
+
+
+
+
+
-
-
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Index: drydemo.pro
===================================================================
diff -u -r47baa703592f0e21098cb21c0ed267de4e958b2f -rbec9c9856c333399aa5abaf18d2799f6fbc95da3
--- drydemo.pro (.../drydemo.pro) (revision 47baa703592f0e21098cb21c0ed267de4e958b2f)
+++ drydemo.pro (.../drydemo.pro) (revision bec9c9856c333399aa5abaf18d2799f6fbc95da3)
@@ -65,6 +65,7 @@
sources/MessageGlobals.h \
\ # Controllers
sources/ApplicationController.h \
+ sources/model/MessageDefines.h \
sources/storage/Settings.h \
\ # ---------- States ----------
sources/StateController.h \
@@ -97,6 +98,7 @@
sources/ApplicationPost.cpp \
\ # Controllers
sources/ApplicationController.cpp \
+ sources/model/MessageDefines.cpp \
sources/storage/Settings.cpp \
\ # ---------- States ----------
sources/StateController.cpp \
Index: drydemo.pro.user
===================================================================
diff -u -r47baa703592f0e21098cb21c0ed267de4e958b2f -rbec9c9856c333399aa5abaf18d2799f6fbc95da3
--- drydemo.pro.user (.../drydemo.pro.user) (revision 47baa703592f0e21098cb21c0ed267de4e958b2f)
+++ drydemo.pro.user (.../drydemo.pro.user) (revision bec9c9856c333399aa5abaf18d2799f6fbc95da3)
@@ -1,6 +1,6 @@
-
+
EnvironmentId
@@ -466,7 +466,10 @@
/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
@@ -475,37 +478,34 @@
/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
- /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
- 192.168.10.138
- 192.168.10.228
- 192.168.10.228
- 192.168.10.159
- 192.168.137.210
+ 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.10.167
- 192.168.137.30
192.168.137.25
- 192.168.10.186
+ 192.168.137.30
192.168.137.170
- 192.168.137.26
- 192.168.40.23
- 192.168.137.24
- 192.168.137.3
- 192.168.137.247
- 192.168.137.202
- 192.168.137.36
- 192.168.137.125
+ 192.168.10.186
+ 192.168.10.167
+ 192.168.10.159
+ 192.168.137.210
+ 192.168.10.138
+ 192.168.10.228
+ 192.168.10.228
/home/root
@@ -531,12 +531,9 @@
/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/x86_64-pokysdk-linux
/opt/b2qt/3.1.18/sysroots
/opt/b2qt/3.1.18/sysroots
/opt/b2qt/3.1.18/sysroots
@@ -546,54 +543,57 @@
/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-02T09:06:00.862
- 2023-01-17T18:18:03.749
- 2023-01-17T18:06:25.579
- 2023-01-24T18:19:13.179
- 2023-02-02T01:52:20.307
- 2023-01-27T10:15:15.423
- 2023-01-18T17:47:08.797
- 2023-02-02T19:40:15.813
- 2023-02-02T02:30:48.337
- 2023-02-02T02:13:54.596
- 2023-01-18T20:13:36.296
- 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-02-02T02:26:33.738
- 2023-02-02T01:46:50.167
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-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-02-02T09:05:22.000
- 2023-01-17T18:17:25.000
- 2023-01-17T18:05:42.000
- 2023-01-24T18:18:58.000
- 2023-02-02T01:52:16.000
- 2023-01-27T10:15:08.000
- 2023-01-18T17:47:04.000
- 2023-02-02T19:39:36.000
- 2023-02-02T02:31:01.000
- 2023-02-02T02:14:08.000
- 2023-01-18T20:13:33.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-02-02T02:26:46.000
- 2023-02-02T01:47:02.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-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
2
Index: sources/MessageGlobals.h
===================================================================
diff -u -r47baa703592f0e21098cb21c0ed267de4e958b2f -rbec9c9856c333399aa5abaf18d2799f6fbc95da3
--- sources/MessageGlobals.h (.../MessageGlobals.h) (revision 47baa703592f0e21098cb21c0ed267de4e958b2f)
+++ sources/MessageGlobals.h (.../MessageGlobals.h) (revision bec9c9856c333399aa5abaf18d2799f6fbc95da3)
@@ -124,11 +124,25 @@
eCan_DD = 1,
eCan_FP = 2,
eCan_DI = 3,
+ eCan_UI = 4,
};
enum Message_ID_Enum {
- ID_NONE = 0x0000,
- ID_TD_OP_MODE_DATA = 0x1200,
+ 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,
};
enum TD_OP_MODE {
Index: sources/StateController.cpp
===================================================================
diff -u -r47baa703592f0e21098cb21c0ed267de4e958b2f -rbec9c9856c333399aa5abaf18d2799f6fbc95da3
--- sources/StateController.cpp (.../StateController.cpp) (revision 47baa703592f0e21098cb21c0ed267de4e958b2f)
+++ sources/StateController.cpp (.../StateController.cpp) (revision bec9c9856c333399aa5abaf18d2799f6fbc95da3)
@@ -15,9 +15,9 @@
connect(&_ApplicationController, SIGNAL(didUnhandledMsgAppController(const QVariantList &)),
this , SLOT(doStateControllerUnhandledMsgReceived(const QVariantList &)));
- _dryDemo.connectToState("Idle" , this, &StateController::onIdleStateChange );
- //_dryDemo.connectToState("Tx_Params" , this, &StateController::onTreatmentParamsStateChange );
- //_dryDemo.connectToState("Water_Sample" , this, &StateController::onWaterSampleStateChange );
+ _dryDemo.connectToState("Standby" , this, &StateController::onStandbyStateChange );
+ _dryDemo.connectToState("Pre_Tx" , this, &StateController::onPretreatmentStateChange );
+ _dryDemo.connectToState("Blood_Prime" , this, &StateController::onBloodPrimeStateChange );
//_dryDemo.connectToState("Consumables" , this, &StateController::onConsumablesStateChange );
//_dryDemo.connectToState("Disposables" , this, &StateController::onDisposablesStateChange );
//_dryDemo.connectToState("System_Prime" , this, &StateController::onSystemPrimeStateChange );
@@ -32,6 +32,20 @@
//_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_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()
@@ -45,7 +59,10 @@
switch(receivedMsgID)
{
- //case ID_UI_RQST_TX:
+ 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_TX_PARAMS_RQST:
//case ID_UI_CONFIRM_RESP:
//case ID_UI_RINSEBACK_CMD_RQST:
@@ -58,16 +75,18 @@
//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;
+ _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;
+ _treatmentRcvdMessages[receivedMsgID] = 0;
+ break;
//case ID_UI_TX_END_RQST:
//case ID_UI_CONSUMABLES_INSTALL:
@@ -89,6 +108,13 @@
//case ID_HD_TX_PARAMS_RANGES_DATA:
//case ID_HD_TX_STATES_BC:
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_FILTER_FLUSH_TIME_BC:
//case ID_HD_UI_CONFIRM_RQST:
//case ID_PRE_TX_STATES_BC:
@@ -137,7 +163,7 @@
{
QList msgList = _broadcastMessages;
- if (isBroadcast) {
+ if (isBroadcast){
_broadcastMessages.clear();
}
else
@@ -146,13 +172,13 @@
_sendMessages.clear();
}
- for (auto item: msgList) {
+ for (auto item: msgList){
emit _ApplicationController.didActionTransmit(item);
}
}
// ----------- State transition methods ---------------- //
-void StateController::onIdleStateChange(bool active)
+void StateController::onStandbyStateChange(bool active)
{
static State_Status status = STATE_ON_ENTRY;
@@ -173,30 +199,107 @@
//// Send message 0xBA in case the dry demo menu stayed open to be closed upon transitioning to standby
//prepareMsgBA(MODE_STAN, CONFIRM_CMD_ACCEPT_CLOSE);
- //_transitionEventsFromIdle.clear();
- //_transitionEventsFromIdle[CMD_TX_PARAMS ] = "Transition_2_Tx_Parms";
- //_transitionEventsFromIdle[CMD_WATER_SAMPLE ] = "Transition_2_Water_Sample";
- //_transitionEventsFromIdle[CMD_CONSUMABLES ] = "Transition_2_Consumables";
- //_transitionEventsFromIdle[CMD_DISPOSABLES ] = "Transition_2_Disposables";
- //_transitionEventsFromIdle[CMD_SYSTEM_PRIME ] = "Transition_2_Sys_Prime";
- //_transitionEventsFromIdle[CMD_BP_HR ] = "Transition_2_BP_HR";
- //_transitionEventsFromIdle[CMD_ULTRAFILTRATION] = "Transition_2_Ultrafiltraion";
- //_transitionEventsFromIdle[CMD_CONNECTION ] = "Transition_2_Patient_Connection";
- //_transitionEventsFromIdle[CMD_START_TX ] = "Transition_2_Start_Tx";
- //_transitionEventsFromIdle[CMD_END_TX ] = "Transition_2_End_Tx";
- //_transitionEventsFromIdle[CMD_DISINFECTION ] = "Transition_2_Disinfect";
+ status = STATE_ON_ACTION;
+ qDebug() << "Standby on entry";
+ };
+
+ auto inAction = [=](){
status = STATE_ON_ACTION;
- qDebug() << "Idle on entry";
+ 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 (! _treatmentRcvdMessages[ID_UI_CONFIRMATION_RESULT_RESP].isNull()){
+ qint32 cmd = CMD_NONE;
+ qint32 IDIndex = 0;
+ Types::U32 param;
+ GetValue(_treatmentRcvdMessages[ID_UI_CONFIRMATION_RESULT_RESP].toByteArray(), IDIndex, param);
+
+ if (param.value == UI_MSG_BB_PAYLOAD_ID) {
+ IDIndex = UI_MSG_BB_STATUS_INDEX;
+ GetValue(_treatmentRcvdMessages[ID_UI_CONFIRMATION_RESULT_RESP].toByteArray(), IDIndex, param);
+ cmd = param.value;
+
+ User_Command_ID cmdIDEnum = static_cast(cmd);
+ _treatmentRcvdMessages[ID_UI_CONFIRMATION_RESULT_RESP].clear();
+ if ((cmdIDEnum > CMD_STAND_BY) && (cmdIDEnum <= CMD_DISINFECTION)) {
+ qDebug() << "Submit event" << _transitionEventsFromStandby[cmdIDEnum];
+ _dryDemo.submitEvent(_transitionEventsFromStandby[cmdIDEnum]);
+ 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 = [=](){
+ prepareTDOpModeTransitionData(MODE_PRET, 0);
+
+ status = STATE_ON_ACTION;
+
+ qDebug() << "PreTx on entry";
+ };
+
auto inAction = [=](){
- status = STATE_ON_ACTION;
+ 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()){
+ setTreatmentParameters(true, _treatmentRcvdMessages[ID_UI_TREATMENT_PARAMS_TO_VALIDATE]);
+ _treatmentRcvdMessages[ID_UI_TREATMENT_PARAMS_TO_VALIDATE].clear();
+ }
+
+ if (! _treatmentRcvdMessages[ID_UI_ADJUST_START_TREATMENT_RQST].isNull()){
+ _treatmentRcvdMessages[ID_UI_ADJUST_START_TREATMENT_RQST].clear();
+ prepareStartTxResponse();
+ _dryDemo.submitEvent(_transitionEventsFromStandby[CMD_BLOOD_PRIME]);
+ }
+
+ status = STATE_ON_ACTION;
};
auto inExit = [=](){
- qDebug() << "Idle in exit";
+ qDebug() << "PreTx in exit";
status = STATE_ON_ENTRY;
};
@@ -207,7 +310,125 @@
}
}
+void StateController::onBloodPrimeStateChange(bool active)
+{
+ static State_Status status = STATE_ON_ENTRY;
+ static float accumBloodVolML = 0.0;
+ static quint32 curBloodFlowMLPM = BLOOD_PRIME_START_FLOW_MLPM;
+ static bool resume = true;
+ auto inEntry = [=](){
+ prepareTDOpModeTransitionData(MODE_TREA, 0);
+ accumBloodVolML = 0;
+ QVariantList msg;
+ msg.append(static_cast(ID_TD_TREATMENT_STATE_DATA));
+ msg.append(Can_Id::eChlid_TD_Sync);
+ msg.append(1); msg.append(1); 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;
+
+ _treatmentStatus.broadcastIntervalCount = 0;
+ 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 (resume){
+ _treatmentStatus.broadcastIntervalCount++;
+ accumBloodVolML += (curBloodFlowMLPM * FLOW_INTEGRATOR);
+ }
+
+ if ((_treatmentStatus.broadcastIntervalCount % NUM_OF_COUNTS_TIMER_BC_EMIT == 0) && (resume) ) {
+
+ prepareBloodPrimeBroadcastData(accumBloodVolML);
+ //prepareOcclusionBroadcastData();
+ //prepareTreatmentParamsRangesBroadcastData(true); // Reset the params and get ready for a new treatment
+
+ if (curBloodFlowMLPM < _treatmentParams.bloodFlowRateMLPM) {
+ // If interim blood flow is less than the target blood flow, keep adding
+ // to the blood flow ramp
+ curBloodFlowMLPM += BLOOD_PRIME_FLOW_CHNG_MLPM;
+ }
+
+ if (curBloodFlowMLPM >= _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) {
+ curBloodFlowMLPM -= BLOOD_PRIME_FLOW_CHNG_MLPM;
+
+ if (curBloodFlowMLPM <= _treatmentParams.bloodFlowRateMLPM) {
+ curBloodFlowMLPM = _treatmentParams.bloodFlowRateMLPM;
+ }
+ }
+ else {
+ curBloodFlowMLPM = _treatmentParams.bloodFlowRateMLPM;
+ }
+ }
+ }
+
+ status = STATE_ON_ACTION;
+
+
+ if (accumBloodVolML > BLOOD_PRIME_VOLUME_ML) {
+ 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_EXIT;
+ }
+ };
+
+ 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::prepareTDOpModeTransitionData(Can::TD_OP_MODE mode, quint32 subMode)
{
QVariantList msg;
@@ -220,4 +441,150 @@
_isBroadcastListReady = true;
}
+void StateController::setTreatmentParameters(bool isFromUI, const QVariant &payload)
+{
+ if (isFromUI){
+ 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::prepareStartTxResponse()
+{
+ 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::prepareBloodPrimeBroadcastData(float accumulatedVolML)
+{
+ // 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(2000);
+ msg.append(1000);
+ _isBroadcastListReady = false;
+ _broadcastMessages.append(msg);
+ _isBroadcastListReady = true;
+}
Index: sources/StateController.h
===================================================================
diff -u -r47baa703592f0e21098cb21c0ed267de4e958b2f -rbec9c9856c333399aa5abaf18d2799f6fbc95da3
--- sources/StateController.h (.../StateController.h) (revision 47baa703592f0e21098cb21c0ed267de4e958b2f)
+++ sources/StateController.h (.../StateController.h) (revision bec9c9856c333399aa5abaf18d2799f6fbc95da3)
@@ -136,21 +136,15 @@
enum User_Command_ID {
CMD_NONE = -1,
CMD_STAND_BY = 0,
- CMD_TX_PARAMS = 1,
- CMD_WATER_SAMPLE = 2,
- CMD_CONSUMABLES = 3,
- CMD_DISPOSABLES = 4,
- CMD_SYSTEM_PRIME = 5,
- CMD_BP_HR = 6,
- CMD_ULTRAFILTRATION = 7,
- CMD_CONNECTION = 8,
- CMD_START_TX = 9,
- CMD_END_TX = 10,
- CMD_DISINFECTION = 11,
- CMD_HIGH_PRIO_ALARM = 12,
- CMD_MEDIUM_PRIO_ALARM = 13,
- CMD_LOW_PRIO_ALARM = 14,
- NUM_OF_USER_CMDS = 15,
+ CMD_PRE_TX = 1,
+ CMD_BLOOD_PRIME = 2,
+
+ 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 {
@@ -159,12 +153,46 @@
STATE_ON_EXIT,
};
+ struct Treatment_Status_Vars {
+ bool hasTxParamsBeenInitialized;
+ quint32 broadcastIntervalCount;
+ };
- QHash_transitionEventsFromIdle;
+ 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;
+ };
+
+ 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;
@@ -174,9 +202,15 @@
void sendMessages(bool isBroadcast);
// State handlers
- void onIdleStateChange(bool active);
+ void onStandbyStateChange(bool active);
+ void onPretreatmentStateChange(bool active);
+ void onBloodPrimeStateChange(bool active);
+ // TODO move these to Message Defines
// Helper functions
void prepareTDOpModeTransitionData(Can::TD_OP_MODE mode, quint32 subMode);
+ void setTreatmentParameters(bool isFromUI, const QVariant &payload);
+ void prepareStartTxResponse();
+ void prepareBloodPrimeBroadcastData(float accumulatedVolML);
};
Index: sources/canbus/MessageDispatcher.cpp
===================================================================
diff -u -r47baa703592f0e21098cb21c0ed267de4e958b2f -rbec9c9856c333399aa5abaf18d2799f6fbc95da3
--- sources/canbus/MessageDispatcher.cpp (.../MessageDispatcher.cpp) (revision 47baa703592f0e21098cb21c0ed267de4e958b2f)
+++ sources/canbus/MessageDispatcher.cpp (.../MessageDispatcher.cpp) (revision bec9c9856c333399aa5abaf18d2799f6fbc95da3)
@@ -170,7 +170,6 @@
return;
}
Message mMessage = _messageList[vCan_Id].last();
- //qDebug() << "6" <<__FUNCTION__;
// TODO : must be moved to a MessageModel class
if (mMessage.isComplete()) {
@@ -364,6 +363,7 @@
}
if (! _builder.buildMessage(vPayload, _messageList[vCan_Id].last(), vCan_Id)) {
_messageList[vCan_Id].removeLast();
+ qDebug() << "BROKEN" << _messageList[vCan_Id].last().actionId;
return false;
}
return true;
@@ -462,6 +462,7 @@
if ( ! checkAcknowReceived(vMessage, srcText) ) { // check if the message was an acknowledge.
checkAcknowTransmit(vMessage, srcText); // then if needs acknow send it immediately.
}
+ // qDebug() << "5" <<__FUNCTION__ << vMessage.actionId;
// disabled coco begin validated: Has been validated manually. If MessageInterpreter::interpretMessage fails, this also returns false
if ( _interpreter.interpretMessage( vMessage, mData ) ) {
ok = true;
Index: sources/canbus/MessageInterpreter.cpp
===================================================================
diff -u -r47baa703592f0e21098cb21c0ed267de4e958b2f -rbec9c9856c333399aa5abaf18d2799f6fbc95da3
--- sources/canbus/MessageInterpreter.cpp (.../MessageInterpreter.cpp) (revision 47baa703592f0e21098cb21c0ed267de4e958b2f)
+++ sources/canbus/MessageInterpreter.cpp (.../MessageInterpreter.cpp) (revision bec9c9856c333399aa5abaf18d2799f6fbc95da3)
@@ -185,6 +185,7 @@
.arg(int(vMessage.can_id), 3, 16, QChar('0'))
.arg(mActionIdHexString)
.arg(QString(vMessage.data.toHex('.'))).toUpper();
+ //qDebug() << logMessage;
LOG_DEBUG(logMessage);
}
@@ -254,6 +255,11 @@
if (vText) *vText = "DI";
return Can_Source::eCan_DI;
+ case eChlid_UI_TD : // 0x041, ///< UI for dry demo
+ if (vText) *vText = "UI";
+ return Can_Source::eCan_UI;
+ // TODO why no break?
+
default:
if (vText) *vText = "XX";
return Can_Source::eCan_Unknown;
@@ -301,6 +307,10 @@
if (vText) *vText = "DI";
return Can_Id::eChlid_UI_Sync;
+ case eChlid_UI_TD : // 0x100, ///< UI for dry demo
+ if (vText) *vText = "TD";
+ return Can_Id::eChlid_TD_UI;
+
default:
if (vText) *vText = "XX";
return Can_Id::eChlid_UI_Sync;
@@ -340,7 +350,7 @@
else {
Q_UNUSED (vData );
printUnhandled (vMessage );
- //qDebug() << "1" <<__FUNCTION__ << vMessage.actionId;
+ // qDebug() << "1" <<__FUNCTION__ << vMessage.actionId;
}
return ok;
}
@@ -462,7 +472,7 @@
quint16 id = QString(group).toUInt(&ok,16);
if (!ok) continue;
_messageList[ id ] = _Settings.keys(category, group);
- // DEBUG: qDebug() << _Settings.keys(group);
+ //qDebug() << "SETTINGS" << _Settings.keys(group);
}
}
@@ -474,25 +484,28 @@
*/
bool MessageInterpreter::logUnhandledMessage(const Message &vMessage) const {
bool ok = false;
- quint16 msg_id = vMessage.actionId;
- QString logString = QString("%1,").arg(msg_id,4,16);
- QString can_id;
- QString item = "";
+ quint16 id = vMessage.actionId;
+ QString logString = QString("%1,").arg(id,4,16);
+ QVariantList logVariant;
+ logVariant.append(id);
- identifySource(vMessage.can_id, &can_id); // Message Can Channel.
- logString += can_id + ",";
- // qDebug() << __FUNCTION__ << logString;
-
- if (_messageList.contains(msg_id)) {
+ if (_messageList.contains(id)) {
ok = true;
- QStringList items = _messageList[msg_id];
+ QStringList items = _messageList[id];
int index = 0;
for ( int i = 0; i < items.count(); i++ ) {
- item = items[i];
- if (i == 0) { // Message Name/Identifier
- logString += "~" + item;
+ QString item = items[i];
+ if (i == 0) {
+ QString ID;
+ switch (identifySource(vMessage.can_id, &ID)) {
+ //case Can_Source::eCan_HD: logString += ID + ",~" + item; break;
+ //case Can_Source::eCan_DG: logString += ID + ",~" + item; break;
+ case Can_Source::eCan_DI: logString += ID + ",~" + item; break;
+ default : logString += ID + ",~" + item; break;
+ }
}
- else { // Message payload data
+ else {
+ logVariant.append(vMessage.data);
if ( item == "F32" ) {
Types::F32 param;
if (! GetValue(vMessage.data, index, param )) logString += ",?";
@@ -535,12 +548,19 @@
}
}
}
+ LOG_APPED(logString);
+ if ((id != 0x1000) && (id != 0xFFFF) ) {
+ // Message 0x0700 is UI check in. It is not needed to be processed for dry demo
+ // Message 0xFFFF is the ack message and it is not needed to be processed for dry demo
+ qDebug() << "Message" << logString;
+ emit didUnhandledMsgReady(logVariant);
+ }
}
else {
if ( gDisableUnhandledReport ) { // if the unhandled message error has been disabled, return.
- LOG_DEBUG(QString("Undefined unhandled message [%1]").arg(msg_id, 0, 16));
+ LOG_DEBUG(QString("Undefined unhandled message [%1]").arg(id, 0, 16));
}
}
- LOG_APPED(logString + item);
return ok;
+
}
Index: sources/model/MessageDefines.cpp
===================================================================
diff -u
--- sources/model/MessageDefines.cpp (revision 0)
+++ sources/model/MessageDefines.cpp (revision bec9c9856c333399aa5abaf18d2799f6fbc95da3)
@@ -0,0 +1 @@
\ No newline at end of file
Index: sources/model/MessageDefines.h
===================================================================
diff -u
--- sources/model/MessageDefines.h (revision 0)
+++ sources/model/MessageDefines.h (revision bec9c9856c333399aa5abaf18d2799f6fbc95da3)
@@ -0,0 +1 @@
+#pragma once
Index: sources/storage/StorageGlobals.cpp
===================================================================
diff -u -r43668888e2a573f688493685ce3535c3b2117558 -rbec9c9856c333399aa5abaf18d2799f6fbc95da3
--- sources/storage/StorageGlobals.cpp (.../StorageGlobals.cpp) (revision 43668888e2a573f688493685ce3535c3b2117558)
+++ sources/storage/StorageGlobals.cpp (.../StorageGlobals.cpp) (revision bec9c9856c333399aa5abaf18d2799f6fbc95da3)
@@ -110,8 +110,8 @@
#endif
#else
// should be in the project application folder. [is tracking by git]
- const char *Settings_Path_Init = "/home/denali/Projects/drydemo/resources/settings/";
- const char *Settings_Path_Name = "/home/denali/Projects/drydemo/resources/settings/";
+ const char *Settings_Path_Init = "/home/denali/Public/luis/application/config/configurations/";
+ const char *Settings_Path_Name = "/home/denali/Public/luis/application/config/configurations/";
#endif
const char *Settings_Category_Instructions = "Instructions/Instructions" ;
const char *Settings_Category_InstructionsImagesLoc = "%1/Instructions/" ;