#pragma once #include #include #include "main.h" #include "MessageGlobals.h" #include "drydemoxmlstates.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: // General defines #define UI_MSG_DD_STATUS_INDEX 4 #define UI_MSG_BB_PAYLOAD_ID 0x63 #define COUNTER_VAR_DEFAULT_VALUE -1 #define PRESC_TIME_DEFAULT_VALUE -1 #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 // Pre treatment defines #define DEFAULT_TIMEOUT_S 10 #define TRANSITION_EVENT_INDEX 0 #define RESP_MSG_START_INDEX 3 #define IS_TIMER_INDEX 0 #define IS_WAIT_NEEDED_INDEX 1 #define NEXT_AUTO_TRANSITION_INDEX 2 #define COUNT_DOWN_TIMER_INDEX 6 // Timer event defines #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_BC_COUNTS_ADJUSTED (NUM_OF_COUNTS_TIMER_BC_EMIT * 2) #define NUM_OF_COUNTS_TO_BC_MSG 3 // Treatment params #define MIN_DIAL_RATE_MLPM 100 #define MAX_DIAL_RATE_MLPM 600 #define MIN_TX_TIME_MINS 60 #define DEFAULT_TX_ELAPSED_TIME_S (2 * MINUTES_PER_HOUR) * SECONDS_PER_MINUTE #define TX_PARAM_PRESCRIBED_DUR_S ((4 * MINUTES_PER_HOUR) + 30) * SECONDS_PER_MINUTE #define TX_PARAM_UF_VOLUME_L 2.0 #define TX_PARAM_BLOOD_FLOW_RATE_MLPM 400 #define TX_PARAM_DIAL_FLOW_RATE_MLPM 600 #define TX_PARAM_SALINE_BOLUS_VOL_ML 200 // Treatment defines #define TIME_PRESCRIBED_S_INDEX 5 // TODO remove #define TIME_ELAPSED_S_INDEX 6 // TODo remove #define TIME_REMAINING_S_INDEX 7 // TODO remove #define BLOOD_PRIME_VOLUME_ML (106.6 + 40) #define BLOOD_FLOW_INTEGRATOR (1.0 / (SECONDS_PER_MINUTE * (MILLISECONDS_PER_SECOND /QOBJECT_TIMER_TIMEOUT_MS))) #define MAX_DIALYSATE_VOLUME_ML 150000 enum User_Command_ID { CMD_NONE = -1, CMD_TX_PARAMS = 0 , CMD_WATER_SAMPLE = 1, CMD_CONSUMABLES = 2, CMD_DISPOSABLES = 3, CMD_SYSTEM_PRIME = 4, CMD_BP_HR = 5, CMD_ULTRAFILTRATION = 6, CMD_CONNECTION = 7, CMD_START_TX = 8, CMD_END_TX = 9, CMD_DISINFECTION = 10, NUM_OF_USER_CMDS, }; enum Counter_Type { COUNTER_NONE = -1, COUNTER_PRE_TX_TIMERS = 0, COUNTER_TX_TIMER, COUNTER_RINSEBACK_TIMER, }; enum State_Status { STATE_ON_ENTRY = 0, STATE_ON_ACTION, STATE_ON_EXIT, }; QHash > _dryDemoCmds; quint16 _index; quint16 _broadcastMsgCount; quint16 _timerBroadcastCount; bool _hasUserConfirmedToProceed; int _currentCounterValue; int _prescribedTreatmentTimeS; User_Command_ID _dryDemoCurrentCmd; drydemoXMLstates _dryDemo; // New state machine stuff struct Treatment_Variables { float accumulatedVolumeML; quint32 broadcastIntervalCount; quint32 treatmentElapsedTimeS; quint32 remainingTreatmentTimeS; quint32 prescribedTreatmentTimeS; // UF variables float prescribedMaxUFVolML; float prescribedUFRate; float refUFVolumeML; }; State_Status _stateStatus; QList _broadcastMessages; QList _sendMessages; QHash _treatmentRcvdMessages; bool _isBoradcastListReady; // TODO use a mutex bool _isSendListReady; // Todo use a mutex Treatment_Variables _treatmentVars; void initMessagesHashTable(); void transitionApplicationToStandBy(); void resetVariables(); void sendMessages(bool isBroadcast); void prepareOcclusionBroadcastData(); void prepareTreatmentTimeBroadcastData(); void prepareTreatmentStatesBroadcastData(const QVariantList &payload); void handleTreatmentReceivedMessages(); void handleTreatmentTimeChangeRequest(const QVariant &payload); 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); void onTreatmentBloodPrimeStateChange(bool); void onTreatmentTreatmentStateChange(bool); void onEndTreatmentStateChange(bool active); void onDisinfectStateChange(bool active); };