#pragma once #include #include #include #include "main.h" #include "MessageGlobals.h" #include "LeahiDryDemoXMLStates.h" #define _StateController StateController::I() // TODO check illegal state transition class StateController : public QObject { Q_OBJECT SINGLETON(StateController) public: void init(); // TODO move these in slots void quit(); public slots: void doStateControllerUnhandledMsgReceived(const QVariantList &msg); protected: void timerEvent(QTimerEvent *) override; private: // TODO REMOVE // General defines #define UI_MSG_BB_STATUS_INDEX 4 #define UI_MSG_BB_PAYLOAD_ID 0x63 #define SECONDS_PER_MINUTE 60 #define MINUTES_PER_HOUR 60 #define MILLISECONDS_PER_SECOND 1000 #define MILLILITERS_PER_LITER 1000 #define ACCEPT_VALUE 1 #define REJECT_VALUE 0 #define START_TX_FROM_MSG_38 1 #define CONFIRM_CMD_ACCEPT_CLOSE 3 #define PASS_RESULT 1 #define DEVICE_ID 1234 // Timer event defines #define DEFAULT_TIMEOUT_S 10 #define QOBJECT_TIMER_TIMEOUT_MS 100 #define PROGRESS_TIME_BC_INTERVAL_MS 1000 #define NUM_OF_COUNTS_TIMER_BC_EMIT (PROGRESS_TIME_BC_INTERVAL_MS / QOBJECT_TIMER_TIMEOUT_MS) #define NUM_OF_COUNTS_TO_BC_MSG 3 // Treatment params #define MIN_DIAL_RATE_MLPM 100 #define MAX_DIAL_RATE_MLPM 600 #define MIN_BLOOD_RATE_MLPM 100 #define MAX_BLOOD_RATE_MLPM 500 #define MIN_TX_TIME_MINS (1 * MINUTES_PER_HOUR) #define MAX_TX_TIME_MINS (8 * MINUTES_PER_HOUR) #define MIN_UF_VOL_L 0.0 #define MAX_UF_VOL_L 8.0 #define MAX_UF_VOL_ML (MAX_UF_VOL_L * MILLILITERS_PER_LITER) #define MIN_UF_RATE_MLPM 0.0 #define MAX_UF_RATE_MLPM (2000.0 / MINUTES_PER_HOUR) #define ACID_TYPES_1251_1_K 1.0 #define ACID_TYPES_CALCIUM 2.5 #define ACID_TYPES_BICARB 33 #define ACID_TYPES_SODIUM 137 #define DEF_TX_ELAPSED_TIME_S (2 * MINUTES_PER_HOUR) * SECONDS_PER_MINUTE #define DEF_TX_PARAM_PRESCRIBED_DUR_MIN ((4 * MINUTES_PER_HOUR) + 30) #define DEF_TX_PARAM_PRESCRIBED_DUR_S DEF_TX_PARAM_PRESCRIBED_DUR_MIN * SECONDS_PER_MINUTE #define DEF_TX_PARAM_UF_VOLUME_L 2.0 #define DEF_TX_PARAM_BLOOD_FLOW_RATE_MLPM 400 #define DEF_TX_PARAM_DIAL_FLOW_RATE_MLPM 600 #define DEF_TX_PARAM_SALINE_BOLUS_VOL_ML 200 #define DEF_TX_PARAM_RINSEBACK_FLOW_RATE_MLPM 250 #define DEF_TX_PARAM_ART_PRES_LIMIT_WIN_MMHG 120 #define DEF_TX_PARAM_VEN_PRES_LIMIT_WIN_MMHG 100 #define DEF_TX_PARAM_VEN_PRES_LIMIT_ASYM_WIN_MMHG 20 #define DEF_TX_PARAM_DIA_TEMPERATURE_C 37.0 // Arterial /Venous limits #define MIN_ART_PRES_LIMIT_MMHG -300.0 #define MAX_ART_PRES_LIMIT_MMHG 100.0 #define MIN_VEN_PRES_LIMIT_MMHG 0.0 #define MAX_VEN_PRES_LIMIT_MMHG 400.0 #define OCCLUSION_STABLE_TIME_COUNT (10 * MILLISECONDS_PER_SECOND) / QOBJECT_TIMER_TIMEOUT_MS // Treatment defines #define BLOOD_PRIME_VOLUME_ML (106.6 + 40) #define BLOOD_PRIME_START_FLOW_MLPM 250 #define BLOOD_PRIME_FLOW_CHNG_MLPM 25 #define FLOW_INTEGRATOR (1.0 / (SECONDS_PER_MINUTE * (MILLISECONDS_PER_SECOND / QOBJECT_TIMER_TIMEOUT_MS))) #define MAX_DIALYSATE_VOLUME_ML 150000 // Treatment substates #define BLOOD_RPIME_SUB_STATE 1 #define DIALYSIS_SUB_STATE 2 #define RINSEBACK_SUBSTATE 4 #define TX_END_SUB_STATE 6 // Heparin substates #define HEPARIN_OFF_SUBSTATE 0 #define HEPARIN_PAUSED_SUBSTATE 2 #define HEPARIN_DISPENSING_SUBSTATE 4 #define HEPARIN_COMPLETED_SUBSTATE 5 // Ultrafiltration substates #define UF_PAUSESD_STATE 0 #define UF_RUNNING_STATE 1 // Rinseback defines #define RINSEBACK_MIN_FLOW_RATE_MLPM 100 #define RINSEBACK_MAX_RLOW_RATE_MLPM 300 #define RINSEBACK_ADJ_FLOW_RATE_MLPM 25 #define RINSEBACK_BACK_MAX_TIME_S (5 * SECONDS_PER_MINUTE) #define RINSEBACK_END_TREATMENT_SIGNAL 999 #define RINSEBACK_STOP_INIT_STATE 0 #define RINSEBACK_RUN_STATE 1 #define RINSEBACK_PAUSE_STATE 2 #define RINSEBACK_STOP_STATE 3 // Saline Bolus defines #define SALINE_BOLUS_IDLE_STATE 0 #define SALINE_BOLUS_IN_PROG_STATE 2 #define SALINE_BOLUS_MAX_DELIVERED 3 #define SALINE_BOLUS_START_CMD 1 #define SALINE_BOLUS_MAX_VOL_ML 800 #define SALINE_BOLUS_TARGET_FLOW_MLPM 250 // TODO REMOVE enum User_Command_ID { CMD_NONE = -1, CMD_STAND_BY = 0, CMD_TX_PARAMS = 1, CMD_WATER_SAMPLE = 2, CMD_CONSUMABLES = 3, CMD_DISPOSABLES = 4, CMD_SYSTEM_PRIME = 5, CMD_BP_HR = 6, CMD_ULTRAFILTRATION = 7, CMD_CONNECTION = 8, CMD_START_TX = 9, CMD_END_TX = 10, CMD_DISINFECTION = 11, CMD_HIGH_PRIO_ALARM = 12, CMD_MEDIUM_PRIO_ALARM = 13, CMD_LOW_PRIO_ALARM = 14, NUM_OF_USER_CMDS = 15, }; enum State_Status { STATE_ON_ENTRY = 0, STATE_ON_ACTION, STATE_ON_EXIT, }; QHash_transitionEventsFromIdle; QList _broadcastMessages; QList _sendMessages; QHash _treatmentRcvdMessages; QRandomGenerator _randNumGenerator; bool _isBroadcastListReady; // TODO use a mutex bool _isSendListReady; // Todo use a mutex bool _hasUserConfirmedToProceed; drydemoXMLstates _dryDemo; // CAN function(s) void sendMessages(bool isBroadcast); // State handlers void onIdleStateChange(bool active); // Helper functions void prepareTDOpModeTransitionData(Can::TD_OP_MODE mode, quint32 subMode); };