Index: leahi_dialin/common/dd_defs.py =================================================================== diff -u -rbeb046149da1b7cf85dbdadb500467490f350fb8 -re7d16bd6881619e5fc2a0bc1a7fd578a9978498e --- leahi_dialin/common/dd_defs.py (.../dd_defs.py) (revision beb046149da1b7cf85dbdadb500467490f350fb8) +++ leahi_dialin/common/dd_defs.py (.../dd_defs.py) (revision e7d16bd6881619e5fc2a0bc1a7fd578a9978498e) @@ -50,15 +50,13 @@ DD_POST_STATE_FAILED = 13 NUM_OF_DD_POST_STATES = 14 - @unique class DDFaultStates(DialinEnum): DD_FAULT_STATE_START = 0 # DD fault start state DD_FAULT_STATE_RUN_NV_POSTS = 1 # DD fault run RTC and NV data management post DD_FAULT_STATE_COMPLETE = 2 # DD fault complete NUM_OF_DD_FAULT_STATES = 3 # Number of fault mode states - @unique class DDStandByModeStates(DialinEnum): DD_STANDBY_MODE_STATE_IDLE = 0 # Idle standby mode state @@ -98,7 +96,6 @@ DD_EVENT_TD_COMMUNICATION_LOSS = 7 # DD TD communication loss NUM_OF_DD_EVENT_IDS = 8 # Total number of DD events - @unique class DDEventDataType(DialinEnum): EVENT_DATA_TYPE_NONE = 0 @@ -108,7 +105,6 @@ EVENT_DATA_TYPE_BOOL = 4 NUM_OF_EVENT_DATA_TYPES = 5 - @unique class DDServiceModesStates(DialinEnum): DD_SERVICE_STATE_START = 0 # Start service mode state @@ -132,6 +128,34 @@ NUM_OF_BAL_CHAMBER_SW = 2 # Number of balancing chamber states @unique +class ConcentratePumpsEnum(DialinEnum): + D11_CP1_ACID = 0 + D10_CP2_BICARB = 1 + D76_UF = 2 + NUM_OF_CONCENTRATE_PUMPS = 3 + +@unique +class DDConcentratePumpsStates(DialinEnum): + CONCENTRATE_PUMP_OFF_STATE = 0 + CONCENTRATE_PUMP_RAMP_TO_TARGET_SPEED_STATE = 1 + CONCENTRATE_PUMP_CONTROL_TARGET_SPEED_STATE = 2 + NUM_OF_CONCENTRATE_PUMP_STATES = 3 + +@unique +class DDConcentratePumpAttributesEnum(DialinEnum): + CURRENT_STATE = 0 + CURRENT_SET_SPEED = 1 + MEASURED_SPEED = 2 + TARGET_SPEED = 3 + PULSE_US = 4 + TARGET_REV_COUNT = 5 + MEASURED_REV_COUNT = 6 + NUM_OF_D76_CONCENTRATE_PUMP_ATTRIBUTES = 7 + PARKED = NUM_OF_D76_CONCENTRATE_PUMP_ATTRIBUTES + PARK_FAULT = 8 + NUM_OF_D10_D11_CONCENTRATE_PUMP_ATTRIBUTES = 9 + +@unique class ConductivitySensorsEnum(DialinEnum): D17_COND = 0 D27_COND = 1 @@ -144,6 +168,7 @@ class DialysatePumpsEnum(DialinEnum): D12_PUMP = 0 # Fresh Dialysate Pump D48_PUMP = 1 # Spent Dialysate Pump + NUM_OF_DIALYSATE_PUMPS = 2 @unique class DialysatePumpAttributesEnum(DialinEnum): @@ -157,12 +182,14 @@ CONTROL = 7 DIRECTION_ERROR_COUNT = 8 MEASURED_DIRECTION = 9 + NUM_OF_DIALYSATE_PUMP_ATTRIBUTES = 10 @unique class DDDialysatePumpsStates(DialinEnum): DIALYSATE_PUMP_OFF_STATE = 0 DIALYSATE_PUMP_RAMP_UP_STATE = 1 DIALYSATE_PUMP_CONTROL_TO_TARGET_STATE = 2 + NUM_OF_DIALYSATE_PUMP_STATES = 3 @unique class HeatersStartStop(DialinEnum): @@ -192,6 +219,7 @@ PWM_PERIOD = 4 ADJUSTED_TARGET_TEMP = 5 TARGET_TEMP_TD = 6 + NUM_OF_DD_HEATER_ATTRIBUTES = 7 @unique class DDLevelSensorEnum(DialinEnum): @@ -212,6 +240,7 @@ CONTROL_STATE = 0, SW_COUNTER = 1, CYCLE_COUNTER = 2 + NUM_OF_PISTON_PUMP_ATTRIBUTES = 3 @unique class PressureNames(DialinEnum): @@ -229,4 +258,62 @@ @unique class PressureAttributesEnum (DialinEnum): PRES = 0 - TEMP = 1 \ No newline at end of file + TEMP = 1 + NUM_OF_PRES_SENSOR_ATTRIBUTES = 2 + +COND_SENSOR_INDEX_OFFSET = 5 + +@unique +class DDTemperaturesNames(DialinEnum): + D1_TEMP = 0 # Heat exchanger Inlet temperature sensor + X6_TEMP = 1 # Heat exchanger Outlet temperature sensor + D4_TEMP = 2 # Hydraulics primary heater temperature sensor + D50_TEMP = 3 # Trimmer heater temperature sensor + BRD_TEMP = 4 # Barometric temperature sensor + BARO_TEMP = 5 # DD board temperature sensor ( thermistor ) + D17_TEMP = 6 # D16 temperature value + D27_TEMP = 7 # D28 temperature value + D29_TEMP = 8 # D30 temperature value + D44_TEMP = 9 # D44 temperature value + D75_TEMP = 10 # D75 temperature value + D4_AVG_TEMP = 11 # D4 Filtered value + D50_AVG_TEMP = 12 # D50 Filtered value + D28_AVG_TEMP = 13 # D28 Filtered value + D30_AVG_TEMP = 14 # D30 Filtered value + +@unique +class DDValveStates(DialinEnum): + VALVE_STATE_CLOSED = 0 + VALVE_STATE_OPEN = 1 + +@unique +class DDValveNames(DialinEnum): + D14_VALV = 0 # Valve Hydraulics Outlet (D14) + D52_VALV = 1 # Valve Thermal Disinfect (D52) + D8_VALV = 2 # Valve Hydraulics Bypass (D8) + D54_VALV = 3 # Valve Rinse Port (D54) + D53_VALV = 4 # Valve Drain (D53) + D34_VALV = 5 # Valve Dialyzer Bypass (D34) + D64_VALV = 6 # Valve Purge 1 (D64) + D31_VALV = 7 # Valve Pressure Test (D31) + D65_VALV = 8 # Valve DryBcarb Inlet (D65) + D35_VALV = 9 # Valve Dialyzer Inlet (D35) + D40_VALV = 10 # Valve Dialyzer Outlet (D40) + D47_VALV = 11 # Valve Dialysate Out Purge 2 (D47) + D3_VALV = 12 # Valve Hydraulics Inlet (D3) + M4_VALV = 13 # Valve Water Inlet (M4) + RSRVD_SPACE1 = 14 # This space has been reserved + RSRVD_SPACE2 = 15 # This space has been reserved + D23_VALV = 16 # Balancing chamber Valve 1 (D23) + D19_VALV = 17 # Balancing chamber Valve 2 (D19) + D25_VALV = 18 # Balancing chamber Valve 3 (D25) + D26_VALV = 19 # Balancing chamber Valve 7 (D26) + D24_VALV = 20 # Balancing chamber Valve 5 (D24) + D20_VALV = 21 # Balancing chamber Valve 6 (D20) + D21_VALV = 22 # Balancing chamber Valve 4 (D21) + D22_VALV = 23 # Balancing chamber Valve 8 (D22) + D69_VALV = 24 # Ultrafiltration Valve 1 Inlet (D69) + D71_VALV = 25 # Ultrafiltration Valve 2 Inlet (D71) + D70_VALV = 26 # Ultrafiltration Valve 1 Outlet (D70) + D72_VALV = 27 # Ultrafiltration Valve 2 Outlet (D72) + NUM_OF_DD_VALVES = 28 \ No newline at end of file Index: leahi_dialin/common/fp_defs.py =================================================================== diff -u -r77740bc2ccace473a471515cadd4bc1353360cd6 -re7d16bd6881619e5fc2a0bc1a7fd578a9978498e --- leahi_dialin/common/fp_defs.py (.../fp_defs.py) (revision 77740bc2ccace473a471515cadd4bc1353360cd6) +++ leahi_dialin/common/fp_defs.py (.../fp_defs.py) (revision e7d16bd6881619e5fc2a0bc1a7fd578a9978498e) @@ -60,20 +60,34 @@ class FPConductivitySensorsEnum(DialinEnum): P9_COND = 0 # CPi (P9) conductivity sensor value P18_COND = 1 # CPo (P18) conductivity sensor value + NUM_OF_FP_CONDUCTIVITY = 2 @unique class FPFlowSensorNames(DialinEnum): P7_FLOW = 0 # Water inlet flow sensor (FMS P7) P16_FLOW = 1 # RO outlet flow sensor (FMP P16) + NUM_OF_FP_FLOW_SENSORS = 2 @unique +class FPFlowSensorAttributesEnum(DialinEnum): + FLOW = 0 + TEMP = 1 + NUM_OF_FP_FLOW_ATTRIBUTES = 2 + +@unique class FPFloaterLevels(DialinEnum): LEVEL_STATE_LOW = 0 LEVEL_STATE_MEDIUM = 1 LEVEL_STATE_HIGH = 2 LEVEL_STATE_ILLEGAL = 3 + NUM_OF_LEVEL_STATES = 4 @unique +class FPFloaterLevelSensorNames(DialinEnum): + P25_LEVEL = 0 + NUM_OF_FP_LEVEL_SENSORS = 1 + +@unique class FPPressureSensorNames(DialinEnum): M1_PRES = 0 M3_PRES = 1 @@ -84,8 +98,27 @@ X2_PRES = 6 X3_PRES = 7 X4_PRES = 8 + NUM_OF_FP_PRES_SENSORS = 9 @unique +class ROPumpNames(DialinEnum): + P12_PUMP = 0 + NUM_OF_RO_PUMPS = 1 + +@unique +class ROPumpAttributes(DialinEnum): + STATE = 0 + DUTY_CYCLE = 1 + FB_DUTY_CYCLE = 2 + SPEED = 3 + TARGET_PRES = 4 + TARGET_FLOW = 5 + TARGET_DUTY_CYCLE = 6 + DUTY_CYCLE_PCT = 7 + FB_DUTY_CYCLE_PCT = 8 + NUM_OF_RO_PUMP_ATTRIBUTES = 9 + +@unique class FPTemperaturesNames(DialinEnum): P10_TEMP = 0 # P10 temperature from inlet conductivity sensor. P19_TEMP = 1 # P19 temperature from outlet conductivity sensor. Index: leahi_dialin/common/td_defs.py =================================================================== diff -u -r3284125031072078a4b61a83d36bff419a770918 -re7d16bd6881619e5fc2a0bc1a7fd578a9978498e --- leahi_dialin/common/td_defs.py (.../td_defs.py) (revision 3284125031072078a4b61a83d36bff419a770918) +++ leahi_dialin/common/td_defs.py (.../td_defs.py) (revision e7d16bd6881619e5fc2a0bc1a7fd578a9978498e) @@ -177,4 +177,38 @@ EVENT_DATA_TYPE_S32 = 2 EVENT_DATA_TYPE_F32 = 3 EVENT_DATA_TYPE_BOOL = 4 - NUM_OF_EVENT_DATA_TYPES = 5 \ No newline at end of file + NUM_OF_EVENT_DATA_TYPES = 5 + +@unique +class TDAirPumpNames(DialinEnum): + H12_AIR_PUMP = 0 + NUM_OF_AIR_PUMPS = 1 + +@unique +class TDAirPumpAttributes(DialinEnum): + STATE = 0 + POWER = 1 + NUM_OF_AIR_PUMP_ATTRIBUTES = 2 + +@unique +class AirTrapValves(DialinEnum): + H13_VALV = 0 # Air trap intake valve + H20_VALV = 1 # Air trap outlet valve + NUM_OF_AIR_TRAP_VALVES = 2 + +@unique +class AirTrapLevelSensors(DialinEnum): + H17_LEVEL = 0 # Lower Level Sensor + H16_LEVEL = 1 # Upper Level Sensor + NUM_OF_AIR_TRAP_LEVEL_SENSORS = 2 + +@unique +class AirTrapLevelSensorsAttributes(DialinEnum): + LEVEL = 0 + RAW = 1 + NUM_OF_AIR_TRAP_LEVEL_SENSOR_ATTRIBUTES = 2 + +@unique +class AirTrapState(DialinEnum): + STATE_CLOSED = 0 + STATE_OPEN = 1 \ No newline at end of file Index: leahi_dialin/dd/modules/concentrate_pump.py =================================================================== diff -u -r8359a016f75bc716effb3d37d770680b01b38790 -re7d16bd6881619e5fc2a0bc1a7fd578a9978498e --- leahi_dialin/dd/modules/concentrate_pump.py (.../concentrate_pump.py) (revision 8359a016f75bc716effb3d37d770680b01b38790) +++ leahi_dialin/dd/modules/concentrate_pump.py (.../concentrate_pump.py) (revision e7d16bd6881619e5fc2a0bc1a7fd578a9978498e) @@ -19,25 +19,13 @@ from .constants import RESET, NO_RESET from leahi_dialin.common.msg_defs import MsgIds, MsgFieldPositions +from leahi_dialin.common.dd_defs import ConcentratePumpsEnum, DDConcentratePumpsStates, DDConcentratePumpAttributesEnum 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 ConcentratePumpsEnum(DialinEnum): - D11_CP1_ACID = 0 - D10_CP2_BICARB = 1 - D76_UF = 2 - -@unique -class DDConcentratePumpsStates(DialinEnum): - CONCENTRATE_PUMP_OFF_STATE = 0 - CONCENTRATE_PUMP_RAMP_TO_TARGET_SPEED_STATE = 1 - CONCENTRATE_PUMP_CONTROL_TARGET_SPEED_STATE = 2 - - class DDConcentratePumps(AbstractSubSystem): """ Dialin API sub-class for concentrate pumps related commands. @@ -59,49 +47,43 @@ self.can_interface.register_receiving_publication_function(channel_id, msg_id, self._handler_concentrate_pumps_sync) + self.dd_concentrate_pumps = { + ConcentratePumpsEnum.D10_CP2_BICARB.name: { + DDConcentratePumpAttributesEnum.CURRENT_STATE.name: 0, + DDConcentratePumpAttributesEnum.CURRENT_SET_SPEED.name: 0.0, + DDConcentratePumpAttributesEnum.MEASURED_SPEED.name: 0.0, + DDConcentratePumpAttributesEnum.TARGET_SPEED.name: 0.0, + DDConcentratePumpAttributesEnum.PULSE_US.name: 0.0, + DDConcentratePumpAttributesEnum.TARGET_REV_COUNT.name: 0, + DDConcentratePumpAttributesEnum.MEASURED_REV_COUNT.name: 0, + DDConcentratePumpAttributesEnum.PARKED.name: False, + DDConcentratePumpAttributesEnum.PARK_FAULT.name: False + }, + ConcentratePumpsEnum.D11_CP1_ACID.name: { + DDConcentratePumpAttributesEnum.CURRENT_STATE.name: 0, + DDConcentratePumpAttributesEnum.CURRENT_SET_SPEED.name: 0.0, + DDConcentratePumpAttributesEnum.MEASURED_SPEED.name: 0.0, + DDConcentratePumpAttributesEnum.TARGET_SPEED.name: 0.0, + DDConcentratePumpAttributesEnum.PULSE_US.name: 0.0, + DDConcentratePumpAttributesEnum.TARGET_REV_COUNT.name: 0, + DDConcentratePumpAttributesEnum.MEASURED_REV_COUNT.name: 0, + DDConcentratePumpAttributesEnum.PARKED.name: False, + DDConcentratePumpAttributesEnum.PARK_FAULT.name: False + }, + ConcentratePumpsEnum.D76_UF.name: { + DDConcentratePumpAttributesEnum.CURRENT_STATE.name: 0, + DDConcentratePumpAttributesEnum.CURRENT_SET_SPEED.name: 0.0, + DDConcentratePumpAttributesEnum.MEASURED_SPEED.name: 0.0, + DDConcentratePumpAttributesEnum.TARGET_SPEED.name: 0.0, + DDConcentratePumpAttributesEnum.PULSE_US.name: 0.0, + DDConcentratePumpAttributesEnum.TARGET_REV_COUNT.name: 0, + DDConcentratePumpAttributesEnum.MEASURED_REV_COUNT.name: 0 + } + } - self.d10_current_state = 0 - self.d10_current_set_speed = 0.0 - self.d10_measured_speed = 0.0 - self.d10_target_speed = 0.0 - self.d10_pulse_us = 0.0 - self.d10_target_rev_count = 0 - self.d10_measured_rev_count = 0 - self.d10_parked = False - self.d10_park_fault = False - - self.d11_current_state = 0 - self.d11_current_set_speed = 0.0 - self.d11_measured_speed = 0.0 - self.d11_target_speed = 0.0 - self.d11_pulse_us = 0.0 - self.d11_target_rev_count = 0 - self.d11_measured_rev_count = 0 - self.d11_parked = False - self.d11_park_fault = False - - self.d76_current_state = 0 - self.d76_current_set_speed = 0.0 - self.d76_measured_speed = 0.0 - self.d76_target_speed = 0.0 - self.d76_pulse_us = 0.0 - self.d76_target_rev_count = 0 - self.d76_measured_rev_count = 0 - self.dd_concentrate_pump_timestamp = 0.0 - @publish(["dd_concentrate_pump_timestamp", - "d11_cp1_current_set_speed", "d11_cp1_measured_speed", "d11_cp1_target_speed", - "d10_cp2_current_set_speed", "d10_cp2_measured_speed", "d10_cp2_target_speed", - "d11_cp1_current_state", "d10_cp2_current_state", - "d11_cp1_target_rev_count", "d10_cp2_target_rev_count", - "d11_cp1_measured_rev_count", "d10_cp2_measured_rev_count", - "d11_cp1_parked", "d10_cp2_parked", - "d11_cp1_park_fault", "d10_cp2_park_fault", - "d76_current_state","d76_current_set_speed", - "d76_measured_speed","d76_target_speed", - "d76_pulse_us","d76_target_rev_count", - "d76_measured_rev_count"]) + @publish(["dd_concentrate_pump_timestamp", "dd_concentrate_pumps"]) def _handler_concentrate_pumps_sync(self, message, timestamp=0.0): """ Handles published concentrate pumps' data messages. Concentrate pumps' speed data are captured @@ -111,56 +93,56 @@ @return: None """ - self.d11_current_set_speed = struct.unpack('f', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_1:MsgFieldPositions.END_POS_FIELD_1]))[0] - self.d11_measured_speed = struct.unpack('f', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_2:MsgFieldPositions.END_POS_FIELD_2]))[0] - self.d10_current_set_speed = struct.unpack('f', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_3:MsgFieldPositions.END_POS_FIELD_3]))[0] - self.d10_cp2_measured_speed = struct.unpack('f', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_4:MsgFieldPositions.END_POS_FIELD_4]))[0] - self.d11_target_rev_count = struct.unpack('i', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_5:MsgFieldPositions.END_POS_FIELD_5]))[0] - self.d11_measured_rev_count = struct.unpack('i', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_6:MsgFieldPositions.END_POS_FIELD_6]))[0] - self.d10_target_rev_count = struct.unpack('i', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_7:MsgFieldPositions.END_POS_FIELD_7]))[0] - self.d10_measured_rev_count = struct.unpack('i', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_8:MsgFieldPositions.END_POS_FIELD_8]))[0] - self.d11_current_state = struct.unpack('i', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_9:MsgFieldPositions.END_POS_FIELD_9]))[0] - self.d10_current_state = struct.unpack('i', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_10:MsgFieldPositions.END_POS_FIELD_10]))[0] - self.d11_pulse_us = struct.unpack('f', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_11:MsgFieldPositions.END_POS_FIELD_11]))[0] - self.d10_pulse_us = struct.unpack('f', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_12:MsgFieldPositions.END_POS_FIELD_12]))[0] - self.d11_target_speed = struct.unpack('f', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_13:MsgFieldPositions.END_POS_FIELD_13]))[0] - self.d10_target_speed = struct.unpack('f', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_14:MsgFieldPositions.END_POS_FIELD_14]))[0] - self.d11_parked = True if struct.unpack('I', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_15:MsgFieldPositions.END_POS_FIELD_15]))[0] == 1 else False - self.d10_parked = True if struct.unpack('I', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_16:MsgFieldPositions.END_POS_FIELD_16]))[0] == 1 else False - self.d11_park_fault = True if struct.unpack('I', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_17:MsgFieldPositions.END_POS_FIELD_17]))[0] == 1 else False - self.d10_park_fault = True if struct.unpack('I', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_18:MsgFieldPositions.END_POS_FIELD_18]))[0] == 1 else False - self.d76_target_speed = struct.unpack('f', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_19:MsgFieldPositions.END_POS_FIELD_19]))[0] - self.d76_current_set_speed = struct.unpack('f', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_20:MsgFieldPositions.END_POS_FIELD_20]))[0] - self.d76_measured_speed = struct.unpack('f', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_21:MsgFieldPositions.END_POS_FIELD_21]))[0] - self.d76_target_rev_count = struct.unpack('i', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_22:MsgFieldPositions.END_POS_FIELD_22]))[0] - self.d76_measured_rev_count = struct.unpack('i', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_23:MsgFieldPositions.END_POS_FIELD_23]))[0] - self.d76_current_state = struct.unpack('i', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_24:MsgFieldPositions.END_POS_FIELD_24]))[0] - self.d76_pulse_us = struct.unpack('f', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_25:MsgFieldPositions.END_POS_FIELD_25]))[0] + self.dd_concentrate_pumps[ConcentratePumpsEnum.D11_CP1_ACID.name][DDConcentratePumpAttributesEnum.CURRENT_SET_SPEED.name] = ( + struct.unpack('f', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_1:MsgFieldPositions.END_POS_FIELD_1])))[0] + self.dd_concentrate_pumps[ConcentratePumpsEnum.D11_CP1_ACID.name][DDConcentratePumpAttributesEnum.MEASURED_SPEED.name] = ( + struct.unpack('f', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_2:MsgFieldPositions.END_POS_FIELD_2])))[0] + self.dd_concentrate_pumps[ConcentratePumpsEnum.D10_CP2_BICARB.name][DDConcentratePumpAttributesEnum.CURRENT_SET_SPEED.name] = ( + struct.unpack('f', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_3:MsgFieldPositions.END_POS_FIELD_3])))[0] + self.dd_concentrate_pumps[ConcentratePumpsEnum.D10_CP2_BICARB.name][DDConcentratePumpAttributesEnum.MEASURED_SPEED.name] = ( + struct.unpack('f', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_4:MsgFieldPositions.END_POS_FIELD_4])))[0] + self.dd_concentrate_pumps[ConcentratePumpsEnum.D11_CP1_ACID.name][DDConcentratePumpAttributesEnum.TARGET_REV_COUNT.name] = ( + struct.unpack('i', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_5:MsgFieldPositions.END_POS_FIELD_5])))[0] + self.dd_concentrate_pumps[ConcentratePumpsEnum.D11_CP1_ACID.name][DDConcentratePumpAttributesEnum.MEASURED_REV_COUNT.name] = ( + struct.unpack('i', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_6:MsgFieldPositions.END_POS_FIELD_6])))[0] + self.dd_concentrate_pumps[ConcentratePumpsEnum.D10_CP2_BICARB.name][DDConcentratePumpAttributesEnum.TARGET_REV_COUNT.name] = ( + struct.unpack('i', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_7:MsgFieldPositions.END_POS_FIELD_7])))[0] + self.dd_concentrate_pumps[ConcentratePumpsEnum.D10_CP2_BICARB.name][DDConcentratePumpAttributesEnum.MEASURED_REV_COUNT.name] = ( + struct.unpack('i', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_8:MsgFieldPositions.END_POS_FIELD_8])))[0] + self.dd_concentrate_pumps[ConcentratePumpsEnum.D11_CP1_ACID.name][DDConcentratePumpAttributesEnum.CURRENT_STATE.name] = ( + struct.unpack('i', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_9:MsgFieldPositions.END_POS_FIELD_9])))[0] + self.dd_concentrate_pumps[ConcentratePumpsEnum.D10_CP2_BICARB.name][DDConcentratePumpAttributesEnum.CURRENT_STATE.name] = ( + struct.unpack('i', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_10:MsgFieldPositions.END_POS_FIELD_10])))[0] + self.dd_concentrate_pumps[ConcentratePumpsEnum.D11_CP1_ACID.name][DDConcentratePumpAttributesEnum.PULSE_US.name] = ( + struct.unpack('f', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_11:MsgFieldPositions.END_POS_FIELD_11])))[0] + self.dd_concentrate_pumps[ConcentratePumpsEnum.D10_CP2_BICARB.name][DDConcentratePumpAttributesEnum.PULSE_US.name] = ( + struct.unpack('f', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_12:MsgFieldPositions.END_POS_FIELD_12])))[0] + self.dd_concentrate_pumps[ConcentratePumpsEnum.D11_CP1_ACID.name][DDConcentratePumpAttributesEnum.TARGET_SPEED.name] = ( + struct.unpack('f', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_13:MsgFieldPositions.END_POS_FIELD_13])))[0] + self.dd_concentrate_pumps[ConcentratePumpsEnum.D10_CP2_BICARB.name][DDConcentratePumpAttributesEnum.TARGET_SPEED.name] = ( + struct.unpack('f', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_14:MsgFieldPositions.END_POS_FIELD_14])))[0] + self.dd_concentrate_pumps[ConcentratePumpsEnum.D11_CP1_ACID.name][DDConcentratePumpAttributesEnum.PARKED.name] = \ + True if struct.unpack('I', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_15:MsgFieldPositions.END_POS_FIELD_15]))[0] == 1 else False + self.dd_concentrate_pumps[ConcentratePumpsEnum.D10_CP2_BICARB.name][DDConcentratePumpAttributesEnum.PARKED.name] = \ + True if struct.unpack('I', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_16:MsgFieldPositions.END_POS_FIELD_16]))[0] == 1 else False + self.dd_concentrate_pumps[ConcentratePumpsEnum.D11_CP1_ACID.name][DDConcentratePumpAttributesEnum.PARK_FAULT.name] = \ + True if struct.unpack('I', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_17:MsgFieldPositions.END_POS_FIELD_17]))[0] == 1 else False + self.dd_concentrate_pumps[ConcentratePumpsEnum.D10_CP2_BICARB.name][DDConcentratePumpAttributesEnum.PARK_FAULT.name] = \ + True if struct.unpack('I', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_18:MsgFieldPositions.END_POS_FIELD_18]))[0] == 1 else False + self.dd_concentrate_pumps[ConcentratePumpsEnum.D76_UF.name][DDConcentratePumpAttributesEnum.TARGET_SPEED.name] = ( + struct.unpack('f', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_19:MsgFieldPositions.END_POS_FIELD_19])))[0] + self.dd_concentrate_pumps[ConcentratePumpsEnum.D76_UF.name][DDConcentratePumpAttributesEnum.CURRENT_SET_SPEED.name] = ( + struct.unpack('f', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_20:MsgFieldPositions.END_POS_FIELD_20])))[0] + self.dd_concentrate_pumps[ConcentratePumpsEnum.D76_UF.name][DDConcentratePumpAttributesEnum.MEASURED_SPEED.name] = ( + struct.unpack('f', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_21:MsgFieldPositions.END_POS_FIELD_21])))[0] + self.dd_concentrate_pumps[ConcentratePumpsEnum.D76_UF.name][DDConcentratePumpAttributesEnum.TARGET_REV_COUNT.name] = ( + struct.unpack('i', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_22:MsgFieldPositions.END_POS_FIELD_22])))[0] + self.dd_concentrate_pumps[ConcentratePumpsEnum.D76_UF.name][DDConcentratePumpAttributesEnum.MEASURED_REV_COUNT.name] = ( + struct.unpack('i', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_23:MsgFieldPositions.END_POS_FIELD_23])))[0] + self.dd_concentrate_pumps[ConcentratePumpsEnum.D76_UF.name][DDConcentratePumpAttributesEnum.CURRENT_STATE.name] = ( + struct.unpack('i', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_24:MsgFieldPositions.END_POS_FIELD_24])))[0] + self.dd_concentrate_pumps[ConcentratePumpsEnum.D76_UF.name][DDConcentratePumpAttributesEnum.PULSE_US.name] = ( + struct.unpack('f', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_25:MsgFieldPositions.END_POS_FIELD_25])))[0] self.dd_concentrate_pump_timestamp = timestamp Index: leahi_dialin/dd/modules/conductivity_sensors.py =================================================================== diff -u -rcf2068872f9d6c000e67ede2dca3e207aa1d041e -re7d16bd6881619e5fc2a0bc1a7fd578a9978498e --- leahi_dialin/dd/modules/conductivity_sensors.py (.../conductivity_sensors.py) (revision cf2068872f9d6c000e67ede2dca3e207aa1d041e) +++ leahi_dialin/dd/modules/conductivity_sensors.py (.../conductivity_sensors.py) (revision e7d16bd6881619e5fc2a0bc1a7fd578a9978498e) @@ -49,7 +49,6 @@ self.can_interface.register_receiving_publication_function(channel_id, msg_id, self._handler_conductivity_sensors_sync) - self.dd_conductivity_timestamp = 0.0 self.dd_conductivity = { ConductivitySensorsEnum.D17_COND.name: 0.0, ConductivitySensorsEnum.D27_COND.name: 0.0, @@ -58,6 +57,8 @@ ConductivitySensorsEnum.D74_COND.name: 0.0 } + self.dd_conductivity_timestamp = 0.0 + @publish(["dd_conductivity_timestamp", "dd_conductivity"]) def _handler_conductivity_sensors_sync(self, message, timestamp=0.0): """ Index: leahi_dialin/dd/modules/dialysate_pump.py =================================================================== diff -u -rcf2068872f9d6c000e67ede2dca3e207aa1d041e -re7d16bd6881619e5fc2a0bc1a7fd578a9978498e --- leahi_dialin/dd/modules/dialysate_pump.py (.../dialysate_pump.py) (revision cf2068872f9d6c000e67ede2dca3e207aa1d041e) +++ leahi_dialin/dd/modules/dialysate_pump.py (.../dialysate_pump.py) (revision e7d16bd6881619e5fc2a0bc1a7fd578a9978498e) @@ -49,7 +49,6 @@ self.can_interface.register_receiving_publication_function(channel_id, msg_id, self._handler_dialysate_pumps_sync) - self.dd_dialysate_pump_timestamp = 0 self.dd_dialysate_pumps = { DialysatePumpsEnum.D12_PUMP.name: { DialysatePumpAttributesEnum.TARGET_RPM.name: 0.0, @@ -77,6 +76,8 @@ } } + self.dd_dialysate_pump_timestamp = 0 + @publish(["dd_dialysate_pump_timestamp", "dd_dialysate_pumps"]) def _handler_dialysate_pumps_sync(self, message, timestamp=0.0): """ Index: leahi_dialin/dd/modules/heaters.py =================================================================== diff -u -rbeb046149da1b7cf85dbdadb500467490f350fb8 -re7d16bd6881619e5fc2a0bc1a7fd578a9978498e --- leahi_dialin/dd/modules/heaters.py (.../heaters.py) (revision beb046149da1b7cf85dbdadb500467490f350fb8) +++ leahi_dialin/dd/modules/heaters.py (.../heaters.py) (revision e7d16bd6881619e5fc2a0bc1a7fd578a9978498e) @@ -44,7 +44,6 @@ self.can_interface = can_interface self.logger = logger - self.dd_heaters_timestamp = 0.0 self.dd_heaters = { HeatersNames.D5_HEAT.name: { HeatersAttributesEnum.HEAT_DUTY_CYCLE.name: 0.0, @@ -73,6 +72,7 @@ self.dbg8 = 0.0 self.dbg9 = 0.0 + self.dd_heaters_timestamp = 0.0 if self.can_interface is not None: channel_id = DenaliChannels.dd_sync_broadcast_ch_id Index: leahi_dialin/dd/modules/levels.py =================================================================== diff -u -rbeb046149da1b7cf85dbdadb500467490f350fb8 -re7d16bd6881619e5fc2a0bc1a7fd578a9978498e --- leahi_dialin/dd/modules/levels.py (.../levels.py) (revision beb046149da1b7cf85dbdadb500467490f350fb8) +++ leahi_dialin/dd/modules/levels.py (.../levels.py) (revision e7d16bd6881619e5fc2a0bc1a7fd578a9978498e) @@ -49,14 +49,15 @@ 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.dd_levels_timestamp = 0 self.dd_level_sensors = { DDLevelSensorEnum.D6_LEVEL.name: 0, DDLevelSensorEnum.D63_LEVEL.name: 0, DDLevelSensorEnum.D46_LEVEL.name: 0 } + self.dd_levels_timestamp = 0 + @publish(["dd_levels_timestamp", "dd_level_sensor"]) def _handler_levels_sync(self, message, timestamp=0.0): """ Index: leahi_dialin/dd/modules/piston_pump.py =================================================================== diff -u -rbeb046149da1b7cf85dbdadb500467490f350fb8 -re7d16bd6881619e5fc2a0bc1a7fd578a9978498e --- leahi_dialin/dd/modules/piston_pump.py (.../piston_pump.py) (revision beb046149da1b7cf85dbdadb500467490f350fb8) +++ leahi_dialin/dd/modules/piston_pump.py (.../piston_pump.py) (revision e7d16bd6881619e5fc2a0bc1a7fd578a9978498e) @@ -49,7 +49,6 @@ self.can_interface.register_receiving_publication_function(channel_id, msg_id, self._handler_piston_pumps_sync) - self.dd_piston_pump_timestamp = 0.0 self.dd_piston_pumps = { DDPistonPumpsEnum.ACID.name: { DDPistonPumpAttributesEnum.CONTROL_STATE.name: 0, @@ -68,6 +67,9 @@ } } + self.dd_piston_pump_timestamp = 0.0 + + @publish(["dd_piston_pump_timestamp", "dd_piston_pumps"]) def _handler_piston_pumps_sync(self, message, timestamp=0.0): """ Index: leahi_dialin/dd/modules/pressure_sensors.py =================================================================== diff -u -rbeb046149da1b7cf85dbdadb500467490f350fb8 -re7d16bd6881619e5fc2a0bc1a7fd578a9978498e --- leahi_dialin/dd/modules/pressure_sensors.py (.../pressure_sensors.py) (revision beb046149da1b7cf85dbdadb500467490f350fb8) +++ leahi_dialin/dd/modules/pressure_sensors.py (.../pressure_sensors.py) (revision e7d16bd6881619e5fc2a0bc1a7fd578a9978498e) @@ -48,7 +48,6 @@ self.can_interface.register_receiving_publication_function(channel_id, msg_id, self._handler_pressures_sync) - self.dd_pressures_timestamp = 0 self.dd_pressures = { PressureNames.M1_PRES.name: { PressureAttributesEnum.PRES.name: 0.0, @@ -80,6 +79,8 @@ } } + self.dd_pressures_timestamp = 0 + @publish(["dd_pressures_timestamp", "dd_pressures"]) def _handler_pressures_sync(self, message,timestamp=0.0): """ Index: leahi_dialin/dd/modules/temperature_sensors.py =================================================================== diff -u -re64aa889e5068ea77967567a94e43e4058c84f8b -re7d16bd6881619e5fc2a0bc1a7fd578a9978498e --- leahi_dialin/dd/modules/temperature_sensors.py (.../temperature_sensors.py) (revision e64aa889e5068ea77967567a94e43e4058c84f8b) +++ leahi_dialin/dd/modules/temperature_sensors.py (.../temperature_sensors.py) (revision e7d16bd6881619e5fc2a0bc1a7fd578a9978498e) @@ -19,32 +19,13 @@ from .constants import NO_RESET, RESET from leahi_dialin.common.msg_defs import MsgIds, MsgFieldPositions +from leahi_dialin.common.dd_defs import COND_SENSOR_INDEX_OFFSET, DDTemperaturesNames 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 -COND_SENSOR_INDEX_OFFSET = 5 -@unique -class DDTemperaturesNames(DialinEnum): - D1_TEMP = 0 # Heat exchanger Inlet temperature sensor - X6_TEMP = 1 # Heat exchanger Outlet temperature sensor - D4_TEMP = 2 # Hydraulics primary heater temperature sensor - D50_TEMP = 3 # Trimmer heater temperature sensor - BRD_TEMP = 4 # Barometric temperature sensor - BARO_TEMP = 5 # DD board temperature sensor ( thermistor ) - D17_TEMP = 6 # D16 temperature value - D27_TEMP = 7 # D28 temperature value - D29_TEMP = 8 # D30 temperature value - D44_TEMP = 9 # D44 temperature value - D75_TEMP = 10 # D75 temperature value - D4_AVG_TEMP = 11 # D4 Filtered value - D50_AVG_TEMP = 12 # D50 Filtered value - D28_AVG_TEMP = 13 # D28 Filtered value - D30_AVG_TEMP = 14 # D30 Filtered value - - class DDTemperatureSensors(AbstractSubSystem): Index: leahi_dialin/dd/modules/valves.py =================================================================== diff -u -r9434135f30fdd9d073685bf5088bb5c58542c624 -re7d16bd6881619e5fc2a0bc1a7fd578a9978498e --- leahi_dialin/dd/modules/valves.py (.../valves.py) (revision 9434135f30fdd9d073685bf5088bb5c58542c624) +++ leahi_dialin/dd/modules/valves.py (.../valves.py) (revision e7d16bd6881619e5fc2a0bc1a7fd578a9978498e) @@ -21,6 +21,7 @@ from .constants import NO_RESET from leahi_dialin.common.msg_defs import MsgIds +from leahi_dialin.common.dd_defs import DDValveStates, DDValveNames 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 @@ -31,43 +32,6 @@ DEENERGIZED = False -@unique -class DDValveStates(DialinEnum): - VALVE_STATE_CLOSED = 0 - VALVE_STATE_OPEN = 1 - - -@unique -class DDValveNames(DialinEnum): - D14_VALV = 0 # Valve Hydraulics Outlet (D14) - D52_VALV = 1 # Valve Thermal Disinfect (D52) - D8_VALV = 2 # Valve Hydraulics Bypass (D8) - D54_VALV = 3 # Valve Rinse Port (D54) - D53_VALV = 4 # Valve Drain (D53) - D34_VALV = 5 # Valve Dialyzer Bypass (D34) - D64_VALV = 6 # Valve Purge 1 (D64) - D31_VALV = 7 # Valve Pressure Test (D31) - D65_VALV = 8 # Valve DryBcarb Inlet (D65) - D35_VALV = 9 # Valve Dialyzer Inlet (D35) - D40_VALV = 10 # Valve Dialyzer Outlet (D40) - D47_VALV = 11 # Valve Dialysate Out Purge 2 (D47) - D3_VALV = 12 # Valve Hydraulics Inlet (D3) - M4_VALV = 13 # Valve Water Inlet (M4) - RSRVD_SPACE1 = 14 # This space has been reserved - RSRVD_SPACE2 = 15 # This space has been reserved - D23_VALV = 16 # Balancing chamber Valve 1 (D23) - D19_VALV = 17 # Balancing chamber Valve 2 (D19) - D25_VALV = 18 # Balancing chamber Valve 3 (D25) - D26_VALV = 19 # Balancing chamber Valve 7 (D26) - D24_VALV = 20 # Balancing chamber Valve 5 (D24) - D20_VALV = 21 # Balancing chamber Valve 6 (D20) - D21_VALV = 22 # Balancing chamber Valve 4 (D21) - D22_VALV = 23 # Balancing chamber Valve 8 (D22) - D69_VALV = 24 # Ultrafiltration Valve 1 Inlet (D69) - D71_VALV = 25 # Ultrafiltration Valve 2 Inlet (D71) - D70_VALV = 26 # Ultrafiltration Valve 1 Outlet (D70) - D72_VALV = 27 # Ultrafiltration Valve 2 Outlet (D72) - class DDValves(AbstractSubSystem): """ Dialysate Delivery (DD) interface for valve related commands. Index: leahi_dialin/fp/modules/conductivity_sensors.py =================================================================== diff -u -r77740bc2ccace473a471515cadd4bc1353360cd6 -re7d16bd6881619e5fc2a0bc1a7fd578a9978498e --- leahi_dialin/fp/modules/conductivity_sensors.py (.../conductivity_sensors.py) (revision 77740bc2ccace473a471515cadd4bc1353360cd6) +++ leahi_dialin/fp/modules/conductivity_sensors.py (.../conductivity_sensors.py) (revision e7d16bd6881619e5fc2a0bc1a7fd578a9978498e) @@ -19,6 +19,7 @@ from .constants import RESET, NO_RESET from leahi_dialin.common.msg_defs import MsgIds, MsgFieldPositions +from leahi_dialin.common.fp_defs import FPConductivitySensorsEnum 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 @@ -45,14 +46,14 @@ msg_id = MsgIds.MSG_ID_FP_CONDUCTIVITY_DATA.value self.can_interface.register_receiving_publication_function(channel_id, msg_id, self._handler_conductivity_sensors_sync) - - self.p9_cond = 0.0 - self.p18_cond = 0.0 - self.fp_conductivity_timestamp = 0.0 - @publish(["fp_conductivity_timestamp", - "p9_cond", "p18_cond"]) + self.fp_conductivity = { + FPConductivitySensorsEnum.P9_COND.name: 0.0, + FPConductivitySensorsEnum.P18_COND.name: 0.0 + } + + @publish(["fp_conductivity_timestamp", "fp_conductivity"]) def _handler_conductivity_sensors_sync(self, message, timestamp=0.0): """ Handles published FP conductivity sensor data messages. Conductivity sensor data are captured @@ -62,9 +63,9 @@ @return: None """ - self.p9_cond = struct.unpack('f', bytearray( + self.fp_conductivity[FPConductivitySensorsEnum.P9_COND.name] = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_1:MsgFieldPositions.END_POS_FIELD_1]))[0] - self.p18_cond = struct.unpack('f', bytearray( + self.fp_conductivity[FPConductivitySensorsEnum.P18_COND.name] = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_2:MsgFieldPositions.END_POS_FIELD_2]))[0] self.fp_conductivity_timestamp = timestamp Index: leahi_dialin/fp/modules/flow_sensors.py =================================================================== diff -u -r77740bc2ccace473a471515cadd4bc1353360cd6 -re7d16bd6881619e5fc2a0bc1a7fd578a9978498e --- leahi_dialin/fp/modules/flow_sensors.py (.../flow_sensors.py) (revision 77740bc2ccace473a471515cadd4bc1353360cd6) +++ leahi_dialin/fp/modules/flow_sensors.py (.../flow_sensors.py) (revision e7d16bd6881619e5fc2a0bc1a7fd578a9978498e) @@ -19,6 +19,7 @@ from .constants import RESET, NO_RESET from leahi_dialin.common.msg_defs import MsgIds, MsgFieldPositions +from leahi_dialin.common.fp_defs import FPFlowSensorNames, FPFlowSensorAttributesEnum 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 @@ -47,31 +48,34 @@ msg_id = MsgIds.MSG_ID_FP_FLOW_DATA.value self.can_interface.register_receiving_publication_function(channel_id, msg_id, self._handler_flow_sensor_sync) + self.fp_flows = { + FPFlowSensorNames.P7_FLOW.name: { + FPFlowSensorAttributesEnum.FLOW.name: 0.0, + FPFlowSensorAttributesEnum.TEMP.name: 0.0 + }, + FPFlowSensorNames.P16_FLOW.name: { + FPFlowSensorAttributesEnum.FLOW.name: 0.0, + FPFlowSensorAttributesEnum.TEMP.name: 0.0 + } + } - self.p7_flow = 0.0 - self.p16_flow = 0.0 - self.p7_temp = 0.0 - self.p16_temp = 0.0 - self.fp_flow_timestamp = 0 - @publish(["fp_flows_timestamp", - "p7_flow", "p16_flow", - "p7_temp", "p16_temp"]) + @publish(["fp_flows_timestamp", "fp_flows"]) def _handler_flow_sensor_sync(self, message, timestamp=0.0): """ Handles published flow sensor message @param message: published flow sensor data message @returns none """ - self.p7_flow = struct.unpack('f', bytearray( + self.fp_flows[FPFlowSensorNames.P7_FLOW.name][FPFlowSensorAttributesEnum.FLOW.name] = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_1:MsgFieldPositions.END_POS_FIELD_1]))[0] - self.p16_flow = struct.unpack('f', bytearray( + self.fp_flows[FPFlowSensorNames.P16_FLOW.name][FPFlowSensorAttributesEnum.FLOW.name] = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_2:MsgFieldPositions.END_POS_FIELD_2]))[0] - self.p7_temp = struct.unpack('f', bytearray( + self.fp_flows[FPFlowSensorNames.P7_FLOW.name][FPFlowSensorAttributesEnum.TEMP.name] = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_3:MsgFieldPositions.END_POS_FIELD_3]))[0] - self.p16_temp = struct.unpack('f', bytearray( + self.fp_flows[FPFlowSensorNames.P16_FLOW.name][FPFlowSensorAttributesEnum.TEMP.name] = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_4:MsgFieldPositions.END_POS_FIELD_4]))[0] self.fp_flow_timestamp = timestamp Index: leahi_dialin/fp/modules/levels.py =================================================================== diff -u -r77740bc2ccace473a471515cadd4bc1353360cd6 -re7d16bd6881619e5fc2a0bc1a7fd578a9978498e --- leahi_dialin/fp/modules/levels.py (.../levels.py) (revision 77740bc2ccace473a471515cadd4bc1353360cd6) +++ leahi_dialin/fp/modules/levels.py (.../levels.py) (revision e7d16bd6881619e5fc2a0bc1a7fd578a9978498e) @@ -20,6 +20,7 @@ from .constants import NO_RESET from leahi_dialin.common.msg_defs import MsgIds, MsgFieldPositions +from leahi_dialin.common.fp_defs import FPFloaterLevels, FPFloaterLevelSensorNames 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 @@ -48,19 +49,21 @@ msg_id = MsgIds.MSG_ID_FP_LEVEL_DATA.value self.can_interface.register_receiving_publication_function(channel_id, msg_id, self._handler_levels_sync) - self.p25_level = 0 + self.fp_levels = { + FPFloaterLevelSensorNames.P25_LEVEL.name: 0 + } self.fp_levels_timestamp = 0 @publish(["fp_levels_timestamp", - "p25_level",]) + "fp_levels",]) def _handler_levels_sync(self, message, timestamp=0.0): """ Handles published levels message @param message: published levels data message @returns none """ - self.p25_level = struct.unpack('i', bytearray( + self.fp_levels[FPFloaterLevelSensorNames.P25_LEVEL.name] = struct.unpack('i', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_1:MsgFieldPositions.END_POS_FIELD_1]))[0] self.fp_levels_timestamp = timestamp Index: leahi_dialin/fp/modules/pressure_sensors.py =================================================================== diff -u -r77740bc2ccace473a471515cadd4bc1353360cd6 -re7d16bd6881619e5fc2a0bc1a7fd578a9978498e --- leahi_dialin/fp/modules/pressure_sensors.py (.../pressure_sensors.py) (revision 77740bc2ccace473a471515cadd4bc1353360cd6) +++ leahi_dialin/fp/modules/pressure_sensors.py (.../pressure_sensors.py) (revision e7d16bd6881619e5fc2a0bc1a7fd578a9978498e) @@ -19,6 +19,7 @@ from .constants import RESET, NO_RESET from leahi_dialin.common.msg_defs import MsgIds, MsgFieldPositions +from leahi_dialin.common.fp_defs import FPPressureSensorNames 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 @@ -45,20 +46,21 @@ self.can_interface.register_receiving_publication_function(channel_id, msg_id, self._handler_pressure_sync) + self.fp_pressures = { + FPPressureSensorNames.M1_PRES.name: 0.0, + FPPressureSensorNames.M3_PRES.name: 0.0, + FPPressureSensorNames.P8_PRES.name: 0.0, + FPPressureSensorNames.P13_PRES.name: 0.0, + FPPressureSensorNames.P17_PRES.name: 0.0, + FPPressureSensorNames.X1_PRES.name: 0.0, + FPPressureSensorNames.X2_PRES.name: 0.0, + FPPressureSensorNames.X3_PRES.name: 0.0, + FPPressureSensorNames.X4_PRES.name: 0.0 + } + self.fp_pressure_timestamp = 0.0 - self.m1_pres = 0.0 - self.m3_pres = 0.0 - self.p8_pres = 0.0 - self.p13_pres = 0.0 - self.p17_pres = 0.0 - self.x1_pres = 0.0 - self.x2_pres = 0.0 - self.x3_pres = 0.0 - self.x4_pres = 0.0 - @publish([ - "fp_pressure_timestamp", "m1_pres", "m3_pres", "p8_pres", "p13_pres", "p17_pres", - "x1_pres", "x2_pres", "x3_pres", "x4_pres", - ]) + + @publish(["fp_pressure_timestamp", "fp_pressures"]) def _handler_pressure_sync(self, message, timestamp=0.0): """ Handles published FP pressure sensor data messages. Pressure data are captured @@ -68,23 +70,23 @@ @return: none """ - self.m1_pres = struct.unpack('f', bytearray( + self.fp_pressures[FPPressureSensorNames.M1_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.fp_pressures[FPPressureSensorNames.M3_PRES.name] = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_2:MsgFieldPositions.END_POS_FIELD_2]))[0] - self.p8_pres = struct.unpack('f', bytearray( + self.fp_pressures[FPPressureSensorNames.P8_PRES.name] = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_3:MsgFieldPositions.END_POS_FIELD_3]))[0] - self.p13_pres = struct.unpack('f', bytearray( + self.fp_pressures[FPPressureSensorNames.P13_PRES.name] = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_4:MsgFieldPositions.END_POS_FIELD_4]))[0] - self.p17_pres = struct.unpack('f', bytearray( + self.fp_pressures[FPPressureSensorNames.P17_PRES.name] = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_5:MsgFieldPositions.END_POS_FIELD_5]))[0] - self.x1_pres = struct.unpack('f', bytearray( + self.fp_pressures[FPPressureSensorNames.X1_PRES.name] = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_6:MsgFieldPositions.END_POS_FIELD_6]))[0] - self.x2_pres = struct.unpack('f', bytearray( + self.fp_pressures[FPPressureSensorNames.X2_PRES.name] = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_7:MsgFieldPositions.END_POS_FIELD_7]))[0] - self.x3_pres = struct.unpack('f', bytearray( + self.fp_pressures[FPPressureSensorNames.X3_PRES.name] = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_8:MsgFieldPositions.END_POS_FIELD_8]))[0] - self.x4_pres = struct.unpack('f', bytearray( + self.fp_pressures[FPPressureSensorNames.X4_PRES.name] = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_9:MsgFieldPositions.END_POS_FIELD_9]))[0] self.fp_pressure_timestamp = timestamp Index: leahi_dialin/fp/modules/ro_pump.py =================================================================== diff -u -rb4df138485c0c52360b6f43d7bd9e92e1c15969a -re7d16bd6881619e5fc2a0bc1a7fd578a9978498e --- leahi_dialin/fp/modules/ro_pump.py (.../ro_pump.py) (revision b4df138485c0c52360b6f43d7bd9e92e1c15969a) +++ leahi_dialin/fp/modules/ro_pump.py (.../ro_pump.py) (revision e7d16bd6881619e5fc2a0bc1a7fd578a9978498e) @@ -21,6 +21,7 @@ from leahi_dialin.utils.base import DialinEnum from .constants import RESET, NO_RESET from leahi_dialin.common.msg_defs import MsgIds, MsgFieldPositions +from leahi_dialin.common.fp_defs import ROPumpNames, ROPumpAttributes 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 @@ -44,20 +45,24 @@ msg_id = MsgIds.MSG_ID_FP_RO_PUMP_DATA.value self.can_interface.register_receiving_publication_function(channel_id, msg_id, self._handler_pump_sync) + + self.ro_pump = { + ROPumpNames.P12_PUMP.name: { + ROPumpAttributes.STATE.name: 0, + ROPumpAttributes.DUTY_CYCLE.name: 0, + ROPumpAttributes.FB_DUTY_CYCLE.name: 0, + ROPumpAttributes.SPEED.name: 0.0, + ROPumpAttributes.TARGET_PRES.name: 0.0, + ROPumpAttributes.TARGET_FLOW.name: 0.0, + ROPumpAttributes.TARGET_DUTY_CYCLE.name: 0.0, + ROPumpAttributes.DUTY_CYCLE_PCT.name: 0.0, + ROPumpAttributes.FB_DUTY_CYCLE_PCT.name: 0.0 + } + } + self.ro_pump_timestamp = 0.0 - self.p12_pump_state = 0 - self.p12_pump_duty_cycle = 0 - self.p12_pump_fb_duty_cycle = 0 - self.p12_pump_speed = 0.0 - self.p12_target_pressure = 0.0 - self.p12_target_flow = 0.0 - self.p12_target_duty_cycle = 0.0 - self.p12_pump_duty_cycle_pct = 0.0 - self.p12_pump_fb_duty_cycle_pct = 0.0 - @publish(["ro_pump_timestamp", "p12_pump_state", "p12_pump_duty_cycle", "p12_pump_fb_duty_cycle", - "p12_pump_speed", "p12_target_pressure", "p12_target_flow", "p12_target_duty_cycle", - "p12_pump_duty_cycle_pct", "p12_pump_fb_duty_cycle_pct" ]) + @publish(["ro_pump_timestamp", "ro_pump" ]) def _handler_pump_sync(self, message, timestamp=0.0): """ Handles published FP ro pump data messages. FP ro pump data is captured @@ -67,23 +72,23 @@ @return: none """ - self.p12_pump_state = struct.unpack('i', bytearray( + self.ro_pump[ROPumpNames.P12_PUMP.name][ROPumpAttributes.STATE.name] = struct.unpack('i', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_1:MsgFieldPositions.END_POS_FIELD_1]))[0] - self.p12_pump_duty_cycle = struct.unpack('i', bytearray( + self.ro_pump[ROPumpNames.P12_PUMP.name][ROPumpAttributes.DUTY_CYCLE.name] = struct.unpack('i', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_2:MsgFieldPositions.END_POS_FIELD_2]))[0] - self.p12_pump_fb_duty_cycle = struct.unpack('i', bytearray( + self.ro_pump[ROPumpNames.P12_PUMP.name][ROPumpAttributes.FB_DUTY_CYCLE.name] = struct.unpack('i', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_3:MsgFieldPositions.END_POS_FIELD_3]))[0] - self.p12_pump_speed = struct.unpack('f', bytearray( + self.ro_pump[ROPumpNames.P12_PUMP.name][ROPumpAttributes.SPEED.name] = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_4:MsgFieldPositions.END_POS_FIELD_4]))[0] - self.p12_target_pressure = struct.unpack('f', bytearray( + self.ro_pump[ROPumpNames.P12_PUMP.name][ROPumpAttributes.TARGET_PRES.name] = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_5:MsgFieldPositions.END_POS_FIELD_5]))[0] - self.p12_target_flow = struct.unpack('f', bytearray( + self.ro_pump[ROPumpNames.P12_PUMP.name][ROPumpAttributes.TARGET_FLOW.name] = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_6:MsgFieldPositions.END_POS_FIELD_6]))[0] - self.p12_target_duty_cycle = struct.unpack('f', bytearray( + self.ro_pump[ROPumpNames.P12_PUMP.name][ROPumpAttributes.TARGET_DUTY_CYCLE.name] = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_7:MsgFieldPositions.END_POS_FIELD_7]))[0] - self.p12_pump_duty_cycle_pct = struct.unpack('f', bytearray( + self.ro_pump[ROPumpNames.P12_PUMP.name][ROPumpAttributes.DUTY_CYCLE_PCT.name] = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_8:MsgFieldPositions.END_POS_FIELD_8]))[0] - self.p12_pump_fb_duty_cycle_pct = struct.unpack('f', bytearray( + self.ro_pump[ROPumpNames.P12_PUMP.name][ROPumpAttributes.FB_DUTY_CYCLE_PCT.name] = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_9:MsgFieldPositions.END_POS_FIELD_9]))[0] self.ro_pump_timestamp = timestamp Index: leahi_dialin/td/modules/air_pump.py =================================================================== diff -u -r7f463d8649e41b995e1a94cc001ffc50541cafb7 -re7d16bd6881619e5fc2a0bc1a7fd578a9978498e --- leahi_dialin/td/modules/air_pump.py (.../air_pump.py) (revision 7f463d8649e41b995e1a94cc001ffc50541cafb7) +++ leahi_dialin/td/modules/air_pump.py (.../air_pump.py) (revision e7d16bd6881619e5fc2a0bc1a7fd578a9978498e) @@ -19,6 +19,7 @@ from .constants import RESET, NO_RESET from leahi_dialin.common.msg_defs import MsgIds, MsgFieldPositions +from leahi_dialin.common.td_defs import TDAirPumpNames, TDAirPumpAttributes from leahi_dialin.protocols.CAN import DenaliMessage, DenaliChannels from leahi_dialin.utils.base import AbstractSubSystem, publish from leahi_dialin.utils.checks import check_broadcast_interval_override_ms @@ -47,11 +48,16 @@ self.can_interface.register_receiving_publication_function(channel_id, msg_id, self._handler_air_pump_sync) - self.h12_air_pump_state = 0 - self.h12_air_pump_power = 0 + self.td_air_pump = { + TDAirPumpNames.H12_AIR_PUMP.name: { + TDAirPumpAttributes.STATE.name: 0, + TDAirPumpAttributes.POWER.name: 0 + } + } + self.td_air_pump_timestamp = 0.0 - @publish(["td_air_pump_timestamp", "h12_air_pump_state","h12_air_pump_power"]) + @publish(["td_air_pump_timestamp", "td_air_pump"]) def _handler_air_pump_sync(self, message, timestamp=0.0): """ Handles published air pump data messages. @@ -64,8 +70,8 @@ app = struct.unpack('i', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_2:MsgFieldPositions.END_POS_FIELD_2])) - self.h12_air_pump_state = aps[0] - self.h12_air_pump_power = app[0] + self.td_air_pump[TDAirPumpNames.H12_AIR_PUMP.name][TDAirPumpAttributes.STATE.name] = aps[0] + self.td_air_pump[TDAirPumpNames.H12_AIR_PUMP.name][TDAirPumpAttributes.POWER.name] = app[0] self.td_air_pump_timestamp = timestamp def cmd_air_pump_set_state(self, state: int, power: int) -> int: Index: leahi_dialin/td/modules/air_trap.py =================================================================== diff -u -rdf2b51a17a2ccdaf3587f631de7623fa7fcae624 -re7d16bd6881619e5fc2a0bc1a7fd578a9978498e --- leahi_dialin/td/modules/air_trap.py (.../air_trap.py) (revision df2b51a17a2ccdaf3587f631de7623fa7fcae624) +++ leahi_dialin/td/modules/air_trap.py (.../air_trap.py) (revision e7d16bd6881619e5fc2a0bc1a7fd578a9978498e) @@ -19,32 +19,20 @@ from .constants import RESET, NO_RESET from leahi_dialin.common.msg_defs import MsgIds, MsgFieldPositions +from leahi_dialin.common.td_defs import AirTrapValves, AirTrapLevelSensors, AirTrapLevelSensorsAttributes, AirTrapState 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 -class AirTrapValves(DialinEnum): - H13_VALV = 0 # Air trap intake valve - H20_VALV = 1 # Air trap outlet valve - -@unique -class AirTrapState(DialinEnum): - STATE_CLOSED = 0 - STATE_OPEN = 1 - class TDAirTrap(AbstractSubSystem): """ TDAirTrap Treatment Delivery (TD) Dialin API sub-class for air trap related commands. """ - # Air trap level sensor IDs - H17_LOWER_LEVEL_SENSOR = 0 - H16_UPPER_LEVEL_SENSOR = 1 - # Air trap level sensor levels AIR_DETECTED_AT_LEVEL = 0 FLUID_DETECTED_AT_LEVEL = 1 @@ -64,18 +52,26 @@ self.can_interface.register_receiving_publication_function(channel_id, msg_id, self._handler_air_trap_sync) - self.h17_lower_level = self.AIR_DETECTED_AT_LEVEL - self.h16_upper_level = self.AIR_DETECTED_AT_LEVEL - self.h17_lower_level_raw = self.AIR_DETECTED_AT_LEVEL - self.h16_upper_level_raw = self.AIR_DETECTED_AT_LEVEL - self.h13_valve_state = 0 - self.h20_valve_state = 0 + self.air_trap_level_sensors = { + AirTrapLevelSensors.H17_LEVEL.name: { + AirTrapLevelSensorsAttributes.LEVEL.name: self.AIR_DETECTED_AT_LEVEL, + AirTrapLevelSensorsAttributes.RAW.name: self.AIR_DETECTED_AT_LEVEL + }, + AirTrapLevelSensors.H16_LEVEL.name: { + AirTrapLevelSensorsAttributes.LEVEL.name: self.AIR_DETECTED_AT_LEVEL, + AirTrapLevelSensorsAttributes.RAW.name: self.AIR_DETECTED_AT_LEVEL + } + } + self.air_trap_valve_states = { + AirTrapValves.H13_VALV.name: 0, + AirTrapValves.H20_VALV.name: 0 + } self.air_control = 0 self.td_air_trap_timestamp = 0.0 - @publish(["td_air_trap_timestamp", "h17_lower_level", "h16_upper_level", - "h17_lower_level_raw", "h16_upper_level_raw", - "h13_valve_state","h20_valve_state", + @publish(["td_air_trap_timestamp", + "air_trap_level_sensors", + "air_trap_valve_states", "air_control"]) def _handler_air_trap_sync(self, message, timestamp=0.0): """ @@ -101,12 +97,12 @@ controlling = struct.unpack('i', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_7:MsgFieldPositions.END_POS_FIELD_7])) - self.h17_lower_level = lower[0] - self.h16_upper_level = upper[0] - self.h17_lower_level_raw = raw_lower[0] - self.h16_upper_level_raw = raw_upper[0] - self.h13_valve_state = h13_vlv_st[0] - self.h20_valve_state = h20_vlv_st[0] + self.air_trap_level_sensors[AirTrapLevelSensors.H17_LEVEL.name][AirTrapLevelSensorsAttributes.LEVEL.name] = lower[0] + self.air_trap_level_sensors[AirTrapLevelSensors.H16_LEVEL.name][AirTrapLevelSensorsAttributes.LEVEL.name] = upper[0] + self.air_trap_level_sensors[AirTrapLevelSensors.H17_LEVEL.name][AirTrapLevelSensorsAttributes.RAW.name] = raw_lower[0] + self.air_trap_level_sensors[AirTrapLevelSensors.H16_LEVEL.name][AirTrapLevelSensorsAttributes.RAW.name] = raw_upper[0] + self.air_trap_valve_states[AirTrapValves.H13_VALV.name] = h13_vlv_st[0] + self.air_trap_valve_states[AirTrapValves.H20_VALV.name] = h20_vlv_st[0] self.air_control = controlling[0] self.td_air_trap_timestamp = timestamp