Index: dialin/common/alarm_defs.py =================================================================== diff -u -r8a4783c11ec826a2b84480ffb6b033edcac12954 -r1fd5bc0ed97d0d90223fa78ec195dd7636712c5b --- dialin/common/alarm_defs.py (.../alarm_defs.py) (revision 8a4783c11ec826a2b84480ffb6b033edcac12954) +++ dialin/common/alarm_defs.py (.../alarm_defs.py) (revision 1fd5bc0ed97d0d90223fa78ec195dd7636712c5b) @@ -1,34 +1,243 @@ ########################################################################### # -# Copyright (c) 2019-2020 Diality Inc. - All Rights Reserved. +# Copyright (c) 2019-2021 Diality Inc. - All Rights Reserved. # # THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN # WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. # # @file alarm_defs.py # -# @author (last) Sean Nash -# @date (last) 03-Nov-2020 +# @author (last) Peter Lucia +# @date (last) 11-May-2021 # @author (original) Peter Lucia -# @date (original) 07-Aug-2020 +# @date (original) 11-May-2021 # ############################################################################ -import os from enum import unique -from ..utils.base import AlarmEnum, DialinEnum +from ..utils.base import AlarmEnum -enum_list = {} -with open(os.path.join(os.path.dirname(__file__), 'AlarmIds.txt'), 'r') as file_obj: - for line in file_obj: - split_str = line.split('=') - enum_list[split_str[0].strip()] = split_str[1].strip() -AlarmList = AlarmEnum('AlarmList', enum_list) - +# Branch: staging @unique -class AlarmPriorities(DialinEnum): - ALARM_PRIORITY_NONE = 0 # Indicates not an alarm or no alarms active at this time - ALARM_PRIORITY_LOW = 1 # Low priority alarm - ALARM_PRIORITY_MEDIUM = 2 # Medium priority alarm - ALARM_PRIORITY_HIGH = 3 # High priority alarm - NUM_OF_ALARM_PRIORITIES = 4 # Total number of alarm priorities +class AlarmList(AlarmEnum): + ALARM_ID_NO_ALARM = 0 + ALARM_ID_HD_SOFTWARE_FAULT = 1 + ALARM_ID_STUCK_BUTTON_TEST_FAILED = 2 + ALARM_ID_HD_FPGA_POST_TEST_FAILED = 3 + ALARM_ID_WATCHDOG_POST_TEST_FAILED = 4 + ALARM_ID_UI_COMM_POST_FAILED = 5 + ALARM_ID_BLOOD_PUMP_MC_CURRENT_CHECK = 6 + ALARM_ID_BLOOD_PUMP_OFF_CHECK = 7 + ALARM_ID_BLOOD_PUMP_MC_DIRECTION_CHECK = 8 + ALARM_ID_BLOOD_PUMP_ROTOR_SPEED_CHECK = 9 + ALARM_ID_DIAL_IN_PUMP_MC_CURRENT_CHECK = 10 + ALARM_ID_DIAL_IN_PUMP_OFF_CHECK = 11 + ALARM_ID_DIAL_IN_PUMP_MC_DIRECTION_CHECK = 12 + ALARM_ID_DIAL_IN_PUMP_ROTOR_SPEED_CHECK = 13 + ALARM_ID_DIAL_OUT_PUMP_MC_CURRENT_CHECK = 14 + ALARM_ID_DIAL_OUT_PUMP_OFF_CHECK = 15 + ALARM_ID_DIAL_OUT_PUMP_MC_DIRECTION_CHECK = 16 + ALARM_ID_DIAL_OUT_PUMP_ROTOR_SPEED_CHECK = 17 + ALARM_ID_WATCHDOG_EXPIRED = 18 + ALARM_ID_RTC_COMM_ERROR = 19 + ALARM_ID_RTC_CONFIG_ERROR = 20 + ALARM_ID_DG_COMM_TIMEOUT = 21 + ALARM_ID_UI_COMM_TIMEOUT = 22 + ALARM_ID_COMM_TOO_MANY_BAD_CRCS = 23 + ALARM_ID_TREATMENT_STOPPED_BY_USER = 24 + ALARM_ID_BLOOD_SITTING_WARNING = 25 + ALARM_ID_BLOOD_SITTING_TOO_LONG_NO_RESUME = 26 + ALARM_ID_BLOOD_SITTING_TOO_LONG_NO_RINSEBACK = 27 + ALARM_ID_CAN_MESSAGE_NOT_ACKED = 28 + ALARM_ID_OCCLUSION_BLOOD_PUMP = 29 + ALARM_ID_OCCLUSION_DIAL_IN_PUMP = 30 + ALARM_ID_OCCLUSION_DIAL_OUT_PUMP = 31 + ALARM_ID_ARTERIAL_PRESSURE_LOW = 32 + ALARM_ID_ARTERIAL_PRESSURE_HIGH = 33 + ALARM_ID_VENOUS_PRESSURE_LOW = 34 + ALARM_ID_VENOUS_PRESSURE_HIGH = 35 + ALARM_ID_UF_RATE_TOO_HIGH_ERROR = 36 + ALARM_ID_UF_VOLUME_ACCURACY_ERROR = 37 + ALARM_ID_RTC_BATTERY_LOW = 38 + ALARM_ID_RTC_OR_TIMER_ACCURACY_FAILURE = 39 + ALARM_ID_RTC_RAM_OPS_ERROR = 40 + ALARM_ID_NVDATA_EEPROM_OPS_FAILURE = 41 + ALARM_ID_NVDATA_MFG_RECORD_CRC_ERROR = 42 + ALARM_ID_NVDATA_SRVC_RECORD_CRC_ERROR = 43 + ALARM_ID_NVDATA_CAL_RECORD_CRC_ERROR = 44 + ALARM_ID_NVDATA_HW_USAGE_DATA_CRC_ERROR = 45 + ALARM_ID_AVAILABLE_1 = 46 + ALARM_ID_AVAILABLE_2 = 47 + ALARM_ID_TEMPERATURE_SENSORS_FAULT = 48 + ALARM_ID_HD_FPGA_COMM_TIMEOUT = 49 + ALARM_ID_HD_COMM_TIMEOUT = 50 + ALARM_ID_VALVE_CONTROL_FAILURE = 51 + ALARM_ID_BLOOD_PUMP_FLOW_VS_MOTOR_SPEED_CHECK = 52 + ALARM_ID_DIAL_IN_PUMP_FLOW_VS_MOTOR_SPEED_CHECK = 53 + ALARM_ID_HD_PRIME_PURGE_AIR_TIME_OUT = 54 + ALARM_ID_BLOOD_PUMP_MOTOR_SPEED_CHECK = 55 + ALARM_ID_DIAL_IN_PUMP_MOTOR_SPEED_CHECK = 56 + ALARM_ID_DIAL_OUT_PUMP_MOTOR_SPEED_CHECK = 57 + ALARM_ID_BLOOD_PUMP_ROTOR_SPEED_TOO_HIGH = 58 + ALARM_ID_INLET_WATER_LOW_CONDUCTIVITY = 59 + ALARM_ID_INLET_WATER_HIGH_CONDUCTIVITY = 60 + ALARM_ID_DG_SOFTWARE_FAULT = 61 + ALARM_ID_CONDUCTIVITY_SENSOR_FAULT = 62 + ALARM_ID_INLET_WATER_LOW_TEMPERATURE = 63 + ALARM_ID_INLET_WATER_HIGH_TEMPERATURE = 64 + ALARM_ID_PRESSURE_SENSOR_FAULT = 65 + ALARM_ID_INLET_WATER_LOW_PRESSURE = 66 + ALARM_ID_HD_CRITICAL_DATA_ERROR = 67 + ALARM_ID_HD_ACCELEROMETER_SELF_TEST_FAILURE = 68 + ALARM_ID_DG_ACCELEROMETER_SELF_TEST_FAILURE = 69 + ALARM_ID_HD_EXCESSIVE_TILT = 70 + ALARM_ID_DG_EXCESSIVE_TILT = 71 + ALARM_ID_HD_SHOCK = 72 + ALARM_ID_DG_SHOCK = 73 + ALARM_ID_HD_ACCELEROMETER_FAILURE = 74 + ALARM_ID_DG_ACCELEROMETER_FAILURE = 75 + ALARM_ID_DG_CRITICAL_DATA_ERROR = 76 + ALARM_ID_RO_REJECTION_RATIO_OUT_OF_RANGE = 77 + ALARM_ID_INLET_WATER_PRESSURE_FAULT = 78 + ALARM_ID_HD_VALVE_HOMING_FAILED = 79 + ALARM_ID_HD_VALVE_TRANSITION_TIMEOUT = 80 + ALARM_ID_HD_VALVE_NOT_FUNCTIONAL = 81 + ALARM_ID_HD_VALVE_CURRENT_OUT_OF_RANGE = 82 + ALARM_ID_HD_VALVE_POSITION_OUT_OF_RANGE = 83 + ALARM_ID_AIR_TRAP_ILLEGAL_LEVELS = 84 + ALARM_ID_AIR_TRAP_FILL_DURING_PRIME = 85 + ALARM_ID_AIR_TRAP_FILL_DURING_TREATMENT = 86 + ALARM_ID_BLOOD_FLOW_SIGNAL_STRENGTH_TOO_LOW = 87 + ALARM_ID_DIALYSATE_FLOW_SIGNAL_STRENGTH_TOO_LOW = 88 + ALARM_ID_EMPTY_SALINE_BAG = 89 + ALARM_ID_SALINE_BOLUS_VOLUME_CHECK_FAILURE = 90 + ALARM_ID_ARTERIAL_PRESSURE_SENSOR_FAULT = 91 + ALARM_ID_VENOUS_PRESSURE_SENSOR_FAULT = 92 + ALARM_ID_UV_REACTOR_NOT_HEALTHY = 93 + ALARM_ID_ACID_CONDUCTIVITY_OUT_OF_RANGE = 94 + ALARM_ID_BICARB_CONDUCTIVITY_OUT_OF_RANGE = 95 + ALARM_ID_RO_PUMP_FLOW_RATE_OUT_OF_RANGE = 96 + ALARM_ID_DG_THERMISTORS_TEMPERATURE_OUT_OF_RANGE = 97 + ALARM_ID_DG_FAN_RPM_OUT_OF_RANGE = 98 + ALARM_ID_DG_DIALYSATE_FILL_OUT_OF_TIME = 99 + ALARM_ID_CP1_SPEED_CONTROL_ERROR = 100 + ALARM_ID_CP2_SPEED_CONTROL_ERROR = 101 + ALARM_ID_FLOW_RATE_OUT_OF_UPPER_RANGE = 102 + ALARM_ID_RO_PUMP_PRESSURE_OUT_OF_RANGE = 103 + ALARM_ID_DRAIN_PUMP_RPM_OUT_OF_RANGE = 104 + ALARM_ID_DG_HEATERS_NEGATIVE_COLD_JUNCTION_TEMPERATURE = 105 + ALARM_ID_DG_HEATERS_FAULT = 106 + ALARM_ID_END_OF_TREATMENT_WARNING = 107 + ALARM_ID_END_OF_TREATMENT_ALARM = 108 + ALARM_ID_END_OF_TREATMENT_HIGH = 109 + ALARM_ID_AVAILABLE_3 = 110 + ALARM_ID_RO_PUMP_RAMP_UP_TO_FLOW_TIMEOUT = 111 + ALARM_ID_FLOW_RATE_OUT_OF_LOWER_RANGE = 112 + ALARM_ID_DRAIN_PUMP_OFF_FAULT = 113 + ALARM_ID_RO_PUMP_OFF_FAULT = 114 + ALARM_ID_PRIME_DIALYSATE_DIALYZER_TIME_OUT = 115 + ALARM_ID_PRIME_DIALYSATE_BYPASS_TIME_OUT = 116 + ALARM_ID_PRIME_COMPLETED_LOW_PRIORITY = 117 + ALARM_ID_PRIME_COMPLETED_MEDIUM_PRIORITY = 118 + ALARM_ID_PRIME_COMPLETED_HIGH_PRIORITY = 119 + ALARM_ID_PRIME_OUT_OF_TIME = 120 + ALARM_ID_DG_COMMAND_INVALID_PARAMETER_FAULT = 121 + ALARM_ID_HD_LOAD_CELL_ACCELERATION_RES_1_ALARM = 122 + ALARM_ID_HD_LOAD_CELL_ACCELERATION_RES_2_ALARM = 123 + ALARM_ID_TREATMENT_STOPPED_AFTER_RINSEBACK = 124 + ALARM_ID_TREATMENT_RINSEBACK_TIMEOUT_ALARM = 125 + ALARM_ID_TREATMENT_RECIRC_TIMEOUT_ALARM = 126 + ALARM_ID_CARTRIDGE_DOOR_OPENED = 127 + ALARM_ID_AVAILABLE_4 = 128 + ALARM_ID_INSTALL_NEW_CARTRIDGE = 129 + ALARM_ID_CARTRIDGE_INSTALLED_IMPROPERLY = 130 + ALARM_ID_RINSEBACK_VOLUME_CHECK_FAILURE = 131 + ALARM_ID_NO_CARTRIDGE_LOADED = 132 + ALARM_ID_END_TREATMENT_TIMEOUT_ALARM = 133 + ALARM_ID_BLOOD_PRIME_VOLUME_CHECK_FAILURE = 134 + ALARM_ID_DIALYSATE_TEMPERATURE_TOO_HIGH = 135 + ALARM_ID_DIALYSATE_TEMPERATURE_TOO_LOW = 136 + ALARM_ID_PRE_TREATMENT_DRY_SELF_TEST_FAILURE = 137 + ALARM_ID_PRE_TREATMENT_WET_SELF_TEST_FAILURE = 138 + ALARM_ID_DG_FLOW_METER_CHECK_FAILURE = 139 + ALARM_ID_AVAILABLE_5 = 140 + ALARM_ID_NVDATAMGMT_GROUP_RECORD_CRC_INVALID = 141 + ALARM_ID_NVDATAMGMT_INDIVIDUAL_RECORD_CRC_INVALID = 142 + ALARM_ID_NVDATAMGMT_INDIVIDUAL_RECORD_TIME_INVALID = 143 + ALARM_ID_HD_AC_POWER_LOST = 144 + ALARM_ID_DG_RESTARTED_FAULT = 145 + ALARM_ID_DIALYSATE_CONDUCTIVITY_OUT_OF_RANGE = 146 + ALARM_ID_HD_FLUID_LEAK_DETECTED = 147 + ALARM_ID_DG_FLUID_LEAK_DETECTED = 148 + ALARM_ID_HD_SYRINGE_PUMP_ADC_ERROR = 149 + ALARM_ID_HD_SYRINGE_DETECTED = 150 + ALARM_ID_HD_SYRINGE_PUMP_VOLUME_ERROR = 151 + ALARM_ID_HD_SYRINGE_PUMP_SPEED_ERROR = 152 + ALARM_ID_HD_SYRINGE_PUMP_SYRINGE_EMPTY = 153 + ALARM_ID_HD_SYRINGE_PUMP_OCCLUSION = 154 + ALARM_ID_HD_SYRINGE_PUMP_SYRINGE_REMOVED = 155 + ALARM_ID_HD_SYRINGE_PUMP_NOT_STOPPED_ERROR = 156 + ALARM_ID_HD_BLOOD_LEAK_DETECTED = 157 + ALARM_ID_CARTRIDGE_REMOVAL_FAILURE = 158 + ALARM_ID_DG_RESERVOIR_DRAIN_TIMEOUT = 159 + ALARM_ID_DG_RESERVOIR_FILL_TIMEOUT = 160 + ALARM_ID_DG_RESERVOIR_LEAK_TIMEOUT = 161 + ALARM_ID_DG_HEAT_DISINFECT_TARGET_TEMP_TIMEOUT = 162 + ALARM_ID_DG_TEMP_SENSORS_DIFF_OUT_OF_RANGE = 163 + ALARM_ID_DG_HEAT_DISINFECT_INLET_PRES_AND_TEMP_SNSRS_OUT = 164 + ALARM_ID_DG_HEAT_DISINFECT_INLET_COND_AND_TEMP_OUT = 165 + ALARM_ID_DG_BAD_INLET_WATER_QUALITY = 166 + ALARM_ID_HD_BP_OCCLUSION_SELF_TEST_FAILURE = 167 + ALARM_ID_HD_DIP_OCCLUSION_SELF_TEST_FAILURE = 168 + ALARM_ID_HD_DOP_OCCLUSION_SELF_TEST_FAILURE = 169 + ALARM_ID_HD_ARTERIAL_PRESSURE_SELF_TEST_FAILURE = 170 + ALARM_ID_HD_VENOUS_PRESSURE_SELF_TEST_FAILURE = 171 + ALARM_ID_HD_BLOOD_FLOW_STATUS_SELF_TEST_FAILURE = 172 + ALARM_ID_HD_DIALYSATE_FLOW_STATUS_SELF_TEST_FAILURE = 173 + ALARM_ID_HD_BLOOD_LEAK_SELF_TEST_FAILURE = 174 + ALARM_ID_HD_BLOOD_LEAK_FAULT = 175 + ALARM_ID_DG_LOAD_CELLS_INVALID_CALIBRATION = 176 + ALARM_ID_HD_VOLTAGE_OUT_OF_RANGE = 177 + ALARM_ID_DG_PRIMARY_HEATERS_INTERNAL_TEMP_OUT_OF_RANGE = 178 + ALARM_ID_DG_TRIMMER_HEATER_INTERNAL_TEMP_OUT_OF_RANGE = 179 + ALARM_ID_DG_HEATERS_ON_WITH_NO_FLOW_TIMEOUT = 180 + ALARM_ID_DIALYSATE_CONDUCTIVITY_FAULT = 181 + ALARM_ID_DIALYSATE_TEMPERATURE_HIGH = 182 + ALARM_ID_DIALYSATE_TEMPERATURE_LOW = 183 + ALARM_ID_DG_VOLTAGE_OUT_OF_RANGE = 184 + ALARM_ID_DG_DRAIN_CIRCULATION_LINE_TIMEOUT = 185 + ALARM_ID_DG_INVALID_LOAD_CELL_VALUE = 186 + ALARM_ID_HD_SYRINGE_PUMP_ENCODER_DIRECTION_ERROR = 187 + ALARM_ID_HD_SYRINGE_PUMP_CONTROLLER_DIRECTION_ERROR = 188 + ALARM_ID_HD_SYRINGE_PUMP_FAULT = 189 + ALARM_ID_HD_SYRINGE_PUMP_OVER_TRAVEL_ERROR = 190 + ALARM_ID_HD_SYRINGE_PUMP_NOT_ENOUGH_HEPARIN_ALARM = 191 + ALARM_ID_HD_SYRINGE_PUMP_DAC_WRITE_ERROR = 192 + ALARM_ID_HD_SYRINGE_PUMP_RUNNING_WHILE_BP_OFF_ERROR = 193 + ALARM_ID_DG_CHEM_DISINFECT_INLET_PRES_AND_TEMP_SNSRS_OUT = 194 + ALARM_ID_DG_CHEM_DISINFECT_INLET_COND_AND_TEMP_OUT = 195 + ALARM_ID_DG_FPGA_COMM_TIMEOUT = 196 + ALARM_ID_DG_LOAD_CELL_ADC_ERROR = 197 + ALARM_ID_HD_VENOUS_PRESSURE_READ_TIMEOUT_ERROR = 198 + ALARM_ID_HD_VENOUS_PRESSURE_SENSOR_TEMP_OUT_OF_RANGE = 199 + ALARM_ID_HD_BP_OCCLUSION_READ_TIMEOUT_ERROR = 200 + ALARM_ID_HD_DPI_OCCLUSON_READ_TIMEOUT_ERROR = 201 + ALARM_ID_HD_DPO_OCCLUSION_READ_TIMEOUT_ERROR = 202 + ALARM_ID_HD_BP_OCCLUSION_SENSOR_ERROR = 203 + ALARM_ID_HD_DPI_OCCLUSION_SENSOR_ERROR = 204 + ALARM_ID_HD_DPO_OCCLUSION_SENSOR_ERROR = 205 + ALARM_ID_DG_CONCENTRATE_PUMP_FAULT = 206 + ALARM_ID_HD_BP_FLOW_READ_TIMEOUT_ERROR = 207 + ALARM_ID_HD_BP_FLOW_SENSOR_ERROR = 208 + ALARM_ID_HD_DP_FLOW_READ_TIMEOUT_ERROR = 209 + ALARM_ID_HD_DP_FLOW_SENSOR_ERROR = 210 + ALARM_ID_DG_CHEM_DISINFECT_TARGET_TEMP_TIMEOUT = 211 + ALARM_ID_DG_FPGA_POST_TEST_FAILED = 212 + ALARM_ID_HD_ARTERIAL_BUBBLE_SELF_TEST_FAILURE = 213 + ALARM_ID_HD_ARTERIAL_BUBBLE_DETECTOR_FAULT = 214 + ALARM_ID_DG_HEATERS_SELF_TEST_FAILURE = 215 + ALARM_ID_HD_VENOUS_BUBBLE_SELF_TEST_FAILURE = 216 + ALARM_ID_HD_VENOUS_BUBBLE_DETECTOR_TREATMENT_FAULT = 217 + ALARM_ID_HD_VENOUS_BUBBLE_DETECTOR_RINSEBACK_FAULT = 218 + ALARM_ID_HD_BP_FLOW_SLOW_READ_TIMEOUT_ERROR = 219 + ALARM_ID_HD_DP_FLOW_SLOW_READ_TIMEOUT_ERROR = 220 Index: dialin/common/hd_defs.py =================================================================== diff -u -rf4ac9d2d75508ce99de083ec0aa32b057aab3a38 -r1fd5bc0ed97d0d90223fa78ec195dd7636712c5b --- dialin/common/hd_defs.py (.../hd_defs.py) (revision f4ac9d2d75508ce99de083ec0aa32b057aab3a38) +++ dialin/common/hd_defs.py (.../hd_defs.py) (revision 1fd5bc0ed97d0d90223fa78ec195dd7636712c5b) @@ -28,6 +28,7 @@ MODE_POST = 7 # Post-Treatment mode NUM_OF_MODES = 8 # Number of HD operation modes + @unique class PreTreatmentSubModes(DialinEnum): HD_PRE_TREATMENT_START_STATE = 0 @@ -40,6 +41,7 @@ HD_PRE_TREATMENT_RECIRCULATE_STATE = 7 HD_PRE_TREATMENT_PATIENT_CONNECTION_STATE = 8 + @unique class PreTreatmentSampleWaterStates(DialinEnum): SAMPLE_WATER_SETUP_STATE = 0 @@ -54,6 +56,7 @@ CONSUMABLE_SELF_TESTS_ACID_PUMP_CHECK_STATE = 4 CONSUMABLE_SELF_TESTS_COMPLETE_STATE = 5 + @unique class PreTreatmentNoCartSelfTestStates(DialinEnum): NO_CART_SELF_TESTS_START_STATE = 0 @@ -70,6 +73,7 @@ NO_CART_SELF_TESTS_STOPPED_STATE = 11 NO_CART_SELF_TESTS_COMPLETE_STATE = 12 + @unique class PreTreatmentDrySelfTestStates(DialinEnum): DRY_SELF_TESTS_START_STATE = 0 @@ -83,6 +87,7 @@ DRY_SELF_TESTS_STOPPED_STATE = 8 DRY_SELF_TESTS_COMPLETE_STATE = 9 + @unique class PreTreatmentPrimeStates(DialinEnum): HD_PRIME_START_STATE = 0 @@ -98,11 +103,13 @@ HD_PRIME_PAUSE = 10 HD_PRIME_COMPLETE = 11 + @unique class PreTreatmentRecircStates(DialinEnum): PRE_TREATMENT_RECIRC_STATE = 0 PRE_TREATMENT_RECIRC_STOPPED_STATE = 1 + # Heparin states @unique class HeparinStates(DialinEnum): @@ -114,6 +121,7 @@ HEPARIN_STATE_COMPLETED = 5 # Heparin delivery is completed HEPARIN_STATE_EMPTY = 6 # Heparin syringe is empty + # Syringe pump states @unique class SyringePumpStates(DialinEnum): @@ -126,6 +134,7 @@ SYRINGE_PUMP_HEP_CONTINUOUS_STATE = 6 # Syringe pump continuous state SYRINGE_PUMP_CONFIG_FORCE_SENSOR_STATE = 7 # Syringe pump configure force sensor state + # Syringe pump operations @unique class SyringePumpOperations(DialinEnum): @@ -136,9 +145,147 @@ SYRINGE_PUMP_OP_BOLUS = 4 # Deliver Heparin bolus of set volume over 5 minutes SYRINGE_PUMP_OP_CONTINUOUS = 5 # Continuous dispense of Heparin at set rate + @unique class PostTreatmentStates(DialinEnum): HD_POST_TREATMENT_PATIENT_DISCONNECTION_STATE = 0 HD_POST_TREATMENT_DRAIN_RESERVOIRS_STATE = 1 HD_POST_TREATMENT_VERIFY_STATE = 2 + +@unique +class HD_Pre_Treatment_Mode_States(DialinEnum): + HD_PRE_TREATMENT_START_STATE = 0 # Start pre-treatment mode state + HD_PRE_TREATMENT_WATER_SAMPLE_STATE = 1 # Water sample state + HD_PRE_TREATMENT_SELF_TEST_NO_CART_STATE = 2 # Self tests with no cartridge state + HD_PRE_TREATMENT_CART_INSTALL_STATE = 3 # Consumable and cartridge installation state + HD_PRE_TREATMENT_SELF_TEST_DRY_STATE = 4 # Self tests dry state + HD_PRE_TREATMENT_PRIME_STATE = 5 # Prime blood and dialysate circuits and run wet self-tests state + HD_PRE_TREATMENT_RECIRCULATE_STATE = 6 # Re-circulate blood and dialysate circuits state + HD_PRE_TREATMENT_PATIENT_CONNECTION_STATE = 7 # Patient connection state + NUM_OF_HD_PRE_TREATMENT_STATES = 8 # Number of pre-treatment mode states + + +@unique +class HD_Pre_Treatment_Sample_Water_States(DialinEnum): + SAMPLE_WATER_SETUP_STATE = 0 # Sample water setup state of the sample water sub-mode state machine + SAMPLE_WATER_STATE = 1 # Sample water state of the sample water sub-mode state machine + NUM_OF_SAMPLE_WATER_STATES = 2 # Number of sample water sub-mode states + + +@unique +class HD_Pre_Treatment_Consumable_Self_Test_States(DialinEnum): + CONSUMABLE_SELF_TESTS_INSTALL_STATE = 0 # Consumable self-tests install state + CONSUMABLE_SELF_TESTS_WATER_QUALITY_CHECK_STATE = 1 # Consumable self-tests water quality check state + CONSUMABLE_SELF_TESTS_BICARB_PUMP_CHECK_STATE = 2 # Consumable self-tests bicarbonate concentrate pump check state + CONSUMABLE_SELF_TESTS_ACID_PUMP_CHECK_STATE = 3 # Consumable self-tests acid concentrate pump check state + CONSUMABLE_SELF_TESTS_COMPLETE_STATE = 4 # Consumable self-tests complete state + NUM_OF_CONSUMABLE_SELF_TESTS_STATES = 5 # Number of consumable install sub-mode states + + +@unique +class HD_Pre_Treatment_No_Cart_Self_Tests_States(DialinEnum): + NO_CART_SELF_TESTS_START_STATE = 0 # No cartridge self-tests starting state. + NO_CART_SELF_TESTS_WAIT_FOR_DOOR_CLOSE_STATE = 1 # Wait for door to be closed before running self-tests. + NO_CART_SELF_TESTS_OCCLUSION_SENSORS_STATE = 2 # No cartridge occlusion sensors self-test state. + NO_CART_SELF_TESTS_BLOOD_FLOW_METERS_STATE = 3 # No cartridge blood flow meter self-test state. + NO_CART_SELF_TESTS_DIALYSATE_FLOW_METERS_STATE = 4 # No cartridge dialysate flow meter self-test state. + NO_CART_SELF_TESTS_PUMPS_STATE = 5 # No cartridge self-test for blood pump, dialysate in pump, dialysate out pump state. + NO_CART_SELF_TESTS_LEAK_DETECTORS_STATE = 6 # No cartridge leak detectors self-test state. + NO_CART_SELF_TESTS_BOARD_TEMPERATURE_STATE = 7 # No cartridge board temperature self-test state. + NO_CART_SELF_TESTS_DOOR_SWITCH_STATE = 8 # No cartridge door switch self-test state. + NO_CART_SELF_TESTS_HOME_VALVES_AND_PUMPS_STATE = 9 # No cartridge home valves and pumps self-test state. + NO_CART_SELF_TESTS_HOME_IDLE_STATE = 10 # Wait for valves and pumps finish homing state. + NO_CART_SELF_TESTS_STOPPED_STATE = 11 # No cart self-test stopped state. + NO_CART_SELF_TESTS_COMPLETE_STATE = 12 # No cartridge self-test complete state. + NUM_OF_NO_CART_SELF_TESTS_STATES = 13 # Number of no cartridge self-tests states. + + +@unique +class HD_Pre_Treatment_Cartridge_Install_States(DialinEnum): + CARTRIDGE_INSTALL_STATE = 0 # Pre-treatment Cartridge Install state. + NUM_OF_CARTRIDGE_INSTALL_STATES = 1 # Number of pre-treatment Cartridge Install states. + + +@unique +class HD_Pre_Treatment_Dry_Self_Tests_States(DialinEnum): + DRY_SELF_TESTS_START_STATE = 0 # Dry self-tests starting state. + DRY_SELF_TESTS_WAIT_FOR_DOOR_CLOSE_STATE = 1 # Wait for door to close before executing self-tests. + DRY_SELF_TESTS_BUBBLE_DETECTOR_STATE = 2 # Bubble detectors dry self-test state. + DRY_SELF_TESTS_OCCLUSION_SENSORS_STATE = 3 # Occlusion sensors dry self-test state. + DRY_SELF_TESTS_PRESSURE_SENSORS_SETUP_STATE = 4 # Pressure sensors dry self-test setup valves and pump state. + DRY_SELF_TESTS_PRESSURE_SENSORS_STATE = 5 # Pressure sensors verify pressure readings state. + DRY_SELF_TESTS_PRESSURE_SENSORS_NORMAL_STATE = 6 # Preassure sensors verify normal pressure readings state. + DRY_SELF_TESTS_SYRINGE_PUMP_PRIME_STATE = 7 # Prime syringe pump state + DRY_SELF_TESTS_STOPPED_STATE = 8 # Dry self-test stopped state. + DRY_SELF_TESTS_COMPLETE_STATE = 9 # Dry self-test complete state. + NUM_OF_DRY_SELF_TESTS_STATES = 10 # Number of dry self-tests states. + + +@unique +class HD_Pre_Treatment_Prime_States(DialinEnum): + HD_PRIME_START_STATE = 0 # Prime start state + HD_PRIME_WAIT_FOR_USER_START_STATE = 1 # Wait for user to start prime state + HD_PRIME_SALINE_SETUP_STATE = 2 # Saline setup state + HD_PRIME_SALINE_PURGE_AIR_STATE = 3 # Saline purge air state + HD_PRIME_SALINE_CIRC_BLOOD_CIRCUIT_STATE = 4 # Circulate blood circuit state + HD_PRIME_RESERVOIR_ONE_FILL_COMPLETE_STATE = 5 # Wait for reservoir 1 fill complete + HD_PRIME_DIALYSATE_DIALYZER_STATE = 6 # Dialysate dialyzer fluid path state + HD_PRIME_RESERVOIR_TWO_FILL_COMPLETE_STATE = 7 # Wait for reservoir 2 fill complete + HD_PRIME_DIALYSATE_BYPASS_STATE = 8 # Dialysate bypass fluid path state + HD_PRIME_WET_SELF_TESTS_STATE = 9 # Perform wet self-tests after priming complete + HD_PRIME_PAUSE = 10 # Prime pause state, waits to be resumed + HD_PRIME_COMPLETE = 11 # Prime complete state + NUM_OF_HD_PRIME_STATES = 12 # Number of prime sub-mode states + + +@unique +class HD_Pre_Treatment_Recirc_States(DialinEnum): + PRE_TREATMENT_RECIRC_STATE = 0 # Pre-treatment recirculate state. + PRE_TREATMENT_RECIRC_STOPPED_STATE = 1 # Pre-treatment recirculate stopped state. + NUM_OF_PRE_TREATMENT_RECIRC_STATES = 2 # Number of pre-treatment recirculate states. + + +@unique +class HD_Pre_Treatment_Patient_Connection_States(DialinEnum): + PATIENT_CONNECTION_STATE = 0 # Pre-treatment Patient Connection state. + NUM_OF_PATIENT_CONNECTION_STATES = 1 # Number of pre-treatment Patient Connection states. + + +@unique +class HD_Standby_States(DialinEnum): + STANDBY_START_STATE = 0 # Start standby + STANDBY_WAIT_FOR_TREATMENT_STATE = 1 # Wait for treatment + STANDBY_WAIT_FOR_DISINFECT_STATE = 2 # Wait for disinfection + STANDBY_DG_FLUSH_IN_PROGRESS_STATE = 3 # DG flush operation is in progress + STANDBY_DG_HEAT_DISINFECT_IN_PROGRESS_STATE = 4 # DG heat disinfection operation is in progress + STANDBY_DG_CHEM_DISINFECT_IN_PROGRESS_STATE = 5 # DG chemical disinfection operation is in progress + NUM_OF_STANDBY_STATES = 6 # Number of standby states (sub-modes) + + +@unique +class DG_Heat_States(DialinEnum): # although it is a dg state and the file is hd_defs since we don't have dg_defs I put it here. + DG_HEAT_DISINFECT_STATE_START = 0 # Heat disinfect, start mode state + DG_HEAT_DISINFECT_STATE_DRAIN_R1 = 1 # Heat disinfect, drain R1 state + DG_HEAT_DISINFECT_STATE_DRAIN_R2 = 2 # Heat disinfect, drain R2 state + DG_HEAT_DISINFECT_STATE_FLUSH_DRAIN = 3 # Heat disinfect, flush drain state + DG_HEAT_DISINFECT_STATE_FLUSH_CIRCULATION = 4 # Heat disinfect, flush circulation state + DG_HEAT_DISINFECT_STATE_FLUSH_R1_AND_R2 = 5 # Heat disinfect, flush R1 and R2 state + DG_HEAT_DISINFECT_STATE_FLUSH_R2_AND_DRAIN_R1 = 6 # Heat disinfect, flush R2 and drain R1 state + DG_HEAT_DISINFECT_STATE_FLUSH_DRAIN_R2 = 7 # Heat disinfect, flush drain R2 state + DG_HEAT_DISINFECT_STATE_FLUSH_DRAIN_R1 = 8 # Heat disinfect, flush drain R1 state + DG_HEAT_DISINFECT_STATE_FILL_WITH_WATER = 9 # Heat disinfect, fill with water state + DG_HEAT_DISINFECT_STATE_DISINFECT_R1_TO_R2 = 10 # Heat disinfect, disinfect R1 to R2 state + DG_HEAT_DISINFECT_STATE_FILL_R2_WITH_HOT_WATER = 11 # Heat disinfect, fill R2 with hot water state + DG_HEAT_DISINFECT_STATE_DISINFECT_R2_TO_R1 = 12 # Heat disinfect, disinfect R2 to R1 state + DG_HEAT_DISINFECT_STATE_COOL_DOWN_HEATERS = 13 # Heat disinfect, cool down heaters state + DG_HEAT_DISINFECT_STATE_COOL_DOWN_RO_FILTER = 14 # Heat disinfect, cool down RO filter state + DG_HEAT_DISINFECT_STATE_MIX_DRAIN_R1 = 15 # Heat disinfect, mix drain R1 state + DG_HEAT_DISINFECT_STATE_MIX_DRAIN_R2 = 16 # Heat disinfect, mix drain R2 state + DG_HEAT_DISINFECT_STATE_RINSE_R1_TO_R2 = 17 # Heat disinfect, rinse R1 to R2 state + DG_HEAT_DISINFECT_STATE_RINSE_R2_TO_R1_AND_DRAIN_R1 = 18 # Heat disinfect, rinse R2 to R1 and drain R1 state + DG_HEAT_DISINFECT_STATE_RINSE_CIRCULATION = 19 # Heat disinfect, rinse circulation state + DG_HEAT_DISINFECT_STATE_CANCEL_BASIC_PATH = 20 # Heat disinfect, cancel mode basic path state + DG_HEAT_DISINFECT_STATE_CANCEL_WATER_PATH = 21 # Heat disinfect, cancel mode water path state + DG_HEAT_DISINFECT_STATE_COMPLETE = 22 # Heat disinfect, complete state + NUM_OF_DG_HEAT_DISINFECT_STATES = 23 # Number of heat disinfect mode states Index: dialin/common/msg_defs.py =================================================================== diff -u -r4a14fb08755f069501169e63a652d8681135462c -r1fd5bc0ed97d0d90223fa78ec195dd7636712c5b --- dialin/common/msg_defs.py (.../msg_defs.py) (revision 4a14fb08755f069501169e63a652d8681135462c) +++ dialin/common/msg_defs.py (.../msg_defs.py) (revision 1fd5bc0ed97d0d90223fa78ec195dd7636712c5b) @@ -15,243 +15,23 @@ ############################################################################ from enum import unique from ..utils.base import DialinEnum +from .msg_ids import MsgIds +# Define msg ids that are not yet added to common but are needed in dialin @unique -class MsgIds(DialinEnum): - MSG_ID_UNUSED = 0 # Zero is an undefined (un-used) message ID) - MSG_ID_OFF_BUTTON_PRESS = 1 # HD/UI off button interactions - MSG_ID_ALARM_STATUS = 2 # HD broadcast of system alarm state information - MSG_ID_ALARM_TRIGGERED = 3 # HD broadcast of a triggered alarm - MSG_ID_ALARM_CLEARED = 4 # HD broadcast of a cleared alarm - MSG_ID_BLOOD_FLOW_DATA = 5 # HD broadcast of blood flow/pump data - MSG_ID_DG_CHECK_IN = 6 # DG check-in with HD - MSG_ID_UI_CHECK_IN = 7 # UI check-in with HD - MSG_ID_DIALYSATE_FLOW_DATA = 8 # HD broadcast of dialysate inlet flow/pump data - MSG_ID_PRESSURE_OCCLUSION_DATA = 9 # HD broadcast of pressure/occlusion data - MSG_ID_RTC_EPOCH = 0xA # HD broadcast of current date and time from clock - MSG_ID_DIALYSATE_OUT_FLOW_DATA = 0xB # HD broadcast of dialysate outlet flow/pump/load cell data - MSG_ID_LOAD_CELL_READINGS = 0xC # DG broadcast of load cell weights - MSG_ID_TREATMENT_TIME = 0xD # HD broadcast of treatment time - MSG_ID_POWER_OFF_WARNING = 0xE # HD broadcast power off warning - system power down is imminent - MSG_ID_TREATMENT_STATE = 0xF # HD broadcast of treatment state - MSG_ID_USER_UF_PAUSE_RESUME_REQUEST = 0x10 # User request to pause or resume ultrafiltration - MSG_ID_USER_UF_SETTINGS_CHANGE_REQUEST = 0x11 # User request to change ultrafiltration settings - MSG_ID_USER_SALINE_BOLUS_REQUEST = 0x12 # User request for a saline bolus - MSG_ID_USER_UF_SETTINGS_CHANGE_RESPONSE = 0x13 # HD response to user request to change ultrafiltration settings - MSG_ID_USER_SALINE_BOLUS_RESPONSE = 0x14 # HD response to user saline bolus request - MSG_ID_USER_CONFIRM_UF_SETTINGS_CHANGE = 0x15 # User confirmation of ultrafiltration settings change - MSG_ID_USER_TREATMENT_TIME_CHANGE_REQUEST = 0x16 # User request to change treatment duration - MSG_ID_USER_BLOOD_DIAL_RATE_CHANGE_REQUEST = 0x17 # User request to change blood and dialysate rates - MSG_ID_USER_BLOOD_DIAL_RATE_CHANGE_RESPONSE = 0x18 # HD response to user request to change blood and dialysate rates - MSG_ID_SET_DG_DIALYSATE_TEMP_TARGETS = 0x19 # HD provides DG with dialysate temperature set points - MSG_ID_TREATMENT_PARAM_CHANGE_RANGES = 0x1A # HD provides several parameter change ranges as they evolve over treatment duration - MSG_ID_USER_TREATMENT_TIME_CHANGE_RESPONSE = 0x1B # HD response to user request to change treatment duration - MSG_ID_REQUEST_FW_VERSIONS = 0x1C # UI request for f/w versions - MSG_ID_HD_VERSION = 0x1D # HD f/w version - MSG_ID_DG_VERSION = 0x1E # DG f/w version - MSG_ID_RO_PUMP_DATA = 0x1F # DG broadcast of RO pump data - MSG_ID_DG_PRESSURES_DATA = 0x20 # DG broadcast of pressure sensors data - MSG_ID_DG_SWITCH_RESERVOIR_CMD = 0x21 # HD request to DG to switch reservoirs (A->B or B->A) - MSG_ID_DG_FILL_CMD = 0x22 # HD request to DG to fill inactive reservoir - MSG_ID_DG_DRAIN_CMD = 0x23 # HD request to DG to drain inactive reservoir - MSG_ID_DRAIN_PUMP_DATA = 0x24 # DG broadcast of drain pump data - MSG_ID_HD_OP_MODE = 0x25 # HD broadcast current operating mode - MSG_ID_STARTING_STOPPING_TREATMENT_CMD = 0x26 # HD request to DG to move in/out of standby mode due to treatment start/stop - MSG_ID_DG_OP_MODE = 0x27 # DG broadcast current operating mode - MSG_ID_DG_RESERVOIR_DATA = 0x28 # DG broadcast reservoir data - MSG_ID_DG_SAMPLE_WATER_CMD = 0x29 # HD request to DG to allow user to get a water sample - MSG_ID_DG_VALVES_STATES = 0x2A # DG broadcast valve states - MSG_ID_DG_START_STOP_TRIMMER_HEATER_CMD = 0x2B # HD request to DG to start/stop trimmer heater - MSG_ID_DG_HEATERS_DATA = 0x2C # DG broadcast of the heaters data - MSG_ID_DG_TEMPERATURE_DATA = 0x2D # DG broadcast of the temperature sensors data - MSG_ID_USER_UF_SETTINGS_CHANGE_CONFIRMATION_RESPONSE = 0x2E # HD response to user selection of ultrafiltration settings change option selection - MSG_ID_SALINE_BOLUS_DATA = 0x2F # HD broadcast of saline bolus data - MSG_ID_DG_START_STOP_HEAT_DISINFECT = 0x30 # HD request to start or stop DG heat disinfection - MSG_ID_DG_CONDUCTIVITY_DATA = 0x31 # DG broadcast of the conductivity sensors data - MSG_ID_USER_REQUEST_ALARM_SILENCE = 0x32 # UI request alarm silence (or cancel) - MSG_ID_HD_ACCELEROMETER_DATA = 0x33 # HD broadcast of accelerometer data - MSG_ID_DG_ACCELEROMETER_DATA = 0x34 # DG broadcast of accelerometer data - MSG_ID_UI_NEW_TREATMENT_PARAMS = 0x35 # UI request to validate new treatment parameter set - MSG_ID_HD_NEW_TREATMENT_PARAMS_RESPONSE = 0x36 # HD response to new treatment parameters set - MSG_ID_DG_HEAT_DISINFECT_DATA = 0x37 # DG heat disinfection publish data - MSG_ID_UI_START_TREATMENT = 0x38 # UI user request to initiate a treatment - MSG_ID_HD_START_TREATMENT_RESPONSE = 0x39 # HD response to user request to initiate a treatment - MSG_ID_HD_VALVES_DATA = 0x3A # HD broadcast of valves data - MSG_ID_UI_USER_CONFIRM_TREATMENT_PARAMS = 0x3B # UI user confirmation of treatment parameters - MSG_ID_UI_START_PRIME_REQUEST = 0x3C # UI user has requested to start priming - MSG_ID_HD_START_PRIME_RESPONSE = 0x3D # HD response to user request to start priming - MSG_ID_HD_AIR_TRAP_DATA = 0x003E # HD broadcast of air trap data - MSG_ID_ALARM_CONDITION_CLEARED = 0x3F # Broadcast that the alarm condition has been cleared - MSG_ID_UI_ALARM_USER_ACTION = 0x40 # UI user has requested an alarm action - MSG_ID_USER_UF_PAUSE_RESUME_RESPONSE = 0x41 # HD response to user request to pause or resume UF - MSG_ID_DG_CONCENTRATE_PUMP_DATA = 0x42 # DG broadcast of concentrate pump data - MSG_ID_DG_PRIMING_STATUS_DATA = 0x43 # HD priming status during cartridge prime - MSG_ID_DG_UV_REACTORS_DATA = 0x44 # DG broadcast UV reactors data - MSG_ID_DG_THERMISTORS_DATA = 0x45 # DG broadcast thermistors data - MSG_ID_UI_PRESSURE_LIMITS_CHANGE_REQUEST = 0x46 # UI request to change pressure limits - MSG_ID_HD_PRESSURE_LIMITS_CHANGE_RESPONSE = 0x47 # HD response to change pressure limits request - MSG_ID_DG_FANS_DATA = 0x48 # DG broadcast fans data - MSG_ID_HD_CALIBRATION_DATA = 0x49 # HD broadcast calibration data - MSG_ID_UI_HEPARIN_PAUSE_RESUME_REQUEST = 0x4B # UI request to pause/resume Heparin delivery - MSG_ID_HD_HEPARIN_PAUSE_RESUME_RESPONSE = 0x4C # HD Heparin Pause/Resume Response - MSG_ID_HD_HEPARIN_DATA = 0x4D # HD Broadcast heparin data - MSG_ID_UI_SET_ALARM_AUDIO_VOLUME_LEVEL_CMD = 0x4E # UI command to set alarm audio volume level - MSG_ID_UI_PRE_TREATMENT_UF_REQUEST = 0x4F # UI UF Initialization Request - MSG_ID_HD_PRE_TREATMENT_UF_RESPONSE = 0x50 # HD response to user request to adjust the ultrafiltration in pre-treatment - MSG_ID_HD_RINSEBACK_CMD_RESPONSE = 0x53 # HD rinseback request response - MSG_ID_HD_RECIRC_CMD_RESPONSE = 0x55 # HD re-circ request response - MSG_ID_HD_RINSEBACK_PROGRESS = 0x56 # HD broadcast of rinseback progress - MSG_ID_HD_RECIRCULATE_PROGRESS = 0x5A # HD broadcast of recirculate progress - MSG_ID_HD_BLOOD_PRIME_PROGRESS = 0x59 # HD broadcast of blood prime progress - MSG_ID_UI_TX_END_CMD = 0x57 # UI end treatment sub-mode user request - MSG_ID_HD_TX_END_CMD_RESPONSE = 0x58 # HD end treatment sub-mode user request response +class MsgIdsDialin(DialinEnum): + MSG_DIALIN_ID_HD_SERIAL_NUMBER_RESPONSE = 0X87 + MSG_DIALIN_ID_DG_SERIAL_NUMBER_RESPONSE = 0X88 + MSG_DIALIN_ID_UI_SYSTEM_USAGE_REQUEST = 0x89 + MSG_DIALIN_ID_HD_SYSTEM_USAGE_RESPONSE = 0x8A + MSG_DIALIN_ID_DG_SYSTEM_USAGE_RESPONSE = 0x8C + MSG_DIALIN_ID_HD_DISINFECT_STATE = 0x7E - MSG_ID_PRE_TREATMENT_STATE = 0x5C # HD broadcast of pre-treatment state - MSG_ID_UI_SAMPLE_WATER_CMD = 0x5D # UI sample water sub-mode user request - MSG_ID_HD_SAMPLE_WATER_CMD_RESPONSE = 0x5E # HD sample water sub-mode request response - MSG_ID_UI_SAMPLE_WATER_RESULT = 0x5F # UI sample water result message - MSG_ID_DG_FILTER_FLUSH_PROGRESS = 0x60 # DG broadcast of filter flush progress - MSG_ID_HD_SELF_TEST_NO_CART_PROGRESS = 0x61 # HD broadcast of no cartridge self-tests progress - MSG_ID_UI_INSTALLATION_CONFIRM = 0x62 # UI disposable installation user confirmation - MSG_ID_HD_SELF_TEST_DRY_PROGRESS = 0x63 # HD broadcast of dry self-tests progress - MSG_ID_UI_CONTINUE_TO_TREATMENT_REQUEST = 0x64 # UI user has requested to continue to treatment - MSG_ID_HD_CONTINUE_TO_TREATMENT_RESPONSE = 0x65 # HD response to user request to continue to treatment - MSG_ID_UI_PATIENT_CONNECTION_CONFIRM = 0x66 # UI user has confirmed patient connection completed - MSG_ID_HD_PATIENT_CONNECTION_CONFIRM_RESPONSE = 0x67 # HD response to user confirmation of patient connection - MSG_ID_UI_PATIENT_DISCONNECTION_CONFIRM = 0x4A # UI patient disconnection confirm - MSG_ID_UI_DISPOSABLE_REMOVAL_CONFIRM = 0x73 # UI user has confirmed disposable removal - MSG_ID_HD_DISPOSABLE_REMOVAL_CONFIRM_RESPONSE = 0x74 # HD response to user confirmation of disposable removal - MSG_ID_UI_TREATMENT_LOG_DATA_REQUEST = 0x75 # UI request treatment log data message - MSG_ID_HD_TREATMENT_LOG_DATA_RESPONSE = 0x76 # HD response to UI treatment log data request +ACK_NOT_REQUIRED = [ + MsgIds.MSG_ID_ALARM_CONDITION_CLEARED.value +] - MSG_ID_DG_DISINFECT_STATE = 0x7E # DG disinfect states - - - MSG_ID_CAN_ERROR_COUNT = 0x999 # test code in support of EMC testing - - - # service/test CAN messages - MSG_ID_TESTER_LOGIN_REQUEST = 0x8000 # HD tester log-in - MSG_ID_DIAL_OUT_FLOW_SET_PT_OVERRIDE = 0x8001 # Dialysate outlet flow set point override request - MSG_ID_OFF_BUTTON_STATE_OVERRIDE = 0x8002 # Off button override request - MSG_ID_STOP_BUTTON_STATE_OVERRIDE = 0x8003 # Stop button override request - MSG_ID_ALARM_LAMP_PATTERN_OVERRIDE = 0x8004 # Alarm lamp pattern override request - MSG_ID_WATCHDOG_TASK_CHECKIN_OVERRIDE = 0x8005 # Watchdog task check-in override request - MSG_ID_ALARM_STATE_OVERRIDE = 0x8006 # Alarm state override request - MSG_ID_ALARM_TIME_OVERRIDE = 0x8007 # Alarm time override request - MSG_ID_BLOOD_FLOW_SET_PT_OVERRIDE = 0x8008 # Blood flow set point override request - MSG_ID_BLOOD_FLOW_MEAS_OVERRIDE = 0x8009 # Blood flow measured override request - MSG_ID_BLOOD_PUMP_MC_MEAS_SPEED_OVERRIDE = 0x800A # Blood pump motor controller speed override request - MSG_ID_BLOOD_PUMP_MC_MEAS_CURR_OVERRIDE = 0x800B # Blood pump motor controller current override request - MSG_ID_BLOOD_FLOW_SEND_INTERVAL_OVERRIDE = 0x800C # Blood flow broadcast interval override request - MSG_ID___AVAILABLE_1 = 0x800D # This msg ID is available for use - MSG_ID_BLOOD_PUMP_MEAS_SPEED_OVERRIDE = 0x800E # Blood pump measured motor speed override request - MSG_ID_BLOOD_PUMP_MEAS_ROTOR_SPEED_OVERRIDE = 0x800F # Blood pump measured rotor speed override request - MSG_ID_DIAL_IN_FLOW_SET_PT_OVERRIDE = 0x8010 # Dialysate inlet flow set point override request - MSG_ID_DIAL_IN_FLOW_MEAS_OVERRIDE = 0x8011 # Dialysate inlet flow measured override request - MSG_ID_DIAL_IN_PUMP_MC_MEAS_SPEED_OVERRIDE = 0x8012 # Dialysate inlet pump motor controller speed override request - MSG_ID_DIAL_IN_PUMP_MC_MEAS_CURR_OVERRIDE = 0x8013 # Dialysate inlet pump motor controller current override request - MSG_ID_DIAL_IN_FLOW_SEND_INTERVAL_OVERRIDE = 0x8014 # Dialysate inlet flow broadcast interval override request - MSG_ID_DIAL_IN_PUMP_MEAS_SPEED_OVERRIDE = 0x8015 # Dialysate inlet pump measured motor speed override request - MSG_ID_DIAL_IN_PUMP_MEAS_ROTOR_SPEED_OVERRIDE = 0x8016 # Dialysate inlet pump measured rotor speed override request - MSG_ID_PRESSURE_ARTERIAL_OVERRIDE = 0x8017 # Arterial pressure measured override request - MSG_ID_PRESSURE_VENOUS_OVERRIDE = 0x8018 # Venous pressure measured override request - MSG_ID_OCCLUSION_BLOOD_PUMP_OVERRIDE = 0x8019 # Blood pump occlusion pressure measured override request - MSG_ID_OCCLUSION_DIAL_IN_PUMP_OVERRIDE = 0x801A # Dialysate inlet pump occlusion pressure measured override request - MSG_ID_OCCLUSION_DIAL_OUT_PUMP_OVERRIDE = 0x801B # Dialysate outlet pump occlusion pressure measured override request - MSG_ID_PRES_OCCL_SEND_INTERVAL_OVERRIDE = 0x801C # Pressure and occlusion broadcast interval override request - MSG_ID_SET_RTC_DATE_TIME = 0x801D # RTC set date/time request - MSG_ID_DIAL_OUT_FLOW_SEND_INTERVAL_OVERRIDE = 0x801E # Dialysate outlet flow broadcast interval override request - MSG_ID_DIAL_OUT_UF_REF_VOLUME_OVERRIDE = 0x801F # Dialysate outlet - ultrafiltration reference volume override request - MSG_ID_DIAL_OUT_UF_MEAS_VOLUME_OVERRIDE = 0x8020 # Dialysate outlet - ultrafiltration measured volume override request - MSG_ID_DIAL_OUT_PUMP_MC_MEAS_SPEED_OVERRIDE = 0x8021 # Dialysate outlet pump motor controller speed override request - MSG_ID_DIAL_OUT_PUMP_MC_MEAS_CURR_OVERRIDE = 0x8022 # Dialysate outlet pump motor controller current override request - MSG_ID_DIAL_OUT_PUMP_MEAS_SPEED_OVERRIDE = 0x8023 # Dialysate outlet pump measured motor speed override request - MSG_ID_DIAL_OUT_PUMP_MEAS_ROTOR_SPEED_OVERRIDE = 0x8024 # Dialysate outlet pump measured rotor speed override request - MSG_ID_DIAL_OUT_LOAD_CELL_WEIGHT_OVERRIDE = 0x8025 # Load cell measured weight override request - MSG_ID_HD_SAFETY_SHUTDOWN_OVERRIDE = 0x8026 # HD safety shutdown override request - MSG_ID_HD_ACCEL_OVERRIDE = 0x8027 # HD accelerometer sensor override request - MSG_ID_HD_ACCEL_MAX_OVERRIDE = 0x8028 # HD accelerometer sensor max. override request - MSG_ID_HD_ACCEL_SEND_INTERVAL_OVERRIDE = 0x8029 # HD accelerometer data broadcast interval override request - MSG_ID_HD_ACCEL_SET_CALIBRATION = 0x802A # HD accelerometer set calibration factors request - MSG_ID_HD_BLOOD_FLOW_SET_CALIBRATION = 0x802B # Blood flow set calibration factors request - MSG_ID_HD_DIALYSATE_FLOW_SET_CALIBRATION = 0x802C # Dialysate flow set calibration factors request - MSG_ID_HD_SET_PARAMETER_TREATMENT_PARAMETER = 0x802D # Set a treatment parameter (will change actual setting, not an override) - MSG_ID_HD_VALVES_HOME = 0x802E # Home an HD Valve - MSG_ID_HD_VALVES_POSITION_OVERRIDE = 0x802F # Set an HD valve to a position in counts - MSG_ID_HD_VALVES_SET_AIR_TRAP_VALVE = 0x8030 # Set the HD blood trap valve status - MSG_ID_HD_VALVES_SET_PWM_OVERRIDE = 0x8031 # Set an HD valve PWM - MSG_ID_DG_AIR_TRAP_DATA_BROADCAST_INTERVAL_OVERRIDE = 0x8032 # HD air trap data broadcast interval override request - MSG_ID_DG_AIR_TRAP_LEVEL_SENSOR_OVERRIDE = 0x8033 # HD air trap level sensor override request - MSG_ID_HD_SOFTWARE_RESET_REQUEST = 0x8034 # HD reset request - MSG_ID_BLOOD_FLOW_SIG_STRENGTH_OVERRIDE = 0x8035 # Blood flow signal strength override request - MSG_ID_DIAL_IN_FLOW_SIG_STRENGTH_OVERRIDE = 0x8036 # Dialysate flow signal strength override request - MSG_ID_BLOOD_PUMP_HOME_CMD = 0x8037 # Blood pump home command - MSG_ID_DIAL_IN_PUMP_HOME_CMD = 0x8038 # Dialysate inlet pump home command - MSG_ID_DIAL_OUT_PUMP_HOME_CMD = 0x8039 # Dialysate outlet pump home command - MSG_ID_SUPER_CLEAR_ALARMS_CMD = 0x803A # Clears all alarms (even if non-recoverable or fault) - MSG_ID_HD_REQUEST_CALIBRATION_DATA = 0x803B # Requests calibration data from HD - MSG_ID_HD_ERASE_CALIBRATION_DATA = 0x803C # Requests calibration data on HD be erased - - MSG_ID_DG_TESTER_LOGIN_REQUEST = 0XA000 # DG tester log-in - MSG_ID_DG_ALARM_STATE_OVERRIDE = 0xA001 # DG alarm state override message ID - MSG_ID_DG_WATCHDOG_TASK_CHECKIN_OVERRIDE = 0xA002 # Watchdog check-in override request - MSG_ID_DG_SET_RTC_DATE_TIME = 0xA004 # DG RTC set date/time - MSG_ID_LOAD_CELL_OVERRIDE = 0xA005 # Load cell sensor override request - MSG_ID_PRESSURE_OVERRIDE = 0xA006 # Pressure sensor override request - MSG_ID_PRESSURE_SEND_INTERVAL_OVERRIDE = 0xA007 # Pressure data broadcast interval override request - MSG_ID_RO_PUMP_SET_PT_OVERRIDE = 0xA008 # RO pump set pt. override request - MSG_ID_RO_MEASURED_FLOW_OVERRIDE = 0xA009 # RO measured flow rate override request - MSG_ID_RO_PUMP_SEND_INTERVAL_OVERRIDE = 0xA00A # RO pump data broadcast interval override request - MSG_ID_DRAIN_PUMP_SET_RPM_OVERRIDE = 0xA00B # Drain pump set RPM override request - MSG_ID_DRAIN_PUMP_SEND_INTERVAL_OVERRIDE = 0xA00C # Drain pump data broadcast interval override request - MSG_ID_LOAD_CELLL_SEND_INTERVAL_OVERRIDE = 0xA00D # Load cell data broadcast interval override request - MSG_ID_VALVE_STATE_OVERRIDE = 0xA00E # Valve state override request - MSG_ID_VALVES_STATES_PUBLISH_INTERVAL_OVERRIDE = 0xA00F # Valve data broadcast interval override request - MSG_ID_TEMPERATURE_SENSORS_VALUE_OVERRIDE = 0xA010 # Temperature sensor override request - MSG_ID_START_STOP_PRIMARY_HEATER = 0xA011 # Start/stop primary heaters - MSG_ID_TEMPERATURE_SENSORS_PUBLISH_INTERVAL_OVERRIDE = 0xA012 # Temperature sensors data publish override - MSG_ID_HEATERS_PUBLISH_INTERVAL_ORVERRIDE = 0xA013 # Heaters data publish override - MSG_ID_DG_SAFETY_SHUTDOWN_OVERRIDE = 0xA014 # DG safety shutdown override request - MSG_ID_CONDUCTIVITY_OVERRIDE = 0xA015 # Conductivity sensor override request - MSG_ID_CONDUCTIVITY_PUBLISH_INTERVAL_OVERRIDE = 0xA016 # Conductivity sensors data publish override - MSG_ID_DG_ACCEL_OVERRIDE = 0xA017 # DG accelerometer sensor override request - MSG_ID_DG_ACCEL_MAX_OVERRIDE = 0xA018 # DG accelerometer sensor max. override request - MSG_ID_DG_ACCEL_SEND_INTERVAL_OVERRIDE = 0xA019 # DG accelerometer data broadcast interval override request - MSG_ID_DG_ACCEL_SET_CALIBRATION = 0xA01A # DG accelerometer set calibration factors request - MSG_ID_RO_PUMP_SET_PWM = 0xA01B # RO pump set PWM for open loop - MSG_ID_DRAIN_PUMP_SET_DELTA_PRESSURE_OVERRIDE = 0xA01C # Drain pump set delta pressure override - MSG_ID_HEAT_DISINFECT_RECIRC_PATH_DURATION_MINS = 0xA01D # Heat disinfection recirculation path duration in minutes - MSG_ID_HEAT_DISINFECT_RSRVR1_TO_RSRVR2_DURATION_MINS = 0xA01E # Heat disinfection reservoir 1 to reservoir 2 duration in minutes - MSG_ID_HEAT_DISINFECT_RSRVR2_TO_RSRVR1_DURATION_MINS = 0xA01F # Heat disinfection reservoir 2 to reservoir 1 duration in minutes - MSG_ID_HEAT_DISINFECT_NO_OF_CYCLES_TO_RUN = 0xA020 # Heat disinfection number of cycles to run - MSG_ID_HEAT_DISINFECT_PUBLISH_INTERVAL_OVERRIDE = 0xA021 # Heat disinfection data publish interval override request - MSG_ID_DG_SOFTWARE_RESET_REQUEST = 0xA022 # DG reset request - MSG_ID_DG_CONCENTRATE_PUMP_MEASURED_SPEED_OVERRIDE = 0xA023 # DG concentrate pump measured speed override request - MSG_ID_CONCENTRATE_PUMP_TARGET_SPEED_OVERRIDE = 0xA024 # Concentrate pumps' target speed override request - MSG_ID_UV_REACTORS_DATA_PUBLISH_INTERVAL_OVERRIDE = 0xA025 # UV reactors data publish interval override - MSG_ID_CONCENTRATE_PUMP_STATE_CHANGE_REQUEST = 0xA026 # Concentrate pumps' state change request (on / off) - MSG_ID_CONCENTRATE_PUMP_PUBLISH_INTERVAL_OVERRIDE = 0xA027 # Concentrate pumps' data publish interval override request - MSG_ID_DG_START_STOP_INLET_UV_REACTOR = 0xA028 # DG start/stop inlet UV reactor - MSG_ID_DG_REQUEST_CALIBRATION_DATA = 0xA029 # Requests calibration data from DG - MSG_ID_DG_FANS_DATA_PUBLISH_OVERRIDE = 0xA02A # Fans data publish interval override request - MSG_ID_DG_START_STOP_OUTLET_UV_REACTOR = 0xA02B # DG start/stop outlet UV reactor - MSG_ID_DG_UV_REACTORS_HEALTH_OVERRIDE = 0xA02C # DG UV reactors health override request - MSG_ID_DG_THERMISTORS_DATA_PUBLISH_INTERVAL_OVERRIDE = 0xA02D # DG thermistors data publish interval override - MSG_ID_DG_THERMISTORS_VALUE_OVERRIDE = 0xA02E # DG thermistors value override - MSG_ID_DG_RO_PUMP_DUTY_CYCLE_OVERRIDE = 0xA02F # DG RO pump duty cycle override - MSG_ID_DG_RO_FLOW_RATE_OVERRIDE = 0xA030 # DG RO flow rate override - MSG_ID_DG_RO_PUMP_TARGET_FLOW_OVERRIDE = 0xA031 # DG RO pump target flow rate override - MSG_ID_DG_RO_PUMP_TARGET_PRESSURE_OVERRIDE = 0xA032 # DG RO pump target pressure override - MSG_ID_DG_SET_CALIBRATION_DATA = 0xA033 # DG set calibration data - - MSG_ID_HD_DEBUG_EVENT = 0xFFF1 # HD debug event text to be logged in event log - MSG_ID_DG_DEBUG_EVENT = 0xFFF2 # DG debug event text to be logged in event log - - END_OF_MSG_IDS = 0xFFF3 # End of system message IDs - MSG_ID_ACK_MESSAGE_THAT_REQUIRES_ACK = 0XFFFF # Generic acknowledge - @unique class RequestRejectReasons(DialinEnum): REQUEST_REJECT_REASON_NONE = 0 @@ -277,14 +57,19 @@ REQUEST_REJECT_REASON_VENOUS_PRESSURE_LOW_VS_HIGH = 20 REQUEST_REJECT_REASON_SALINE_MAX_VOLUME_REACHED = 21 REQUEST_REJECT_REASON_SALINE_BOLUS_NOT_IN_PROGRESS = 22 - NUM_OF_REQUEST_REJECT_REASONS = 23 + REQUEST_REJECT_REASON_ACTION_DISABLED_IN_CURRENT_STATE = 23 + REQUEST_REJECT_REASON_ALARM_IS_ACTIVE = 24 + REQUEST_REJECT_REASON_INVALID_COMMAND = 25 + REQUEST_REJECT_REASON_TREATMENT_IS_COMPLETED = 26 + REQUEST_REJECT_REASON_RINSEBACK_MAX_VOLUME_REACHED = 27 + REQUEST_REJECT_REASON_UF_VOLUME_NOT_SET = 28 + REQUEST_REJECT_REASON_NO_PATIENT_CONNECTION_CONFIRM = 29 + REQUEST_REJECT_REASON_HEPARIN_PAUSE_INVALID_IN_THIS_STATE = 30 + REQUEST_REJECT_REASON_HEPARIN_NOT_PAUSED = 31 + REQUEST_REJECT_REASON_DG_COMM_LOST = 32 + REQUEST_REJECT_REASON_DRAIN_NOT_COMPLETE = 33 + NUM_OF_REQUEST_REJECT_REASONS = 34 - REQUEST_REJECT_REASON_INVALID_COMMAND = 25 # Requested user action invalid - REQUEST_REJECT_REASON_TREATMENT_IS_COMPLETED = 26 # The treatment has been completed - REQUEST_REJECT_REASON_RINSEBACK_MAX_VOLUME_REACHED = 27 # Rinseback volume maximum has been reached - no more additional rinsebacks allowed - REQUEST_REJECT_REASON_UF_VOLUME_NOT_SET = 28 # Ultrafiltration volume is not set yet - REQUEST_REJECT_REASON_NO_PATIENT_CONNECTION_CONFIRM = 29 # The user has not confirmed patient connection - class MsgFieldPositions: # Generic response msg field byte positions (where 32-bit data fields are used) START_POS_FIELD_1 = 6 # Hardcoded for now to avoid cyclic import issue. See protocols.CAN.DenaliMessage class @@ -327,8 +112,13 @@ END_POS_FIELD_19 = START_POS_FIELD_19 + 4 START_POS_FIELD_20 = END_POS_FIELD_19 END_POS_FIELD_20 = START_POS_FIELD_20 + 4 - - -ACK_NOT_REQUIRED = [ - MsgIds.MSG_ID_ALARM_CONDITION_CLEARED.value -] + START_POS_FIELD_21 = END_POS_FIELD_20 + END_POS_FIELD_21 = START_POS_FIELD_21 + 4 + START_POS_FIELD_22 = END_POS_FIELD_21 + END_POS_FIELD_22 = START_POS_FIELD_22 + 4 + START_POS_FIELD_23 = END_POS_FIELD_22 + END_POS_FIELD_23 = START_POS_FIELD_23 + 4 + START_POS_FIELD_24 = END_POS_FIELD_23 + END_POS_FIELD_24 = START_POS_FIELD_24 + 4 + START_POS_FIELD_25 = END_POS_FIELD_24 + END_POS_FIELD_25 = START_POS_FIELD_25 + 4 \ No newline at end of file Index: dialin/ui/hd_simulator.py =================================================================== diff -u -r4a14fb08755f069501169e63a652d8681135462c -r1fd5bc0ed97d0d90223fa78ec195dd7636712c5b --- dialin/ui/hd_simulator.py (.../hd_simulator.py) (revision 4a14fb08755f069501169e63a652d8681135462c) +++ dialin/ui/hd_simulator.py (.../hd_simulator.py) (revision 1fd5bc0ed97d0d90223fa78ec195dd7636712c5b) @@ -20,172 +20,32 @@ import time import subprocess -from . import utils, messageBuilder +from . import messageBuilder from .hd_simulator_alarms import HDAlarmsSimulator -from ..common.msg_defs import RequestRejectReasons, MsgIds -from ..common.hd_defs import HDDefs +from ..common import * from ..protocols.CAN import (DenaliMessage, DenaliCanMessenger, DenaliChannels) from ..utils.base import _AbstractSubSystem, _LogManager from ..utils.conversions import integer_to_bytearray, float_to_bytearray, byte_to_bytearray, short_to_bytearray +from ..utils import YES -YES = 1 -NO = 0 -class TreatmentParameterRejections: - def __init__(self): - self.param_request_valid = RequestRejectReasons.REQUEST_REJECT_REASON_NONE - self.param_blood_flow_rate = RequestRejectReasons.REQUEST_REJECT_REASON_NONE - self.param_dialysate_flow_rate = RequestRejectReasons.REQUEST_REJECT_REASON_NONE - self.param_duration = RequestRejectReasons.REQUEST_REJECT_REASON_NONE - self.param_heparin_stop_time = RequestRejectReasons.REQUEST_REJECT_REASON_NONE - self.param_saline_bolus = RequestRejectReasons.REQUEST_REJECT_REASON_NONE - self.param_acid_concentrate = RequestRejectReasons.REQUEST_REJECT_REASON_NONE - self.param_bicarbonate_concentrate = RequestRejectReasons.REQUEST_REJECT_REASON_NONE - self.param_dialyzer_type = RequestRejectReasons.REQUEST_REJECT_REASON_NONE - self.param_blood_pressure_measure_interval = RequestRejectReasons.REQUEST_REJECT_REASON_NONE - self.param_rinseback_flow_rate = RequestRejectReasons.REQUEST_REJECT_REASON_NONE - self.param_arterial_pressure_limit_low = RequestRejectReasons.REQUEST_REJECT_REASON_NONE - self.param_arterial_pressure_limit_high = RequestRejectReasons.REQUEST_REJECT_REASON_NONE - self.param_venous_pressure_limit_low = RequestRejectReasons.REQUEST_REJECT_REASON_NONE - self.param_venous_pressure_limit_high = RequestRejectReasons.REQUEST_REJECT_REASON_NONE - self.param_heparin_dispensing_rate = RequestRejectReasons.REQUEST_REJECT_REASON_NONE - self.param_heparin_bolus_volume = RequestRejectReasons.REQUEST_REJECT_REASON_NONE - self.param_dialysate_temp = RequestRejectReasons.REQUEST_REJECT_REASON_NONE - - def set_all_valid(self): - """ - Sets all parameters as valid - - @return: None - """ - for attr in dir(self): - if not callable(getattr(self, attr)) and attr.startswith("param_"): - self.__dict__[attr] = RequestRejectReasons.REQUEST_REJECT_REASON_NONE - - def set_all_invalid(self): - """ - Sets all treatment parameters to be invalid - - @return: None - """ - for attr in dir(self): - if not callable(getattr(self, attr)) and attr.startswith("param_"): - self.__dict__[attr] = RequestRejectReasons.REQUEST_REJECT_REASON_NOT_ALLOWED_IN_CURRENT_MODE - - -class TXStates: - # Sub Mode - TREATMENT_START_STATE = 0 # Start treatment - initialize treatment and go to blood prime state - TREATMENT_BLOOD_PRIME_STATE = 1 # Prime blood-side of dialyzer with gradual ramp for 1 min. while dialyzer is bypassed. No dialysis or UF taking place. No treatment time. - TREATMENT_DIALYSIS_STATE = 2 # Perform dialysis. Deliver Heparin as prescribed. Deliver UF as prescribed. Handle saline boluses as requested - TREATMENT_STOP_STATE = 3 # Treatment stopped. All pumps off. Dializer bypassed - TREATMENT_RINSEBACK_STATE = 4 # Perform rinseback with saline. Dialyzer bypassed. Dialysate recirculating - TREATMENT_RECIRC_STATE = 5 # Recirculate saline and dialysate while patient disconnected. Blood lines open and shunted. Dialyzer is bypassed - TREATMENT_END_STATE = 6 # Dialysis has ended. Blood pump slowed. Dialyzer is bypassed. Dialysate is recirculated. User can rinseback - - # Saline states - SALINE_BOLUS_STATE_IDLE = 0 # No saline bolus delivery is in progress - SALINE_BOLUS_STATE_WAIT_FOR_PUMPS_STOP = 1 # Wait for pumps to stop before starting bolus - SALINE_BOLUS_STATE_IN_PROGRESS = 2 # A saline bolus delivery is in progress - SALINE_BOLUS_STATE_MAX_DELIVERED = 3 # Maximum saline bolus volume reached - no more saline bolus deliveries allowed - - # UF states - UF_START_STATE = 0 # Start state of the ultrafiltration state machine - UF_PAUSED_STATE = 1 # Paused state of the ultrafiltration state machine - UF_RUNNING_STATE = 2 # Running state of the ultrafiltration state machine - - # Heparin states - HEPARIN_STATE_OFF = 0 # No heparin delivery is in progress - HEPARIN_STATE_PAUSED = 1 # Heparin delivery paused - HEPARIN_STATE_INITIAL_BOLUS = 2 # Initial heparin bolus delivery in progress - HEPARIN_STATE_DISPENSING = 3 # Gradual heparin dispensing in progress - HEPARIN_STATE_COMPLETED = 4 # Heparin delivery stopped due to the set stop time before treatment end - HEPARIN_STATE_EMPTY = 5 # Heparin Syringe empty - - # Rinseback states - RINSEBACK_STOP_INIT_STATE = 0 # Start state (stopped) of the rinseback sub-mode state machine - RINSEBACK_RUN_STATE = 1 # Rinseback running state of the rinseback sub-mode state machine - RINSEBACK_PAUSED_STATE = 2 # Rinseback paused state of the rinseback sub-mode state machine - RINSEBACK_STOP_STATE = 3 # Rinseback stopped (done) state of the rinseback sub-mode state machine - RINSEBACK_RUN_ADDITIONAL_STATE = 4 # Additional rinseback volume (10 mL) state of the rinseback sub-mode state machine - - # Recirculate - TREATMENT_RECIRC_RECIRC_STATE = 0 # Re-circulate state of the treatment re-circulate sub-mode state machine - TREATMENT_RECIRC_STOPPED_STATE = 1 # Stopped state of the treatment re-circulate sub-mode state machine - - # Blood Prime - BLOOD_PRIME_RAMP_STATE = 0 # Ramp state of the blood prime sub-mode state machine - - # Treatment End - TREATMENT_END_WAIT_FOR_RINSEBACK_STATE = 0 # Wait for rinseback state of the treatment end sub-mode state machine - TREATMENT_END_PAUSED_STATE = 1 # Paused state of the treatment end sub-mode state machine - - # Treatment Stop - TREATMENT_STOP_RECIRC_STATE = 0 # Dialysate re-circulation state of the treatment stop sub-mode state machine - TREATMENT_STOP_NO_RECIRC_STATE = 1 # No dialysate re-circulation state of the treatment stop sub-mode state machine - - -class EResponse: - Rejected = 0 - Accepted = 1 - - -class GuiActionType: - Unknown = 0 - PowerOff = 1 - KeepAlive = 7 - BloodFlow = 5 - DialysateInletFlow = 8 - DialysateOutletFlow = 11 - TreatmentTime = 13 - PowerOffBroadcast = 14 - - AlarmStatus = 2 - AlarmTriggered = 3 - AlarmCleared = 4 - - PressureOcclusion = 9 - - DGDrainPumpData = 36 - DGHeatersData = 44 - LoadCellReadings = 12 - DGPressuresData = 32 - TemperatureSensors = 45 - - CanBUSFaultCount = 2457 - HDDebugText = 0xFFF1 - DGDebugText = 0xFFF2 - - AdjustBloodDialysateReq = 23 - AdjustBloodDialysateRsp = 24 - - AdjustDurationReq = 22 - AdjustDurationRsp = 27 - - AdjustUltrafiltrationStateReq = 16 - AdjustUltrafiltrationStateRsp = 65 - AdjustUltrafiltrationEditReq = 17 - AdjustUltrafiltrationEditRsp = 19 - AdjustUltrafiltrationConfirmReq = 21 - AdjustUltrafiltrationConfirmRsp = 46 - - AdjustPressuresLimitsReq = 70 - AdjustPressuresLimitsRsp = 71 - - TreatmentRanges = 26 - - String = 65279 - Acknow = 65535 - AcknowGeneric = 0 # Generic Acknowledgment is not a unique message ID and inherits its Id from the actual message. Zero is a placeholder - - class HDSimulator(_AbstractSubSystem): NUM_TREATMENT_PARAMETERS = 18 instanceCount = 0 - def __init__(self, can_interface="can0", log_level=None, console_out=False): + def __init__(self, can_interface:str="can0", + log_level:bool= None, + console_out:bool= False, + passive_mode:bool=False): + """ + The HDSimulator constructor + + @param can_interface: (str) the can interface name + @param log_level: (str) or (None) if not set, contains the logging level + @param console_out: (bool) If True, write each dialin message to the console. + """ super().__init__() HDSimulator.instanceCount = HDSimulator.instanceCount + 1 @@ -195,35 +55,92 @@ self.can_interface = DenaliCanMessenger(can_interface=can_interface, logger=self.logger, log_can=self._log_manager.log_level == "CAN_ONLY", - console_out=console_out) + console_out=console_out, + passive_mode=passive_mode) self.can_interface.start() if self.can_interface is not None: channel_id = DenaliChannels.ui_to_hd_ch_id - # TODO : needs to be update to be compatible with the new messaging. - # self.can_interface.register_receiving_publication_function(channel_id, - # MsgIds.MSG_ID_UI_START_TREATMENT.value, - # self._handler_ui_start_treatment) - # self.can_interface.register_receiving_publication_function(channel_id, - # MsgIds.MSG_ID_UI_PRE_TREATMENT_UF_REQUEST.value, - # self._handler_ui_pre_treatment_uf_request) - # self.can_interface.register_receiving_publication_function(channel_id, - # MsgIds.MSG_ID_UI_NEW_TREATMENT_PARAMS.value, - # self._handler_ui_validate_parameters) - # self.can_interface.register_receiving_publication_function(channel_id, - # MsgIds.MSG_ID_UI_USER_CONFIRM_TREATMENT_PARAMS.value, - # self._handler_ui_confirm_treatment) + self.can_interface.register_receiving_publication_function(channel_id, + MsgIds.MSG_ID_UI_INITIATE_TREATMENT_REQUEST.value, + self._handler_ui_initiate_treatment) + self.can_interface.register_receiving_publication_function(channel_id, + MsgIds.MSG_ID_UI_SET_UF_VOLUME_PARAMETER.value, + self._handler_ui_pre_treatment_uf_request) + self.can_interface.register_receiving_publication_function(channel_id, + MsgIds.MSG_ID_UI_NEW_TREATMENT_PARAMS.value, + self._handler_ui_validate_parameters) + self.can_interface.register_receiving_publication_function(channel_id, + MsgIds.MSG_ID_UI_USER_CONFIRM_TREATMENT_PARAMS.value, + self._handler_ui_confirm_treatment) + self.can_interface.register_receiving_publication_function(channel_id, + MsgIds.MSG_ID_UI_TX_END_CMD.value, + self._handler_ui_end_treatment) + self.can_interface.register_receiving_publication_function(channel_id, + MsgIds.MSG_ID_UI_HD_SET_RTC_REQUEST.value, + self._handler_set_rtc_request) + self.can_interface.register_receiving_publication_function(DenaliChannels.ui_sync_broadcast_ch_id, + MsgIds.MSG_ID_REQUEST_FW_VERSIONS.value, + self._handler_request_hd_version) + self.can_interface.register_receiving_publication_function(DenaliChannels.ui_sync_broadcast_ch_id, + MsgIdsDialin.MSG_DIALIN_ID_UI_SYSTEM_USAGE_REQUEST.value, + self._handler_system_usage_response) self.alarms_simulator = HDAlarmsSimulator(self.can_interface, self.logger) self.treatment_parameter_rejections = TreatmentParameterRejections() - def alarm(self): + def _handler_system_usage_response(self, message: dict) -> None: """ - the alarm simulator object getter - :return: HDAlarmsSimulator : alarm simulator object + Handles a request for system usage + + @param message: (dict) the message + @return: None """ - return self.alarms_simulator + + payload = integer_to_bytearray(1619628663) + payload += integer_to_bytearray(1619887863) + message = DenaliMessage.build_message(channel_id=DenaliChannels.hd_to_ui_ch_id, + message_id=MsgIdsDialin.MSG_DIALIN_ID_HD_SYSTEM_USAGE_RESPONSE.value, + payload=payload) + + self.can_interface.send(message, 0) + + def _handler_set_rtc_request(self, message: dict) -> None: + """ + Handles a UI request to set the HD RTC + @param message: (dict) the message containing the request + @return: None + """ + + START_POS = DenaliMessage.PAYLOAD_START_INDEX + END_POS = START_POS + 4 + + epoch = struct.unpack('i', bytearray( + message['message'][START_POS:END_POS]))[0] + + self.logger.debug("Request to set the HD epoch to {0}".format(epoch)) + + self.cmd_send_set_rtc_response(YES, 0) + + def cmd_send_set_rtc_response(self, response, reason): + """ + Sends a set RTC response message + + @param response: (int) 0=NO, 1=YES + @return: None + """ + self.logger.debug("HD: Sending response {0} reason {1}".format(response, reason)) + + payload = integer_to_bytearray(response) + payload += integer_to_bytearray(reason) + + message = DenaliMessage.build_message(channel_id=DenaliChannels.hd_to_ui_ch_id, + message_id=MsgIds.MSG_ID_HD_UI_SET_RTC_RESPONSE.value, + payload=payload) + + self.can_interface.send(message, 0) + def cmd_send_treatment_parameter_validation_response(self, rejections: List[RequestRejectReasons]): """ Sends a treatment parameter validation response @@ -327,36 +244,35 @@ self.can_interface.send(message, 0) - # TODO : needs to be update to be compatible with the new messaging. - # def _handler_ui_confirm_treatment(self, message): - # """ - # Handler function to detect when a treatment is confirmed - # - # @param message: the confirm treatment message - # @return: None - # """ - # START_POS = DenaliMessage.PAYLOAD_START_INDEX - # END_POS = START_POS + 4 - # - # request = struct.unpack('i', bytearray( - # message['message'][START_POS:END_POS]))[0] - # - # if request == 0: - # self.logger.debug("Received UI cancel confirmation of Treatment Parameters. ") - # return - # - # self.logger.debug("Received UI confirmation of Treatment Parameters. ") - # - # self.logger.debug("Priming ...") - # state = 0 - # total_seconds = 100 - # for seconds_remaining in range(total_seconds, -1, -1): - # if seconds_remaining % (total_seconds // 3) == 0: - # state += 1 - # self.cmd_send_priming_time_remaining(state, seconds_remaining, total_seconds) - # sleep(0.05) - # self.logger.debug("Finished priming.") + def _handler_ui_confirm_treatment(self, message): + """ + Handler function to detect when a treatment is confirmed + @param message: the confirm treatment message + @return: None + """ + START_POS = DenaliMessage.PAYLOAD_START_INDEX + END_POS = START_POS + 4 + + request = struct.unpack('i', bytearray( + message['message'][START_POS:END_POS]))[0] + + if request == 0: + self.logger.debug("Received UI cancel confirmation of Treatment Parameters. ") + return + + self.logger.debug("Received UI confirmation of Treatment Parameters. ") + + self.logger.debug("Priming ...") + state = 0 + total_seconds = 100 + for seconds_remaining in range(total_seconds, -1, -1): + if seconds_remaining % (total_seconds // 3) == 0: + state += 1 + self.cmd_send_priming_time_remaining(state, seconds_remaining, total_seconds) + sleep(0.05) + self.logger.debug("Finished priming.") + def _handler_ui_pre_treatment_uf_request(self, message): """ Handles the ui pre treatment uf request and sends a response @@ -374,7 +290,7 @@ self.cmd_send_uf_treatment_response(1, 0, uf_volume) - def _handler_ui_start_treatment(self, message): + def _handler_ui_initiate_treatment(self, message): """ Handler function to start a treatment @@ -389,17 +305,17 @@ if request == 0: self.logger.debug("Selecting treatment parameters") - self.cmd_send_hd_operation_mode(HDDefs.MODE_PRET.value) + self.cmd_send_hd_operation_mode(HDOpModes.MODE_PRET.value) elif request == 1: self.logger.debug("Canceling treatment") - self.cmd_send_hd_operation_mode(HDDefs.MODE_STAN.value) + self.cmd_send_hd_operation_mode(HDOpModes.MODE_STAN.value) elif request == 2: self.logger.debug("Starting treatment") - self.cmd_send_hd_operation_mode(HDDefs.MODE_TREA.value) + self.cmd_send_hd_operation_mode(HDOpModes.MODE_TREA.value) - self.cmd_send_start_treatment_response(YES, 0) + self.cmd_initiate_treatment_response(YES, 0) - def cmd_send_start_treatment_response(self, response, reason): + def cmd_initiate_treatment_response(self, response, reason): """ Sends a start treatment response message @@ -412,7 +328,7 @@ payload += integer_to_bytearray(reason) message = DenaliMessage.build_message(channel_id=DenaliChannels.hd_to_ui_ch_id, - message_id=MsgIds.MSG_ID_HD_START_TREATMENT_RESPONSE.value, + message_id=MsgIds.MSG_ID_HD_INITIATE_TREATMENT_RESPONSE.value, payload=payload) self.can_interface.send(message, 0) @@ -452,7 +368,7 @@ payload += float_to_bytearray(volume) message = DenaliMessage.build_message(channel_id=DenaliChannels.hd_to_ui_ch_id, - message_id=MsgIds.MSG_ID_HD_PRE_TREATMENT_UF_RESPONSE.value, + message_id=MsgIds.MSG_ID_HD_SET_UF_VOLUME_PARAMETER_RESPONSE.value, payload=payload) self.can_interface.send(message, 0) @@ -466,20 +382,11 @@ payload = integer_to_bytearray(YES) message = DenaliMessage.build_message(channel_id=DenaliChannels.hd_to_ui_ch_id, - message_id=MsgIds.MSG_ID_HD_TREATMENT_END_RESPONSE.value, + message_id=MsgIds.MSG_ID_HD_TX_END_CMD_RESPONSE.value, payload=payload) self.can_interface.send(message, 0) - def _handler_ui_end_treatment(self, message): - """ - - @param message: - @return: - """ - self.logger.debug("Ending Treatment") - self.cmd_send_end_treatment_response() - def _handler_ui_validate_parameters(self, message): """ @@ -554,20 +461,6 @@ self.can_interface.send(message, 0) - def cmd_send_checkin_dg(self): - """ - check-in (keep alive) message from DG - :return: none - """ - - payload = ["A5", "01", "00", "06", "00", "00", "76", "00"] - payload = [int(each, 16) for each in payload] - - message = {"channel_id": DenaliChannels.dg_to_hd_ch_id, - "message": payload} - - self.can_interface.send(message, 0) - def cmd_show_poweroff_dialog(self): """ the message from HD to UI to show the power off dialog @@ -635,18 +528,6 @@ time.sleep(delay) @staticmethod - def build_dg_debug_text(vText): - """ - the debug text message from DG builder method - :param vText: (str) the debug text - :return: none - """ - message_length = 40 - txt = messageBuilder.textToByte(vText, message_length) # + 1 null term - msg = messageBuilder.buildMessage(GuiActionType.DGDebugText, 1 * (message_length + 1), False, txt) - return messageBuilder.toFrames(msg) - - @staticmethod def build_hd_debug_text(vText): """ the debug text message from HD builder method @@ -897,7 +778,7 @@ payload += float_to_bytearray(vVolume) message = DenaliMessage.build_message(channel_id=DenaliChannels.hd_to_ui_ch_id, - message_id=MsgIds.MSG_ID_HD_PRE_TREATMENT_UF_RESPONSE.value, + message_id=MsgIds.MSG_ID_HD_SET_UF_VOLUME_PARAMETER_RESPONSE.value, payload=payload) self.can_interface.send(message, 0) @@ -1071,240 +952,6 @@ self.can_interface.send(message, 0) - def cmd_set_dg_ro_pump_data(self, vSetPtPressure, vFlowRate, vPWM): - """ - the DG RO Pump Data message setter/sender method - - | MSG | CAN ID | Box | Type | Ack | Src | Dst | Description | #1:(U32) | #2:(F32) | #3:(F32) | - |:----:|:------:|:---:|:------:|:---:|:---:|:---:|:-----------: |:--: |:--: |:--: | - |0x1F00| 0x080 | 8 | 1 Hz | N | DG | All | DG RO Pump Data | \ref Data::mPressure | \ref Data::mFlowRate | \ref Data::mPWM | :param vSetPtPressure: - - :param vSetPtPressure: (int) set Point Pressure - :param vFlowRate: (float) Flow Rate - :param vPWM: (float) PWM - :return: none - """ - - payload = integer_to_bytearray(vSetPtPressure) - payload += float_to_bytearray(vFlowRate) - payload += float_to_bytearray(vPWM) - - message = DenaliMessage.build_message(channel_id=DenaliChannels.dg_sync_broadcast_ch_id, - message_id=MsgIds.MSG_ID_RO_PUMP_DATA.value, - payload=payload) - - self.can_interface.send(message, 0) - - def cmd_set_dg_pressures_data(self, vROInletPSI, vROOutletPSI, vDrainInletPSI, vDrainOutletPSI): - """ - the DG Pressures Data message setter/sender method - - | MSG | CAN ID | Box | Type | Ack | Src | Dst | Description | #1:(F32) | #2:(F32) | #3:(F32) | #4:(F32) | - |:----:|:------:|:---:|:------:|:---:|:---:|:---:|:-----------: |:--: |:--: |:--: |:--: | - |0x2000| 0x080 | 8 | 1 Hz | N | DG | All | DG Pressures Data | \ref Data::mROInletPSI | \ref Data::mROOutletPSI | \ref Data::mDrainInletPSI | \ref Data::mDrainOutletPSI | - - :param vROInletPSI: (float) RO Inlet PSI - :param vROOutletPSI: (float) RO Outlet PSI - :param vDrainInletPSI: (float) Drain Inlet PSI - :param vDrainOutletPSI: (float) Drain Outlet PSI - :return: none - """ - - payload = float_to_bytearray(vROInletPSI) - payload += float_to_bytearray(vROOutletPSI) - payload += float_to_bytearray(vDrainInletPSI) - payload += float_to_bytearray(vDrainOutletPSI) - - message = DenaliMessage.build_message(channel_id=DenaliChannels.dg_sync_broadcast_ch_id, - message_id=MsgIds.MSG_ID_DG_PRESSURES_DATA.value, - payload=payload) - - self.can_interface.send(message, 0) - - def cmd_set_dg_drain_pump_data(self, vSetPtRPM, vDACValue): - """ - the DG Drain Pump Data message setter/sender method - - | MSG | CAN ID | Box | Type | Ack | Src | Dst | Description | #1:(U32) | #2:(U32) | - |:----:|:------:|:---:|:------:|:---:|:---:|:---:|:-----------: |:--: |:--: | - |0x2400| 0x080 | 8 | 1 Hz | N | DG | All | DG Drain Pump Data | \ref Data::mRPM | \ref Data::mDAC | - - :param vSetPtRPM: (int) Set Point RPM - :param vDACValue: (int) DAC Value - :return: none - """ - - payload = integer_to_bytearray(vSetPtRPM) - payload += integer_to_bytearray(vDACValue) - - message = DenaliMessage.build_message(channel_id=DenaliChannels.dg_sync_broadcast_ch_id, - message_id=MsgIds.MSG_ID_DRAIN_PUMP_DATA.value, - payload=payload) - - self.can_interface.send(message, 0) - - def cmd_set_dg_operation_mode(self, vDGOpMode): - """ - the DG Operation Mode Data message setter/sender method - - | MSG | CAN ID | Box | Type | Ack | Src | Dst | Description | #1:(U32) | - |:----:|:------:|:---:|:------:|:---:|:---:|:---:|:-----------: |:--: | - |0x2700| 0x080 | 8 | 1 Hz | N | DG | All | DG Operation Mode Data | \ref Data::mOpMode | - - :param vDGOpMode: (int) DG Operation Mode - :return: none - """ - - payload = integer_to_bytearray(vDGOpMode) - - message = DenaliMessage.build_message(channel_id=DenaliChannels.dg_sync_broadcast_ch_id, - message_id=MsgIds.MSG_ID_DG_OP_MODE.value, - payload=payload) - - self.can_interface.send(message, 0) - - def cmd_set_dg_reservoir_data(self, vActiveReservoir, vFillToVolML, vDrainToVolML): - """ - the DG Reservoir Data message setter/sender method - - | MSG | CAN ID | Box | Type | Ack | Src | Dst | Description | #1:(U32) | #2:(U32) | #3:(U32) | - |:----:|:------:|:---:|:------:|:---:|:---:|:---:|:-----------: |:--: |:--: |:--: | - |0x2800| 0x080 | 8 | 1 Hz | N | DG | All | DG Reservoir Data | \ref Data::mActiveReservoir | \ref Data::mFillToVol | \ref Data::mDrainToVol | - - :param vActiveReservoir: (int) Active Reservoir - :param vFillToVolML: (int) Fill To Volume ML - :param vDrainToVolML: (int) Drain To Vol ML - :return: none - """ - - payload = integer_to_bytearray(vActiveReservoir) - payload += integer_to_bytearray(vFillToVolML) - payload += integer_to_bytearray(vDrainToVolML) - - message = DenaliMessage.build_message(channel_id=DenaliChannels.dg_sync_broadcast_ch_id, - message_id=MsgIds.MSG_ID_DG_RESERVOIR_DATA.value, - payload=payload) - - self.can_interface.send(message, 0) - - def cmd_set_dg_valves_states(self, vValvesStates): - """ - the DG Valves States Data message setter/sender method - - | MSG | CAN ID | Box | Type | Ack | Src | Dst | Description | #1:(U16) | - |:----:|:------:|:---:|:------:|:---:|:---:|:---:|:-----------: |:--: | - |0x2A00| 0x080 | 8 | 2 Hz | N | DG | All | DG Valves States Data | \ref Data::mStates | - - :param vValvesStates: (int)Valves states - :return: none - """ - - payload = integer_to_bytearray(vValvesStates) - - message = DenaliMessage.build_message(channel_id=DenaliChannels.dg_sync_broadcast_ch_id, - message_id=MsgIds.MSG_ID_DG_VALVES_STATES.value, - payload=payload) - - self.can_interface.send(message, 0) - - def cmd_set_dg_heaters_data(self, vMainPriMaryDC, vSmallPrimaryDC, vTrimmerDC): - """ - the DG Heaters Data message setter/sender method - | MSG | CAN ID | Box | Type | Ack | Src | Dst | Description | #1:(U32) | #2:(U32) | #3:(U32) | - |:----:|:------:|:---:|:------:|:---:|:---:|:---:|:-----------: |:--: |:--: |:--: | - |0x2C00| 0x080 | 8 | 2 Hz | N | DG | All | DG Heaters Data | \ref Data::mMainPrimaryDC | \ref Data::mSmallPrimaryDC | \ref Data::mTrimmerDC | - - :param vMainPriMaryDC: (int) Main PriMary DC - :param vSmallPrimaryDC: (int) Small Primary DC - :param vTrimmerDC: (int) Trimmer DC - :return: none - """ - - payload = integer_to_bytearray(vMainPriMaryDC) - payload += integer_to_bytearray(vSmallPrimaryDC) - payload += integer_to_bytearray(vTrimmerDC) - - message = DenaliMessage.build_message(channel_id=DenaliChannels.dg_sync_broadcast_ch_id, - message_id=MsgIds.MSG_ID_DG_HEATERS_DATA.value, - payload=payload) - - self.can_interface.send(message, 0) - - def cmd_set_dg_load_cell_readings_data(self, vRs1Prim, vRs1Bkup, vRs2Prim, vRs2Bkup): - """ - The DG Load Cell Readings Data message setter/sender method - | MSG | CAN ID | Box | Type | Ack | Src | Dst | Description | #1:(F32) | #2:(F32) | #3:(F32) | #4:(F32) | - |:----:|:------:|:---:|:------:|:---:|:---:|:---:|:-----------: |:--: |:--: |:--: |:--: | - |0x0C00| 0x080 | 8 | 10 Hz | N | DG | All | DG Load Cell Readings Data | \ref Data::mReservoir1Prim | \ref Data::mReservoir1Bkup | \ref Data::mReservoir2Prim | \ref Data::mReservoir2Bkup | - :param vRs1Prim: (float) Reservoir 1 Primary - :param vRs1Bkup: (float) Reservoir 1 Backup - :param vRs2Prim: (float) Reservoir 2 Primary - :param vRs2Bkup: (float) Reservoir 2 Backup - :return: none - """ - - payload = float_to_bytearray(vRs1Prim) - payload += float_to_bytearray(vRs1Bkup) - payload += float_to_bytearray(vRs2Prim) - payload += float_to_bytearray(vRs2Bkup) - - message = DenaliMessage.build_message(channel_id=DenaliChannels.dg_sync_broadcast_ch_id, - message_id=MsgIds.MSG_ID_LOAD_CELL_READINGS.value, - payload=payload) - - self.can_interface.send(message, 0) - - def cmd_set_dg_temperatures_data(self, vInletPrimaryHeater, vOutletPrimaryHeater, vConductivitySensor1, vConductivitySensor2, - vOutletRedundancy, vInletDialysate, vPrimaryHeaterThermocouple, vTrimmerHeaterThermocouple, - vPrimaryHeaterColdJunction, vTrimmerHeaterColdJunction, vPrimaryHeaterInternalTemperature, - vTrimmerHeaterInternalTemperature): - """ - the DG Temperatures Data message setter/sender method - | MSG | CAN ID | Box | Type | Ack | Src | Dst | Description | #1:(F32) | #2:(F32) | #3:(F32) | - |:----:|:------:|:---:|:------:|:---:|:---:|:---:|:-----------: |:--: |:--: |:--: | - |0x2D00| 0x080 | 8 | 2 Hz | N | DG | All | DG Temperatures Data | \ref Data::mInletPrimaryHeater | \ref Data::mOutletPrimaryHeater | \ref Data::mConductivitySensor1 | - - | #4:(F32) | #5:(F32) | #6:(F32) | #7:(F32) | #8:(F32) | - |:--: |:--: |:--: |:--: |:--: | - | \ref Data::mConductivitySensor2 | \ref Data::mOutletRedundancy | \ref Data::mInletDialysate | \ref Data::mPrimaryHeaterThermoCouple | \ref Data::mTrimmerHeaterThermoCouple | - - | #9:(F32) | #10:(F32) | #11:(F32) | #12:(F32) | - | :--: |:--: |:--: |:--: | - | \ref Data::mPrimaryHeaterColdJunction | \ref Data::mTrimmerHeaterColdJunction | \ref Data::mPrimaryHeaterInternal | \ref Data::mTrimmerHeaterInternal | - :param vInletPrimaryHeater: (float) Inlet Primary Heater - :param vOutletPrimaryHeater: (float) Outlet Primary Heater - :param vConductivitySensor1: (float) Conductivity Sensor 1 - :param vConductivitySensor2: (float) Conductivity Sensor 2 - :param vOutletRedundancy: (float) Outlet Redundancy - :param vInletDialysate: (float) Inlet Dialysate - :param vPrimaryHeaterThermocouple: (float) Primary Heater Thermocouple - :param vTrimmerHeaterThermocouple: (float) Trimmer Heater Thermocouple - :param vPrimaryHeaterColdJunction: (float) Primary Heater ColdJunction - :param vTrimmerHeaterColdJunction: (float) Trimmer Heater ColdJunction - :param vPrimaryHeaterInternalTemperature: (float) Primary Heater Internal Temperature - :param vTrimmerHeaterInternalTemperature: (float) Trimmer HeaterInternal Temperature - :return: none - """ - - payload = float_to_bytearray(vInletPrimaryHeater) - payload += float_to_bytearray(vOutletPrimaryHeater) - payload += float_to_bytearray(vConductivitySensor1) - payload += float_to_bytearray(vConductivitySensor2) - payload += float_to_bytearray(vOutletRedundancy) - payload += float_to_bytearray(vInletDialysate) - payload += float_to_bytearray(vPrimaryHeaterThermocouple) - payload += float_to_bytearray(vTrimmerHeaterThermocouple) - payload += float_to_bytearray(vPrimaryHeaterColdJunction) - payload += float_to_bytearray(vTrimmerHeaterColdJunction) - payload += float_to_bytearray(vPrimaryHeaterInternalTemperature) - payload += float_to_bytearray(vTrimmerHeaterInternalTemperature) - - message = DenaliMessage.build_message(channel_id=DenaliChannels.dg_sync_broadcast_ch_id, - message_id=MsgIds.MSG_ID_DG_TEMPERATURE_DATA.value, - payload=payload) - - self.can_interface.send(message, 0) - def cmd_set_treatment_states_data(self, vSubMode, vUFState, vSalineState, vHeparingState, vRinsebackState, vRecirculateState, @@ -1461,20 +1108,6 @@ self.can_interface.send(message, 0) - def cmd_send_unknown_dg(self): - """ - the unknown message from DG setter/sender method - :return: none - """ - - payload = integer_to_bytearray(0) - - message = DenaliMessage.build_message(channel_id=DenaliChannels.dg_to_ui_ch_id, - message_id=MsgIds.MSG_ID_UNUSED.value, - payload=payload) - - self.can_interface.send(message, 0) - def cmd_set_treatment_heparin_data(self, vCumulative): """ the Treatment Heparin Data message setter/sender method @@ -1609,7 +1242,7 @@ payload += integer_to_bytearray(vTimeoutCountDown) message = DenaliMessage.build_message(channel_id=DenaliChannels.hd_to_ui_ch_id, - message_id=MsgIds.MSG_ID_HD_RECIRCULATE_PROGRESS.value, + message_id=MsgIds.MSG_ID_HD_RECIRC_PROGRESS.value, payload=payload) self.can_interface.send(message, 0) @@ -1656,6 +1289,23 @@ self.can_interface.send(message, 0) + def _handler_ui_end_treatment(self, message): + """ + Handler function when received a request to end a treatment + + @param message: (dict) the end treatment request + @return: None + """ + self.logger.debug("End treatment requested") + request = struct.unpack('i', bytearray( + message['message'][MsgFieldPositions.START_POS_FIELD_1:MsgFieldPositions.END_POS_FIELD_1]))[0] + + if request == 0: + self.logger.debug("Request to start rinseback") + self.cmd_send_treatment_adjust_end_response(vAccepted=YES, vReason=0) + else: + self.logger.debug("End treatment unknown request") + def cmd_send_treatment_adjust_end_response(self, vAccepted, vReason): """ the treatment end state change Response message method @@ -1724,49 +1374,30 @@ self.can_interface.send(message, 0) - def cmd_send_accelerometer_dg_data(self, vX, vY, vZ, vXMax, vYMax, vZMax, vXTilt, vYTilt, vZTilt ): + def _handler_request_hd_version(self, message: dict): """ - the accelerometer dg data message method - | MSG | CAN ID | Box | Type | Ack | Src | Dst | Description | - |:----:|:------:|:---:|:------:|:---:|:---:|:---:|:-----------: | - |0x3400| 0x080 | 8 | 1Hz | N | HD | UI | DG Accelerometer data | + Handles a request for the HD version - | #1:(F32) | #2:(F32) | #3:(U32) | - |:--: |:--: |:--: | - | \ref Data::mX | \ref Data::mY | \ref Data::mX | + @param message: (dict) the received message + @return: None + """ - | #4:(F32) | #5:(F32) | #6:(U32) | - |:--: |:--: |:--: | - | \ref Data::mXMax | \ref Data::mYMax | \ref Data::mXMax | + self.logger.debug("Handling request for hd version.") + self.cmd_send_version_hd_data(9, 9, 9, 9, 9, 9, 9, 9) + self.cmd_send_hd_serial_number() - | #7:(F32) | #8:(F32) | #9:(U32) | - |:--: |:--: |:--: | - | \ref Data::mXTilt | \ref Data::mYTilt | \ref Data::mXTilt | + def cmd_send_hd_serial_number(self): + """ + Sends the hd serial number response - :param vX: x axis - :param vY: y axis - :param vZ: z axis - :param vXMax: x axis max - :param vYMax: y axis max - :param vZMax: z axis max - :param vXTilt: x axis tilt - :param vYTilt: y axis tilt - :param vZTilt: z axis tilt - :return: None + @return: None """ + self.logger.debug("Sending hd serial number...") - payload = float_to_bytearray(vX) - payload += float_to_bytearray(vY) - payload += float_to_bytearray(vZ) - payload += float_to_bytearray(vXMax) - payload += float_to_bytearray(vYMax) - payload += float_to_bytearray(vZMax) - payload += float_to_bytearray(vXTilt) - payload += float_to_bytearray(vYTilt) - payload += float_to_bytearray(vZTilt) + payload = bytearray('0123456789\0', encoding="utf-8") - message = DenaliMessage.build_message(channel_id=DenaliChannels.dg_to_ui_ch_id, - message_id=MsgIds.MSG_ID_DG_ACCELEROMETER_DATA.value, + message = DenaliMessage.build_message(channel_id=DenaliChannels.hd_to_ui_ch_id, + message_id=MsgIdsDialin.MSG_DIALIN_ID_HD_SERIAL_NUMBER_RESPONSE.value, payload=payload) self.can_interface.send(message, 0) @@ -1800,35 +1431,13 @@ self.can_interface.send(message, 0) - def cmd_send_version_dg_data(self, vMajor, vMinor, vMicro, vBuild, vFPGA_id, vFPGA_Major, vFPGA_Minor, vFPGA_Lab ): + def alarm(self) -> HDAlarmsSimulator: """ - the dg version response message method - :param vMajor: Major version number - :param vMinor: Minor version number - :param vMicro: Micro version number - :param vBuild: Build version number - :param vFPGA_id: FPGA id version number - :param vFPGA_Major: FPGA Major version number - :param vFPGA_Minor: FPGA Minor version number - :param vFPGA_Lab: FPGA Lab version number - :return: None + Gets the alarm simulator object + @return: (HDAlarmsSimulator) the alarms simulator """ + return self.alarms_simulator - payload = byte_to_bytearray(vMajor) - payload += byte_to_bytearray(vMinor) - payload += byte_to_bytearray(vMicro) - payload += short_to_bytearray(vBuild) - payload += byte_to_bytearray(vFPGA_id) - payload += byte_to_bytearray(vFPGA_Major) - payload += byte_to_bytearray(vFPGA_Minor) - payload += byte_to_bytearray(vFPGA_Lab) - - message = DenaliMessage.build_message(channel_id=DenaliChannels.dg_to_ui_ch_id, - message_id=MsgIds.MSG_ID_DG_VERSION.value, - payload=payload) - - self.can_interface.send(message, 0) - def cmd_send_pre_treatment_state_data(self, sub_mode, water_sample_state, @@ -1943,7 +1552,7 @@ payload += integer_to_bytearray(countdown) message = DenaliMessage.build_message(channel_id=DenaliChannels.hd_to_ui_ch_id, - message_id=MsgIds.MSG_ID_HD_SELF_TEST_NO_CART_PROGRESS.value, + message_id=MsgIds.MSG_ID_HD_NO_CART_SELF_TEST_PROGRESS.value, payload=payload) self.can_interface.send(message, 0) @@ -1959,7 +1568,7 @@ payload += integer_to_bytearray(countdown) message = DenaliMessage.build_message(channel_id=DenaliChannels.hd_to_ui_ch_id, - message_id=MsgIds.MSG_ID_HD_SELF_TEST_DRY_PROGRESS.value, + message_id=MsgIds.MSG_ID_HD_DRY_SELF_TEST_PROGRESS.value, payload=payload) self.can_interface.send(message, 0) @@ -1976,7 +1585,7 @@ payload += integer_to_bytearray(countdown) message = DenaliMessage.build_message(channel_id=DenaliChannels.hd_sync_broadcast_ch_id, - message_id=MsgIds.MSG_ID_DG_PRIMING_STATUS_DATA.value, + message_id=MsgIds.MSG_ID_HD_PRIMING_STATUS_DATA.value, payload=payload) self.can_interface.send(message, 0) @@ -2008,7 +1617,7 @@ payload += integer_to_bytearray(reason) message = DenaliMessage.build_message(channel_id=DenaliChannels.hd_to_ui_ch_id, - message_id=MsgIds.MSG_ID_HD_CONTINUE_TO_TREATMENT_RESPONSE.value, + message_id=MsgIds.MSG_ID_HD_START_TREATMENT_RESPONSE.value, payload=payload) self.can_interface.send(message, 0) @@ -2095,6 +1704,6 @@ payload += integer_to_bytearray(chemicalMode) message = DenaliMessage.build_message(channel_id=DenaliChannels.dg_sync_broadcast_ch_id, - message_id=MsgIds.MSG_ID_DG_DISINFECT_STATE.value, + message_id=MsgIdsDialin.MSG_DIALIN_ID_HD_DISINFECT_STATE.value, payload=payload) - self.can_interface.send(message, 0) + self.can_interface.send(message, 0) \ No newline at end of file