Index: LeahiDryDemoXMLStates.scxml
===================================================================
diff -u
--- LeahiDryDemoXMLStates.scxml (revision 0)
+++ LeahiDryDemoXMLStates.scxml (revision 47baa703592f0e21098cb21c0ed267de4e958b2f)
@@ -0,0 +1,143 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Index: cppcheck.err
===================================================================
diff -u -r43668888e2a573f688493685ce3535c3b2117558 -r47baa703592f0e21098cb21c0ed267de4e958b2f
--- cppcheck.err (.../cppcheck.err) (revision 43668888e2a573f688493685ce3535c3b2117558)
+++ cppcheck.err (.../cppcheck.err) (revision 47baa703592f0e21098cb21c0ed267de4e958b2f)
@@ -1,4 +1,4 @@
-01/23/2025 15:31
+05/28/2026 16:40
Dara Navaei
sources/canbus/MessageAcknowModel.h:58:9: performance: When an object of a class is created, the constructors of all member variables are called consecutively in the order the variables are declared, even if you don't explicitly write them to the initialization list. You could avoid assigning '_sequence' a value by passing the value to the constructor in the initialization list. [useInitializationList]
_sequence = vSequence ;
@@ -81,12 +81,6 @@
sources/StateController.cpp:10:18: warning: Member variable 'StateController::_isSendListReady' is not initialized in the constructor. [uninitMemberVarPrivate]
StateController::StateController(QObject *parent) : QObject(parent) {}
^
-sources/StateController.cpp:10:18: warning: Member variable 'StateController::_treatmentVars' is not initialized in the constructor. [uninitMemberVarPrivate]
-StateController::StateController(QObject *parent) : QObject(parent) {}
- ^
-sources/StateController.cpp:10:18: warning: Member variable 'StateController::_treatmentParams' is not initialized in the constructor. [uninitMemberVarPrivate]
-StateController::StateController(QObject *parent) : QObject(parent) {}
- ^
sources/StateController.cpp:10:18: warning: Member variable 'StateController::_hasUserConfirmedToProceed' is not initialized in the constructor. [uninitMemberVarPrivate]
StateController::StateController(QObject *parent) : QObject(parent) {}
^
@@ -108,39 +102,6 @@
sources/canbus/MessageDispatcher.cpp:266:9: note: Condition 'mNeedsAcknow' is always false
if (mNeedsAcknow) {
^
-sources/canbus/MessageDispatcher.cpp:308:9: style: Condition 'mNeedsAcknow' is always false [knownConditionTrueFalse]
- if (mNeedsAcknow) {
- ^
-sources/canbus/MessageDispatcher.cpp:307:25: note: Assignment 'mNeedsAcknow=false', assigned value is 0
- bool mNeedsAcknow = false; //needsAcknow(vCanId);
- ^
-sources/canbus/MessageDispatcher.cpp:308:9: note: Condition 'mNeedsAcknow' is always false
- if (mNeedsAcknow) {
- ^
-sources/canbus/MessageDispatcher.cpp:326:9: style: Condition 'mNeedsAcknow' is always false [knownConditionTrueFalse]
- if (mNeedsAcknow) {
- ^
-sources/canbus/MessageDispatcher.cpp:307:25: note: Assignment 'mNeedsAcknow=false', assigned value is 0
- bool mNeedsAcknow = false; //needsAcknow(vCanId);
- ^
-sources/canbus/MessageDispatcher.cpp:326:9: note: Condition 'mNeedsAcknow' is always false
- if (mNeedsAcknow) {
- ^
-sources/canbus/MessageDispatcher.cpp:395:19: style: The scope of the variable 'mActionId' can be reduced. Warning: Be careful when fixing this message, especially when there are inner loops. Here is an example where cppcheck will write that the scope for 'i' can be reduced:
-void f(int x)
-{
- int i = 0;
- if (x) {
- // it's safe to move 'int i = 0;' here
- for (int n = 0; n < 10; ++n) {
- // it is possible but not safe to move 'int i = 0;' here
- do_something(&i);
- }
- }
-}
-When you see this message it is always safe to reduce the variable scope 1 level. [variableScope]
- int mActionId = 0;
- ^
sources/model/settings/MSettings.cpp:45:15: style: Consider using std::accumulate algorithm instead of a raw loop. [useStlAlgorithm]
mKeys += keyValue.key();
^
Index: cppcheck.log
===================================================================
diff -u -r43668888e2a573f688493685ce3535c3b2117558 -r47baa703592f0e21098cb21c0ed267de4e958b2f
--- cppcheck.log (.../cppcheck.log) (revision 43668888e2a573f688493685ce3535c3b2117558)
+++ cppcheck.log (.../cppcheck.log) (revision 47baa703592f0e21098cb21c0ed267de4e958b2f)
@@ -1,4 +1,4 @@
-01/23/2025 15:31
+05/28/2026 16:40
Dara Navaei
(information) Couldn't find path given by -I './/sources/bluetooth/'
(information) Couldn't find path given by -I './/sources/cloudsync/'
@@ -13,154 +13,154 @@
Includes: -I.//sources/ -I.//sources/canbus/ -I.//sources/model/ -I.//sources/storage/ -I.//sources/utility/
Platform:Native
Checking main.cpp: Q_PROPERTY=1;Q_ENUM=1...
-1/24 files checked 8% done
+1/24 files checked 10% done
Checking sources/ApplicationController.cpp ...
Defines:Q_PROPERTY=1;Q_ENUM=1
Undefines:
Includes: -I.//sources/ -I.//sources/canbus/ -I.//sources/model/ -I.//sources/storage/ -I.//sources/utility/
Platform:Native
Checking sources/ApplicationController.cpp: Q_PROPERTY=1;Q_ENUM=1...
-2/24 files checked 12% done
+2/24 files checked 15% done
Checking sources/ApplicationPost.cpp ...
Defines:Q_PROPERTY=1;Q_ENUM=1
Undefines:
Includes: -I.//sources/ -I.//sources/canbus/ -I.//sources/model/ -I.//sources/storage/ -I.//sources/utility/
Platform:Native
Checking sources/ApplicationPost.cpp: Q_PROPERTY=1;Q_ENUM=1...
-3/24 files checked 13% done
+3/24 files checked 15% done
Checking sources/MainTimer.cpp ...
Defines:Q_PROPERTY=1;Q_ENUM=1
Undefines:
Includes: -I.//sources/ -I.//sources/canbus/ -I.//sources/model/ -I.//sources/storage/ -I.//sources/utility/
Platform:Native
Checking sources/MainTimer.cpp: Q_PROPERTY=1;Q_ENUM=1...
-4/24 files checked 14% done
+4/24 files checked 17% done
Checking sources/StateController.cpp ...
Defines:Q_PROPERTY=1;Q_ENUM=1
Undefines:
Includes: -I.//sources/ -I.//sources/canbus/ -I.//sources/model/ -I.//sources/storage/ -I.//sources/utility/
Platform:Native
Checking sources/StateController.cpp: Q_PROPERTY=1;Q_ENUM=1...
-5/24 files checked 33% done
+5/24 files checked 20% done
Checking sources/Threads.cpp ...
Defines:Q_PROPERTY=1;Q_ENUM=1
Undefines:
Includes: -I.//sources/ -I.//sources/canbus/ -I.//sources/model/ -I.//sources/storage/ -I.//sources/utility/
Platform:Native
Checking sources/Threads.cpp: Q_PROPERTY=1;Q_ENUM=1...
-6/24 files checked 34% done
+6/24 files checked 21% done
Checking sources/canbus/CanInterface.cpp ...
Defines:Q_PROPERTY=1;Q_ENUM=1
Undefines:
Includes: -I.//sources/ -I.//sources/canbus/ -I.//sources/model/ -I.//sources/storage/ -I.//sources/utility/
Platform:Native
Checking sources/canbus/CanInterface.cpp: Q_PROPERTY=1;Q_ENUM=1...
-7/24 files checked 39% done
+7/24 files checked 26% done
Checking sources/canbus/FrameInterface.cpp ...
Defines:Q_PROPERTY=1;Q_ENUM=1
Undefines:
Includes: -I.//sources/ -I.//sources/canbus/ -I.//sources/model/ -I.//sources/storage/ -I.//sources/utility/
Platform:Native
Checking sources/canbus/FrameInterface.cpp: Q_PROPERTY=1;Q_ENUM=1...
-8/24 files checked 43% done
+8/24 files checked 31% done
Checking sources/canbus/MessageAcknowModel.cpp ...
Defines:Q_PROPERTY=1;Q_ENUM=1
Undefines:
Includes: -I.//sources/ -I.//sources/canbus/ -I.//sources/model/ -I.//sources/storage/ -I.//sources/utility/
Platform:Native
Checking sources/canbus/MessageAcknowModel.cpp: Q_PROPERTY=1;Q_ENUM=1...
-9/24 files checked 45% done
+9/24 files checked 33% done
Checking sources/canbus/MessageBuilder.cpp ...
Defines:Q_PROPERTY=1;Q_ENUM=1
Undefines:
Includes: -I.//sources/ -I.//sources/canbus/ -I.//sources/model/ -I.//sources/storage/ -I.//sources/utility/
Platform:Native
Checking sources/canbus/MessageBuilder.cpp: Q_PROPERTY=1;Q_ENUM=1...
-10/24 files checked 51% done
+10/24 files checked 40% done
Checking sources/canbus/MessageDispatcher.cpp ...
Defines:Q_PROPERTY=1;Q_ENUM=1
Undefines:
Includes: -I.//sources/ -I.//sources/canbus/ -I.//sources/model/ -I.//sources/storage/ -I.//sources/utility/
Platform:Native
Checking sources/canbus/MessageDispatcher.cpp: Q_PROPERTY=1;Q_ENUM=1...
-11/24 files checked 56% done
+11/24 files checked 48% done
Checking sources/canbus/MessageInterpreter.cpp ...
Defines:Q_PROPERTY=1;Q_ENUM=1
Undefines:
Includes: -I.//sources/ -I.//sources/canbus/ -I.//sources/model/ -I.//sources/storage/ -I.//sources/utility/
Platform:Native
Checking sources/canbus/MessageInterpreter.cpp: Q_PROPERTY=1;Q_ENUM=1...
-12/24 files checked 63% done
+12/24 files checked 56% done
Checking sources/model/MAbstract.cpp ...
Defines:Q_PROPERTY=1;Q_ENUM=1
Undefines:
Includes: -I.//sources/ -I.//sources/canbus/ -I.//sources/model/ -I.//sources/storage/ -I.//sources/utility/
Platform:Native
Checking sources/model/MAbstract.cpp: Q_PROPERTY=1;Q_ENUM=1...
-13/24 files checked 64% done
+13/24 files checked 57% done
Checking sources/model/settings/MBluetooth.cpp ...
Defines:Q_PROPERTY=1;Q_ENUM=1
Undefines:
Includes: -I.//sources/ -I.//sources/canbus/ -I.//sources/model/ -I.//sources/storage/ -I.//sources/utility/
Platform:Native
Checking sources/model/settings/MBluetooth.cpp: Q_PROPERTY=1;Q_ENUM=1...
-14/24 files checked 65% done
+14/24 files checked 58% done
Checking sources/model/settings/MSettings.cpp ...
Defines:Q_PROPERTY=1;Q_ENUM=1
Undefines:
Includes: -I.//sources/ -I.//sources/canbus/ -I.//sources/model/ -I.//sources/storage/ -I.//sources/utility/
Platform:Native
Checking sources/model/settings/MSettings.cpp: Q_PROPERTY=1;Q_ENUM=1...
-15/24 files checked 66% done
+15/24 files checked 60% done
Checking sources/storage/FileHandler.cpp ...
Defines:Q_PROPERTY=1;Q_ENUM=1
Undefines:
Includes: -I.//sources/ -I.//sources/canbus/ -I.//sources/model/ -I.//sources/storage/ -I.//sources/utility/
Platform:Native
Checking sources/storage/FileHandler.cpp: Q_PROPERTY=1;Q_ENUM=1...
-16/24 files checked 72% done
+16/24 files checked 66% done
Checking sources/storage/Logger.cpp ...
Defines:Q_PROPERTY=1;Q_ENUM=1
Undefines:
Includes: -I.//sources/ -I.//sources/canbus/ -I.//sources/model/ -I.//sources/storage/ -I.//sources/utility/
Platform:Native
Checking sources/storage/Logger.cpp: Q_PROPERTY=1;Q_ENUM=1...
-17/24 files checked 79% done
+17/24 files checked 75% done
Checking sources/storage/Settings.cpp ...
Defines:Q_PROPERTY=1;Q_ENUM=1
Undefines:
Includes: -I.//sources/ -I.//sources/canbus/ -I.//sources/model/ -I.//sources/storage/ -I.//sources/utility/
Platform:Native
Checking sources/storage/Settings.cpp: Q_PROPERTY=1;Q_ENUM=1...
-18/24 files checked 82% done
+18/24 files checked 79% done
Checking sources/storage/StorageGlobals.cpp ...
Defines:Q_PROPERTY=1;Q_ENUM=1
Undefines:
Includes: -I.//sources/ -I.//sources/canbus/ -I.//sources/model/ -I.//sources/storage/ -I.//sources/utility/
Platform:Native
Checking sources/storage/StorageGlobals.cpp: Q_PROPERTY=1;Q_ENUM=1...
-19/24 files checked 86% done
+19/24 files checked 83% done
Checking sources/utility/crc.cpp ...
Defines:Q_PROPERTY=1;Q_ENUM=1
Undefines:
Includes: -I.//sources/ -I.//sources/canbus/ -I.//sources/model/ -I.//sources/storage/ -I.//sources/utility/
Platform:Native
Checking sources/utility/crc.cpp: Q_PROPERTY=1;Q_ENUM=1...
-20/24 files checked 87% done
+20/24 files checked 84% done
Checking sources/utility/encryption.cpp ...
Defines:Q_PROPERTY=1;Q_ENUM=1
Undefines:
Includes: -I.//sources/ -I.//sources/canbus/ -I.//sources/model/ -I.//sources/storage/ -I.//sources/utility/
Platform:Native
Checking sources/utility/encryption.cpp: Q_PROPERTY=1;Q_ENUM=1...
-21/24 files checked 89% done
+21/24 files checked 86% done
Checking sources/utility/format.cpp ...
Defines:Q_PROPERTY=1;Q_ENUM=1
Undefines:
Includes: -I.//sources/ -I.//sources/canbus/ -I.//sources/model/ -I.//sources/storage/ -I.//sources/utility/
Platform:Native
Checking sources/utility/format.cpp: Q_PROPERTY=1;Q_ENUM=1...
-22/24 files checked 90% done
+22/24 files checked 89% done
Checking sources/utility/qrcodegen.cpp ...
Defines:Q_PROPERTY=1;Q_ENUM=1
Undefines:
Index: drydemo.pro
===================================================================
diff -u -r43668888e2a573f688493685ce3535c3b2117558 -r47baa703592f0e21098cb21c0ed267de4e958b2f
--- drydemo.pro (.../drydemo.pro) (revision 43668888e2a573f688493685ce3535c3b2117558)
+++ drydemo.pro (.../drydemo.pro) (revision 47baa703592f0e21098cb21c0ed267de4e958b2f)
@@ -151,4 +151,4 @@
ui_build_history.log
STATECHARTS += \
- drydemoxmlstates.scxml
+ LeahiDryDemoXMLStates.scxml
Index: drydemo.pro.user
===================================================================
diff -u -r43668888e2a573f688493685ce3535c3b2117558 -r47baa703592f0e21098cb21c0ed267de4e958b2f
--- drydemo.pro.user (.../drydemo.pro.user) (revision 43668888e2a573f688493685ce3535c3b2117558)
+++ drydemo.pro.user (.../drydemo.pro.user) (revision 47baa703592f0e21098cb21c0ed267de4e958b2f)
@@ -1,6 +1,6 @@
-
+
EnvironmentId
@@ -96,7 +96,7 @@
Desktop Qt 5.15.10 GCC 64bit
Desktop Qt 5.15.10 GCC 64bit
qt.qt5.51510.gcc_64_kit
- 1
+ 0
0
0
@@ -106,8 +106,8 @@
true
- 0 0
- /home/denali/Projects/application/imake.sh
+ "" 0
+ %{sourceDir}/imake.sh
%{sourceDir}
ProjectExplorer.ProcessStep
@@ -273,15 +273,15 @@
2
- Qt4ProjectManager.Qt4RunConfiguration:/home/denali/Projects/drydemo/drydemo.pro
- /home/denali/Projects/drydemo/drydemo.pro
+ Qt4ProjectManager.Qt4RunConfiguration:/home/denali/Public/leahi-drydemo/drydemo.pro
+ /home/denali/Public/leahi-drydemo/drydemo.pro
-L -A can0
false
true
true
false
true
- /home/denali/Projects/tmp/build/drydemo-Qt_5_15_10_GCC-Release
+ /home/denali/Projects/tmp/build/drydemo-Qt_5_15_10_GCC-Debug
1
@@ -356,7 +356,7 @@
true
- 0 0
+ "" 0
/home/denali/Projects/application/imake.sh
%{sourceDir}
ProjectExplorer.ProcessStep
@@ -504,8 +504,8 @@
192.168.137.3
192.168.137.247
192.168.137.202
- 192.168.137.125
192.168.137.36
+ 192.168.137.125
/home/root
@@ -570,8 +570,8 @@
2023-02-02T02:40:56.627
2023-02-02T02:26:33.738
2023-02-02T01:46:50.167
- 2023-02-02T02:07:25.922
2023-02-01T03:23:15.710
+ 2023-02-02T02:07:25.922
2023-02-02T09:05:22.000
@@ -592,8 +592,8 @@
2023-02-02T02:41:10.000
2023-02-02T02:26:46.000
2023-02-02T01:47:02.000
- 2023-02-02T02:07:21.000
2023-02-01T03:23:28.000
+ 2023-02-02T02:07:21.000
2
@@ -614,9 +614,9 @@
1
- drydemo (on %{Device:Name})
- RemoteLinuxRunConfiguration:/home/denali/Projects/drydemo/drydemo.pro
- /home/denali/Projects/drydemo/drydemo.pro
+ drydemo (on %{Device:Name})2
+ RemoteLinuxRunConfiguration:/home/denali/Public/leahi-drydemo/drydemo.pro
+ /home/denali/Public/leahi-drydemo/drydemo.pro
1
false
true
Fisheye: Tag 47baa703592f0e21098cb21c0ed267de4e958b2f refers to a dead (removed) revision in file `drydemoxmlstates.scxml'.
Fisheye: No comparison available. Pass `N' to diff?
Index: sources/MessageGlobals.h
===================================================================
diff -u -r43668888e2a573f688493685ce3535c3b2117558 -r47baa703592f0e21098cb21c0ed267de4e958b2f
--- sources/MessageGlobals.h (.../MessageGlobals.h) (revision 43668888e2a573f688493685ce3535c3b2117558)
+++ sources/MessageGlobals.h (.../MessageGlobals.h) (revision 47baa703592f0e21098cb21c0ed267de4e958b2f)
@@ -76,35 +76,42 @@
// Broadcasts
//// Alarm
- eChlid_HD_Alarm = 0x001, ///< HD alarm broadcast
- eChlid_DG_Alarm = 0x002, ///< DG alarm broadcast
+ eChlid_TD_Alarm = 0x001, ///< TD alarm broadcast
+ eChlid_DD_Alarm = 0x002, ///< DD alarm broadcast
+ eChlid_FP_Alarm = 0x003, ///< FP alarm broadcast
eChlid_UI_Alarm = 0x004, ///< UI alarm broadcast [Out]
//// Sync
- eChlid_HD_Sync = 0x040, ///< HD sync broadcast
- eChlid_DG_Sync = 0x080, ///< DG sync broadcast
- eChlid_UI_Sync = 0x200, ///< UI sync broadcast [Out]
+ eChlid_TD_Sync = 0x100, ///< HD sync broadcast
+ eChlid_DD_Sync = 0x101, ///< DD sync broadcast
+ eChlid_FP_Sync = 0x102, ///< DD sync broadcast
+ eChlid_UI_Sync = 0x103, ///< UI sync broadcast [Out]
// UI not listening
- eChlid_HD_DG = 0x008, ///< HD => DG
- eChlid_DG_HD = 0x010, ///< DG => HD
+ eChlid_TD_DD = 0x010, ///< TD => DD
+ eChlid_DD_TD = 0x011, ///< DD => TD
+ eChlid_DD_FP = 0x021, ///< DD => FP
+ eChlid_FP_DD = 0x020, ///< FP => DD
// UI is listening
- eChlid_HD_UI = 0x020, ///< HD => UI
- eChlid_UI_HD = 0x100, ///< UI => HD [Out]
+ eChlid_TD_UI = 0x040, ///< TD => UI
+ eChlid_UI_TD = 0x041, ///< UI => TD [Out]
// UI listens occasionally
- eChlid_DG_UI = 0x070, ///< DG => UI
- eChlid_UI_DG = 0x110, ///< UI => DG [Out]
+ eChlid_DD_UI = eChlid_DD_Sync , ///< DD => UI
+ eChlid_FP_UI = eChlid_FP_Sync , ///< FP => UI
+ eChlid_UI_DD = eChlid_UI_Sync , ///< UI => DD [Out]
- // Dialing channel has been requested by V&V team for CANBus testing
+ // Dialin channel has been requested by V&V team for CANBus testing
// and clarify the source of the unexpected channel message
// UI still does not do anything with the messages on these channels.
- eDialin_HD = 0x400, ///< dialin => HD
- eHD_Dialin = 0x401, ///< HD => dialin
- eDialin_DG = 0x402, ///< dialin => DG
- eDG_Dialin = 0x403, ///< DG => dialin
- eDialin_UI = 0x404, ///< dialin => UI
- eUI_Dialin = 0x405, ///< UI => dialin
+ eDialin_TD = 0x400, ///< dialin => TD
+ eTD_Dialin = 0x401, ///< TD => dialin
+ eDialin_DD = 0x402, ///< dialin => DD
+ eDD_Dialin = 0x403, ///< DD => dialin
+ eDialin_FP = 0x404, ///< dialin => FP
+ eFP_Dialin = 0x405, ///< FP => dialin
+ eDialin_UI = 0x406, ///< dialin => UI
+ eUI_Dialin = 0x407, ///< UI => dialin
};
/*!
@@ -113,78 +120,26 @@
*/
enum Can_Source {
eCan_Unknown = -1,
- eCan_HD = 0,
- eCan_DG = 1,
- eCan_DI = 2,
- eCan_UI = 3,
+ eCan_TD = 0,
+ eCan_DD = 1,
+ eCan_FP = 2,
+ eCan_DI = 3,
};
enum Message_ID_Enum {
ID_NONE = 0x0000,
- ID_HD_ALARM_STATUS_BC = 0x0200,
- ID_HD_BLOOD_FLOW_DATA_BC = 0x0500,
- ID_UI_POST_TREATMNET_NEXT_RQST = 0x0600,
- ID_HD_DIALYSATE_FLOW_DATA_BC = 0x0800,
- ID_PRESSURE_OCCLUSION_DATA_BC = 0x0900,
- ID_DIALYSATE_OUT_FLOW_DATA_BC = 0x0B00,
- ID_TX_TIME_BC = 0x0D00,
- ID_HD_TX_STATES_BC = 0x0F00,
- ID_UI_SALINE_BOLUS_RQST = 0x1200,
- ID_USER_TX_TIME_CHANGES_RQST = 0x1600,
- ID_USER_BLOOD_DIAL_RATE_CHANGE_RQST = 0x1700,
- ID_USER_BLOOD_DIAL_RATE_CHANGE_RESP = 0x1800,
- ID_HD_TX_PARAMS_RANGES_DATA = 0x1A00,
- ID_USER_TX_TIME_CHANGES_RESP = 0x1B00,
- ID_HD_OP_MODE = 0x2500,
- ID_HD_SALINE_BOLUS_BC = 0x2F00,
- ID_UI_TX_PARAMS_RQST = 0x3500,
- ID_HD_NEW_PARAMS_RESP = 0x3600,
- ID_UI_RQST_TX = 0x3800,
- ID_UI_CONFIRM_TX_PARAMS = 0x3B00,
- ID_UI_ALARM_USER_ACTION_RQST = 0x4000,
- ID_HD_PRIMING_TIME_BC = 0x4300,
- ID_UI_PRESSURE_LIMITS_CHANGE_RQST = 0x4600,
- ID_HD_PRESSURE_LIMITS_CHANGE_RESP = 0x4700,
- ID_UI_HEPARIN_PAUSE_RESUME_RQST = 0x4B00,
- ID_HD_HEPARIN_PAUSE_RESUME_RESP = 0X4C00,
- ID_HD_HEPARIN_VOLUME_BC = 0x4D00,
- ID_UI_SET_UF_VOLUME_RQST = 0x4F00,
- ID_HD_SET_UF_VOLUME_RESP = 0x5000,
- ID_UI_RINSEBACK_CMD_RQST = 0x5200,
- ID_HD_RINSEBACK_CMD_RESP = 0x5300,
- ID_HD_RINSEBACK_DATA_BC = 0x5600,
- ID_UI_TX_END_RQST = 0x5700,
- ID_HD_BLOOD_PRIME_BC = 0x5900,
- ID_PRE_TX_STATES_BC = 0x5C00,
- ID_SAMPLE_WATER_RESULT = 0x5F00,
- ID_FILTER_FLUSH_TIME_BC = 0x6000,
- ID_HD_SYS_SELF_TEST_TIME_BC = 0x6100,
- ID_UI_INTALLATION_CONFIRM = 0x6200,
- ID_HD_DRY_SELF_TEST_TIME_BC = 0x6300,
- ID_UI_PATIENT_CONNECTION_RQST = 0x6400,
- ID_UI_PATIENT_CONNECTION_CONF_RQST = 0x6600,
- ID_HD_PATINET_CONNECTION_CONF_RESP = 0x6700,
- ID_UI_CONSUMABLES_INSTALL = 0x6800,
- ID_UI_START_TX_RQST = 0x7100,
- ID_UI_DISPOSABLE_REMOVAL_CONFIRM_RQST = 0x7300,
- ID_UI_DISPOSABLE_REMOVAL_CONFIRM_RESP = 0x7400,
- ID_UI_TREATMENT_LOG_RQST = 0x7500,
- ID_HD_TREATMENT_LOG_RESP = 0x7600,
- ID_HD_POST_TREATMENT_NEXT_CMD_RESP = 0x7E00,
- ID_UI_SERVICE_MODE_RQST = 0XB000,
- ID_HD_UI_CONFIRM_RQST = 0xBA00,
- ID_UI_CONFIRM_RESP = 0xBB00,
+ ID_TD_OP_MODE_DATA = 0x1200,
};
-enum HD_OP_MODE {
+enum TD_OP_MODE {
MODE_FAUL = 0, ///< Fault mode
MODE_SERV, ///< Service mode
MODE_INIT, ///< Initialization & POST mode
MODE_STAN, ///< Standby mode
- MODE_TPAR, ///< Treatment Parameters mode
MODE_PRET, ///< Pre-Treatment mode
MODE_TREA, ///< Treatment mode
MODE_POST, ///< Post-Treatment mode
+ MODE_UPDT, ///< Update mode
MODE_NLEG, ///< Not legal - an illegal mode transition occurred
};
Index: sources/StateController.cpp
===================================================================
diff -u -r43668888e2a573f688493685ce3535c3b2117558 -r47baa703592f0e21098cb21c0ed267de4e958b2f
--- sources/StateController.cpp (.../StateController.cpp) (revision 43668888e2a573f688493685ce3535c3b2117558)
+++ sources/StateController.cpp (.../StateController.cpp) (revision 47baa703592f0e21098cb21c0ed267de4e958b2f)
@@ -16,22 +16,22 @@
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("Consumables" , this, &StateController::onConsumablesStateChange );
- _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("Tx_Params" , this, &StateController::onTreatmentParamsStateChange );
+ //_dryDemo.connectToState("Water_Sample" , this, &StateController::onWaterSampleStateChange );
+ //_dryDemo.connectToState("Consumables" , this, &StateController::onConsumablesStateChange );
+ //_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("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 );
+ //_dryDemo.connectToState("End_Tx" , this, &StateController::onEndTreatmentStateChange );
+ //_dryDemo.connectToState("Post_Tx" , this, &StateController::onPostTreatmentStateChange );
+ //_dryDemo.connectToState("Disinfect" , this, &StateController::onDisinfectStateChange );
}
void StateController::quit()
@@ -45,71 +45,71 @@
switch(receivedMsgID)
{
- case ID_UI_RQST_TX:
- 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;
+ //case ID_UI_RQST_TX:
+ //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_TREATMENT_LOG_RQST:
- case ID_UI_POST_TREATMNET_NEXT_RQST:
- case ID_UI_DISPOSABLE_REMOVAL_CONFIRM_RQST:
- _treatmentRcvdMessages[receivedMsgID] = 0;
- 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_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_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_HD_ALARM_STATUS_BC:
- case ID_HD_BLOOD_FLOW_DATA_BC:
- case ID_HD_DIALYSATE_FLOW_DATA_BC:
- case ID_PRESSURE_OCCLUSION_DATA_BC:
- case ID_DIALYSATE_OUT_FLOW_DATA_BC:
- case ID_TX_TIME_BC:
- case ID_HD_TX_PARAMS_RANGES_DATA:
- case ID_HD_TX_STATES_BC:
- case ID_HD_OP_MODE:
- case ID_FILTER_FLUSH_TIME_BC:
- case ID_HD_UI_CONFIRM_RQST:
- case ID_PRE_TX_STATES_BC:
- case ID_HD_NEW_PARAMS_RESP:
- case ID_HD_SYS_SELF_TEST_TIME_BC:
- case ID_HD_DRY_SELF_TEST_TIME_BC:
- case ID_HD_PRIMING_TIME_BC:
- case ID_HD_SET_UF_VOLUME_RESP:
- case ID_HD_PATINET_CONNECTION_CONF_RESP:
- case ID_USER_TX_TIME_CHANGES_RESP:
- case ID_HD_BLOOD_PRIME_BC:
- case ID_HD_RINSEBACK_CMD_RESP:
- case ID_HD_RINSEBACK_DATA_BC:
- case ID_HD_SALINE_BOLUS_BC:
- case ID_HD_PRESSURE_LIMITS_CHANGE_RESP:
- case ID_USER_BLOOD_DIAL_RATE_CHANGE_RESP:
- case ID_HD_TREATMENT_LOG_RESP:
- case ID_HD_POST_TREATMENT_NEXT_CMD_RESP:
- case ID_UI_DISPOSABLE_REMOVAL_CONFIRM_RESP:
- case ID_HD_HEPARIN_VOLUME_BC:
- case ID_HD_HEPARIN_PAUSE_RESUME_RESP:
+ //case ID_HD_ALARM_STATUS_BC:
+ //case ID_HD_BLOOD_FLOW_DATA_BC:
+ //case ID_HD_DIALYSATE_FLOW_DATA_BC:
+ //case ID_PRESSURE_OCCLUSION_DATA_BC:
+ //case ID_DIALYSATE_OUT_FLOW_DATA_BC:
+ //case ID_TX_TIME_BC:
+ //case ID_HD_TX_PARAMS_RANGES_DATA:
+ //case ID_HD_TX_STATES_BC:
+ case ID_TD_OP_MODE_DATA:
+ //case ID_FILTER_FLUSH_TIME_BC:
+ //case ID_HD_UI_CONFIRM_RQST:
+ //case ID_PRE_TX_STATES_BC:
+ //case ID_HD_NEW_PARAMS_RESP:
+ //case ID_HD_SYS_SELF_TEST_TIME_BC:
+ //case ID_HD_DRY_SELF_TEST_TIME_BC:
+ //case ID_HD_PRIMING_TIME_BC:
+ //case ID_HD_SET_UF_VOLUME_RESP:
+ //case ID_HD_PATINET_CONNECTION_CONF_RESP:
+ //case ID_USER_TX_TIME_CHANGES_RESP:
+ //case ID_HD_BLOOD_PRIME_BC:
+ //case ID_HD_RINSEBACK_CMD_RESP:
+ //case ID_HD_RINSEBACK_DATA_BC:
+ //case ID_HD_SALINE_BOLUS_BC:
+ //case ID_HD_PRESSURE_LIMITS_CHANGE_RESP:
+ //case ID_USER_BLOOD_DIAL_RATE_CHANGE_RESP:
+ //case ID_HD_TREATMENT_LOG_RESP:
+ //case ID_HD_POST_TREATMENT_NEXT_CMD_RESP:
+ //case ID_UI_DISPOSABLE_REMOVAL_CONFIRM_RESP:
+ //case ID_HD_HEPARIN_VOLUME_BC:
+ //case ID_HD_HEPARIN_PAUSE_RESUME_RESP:
// Do nothing
break;
}
@@ -151,1021 +151,52 @@
}
}
-void StateController::setTreatmentParams(bool isFromUI, const QVariant &payload)
-{
- if (isFromUI) {
- QVariantList resp;
- resp.append(static_cast(ID_HD_NEW_PARAMS_RESP));
- resp.append(Can_Id::eChlid_HD_UI);
- resp.append(ACCEPT_VALUE);
- resp.append(0);
-
- qint32 index = 0;
- Types::U32 u32Var;
- Types::F32 f32Var;
- Types::S32 s32Var;
-
- GetValue(payload.toByteArray(), index, u32Var);
- _treatmentParams.bloodFlowRateMLPM = u32Var.value;
- resp.append(u32Var.value);
-
- GetValue(payload.toByteArray(), index, u32Var);
- _treatmentParams.dialysateFlowRateMLPM = u32Var.value;
- resp.append(u32Var.value);
-
- GetValue(payload.toByteArray(), index, u32Var);
- _treatmentParams.txDurationMins = u32Var.value;
- resp.append(u32Var.value);
-
- GetValue(payload.toByteArray(), index, u32Var);
- _treatmentParams.heparinPreStopMin = u32Var.value;
- resp.append(u32Var.value);
-
- GetValue(payload.toByteArray(), index, u32Var);
- _treatmentParams.salineBolusVolML = u32Var.value;
- resp.append(u32Var.value);
-
- GetValue(payload.toByteArray(), index, u32Var);
- _treatmentParams.acidConc = u32Var.value;
- resp.append(u32Var.value);
-
- GetValue(payload.toByteArray(), index, u32Var);
- _treatmentParams.bicarbConc = u32Var.value;
- resp.append(u32Var.value);
-
- GetValue(payload.toByteArray(), index, u32Var);
- _treatmentParams.dialyzerType = u32Var.value;
- resp.append(u32Var.value);
-
- GetValue(payload.toByteArray(), index, u32Var);
- _treatmentParams.heparinType = u32Var.value;
- resp.append(u32Var.value);
-
- GetValue(payload.toByteArray(), index, u32Var);
- _treatmentParams.bloodMeasurementInveralMin = u32Var.value;
- resp.append(u32Var.value);
-
- GetValue(payload.toByteArray(), index, u32Var);
- _treatmentParams.rinsebackFlowRateMLPM = u32Var.value;
- resp.append(u32Var.value);
-
- GetValue(payload.toByteArray(), index, s32Var);
- _treatmentParams.areterialPresLimitWindowMMHG = s32Var.value;
- resp.append(s32Var.value);
-
- GetValue(payload.toByteArray(), index, s32Var);
- _treatmentParams.venousPresLimitWindowMMHG = s32Var.value;
- resp.append(s32Var.value);
-
- GetValue(payload.toByteArray(), index, s32Var);
- _treatmentParams.venousPresLimitAsymWindowMMHG = s32Var.value;
- resp.append(s32Var.value);
-
- GetValue(payload.toByteArray(), index, f32Var);
- _treatmentParams.heparinDispenseRateMLHR = f32Var.value;
- resp.append(f32Var.value);
-
- GetValue(payload.toByteArray(), index, f32Var);
- _treatmentParams.heparinBolusVolML = f32Var.value;
- resp.append(f32Var.value);
-
- GetValue(payload.toByteArray(), index, f32Var);
- _treatmentParams.dialysateTemperatureC = f32Var.value;
- resp.append(f32Var.value);
- _treatmentParams.hasTxParamsBeenInitialized = true;
-
- _isSendListReady = false;
- _sendMessages.append(resp);
- _isSendListReady = true;
- }
- else if (!_treatmentParams.hasTxParamsBeenInitialized) {
- _treatmentParams.bloodFlowRateMLPM = DEF_TX_PARAM_BLOOD_FLOW_RATE_MLPM;
- _treatmentParams.dialysateFlowRateMLPM = DEF_TX_PARAM_DIAL_FLOW_RATE_MLPM;
- _treatmentParams.txDurationMins = DEF_TX_PARAM_PRESCRIBED_DUR_MIN;
- _treatmentParams.heparinPreStopMin = 0;
- _treatmentParams.salineBolusVolML = DEF_TX_PARAM_SALINE_BOLUS_VOL_ML;
- _treatmentParams.acidConc = 0;
- _treatmentParams.bicarbConc = 0;
- _treatmentParams.dialyzerType = 0;
- _treatmentParams.heparinType = 0;
- _treatmentParams.bloodMeasurementInveralMin = 0;
- _treatmentParams.rinsebackFlowRateMLPM = DEF_TX_PARAM_RINSEBACK_FLOW_RATE_MLPM;
- _treatmentParams.areterialPresLimitWindowMMHG = DEF_TX_PARAM_ART_PRES_LIMIT_WIN_MMHG;
- _treatmentParams.venousPresLimitWindowMMHG = DEF_TX_PARAM_VEN_PRES_LIMIT_WIN_MMHG;
- _treatmentParams.venousPresLimitAsymWindowMMHG = DEF_TX_PARAM_VEN_PRES_LIMIT_ASYM_WIN_MMHG;
- _treatmentParams.heparinDispenseRateMLHR = 0;
- _treatmentParams.heparinBolusVolML = 0;
- _treatmentParams.dialysateTemperatureC = DEF_TX_PARAM_DIA_TEMPERATURE_C;
- _treatmentParams.hasTxParamsBeenInitialized = true;
- // The use might start from the treatment directly so everything starts from the default values
- // so the UF volume is set to default as well.
- _treatmentVars.txParamsUFVolL = DEF_TX_PARAM_UF_VOLUME_L;
- }
-
- // Update the default arterial and venous pressure limits
- _treatmentVars.minArtPresLimitMMHG = static_cast(MIN_ART_PRES_LIMIT_MMHG);
- _treatmentVars.maxArtPresLimitMMHG = static_cast(MAX_ART_PRES_LIMIT_MMHG);
- _treatmentVars.minVenPresLimitMMHG = static_cast(MIN_VEN_PRES_LIMIT_MMHG);
- _treatmentVars.maxVenPresLimitMMHG = static_cast(MAX_VEN_PRES_LIMIT_MMHG);
-}
-
-void StateController::prepareOcclusionBroadcastData()
-{
- QVariantList msg;
- msg.append(static_cast(ID_PRESSURE_OCCLUSION_DATA_BC));
- msg.append(Can_Id::eChlid_HD_Sync);
- msg.append(_treatmentVars.curArtPresMMHG); msg.append(_treatmentVars.curVenPresMMHG); msg.append(0); msg.append(0);
- msg.append(_treatmentVars.minArtPresLimitMMHG);
- msg.append(_treatmentVars.maxArtPresLimitMMHG);
- msg.append(_treatmentVars.minVenPresLimitMMHG);
- msg.append(_treatmentVars.maxVenPresLimitMMHG);
- msg.append(0); msg.append(0);
- msg.append(0); msg.append(0);
- _isBroadcastListReady = false;
- _broadcastMessages.append(msg);
- _isBroadcastListReady = true;
-}
-
-void StateController::prepareTreatmentTimeBroadcastData()
-{
- _treatmentVars.treatmentElapsedTimeS++;
- _treatmentVars.remainingTreatmentTimeS = _treatmentVars.prescribedTreatmentTimeS - _treatmentVars.treatmentElapsedTimeS;
-
- if (_treatmentVars.remainingTreatmentTimeS <= 0 ) {
- _treatmentVars.remainingTreatmentTimeS = 0;
- }
-
- QVariantList msg;
- msg.append(static_cast(ID_TX_TIME_BC));
- msg.append(Can_Id::eChlid_HD_Sync);
- msg.append(_treatmentVars.prescribedTreatmentTimeS);
- msg.append(_treatmentVars.treatmentElapsedTimeS);
- msg.append(_treatmentVars.remainingTreatmentTimeS);
- _isBroadcastListReady = false;
- _broadcastMessages.append(msg);
- _isBroadcastListReady = true;
-}
-
-void StateController::prepareBloodFlowBroadcastData(quint32 flowMLPM)
-{
- QVariantList msg;
- msg.append(static_cast(ID_HD_BLOOD_FLOW_DATA_BC));
- msg.append(Can_Id::eChlid_HD_Sync);
- msg.append(flowMLPM);
- msg.append(flowMLPM - 0.1);
- msg.append(0.0); msg.append(0.0); msg.append(0.0); msg.append(0.0);
- msg.append(0.0); msg.append(0); msg.append(_treatmentParams.bloodFlowRateMLPM);
- msg.append(0);
- _isBroadcastListReady = false;
- _broadcastMessages.append(msg);
- _isBroadcastListReady = true;
-}
-
-void StateController::prepareDialysateFlowBroadcastData()
-{
- QVariantList msg;
- msg.append(static_cast(ID_HD_DIALYSATE_FLOW_DATA_BC));
- msg.append(Can_Id::eChlid_HD_Sync);
- msg.append(_treatmentParams.dialysateFlowRateMLPM);
- msg.append(_treatmentParams.dialysateFlowRateMLPM - 0.1);
- msg.append(0.0); msg.append(0.0); msg.append(0.0); msg.append(0.0);
- msg.append(0.0); msg.append(0); msg.append(_treatmentParams.dialysateFlowRateMLPM);
- msg.append(0);
- _isBroadcastListReady = false;
- _broadcastMessages.append(msg);
- _isBroadcastListReady = true;
-}
-
-void StateController::prepareDialysateOutFlowBroadcastData()
-{
- QVariantList msg;
- msg.append(static_cast(ID_DIALYSATE_OUT_FLOW_DATA_BC));
- msg.append(Can_Id::eChlid_HD_Sync);
- msg.append(_treatmentVars.refUFVolumeML);
- msg.append(_treatmentVars.measUFVolumeML);
- msg.append(0.0); msg.append(0.0); msg.append(0.0); msg.append(0.0);
- msg.append(0.0); msg.append(0.0); msg.append(0.0); msg.append(0.0);
- msg.append(0); msg.append(_treatmentVars.prescribedUFRate);
- msg.append(0);
- _isBroadcastListReady = false;
- _broadcastMessages.append(msg);
- _isBroadcastListReady = true;
-}
-
-void StateController::prepareTreatmentParamsRangesBroadcastData(bool isResetInSB)
-{
- // Calculations are from broadcastTreatmentSettingsRanges in the HD
- quint32 elapsedTimeMins = _treatmentVars.treatmentElapsedTimeS / SECONDS_PER_MINUTE;
- float dialVolumeSoFarML = _treatmentParams.dialysateFlowRateMLPM * (_treatmentVars.treatmentElapsedTimeS / SECONDS_PER_MINUTE);
- float maxQdMLPM = 0.0;
-
- if (_treatmentVars.treatmentElapsedTimeS > 0) {
- maxQdMLPM = (MAX_DIALYSATE_VOLUME_ML - dialVolumeSoFarML) / (_treatmentVars.remainingTreatmentTimeS / SECONDS_PER_MINUTE);
- }
- quint32 minTimeMins = qMax(elapsedTimeMins + 2, (quint32)MIN_TX_TIME_MINS);
- float prescribedUF = (_treatmentVars.prescribedUFRate > 0.0 ? _treatmentVars.prescribedUFRate : 1);
- quint32 maxTimeRemMins = (MAX_UF_VOL_ML - _treatmentVars.refUFVolumeML) / prescribedUF;
- quint32 maxTime1 = minTimeMins + maxTimeRemMins;
- quint32 maxTime2 = MAX_DIAL_RATE_MLPM / _treatmentParams.dialysateFlowRateMLPM;
- quint32 maxTimeMins = qMax(maxTime1, maxTime2);
- //qDebug() << "Time Ranges Values" << minTimeMins << maxTimeRemMins << maxTime2 << maxTimeMins << _treatmentVars.prescribedUFRate;
-
- float minUFVolML = _treatmentVars.refUFVolumeML + _treatmentVars.prescribedUFRate;
- float maxUFVol1 = minUFVolML + ((_treatmentParams.txDurationMins - elapsedTimeMins) * MAX_UF_RATE_MLPM);
- float maxUFVol2 = minUFVolML;
- if (_treatmentVars.prescribedUFRate > 0.0 ) {
- maxUFVol2 = minUFVolML + (MAX_TX_TIME_MINS - elapsedTimeMins - 1) * _treatmentVars.prescribedUFRate;
- }
- float maxUFVol = qMax(maxUFVol1, maxUFVol2);
- quint32 minDialFlowRateMLPM = MIN_DIAL_RATE_MLPM;
- quint32 maxDialFlowRateMLPM = (maxQdMLPM > MIN_DIAL_RATE_MLPM ? maxQdMLPM : minDialFlowRateMLPM);
-
- maxTimeMins = qMin(maxTimeMins, (quint32)MAX_TX_TIME_MINS);
- maxUFVol = qMin(maxUFVol, (float)MAX_UF_VOL_ML);
- maxDialFlowRateMLPM = qMin(maxDialFlowRateMLPM, (quint32)MAX_DIAL_RATE_MLPM);
-
- //qDebug() << "New UF" << minUFVolML << maxUFVol1 << maxUFVol2 << maxUFVol << maxDialFlowRateMLPM;
-
- if (isResetInSB) {
- maxTimeMins = (quint32)MAX_TX_TIME_MINS;
- maxUFVol = (float)MAX_UF_VOL_ML;
- maxDialFlowRateMLPM = (quint32)MAX_DIAL_RATE_MLPM;
- }
-
- QVariantList msg;
- msg.append(static_cast(ID_HD_TX_PARAMS_RANGES_DATA));
- msg.append(Can_Id::eChlid_HD_Sync);
- msg.append(minTimeMins); msg.append(maxTimeMins);
- msg.append(minUFVolML); msg.append(maxUFVol);
- msg.append(minDialFlowRateMLPM); msg.append(maxDialFlowRateMLPM);
- _isBroadcastListReady = false;
- _broadcastMessages.append(msg);
- _isBroadcastListReady = true;
-}
-
-void StateController::prepareHDModeTransitionBroadcastData(HD_OP_MODE mode, quint32 subMode)
-{
- QVariantList msg;
- msg.append(static_cast(ID_HD_OP_MODE));
- msg.append(Can_Id::eChlid_HD_Sync);
- msg.append(mode);
- msg.append(subMode);
- _isBroadcastListReady = false;
- _broadcastMessages.append(msg);
- _isBroadcastListReady = true;
-}
-
-void StateController::prepareStatesBroadcastData(Can::Message_ID_Enum msgID, const QList &preTxStates)
-{
- QVariantList msg;
- msg.append(static_cast(msgID));
- msg.append(Can_Id::eChlid_HD_Sync);
-
- for (auto item: preTxStates) {
- msg.append(item);
- }
- _isBroadcastListReady = false;
- _broadcastMessages.append(msg);
- _isBroadcastListReady = true;
-}
-
-void StateController::prepareBloodPrimeBroadcastData(float accumulatedVolML)
-{
- QVariantList msg;
- msg.append(static_cast(ID_HD_BLOOD_PRIME_BC));
- msg.append(Can_Id::eChlid_HD_Sync);
- msg.append(BLOOD_PRIME_VOLUME_ML);
- msg.append(accumulatedVolML);
- _isBroadcastListReady = false;
- _broadcastMessages.append(msg);
- _isBroadcastListReady = true;
-}
-
-void StateController::prepareRinsebackBroadcastData(const QList &volsML, const QList &payload)
-{
- QVariantList msg;
- msg.append(static_cast(ID_HD_RINSEBACK_DATA_BC));
- msg.append(Can_Id::eChlid_HD_Sync);
-
- for (auto item: volsML) {
- msg.append(item);
- }
-
- for (auto item: payload) {
- msg.append(item);
- }
- _isBroadcastListReady = false;
- _broadcastMessages.append(msg);
- _isBroadcastListReady = true;
-}
-
-void StateController::prepareTreatmentTimeChangeResponse(quint32 accept, quint32 txDurS, float maxUFvolML)
-{
- QVariantList resp;
- resp.append(static_cast(ID_USER_TX_TIME_CHANGES_RESP));
- resp.append(Can_Id::eChlid_HD_UI);
- resp.append(accept);
- resp.append(0);
- resp.append(txDurS/SECONDS_PER_MINUTE);
- resp.append(maxUFvolML);
- _isSendListReady = false;
- _sendMessages.append(resp);
- _isSendListReady = true;
-}
-
-void StateController::prepareSalineBolusBroadcastData(float cumSalineVolML, float bolSalineVolML)
-{
- QVariantList resp;
- resp.append(static_cast(ID_HD_SALINE_BOLUS_BC));
- resp.append(Can_Id::eChlid_HD_Sync);
- resp.append(_treatmentParams.salineBolusVolML);
- resp.append(cumSalineVolML);
- resp.append(bolSalineVolML);
- resp.append(0.0); resp.append(0.0); resp.append(0);
- _isSendListReady = false;
- _sendMessages.append(resp);
- _isSendListReady = true;
-}
-
-void StateController::prepareHeparinVolumeBroadcastData()
-{
- QVariantList msg;
- msg.append(static_cast(ID_HD_HEPARIN_VOLUME_BC));
- msg.append(Can_Id::eChlid_HD_Sync);
- msg.append(_treatmentVars.cumHeparinDisVolML);
- msg.append(_treatmentParams.heparinBolusVolML);
- _isSendListReady = false;
- _sendMessages.append(msg);
- _isSendListReady = true;
-}
-
-void StateController::handleTreatmentTimeChangeRequest(const QVariant &payload)
-{
- quint32 accept = REJECT_VALUE;
- qint32 IDIndex = 0;
- Types::U32 txDurMinType;
- GetValue(payload.toByteArray(), IDIndex, txDurMinType);
-
- quint32 txDurMins = txDurMinType.value;
- quint32 elapsedTimeMins = _treatmentVars.treatmentElapsedTimeS / SECONDS_PER_MINUTE;
-
- if ((txDurMins > elapsedTimeMins) && (txDurMins >= MIN_TX_TIME_MINS)) {
- float UFVolumeL = ((txDurMins - elapsedTimeMins) * _treatmentVars.prescribedUFRate) + _treatmentVars.refUFVolumeML;
- UFVolumeL /= MILLILITERS_PER_LITER;
-
- // Upper and lower range values are from #defines
- quint32 dialVolumeML = _treatmentParams.dialysateFlowRateMLPM * txDurMins;
- bool isMinTxTimeValid = (txDurMins >= MIN_TX_TIME_MINS ? true : false);
- bool isTxTimeValid = (txDurMins <= MAX_TX_TIME_MINS ? true : false);
- bool isMinUFVolValid = ((UFVolumeL >= MIN_UF_VOL_L) || (UFVolumeL <= 0.0) ? true : false); // TODO fix the UF Vol
- bool isUFVolValid = (UFVolumeL <= MAX_UF_VOL_L ? true : false);
-
- qDebug() << "Test of tx" << _treatmentVars.prescribedUFRate << elapsedTimeMins << UFVolumeL << isUFVolValid << dialVolumeML;
-
- // NOTE: In firmware it is checked that the current dialysate volume is <= 15000 mL before allowing the user
- // to change the treatment time but per marketings request that has been disabled
- if (isMinTxTimeValid && isTxTimeValid && isMinUFVolValid && isUFVolValid /*&& (dialVolumeML <= MAX_DIALYSATE_VOLUME_ML)*/) {
- _treatmentVars.prescribedTreatmentTimeS = txDurMins * SECONDS_PER_MINUTE;
- // NOTE: in drydemo right now we readjust the UF rate based the on the elapsed time and the new requested time
- // in firmware the UF volume is changed and it is reuqested not to changed the UF volume
- _treatmentVars.prescribedUFRate = (_treatmentVars.prescribedMaxUFVolML - _treatmentVars.refUFVolumeML)
- / (txDurMins - elapsedTimeMins);
- //_treatmentVars.prescribedMaxUFVolML = UFVolumeL * MILLILITERS_PER_LITER;
- accept = ACCEPT_VALUE;
- qDebug() << "New tx time" << txDurMins * SECONDS_PER_MINUTE << _treatmentVars.prescribedUFRate;
- }
- }
- else {
- // If the requested treatment is out of acceptable range, just update the prescribed
- // treatment time to newly requested time.
- // Set the elapsed time prescribed treatment time - 1. This to make sure that when
- // elapsed time is incremented in the next cylce the prescribed - elapsed time = 0
- // So the remaining time is zero and therefore the treatment time is over and the screen
- // tranistions to treatment end per marketing request.
- // NOTE: this only works if the prescibed time is greater than 2 hours so the minimum treatment time in the range
- // is greater than 60 minutes.
- accept = ACCEPT_VALUE;
- _treatmentVars.prescribedTreatmentTimeS = txDurMins * SECONDS_PER_MINUTE;
- _treatmentVars.treatmentElapsedTimeS = _treatmentVars.prescribedTreatmentTimeS - 1;
- }
-
- prepareTreatmentTimeChangeResponse(accept,
- _treatmentVars.prescribedTreatmentTimeS,
- _treatmentVars.prescribedMaxUFVolML);
-}
-
-qint32 StateController::handleMsgBBPayload(const QVariant &payload)
-{
- qint32 cmd = CMD_NONE;
- qint32 IDIndex = 0;
- Types::U32 param;
- GetValue(payload.toByteArray(), IDIndex, param);
-
- if (param.value == UI_MSG_BB_PAYLOAD_ID) {
- IDIndex = UI_MSG_BB_STATUS_INDEX;
- GetValue(payload.toByteArray(), IDIndex, param);
- cmd = param.value;
- }
-
- prepareMsgBA(cmd, CONFIRM_CMD_ACCEPT_CLOSE);
-
- return cmd;
-}
-
-void StateController::prepareMsgBA(quint32 cmd, quint32 acceptType)
-{
- QVariantList msg;
- msg.append(static_cast(ID_HD_UI_CONFIRM_RQST));
- msg.append(Can_Id::eChlid_HD_UI);
- msg.append(cmd);
- msg.append(acceptType);
- msg.append(0);
- _isSendListReady = false;
- _sendMessages.append(msg);
- _isSendListReady = true;
-}
-
-bool StateController::hasPreTxTimerElapsed(Can::Message_ID_Enum msgID, Can::Can_Id canChan,
- quint32 &timerCountDownS, quint32 defaultTimeoutS)
-{
- bool hasTimeElapsed = false;
-
- QVariantList msg;
- msg.append(static_cast(msgID));
- msg.append(canChan);
-
- if ((_treatmentVars.broadcastIntervalCount % NUM_OF_COUNTS_TIMER_BC_EMIT == 0) &&
- (timerCountDownS != 0)) {
- timerCountDownS--;
-
- msg.append(defaultTimeoutS);
- msg.append(timerCountDownS);
- _isBroadcastListReady = false;
- _broadcastMessages.append(msg);
- _isBroadcastListReady = true;
- }
-
- if (timerCountDownS == defaultTimeoutS) {
- // Send a start broadcast to start from a known value
- msg.append(defaultTimeoutS);
- msg.append(timerCountDownS);
- _isBroadcastListReady = false;
- _broadcastMessages.append(msg);
- _isBroadcastListReady = true;
- }
-
- if (timerCountDownS == 0) {
- hasTimeElapsed = true;
- }
-
- return hasTimeElapsed;
-}
-
-void StateController::handleUltrafiltrationValidation(const QVariant &payload)
-{
- // From validateAndSetUFVolume function in HD
- quint32 accept = REJECT_VALUE;
- qint32 ufIndex = 0;
- Types::F32 param;
- GetValue(payload.toByteArray(), ufIndex, param);
-
- float ufVolL = param.value / MILLILITERS_PER_LITER;
-
- if ((ufVolL >= MIN_UF_VOL_L) && (ufVolL <= MAX_UF_VOL_L)) {
- accept = ACCEPT_VALUE;
- _treatmentVars.txParamsUFVolL = ufVolL;
- }
-
- if (accept == ACCEPT_VALUE) {
- /*
- * Before checking for the UF rate, treatment duration is needed.
- * The user might select UF from dry demo without going to treatment params
- * So setTreatmentParams is called first. If the treatment params have been set already
- * then nothing is updated we can continue with verifying the UF
- */
- QVariant emptyList;
- setTreatmentParams(false, emptyList);
-
- if (_treatmentParams.txDurationMins > 0) {
- float ufRate = param.value / _treatmentParams.txDurationMins;
- qDebug() << "UF rate" << ufRate;
- if ((ufRate > MAX_UF_RATE_MLPM) || (ufRate < MIN_UF_RATE_MLPM)) {
- accept = REJECT_VALUE;
- }
- }
- else
- {
- accept = REJECT_VALUE;
- }
- }
-
- QVariantList msg;
- msg.append(static_cast(ID_HD_SET_UF_VOLUME_RESP));
- msg.append(Can_Id::eChlid_HD_UI);
- msg.append(accept);
- msg.append(0);
- msg.append(_treatmentVars.txParamsUFVolL * MILLILITERS_PER_LITER);
- _isSendListReady = false;
- _sendMessages.append(msg);
- _isSendListReady = true;
-}
-
-void StateController::handleRinsebackSubstate(const QVariant &payload, float &accumVolML,
- quint32 &txState, quint32 &rbState, quint32 &rbFlowMLPM)
-{
- qint32 cmdIndex = 0;
- Types::U32 param;
- GetValue(payload.toByteArray(), cmdIndex, param);
-
- switch (param.value)
- {
- case RINSEBACK_START_RB:
- case RINSEBACK_RESUME_RB:
- rbState = RINSEBACK_RUN_STATE;
- break;
-
- case RINSEBACK_ACCEL_FLOW:
- if (rbFlowMLPM + RINSEBACK_ADJ_FLOW_RATE_MLPM <= RINSEBACK_MAX_RLOW_RATE_MLPM) {
- if (rbState == RINSEBACK_RUN_STATE) {
- rbFlowMLPM += RINSEBACK_ADJ_FLOW_RATE_MLPM;
- }
- }
- break;
-
- case RINSEABCK_DECEL_FLOW:
- if (rbFlowMLPM - RINSEBACK_ADJ_FLOW_RATE_MLPM >= RINSEBACK_MIN_FLOW_RATE_MLPM) {
- if (rbState == RINSEBACK_RUN_STATE) {
- rbFlowMLPM -= RINSEBACK_ADJ_FLOW_RATE_MLPM;
- }
- }
- break;
-
- case RINSEBACK_PAUSE_RB:
- rbState = RINSEBACK_PAUSE_STATE;
- break;
-
- case RINSEBACK_END_RB:
- rbState = RINSEBACK_STOP_STATE;
- break;
-
- case RINSEBACK_SALINE_BOLUS:
- // TODO fill up
- break;
-
- case RINSEBACK_END_TX:
- // When end treatment is requested, signal 999 is sent back from
- // here. This is just a drydemo code to get back to the treatment
- // end state function. Then the treatment end state submits an event
- // to transition to post treatment
- rbState = RINSEBACK_END_TREATMENT_SIGNAL;
- break;
-
- case RINSEBACK_BACK:
- // When the back button is pressed reset volume.
- // TODO do we reset the rinseback volume when we hit the End button?
- // If the rinseback state is 0 the back is to change to previous tx substate
- // If the rinseback state is not 0, the rinseback state is decremented
- accumVolML = 0.0;
- if (rbState != RINSEBACK_STOP_INIT_STATE) {
- rbState--;
- }
- else {
- txState = TX_END_SUB_STATE;
- }
- break;
- }
-
- QVariantList msg;
- msg.append(static_cast(ID_HD_RINSEBACK_CMD_RESP));
- msg.append(Can_Id::eChlid_HD_UI);
- msg.append(ACCEPT_VALUE);
- msg.append(0);
- _isSendListReady = false;
- _sendMessages.append(msg);
- _isSendListReady = true;
-}
-
-bool StateController::isTreatmenStartRequested(const QVariant &payload)
-{
- bool status = false;
- qint32 IDIndex = 0;
- Types::U32 param;
- GetValue(payload.toByteArray(), IDIndex, param);
-
- if (param.value == START_TX_FROM_MSG_38) {
- status = true;
- }
-
- return status;
-}
-
-void StateController::handleAlarmStatus(bool trigger, User_Command_ID cmd = CMD_HIGH_PRIO_ALARM)
-{
- enum Alarm_Priority {
- NONE = 0,
- LOW = 1,
- MEDIUM = 2,
- HIGH = 3
- };
-
- enum Alarm_ID {
- ALARM_ID_HD_ACTIVE_RESERVOIR_RECIRCULATION_OUT_OF_RANGE = 68,
- ALARM_ID_HD_ARTERIAL_PRESSURE_SELF_TEST_FAILURE = 70,
- ALARM_ID_HD_VENOUS_PRESSURE_SELF_TEST_FAILURE = 71
- };
-
- quint32 alarmID = 0;
- quint32 alarmPriority = static_cast(NONE);
- quint16 alarmFlags = 0x40FB; // This is the bit status that only has the ok button enabled
-
- QVariantList msg;
- msg.append(static_cast(ID_HD_ALARM_STATUS_BC));
- msg.append(Can_Id::eChlid_HD_Alarm);
-
- if (trigger) {
- if (cmd == CMD_HIGH_PRIO_ALARM) {
- alarmPriority = static_cast(HIGH);
- alarmID = static_cast(ALARM_ID_HD_VENOUS_PRESSURE_SELF_TEST_FAILURE);
- }
- else if (cmd == CMD_MEDIUM_PRIO_ALARM) {
- alarmPriority = static_cast(MEDIUM);
- alarmID = static_cast(ALARM_ID_HD_ACTIVE_RESERVOIR_RECIRCULATION_OUT_OF_RANGE);
- }
- else if (cmd == CMD_LOW_PRIO_ALARM) {
- alarmPriority = static_cast(LOW);
- alarmID = static_cast(ALARM_ID_HD_ARTERIAL_PRESSURE_SELF_TEST_FAILURE);
- }
- }
-
- msg.append(alarmPriority);
- msg.append(alarmID);
- msg.append(0);
- msg.append(0);
- msg.append(alarmFlags);
-
- _isSendListReady = false;
- _sendMessages.append(msg);
- _isSendListReady = true;
-}
-
-void StateController::generateOcclusionPresureValues(bool initArray, quint32 stableCount)
-{
- static const quint32 arraySize = MILLISECONDS_PER_SECOND/QOBJECT_TIMER_TIMEOUT_MS;
- static float artRandArrayGenMMHG[arraySize];
- static float artRunningSumMMHG;
- static quint32 artArrayIndex;
- static quint32 artReadingCount;
-
- static float venRandArrayGenMMHG[arraySize];
- static float venRunningSumMMHG;
- static quint32 venArrayIndex;
- static quint32 venReadingCount;
-
- if (initArray) {
- artRunningSumMMHG = 0.0;
- artArrayIndex = 0;
- artReadingCount = 0;
- for (quint32 i = 0; i < arraySize; i++) {
- artRandArrayGenMMHG[i] = 0.0;
- }
-
- venRunningSumMMHG = 0;
- venArrayIndex = 0;
- venReadingCount = 0;
- for (quint32 i = 0; i < arraySize; i++) {
- venRandArrayGenMMHG[i] = 0.0;
- }
- }
-
- if (stableCount >= OCCLUSION_STABLE_TIME_COUNT) {
- qint32 artTxParamsMMHG = _treatmentParams.areterialPresLimitWindowMMHG / 2;
- _treatmentVars.minArtPresLimitMMHG = _treatmentVars.curArtPresMMHG - artTxParamsMMHG;
- _treatmentVars.minArtPresLimitMMHG = qMax(_treatmentVars.minArtPresLimitMMHG, static_cast(MIN_ART_PRES_LIMIT_MMHG));
-
- _treatmentVars.maxArtPresLimitMMHG = _treatmentVars.curArtPresMMHG + artTxParamsMMHG;
- _treatmentVars.maxArtPresLimitMMHG = qMin(_treatmentVars.maxArtPresLimitMMHG, static_cast(MAX_ART_PRES_LIMIT_MMHG));
- }
-
- float artRandomMMHG = _randNumGenerator.generateDouble() *
- (_treatmentVars.maxArtPresLimitMMHG - _treatmentVars.minArtPresLimitMMHG) + _treatmentVars.minArtPresLimitMMHG;
-
- if (artReadingCount >= arraySize) {
- artRunningSumMMHG -= artRandArrayGenMMHG[artArrayIndex];
- }
-
- artRandArrayGenMMHG[artArrayIndex] = artRandomMMHG;
- artRunningSumMMHG += artRandomMMHG;
- artArrayIndex = (artArrayIndex >= arraySize - 1 ? 0 : artArrayIndex + 1);
- artReadingCount = (artReadingCount >= arraySize + 1 ? arraySize + 1 : artReadingCount + 1);
- _treatmentVars.curArtPresMMHG = artRunningSumMMHG / artReadingCount;
-
- if (stableCount >= OCCLUSION_STABLE_TIME_COUNT) {
- qint32 venMinOffsetMMHG = _treatmentParams.venousPresLimitAsymWindowMMHG;
- qint32 venMaxOffsetMMHG = _treatmentParams.venousPresLimitWindowMMHG - venMinOffsetMMHG;
- _treatmentVars.minVenPresLimitMMHG = _treatmentVars.curVenPresMMHG - venMinOffsetMMHG;
- _treatmentVars.minVenPresLimitMMHG = qMax(_treatmentVars.minVenPresLimitMMHG, static_cast(MIN_VEN_PRES_LIMIT_MMHG));
-
- _treatmentVars.maxVenPresLimitMMHG = _treatmentVars.curVenPresMMHG + venMaxOffsetMMHG;
- _treatmentVars.maxVenPresLimitMMHG = qMin(_treatmentVars.maxVenPresLimitMMHG, static_cast(MAX_VEN_PRES_LIMIT_MMHG));
- }
-
- float venRandomMMHG = _randNumGenerator.generateDouble() *
- (_treatmentVars.maxVenPresLimitMMHG - _treatmentVars.minVenPresLimitMMHG) + _treatmentVars.minVenPresLimitMMHG;
-
- if (venReadingCount >= arraySize) {
- venRunningSumMMHG -= venRandArrayGenMMHG[artArrayIndex];
- }
-
- venRandArrayGenMMHG[artArrayIndex] = venRandomMMHG;
- venRunningSumMMHG += venRandomMMHG;
- venArrayIndex = (venArrayIndex >= arraySize - 1 ? 0 : venArrayIndex + 1);
- venReadingCount = (venReadingCount >= arraySize + 1 ? arraySize + 1 : venReadingCount + 1);
- _treatmentVars.curVenPresMMHG = venRunningSumMMHG / venReadingCount;
-}
-
-void StateController::handlePressureChangeReqeust(const QVariant &payload)
-{
- QVariantList msg;
- msg.append(static_cast(ID_HD_PRESSURE_LIMITS_CHANGE_RESP));
- msg.append(Can_Id::eChlid_HD_UI);
- msg.append(ACCEPT_VALUE);
- msg.append(0);
-
- qint32 presIndex = 0;
- Types::S32 pressure;
- GetValue(payload.toByteArray(), presIndex, pressure);
- _treatmentParams.areterialPresLimitWindowMMHG = pressure.value;
- msg.append(pressure.value);
- GetValue(payload.toByteArray(), presIndex, pressure);
- _treatmentParams.venousPresLimitWindowMMHG = pressure.value;
- msg.append(pressure.value);
- GetValue(payload.toByteArray(), presIndex, pressure);
- _treatmentParams.venousPresLimitAsymWindowMMHG = pressure.value;
- msg.append(pressure.value);
-
- _isSendListReady = false;
- _sendMessages.append(msg);
- _isSendListReady = true;
-}
-
-void StateController::handleBloodDialRateChangeRequest(const QVariant &payload)
-{
- quint32 accept = REJECT_VALUE;
- qint32 presIndex = 0;
- Types::U32 bloodFlowMLPM;
- Types::U32 dialFlowMLPM;
- GetValue(payload.toByteArray(), presIndex, bloodFlowMLPM);
- GetValue(payload.toByteArray(), presIndex, dialFlowMLPM);
-
- float diaVolSoFarML = _treatmentParams.dialysateFlowRateMLPM * ((_treatmentVars.treatmentElapsedTimeS / QOBJECT_TIMER_TIMEOUT_MS ) / SECONDS_PER_MINUTE);
- float dialVolNowToEndML = dialFlowMLPM.value* (_treatmentVars.remainingTreatmentTimeS / SECONDS_PER_MINUTE);
- float dialVolML = diaVolSoFarML + dialVolNowToEndML;
-
- if ((bloodFlowMLPM.value >= MIN_BLOOD_RATE_MLPM) && (bloodFlowMLPM.value <= MAX_BLOOD_RATE_MLPM) &&
- (dialFlowMLPM.value >= MIN_DIAL_RATE_MLPM) && (dialFlowMLPM.value <= MAX_DIAL_RATE_MLPM) &&
- (dialVolML <= MAX_DIALYSATE_VOLUME_ML )) {
-
- _treatmentParams.bloodFlowRateMLPM = bloodFlowMLPM.value;
- _treatmentParams.dialysateFlowRateMLPM = dialFlowMLPM.value;
- accept = ACCEPT_VALUE;
- }
-
- qDebug() << "Blood Dial values" << diaVolSoFarML << dialVolNowToEndML << dialVolML << accept;
-
- QVariantList msg;
- msg.append(static_cast(ID_USER_BLOOD_DIAL_RATE_CHANGE_RESP));
- msg.append(Can_Id::eChlid_HD_UI);
- msg.append(accept);
- msg.append(0);
- msg.append(_treatmentParams.bloodFlowRateMLPM);
- msg.append(_treatmentParams.dialysateFlowRateMLPM);
-
- _isSendListReady = false;
- _sendMessages.append(msg);
- _isSendListReady = true;
-}
-
-void StateController::handleTreatmentLogRequest()
-{
- QVariantList msg;
- msg.append(static_cast(ID_HD_TREATMENT_LOG_RESP));
- msg.append(Can_Id::eChlid_HD_UI);
-
- msg.append(ACCEPT_VALUE);
- msg.append(0);
-
- msg.append(_treatmentParams.bloodFlowRateMLPM);
- msg.append(_treatmentParams.dialysateFlowRateMLPM);
- msg.append(_treatmentParams.txDurationMins * SECONDS_PER_MINUTE);
- msg.append(_treatmentVars.treatmentElapsedTimeS);
-
- msg.append(_treatmentParams.acidConc);
- msg.append(_treatmentParams.bicarbConc);
- msg.append(static_cast(ACID_TYPES_1251_1_K));
- msg.append(static_cast(ACID_TYPES_CALCIUM));
- msg.append(static_cast(ACID_TYPES_BICARB));
- msg.append(static_cast(ACID_TYPES_SODIUM));
-
- msg.append(_treatmentParams.dialysateTemperatureC);
- msg.append(_treatmentParams.dialyzerType);
- msg.append(_treatmentVars.treatmentStarTimeEpoch);
- msg.append(_treatmentVars.treatmentEndTimeEpoch);
-
- msg.append(_treatmentParams.bloodFlowRateMLPM);
- msg.append(_treatmentParams.dialysateFlowRateMLPM);
- msg.append((static_cast(_treatmentParams.dialysateFlowRateMLPM) *
- _treatmentVars.treatmentElapsedTimeS) / (MILLILITERS_PER_LITER * SECONDS_PER_MINUTE));
- msg.append(_treatmentParams.dialysateTemperatureC);
-
- msg.append(_treatmentVars.txParamsUFVolL);
- msg.append(_treatmentVars.txParamsUFVolL);
- msg.append(_treatmentVars.txParamsUFVolL);
- msg.append((_treatmentVars.txParamsUFVolL * MILLILITERS_PER_LITER * SECONDS_PER_MINUTE) / _treatmentParams.txDurationMins);
- msg.append((_treatmentVars.txParamsUFVolL * MILLILITERS_PER_LITER * SECONDS_PER_MINUTE) / _treatmentParams.txDurationMins);
- msg.append((_treatmentVars.txParamsUFVolL * MILLILITERS_PER_LITER * SECONDS_PER_MINUTE) / _treatmentParams.txDurationMins);
-
- msg.append(_treatmentVars.cumSalineVolML);
- msg.append(_treatmentParams.heparinBolusVolML);
- msg.append(_treatmentParams.heparinDispenseRateMLHR);
- msg.append(_treatmentParams.heparinPreStopMin);
- msg.append(_treatmentVars.cumHeparinDisVolML);
- msg.append(_treatmentParams.heparinType);
-
- msg.append(_treatmentVars.curArtPresMMHG);
- msg.append(_treatmentVars.curVenPresMMHG);
-
- msg.append(static_cast(DEVICE_ID));
- msg.append(static_cast(PASS_RESULT));
-
- _isSendListReady = false;
- _sendMessages.append(msg);
- _isSendListReady = true;
-}
-
-void StateController::handleHeparinStatus(quint32 &heparinSubState)
-{
- enum Heparin_Cmds {
- HEPARIN_CMD_PAUSE = 0,
- HEPARIN_CMD_RESUME = 1,
- // This is an enum in firmware but this is the default here to make sure
- // the heparin button is not turned off by by sending the off state
- // if heparin is selected
- HEPARIN_CMD_NOT_CALLED = 2,
- };
-
- static Heparin_Cmds hepCmd = HEPARIN_CMD_NOT_CALLED;
-
- heparinSubState = HEPARIN_OFF_SUBSTATE;
-
- if (!_treatmentRcvdMessages[ID_UI_HEPARIN_PAUSE_RESUME_RQST].isNull()) {
- quint32 accept = ACCEPT_VALUE;
- qint32 hepIndex = 0;
- Types::U32 cmd;
- GetValue(_treatmentRcvdMessages[ID_UI_HEPARIN_PAUSE_RESUME_RQST].toByteArray(), hepIndex, cmd);
-
- hepCmd = static_cast(cmd.value);
- _treatmentRcvdMessages[ID_UI_HEPARIN_PAUSE_RESUME_RQST].clear();
-
- QVariantList resp;
- resp.append(static_cast(ID_HD_HEPARIN_PAUSE_RESUME_RESP));
- resp.append(Can_Id::eChlid_HD_UI);
- resp.append(accept);
- resp.append(0);
- _isSendListReady = false;
- _sendMessages.append(resp);
- _isSendListReady = true;
- }
-
- if (hepCmd == HEPARIN_CMD_PAUSE) {
- heparinSubState = HEPARIN_PAUSED_SUBSTATE;
- return;
- }
-
- if (_treatmentParams.heparinDispenseRateMLHR != 0 && _treatmentParams.heparinBolusVolML != 0) {
- if (_treatmentVars.cumHeparinDisVolML < _treatmentParams.heparinBolusVolML) {
- heparinSubState = HEPARIN_DISPENSING_SUBSTATE;
- _treatmentVars.cumHeparinDisVolML += (_treatmentParams.heparinDispenseRateMLHR * QOBJECT_TIMER_TIMEOUT_MS) / (MINUTES_PER_HOUR * SECONDS_PER_MINUTE * MILLISECONDS_PER_SECOND);
- }
- else {
- heparinSubState = HEPARIN_COMPLETED_SUBSTATE;
- _treatmentVars.cumHeparinDisVolML = _treatmentParams.heparinBolusVolML;
- }
- }
-}
-
// ----------- State transition methods ---------------- //
void StateController::onIdleStateChange(bool active)
{
static State_Status status = STATE_ON_ENTRY;
auto inEntry = [=](){
- _treatmentVars.broadcastIntervalCount = 0;
- _hasUserConfirmedToProceed = false;
- prepareHDModeTransitionBroadcastData(MODE_STAN, 0);
-
// Send the pre treatment states to reset so it starts from the right state
- QList preTxStates({0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0});
- prepareStatesBroadcastData(ID_PRE_TX_STATES_BC, preTxStates);
+ //QList preTxStates({0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0});
+ //prepareStatesBroadcastData(ID_PRE_TX_STATES_BC, preTxStates);
- // Send the treatment params in Idle too. This is to make sure if the user
- // jumped to the Ultrafiltration page the min and max UF volumes are set prior to it.
- QVariant emptyVar;
- setTreatmentParams(false, emptyVar);
- prepareTreatmentParamsRangesBroadcastData(true); // In standby reset the treatment values
+ //// Send the treatment params in Idle too. This is to make sure if the user
+ //// jumped to the Ultrafiltration page the min and max UF volumes are set prior to it.
+ //QVariant emptyVar;
+ //setTreatmentParams(false, emptyVar);
+ //prepareTreatmentParamsRangesBroadcastData(true); // In standby reset the treatment values
- // 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);
+ prepareTDOpModeTransitionData(MODE_STAN, 0);
- _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";
+ //// 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() << "Idle on entry";
};
auto inAction = [=](){
- _treatmentVars.broadcastIntervalCount++;
-
- // Keep sending the default status once a second
- if (_treatmentVars.broadcastIntervalCount % NUM_OF_COUNTS_TIMER_BC_EMIT == 0) {
- if (_hasUserConfirmedToProceed) {
- prepareHDModeTransitionBroadcastData(MODE_SERV, 0);
- }
- else {
- prepareHDModeTransitionBroadcastData(MODE_STAN, 0);
- }
- // Send the pre treatment states to reset so it starts from the right state
- QList preTxStates({0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0});
- prepareStatesBroadcastData(ID_PRE_TX_STATES_BC, preTxStates);
-
- // Send the treatment params in Idle too. This is to make sure if the user
- // jumped to the Ultrafiltration page the min and max UF volumes are set prior to it.
- QVariant emptyVar;
- setTreatmentParams(false, emptyVar);
- prepareTreatmentParamsRangesBroadcastData(true); // In standby reset the treatment values
- }
-
- bool isMsgBBRequested = false;
-
- if (!_treatmentRcvdMessages[ID_UI_CONFIRM_RESP].isNull()) {
- qint32 cmd = handleMsgBBPayload(_treatmentRcvdMessages[ID_UI_CONFIRM_RESP]);
- User_Command_ID cmdIDEnum = static_cast(cmd);
- handleAlarmStatus(false, cmdIDEnum);
-
- _treatmentRcvdMessages[ID_UI_CONFIRM_RESP].clear();
- if ((cmdIDEnum > CMD_STAND_BY) && (cmdIDEnum <= CMD_DISINFECTION)) {
- qDebug() << "Submit event" << _transitionEventsFromIdle[cmdIDEnum];
- _dryDemo.submitEvent(_transitionEventsFromIdle[cmdIDEnum]);
- isMsgBBRequested = true;
- status = STATE_ON_EXIT;
- }
- else if ((cmdIDEnum >= CMD_HIGH_PRIO_ALARM) && (cmdIDEnum < NUM_OF_USER_CMDS)) {
- handleAlarmStatus(true, cmdIDEnum);
- }
-
- qDebug() << "Idle in action" << cmdIDEnum;
- }
-
- if (!_treatmentRcvdMessages[ID_UI_ALARM_USER_ACTION_RQST].isNull()) {
- // If the clear command was received from the user, clear the alarm
- handleAlarmStatus(false, CMD_HIGH_PRIO_ALARM);
- _treatmentRcvdMessages[ID_UI_ALARM_USER_ACTION_RQST].clear();
- }
-
- // If the use has requested message 0xBB then ignore create treatment button
- if ((!_treatmentRcvdMessages[ID_UI_RQST_TX].isNull()) && (!isMsgBBRequested)) {
- if (isTreatmenStartRequested(_treatmentRcvdMessages[ID_UI_RQST_TX])) {
- // clear the alarms in case they have been triggered
- handleAlarmStatus(false, CMD_HIGH_PRIO_ALARM);
- _dryDemo.submitEvent(_transitionEventsFromIdle[CMD_TX_PARAMS]);
- status = STATE_ON_EXIT;
- qDebug() << "Idle starting Tx";
- }
- _treatmentRcvdMessages[ID_UI_RQST_TX].clear();
- }
-
- if (!_treatmentRcvdMessages[ID_UI_SERVICE_MODE_RQST].isNull()) {
- _hasUserConfirmedToProceed = true;
- qDebug() << "Service mode requested" << _treatmentRcvdMessages[ID_UI_SERVICE_MODE_RQST];
- _treatmentRcvdMessages[ID_UI_SERVICE_MODE_RQST].clear();
- }
+ status = STATE_ON_ACTION;
};
auto inExit = [=](){
qDebug() << "Idle in exit";
- _hasUserConfirmedToProceed = false;
status = STATE_ON_ENTRY;
};
@@ -1176,978 +207,17 @@
}
}
-void StateController::onTreatmentParamsStateChange(bool active)
-{
- static State_Status status = STATE_ON_ENTRY;
- auto inEntry = [=](){
- prepareHDModeTransitionBroadcastData(MODE_TPAR, 0);
-
- qDebug() << "In treatment params on entry";
- status = STATE_ON_ACTION;
- _treatmentParams.hasTxParamsBeenInitialized = false;
- _hasUserConfirmedToProceed = false;
- };
-
- auto inAction = [=]() {
- if (!_treatmentRcvdMessages[ID_UI_TX_PARAMS_RQST].isNull()) {
- setTreatmentParams(true, _treatmentRcvdMessages[ID_UI_TX_PARAMS_RQST]);
- _treatmentRcvdMessages[ID_UI_TX_PARAMS_RQST].clear();
- }
-
- if (_treatmentParams.hasTxParamsBeenInitialized && _hasUserConfirmedToProceed) {
- status = STATE_ON_EXIT;
- }
-
- if (!_treatmentRcvdMessages[ID_UI_CONFIRM_TX_PARAMS].isNull()) {
- status = STATE_ON_ENTRY;
-
- qint32 index = 0;
- Types::U32 u32Var;
- GetValue(_treatmentRcvdMessages[ID_UI_CONFIRM_TX_PARAMS].toByteArray(), index, u32Var);
-
- if (u32Var.value == ACCEPT_VALUE) {
- status = STATE_ON_EXIT;
- qDebug() << "Tx params approved";
- }
- _treatmentRcvdMessages[ID_UI_CONFIRM_TX_PARAMS].clear();
- }
-
- if (!_treatmentRcvdMessages[ID_UI_RQST_TX].isNull()) {
- // If the user wants to go back in treatment params go back.
- if (!isTreatmenStartRequested(_treatmentRcvdMessages[ID_UI_RQST_TX])) {
- status = STATE_ON_ENTRY;
- _dryDemo.submitEvent("Transition_back_2_idle");
- qDebug() << "Going back to Idle";
- }
- _treatmentRcvdMessages[ID_UI_RQST_TX].clear();
- }
-
- if (!_treatmentRcvdMessages[ID_UI_CONFIRM_RESP].isNull()) {
- _dryDemo.submitEvent("Transition_back_2_idle");
- status = STATE_ON_ENTRY;
- }
- };
-
- auto inExit = [=](){
- qDebug() << "In treatment params on exit";
- status = STATE_ON_ENTRY;
- _dryDemo.submitEvent("T_2_Water_Sample");
- };
-
- 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::onWaterSampleStateChange(bool active)
+void StateController::prepareTDOpModeTransitionData(Can::TD_OP_MODE mode, quint32 subMode)
{
- static State_Status status = STATE_ON_ENTRY;
- static quint32 timerCountDownS = DEFAULT_TIMEOUT_S;
-
- auto inEntry = [=](){
- qDebug() << "Water sample on entry";
- QList preTxStates({0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0});
- prepareHDModeTransitionBroadcastData(MODE_PRET, 0);
- prepareStatesBroadcastData(ID_PRE_TX_STATES_BC, preTxStates);
- status = STATE_ON_ACTION;
- timerCountDownS = DEFAULT_TIMEOUT_S;
- _treatmentVars.broadcastIntervalCount = 0;
- };
-
- auto inAction = [=]() {
- _treatmentVars.broadcastIntervalCount++;
-
- bool hasTimeElapsed = hasPreTxTimerElapsed(ID_FILTER_FLUSH_TIME_BC, eChlid_DG_Sync,
- timerCountDownS, DEFAULT_TIMEOUT_S);
-
- if (hasTimeElapsed) {
-
- QList preTxStates({0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0});
- quint32 state = 1;
- quint32 stateIndex = 1;
- preTxStates[stateIndex] = state;
- prepareStatesBroadcastData(ID_PRE_TX_STATES_BC, preTxStates);
- }
-
- if (!_treatmentRcvdMessages[ID_UI_CONFIRM_RESP].isNull()) {
- status = STATE_ON_ENTRY;
- _dryDemo.submitEvent("Transition_back_2_idle");
- }
-
- if (hasTimeElapsed) {
- if (!_treatmentRcvdMessages[ID_SAMPLE_WATER_RESULT].isNull()) {
- qint32 resultIndex = 0;
- Types::U32 param;
- GetValue(_treatmentRcvdMessages[ID_SAMPLE_WATER_RESULT].toByteArray(), resultIndex, param);
-
- if (param.value == ACCEPT_VALUE) {
- status = STATE_ON_EXIT;
- }
- else {
- status = STATE_ON_ENTRY;
- _dryDemo.submitEvent("Transition_back_2_idle");
- }
- _treatmentRcvdMessages[ID_SAMPLE_WATER_RESULT].clear();
- }
- }
- };
-
- auto inExit = [=](){
- qDebug() << "In treatment params on exit";
- status = STATE_ON_ENTRY;
- _dryDemo.submitEvent("T_2_Consumables");
- };
-
- 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;
- }
+ 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::onConsumablesStateChange(bool active)
-{
- static State_Status status = STATE_ON_ENTRY;
- static quint32 state = 0;
- static quint32 stateIndex = 2;
- static quint32 stateBCInt = 3;
- auto inEntry = [=](){
- qDebug() << "Consumables on entry";
- state = 0;
- QList preTxStates({1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0});
- preTxStates[stateIndex] = state;
- prepareHDModeTransitionBroadcastData(MODE_PRET, 0);
- prepareStatesBroadcastData(ID_PRE_TX_STATES_BC, preTxStates);
- status = STATE_ON_ACTION;
- _hasUserConfirmedToProceed = false;
- _treatmentVars.broadcastIntervalCount = 0;
- };
-
- auto inAction = [=]() {
- _treatmentVars.broadcastIntervalCount++;
-
- if (_hasUserConfirmedToProceed) {
- if (state < 4 ) { // TODO #define for this
- // Added broadcast delay to slow down the substate transitions
- if (_treatmentVars.broadcastIntervalCount % stateBCInt == 0) {
- state++;
- QList preTxStates({1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0});
- preTxStates[stateIndex] = state;
- prepareStatesBroadcastData(ID_PRE_TX_STATES_BC, preTxStates);
- }
- }
- else {
- status = STATE_ON_EXIT;
- }
- }
-
- if (!_treatmentRcvdMessages[ID_UI_CONFIRM_RESP].isNull()) {
- status = STATE_ON_ENTRY;
- _dryDemo.submitEvent("Transition_back_2_idle");
- }
- };
-
- auto inExit = [=](){
- qDebug() << "In consumables on exit";
- status = STATE_ON_ENTRY;
- _dryDemo.submitEvent("T_2_Disposables");
- };
-
- 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::onDisposablesStateChange(bool active)
-{
- static State_Status status = STATE_ON_ENTRY;
- static quint32 timerCountDownS = DEFAULT_TIMEOUT_S;
- static quint32 stateNum = 0;
- static quint32 stateIndex = 3;
-
- auto inEntry = [=](){
- qDebug() << "Disposables on entry";
- stateNum = 0;
- QList preTxStates({2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0});
- preTxStates[stateIndex] = stateNum;
- prepareHDModeTransitionBroadcastData(MODE_PRET, 0);
- prepareStatesBroadcastData(ID_PRE_TX_STATES_BC, preTxStates);
- status = STATE_ON_ACTION;
- _hasUserConfirmedToProceed = false;
- _treatmentVars.broadcastIntervalCount = 0;
- timerCountDownS = DEFAULT_TIMEOUT_S;
- };
-
- auto inAction = [=]() {
- _treatmentVars.broadcastIntervalCount++;
-
- bool hasTimeElapsed = hasPreTxTimerElapsed(ID_HD_SYS_SELF_TEST_TIME_BC, eChlid_HD_Sync,
- timerCountDownS, DEFAULT_TIMEOUT_S);
- if (stateNum < 12) {
- stateNum++;
- QList preTxStates({2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0});
- preTxStates[stateIndex] = stateNum;
- prepareStatesBroadcastData(ID_PRE_TX_STATES_BC, preTxStates);
- }
- else if (hasTimeElapsed) {
- QList preTxStates({3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0});
- prepareStatesBroadcastData(ID_PRE_TX_STATES_BC, preTxStates);
-
- if (_hasUserConfirmedToProceed) {
- qDebug() << "Disposables done";
- status = STATE_ON_EXIT;
- }
- }
-
- if (!_treatmentRcvdMessages[ID_UI_CONFIRM_RESP].isNull()) {
- status = STATE_ON_ENTRY;
- _dryDemo.submitEvent("Transition_back_2_idle");
- }
- };
-
- auto inExit = [=](){
- qDebug() << "In disposables on exit";
- status = STATE_ON_ENTRY;
- _dryDemo.submitEvent("T_2_System_Prime");
- };
-
- 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::onSystemPrimeStateChange(bool active)
-{
- static State_Status status = STATE_ON_ENTRY;
- static quint32 timerCountDownS = DEFAULT_TIMEOUT_S;
- static quint32 stateNum = 0;
- static quint32 stateIndex = 5;
- static bool hasPrimeCompleted = false;
- static quint32 numOfPrimeStates = 15;
- static quint32 primeStateBCInt = 0;
- static quint32 numOfPrimingStates = 12;
- static quint32 primingStateBCInt = 0;
-
- auto inEntry = [=](){
- qDebug() << "Prime on entry" << primeStateBCInt;
- stateNum = 0;
- stateIndex = 5;
- QList preTxStates({4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0});
- preTxStates[stateIndex] = stateNum;
- prepareHDModeTransitionBroadcastData(MODE_PRET, 0);
- prepareStatesBroadcastData(ID_PRE_TX_STATES_BC, preTxStates);
- status = STATE_ON_ACTION;
- _hasUserConfirmedToProceed = false;
- _treatmentVars.broadcastIntervalCount = 0;
- timerCountDownS = DEFAULT_TIMEOUT_S;
- hasPrimeCompleted = false;
-
- // For prime states
- float divide = ((float)DEFAULT_TIMEOUT_S / (float)numOfPrimeStates) * MILLISECONDS_PER_SECOND;
- quint32 ceilingValue = qCeil(divide);
- quint32 modValue = ceilingValue % QOBJECT_TIMER_TIMEOUT_MS;
- quint32 remaining = ceilingValue - modValue;
- primeStateBCInt = remaining / QOBJECT_TIMER_TIMEOUT_MS;
-
- // For priming states
- divide = ((float)DEFAULT_TIMEOUT_S / (float)numOfPrimingStates) * MILLISECONDS_PER_SECOND;
- ceilingValue = qCeil(divide);
- modValue = ceilingValue % QOBJECT_TIMER_TIMEOUT_MS;
- remaining = ceilingValue - modValue;
- primingStateBCInt = remaining / QOBJECT_TIMER_TIMEOUT_MS;
- };
-
- auto inAction = [=](){
- _treatmentVars.broadcastIntervalCount++;
-
- bool hasTimeElapsed = false;
-
- // First we do the prime section, then priming
- if (!hasPrimeCompleted) {
- hasTimeElapsed = hasPreTxTimerElapsed(ID_HD_DRY_SELF_TEST_TIME_BC, eChlid_HD_Sync,
- timerCountDownS, DEFAULT_TIMEOUT_S);
- if (stateNum < numOfPrimeStates) {
- if (_treatmentVars.broadcastIntervalCount % primeStateBCInt == 0) {
- stateNum++;
- QList preTxStates({4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0});
- preTxStates[stateIndex] = stateNum;
- prepareStatesBroadcastData(ID_PRE_TX_STATES_BC, preTxStates);
- }
- }
- else if (hasTimeElapsed) {
- hasPrimeCompleted = true;
- stateNum = 0;
- timerCountDownS = DEFAULT_TIMEOUT_S;
- QList preTxStates({5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0});
- prepareStatesBroadcastData(ID_PRE_TX_STATES_BC, preTxStates);
- }
- }
- else {
- hasTimeElapsed = hasPreTxTimerElapsed(ID_HD_PRIMING_TIME_BC, eChlid_HD_Sync,
- timerCountDownS, DEFAULT_TIMEOUT_S);
-
- if (stateNum < numOfPrimingStates) {
- if (_treatmentVars.broadcastIntervalCount % primingStateBCInt == 0) {
- stateNum++;
- stateIndex = 6;
- QList preTxStates({5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0});
- preTxStates[stateIndex] = stateNum;
- prepareStatesBroadcastData(ID_PRE_TX_STATES_BC, preTxStates);
- }
- }
- else if (hasTimeElapsed) {
- QList preTxStates({6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0});
- prepareStatesBroadcastData(ID_PRE_TX_STATES_BC, preTxStates);
-
- if (_hasUserConfirmedToProceed) {
- status = STATE_ON_EXIT;
- }
- }
- }
-
- if (!_treatmentRcvdMessages[ID_UI_CONFIRM_RESP].isNull()) {
- status = STATE_ON_ENTRY;
- _dryDemo.submitEvent("Transition_back_2_idle");
- }
- };
-
- auto inExit = [=](){
- qDebug() << "In disposables on exit";
- status = STATE_ON_ENTRY;
- _dryDemo.submitEvent("T_2_BP_HR");
- };
-
- 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::onBPHRStateChange(bool active)
-{
- static State_Status status = STATE_ON_ENTRY;
-
- auto inEntry = [=](){
- qDebug() << "BP/HR on entry";
- QList preTxStates({7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0});
- prepareHDModeTransitionBroadcastData(MODE_PRET, 0);
- prepareStatesBroadcastData(ID_PRE_TX_STATES_BC, preTxStates);
- status = STATE_ON_ACTION;
- _hasUserConfirmedToProceed = false;
- };
-
- auto inAction = [=](){
- if (!_treatmentRcvdMessages[ID_UI_CONFIRM_RESP].isNull()) {
- status = STATE_ON_ENTRY;
- _dryDemo.submitEvent("Transition_back_2_idle");
- }
-
- // In BP/HR page in the UI there is a confirm button but it is not checked by
- // the firmware so the dry demo state transitions to the UF page immediately because
- // there is nothing else is left to be done here
- status = STATE_ON_EXIT;
- };
-
- auto inExit = [=](){
- qDebug() << "In BP/HR on exit";
- status = STATE_ON_ENTRY;
- _dryDemo.submitEvent("T_2_Ultrafiltration");
- };
-
- 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::onUltrafiltrationStateChange(bool active)
-{
- static State_Status status = STATE_ON_ENTRY;
-
- auto inEntry = [=](){
- qDebug() << "UF on entry";
- prepareTreatmentParamsRangesBroadcastData(true); // Reset the treatment params values
- QList preTxStates({7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0});
- prepareHDModeTransitionBroadcastData(MODE_PRET, 0);
- prepareStatesBroadcastData(ID_PRE_TX_STATES_BC, preTxStates);
- status = STATE_ON_ACTION;
- _hasUserConfirmedToProceed = false;
- };
-
- auto inAction = [=](){
- if (!_treatmentRcvdMessages[ID_UI_SET_UF_VOLUME_RQST].isNull()) {
- handleUltrafiltrationValidation(_treatmentRcvdMessages[ID_UI_SET_UF_VOLUME_RQST]);
- _treatmentRcvdMessages[ID_UI_SET_UF_VOLUME_RQST].clear();
- status = STATE_ON_EXIT;
- }
-
- if (!_treatmentRcvdMessages[ID_UI_CONFIRM_RESP].isNull()) {
- status = STATE_ON_ENTRY;
- _dryDemo.submitEvent("Transition_back_2_idle");
- }
- };
-
- auto inExit = [=](){
- qDebug() << "In UF on exit";
- status = STATE_ON_ENTRY;
- _dryDemo.submitEvent("T_2_Connection");
- };
-
- 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::onConnectionStateChange(bool active)
-{
- static State_Status status = STATE_ON_ENTRY;
- static bool isConnectionDone = false;
-
- auto inEntry = [=](){
- qDebug() << "Connection on entry";
- QList preTxStates({7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0});
- prepareHDModeTransitionBroadcastData(MODE_PRET, 0);
- prepareStatesBroadcastData(ID_PRE_TX_STATES_BC, preTxStates);
- status = STATE_ON_ACTION;
- isConnectionDone = false;
- _hasUserConfirmedToProceed = false;
- };
-
- auto inAction = [=](){
- if(_hasUserConfirmedToProceed) {
- if (!isConnectionDone) {
- _hasUserConfirmedToProceed = false;
- isConnectionDone = true;
-
- QVariantList msg;
- msg.clear();
- msg.append(static_cast(ID_HD_PATINET_CONNECTION_CONF_RESP));
- msg.append(Can_Id::eChlid_HD_UI);
- msg.append(ACCEPT_VALUE);
- msg.append(0);
- _isSendListReady = false;
- _sendMessages.append(msg);
- _isSendListReady = true;
- }
- else {
- status = STATE_ON_EXIT;
- }
- }
-
- if (!_treatmentRcvdMessages[ID_UI_CONFIRM_RESP].isNull()) {
- status = STATE_ON_ENTRY;
- _dryDemo.submitEvent("Transition_back_2_idle");
- }
-
- if (!_treatmentRcvdMessages[ID_UI_SET_UF_VOLUME_RQST].isNull()) {
- // Firmware (and dry demo in this case) is not involved in going back and forth
- // in between connection page and the UF page. So once the user hits back from
- // connection, then the use has to hit confirm twice to be able to come back from
- // UF to connection
- _dryDemo.submitEvent("T_Con_2_UF");
- _treatmentRcvdMessages[ID_UI_SET_UF_VOLUME_RQST].clear();
- status = STATE_ON_ENTRY;
- }
- };
-
- auto inExit = [=](){
- qDebug() << "In Connection on exit";
- status = STATE_ON_ENTRY;
- _dryDemo.submitEvent("T_2_Start_Tx");
- };
-
- 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::onStartTreatmentStateChange(bool active)
-{
- static State_Status status = STATE_ON_ENTRY;
-
- auto inEntry = [=](){
- qDebug() << "Start Treatment active";
-
- prepareHDModeTransitionBroadcastData(MODE_TREA, 0);
-
- QList txStates({BLOOD_RPIME_SUB_STATE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0});
- prepareStatesBroadcastData(ID_HD_TX_STATES_BC, txStates);
-
- // Get the default treatment params in case the user did not start from
- // the treatment params
- QVariant emptyVariantList;
- setTreatmentParams(false, emptyVariantList);
- prepareOcclusionBroadcastData();
- status = STATE_ON_EXIT;
-
- qint64 currentTimeEpoch64 = QDateTime::currentSecsSinceEpoch();
- _treatmentVars.treatmentStarTimeEpoch = static_cast(currentTimeEpoch64);
- };
-
- auto inAction = [=](){};
- auto inExit = [=](){
- status = STATE_ON_ENTRY;
- _dryDemo.submitEvent("Start_Tx_2_Blood_Prime");
- };
-
- 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::onTreatmentBloodPrimeStateChange(bool active)
-{
- static State_Status status = STATE_ON_ENTRY;
- static float accumBloodVolML = 0.0;
- static quint32 curBloodFlowMLPM = BLOOD_PRIME_START_FLOW_MLPM;
-
- auto inEntry = [=](){
- qDebug() << "Blood prime entry";
-
- status = STATE_ON_ACTION;
- accumBloodVolML = 0.0;
- curBloodFlowMLPM = BLOOD_PRIME_START_FLOW_MLPM;
- _treatmentVars.broadcastIntervalCount = 0;
- prepareBloodFlowBroadcastData(curBloodFlowMLPM);
- prepareBloodPrimeBroadcastData(accumBloodVolML);
- generateOcclusionPresureValues(true, 0);
- };
-
- auto inAction = [=](){
- _treatmentVars.broadcastIntervalCount++;
-
- accumBloodVolML += (curBloodFlowMLPM * FLOW_INTEGRATOR);
-
- generateOcclusionPresureValues(false, 0);
-
- if (_treatmentVars.broadcastIntervalCount % NUM_OF_COUNTS_TIMER_BC_EMIT == 0) {
-
- prepareBloodFlowBroadcastData(curBloodFlowMLPM);
- 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;
- }
- }
- }
-
- if (accumBloodVolML > BLOOD_PRIME_VOLUME_ML) {
- // send blood prime value one last time
- prepareBloodPrimeBroadcastData(accumBloodVolML);
- status = STATE_ON_EXIT;
- }
-
- if (!_treatmentRcvdMessages[ID_UI_CONFIRM_RESP].isNull()) {
- status = STATE_ON_ENTRY;
- _dryDemo.submitEvent("Transition_back_2_idle");
- }
- };
-
- auto inExit = [=](){
- qDebug() << "Blood prime exit";
- status = STATE_ON_ENTRY;
- _dryDemo.submitEvent("Blood_Prime_2_Treatment");
- };
-
- 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::onTreatmentTreatmentStateChange(bool active)
-{
- static State_Status status = STATE_ON_ENTRY;
- static bool isSalineBolRqstd = false;
- static float cumSalineVolML = 0.0;
- static float bolSalineVolML = 0.0;
-
- auto inEntry = [=](){
- _treatmentVars.broadcastIntervalCount = 0;
- _treatmentVars.cumSalineVolML = 0;
- _treatmentVars.cumHeparinDisVolML = 0.0;
-
- _treatmentVars.prescribedTreatmentTimeS = _treatmentParams.txDurationMins * SECONDS_PER_MINUTE;
- _treatmentVars.treatmentElapsedTimeS = (_treatmentVars.prescribedTreatmentTimeS < DEF_TX_ELAPSED_TIME_S ? 0 : DEF_TX_ELAPSED_TIME_S);
- _treatmentVars.remainingTreatmentTimeS = _treatmentVars.prescribedTreatmentTimeS - _treatmentVars.treatmentElapsedTimeS;
-
- _treatmentVars.prescribedMaxUFVolML = _treatmentVars.txParamsUFVolL * MILLILITERS_PER_LITER;
- _treatmentVars.prescribedUFRate = _treatmentVars.prescribedMaxUFVolML / _treatmentParams.txDurationMins;
- _treatmentVars.refUFVolumeML = (_treatmentVars.treatmentElapsedTimeS / SECONDS_PER_MINUTE) * _treatmentVars.prescribedUFRate;
-
- _treatmentVars.cumHeparinDisVolML = (_treatmentParams.heparinDispenseRateMLHR / (MINUTES_PER_HOUR * SECONDS_PER_MINUTE)) * _treatmentVars.treatmentElapsedTimeS;
-
- qDebug() << "Treatment UF start vals" << _treatmentVars.txParamsUFVolL
- << _treatmentVars.prescribedUFRate
- << _treatmentVars.prescribedMaxUFVolML
- << _treatmentVars.refUFVolumeML;
-
- // Send the treatment time range response at the beginning of the start treatment
- // to update the UF ranges at the top right corner of the especially the max UF target
- // that is set
- prepareTreatmentTimeChangeResponse(ACCEPT_VALUE,
- _treatmentVars.prescribedTreatmentTimeS,
- _treatmentVars.prescribedMaxUFVolML);
-
- status = STATE_ON_ACTION;
- isSalineBolRqstd = false;
- cumSalineVolML = 0.0;
- bolSalineVolML = 0.0;
- };
-
- auto inAction = [=](){
- _treatmentVars.broadcastIntervalCount++;
- _treatmentVars.cumSalineVolML = static_cast(cumSalineVolML);
-
- quint32 ufSubState = UF_RUNNING_STATE;
- quint32 salineSubState = SALINE_BOLUS_IDLE_STATE;
- quint32 bloodFlowMLPM = _treatmentParams.bloodFlowRateMLPM;
- quint32 hepSubState = HEPARIN_OFF_SUBSTATE;
-
- if (!_treatmentRcvdMessages[ID_UI_SALINE_BOLUS_RQST].isNull()) {
- qint32 resultIndex = 0;
- Types::U32 param;
- GetValue(_treatmentRcvdMessages[ID_UI_SALINE_BOLUS_RQST].toByteArray(), resultIndex, param);
-
- isSalineBolRqstd = false;
- bolSalineVolML = 0.0;
- if ((param.value == SALINE_BOLUS_START_CMD) && (cumSalineVolML < SALINE_BOLUS_MAX_VOL_ML)) {
- isSalineBolRqstd = true;
- }
- _treatmentRcvdMessages[ID_UI_SALINE_BOLUS_RQST].clear();
- }
-
- float timeSinceLastCallMS = static_cast(QOBJECT_TIMER_TIMEOUT_MS) / static_cast(MILLISECONDS_PER_SECOND);
-
- if (!isSalineBolRqstd) {
- _treatmentVars.refUFVolumeML += (timeSinceLastCallMS / SECONDS_PER_MINUTE) * _treatmentVars.prescribedUFRate;
- _treatmentVars.measUFVolumeML = _treatmentVars.refUFVolumeML;
- }
- else {
- salineSubState = SALINE_BOLUS_IN_PROG_STATE;
- bloodFlowMLPM = SALINE_BOLUS_TARGET_FLOW_MLPM;
- bolSalineVolML += bloodFlowMLPM * (timeSinceLastCallMS / SECONDS_PER_MINUTE);
- cumSalineVolML += bloodFlowMLPM * (timeSinceLastCallMS / SECONDS_PER_MINUTE);
-
- if (bolSalineVolML >= _treatmentParams.salineBolusVolML) {
- salineSubState = SALINE_BOLUS_IDLE_STATE;
- bolSalineVolML = 0.0;
- isSalineBolRqstd = false;
- }
- else if (cumSalineVolML >= SALINE_BOLUS_MAX_VOL_ML) {
- salineSubState = SALINE_BOLUS_MAX_DELIVERED;
- bolSalineVolML = 0.0;
- isSalineBolRqstd = false;
- }
- }
-
- if (salineSubState == SALINE_BOLUS_IDLE_STATE) {
- handleHeparinStatus(hepSubState);
- }
-
- if (!_treatmentRcvdMessages[ID_USER_TX_TIME_CHANGES_RQST].isNull()) {
- handleTreatmentTimeChangeRequest(_treatmentRcvdMessages[ID_USER_TX_TIME_CHANGES_RQST]);
- _treatmentRcvdMessages[ID_USER_TX_TIME_CHANGES_RQST].clear();
- }
-
- if (_treatmentVars.remainingTreatmentTimeS <= 0 ) {
- qint64 currentTimeEpoch64 = QDateTime::currentSecsSinceEpoch();
- _treatmentVars.treatmentEndTimeEpoch = static_cast(currentTimeEpoch64);
- status = STATE_ON_EXIT;
- }
-
- if (!_treatmentRcvdMessages[ID_UI_PRESSURE_LIMITS_CHANGE_RQST].isNull()) {
- handlePressureChangeReqeust(_treatmentRcvdMessages[ID_UI_PRESSURE_LIMITS_CHANGE_RQST]);
- _treatmentRcvdMessages[ID_UI_PRESSURE_LIMITS_CHANGE_RQST].clear();
- }
-
- if (!_treatmentRcvdMessages[ID_USER_BLOOD_DIAL_RATE_CHANGE_RQST].isNull()) {
- handleBloodDialRateChangeRequest(_treatmentRcvdMessages[ID_USER_BLOOD_DIAL_RATE_CHANGE_RQST]);
- _treatmentRcvdMessages[ID_USER_BLOOD_DIAL_RATE_CHANGE_RQST].clear();
- }
-
- generateOcclusionPresureValues(false, _treatmentVars.broadcastIntervalCount);
-
- if (_treatmentVars.broadcastIntervalCount % NUM_OF_COUNTS_TIMER_BC_EMIT == 0) {
- QList txStates({DIALYSIS_SUB_STATE, ufSubState, salineSubState, hepSubState, 0, 0, 0, 0, 0, 0, 0});
- prepareStatesBroadcastData(ID_HD_TX_STATES_BC, txStates);
- prepareOcclusionBroadcastData();
- prepareTreatmentTimeBroadcastData();
- prepareBloodFlowBroadcastData(bloodFlowMLPM);
- prepareDialysateFlowBroadcastData();
- prepareDialysateOutFlowBroadcastData();
- prepareTreatmentParamsRangesBroadcastData(false); // In treatment updated the lastest changes
- prepareSalineBolusBroadcastData(cumSalineVolML, bolSalineVolML);
- prepareHeparinVolumeBroadcastData();
- }
-
- if (!_treatmentRcvdMessages[ID_UI_CONFIRM_RESP].isNull()) {
- status = STATE_ON_ENTRY;
- _dryDemo.submitEvent("Transition_back_2_idle");
- }
- };
-
- auto inExit = [=](){
- qDebug() << "Treat Treatment exit";
- status = STATE_ON_ENTRY;
- _dryDemo.submitEvent("Treatment_2_End_Treatment");
- };
-
- 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::onEndTreatmentStateChange(bool active)
-{
- static State_Status status = STATE_ON_ENTRY;
- static quint32 txSubState = DIALYSIS_SUB_STATE;
- static quint32 rbSubState = 0;
- static quint32 rbCountDownS = RINSEBACK_BACK_MAX_TIME_S;
- // The default rinseback volume is 300 mL but the demo should be done in 10 seconds so it is recalculated here
- static float rbTargetVolML = 0.0;
- static float rbAcuumVolML = 0.0;
- static quint32 rbFlowMLPM = _treatmentParams.rinsebackFlowRateMLPM;
-
- auto inEntry = [=](){
- // Call the treatment params first in case the user just started from the end treatment
- // but we need rinseback flow rate in mL/min that comes from the treatment params
- QVariant empty;
- setTreatmentParams(false, empty);
- // In order to jump to end treatment page, first the UI needs to be on another
- // treatment page, so on entry we first land on the dialysis page then we transition
- // to end treatment.
- _treatmentVars.prescribedTreatmentTimeS = _treatmentParams.txDurationMins * SECONDS_PER_MINUTE;
- txSubState = DIALYSIS_SUB_STATE;
- rbSubState = 0;
- rbCountDownS = RINSEBACK_BACK_MAX_TIME_S;
- rbAcuumVolML = 0.0;
- rbFlowMLPM = _treatmentParams.rinsebackFlowRateMLPM;
- rbTargetVolML = (rbFlowMLPM * DEFAULT_TIMEOUT_S) / SECONDS_PER_MINUTE;
- prepareHDModeTransitionBroadcastData(MODE_TREA, 0);
- QList txStates({txSubState, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0});
- prepareStatesBroadcastData(ID_HD_TX_STATES_BC, txStates);
-
- txSubState = TX_END_SUB_STATE;
- txStates[0] = txSubState;
- txStates[4] = rbSubState;
- prepareStatesBroadcastData(ID_HD_TX_STATES_BC, txStates);
-
- qDebug() << "End treatment on entry" << rbTargetVolML;
-
- _treatmentVars.broadcastIntervalCount = 0;
- _hasUserConfirmedToProceed = false;
- status = STATE_ON_ACTION;
- };
-
- auto inAction = [=](){
- _treatmentVars.broadcastIntervalCount++;
-
- QList txStates({0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0});
- QList rinsebackVolsML({rbTargetVolML, rbAcuumVolML});
- QList rinsebackBC({rbFlowMLPM, RINSEBACK_BACK_MAX_TIME_S, rbCountDownS, 0});
-
- if (_hasUserConfirmedToProceed) {
- // Switching to the rinseback send the screen change quickly
- txSubState = RINSEBACK_SUBSTATE;
- txStates[0] = txSubState;
- txStates[4] = rbSubState;
- prepareStatesBroadcastData(ID_HD_TX_STATES_BC, txStates);
- _hasUserConfirmedToProceed = false;
- }
-
- if (!_treatmentRcvdMessages[ID_UI_RINSEBACK_CMD_RQST].isNull()) {
- handleRinsebackSubstate(_treatmentRcvdMessages[ID_UI_RINSEBACK_CMD_RQST],
- rbAcuumVolML, txSubState, rbSubState, rbFlowMLPM);
- txStates[0] = txSubState;
- txStates[4] = rbSubState;
- prepareStatesBroadcastData(ID_HD_TX_STATES_BC, txStates);
- prepareRinsebackBroadcastData(rinsebackVolsML, rinsebackBC);
-
- if (rbSubState == RINSEBACK_END_TREATMENT_SIGNAL) {
- // Done with end treatment go back to standby as the dry demo currently does not have
- // post treatment
- qDebug() << "Done with end tx";
- status = STATE_ON_ENTRY;
- _dryDemo.submitEvent("Treatment_2_Post_Treatment");
- }
- _treatmentRcvdMessages[ID_UI_RINSEBACK_CMD_RQST].clear();
- }
- if (rbSubState == RINSEBACK_RUN_STATE) {
- // Only accumulate the rinseback volume if we are in the run state
- rbAcuumVolML += rbFlowMLPM * FLOW_INTEGRATOR;
- }
-
- if (rbAcuumVolML >= rbTargetVolML) {
- rbSubState = RINSEBACK_STOP_STATE;
- txStates[0] = txSubState;
- txStates[4] = rbSubState;
- prepareStatesBroadcastData(ID_HD_TX_STATES_BC, txStates);
- }
-
- if (!_treatmentRcvdMessages[ID_UI_CONFIRM_RESP].isNull()) {
- status = STATE_ON_ENTRY;
- _dryDemo.submitEvent("Transition_back_2_idle");
- }
-
- generateOcclusionPresureValues(false, _treatmentVars.broadcastIntervalCount);
-
- if (_treatmentVars.broadcastIntervalCount % NUM_OF_COUNTS_TIMER_BC_EMIT == 0) {
- if ((rbSubState != RINSEBACK_RUN_STATE) && (rbCountDownS != 0)) {
- // If the rinseback is not in the run state, count down rinseback timer
- // TODO do we count down from the start rinseback button?
- rbCountDownS--;
- rinsebackBC[2] = rbCountDownS;
- }
- prepareOcclusionBroadcastData();
- prepareStatesBroadcastData(ID_HD_TX_STATES_BC, txStates);
- prepareRinsebackBroadcastData(rinsebackVolsML, rinsebackBC);
- prepareTreatmentTimeBroadcastData();
- }
- };
-
- auto inExit = [=](){
- qDebug() << "End treatment 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::onPostTreatmentStateChange(bool active)
-{
- static State_Status status = STATE_ON_ENTRY;
-
- auto inEntry = [=](){
- qDebug() << "Post treatment on entry";
- prepareHDModeTransitionBroadcastData(MODE_POST, 0);
- status = STATE_ON_ACTION;
- };
-
- auto inAction = [=](){
- if (!_treatmentRcvdMessages[ID_UI_TREATMENT_LOG_RQST].isNull()) {
- handleTreatmentLogRequest();
- _treatmentRcvdMessages[ID_UI_TREATMENT_LOG_RQST].clear();
- }
-
- if (!_treatmentRcvdMessages[ID_UI_POST_TREATMNET_NEXT_RQST].isNull()) {
- _treatmentRcvdMessages[ID_UI_POST_TREATMNET_NEXT_RQST].clear();
-
- QVariantList msg;
- msg.append(static_cast(ID_HD_POST_TREATMENT_NEXT_CMD_RESP));
- msg.append(Can_Id::eChlid_HD_UI);
- msg.append(ACCEPT_VALUE);
- msg.append(0);
- _isSendListReady = false;
- _sendMessages.append(msg);
- _isSendListReady = true;
- }
-
- if (!_treatmentRcvdMessages[ID_UI_DISPOSABLE_REMOVAL_CONFIRM_RQST].isNull()) {
- _treatmentRcvdMessages[ID_UI_DISPOSABLE_REMOVAL_CONFIRM_RQST].clear();
-
- QVariantList msg;
- msg.append(static_cast(ID_UI_DISPOSABLE_REMOVAL_CONFIRM_RESP));
- msg.append(Can_Id::eChlid_HD_UI);
- msg.append(ACCEPT_VALUE);
- msg.append(0);
- _isSendListReady = false;
- _sendMessages.append(msg);
- _isSendListReady = true;
-
- status = STATE_ON_EXIT;
- _dryDemo.submitEvent("Post_treatment_2_disinfect");
- }
-
- if (!_treatmentRcvdMessages[ID_UI_CONFIRM_RESP].isNull()) {
- status = STATE_ON_ENTRY;
- _dryDemo.submitEvent("Transition_back_2_idle");
- }
- };
-
- auto inExit = [=](){
- qDebug() << "Post treatment 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::onDisinfectStateChange(bool active)
-{
- static State_Status status = STATE_ON_ENTRY;
-
- auto inEntry = [=](){
- // transition to disinfect screen
- prepareHDModeTransitionBroadcastData(MODE_STAN, 2);
-
- qDebug() << "Disinfect on entry";
- status = STATE_ON_ACTION;
- };
-
- auto inAction = [=](){
- if (!_treatmentRcvdMessages[ID_UI_CONFIRM_RESP].isNull()) {
- status = STATE_ON_ENTRY;
- _dryDemo.submitEvent("Transition_back_2_idle");
- }
- };
-
- auto inExit = [=](){
- qDebug() << "Disinfect 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;
- }
-}
-
Index: sources/StateController.h
===================================================================
diff -u -r43668888e2a573f688493685ce3535c3b2117558 -r47baa703592f0e21098cb21c0ed267de4e958b2f
--- sources/StateController.h (.../StateController.h) (revision 43668888e2a573f688493685ce3535c3b2117558)
+++ sources/StateController.h (.../StateController.h) (revision 47baa703592f0e21098cb21c0ed267de4e958b2f)
@@ -7,7 +7,7 @@
#include "main.h"
#include "MessageGlobals.h"
-#include "drydemoxmlstates.h"
+#include "LeahiDryDemoXMLStates.h"
#define _StateController StateController::I()
@@ -29,6 +29,8 @@
void timerEvent(QTimerEvent *) override;
private:
+
+ // TODO REMOVE
// General defines
#define UI_MSG_BB_STATUS_INDEX 4
#define UI_MSG_BB_PAYLOAD_ID 0x63
@@ -129,6 +131,7 @@
#define SALINE_BOLUS_START_CMD 1
#define SALINE_BOLUS_MAX_VOL_ML 800
#define SALINE_BOLUS_TARGET_FLOW_MLPM 250
+ // TODO REMOVE
enum User_Command_ID {
CMD_NONE = -1,
@@ -156,128 +159,24 @@
STATE_ON_EXIT,
};
- enum Rinseback_Rqst {
- RINSEBACK_START_RB = 0,
- RINSEBACK_ACCEL_FLOW = 1,
- RINSEABCK_DECEL_FLOW = 2,
- RINSEBACK_PAUSE_RB = 3,
- RINSEBACK_RESUME_RB = 4,
- RINSEBACK_END_RB = 5,
- RINSEBACK_SALINE_BOLUS = 6,
- RINSEBACK_END_TX = 8,
- RINSEBACK_BACK = 9,
- };
- struct Pre_Treatment_Params {
- bool hasTxParamsBeenInitialized;
- quint32 bloodFlowRateMLPM;
- quint32 dialysateFlowRateMLPM;
- quint32 txDurationMins;
- quint32 heparinPreStopMin;
- quint32 salineBolusVolML;
- quint32 acidConc;
- quint32 bicarbConc;
- quint32 dialyzerType;
- quint32 heparinType;
- quint32 bloodMeasurementInveralMin;
- quint32 rinsebackFlowRateMLPM;
- qint32 areterialPresLimitWindowMMHG;
- qint32 venousPresLimitWindowMMHG;
- qint32 venousPresLimitAsymWindowMMHG;
- float heparinDispenseRateMLHR;
- float heparinBolusVolML;
- float dialysateTemperatureC;
- };
-
- // New state machine stuff
- struct Treatment_Variables {
- quint32 broadcastIntervalCount;
- quint32 treatmentElapsedTimeS;
- quint32 remainingTreatmentTimeS;
- quint32 prescribedTreatmentTimeS;
- // UF variables
- float txParamsUFVolL;
- float prescribedMaxUFVolML;
- float prescribedUFRate;
- float refUFVolumeML;
- float measUFVolumeML;
- // Arterial/venous values
- float curArtPresMMHG;
- float curVenPresMMHG;
- qint32 minArtPresLimitMMHG;
- qint32 maxArtPresLimitMMHG;
- qint32 minVenPresLimitMMHG;
- qint32 maxVenPresLimitMMHG;
- // Accumulated saline bolus volume in millilters
- quint32 cumSalineVolML;
- // Treatment start and end times
- quint32 treatmentStarTimeEpoch;
- quint32 treatmentEndTimeEpoch;
- // Accumulated heparin dispensed volume in milliters
- float cumHeparinDisVolML;
- };
-
QHash_transitionEventsFromIdle;
QList _broadcastMessages;
QList _sendMessages;
QHash _treatmentRcvdMessages;
QRandomGenerator _randNumGenerator;
bool _isBroadcastListReady; // TODO use a mutex
bool _isSendListReady; // Todo use a mutex
- Treatment_Variables _treatmentVars;
- Pre_Treatment_Params _treatmentParams;
bool _hasUserConfirmedToProceed;
drydemoXMLstates _dryDemo;
+ // CAN function(s)
void sendMessages(bool isBroadcast);
- void setTreatmentParams(bool isFromUI, const QVariant &payload);
- void prepareOcclusionBroadcastData();
- void prepareTreatmentTimeBroadcastData();
- void prepareBloodFlowBroadcastData(quint32 flowMLPM);
- void prepareDialysateFlowBroadcastData();
- void prepareDialysateOutFlowBroadcastData();
- void prepareTreatmentParamsRangesBroadcastData(bool isResetInSB);
- void prepareHDModeTransitionBroadcastData(Can::HD_OP_MODE mode, quint32 subMode);
- void prepareStatesBroadcastData(Can::Message_ID_Enum msgID, const QList &preTxStates);
- void prepareBloodPrimeBroadcastData(float accumulatedVolML);
- void prepareRinsebackBroadcastData(const QList &volsML, const QList &payload);
- void prepareTreatmentTimeChangeResponse(quint32 accept, quint32 txDurS, float maxUFvolML);
- void prepareSalineBolusBroadcastData(float cumSalineVolML, float bolSalineVolML);
- void prepareHeparinVolumeBroadcastData();
-
- void handleTreatmentTimeChangeRequest(const QVariant &payload);
- qint32 handleMsgBBPayload(const QVariant &payload);
- void prepareMsgBA(quint32 cmd, quint32 acceptType);
- bool hasPreTxTimerElapsed(Can::Message_ID_Enum msgID, Can::Can_Id canChan,
- quint32 &timerCountDownS, quint32 defaultTimeoutS);
- void handleUltrafiltrationValidation(const QVariant &payload);
- void handleRinsebackSubstate(const QVariant &payload, float &accumVolML,
- quint32 &txState, quint32 &rbState, quint32 &rbFlowMLPM);
- bool isTreatmenStartRequested(const QVariant &payload);
- void handleAlarmStatus(bool trigger, User_Command_ID cmd);
- void generateOcclusionPresureValues(bool initArray, quint32 stableCount);
- void handlePressureChangeReqeust(const QVariant &payload);
- void handleBloodDialRateChangeRequest(const QVariant &payload);
- void handleTreatmentLogRequest();
- void handleHeparinStatus(quint32 &heparinSubState);
-
// State handlers
void onIdleStateChange(bool active);
- void onTreatmentParamsStateChange(bool active);
- void onWaterSampleStateChange(bool active);
- void onConsumablesStateChange(bool active);
- void onDisposablesStateChange(bool active);
- void onSystemPrimeStateChange(bool active);
- void onBPHRStateChange(bool active);
- void onUltrafiltrationStateChange(bool active);
- void onConnectionStateChange(bool active);
- void onStartTreatmentStateChange(bool active);
- void onTreatmentBloodPrimeStateChange(bool active);
- void onTreatmentTreatmentStateChange(bool active);
- void onEndTreatmentStateChange(bool active);
- void onPostTreatmentStateChange(bool active);
- void onDisinfectStateChange(bool active);
+ // Helper functions
+ void prepareTDOpModeTransitionData(Can::TD_OP_MODE mode, quint32 subMode);
};
Index: sources/canbus/FrameInterface.cpp
===================================================================
diff -u -r43668888e2a573f688493685ce3535c3b2117558 -r47baa703592f0e21098cb21c0ed267de4e958b2f
--- sources/canbus/FrameInterface.cpp (.../FrameInterface.cpp) (revision 43668888e2a573f688493685ce3535c3b2117558)
+++ sources/canbus/FrameInterface.cpp (.../FrameInterface.cpp) (revision 47baa703592f0e21098cb21c0ed267de4e958b2f)
@@ -172,10 +172,10 @@
FrameInterface::ChannelGroup channelGroup = ChannelGroup::eChannel_Unknown;
switch (vFrameId) {
- case eDialin_HD:
- case eHD_Dialin:
- case eDialin_DG:
- case eDG_Dialin:
+ case eDialin_TD:
+ case eTD_Dialin:
+ case eDialin_DD:
+ case eDD_Dialin:
case eDialin_UI:
case eUI_Dialin:
if ( gDisableDialinUnhandled ) {
@@ -187,24 +187,24 @@
ok = ! gDisableDialinUnhandled; // if ok is true then it will be interpreted as unhandled messages.
break;
- case eChlid_HD_DG :
+ case eChlid_TD_DD :
channelGroup = ChannelGroup::eChannel_Ignores;
break;
// disabled coco begin validated: The HD/DG communication has not been defined and implemented yet.
- case eChlid_DG_HD :
+ case eChlid_DD_TD :
// disabled coco end
// this channel is used for DG CheckIn for HW support and testing for now.
//channelGroup = ChannelGroup::eChannel_Ignores;
//break;
- case eChlid_HD_UI :
- case eChlid_HD_Alarm :
- case eChlid_HD_Sync :
+ case eChlid_TD_UI :
+ case eChlid_TD_Alarm :
+ case eChlid_TD_Sync :
// disabled coco begin validated: The UI/DG communication has not been defined and implemented yet.
- case eChlid_DG_Alarm :
- case eChlid_DG_UI :
- case eChlid_DG_Sync :
- case eChlid_UI_HD : // This is for dry demo
+ case eChlid_DD_Alarm :
+ //case eChlid_DG_UI :
+ case eChlid_DD_Sync :
+ case eChlid_UI_TD : // This is for dry demo
// disabled coco end
//case eChlid_DG_UI : // has duplicate value as eChlid_DG_Alarm
channelGroup = ChannelGroup::eChannel_Listens;
Index: sources/canbus/MessageDispatcher.cpp
===================================================================
diff -u -r43668888e2a573f688493685ce3535c3b2117558 -r47baa703592f0e21098cb21c0ed267de4e958b2f
--- sources/canbus/MessageDispatcher.cpp (.../MessageDispatcher.cpp) (revision 43668888e2a573f688493685ce3535c3b2117558)
+++ sources/canbus/MessageDispatcher.cpp (.../MessageDispatcher.cpp) (revision 47baa703592f0e21098cb21c0ed267de4e958b2f)
@@ -431,7 +431,7 @@
QVariantList msg;
msg.append(static_cast(ID_Acknow));
- msg.append(Can_Id::eChlid_HD_UI);
+ msg.append(Can_Id::eChlid_TD_UI);
actionTransmit(msg, -mSequence);
if ( ! gDisableAcknowLog ) {
@@ -528,12 +528,12 @@
{
bool ok = true;
switch(vCan_Id) { // list if the channels UI shall not Ack
- case eChlid_HD_DG : // 0x008, ///< HD => DG
- case eChlid_DG_HD : // 0x010, ///< DG => HD
- case eDialin_HD : // 0x400, ///< dialin => HD
- case eHD_Dialin : // 0x401, ///< HD => dialin
- case eDialin_DG : // 0x402, ///< dialin => DG
- case eDG_Dialin : // 0x403, ///< DG => dialin
+ case eChlid_TD_DD : // 0x010, ///< TD => DD
+ case eChlid_DD_TD : // 0x011, ///< DD => TD
+ case eDialin_TD : // 0x400, ///< dialin => TD
+ case eTD_Dialin : // 0x401, ///< TD => dialin
+ case eDialin_DD : // 0x402, ///< dialin => DD
+ case eDD_Dialin : // 0x403, ///< DD => dialin
ok = false; break;
default: break;
Index: sources/canbus/MessageInterpreter.cpp
===================================================================
diff -u -r43668888e2a573f688493685ce3535c3b2117558 -r47baa703592f0e21098cb21c0ed267de4e958b2f
--- sources/canbus/MessageInterpreter.cpp (.../MessageInterpreter.cpp) (revision 43668888e2a573f688493685ce3535c3b2117558)
+++ sources/canbus/MessageInterpreter.cpp (.../MessageInterpreter.cpp) (revision 47baa703592f0e21098cb21c0ed267de4e958b2f)
@@ -34,7 +34,7 @@
// like the notify method of received messages
#define INTERPRET_TRANSMIT_MESSAGE() \
/*if ( ! length ) { logInvalidLength(vActionId); return false; }*/ \
- vCanId = eChlid_HD_Sync; /*vMODEL::canid();*/ \
+ vCanId = eChlid_TD_Sync; /*vMODEL::canid();*/ \
vPayload = Format::fromVariant(vData); \
/*LOG_APPED_MSG(vActionId, vMODEL::toString(vData));*/ \
/*DEBUG_SIGNAL(0, typeid(vMODEL).name())*/
@@ -180,7 +180,7 @@
if ( logUnhandledMessage(vMessage)) return; // the message is defined as unhandled and can still be handled and logged, return.
if ( gDisableUnhandledReport ) return; // if the unhandled message error has been disabled, return.
QString mActionIdHexString = Format::toHexString(vMessage.actionId, false, eLenMessageIDDigits);
- QString logMessage = tr("Unhandled Message ID (HD)") + '\n' +
+ QString logMessage = tr("Unhandled Message ID (TD)") + '\n' +
QString("%1 # %2 %3")
.arg(int(vMessage.can_id), 3, 16, QChar('0'))
.arg(mActionIdHexString)
@@ -204,7 +204,7 @@
{
bool ok = true;
if (vCanId == Can::Can_Id::eChlid_NONE )
- vCanId = Can::Can_Id::eChlid_UI_HD ;
+ vCanId = Can::Can_Id::eChlid_UI_TD ;
vPayload.clear();
int length = vData.length();
Q_UNUSED(length);
@@ -222,37 +222,41 @@
Can_Source MessageInterpreter::identifySource(Can_Id vCanId, QString *vText)
{
switch (vCanId) {
- case eChlid_HD_DG : // 0x008, ///< HD => DG
- case eChlid_HD_UI : // 0x020, ///< HD => UI
- case eChlid_HD_Alarm: // 0x001, ///< HD alarm broadcast
- case eChlid_HD_Sync : // 0x040, ///< HD sync broadcast
- if (vText) *vText = "HD";
- return Can_Source::eCan_HD;
+ case eChlid_TD_DD :
+ case eChlid_TD_UI :
+ case eChlid_TD_Alarm:
+ case eChlid_TD_Sync :
+ if (vText) *vText = "TD";
+ return Can_Source::eCan_TD;
- case eChlid_DG_HD : // 0x010, ///< DG => HD
- case eChlid_DG_UI : // 0x070, ///< DG => UI
- case eChlid_DG_Alarm: // 0x002, ///< DG alarm broadcast
- case eChlid_DG_Sync : // 0x080, ///< DG sync broadcast
- if (vText) *vText = "DG";
- return Can_Source::eCan_DG;
+ case eChlid_DD_TD :
+ case eChlid_DD_FP :
+ //case eChlid_DD_UI : // has duplicate value as eChlid_DD_Sync
+ case eChlid_DD_Alarm:
+ case eChlid_DD_Sync :
+ if (vText) *vText = "DD";
+ return Can_Source::eCan_DD;
- case eDialin_HD : // 0x400, ///< dialin => HD
- case eHD_Dialin : // 0x401, ///< HD => dialin
- case eDialin_DG : // 0x402, ///< dialin => DG
- case eDG_Dialin : // 0x403, ///< DG => dialin
- case eDialin_UI : // 0x404, ///< dialin => UI
- case eUI_Dialin : // 0x405, ///< UI => dialin
- if (vText) *vText = "DI";
- return Can_Source::eCan_DI;
+ //case eChlid_FP_UI : // has duplicate value as eChlid_FP_Sync
+ case eChlid_FP_Alarm:
+ case eChlid_FP_Sync :
+ if (vText) *vText = "FP";
+ return Can_Source::eCan_FP;
- case eChlid_UI_HD : // 0x100, ///< UI for dry demo
- if (vText) *vText = "UI";
- return Can_Source::eCan_UI;
- // TODO why no break?
+ case eDialin_TD :
+ case eTD_Dialin :
+ case eDialin_DD :
+ case eDD_Dialin :
+ case eDialin_FP :
+ case eFP_Dialin :
+ case eDialin_UI :
+ case eUI_Dialin :
+ if (vText) *vText = "DI";
+ return Can_Source::eCan_DI;
- default:
- if (vText) *vText = "XX";
- return Can_Source::eCan_Unknown;
+ default:
+ if (vText) *vText = "XX";
+ return Can_Source::eCan_Unknown;
}
}
@@ -266,34 +270,40 @@
Can_Id MessageInterpreter::identifyDestination(Can_Id vCanId, QString *vText)
{
switch (vCanId) {
- case eChlid_HD_UI : // 0x020, ///< HD => UI
- case eChlid_HD_Alarm: // 0x001, ///< HD alarm broadcast
- case eChlid_HD_Sync : // 0x040, ///< HD sync broadcast
- if (vText) *vText = "HD";
- return Can_Id::eChlid_UI_HD;
+ case eChlid_TD_UI :
+ case eChlid_TD_Alarm:
+ case eChlid_TD_Sync :
+ if (vText) *vText = "TD";
+ return Can_Id::eChlid_UI_TD;
- case eChlid_DG_UI : // 0x070, ///< DG => UI
- case eChlid_DG_Alarm: // 0x002, ///< DG alarm broadcast
- case eChlid_DG_Sync : // 0x080, ///< DG sync broadcast
- if (vText) *vText = "DG";
- return Can_Id::eChlid_UI_DG;
+ //case eChlid_DD_UI : // has duplicate value as eChlid_DD_Sync
+ case eChlid_DD_FP :
+ case eChlid_DD_Alarm:
+ case eChlid_DD_Sync :
+ if (vText) *vText = "DD";
+ return Can_Id::eChlid_UI_DD;
- case eDialin_HD : // 0x400, ///< dialin => HD
- case eHD_Dialin : // 0x401, ///< HD => dialin
- case eDialin_DG : // 0x402, ///< dialin => DG
- case eDG_Dialin : // 0x403, ///< DG => dialin
- case eDialin_UI : // 0x404, ///< dialin => UI
- case eUI_Dialin : // 0x405, ///< UI => dialin
- if (vText) *vText = "DI";
- return Can_Id::eChlid_UI_Sync;
+ // FP is not designed to directly communicate with UI
+ //case eChlid_FP_UI : // has duplicate value as eChlid_FP_Sync
+ case eChlid_FP_Alarm:
+ case eChlid_FP_Sync :
+ if (vText) *vText = "FP";
+ return Can_Id::eChlid_UI_Sync;
- case eChlid_UI_HD : // 0x100, ///< UI for dry demo
- if (vText) *vText = "HD";
- return Can_Id::eChlid_HD_UI;
+ case eDialin_TD :
+ case eTD_Dialin :
+ case eDialin_DD :
+ case eDD_Dialin :
+ case eDialin_FP :
+ case eFP_Dialin :
+ case eDialin_UI :
+ case eUI_Dialin :
+ if (vText) *vText = "DI";
+ return Can_Id::eChlid_UI_Sync;
- default:
- if (vText) *vText = "XX";
- return Can_Id::eChlid_UI_Sync;
+ default:
+ if (vText) *vText = "XX";
+ return Can_Id::eChlid_UI_Sync;
}
}
@@ -321,9 +331,10 @@
if ( ! gLogUnhandledOnly ) {
switch (identifySource(vMessage.can_id)) {
- case Can_Source::eCan_HD: ok = interpretMessage_HD(vMessage, vData); break;
- case Can_Source::eCan_DG: ok = interpretMessage_DG(vMessage, vData); break;
- default : printUnhandled (vMessage ); /*qDebug() << "2" <<__FUNCTION__;*/ break; // ok is false, the individual interpreters for ?HD/DG should not be called, and it should be done here.
+ case Can_Source::eCan_TD: ok = interpretMessage_TD(vMessage, vData); break;
+ case Can_Source::eCan_DD: ok = interpretMessage_DD(vMessage, vData); break;
+ case Can_Source::eCan_FP: ok = interpretMessage_FP(vMessage, vData); break;
+ default : printUnhandled (vMessage ); break; // ok is false, the individual interpreters for ?HD/DG should not be called, and it should be done here.
}
}
else {
@@ -335,9 +346,9 @@
}
/*!
- * \brief MessageInterpreter::interpretMessage_HD
+ * \brief MessageInterpreter::interpretMessage_TD
* \details This method will be called
- * for received messages from HD to interpret the vMessage of type Message
+ * for received messages from TD to interpret the vMessage of type Message
* to vData of type QVariantList which UI understands regarding the Can_Id.
* \param vMessage - The complete message of type Message which needs to be interpreted.
* \param vActionId - The ActionId of GuiActionType which will be extracted from vMessage.
@@ -347,7 +358,7 @@
* \return true if the message CANBus channel is in the range which can be interpreted, false otherwise.
* This return value will be used later to emit MessageDispatcher::didActionReceive signal or not
*/
-bool MessageInterpreter::interpretMessage_HD(const Message &vMessage, QVariantList &vData)
+bool MessageInterpreter::interpretMessage_TD(const Message &vMessage, QVariantList &vData)
{
bool ok = false;
vData.clear();
@@ -358,9 +369,9 @@
}
/*!
- * \brief MessageInterpreter::interpretMessage_DG
+ * \brief MessageInterpreter::interpretMessage_DD
* \details This method will be called
- * for received messages from DG to interpret the vMessage of type Message
+ * for received messages from DD to interpret the vMessage of type Message
* to vData of type QVariantList which UI understands regarding the Can_Id.
* \param vMessage - The complete message of type Message which needs to be interpreted.
* \param vActionId - The ActionId of GuiActionType which will be extracted from vMessage.
@@ -370,7 +381,7 @@
* \return true if the message CANBus channel is in the range which can be interpreted, false otherwise.
* This return value will be used later to emit MessageDispatcher::didActionReceive signal or not
*/
-bool MessageInterpreter::interpretMessage_DG(const Message &vMessage, QVariantList &vData)
+bool MessageInterpreter::interpretMessage_DD(const Message &vMessage, QVariantList &vData)
{
bool ok = false;
vData.clear();
@@ -380,6 +391,29 @@
return ok;
}
+/*!
+ * \brief MessageInterpreter::interpretMessage_FP
+ * \details This method will be called
+ * for received messages from FP to interpret the vMessage of type Message
+ * to vData of type QVariantList which UI understands regarding the Can_Id.
+ * \param vMessage - The complete message of type Message which needs to be interpreted.
+ * \param vActionId - The ActionId of GuiActionType which will be extracted from vMessage.
+ * \param vData - The values of QVariantList which is understandable for UI
+ * and has been extracted from hex values of the CANBus Message Payload
+ * in vMessage of type Message regarding each Message Id definition.
+ * \return true if the message CANBus channel is in the range which can be interpreted, false otherwise.
+ * This return value will be used later to emit MessageDispatcher::didActionReceive signal or not
+ */
+bool MessageInterpreter::interpretMessage_FP(const Message &vMessage, QVariantList &vData)
+{
+ bool ok = false;
+ vData.clear();
+ Q_UNUSED(vMessage);
+ // TODO print unhandled?
+
+ return ok;
+}
+
// ---------- ---------- Message handlers ---------- ---------- //
// ---------- ---------- ---------- ---------- ---------- Debug ---------- ---------- ---------- ---------- ---------- //
@@ -440,28 +474,25 @@
*/
bool MessageInterpreter::logUnhandledMessage(const Message &vMessage) const {
bool ok = false;
- quint16 id = vMessage.actionId;
- QString logString = QString("%1,").arg(id,4,16);
- QVariantList logVariant;
- logVariant.append(id);
+ quint16 msg_id = vMessage.actionId;
+ QString logString = QString("%1,").arg(msg_id,4,16);
+ QString can_id;
+ QString item = "";
- if (_messageList.contains(id)) {
+ identifySource(vMessage.can_id, &can_id); // Message Can Channel.
+ logString += can_id + ",";
+ // qDebug() << __FUNCTION__ << logString;
+
+ if (_messageList.contains(msg_id)) {
ok = true;
- QStringList items = _messageList[id];
+ QStringList items = _messageList[msg_id];
int index = 0;
for ( int i = 0; i < items.count(); i++ ) {
- 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;
- }
+ item = items[i];
+ if (i == 0) { // Message Name/Identifier
+ logString += "~" + item;
}
- else {
- logVariant.append(vMessage.data);
+ else { // Message payload data
if ( item == "F32" ) {
Types::F32 param;
if (! GetValue(vMessage.data, index, param )) logString += ",?";
@@ -504,18 +535,12 @@
}
}
}
- LOG_APPED(logString);
- if ((id != 0x700) && (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(id, 0, 16));
+ LOG_DEBUG(QString("Undefined unhandled message [%1]").arg(msg_id, 0, 16));
}
}
+ LOG_APPED(logString + item);
return ok;
}
Index: sources/canbus/MessageInterpreter.h
===================================================================
diff -u -r43668888e2a573f688493685ce3535c3b2117558 -r47baa703592f0e21098cb21c0ed267de4e958b2f
--- sources/canbus/MessageInterpreter.h (.../MessageInterpreter.h) (revision 43668888e2a573f688493685ce3535c3b2117558)
+++ sources/canbus/MessageInterpreter.h (.../MessageInterpreter.h) (revision 47baa703592f0e21098cb21c0ed267de4e958b2f)
@@ -56,8 +56,9 @@
void printUnhandled (const Message &vMessage ) const;
- bool interpretMessage_HD (const Message &vMessage, QVariantList &vData) __attribute_warn_unused_result__;
- bool interpretMessage_DG (const Message &vMessage, QVariantList &vData) __attribute_warn_unused_result__;
+ bool interpretMessage_TD (const Message &vMessage, QVariantList &vData) __attribute_warn_unused_result__;
+ bool interpretMessage_DD (const Message &vMessage, QVariantList &vData) __attribute_warn_unused_result__;
+ bool interpretMessage_FP (const Message &vMessage, QVariantList &vData) __attribute_warn_unused_result__;
// ----- Debug
bool canbusFaultCountData (const Message &vMessage, QVariantList &vData) __attribute_warn_unused_result__;