Index: dialin/common/hd_defs.py =================================================================== diff -u -r2976d64bc36da24b20e3db5c6a98bd97e45f82c4 -r7fe939e59e034a80456d9f865c6fda428c2ae861 --- dialin/common/hd_defs.py (.../hd_defs.py) (revision 2976d64bc36da24b20e3db5c6a98bd97e45f82c4) +++ dialin/common/hd_defs.py (.../hd_defs.py) (revision 7fe939e59e034a80456d9f865c6fda428c2ae861) @@ -7,8 +7,8 @@ # # @file hd_defs.py # -# @author (last) Micahel Garthwaite -# @date (last) 19-Jan-2023 +# @author (last) Sean Nash +# @date (last) 02-Feb-2023 # @author (original) Peter Lucia # @date (original) 04-Dec-2020 # @@ -77,16 +77,15 @@ @unique class PreTreatmentSubModes(DialinEnum): - HD_PRE_TREATMENT_START_STATE = 0 # Start pre-treatment mode state - HD_PRE_TREATMENT_WATER_SAMPLE_STATE = 1 # Water sample state - HD_PRE_TREATMENT_SELF_TEST_CONSUMABLE_STATE = 2 # Consumable self-tests state - HD_PRE_TREATMENT_SELF_TEST_NO_CART_STATE = 3 # No cartridge self-tests state - HD_PRE_TREATMENT_CART_INSTALL_STATE = 4 # Consumable and cartridge installation state - HD_PRE_TREATMENT_SELF_TEST_DRY_STATE = 5 # Self-tests when the cartridge is dry state - HD_PRE_TREATMENT_PRIME_STATE = 6 # Prime blood and dialysate circuits and run wet self-tests state - HD_PRE_TREATMENT_RECIRCULATE_STATE = 7 # Re-circulate blood and dialysate circuits state - HD_PRE_TREATMENT_PATIENT_CONNECTION_STATE = 8 # Patient connection state - NUM_OF_HD_PRE_TREATMENT_STATES = 9 # Number of pre-treatment mode states + HD_PRE_TREATMENT_WATER_SAMPLE_STATE = 0 # Water sample state + HD_PRE_TREATMENT_SELF_TEST_CONSUMABLE_STATE = 1 # Consumable self-tests state + HD_PRE_TREATMENT_SELF_TEST_NO_CART_STATE = 2 # No cartridge self-tests state + HD_PRE_TREATMENT_CART_INSTALL_STATE = 3 # Consumable and cartridge installation state + HD_PRE_TREATMENT_SELF_TEST_DRY_STATE = 4 # Self-tests when the cartridge is dry state + HD_PRE_TREATMENT_PRIME_STATE = 5 # Prime blood and dialysate circuits and run wet self-tests state + HD_PRE_TREATMENT_RECIRCULATE_STATE = 6 # Re-circulate blood and dialysate circuits state + HD_PRE_TREATMENT_PATIENT_CONNECTION_STATE = 7 # Patient connection state + NUM_OF_HD_PRE_TREATMENT_STATES = 8 # Number of pre-treatment mode states @unique @@ -100,33 +99,31 @@ @unique class PreTreatmentConsumableSelfTestStates(DialinEnum): CONSUMABLE_SELF_TESTS_INSTALL_STATE = 0 # Consumable self-tests install state - CONSUMABLE_SELF_TESTS_FILL_CMD_STATE = 1 # Send command to DG to fill reservoir state - CONSUMABLE_SELF_TESTS_WATER_QUALITY_CHECK_STATE = 2 # Consumable self-tests water quality check state - CONSUMABLE_SELF_TESTS_BICARB_PUMP_CHECK_STATE = 3 # Consumable self-tests bicarbonate concentrate pump check state - CONSUMABLE_SELF_TESTS_ACID_PUMP_CHECK_STATE = 4 # Consumable self-tests acid concentrate pump check state - CONSUMABLE_SELF_TESTS_COMPLETE_STATE = 5 # Consumable self-tests complete state - NUM_OF_CONSUMABLE_SELF_TESTS_STATES = 6 # Number of consumable install sub-mode states + CONSUMABLE_SELF_TESTS_PRIME_STATE = 1 # Consumable self-tests prime concentrate lines state + CONSUMABLE_SELF_TESTS_BICARB_PUMP_CHECK_STATE = 2 # Consumable self-tests bicarbonate concentrate pump check state + CONSUMABLE_SELF_TESTS_ACID_PUMP_CHECK_STATE = 3 # Consumable self-tests acid concentrate pump check state + CONSUMABLE_SELF_TESTS_COMPLETE_STATE = 4 # Consumable self-tests complete state + NUM_OF_CONSUMABLE_SELF_TESTS_STATES = 5 # Number of consumable install sub-mode states @unique class PreTreatmentNoCartSelfTestStates(DialinEnum): - NO_CART_SELF_TESTS_START_STATE = 0 # No cartridge self-tests starting state - NO_CART_SELF_TESTS_WAIT_FOR_DOOR_CLOSE_STATE = 1 # Wait for door to be closed before running self-tests - NO_CART_SELF_TESTS_PRESSURE_CHECKS_STATE = 2 # No cartridge pressure sensors self-test state - NO_CART_SELF_TESTS_HOME_VALVES_STATE = 3 # No cartridge home valves state - NO_CART_SELF_TESTS_HOME_SYRINGE_PUMP_STATE = 4 # No cartridge home syringe pump state - NO_CART_SELF_TESTS_PUMPS_STATE = 5 # No cartridge self-test for blood pump, dialysate in pump, dialysate out pump state - NO_CART_SELF_TESTS_HOME_IDLE_STATE = 6 # Wait for valves and pumps finish homing state - NO_CART_SELF_TESTS_STOPPED_STATE = 7 # No cart self-test stopped state - NO_CART_SELF_TESTS_COMPLETE_STATE = 8 # No cartridge self-test complete state - NUM_OF_NO_CART_SELF_TESTS_STATES = 9 # Number of no cartridge self-tests states + NO_CART_SELF_TESTS_WAIT_FOR_DOOR_CLOSE_STATE = 0 # Wait for door to be closed before running self-tests + NO_CART_SELF_TESTS_PRESSURE_CHECKS_STATE = 1 # No cartridge pressure sensors self-test state + NO_CART_SELF_TESTS_HOME_VALVES_STATE = 2 # No cartridge home valves state + NO_CART_SELF_TESTS_HOME_SYRINGE_PUMP_STATE = 3 # No cartridge home syringe pump state + NO_CART_SELF_TESTS_PUMPS_STATE = 4 # No cartridge self-test for blood pump, dialysate in pump, dialysate out pump state + NO_CART_SELF_TESTS_HOME_IDLE_STATE = 5 # Wait for valves and pumps finish homing state + NO_CART_SELF_TESTS_STOPPED_STATE = 6 # No cart self-test stopped state + NO_CART_SELF_TESTS_COMPLETE_STATE = 7 # No cartridge self-test complete state + NUM_OF_NO_CART_SELF_TESTS_STATES = 8 # Number of no cartridge self-tests states @unique class PreTreatmentWetSelfTestStates(DialinEnum): WET_SELF_TESTS_START_STATE = 0 - WET_SELF_TESTS_SETUP_STATE = 1 - WET_SELF_TESTS_BUBBLES_STATE = 2 + WET_SELF_TESTS_BUBBLE_CHECK_SETUP_STATE = 1 + WET_SELF_TESTS_BUBBLE_CHECK_STATE = 2 WET_SELF_TESTS_PRIME_CHECK_STATE = 3 WET_SELF_TESTS_BLOOD_LEAK_DETECTOR_STATE = 4 WET_SELF_TESTS_FIRST_DISPLACEMENT_SETUP_STATE = 5 @@ -164,11 +161,12 @@ SYRINGE_PUMP_INIT_STATE = 0 # Syringe pump initialize state SYRINGE_PUMP_OFF_STATE = 1 # Syringe pump off state SYRINGE_PUMP_RETRACT_STATE = 2 # Syringe pump retract state - SYRINGE_PUMP_SEEK_STATE = 3 # Syringe pump seek state - SYRINGE_PUMP_PRIME_STATE = 4 # Syringe pump prime state - SYRINGE_PUMP_HEP_BOLUS_STATE = 5 # Syringe pump bolus state - SYRINGE_PUMP_HEP_CONTINUOUS_STATE = 6 # Syringe pump continuous state - SYRINGE_PUMP_CONFIG_FORCE_SENSOR_STATE = 7 # Syringe pump configure force sensor state + SYRINGE_PUMP_PRELOAD_STATE = 3 # Syringe pump preload state + SYRINGE_PUMP_SEEK_STATE = 4 # Syringe pump seek state + SYRINGE_PUMP_PRIME_STATE = 5 # Syringe pump prime state + SYRINGE_PUMP_HEP_BOLUS_STATE = 6 # Syringe pump bolus state + SYRINGE_PUMP_HEP_CONTINUOUS_STATE = 7 # Syringe pump continuous state + SYRINGE_PUMP_CONFIG_FORCE_SENSOR_STATE = 8 # Syringe pump configure force sensor state # Syringe pump operations @@ -205,7 +203,7 @@ DRY_SELF_TESTS_START_STATE = 0 # Dry self-tests starting state DRY_SELF_TESTS_WAIT_FOR_DOOR_CLOSE_STATE = 1 # Wait for door to close before executing self-tests DRY_SELF_TESTS_USED_CARTRIDGE_CHECK_STATE = 2 # Used cartridge check dry self-test state - DRY_SELF_TESTS_OCCLUSION_SENSORS_STATE = 3 # Occlusion sensors dry self-test state + DRY_SELF_TESTS_CARTRIDGE_LOADED_CHECK_STATE = 3 # Cartridge loaded check dry self-test state DRY_SELF_TESTS_PRESSURE_SENSORS_NORMAL_SETUP_STATE = 4 # Pressure sensor setup state. DRY_SELF_TESTS_PRESSURE_SENSORS_VENOUS_SETUP_STATE = 5 # Venous pressure sensor dry self-test setup valves and pump state DRY_SELF_TESTS_PRESSURE_SENSORS_VENOUS = 6 # Venous pressure sensor dry self-test @@ -223,21 +221,20 @@ @unique class PreTreatmentPrimeStates(DialinEnum): - HD_PRIME_START_STATE = 0 # Prime start state - HD_PRIME_WAIT_FOR_USER_START_STATE = 1 # Wait for user to start prime state - HD_PRIME_SALINE_SETUP_STATE = 2 # Saline setup state - HD_PRIME_SALINE_PURGE_AIR_STATE = 3 # Saline purge air state - HD_PRIME_SALINE_CIRC_BLOOD_CIRCUIT_STATE = 4 # Circulate blood circuit state - HD_PRIME_RESERVOIR_ONE_FILL_COMPLETE_STATE = 5 # Wait for reservoir 1 fill complete - HD_PRIME_DIALYSATE_DIALYZER_STATE = 6 # Dialysate dialyzer fluid path state - HD_PRIME_SALINE_DIALYZER_SETUP_STATE = 7 # Saline dialyzer setup state - HD_PRIME_SALINE_DIALYZER_STATE = 8 # Saline dialyzer fluid path state - HD_PRIME_RESERVOIR_TWO_FILL_COMPLETE_STATE = 9 # Wait for reservoir 2 fill complete - HD_PRIME_DIALYSATE_BYPASS_STATE = 10 # Dialysate bypass fluid path state - HD_PRIME_WET_SELF_TESTS_STATE = 11 # Perform wet self-tests after priming complete - HD_PRIME_PAUSE = 12 # Prime pause state, waits to be resumed - HD_PRIME_COMPLETE = 13 # Prime complete state - NUM_OF_HD_PRIME_STATES = 14 # Number of prime sub-mode states + HD_PRIME_WAIT_FOR_USER_START_STATE = 0 # Wait for user to start prime state + HD_PRIME_SALINE_SETUP_STATE = 1 # Saline setup state + HD_PRIME_SALINE_PURGE_AIR_STATE = 2 # Saline purge air state + HD_PRIME_SALINE_CIRC_BLOOD_CIRCUIT_STATE = 3 # Circulate blood circuit state + HD_PRIME_RESERVOIR_ONE_FILL_COMPLETE_STATE = 4 # Wait for reservoir 1 fill complete + HD_PRIME_DIALYSATE_DIALYZER_STATE = 5 # Dialysate dialyzer fluid path state + HD_PRIME_SALINE_DIALYZER_SETUP_STATE = 6 # Saline dialyzer setup state + HD_PRIME_SALINE_DIALYZER_STATE = 7 # Saline dialyzer fluid path state + HD_PRIME_RESERVOIR_TWO_FILL_COMPLETE_STATE = 8 # Wait for reservoir 2 fill complete + HD_PRIME_DIALYSATE_BYPASS_STATE = 9 # Dialysate bypass fluid path state + HD_PRIME_WET_SELF_TESTS_STATE = 10 # Perform wet self-tests after priming complete + HD_PRIME_PAUSE = 11 # Prime pause state, waits to be resumed + HD_PRIME_COMPLETE = 12 # Prime complete state + NUM_OF_HD_PRIME_STATES = 13 # Number of prime sub-mode states @unique @@ -255,10 +252,9 @@ @unique class TreatmentParametersStates(DialinEnum): - HD_TREATMENT_PARAMS_MODE_STATE_START = 0 # Start treatment params mode state - HD_TREATMENT_PARAMS_MODE_STATE_WAIT_4_UI_2_SEND = 1 # Wait for UI to send treatment params mode state - HD_TREATMENT_PARAMS_MODE_STATE_WAIT_4_UI_2_CONFIRM = 2 # Wait for UI to confirm treatment params mode state - NUM_OF_HD_TREATMENT_PARAMS_MODE_STATES = 3 # Number of treatment params mode states + HD_TREATMENT_PARAMS_MODE_STATE_WAIT_4_UI_2_SEND = 0 # Wait for UI to send treatment params mode state + HD_TREATMENT_PARAMS_MODE_STATE_WAIT_4_UI_2_CONFIRM = 1 # Wait for UI to confirm treatment params mode state + NUM_OF_HD_TREATMENT_PARAMS_MODE_STATES = 2 # Number of treatment params mode states @unique @@ -272,21 +268,17 @@ TREATMENT_END_STATE = 6 # Dialysis has ended. Blood pump slowed. Dialyzer is bypassed. Dialysate is recirculated. User can rinseback NUM_OF_TREATMENT_STATES = 7 # Number of treatment states (sub-modes) - @unique class TreatmentBloodPrimeStates(DialinEnum): BLOOD_PRIME_RAMP_STATE = 0 # Ramp state of the blood prime sub-mode state machine NUM_OF_BLOOD_PRIME_STATES = 1 # Number of blood prime sub-mode states - @unique class TreatmentDialysisStates(DialinEnum): - DIALYSIS_START_STATE = 0 # Start state of the dialysis sub-mode state machine - DIALYSIS_UF_STATE = 1 # Ultrafiltration state of the dialysis sub-mode state machine - DIALYSIS_SALINE_BOLUS_STATE = 2 # Saline bolus state of the dialysis sub-mode state machine - NUM_OF_DIALYSIS_STATES = 3 # Number of dialysis sub-mode states + DIALYSIS_UF_STATE = 0 # Ultrafiltration state of the dialysis sub-mode state machine + DIALYSIS_SALINE_BOLUS_STATE = 1 # Saline bolus state of the dialysis sub-mode state machine + NUM_OF_DIALYSIS_STATES = 2 # Number of dialysis sub-mode states - @unique class TreatmentStopStates(DialinEnum): TREATMENT_STOP_RECIRC_STATE = 0 # Dialysate and Blood re-circulation state of the treatment stop sub-mode state machine @@ -295,7 +287,6 @@ TREATMENT_STOP_NO_RECIRC_STATE = 3 # No re-circulation state of the treatment stop sub-mode state machine NUM_OF_TREATMENT_STOP_STATES = 4 # Number of treatment stop sub-mode states - @unique class TreatmentRinsebackStates(DialinEnum): RINSEBACK_STOP_INIT_STATE = 0 # Start state (stopped) of the rinseback sub-mode state machine @@ -305,7 +296,6 @@ RINSEBACK_RUN_ADDITIONAL_STATE = 4 # Additional rinseback volume (10 mL) state of the rinseback sub-mode state machine NUM_OF_RINSEBACK_STATES = 5 # Number of rinseback sub-mode states - @unique class TreatmentRecircStates(DialinEnum): TREATMENT_RECIRC_RECIRC_STATE = 0 # Re-circulate Dialysate state of the treatment re-circulate sub-mode state machine @@ -319,15 +309,13 @@ TREATMENT_END_PAUSED_STATE = 1 # Paused state of the treatment end sub-mode state machine NUM_OF_TREATMENT_END_STATES = 2 # Number of treatment end sub-mode states - @unique class HDFaultStates(DialinEnum): HD_FAULT_STATE_START = 0 # Start fault state HD_FAULT_STATE_RUN_NV_POSTS = 1 # HD fault run NV posts state HD_FAULT_STATE_COMPLETE = 2 # HD fault run complete state NUM_OF_HD_FAULT_STATES = 3 # Number of fault mode states - @unique class HDEventList(DialinEnum): HD_EVENT_STARTUP = 0 # HD startup event @@ -349,7 +337,6 @@ HD_EVENT_SUB_STATE_CHANGE = 16 # HD Op sub-state change event NUM_OF_EVENT_IDS = 17 # Total number of HD events - @unique class HDEventDataType(DialinEnum): EVENT_DATA_TYPE_NONE = 0 @@ -361,10 +348,9 @@ @unique class UFStates(DialinEnum): - UF_START_STATE = 0 # Start state of the ultrafiltration state machine - UF_PAUSED_STATE = 1 # Paused state of the ultrafiltration state machine - UF_RUNNING_STATE = 2 # Running state of the ultrafiltration state machine - NUM_OF_UF_STATES = 3 # Number of ultrafiltration states + UF_PAUSED_STATE = 0 # Paused state of the ultrafiltration state machine + UF_RUNNING_STATE = 1 # Running state of the ultrafiltration state machine + NUM_OF_UF_STATES = 2 # Number of ultrafiltration states @unique class SalineBolusStates(DialinEnum): Index: dialin/dg/chemical_disinfect.py =================================================================== diff -u -rff18efc549b1029e3c4b76946c83d544e063b2d8 -r7fe939e59e034a80456d9f865c6fda428c2ae861 --- dialin/dg/chemical_disinfect.py (.../chemical_disinfect.py) (revision ff18efc549b1029e3c4b76946c83d544e063b2d8) +++ dialin/dg/chemical_disinfect.py (.../chemical_disinfect.py) (revision 7fe939e59e034a80456d9f865c6fda428c2ae861) @@ -8,7 +8,7 @@ # @file chemical_disinfect.py # # @author (last) Dara Navaei -# @date (last) 14-Jan-2023 +# @date (last) 03-Feb-2023 # @author (original) Dara Navaei # @date (original) 02-May-2021 # Index: dialin/dg/heat_disinfect.py =================================================================== diff -u -r32001abdfb62770761771b563eb6ff517152fc76 -r7fe939e59e034a80456d9f865c6fda428c2ae861 --- dialin/dg/heat_disinfect.py (.../heat_disinfect.py) (revision 32001abdfb62770761771b563eb6ff517152fc76) +++ dialin/dg/heat_disinfect.py (.../heat_disinfect.py) (revision 7fe939e59e034a80456d9f865c6fda428c2ae861) @@ -8,7 +8,7 @@ # @file heat_disinfect.py # # @author (last) Dara Navaei -# @date (last) 19-Dec-2022 +# @date (last) 03-Feb-2023 # @author (original) Dara Navaei # @date (original) 27-Feb-2021 # @@ -17,10 +17,10 @@ from enum import unique from logging import Logger -from ..common.msg_defs import MsgIds -from ..protocols.CAN import DenaliChannels, DenaliMessage +from ..common.msg_defs import MsgIds, MsgFieldPositions +from ..protocols.CAN import DenaliMessage, DenaliChannels from ..utils.base import AbstractSubSystem, publish, DialinEnum -from ..utils.conversions import * +from ..utils.conversions import integer_to_bytearray @unique @@ -57,6 +57,18 @@ CANCELLATION_MODE_COLD = 3 +@unique +class NelsonSupportModes(DialinEnum): + NELSON_NONE = 0 + NELSON_INOCULATE = 1 + NELSON_HEAT_DISINFECT = 2 + NELSON_POS_CONTROL_CHEM_DISINFECT = 3 + NELSON_POS_CONTROL_HEAT_DISINFECT = 4 + NELSON_CHEM_DISINFECT = 5 + NELSON_DRAIN_SAMPLE = 6 + NUM_OF_NELSON_SUPPORT = 7 + + class HeatDisinfect(AbstractSubSystem): """ Heat Disinfection class with APIs to set the timing of each of the stages. @@ -73,7 +85,10 @@ self.overall_elapsed_time = 0 self.state_elapsed_time = 0 self.heat_disinfect_target_time = 0 - self.heat_disinfect_count_down_time = 0 + self.disinfect_ro_77_time_s = 0 + self.disinfect_ro_82_time_s = 0 + self.disinfect_r_77_time_s = 0 + self.disinfect_r_82_time_s = 0 self.cancellation_mode = 0 self.r1_level = 0 self.r2_level = 0 @@ -106,7 +121,6 @@ self.r2_level = 0 self.heat_disinfect_ui_state = 0 - @publish(["heat_disinfect_target_time", "heat_disinfect_count_down_time"]) def _handler_heat_disinfect_to_ui_sync(self, message): """ @@ -115,14 +129,27 @@ @param message: published heat disinfect UI data message @returns none """ + disinfect_target_time = struct.unpack('i', bytearray( + message['message'][MsgFieldPositions.START_POS_FIELD_1:MsgFieldPositions.END_POS_FIELD_1]))[0] + ro_77 = struct.unpack('i', bytearray( + message['message'][MsgFieldPositions.START_POS_FIELD_2:MsgFieldPositions.END_POS_FIELD_2]))[0] + ro_82 = struct.unpack('i', bytearray( + message['message'][MsgFieldPositions.START_POS_FIELD_3:MsgFieldPositions.END_POS_FIELD_3]))[0] + r_77 = struct.unpack('i', bytearray( + message['message'][MsgFieldPositions.START_POS_FIELD_4:MsgFieldPositions.END_POS_FIELD_4]))[0] + r_82 = struct.unpack('i', bytearray( + message['message'][MsgFieldPositions.START_POS_FIELD_5:MsgFieldPositions.END_POS_FIELD_5]))[0] payload = message['message'] index = DenaliMessage.PAYLOAD_START_INDEX disinfect_target_time, index = bytearray_to_integer(payload, index, False) disinfect_count_down_time, index = bytearray_to_integer(payload, index, False) self.heat_disinfect_target_time = int(disinfect_target_time / 1000) - self.heat_disinfect_count_down_time = disinfect_count_down_time + self.disinfect_ro_77_time_s = ro_77 + self.disinfect_ro_82_time_s = ro_82 + self.disinfect_r_77_time_s = r_77 + self.disinfect_r_82_time_s = r_82 @publish(["heat_disinfect_state", "overall_elapsed_time", "state_elapsed_time", "cancellation_mode", "r1_level", "r2_level", "heat_disinfect_ui_state"]) @@ -223,3 +250,37 @@ @return: (int) """ return self.heat_disinfect_state + + def cmd_set_nelson_support_mode(self, support: int): + """ + Constructs and sends a command to set the firmware to a certain Nelson support + Constraints: + Must be logged into DG. This code only works on a firmware that has been built in debug mode. + + @param support: (int) the type of Nelson support + NELSON_NONE = 0 + NELSON_INOCULATE = 1 + NELSON_HEAT_DISINFECT = 2 + NELSON_POS_CONTROL_CHEM_DISINFECT = 3 + NELSON_POS_CONTROL_HEAT_DISINFECT = 4 + NELSON_CHEM_DISINFECT = 5 + NELSON_DRAIN_SAMPLE = 6 + NUM_OF_NELSON_SUPPORT = 7 + @returns none + """ + payload = integer_to_bytearray(support) + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, + message_id=MsgIds.MSG_ID_DG_NELSON_DISINFECT_SUPPORT.value, + payload=payload) + + self.logger.debug("Setting Nelson support to " + NelsonSupportModes(support).name) + received_message = self.can_interface.send(message, 0) + + # If there is content... + if received_message is not None: + # response payload is OK or not OK + return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] + else: + self.logger.debug("Timeout!!!!") + return False + Index: dialin/hd/alarms.py =================================================================== diff -u -ra91ed2564416e9d1e96522fb3a9d26abe60139d5 -r7fe939e59e034a80456d9f865c6fda428c2ae861 --- dialin/hd/alarms.py (.../alarms.py) (revision a91ed2564416e9d1e96522fb3a9d26abe60139d5) +++ dialin/hd/alarms.py (.../alarms.py) (revision 7fe939e59e034a80456d9f865c6fda428c2ae861) @@ -7,8 +7,8 @@ # # @file alarms.py # -# @author (last) Dara Navaei -# @date (last) 21-Dec-2022 +# @author (last) Sean Nash +# @date (last) 02-Feb-2023 # @author (original) Peter Lucia # @date (original) 02-Apr-2020 # @@ -131,7 +131,7 @@ # If U32 is in the data type enum (i.e. EVENT_DATA_TYPE_U32), then the key is the enum and the value is # the corresponding format in the python struct - if 'U32' in event_data_type or 'BOOL' in event_data_type: + if 'U32' in event_data_type or 'BOOL' in event_data_type or 'NONE' in event_data_type: struct_unpack_type = 'I' elif 'S32' in event_data_type: struct_unpack_type = 'i' @@ -462,7 +462,7 @@ message['message'][self.START_POS_ALARMS_FLAGS:self.END_POS_ALARMS_FLAGS]), byteorder=DenaliMessage.BYTE_ORDER) - @publish(["alarm_states", "alarm_conditions"]) + @publish(["alarm_states", "alarm_conditions", "alarm_priorities", "alarm_ranks", "alarm_clear_top_only_flags"]) def _handler_alarm_activate(self, message): """ Handles published HD alarm activation messages. @@ -475,15 +475,15 @@ data_typ_1 = struct.unpack('i', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_2:MsgFieldPositions.END_POS_FIELD_2])) # Get the corresponding structure format - struct_data_type = self.alarm_data_type[HDEventDataType(data_typ_1).name] + struct_data_type_1 = self.alarm_data_type[HDEventDataType(data_typ_1[0]).name] # Get the data value by unpacking the data type - data_1 = struct.unpack(struct_data_type, bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_3:MsgFieldPositions.END_POS_FIELD_3])) + data_1 = struct.unpack(struct_data_type_1, bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_3:MsgFieldPositions.END_POS_FIELD_3])) data_typ_2 = struct.unpack('i', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_4:MsgFieldPositions.END_POS_FIELD_4])) # Get the corresponding structure format - struct_data_type = self.alarm_data_type[HDEventDataType(data_typ_2).name] + struct_data_type_2 = self.alarm_data_type[HDEventDataType(data_typ_2[0]).name] # Get the data value by unpacking the data type - data_2 = struct.unpack(struct_data_type, bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_5:MsgFieldPositions.END_POS_FIELD_5])) + data_2 = struct.unpack(struct_data_type_2, bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_5:MsgFieldPositions.END_POS_FIELD_5])) priority = struct.unpack('i', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_6:MsgFieldPositions.END_POS_FIELD_6])) rank = struct.unpack('i', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_7:MsgFieldPositions.END_POS_FIELD_7])) Index: dialin/hd/battery.py =================================================================== diff -u -r32001abdfb62770761771b563eb6ff517152fc76 -r7fe939e59e034a80456d9f865c6fda428c2ae861 --- dialin/hd/battery.py (.../battery.py) (revision 32001abdfb62770761771b563eb6ff517152fc76) +++ dialin/hd/battery.py (.../battery.py) (revision 7fe939e59e034a80456d9f865c6fda428c2ae861) @@ -52,6 +52,7 @@ self.RemainingCapacity = 0 self.BatteryStatus = 0 self.BatteryChargerStatus = 0 + self.BatteryCommStatus = 0 # values from battery manager message self.RemainingCapacityAlarm = 0 @@ -87,7 +88,8 @@ self.status_values = [ [self.RemainingCapacity, "RemainingCapacity", "mah", "mWh"], [self.BatteryStatus, "BatteryStatus", "bits", None], - [self.BatteryChargerStatus, "BatteryChargerStatus", "bits", None]] + [self.BatteryChargerStatus, "BatteryChargerStatus", "bits", None], + [self.BatteryCommStatus, "BatteryCommStatus", "bits", None]] self.manager_values = [ [self.RemainingCapacityAlarm, "RemainingCapacityAlarm", "int", "mAh"], @@ -144,7 +146,7 @@ """ return self.manager_values - @publish(['RemainingCapacity', 'BatteryStatus', 'BatteryChargerStatus']) + @publish(['RemainingCapacity', 'BatteryStatus', 'BatteryChargerStatus', 'BatteryCommStatus']) def _handler_battery_status_sync(self, message): """ Handles published battery data messages. Battery data are captured @@ -264,3 +266,128 @@ else: self.logger.debug("Timeout!!!!") return False + + def cmd_battery_status_override(self, status: int, reset: int = NO_RESET) -> int: + """ + Constructs and sends the battery remaining capacity (in mWh) override \n + command. + BATTERY_PACK_ERROR_BITS = 0x000F + Constraints: + Must be logged into HD. + + @param status: int - the battery comm status as a bit map. + + @param reset: integer - 1 to reset a previous override, 0 to override + @return: 1 if successful, zero otherwise + """ + + rst = integer_to_bytearray(reset) + sts = integer_to_bytearray(status) + payload = rst + sts + + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, + message_id=MsgIds.MSG_ID_HD_BATTERY_STATUS_OVERRIDE.value, + payload=payload) + + self.logger.debug("override HD battery status") + + # Send message + received_message = self.can_interface.send(message) + + # If there is content... + if received_message is not None: + # self.logger.debug(received_message) + if reset == RESET: + str_res = "reset back to normal" + else: + str_res = str(sts) + self.logger.debug("HD battery status overridden to " + str_res + " " + + str(received_message['message'][DenaliMessage.PAYLOAD_START_INDEX])) + # response payload is OK or not OK + return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] + else: + self.logger.debug("Timeout!!!!") + return False + + def cmd_battery_charger_status_override(self, status: int, reset: int = NO_RESET) -> int: + """ + Constructs and sends the battery charger status override command. + Setting BATTERY_CHARGER_STATUS_AC_PRESENT_MASK to 0 causes the HD to assume battery power. + Constraints: + Must be logged into HD. + + @param status: int - the bit map for the charger status register. + BATTERY_CHARGER_STATUS_AC_PRESENT_MASK = 0x8000 + @param reset: integer - 1 to reset a previous override, 0 to override + @return: 1 if successful, zero otherwise + """ + + rst = integer_to_bytearray(reset) + sts = integer_to_bytearray(status) + payload = rst + sts + + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, + message_id=MsgIds.MSG_ID_HD_BATTERY_CHARGER_STATUS_OVERRIDE.value, + payload=payload) + + self.logger.debug("override HD battery charger status.") + + # Send message + received_message = self.can_interface.send(message) + + # If there is content... + if received_message is not None: + # self.logger.debug(received_message) + if reset == RESET: + str_res = "reset back to normal" + else: + str_res = str(sts) + self.logger.debug("HD battery charger status overridden to " + str_res + " " + + str(received_message['message'][DenaliMessage.PAYLOAD_START_INDEX])) + # response payload is OK or not OK + return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] + else: + self.logger.debug("Timeout!!!!") + return False + + def cmd_battery_comm_status_override(self, status: int, reset: int = NO_RESET) -> int: + """ + Constructs and sends the battery comm status override command. \n + This overrides the I2C status register. \n + Constraints: + Must be logged into HD. + + @param status: int - the bit map for the i2c status register. + I2C_AL = 0x0001, /* arbitration lost */ + I2C_NACK = 0x0002, /* no acknowledgement */ + @param reset: integer - 1 to reset a previous override, 0 to override + @return: 1 if successful, zero otherwise + """ + + rst = integer_to_bytearray(reset) + sts = integer_to_bytearray(status) + payload = rst + sts + + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, + message_id=MsgIds.MSG_ID_HD_BATTERY_COMM_STATUS_OVERRIDE.value, + payload=payload) + + self.logger.debug("override HD battery comm status.") + + # Send message + received_message = self.can_interface.send(message) + + # If there is content... + if received_message is not None: + # self.logger.debug(received_message) + if reset == RESET: + str_res = "reset back to normal" + else: + str_res = str(sts) + self.logger.debug("HD battery comm status overridden to " + str_res + " " + + str(received_message['message'][DenaliMessage.PAYLOAD_START_INDEX])) + # response payload is OK or not OK + return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] + else: + self.logger.debug("Timeout!!!!") + return False \ No newline at end of file Index: dialin/hd/rtc.py =================================================================== diff -u -r32001abdfb62770761771b563eb6ff517152fc76 -r7fe939e59e034a80456d9f865c6fda428c2ae861 --- dialin/hd/rtc.py (.../rtc.py) (revision 32001abdfb62770761771b563eb6ff517152fc76) +++ dialin/hd/rtc.py (.../rtc.py) (revision 7fe939e59e034a80456d9f865c6fda428c2ae861) @@ -17,7 +17,8 @@ import struct from ..common.msg_defs import MsgIds, MsgFieldPositions from logging import Logger - +from .constants import RESET, NO_RESET +from ..common.msg_defs import MsgIds from ..protocols.CAN import DenaliMessage, DenaliChannels from ..utils.base import AbstractSubSystem, publish from ..utils.conversions import integer_to_bytearray @@ -136,3 +137,96 @@ else: self.logger.debug("Timeout!!!!") return False + + def cmd_rtc_ctl_reg1_status_override(self, status: int = 0, reset: int = NO_RESET) -> int: + """ + Constructs and sends the HD RTC control register 1 status override command + Constraints: + Must be logged into HD. + + @param status: status is a bit map containing a set of bits that represent status + from the RTC status register. Specified below + + RTC_REG_1_12_HOUR_MODE_MASK = 0x0004 ( 4 ) + RTC_REG_1_PORO = 0x0008 ( 8 ) + RTC_REG_1_CLK_STOPPED_MASK = 0x0020 ( 32 ) + RTC_REG_1_UNUSED_MASK = 0x0040 ( 64 ) + RTC_REG_1_EXT_CLK_MODE_MASK = 0x0080 ( 128 ) + + more than one status bit can be sent. + Ex: to set RTC_REG_1_PORO and RTC_REG_1_CLK_STOPPED_MASK, status should be 40 (0x0028). + + @param reset: integer - 1 to reset a previous override, 0 to override + @return: 1 if successful, zero otherwise + """ + + rst = integer_to_bytearray(reset) + sts = integer_to_bytearray(status & 0x0000FFFF) + payload = rst + sts + + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, + message_id=MsgIds.MSD_ID_HD_RTC_CTL_REG1_STATUS_OVERRIDE.value, + payload=payload) + + self.logger.debug("override HD RTC Control Register 1 status") + + # Send message + received_message = self.can_interface.send(message) + + # If there is content... + if received_message is not None: + if reset == RESET: + str_res = "reset back to normal: " + else: + str_res = str(status) + self.logger.debug("HD RTC Control Register 1 status overridden to " + str_res + + str(received_message['message'][DenaliMessage.PAYLOAD_START_INDEX])) + # response payload is OK or not OK + return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] + else: + self.logger.debug("Timeout!!!!") + return False + + def cmd_rtc_ctl_reg3_status_override(self, status: int = 0, reset: int = NO_RESET) -> int: + """ + Constructs and sends the HD RTC control register 3 status override command + Constraints: + Must be logged into HD. + + @param status: status is a bit map containing a set of bits that represent status + from the RTC status register. Specified below + + RTC_REG_3_BLF_MASK = 0x0004 ( 4 ) + + more than one status bit can be sent + + @param reset: integer - 1 to reset a previous override, 0 to override + @return: 1 if successful, zero otherwise + """ + + rst = integer_to_bytearray(reset) + sts = integer_to_bytearray(status & 0x0000FFFF) + payload = rst + sts + + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, + message_id=MsgIds.MSD_ID_HD_RTC_CTL_REG3_STATUS_OVERRIDE.value, + payload=payload) + + self.logger.debug("override HD RTC Control Register 3 status") + + # Send message + received_message = self.can_interface.send(message) + + # If there is content... + if received_message is not None: + if reset == RESET: + str_res = "reset back to normal: " + else: + str_res = str(status) + self.logger.debug("HD RTC Control Register 3 status status overridden to " + str_res + + str(received_message['message'][DenaliMessage.PAYLOAD_START_INDEX])) + # response payload is OK or not OK + return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] + else: + self.logger.debug("Timeout!!!!") + return False \ No newline at end of file Index: tests/dg_tests.py =================================================================== diff -u -rff18efc549b1029e3c4b76946c83d544e063b2d8 -r7fe939e59e034a80456d9f865c6fda428c2ae861 --- tests/dg_tests.py (.../dg_tests.py) (revision ff18efc549b1029e3c4b76946c83d544e063b2d8) +++ tests/dg_tests.py (.../dg_tests.py) (revision 7fe939e59e034a80456d9f865c6fda428c2ae861) @@ -8,7 +8,7 @@ # @file dg_tests.py # # @author (last) Dara Navaei -# @date (last) 18-Jan-2023 +# @date (last) 03-Feb-2023 # @author (original) Dara Navaei # @date (original) 16-Jan-2022 # @@ -19,7 +19,7 @@ from dialin.hd.hemodialysis_device import HD from dialin.ui.hd_simulator import HDSimulator from dialin.common.dg_defs import DGHeatDisinfectStates, DGHeatDisinfectUIStates -from dialin.dg.heat_disinfect import HeatCancellationModes +from dialin.dg.heat_disinfect import HeatCancellationModes, NelsonSupportModes from dialin.common.dg_defs import DGChemicalDisinfectStates, DGChemDisinfectUIStates from dialin.common.dg_defs import DGChemDisinfectFlushStates, DGChemDisinfectFlushUIStates from dialin.dg.chemical_disinfect import ChemCancellationModes @@ -59,6 +59,7 @@ state = 0 state_elapsed_time = 0 overall_elapsed_time = 0 + if dg.dg_operation_mode == 10: state = DGChemicalDisinfectStates(dg.chemical_disinfect.chemical_disinfect_state).name overall_elapsed_time = dg.chemical_disinfect.overall_elapsed_time @@ -116,12 +117,13 @@ overall_elapsed_time = dg.heat_disinfect_active_cool.overall_elapsed_time state_elapsed_time = dg.heat_disinfect_active_cool.state_elapsed_time - info = ('State, {}, Overall_elapsed_time, {}, State_elapsed_time, {}, Disinfect_elapsed_time, {}, ' - 'R1_level, {:5.3f}, R2_level, {:5.3f}, Top_alarm, {}, UI_state, {}, ' - .format(state, overall_elapsed_time, state_elapsed_time, - dg.heat_disinfect.heat_disinfect_count_down_time, dg.heat_disinfect.r1_level, - dg.heat_disinfect.r2_level, hd.alarms.alarm_top, - DGHeatDisinfectUIStates(dg.heat_disinfect.heat_disinfect_ui_state).name)) + info = ('State, {}, Overall_elapsed_time, {}, State_elapsed_time, {}, Disinfect_RO_77, {}, Disinfect_RO_82, {}, ' + 'Disinfect_R_77, {}, Disinfect_R_82, {}, R1_level, {:5.3f}, R2_level, {:5.3f}, Top_alarm, {}, UI_state, {},' + ' ' + .format(state, overall_elapsed_time, state_elapsed_time, dg.heat_disinfect.disinfect_ro_77_time_s, + dg.heat_disinfect.disinfect_ro_82_time_s, dg.heat_disinfect.disinfect_r_77_time_s, + dg.heat_disinfect.disinfect_r_82_time_s, dg.heat_disinfect.r1_level, dg.heat_disinfect.r2_level, + hd.alarms.alarm_top, DGHeatDisinfectUIStates(dg.heat_disinfect.heat_disinfect_ui_state).name)) return info @@ -307,8 +309,9 @@ def get_uv_reactors_info(): - info = ('Inlet_status, {}, Outlet_status, {}, ' - .format(dg.uv_reactors.inlet_uv_reactor_state, dg.uv_reactors.outlet_uv_reactor_state)) + info = ('Inlet_status, {}, Outlet_status, {}, Inlet_health, {}, Outlet_health, {}, ' + .format(dg.uv_reactors.inlet_uv_reactor_state, dg.uv_reactors.outlet_uv_reactor_state, + dg.uv_reactors.inlet_uv_reactor_health, dg.uv_reactors.outlet_uv_reactor_health)) return info @@ -461,6 +464,7 @@ #dg.heaters.cmd_heaters_broadcast_interval_override(50) #sleep(1) + #dg.uv_reactors.cmd_uv_reactors_data_broadcast_interval_override(50) #dg.voltages.cmd_monitored_voltages_broadcast_interval_override(50) #dg.concentrate_pumps.cmd_concentrate_pump_broadcast_interval_override(50) #sleep(1) @@ -558,8 +562,8 @@ def run_chemical_disinfect(): complete_counter = 1 f = open("/home/fw/projects/dialin/tests/chemical_disinfect.log", "w") - #dg.hd_proxy.cmd_start_stop_dg_chemical_disinfect() - dg.hd_proxy.cmd_start_stop_dg_chemical_disinfect_flush() + dg.hd_proxy.cmd_start_stop_dg_chemical_disinfect() + #dg.hd_proxy.cmd_start_stop_dg_chemical_disinfect_flush() try: while True: @@ -598,49 +602,6 @@ f.close() -def run_chem_disinfect_flush_mode(): - complete_counter = 1 - f = open("/home/fw/projects/dialin/tests/chem_disinfect_flush_mode.log", "w") - dg.hd_proxy.cmd_start_stop_dg_chemical_disinfect_flush() - #dg.cmd_dg_software_reset_request() - - try: - while True: - flush = get_chemical_disinfect_flush_mode_info() - load_cell = get_load_cells_info() - drain = get_drain_states_info() - ro = get_ro_info() - temp = get_temperature_sensors_info() - conc = get_concentrate_pumps_info() - valves = get_dg_valves_states() - - var = flush + load_cell + drain + ro + temp + conc + valves + '\r' - - print(var) - f.write(var) - sleep(1) - - # If the mode came back to standby or standby solo - if dg.dg_operation_mode == 3 or dg.dg_operation_mode == 4: - - # Write a few more complete states to make sure the complete state items are recorded - if complete_counter == 3: - f.close() - #events = dg.events.get_dg_events(2, 60) - #for event in events: - # print(event) - break - - complete_counter += 1 - - except KeyboardInterrupt: - dg.hd_proxy.cmd_start_stop_dg_chemical_disinfect_flush(start=False) - f.close() - #events = dg.events.get_dg_events(2, 50) - #for event in events: - # print(event) - - def cmd_set_disinfect_ui_screen(): hd = HD() sleep(0.5) @@ -695,30 +656,38 @@ # print(event) -def test_dvt_drain_pump(): - dg.drain_pump.cmd_drain_pump_set_rpm(2000) +def run_nelson_support_modes(): + + dg.heat_disinfect.cmd_set_nelson_support_mode(NelsonSupportModes.NELSON_POS_CONTROL_HEAT_DISINFECT.value) + + f = open("/home/fw/projects/dialin/tests/Nelson_Support.log", "w") + try: while True: - print(get_drain_states_info(), get_temperature_sensors_info(), get_dg_fans_info()) - sleep(1) - except KeyboardInterrupt: - dg.drain_pump.cmd_drain_pump_set_rpm(0) + disinfect = get_heat_disinfect_mode_info() + #disinfect = get_chemical_disinfect_mode_info() + drain = get_drain_states_info() + load_cell = get_load_cells_info() + valves = get_dg_valves_states() + ro = get_ro_info() + temp = get_temperature_sensors_info() + heaters = get_heaters_info() + uv = get_uv_reactors_info() + dg_fans = get_dg_fans_info() + hd_fans = get_hd_fans_info() + conc = get_concentrate_pumps_info() -def test_hd_valves(): - while True: + var = disinfect + load_cell + drain + ro + temp + heaters + uv + dg_fans + hd_fans + valves + conc + '\r' - #VALVE_POSITION_A_INSERT_EJECT = 1 - #VALVE_POSITION_B_OPEN = 2 - #VALVE_POSITION_C_CLOSE = 3 - # + print(var) + f.write(var) + sleep(1) - hd.valves.cmd_set_hd_valve_position(3,3) - sleep(2) - hd.valves.cmd_set_hd_valve_position(3,2) - sleep(2) - hd.valves.cmd_set_hd_valve_position(3,1) - sleep(2) + except KeyboardInterrupt: + dg.hd_proxy.cmd_start_stop_dg_heat_disinfect(start=False) + dg.hd_proxy.cmd_start_stop_dg_chemical_disinfect(start=False) + f.close() if __name__ == "__main__": @@ -745,6 +714,8 @@ #collect_hd_treatment() + run_nelson_support_modes() + #while True: # print(get_hd_fans_info(), get_dg_fans_info(), get_temperature_sensors_info()) # print(get_dg_valves_states()) @@ -754,27 +725,19 @@ # print(dg.rtc.get_rtc_epoch(), hd.rtc.get_rtc_epoch()) # sleep(1) - #test_dg_fans_alarms() - - #test_dvt_drain_pump() - - #test_conc_pumps() - - #while True: - # print(get_concentrate_pumps_info()) - # sleep(1) - #ui = HDSimulator() #ui.cmd_send_hd_operation_mode(3, 1) - #test_hd_valves() - #hd.ui.cmd_ui_set_dg_service_time() - #dg.heaters.cmd_heater_duty_cycle_override(1, 10, reset=1) - #hd.cmd_hd_software_reset_request() - #dg.cmd_dg_set_operation_mode(2) - hd.cmd_hd_set_operation_mode(2) + #dg.cmd_dg_software_reset_request() + #sleep(6) + #dg.temperatures.cmd_temperatures_value_override(0, 30) + #sleep(1) + #dg.valves.cmd_valve_override(8, 1) + #sleep(1) + #dg.pressures.cmd_pressure_override(0, 4) + #dg.conductivity_sensors.cmd_conductivity_sensor_override(0, 3000) Index: tools/Code_Report.csv =================================================================== diff -u -rce2b50e3e4d037d18a258f94c1f549b0c1a1f87a -r7fe939e59e034a80456d9f865c6fda428c2ae861 --- tools/Code_Report.csv (.../Code_Report.csv) (revision ce2b50e3e4d037d18a258f94c1f549b0c1a1f87a) +++ tools/Code_Report.csv (.../Code_Report.csv) (revision 7fe939e59e034a80456d9f865c6fda428c2ae861) @@ -136,6 +136,7 @@ ./dg/heat_disinfect.py, Function, get_heat_disinfect_r2_level(self) -> int: ./dg/heat_disinfect.py, Function, get_heat_disinfect_heat_disinfect_ui_state(self) -> int: ./dg/heat_disinfect.py, Function, clear_heat_disinfect_info(self) -> None: +./dg/heat_disinfect.py, Function, cmd_set_nelson_support_mode(self, support: int): ./dg/heaters.py, Function, get_trimmer_heater_duty_cycle(self): ./dg/heaters.py, Function, get_primary_heater_target_temperature(self): ./dg/heaters.py, Function, get_trimmer_heater_target_temperature(self): @@ -770,7 +771,10 @@ dg/heat_disinfect.py, Variable, overall_elapsed_time dg/heat_disinfect.py, Variable, state_elapsed_time dg/heat_disinfect.py, Variable, heat_disinfect_target_time -dg/heat_disinfect.py, Variable, heat_disinfect_count_down_time +dg/heat_disinfect.py, Variable, disinfect_ro_77_time_s +dg/heat_disinfect.py, Variable, disinfect_ro_82_time_s +dg/heat_disinfect.py, Variable, disinfect_r_77_time_s +dg/heat_disinfect.py, Variable, disinfect_r_82_time_s dg/heat_disinfect.py, Variable, cancellation_mode dg/heat_disinfect.py, Variable, r1_level dg/heat_disinfect.py, Variable, r2_level @@ -1587,6 +1591,7 @@ common/dg_defs.py, Enum, DGHeatDisinfectStates, DG_HEAT_DISINFECT_STATE_CANCEL_BASIC_PATH common/dg_defs.py, Enum, DGHeatDisinfectStates, DG_HEAT_DISINFECT_STATE_CANCEL_WATER_PATH common/dg_defs.py, Enum, DGHeatDisinfectStates, DG_HEAT_DISINFECT_STATE_COMPLETE +common/dg_defs.py, Enum, DGHeatDisinfectStates, DG_NELSON_HEAT_DISINFECT_STATE_FILL_R1_WITH_WATER common/dg_defs.py, Enum, DGHeatDisinfectStates, NUM_OF_DG_HEAT_DISINFECT_STATES common/dg_defs.py, Enum, DGHeatDisinfectUIStates, DGHeatDisinfectUIStates common/dg_defs.py, Enum, DGHeatDisinfectUIStates, HEAT_DISINFECT_UI_STATE_NOT_RUNNING @@ -1730,7 +1735,6 @@ common/hd_defs.py, Enum, HDInitStates, POST_STATE_FAILED common/hd_defs.py, Enum, HDInitStates, NUM_OF_POST_STATES common/hd_defs.py, Enum, PreTreatmentSubModes, PreTreatmentSubModes -common/hd_defs.py, Enum, PreTreatmentSubModes, HD_PRE_TREATMENT_START_STATE common/hd_defs.py, Enum, PreTreatmentSubModes, HD_PRE_TREATMENT_WATER_SAMPLE_STATE common/hd_defs.py, Enum, PreTreatmentSubModes, HD_PRE_TREATMENT_SELF_TEST_CONSUMABLE_STATE common/hd_defs.py, Enum, PreTreatmentSubModes, HD_PRE_TREATMENT_SELF_TEST_NO_CART_STATE @@ -1747,14 +1751,12 @@ common/hd_defs.py, Enum, PreTreatmentSampleWaterStates, NUM_OF_SAMPLE_WATER_STATES common/hd_defs.py, Enum, PreTreatmentConsumableSelfTestStates, PreTreatmentConsumableSelfTestStates common/hd_defs.py, Enum, PreTreatmentConsumableSelfTestStates, CONSUMABLE_SELF_TESTS_INSTALL_STATE -common/hd_defs.py, Enum, PreTreatmentConsumableSelfTestStates, CONSUMABLE_SELF_TESTS_FILL_CMD_STATE -common/hd_defs.py, Enum, PreTreatmentConsumableSelfTestStates, CONSUMABLE_SELF_TESTS_WATER_QUALITY_CHECK_STATE +common/hd_defs.py, Enum, PreTreatmentConsumableSelfTestStates, CONSUMABLE_SELF_TESTS_PRIME_STATE common/hd_defs.py, Enum, PreTreatmentConsumableSelfTestStates, CONSUMABLE_SELF_TESTS_BICARB_PUMP_CHECK_STATE common/hd_defs.py, Enum, PreTreatmentConsumableSelfTestStates, CONSUMABLE_SELF_TESTS_ACID_PUMP_CHECK_STATE common/hd_defs.py, Enum, PreTreatmentConsumableSelfTestStates, CONSUMABLE_SELF_TESTS_COMPLETE_STATE common/hd_defs.py, Enum, PreTreatmentConsumableSelfTestStates, NUM_OF_CONSUMABLE_SELF_TESTS_STATES common/hd_defs.py, Enum, PreTreatmentNoCartSelfTestStates, PreTreatmentNoCartSelfTestStates -common/hd_defs.py, Enum, PreTreatmentNoCartSelfTestStates, NO_CART_SELF_TESTS_START_STATE common/hd_defs.py, Enum, PreTreatmentNoCartSelfTestStates, NO_CART_SELF_TESTS_WAIT_FOR_DOOR_CLOSE_STATE common/hd_defs.py, Enum, PreTreatmentNoCartSelfTestStates, NO_CART_SELF_TESTS_PRESSURE_CHECKS_STATE common/hd_defs.py, Enum, PreTreatmentNoCartSelfTestStates, NO_CART_SELF_TESTS_HOME_VALVES_STATE @@ -1766,8 +1768,8 @@ common/hd_defs.py, Enum, PreTreatmentNoCartSelfTestStates, NUM_OF_NO_CART_SELF_TESTS_STATES common/hd_defs.py, Enum, PreTreatmentWetSelfTestStates, PreTreatmentWetSelfTestStates common/hd_defs.py, Enum, PreTreatmentWetSelfTestStates, WET_SELF_TESTS_START_STATE -common/hd_defs.py, Enum, PreTreatmentWetSelfTestStates, WET_SELF_TESTS_SETUP_STATE -common/hd_defs.py, Enum, PreTreatmentWetSelfTestStates, WET_SELF_TESTS_BUBBLES_STATE +common/hd_defs.py, Enum, PreTreatmentWetSelfTestStates, WET_SELF_TESTS_BUBBLE_CHECK_SETUP_STATE +common/hd_defs.py, Enum, PreTreatmentWetSelfTestStates, WET_SELF_TESTS_BUBBLE_CHECK_STATE common/hd_defs.py, Enum, PreTreatmentWetSelfTestStates, WET_SELF_TESTS_PRIME_CHECK_STATE common/hd_defs.py, Enum, PreTreatmentWetSelfTestStates, WET_SELF_TESTS_BLOOD_LEAK_DETECTOR_STATE common/hd_defs.py, Enum, PreTreatmentWetSelfTestStates, WET_SELF_TESTS_FIRST_DISPLACEMENT_SETUP_STATE @@ -1795,6 +1797,7 @@ common/hd_defs.py, Enum, SyringePumpStates, SYRINGE_PUMP_INIT_STATE common/hd_defs.py, Enum, SyringePumpStates, SYRINGE_PUMP_OFF_STATE common/hd_defs.py, Enum, SyringePumpStates, SYRINGE_PUMP_RETRACT_STATE +common/hd_defs.py, Enum, SyringePumpStates, SYRINGE_PUMP_PRELOAD_STATE common/hd_defs.py, Enum, SyringePumpStates, SYRINGE_PUMP_SEEK_STATE common/hd_defs.py, Enum, SyringePumpStates, SYRINGE_PUMP_PRIME_STATE common/hd_defs.py, Enum, SyringePumpStates, SYRINGE_PUMP_HEP_BOLUS_STATE @@ -1820,7 +1823,7 @@ common/hd_defs.py, Enum, PreTreatmentDrySelfTestsStates, DRY_SELF_TESTS_START_STATE common/hd_defs.py, Enum, PreTreatmentDrySelfTestsStates, DRY_SELF_TESTS_WAIT_FOR_DOOR_CLOSE_STATE common/hd_defs.py, Enum, PreTreatmentDrySelfTestsStates, DRY_SELF_TESTS_USED_CARTRIDGE_CHECK_STATE -common/hd_defs.py, Enum, PreTreatmentDrySelfTestsStates, DRY_SELF_TESTS_OCCLUSION_SENSORS_STATE +common/hd_defs.py, Enum, PreTreatmentDrySelfTestsStates, DRY_SELF_TESTS_CARTRIDGE_LOADED_CHECK_STATE common/hd_defs.py, Enum, PreTreatmentDrySelfTestsStates, DRY_SELF_TESTS_PRESSURE_SENSORS_NORMAL_SETUP_STATE common/hd_defs.py, Enum, PreTreatmentDrySelfTestsStates, DRY_SELF_TESTS_PRESSURE_SENSORS_VENOUS_SETUP_STATE common/hd_defs.py, Enum, PreTreatmentDrySelfTestsStates, DRY_SELF_TESTS_PRESSURE_SENSORS_VENOUS @@ -1835,7 +1838,6 @@ common/hd_defs.py, Enum, PreTreatmentDrySelfTestsStates, DRY_SELF_TESTS_COMPLETE_STATE common/hd_defs.py, Enum, PreTreatmentDrySelfTestsStates, NUM_OF_DRY_SELF_TESTS_STATES common/hd_defs.py, Enum, PreTreatmentPrimeStates, PreTreatmentPrimeStates -common/hd_defs.py, Enum, PreTreatmentPrimeStates, HD_PRIME_START_STATE common/hd_defs.py, Enum, PreTreatmentPrimeStates, HD_PRIME_WAIT_FOR_USER_START_STATE common/hd_defs.py, Enum, PreTreatmentPrimeStates, HD_PRIME_SALINE_SETUP_STATE common/hd_defs.py, Enum, PreTreatmentPrimeStates, HD_PRIME_SALINE_PURGE_AIR_STATE @@ -1858,7 +1860,6 @@ common/hd_defs.py, Enum, PreTreatmentPatientConnectionStates, PATIENT_CONNECTION_STATE common/hd_defs.py, Enum, PreTreatmentPatientConnectionStates, NUM_OF_PATIENT_CONNECTION_STATES common/hd_defs.py, Enum, TreatmentParametersStates, TreatmentParametersStates -common/hd_defs.py, Enum, TreatmentParametersStates, HD_TREATMENT_PARAMS_MODE_STATE_START common/hd_defs.py, Enum, TreatmentParametersStates, HD_TREATMENT_PARAMS_MODE_STATE_WAIT_4_UI_2_SEND common/hd_defs.py, Enum, TreatmentParametersStates, HD_TREATMENT_PARAMS_MODE_STATE_WAIT_4_UI_2_CONFIRM common/hd_defs.py, Enum, TreatmentParametersStates, NUM_OF_HD_TREATMENT_PARAMS_MODE_STATES @@ -1875,7 +1876,6 @@ common/hd_defs.py, Enum, TreatmentBloodPrimeStates, BLOOD_PRIME_RAMP_STATE common/hd_defs.py, Enum, TreatmentBloodPrimeStates, NUM_OF_BLOOD_PRIME_STATES common/hd_defs.py, Enum, TreatmentDialysisStates, TreatmentDialysisStates -common/hd_defs.py, Enum, TreatmentDialysisStates, DIALYSIS_START_STATE common/hd_defs.py, Enum, TreatmentDialysisStates, DIALYSIS_UF_STATE common/hd_defs.py, Enum, TreatmentDialysisStates, DIALYSIS_SALINE_BOLUS_STATE common/hd_defs.py, Enum, TreatmentDialysisStates, NUM_OF_DIALYSIS_STATES @@ -1932,7 +1932,6 @@ common/hd_defs.py, Enum, HDEventDataType, EVENT_DATA_TYPE_BOOL common/hd_defs.py, Enum, HDEventDataType, NUM_OF_EVENT_DATA_TYPES common/hd_defs.py, Enum, UFStates, UFStates -common/hd_defs.py, Enum, UFStates, UF_START_STATE common/hd_defs.py, Enum, UFStates, UF_PAUSED_STATE common/hd_defs.py, Enum, UFStates, UF_RUNNING_STATE common/hd_defs.py, Enum, UFStates, NUM_OF_UF_STATES @@ -2449,6 +2448,9 @@ common/msg_ids.py, Enum, MsgIds, MSG_ID_DG_CONC_PUMP_PARK_FAULT_STATUS_OVERRIDE common/msg_ids.py, Enum, MsgIds, MSG_ID_DG_CONC_PUMP_PARK_COMMAND common/msg_ids.py, Enum, MsgIds, MSG_ID_DG_HEATERS_DUTY_CYCLE_OVERRIDE +common/msg_ids.py, Enum, MsgIds, MSD_ID_DG_RTC_CTL_REG1_STATUS_OVERRIDE +common/msg_ids.py, Enum, MsgIds, MSD_ID_DG_RTC_CTL_REG3_STATUS_OVERRIDE +common/msg_ids.py, Enum, MsgIds, MSG_ID_DG_NELSON_DISINFECT_SUPPORT common/msg_ids.py, Enum, MsgIds, MSG_ID_HD_DEBUG_EVENT common/msg_ids.py, Enum, MsgIds, MSG_ID_DG_DEBUG_EVENT common/msg_ids.py, Enum, MsgIds, MSG_ID_ACK_MESSAGE_THAT_REQUIRES_ACK @@ -2532,6 +2534,15 @@ dg/heat_disinfect.py, Enum, HeatCancellationModes, CANCELLATION_MODE_BASIC dg/heat_disinfect.py, Enum, HeatCancellationModes, CANCELLATION_MODE_HOT dg/heat_disinfect.py, Enum, HeatCancellationModes, CANCELLATION_MODE_COLD +dg/heat_disinfect.py, Enum, NelsonSupportModes, NelsonSupportModes +dg/heat_disinfect.py, Enum, NelsonSupportModes, NELSON_NONE +dg/heat_disinfect.py, Enum, NelsonSupportModes, NELSON_INOCULATE +dg/heat_disinfect.py, Enum, NelsonSupportModes, NELSON_HEAT_DISINFECT +dg/heat_disinfect.py, Enum, NelsonSupportModes, NELSON_POS_CONTROL_CHEM_DISINFECT +dg/heat_disinfect.py, Enum, NelsonSupportModes, NELSON_POS_CONTROL_HEAT_DISINFECT +dg/heat_disinfect.py, Enum, NelsonSupportModes, NELSON_CHEM_DISINFECT +dg/heat_disinfect.py, Enum, NelsonSupportModes, NELSON_DRAIN_SAMPLE +dg/heat_disinfect.py, Enum, NelsonSupportModes, NUM_OF_NELSON_SUPPORT dg/heaters.py, Enum, HeatersStartStop, HeatersStartStop dg/heaters.py, Enum, HeatersStartStop, STOP dg/heaters.py, Enum, HeatersStartStop, START