Index: leahi_dialin/common/alarm_defs.py =================================================================== diff -u -r155002a8a797c462b346dccf1abd47428230e16b -rf1cb03cd999ccce88151a2e6c29c19b00a6e8d54 --- leahi_dialin/common/alarm_defs.py (.../alarm_defs.py) (revision 155002a8a797c462b346dccf1abd47428230e16b) +++ leahi_dialin/common/alarm_defs.py (.../alarm_defs.py) (revision f1cb03cd999ccce88151a2e6c29c19b00a6e8d54) @@ -7,10 +7,10 @@ # # @file alarm_defs.py # -# @author (last) Vinayakam Mani -# @date (last) 10-May-2024 -# @author (original) Peter Lucia -# @date (original) 07-Aug-2020 +# @author (last) Enum Updater Script +# @date (last) 19-Aug-2026 +# @author (original) Zoltan Miskolci +# @date (original) 31-Jul-2026 # ############################################################################ from enum import unique @@ -20,209 +20,305 @@ # Branch: staging @unique class AlarmList(AlarmEnum): - ALARM_ID_NO_ALARM = 0 # Indication for when no alarms is a possible situation - ALARM_ID_TD_SOFTWARE_FAULT = 1 # TD Software fault. Software found itself in an unexpected state - ALARM_ID_DD_SOFTWARE_FAULT = 2 # DD software fault. Software found itself in an unexpected state - ALARM_ID_FP_SOFTWARE_FAULT = 3 # FP software fault. Software found itself in an unexpected state - ALARM_ID_TD_FPGA_POST_TEST_FAILED = 4 # TD FPGA POST failure - ALARM_ID_TD_WATCHDOG_POST_TEST_FAILED = 5 # TD Watchdog POST failure - ALARM_ID_TD_UI_COMM_POST_FAILED = 6 # TD UI communication POST failure. UI failed to communicate within a reasonable time after power up - ALARM_ID_TD_FPGA_CLOCK_SPEED_CHECK_FAILURE = 7 # TD processor clock speed checks against FPGA clock failure - ALARM_ID_TD_FPGA_COMM_TIMEOUT = 8 # TD FPGA communication down for too long - ALARM_ID_TD_UI_COMM_TIMEOUT = 9 # TD UI communication timeout - ALARM_ID_TD_DD_COMM_TIMEOUT = 10 # TD DD communication timeout - ALARM_ID_TD_COMM_TOO_MANY_BAD_CRCS = 11 # TD too many bad communications CRC - ALARM_ID_TD_CAN_MESSAGE_NOT_ACKED_BY_UI = 12 # TD didn't get ACK on message to UI that required acknowledgment - ALARM_ID_TD_CAN_MESSAGE_NOT_ACKED_BY_DD = 13 # TD didn't get ACK on message to DD that required acknowledgment - ALARM_ID_TD_CRITICAL_DATA_ERROR = 14 # TD critical data integrity check failed - ALARM_ID_DD_CRITICAL_DATA_ERROR = 15 # DD critical data integrity check failed - ALARM_ID_TD_WATCHDOG_EXPIRED = 16 # TD watchdog expired - ALARM_ID_DD_WATCHDOG_EXPIRED = 17 # DD watchdog expired - ALARM_ID_DD_COMM_TOO_MANY_BAD_CRCS = 18 # DD too many bad communications CRC - ALARM_ID_DD_CAN_MESSAGE_NOT_ACKED_BY_FP = 19 # DD didn't get ACK on message to FP that required acknowledgment - ALARM_ID_DD_CAN_MESSAGE_NOT_ACKED_BY_TD = 20 # DD didn't get ACK on message to TD that required acknowledgment - ALARM_ID_DD_FPGA_POST_TEST_FAILED = 21 # DD FPGA POST failure - ALARM_ID_DD_FPGA_CLOCK_SPEED_CHECK_FAILURE = 22 # DD processor clock speed checks against FPGA clock failure - ALARM_ID_DD_FPGA_COMM_TIMEOUT = 23 # DD FPGA communication down for too long - ALARM_ID_TD_ALARM_AUDIO_SELF_TEST_FAILURE = 24 # TD alarm audio failed POST - ALARM_ID_DD_VALVE_CONTROL_FAILURE = 25 # DD FPGA not accepting commanded valve states - ALARM_ID_TD_ARTERIAL_SENSOR_TIMEOUT_FAULT = 26 # TD arterial pressure sensor freshness/error timeout fault - ALARM_ID_TD_VENOUS_SENSOR_TIMEOUT_FAULT = 27 # TD venous pressure sensor freshness/error timeout fault - ALARM_ID_TD_TMP_PRESSURE_LOW = 28 # TD TMP pressure low - ALARM_ID_TD_TMP_PRESSURE_HIGH = 29 # TD TMP pressure high - ALARM_ID_TD_VENOUS_BUBBLE_SELF_TEST_FAILURE = 30 # TD venous bubble self-test failure. - ALARM_ID_TD_BLOOD_PRIME_PAUSE_WARNING = 31 # TD blood prime pause warning - ALARM_ID_TD_BLOOD_PRIME_PAUSE_TIMEOUT = 32 # TD blood prime pause timeout - ALARM_ID_TD_VOLTAGE_OUT_OF_RANGE = 33 # TD voltage out of range fault - ALARM_ID_TD_AC_POWER_LOST = 34 # TD AC power lost - ALARM_ID_TD_AC_POWER_LOST_IN_TREATMENT = 35 # TD AC power lost during treatment - ALARM_ID_DD_D17_COND_SENSOR_FPGA_FAULT = 36 # DD CD1 conductivity sensor freshness/error timeout fault - ALARM_ID_DD_D27_COND_SENSOR_FPGA_FAULT = 37 # DD CD2 conductivity sensor freshness/error timeout fault - ALARM_ID_DD_D29_COND_SENSOR_FPGA_FAULT = 38 # DD CD3 conductivity sensor freshness/error timeout fault - ALARM_ID_DD_D43_COND_SENSOR_FPGA_FAULT = 39 # DD CD4 conductivity sensor freshness/error timeout fault - ALARM_ID_TD_VENOUS_BUBBLE_DETECTED = 40 # TD venous bubble detected - ALARM_ID_TD_CARTRIDGE_DOOR_OPENED = 41 # TD front door open - ALARM_ID_TD_STUCK_BUTTON_TEST_FAILED = 42 # TD stuck button self test failure - ALARM_ID_TD_ARTERIAL_PRESSURE_LOW = 43 # TD arterial pressure low - ALARM_ID_TD_ARTERIAL_PRESSURE_HIGH = 44 # TD arterial pressure high - ALARM_ID_TD_ARTERIAL_PRESSURE_OUT_OF_RANGE = 45 # TD arterial pressure out of range fault - ALARM_ID_TD_ARTERIAL_PRESSURE_SELF_TEST_FAILURE = 46 # TD arterial pressure self-test failure - ALARM_ID_TD_VENOUS_PRESSURE_LOW = 47 # TD venous pressure low - ALARM_ID_TD_VENOUS_PRESSURE_HIGH = 48 # TD venous pressure high - ALARM_ID_TD_VENOUS_PRESSURE_OUT_OF_RANGE = 49 # TD venous pressure out of range fault - ALARM_ID_TD_VENOUS_PRESSURE_SELF_TEST_FAILURE = 50 # TD venous pressure self-test failure - ALARM_ID_TD_PRE_TREATMENT_DRY_PRESSURE_TEST_FAILURE = 51 # TD set pressure offset is out or range fault - ALARM_ID_DD_D11_PUMP_SPEED_CONTROL_ERROR = 52 # DD concentrate pump D11_PUMP speed control error - ALARM_ID_DD_D10_PUMP_SPEED_CONTROL_ERROR = 53 # DD concentrate pump D10_PUMP speed control error - ALARM_ID_DD_CONC_PUMP_HALL_SENSOR_OUT_OF_RANGE = 54 # DD concentrate pumps hall sensor out of range - ALARM_ID_DD_CONCENTRATE_PUMP_FAULT = 55 # DD concentrate pump fault - ALARM_ID_DD_TEMPERATURE_SENSOR_OUT_OF_RANGE = 56 # DD temperature sensor out of range - ALARM_ID_DD_RTD_SENSORS_FPGA_FAULT = 57 # DD temperature sensors freshness timeout fault - ALARM_ID_DD_BC_FILL_TIMEOUT_FAULT = 58 # DD balancing chamber fill timeout fault - ALARM_ID_DD_BAROMETRIC_SENSOR_COEFFS_BAD_CRC = 59 # DD barometric sensor coefficients bad CRC - ALARM_ID_DD_D12_PUMP_RPM_OUT_OF_RANGE = 60 # DD fresh dialysate pump RPM out of range - ALARM_ID_DD_D12_PUMP_OFF_FAULT = 61 # DD fresh dialysate pump running when it is not commanded to run - ALARM_ID_DD_D12_PUMP_CURRENT_OUT_OF_RANGE = 62 # DD fresh dialysate pump current out of range - ALARM_ID_DD_D12_PUMP_DIRECTION_INVALID = 63 # DD fresh dialysate pump invalid direction - ALARM_ID_DD_D12_PUMP_DIRECTION_FPGA_FAULT = 64 # DD fresh dialysate pump direction error count FPGA fault - ALARM_ID_DD_D48_PUMP_RPM_OUT_OF_RANGE = 65 # DD spent dialysate pump RPM out of range - ALARM_ID_DD_D48_PUMP_OFF_FAULT = 66 # DD spent dialysate pump running when it is not commanded to run - ALARM_ID_DD_D48_PUMP_CURRENT_OUT_OF_RANGE = 67 # DD spent dialysate pump current out of range - ALARM_ID_DD_D48_PUMP_DIRECTION_INVALID = 68 # DD spent dialysate pump invalid direction - ALARM_ID_DD_D48_PUMP_DIRECTION_FPGA_FAULT = 69 # DD spent dialysate pump direction error count FPGA fault - ALARM_ID_DD_FLUID_TOO_LOW_WHILE_D5_HEAT_IS_ON = 70 # DD primary heater is On when no fluid is present - ALARM_ID_DD_FLUID_TOO_LOW_WHILE_D45_HEAT_IS_ON = 71 # DD trimmer heater is On when no fluid is present - ALARM_ID_TD_BAROMETRIC_SENSOR_COEFFS_BAD_CRC = 72 # TD barometric sensor coefficients bad CRC - ALARM_ID_TD_BARO_PRESSURE_OUT_OF_RANGE = 73 # TD barometric sensor pressure out of range - ALARM_ID_DD_D76_PUMP_SPEED_CONTROL_ERROR = 74 # DD UF pump speed control error - ALARM_ID_DD_SC_STATE1_FILL_START_PRESSURE_OUT_OF_RANGE = 75 # DD spent chamber state 1 fill pressure out of range - ALARM_ID_DD_SC_STATE2_FILL_START_PRESSURE_OUT_OF_RANGE = 76 # DD spent chamber state 2 fill pressure out of range - ALARM_ID_DD_SC_FILL_TIMEOUT_FAULT = 77 # DD spent chamber fill timeout fault - ALARM_ID_TD_AIR_TRAP_FILL_TIMEOUT = 78 # TD air trap fill timeout - ALARM_ID_TD_AIR_TRAP_ILLEGAL_LEVELS = 79 # TD air trap illegal levels - ALARM_ID_TD_PINCH_VALVE_FAULT = 80 # TD pinch valve fault - ALARM_ID_TD_VALVE_HOMING_FAILED = 81 # TD pinch valve homing fault - ALARM_ID_TD_VALVE_TRANSITION_TIMEOUT = 82 # TD pinch valve transition timeout - ALARM_ID_FP_CAN_MESSAGE_NOT_ACKED_BY_DD = 83 # FP can message not acked by DD fault - ALARM_ID_FP_FPGA_COMM_TIMEOUT = 84 # FP FPGA communication timeout - ALARM_ID_FP_COMM_TOO_MANY_BAD_CRCS = 85 # FP too many bad crcs - ALARM_ID_FP_VALVE_CONTROL_FAILURE = 86 # FP valve control failure - ALARM_ID_DD_BC_STATE1_FILL_START_PRESSURE_OUT_OF_RANGE = 87 # DD balance chamber state1 fill start pressure not in range - ALARM_ID_DD_AVAILABLE_1 = 88 # Available alarm ID 1 - ALARM_ID_DD_BC_STATE2_FILL_START_PRESSURE_OUT_OF_RANGE = 89 # DD balance chamber state2 fill start pressure not in range - ALARM_ID_DD_AVAILABLE_2 = 90 # Available alarm ID 2 - ALARM_ID_DD_GEND_HYD_CHAMBER_PRESS_OUT_OF_RANGE = 91 # DD generate dialysate hydraulics chamber ngative pressure out of range - ALARM_ID_DD_BICARB_FILL_TIMEOUT_FAULT = 92 # DD spent chamber fill timeout fault - ALARM_ID_DD_D79_RINSE_PUMP_SPEED_OUT_OF_RANGE = 93 # DD D79 rinse pump commanded vs measured speed out of tolerance - ALARM_ID_DD_BC_STATE1_FILL_PRESSURE_DROP_OUT_OF_RANGE = 94 # DD balance chamber state1 fill initiated and pressure drop is not in range - ALARM_ID_DD_BC_STATE2_FILL_PRESSURE_DROP_OUT_OF_RANGE = 95 # DD balance chamber state2 fill initiated and pressure drop is not in range - ALARM_ID_TD_TREATMENT_STOPPED_BY_USER = 96 # TD treatment paused by user - ALARM_ID_DD_D74_COND_SENSOR_FPGA_FAULT = 97 # DD D74 bicarb conductivity sensor freshness/error timeout fault - ALARM_ID_TD_BLOOD_SITTING_WARNING = 98 # TD blood sitting too long warning - ALARM_ID_TD_BLOOD_SITTING_TOO_LONG = 99 # TD blood sitting too long alarm; no resume; no rinseback - ALARM_ID_TD_COMM_TIMEOUT = 100 # TD communication timeout - ALARM_ID_UI_POST_FAILURE_OS_VERSION = 101 # UI POST OS version compatibility failure - ALARM_ID_UI_POST_FAILURE_SHASUM = 102 # UI POST Application Integrity (Sha256Sum) failure - ALARM_ID_UI_POST_FAILURE_CANBUS = 103 # UI POST CANBus failure - ALARM_ID_UI_POST_FAILURE_DISPLAY = 104 # UI POST Display failure - ALARM_ID_UI_POST_FAILURE_TOUCH = 105 # UI POST Touch failure - ALARM_ID_UI_POST_FAILURE_SDCARD = 106 # UI POST SD-Card failure - ALARM_ID_UI_POST_FAILURE_RTC = 107 # UI POST RTC failure - ALARM_ID_UI_POST_FAILURE_WIFI = 108 # UI POST WiFi failure - ALARM_ID_UI_POST_FAILURE_BLUETOOTH = 109 # UI POST Bluetooth failure - ALARM_ID_UI_POST_FAILURE_ETHERNET = 110 # UI POST Ethernet failure - ALARM_ID_UI_POST_FAILURE_SOUND = 111 # UI POST Sound failure - ALARM_ID_UI_POST_FAILURE_CLOUDSYNC = 112 # UI POST CloudSync failure - ALARM_ID_UI_POST_FAILURE_INVALID_YEAR = 113 # UI POST Year check failure - ALARM_ID_UI_POST_FAILURE_SETTINGS_BAD = 114 # UI POST Configuration check failure - ALARM_ID_UI_EVNT_FAILURE_SDCARD = 115 # UI EVNT SD-Card failure - ALARM_ID_UI_RESERVED_116 = 116 # UI Reserved failure - ALARM_ID_UI_RESERVED_117 = 117 # UI Reserved failure - ALARM_ID_UI_RESERVED_118 = 118 # UI Reserved failure - ALARM_ID_UI_RESERVED_119 = 119 # UI Reserved failure - ALARM_ID_UI_RESERVED_120 = 120 # UI Reserved failure - ALARM_ID_UI_RESERVED_121 = 121 # UI Reserved failure - ALARM_ID_UI_RESERVED_122 = 122 # UI Reserved failure - ALARM_ID_UI_RESERVED_123 = 123 # UI Reserved failure - ALARM_ID_UI_RESERVED_124 = 124 # UI Reserved failure - ALARM_ID_UI_RESERVED_125 = 125 # UI Reserved failure - ALARM_ID_UI_RESERVED_126 = 126 # UI Reserved failure - ALARM_ID_UI_RESERVED_127 = 127 # UI Reserved failure - ALARM_ID_UI_RESERVED_128 = 128 # UI Reserved failure - ALARM_ID_UI_RESERVED_129 = 129 # UI Reserved failure - ALARM_ID_UI_RESERVED_130 = 130 # UI Reserved failure - ALARM_ID_BATTERY_LOW = 131 # TD Battery Low warning - ALARM_ID_DD_DIALYSATE_TEMP_ABOVE_SAFETY_TEMP = 132 # DD dialysate temperature above safety - ALARM_ID_DD_DIALYSATE_TEMP_ABOVE_TARGET_TEMP = 133 # DD dialysate temperature high - ALARM_ID_DD_DIALYSATE_TEMP_BELOW_TARGET_TEMP = 134 # DD dialysate temperature low - ALARM_ID_FP_PRESSURE_RELIEF_OUT_LOW_RANGE = 135 # FP Pressure relief valve low - ALARM_ID_FP_PRESSURE_RELIEF_OUT_HIGH_RANGE = 136 # FP Pressure relief valve high - ALARM_ID_FP_POWER_BUDGET_OUT_OF_RANGE = 137 # FP Power budget exceeded - ALARM_ID_FP_FLOW_RATE_LOW_RANGE = 138 # FP flow rate low - ALARM_ID_FP_INLET_TEMPERATURE_OUT_LOW_RANGE = 139 # FP inlet water temperature low - ALARM_ID_FP_INLET_TEMPERATURE_OUT_HIGH_RANGE = 140 # FP inlet water temperature high - ALARM_ID_FP_INLET_PRESSURE_OUT_LOW_RANGE = 141 # FP inlet pressure low - ALARM_ID_FP_INLET_PRESSURE_OUT_HIGH_RANGE = 142 # FP inlet pressure high - ALARM_ID_FP_INLET_CONDUCTIVITY_OUT_HIGH_RANGE = 143 # FP inlet conductivity high - ALARM_ID_FP_INLET_CONDUCTIVITY_OUT_LOW_RANGE = 144 # FP inlet conductivty low - ALARM_ID_FP_RO_INLET_PRESSURE_OUT_HIGH_RANGE = 145 # FP pump inlet pressure high - ALARM_ID_FP_RO_OUTLET_CONDUCTIVITY_HIGH_RANGE = 146 # FP pump outlet conductivity high - ALARM_ID_FP_RO_INLET_CONDUCTIVITY_HIGH_RANGE = 147 # FP pump inlet conductivity high - ALARM_ID_FP_REJECTION_RATIO_LOW_RANGE = 148 # FP rejection ratio low - ALARM_ID_FP_INLET_PRESSURE_REGULATOR_OUT_OF_RANGE = 149 # FP inlet pressure regulator out of range - ALARM_ID_FP_INLET_TEMPERATURE_OUT_CRITICAL_RANGE = 150 # FP inlet temperature above 40C during filters flush - ALARM_ID_FP_PERMEATE_FLUSH_CONDUCTIVITY_TIMEOUT = 151 # FP membrane flush timeout - ALARM_ID_FP_CONCENTRATE_FLUSH_TANK_FULL_TIMEOUT = 152 # FP concentrate flush tank full timeout - ALARM_ID_FP_GEN_PERMEATE_TANK_FULL_TIMEOUT = 153 # FP tank full time out alarm - ALARM_ID_DD_DIALYSATE_TEMPERATURE_SENSORS_OUT_OF_RANGE = 154 # DD dialysate temperature sensors out of range - ALARM_ID_DD_BLOOD_LEAK_DETECTED = 155 # DD blood leak detected - ALARM_ID_DD_BLOOD_LEAK_INVALID_CAL_RECORD = 156 # DD blood leak invalid calibration record - ALARM_ID_DD_BLOOD_LEAK_SENSOR_EMBEDDED_MODE_FAILURE = 157 # DD blood leak sensor embedded mode failure - ALARM_ID_DD_BLOOD_LEAK_SENSOR_SET_POINT_SET_FAILURE = 158 # DD blood leak sensor set point failure - ALARM_ID_DD_BLOOD_LEAK_RECOVERING_PLEASE_WAIT = 159 # DD blood leak sensor recovering please wait - ALARM_ID_FP_GEN_PERMEATE_TANK_FILL_TIMEOUT = 160 # FP tank fill time out alarm. - ALARM_ID_FP_INLET_PRESSURE_CRITICAL_OUT_RANGE = 161 # FP inlet pressure high fault - ALARM_ID_FP_PERMEATE_FLOW_OUT_HIGH_RANGE = 162 # FP permeate flow high fault - ALARM_ID_FP_PERMEATE_FLOW_OUT_LOW_RANGE = 163 # FP permeate flow low fault - ALARM_ID_FP_INLET_PRESSURE_LOW_RANGE = 164 # FP inlet pressure low fault - ALARM_ID_TD_AIR_TRAP_LOWER_TIMEOUT = 165 # TD air trap lower timeout - ALARM_ID_TD_SYRINGE_PUMP_SELF_TEST_FAILURE = 166 # TD syringe pump self-test failure alarm - ALARM_ID_TD_SYRINGE_PUMP_RUNNING_WHILE_BP_OFF_ERROR = 167 # TD syringe pump is running while the BP is off - ALARM_ID_TD_SYRINGE_PUMP_FPGA_ADC_FAULT = 168 # TD syringe pump ADC FPGA fault - ALARM_ID_TD_SYRINGE_PUMP_FAULT = 169 # TD syringe pump fault reported by FPGA - ALARM_ID_TD_SYRINGE_PUMP_DAC_WRITE_ERROR = 170 # TD syringe pump DAC write failure - ALARM_ID_TD_SYRINGE_PUMP_SPEED_ERROR = 171 # TD syringe pump speed check error - ALARM_ID_TD_SYRINGE_PUMP_VOLUME_ERROR = 172 # TD syringe pump volume check error - ALARM_ID_TD_SYRINGE_PUMP_OVER_TRAVEL_ERROR = 173 # TD syringe pump over travel error - ALARM_ID_TD_SYRINGE_PUMP_NOT_STOPPED_ERROR = 174 # TD syringe pump not stopped in off state error - ALARM_ID_TD_SYRINGE_PUMP_ENCODER_DIRECTION_ERROR = 175 # TD syringe pump direction (from encoder) error - ALARM_ID_TD_SYRINGE_PUMP_CONTROLLER_DIRECTION_ERROR = 176 # TD syringe pump direction (from controller) error - ALARM_ID_TD_SYRINGE_PUMP_SYRINGE_EMPTY = 177 # TD syringe empty alarm - ALARM_ID_TD_SYRINGE_PUMP_SYRINGE_REMOVED = 178 # TD syringe pump syringe removed alarm - ALARM_ID_TD_SYRINGE_PUMP_STALL = 179 # TD syringe pump stall alarm - ALARM_ID_TD_HEPARIN_FORCE_SENSOR_INVALID_CAL_RECORD = 180 # TD heparin force sensor invalid calibration record - ALARM_ID_TD_SYRINGE_DETECTED = 181 # TD syringe detected alarm - ALARM_ID_TD_SYRINGE_PUMP_NOT_ENOUGH_HEPARIN_ALARM = 182 # TD syringe pump not enough Heparin alarm - ALARM_ID_TD_SYRINGE_PUMP_OCCLUSION = 183 # TD syringe pump occlusion alarm - ALARM_ID_TD_SYRINGE_PUMP_PRIME_TIMEOUT = 184 # TD syringe pump prime timeout - ALARM_ID_FP_P9_COND_SENSOR_FPGA_FAULT = 185 # FP P9 conductivity sensor fpga fault - ALARM_ID_FP_P18_COND_SENSOR_FPGA_FAULT = 186 # FP P18 conductivity sensor fpga fault - ALARM_ID_TD_AUTO_LOAD_EJECT_BP_TIMEOUT = 187 # TD blood pump timeout during auto-load\eject operation - ALARM_ID_TD_AUTO_EJECT_EJECTOR_TIMEOUT = 188 # TD ejector failed to extend or retract during auto-eject operation - ALARM_ID_TD_EJECTOR_POST_TEST_FAILED = 189 # TD ejector POST homing failure - ALARM_ID_TD_AUTO_LOAD_EJECT_HIGH_BP_TORQUE = 190 # TD high blood pump torque during auto-load\eject operation - ALARM_ID_TD_AIR_PUMP_STALL = 191 # TD air pump stall detected - ALARM_ID_TD_INVALID_TUBING_SET = 192 # TD invalid tubing set - ALARM_ID_TD_INSTALL_NEW_BLOOD_TUBING_SET = 193 # TD install new blood tubing set - ALARM_ID_TD_TUBING_SET_NOT_DETECTED = 194 # TD no tubing set detected - ALARM_ID_TD_TUBING_SET_AUTHENTICATION_TIMEOUT = 195 # TD tubing set authentication timeout - ALARM_ID_TD_PRESSURE_TOO_HIGH_TO_ZERO = 196 # TD pressure too high to zero - ALARM_ID_TD_VENOUS_PRESSURIZATION_TIMEOUT = 197 # TD venous pressurization timeout - ALARM_ID_TD_VENOUS_PRESSURE_DECAY = 198 # TD venous pressure decay failure - ALARM_ID_TD_VENOUS_PRESSURE_LEAK = 199 # TD venous pressure leak - ALARM_ID_TD_VENOUS_PRESSURE_RELIEF = 200 # TD venous pressure relief failure - ALARM_ID_TD_ARTERIAL_PRESSURIZATION_TIMEOUT = 201 # TD arterial pressurization timeout - ALARM_ID_TD_ARTERIAL_PRESSURE_DECAY = 202 # TD arterial pressure decay failure - ALARM_ID_TD_ARTERIAL_PRESSURE_LEAK = 203 # TD arterial pressure leak - ALARM_ID_TD_ARTERIAL_PRESSURE_RELIEF = 204 # TD arterial pressure relief failure - NUM_OF_ALARM_IDS = 205 # Number of alarms \ No newline at end of file + ALARM_ID_NO_ALARM = 0 # Indication for when no alarms is a possible situation + ALARM_ID_TD_SOFTWARE_FAULT = 1 # TD Software fault. Software found itself in an unexpected state + ALARM_ID_DD_SOFTWARE_FAULT = 2 # DD software fault. Software found itself in an unexpected state + ALARM_ID_FP_SOFTWARE_FAULT = 3 # FP software fault. Software found itself in an unexpected state + ALARM_ID_TD_FPGA_POST_TEST_FAILED = 4 # TD FPGA POST failure + ALARM_ID_TD_WATCHDOG_POST_TEST_FAILED = 5 # TD Watchdog POST failure + ALARM_ID_TD_UI_COMM_POST_FAILED = 6 # TD UI communication POST failure. UI failed to communicate within a reasonable time after power up + ALARM_ID_TD_FPGA_CLOCK_SPEED_CHECK_FAILURE = 7 # TD processor clock speed checks against FPGA clock failure + ALARM_ID_TD_FPGA_COMM_TIMEOUT = 8 # TD FPGA communication down for too long + ALARM_ID_TD_UI_COMM_TIMEOUT = 9 # TD UI communication timeout + ALARM_ID_TD_DD_COMM_TIMEOUT = 10 # TD DD communication timeout + ALARM_ID_TD_COMM_TOO_MANY_BAD_CRCS = 11 # TD too many bad communications CRC + ALARM_ID_TD_CAN_MESSAGE_NOT_ACKED_BY_UI = 12 # TD didn't get ACK on message to UI that required acknowledgment + ALARM_ID_TD_CAN_MESSAGE_NOT_ACKED_BY_DD = 13 # TD didn't get ACK on message to DD that required acknowledgment + ALARM_ID_TD_CRITICAL_DATA_ERROR = 14 # TD critical data integrity check failed + ALARM_ID_DD_CRITICAL_DATA_ERROR = 15 # DD critical data integrity check failed + ALARM_ID_TD_WATCHDOG_EXPIRED = 16 # TD watchdog expired + ALARM_ID_DD_WATCHDOG_EXPIRED = 17 # DD watchdog expired + ALARM_ID_DD_COMM_TOO_MANY_BAD_CRCS = 18 # DD too many bad communications CRC + ALARM_ID_DD_CAN_MESSAGE_NOT_ACKED_BY_FP = 19 # DD didn't get ACK on message to FP that required acknowledgment + ALARM_ID_DD_CAN_MESSAGE_NOT_ACKED_BY_TD = 20 # DD didn't get ACK on message to TD that required acknowledgment + ALARM_ID_DD_FPGA_POST_TEST_FAILED = 21 # DD FPGA POST failure + ALARM_ID_DD_FPGA_CLOCK_SPEED_CHECK_FAILURE = 22 # DD processor clock speed checks against FPGA clock failure + ALARM_ID_DD_FPGA_COMM_TIMEOUT = 23 # DD FPGA communication down for too long + ALARM_ID_TD_ALARM_AUDIO_SELF_TEST_FAILURE = 24 # TD alarm audio failed POST + ALARM_ID_DD_VALVE_CONTROL_FAILURE = 25 # DD FPGA not accepting commanded valve states + ALARM_ID_TD_ARTERIAL_SENSOR_TIMEOUT_FAULT = 26 # TD arterial pressure sensor freshness/error timeout fault + ALARM_ID_TD_VENOUS_SENSOR_TIMEOUT_FAULT = 27 # TD venous pressure sensor freshness/error timeout fault + ALARM_ID_TD_TMP_PRESSURE_LOW = 28 # TD TMP pressure low + ALARM_ID_TD_TMP_PRESSURE_HIGH = 29 # TD TMP pressure high + ALARM_ID_TD_VENOUS_BUBBLE_SELF_TEST_FAILURE = 30 # TD venous bubble self-test failure. + ALARM_ID_TD_BLOOD_PRIME_PAUSE_WARNING = 31 # TD blood prime pause warning + ALARM_ID_TD_BLOOD_PRIME_PAUSE_TIMEOUT = 32 # TD blood prime pause timeout + ALARM_ID_TD_VOLTAGE_OUT_OF_RANGE = 33 # TD voltage out of range fault + ALARM_ID_TD_AC_POWER_LOST = 34 # TD AC power lost + ALARM_ID_TD_AC_POWER_LOST_IN_TREATMENT = 35 # TD AC power lost during treatment + ALARM_ID_DD_D17_COND_SENSOR_FPGA_FAULT = 36 # DD CD1 conductivity sensor freshness/error timeout fault + ALARM_ID_DD_D27_COND_SENSOR_FPGA_FAULT = 37 # DD CD2 conductivity sensor freshness/error timeout fault + ALARM_ID_DD_D29_COND_SENSOR_FPGA_FAULT = 38 # DD CD3 conductivity sensor freshness/error timeout fault + ALARM_ID_DD_D43_COND_SENSOR_FPGA_FAULT = 39 # DD CD4 conductivity sensor freshness/error timeout fault + ALARM_ID_TD_VENOUS_BUBBLE_DETECTED = 40 # TD venous bubble detected + ALARM_ID_TD_CARTRIDGE_DOOR_OPENED = 41 # TD front door open + ALARM_ID_TD_STUCK_BUTTON_TEST_FAILED = 42 # TD stuck button self test failure + ALARM_ID_TD_ARTERIAL_PRESSURE_LOW = 43 # TD arterial pressure low + ALARM_ID_TD_ARTERIAL_PRESSURE_HIGH = 44 # TD arterial pressure high + ALARM_ID_TD_ARTERIAL_PRESSURE_OUT_OF_RANGE = 45 # TD arterial pressure out of range fault + ALARM_ID_TD_ARTERIAL_PRESSURE_SELF_TEST_FAILURE = 46 # TD arterial pressure self-test failure + ALARM_ID_TD_VENOUS_PRESSURE_LOW = 47 # TD venous pressure low + ALARM_ID_TD_VENOUS_PRESSURE_HIGH = 48 # TD venous pressure high + ALARM_ID_TD_VENOUS_PRESSURE_OUT_OF_RANGE = 49 # TD venous pressure out of range fault + ALARM_ID_TD_VENOUS_PRESSURE_SELF_TEST_FAILURE = 50 # TD venous pressure self-test failure + ALARM_ID_TD_PRE_TREATMENT_DRY_PRESSURE_TEST_FAILURE = 51 # TD set pressure offset is out or range fault + ALARM_ID_DD_D11_PUMP_SPEED_CONTROL_ERROR = 52 # DD concentrate pump D11_PUMP speed control error + ALARM_ID_DD_D10_PUMP_SPEED_CONTROL_ERROR = 53 # DD concentrate pump D10_PUMP speed control error + ALARM_ID_DD_CONC_PUMP_HALL_SENSOR_OUT_OF_RANGE = 54 # DD concentrate pumps hall sensor out of range + ALARM_ID_DD_CONCENTRATE_PUMP_FAULT = 55 # DD concentrate pump fault + ALARM_ID_DD_TEMPERATURE_SENSOR_OUT_OF_RANGE = 56 # DD temperature sensor out of range + ALARM_ID_DD_RTD_SENSORS_FPGA_FAULT = 57 # DD temperature sensors freshness timeout fault + ALARM_ID_DD_BC_FILL_TIMEOUT_FAULT = 58 # DD balancing chamber fill timeout fault + ALARM_ID_DD_BAROMETRIC_SENSOR_COEFFS_BAD_CRC = 59 # DD barometric sensor coefficients bad CRC + ALARM_ID_DD_D12_PUMP_RPM_OUT_OF_RANGE = 60 # DD fresh dialysate pump RPM out of range + ALARM_ID_DD_D12_PUMP_OFF_FAULT = 61 # DD fresh dialysate pump running when it is not commanded to run + ALARM_ID_DD_D12_PUMP_CURRENT_OUT_OF_RANGE = 62 # DD fresh dialysate pump current out of range + ALARM_ID_DD_D12_PUMP_DIRECTION_INVALID = 63 # DD fresh dialysate pump invalid direction + ALARM_ID_DD_D12_PUMP_DIRECTION_FPGA_FAULT = 64 # DD fresh dialysate pump direction error count FPGA fault + ALARM_ID_DD_D48_PUMP_RPM_OUT_OF_RANGE = 65 # DD spent dialysate pump RPM out of range + ALARM_ID_DD_D48_PUMP_OFF_FAULT = 66 # DD spent dialysate pump running when it is not commanded to run + ALARM_ID_DD_D48_PUMP_CURRENT_OUT_OF_RANGE = 67 # DD spent dialysate pump current out of range + ALARM_ID_DD_D48_PUMP_DIRECTION_INVALID = 68 # DD spent dialysate pump invalid direction + ALARM_ID_DD_D48_PUMP_DIRECTION_FPGA_FAULT = 69 # DD spent dialysate pump direction error count FPGA fault + ALARM_ID_DD_FLUID_TOO_LOW_WHILE_D5_HEAT_IS_ON = 70 # DD primary heater is On when no fluid is present + ALARM_ID_DD_FLUID_TOO_LOW_WHILE_D45_HEAT_IS_ON = 71 # DD trimmer heater is On when no fluid is present + ALARM_ID_TD_BAROMETRIC_SENSOR_COEFFS_BAD_CRC = 72 # TD barometric sensor coefficients bad CRC + ALARM_ID_TD_BARO_PRESSURE_OUT_OF_RANGE = 73 # TD barometric sensor pressure out of range + ALARM_ID_DD_D76_PUMP_SPEED_CONTROL_ERROR = 74 # DD UF pump speed control error + ALARM_ID_DD_SC_STATE1_FILL_START_PRESSURE_OUT_OF_RANGE = 75 # DD spent chamber state 1 fill pressure out of range + ALARM_ID_DD_SC_STATE2_FILL_START_PRESSURE_OUT_OF_RANGE = 76 # DD spent chamber state 2 fill pressure out of range + ALARM_ID_DD_SC_FILL_TIMEOUT_FAULT = 77 # DD spent chamber fill timeout fault + ALARM_ID_TD_AIR_TRAP_FILL_TIMEOUT = 78 # TD air trap fill timeout + ALARM_ID_TD_AIR_TRAP_ILLEGAL_LEVELS = 79 # TD air trap illegal levels + ALARM_ID_TD_PINCH_VALVE_FAULT = 80 # TD pinch valve fault + ALARM_ID_TD_VALVE_HOMING_FAILED = 81 # TD pinch valve homing fault + ALARM_ID_TD_VALVE_TRANSITION_TIMEOUT = 82 # TD pinch valve transition timeout + ALARM_ID_FP_CAN_MESSAGE_NOT_ACKED_BY_DD = 83 # FP can message not acked by DD fault + ALARM_ID_FP_FPGA_COMM_TIMEOUT = 84 # FP FPGA communication timeout + ALARM_ID_FP_COMM_TOO_MANY_BAD_CRCS = 85 # FP too many bad crcs + ALARM_ID_FP_VALVE_CONTROL_FAILURE = 86 # FP valve control failure + ALARM_ID_DD_BC_STATE1_FILL_START_PRESSURE_OUT_OF_RANGE = 87 # DD balance chamber state1 fill start pressure not in range + ALARM_ID_DD_AVAILABLE_1 = 88 # Available alarm ID 1 + ALARM_ID_DD_BC_STATE2_FILL_START_PRESSURE_OUT_OF_RANGE = 89 # DD balance chamber state2 fill start pressure not in range + ALARM_ID_DD_AVAILABLE_2 = 90 # Available alarm ID 2 + ALARM_ID_DD_GEND_HYD_CHAMBER_PRESS_OUT_OF_RANGE = 91 # DD generate dialysate hydraulics chamber ngative pressure out of range + ALARM_ID_DD_BICARB_FILL_TIMEOUT_FAULT = 92 # DD spent chamber fill timeout fault + ALARM_ID_DD_D79_RINSE_PUMP_SPEED_OUT_OF_RANGE = 93 # DD D79 rinse pump commanded vs measured speed out of tolerance + ALARM_ID_DD_BC_STATE1_FILL_PRESSURE_DROP_OUT_OF_RANGE = 94 # DD balance chamber state1 fill initiated and pressure drop is not in range + ALARM_ID_DD_BC_STATE2_FILL_PRESSURE_DROP_OUT_OF_RANGE = 95 # DD balance chamber state2 fill initiated and pressure drop is not in range + ALARM_ID_TD_TREATMENT_STOPPED_BY_USER = 96 # TD treatment paused by user + ALARM_ID_DD_D74_COND_SENSOR_FPGA_FAULT = 97 # DD D74 bicarb conductivity sensor freshness/error timeout fault + ALARM_ID_TD_BLOOD_SITTING_WARNING = 98 # TD blood sitting too long warning + ALARM_ID_TD_BLOOD_SITTING_TOO_LONG = 99 # TD blood sitting too long alarm; no resume; no rinseback + ALARM_ID_TD_COMM_TIMEOUT = 100 # TD communication timeout + ALARM_ID_UI_POST_FAILURE_OS_VERSION = 101 # UI POST OS version compatibility failure + ALARM_ID_UI_POST_FAILURE_SHASUM = 102 # UI POST Application Integrity (Sha256Sum) failure + ALARM_ID_UI_POST_FAILURE_CANBUS = 103 # UI POST CANBus failure + ALARM_ID_UI_POST_FAILURE_DISPLAY = 104 # UI POST Display failure + ALARM_ID_UI_POST_FAILURE_TOUCH = 105 # UI POST Touch failure + ALARM_ID_UI_POST_FAILURE_SDCARD = 106 # UI POST SD-Card failure + ALARM_ID_UI_POST_FAILURE_RTC = 107 # UI POST RTC failure + ALARM_ID_UI_POST_FAILURE_WIFI = 108 # UI POST WiFi failure + ALARM_ID_UI_POST_FAILURE_BLUETOOTH = 109 # UI POST Bluetooth failure + ALARM_ID_UI_POST_FAILURE_ETHERNET = 110 # UI POST Ethernet failure + ALARM_ID_UI_POST_FAILURE_SOUND = 111 # UI POST Sound failure + ALARM_ID_UI_POST_FAILURE_CLOUDSYNC = 112 # UI POST CloudSync failure + ALARM_ID_UI_POST_FAILURE_INVALID_YEAR = 113 # UI POST Year check failure + ALARM_ID_UI_POST_FAILURE_SETTINGS_BAD = 114 # UI POST Configuration check failure + ALARM_ID_UI_EVNT_FAILURE_SDCARD = 115 # UI EVNT SD-Card failure + ALARM_ID_UI_RESERVED_116 = 116 # UI Reserved failure + ALARM_ID_UI_RESERVED_117 = 117 # UI Reserved failure + ALARM_ID_UI_RESERVED_118 = 118 # UI Reserved failure + ALARM_ID_UI_RESERVED_119 = 119 # UI Reserved failure + ALARM_ID_UI_RESERVED_120 = 120 # UI Reserved failure + ALARM_ID_UI_RESERVED_121 = 121 # UI Reserved failure + ALARM_ID_UI_RESERVED_122 = 122 # UI Reserved failure + ALARM_ID_UI_RESERVED_123 = 123 # UI Reserved failure + ALARM_ID_UI_RESERVED_124 = 124 # UI Reserved failure + ALARM_ID_UI_RESERVED_125 = 125 # UI Reserved failure + ALARM_ID_UI_RESERVED_126 = 126 # UI Reserved failure + ALARM_ID_UI_RESERVED_127 = 127 # UI Reserved failure + ALARM_ID_UI_RESERVED_128 = 128 # UI Reserved failure + ALARM_ID_UI_RESERVED_129 = 129 # UI Reserved failure + ALARM_ID_UI_RESERVED_130 = 130 # UI Reserved failure + ALARM_ID_BATTERY_LOW = 131 # TD Battery Low warning + ALARM_ID_DD_DIALYSATE_TEMP_ABOVE_SAFETY_TEMP = 132 # DD dialysate temperature above safety + ALARM_ID_DD_DIALYSATE_TEMP_ABOVE_TARGET_TEMP = 133 # DD dialysate temperature high + ALARM_ID_DD_DIALYSATE_TEMP_BELOW_TARGET_TEMP = 134 # DD dialysate temperature low + ALARM_ID_FP_PRESSURE_RELIEF_OUT_LOW_RANGE = 135 # FP Pressure relief valve low + ALARM_ID_FP_PRESSURE_RELIEF_OUT_HIGH_RANGE = 136 # FP Pressure relief valve high + ALARM_ID_FP_POWER_BUDGET_OUT_OF_RANGE = 137 # FP Power budget exceeded + ALARM_ID_FP_FLOW_RATE_LOW_RANGE = 138 # FP flow rate low + ALARM_ID_FP_INLET_TEMPERATURE_OUT_LOW_RANGE = 139 # FP inlet water temperature low + ALARM_ID_FP_INLET_TEMPERATURE_OUT_HIGH_RANGE = 140 # FP inlet water temperature high + ALARM_ID_FP_INLET_PRESSURE_OUT_LOW_RANGE = 141 # FP inlet pressure low + ALARM_ID_FP_INLET_PRESSURE_OUT_HIGH_RANGE = 142 # FP inlet pressure high + ALARM_ID_FP_INLET_CONDUCTIVITY_OUT_HIGH_RANGE = 143 # FP inlet conductivity high + ALARM_ID_FP_INLET_CONDUCTIVITY_OUT_LOW_RANGE = 144 # FP inlet conductivty low + ALARM_ID_FP_RO_INLET_PRESSURE_OUT_HIGH_RANGE = 145 # FP pump inlet pressure high + ALARM_ID_FP_RO_OUTLET_CONDUCTIVITY_HIGH_RANGE = 146 # FP pump outlet conductivity high + ALARM_ID_FP_RO_INLET_CONDUCTIVITY_HIGH_RANGE = 147 # FP pump inlet conductivity high + ALARM_ID_FP_REJECTION_RATIO_LOW_RANGE = 148 # FP rejection ratio low + ALARM_ID_FP_INLET_PRESSURE_REGULATOR_OUT_OF_RANGE = 149 # FP inlet pressure regulator out of range + ALARM_ID_FP_INLET_TEMPERATURE_OUT_CRITICAL_RANGE = 150 # FP inlet temperature above 40C during filters flush + ALARM_ID_FP_PERMEATE_FLUSH_CONDUCTIVITY_TIMEOUT = 151 # FP membrane flush timeout + ALARM_ID_FP_CONCENTRATE_FLUSH_TANK_FULL_TIMEOUT = 152 # FP concentrate flush tank full timeout + ALARM_ID_FP_GEN_PERMEATE_TANK_FULL_TIMEOUT = 153 # FP tank full time out alarm + ALARM_ID_DD_DIALYSATE_TEMPERATURE_SENSORS_OUT_OF_RANGE = 154 # DD dialysate temperature sensors out of range + ALARM_ID_DD_BLOOD_LEAK_DETECTED = 155 # DD blood leak detected + ALARM_ID_DD_BLOOD_LEAK_INVALID_CAL_RECORD = 156 # DD blood leak invalid calibration record + ALARM_ID_DD_BLOOD_LEAK_SENSOR_EMBEDDED_MODE_FAILURE = 157 # DD blood leak sensor embedded mode failure + ALARM_ID_DD_BLOOD_LEAK_SENSOR_SET_POINT_SET_FAILURE = 158 # DD blood leak sensor set point failure + ALARM_ID_DD_BLOOD_LEAK_RECOVERING_PLEASE_WAIT = 159 # DD blood leak sensor recovering please wait + ALARM_ID_FP_GEN_PERMEATE_TANK_FILL_TIMEOUT = 160 # FP tank fill time out alarm. + ALARM_ID_FP_INLET_PRESSURE_CRITICAL_OUT_RANGE = 161 # FP inlet pressure high fault + ALARM_ID_FP_PERMEATE_FLOW_OUT_HIGH_RANGE = 162 # FP permeate flow high fault + ALARM_ID_FP_PERMEATE_FLOW_OUT_LOW_RANGE = 163 # FP permeate flow low fault + ALARM_ID_FP_INLET_PRESSURE_LOW_RANGE = 164 # FP inlet pressure low fault + ALARM_ID_TD_AIR_TRAP_LOWER_TIMEOUT = 165 # TD air trap lower timeout + ALARM_ID_TD_SYRINGE_PUMP_SELF_TEST_FAILURE = 166 # TD syringe pump self-test failure alarm + ALARM_ID_TD_SYRINGE_PUMP_RUNNING_WHILE_BP_OFF_ERROR = 167 # TD syringe pump is running while the BP is off + ALARM_ID_TD_SYRINGE_PUMP_FPGA_ADC_FAULT = 168 # TD syringe pump ADC FPGA fault + ALARM_ID_TD_SYRINGE_PUMP_FAULT = 169 # TD syringe pump fault reported by FPGA + ALARM_ID_TD_SYRINGE_PUMP_DAC_WRITE_ERROR = 170 # TD syringe pump DAC write failure + ALARM_ID_TD_SYRINGE_PUMP_SPEED_ERROR = 171 # TD syringe pump speed check error + ALARM_ID_TD_SYRINGE_PUMP_VOLUME_ERROR = 172 # TD syringe pump volume check error + ALARM_ID_TD_SYRINGE_PUMP_OVER_TRAVEL_ERROR = 173 # TD syringe pump over travel error + ALARM_ID_TD_SYRINGE_PUMP_NOT_STOPPED_ERROR = 174 # TD syringe pump not stopped in off state error + ALARM_ID_TD_SYRINGE_PUMP_ENCODER_DIRECTION_ERROR = 175 # TD syringe pump direction (from encoder) error + ALARM_ID_TD_SYRINGE_PUMP_CONTROLLER_DIRECTION_ERROR = 176 # TD syringe pump direction (from controller) error + ALARM_ID_TD_SYRINGE_PUMP_SYRINGE_EMPTY = 177 # TD syringe empty alarm + ALARM_ID_TD_SYRINGE_PUMP_SYRINGE_REMOVED = 178 # TD syringe pump syringe removed alarm + ALARM_ID_TD_SYRINGE_PUMP_STALL = 179 # TD syringe pump stall alarm + ALARM_ID_TD_HEPARIN_FORCE_SENSOR_INVALID_CAL_RECORD = 180 # TD heparin force sensor invalid calibration record + ALARM_ID_TD_SYRINGE_DETECTED = 181 # TD syringe detected alarm + ALARM_ID_TD_SYRINGE_PUMP_NOT_ENOUGH_HEPARIN_ALARM = 182 # TD syringe pump not enough Heparin alarm + ALARM_ID_TD_SYRINGE_PUMP_OCCLUSION = 183 # TD syringe pump occlusion alarm + ALARM_ID_TD_SYRINGE_PUMP_PRIME_TIMEOUT = 184 # TD syringe pump prime timeout + ALARM_ID_FP_P9_COND_SENSOR_FPGA_FAULT = 185 # FP P9 conductivity sensor fpga fault + ALARM_ID_FP_P18_COND_SENSOR_FPGA_FAULT = 186 # FP P18 conductivity sensor fpga fault + ALARM_ID_TD_AUTO_LOAD_EJECT_BP_TIMEOUT = 187 # TD blood pump timeout during auto-load operation + ALARM_ID_TD_AUTO_EJECT_EJECTOR_TIMEOUT = 188 # TD ejector failed to extend or retract during auto-eject operation + ALARM_ID_TD_EJECTOR_POST_TEST_FAILED = 189 # TD ejector POST homing failure + ALARM_ID_TD_AUTO_LOAD_EJECT_HIGH_BP_TORQUE = 190 # TD high blood pump torque during auto-load operation + ALARM_ID_TD_AIR_PUMP_STALL = 191 # TD air pump stall detected + ALARM_ID_TD_CPU_RAM_ERROR = 192 # TD CPU RAM error + ALARM_ID_DD_CPU_RAM_ERROR = 193 # DD CPU RAM error + ALARM_ID_TD_INTEGRITY_POST_TEST_FAILED = 194 # TD integrity post test fault + ALARM_ID_DD_INTEGRITY_POST_TEST_FAILED = 195 # TD integrity post test fault + ALARM_ID_TD_SALINE_BAG_VOLUME_LOW_ALARM = 196 # TD saline bag volume low alarm + ALARM_ID_DD_D92_PUMP_RPM_OUT_OF_RANGE = 197 # DD D92 pump rpm out of range + ALARM_ID_TD_PRIME_COMPLETED_MEDIUM = 198 # TD prime completed medium priority alarm + ALARM_ID_TD_REPEATED_AIR_TRAP_LOWER_EVENTS = 199 # TD repeated air trap lower events + ALARM_ID_TD_TUBE_SET_MISMATCH = 200 # TD tubeset mismatch alarm + ALARM_ID_TD_PRE_TX_HEPARIN_LOAD_SYRINGE = 201 # TD Pre-Treatment Load Heparin Syringe + ALARM_ID_FW_RESERVED_202 = 202 # FW reserved for use + ALARM_ID_FW_RESERVED_203 = 203 # FW reserved for use + ALARM_ID_FW_RESERVED_204 = 204 # FW reserved for use + ALARM_ID_TD_UI_POST_TIMEOUT = 205 # TD UI POST failed + ALARM_ID_TD_UI_COMPATIBILITY_ERROR = 206 # TD and UI software builds are not compatible + ALARM_ID_TD_SAFETY_SHUTDOWN_POST_TEST_FAILED = 207 # TD POST Safety Shutdown failure + ALARM_ID_FW_RESERVED_208 = 208 # FW reserved for use + ALARM_ID_FW_RESERVED_209 = 209 # FW reserved for use + ALARM_ID_FW_RESERVED_210 = 210 # FW reserved for use + ALARM_ID_FW_RESERVED_211 = 211 # FW reserved for use + ALARM_ID_FW_RESERVED_212 = 212 # FW reserved for use + ALARM_ID_TD_BP_SYSTOLIC_LOW = 213 # TD blood pressure systolic low + ALARM_ID_TD_BP_SYSTOLIC_LOW_TOO_MANY = 214 # TD blood pressure systolic high + ALARM_ID_TD_BP_SYSTOLIC_HIGH = 215 # TD blood pressure systolic high + ALARM_ID_TD_BP_HEART_RATE_LOW = 216 # TD blood pressure heart rate low + ALARM_ID_TD_BP_HEART_RATE_HIGH = 217 # TD blood pressure heart rate high + ALARM_ID_TD_BP_MODULE_ERROR = 218 # TD blood pressure module error + ALARM_ID_FW_RESERVED_219 = 219 # FW reserved for use + ALARM_ID_DD_NVM_INVALID_SYSTEM_RECORD_CRC = 220 # DD invalid NVM System record + ALARM_ID_DD_NVM_INVALID_SERVICE_RECORD_CRC = 221 # DD invalid NVM Service record + ALARM_ID_DD_NVM_INVALID_CALIBRATION_RECORD_CRC = 222 # DD invalid NVM calibration record + ALARM_ID_DD_NVM_INVALID_INSTITUTIONAL_RECORD_CRC = 223 # DD invalid NVM institutional record + ALARM_ID_DD_NVM_INVALID_USAGE_RECORD_CRC = 224 # DD invalid NVM Usage Info record + ALARM_ID_DD_NVM_INVALID_SERIAL_NUMBER = 225 # DD invalid serial number + ALARM_ID_DD_NVM_INVALID_CAL_PRESSURE_SENSOR = 226 # DD invalid pressure sensor calibration record + ALARM_ID_DD_NVM_INVALID_CAL_TEMP_SENSOR = 227 # DD invalid temperature sensor calibration record + ALARM_ID_DD_NVM_INVALID_CAL_CONC_PUMP = 228 # DD invalid concentrate pump calibration record + ALARM_ID_DD_NVM_INVALID_CAL_D12_PUMP = 229 # DD invalid d12 dialysate pump calibration record + ALARM_ID_DD_NVM_INVALID_CAL_D48_PUMP = 230 # DD invalid d48 dialysate pump calibration record + ALARM_ID_DD_NVM_INVALID_CAL_ACID_CONCENTRATE = 231 # DD invalid acid concentrate calibration record + ALARM_ID_DD_NVM_INVALID_CAL_BICARB_CONCENTRATE = 232 # DD invalid bicarbonate concentrate calibration record + ALARM_ID_DD_NVM_INVALID_CAL_ACCEL_SENSOR = 233 # DD invalid accelerometer sensor calibration record + ALARM_ID_DD_NVM_INVALID_CAL_BLOOD_LEAK_SENSOR = 234 # DD invalid blood leak sensor calibration record + ALARM_ID_TD_RECIRC_TIMEOUT_WARNING = 235 # TD recirculate timeout warning + ALARM_ID_TD_RECIRC_TIMEOUT = 236 # TD recirculate timeout + ALARM_ID_FW_RESERVED_237 = 237 # FW reserved for use + ALARM_ID_FW_RESERVED_238 = 238 # FW reserved for use + ALARM_ID_FW_RESERVED_239 = 239 # FW reserved for use + ALARM_ID_FW_RESERVED_240 = 240 # FW reserved for use + ALARM_ID_FW_RESERVED_241 = 241 # FW reserved for use + ALARM_ID_FW_RESERVED_242 = 242 # FW reserved for use + ALARM_ID_FW_RESERVED_243 = 243 # FW reserved for use + ALARM_ID_FW_RESERVED_244 = 244 # FW reserved for use + ALARM_ID_FW_RESERVED_245 = 245 # FW reserved for use + ALARM_ID_FW_RESERVED_246 = 246 # FW reserved for use + ALARM_ID_FW_RESERVED_247 = 247 # FW reserved for use + ALARM_ID_FW_RESERVED_248 = 248 # FW reserved for use + ALARM_ID_FW_RESERVED_249 = 249 # FW reserved for use + ALARM_ID_FW_RESERVED_250 = 250 # FW reserved for use + ALARM_ID_FW_RESERVED_251 = 251 # FW reserved for use + ALARM_ID_FW_RESERVED_252 = 252 # FW reserved for use + ALARM_ID_FW_RESERVED_253 = 253 # FW reserved for use + ALARM_ID_FW_RESERVED_254 = 254 # FW reserved for use + ALARM_ID_FW_RESERVED_255 = 255 # FW reserved for use + ALARM_ID_FW_RESERVED_256 = 256 # FW reserved for use + ALARM_ID_FW_RESERVED_257 = 257 # FW reserved for use + ALARM_ID_FW_RESERVED_258 = 258 # FW reserved for use + ALARM_ID_FW_RESERVED_259 = 259 # FW reserved for use + ALARM_ID_FW_RESERVED_260 = 260 # FW reserved for use + ALARM_ID_FW_RESERVED_261 = 261 # FW reserved for use + ALARM_ID_FW_RESERVED_262 = 262 # FW reserved for use + ALARM_ID_FW_RESERVED_263 = 263 # FW reserved for use + ALARM_ID_FW_RESERVED_264 = 264 # FW reserved for use + ALARM_ID_FW_RESERVED_265 = 265 # FW reserved for use + ALARM_ID_FW_RESERVED_266 = 266 # FW reserved for use + ALARM_ID_FW_RESERVED_267 = 267 # FW reserved for use + ALARM_ID_FW_RESERVED_268 = 268 # FW reserved for use + ALARM_ID_FW_RESERVED_269 = 269 # FW reserved for use + ALARM_ID_FW_RESERVED_270 = 270 # FW reserved for use + ALARM_ID_FW_RESERVED_271 = 271 # FW reserved for use + ALARM_ID_FW_RESERVED_272 = 272 # FW reserved for use + ALARM_ID_FW_RESERVED_273 = 273 # FW reserved for use + ALARM_ID_FW_RESERVED_274 = 274 # FW reserved for use + ALARM_ID_FW_RESERVED_275 = 275 # FW reserved for use + ALARM_ID_FW_RESERVED_276 = 276 # FW reserved for use + ALARM_ID_FW_RESERVED_277 = 277 # FW reserved for use + ALARM_ID_FW_RESERVED_278 = 278 # FW reserved for use + ALARM_ID_FW_RESERVED_279 = 279 # FW reserved for use + ALARM_ID_FW_RESERVED_280 = 280 # FW reserved for use + ALARM_ID_FW_RESERVED_281 = 281 # FW reserved for use + ALARM_ID_FW_RESERVED_282 = 282 # FW reserved for use + ALARM_ID_FW_RESERVED_283 = 283 # FW reserved for use + ALARM_ID_FW_RESERVED_284 = 284 # FW reserved for use + ALARM_ID_FW_RESERVED_285 = 285 # FW reserved for use + ALARM_ID_FW_RESERVED_286 = 286 # FW reserved for use + ALARM_ID_FW_RESERVED_287 = 287 # FW reserved for use + ALARM_ID_FW_RESERVED_288 = 288 # FW reserved for use + ALARM_ID_FW_RESERVED_289 = 289 # FW reserved for use + ALARM_ID_FW_RESERVED_290 = 290 # FW reserved for use + ALARM_ID_FW_RESERVED_291 = 291 # FW reserved for use + ALARM_ID_FW_RESERVED_292 = 292 # FW reserved for use + ALARM_ID_FW_RESERVED_293 = 293 # FW reserved for use + ALARM_ID_FW_RESERVED_294 = 294 # FW reserved for use + ALARM_ID_FW_RESERVED_295 = 295 # FW reserved for use + ALARM_ID_FW_RESERVED_296 = 296 # FW reserved for use + ALARM_ID_FW_RESERVED_297 = 297 # FW reserved for use + ALARM_ID_FW_RESERVED_298 = 298 # FW reserved for use + ALARM_ID_FW_RESERVED_299 = 299 # FW reserved for use + ALARM_ID_FW_RESERVED_300 = 300 # FW reserved for use + NUM_OF_ALARM_IDS = 301 # Number of alarms Index: leahi_dialin/common/msg_defs.py =================================================================== diff -u -r3f4937e339925dde0b95f08e49969f8983c5cba4 -rf1cb03cd999ccce88151a2e6c29c19b00a6e8d54 --- leahi_dialin/common/msg_defs.py (.../msg_defs.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) +++ leahi_dialin/common/msg_defs.py (.../msg_defs.py) (revision f1cb03cd999ccce88151a2e6c29c19b00a6e8d54) @@ -7,10 +7,10 @@ # # @file msg_defs.py # -# @author (last) Dara Navaei -# @date (last) 08-May-2024 -# @author (original) Peter Lucia -# @date (original) 07-Aug-2020 +# @author (last) Enum Updater Script +# @date (last) 19-Aug-2026 +# @author (original) Zoltan Miskolci +# @date (original) 31-Jul-2026 # ############################################################################ from enum import unique @@ -22,52 +22,78 @@ @unique class RequestRejectReasons(DialinEnum): - REQUEST_REJECT_REASON_NONE = 0 - REQUEST_REJECT_REASON_NOT_ALLOWED_IN_CURRENT_MODE = 1 - REQUEST_REJECT_REASON_TIMEOUT_WAITING_FOR_USER_CONFIRM = 2 - REQUEST_REJECT_REASON_NOT_IN_TREATMENT_MODE = 3 - REQUEST_REJECT_REASON_INVALID_TREATMENT_STATE = 4 - REQUEST_REJECT_REASON_TREATMENT_TOO_CLOSE_TO_FINISHED = 5 - REQUEST_REJECT_REASON_TREATMENT_TIME_OUT_OF_RANGE = 6 - REQUEST_REJECT_REASON_TREATMENT_TIME_LESS_THAN_CURRENT = 7 - REQUEST_REJECT_REASON_BLOOD_FLOW_OUT_OF_RANGE = 8 - REQUEST_REJECT_REASON_DIAL_FLOW_OUT_OF_RANGE = 9 - REQUEST_REJECT_REASON_DIAL_VOLUME_OUT_OF_RANGE = 10 - REQUEST_REJECT_REASON_UF_VOLUME_OUT_OF_RANGE = 11 - REQUEST_REJECT_REASON_UF_RATE_OUT_OF_RANGE = 12 - REQUEST_REJECT_REASON_TREATMENT_TIME_LESS_THAN_MINIMUM = 13 - REQUEST_REJECT_REASON_UF_NOT_IN_PROGESS = 14 - REQUEST_REJECT_REASON_UF_NOT_PAUSED = 15 - REQUEST_REJECT_REASON_SALINE_BOLUS_IN_PROGRESS = 16 - REQUEST_REJECT_REASON_PARAM_OUT_OF_RANGE = 17 - REQUEST_REJECT_REASON_FILTER_FLUSH_HAS_BEEN_EXPIRED = 18 - REQUEST_REJECT_REASON_SALINE_MAX_VOLUME_REACHED = 19 - REQUEST_REJECT_REASON_SALINE_BOLUS_NOT_IN_PROGRESS = 20 - REQUEST_REJECT_REASON_ACTION_DISABLED_IN_CURRENT_STATE = 21 - REQUEST_REJECT_REASON_ALARM_IS_ACTIVE = 22 - REQUEST_REJECT_REASON_INVALID_COMMAND = 23 - REQUEST_REJECT_REASON_TREATMENT_IS_COMPLETED = 24 - REQUEST_REJECT_REASON_ADDL_RINSEBACK_MAX_VOLUME_REACHED = 25 - REQUEST_REJECT_REASON_DIALYZER_NOT_INVERTED = 26 - REQUEST_REJECT_REASON_NO_PATIENT_CONNECTION_CONFIRM = 27 - REQUEST_REJECT_REASON_DD_COMM_LOST = 28 - REQUEST_REJECT_REASON_DD_NOT_IN_STANDBY_IDLE_STATE = 29 - REQUEST_REJECT_REASON_INVALID_REQUEST_FORMAT = 30 - REQUEST_REJECT_REASON_INVALID_DATE_OR_TIME = 31 - REQUEST_REJECT_REASON_TREATMENT_IN_PROGRESS = 32 - REQUEST_REJECT_REASON_BATTERY_IS_NOT_CHARGED = 33 - REQUEST_REJECT_REASON_RINSEBACK_NOT_COMPLETED = 34 - REQUEST_REJECT_REASON_DOOR_NOT_CLOSED = 35 - REQUEST_REJECT_REASON_DD_DIALYSATE_CAP_OPEN = 36 - REQUEST_REJECT_REASON_DD_CONCENTRATE_CAP_OPEN = 37 - REQUEST_REJECT_REASON_DISINFECT_HAS_BEEN_EXPIRED = 38 - REQUEST_REJECT_REASON_DD_SERVICE_IS_DUE = 39 - REQUEST_REJECT_REASON_TD_SERVICE_IS_DUE = 40 - REQUEST_REJECT_REASON_RO_FILTER_TEMPERATURE_OUT_OF_RANGE = 41 - REQUEST_REJECT_REASON_DD_INCOMPATIBLE = 42 - REQUEST_REJECT_REASON_DIALYZER_REPRIME_IN_PROGRESS = 43 - REQUEST_REJECT_REASON_RO_ONLY_MODE_DD_BUSY = 44 - REQUEST_REJECT_REASON_RO_ONLY_MODE_INVALID_PARAMETER = 45 - REQUEST_REJECT_REASON_RO_ONLY_MODE_INVALID_PAYLOAD_LENGTH = 46 - REQUEST_REJECT_REASON_TREATMENT_CANNOT_BE_RESUMED = 47 -RequestRejectReasons._str_list = {} + REQUEST_REJECT_REASON_NONE = 0 # Used when there is no rejection + REQUEST_REJECT_REASON_NOT_ALLOWED_IN_CURRENT_MODE = 1 # Request is not allowed in the current operating mode + REQUEST_REJECT_REASON_TIMEOUT_WAITING_FOR_USER_CONFIRM = 2 # Validated request was not confirmed by user in reasonable time + REQUEST_REJECT_REASON_NOT_IN_TREATMENT_MODE = 3 # Request is not allowed if not in treatment mode + REQUEST_REJECT_REASON_INVALID_TREATMENT_STATE = 4 # Request is not allowed in current treatment state + REQUEST_REJECT_REASON_TREATMENT_TOO_CLOSE_TO_FINISHED = 5 # Request is not allowed so near end of treatment + REQUEST_REJECT_REASON_TREATMENT_TIME_OUT_OF_RANGE = 6 # Treatment duration is out of range + REQUEST_REJECT_REASON_TREATMENT_TIME_LESS_THAN_CURRENT = 7 # Treatment time change is less than currently elapsed treatment time + REQUEST_REJECT_REASON_BLOOD_FLOW_OUT_OF_RANGE = 8 # Blood flow is out of range + REQUEST_REJECT_REASON_DIAL_FLOW_OUT_OF_RANGE = 9 # Dialysate flow is out of range + REQUEST_REJECT_REASON_DIAL_VOLUME_OUT_OF_RANGE = 10 # Dialysate flow rate or treatment duration causes dialysate volume to exceed limit + REQUEST_REJECT_REASON_UF_VOLUME_OUT_OF_RANGE = 11 # Ultrafiltration volume is out of range + REQUEST_REJECT_REASON_UF_RATE_OUT_OF_RANGE = 12 # Ultrafiltration rate is out of range + REQUEST_REJECT_REASON_TREATMENT_TIME_LESS_THAN_MINIMUM = 13 # Treatment time change is less than minimum treatment time + REQUEST_REJECT_REASON_UF_NOT_IN_PROGESS = 14 # Ultrafiltration is not currently in progress + REQUEST_REJECT_REASON_UF_NOT_PAUSED = 15 # Ultrafiltration is not currently paused + REQUEST_REJECT_REASON_FLUID_BOLUS_IN_PROGRESS = 16 # A fluid bolus is in progress + REQUEST_REJECT_REASON_PARAM_OUT_OF_RANGE = 17 # A treatment parameter is out of range + REQUEST_REJECT_REASON_FILTER_FLUSH_HAS_BEEN_EXPIRED = 18 # Filter flush time has been expired + REQUEST_REJECT_REASON_SALINE_MAX_VOLUME_REACHED = 19 # Saline bolus volume maximum has been reached - no more saline allowed + REQUEST_REJECT_REASON_FLUID_BOLUS_NOT_IN_PROGRESS = 20 # A fluid bolus is not in progress + REQUEST_REJECT_REASON_ACTION_DISABLED_IN_CURRENT_STATE = 21 # Requested user action is disabled in current state + REQUEST_REJECT_REASON_ALARM_IS_ACTIVE = 22 # Requested user action not allowed while alarm is active + REQUEST_REJECT_REASON_INVALID_COMMAND = 23 # Requested user action invalid + REQUEST_REJECT_REASON_TREATMENT_IS_COMPLETED = 24 # The treatment has been completed + REQUEST_REJECT_REASON_ADDL_RINSEBACK_MAX_VOLUME_REACHED = 25 # Rinseback additional volume maximum has been reached - no more additional rinsebacks allowed + REQUEST_REJECT_REASON_DIALYZER_NOT_INVERTED = 26 # Dialyzer not inverted yet + REQUEST_REJECT_REASON_NO_PATIENT_CONNECTION_CONFIRM = 27 # The user has not confirmed patient connection + REQUEST_REJECT_REASON_DD_COMM_LOST = 28 # Treatment cannot initiate if DD comm is lost + REQUEST_REJECT_REASON_DD_NOT_IN_STANDBY_IDLE_STATE = 29 # Treatment cannot initiate if DD is not in standby idle state + REQUEST_REJECT_REASON_INVALID_REQUEST_FORMAT = 30 # Request message not formatted properly + REQUEST_REJECT_REASON_INVALID_DATE_OR_TIME = 31 # Given date/time is invalid + REQUEST_REJECT_REASON_TREATMENT_IN_PROGRESS = 32 # Treatment is in progress + REQUEST_REJECT_REASON_BATTERY_IS_NOT_CHARGED = 33 # Battery does not have enough charge to start treatment + REQUEST_REJECT_REASON_RINSEBACK_NOT_COMPLETED = 34 # Cannot move on to recirculate without completing full rinseback. + REQUEST_REJECT_REASON_DOOR_NOT_CLOSED = 35 # Door is not closed + REQUEST_REJECT_REASON_DD_DIALYSATE_CAP_OPEN = 36 # Dialysate cap open + REQUEST_REJECT_REASON_DD_CONCENTRATE_CAP_OPEN = 37 # Concentrate cap open + REQUEST_REJECT_REASON_DISINFECT_HAS_BEEN_EXPIRED = 38 # Disinfect has been expired + REQUEST_REJECT_REASON_DD_SERVICE_IS_DUE = 39 # DD service is due + REQUEST_REJECT_REASON_TD_SERVICE_IS_DUE = 40 # TD service is due + REQUEST_REJECT_REASON_RO_FILTER_TEMPERATURE_OUT_OF_RANGE = 41 # RO filter temperature out of range + REQUEST_REJECT_REASON_DD_INCOMPATIBLE = 42 # DD firmware version is not compatible with TD firmware + REQUEST_REJECT_REASON_DIALYZER_REPRIME_IN_PROGRESS = 43 # Fluid bolus is not allowed during dialyzer reprime + REQUEST_REJECT_REASON_RO_ONLY_MODE_DD_BUSY = 44 # RO only mode DD is busy + REQUEST_REJECT_REASON_RO_ONLY_MODE_INVALID_PARAMETER = 45 # RO only mode invalid parameter + REQUEST_REJECT_REASON_RO_ONLY_MODE_INVALID_PAYLOAD_LENGTH = 46 # RO only mode invalid payload length + REQUEST_REJECT_REASON_TREATMENT_CANNOT_BE_RESUMED = 47 # Cannot resume treatment per alarm + REQUEST_REJECT_REASON_HEPARIN_STOP_TIME_EXCEEDS_DURATION = 48 # The Heparin stop time setting is greater than the treatment duration + REQUEST_REJECT_REASON_HEPARIN_STOP_TIME_WITH_NO_DISPENSE = 49 # Heparin settings are zero but stop time setting is non-zero + REQUEST_REJECT_REASON_HEPARIN_PAUSE_INVALID_IN_THIS_STATE = 50 # Heparin cannot be paused if not currently deliverying Heparin + REQUEST_REJECT_REASON_HEPARIN_NOT_PAUSED = 51 # Heparin cannot be resumed if not paused + REQUEST_REJECT_REASON_HEPARIN_VOLUME_EXCEEDS_10_ML = 52 # Heparin volume needed for treatment exceeds 10 mL maximum. + REQUEST_REJECT_REASON_PARAM_NOT_APPLICABLE = 53 # Treatment parameter not applicable for current treatment modality type + REQUEST_REJECT_REASON_ACID_CONV_FACTOR_MISMATCH = 54 # Acid conversion factor from UI mismatch with FW + REQUEST_REJECT_REASON_INVALID_PATIENT_WEIGHTS = 55 # Patient pre and estimated target weights are invalid + REQUEST_REJECT_REASON_UF_VOL_AND_WEIGHTS_INCONSISTENT = 56 # UF volume and the patient weights are not consistent + REQUEST_REJECT_REASON_TD_AUTHENTICATION_INVALID = 57 # TD authentication invalid + REQUEST_REJECT_REASON_CONFIRMATION_NOT_EXPECTED = 58 # Confirmation received without prior validation + REQUEST_REJECT_REASON_CONFIRMATION_MISMATCH = 59 # Confirmed value does not match validated value + REQUEST_REJECT_REASON_INVALID_TREATMENT_SUB_STATE = 60 # Request is not allowed in current treatment sub-state + REQUEST_REJECT_REASON_MODALITY_MISMATCH = 61 # Mismatched modality (Rx entered vs reatment initiation modality ) + REQUEST_REJECT_REASON_NVM_JOB_QUEUE_BUSY = 62 # NVM Job queue is busy sending other records. + REQUEST_REJECT_REASON_NVM_INVALID_CRC = 63 # NVM received CRC of the record is invalid + REQUEST_REJECT_REASON_NVM_INVALID_OPERATION_MODE = 64 # NVM Operation Mode is not Service mode. + REQUEST_REJECT_REASON_FP_BUSY = 65 # Treatment cannot initiate if FP is busy + REQUEST_REJECT_REASON_FP_SERVICE_IS_DUE = 66 # FP service is due + REQUEST_REJECT_REASON_DD_TEMPERATURE_OUT_OF_RANGE = 67 # DD temperature too high + REQUEST_REJECT_REASON_DD_BUSY = 68 # Treatment cannot initiate if DD is busy + REQUEST_REJECT_REASON_REQUEST_ALREADY_PENDING = 69 # Reject if a treatment start request is already pending. + NUM_OF_REQUEST_REJECT_REASONS = 70 # Number of settings change reject codes + +RequestRejectReasons._str_list = { } + +ACK_NOT_REQUIRED = [ ] Index: leahi_dialin/common/msg_ids.py =================================================================== diff -u -re1ae66e77d235a2726783b4e9560320da4c1a172 -rf1cb03cd999ccce88151a2e6c29c19b00a6e8d54 --- leahi_dialin/common/msg_ids.py (.../msg_ids.py) (revision e1ae66e77d235a2726783b4e9560320da4c1a172) +++ leahi_dialin/common/msg_ids.py (.../msg_ids.py) (revision f1cb03cd999ccce88151a2e6c29c19b00a6e8d54) @@ -7,10 +7,10 @@ # # @file msg_ids.py # -# @author (last) Dara Navaei -# @date (last) 10-May-2024 -# @author (original) Peter Lucia -# @date (original) 06-Apr-2021 +# @author (last) Enum Updater Script +# @date (last) 11-Aug-2026 +# @author (original) Zoltan Miskolci +# @date (original) 31-Jul-2026 # ############################################################################ from enum import unique @@ -20,354 +20,395 @@ # Branch: staging @unique class MsgIds(DialinEnum): - MSG_ID_UNUSED = 0x0 - MSG_ID_ALARM_STATUS_DATA = 0x1 - MSG_ID_ALARM_TRIGGERED = 0x2 - MSG_ID_ALARM_CLEARED = 0x3 - MSG_ID_ALARM_CONDITION_CLEARED = 0x4 - MSG_ID_USER_ALARM_SILENCE_REQUEST = 0x5 - MSG_ID_UI_ALARM_USER_ACTION_REQUEST = 0x6 - MSG_ID_TD_ALARM_INFORMATION_DATA = 0x7 - MSG_ID_DD_ALARM_INFO_DATA = 0x8 - MSG_ID_UI_ACTIVE_ALARMS_LIST_REQUEST = 0x9 - MSG_ID_TD_ACTIVE_ALARMS_LIST_REQUEST_RESPONSE = 0xA - MSG_ID_UI_SET_ALARM_AUDIO_VOLUME_LEVEL_CMD_REQUEST = 0xB - MSG_ID_TD_ALARM_AUDIO_VOLUME_SET_RESPONSE = 0xC - MSG_ID_FW_VERSIONS_REQUEST = 0xD - MSG_ID_TD_VERSION_RESPONSE = 0xE - MSG_ID_DD_VERSION_RESPONSE = 0xF - MSG_ID_UI_CHECK_IN = 0x10 - MSG_ID_TD_BLOOD_PUMP_DATA = 0x11 - MSG_ID_TD_OP_MODE_DATA = 0x12 - MSG_ID_DD_OP_MODE_DATA = 0x13 - MSG_ID_DD_COMMAND_RESPONSE = 0x14 - MSG_ID_TD_UI_VERSION_INFO_REQUEST = 0x15 - MSG_ID_UI_VERSION_INFO_RESPONSE = 0x16 - MSG_ID_TD_EVENT = 0x17 - MSG_ID_DD_EVENT = 0x18 - MSG_ID_TD_DD_ALARMS_REQUEST = 0x19 - MSG_ID_UI_TD_RESET_IN_SERVICE_MODE_REQUEST = 0x1A - MSG_ID_DD_VALVES_STATES_DATA = 0x1B - MSG_ID_DD_PRESSURES_DATA = 0x1C - MSG_ID_TD_VOLTAGES_DATA = 0x1D - MSG_ID_TD_BUBBLES_DATA = 0x1E - MSG_ID_DD_CONDUCTIVITY_DATA = 0x1F - MSG_ID_TD_AIR_PUMP_DATA = 0x20 - MSG_ID_TD_SWITCHES_DATA = 0x21 - MSG_ID_POWER_OFF_WARNING = 0x22 - MSG_ID_OFF_BUTTON_PRESS_REQUEST = 0x23 - MSG_ID_TD_PRESSURE_DATA = 0x24 - MSG_ID_DD_CONCENTRATE_PUMP_DATA = 0x25 - MSG_ID_DD_TEMPERATURE_DATA = 0x26 - MSG_ID_DIALYSATE_PUMPS_DATA = 0x27 - MSG_ID_DD_HEATERS_DATA = 0x28 - MSG_ID_DD_LEVEL_DATA = 0x29 - MSG_ID_TD_AIR_TRAP_DATA = 0x2A - MSG_ID_TD_VALVES_DATA = 0x2B - MSG_ID_FP_EVENT = 0x2C - MSG_ID_FP_ALARM_INFO_DATA= 0x2D - MSG_ID_DD_BAL_CHAMBER_DATA = 0x2E - MSG_ID_DD_GEN_DIALYSATE_MODE_DATA = 0x2F - MSG_ID_DD_GEN_DIALYSATE_REQUEST_DATA = 0x30 - MSG_ID_FP_VALVES_STATES_DATA = 0x31 - MSG_ID_FP_RO_PUMP_DATA = 0x32 - MSG_ID_FP_OP_MODE_DATA = 0x33 - MSG_ID_FP_PRESSURES_DATA = 0x34 - MSG_ID_FP_LEVEL_DATA = 0x35 - MSG_ID_FP_FLOW_DATA = 0x36 - MSG_ID_FP_CONDUCTIVITY_DATA = 0x37 - MSG_ID_DD_FP_START_STOP_CMD_REQUEST = 0x38 - MSG_ID_FP_TEMPERATURE_DATA = 0x39 - MSG_ID_FP_HEATER_DATA = 0x3A - MSG_ID_TD_TREATMENT_TIME_DATA = 0x3B - MSG_ID_TD_TREATMENT_STATE_DATA = 0x3C - MSG_ID_TD_SALINE_BOLUS_DATA = 0x3D - MSG_ID_TD_ULTRAFILTRATION_DATA = 0x3E - MSG_ID_UI_TREATMENT_PARAMS_TO_VALIDATE = 0x3F - MSG_ID_TD_RESP_TREATMENT_PARAMS_TO_VALIDATE = 0x40 - MSG_ID_UI_ULTRAFILTRATION_VOLUME_TO_VALIDATE = 0x41 - MSG_ID_TD_RESP_ULTRAFILTRATION_VOLUME_TO_VALIDATE = 0x42 - MSG_ID_TD_TREATMENT_PARAM_RANGES = 0x43 - MSG_ID_UI_TREATMENT_PARAMS_CONFIRMED = 0x44 - MSG_ID_UI_INITIATE_TREATMENT_WORKFLOW = 0x45 - MSG_ID_TD_RESP_INITIATE_TREATMENT_WORKFLOW = 0x46 - MSG_ID_UI_UF_PAUSE_RESUME_REQUEST = 0x47 - MSG_ID_TD_UF_PAUSE_RESUME_RESPONSE = 0x48 - MSG_ID_FP_GEN_PERMEATE_MODE_DATA = 0x49 - MSG_ID_DD_PRE_GEN_DIALYSATE_STATE_DATA = 0x4A - MSG_ID_DD_POST_GEN_DIALYSATE_STATE_DATA = 0x4B - MSG_ID_DD_PRE_GEN_DIALYSATE_REQUEST_DATA = 0x4C - MSG_ID_FP_PRE_GEN_WATER_MODE_DATA = 0x4D - MSG_ID_TD_EJECTOR_DATA = 0x4E - MSG_ID_TD_TREATMENT_SET_POINTS = 0x4F - MSG_ID_FP_BOOST_PUMP_DATA = 0x50 - MSG_ID_TD_SERIAL_RESPONSE = 0x51 - MSG_ID_DD_SERIAL_RESPONSE = 0x52 - MSG_ID_TD_TEMPERATURE_DATA = 0x53 - MSG_ID_TD_BATTERY_DATA = 0x54 - MSG_ID_UI_ADJUST_PATIENT_DISCONNECT_CONFIRM_REQUEST = 0x55 - MSG_ID_TD_ADJUST_PATIENT_DISCONNECT_CONFIRM_RESPONSE = 0x56 - MSG_ID_FP_CONCENTRATE_FLUSH_DATA = 0x57 - MSG_ID_FP_GENP_DEF_DATA = 0x58 - MSG_ID_FP_PRE_GEN_DEF_DATA = 0x59 - MSG_ID_FP_VERSION_RESPONSE = 0x5A - MSG_ID_TD_TREATMENT_PAUSED_TIMER_DATA = 0x5B - MSG_ID_DD_UF_DATA = 0x5C - MSG_ID_FP_PERMEATE_TANK_DATA = 0x5D - MSG_ID_DD_SPENT_CHAMBER_FILL_DATA = 0x5E - MSG_ID_UI_SOLUTION_INFUSION_REQUEST = 0x5F - MSG_ID_TD_SOLUTION_INFUSION_RESPONSE = 0x60 - MSG_ID_DD_BLOOD_LEAK_DATA = 0x61 - MSG_ID_DD_FP_INLET_PRESSURE_CHECK_DATA = 0x62 - MSG_ID_UI_BLOOD_PRESSURE_REQUEST = 0x63 - MSG_ID_TD_BLOOD_PRESSURE_RESPONSE = 0x64 - MSG_ID_TD_BLOOD_PRESSURE_DATA = 0x65 - MSG_ID_USER_CONFIRM_UF_SETTINGS_CHANGE_REQUEST = 0x66 - MSG_ID_USER_UF_SETTINGS_CHANGE_CONFIRMATION_RESPONSE = 0x67 - MSG_ID_DD_VOLTAGES_DATA = 0x68 - MSG_ID_DD_RINSE_PUMP_DATA = 0x69 - MSG_ID_TD_TREATMENT_LOG_ALARM_EVENT = 0x6A - MSG_ID_TD_TREATMENT_LOG_EVENT = 0x6B - MSG_ID_TD_DATE_AND_TIME_REQUEST = 0x6C - MSG_ID_TD_DATE_AND_TIME_RESPONSE = 0x6D - MSG_ID_DD_DATE_AND_TIME_REQUEST = 0x6E - MSG_ID_DD_DATE_AND_TIME_RESPONSE = 0x6F - MSG_ID_DD_DRY_BICART_DATA = 0x70 - MSG_ID_FP_RO_REJECTION_RATIO_DATA = 0x71 - MSG_ID_UI_PRESSURE_LIMITS_CHANGE_REQUEST = 0x72 - MSG_ID_TD_PRESSURE_LIMITS_CHANGE_RESPONSE = 0x73 - MSG_ID_UI_BOLUS_VOLUME_CHANGE_REQUEST = 0x74 - MSG_ID_TD_BOLUS_VOLUME_CHANGE_RESPONSE = 0x75 - MSG_ID_UI_DURATION_VALIDATE_REQUEST = 0x76 - MSG_ID_TD_DURATION_VALIDATE_RESPONSE = 0x77 - MSG_ID_UI_DURATION_CONFIRM_REQUEST = 0x78 - MSG_ID_TD_DURATION_CONFIRM_RESPONSE = 0x79 - MSG_ID_UI_TREATMENT_SET_POINTS_CHANGE_REQUEST = 0x7A - MSG_ID_TD_TREATMENT_SET_POINTS_CHANGE_RESPONSE = 0x7B - MSG_ID_UI_TREATMENT_SET_POINT_BLOOD_FLOW_CHANGE_REQUEST = 0x7C - MSG_ID_TD_TREATMENT_SET_POINT_BLOOD_FLOW_CHANGE_RESPONSE = 0x7D - MSG_ID_UI_TREATMENT_SET_POINT_DIALYSATE_FLOW_CHANGE_REQUEST = 0x7E - MSG_ID_TD_TREATMENT_SET_POINT_DIALYSATE_FLOW_CHANGE_RESPONSE = 0x7F - MSG_ID_UI_TREATMENT_SET_POINT_DIALYSATE_TEMPERATURE_CHANGE_REQUEST = 0x80 - MSG_ID_TD_TREATMENT_SET_POINT_DIALYSATE_TEMPERATURE_CHANGE_RESPONSE = 0x81 - MSG_ID_TD_INSTITUTIONAL_RECORD_REQUEST = 0x82 - MSG_ID_TD_INSTITUTIONAL_RECORD_RESPONSE = 0x83 - MSG_ID_TD_ADJUST_INSTITUTIONAL_RECORD_REQUEST = 0x84 - MSG_ID_TD_ADJUST_INSTITUTIONAL_RECORD_RESPONSE = 0x85 - MSG_ID_TD_ADVANCED_INSTITUTIONAL_RECORD_REQUEST = 0x86 - MSG_ID_TD_ADVANCED_INSTITUTIONAL_RECORD_RESPONSE = 0x87 - MSG_ID_TD_ADVANCED_ADJUST_INSTITUTIONAL_RECORD_REQUEST = 0x88 - MSG_ID_TD_ADVANCED_ADJUST_INSTITUTIONAL_RECORD_RESPONSE = 0x89 - MSG_ID_TD_HEPARIN_REQUEST = 0x8A - MSG_ID_TD_HEPARIN_RESPONSE = 0x8B - MSG_ID_TD_HEPARIN_DATA = 0x8C - MSG_ID_TD_END_TREATMENT_REQUEST = 0x8D - MSG_ID_TD_END_TREATMENT_RESPONSE = 0x8E - MSG_ID_TD_RINSEBACK_PROGRESS = 0x8F - MSG_ID_UI_RINSEBACK_CMD_REQUEST = 0x90 - MSG_ID_TD_RINSEBACK_CMD_RESPONSE = 0x91 - MSG_ID_UI_ADJUST_DISPOSABLES_CONFIRM_REQUEST = 0x92 - MSG_ID_TD_ADJUST_DISPOSABLES_CONFIRM_RESPONSE = 0x93 - MSG_ID_UI_ADJUST_DISPOSABLES_REMOVAL_CONFIRM_REQUEST = 0x94 - MSG_ID_TD_ADJUST_DISPOSABLES_REMOVAL_CONFIRM_RESPONSE = 0x95 - TBD_96 = 0x96 - MSG_ID_TD_BLOOD_PRIME_PROGRESS_DATA = 0x97 - MSG_ID_UI_BLOOD_PRIME_CMD_REQUEST = 0x98 - MSG_ID_TD_BLOOD_PRIME_CMD_RESPONSE = 0x99 - MSG_ID_TD_ISOLATED_UF_DATA = 0x9A - MSG_ID_UI_ISOLATED_UF_DURATION_CHANGE_REQUEST = 0x9B - MSG_ID_TD_ISOLATED_UF_DURATION_CHANGE_RESPONSE = 0x9C - MSG_ID_UI_ISOLATED_UF_VOLUME_GOAL_CHANGE_REQUEST = 0x9D - MSG_ID_TD_ISOLATED_UF_VOLUME_GOAL_CHANGE_RESPONSE = 0x9E - MSG_ID_UI_ISOLATED_UF_CONFIRM_REQUEST = 0x9F - MSG_ID_TD_ISOLATED_UF_CONFIRM_RESPONSE = 0xA0 - MSG_ID_UI_ADJUST_START_TREATMENT_REQUEST = 0xA1 - MSG_ID_TD_ADJUST_START_TREATMENT_RESPONSE = 0xA2 - MSG_ID_UI_WATER_SAMPLE_RESULT_REQUEST = 0XA3 - MSG_ID_UI_PRESSURE_LIMIT_WIDEN_REQUEST = 0xA4 - MSG_ID_TD_PRESSURE_LIMIT_WIDEN_RESPONSE = 0xA5 - MSG_ID_UI_RECIRCULATE_REQUEST = 0xA6 - MSG_ID_TD_RECIRCULATE_RESPONSE = 0xA7 - MSG_ID_TD_RECIRCULATE_DATA = 0xA8 - MSG_ID_UI_ADJUST_TREATMENT_LOGS_REQUEST = 0xA9 - MSG_ID_TD_ADJUST_TREATMENT_LOGS_RESPONSE = 0xAA - MSG_ID_TD_WATER_SAMPLE_RESULT_RESPONSE = 0xAB - MSG_ID_TD_WATER_SAMPLE_DATA = 0xAC - MSG_ID_TD_TREATMENT_LOG_AVERAGE_DATA = 0xAD - MSG_ID_TD_DRY_SELF_TEST_PROGRESS_DATA = 0xAE - MSG_ID_TD_TUBE_SET_AUTHENTICATION_REQUEST = 0xAF - MSG_ID_UI_TUBE_SET_AUTHENTICATION_ACK_RESPONSE = 0xB0 - MSG_ID_TD_SYRINGE_PUMP_DATA = 0xB1 - MSG_ID_TD_HEPARIN_PAUSE_RESUME_RESPONSE= 0xB2 - MSG_ID_FFU_SIGNAL_TD_UPDATE_AVAILABLE = 0xB3 - MSG_ID_FFU_SIGNAL_DD_UPDATE_AVAILABLE = 0xB4 - MSG_ID_TD_UI_CONFIRMATION_REQUEST = 0xB5 - MSG_ID_UI_CONFIRMATION_RESULT_RESPONSE = 0xB6 - MSG_ID_TD_PRE_TREATMENT_STATE_DATA = 0xB7 - MSG_ID_UI_VITALS_ADJUSTMENT_REQUEST = 0xB8 - MSG_ID_TD_VITALS_ADJUSTMENT_RESPONSE = 0xB9 - MSG_ID_UI_ISO_UF_STATE_REQUEST = 0xBA - MSG_ID_TD_ISO_UF_STATE_RESPONSE = 0xBB - MSG_ID_TD_HEMODIAFILTRATION_DATA = 0xBC - MSG_ID_UI_PAUSE_SUB_FLOW_REQUEST = 0xBD - MSG_ID_TD_PAUSE_SUB_FLOW_RESPONSE = 0xBE - MSG_ID_UI_AUTO_SUBSTITUTION_REQUEST = 0xBF - MSG_ID_TD_AUTO_SUBSTITUTION_REPONSE = 0xC0 - MSG_ID_UI_HDF_ADJUSTMENT_REQUEST = 0xC1 - MSG_ID_TD_HDF_ADJUSTMENT_RESPONSE = 0xC2 - MSG_ID_DD_NVM_CAL_PRESSURE_SENSOR_RESPONSE = 0xC3 - MSG_ID_TD_DRY_BICARD_DISCONNECT_DATA = 0xC4 - MSG_ID_UI_DRY_BICARD_DISCONNECT_REQUEST = 0xC5 - MSG_ID_TD_DRY_BICARD_DISCONNECT_RESPONSE = 0xC6 - MSG_ID_TD_PRIME_PROGRESS_DATA = 0xC7 - MSG_ID_UI_DD_NVM_SET_CAL_CONC_PUMP_REQUEST = 0xC8 - MSG_ID_DD_NVM_CAL_D12_PUMP_RESPONSE = 0xC9 - MSG_ID_UI_DD_NVM_SET_CAL_D12_PUMP_REQUEST = 0xCA - MSG_ID_DD_NVM_CAL_D48_PUMP_RESPONSE = 0xCB - MSG_ID_UI_DD_NVM_SET_CAL_D48_PUMP_REQUEST = 0xCC - MSG_ID_DD_NVM_CAL_ACID_CONCENTRATE_RESPONSE = 0xCD - MSG_ID_UI_DD_NVM_SET_CAL_ACID_CONCENTRATE_REQUEST = 0xCE - MSG_ID_DD_NVM_CAL_BICARB_CONCENTRATE_RESPONSE = 0xCF - MSG_ID_UI_DD_NVM_SET_CAL_BICARB_CONCENTRATE_REQUEST = 0xD0 - MSG_ID_DD_NVM_CAL_ACCEL_SENSOR_RESPONSE = 0xD1 - MSG_ID_UI_DD_NVM_SET_CAL_ACCEL_SENSOR_REQUEST = 0xD2 - MSG_ID_DD_NVM_CAL_BLOOD_LEAK_SENSOR_RESPONSE = 0xD3 - MSG_ID_UI_DD_NVM_SET_CAL_BLOOD_LEAK_SENSOR_REQUEST = 0xD4 - MSG_ID_DD_NVM_RECORD_CRC_OVERRIDE_REQUEST = 0xD5 - MSG_ID_UI_SETUP_CONNECTION_CONFIRM_REQUEST = 0xD6 - MSG_ID_TD_SETUP_CONNECTION_CONFIRM_RESPONSE = 0xD7 - MSG_ID_TD_POST_FINAL_TEST_RESULT = 0xD8 - MSG_ID_TD_POST_SINGLE_TEST_RESULT = 0xD9 - MSG_ID_TD_UI_CANCEL_REQUEST = 0xDA - MSG_ID_DD_SUBSTITUTION_PUMP_DATA = 0xDB - MSG_ID_DD_CONDUCTIVITY_SENSOR_RESISTANCE_DATA = 0xDC - MSG_ID_FP_FILTER_FLUSH_DATA = 0xDD - MSG_ID_FP_PERMEATE_FLUSH_DATA = 0xDE - MSG_ID_DD_NVM_GET_RECORD_RESPONSE = 0xDF - MSG_ID_DD_NVM_SET_SYSTEM_RECORD_RESPONSE = 0xE0 - MSG_ID_DD_NVM_SET_SERVICE_RECORD_RESPONSE = 0xE1 - MSG_ID_DD_NVM_SET_INSTITUTIONAL_RECORD_RESPONSE = 0xE2 - MSG_ID_DD_NVM_SET_USAGE_INFO_RECORD_RESPONSE = 0xE3 - MSG_ID_DD_NVM_SET_CAL_PRESSURE_SENSOR_RESPONSE = 0xE4 - MSG_ID_DD_NVM_SET_CAL_TEMP_SENSOR_RESPONSE = 0xE5 - MSG_ID_DD_NVM_SET_CAL_CONC_PUMP_RESPONSE = 0xE6 - MSG_ID_DD_NVM_SET_CAL_D12_PUMP_RESPONSE = 0xE7 - MSG_ID_DD_NVM_SET_CAL_D48_PUMP_RESPONSE = 0xE8 - MSG_ID_DD_NVM_SET_CAL_ACID_CONCENTRATE_RESPONSE = 0xE9 - MSG_ID_DD_NVM_SET_CAL_BICARB_CONCENTRATE_RESPONSE = 0xEA - MSG_ID_UI_RO_WATER_MODE_REQUEST = 0xEB - MSG_ID_DD_RO_WATER_MODE_RESPONSE = 0xEC - MSG_ID_UI_ADJUST_RO_WATER_MODE_REQUEST = 0xED - MSG_ID_DD_ADJUST_RO_WATER_MODE_RESPONSE = 0xEE - TBD_EF = 0xEF - MSG_ID_DD_PISTON_PUMP_CONTROL_DATA = 0xF0 + MSG_ID_UNUSED = 0x0 # Zero is an undefined (un-used) message ID) + MSG_ID_ALARM_STATUS_DATA = 0x1 # HD broadcast of system alarm state information + MSG_ID_ALARM_TRIGGERED = 0x2 # Alarm triggered event + MSG_ID_ALARM_CLEARED = 0x3 # Alarm cleared event + MSG_ID_ALARM_CONDITION_CLEARED = 0x4 # Alarm condition cleared event + MSG_ID_USER_ALARM_SILENCE_REQUEST = 0x5 # UI request alarm silence (or cancel) + MSG_ID_UI_ALARM_USER_ACTION_REQUEST = 0x6 # UI user has requested an alarm action + MSG_ID_TD_ALARM_INFORMATION_DATA = 0x7 # TD alarm information broadcast message + MSG_ID_DD_ALARM_INFO_DATA = 0x8 # DD alarm information data publish + MSG_ID_UI_ACTIVE_ALARMS_LIST_REQUEST = 0x9 # UI active alarms list request + MSG_ID_TD_ACTIVE_ALARMS_LIST_REQUEST_RESPONSE = 0xA # TD active alarms list request response + MSG_ID_UI_SET_ALARM_AUDIO_VOLUME_LEVEL_CMD_REQUEST = 0xB # UI command to set alarm audio volume level + MSG_ID_TD_ALARM_AUDIO_VOLUME_SET_RESPONSE = 0xC # TD response to UI set alarm audio volume request + MSG_ID_FW_VERSIONS_REQUEST = 0xD # UI request for f/w versions + MSG_ID_TD_VERSION_RESPONSE = 0xE # TD f/w version response + MSG_ID_DD_VERSION_RESPONSE = 0xF # DD f/w version response + MSG_ID_UI_CHECK_IN = 0x10 # UI check-in with TD + MSG_ID_TD_BLOOD_PUMP_DATA = 0x11 # TD broadcast blood pump data + MSG_ID_TD_OP_MODE_DATA = 0x12 # TD broadcast current operating mode + MSG_ID_DD_OP_MODE_DATA = 0x13 # DD broadcast current operating mode + MSG_ID_DD_COMMAND_RESPONSE = 0x14 # DD response to command from TD + MSG_ID_TD_UI_VERSION_INFO_REQUEST = 0x15 # TD request for UI version information + MSG_ID_UI_VERSION_INFO_RESPONSE = 0x16 # UI response to TD request for version information + MSG_ID_TD_EVENT = 0x17 # TD general event + MSG_ID_DD_EVENT = 0x18 # DD general event + MSG_ID_TD_DD_ALARMS_REQUEST = 0x19 # TD request for DD to re-send trigger messages for each active alarm + MSG_ID_UI_TD_RESET_IN_SERVICE_MODE_REQUEST = 0x1A # UI TD reset in service mode request + MSG_ID_DD_VALVES_STATES_DATA = 0x1B # DD broadcast valve states + MSG_ID_DD_PRESSURES_DATA = 0x1C # DD pressure sensor readings + MSG_ID_TD_VOLTAGES_DATA = 0x1D # TD broadcast voltages data + MSG_ID_TD_BUBBLES_DATA = 0x1E # TD broadcast bubbles data + MSG_ID_DD_CONDUCTIVITY_DATA = 0x1F # DD conductivity sensor readings + MSG_ID_TD_AIR_PUMP_DATA = 0x20 # TD broadcast air pump data + MSG_ID_TD_SWITCHES_DATA = 0x21 # TD broadcast switches data + MSG_ID_POWER_OFF_WARNING = 0x22 # TD broadcast for a power off warning + MSG_ID_OFF_BUTTON_PRESS_REQUEST = 0x23 # TD off button request message to UI for user confirmation + MSG_ID_TD_PRESSURE_DATA = 0x24 # TD broadcast pressure data + MSG_ID_DD_CONCENTRATE_PUMP_DATA = 0x25 # DD concentrate pump data + MSG_ID_DD_TEMPERATURE_DATA = 0x26 # DD temperature data + MSG_ID_DIALYSATE_PUMPS_DATA = 0x27 # DD dialysate pumps data + MSG_ID_DD_HEATERS_DATA = 0x28 # DD heaters data + MSG_ID_DD_LEVEL_DATA = 0x29 # DD level data + MSG_ID_TD_AIR_TRAP_DATA = 0x2A # TD broadcast air trap data + MSG_ID_TD_VALVES_DATA = 0x2B # TD broadcast valves data + MSG_ID_FP_EVENT = 0x2C # FP general event + MSG_ID_FP_ALARM_INFO_DATA = 0x2D # FP alarm info data + MSG_ID_DD_BAL_CHAMBER_DATA = 0x2E # DD balancing chamber data + MSG_ID_DD_GEN_DIALYSATE_MODE_DATA = 0x2F # DD Generate dialysate mode data + MSG_ID_DD_GEN_DIALYSATE_REQUEST_DATA = 0x30 # DD Generate dialysate request data coming from TD with additional parameters + MSG_ID_FP_VALVES_STATES_DATA = 0x31 # FP valves data + MSG_ID_FP_RO_PUMP_DATA = 0x32 # FP broadcast P12 pump data + MSG_ID_FP_OP_MODE_DATA = 0x33 # FP broadcast operation mode data + MSG_ID_FP_PRESSURES_DATA = 0x34 # FP broadcast pressures data + MSG_ID_FP_LEVEL_DATA = 0x35 # FP broadcast level data + MSG_ID_FP_FLOW_DATA = 0x36 # FP broadcast flow data + MSG_ID_FP_CONDUCTIVITY_DATA = 0x37 # FP broadcast conductivity data + MSG_ID_AVAILABLE_6 = 0x38 # DD requests FP to start/stop delivering the purified water + MSG_ID_FP_TEMPERATURE_DATA = 0x39 # FP temperatures data broadcast + MSG_ID_FP_HEATER_DATA = 0x3A # FP heater data broadcast + MSG_ID_TD_TREATMENT_TIME_DATA = 0x3B # TD treatment time data broadcast + MSG_ID_TD_TREATMENT_STATE_DATA = 0x3C # TD treatment state data broadcast + MSG_ID_TD_FLUID_BOLUS_DATA = 0x3D # TD fluid bolus status data broadcast + MSG_ID_TD_ULTRAFILTRATION_DATA = 0x3E # TD ultrafiltration status data broadcast + MSG_ID_UI_TREATMENT_PARAMS_TO_VALIDATE = 0x3F # UI treatment parameters to be validated by TD + MSG_ID_TD_RESP_TREATMENT_PARAMS_TO_VALIDATE = 0x40 # TD response to treatment parameter validation request + MSG_ID_UI_TREATMENT_UF_VOLUME_VALIDATE_REQUEST = 0x41 # UI ultrafiltration volume parameter to be validated by TD + MSG_ID_TD_TREATMENT_UF_VOLUME_VALIDATE_RESPONSE = 0x42 # TD response to ultrafiltration volume validation request + MSG_ID_TD_TREATMENT_PARAM_RANGES = 0x43 # TD treatment parameter ranges for UI + MSG_ID_TD_VALIDATED_TREATMENT_PARAMS = 0x44 # Treatment parameters validated and confirmed from TD + MSG_ID_UI_INITIATE_TREATMENT_WORKFLOW = 0x45 # UI initiate/cancel treatment workflow request + MSG_ID_TD_RESP_INITIATE_TREATMENT_WORKFLOW = 0x46 # TD response to initiate/cancel treatment workflow request + MSG_ID_UI_UF_PAUSE_RESUME_REQUEST = 0x47 # UI ultrafiltration pause/resume request + MSG_ID_TD_UF_PAUSE_RESUME_RESPONSE = 0x48 # TD response to ultrafiltration pause/resume request + MSG_ID_FP_GEN_WATER_MODE_DATA = 0x49 # FP Gen Permeate data broadcast + MSG_ID_DD_PRE_GEN_DIALYSATE_STATE_DATA = 0x4A # DD Pre-gen dialysate mode data + MSG_ID_DD_POST_GEN_DIALYSATE_STATE_DATA = 0x4B # DD Post-gen dialysate mode data + MSG_ID_DD_PRE_GEN_DIALYSATE_REQUEST_DATA = 0x4C # DD Pre Generate dialysate request data coming from TD. + MSG_ID_FP_PRE_GEN_WATER_MODE_DATA = 0x4D # FP Pre Generate water mode data. + MSG_ID_TD_EJECTOR_DATA = 0x4E # TD ejector data broadcast + MSG_ID_TD_TREATMENT_SET_POINTS = 0x4F # TD treatment user set points. + MSG_ID_FP_BOOST_PUMP_DATA = 0x50 # FP broadcast P40 pump data + MSG_ID_TD_SERIAL_RESPONSE = 0x51 # TD response to UI serial request + MSG_ID_DD_SERIAL_RESPONSE = 0x52 # DD response to UI serial request + MSG_ID_TD_TEMPERATURE_DATA = 0x53 # TD Temperature broadcast data + MSG_ID_TD_BATTERY_DATA = 0x54 # TD Battery broadcast data + MSG_ID_UI_PATIENT_DISCONNECT_CONFIRM_REQUEST = 0x55 # UI requests patient disconnect confirmation. + MSG_ID_TD_PATIENT_DISCONNECT_CONFIRM_RESPONSE = 0x56 # TD response to patient disconnect confirmation request. + MSG_ID_FP_CONCENTRATE_FLUSH_DATA = 0x57 # FP Concentrate Flush broadcast data + MSG_ID_FP_GENP_DEF_DATA = 0x58 # FP Generate Permeate Defeatured broadcast data + MSG_ID_FP_PRE_GEN_DEF_DATA = 0x59 # FP Pre Generate Permeate Defeatured broadcast data + MSG_ID_FP_VERSION_RESPONSE = 0x5A # FP FW Version response + MSG_ID_TD_TREATMENT_PAUSED_TIMER_DATA = 0x5B # TD treatment paused timer data. + MSG_ID_DD_UF_DATA = 0x5C # DD ultrafiltration data + MSG_ID_FP_PERMEATE_TANK_DATA = 0x5D # FP Permeate tank broadcast data + MSG_ID_DD_SPENT_CHAMBER_FILL_DATA = 0x5E # DD spent chamber fill broadcast data + MSG_ID_UI_FLUID_BOLUS_REQUEST = 0x5F # UI Fluid Bolus request + MSG_ID_TD_FLUID_BOLUS_RESPONSE = 0x60 # TD Fluid Bolus response + MSG_ID_DD_BLOOD_LEAK_DATA = 0x61 # DD blood leak data + MSG_ID_FP_INLET_PRESSURE_CHECK_DATA = 0x62 # FP Inlet Pressure Check broadcast data + MSG_ID_UI_BLOOD_PRESSURE_REQUEST = 0x63 # UI request to initiate a blood pressure reading + MSG_ID_TD_BLOOD_PRESSURE_READING = 0x64 # TD blood pressure reading to UI + MSG_ID_TD_BLOOD_PRESSURE_DATA = 0x65 # TD blood pressure broadcast data + MSG_ID_UI_ULTRAFILTRATION_CHANGE_CONFIRM_REQUEST = 0x66 # UI request to validate ultrafiltration volume change + MSG_ID_TD_ULTRAFILTRATION_CHANGE_CONFIRM_RESPONSE = 0x67 # TD response to request to validate ultrafiltration volume change + MSG_ID_DD_VOLTAGES_DATA = 0x68 # DD voltage broadcast data + MSG_ID_DD_RINSE_PUMP_DATA = 0x69 # DD rinse pump data + MSG_ID_TD_TREATMENT_LOG_ALARM_EVENT = 0x6A # TD treatment log alarm event + MSG_ID_TD_TREATMENT_LOG_EVENT = 0x6B # TD treatment log event + MSG_ID_TD_DATE_AND_TIME_REQUEST = 0x6C # TD date and time request + MSG_ID_TD_DATE_AND_TIME_RESPONSE = 0x6D # TD date and time response + MSG_ID_DD_DATE_AND_TIME_REQUEST = 0x6E # DD date and time request + MSG_ID_DD_DATE_AND_TIME_RESPONSE = 0x6F # DD date and time response + MSG_ID_DD_DRY_BICART_DATA = 0x70 # DD dry bicart data + MSG_ID_FP_RO_REJECTION_RATIO_DATA = 0x71 # FP broadcast RO Rejection ratio data + MSG_ID_UI_PRESSURE_LIMITS_CHANGE_REQUEST = 0x72 # UI pressure limits change request + MSG_ID_TD_PRESSURE_LIMITS_CHANGE_RESPONSE = 0x73 # TD pressure limits change response + MSG_ID_UI_BOLUS_VOLUME_CHANGE_REQUEST = 0x74 # UI bolus volume change request + MSG_ID_TD_BOLUS_VOLUME_CHANGE_RESPONSE = 0x75 # TD bolus volume change response + MSG_ID_UI_DURATION_VALIDATE_REQUEST = 0x76 # UI duration validation request + MSG_ID_TD_DURATION_VALIDATE_RESPONSE = 0x77 # TD duration validation response + MSG_ID_UI_DURATION_CONFIRM_REQUEST = 0x78 # UI duration confirm request + MSG_ID_TD_DURATION_CONFIRM_RESPONSE = 0x79 # TD duration confirm response + MSG_ID_UI_TREATMENT_SET_POINTS_CHANGE_REQUEST = 0x7A # UI treatment set points change request + MSG_ID_TD_TREATMENT_SET_POINTS_CHANGE_RESPONSE = 0x7B # TD treatment set points change response + MSG_ID_UI_TREATMENT_SET_POINT_BLOOD_FLOW_CHANGE_REQUEST = 0x7C # UI treatment set point blood flow change request + MSG_ID_TD_TREATMENT_SET_POINT_BLOOD_FLOW_CHANGE_RESPONSE = 0x7D # TD treatment set point blood flow change response + MSG_ID_UI_TREATMENT_SET_POINT_DIALYSATE_FLOW_CHANGE_REQUEST = 0x7E # UI treatment set point dialysate flow change request + MSG_ID_TD_TREATMENT_SET_POINT_DIALYSATE_FLOW_CHANGE_RESPONSE = 0x7F # TD treatment set point dialysate flow change response + MSG_ID_UI_TREATMENT_SET_POINT_DIALYSATE_TEMP_CHANGE_REQUEST = 0x80 # UI treatment set point dialysate temperature change request + MSG_ID_TD_TREATMENT_SET_POINT_DIALYSATE_TEMP_CHANGE_RESPONSE = 0x81 # TD treatment set point dialysate temperature change response + MSG_ID_TD_INSTITUTIONAL_RECORD_REQUEST = 0x82 # TD institutional record request + MSG_ID_TD_INSTITUTIONAL_RECORD_RESPONSE = 0x83 # TD institutional record response + MSG_ID_TD_ADJUST_INSTITUTIONAL_RECORD_REQUEST = 0x84 # TD adjust institutional record request + MSG_ID_TD_ADJUST_INSTITUTIONAL_RECORD_RESPONSE = 0x85 # TD adjust institutional record response + MSG_ID_TD_ADVANCED_INSTITUTIONAL_RECORD_REQUEST = 0x86 # TD advanced institutional record request + MSG_ID_TD_ADVANCED_INSTITUTIONAL_RECORD_RESPONSE = 0x87 # TD advanced institutional record response + MSG_ID_TD_ADVANCED_ADJUST_INSTITUTIONAL_RECORD_REQUEST = 0x88 # TD advanced institutional record request + MSG_ID_TD_ADVANCED_ADJUST_INSTITUTIONAL_RECORD_RESPONSE = 0x89 # TD advanced institutional record response + MSG_ID_TD_HEPARIN_REQUEST = 0x8A # TD heparin request + MSG_ID_TD_HEPARIN_RESPONSE = 0x8B # TD heparin response + MSG_ID_TD_HEPARIN_DATA = 0x8C # TD heparin data + MSG_ID_TD_END_TREATMENT_REQUEST = 0x8D # TD end treatment request + MSG_ID_TD_END_TREATMENT_RESPONSE = 0x8E # TD end treatment response + MSG_ID_TD_RINSEBACK_PROGRESS = 0x8F # TD rinseback progress + MSG_ID_UI_RINSEBACK_CMD_REQUEST = 0x90 # UI rinseback request + MSG_ID_TD_RINSEBACK_CMD_RESPONSE = 0x91 # TD rinseback response + MSG_ID_UI_ADJUST_DISPOSABLES_CONFIRM_REQUEST = 0x92 # UI adjust disposables confirm request + MSG_ID_TD_ADJUST_DISPOSABLES_CONFIRM_RESPONSE = 0x93 # TD adjust disposables confirm response + MSG_ID_UI_ADJUST_DISPOSABLES_REMOVAL_CONFIRM_REQUEST = 0x94 # UI adjust disposables removal confirm request + MSG_ID_TD_ADJUST_DISPOSABLES_REMOVAL_CONFIRM_RESPONSE = 0x95 # TD adjust disposables removal confirm response + MSG_ID_FP_FILTER_FLUSH_DEF_DATA = 0x96 # FP Filter Flush Defeatured broadcast data + MSG_ID_TD_BLOOD_PRIME_PROGRESS_DATA = 0x97 # TD broadcast of blood prime progress + MSG_ID_UI_BLOOD_PRIME_CMD_REQUEST = 0x98 # UI blood prime command request + MSG_ID_TD_BLOOD_PRIME_CMD_RESPONSE = 0x99 # TD blood prime command response + MSG_ID_TD_ISOLATED_UF_DATA = 0x9A # TD isolated UF data + MSG_ID_UI_ISOLATED_UF_DURATION_CHANGE_REQUEST = 0x9B # UI isolated UF duration change request + MSG_ID_TD_ISOLATED_UF_DURATION_CHANGE_RESPONSE = 0x9C # TD isolated UF duration change response + MSG_ID_UI_ISOLATED_UF_VOLUME_GOAL_CHANGE_REQUEST = 0x9D # UI isolated UF volume goal change request + MSG_ID_TD_ISOLATED_UF_VOLUME_GOAL_CHANGE_RESPONSE = 0x9E # TD isolated UF volume goal change response + MSG_ID_UI_ISOLATED_UF_CONFIRM_REQUEST = 0x9F # UI isolated UF confirm request + MSG_ID_TD_ISOLATED_UF_CONFIRM_RESPONSE = 0xA0 # TD isolated UF confirm response + MSG_ID_UI_ADJUST_START_TREATMENT_REQUEST = 0xA1 # UI adjust start treatment request + MSG_ID_TD_ADJUST_START_TREATMENT_RESPONSE = 0xA2 # TD adjust start treatment response + MSG_ID_UI_WATER_SAMPLE_RESULT_REQUEST = 0xA3 # UI water sample result request + MSG_ID_UI_PRESSURE_LIMIT_WIDEN_REQUEST = 0xA4 # UI pressure limit widen request. + MSG_ID_TD_PRESSURE_LIMIT_WIDEN_RESPONSE = 0xA5 # TD pressure limit widen response. + MSG_ID_UI_RECIRCULATE_REQUEST = 0xA6 # UI recirculate request + MSG_ID_TD_RECIRCULATE_RESPONSE = 0xA7 # TD recirculate response + MSG_ID_TD_RECIRCULATE_DATA = 0xA8 # TD recirculate data + MSG_ID_UI_ADJUST_TREATMENT_LOGS_REQUEST = 0xA9 # UI adjust treatment logs request. + MSG_ID_TD_ADJUST_TREATMENT_LOGS_RESPONSE = 0xAA # TD adjust treatment logs response + MSG_ID_TD_WATER_SAMPLE_RESULT_RESPONSE = 0xAB # UI water sample result response + MSG_ID_TD_WATER_SAMPLE_DATA = 0xAC # TD broadcast water sample data + MSG_ID_TD_TREATMENT_LOG_AVERAGE_DATA = 0xAD # TD broadcast of treatment log average data + MSG_ID_TD_DRY_SELF_TEST_PROGRESS_DATA = 0xAE # TD dry self test progress data + MSG_ID_TD_TUBE_SET_AUTHENTICATION_REQUEST = 0xAF # UI tube set authentication acknowledge request + MSG_ID_TD_TUBE_SET_AUTHENTICATION_ACK_RESPONSE = 0xB0 # TD tube set authentication acknowledge response + MSG_ID_TD_SYRINGE_PUMP_DATA = 0xB1 # TD broadcast of syringe pump data + MSG_ID_TD_HEPARIN_PAUSE_RESUME_RESPONSE = 0xB2 # TD response to pause/resume Heparin delivery request + MSG_ID_FFU_SIGNAL_TD_UPDATE_AVAILABLE = 0xB3 # FFU signal TD update is available. + MSG_ID_FFU_SIGNAL_DD_UPDATE_AVAILABLE = 0xB4 # FFU signal DD update is available. + MSG_ID_TD_UI_GENERIC_CONFIRMATION_REQUEST = 0xB5 # TD request for generic UI confirmation. + MSG_ID_UI_GENERIC_CONFIRMATION_RESULT_RESPONSE = 0xB6 # UI generic confirmation result to TD. + MSG_ID_AVAILABLE_B7 = 0xB7 # Msg ID not used - available for use. + MSG_ID_UI_VITALS_ADJUSTMENT_REQUEST = 0xB8 # UI vitals adjustment request + MSG_ID_TD_VITALS_ADJUSTMENT_RESPONSE = 0xB9 # TD vitals adjustment response + MSG_ID_UI_ISO_UF_STATE_REQUEST = 0xBA + MSG_ID_TD_ISO_UF_STATE_RESPONSE = 0xBB + MSG_ID_TD_HEMODIAFILTRATION_DATA = 0xBC + MSG_ID_UI_PAUSE_SUB_FLOW_REQUEST = 0xBD + MSG_ID_TD_PAUSE_SUB_FLOW_RESPONSE = 0xBE + MSG_ID_UI_AUTO_SUBSTITUTION_REQUEST = 0xBF + MSG_ID_TD_AUTO_SUBSTITUTION_REPONSE = 0xC0 + MSG_ID_UI_HDF_ADJUSTMENT_REQUEST = 0xC1 + MSG_ID_TD_HDF_ADJUSTMENT_RESPONSE = 0xC2 + MSG_ID_DD_NVM_CAL_PRESSURE_SENSOR_RESPONSE = 0xC3 + MSG_ID_TD_DRY_BICARD_DISCONNECT_DATA = 0xC4 + MSG_ID_UI_DRY_BICARD_DISCONNECT_REQUEST = 0xC5 + MSG_ID_TD_DRY_BICARD_DISCONNECT_RESPONSE = 0xC6 + MSG_ID_TD_PRIME_PROGRESS_DATA = 0xC7 + MSG_ID_UI_DD_NVM_SET_CAL_CONC_PUMP_REQUEST = 0xC8 + MSG_ID_DD_NVM_CAL_D12_PUMP_RESPONSE = 0xC9 + MSG_ID_UI_SETUP_TUBING_SET_CONNECTIONS_CONFIRM_REQUEST = 0xD6 # UI setup connection confirmation request + MSG_ID_TD_SETUP_TUBING_SET_CONNECTIONS_CONFIRM_RESPONSE = 0xD7 # TD setup connection confirmation response + MSG_ID_TD_POST_FINAL_TEST_RESULT = 0xD8 + MSG_ID_TD_POST_SINGLE_TEST_RESULT = 0xD9 + MSG_ID_TD_UI_CANCEL_REQUEST = 0xDA + MSG_ID_DD_SUBSTITUTION_PUMP_DATA = 0xDB # DD substitution pump broadcast data. + MSG_ID_DD_CONDUCTIVITY_SENSOR_RESISTANCE_DATA = 0xDC # DD conductivity resistance data broadcast. + MSG_ID_FP_FILTER_FLUSH_DATA = 0xDD # FP Filter Flush broadcast data + MSG_ID_FP_PERMEATE_FLUSH_DATA = 0xDE # FP Permeate Flush broadcast data + MSG_ID_UI_RO_WATER_MODE_REQUEST = 0xEB + MSG_ID_DD_RO_WATER_MODE_RESPONSE = 0xEC + MSG_ID_UI_ADJUST_RO_WATER_MODE_REQUEST = 0xED + MSG_ID_DD_ADJUST_RO_WATER_MODE_RESPONSE = 0xEE + TBD_EF = 0xEF + MSG_ID_DD_PISTON_PUMP_CONTROL_DATA = 0xF0 - MSG_ID_UI_TD_NVM_GET_RECORD_REQUEST = 0x100 - MSG_ID_TD_NVM_SYSTEM_RECORD_RESPONSE = 0x101 - MSG_ID_UI_TD_NVM_SET_SYSTEM_RECORD = 0x102 - MSG_ID_TD_NVM_SERVICE_RECORD_RESPONSE = 0x103 - MSG_ID_UI_TD_NVM_SET_SERVICE_RECORD = 0x104 - MSG_ID_TD_NVM_INSTITUTIONAL_RECORD_RESPONSE = 0x105 - MSG_ID_UI_TD_NVM_SET_INSTITUTIONAL_RECORD = 0x106 - MSG_ID_TD_NVM_USAGE_INFO_RECORD_RESPONSE = 0x107 - MSG_ID_UI_TD_NVM_SET_USAGE_INFO_RECORD = 0x108 - MSG_ID_TD_NVM_CAL_RESPONSE = 0x109 - MSG_ID_UI_TD_NVM_SET_CAL_RECORD = 0x10A - MSG_ID_TD_NVM_RECORD_CRC_OVERRIDE_REQUEST = 0x10B + MSG_ID_UI_DD_NVM_GET_SYSTEM_RECORD_REQUEST = 0x100 # DD NVM Get System Record Request + MSG_ID_DD_UI_NVM_GET_SYSTEM_RECORD_RESPONSE = 0x101 # DD NVM Get System Record Response + MSG_ID_UI_DD_NVM_SET_SYSTEM_RECORD_REQUEST = 0x102 # DD NVM Set System Record Request + MSG_ID_DD_UI_NVM_SET_SYSTEM_RECORD_RESPONSE = 0x103 # DD NVM Set System Record Response + MSG_ID_UI_DD_NVM_GET_SERVICE_RECORD_REQUEST = 0x104 # DD NVM Get Service Record Request + MSG_ID_DD_UI_NVM_GET_SERVICE_RECORD_RESPONSE = 0x105 # DD NVM Get Service Record Response + MSG_ID_UI_DD_NVM_SET_SERVICE_RECORD_REQUEST = 0x106 # DD NVM Set Service Record Request + MSG_ID_DD_UI_NVM_SET_SERVICE_RECORD_RESPONSE = 0x107 # DD NVM Set Service Record Response + MSG_ID_UI_DD_NVM_GET_INSTIT_BASIC_RECORD_REQUEST = 0x108 # DD NVM Get Institutional Basic Record Request + MSG_ID_DD_UI_NVM_GET_INSTIT_BASIC_RECORD_RESPONSE = 0x109 # DD NVM Get Institutional Basic Record Response + MSG_ID_UI_DD_NVM_SET_INSTIT_BASIC_RECORD_REQUEST = 0x10A # DD NVM Set Institutional Basic Record Request + MSG_ID_DD_UI_NVM_SET_INSTIT_BASIC_RECORD_RESPONSE = 0x10B # DD NVM Set Institutional Basic Record Response + MSG_ID_UI_DD_NVM_GET_INSTIT_ADVANCED_RECORD_REQUEST = 0x10C # DD NVM Get Institutional Advanced Record Request + MSG_ID_DD_UI_NVM_GET_INSTIT_ADVANCED_RECORD_RESPONSE = 0x10D # DD NVM Get Institutional Advanced Record Response + MSG_ID_UI_DD_NVM_SET_INSTIT_ADVANCED_RECORD_REQUEST = 0x10E # DD NVM Get Institutional Advanced Record Request + MSG_ID_DD_UI_NVM_SET_INSTIT_ADVANCED_RECORD_RESPONSE = 0x10F # DD NVM Get Institutional Advanced Record Response + MSG_ID_UI_DD_NVM_GET_INSTIT_ADDITIONAL_RECORD_REQUEST = 0x110 # DD NVM Get Institutional Additional Record Request + MSG_ID_DD_UI_NVM_GET_INSTIT_ADDITIONAL_RECORD_RESPONSE = 0x111 # DD NVM Get Institutional Additional Record Response + MSG_ID_UI_DD_NVM_SET_INSTIT_ADDITIONAL_RECORD_REQUEST = 0x112 # DD NVM Set Institutional Additional Record Request + MSG_ID_DD_UI_NVM_SET_INSTIT_ADDITIONAL_RECORD_RESPONSE = 0x113 # DD NVM Set Institutional Additional Record Response + MSG_ID_UI_DD_NVM_GET_USAGE_INFO_RECORD_REQUEST = 0x114 # DD NVM Get Usage Info Record Request + MSG_ID_DD_UI_NVM_GET_USAGE_INFO_RECORD_RESPONSE = 0x115 # DD NVM Get Usage Info Record Response + MSG_ID_UI_DD_NVM_SET_USAGE_INFO_RECORD_REQUEST = 0x116 # DD NVM Set Usage Info Record Request + MSG_ID_DD_UI_NVM_SET_USAGE_INFO_RECORD_RESPONSE = 0x117 # DD NVM Set Usage Info Record Response + MSG_ID_UI_DD_NVM_GET_PRESSURE_SENSOR_CAL_RECORD_REQUEST = 0x118 # DD NVM Get Pressure Sensor Calibration Record Request + MSG_ID_DD_UI_NVM_GET_PRESSURE_SENSOR_CAL_RECORD_RESPONSE = 0x119 # DD NVM Get Pressure Sensor Calibration Record Response + MSG_ID_UI_DD_NVM_SET_PRESSURE_SENSOR_CAL_RECORD_REQUEST = 0x11A # DD NVM Set Pressure Sensor Calibration Record Request + MSG_ID_DD_UI_NVM_SET_PRESSURE_SENSOR_CAL_RECORD_RESPONSE = 0x11B # DD NVM Set Pressure Sensor Calibration Record Response + MSG_ID_UI_DD_NVM_GET_TEMPERATURE_SENSOR_CAL_RECORD_REQUEST = 0x11C # DD NVM Get Temperature Sensor Calibration Record Request + MSG_ID_DD_UI_NVM_GET_TEMPERATURE_SENSOR_CAL_RECORD_RESPONSE = 0x11D # DD NVM Get Temperature Sensor Calibration Record Response + MSG_ID_UI_DD_NVM_SET_TEMPERATURE_SENSOR_CAL_RECORD_REQUEST = 0x11E # DD NVM Set Temperature Sensor Calibration Record Request + MSG_ID_DD_UI_NVM_SET_TEMPERATURE_SENSOR_CAL_RECORD_RESPONSE = 0x11F # DD NVM Set Temperature Sensor Calibration Record Response + MSG_ID_UI_DD_NVM_GET_CONC_PUMP_CAL_RECORD_REQUEST = 0x120 # DD NVM Get Concentrate Pumps Calibration Record Request + MSG_ID_DD_UI_NVM_GET_CONC_PUMP_CAL_RECORD_RESPONSE = 0x121 # DD NVM Get Concentrate Pumps Calibration Record Response + MSG_ID_UI_DD_NVM_SET_CONC_PUMP_CAL_RECORD_REQUEST = 0x122 # DD NVM Set Concentrate Pumps Calibration Record Request + MSG_ID_DD_UI_NVM_SET_CONC_PUMP_CAL_RECORD_RESPONSE = 0x123 # DD NVM Set Concentrate Pumps Calibration Record Response + MSG_ID_UI_DD_NVM_GET_D12_PUMP_CAL_RECORD_REQUEST = 0x124 # DD NVM Get D12 Pump Calibration Record Request + MSG_ID_DD_UI_NVM_GET_D12_PUMP_CAL_RECORD_RESPONSE = 0x125 # DD NVM Get D12 Pump Calibration Record Response + MSG_ID_UI_DD_NVM_SET_D12_PUMP_CAL_RECORD_REQUEST = 0x126 # DD NVM Set D12 Pump Calibration Record Request + MSG_ID_DD_UI_NVM_SET_D12_PUMP_CAL_RECORD_RESPONSE = 0x127 # DD NVM Set D12 Pump Calibration Record Response + MSG_ID_UI_DD_NVM_GET_D48_PUMP_CAL_RECORD_REQUEST = 0x128 # DD NVM Get D48 Pump Calibration Record Request + MSG_ID_DD_UI_NVM_GET_D48_PUMP_CAL_RECORD_RESPONSE = 0x129 # DD NVM Get D48 Pump Calibration Record Response + MSG_ID_UI_DD_NVM_SET_D48_PUMP_CAL_RECORD_REQUEST = 0x12A # DD NVM Set D48 Pump Calibration Record Request + MSG_ID_DD_UI_NVM_SET_D48_PUMP_CAL_RECORD_RESPONSE = 0x12B # DD NVM Set D48 Pump Calibration Record Response + MSG_ID_UI_DD_NVM_GET_ACID_CONC_CAL_RECORD_REQUEST = 0x12C # DD NVM Get Acid Concentrates Calibration Record Request + MSG_ID_DD_UI_NVM_GET_ACID_CONC_CAL_RECORD_RESPONSE = 0x12D # DD NVM Get Acid Concentrates Calibration Record Response + MSG_ID_UI_DD_NVM_SET_ACID_CONC_CAL_RECORD_REQUEST = 0x12E # DD NVM Set Acid Concentrates Calibration Record Request + MSG_ID_DD_UI_NVM_SET_ACID_CONC_CAL_RECORD_RESPONSE = 0x12F # DD NVM Set Acid Concentrates Calibration Record Response + MSG_ID_UI_DD_NVM_GET_BICARB_CONC_CAL_RECORD_REQUEST = 0x130 # DD NVM Get Bicarbonate Concentrates Calibration Record Request + MSG_ID_DD_UI_NVM_GET_BICARB_CONC_CAL_RECORD_RESPONSE = 0x131 # DD NVM Get Bicarbonate Concentrates Calibration Record Response + MSG_ID_UI_DD_NVM_SET_BICARB_CONC_CAL_RECORD_REQUEST = 0x132 # DD NVM Set Bicarbonate Concentrates Calibration Record Request + MSG_ID_DD_UI_NVM_SET_BICARB_CONC_CAL_RECORD_RESPONSE = 0x133 # DD NVM Set Bicarbonate Concentrates Calibration Record Response + MSG_ID_UI_DD_NVM_GET_ACCEL_SENSOR_CAL_RECORD_REQUEST = 0x134 # DD NVM Get Accelerometers Sensor Calibration Record Request + MSG_ID_DD_UI_NVM_GET_ACCEL_SENSOR_CAL_RECORD_RESPONSE = 0x135 # DD NVM Get Accelerometers Sensor Calibration Record Response + MSG_ID_UI_DD_NVM_SET_ACCEL_SENSOR_CAL_RECORD_REQUEST = 0x136 # DD NVM Set Accelerometers Sensor Calibration Record Request + MSG_ID_DD_UI_NVM_SET_ACCEL_SENSOR_CAL_RECORD_RESPONSE = 0x137 # DD NVM Set Accelerometers Sensor Calibration Record Response + MSG_ID_UI_DD_NVM_GET_BLOOD_LEAK_SENSOR_CAL_RECORD_REQUEST = 0x138 # DD NVM Get Blood Leak Sensor Calibration Record Request + MSG_ID_DD_UI_NVM_GET_BLOOD_LEAK_SENSOR_CAL_RECORD_RESPONSE = 0x139 # DD NVM Get Blood Leak Sensor Calibration Record Response + MSG_ID_UI_DD_NVM_SET_BLOOD_LEAK_SENSOR_CAL_RECORD_REQUEST = 0x13A # DD NVM Set Blood Leak Sensor Calibration Record Request + MSG_ID_DD_UI_NVM_SET_BLOOD_LEAK_SENSOR_CAL_RECORD_RESPONSE = 0x13B # DD NVM Set Blood Leak Sensor Calibration Record Response + MSG_ID_UI_DD_NVM_GET_CONDUCTIVITY_SENSOR_CAL_RECORD_REQUEST = 0x13C # DD NVM Get Conductivity Sensor Calibration Record Request + MSG_ID_DD_UI_NVM_GET_CONDUCTIVITY_SENSOR_CAL_RECORD_RESPONSE = 0x13D # DD NVM Get Conductivity Sensor Calibration Record Response + MSG_ID_UI_DD_NVM_SET_CONDUCTIVITY_SENSOR_CAL_RECORD_REQUEST = 0x13E # DD NVM Set Conductivity Sensor Calibration Record Request + MSG_ID_DD_UI_NVM_SET_CONDUCTIVITY_SENSOR_CAL_RECORD_RESPONSE = 0x13F # DD NVM Set Conductivity Sensor Calibration Record Response + MSG_ID_UI_FP_NVM_GET_SERVICE_RECORD_REQUEST = 0x140 # FP NVM Get Service Record Request + MSG_ID_FP_UI_NVM_GET_SERVICE_RECORD_RESPONSE = 0x141 # FP NVM Get Service Record Response + MSG_ID_UI_FP_NVM_SET_SERVICE_RECORD_REQUEST = 0x142 # FP NVM Set Service Record Request + MSG_ID_FP_UI_NVM_SET_SERVICE_RECORD_RESPONSE = 0x143 # FP NVM Set Service Record Response + MSG_ID_UI_FP_NVM_GET_USAGE_INFO_RECORD_REQUEST = 0x144 # FP NVM Get Usage Info Record Request + MSG_ID_FP_UI_NVM_GET_USAGE_INFO_RECORD_RESPONSE = 0x145 # FP NVM Get Usage Info Record Response + MSG_ID_UI_FP_NVM_SET_USAGE_INFO_RECORD_REQUEST = 0x146 # FP NVM Set Usage Info Record Request + MSG_ID_FP_UI_NVM_SET_USAGE_INFO_RECORD_RESPONSE = 0x147 # FP NVM Set Usage Info Record Response - MSG_ID_TD_TESTER_LOGIN_REQUEST = 0x8000 - MSG_ID_TD_SOFTWARE_RESET_REQUEST = 0x8001 - MSG_ID_TD_SEND_TEST_CONFIGURATION = 0x8002 - MSG_ID_TD_BUBBLE_OVERRIDE_REQUEST = 0x8003 - MSG_ID_TD_VOLTAGE_PUBLISH_INTERVAL_OVERRIDE_REQUEST = 0x8004 - MSG_ID_TD_VOLTAGE_OVERRIDE_REQUEST = 0x8005 - MSG_ID_TD_BUBBLE_PUBLISH_INTERVAL_OVERRIDE_REQUEST = 0x8006 - MSG_ID_TD_PRESSURE_OVERRIDE_REQUEST = 0x8007 - MSG_ID_TD_AIR_PUMP_SET_STATE_REQUEST = 0x8008 - MSG_ID_TD_AIR_PUMP_PUBLISH_INTERVAL_OVERRIDE_REQUEST = 0x8009 - MSG_ID_TD_SWITCHES_PUBLISH_INTERVAL_OVERRIDE_REQUEST = 0x800A - MSG_ID_TD_SWITCH_STATE_OVERRIDE_REQUEST = 0x800B - MSG_ID_TD_OFF_BUTTON_OVERRIDE_REQUEST = 0x800C - MSG_ID_TD_STOP_BUTTON_OVERRIDE_REQUEST = 0x800D - MSG_ID_TD_ALARM_LAMP_PATTERN_OVERRIDE_REQUEST = 0x800E - MSG_ID_TD_ALARM_AUDIO_LEVEL_OVERRIDE_REQUEST = 0x800F - MSG_ID_TD_ALARM_AUDIO_CURRENT_HG_OVERRIDE_REQUEST = 0x8010 - MSG_ID_TD_ALARM_AUDIO_CURRENT_LG_OVERRIDE_REQUEST = 0x8011 - MSG_ID_TD_BACKUP_ALARM_AUDIO_CURRENT_OVERRIDE_REQUEST = 0x8012 - MSG_ID_TD_PRESSURE_PUBLISH_INTERVAL_OVERRIDE_REQUEST = 0x8013 - MSG_ID_TD_AIR_TRAP_LEVEL_OVERRIDE_REQUEST = 0x8014 - MSG_ID_TD_AIR_TRAP_LEVEL_RAW_OVERRIDE_REQUEST = 0x8015 - MSG_ID_TD_AIR_TRAP_PUBLISH_INTERVAL_OVERRIDE_REQUEST = 0x8016 - MSG_ID_TD_2_WAY_VALVE_SET_STATE_REQUEST = 0x8017 - MSG_ID_TD_ROTARY_PINCH_VALVE_SET_POS_REQUEST = 0x8018 - MSG_ID_TD_ROTARY_PINCH_VALVE_STATUS_OVERRIDE_REQUEST = 0x8019 - MSG_ID_TD_ROTARY_PINCH_VALVE_POSITION_OVERRIDE_REQUEST = 0x801A - MSG_ID_TD_VALVES_PUBLISH_INTERVAL_OVERRIDE_REQUEST = 0x801B - MSG_ID_TD_ALARM_STATUS_PUBLISH_INTERVAL_OVERRIDE_REQUEST = 0x801C - MSG_ID_TD_ALARM_INFO_PUBLISH_INTERVAL_OVERRIDE_REQUEST = 0x801D - MSG_ID_TD_ALARM_START_TIME_OVERRIDE_REQUEST = 0x801E - MSG_ID_TD_ALARM_CLEAR_ALL_ALARMS_REQUEST = 0x801F - MSG_ID_TD_WATCHDOG_OVERRIDE_REQUEST = 0x8020 - MSG_ID_TD_ALARM_STATE_OVERRIDE_REQUEST = 0x8021 - MSG_ID_TD_SAFETY_SHUTDOWN_OVERRIDE_REQUEST = 0x8022 - MSG_ID_TD_PINCH_VALVE_SET_POSITION_REQUEST = 0x8023 - MSG_ID_TD_PINCH_VALVE_HOME_REQUEST = 0x8024 - MSG_ID_TD_BLOOD_PUMP_PUBLISH_INTERVAL_OVERRIDE_REQUEST = 0x8025 - MSG_ID_TD_BLOOD_PUMP_SET_FLOW_RATE_REQUEST = 0x8026 - MSG_ID_TD_BLOOD_PUMP_SET_SPEED_REQUEST = 0x8027 - MSG_ID_TD_BLOOD_PUMP_MEASURED_FLOW_RATE_OVERRIDE_REQUEST = 0x8028 - MSG_ID_TD_BLOOD_PUMP_MEASURED_MOTOR_SPEED_OVERRIDE_REQUEST = 0x8029 - MSG_ID_TD_BLOOD_PUMP_MEASURED_ROTOR_SPEED_OVERRIDE_REQUEST = 0x802A - MSG_ID_TD_BLOOD_PUMP_ROTOR_COUNT_OVERRIDE_REQUEST = 0x802B - MSG_ID_TD_TMP_PRESSURE_OVERRIDE_REQUEST = 0x802C - MSG_ID_TD_REQ_CURRENT_TREATMENT_PARAMETERS = 0x802D - MSG_ID_TD_RSP_CURRENT_TREATMENT_PARAMETERS = 0x802E - MSG_ID_TD_SET_TREATMENT_PARAMETER = 0x802F - MSG_ID_TD_OP_MODE_PUBLISH_INTERVAL_OVERRIDE_REQUEST = 0x8030 - MSG_ID_TD_OP_MODE_OVERRIDE_REQUEST = 0x8031 - MSG_ID_TD_EJECTOR_MOTOR_SET_SPEED_REQUEST = 0x8032 - MSG_ID_TD_EJECTOR_COMMAND = 0x8033 - MSG_ID_TD_EJECTOR_PUBLISH_INTERVAL_OVERRIDE_REQUEST = 0x8034 - MSG_ID_TD_SET_AIR_TRAP_CONTROL = 0x8035 - MSG_ID_TD_HOME_BLOOD_PUMP_REQUEST = 0x8036 - MSG_ID_TD_BLOOD_FLOW_STROKE_VOLUME_OVERRIDE_REQUEST = 0x8037 - MSG_ID_TD_BLOOD_FLOW_WEAR_A_TERM_OVERRIDE_REQUEST = 0x8038 - MSG_ID_TD_BLOOD_FLOW_WEAR_B_TERM_OVERRIDE_REQUEST = 0x8039 - MSG_ID_TD_SET_TEST_CONFIGURATION = 0x803A - MSG_ID_TD_GET_TEST_CONFIGURATION = 0x803B - MSG_ID_TD_RESET_ALL_TEST_CONFIGURATIONS = 0x803C - MSG_ID_TD_AIR_PUMP_POWER_RAISE_OVERRIDE_REQUEST = 0x803D - MSG_ID_TD_AIR_PUMP_POWER_LOWER_OVERRIDE_REQUEST = 0x803E - MSG_ID_TD_HARD_STOP_BLOOD_PUMP = 0x803F - MSG_ID_TD_BARO_MFG_CRC_OVERRIDE = 0x8040 - MSG_ID_TD_BARO_PRESSURE_OVERRIDE = 0x8041 - MSG_ID_TD_TEMPERATURE_OVERRIDE = 0x8042 - MSG_ID_TD_TEMPERATURE_PUBLISH_INTERVAL_OVERRIDE_REQUEST = 0x8043 - MSG_ID_TD_EJECTOR_OPT_SENSOR_OVERRIDE_REQUEST = 0x8044 - MSG_ID_TD_ENABLE_VENOUS_BUBBLE_ALARM = 0x8047 - MSG_ID_TD_SYRINGE_PUMP_OPERATION_REQUEST = 0x8048 - MSG_ID_TD_SYRINGE_PUMP_PUBLISH_INTERVAL_OVERRIDE = 0x8049 - MSG_ID_TD_SYRINGE_PUMP_RATE_OVERRIDE_REQUEST = 0x8050 - MSG_ID_TD_SYRINGE_PUMP_FORCE_OVERRIDE_REQUEST = 0x8051 - MSG_ID_TD_SYRINGE_PUMP_HOME_OVERRIDE_REQUEST = 0x8052 - MSG_ID_TD_SYRINGE_PUMP_POSITION_OVERRIDE_REQUEST = 0x8053 - MSG_ID_TD_SYRINGE_PUMP_VOLUME_OVERRIDE_REQUEST = 0x8054 - MSG_ID_TD_SYRINGE_PUMP_STATUS_OVERRIDE_REQUEST = 0x8055 - MSG_ID_TD_SYRINGE_PUMP_ENCODER_STATUS_OVERRIDE_REQUEST = 0x8056 - MSG_ID_TD_SYRINGE_PUMP_ADC_DAC_STATUS_OVERRIDE_REQUEST = 0x8057 - MSG_ID_TD_SYRINGE_PUMP_ADC_READ_COUNTER_OVERRIDE_REQUEST = 0x8058 - MSG_ID_TD_HEPARIN_BOLUS_TARGET_RATE_OVERRIDE_REQUEST = 0x8059 - MSG_ID_TD_SYRINGE_PUMP_FORCE_SENSOR_CALIBRATION_REQUEST = 0x8060 - MSG_ID_TD_GET_ALARM_PROPERTIES_REQUEST = 0x8061 - MSG_ID_TD_ALARM_PROPERTIES_RESPONSE = 0x8062 - MSG_ID_BATTERY_REGISTERS_OVERRIDE_REQUEST = 0x8063 - MSG_ID_TD_BATTERY_PUBLISH_INTERVAL_OVERRIDE_REQUEST = 0x8064 + MSG_ID_TESTER_LOGIN_REQUEST = 0x8000 # TD tester log-in + MSG_ID_TD_SOFTWARE_RESET_REQUEST = 0x8001 # TD reset request + MSG_ID_TD_SEND_TEST_CONFIGURATION = 0x8002 # TD send test configuration to Dialin + MSG_ID_TD_BUBBLE_OVERRIDE_REQUEST = 0x8003 # TD override request for a given bubble detector + MSG_ID_TD_VOLTAGE_PUBLISH_INTERVAL_OVERRIDE_REQUEST = 0x8004 # TD override request for the voltage data broadcast interval + MSG_ID_TD_VOLTAGE_OVERRIDE_REQUEST = 0x8005 # TD override request for a given voltage + MSG_ID_TD_BUBBLE_PUBLISH_INTERVAL_OVERRIDE_REQUEST = 0x8006 # TD override request for the bubble data broadcast interval + MSG_ID_TD_PRESSURE_OVERRIDE_REQUEST = 0x8007 # TD override request for a given pressure + MSG_ID_TD_AIR_PUMP_SET_STATE_REQUEST = 0x8008 # TD set air pump state request + MSG_ID_TD_AIR_PUMP_PUBLISH_INTERVAL_OVERRIDE_REQUEST = 0x8009 # TD override request for the air pump data broadcast interval + MSG_ID_TD_SWITCHES_PUBLISH_INTERVAL_OVERRIDE_REQUEST = 0x800A # TD override request for the switches data broadcast interval + MSG_ID_TD_SWITCH_STATE_OVERRIDE_REQUEST = 0x800B # TD override request for a given switch + MSG_ID_TD_OFF_BUTTON_OVERRIDE_REQUEST = 0x800C # TD override request for the off button + MSG_ID_TD_STOP_BUTTON_OVERRIDE_REQUEST = 0x800D # TD override request for the stop button + MSG_ID_TD_ALARM_LAMP_PATTERN_OVERRIDE_REQUEST = 0x800E # TD override request for the alarm lamp pattern + MSG_ID_TD_ALARM_AUDIO_LEVEL_OVERRIDE_REQUEST = 0x800F # TD override request for the alarm audio level + MSG_ID_TD_ALARM_AUDIO_CURRENT_HG_OVERRIDE_REQUEST = 0x8010 # TD override request for the alarm audio HG current + MSG_ID_TD_ALARM_AUDIO_CURRENT_LG_OVERRIDE_REQUEST = 0x8011 # TD override request for the alarm audio LG current + MSG_ID_TD_BACKUP_ALARM_AUDIO_CURRENT_OVERRIDE_REQUEST = 0x8012 # TD override request for the backup alarm audio current + MSG_ID_TD_PRESSURE_PUBLISH_INTERVAL_OVERRIDE_REQUEST = 0x8013 # TD override request for the pressures data broadcast interval + MSG_ID_TD_AIR_TRAP_LEVEL_OVERRIDE_REQUEST = 0x8014 # TD override request for debounced reading of a given air trap level sensor + MSG_ID_TD_AIR_TRAP_LEVEL_RAW_OVERRIDE_REQUEST = 0x8015 # TD override request for raw reading of a given air trap level sensor + MSG_ID_TD_AIR_TRAP_PUBLISH_INTERVAL_OVERRIDE_REQUEST = 0x8016 # TD override request for the air trap data broadcast interval + MSG_ID_TD_3_WAY_VALVE_SET_STATE_REQUEST = 0x8017 # TD set 3-way valve state request + MSG_ID_TD_ROTARY_PINCH_VALVE_SET_POS_REQUEST = 0x8018 # TD set rotary pinch valve commanded position request + MSG_ID_TD_ROTARY_PINCH_VALVE_STATUS_OVERRIDE_REQUEST = 0x8019 # TD override request for rotary pinch valve + MSG_ID_TD_ROTARY_PINCH_VALVE_POSITION_OVERRIDE_REQUEST = 0x801A # TD override request for rotary pinch valve actual encoder position + MSG_ID_TD_VALVES_PUBLISH_INTERVAL_OVERRIDE_REQUEST = 0x801B # TD override request for pinch valves data broadcast interval + MSG_ID_TD_ALARM_STATUS_PUBLISH_INTERVAL_OVERRIDE_REQUEST = 0x801C # TD override request for alarm status broadcast interval + MSG_ID_TD_ALARM_INFO_PUBLISH_INTERVAL_OVERRIDE_REQUEST = 0x801D # TD override request for alarm information broadcast interval + MSG_ID_TD_ALARM_START_TIME_OVERRIDE_REQUEST = 0x801E # TD override request for alarm start time + MSG_ID_TD_ALARM_CLEAR_ALL_ALARMS_REQUEST = 0x801F # TD clear all alarms request + MSG_ID_TD_WATCHDOG_OVERRIDE_REQUEST = 0x8020 # TD override request for watchdog task check-in + MSG_ID_TD_ALARM_STATE_OVERRIDE_REQUEST = 0x8021 # TD override request for alarm state + MSG_ID_TD_SAFETY_SHUTDOWN_OVERRIDE_REQUEST = 0x8022 # TD override request for safety shutdown + MSG_ID_TD_PINCH_VALVE_SET_POSITION_REQUEST = 0x8023 # TD set pinch valve A/B/C position + MSG_ID_TD_PINCH_VALVE_HOME_REQUEST = 0x8024 # TD initiate a pinch valve home operation + MSG_ID_TD_BLOOD_PUMP_PUBLISH_INTERVAL_OVERRIDE_REQUEST = 0x8025 # TD override request for blood pump data broadcast interval + MSG_ID_TD_BLOOD_PUMP_SET_FLOW_RATE_REQUEST = 0x8026 # TD set blood pump set flow rate request + MSG_ID_TD_BLOOD_PUMP_SET_SPEED_REQUEST = 0x8027 # TD set blood pump set speed request + MSG_ID_TD_BLOOD_PUMP_MEASURED_FLOW_RATE_OVERRIDE_REQUEST = 0x8028 # TD override request for blood pump measured flow rate + MSG_ID_TD_BLOOD_PUMP_MEASURED_MOTOR_SPEED_OVERRIDE_REQUEST = 0x8029 # TD override request for blood pump measured motor speed + MSG_ID_TD_BLOOD_PUMP_MEASURED_ROTOR_SPEED_OVERRIDE_REQUEST = 0x802A # TD override request for blood pump measured rotor speed + MSG_ID_TD_BLOOD_PUMP_ROTOR_COUNT_OVERRIDE_REQUEST = 0x802B # TD override request for blood pump rotor count + MSG_ID_TD_TMP_PRESSURE_OVERRIDE_REQUEST = 0x802C # TD override request for TMP pressure + MSG_ID_TD_REQ_CURRENT_TREATMENT_PARAMETERS = 0x802D # TD request for current treatment parameters + MSG_ID_TD_RSP_CURRENT_TREATMENT_PARAMETERS = 0x802E # TD response to request for current treatment parameters + MSG_ID_TD_SET_TREATMENT_PARAMETER = 0x802F # TD set a specific treatment parameter + MSG_ID_TD_OP_MODE_PUBLISH_INTERVAL_OVERRIDE_REQUEST = 0x8030 # TD override request for operation mode data publish interval + MSG_ID_TD_OP_MODE_OVERRIDE_REQUEST = 0x8031 # TD set operation mode request + MSG_ID_TD_EJECTOR_MOTOR_SET_SPEED_REQUEST = 0x8032 # TD set ejector motor speed request + MSG_ID_TD_EJECTOR_COMMAND = 0x8033 # TD ejector command + MSG_ID_TD_EJECTOR_PUBLISH_INTERVAL_OVERRIDE_REQUEST = 0x8034 # TD override request for ejector data publish interval + MSG_ID_TD_SET_AIR_TRAP_CONTROL = 0x8035 # TD set air trap control to start or stop + MSG_ID_TD_HOME_BLOOD_PUMP = 0x8036 # TD home blood pump request + MSG_ID_TD_BLOOD_FLOW_STROKE_VOLUME_OVERRIDE_REQUEST = 0x8037 # TD override request for blood flow stroke volume + MSG_ID_TD_BLOOD_FLOW_WEAR_A_TERM_OVERRIDE_REQUEST = 0x8038 # TD override request for blood flow wear A term + MSG_ID_TD_BLOOD_FLOW_WEAR_B_TERM_OVERRIDE_REQUEST = 0x8039 # TD override request for blood flow wear B term + MSG_ID_TD_SET_TEST_CONFIGURATION = 0x803A # TD set test configuration + MSG_ID_TD_GET_TEST_CONFIGURATION = 0x803B # TD get test configuration + MSG_ID_TD_RESET_ALL_TEST_CONFIGURATIONS = 0x803C # TD reset all the configurations + MSG_ID_TD_AIR_PUMP_POWER_RAISE_OVERRIDE_REQUEST = 0x803D # TD override request for air pump power level used to raise air trap level + MSG_ID_TD_AIR_PUMP_POWER_LOWER_OVERRIDE_REQUEST = 0x803E # TD override request for air pump power level used to lower air trap level + MSG_ID_TD_HARD_STOP_BLOOD_PUMP = 0x803F # TD hard stop blood pump + MSG_ID_TD_BARO_MFG_CRC_OVERRIDE = 0x8040 # TD barometric pressure sensor manufacturing CRC override. + MSG_ID_TD_BARO_PRESSURE_OVERRIDE = 0x8041 # TD barometric pressure sensor override. + MSG_ID_TD_TEMPERATURE_OVERRIDE = 0x8042 # TD temperature sensor override. + MSG_ID_TD_TEMPERATURE_PUBLISH_INTERVAL_OVERRIDE_REQUEST = 0x8043 # TD temperature sensor publish interval broadcast override. + MSG_ID_TD_EJECTOR_OPT_SENSOR_OVERRIDE_REQUEST = 0x8044 # TD ejector optical sensor override. + MSG_ID_TD_BLOOD_PRIME_VOLUME_OVERRIDE = 0x8045 # TD blood prime override. + MSG_ID_TD_BLOOD_PRIME_PUBLISH_INTERVAL_OVERRIDE_REQUEST = 0x8046 # TD blood prime publish interval broadcast override. + MSG_ID_TD_ENABLE_VENOUS_BUBBLE_ALARM = 0x8047 # TD enable venous bubble alarm. + MSG_ID_TD_SYRINGE_PUMP_OPERATION_REQUEST = 0x8048 # TD syringe pump operation request + MSG_ID_HD_SYRINGE_PUMP_PUBLISH_INTERVAL_OVERRIDE = 0x8049 # TD syringe pump data publish interval override request - MSG_ID_TD_AIR_PUMP_RPM_OVERRIDE_REQUEST = 0x8067 - MSG_ID_TD_BATTERY_I2C_STATUS_OVERRIDE_REQUEST = 0x8068 + MSG_ID_TD_SYRINGE_PUMP_RATE_OVERRIDE_REQUEST = 0x8050 # TD syringe pump measured rate override request + MSG_ID_TD_SYRINGE_PUMP_FORCE_OVERRIDE_REQUEST = 0x8051 # TD syringe pump measured force override request + MSG_ID_TD_SYRINGE_PUMP_HOME_OVERRIDE_REQUEST = 0x8052 # TD syringe pump measured home override request + MSG_ID_TD_SYRINGE_PUMP_POSITION_OVERRIDE_REQUEST = 0x8053 # TD syringe pump measured position override request + MSG_ID_TD_SYRINGE_PUMP_VOLUME_OVERRIDE_REQUEST = 0x8054 # TD syringe pump measured volume override request + MSG_ID_TD_SYRINGE_PUMP_STATUS_OVERRIDE_REQUEST = 0x8055 # TD syringe pump status override request + MSG_ID_TD_SYRINGE_PUMP_ENCODER_STATUS_OVERRIDE_REQUEST = 0x8056 # TD syringe pump Encoder status override request + MSG_ID_TD_SYRINGE_PUMP_ADC_DAC_STATUS_OVERRIDE_REQUEST = 0x8057 # TD syringe pump ADC and DAC status override request + MSG_ID_TD_SYRINGE_PUMP_ADC_READ_COUNTER_OVERRIDE_REQUEST = 0x8058 # TD syringe pump ADC read counter override request + MSG_ID_TD_HEPARIN_BOLUS_TARGET_RATE_OVERRIDE_REQUEST = 0x8059 # TD heparin bolus target rate override request + MSG_ID_TD_SYRINGE_PUMP_FORCE_SENSOR_CALIBRATION_REQUEST = 0x8060 # TD set syringe pump force sensor DAC calibration request + MSG_ID_TD_GET_ALARM_PROPERTIES_REQUEST = 0x8061 # TD send alarm table properties request + MSG_ID_TD_ALARM_PROPERTIES_RESPONSE = 0x8062 # TD send alarm table properties response to Dialin + MSG_ID_TD_BATTERY_REGISTERS_OVERRIDE_REQUEST = 0x8063 # TD battery registers override. + MSG_ID_TD_BATTERY_PUBLISH_INTERVAL_OVERRIDE_REQUEST = 0x8064 # TD battery publish interval override. + MSG_ID_TD_RINSEBACK_VOLUME_OVERRIDE = 0x8065 # TD rinseback volume override + MSG_ID_TD_RINSEBACK_PUBLISH_INTERVAL_OVERRIDE_REQUEST = 0x8066 # TD rinseback publish interval broadcast override. + + MSG_ID_TD_BATTERY_I2C_STATUS_OVERRIDE_REQUEST = 0x8068 # TD battery I2C status override. + MSG_ID_TD_TRAINING_TEST_OVERRIDE_REQUEST = 0x8999 MSG_ID_DD_TESTER_LOGIN_REQUEST = 0xA000 Index: leahi_dialin/dd/modules/records_get_responses.py =================================================================== diff -u --- leahi_dialin/dd/modules/records_get_responses.py (revision 0) +++ leahi_dialin/dd/modules/records_get_responses.py (revision f1cb03cd999ccce88151a2e6c29c19b00a6e8d54) @@ -0,0 +1,677 @@ +########################################################################### +# +# Copyright (c) 2020-2024 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 records_get_responses.py +# +# @author (last) Zoltan Miskolci +# @date (last) 04-Aug-2026 +# @author (original) Zoltan Miskolci +# @date (original) 04-Aug-2026 +# +############################################################################ + +# Project imports +from leahi_dialin.common import dd_enum_repository, disp_enum_repository, fp_enum_repository +from leahi_dialin.common.generic_defs import DataTypes +from leahi_dialin.common.msg_defs import RequestRejectReasons +from leahi_dialin.common.msg_ids import MsgIds +from leahi_dialin.protocols.CAN import CanChannels +from leahi_dialin.utils.abstract_classes import AbstractSubSystem, LocalVars +from leahi_dialin.utils.base import publish + + +class DDRecordsGetHandlers(AbstractSubSystem): + """ + Part of the DD Records + """ + + def __init__(self, *args, **kwargs): + """ + The sub record class to handle all the get handlers. + """ + if self.can_interface is not None: + # Data Request Response messages + self.can_interface.register_receiving_publication_function(channel_id = CanChannels.dd_sync_broadcast_ch_id, + message_id = MsgIds.MSG_ID_DD_UI_NVM_GET_SYSTEM_RECORD_RESPONSE.value, + function = self._handler_system_record_sync) + self.can_interface.register_receiving_publication_function(channel_id = CanChannels.dd_sync_broadcast_ch_id, + message_id = MsgIds.MSG_ID_DD_UI_NVM_GET_SERVICE_RECORD_RESPONSE.value, + function = self._handler_service_record_sync) + self.can_interface.register_receiving_publication_function(channel_id = CanChannels.dd_sync_broadcast_ch_id, + message_id = MsgIds.MSG_ID_DD_UI_NVM_GET_PRESSURE_SENSOR_CAL_RECORD_RESPONSE.value, + function = self._handler_calibration_record_pres_sensor_sync) + self.can_interface.register_receiving_publication_function(channel_id = CanChannels.dd_sync_broadcast_ch_id, + message_id = MsgIds.MSG_ID_DD_UI_NVM_GET_TEMPERATURE_SENSOR_CAL_RECORD_RESPONSE.value, + function = self._handler_calibration_record_temp_sensor_sync) + self.can_interface.register_receiving_publication_function(channel_id = CanChannels.dd_sync_broadcast_ch_id, + message_id = MsgIds.MSG_ID_DD_UI_NVM_GET_CONC_PUMP_CAL_RECORD_RESPONSE.value, + function = self._handler_calibration_record_conc_pump_sync) + self.can_interface.register_receiving_publication_function(channel_id = CanChannels.dd_sync_broadcast_ch_id, + message_id = MsgIds.MSG_ID_DD_UI_NVM_GET_D12_PUMP_CAL_RECORD_RESPONSE.value, + function = self._handler_calibration_record_dial_pump_d12_sync) + self.can_interface.register_receiving_publication_function(channel_id = CanChannels.dd_sync_broadcast_ch_id, + message_id = MsgIds.MSG_ID_DD_UI_NVM_GET_D48_PUMP_CAL_RECORD_RESPONSE.value, + function = self._handler_calibration_record_dial_pump_d48_sync) + self.can_interface.register_receiving_publication_function(channel_id = CanChannels.dd_sync_broadcast_ch_id, + message_id = MsgIds.MSG_ID_DD_UI_NVM_GET_ACID_CONC_CAL_RECORD_RESPONSE.value, + function = self._handler_calibration_record_acid_conc_sync) + self.can_interface.register_receiving_publication_function(channel_id = CanChannels.dd_sync_broadcast_ch_id, + message_id = MsgIds.MSG_ID_DD_UI_NVM_GET_BICARB_CONC_CAL_RECORD_RESPONSE.value, + function = self._handler_calibration_record_bicarb_conc_sync) + self.can_interface.register_receiving_publication_function(channel_id = CanChannels.dd_sync_broadcast_ch_id, + message_id = MsgIds.MSG_ID_DD_UI_NVM_GET_ACCEL_SENSOR_CAL_RECORD_RESPONSE.value, + function = self._handler_calibration_record_accelerometer_sync) + self.can_interface.register_receiving_publication_function(channel_id = CanChannels.dd_sync_broadcast_ch_id, + message_id = MsgIds.MSG_ID_DD_UI_NVM_GET_BLOOD_LEAK_SENSOR_CAL_RECORD_RESPONSE.value, + function = self._handler_calibration_record_blood_leak_sync) + self.can_interface.register_receiving_publication_function(channel_id = CanChannels.dd_sync_broadcast_ch_id, + message_id = MsgIds.MSG_ID_DD_UI_NVM_GET_CONDUCTIVITY_SENSOR_CAL_RECORD_RESPONSE.value, + function = self._handler_calibration_record_cond_sensor_sync) + self.can_interface.register_receiving_publication_function(channel_id = CanChannels.dd_sync_broadcast_ch_id, + message_id = MsgIds.MSG_ID_DD_UI_NVM_GET_INSTIT_BASIC_RECORD_RESPONSE.value, + function = self._handler_institutional_basic_record_sync) + self.can_interface.register_receiving_publication_function(channel_id = CanChannels.dd_sync_broadcast_ch_id, + message_id = MsgIds.MSG_ID_DD_UI_NVM_GET_INSTIT_ADVANCED_RECORD_RESPONSE.value, + function = self._handler_institutional_adv_record_sync) + self.can_interface.register_receiving_publication_function(channel_id = CanChannels.dd_sync_broadcast_ch_id, + message_id = MsgIds.MSG_ID_DD_UI_NVM_GET_INSTIT_ADDITIONAL_RECORD_RESPONSE.value, + function = self._handler_institutional_add_record_sync) + self.can_interface.register_receiving_publication_function(channel_id = CanChannels.dd_sync_broadcast_ch_id, + message_id = MsgIds.MSG_ID_DD_UI_NVM_GET_USAGE_INFO_RECORD_RESPONSE.value, + function = self._handler_usage_info_record_sync) + + # Passing the arguments over to the next class too + super().__init__(*args, **kwargs) + + + +# ================================================= CAN Message Handler Methods ================================================= + @publish([MsgIds.MSG_ID_DD_UI_NVM_GET_SYSTEM_RECORD_RESPONSE.name.lower(), "get_system_rec_ack", "get_system_rec_rr", "system_records", "get_system_rec_timestamp"]) + def _handler_system_record_sync(self, message, timestamp = 0.0): + """ + Handles published DD System Record data messages. + DD System Records are captured for reference. + + @param message: published data message + @return: none + """ + msg_list = [] + msg_list.append((type(self).get_system_rec_ack, DataTypes.BOOL)) + msg_list.append((type(self).get_system_rec_rr, DataTypes.U32)) + for member in dd_enum_repository.DDSystemRecordFields: + if member is not dd_enum_repository.DDSystemRecordFields.NUM_OF_SYSTEM_RECORD_FIELDS: + msg_list.append((self.system_records, member.name, member.datatype(), member.multichar_length())) + + self.process_into_vars(decoder_list = msg_list, message = message) + + # Convert to enum + if isinstance(self.get_system_rec_rr, int): + self.get_system_rec_rr = RequestRejectReasons(self.get_system_rec_rr) + self.get_system_rec_timestamp = timestamp + + + @publish([MsgIds.MSG_ID_DD_UI_NVM_GET_SERVICE_RECORD_RESPONSE.name.lower(), "get_service_rec_ack", "get_service_rec_rr", "service_records", "get_service_rec_timestamp"]) + def _handler_service_record_sync(self, message, timestamp = 0.0): + """ + Handles published DD Service Record data messages. + DD Service Records are captured for reference. + + @param message: published data message + @return: none + """ + msg_list = [] + msg_list.append((type(self).get_service_rec_ack, DataTypes.BOOL)) + msg_list.append((type(self).get_service_rec_rr, DataTypes.U32)) + for member in dd_enum_repository.DDServiceRecordFields: + if member is not dd_enum_repository.DDServiceRecordFields.NUM_OF_SERVICE_RECORD_FIELDS: + msg_list.append((self.service_records, member.name, member.datatype())) + + self.process_into_vars(decoder_list = msg_list, message = message) + + # Convert to enum + if isinstance(self.get_service_rec_rr, int): + self.get_service_rec_rr = RequestRejectReasons(self.get_service_rec_rr) + self.get_service_rec_timestamp = timestamp + + + @publish([MsgIds.MSG_ID_DD_UI_NVM_GET_PRESSURE_SENSOR_CAL_RECORD_RESPONSE.name.lower(), "get_calibration_rec_ack", "get_calibration_rec_rr", "calibration_records", "get_calibration_rec_timestamp"]) + def _handler_calibration_record_pres_sensor_sync(self, message, timestamp = 0.0): + """ + Handles published DD Calibration Record Pressure Sensor Details data messages. + DD Calibration Records Pressure Sensor Details are captured for reference. + + @param message: published data message + @return: none + """ + acceptance = LocalVars('acceptance') + reject_reason = LocalVars('reject_reason') + sensor_id = LocalVars('sensor_id') + gain = LocalVars(dd_enum_repository.DDCalibRecordSensorFields.GAIN.name) + offset = LocalVars(dd_enum_repository.DDCalibRecordSensorFields.OFFSET.name) + calibration_time = LocalVars(dd_enum_repository.DDCalibRecordSensorFields.CALIBRATION_TIME.name) + + msg_list = [] + msg_list.append((acceptance, DataTypes.BOOL)) + msg_list.append((reject_reason, DataTypes.U32)) + msg_list.append((sensor_id, DataTypes.U32)) + msg_list.append((gain, DataTypes.F32)) + msg_list.append((offset, DataTypes.F32)) + msg_list.append((calibration_time, DataTypes.U32)) + + self.process_into_vars(decoder_list = msg_list, message = message) + + # Get the Pressure Sensor Name + if sensor_id.value < dd_enum_repository.DDPressureSensorNames.NUM_OF_PRESSURE_SENSORS.value: + sensor_name = dd_enum_repository.DDPressureSensorNames(sensor_id.value).name + else: + sensor_name = fp_enum_repository.FPPressureSensorNames(sensor_id.value - dd_enum_repository.DDPressureSensorNames.NUM_OF_PRESSURE_SENSORS.value).name + + # Saving into the calibration data + if acceptance.value: + self.calibration_records[f'PRES__{sensor_name}__{gain.name}'] = gain.value + self.calibration_records[f'PRES__{sensor_name}__{offset.name}'] = offset.value + self.calibration_records[f'PRES__{sensor_name}__{calibration_time.name}'] = calibration_time.value + else: + self.get_calibration_rec_ack[f'PRES__{sensor_name}'] = acceptance.value + self.get_calibration_rec_rr[f'PRES__{sensor_name}'] = RequestRejectReasons(reject_reason.value) + self.get_calibration_rec_timestamp = timestamp + + + @publish([MsgIds.MSG_ID_DD_UI_NVM_GET_TEMPERATURE_SENSOR_CAL_RECORD_RESPONSE.name.lower(), "get_calibration_rec_ack", "get_calibration_rec_rr", "calibration_records", "get_calibration_rec_timestamp"]) + def _handler_calibration_record_temp_sensor_sync(self, message, timestamp = 0.0): + """ + Handles published DD Calibration Record Temperature Sensor Details data messages. + DD Calibration Records Temperature Sensor Details are captured for reference. + + @param message: published data message + @return: none + """ + acceptance = LocalVars('acceptance') + reject_reason = LocalVars('reject_reason') + sensor_id = LocalVars('sensor_id') + gain = LocalVars(dd_enum_repository.DDCalibRecordSensorFields.GAIN.name) + offset = LocalVars(dd_enum_repository.DDCalibRecordSensorFields.OFFSET.name) + calibration_time = LocalVars(dd_enum_repository.DDCalibRecordSensorFields.CALIBRATION_TIME.name) + + msg_list = [] + msg_list.append((acceptance, DataTypes.BOOL)) + msg_list.append((reject_reason, DataTypes.U32)) + msg_list.append((sensor_id, DataTypes.U32)) + msg_list.append((gain, DataTypes.F32)) + msg_list.append((offset, DataTypes.F32)) + msg_list.append((calibration_time, DataTypes.U32)) + + self.process_into_vars(decoder_list = msg_list, message = message) + + # Get the Temperature Sensor Name + sensor_name = dd_enum_repository.DDTemperatureSensorNames(sensor_id.value).name + + # Saving into the calibration data + if acceptance.value: + self.calibration_records[f'TEMP__{sensor_name}__{gain.name}'] = gain.value + self.calibration_records[f'TEMP__{sensor_name}__{offset.name}'] = offset.value + self.calibration_records[f'TEMP__{sensor_name}__{calibration_time.name}'] = calibration_time.value + else: + self.get_calibration_rec_ack[f'TEMP__{sensor_name}'] = acceptance.value + self.get_calibration_rec_rr[f'TEMP__{sensor_name}'] = RequestRejectReasons(reject_reason.value) + self.get_calibration_rec_timestamp = timestamp + + + @publish([MsgIds.MSG_ID_DD_UI_NVM_GET_CONC_PUMP_CAL_RECORD_RESPONSE.name.lower(), "get_calibration_rec_ack", "get_calibration_rec_rr", "calibration_records", "get_calibration_rec_timestamp"]) + def _handler_calibration_record_conc_pump_sync(self, message, timestamp = 0.0): + """ + Handles published DD Calibration Record Concentrate Pump Details data messages. + DD Calibration Records Concentrate Pump Details are captured for reference. + + @param message: published data message + @return: none + """ + acceptance = LocalVars('acceptance') + reject_reason = LocalVars('reject_reason') + sensor_id = LocalVars('sensor_id') + gain = LocalVars(dd_enum_repository.DDCalibRecordSensorFields.GAIN.name) + offset = LocalVars(dd_enum_repository.DDCalibRecordSensorFields.OFFSET.name) + calibration_time = LocalVars(dd_enum_repository.DDCalibRecordSensorFields.CALIBRATION_TIME.name) + + msg_list = [] + msg_list.append((acceptance, DataTypes.BOOL)) + msg_list.append((reject_reason, DataTypes.U32)) + msg_list.append((sensor_id, DataTypes.U32)) + msg_list.append((gain, DataTypes.F32)) + msg_list.append((offset, DataTypes.F32)) + msg_list.append((calibration_time, DataTypes.U32)) + + self.process_into_vars(decoder_list = msg_list, message = message) + + # Get the Concentrate Pump Name + pump_name = dd_enum_repository.DDConcentratePumpNames(sensor_id.value).name + + # Saving into the calibration data + if acceptance.value: + self.calibration_records[f'CONC__{pump_name}__{gain.name}'] = gain.value + self.calibration_records[f'CONC__{pump_name}__{offset.name}'] = offset.value + self.calibration_records[f'CONC__{pump_name}__{calibration_time.name}'] = calibration_time.value + else: + self.get_calibration_rec_ack[f'CONC__{pump_name}'] = acceptance.value + self.get_calibration_rec_rr[f'CONC__{pump_name}'] = RequestRejectReasons(reject_reason.value) + self.get_calibration_rec_timestamp = timestamp + + + @publish([MsgIds.MSG_ID_DD_UI_NVM_GET_D12_PUMP_CAL_RECORD_RESPONSE.name.lower(), "get_calibration_rec_ack", "get_calibration_rec_rr", "calibration_records", "get_calibration_rec_timestamp"]) + def _handler_calibration_record_dial_pump_d12_sync(self, message, timestamp = 0.0): + """ + Handles published DD Calibration Record Dialysate Pump D12 Details data messages. + DD Calibration Records Dialysate Pump D12 Details are captured for reference. + + @param message: published data message + @return: none + """ + acceptance = LocalVars('acceptance') + reject_reason = LocalVars('reject_reason') + target_speed = LocalVars('TARGET_SPEED') + calibration_time = LocalVars(dd_enum_repository.DDCalibRecordSensorFields.CALIBRATION_TIME.name) + + msg_list = [] + msg_list.append((acceptance, DataTypes.BOOL)) + msg_list.append((reject_reason, DataTypes.U32)) + msg_list.append((target_speed, DataTypes.F32)) + msg_list.append((calibration_time, DataTypes.U32)) + + self.process_into_vars(decoder_list = msg_list, message = message) + + # Get the Dialysate Pump Name + pump_name = dd_enum_repository.DDDialysatePumpNames.D12_PUMP.name + + # Saving into the calibration data + if acceptance.value: + self.calibration_records[f'DIAL__{pump_name}__{target_speed.name}'] = target_speed.value + self.calibration_records[f'DIAL__{pump_name}__{calibration_time.name}'] = calibration_time.value + else: + self.get_calibration_rec_ack[f'DIAL__{pump_name}'] = acceptance.value + self.get_calibration_rec_rr[f'DIAL__{pump_name}'] = RequestRejectReasons(reject_reason.value) + self.get_calibration_rec_timestamp = timestamp + + + @publish([MsgIds.MSG_ID_DD_UI_NVM_GET_D48_PUMP_CAL_RECORD_RESPONSE.name.lower(), "get_calibration_rec_ack", "get_calibration_rec_rr", "calibration_records", "get_calibration_rec_timestamp"]) + def _handler_calibration_record_dial_pump_d48_sync(self, message, timestamp = 0.0): + """ + Handles published DD Calibration Record Dialysate Pump D48 Details data messages. + DD Calibration Records Dialysate Pump D48 Details are captured for reference. + + @param message: published data message + @return: none + """ + acceptance = LocalVars('acceptance') + reject_reason = LocalVars('reject_reason') + gain = LocalVars(dd_enum_repository.DDCalibRecordSensorFields.GAIN.name) + offset = LocalVars(dd_enum_repository.DDCalibRecordSensorFields.OFFSET.name) + calibration_time = LocalVars(dd_enum_repository.DDCalibRecordSensorFields.CALIBRATION_TIME.name) + + msg_list = [] + msg_list.append((acceptance, DataTypes.BOOL)) + msg_list.append((reject_reason, DataTypes.U32)) + msg_list.append((gain, DataTypes.F32)) + msg_list.append((offset, DataTypes.F32)) + msg_list.append((calibration_time, DataTypes.U32)) + + self.process_into_vars(decoder_list = msg_list, message = message) + + # Get the Dialysate Pump Name + pump_name = dd_enum_repository.DDDialysatePumpNames.D48_PUMP.name + + # Saving into the calibration data + if acceptance.value: + self.calibration_records[f'DIAL__{pump_name}__{gain.name}'] = gain.value + self.calibration_records[f'DIAL__{pump_name}__{offset.name}'] = offset.value + self.calibration_records[f'DIAL__{pump_name}__{calibration_time.name}'] = calibration_time.value + else: + self.get_calibration_rec_ack[f'DIAL__{pump_name}'] = acceptance.value + self.get_calibration_rec_rr[f'DIAL__{pump_name}'] = RequestRejectReasons(reject_reason.value) + self.get_calibration_rec_timestamp = timestamp + + + @publish([MsgIds.MSG_ID_DD_UI_NVM_GET_ACID_CONC_CAL_RECORD_RESPONSE.name.lower(), "get_calibration_rec_ack", "get_calibration_rec_rr", "calibration_records", "get_calibration_rec_timestamp"]) + def _handler_calibration_record_acid_conc_sync(self, message, timestamp = 0.0): + """ + Handles published DD Calibration Record Acid Concentrate Details data messages. + DD Calibration Records Acid Concentrate Details are captured for reference. + + @param message: published data message + @return: none + """ + acceptance = LocalVars('acceptance') + reject_reason = LocalVars('reject_reason') + conc_id = LocalVars('conc_id') + mix_ratio = LocalVars(dd_enum_repository.DDCalibRecordConcentrateFields.CONCENTRATE_MIX_RATIO.name) + volume = LocalVars(dd_enum_repository.DDCalibRecordConcentrateFields.FULL_BOTTLE_VOLUME_ML.name) + conductivity = LocalVars(dd_enum_repository.DDCalibRecordConcentrateFields.CONDUCTIVITY_USPCM.name) + temperature = LocalVars(dd_enum_repository.DDCalibRecordConcentrateFields.BOTTLE_TEMPERATURE_C.name) + calibration_time = LocalVars(dd_enum_repository.DDCalibRecordConcentrateFields.CALIBRATION_TIME.name) + + msg_list = [] + msg_list.append((acceptance, DataTypes.BOOL)) + msg_list.append((reject_reason, DataTypes.U32)) + msg_list.append((conc_id, DataTypes.U32)) + msg_list.append((mix_ratio, DataTypes.F32)) + msg_list.append((volume, DataTypes.F32)) + msg_list.append((conductivity, DataTypes.F32)) + msg_list.append((temperature, DataTypes.F32)) + msg_list.append((calibration_time, DataTypes.U32)) + + self.process_into_vars(decoder_list = msg_list, message = message) + + # Get the Acid Concentrate's Name + acid_name = disp_enum_repository.AcidTypes(conc_id.value).name + + # Saving into the calibration data + if acceptance.value: + self.calibration_records[f'ACID__{acid_name}__{mix_ratio.name}'] = mix_ratio.value + self.calibration_records[f'ACID__{acid_name}__{volume.name}'] = volume.value + self.calibration_records[f'ACID__{acid_name}__{conductivity.name}'] = conductivity.value + self.calibration_records[f'ACID__{acid_name}__{temperature.name}'] = temperature.value + self.calibration_records[f'ACID__{acid_name}__{calibration_time.name}'] = calibration_time.value + else: + self.get_calibration_rec_ack[f'ACID__{acid_name}'] = acceptance.value + self.get_calibration_rec_rr[f'ACID__{acid_name}'] = RequestRejectReasons(reject_reason.value) + self.get_calibration_rec_timestamp = timestamp + + + @publish([MsgIds.MSG_ID_DD_UI_NVM_GET_BICARB_CONC_CAL_RECORD_RESPONSE.name.lower(), "get_calibration_rec_ack", "get_calibration_rec_rr", "calibration_records", "get_calibration_rec_timestamp"]) + def _handler_calibration_record_bicarb_conc_sync(self, message, timestamp = 0.0): + """ + Handles published DD Calibration Record Bicarb Concentrate Details data messages. + DD Calibration Records Bicarb Concentrate Details are captured for reference. + + @param message: published data message + @return: none + """ + acceptance = LocalVars('acceptance') + reject_reason = LocalVars('reject_reason') + conc_id = LocalVars('conc_id') + mix_ratio = LocalVars(dd_enum_repository.DDCalibRecordConcentrateFields.CONCENTRATE_MIX_RATIO.name) + volume = LocalVars(dd_enum_repository.DDCalibRecordConcentrateFields.FULL_BOTTLE_VOLUME_ML.name) + conductivity = LocalVars(dd_enum_repository.DDCalibRecordConcentrateFields.CONDUCTIVITY_USPCM.name) + temperature = LocalVars(dd_enum_repository.DDCalibRecordConcentrateFields.BOTTLE_TEMPERATURE_C.name) + calibration_time = LocalVars(dd_enum_repository.DDCalibRecordConcentrateFields.CALIBRATION_TIME.name) + + msg_list = [] + msg_list.append((acceptance, DataTypes.BOOL)) + msg_list.append((reject_reason, DataTypes.U32)) + msg_list.append((conc_id, DataTypes.U32)) + msg_list.append((mix_ratio, DataTypes.F32)) + msg_list.append((volume, DataTypes.F32)) + msg_list.append((conductivity, DataTypes.F32)) + msg_list.append((temperature, DataTypes.F32)) + msg_list.append((calibration_time, DataTypes.U32)) + + self.process_into_vars(decoder_list = msg_list, message = message) + + # Get the Bicarb Concentrate's Name + bicarb_name = disp_enum_repository.AcidTypes(conc_id.value).name + + # Saving into the calibration data + if acceptance.value: + self.calibration_records[f'BICARB__{bicarb_name}__{mix_ratio.name}'] = mix_ratio.value + self.calibration_records[f'BICARB__{bicarb_name}__{volume.name}'] = volume.value + self.calibration_records[f'BICARB__{bicarb_name}__{conductivity.name}'] = conductivity.value + self.calibration_records[f'BICARB__{bicarb_name}__{temperature.name}'] = temperature.value + self.calibration_records[f'BICARB__{bicarb_name}__{calibration_time.name}'] = calibration_time.value + else: + self.get_calibration_rec_ack[f'BICARB__{bicarb_name}'] = acceptance.value + self.get_calibration_rec_rr[f'BICARB__{bicarb_name}'] = RequestRejectReasons(reject_reason.value) + self.get_calibration_rec_timestamp = timestamp + + + @publish([MsgIds.MSG_ID_DD_UI_NVM_GET_ACCEL_SENSOR_CAL_RECORD_RESPONSE.name.lower(), "get_calibration_rec_ack", "get_calibration_rec_rr", "calibration_records", "get_calibration_rec_timestamp"]) + def _handler_calibration_record_accelerometer_sync(self, message, timestamp = 0.0): + """ + Handles published DD Calibration Record Accelerometer Details data messages. + DD Calibration Records Accelerometer Details are captured for reference. + + @param message: published data message + @return: none + """ + acceptance = LocalVars('acceptance') + reject_reason = LocalVars('reject_reason') + accel_x = LocalVars(dd_enum_repository.DDCalibRecordAccelerometerFields.ACCEL_X_OFFSET.name) + accel_y = LocalVars(dd_enum_repository.DDCalibRecordAccelerometerFields.ACCEL_Y_OFFSET.name) + accel_z = LocalVars(dd_enum_repository.DDCalibRecordAccelerometerFields.ACCEL_Z_OFFSET.name) + calibration_time = LocalVars(dd_enum_repository.DDCalibRecordAccelerometerFields.CALIBRATION_TIME.name) + + msg_list = [] + msg_list.append((acceptance, DataTypes.BOOL)) + msg_list.append((reject_reason, DataTypes.U32)) + msg_list.append((accel_x, DataTypes.F32)) + msg_list.append((accel_y, DataTypes.F32)) + msg_list.append((accel_z, DataTypes.F32)) + msg_list.append((calibration_time, DataTypes.U32)) + + self.process_into_vars(decoder_list = msg_list, message = message) + + # Saving into the calibration data + if acceptance.value: + self.calibration_records[f'ACCEL__{accel_x.name}'] = accel_x.value + self.calibration_records[f'ACCEL__{accel_y.name}'] = accel_y.value + self.calibration_records[f'ACCEL__{accel_z.name}'] = accel_z.value + self.calibration_records[f'ACCEL__{calibration_time.name}'] = calibration_time.value + else: + self.get_calibration_rec_ack[f'ACCEL'] = acceptance.value + self.get_calibration_rec_rr[f'ACCEL'] = RequestRejectReasons(reject_reason.value) + self.get_calibration_rec_timestamp = timestamp + + + @publish([MsgIds.MSG_ID_DD_UI_NVM_GET_BLOOD_LEAK_SENSOR_CAL_RECORD_RESPONSE.name.lower(), "get_calibration_rec_ack", "get_calibration_rec_rr", "calibration_records", "get_calibration_rec_timestamp"]) + def _handler_calibration_record_blood_leak_sync(self, message, timestamp = 0.0): + """ + Handles published DD Calibration Record Blood Leak Details data messages. + DD Calibration Records Blood Leak Details are captured for reference. + + @param message: published data message + @return: none + """ + acceptance = LocalVars('acceptance') + reject_reason = LocalVars('reject_reason') + set_point = LocalVars(dd_enum_repository.DDCalibRecordBloodLeakFields.SET_POINT.name) + calibration_time = LocalVars(dd_enum_repository.DDCalibRecordBloodLeakFields.CALIBRATION_TIME.name) + + msg_list = [] + msg_list.append((acceptance, DataTypes.BOOL)) + msg_list.append((reject_reason, DataTypes.U32)) + msg_list.append((set_point, DataTypes.U32)) + msg_list.append((calibration_time, DataTypes.U32)) + + self.process_into_vars(decoder_list = msg_list, message = message) + + # Saving into the calibration data + if acceptance.value: + self.calibration_records[f'BLOOD_LEAK__{set_point.name}'] = set_point.value + self.calibration_records[f'BLOOD_LEAK__{calibration_time.name}'] = calibration_time.value + else: + self.get_calibration_rec_ack[f'BLOOD_LEAK'] = acceptance.value + self.get_calibration_rec_rr[f'BLOOD_LEAK'] = RequestRejectReasons(reject_reason.value) + self.get_calibration_rec_timestamp = timestamp + + + @publish([MsgIds.MSG_ID_DD_UI_NVM_GET_CONDUCTIVITY_SENSOR_CAL_RECORD_RESPONSE.name.lower(), "get_calibration_rec_ack", "get_calibration_rec_rr", "calibration_records", "get_calibration_rec_timestamp"]) + def _handler_calibration_record_cond_sensor_sync(self, message, timestamp = 0.0): + """ + Handles published DD Calibration Record Conductivity Sensors Details data messages. + DD Calibration RecordsConductivity Sensors Details are captured for reference. + + @param message: published data message + @return: none + """ + acceptance = LocalVars('acceptance') + reject_reason = LocalVars('reject_reason') + sensor_id = LocalVars('sensor_id') + k_high = LocalVars(dd_enum_repository.DDCalibRecordConductivityFields.K_HIGH.name) + alpha_high = LocalVars(dd_enum_repository.DDCalibRecordConductivityFields.ALPHA_HIGH.name) + eta_high = LocalVars(dd_enum_repository.DDCalibRecordConductivityFields.ETA_HIGH.name) + zeta_high = LocalVars(dd_enum_repository.DDCalibRecordConductivityFields.ZETA_HIGH.name) + k_low = LocalVars(dd_enum_repository.DDCalibRecordConductivityFields.K_LOW.name) + alpha_low = LocalVars(dd_enum_repository.DDCalibRecordConductivityFields.ALPHA_LOW.name) + eta_low = LocalVars(dd_enum_repository.DDCalibRecordConductivityFields.ETA_LOW.name) + zeta_low = LocalVars(dd_enum_repository.DDCalibRecordConductivityFields.ZETA_LOW.name) + beta = LocalVars(dd_enum_repository.DDCalibRecordConductivityFields.BETA.name) + delta = LocalVars(dd_enum_repository.DDCalibRecordConductivityFields.DELTA.name) + rsrvd_1 = LocalVars(dd_enum_repository.DDCalibRecordConductivityFields.RSRVD_1.name) + rsrvd_2 = LocalVars(dd_enum_repository.DDCalibRecordConductivityFields.RSRVD_2.name) + calibration_time = LocalVars(dd_enum_repository.DDCalibRecordBloodLeakFields.CALIBRATION_TIME.name) + + msg_list = [] + msg_list.append((acceptance, DataTypes.BOOL)) + msg_list.append((reject_reason, DataTypes.U32)) + msg_list.append((sensor_id, DataTypes.U32)) + msg_list.append((k_high, DataTypes.F32)) + msg_list.append((alpha_high, DataTypes.F32)) + msg_list.append((eta_high, DataTypes.F32)) + msg_list.append((zeta_high, DataTypes.F32)) + msg_list.append((k_low, DataTypes.F32)) + msg_list.append((alpha_low, DataTypes.F32)) + msg_list.append((eta_low, DataTypes.F32)) + msg_list.append((zeta_low, DataTypes.F32)) + msg_list.append((beta, DataTypes.F32)) + msg_list.append((delta, DataTypes.F32)) + msg_list.append((rsrvd_1, DataTypes.F32)) + msg_list.append((rsrvd_2, DataTypes.F32)) + msg_list.append((calibration_time, DataTypes.U32)) + + self.process_into_vars(decoder_list = msg_list, message = message) + + # Get the Conductivity Sensor Name + if sensor_id.value < dd_enum_repository.DDConductivitySensorNames.NUM_OF_CONDUCTIVITY_SENSORS.value: + sensor_name = dd_enum_repository.DDConductivitySensorNames(sensor_id.value).name + else: + sensor_name = fp_enum_repository.FPConductivitySensorNames(sensor_id.value - dd_enum_repository.DDConductivitySensorNames.NUM_OF_CONDUCTIVITY_SENSORS.value).name + + # Saving into the calibration data + if acceptance.value: + self.calibration_records[f'COND__{sensor_name}__{k_high.name}'] = k_high.value + self.calibration_records[f'COND__{sensor_name}__{alpha_high.name}'] = alpha_high.value + self.calibration_records[f'COND__{sensor_name}__{eta_high.name}'] = eta_high.value + self.calibration_records[f'COND__{sensor_name}__{zeta_high.name}'] = zeta_high.value + self.calibration_records[f'COND__{sensor_name}__{k_low.name}'] = k_low.value + self.calibration_records[f'COND__{sensor_name}__{alpha_low.name}'] = alpha_low.value + self.calibration_records[f'COND__{sensor_name}__{eta_low.name}'] = eta_low.value + self.calibration_records[f'COND__{sensor_name}__{zeta_low.name}'] = zeta_low.value + self.calibration_records[f'COND__{sensor_name}__{beta.name}'] = beta.value + self.calibration_records[f'COND__{sensor_name}__{delta.name}'] = delta.value + self.calibration_records[f'COND__{sensor_name}__{rsrvd_1.name}'] = rsrvd_1.value + self.calibration_records[f'COND__{sensor_name}__{rsrvd_2.name}'] = rsrvd_2.value + self.calibration_records[f'COND__{sensor_name}__{calibration_time.name}'] = calibration_time.value + else: + self.get_calibration_rec_ack[f'COND__{sensor_name}'] = acceptance.value + self.get_calibration_rec_rr[f'COND__{sensor_name}'] = RequestRejectReasons(reject_reason.value) + self.get_calibration_rec_timestamp = timestamp + + + @publish([MsgIds.MSG_ID_DD_UI_NVM_GET_INSTIT_BASIC_RECORD_RESPONSE.name.lower(), "get_institutional_rec_ack", "get_institutional_rec_rr", "institutional_records", "get_institutional_rec_timestamp"]) + def _handler_institutional_basic_record_sync(self, message, timestamp = 0.0): + """ + Handles published DD Institutional Record Basic details data messages. + DD Institutional Records are captured for reference. + + @param message: published data message + @return: none + """ + acceptance = LocalVars('acceptance') + reject_reason = LocalVars('reject_reason') + + msg_list = [] + msg_list.append((acceptance, DataTypes.BOOL)) + msg_list.append((reject_reason, DataTypes.U32)) + for member in dd_enum_repository.DDInstitutionalRecordBasicFields: + if member is not dd_enum_repository.DDInstitutionalRecordBasicFields.NUM_OF_INSTITUTIONAL_RECORD_BASIC_FIELDS: + msg_list.append((self.institutional_records, f'BASIC__{member.name}', member.datatype())) + + self.process_into_vars(decoder_list = msg_list, message = message) + + # Convert to enum + if isinstance(self.get_institutional_rec_rr, int): + self.get_institutional_rec_rr['BASIC'] = RequestRejectReasons(self.get_institutional_rec_rr) + self.get_institutional_rec_ack['BASIC'] = acceptance.value + self.get_institutional_rec_timestamp = timestamp + + + @publish([MsgIds.MSG_ID_DD_UI_NVM_GET_INSTIT_ADVANCED_RECORD_RESPONSE.name.lower(), "get_institutional_rec_ack", "get_institutional_rec_rr", "institutional_records", "get_institutional_rec_timestamp"]) + def _handler_institutional_adv_record_sync(self, message, timestamp = 0.0): + """ + Handles published DD Institutional Record Advanced details data messages. + DD Institutional Records are captured for reference. + + @param message: published data message + @return: none + """ + acceptance = LocalVars('acceptance') + reject_reason = LocalVars('reject_reason') + + msg_list = [] + msg_list.append((acceptance, DataTypes.BOOL)) + msg_list.append((reject_reason, DataTypes.U32)) + for member in dd_enum_repository.DDInstitutionalRecordAdvancedFields: + if member is not dd_enum_repository.DDInstitutionalRecordAdvancedFields.NUM_OF_INSTITUTIONAL_RECORD_ADVANCED_FIELDS: + msg_list.append((self.institutional_records, f'ADV__{member.name}', member.datatype())) + + self.process_into_vars(decoder_list = msg_list, message = message) + + # Convert to enum + if isinstance(self.get_institutional_rec_rr, int): + self.get_institutional_rec_rr['ADV'] = RequestRejectReasons(self.get_institutional_rec_rr) + self.get_institutional_rec_ack['ADV'] = acceptance.value + self.get_institutional_rec_timestamp = timestamp + + + @publish([MsgIds.MSG_ID_DD_UI_NVM_GET_INSTIT_ADDITIONAL_RECORD_RESPONSE.name.lower(), "get_institutional_rec_ack", "get_institutional_rec_rr", "institutional_records", "get_institutional_rec_timestamp"]) + def _handler_institutional_add_record_sync(self, message, timestamp = 0.0): + """ + Handles published DD Institutional Record Additional details data messages. + DD Institutional Records are captured for reference. + + @param message: published data message + @return: none + """ + acceptance = LocalVars('acceptance') + reject_reason = LocalVars('reject_reason') + + msg_list = [] + msg_list.append((acceptance, DataTypes.BOOL)) + msg_list.append((reject_reason, DataTypes.U32)) + for member in dd_enum_repository.DDInstitutionalRecordAdditionalFields: + if member is not dd_enum_repository.DDInstitutionalRecordAdditionalFields.NUM_OF_INSTITUTIONAL_RECORD_ADDITIONAL_FIELDS: + msg_list.append((self.institutional_records, f'ADD__{member.name}', member.datatype())) + + self.process_into_vars(decoder_list = msg_list, message = message) + + # Convert to enum + if isinstance(self.get_institutional_rec_rr, int): + self.get_institutional_rec_rr['ADD'] = RequestRejectReasons(self.get_institutional_rec_rr) + self.get_institutional_rec_ack['ADD'] = acceptance.value + self.get_institutional_rec_timestamp = timestamp + + + @publish([MsgIds.MSG_ID_DD_UI_NVM_GET_USAGE_INFO_RECORD_RESPONSE.name.lower(), "get_usage_info_rec_ack", "get_usage_info_rec_rr", "usage_info_records", "get_usage_info_rec_timestamp"]) + def _handler_usage_info_record_sync(self, message, timestamp = 0.0): + """ + Handles published DD Usage Information Record data messages. + DD Usage Information Records are captured for reference. + + @param message: published data message + @return: none + """ + msg_list = [] + msg_list.append((type(self).get_usage_info_rec_ack, DataTypes.BOOL)) + msg_list.append((type(self).get_usage_info_rec_rr, DataTypes.U32)) + for member in dd_enum_repository.DDUsageInformationRecordFields: + if member is not dd_enum_repository.DDUsageInformationRecordFields.NUM_OF_USAGE_INFO_RECORD_FIELDS: + msg_list.append((self.usage_info_records, member.name, member.datatype())) + + self.process_into_vars(decoder_list = msg_list, message = message) + + # Convert to enum + if isinstance(self.get_usage_info_rec_rr, int): + self.get_usage_info_rec_rr = RequestRejectReasons(self.get_usage_info_rec_rr) + self.get_usage_info_rec_timestamp = timestamp Index: leahi_dialin/dd/modules/records_set_requests.py =================================================================== diff -u --- leahi_dialin/dd/modules/records_set_requests.py (revision 0) +++ leahi_dialin/dd/modules/records_set_requests.py (revision f1cb03cd999ccce88151a2e6c29c19b00a6e8d54) @@ -0,0 +1,751 @@ +########################################################################### +# +# Copyright (c) 2020-2024 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 records_set_requests.py +# +# @author (last) Zoltan Miskolci +# @date (last) 04-Aug-2026 +# @author (original) Zoltan Miskolci +# @date (original) 04-Aug-2026 +# +############################################################################ + +# Module imports +from functools import partial +from time import sleep + +# Project imports +from leahi_dialin.common import dd_enum_repository, disp_enum_repository, fp_enum_repository +from leahi_dialin.common.msg_ids import MsgIds +from leahi_dialin.common.override_templates import cmd_generic_override +from leahi_dialin.protocols.CAN import CanChannels +from leahi_dialin.utils.abstract_classes import AbstractSubSystem +from leahi_dialin.utils.enums import DialinEnum +from leahi_dialin.utils.conversions import integer_to_bytearray, float_to_bytearray, byte_to_bytearray, string_to_bytearray + + +class DDRecordsSetRequests(AbstractSubSystem): + """ + Part of the DD Records + """ + + def __init__(self, *args, **kwargs): + """ + The sub record class to handle all the set requests. + """ + # Passing the arguments over to the next class too + super().__init__(*args, **kwargs) + + + +# ================================================= Set Records Main Methods ================================================= + def cmd_set_system_records(self, + is_ro_featured: bool=False, + is_ro_featured_boost_pump: bool=False, + part_number: str='0000000000', + serial_number: str='00000000000000000000', + manufacturing_location: int=0, + manufacturing_date: int=0) -> int: + """ + Constructs and sends a command for setting the System Records. + Constraints: + Must be logged into DD. + Must be in Service mode. + + @return: 1 if successful, zero otherwise + """ + if len(part_number) != 10: + raise ValueError(f'part_number must be 10 characters, provided is: {len(part_number)}') + if len(serial_number) != 20: + raise ValueError(f'serial must be 20 characters, provided is: {len(serial_number)}') + + payload = integer_to_bytearray(is_ro_featured) + payload += integer_to_bytearray(is_ro_featured_boost_pump) + payload += string_to_bytearray(part_number) + payload += string_to_bytearray(serial_number) + payload += byte_to_bytearray(manufacturing_location) + payload += integer_to_bytearray(manufacturing_date) + + return cmd_generic_override( + payload = payload, + reset = None, + channel_id = CanChannels.dialin_to_dd_ch_id, + msg_id = MsgIds.MSG_ID_UI_DD_NVM_SET_SYSTEM_RECORD_REQUEST, + entity_name = f'New DD System Record', + override_text = 'being set', + logger = self.logger, + can_interface = self.can_interface) + + + def cmd_set_service_records(self, + is_hdf_online: bool=False, + uf_1_replacement_date: int=0, + uf_2_replacement_date: int=0, + uf_pump_tubing_replacement_date: int=0, + service_loc: int=0, + last_service_date: int=0, + service_interval_sec: int=0, + last_reset_time: int=0) -> int: + """ + Constructs and sends a command for setting the Service Records. + Constraints: + Must be logged into DD. + Must be in Service mode. + + @return: 1 if successful, zero otherwise + """ + payload = integer_to_bytearray(is_hdf_online) + payload += integer_to_bytearray(uf_1_replacement_date) + payload += integer_to_bytearray(uf_2_replacement_date) + payload += integer_to_bytearray(uf_pump_tubing_replacement_date) + payload += integer_to_bytearray(service_loc) + payload += integer_to_bytearray(last_service_date) + payload += integer_to_bytearray(service_interval_sec) + payload += integer_to_bytearray(last_reset_time) + + return cmd_generic_override( + payload = payload, + reset = None, + channel_id = CanChannels.dialin_to_dd_ch_id, + msg_id = MsgIds.MSG_ID_UI_DD_NVM_SET_SERVICE_RECORD_REQUEST, + entity_name = f'New DD Service Record', + override_text = 'being set', + logger = self.logger, + can_interface = self.can_interface) + + + def cmd_set_calibration_records(self, calibration_records: dict={}) -> int: + """ + Constructs and sends a command for setting the Calibration Records. + Constraints: + Must be logged into DD. + Must be in Service mode. + + @param calibration_records: (Dictionary) The stored and structured Calibration Records + @return: 1 if successful, zero otherwise + """ + msg_id_pairing = { + 'PRES': MsgIds.MSG_ID_UI_DD_NVM_SET_PRESSURE_SENSOR_CAL_RECORD_REQUEST, + 'TEMP': MsgIds.MSG_ID_UI_DD_NVM_SET_TEMPERATURE_SENSOR_CAL_RECORD_REQUEST, + 'CONC': MsgIds.MSG_ID_UI_DD_NVM_SET_CONC_PUMP_CAL_RECORD_REQUEST, + 'DIAL': MsgIds.MSG_ID_UI_DD_NVM_SET_D48_PUMP_CAL_RECORD_REQUEST, + 'ACID': MsgIds.MSG_ID_UI_DD_NVM_SET_ACID_CONC_CAL_RECORD_REQUEST, + 'BICARB': MsgIds.MSG_ID_UI_DD_NVM_SET_BICARB_CONC_CAL_RECORD_REQUEST, + 'ACCEL': MsgIds.MSG_ID_UI_DD_NVM_SET_ACCEL_SENSOR_CAL_RECORD_REQUEST, + 'BLOOD_LEAK': MsgIds.MSG_ID_UI_DD_NVM_SET_BLOOD_LEAK_SENSOR_CAL_RECORD_REQUEST, + 'COND': MsgIds.MSG_ID_UI_DD_NVM_SET_CONDUCTIVITY_SENSOR_CAL_RECORD_REQUEST, + } + # Make a dictionary to store all the send functions for later send + send_data = [] + checked = [] + for record_enum in dd_enum_repository.DDCalibrationRecordFields: + record_parts = record_enum.name.split('__') + group = record_parts[0] + + # If a message already sent, then just go to the next value + if 'NUM_' in group or \ + group in checked or \ + record_parts[1] in checked: + continue + + if group in ['PRES', 'TEMP', 'CONC', 'DIAL']: + # Set the sensor name + if group == 'PRES': + sensor = dd_enum_repository.DDPressureSensorNames.from_str(record_parts[1]) + if sensor is None: + sensor = fp_enum_repository.FPPressureSensorNames.from_str(record_parts[1]) + elif group == 'TEMP': + sensor = dd_enum_repository.DDTemperatureSensorNames.from_str(record_parts[1]) + elif group == 'CONC': + sensor = dd_enum_repository.DDConcentratePumpNames.from_str(record_parts[1]) + elif group == 'DIAL': + sensor = dd_enum_repository.DDDialysatePumpNames.from_str(record_parts[1]) + else: + sensor = 'UNKNOWN' + + # Set the arguments for the call + args = [] + kwargs = {} + mapping = [ + {'param_name': 'target_speed', 'entry_name': f'{group}__{sensor.name}__TARGET_SPEED' }, + {'param_name': dd_enum_repository.DDCalibRecordSensorFields.GAIN.name.lower(), 'entry_name': f'{group}__{sensor.name}__{dd_enum_repository.DDCalibRecordSensorFields.GAIN.name}' }, + {'param_name': dd_enum_repository.DDCalibRecordSensorFields.OFFSET.name.lower(), 'entry_name': f'{group}__{sensor.name}__{dd_enum_repository.DDCalibRecordSensorFields.OFFSET.name}' }, + {'param_name': dd_enum_repository.DDCalibRecordSensorFields.CALIBRATION_TIME.name.lower(), 'entry_name': f'{group}__{sensor.name}__{dd_enum_repository.DDCalibRecordSensorFields.CALIBRATION_TIME.name}' }, + ] + + # Building the kwargs parameter list + kwargs['sensor_enum'] = sensor + if sensor == dd_enum_repository.DDDialysatePumpNames.D12_PUMP: + kwargs['msg_id'] = MsgIds.MSG_ID_UI_DD_NVM_SET_D12_PUMP_CAL_RECORD_REQUEST + else: + kwargs['msg_id'] = msg_id_pairing[group] + for map in mapping: + if map['entry_name'] in calibration_records and calibration_records[map['entry_name']] is not None: + kwargs[map['param_name']] = calibration_records[map['entry_name']] + + checked.append(record_parts[1]) + # Skip sending if dictionary is provided but all entry for the sensor was None (except sensor_enum and MSG_ID, because those are neccesary) + if calibration_records != {} and len(kwargs) == 2: + continue + + # Create the send data function + send_data.append(partial(self.cmd_set_calibration_records_sensor, *args, **kwargs)) + + elif group in ['ACID', 'BICARB']: + if group == 'ACID': + conc = disp_enum_repository.AcidTypes.from_str(record_parts[1]) + elif group == 'BICARB': + conc = disp_enum_repository.BicarbTypes.from_str(record_parts[1]) + else: + conc = 'unknown' + + # Set the arguments for the call + args = [] + kwargs = {} + mapping = [ + {'param_name': dd_enum_repository.DDCalibRecordConcentrateFields.CONCENTRATE_MIX_RATIO.name.lower(), 'entry_name': f'{group}__{conc.name}__{dd_enum_repository.DDCalibRecordConcentrateFields.CONCENTRATE_MIX_RATIO.name}' }, + {'param_name': dd_enum_repository.DDCalibRecordConcentrateFields.FULL_BOTTLE_VOLUME_ML.name.lower(), 'entry_name': f'{group}__{conc.name}__{dd_enum_repository.DDCalibRecordConcentrateFields.FULL_BOTTLE_VOLUME_ML.name}' }, + {'param_name': dd_enum_repository.DDCalibRecordConcentrateFields.CONDUCTIVITY_USPCM.name.lower(), 'entry_name': f'{group}__{conc.name}__{dd_enum_repository.DDCalibRecordConcentrateFields.CONDUCTIVITY_USPCM.name}' }, + {'param_name': dd_enum_repository.DDCalibRecordConcentrateFields.BOTTLE_TEMPERATURE_C.name.lower(), 'entry_name': f'{group}__{conc.name}__{dd_enum_repository.DDCalibRecordConcentrateFields.BOTTLE_TEMPERATURE_C.name}' }, + {'param_name': dd_enum_repository.DDCalibRecordConcentrateFields.CALIBRATION_TIME.name.lower(), 'entry_name': f'{group}__{conc.name}__{dd_enum_repository.DDCalibRecordConcentrateFields.CALIBRATION_TIME.name}' }, + ] + + # Building the kwargs parameter list + kwargs['conc_enum'] = conc + kwargs['msg_id'] = msg_id_pairing[group] + for map in mapping: + if map['entry_name'] in calibration_records and calibration_records[map['entry_name']] is not None: + kwargs[map['param_name']] = calibration_records[map['entry_name']] + + checked.append(record_parts[1]) + # Skip sending if dictionary is provided but all entry for the sensor was None (except conc_enum and MSG_ID, because those are neccesary) + if calibration_records != {} and len(kwargs) == 2: + continue + + # Store the function but do not execute it + send_data.append(partial(self.cmd_set_calibration_records_concentrate, *args, **kwargs)) + + elif group in ['ACCEL']: + # Set the arguments for the call + args = [] + kwargs = {} + mapping = [ + {'param_name': dd_enum_repository.DDCalibRecordAccelerometerFields.ACCEL_X_OFFSET.name.lower(), 'entry_name': f'{group}__{dd_enum_repository.DDCalibRecordAccelerometerFields.ACCEL_X_OFFSET.name}' }, + {'param_name': dd_enum_repository.DDCalibRecordAccelerometerFields.ACCEL_Y_OFFSET.name.lower(), 'entry_name': f'{group}__{dd_enum_repository.DDCalibRecordAccelerometerFields.ACCEL_Y_OFFSET.name}' }, + {'param_name': dd_enum_repository.DDCalibRecordAccelerometerFields.ACCEL_Z_OFFSET.name.lower(), 'entry_name': f'{group}__{dd_enum_repository.DDCalibRecordAccelerometerFields.ACCEL_Z_OFFSET.name}' }, + {'param_name': dd_enum_repository.DDCalibRecordAccelerometerFields.CALIBRATION_TIME.name.lower(), 'entry_name': f'{group}__{dd_enum_repository.DDCalibRecordAccelerometerFields.CALIBRATION_TIME.name}' }, + ] + + # Building the kwargs parameter list + kwargs['msg_id'] = msg_id_pairing[group] + for map in mapping: + if map['entry_name'] in calibration_records and calibration_records[map['entry_name']] is not None: + kwargs[map['param_name']] = calibration_records[map['entry_name']] + + checked.append(group) + # Skip sending if dictionary is provided but all entry for the sensor was None (except MSG_ID, because that is neccesary) + if calibration_records != {} and len(kwargs) == 1: + continue + + # Store the function but do not execute it + send_data.append(partial(self.cmd_set_calibration_records_accelerometer, *args, **kwargs)) + + elif group in ['BLOOD_LEAK']: + # Set the arguments for the call + args = [] + kwargs = {} + mapping = [ + {'param_name': dd_enum_repository.DDCalibRecordBloodLeakFields.SET_POINT.name.lower(), 'entry_name': f'{group}__{dd_enum_repository.DDCalibRecordBloodLeakFields.SET_POINT.name}' }, + {'param_name': dd_enum_repository.DDCalibRecordBloodLeakFields.CALIBRATION_TIME.name.lower(), 'entry_name': f'{group}__{dd_enum_repository.DDCalibRecordBloodLeakFields.CALIBRATION_TIME.name}' }, + ] + + # Building the kwargs parameter list + kwargs['msg_id'] = msg_id_pairing[group] + for map in mapping: + if map['entry_name'] in calibration_records and calibration_records[map['entry_name']] is not None: + kwargs[map['param_name']] = calibration_records[map['entry_name']] + + checked.append(group) + # Skip sending if dictionary is provided but all entry for the sensor was None (except MSG_ID, because that is neccesary) + if calibration_records != {} and len(kwargs) == 1: + continue + + # Store the function but do not execute it + send_data.append(partial(self.cmd_set_calibration_records_blood_leak, *args, **kwargs)) + + elif group in ['COND']: + sensor = dd_enum_repository.DDConductivitySensorNames.from_str(record_parts[1]) + if sensor is None: + sensor = fp_enum_repository.FPConductivitySensorNames.from_str(record_parts[1]) + + # Set the arguments for the call + args = [] + kwargs = {} + mapping = [ + {'param_name': dd_enum_repository.DDCalibRecordConductivityFields.K_HIGH.name.lower(), 'entry_name': f'{group}__{sensor.name}__{dd_enum_repository.DDCalibRecordConductivityFields.K_HIGH.name}' }, + {'param_name': dd_enum_repository.DDCalibRecordConductivityFields.K_LOW.name.lower(), 'entry_name': f'{group}__{sensor.name}__{dd_enum_repository.DDCalibRecordConductivityFields.K_LOW.name}' }, + {'param_name': dd_enum_repository.DDCalibRecordConductivityFields.ALPHA_HIGH.name.lower(), 'entry_name': f'{group}__{sensor.name}__{dd_enum_repository.DDCalibRecordConductivityFields.ALPHA_HIGH.name}' }, + {'param_name': dd_enum_repository.DDCalibRecordConductivityFields.ALPHA_LOW.name.lower(), 'entry_name': f'{group}__{sensor.name}__{dd_enum_repository.DDCalibRecordConductivityFields.ALPHA_LOW.name}' }, + {'param_name': dd_enum_repository.DDCalibRecordConductivityFields.ETA_HIGH.name.lower(), 'entry_name': f'{group}__{sensor.name}__{dd_enum_repository.DDCalibRecordConductivityFields.ETA_HIGH.name}' }, + {'param_name': dd_enum_repository.DDCalibRecordConductivityFields.ETA_LOW.name.lower(), 'entry_name': f'{group}__{sensor.name}__{dd_enum_repository.DDCalibRecordConductivityFields.ETA_LOW.name}' }, + {'param_name': dd_enum_repository.DDCalibRecordConductivityFields.ZETA_HIGH.name.lower(), 'entry_name': f'{group}__{sensor.name}__{dd_enum_repository.DDCalibRecordConductivityFields.ZETA_HIGH.name}' }, + {'param_name': dd_enum_repository.DDCalibRecordConductivityFields.ZETA_LOW.name.lower(), 'entry_name': f'{group}__{sensor.name}__{dd_enum_repository.DDCalibRecordConductivityFields.ZETA_LOW.name}' }, + {'param_name': dd_enum_repository.DDCalibRecordConductivityFields.BETA.name.lower(), 'entry_name': f'{group}__{sensor.name}__{dd_enum_repository.DDCalibRecordConductivityFields.BETA.name}' }, + {'param_name': dd_enum_repository.DDCalibRecordConductivityFields.DELTA.name.lower(), 'entry_name': f'{group}__{sensor.name}__{dd_enum_repository.DDCalibRecordConductivityFields.DELTA.name}' }, + {'param_name': dd_enum_repository.DDCalibRecordConductivityFields.RSRVD_1.name.lower(), 'entry_name': f'{group}__{sensor.name}__{dd_enum_repository.DDCalibRecordConductivityFields.RSRVD_1.name}' }, + {'param_name': dd_enum_repository.DDCalibRecordConductivityFields.RSRVD_2.name.lower(), 'entry_name': f'{group}__{sensor.name}__{dd_enum_repository.DDCalibRecordConductivityFields.RSRVD_2.name}' }, + {'param_name': dd_enum_repository.DDCalibRecordConductivityFields.CALIBRATION_TIME.name.lower(), 'entry_name': f'{group}__{sensor.name}__{dd_enum_repository.DDCalibRecordConductivityFields.CALIBRATION_TIME.name}' }, + ] + + # Building the kwargs parameter list + kwargs['sensor_enum'] = sensor + kwargs['msg_id'] = msg_id_pairing[group] + for map in mapping: + if map['entry_name'] in calibration_records and calibration_records[map['entry_name']] is not None: + kwargs[map['param_name']] = calibration_records[map['entry_name']] + + checked.append(record_parts[1]) + # Skip sending if dictionary is provided but all entry for the sensor was None (except sensor_enum and MSG_ID, because those are neccesary) + if calibration_records != {} and len(kwargs) == 2: + continue + + # Store the function but do not execute it + send_data.append(partial(self.cmd_set_calibration_records_conductivity, *args, **kwargs)) + + # Execute the stored functions one by one + # Remove the ones that got 1 (successfully recieved) as response + # Retry the ones that are failed 2 more times + retry = 0 + while send_data != [] and retry < 3: + failed = [] + for func in send_data: + resp = func() + if resp == 1: + failed.append(func) + send_data = failed + retry += 1 + sleep(0.005) # Wait 50ms between sends + + + def cmd_set_institutional_records(self, institutional_records: dict={}) -> int: + """ + Constructs and sends a command for setting the Institutional Records. + Constraints: + Must be logged into DD. + Must be in Service mode. + + @param institutional_records: (Dictionary) The stored and structured Institutional Records + @return: 1 if successful, zero otherwise + """ + + # Make a dictionary to store all the send functions for later send + send_data = [] + checked = [] + for record_enum in dd_enum_repository.DDInstitutionalRecordBasicFields: + record_parts = record_enum.name.split('__') + group = record_parts[0] + + if group in ['BASIC']: + # Set the arguments for the call + args = [] + kwargs = {} + mapping = [ + {'param_name': dd_enum_repository.DDInstitutionalRecordBasicFields.MIN_DIALYSATE_SYSTEM_FLOW_MLPM.name.lower(), 'entry_name': f'{group}__{dd_enum_repository.DDInstitutionalRecordBasicFields.MIN_DIALYSATE_SYSTEM_FLOW_MLPM.name}' }, + {'param_name': dd_enum_repository.DDInstitutionalRecordBasicFields.MAX_DIALYSATE_SYSTEM_FLOW_MLPM.name.lower(), 'entry_name': f'{group}__{dd_enum_repository.DDInstitutionalRecordBasicFields.MAX_DIALYSATE_SYSTEM_FLOW_MLPM.name}' }, + {'param_name': dd_enum_repository.DDInstitutionalRecordBasicFields.MIN_DIALYSATE_TEMP_C.name.lower(), 'entry_name': f'{group}__{dd_enum_repository.DDInstitutionalRecordBasicFields.MIN_DIALYSATE_TEMP_C.name}' }, + {'param_name': dd_enum_repository.DDInstitutionalRecordBasicFields.MAX_DIALYSATE_TEMP_C.name.lower(), 'entry_name': f'{group}__{dd_enum_repository.DDInstitutionalRecordBasicFields.MAX_DIALYSATE_TEMP_C.name}' }, + {'param_name': dd_enum_repository.DDInstitutionalRecordBasicFields.MIN_ACID_CONCENTRATE.name.lower(), 'entry_name': f'{group}__{dd_enum_repository.DDInstitutionalRecordBasicFields.MIN_ACID_CONCENTRATE.name}' }, + {'param_name': dd_enum_repository.DDInstitutionalRecordBasicFields.MAX_ACID_CONCENTRATE.name.lower(), 'entry_name': f'{group}__{dd_enum_repository.DDInstitutionalRecordBasicFields.MAX_ACID_CONCENTRATE.name}' }, + {'param_name': dd_enum_repository.DDInstitutionalRecordBasicFields.MIN_BICARB_CARTRIDGE_SIZE_G.name.lower(), 'entry_name': f'{group}__{dd_enum_repository.DDInstitutionalRecordBasicFields.MIN_BICARB_CARTRIDGE_SIZE_G.name}' }, + {'param_name': dd_enum_repository.DDInstitutionalRecordBasicFields.MAX_BICARB_CARTRIDGE_SIZE_G.name.lower(), 'entry_name': f'{group}__{dd_enum_repository.DDInstitutionalRecordBasicFields.MAX_BICARB_CARTRIDGE_SIZE_G.name}' }, + {'param_name': dd_enum_repository.DDInstitutionalRecordBasicFields.MIN_SODIUM_MEQPL.name.lower(), 'entry_name': f'{group}__{dd_enum_repository.DDInstitutionalRecordBasicFields.MIN_SODIUM_MEQPL.name}' }, + {'param_name': dd_enum_repository.DDInstitutionalRecordBasicFields.MAX_SODIUM_MEQPL.name.lower(), 'entry_name': f'{group}__{dd_enum_repository.DDInstitutionalRecordBasicFields.MAX_SODIUM_MEQPL.name}' }, + {'param_name': dd_enum_repository.DDInstitutionalRecordBasicFields.MIN_BICARBONATE_MEQPL.name.lower(), 'entry_name': f'{group}__{dd_enum_repository.DDInstitutionalRecordBasicFields.MIN_BICARBONATE_MEQPL.name}' }, + {'param_name': dd_enum_repository.DDInstitutionalRecordBasicFields.MAX_BICARBONATE_MEQPL.name.lower(), 'entry_name': f'{group}__{dd_enum_repository.DDInstitutionalRecordBasicFields.MAX_BICARBONATE_MEQPL.name}' }, + {'param_name': dd_enum_repository.DDInstitutionalRecordBasicFields.MIN_RO_REJECTION_RATIO_PCT.name.lower(), 'entry_name': f'{group}__{dd_enum_repository.DDInstitutionalRecordBasicFields.MIN_RO_REJECTION_RATIO_PCT.name}' }, + {'param_name': dd_enum_repository.DDInstitutionalRecordBasicFields.DISINFECTION_FREQUENCY.name.lower(), 'entry_name': f'{group}__{dd_enum_repository.DDInstitutionalRecordBasicFields.DISINFECTION_FREQUENCY.name}' }, + {'param_name': dd_enum_repository.DDInstitutionalRecordBasicFields.DISINFECTION_CYCLE_TIME.name.lower(), 'entry_name': f'{group}__{dd_enum_repository.DDInstitutionalRecordBasicFields.DISINFECTION_CYCLE_TIME.name}' }, + {'param_name': dd_enum_repository.DDInstitutionalRecordBasicFields.MIN_INLET_WATER_CIND_AKARN_LIMIT_USPCM.name.lower(), 'entry_name': f'{group}__{dd_enum_repository.DDInstitutionalRecordBasicFields.MIN_INLET_WATER_CIND_AKARN_LIMIT_USPCM.name}' }, + {'param_name': dd_enum_repository.DDInstitutionalRecordBasicFields.MAX_INLET_WATER_CIND_AKARN_LIMIT_USPCM.name.lower(), 'entry_name': f'{group}__{dd_enum_repository.DDInstitutionalRecordBasicFields.MAX_INLET_WATER_CIND_AKARN_LIMIT_USPCM.name}' }, + {'param_name': dd_enum_repository.DDInstitutionalRecordBasicFields.ACID_CONCENTRATE_JUG_SIZE_L.name.lower(), 'entry_name': f'{group}__{dd_enum_repository.DDInstitutionalRecordBasicFields.ACID_CONCENTRATE_JUG_SIZE_L.name}' }, + {'param_name': dd_enum_repository.DDInstitutionalRecordBasicFields.MIN_ACID_ALARM_LIMIT_PCT.name.lower(), 'entry_name': f'{group}__{dd_enum_repository.DDInstitutionalRecordBasicFields.MIN_ACID_ALARM_LIMIT_PCT.name}' }, + {'param_name': dd_enum_repository.DDInstitutionalRecordBasicFields.MIN_BICARB_ALARM_LIMIT_PCT.name.lower(), 'entry_name': f'{group}__{dd_enum_repository.DDInstitutionalRecordBasicFields.MIN_BICARB_ALARM_LIMIT_PCT.name}' }, + {'param_name': dd_enum_repository.DDInstitutionalRecordBasicFields.POST_TREAT_DRAIN_OPTION.name.lower(), 'entry_name': f'{group}__{dd_enum_repository.DDInstitutionalRecordBasicFields.POST_TREAT_DRAIN_OPTION.name}' }, + {'param_name': dd_enum_repository.DDInstitutionalRecordBasicFields.POST_TREAT_DRY_BICARB_OPTION.name.lower(), 'entry_name': f'{group}__{dd_enum_repository.DDInstitutionalRecordBasicFields.POST_TREAT_DRY_BICARB_OPTION.name}' }, + {'param_name': dd_enum_repository.DDInstitutionalRecordBasicFields.CALIBRATION_TIME.name.lower(), 'entry_name': f'{group}__{dd_enum_repository.DDInstitutionalRecordBasicFields.CALIBRATION_TIME.name}' }, + ] + + # Building the kwargs parameter list + for map in mapping: + if map['entry_name'] in institutional_records and institutional_records[map['entry_name']] is not None: + kwargs[map['param_name']] = institutional_records[map['entry_name']] + + checked.append(group) + # Skip sending if dictionary is provided + if institutional_records != {}: + continue + + # Store the function but do not execute it + send_data.append(partial(self.cmd_set_institutional_records_basic, *args, **kwargs)) + + elif group in ['ADV']: + # Set the arguments for the call + args = [] + kwargs = {} + mapping = [ + {'param_name': dd_enum_repository.DDInstitutionalRecordAdvancedFields.CALIBRATION_TIME.name.lower(), 'entry_name': f'{group}__{dd_enum_repository.DDInstitutionalRecordAdvancedFields.CALIBRATION_TIME.name}' }, + ] + + # Building the kwargs parameter list + for map in mapping: + if map['entry_name'] in institutional_records and institutional_records[map['entry_name']] is not None: + kwargs[map['param_name']] = institutional_records[map['entry_name']] + + checked.append(group) + # Skip sending if dictionary is provided + if institutional_records != {}: + continue + + # Store the function but do not execute it + send_data.append(partial(self.cmd_set_institutional_records_advanced, *args, **kwargs)) + + elif group in ['ADD']: + # Set the arguments for the call + args = [] + kwargs = {} + mapping = [ + {'param_name': dd_enum_repository.DDInstitutionalRecordAdditionalFields.CALIBRATION_TIME.name.lower(), 'entry_name': f'{group}__{dd_enum_repository.DDInstitutionalRecordAdditionalFields.CALIBRATION_TIME.name}' }, + ] + + # Building the kwargs parameter list + for map in mapping: + if map['entry_name'] in institutional_records and institutional_records[map['entry_name']] is not None: + kwargs[map['param_name']] = institutional_records[map['entry_name']] + + checked.append(group) + # Skip sending if dictionary is provided + if institutional_records != {}: + continue + + # Store the function but do not execute it + send_data.append(partial(self.cmd_set_institutional_records_additional, *args, **kwargs)) + + # Execute the stored functions one by one + # Remove the ones that got 1 (successfully recieved) as response + # Retry the ones that are failed 2 more times + retry = 0 + while send_data != [] and retry < 3: + failed = [] + for func in send_data: + resp = func() + if resp == 1: + failed.append(func) + send_data = failed + retry += 1 + sleep(0.005) # Wait 50ms between sends + + + def cmd_set_usage_info_records(self, + ro_water_gen_total_l: float=0.0, + ro_water_gen_since_last_serv_l: float=0.0, + uf_1_treatment_count: int=0, + uf_1_disinfection_count: int=0, + uf_2_treatment_count: int=0, + uf_2_disinfection_count: int=0, + uf_pump_tubing_treatment_count: int=0, + uf_pump_tubing_disinfection_count: int=0, + last_basic_flush_date: int=0, + last_heat_disinfect_date: int=0, + last_heat_active_cool_date: int=0, + last_filter_flush_date: int=0, + last_reset_time: int=0) -> int: + """ + Constructs and sends a command for setting the Usage Information Records. + Constraints: + Must be logged into DD. + Must be in Service mode. + + @return: 1 if successful, zero otherwise + """ + payload = float_to_bytearray(ro_water_gen_total_l) + payload += float_to_bytearray(ro_water_gen_since_last_serv_l) + payload += integer_to_bytearray(uf_1_treatment_count) + payload += integer_to_bytearray(uf_1_disinfection_count) + payload += integer_to_bytearray(uf_2_treatment_count) + payload += integer_to_bytearray(uf_2_disinfection_count) + payload += integer_to_bytearray(uf_pump_tubing_treatment_count) + payload += integer_to_bytearray(uf_pump_tubing_disinfection_count) + payload += integer_to_bytearray(last_basic_flush_date) + payload += integer_to_bytearray(last_heat_disinfect_date) + payload += integer_to_bytearray(last_heat_active_cool_date) + payload += integer_to_bytearray(last_filter_flush_date) + payload += integer_to_bytearray(last_reset_time) + + return cmd_generic_override( + payload = payload, + reset = None, + channel_id = CanChannels.dialin_to_dd_ch_id, + msg_id = MsgIds.MSG_ID_UI_DD_NVM_SET_USAGE_INFO_RECORD_REQUEST, + entity_name = f'New DD Usage Information Record', + override_text = 'being set', + logger = self.logger, + can_interface = self.can_interface) + + + +# ================================================= Set Records Support Methods ================================================= + def cmd_set_calibration_records_sensor(self, + sensor_enum: DialinEnum, + msg_id: MsgIds, + target_speed: float=0.0, + gain: float=0.0, + offset: float=0.0, + calibration_time: int=1) -> int: + payload = b'' + # Add sensor index when it's not Dialysate pump + if msg_id not in [MsgIds.MSG_ID_UI_DD_NVM_SET_D12_PUMP_CAL_RECORD_REQUEST, MsgIds.MSG_ID_UI_DD_NVM_SET_D48_PUMP_CAL_RECORD_REQUEST]: + if isinstance(sensor_enum, fp_enum_repository.FPPressureSensorNames): + payload += integer_to_bytearray(sensor_enum.value + dd_enum_repository.DDPressureSensorNames.NUM_OF_PRESSURE_SENSORS.value) + else: + payload += integer_to_bytearray(sensor_enum.value) + + if msg_id == MsgIds.MSG_ID_UI_DD_NVM_SET_D12_PUMP_CAL_RECORD_REQUEST: + payload += float_to_bytearray(target_speed) + else: + payload += float_to_bytearray(gain) + payload += float_to_bytearray(offset) + payload += integer_to_bytearray(calibration_time) + + # Get sensor type for the debug print + sensor_type = '' + if msg_id == MsgIds.MSG_ID_UI_DD_NVM_SET_PRESSURE_SENSOR_CAL_RECORD_REQUEST: + sensor_type = 'Pressure Sensor' + elif msg_id == MsgIds.MSG_ID_UI_DD_NVM_SET_TEMPERATURE_SENSOR_CAL_RECORD_REQUEST: + sensor_type = 'Temperature Sensor' + elif msg_id == MsgIds.MSG_ID_UI_DD_NVM_SET_CONC_PUMP_CAL_RECORD_REQUEST: + sensor_type = 'Concentrate Pump' + elif msg_id in [MsgIds.MSG_ID_UI_DD_NVM_SET_D12_PUMP_CAL_RECORD_REQUEST, MsgIds.MSG_ID_UI_DD_NVM_SET_D48_PUMP_CAL_RECORD_REQUEST]: + sensor_type = 'Dialysate Pump' + + return cmd_generic_override(payload = payload, + reset = None, + channel_id = CanChannels.dialin_to_dd_ch_id, + msg_id = msg_id, + entity_name = f'DD {sensor_type} {sensor_enum.name} Calibration Record', + override_text = 'being set', + logger = self.logger, + can_interface = self.can_interface) + + + def cmd_set_calibration_records_concentrate(self, + conc_enum: DialinEnum, + msg_id: MsgIds, + concentrate_mix_ratio: float=0.0, + full_bottle_volume_ml: float=0.0, + conductivity_uspcm: float=0.0, + bottle_temperature_c: float=0.0, + calibration_time: int=1) -> int: + + payload = integer_to_bytearray(conc_enum.value) + payload += float_to_bytearray(concentrate_mix_ratio) + payload += float_to_bytearray(full_bottle_volume_ml) + payload += float_to_bytearray(conductivity_uspcm) + payload += float_to_bytearray(bottle_temperature_c) + payload += integer_to_bytearray(calibration_time) + + # Get concentrate type for the debug print + conc_type = '' + if msg_id == MsgIds.MSG_ID_UI_DD_NVM_SET_ACID_CONC_CAL_RECORD_REQUEST: + conc_type = 'Acid' + elif msg_id == MsgIds.MSG_ID_UI_DD_NVM_SET_BICARB_CONC_CAL_RECORD_REQUEST: + conc_type = 'Bicarb' + + return cmd_generic_override(payload = payload, + reset = None, + channel_id = CanChannels.dialin_to_dd_ch_id, + msg_id = msg_id, + entity_name = f'DD {conc_type} {conc_enum.name} Concentrate Calibration Record', + override_text = 'being set', + logger = self.logger, + can_interface = self.can_interface) + + + def cmd_set_calibration_records_accelerometer(self, + msg_id: MsgIds, + accel_x_offset: float=0.0, + accel_y_offset: float=0.0, + accel_z_offset: float=0.0, + calibration_time: int=1) -> int: + + payload = float_to_bytearray(accel_x_offset) + payload += float_to_bytearray(accel_y_offset) + payload += float_to_bytearray(accel_z_offset) + payload += integer_to_bytearray(calibration_time) + + return cmd_generic_override(payload = payload, + reset = None, + channel_id = CanChannels.dialin_to_dd_ch_id, + msg_id = msg_id, + entity_name = f'DD Accelerometer Calibration Record', + override_text = 'being set', + logger = self.logger, + can_interface = self.can_interface) + + + + def cmd_set_calibration_records_blood_leak(self, + msg_id: MsgIds, + set_point: int=0, + calibration_time: int=1) -> int: + + payload = integer_to_bytearray(set_point) + payload += integer_to_bytearray(calibration_time) + + return cmd_generic_override(payload = payload, + reset = None, + channel_id = CanChannels.dialin_to_dd_ch_id, + msg_id = msg_id, + entity_name = f'DD Blood Leak Calibration Record', + override_text = 'being set', + logger = self.logger, + can_interface = self.can_interface) + + + def cmd_set_calibration_records_conductivity(self, + msg_id: MsgIds, + sensor_enum: DialinEnum, + k_high: float=0.0, + k_low: float=0.0, + alpha_high: float=0.0, + alpha_low: float=0.0, + eta_high: float=0.0, + eta_low: float=0.0, + zeta_high: float=0.0, + zeta_low: float=0.0, + beta: float=0.0, + delta: float=0.0, + rsrvd_1: float=0.0, + rsrvd_2: float=0.0, + calibration_time: int=1) -> int: + + payload = integer_to_bytearray(sensor_enum.value) + if isinstance(sensor_enum, fp_enum_repository.FPConductivitySensorNames): + payload = integer_to_bytearray(sensor_enum.value + dd_enum_repository.DDConductivitySensorNames.NUM_OF_CONDUCTIVITY_SENSORS.value) + else: + payload = integer_to_bytearray(sensor_enum.value) + payload += float_to_bytearray(k_high) + payload += float_to_bytearray(alpha_high) + payload += float_to_bytearray(eta_high) + payload += float_to_bytearray(zeta_high) + payload += float_to_bytearray(k_low) + payload += float_to_bytearray(alpha_low) + payload += float_to_bytearray(eta_low) + payload += float_to_bytearray(zeta_low) + payload += float_to_bytearray(beta) + payload += float_to_bytearray(delta) + payload += float_to_bytearray(rsrvd_1) + payload += float_to_bytearray(rsrvd_2) + payload += integer_to_bytearray(calibration_time) + + return cmd_generic_override(payload = payload, + reset = None, + channel_id = CanChannels.dialin_to_dd_ch_id, + msg_id = msg_id, + entity_name = f'DD Conductivity {sensor_enum.name} Calibration Record', + override_text = 'being set', + logger = self.logger, + can_interface = self.can_interface) + + + def cmd_set_institutional_records_basic(self, + min_dialysate_system_flow_mlpm: int=0, + max_dialysate_system_flow_mlpm: int=0, + min_dialysate_temp_c: float=0.0, + max_dialysate_temp_c: float=0.0, + min_acid_concentrate: int=0, + max_acid_concentrate: int=0, + min_bicarb_cartridge_size_g: int=0, + max_bicarb_cartridge_size_g: int=0, + min_sodium_meqpl: int=0, + max_sodium_meqpl: int=0, + min_bicarbonate_meqpl: int=0, + max_bicarbonate_meqpl: int=0, + min_ro_rejection_ratio_pct: float=0.0, + disinfection_frequency: int=0, + disinfection_cycle_time: float=0.0, + min_inlet_water_cind_akarn_limit_uspcm: float=0.0, + max_inlet_water_cind_akarn_limit_uspcm: float=0.0, + acid_concentrate_jug_size_l: float=0.0, + min_acid_alarm_limit_pct: float=0.0, + min_bicarb_alarm_limit_pct: float=0.0, + post_treat_drain_option: int=0, + post_treat_dry_bicarb_option: int=0, + calibration_time: int=1) -> int: + + payload = integer_to_bytearray(min_dialysate_system_flow_mlpm) + payload += integer_to_bytearray(max_dialysate_system_flow_mlpm) + payload += integer_to_bytearray(min_dialysate_temp_c) + payload += integer_to_bytearray(max_dialysate_temp_c) + payload += integer_to_bytearray(min_acid_concentrate) + payload += integer_to_bytearray(max_acid_concentrate) + payload += integer_to_bytearray(min_bicarb_cartridge_size_g) + payload += integer_to_bytearray(max_bicarb_cartridge_size_g) + payload += integer_to_bytearray(min_sodium_meqpl) + payload += integer_to_bytearray(max_sodium_meqpl) + payload += integer_to_bytearray(min_bicarbonate_meqpl) + payload += integer_to_bytearray(max_bicarbonate_meqpl) + payload += float_to_bytearray(min_ro_rejection_ratio_pct) + payload += integer_to_bytearray(disinfection_frequency) + payload += float_to_bytearray(disinfection_cycle_time) + payload += float_to_bytearray(min_inlet_water_cind_akarn_limit_uspcm) + payload += float_to_bytearray(max_inlet_water_cind_akarn_limit_uspcm) + payload += float_to_bytearray(acid_concentrate_jug_size_l) + payload += float_to_bytearray(min_acid_alarm_limit_pct) + payload += float_to_bytearray(min_bicarb_alarm_limit_pct) + payload += integer_to_bytearray(post_treat_drain_option) + payload += integer_to_bytearray(post_treat_dry_bicarb_option) + payload += integer_to_bytearray(calibration_time) + + return cmd_generic_override(payload = payload, + reset = None, + channel_id = CanChannels.dialin_to_dd_ch_id, + msg_id = MsgIds.MSG_ID_UI_DD_NVM_SET_INSTIT_BASIC_RECORD_REQUEST, + entity_name = f'DD Institutional Basic Records', + override_text = 'being set', + logger = self.logger, + can_interface = self.can_interface) + + + def cmd_set_institutional_records_advanced(self, + calibration_time: int=1) -> int: + payload = b'' + payload += integer_to_bytearray(calibration_time) + + return cmd_generic_override(payload = payload, + reset = None, + channel_id = CanChannels.dialin_to_dd_ch_id, + msg_id = MsgIds.MSG_ID_UI_DD_NVM_SET_INSTIT_ADVANCED_RECORD_REQUEST, + entity_name = f'DD Institutional Advanced Records', + override_text = 'being set', + logger = self.logger, + can_interface = self.can_interface) + + + def cmd_set_institutional_records_additional(self, + calibration_time: int=1) -> int: + + payload = b'' + payload += integer_to_bytearray(calibration_time) + + return cmd_generic_override(payload = payload, + reset = None, + channel_id = CanChannels.dialin_to_dd_ch_id, + msg_id = MsgIds.MSG_ID_UI_DD_NVM_SET_INSTIT_ADDITIONAL_RECORD_REQUEST, + entity_name = f'DD Institutional Additional Records', + override_text = 'being set', + logger = self.logger, + can_interface = self.can_interface) Index: leahi_dialin/utils/enum_updater.py =================================================================== diff -u --- leahi_dialin/utils/enum_updater.py (revision 0) +++ leahi_dialin/utils/enum_updater.py (revision f1cb03cd999ccce88151a2e6c29c19b00a6e8d54) @@ -0,0 +1,300 @@ +########################################################################### +# +# Copyright (c) 2021-2024 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 enum_updater.py +# +# @author (last) Zoltan Miskolci +# @date (last) 05-Aug-2026 +# @author (original) Zoltan Miskolci +# @date (original) 05-Aug-2026 +# +############################################################################ + +# Module imports +from clang.cindex import Index, CursorKind, Config +from pathlib import Path +from datetime import datetime +from os import path +import platform +import re +import subprocess +from typing import List + +# Set libclang library +clang_dir = Path(__import__('clang').__file__).parent / 'native' +if platform.system() == 'Windows': + libclang = clang_dir / 'libclang.dll' +else: + libclang = clang_dir / 'libclang.so' +Config.set_library_file(str(libclang)) + + +class EnumUpdater: + + @staticmethod + def execute() -> None: + """ + Read the enums from the C++ file and then update the Python Enum definitions + """ + cpp_repo_loc = path.abspath(f'{path.dirname(__file__)}/../../../leahi-dialin/leahi_common') + if path.exists(cpp_repo_loc) is False: + cpp_repo_loc = path.abspath(f'{path.dirname(__file__)}/../../../leahi-dialin/leahi-common') + if path.exists(cpp_repo_loc) is False: + cpp_repo_loc = path.abspath(f'{path.dirname(__file__)}/../../../leahi-common') + + if path.exists(cpp_repo_loc) is False: + return print(f'C++ repo location not found: {cpp_repo_loc}, skipping enum updates!') + + files_to_check = [] + files_to_check.append(f'{cpp_repo_loc}/AlarmDefs.h') + files_to_check.append(f'{cpp_repo_loc}/MsgDefs.h') + _update_cpp_repo(cpp_repo_loc) + + common_location = path.abspath(f'{path.dirname(__file__)}/../common') + file_to_update = {'AlarmList': (f'{common_location}/alarm_defs.py', 'AlarmEnum', False), + 'RequestRejectReasons': (f'{common_location}/msg_defs.py', 'DialinEnum', False), + 'MsgIds': (f'{common_location}/msg_ids.py', 'DialinEnum', True), + # 'TestConfig': (f'{common_location}/test_config_defs.py', 'DialinEnum', False) + } + for file in files_to_check: + if path.exists(file): + extracted_cpp_enums = _extract_cpp_enums(file) + for enum_name in extracted_cpp_enums: + if enum_name in file_to_update: + + # Extract information from the dictionary + python_file = file_to_update[enum_name][0] + enum_type_name = file_to_update[enum_name][1] + is_enum_hex = file_to_update[enum_name][2] + + # Extract the original Python enums from the file + original_py_enums = _extract_python_enums(python_file) + new_enum = list(extracted_cpp_enums[enum_name]) + + # Get the enum member list + cpp_enum_values = [ item['value'] for item in extracted_cpp_enums[enum_name] ] + cpp_enum_names = [ item['member'] for item in extracted_cpp_enums[enum_name] ] + + # Add the original Python enum members that are not present in the C++ enum + new_enum.extend( + item + for item in original_py_enums.get(enum_name, []) + if item['value'] not in cpp_enum_values and item['member'] not in cpp_enum_names) + + # Sort the new enum list by the value to maintain order + new_enum.sort(key=lambda x: x['value']) + + # Generate the updated Python enum file + _generate_python_enum_file(file_location = python_file, + enum_name = enum_name, + enum_member_list = new_enum, + enum_type = enum_type_name, + is_hex = is_enum_hex) + print(f'Updated enum: {enum_name}') + + + +# ============================================================ Private Methods ============================================================ +def _extract_cpp_enums(cpp_file): + """ + Extract the enums from the provided C++ file + + :param cpp_file: (String) The C++ file with full location + :return: (Dictionary) The collected enums + """ + index = Index.create() + tu = index.parse(cpp_file) + enums = {} + for cursor in tu.cursor.walk_preorder(): + if cursor.kind == CursorKind.ENUM_DECL: + # Update name to be CamelCase + enum_name = "".join(part.capitalize() for part in cursor.spelling.split("_") if part) + enums[enum_name] = [] + for item in cursor.get_children(): + if item.kind == CursorKind.ENUM_CONSTANT_DECL: + if item.spelling in ['MSG_ID_FIRST_TD_TESTER_MESSAGE', 'MSG_ID_FIRST_DD_TESTER_MESSAGE', 'MSG_ID_FIRST_FP_TESTER_MESSAGE']: + continue + enums[enum_name].append({ + "member": item.spelling, + "value": item.enum_value, + "comment": item.brief_comment, + }) + return enums + + +def _extract_python_enums(py_file): + """ + Extract the enums from the provided Python file + + :param py_file: (String) The Python file with full location + :return: (Dictionary) The collected enums + """ + result = {} + inside_enum = False + enum_name = None + + with open(py_file, "r", encoding="utf-8") as f: + for line in f: + # If we are not inside an enum, check if this line declares an enum class + if not inside_enum: + match = re.match(r"class (\w+)\(\w+Enum\):", line) + if match: + enum_name = match.group(1) + result[enum_name] = [] + inside_enum = True + continue + + # If we are inside an enum, process the enum members + else: + # Skip empty lines within the enum definition + if line.strip() == '': + continue + + # If the line is not indented, it means the enum definition has ended + if not line.startswith(' '): + inside_enum = False + continue + + match = re.match(r"\s*(\w+)\s*=\s*([0-9A-Fa-fx]+)\s*(#\s*(.*))*", line ) + if match: + member, value, full_comment, comment = match.groups() + if comment is None: + comment = '' + result[enum_name].append( { "member": member, + "value": int(value, 0), + "comment": comment, + } ) + return result + + +def _generate_python_enum_file(file_location: str, + enum_name: str, + enum_member_list: List[dict], + enum_type: str='Enum', + is_hex: bool=False) -> None: + """ + Generate the enum file content + :param file_location: (String) The enum file with full location + :param enum_name: (String) The enum's name + :param enum_member_list: (List of Dictionaries) The information of the enum members + :param enum_type: (String) The enum type to be the parent + :param is_hex: (Boolean) The member's values are hex or not + :return: None + """ + now = datetime.now().strftime("%d-%b-%Y") + file_name = file_location.split('/')[-1] + + lines = [] + lines.append('###########################################################################') + lines.append('#') + lines.append('# Copyright (c) 2020-2024 Diality Inc. - All Rights Reserved.') + lines.append('#') + lines.append('# THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM IN PART OR IN') + lines.append('# WHOLE WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER.') + lines.append('#') + lines.append(f'# @file {file_name}') + lines.append('#') + lines.append('# @author (last) Enum Updater Script') + lines.append(f'# @date (last) {now}') + lines.append('# @author (original) Zoltan Miskolci') + lines.append('# @date (original) 31-Jul-2026') + lines.append('#') + lines.append('############################################################################') + lines.append('') + lines.append('# Module import') + lines.append('from enum import unique') + lines.append('') + lines.append('# Project import') + lines.append(f'from leahi_dialin.utils.enums import {enum_type}') + lines.append('') + lines.append('') + lines.append('@unique') + lines.append(f'class {enum_name}({enum_type}):') + + # Add the members + for i in range(len(enum_member_list)): + member = enum_member_list[i] + if i != 0 and member['value'] != enum_member_list[i-1]['value'] + 1: + lines.append('') + value = member['value'] + if is_hex: + value = hex(member['value']).upper().replace('X','x') + lines.append(f' {member["member"]:<75} = {value:<10} # {member["comment"]}') + lines.append('') + + # Add cutom code for specific enum or enum types + lines.extend(_custom_code_generator(enum_name, enum_type)) + + # Write into the file + with open(file_location, "w") as f: + f.write("\n".join(lines)) + + +def _custom_code_generator(enum_name:str, enum_type:str) -> List[str]: + """ + Add cutom code for specific enum or enum types + + :param enum_name: (String) The enum's name + :param enum_type: (String) The enum type to be the parent + :return: (List[str]) The custom code lines + """ + lines = [] + # Add the _str_list for python 3.6 compatibility + if enum_type == 'DialinEnum': + lines.append(f'{enum_name}._str_list = ' + '{ }') + lines.append('') + + if enum_name == 'RequestRejectReasons': + lines.append(f'ACK_NOT_REQUIRED = [ ]') + lines.append('') + + return lines + + +def _update_cpp_repo(cpp_repo: str) -> None: + """ + Update the C++ repository to ensure the latest changes are available for parsing. + + :param cpp_repo: (String) The C++ folder with full location + :return: None + """ + try: + # # Switch to the staging branch + # subprocess.run( + # ["git", "-C", cpp_repo, "checkout", "staging"], + # check=True + # ) + + # Get latest refs from remote + subprocess.run( + ["git", "-C", cpp_repo, "fetch", "origin"], + check=True + ) + + # Discard all local changes + subprocess.run( + ["git", "-C", cpp_repo, "reset", "--hard", "HEAD"], + check=True + ) + + subprocess.run( + ["git", "-C", cpp_repo, "pull"], + check=True, + capture_output=True, + text=True + ) + print(f"Successfully updated repository: {cpp_repo}") + + except subprocess.CalledProcessError as e: + print(f"Failed to update repository: {cpp_repo}") + print(e.stderr) + + + +# ============================================================ Main ============================================================ +if __name__ == '__main__': + EnumUpdater.execute()