Index: leahi_dialin/common/dd_defs.py =================================================================== diff -u -rcf2068872f9d6c000e67ede2dca3e207aa1d041e -rbeb046149da1b7cf85dbdadb500467490f350fb8 --- leahi_dialin/common/dd_defs.py (.../dd_defs.py) (revision cf2068872f9d6c000e67ede2dca3e207aa1d041e) +++ leahi_dialin/common/dd_defs.py (.../dd_defs.py) (revision beb046149da1b7cf85dbdadb500467490f350fb8) @@ -162,4 +162,71 @@ class DDDialysatePumpsStates(DialinEnum): DIALYSATE_PUMP_OFF_STATE = 0 DIALYSATE_PUMP_RAMP_UP_STATE = 1 - DIALYSATE_PUMP_CONTROL_TO_TARGET_STATE = 2 \ No newline at end of file + DIALYSATE_PUMP_CONTROL_TO_TARGET_STATE = 2 + +@unique +class HeatersStartStop(DialinEnum): + STOP = 0 + START = 1 + +@unique +class HeatersState(DialinEnum): + HEATER_EXEC_STATE_OFF = 0 + HEATER_EXEC_STATE_RAMP_TO_TARGET = 1 + HEATER_EXEC_STATE_CONTROL_TO_TARGET = 2 + HEATER_EXEC_STATE_CONTROL_TO_DISINFECT_TARGET = 3 + NUM_OF_HEATERS_STATE = 4 + +@unique +class HeatersNames(DialinEnum): + D5_HEAT = 0 + D45_HEAT = 1 + NUM_OF_DD_HEATERS = 2 + +@unique +class HeatersAttributesEnum(DialinEnum): + HEAT_DUTY_CYCLE = 0 + HEAT_TARGET_TEMP = 1 + HEAT_STATE = 2 + DUTY_CYCLE_COUNT = 3 + PWM_PERIOD = 4 + ADJUSTED_TARGET_TEMP = 5 + TARGET_TEMP_TD = 6 + +@unique +class DDLevelSensorEnum(DialinEnum): + D6_LEVEL = 0 # floater switch low, medium and high status + D63_LEVEL = 1 # bicarb level low or high status + D46_LEVEL = 2 # Spent dialysate air separation chamber level low or high status + NUM_OF_LEVELS = 3 + +@unique +class DDPistonPumpsEnum(DialinEnum): + ACID = 0 # Acid piston pump + BICARB = 1 # Bicarbonate piston pump + UF = 2 # Ultrafilteration piston pump + NUM_OF_PISTON_PUMPS = 3 # Number of piston pumps + +@unique +class DDPistonPumpAttributesEnum(DialinEnum): + CONTROL_STATE = 0, + SW_COUNTER = 1, + CYCLE_COUNTER = 2 + +@unique +class PressureNames(DialinEnum): + # Pressure Sensor IDs + M1_PRES = 0 # Water Inlet pressure before regulator (PRi) + M3_PRES = 1 # Water Inlet pressure after regulator (PRo) + D9_PRES = 2 # Hydraulics outlet pressure (PHo/Pn) + D66_PRES = 3 # Dry Bicarb pressure (PDB/PCb) + D51_PRES = 4 # Spent Dialysate pressure (PDs) + D18_PRES = 5 # Fresh Dialysate pressure (PDf) + D41_PRES = 6 # Transmembrane pressure (Ptm) + BARO_PRES = 7 # Barometric pressure sensor + NUM_OF_PRESSURE_SENSORS = 8 + +@unique +class PressureAttributesEnum (DialinEnum): + PRES = 0 + TEMP = 1 \ No newline at end of file Index: leahi_dialin/dd/modules/heaters.py =================================================================== diff -u -r829d25cb941953c353279777e82a083d204f99ff -rbeb046149da1b7cf85dbdadb500467490f350fb8 --- leahi_dialin/dd/modules/heaters.py (.../heaters.py) (revision 829d25cb941953c353279777e82a083d204f99ff) +++ leahi_dialin/dd/modules/heaters.py (.../heaters.py) (revision beb046149da1b7cf85dbdadb500467490f350fb8) @@ -20,34 +20,13 @@ from .constants import NO_RESET from leahi_dialin.common.msg_defs import MsgIds, MsgFieldPositions +from leahi_dialin.common.dd_defs import HeatersStartStop, HeatersState, HeatersNames, HeatersAttributesEnum from leahi_dialin.protocols.CAN import DenaliMessage, DenaliChannels from leahi_dialin.utils.base import AbstractSubSystem, publish, DialinEnum from leahi_dialin.utils.checks import check_broadcast_interval_override_ms from leahi_dialin.utils.conversions import integer_to_bytearray, float_to_bytearray -@unique -class HeatersStartStop(DialinEnum): - STOP = 0 - START = 1 - - -@unique -class HeatersState(DialinEnum): - HEATER_EXEC_STATE_OFF = 0 - HEATER_EXEC_STATE_RAMP_TO_TARGET = 1 - HEATER_EXEC_STATE_CONTROL_TO_TARGET = 2 - HEATER_EXEC_STATE_CONTROL_TO_DISINFECT_TARGET = 3 - NUM_OF_HEATERS_STATE = 4 - - -@unique -class HeatersNames(DialinEnum): - D5_HEAT = 0 - D45_HEAT = 1 - NUM_OF_DD_HEATERS = 2 - - class DDHeaters(AbstractSubSystem): """ @@ -65,17 +44,23 @@ self.can_interface = can_interface self.logger = logger - self.d5_heat_duty_cycle = 0.0 - self.d45_heat_duty_cycle = 0.0 - self.d5_heat_target_temperature = 0.0 - self.d45_heat_target_temperature = 0.0 - self.d5_heat_state = 0 - self.d45_heat_state = 0 - self.d5_duty_cycle_count = 0.0 - self.d5_pwm_period = 0.0 - self.d5_adjusted_target_temp = 0.0 - self.d5_target_temp_td = 0.0 self.dd_heaters_timestamp = 0.0 + self.dd_heaters = { + HeatersNames.D5_HEAT.name: { + HeatersAttributesEnum.HEAT_DUTY_CYCLE.name: 0.0, + HeatersAttributesEnum.HEAT_TARGET_TEMP.name: 0.0, + HeatersAttributesEnum.HEAT_STATE.name: 0, + HeatersAttributesEnum.DUTY_CYCLE_COUNT.name: 0.0, + HeatersAttributesEnum.PWM_PERIOD.name: 0.0, + HeatersAttributesEnum.ADJUSTED_TARGET_TEMP.name: 0.0, + HeatersAttributesEnum.TARGET_TEMP_TD.name: 0.0 + }, + HeatersNames.D45_HEAT.name: { + HeatersAttributesEnum.HEAT_DUTY_CYCLE.name: 0.0, + HeatersAttributesEnum.HEAT_TARGET_TEMP.name: 0.0, + HeatersAttributesEnum.HEAT_STATE.name: 0 + } + } #Temp Heater Debugging published fields self.dbg1 = 0.0 @@ -94,39 +79,34 @@ msg_id = MsgIds.MSG_ID_DD_HEATERS_DATA.value self.can_interface.register_receiving_publication_function(channel_id, msg_id, self._handler_heaters_sync) - @publish(["dd_heaters_timestamp", - "d5_heat_duty_cycle","d45_heat_duty_cycle", - "d5_heat_target_temperature","d45_heat_target_temperature", - "d5_heat_state","d45_heat_state", - "d5_duty_cycle_count","d5_pwm_period", - "d5_adjusted_target_temp","d5_target_temp_td"]) + @publish(["dd_heaters_timestamp", "dd_heaters"]) def _handler_heaters_sync(self, message, timestamp=0.0): """ Handles published DD heaters message @param message: published DD heaters data message @returns none """ - self.d5_heat_duty_cycle = struct.unpack('f', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_1:MsgFieldPositions.END_POS_FIELD_1]))[0] - self.d45_heat_duty_cycle = struct.unpack('f', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_2:MsgFieldPositions.END_POS_FIELD_2]))[0] - self.d5_heat_target_temperature = struct.unpack('f', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_3:MsgFieldPositions.END_POS_FIELD_3]))[0] - self.d45_heat_target_temperature = struct.unpack('f', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_4:MsgFieldPositions.END_POS_FIELD_4]))[0] - self.d5_heat_state = struct.unpack('i', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_5:MsgFieldPositions.END_POS_FIELD_5]))[0] - self.d45_heat_state = struct.unpack('i', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_6:MsgFieldPositions.END_POS_FIELD_6]))[0] - self.d5_duty_cycle_count = struct.unpack('f', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_7:MsgFieldPositions.END_POS_FIELD_7]))[0] - self.d5_pwm_period = struct.unpack('f', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_8:MsgFieldPositions.END_POS_FIELD_8]))[0] - self.d5_adjusted_target_temp = struct.unpack('f', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_9:MsgFieldPositions.END_POS_FIELD_9]))[0] - self.d5_target_temp_td = struct.unpack('f', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_10:MsgFieldPositions.END_POS_FIELD_10]))[0] + self.dd_heaters[HeatersNames.D5_HEAT.name][HeatersAttributesEnum.HEAT_DUTY_CYCLE.name] = ( + struct.unpack('f', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_1:MsgFieldPositions.END_POS_FIELD_1])))[0] + self.dd_heaters[HeatersNames.D45_HEAT.name][HeatersAttributesEnum.HEAT_DUTY_CYCLE.name] = ( + struct.unpack('f', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_2:MsgFieldPositions.END_POS_FIELD_2])))[0] + self.dd_heaters[HeatersNames.D5_HEAT.name][HeatersAttributesEnum.HEAT_TARGET_TEMP.name] = ( + struct.unpack('f', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_3:MsgFieldPositions.END_POS_FIELD_3])))[0] + self.dd_heaters[HeatersNames.D45_HEAT.name][HeatersAttributesEnum.HEAT_TARGET_TEMP.name] = ( + struct.unpack('f', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_4:MsgFieldPositions.END_POS_FIELD_4])))[0] + self.dd_heaters[HeatersNames.D5_HEAT.name][HeatersAttributesEnum.HEAT_STATE.name] = ( + struct.unpack('i', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_5:MsgFieldPositions.END_POS_FIELD_5])))[0] + self.dd_heaters[HeatersNames.D45_HEAT.name][HeatersAttributesEnum.HEAT_STATE.name] = ( + struct.unpack('i', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_6:MsgFieldPositions.END_POS_FIELD_6])))[0] + self.dd_heaters[HeatersNames.D5_HEAT.name][HeatersAttributesEnum.DUTY_CYCLE_COUNT.name] = ( + struct.unpack('f', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_7:MsgFieldPositions.END_POS_FIELD_7])))[0] + self.dd_heaters[HeatersNames.D5_HEAT.name][HeatersAttributesEnum.PWM_PERIOD.name] = ( + struct.unpack('f', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_8:MsgFieldPositions.END_POS_FIELD_8])))[0] + self.dd_heaters[HeatersNames.D5_HEAT.name][HeatersAttributesEnum.ADJUSTED_TARGET_TEMP.name] = ( + struct.unpack('f', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_9:MsgFieldPositions.END_POS_FIELD_9])))[0] + self.dd_heaters[HeatersNames.D5_HEAT.name][HeatersAttributesEnum.TARGET_TEMP_TD.name] = ( + struct.unpack('f', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_10:MsgFieldPositions.END_POS_FIELD_10])))[0] self.dbg1 = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_11:MsgFieldPositions.END_POS_FIELD_11]))[0] Index: leahi_dialin/dd/modules/levels.py =================================================================== diff -u -r9466b5c6b5867f392104a42608aa9542a7ff0358 -rbeb046149da1b7cf85dbdadb500467490f350fb8 --- leahi_dialin/dd/modules/levels.py (.../levels.py) (revision 9466b5c6b5867f392104a42608aa9542a7ff0358) +++ leahi_dialin/dd/modules/levels.py (.../levels.py) (revision beb046149da1b7cf85dbdadb500467490f350fb8) @@ -20,17 +20,12 @@ from .constants import NO_RESET from leahi_dialin.common.msg_defs import MsgIds, MsgFieldPositions +from leahi_dialin.common.dd_defs import DDLevelSensorEnum from leahi_dialin.protocols.CAN import DenaliMessage, DenaliChannels from leahi_dialin.utils.base import AbstractSubSystem, publish, DialinEnum from leahi_dialin.utils.checks import check_broadcast_interval_override_ms from leahi_dialin.utils.conversions import integer_to_bytearray, float_to_bytearray -@unique -class DDLevelSensorEnum(DialinEnum): - D6_LEVEL = 0 # floater switch low, medium and high status - D63_LEVEL = 1 # bicarb level low or high status - D46_LEVEL = 2 # Spent dialysate air separation chamber level low or high status - NUM_OF_LEVELS = 3 class DDLevels(AbstractSubSystem): """ @@ -54,28 +49,27 @@ msg_id = MsgIds.MSG_ID_DD_LEVEL_DATA.value self.can_interface.register_receiving_publication_function(channel_id, msg_id, self._handler_levels_sync) - self.d6_level = 0 - self.d63_level = 0 - self.d46_level = 0 self.dd_levels_timestamp = 0 + self.dd_level_sensors = { + DDLevelSensorEnum.D6_LEVEL.name: 0, + DDLevelSensorEnum.D63_LEVEL.name: 0, + DDLevelSensorEnum.D46_LEVEL.name: 0 + } - @publish(["dd_levels_timestamp", - "d6_level", - "d63_level", - "d46_level"]) + @publish(["dd_levels_timestamp", "dd_level_sensor"]) def _handler_levels_sync(self, message, timestamp=0.0): """ Handles published levels message @param message: published levels data message @returns none """ - self.d6_level = struct.unpack('i', bytearray( + self.dd_level_sensors[DDLevelSensorEnum.D6_LEVEL.name] = struct.unpack('i', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_1:MsgFieldPositions.END_POS_FIELD_1]))[0] - self.d63_level = struct.unpack('i', bytearray( + self.dd_level_sensors[DDLevelSensorEnum.D63_LEVEL.name] = struct.unpack('i', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_2:MsgFieldPositions.END_POS_FIELD_2]))[0] - self.d46_level = struct.unpack('i', bytearray( + self.dd_level_sensors[DDLevelSensorEnum.D46_LEVEL.name] = struct.unpack('i', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_3:MsgFieldPositions.END_POS_FIELD_3]))[0] self.dd_levels_timestamp = timestamp Index: leahi_dialin/dd/modules/piston_pump.py =================================================================== diff -u -r68422d08c4141999a13496343264483a32314d37 -rbeb046149da1b7cf85dbdadb500467490f350fb8 --- leahi_dialin/dd/modules/piston_pump.py (.../piston_pump.py) (revision 68422d08c4141999a13496343264483a32314d37) +++ leahi_dialin/dd/modules/piston_pump.py (.../piston_pump.py) (revision beb046149da1b7cf85dbdadb500467490f350fb8) @@ -19,17 +19,12 @@ from .constants import RESET, NO_RESET from leahi_dialin.common.msg_defs import MsgIds, MsgFieldPositions +from leahi_dialin.common.dd_defs import DDPistonPumpsEnum, DDPistonPumpAttributesEnum from leahi_dialin.protocols.CAN import DenaliMessage, DenaliChannels from leahi_dialin.utils.base import AbstractSubSystem, publish, DialinEnum from leahi_dialin.utils.checks import check_broadcast_interval_override_ms from leahi_dialin.utils.conversions import integer_to_bytearray, float_to_bytearray -@unique -class DDPistonPumpsEnum(DialinEnum): - ACID = 0 # Acid piston pump - BICARB = 1 # Bicarbonate piston pump - UF = 2 # Ultrafilteration piston pump - NUM_OF_PISTON_PUMPS = 3 # Number of piston pumps class DDPistonPumps(AbstractSubSystem): """ @@ -55,20 +50,25 @@ self._handler_piston_pumps_sync) self.dd_piston_pump_timestamp = 0.0 - self.acid_control_state = 0 - self.bicarb_control_state = 0 - self.uf_control_state = 0 - self.acid_sw_counter = 0 - self.bicarb_sw_counter = 0 - self.uf_sw_counter = 0 - self.acid_cycle_counter = 0 - self.bicarb_cycle_counter = 0 - self.uf_cycle_counter = 0 + self.dd_piston_pumps = { + DDPistonPumpsEnum.ACID.name: { + DDPistonPumpAttributesEnum.CONTROL_STATE.name: 0, + DDPistonPumpAttributesEnum.SW_COUNTER.name: 0, + DDPistonPumpAttributesEnum.CYCLE_COUNTER.name: 0 + }, + DDPistonPumpsEnum.BICARB.name: { + DDPistonPumpAttributesEnum.CONTROL_STATE.name: 0, + DDPistonPumpAttributesEnum.SW_COUNTER.name: 0, + DDPistonPumpAttributesEnum.CYCLE_COUNTER.name: 0 + }, + DDPistonPumpsEnum.UF.name: { + DDPistonPumpAttributesEnum.CONTROL_STATE.name: 0, + DDPistonPumpAttributesEnum.SW_COUNTER.name: 0, + DDPistonPumpAttributesEnum.CYCLE_COUNTER.name: 0 + } + } - @publish(["dd_piston_pump_timestamp", - "acid_control_state", "bicarb_control_state", "uf_control_state", - "acid_sw_counter", "bicarb_sw_counter", "uf_sw_counter", - "acid_cycle_counter", "bicarb_cycle_counter", "uf_cycle_counter"]) + @publish(["dd_piston_pump_timestamp", "dd_piston_pumps"]) def _handler_piston_pumps_sync(self, message, timestamp=0.0): """ Handles published piston pumps' data messages. Piston pumps' data are captured @@ -77,24 +77,24 @@ @param message: published piston pumps' data message @return: None """ - self.acid_control_state = struct.unpack('i', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_1:MsgFieldPositions.END_POS_FIELD_1]))[0] - self.bicarb_control_state = struct.unpack('i', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_2:MsgFieldPositions.END_POS_FIELD_2]))[0] - self.uf_control_state = struct.unpack('i', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_3:MsgFieldPositions.END_POS_FIELD_3]))[0] - self.acid_sw_counter = struct.unpack('i', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_4:MsgFieldPositions.END_POS_FIELD_4]))[0] - self.bicarb_sw_counter = struct.unpack('i', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_5:MsgFieldPositions.END_POS_FIELD_5]))[0] - self.uf_sw_counter = struct.unpack('i', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_6:MsgFieldPositions.END_POS_FIELD_6]))[0] - self.acid_cycle_counter = struct.unpack('i', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_7:MsgFieldPositions.END_POS_FIELD_7]))[0] - self.bicarb_cycle_counter = struct.unpack('i', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_8:MsgFieldPositions.END_POS_FIELD_8]))[0] - self.uf_cycle_counter = struct.unpack('i', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_9:MsgFieldPositions.END_POS_FIELD_9]))[0] + self.dd_piston_pumps[DDPistonPumpsEnum.ACID.name][DDPistonPumpAttributesEnum.CONTROL_STATE.name] = ( + struct.unpack('i', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_1:MsgFieldPositions.END_POS_FIELD_1])))[0] + self.dd_piston_pumps[DDPistonPumpsEnum.BICARB.name][DDPistonPumpAttributesEnum.CONTROL_STATE.name] = ( + struct.unpack('i', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_2:MsgFieldPositions.END_POS_FIELD_2])))[0] + self.dd_piston_pumps[DDPistonPumpsEnum.UF.name][DDPistonPumpAttributesEnum.CONTROL_STATE.name] = ( + struct.unpack('i', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_3:MsgFieldPositions.END_POS_FIELD_3])))[0] + self.dd_piston_pumps[DDPistonPumpsEnum.ACID.name][DDPistonPumpAttributesEnum.SW_COUNTER.name] = ( + struct.unpack('i', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_4:MsgFieldPositions.END_POS_FIELD_4])))[0] + self.dd_piston_pumps[DDPistonPumpsEnum.BICARB.name][DDPistonPumpAttributesEnum.SW_COUNTER.name] = ( + struct.unpack('i', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_5:MsgFieldPositions.END_POS_FIELD_5])))[0] + self.dd_piston_pumps[DDPistonPumpsEnum.UF.name][DDPistonPumpAttributesEnum.SW_COUNTER.name] = ( + struct.unpack('i', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_6:MsgFieldPositions.END_POS_FIELD_6])))[0] + self.dd_piston_pumps[DDPistonPumpsEnum.ACID.name][DDPistonPumpAttributesEnum.CYCLE_COUNTER.name] = ( + struct.unpack('i', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_7:MsgFieldPositions.END_POS_FIELD_7])))[0] + self.dd_piston_pumps[DDPistonPumpsEnum.BICARB.name][DDPistonPumpAttributesEnum.CYCLE_COUNTER.name] = ( + struct.unpack('i', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_8:MsgFieldPositions.END_POS_FIELD_8])))[0] + self.dd_piston_pumps[DDPistonPumpsEnum.UF.name][DDPistonPumpAttributesEnum.CYCLE_COUNTER.name] = ( + struct.unpack('i', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_9:MsgFieldPositions.END_POS_FIELD_9])))[0] self.dd_piston_pump_timestamp = timestamp Index: leahi_dialin/dd/modules/pressure_sensors.py =================================================================== diff -u -r7b8f39b44fe6c414864c9b88f4d5f5502af51ea6 -rbeb046149da1b7cf85dbdadb500467490f350fb8 --- leahi_dialin/dd/modules/pressure_sensors.py (.../pressure_sensors.py) (revision 7b8f39b44fe6c414864c9b88f4d5f5502af51ea6) +++ leahi_dialin/dd/modules/pressure_sensors.py (.../pressure_sensors.py) (revision beb046149da1b7cf85dbdadb500467490f350fb8) @@ -19,25 +19,13 @@ from .constants import NO_RESET, RESET from leahi_dialin.common.msg_defs import MsgIds, MsgFieldPositions +from leahi_dialin.common.dd_defs import PressureNames, PressureAttributesEnum from leahi_dialin.protocols.CAN import DenaliMessage, DenaliChannels from leahi_dialin.utils.base import AbstractSubSystem, publish, DialinEnum from leahi_dialin.utils.checks import check_broadcast_interval_override_ms from leahi_dialin.utils.conversions import integer_to_bytearray, float_to_bytearray -@unique -class PressureNames(DialinEnum): - # Pressure Sensor IDs - M1_PRES = 0 # Water Inlet pressure before regulator (PRi) - M3_PRES = 1 # Water Inlet pressure after regulator (PRo) - D9_PRES = 2 # Hydraulics outlet pressure (PHo/Pn) - D66_PRES = 3 # Dry Bicarb pressure (PDB/PCb) - D51_PRES = 4 # Spent Dialysate pressure (PDs) - D18_PRES = 5 # Fresh Dialysate pressure (PDf) - D41_PRES = 6 # Transmembrane pressure (Ptm) - BARO_PRES = 7 # Barometric pressure sensor - NUM_OF_PRESSURE_SENSORS = 8 - class DDPressureSensors(AbstractSubSystem): """ DD interface containing pressure related commands. @@ -60,40 +48,39 @@ self.can_interface.register_receiving_publication_function(channel_id, msg_id, self._handler_pressures_sync) - self.m1_pres = 0.0 - self.m3_pres = 0.0 - self.d9_pres = 0.0 - self.d66_pres = 0.0 - self.d51_pres = 0.0 - self.d18_pres = 0.0 - self.d41_pres = 0.0 - self.m1_pres_temp = 0.0 - self.m3_pres_temp = 0.0 - self.d9_pres_temp = 0.0 - self.d66_pres_temp = 0.0 - self.d51_pres_temp = 0.0 - self.d18_pres_temp = 0.0 - self.d41_pres_temp = 0.0 - self.dd_pressures_timestamp = 0 + self.dd_pressures = { + PressureNames.M1_PRES.name: { + PressureAttributesEnum.PRES.name: 0.0, + PressureAttributesEnum.TEMP.name: 0.0 + }, + PressureNames.M3_PRES.name: { + PressureAttributesEnum.PRES.name: 0.0, + PressureAttributesEnum.TEMP.name: 0.0 + }, + PressureNames.D9_PRES.name: { + PressureAttributesEnum.PRES.name: 0.0, + PressureAttributesEnum.TEMP.name: 0.0 + }, + PressureNames.D66_PRES.name: { + PressureAttributesEnum.PRES.name: 0.0, + PressureAttributesEnum.TEMP.name: 0.0 + }, + PressureNames.D51_PRES.name: { + PressureAttributesEnum.PRES.name: 0.0, + PressureAttributesEnum.TEMP.name: 0.0 + }, + PressureNames.D18_PRES.name: { + PressureAttributesEnum.PRES.name: 0.0, + PressureAttributesEnum.TEMP.name: 0.0 + }, + PressureNames.D41_PRES.name: { + PressureAttributesEnum.PRES.name: 0.0, + PressureAttributesEnum.TEMP.name: 0.0 + } + } - @publish([ - "dd_pressures_timestamp", - "m1_pres", - "m3_pres", - "d9_pres", - "d66_pres", - "d51_pres", - "d18_pres", - "d41_pres", - "m1_pres_temp", - "m3_pres_temp", - "d9_pres_temp", - "d66_pres_temp", - "d51_pres_temp", - "d18_pres_temp", - "d41_pres_temp", - ]) + @publish(["dd_pressures_timestamp", "dd_pressures"]) def _handler_pressures_sync(self, message,timestamp=0.0): """ Handles published DD pressure data messages. DD Pressure data are captured @@ -102,33 +89,33 @@ @param message: published DD pressure data message @return: none """ - self.m1_pres = struct.unpack('f', bytearray( + self.dd_pressures[PressureNames.M1_PRES.name][PressureAttributesEnum.PRES.name] = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_1:MsgFieldPositions.END_POS_FIELD_1]))[0] - self.m3_pres = struct.unpack('f', bytearray( + self.dd_pressures[PressureNames.M3_PRES.name][PressureAttributesEnum.PRES.name] = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_2:MsgFieldPositions.END_POS_FIELD_2]))[0] - self.d9_pres = struct.unpack('f', bytearray( + self.dd_pressures[PressureNames.D9_PRES.name][PressureAttributesEnum.PRES.name] = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_3:MsgFieldPositions.END_POS_FIELD_3]))[0] - self.d66_pres = struct.unpack('f', bytearray( + self.dd_pressures[PressureNames.D66_PRES.name][PressureAttributesEnum.PRES.name] = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_4:MsgFieldPositions.END_POS_FIELD_4]))[0] - self.d51_pres = struct.unpack('f', bytearray( + self.dd_pressures[PressureNames.D51_PRES.name][PressureAttributesEnum.PRES.name]= struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_5:MsgFieldPositions.END_POS_FIELD_5]))[0] - self.d18_pres = struct.unpack('f', bytearray( + self.dd_pressures[PressureNames.D18_PRES.name][PressureAttributesEnum.PRES.name] = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_6:MsgFieldPositions.END_POS_FIELD_6]))[0] - self.d41_pres = struct.unpack('f', bytearray( + self.dd_pressures[PressureNames.D41_PRES.name][PressureAttributesEnum.PRES.name] = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_7:MsgFieldPositions.END_POS_FIELD_7]))[0] - self.m1_pres_temp = struct.unpack('f', bytearray( + self.dd_pressures[PressureNames.M1_PRES.name][PressureAttributesEnum.TEMP.name] = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_8:MsgFieldPositions.END_POS_FIELD_8]))[0] - self.m3_pres_temp = struct.unpack('f', bytearray( + self.dd_pressures[PressureNames.M3_PRES.name][PressureAttributesEnum.TEMP.name] = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_9:MsgFieldPositions.END_POS_FIELD_9]))[0] - self.d9_pres_temp = struct.unpack('f', bytearray( + self.dd_pressures[PressureNames.D9_PRES.name][PressureAttributesEnum.TEMP.name] = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_10:MsgFieldPositions.END_POS_FIELD_10]))[0] - self.d66_pres_temp = struct.unpack('f', bytearray( + self.dd_pressures[PressureNames.D66_PRES.name][PressureAttributesEnum.TEMP.name] = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_11:MsgFieldPositions.END_POS_FIELD_11]))[0] - self.d51_pres_temp = struct.unpack('f', bytearray( + self.dd_pressures[PressureNames.D51_PRES.name][PressureAttributesEnum.TEMP.name] = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_12:MsgFieldPositions.END_POS_FIELD_12]))[0] - self.d18_pres_temp = struct.unpack('f', bytearray( + self.dd_pressures[PressureNames.D18_PRES.name][PressureAttributesEnum.TEMP.name] = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_13:MsgFieldPositions.END_POS_FIELD_13]))[0] - self.d41_pres_temp = struct.unpack('f', bytearray( + self.dd_pressures[PressureNames.D41_PRES.name][PressureAttributesEnum.TEMP.name] = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_14:MsgFieldPositions.END_POS_FIELD_14]))[0] self.dd_pressures_timestamp = timestamp