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/" ;