Index: dialin/common/alarm_defs.py =================================================================== diff -u -r46a620c6eec5d04cdbada3afd520f95d0c157c65 -rf89093ee0f0b9159df2ae4e0b86971f0e0e1b448 --- dialin/common/alarm_defs.py (.../alarm_defs.py) (revision 46a620c6eec5d04cdbada3afd520f95d0c157c65) +++ dialin/common/alarm_defs.py (.../alarm_defs.py) (revision f89093ee0f0b9159df2ae4e0b86971f0e0e1b448) @@ -1,34 +1,206 @@ ########################################################################### # -# Copyright (c) 2019-2020 Diality Inc. - All Rights Reserved. +# Copyright (c) 2019-2021 Diality Inc. - All Rights Reserved. # # THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN # WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. # # @file alarm_defs.py # -# @author (last) Sean Nash -# @date (last) 03-Nov-2020 +# @author (last) Peter Lucia +# @date (last) 23-Apr-2021 # @author (original) Peter Lucia -# @date (original) 07-Aug-2020 +# @date (original) 23-Apr-2021 # ############################################################################ -import os from enum import unique -from ..utils.base import AlarmEnum, DialinEnum +from ..utils.base import AlarmEnum -enum_list = {} -with open(os.path.join(os.path.dirname(__file__), 'AlarmIds.txt'), 'r') as file_obj: - for line in file_obj: - split_str = line.split('=') - enum_list[split_str[0].strip()] = int(split_str[1].strip()) -AlarmList = AlarmEnum('AlarmList', enum_list) - +# Branch: staging @unique -class AlarmPriorities(DialinEnum): - ALARM_PRIORITY_NONE = 0 # Indicates not an alarm or no alarms active at this time - ALARM_PRIORITY_LOW = 1 # Low priority alarm - ALARM_PRIORITY_MEDIUM = 2 # Medium priority alarm - ALARM_PRIORITY_HIGH = 3 # High priority alarm - NUM_OF_ALARM_PRIORITIES = 4 # Total number of alarm priorities +class AlarmList(AlarmEnum): + ALARM_ID_NO_ALARM = 0 + ALARM_ID_HD_SOFTWARE_FAULT = 1 + ALARM_ID_STUCK_BUTTON_TEST_FAILED = 2 + ALARM_ID_FPGA_POST_TEST_FAILED = 3 + ALARM_ID_WATCHDOG_POST_TEST_FAILED = 4 + ALARM_ID_UI_COMM_POST_FAILED = 5 + ALARM_ID_BLOOD_PUMP_MC_CURRENT_CHECK = 6 + ALARM_ID_BLOOD_PUMP_OFF_CHECK = 7 + ALARM_ID_BLOOD_PUMP_MC_DIRECTION_CHECK = 8 + ALARM_ID_BLOOD_PUMP_ROTOR_SPEED_CHECK = 9 + ALARM_ID_DIAL_IN_PUMP_MC_CURRENT_CHECK = 10 + ALARM_ID_DIAL_IN_PUMP_OFF_CHECK = 11 + ALARM_ID_DIAL_IN_PUMP_MC_DIRECTION_CHECK = 12 + ALARM_ID_DIAL_IN_PUMP_ROTOR_SPEED_CHECK = 13 + ALARM_ID_DIAL_OUT_PUMP_MC_CURRENT_CHECK = 14 + ALARM_ID_DIAL_OUT_PUMP_OFF_CHECK = 15 + ALARM_ID_DIAL_OUT_PUMP_MC_DIRECTION_CHECK = 16 + ALARM_ID_DIAL_OUT_PUMP_ROTOR_SPEED_CHECK = 17 + ALARM_ID_WATCHDOG_EXPIRED = 18 + ALARM_ID_RTC_COMM_ERROR = 19 + ALARM_ID_RTC_CONFIG_ERROR = 20 + ALARM_ID_DG_COMM_TIMEOUT = 21 + ALARM_ID_UI_COMM_TIMEOUT = 22 + ALARM_ID_COMM_TOO_MANY_BAD_CRCS = 23 + ALARM_ID_TREATMENT_STOPPED_BY_USER = 24 + ALARM_ID_BLOOD_SITTING_WARNING = 25 + ALARM_ID_BLOOD_SITTING_TOO_LONG_NO_RESUME = 26 + ALARM_ID_BLOOD_SITTING_TOO_LONG_NO_RINSEBACK = 27 + ALARM_ID_CAN_MESSAGE_NOT_ACKED = 28 + ALARM_ID_OCCLUSION_BLOOD_PUMP = 29 + ALARM_ID_OCCLUSION_DIAL_IN_PUMP = 30 + ALARM_ID_OCCLUSION_DIAL_OUT_PUMP = 31 + ALARM_ID_ARTERIAL_PRESSURE_LOW = 32 + ALARM_ID_ARTERIAL_PRESSURE_HIGH = 33 + ALARM_ID_VENOUS_PRESSURE_LOW = 34 + ALARM_ID_VENOUS_PRESSURE_HIGH = 35 + ALARM_ID_UF_RATE_TOO_HIGH_ERROR = 36 + ALARM_ID_UF_VOLUME_ACCURACY_ERROR = 37 + ALARM_ID_RTC_BATTERY_LOW = 38 + ALARM_ID_RTC_OR_TIMER_ACCURACY_FAILURE = 39 + ALARM_ID_RTC_RAM_OPS_ERROR = 40 + ALARM_ID_NVDATA_EEPROM_OPS_FAILURE = 41 + ALARM_ID_NVDATA_MFG_RECORD_CRC_ERROR = 42 + ALARM_ID_NVDATA_SRVC_RECORD_CRC_ERROR = 43 + ALARM_ID_NVDATA_CAL_RECORD_CRC_ERROR = 44 + ALARM_ID_NVDATA_HW_USAGE_DATA_CRC_ERROR = 45 + ALARM_ID_RO_PUMP_OUT_PRESSURE_OUT_OF_RANGE = 47 + ALARM_ID_TEMPERATURE_SENSORS_FAULT = 48 + ALARM_ID_FPGA_COMM_TIMEOUT = 49 + ALARM_ID_HD_COMM_TIMEOUT = 50 + ALARM_ID_VALVE_CONTROL_FAILURE = 51 + ALARM_ID_BLOOD_PUMP_FLOW_VS_MOTOR_SPEED_CHECK = 52 + ALARM_ID_DIAL_IN_PUMP_FLOW_VS_MOTOR_SPEED_CHECK = 53 + ALARM_ID_HD_PRIME_PURGE_AIR_TIME_OUT = 54 + ALARM_ID_BLOOD_PUMP_MOTOR_SPEED_CHECK = 55 + ALARM_ID_DIAL_IN_PUMP_MOTOR_SPEED_CHECK = 56 + ALARM_ID_DIAL_OUT_PUMP_MOTOR_SPEED_CHECK = 57 + ALARM_ID_BLOOD_PUMP_ROTOR_SPEED_TOO_HIGH = 58 + ALARM_ID_INLET_WATER_LOW_CONDUCTIVITY = 59 + ALARM_ID_INLET_WATER_HIGH_CONDUCTIVITY = 60 + ALARM_ID_DG_SOFTWARE_FAULT = 61 + ALARM_ID_CONDUCTIVITY_SENSOR_FAULT = 62 + ALARM_ID_INLET_WATER_LOW_TEMPERATURE = 63 + ALARM_ID_INLET_WATER_HIGH_TEMPERATURE = 64 + ALARM_ID_PRESSURE_SENSOR_FAULT = 65 + ALARM_ID_INLET_WATER_LOW_PRESSURE = 66 + ALARM_ID_HD_CRITICAL_DATA_ERROR = 67 + ALARM_ID_HD_ACCELEROMETER_SELF_TEST_FAILURE = 68 + ALARM_ID_DG_ACCELEROMETER_SELF_TEST_FAILURE = 69 + ALARM_ID_HD_EXCESSIVE_TILT = 70 + ALARM_ID_DG_EXCESSIVE_TILT = 71 + ALARM_ID_HD_SHOCK = 72 + ALARM_ID_DG_SHOCK = 73 + ALARM_ID_HD_ACCELEROMETER_FAILURE = 74 + ALARM_ID_DG_ACCELEROMETER_FAILURE = 75 + ALARM_ID_DG_CRITICAL_DATA_ERROR = 76 + ALARM_ID_RO_REJECTION_RATIO_OUT_OF_RANGE = 77 + ALARM_ID_INLET_WATER_PRESSURE_FAULT = 78 + ALARM_ID_HD_VALVE_HOMING_FAILED = 79 + ALARM_ID_HD_VALVE_TRANSITION_TIMEOUT = 80 + ALARM_ID_HD_VALVE_NOT_FUNCTIONAL = 81 + ALARM_ID_HD_VALVE_CURRENT_OUT_OF_RANGE = 82 + ALARM_ID_HD_VALVE_POSITION_OUT_OF_RANGE = 83 + ALARM_ID_AIR_TRAP_ILLEGAL_LEVELS = 84 + ALARM_ID_AIR_TRAP_FILL_DURING_PRIME = 85 + ALARM_ID_AIR_TRAP_FILL_DURING_TREATMENT = 86 + ALARM_ID_BLOOD_FLOW_SIGNAL_STRENGTH_TOO_LOW = 87 + ALARM_ID_DIALYSATE_FLOW_SIGNAL_STRENGTH_TOO_LOW = 88 + ALARM_ID_EMPTY_SALINE_BAG = 89 + ALARM_ID_SALINE_BOLUS_VOLUME_CHECK_FAILURE = 90 + ALARM_ID_ARTERIAL_PRESSURE_SENSOR_FAULT = 91 + ALARM_ID_VENOUS_PRESSURE_SENSOR_FAULT = 92 + ALARM_ID_UV_REACTOR_NOT_HEALTHY = 93 + ALARM_ID_ACID_CONDUCTIVITY_OUT_OF_RANGE = 94 + ALARM_ID_BICARB_CONDUCTIVITY_OUT_OF_RANGE = 95 + ALARM_ID_RO_PUMP_FLOW_RATE_OUT_OF_RANGE = 96 + ALARM_ID_DG_THERMISTORS_TEMPERATURE_OUT_OF_RANGE = 97 + ALARM_ID_DG_FAN_RPM_OUT_OF_RANGE = 98 + ALARM_ID_DG_DIALYSATE_FILL_OUT_OF_TIME = 99 + ALARM_ID_CP1_SPEED_CONTROL_ERROR = 100 + ALARM_ID_CP2_SPEED_CONTROL_ERROR = 101 + ALARM_ID_FLOW_RATE_OUT_OF_UPPER_RANGE = 102 + ALARM_ID_RO_PUMP_PRESSURE_OUT_OF_RANGE = 103 + ALARM_ID_DRAIN_PUMP_RPM_OUT_OF_RANGE = 104 + ALARM_ID_DG_HEATERS_NEGATIVE_COLD_JUNCTION_TEMPERATURE = 105 + ALARM_ID_DG_HEATERS_FAULT = 106 + ALARM_ID_END_OF_TREATMENT_WARNING = 107 + ALARM_ID_END_OF_TREATMENT_ALARM = 108 + ALARM_ID_END_OF_TREATMENT_HIGH = 109 + ALARM_ID_DG_HEAT_DISINFECT_CYCLE_FAILED = 110 + ALARM_ID_RO_PUMP_RAMP_UP_TO_FLOW_TIMEOUT = 111 + ALARM_ID_FLOW_RATE_OUT_OF_LOWER_RANGE = 112 + ALARM_ID_DRAIN_PUMP_OFF_FAULT = 113 + ALARM_ID_RO_PUMP_OFF_FAULT = 114 + ALARM_ID_PRIME_DIALYSATE_DIALYZER_TIME_OUT = 115 + ALARM_ID_PRIME_DIALYSATE_BYPASS_TIME_OUT = 116 + ALARM_ID_PRIME_COMPLETED_LOW_PRIORITY = 117 + ALARM_ID_PRIME_COMPLETED_MEDIUM_PRIORITY = 118 + ALARM_ID_PRIME_COMPLETED_HIGH_PRIORITY = 119 + ALARM_ID_PRIME_OUT_OF_TIME = 120 + ALARM_ID_DG_COMMAND_INVALID_PARAMETER_FAULT = 121 + ALARM_ID_HD_LOAD_CELL_ACCELERATION_RES_1_ALARM = 122 + ALARM_ID_HD_LOAD_CELL_ACCELERATION_RES_2_ALARM = 123 + ALARM_ID_TREATMENT_STOPPED_AFTER_RINSEBACK = 124 + ALARM_ID_TREATMENT_RINSEBACK_TIMEOUT_ALARM = 125 + ALARM_ID_TREATMENT_RECIRC_TIMEOUT_ALARM = 126 + ALARM_ID_CARTRIDGE_DOOR_OPENED = 127 + ALARM_ID_PRE_TREATMENT_NO_CART_SELF_TEST_FAILURE = 128 + ALARM_ID_INSTALL_NEW_CARTRIDGE = 129 + ALARM_ID_CARTRIDGE_INSTALLED_IMPROPERLY = 130 + ALARM_ID_RINSEBACK_VOLUME_CHECK_FAILURE = 131 + ALARM_ID_NO_CARTRIDGE_LOADED = 132 + ALARM_ID_END_TREATMENT_TIMEOUT_ALARM = 133 + ALARM_ID_BLOOD_PRIME_VOLUME_CHECK_FAILURE = 134 + ALARM_ID_DIALYSATE_TEMPERATURE_TOO_HIGH = 135 + ALARM_ID_DIALYSATE_TEMPERATURE_TOO_LOW = 136 + ALARM_ID_PRE_TREATMENT_DRY_SELF_TEST_FAILURE = 137 + ALARM_ID_PRE_TREATMENT_WET_SELF_TEST_FAILURE = 138 + ALARM_ID_DG_FLOW_METER_CHECK_FAILURE = 139 + ALARM_ID_DG_RO_PUMP_TOO_MANY_RAMP_UP_RETRY = 140 + ALARM_ID_NVDATAMGMT_GROUP_RECORD_CRC_INVALID = 141 + ALARM_ID_NVDATAMGMT_INDIVIDUAL_RECORD_CRC_INVALID = 142 + ALARM_ID_NVDATAMGMT_INDIVIDUAL_RECORD_TIME_INVALID = 143 + ALARM_ID_HD_AC_POWER_LOST = 144 + ALARM_ID_DG_RESTARTED_FAULT = 145 + ALARM_ID_DIALYSATE_CONDUCTIVITY_OUT_OF_RANGE = 146 + ALARM_ID_HD_FLUID_LEAK_DETECTED = 147 + ALARM_ID_DG_FLUID_LEAK_DETECTED = 148 + ALARM_ID_HD_SYRINGE_PUMP_ADC_ERROR = 149 + ALARM_ID_HD_SYRINGE_DETECTED = 150 + ALARM_ID_HD_SYRINGE_PUMP_VOLUME_ERROR = 151 + ALARM_ID_HD_SYRINGE_PUMP_SPEED_ERROR = 152 + ALARM_ID_HD_SYRINGE_PUMP_SYRINGE_EMPTY = 153 + ALARM_ID_HD_SYRINGE_PUMP_OCCLUSION = 154 + ALARM_ID_HD_SYRINGE_PUMP_SYRINGE_REMOVED = 155 + ALARM_ID_HD_SYRINGE_PUMP_NOT_STOPPED_ERROR = 156 + ALARM_ID_HD_BLOOD_LEAK_DETECTED = 157 + ALARM_ID_CARTRIDGE_REMOVAL_FAILURE = 158 + ALARM_ID_DG_RESERVOIR_DRAIN_TIMEOUT = 159 + ALARM_ID_DG_RESERVOIR_FILL_TIMEOUT = 160 + ALARM_ID_DG_RESERVOIR_LEAK_TIMEOUT = 161 + ALARM_ID_DG_HEAT_DISINFECT_TARGET_TEMP_TIMEOUT = 162 + ALARM_ID_DG_TEMP_SENSORS_DIFF_OUT_OF_RANGE = 163 + ALARM_ID_DG_HEAT_DISINFECT_INLET_PRES_AND_TEMP_SNSRS_OUT = 164 + ALARM_ID_DG_HEAT_DISINFECT_INLET_COND_AND_TEMP_OUT = 165 + ALARM_ID_DG_BAD_INLET_WATER_QUALITY = 166 + ALARM_ID_HD_BP_OCCLUSION_SELF_TEST_FAILURE = 167 + ALARM_ID_HD_DIP_OCCLUSION_SELF_TEST_FAILURE = 168 + ALARM_ID_HD_DOP_OCCLUSION_SELF_TEST_FAILURE = 169 + ALARM_ID_HD_ARTERIAL_PRESSURE_SELF_TEST_FAILURE = 170 + ALARM_ID_HD_VENOUS_PRESSURE_SELF_TEST_FAILURE = 171 + ALARM_ID_HD_BLOOD_FLOW_STATUS_SELF_TEST_FAILURE = 172 + ALARM_ID_HD_DIALYSATE_FLOW_STATUS_SELF_TEST_FAILURE = 173 + ALARM_ID_HD_BLOOD_LEAK_SELF_TEST_FAILURE = 174 + ALARM_ID_HD_BLOOD_LEAK_FAULT = 175 + ALARM_ID_DG_LOAD_CELLS_INVALID_CALIBRATION = 176 + ALARM_ID_HD_VOLTAGE_OUT_OF_RANGE = 177 + ALARM_ID_DG_PRIMARY_HEATERS_INTERNAL_TEMP_OUT_OF_RANGE = 178 + ALARM_ID_DG_TRIMMER_HEATER_INTERNAL_TEMP_OUT_OF_RANGE = 179 + ALARM_ID_DG_HEATERS_ON_WITH_NO_FLOW_TIMEOUT = 180 + ALARM_ID_DIALYSATE_CONDUCTIVITY_FAULT = 181 + ALARM_ID_DIALYSATE_TEMPERATURE_HIGH = 182 + ALARM_ID_DIALYSATE_TEMPERATURE_LOW = 183 + ALARM_ID_DG_VOLTAGE_OUT_OF_RANGE = 184 Index: dialin/common/msg_defs.py =================================================================== diff -u -r79b47911f0ea424cd8dc10c1e1f150b84d4dfa54 -rf89093ee0f0b9159df2ae4e0b86971f0e0e1b448 --- dialin/common/msg_defs.py (.../msg_defs.py) (revision 79b47911f0ea424cd8dc10c1e1f150b84d4dfa54) +++ dialin/common/msg_defs.py (.../msg_defs.py) (revision f89093ee0f0b9159df2ae4e0b86971f0e0e1b448) @@ -110,5 +110,3 @@ END_POS_FIELD_24 = START_POS_FIELD_24 + 4 START_POS_FIELD_25 = END_POS_FIELD_24 END_POS_FIELD_25 = START_POS_FIELD_25 + 4 - - Index: dialin/common/msg_ids.py =================================================================== diff -u -rbe97d97e1ddd765351cdc51cb75aee9e7e63ba58 -rf89093ee0f0b9159df2ae4e0b86971f0e0e1b448 --- dialin/common/msg_ids.py (.../msg_ids.py) (revision be97d97e1ddd765351cdc51cb75aee9e7e63ba58) +++ dialin/common/msg_ids.py (.../msg_ids.py) (revision f89093ee0f0b9159df2ae4e0b86971f0e0e1b448) @@ -8,9 +8,9 @@ # @file msg_ids.py # # @author (last) Peter Lucia -# @date (last) 20-Apr-2021 +# @date (last) 23-Apr-2021 # @author (original) Peter Lucia -# @date (original) 20-Apr-2021 +# @date (original) 23-Apr-2021 # ############################################################################ from enum import unique @@ -211,7 +211,7 @@ MSG_ID_HD_SEND_SERVICE_RECORD = 0X8045 MSG_ID_HD_SET_OP_MODE_REQUEST = 0X8046 MSG_ID_HD_FLUID_LEAK_SEND_INTERVAL_OVERRIDE = 0X8047 - MSG_ID_HD_FLUID_LEAK_STATE_DETECTOR_OVERRIDE = 0X8048 + MSG_ID_HD_FLUID_LEAK_STATE_OVERRIDE = 0X8048 MSG_ID_HD_SYRINGE_PUMP_MEASURED_HOME_OVERRIDE = 0X8049 MSG_ID_HD_SYRINGE_PUMP_MEASURED_POSITION_OVERRIDE = 0X804A MSG_ID_HD_SYRINGE_PUMP_MEASURED_VOLUME_OVERRIDE = 0X804B @@ -225,6 +225,7 @@ MSG_ID_HD_ALARM_AUDIO_CURRENT_HG_OVERRIDE = 0X8054 MSG_ID_HD_ALARM_AUDIO_CURRENT_LG_OVERRIDE = 0X8055 MSG_ID_HD_ALARM_BACKUP_AUDIO_CURRENT_OVERRIDE = 0X8056 + MSG_ID_DG_VOLTAGES_DATA = 0X86 MSG_ID_PRESSURE_OCCLUSION_DATA = 0X9 MSG_ID_CAN_ERROR_COUNT = 0X999 MSG_ID_RTC_EPOCH = 0XA @@ -252,8 +253,8 @@ MSG_ID_DG_ACCEL_OVERRIDE = 0XA017 MSG_ID_DG_ACCEL_MAX_OVERRIDE = 0XA018 MSG_ID_DG_ACCEL_SEND_INTERVAL_OVERRIDE = 0XA019 - MSG_ID___AVAILABLE_11 = 0XA01A - MSG_ID___AVAILABLE_17 = 0XA01B + MSG_ID_DG_MONITORED_VOLTAGES_SEND_INTERVAL_OVERRIDE = 0XA01A + MSG_ID_DG_MONITORED_VOLTAGES_OVERRIDE = 0XA01B MSG_ID_DRAIN_PUMP_SET_DELTA_PRESSURE_OVERRIDE = 0XA01C MSG_ID___AVAILABLE_12 = 0XA01D MSG_ID___AVAILABLE_13 = 0XA01E Index: dialin/dg/dialysate_generator.py =================================================================== diff -u -r6ee95f85e0504b8c7214258074e3022b50c982bd -rf89093ee0f0b9159df2ae4e0b86971f0e0e1b448 --- dialin/dg/dialysate_generator.py (.../dialysate_generator.py) (revision 6ee95f85e0504b8c7214258074e3022b50c982bd) +++ dialin/dg/dialysate_generator.py (.../dialysate_generator.py) (revision f89093ee0f0b9159df2ae4e0b86971f0e0e1b448) @@ -40,6 +40,7 @@ from .service_record import DGServiceNVRecord from .scheduled_runs_record import DGScheduledRunsNVRecord from .valves import DGValves +from .voltages import DGVoltages from ..utils.conversions import integer_to_bytearray from ..protocols.CAN import (DenaliCanMessenger, DenaliMessage, DenaliChannels) from ..utils.base import _AbstractSubSystem, _publish, _LogManager @@ -166,6 +167,7 @@ self.service_record = DGServiceNVRecord(self.can_interface, self.logger) self.scheduled_runs_record = DGScheduledRunsNVRecord(self.can_interface, self.logger) self.valves = DGValves(self.can_interface, self.logger) + self.voltages = DGVoltages(self.can_interface, self.logger) def get_version(self): """ Index: dialin/dg/fans.py =================================================================== diff -u -rf053467ac7cfb9fe349e394342d3a9253a377403 -rf89093ee0f0b9159df2ae4e0b86971f0e0e1b448 --- dialin/dg/fans.py (.../fans.py) (revision f053467ac7cfb9fe349e394342d3a9253a377403) +++ dialin/dg/fans.py (.../fans.py) (revision f89093ee0f0b9159df2ae4e0b86971f0e0e1b448) @@ -142,7 +142,7 @@ Constructs and sends the fans data publish interval. Constraints: Must be logged into DG. - Given interval must be non-zero and a multiple of the DG priority task interval (10 ms). + Given interval must be non-zero and a multiple of the DG general task interval (50 ms). @param ms: (int) interval (in ms) to override with @param reset: (int) 1 to reset a previous override, 0 to override Index: dialin/dg/ro_pump.py =================================================================== diff -u -r4ff3b2874eb12aee034d1f85ae32c161d05efc00 -rf89093ee0f0b9159df2ae4e0b86971f0e0e1b448 --- dialin/dg/ro_pump.py (.../ro_pump.py) (revision 4ff3b2874eb12aee034d1f85ae32c161d05efc00) +++ dialin/dg/ro_pump.py (.../ro_pump.py) (revision f89093ee0f0b9159df2ae4e0b86971f0e0e1b448) @@ -26,9 +26,9 @@ @unique class ROPumpStates(DialinEnum): RO_PUMP_OFF_STATE = 0 - RO_PUMP_RAMP_UP_STATE = 1 - RO_PUMP_VERIFY_FLOW_STATE = 2 - RO_PUMP_CONTROL_TO_TARGET_STATE = 3 + RO_PUMP_RAMP_UP_TO_TARGET_FLOW_STATE = 1 + RO_PUMP_CONTROL_TO_TARGET_FLOW_STATE = 2 + RO_PUMP_CONTROL_TO_MAX_PRESSURE_STATE = 3 RO_PUMP_OPEN_LOOP_STATE = 4 @@ -57,6 +57,7 @@ self.measured_flow_rate_lpm = 0.0 self.pwm_duty_cycle_pct = 0.0 self.ro_pump_state = 0.0 + self.target_flow_lpm = 0.0 def get_target_pressure(self): """ @@ -100,19 +101,22 @@ @return: None """ - tgt = struct.unpack('f', bytearray( + tgt_pres = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_1:MsgFieldPositions.END_POS_FIELD_1]))[0] flow = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_2:MsgFieldPositions.END_POS_FIELD_2]))[0] pwm = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_3:MsgFieldPositions.END_POS_FIELD_3]))[0] ro_state = struct.unpack('i', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_4:MsgFieldPositions.END_POS_FIELD_4]))[0] + tgt_flow = struct.unpack('f', bytearray( + message['message'][MsgFieldPositions.START_POS_FIELD_5:MsgFieldPositions.END_POS_FIELD_5]))[0] - self.target_pressure_psi = tgt + self.target_pressure_psi = tgt_pres self.measured_flow_rate_lpm = flow self.pwm_duty_cycle_pct = pwm self.ro_pump_state = ROPumpStates(ro_state).name if ROPumpStates.has_value(ro_state) else 'State Unknown' + self.target_flow_lpm = tgt_flow def cmd_ro_pump_set_point_override(self, pressure, reset=NO_RESET): """ @@ -130,7 +134,7 @@ payload = rst + prs message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, - message_id=MsgIds.MSG_ID_RO_PUMP_SET_PT_OVERRIDE.value, + message_id=MsgIds.MSG_ID_RO_PUMP_SEND_INTERVAL_OVERRIDE.value, payload=payload) self.logger.debug("Override RO pump pressure set point") @@ -196,7 +200,7 @@ payload = rst + flo message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, - message_id=MsgIds.MSG_ID_RO_PUMP_SET_PT_OVERRIDE.value, + message_id=MsgIds.MSG_ID_DG_RO_PUMP_TARGET_FLOW_OVERRIDE.value, payload=payload) self.logger.debug("override RO pump pressure set point") Index: dialin/dg/temperature_sensors.py =================================================================== diff -u -r4ff3b2874eb12aee034d1f85ae32c161d05efc00 -rf89093ee0f0b9159df2ae4e0b86971f0e0e1b448 --- dialin/dg/temperature_sensors.py (.../temperature_sensors.py) (revision 4ff3b2874eb12aee034d1f85ae32c161d05efc00) +++ dialin/dg/temperature_sensors.py (.../temperature_sensors.py) (revision f89093ee0f0b9159df2ae4e0b86971f0e0e1b448) @@ -74,6 +74,13 @@ TemperatureSensorsNames.INTERNAL_TDI_RTD.name: {}, TemperatureSensorsNames.INTERNAL_COND_TEMP_SENSOR.name: {}} + self.primary_raw_thermo_couple = 0 + self.primary_raw_cold_junc = 0 + self.trimmer_raw_thermo_couple = 0 + self.trimmer_raw_cold_junc = 0 + self.conductivity_1_raw = 0 + self.conductivity_2_raw = 0 + if self.can_interface is not None: channel_id = DenaliChannels.dg_sync_broadcast_ch_id msg_id = MsgIds.MSG_ID_DG_TEMPERATURE_DATA.value @@ -89,7 +96,8 @@ """ return self.temperature_sensors[sensor] - @_publish(['temperature_sensors']) + @_publish(["temperature_sensors", "primary_raw_thermo_couple", "primary_raw_cold_junc", + "trimmer_raw_thermo_couple", "trimmer_raw_cold_junc", "conductivity_1_raw", "conductivity_2_raw"]) def _handler_temperature_sensors_sync(self, message): """ Handles published temperature sensors message @@ -169,6 +177,30 @@ message['message'][MsgFieldPositions.START_POS_FIELD_18:MsgFieldPositions.END_POS_FIELD_18]))[0] self.temperature_sensors[TemperatureSensorsNames.INTERNAL_COND_TEMP_SENSOR.name] = sensors_data + sensors_data = struct.unpack('i', bytearray( + message['message'][MsgFieldPositions.START_POS_FIELD_19:MsgFieldPositions.END_POS_FIELD_19]))[0] + self.primary_raw_thermo_couple = sensors_data + + sensors_data = struct.unpack('i', bytearray( + message['message'][MsgFieldPositions.START_POS_FIELD_20:MsgFieldPositions.END_POS_FIELD_20]))[0] + self.primary_raw_cold_junc = sensors_data + + sensors_data = struct.unpack('i', bytearray( + message['message'][MsgFieldPositions.START_POS_FIELD_21:MsgFieldPositions.END_POS_FIELD_21]))[0] + self.primary_raw_cold_junc = sensors_data + + sensors_data = struct.unpack('i', bytearray( + message['message'][MsgFieldPositions.START_POS_FIELD_22:MsgFieldPositions.END_POS_FIELD_22]))[0] + self.trimmer_raw_thermo_couple = sensors_data + + sensors_data = struct.unpack('i', bytearray( + message['message'][MsgFieldPositions.START_POS_FIELD_23:MsgFieldPositions.END_POS_FIELD_23]))[0] + self.trimmer_raw_cold_junc = sensors_data + + sensors_data = struct.unpack('i', bytearray( + message['message'][MsgFieldPositions.START_POS_FIELD_24:MsgFieldPositions.END_POS_FIELD_24]))[0] + self.conductivity_1_raw = sensors_data + def cmd_temperature_sensors_broadcast_interval_override(self, ms, reset=NO_RESET): """ Constructs and sends broadcast time interval. Index: dialin/dg/uv_reactors.py =================================================================== diff -u -rf053467ac7cfb9fe349e394342d3a9253a377403 -rf89093ee0f0b9159df2ae4e0b86971f0e0e1b448 --- dialin/dg/uv_reactors.py (.../uv_reactors.py) (revision f053467ac7cfb9fe349e394342d3a9253a377403) +++ dialin/dg/uv_reactors.py (.../uv_reactors.py) (revision f89093ee0f0b9159df2ae4e0b86971f0e0e1b448) @@ -116,7 +116,7 @@ Constructs and sends the UV reactors data publish interval. Constraints: Must be logged into DG. - Given interval must be non-zero and a multiple of the DG priority task interval (10 ms). + Given interval must be non-zero and a multiple of the DG general task interval (50 ms). @param ms: (int) interval (in ms) to override with @param reset: (int) 1 to reset a previous override, 0 to override Index: dialin/dg/voltages.py =================================================================== diff -u -r2fb3be9a2925e440db33f993d5964d0439c4bd42 -rf89093ee0f0b9159df2ae4e0b86971f0e0e1b448 --- dialin/dg/voltages.py (.../voltages.py) (revision 2fb3be9a2925e440db33f993d5964d0439c4bd42) +++ dialin/dg/voltages.py (.../voltages.py) (revision f89093ee0f0b9159df2ae4e0b86971f0e0e1b448) @@ -64,7 +64,7 @@ msg_id = MsgIds.MSG_ID_DG_VOLTAGES_DATA.value self.can_interface.register_receiving_publication_function(channel_id, msg_id, self._handler_monitored_voltages_sync) - self.monitored_voltages = [0.0] * DGMonitoredVoltages.NUM_OF_MONITORED_VOLTAGE_LINES.value + self.monitored_voltages = [0.0] * DGMonitoredVoltages.NUM_OF_MONITORED_LINES.value def get_monitored_voltages(self): """ Index: dialin/hd/fluid_leak.py =================================================================== diff -u -r79b47911f0ea424cd8dc10c1e1f150b84d4dfa54 -rf89093ee0f0b9159df2ae4e0b86971f0e0e1b448 --- dialin/hd/fluid_leak.py (.../fluid_leak.py) (revision 79b47911f0ea424cd8dc10c1e1f150b84d4dfa54) +++ dialin/hd/fluid_leak.py (.../fluid_leak.py) (revision f89093ee0f0b9159df2ae4e0b86971f0e0e1b448) @@ -90,7 +90,7 @@ payload = rst + det message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, - message_id=MsgIds.MSG_ID_HD_FLUID_LEAK_STATE_DETECTOR_OVERRIDE.value, + message_id=MsgIds.MSG_ID_HD_FLUID_LEAK_STATE_OVERRIDE.value, payload=payload) self.logger.debug("Override fluid leak detector state value") Index: dialin/hd/hemodialysis_device.py =================================================================== diff -u -r4ff3b2874eb12aee034d1f85ae32c161d05efc00 -rf89093ee0f0b9159df2ae4e0b86971f0e0e1b448 --- dialin/hd/hemodialysis_device.py (.../hemodialysis_device.py) (revision 4ff3b2874eb12aee034d1f85ae32c161d05efc00) +++ dialin/hd/hemodialysis_device.py (.../hemodialysis_device.py) (revision f89093ee0f0b9159df2ae4e0b86971f0e0e1b448) @@ -18,6 +18,7 @@ from .air_trap import HDAirTrap from .alarms import HDAlarms from .buttons import HDButtons +from .fluid_leak import HDFluidLeak from .ui_proxy import HDUIProxy from .watchdog import HDWatchdog from .rtc import HDRTC @@ -65,9 +66,8 @@ @param can_interface: (str) CANBus interface name, e.g. "can0" @param log_level: (str) Logging level, defaults to None - - """ + super().__init__() self._log_manager = _LogManager(log_level=log_level, log_filepath=self.__class__.__name__+".log") self.logger = self._log_manager.logger @@ -90,11 +90,11 @@ self.hd_operation_sub_mode = 0 # Create command groups - self.accel = HDAccelerometer(self.can_interface, self.logger) self.air_trap = HDAirTrap(self.can_interface, self.logger) self.alarms = HDAlarms(self.can_interface, self.logger) self.buttons = HDButtons(self.can_interface, self.logger) + self.fluid_leak = HDFluidLeak(self.can_interface, self.logger) self.ui = HDUIProxy(self.can_interface, self.logger) self.rtc = HDRTC(self.can_interface, self.logger) self.watchdog = HDWatchdog(self.can_interface, self.logger) @@ -176,8 +176,9 @@ """ message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, - message_id=MsgIds.MSG_ID_HD_REQUEST_CALIBRATION_DATA.value) + message_id=MsgIds.MSG_ID_HD_GET_CALIBRATION_RECORD.value) + self.logger.debug("requesting HD calibration data.") # Send message @@ -193,38 +194,6 @@ self.logger.debug("Timeout!!!!") return False - def cmd_hd_erase_calibration_data(self): - """ - Constructs and sends an erase HD calibration data request command via CAN bus. - Constraints: - Must be logged into HD. - - \returns response message if received, False if no response received - - @return: 1 if successful, zero otherwise - - """ - key = integer_to_bytearray(-758926171) # 0xD2C3B4A5 - - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, - message_id=MsgIds.MSG_ID_HD_ERASE_CALIBRATION_DATA.value, - payload=key) - - self.logger.debug("requesting HD calibration data be erased.") - - # Send message - received_message = self.can_interface.send(message) - - if received_message is not None: - if received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] == 1: - self.logger.debug("HD calibration data erasure request accepted.") - else: - self.logger.debug("HD calibration data erasure request failed.") - return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] - else: - self.logger.debug("Timeout!!!!") - return False - def cmd_hd_set_operation_mode(self, newMode=0): """ Constructs and sends a set operation mode request command via CAN bus. Index: dialin/hd/ui_proxy.py =================================================================== diff -u -r64a8b369db68485a9d1d461e1aa53ee7ddbc0c30 -rf89093ee0f0b9159df2ae4e0b86971f0e0e1b448 --- dialin/hd/ui_proxy.py (.../ui_proxy.py) (revision 64a8b369db68485a9d1d461e1aa53ee7ddbc0c30) +++ dialin/hd/ui_proxy.py (.../ui_proxy.py) (revision f89093ee0f0b9159df2ae4e0b86971f0e0e1b448) @@ -696,10 +696,10 @@ self.treatment_parameters_reject_reasons[self.TreatmentParameters.TREATMENT_PARAM_DIALYZER_TYPE.value] = dlz[0] self.treatment_parameters_reject_reasons[self.TreatmentParameters.TREATMENT_PARAM_BLOOD_PRESSURE_MEAS_INTERVAL_MIN.value] = bpi[0] self.treatment_parameters_reject_reasons[self.TreatmentParameters.TREATMENT_PARAM_RINSEBACK_FLOW_RATE_ML_MIN.value] = rbf[0] - self.treatment_parameters_reject_reasons[self.TreatmentParameters.TREATMENT_PARAM_ARTERIAL_PRESSURE_HIGH_LIMIT_MMHG.value] = apl[0] - self.treatment_parameters_reject_reasons[self.TreatmentParameters.TREATMENT_PARAM_ARTERIAL_PRESSURE_LOW_LIMIT_MMHG.value] = aph[0] - self.treatment_parameters_reject_reasons[self.TreatmentParameters.TREATMENT_PARAM_VENOUS_PRESSURE_HIGH_LIMIT_MMHG.value] = vpl[0] - self.treatment_parameters_reject_reasons[self.TreatmentParameters.TREATMENT_PARAM_VENOUS_PRESSURE_LOW_LIMIT_MMHG.value] = vph[0] + self.treatment_parameters_reject_reasons[self.TreatmentParameters.TREATMENT_PARAM_ARTERIAL_PRESSURE_HIGH_LIMIT_MMHG.value] = aph[0] + self.treatment_parameters_reject_reasons[self.TreatmentParameters.TREATMENT_PARAM_ARTERIAL_PRESSURE_LOW_LIMIT_MMHG.value] = apl[0] + self.treatment_parameters_reject_reasons[self.TreatmentParameters.TREATMENT_PARAM_VENOUS_PRESSURE_HIGH_LIMIT_MMHG.value] = vph[0] + self.treatment_parameters_reject_reasons[self.TreatmentParameters.TREATMENT_PARAM_VENOUS_PRESSURE_LOW_LIMIT_MMHG.value] = vpl[0] self.treatment_parameters_reject_reasons[self.TreatmentParameters.TREATMENT_PARAM_HEPARIN_DISPENSE_RATE_ML_HR.value] = hdr[0] self.treatment_parameters_reject_reasons[self.TreatmentParameters.TREATMENT_PARAM_HEPARIN_BOLUS_VOLUME_ML.value] = hbv[0] self.treatment_parameters_reject_reasons[self.TreatmentParameters.TREATMENT_PARAM_DIALYSATE_TEMPERATURE_C.value] = tmp[0] @@ -1253,21 +1253,21 @@ def cmd_set_treatment_parameters(self, bld_flow: int = 100, dia_flow: int = 100, - duration: int = 60, - hep_rate: float = 0.1, - hep_bol : float = 0.1, - hep_stop: int = 1, + duration: int = 240, + hep_rate: float = 0.0, + hep_bol : float = 0.0, + hep_stop: int = 0, sal_bol : int = 100, acid : int = 0, bicarb : int = 0, dialyzer: int = 0, - dia_temp: float = 35, + dia_temp: float = 37.0, art_low : int = -300, - art_high: int = -200, - ven_low : int = -100, - ven_high: int = 100, - bp_intvl: int = 15, - rb_flow : int = 50): + art_high: int = 0, + ven_low : int = 20, + ven_high: int = 400, + bp_intvl: int = 30, + rb_flow : int = 75): """ Constructs and sends a ui set treatment parameters message Constraints: Index: dialin/hd/valves.py =================================================================== diff -u -r4ff3b2874eb12aee034d1f85ae32c161d05efc00 -rf89093ee0f0b9159df2ae4e0b86971f0e0e1b448 --- dialin/hd/valves.py (.../valves.py) (revision 4ff3b2874eb12aee034d1f85ae32c161d05efc00) +++ dialin/hd/valves.py (.../valves.py) (revision f89093ee0f0b9159df2ae4e0b86971f0e0e1b448) @@ -122,6 +122,13 @@ self.hd_air_trap_status = 0 + def get_hd_air_trap_status(self): + """ + Returns the hd air trap status + @return: (str) the HD air trap status + """ + return self.hd_air_trap_status + def get_hd_valves_status(self): """ Gets the hd valves status