Index: leahi_dialin/ro/modules/boost_pump.py =================================================================== diff -u -r3c967e5acc6286c6334d2708600e3317988f87f1 -r7ae7087e830140ab07b841b2c0ff437269a5fc2f --- leahi_dialin/ro/modules/boost_pump.py (.../boost_pump.py) (revision 3c967e5acc6286c6334d2708600e3317988f87f1) +++ leahi_dialin/ro/modules/boost_pump.py (.../boost_pump.py) (revision 7ae7087e830140ab07b841b2c0ff437269a5fc2f) @@ -26,12 +26,12 @@ @unique class ROPumpNames(DialinEnum): - PUMP_RO = 0 - PUMP_BOOSTER = 1 + P12_PUMP_RO = 0 + P40_PUMP_BOOSTER = 1 class ROPumps(AbstractSubSystem): """ - TReverse Osmosis (RO) Dialin API sub-class for blood-flow related commands. + Dialin API sub-class for RO pump related commands. """ def __init__(self, can_interface, logger: Logger): @@ -48,25 +48,25 @@ self.can_interface.register_receiving_publication_function(channel_id, msg_id, self._handler_boost_pump_sync) self.ro_pump_timestamp = 0.0 - self.ro_pump_state = 0 - self.ro_pump_duty_cycle = 0.0 - self.ro_pump_fb_duty_cycle = 0.0 - self.ro_pump_speed = 0.0 - self.boost_pump_state = 0 - self.boost_pump_duty_cycle = 0.0 - self.boost_pump_fb_duty_cycle = 0.0 - self.boost_pump_speed = 0.0 + self.p12_ro_pump_state = 0 + self.p12_ro_pump_duty_cycle = 0.0 + self.p12_ro_pump_fb_duty_cycle = 0.0 + self.p12_ro_pump_speed = 0.0 + self.p40_boost_pump_state = 0 + self.p40_boost_pump_duty_cycle = 0.0 + self.p40_boost_pump_fb_duty_cycle = 0.0 + self.p40_boost_pump_speed = 0.0 - @publish(["ro_pump_timestamp", "ro_pump_state", "ro_pump_duty_cycle", "ro_pump_fb_duty_cycle", - "ro_pump_speed", "boost_pump_state", "boost_pump_duty_cycle", - "boost_pump_fb_duty_cycle", "boost_pump_speed"]) + @publish(["ro_pump_timestamp", "p12_ro_pump_state", "p12_ro_pump_duty_cycle", "p12_ro_pump_fb_duty_cycle", + "p12_ro_pump_speed", "p40_boost_pump_state", "p40_boost_pump_duty_cycle", + "p40_boost_pump_fb_duty_cycle", "p40_boost_pump_speed"]) def _handler_boost_pump_sync(self, message, timestamp=0.0): """ - Handles published blood flow data messages. Blood flow data are captured + Handles published RO pump data messages. RO pump data is captured for reference. - @param message: published blood flow data message + @param message: published RO pump data message @return: none """ @@ -88,14 +88,14 @@ message['message'][MsgFieldPositions.START_POS_FIELD_8:MsgFieldPositions.END_POS_FIELD_8])) self.ro_pump_timestamp = timestamp - self.ro_pump_state = rps[0] - self.ro_pump_duty_cycle = rpdc[0] - self.ro_pump_fb_duty_cycle = rpfbdc[0] - self.ro_pump_speed = rprpm[0] - self.boost_pump_state = bps[0] - self.boost_pump_duty_cycle = bpdc[0] - self.boost_pump_fb_duty_cycle = bpfbdc[0] - self.boost_pump_speed = bprpm[0] + self.p12_ro_pump_state = rps[0] + self.p12_ro_pump_duty_cycle = rpdc[0] + self.p12_ro_pump_fb_duty_cycle = rpfbdc[0] + self.p12_ro_pump_speed = rprpm[0] + self.p40_boost_pump_state = bps[0] + self.p40_boost_pump_duty_cycle = bpdc[0] + self.p40_boost_pump_fb_duty_cycle = bpfbdc[0] + self.p40_boost_pump_speed = bprpm[0] @@ -124,7 +124,6 @@ # If there is content... if received_message is not None: - # self.logger.debug(received_message) if reset == RESET: str_res = "reset back to normal" else: @@ -157,15 +156,15 @@ message_id=MsgIds.MSG_ID_RO_BOOST_PUMP_SET_PWM_REQUEST.value, payload=payload) - self.logger.debug("override measured blood pump speed") + self.logger.debug("setting pump {} to pwm count {}".format(pump,pwm)) # Send message received_message = self.can_interface.send(message) # If there is content... if received_message is not None: - self.logger.debug("pwm overridden to " + str(pwm)) + self.logger.debug("pwm set to " + str(pwm)) # response payload is OK or not OK return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] else: @@ -174,7 +173,7 @@ def cmd_boost_pump_read_pwm_override(self, pump: int, pwm: float, reset: int = NO_RESET) -> int: """ - Constructs and sends the read pwm override \n + Constructs and sends the read pwm override for the RO pumps \n command. Constraints: Must be logged into RO. @@ -193,14 +192,13 @@ message_id=MsgIds.MSG_ID_RO_BOOST_PUMP_READ_PWM_OVERRIDE_REQUEST.value, payload=payload) - self.logger.debug("override measured blood pump rotor speed") + self.logger.debug("override read pwm for pump".format(pump)) # Send message received_message = self.can_interface.send(message) # If there is content... if received_message is not None: - # self.logger.debug(received_message) if reset == RESET: str_res = "reset back to normal" else: @@ -215,7 +213,7 @@ def cmd_boost_pump_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: """ - Constructs and sends the measured blood flow broadcast interval override command + Constructs and sends the RO pump broadcast interval override command Constraints: Must be logged into RO. Given interval must be non-zero and a multiple of the RO general task interval (50 ms). @@ -236,7 +234,7 @@ message_id=MsgIds.MSG_ID_RO_BOOST_PUMPS_PUBLISH_INTERVAL_OVERRIDE_REQUEST.value, payload=payload) - self.logger.debug("override boost pump broadcast interval") + self.logger.debug("override RO pump broadcast interval") # Send message received_message = self.can_interface.send(message) Index: leahi_dialin/ro/modules/conductivity_sensors.py =================================================================== diff -u -r4afd0ae756011a97b6eda06e03117dde2b940bed -r7ae7087e830140ab07b841b2c0ff437269a5fc2f --- leahi_dialin/ro/modules/conductivity_sensors.py (.../conductivity_sensors.py) (revision 4afd0ae756011a97b6eda06e03117dde2b940bed) +++ leahi_dialin/ro/modules/conductivity_sensors.py (.../conductivity_sensors.py) (revision 7ae7087e830140ab07b841b2c0ff437269a5fc2f) @@ -27,14 +27,12 @@ @unique class ROConductivitySensorsEnum(DialinEnum): - CPI = 0 # CPi (P9) conductivity sensor value - CPO = 1 # CPo (P18) conductivity sensor value + P9_CPI = 0 # CPi (P9) conductivity sensor value + P18_CPO = 1 # CPo (P18) conductivity sensor value class ROConductivitySensors(AbstractSubSystem): """ - ConductivitySensors - - Reverse Osmosis (RO) Dialin API sub-class for conductivity sensors related commands. + Dialin API sub-class for conductivity sensors related commands. """ def __init__(self, can_interface, logger: Logger): @@ -53,33 +51,26 @@ self.can_interface.register_receiving_publication_function(channel_id, msg_id, self._handler_conductivity_sensors_sync) - self.cpi_conductivity = 0.0 - self.cpo_conductivity = 0.0 - self.cpi_temp = 0.0 - self.cpo_temp = 0.0 + self.p9_cpi_conductivity = 0.0 + self.p18_cpo_conductivity = 0.0 self.ro_conductivity_timestamp = 0.0 @publish(["ro_conductivity_timestamp", - "cpi_conductivity", "cpo_conductivity", - "cpi_temp", "cpo_temp",]) + "p9_cpi_conductivity", "p18_cpo_conductivity"]) def _handler_conductivity_sensors_sync(self, message, timestamp=0.0): """ - Handles published conductivity sensor data messages. Conductivity sensor data are captured + Handles published RO conductivity sensor data messages. Conductivity sensor data are captured for reference. @param message: published conductivity sensor data message @return: None """ - self.cpi_conductivity = struct.unpack('f', bytearray( + self.p9_cpi_conductivity = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_1:MsgFieldPositions.END_POS_FIELD_1]))[0] - self.cpo_conductivity = struct.unpack('f', bytearray( + self.p18_cpo_conductivity = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_2:MsgFieldPositions.END_POS_FIELD_2]))[0] - self.cpi_temp = struct.unpack('f', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_3:MsgFieldPositions.END_POS_FIELD_3]))[0] - self.cpo_temp = struct.unpack('f', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_4:MsgFieldPositions.END_POS_FIELD_4]))[0] self.ro_conductivity_timestamp = timestamp @@ -88,7 +79,7 @@ Constructs and sends the conductivity sensor data broadcast interval override command Constraints: Must be logged into RO. - Given interval must be non-zero and a multiple of the DG general task interval (50 ms). + Given interval must be non-zero and a multiple of the RO general task interval (50 ms). @param ms: integer - interval (in ms) to override with @param reset: integer - 1 to reset a previous override, 0 to override @@ -117,7 +108,7 @@ str_res = "reset back to normal: " else: str_res = str(ms) + " ms: " - self.logger.debug("Conductivity sensor data broadcast interval overridden to " + str_res + + self.logger.debug("RO Conductivity sensor data broadcast interval overridden to " + str_res + str(received_message['message'][DenaliMessage.PAYLOAD_START_INDEX])) # response payload is OK or not OK return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] @@ -127,7 +118,9 @@ def cmd_conductivity_sensor_readings_override(self, sensor: int, conductivity: float, reset: int = NO_RESET) -> int: """ - Constructs and sends the conductivity value override command + Constructs and sends the RO conductivity value override command. + Constraints: + Must be logged into RO. @param sensor: unsigned int - sensor ID @param conductivity: float - conductivity value to override sensor with @@ -149,7 +142,7 @@ str_res = "reset back to normal" else: str_res = str(conductivity) + " microsiemens/cm" - self.logger.debug("override conductivity sensor value for sensor " + str(sensor) + ": " + str_res) + self.logger.debug("override RO conductivity sensor value for sensor " + str(sensor) + ": " + str_res) # Send message received_message = self.can_interface.send(message) @@ -162,49 +155,12 @@ self.logger.error("Timeout!!!!") return False - def cmd_conductivity_sensor_temperature_override(self, sensor: int, temperature: float, reset: int = NO_RESET) -> int: - """ - Constructs and sends the conductivity value override command - - @param sensor: unsigned int - sensor ID - @param temperature: float - conductivity value to override sensor with - @param reset: integer - 1 to reset a previous override, 0 to override - @return: 1 if successful, zero otherwise - - """ - - reset_byte_array = integer_to_bytearray(reset) - temp_byte_array = float_to_bytearray(temperature) - sensor_byte_array = integer_to_bytearray(sensor) - payload = reset_byte_array + temp_byte_array + sensor_byte_array - - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_ro_ch_id, - message_id=MsgIds.MSG_ID_RO_CONDUCTIVITY_TEMP_OVERRIDE_REQUEST.value, - payload=payload) - - if reset == RESET: - str_res = "reset back to normal" - else: - str_res = str(temperature) - self.logger.debug("override conductivity sensor value for sensor " + str(sensor) + ": " + str_res) - - # Send message - received_message = self.can_interface.send(message) - - # If there is content... - if received_message is not None: - # response payload is OK or not OK - return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] - else: - self.logger.error("Timeout!!!!") - return False - def cmd_conductivity_sensor_read_counter_override(self, sensor: int, counter: int, reset: int = NO_RESET) -> int: """ - Constructs and sends the conductivity value override command + Constructs and sends the RO conductivity sensor read override command @param sensor: unsigned int - sensor ID - @param counter: float - conductivity value to override sensor with + @param counter: counter - count value to override sensor with @param reset: integer - 1 to reset a previous override, 0 to override @return: 1 if successful, zero otherwise @@ -223,7 +179,7 @@ str_res = "reset back to normal" else: str_res = str(counter) - self.logger.debug("override conductivity sensor value for sensor " + str(sensor) + ": " + str_res) + self.logger.debug("override RO conductivity sensor value for sensor " + str(sensor) + ": " + str_res) # Send message received_message = self.can_interface.send(message) @@ -238,10 +194,10 @@ def cmd_conductivity_sensor_error_counter_override(self, sensor: int, counter: int, reset: int = NO_RESET) -> int: """ - Constructs and sends the conductivity value override command + Constructs and sends the RO conductivity error counter override command @param sensor: unsigned int - sensor ID - @param counter: float - conductivity value to override sensor with + @param counter: counter - count value to override error counter @param reset: integer - 1 to reset a previous override, 0 to override @return: 1 if successful, zero otherwise @@ -260,7 +216,7 @@ str_res = "reset back to normal" else: str_res = str(counter) - self.logger.debug("override conductivity sensor value for sensor " + str(sensor) + ": " + str_res) + self.logger.debug("override RO conductivity sensor value for sensor " + str(sensor) + ": " + str_res) # Send message received_message = self.can_interface.send(message) Index: leahi_dialin/ro/modules/flow_sensors.py =================================================================== diff -u -re4d1e640a8d9dfc49522a4f49fe7fee9ec9125da -r7ae7087e830140ab07b841b2c0ff437269a5fc2f --- leahi_dialin/ro/modules/flow_sensors.py (.../flow_sensors.py) (revision e4d1e640a8d9dfc49522a4f49fe7fee9ec9125da) +++ leahi_dialin/ro/modules/flow_sensors.py (.../flow_sensors.py) (revision 7ae7087e830140ab07b841b2c0ff437269a5fc2f) @@ -27,14 +27,14 @@ @unique class ROFlowSensorNames(DialinEnum): - FLOW_SENSOR_WATER_INLET = 0 # Water inlet flow sensor (FMS P7) - FLOW_SENSOR_RO_OUTLET = 1 # RO outlet flow sensor (FMP P16) + P7_FLOW_SENSOR_WATER_INLET = 0 # Water inlet flow sensor (FMS P7) + P16_FLOW_SENSOR_RO_OUTLET = 1 # RO outlet flow sensor (FMP P16) class ROFlowSensors(AbstractSubSystem): """ - Reverse Osmosis (RO) Dialin API sub-class for flow sensor related commands. + Dialin API sub-class for flow sensor related commands. """ def __init__(self, can_interface, logger: Logger): @@ -54,37 +54,37 @@ self.can_interface.register_receiving_publication_function(channel_id, msg_id, self._handler_flow_sensor_sync) - self.flowFMS = 0.0 - self.flowFMP = 0.0 - self.tempFMS = 0.0 - self.tempFMP = 0.0 + self.p7_flowFMS = 0.0 + self.p16_flowFMP = 0.0 + self.p7_tempFMS = 0.0 + self.p16_tempFMP = 0.0 self.ro_flow_timestamp = 0 @publish(["ro_levels_timestamp", - "flowFMS", "flowFMP", - "tempFMS", "tempFMP"]) + "p7_flowFMS", "p16_flowFMP", + "p7_tempFMS", "p16_tempFMP"]) def _handler_flow_sensor_sync(self, message, timestamp=0.0): """ Handles published flow sensor message - @param message: published levels data message + @param message: published flow sensor data message @returns none """ - self.flowFMS = struct.unpack('f', bytearray( + self.p7_flowFMS = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_1:MsgFieldPositions.END_POS_FIELD_1]))[0] - self.flowFMP = struct.unpack('f', bytearray( + self.p16_flowFMP = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_2:MsgFieldPositions.END_POS_FIELD_2]))[0] - self.tempFMS = struct.unpack('f', bytearray( + self.p7_tempFMS = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_3:MsgFieldPositions.END_POS_FIELD_3]))[0] - self.tempFMP = struct.unpack('f', bytearray( + self.p16_tempFMP = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_4:MsgFieldPositions.END_POS_FIELD_4]))[0] - self.ro_levels_timestamp = timestamp + self.ro_flow_timestamp = timestamp def cmd_flow_sensor_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: """ - Constructs and sends broadcast time interval. + Constructs and sends RO flow sensor broadcast time interval override. Constraints: Must be logged into RO. Given interval must be non-zero and a multiple of the RO general task interval (50 ms). @@ -104,7 +104,7 @@ message_id=MsgIds.MSG_ID_RO_FLOWS_PUBLISH_INTERVAL_OVERRIDE_REQUEST.value, payload=payload) - self.logger.debug("Sending {} ms publish interval to the flow sensor module".format(ms)) + self.logger.debug("Sending {} ms publish interval to the RO flow sensor module".format(ms)) # Send message received_message = self.can_interface.send(message) @@ -118,13 +118,12 @@ def cmd_flow_rate_override(self, flow_sensor: int, rate: int, reset: int = NO_RESET) -> int: """ - Constructs and sends flow rate override command - Must be logged into RO + Constructs and sends flow rate override command. + Must be logged into RO. - - @param flow_sensor the sensor to override its value - @param rate the rate value to override - @param reset: (int) 1 to reset a previous override, 0 to override + @param flow_sensor: integer - the sensor to override its value. + @param rate: integer - the rate value to override. + @param reset: integer - 1 to reset a previous override, 0 to override @returns 1 if successful, zero otherwise """ reset_value = integer_to_bytearray(reset) @@ -146,15 +145,14 @@ self.logger.debug("Timeout!!!!") return False - def cmd_flow_temp_override(self, flow_sensor: int, temp: int, reset: int = NO_RESET) -> int: + def cmd_flow_temp_override(self, flow_sensor: int, temp: float, reset: int = NO_RESET) -> int: """ - Constructs and sends flow temp override command - Must be logged into RO + Constructs and sends flow temp override command. + Must be logged into RO. - - @param flow_sensor the sensor to override its value - @param temp the rate value to override - @param reset: (int) 1 to reset a previous override, 0 to override + @param flow_sensor: integer - the sensor to override its value + @param temp: float - the temperature value to override + @param reset: integer - 1 to reset a previous override, 0 to override @returns 1 if successful, zero otherwise """ reset_value = integer_to_bytearray(reset) Index: leahi_dialin/ro/modules/levels.py =================================================================== diff -u -r3c967e5acc6286c6334d2708600e3317988f87f1 -r7ae7087e830140ab07b841b2c0ff437269a5fc2f --- leahi_dialin/ro/modules/levels.py (.../levels.py) (revision 3c967e5acc6286c6334d2708600e3317988f87f1) +++ leahi_dialin/ro/modules/levels.py (.../levels.py) (revision 7ae7087e830140ab07b841b2c0ff437269a5fc2f) @@ -28,7 +28,7 @@ class ROLevels(AbstractSubSystem): """ - Reverse Osmosis (RO) Dialin API sub-class for levels related commands. + Dialin API sub-class for levels related commands. """ def __init__(self, can_interface, logger: Logger): @@ -42,7 +42,7 @@ self.can_interface = can_interface self.logger = logger - self.floater = 0 + self.p25_level = 0 self.ro_levels_timestamp = 0 if self.can_interface is not None: @@ -51,22 +51,22 @@ self.can_interface.register_receiving_publication_function(channel_id, msg_id, self._handler_levels_sync) @publish(["ro_levels_timestamp", - "floater",]) + "p25_level",]) def _handler_levels_sync(self, message, timestamp=0.0): """ Handles published levels message @param message: published levels data message @returns none """ - self.floater = struct.unpack('i', bytearray( + self.p25_level = struct.unpack('i', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_1:MsgFieldPositions.END_POS_FIELD_1]))[0] self.ro_levels_timestamp = timestamp def cmd_levels_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: """ - Constructs and sends broadcast time interval. + Constructs and sends RO level broadcast time interval override. Constraints: Must be logged into RO. Given interval must be non-zero and a multiple of the RO general task interval (50 ms). @@ -86,7 +86,7 @@ message_id=MsgIds.MSG_ID_RO_LEVELS_PUBLISH_INTERVAL_OVERRIDE_REQUEST.value, payload=payload) - self.logger.debug("Sending {} ms publish interval to the Levels module".format(ms)) + self.logger.debug("Sending {} ms publish interval to the RO Levels module".format(ms)) # Send message received_message = self.can_interface.send(message) @@ -100,12 +100,11 @@ def cmd_level_status_override(self, level_sensor: int, status: int, reset: int = NO_RESET) -> int: """ - Constructs and sends level status override command - Must be logged into RO + Constructs and sends level status override command. + Must be logged into RO. - - @param level_sensor the level sensor to override its value - @param status the status value to override + @param level_sensor: integer - the level sensor to override its value + @param status: integer - the status value to override @param reset: (int) 1 to reset a previous override, 0 to override @returns 1 if successful, zero otherwise """ Index: leahi_dialin/ro/modules/pressure_sensors.py =================================================================== diff -u -r3c967e5acc6286c6334d2708600e3317988f87f1 -r7ae7087e830140ab07b841b2c0ff437269a5fc2f --- leahi_dialin/ro/modules/pressure_sensors.py (.../pressure_sensors.py) (revision 3c967e5acc6286c6334d2708600e3317988f87f1) +++ leahi_dialin/ro/modules/pressure_sensors.py (.../pressure_sensors.py) (revision 7ae7087e830140ab07b841b2c0ff437269a5fc2f) @@ -27,22 +27,22 @@ @unique class ROPressureSensorNames(DialinEnum): - PRESSURE_SENSOR_WATER_INLET_PRE_REG = 0 - PRESSURE_SENSOR_WATER_INLET_POST_REG = 1 - PRESSURE_SENSOR_WATER_INLET_PRE_COND = 2 - PRESSURE_SENSOR_PRE_RO_FILTER = 3 - PRESSURE_SENSOR_POST_RO_FILTER = 4 - PRESSURE_SENSOR_PRE_RO_PUMP = 5 + M1_PRESSURE_SENSOR_WATER_INLET_PRE_REG = 0 + M3_PRESSURE_SENSOR_WATER_INLET_POST_REG = 1 + P8_PRESSURE_SENSOR_WATER_INLET_PRE_COND = 2 + P13_PRESSURE_SENSOR_PRE_RO_FILTER = 3 + P17_PRESSURE_SENSOR_POST_RO_FILTER = 4 + X1_PRESSURE_SENSOR_PRE_RO_PUMP = 5 class ROPressureSensors(AbstractSubSystem): """ - Reverse Osmosis (RO) Dialin API sub-class for pressure related commands. + Dialin API sub-class for RO pressure sensor related commands. """ def __init__(self, can_interface, logger: Logger): """ - ROPressureOcclusion constructor + ROPressureSensors constructor """ super().__init__() @@ -56,27 +56,41 @@ self._handler_pressure_sync) self.ro_pressure_timestamp = 0.0 - self.pressure_sensor_water_inlet_pre_reg = 0.0 - self.pressure_sensor_water_inlet_post_reg = 0.0 - self.pressure_sensor_water_inlet_pre_cond = 0.0 - self.pressure_sensor_pre_ro_filter = 0.0 - self.pressure_sensor_post_ro_filter = 0.0 + self.m1_water_inlet_pre_reg_pressure = 0.0 + self.m3_water_inlet_post_reg_pressure = 0.0 + self.p8_water_inlet_pre_cond_pressure = 0.0 + self.p13_pre_ro_filter_pressure = 0.0 + self.p17_post_ro_filter_pressure = 0.0 + self.x1_pre_ro_pump_pressure = 0.0 + self.m1_water_inlet_pre_reg_temp = 0.0 + self.m3_water_inlet_post_reg_temp = 0.0 + self.p8_water_inlet_pre_cond_temp = 0.0 + self.p13_pre_ro_filter_temp = 0.0 + self.p17_post_ro_filter_temp = 0.0 + self.x1_pre_ro_pump_temp = 0.0 @publish([ "ro_pressure_timestamp", - "pressure_sensor_water_inlet_pre_reg", - "pressure_sensor_water_inlet_post_reg", - "pressure_sensor_water_inlet_pre_cond", - "pressure_sensor_pre_ro_filter", - "pressure_sensor_post_ro_filter", + "m1_water_inlet_pre_reg_pressure", + "m3_water_inlet_post_reg_pressure", + "p8_water_inlet_pre_cond_pressure", + "p13_pre_ro_filter_pressure", + "p17_post_ro_filter_pressure", + "x1_pre_ro_pump_pressure", + "m1_water_inlet_pre_reg_temp", + "m3_water_inlet_post_reg_temp", + "p8_water_inlet_pre_cond_temp", + "p13_pre_ro_filter_temp", + "p17_post_ro_filter_temp", + "x1_pre_ro_pump_temp" ]) def _handler_pressure_sync(self, message, timestamp=0.0): """ - Handles published pressure & occlusion data messages. Pressure data are captured + Handles published RO pressure sensor data messages. Pressure data are captured for reference. - @param message: published pressure & occlusion data message + @param message: published RO pressure sensor data message @return: none """ @@ -90,22 +104,46 @@ message['message'][MsgFieldPositions.START_POS_FIELD_4:MsgFieldPositions.END_POS_FIELD_4])) post_ro = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_5:MsgFieldPositions.END_POS_FIELD_5])) + pre_pump = struct.unpack('f', bytearray( + message['message'][MsgFieldPositions.START_POS_FIELD_6:MsgFieldPositions.END_POS_FIELD_6])) - self.pressure_sensor_water_inlet_pre_reg = pre_reg_wi[0] - self.pressure_sensor_water_inlet_post_reg = post_reg_wi[0] - self.pressure_sensor_water_inlet_pre_cond = pre_cond_wi[0] - self.pressure_sensor_pre_ro_filter = pre_ro[0] - self.pressure_sensor_post_ro_filter = post_ro[0] + pre_reg_wi_temp = struct.unpack('f', bytearray( + message['message'][MsgFieldPositions.START_POS_FIELD_7:MsgFieldPositions.END_POS_FIELD_7])) + post_reg_wi_temp = struct.unpack('f', bytearray( + message['message'][MsgFieldPositions.START_POS_FIELD_8:MsgFieldPositions.END_POS_FIELD_8])) + pre_cond_wi_temp = struct.unpack('f', bytearray( + message['message'][MsgFieldPositions.START_POS_FIELD_9:MsgFieldPositions.END_POS_FIELD_9])) + pre_ro_temp = struct.unpack('f', bytearray( + message['message'][MsgFieldPositions.START_POS_FIELD_10:MsgFieldPositions.END_POS_FIELD_10])) + post_ro_temp = struct.unpack('f', bytearray( + message['message'][MsgFieldPositions.START_POS_FIELD_11:MsgFieldPositions.END_POS_FIELD_11])) + pre_pump_temp = struct.unpack('f', bytearray( + message['message'][MsgFieldPositions.START_POS_FIELD_12:MsgFieldPositions.END_POS_FIELD_12])) + + self.m1_water_inlet_pre_reg_pressure = pre_reg_wi[0] + self.m3_water_inlet_post_reg_pressure = post_reg_wi[0] + self.p8_water_inlet_pre_cond_pressure = pre_cond_wi[0] + self.p13_pre_ro_filter_pressure = pre_ro[0] + self.p17_post_ro_filter_pressure = post_ro[0] + self.x1_pre_ro_pump_pressure = pre_pump[0] + + self.m1_water_inlet_pre_reg_pressure = pre_reg_wi_temp[0] + self.m3_water_inlet_post_reg_pressure = post_reg_wi_temp[0] + self.p8_water_inlet_pre_cond_pressure = pre_cond_wi_temp[0] + self.p13_pre_ro_filter_pressure = pre_ro_temp[0] + self.p17_post_ro_filter_pressure = post_ro_temp[0] + self.x1_pre_ro_pump_temp = pre_pump_temp[0] + self.ro_pressure_timestamp = timestamp - def cmd_pressure_sensor_override(self, pressure: float, sensor: int, reset: int = NO_RESET) -> int: + def cmd_pressure_sensor_override(self, sensor: int, pressure: float, reset: int = NO_RESET) -> int: """ - Constructs and sends the measured arterial pressure override command + Constructs and sends the measured pressure sensor override command. Constraints: Must be logged into RO. - @param pressure: float - measured arterial pressure (in mmHg) to override with - @param sensor: bool - switch between filtered override and raw override + @param sensor: int - switch between filtered override and raw override + @param pressure: float - measured pressure (in PSI) to override with @param reset: integer - 1 to reset a previous override, 0 to override @return: 1 if successful, zero otherwise """ @@ -119,7 +157,7 @@ message_id=MsgIds.MSG_ID_RO_PRESSURE_OVERRIDE_REQUEST.value, payload=payload) - self.logger.debug("override pressure sensor") + self.logger.debug("override RO pressure sensor") # Send message received_message = self.can_interface.send(message) @@ -129,8 +167,8 @@ if reset == RESET: str_res = "reset back to normal. " else: - str_res = str(pressure) + " mmHg. " - self.logger.debug("pressure (measured)) overridden to " + str_res + + str_res = str(pressure) + " PSI. " + self.logger.debug("RO pressure (measured)) overridden to " + str_res + str(received_message['message'][DenaliMessage.PAYLOAD_START_INDEX])) # response payload is OK or not OK return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] @@ -140,7 +178,7 @@ def cmd_pressure_sensors_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: """ - Constructs and sends the measured pressure sensors broadcast interval override command + Constructs and sends the measured RO pressure sensors broadcast interval override command. Constraints: Must be logged into RO. Given interval must be non-zero and a multiple of the RO general task interval (50 ms). @@ -161,7 +199,7 @@ message_id=MsgIds.MSG_ID_RO_PRESSURE_PUBLISH_INTERVAL_OVERRIDE_REQUEST.value, payload=payload) - self.logger.debug("override blood flow broadcast interval") + self.logger.debug("override RO pressure broadcast interval") # Send message received_message = self.can_interface.send(message) @@ -173,7 +211,7 @@ str_res = "reset back to normal: " else: str_res = str(ms) + " ms: " - self.logger.debug("Blood flow broadcast interval overridden to " + str_res + + self.logger.debug("RO pressure broadcast interval overridden to " + str_res + str(received_message['message'][DenaliMessage.PAYLOAD_START_INDEX])) # response payload is OK or not OK return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] Index: leahi_dialin/ro/modules/valves.py =================================================================== diff -u -r2d30541da683c31d280ec600dbce1225b1676223 -r7ae7087e830140ab07b841b2c0ff437269a5fc2f --- leahi_dialin/ro/modules/valves.py (.../valves.py) (revision 2d30541da683c31d280ec600dbce1225b1676223) +++ leahi_dialin/ro/modules/valves.py (.../valves.py) (revision 7ae7087e830140ab07b841b2c0ff437269a5fc2f) @@ -39,20 +39,19 @@ @unique class ROValveNames(DialinEnum): - VWI = 0 # Valve (M4 VWi) - VROD = 1 # Valve (P39 VROd) - VFF = 2 # Valve (P6 VFF) - VPI = 3 # Valve (P11 VPi) - VCR = 4 # Valve (P33 VCr) - VCB = 5 # Valve (P34 VCb) - VCD = 6 # Valve (P37 VCd) - VFB = 7 # Valve (M7 VFB) - SPP = 8 # Valve (P20 SPP) + M4_VWI = 0 # Valve (M4 VWi) + P39_VROD = 1 # Valve (P39 VROd) + P6_VFF = 2 # Valve (P6 VFF) + P11_VPI = 3 # Valve (P11 VPi) + P33_VCR = 4 # Valve (P33 VCr) + P34_VCB = 5 # Valve (P34 VCb) + P37_VCD = 6 # Valve (P37 VCd) + M7_VFB = 7 # Valve (M7 VFB) + P20_SPP = 8 # Valve (P20 SPP) class ROValves(AbstractSubSystem): """ - Reverse Osmosis (RO) interface for valve related commands. - + Dialin API sub-class for RO valve related commands. """ # Valves states publish message field positions @@ -77,15 +76,15 @@ self.can_interface.register_receiving_publication_function(channel_id, msg_id, self._handler_valves_sync) self.valve_states_all = 0x0000 - self.valve_state_VWI = {"id": ROValveNames.VWI.value, "state": DEENERGIZED} - self.valve_state_VFB = {"id": ROValveNames.VFB.value, "state": DEENERGIZED} - self.valve_state_VFF = {"id": ROValveNames.VFF.value, "state": DEENERGIZED} - self.valve_state_VPI = {"id": ROValveNames.VPI.value, "state": DEENERGIZED} - self.valve_state_VCR = {"id": ROValveNames.VCR.value, "state": DEENERGIZED} - self.valve_state_VCB = {"id": ROValveNames.VCB.value, "state": DEENERGIZED} - self.valve_state_VCD = {"id": ROValveNames.VCD.value, "state": DEENERGIZED} - self.valve_state_VROD = {"id": ROValveNames.VROD.value, "state": DEENERGIZED} - self.valve_state_SPP = {"id": ROValveNames.SPP.value, "state": DEENERGIZED} + self.m4_vwi_state= {"id": ROValveNames.M4_VWI.value, "state": DEENERGIZED} + self.p39_vrod_state = {"id": ROValveNames.P39_VROD.value, "state": DEENERGIZED} + self.p6_vff_state = {"id": ROValveNames.P6_VFF.value, "state": DEENERGIZED} + self.p11_vpi_state = {"id": ROValveNames.P11_VPI.value, "state": DEENERGIZED} + self.p33_vcr_state = {"id": ROValveNames.P33_VCR.value, "state": DEENERGIZED} + self.p34_vcb_state = {"id": ROValveNames.P34_VCB.value, "state": DEENERGIZED} + self.p37_vcd_state = {"id": ROValveNames.P37_VCD.value, "state": DEENERGIZED} + self.m7_vfb_state = {"id": ROValveNames.M7_VFB.value, "state": DEENERGIZED} + self.p20_spp_state = {"id": ROValveNames.P20_SPP.value, "state": DEENERGIZED} # NOTE: The len function counts the enums with the same number only once. This is not the case in the DG valves # class because each valve must have a unique ID. @@ -101,15 +100,15 @@ @return: All valve states """ return [ - self.valve_state_VWI.get("state"), - self.valve_state_VROD.get("state"), - self.valve_state_VFF.get("state"), - self.valve_state_VPI.get("state"), - self.valve_state_VCR.get("state"), - self.valve_state_VCB.get("state"), - self.valve_state_VCD.get("state"), - self.valve_state_VFB.get("state"), - self.valve_state_SPP.get("state") + self.m4_vwi_state.get("state"), + self.p39_vrod_state.get("state"), + self.p6_vff_state.get("state"), + self.p11_vpi_state.get("state"), + self.p33_vcr_state.get("state"), + self.p34_vcb_state.get("state"), + self.p37_vcd_state.get("state"), + self.m7_vfb_state.get("state"), + self.p20_spp_state.get("state") ] @staticmethod @@ -145,37 +144,37 @@ @publish([ "ro_valves_states_timestamp", "valve_states_all", - "valve_state_VWI", - "valve_state_VFB", - "valve_state_VFF", - "valve_state_VPI", - "valve_state_VCR", - "valve_state_VCB", - "valve_state_VCD", - "valve_state_VROD", - "valve_state_SPP", + "m4_vwi_state", + "p39_vrod_state", + "p6_vff_state", + "p11_vpi_state", + "p33_vcr_state", + "p34_vcb_state", + "p37_vcd_state", + "m7_vfb_state", + "p20_spp_state", "valve_states_enum" ]) def _handler_valves_sync(self, message, timestamp=0.0): """ - Handles published valves states message. + Handles published RO valves states message. - @param message: published valves states message + @param message: published RO valves states message @return: none """ vst = struct.unpack('H', bytearray(message['message'][self.START_POS_VALVES_STATES:self.END_POS_VALVES_STATES])) self.valve_states_all = vst[0] # Extract each valve state from U16 valves states using bit-masking - self.valve_state_VWI["state"] = self._binary_to_valve_state(vst[0] & 1) - self.valve_state_VROD["state"] = self._binary_to_valve_state(vst[0] & 2) - self.valve_state_VFF["state"] = self._binary_to_valve_state(vst[0] & 4) - self.valve_state_VPI["state"] = self._binary_to_valve_state(vst[0] & 8) - self.valve_state_VCR["state"] = self._binary_to_valve_state(vst[0] & 16) - self.valve_state_VCB["state"] = self._binary_to_valve_state(vst[0] & 32) - self.valve_state_VCD["state"] = self._binary_to_valve_state(vst[0] & 64) - self.valve_state_VFB["state"] = self._binary_to_valve_state(vst[0] & 128) - self.valve_state_SPP["state"] = self._binary_to_valve_state(vst[0] & 256) + self.m4_vwi_state["state"] = self._binary_to_valve_state(vst[0] & 1) + self.p39_vrod_state["state"] = self._binary_to_valve_state(vst[0] & 2) + self.p6_vff_state["state"] = self._binary_to_valve_state(vst[0] & 4) + self.p11_vpi_state["state"] = self._binary_to_valve_state(vst[0] & 8) + self.p33_vcr_state["state"] = self._binary_to_valve_state(vst[0] & 16) + self.p34_vcb_state["state"] = self._binary_to_valve_state(vst[0] & 32) + self.p37_vcd_state["state"] = self._binary_to_valve_state(vst[0] & 64) + self.m7_vfb_state["state"] = self._binary_to_valve_state(vst[0] & 128) + self.p20_spp_state["state"] = self._binary_to_valve_state(vst[0] & 256) start = self.END_POS_VALVES_STATES end = start + 1 @@ -191,7 +190,7 @@ """ Constructs and sends the valve sensed state override command. Constraints: - Must be logged into DG. + Must be logged into RO. Given valve ID must be one of the valve IDs listed below. @param valve: unsigned int - valve ID @@ -224,7 +223,7 @@ def cmd_valve_override(self, valve: int, state: int, reset: int = NO_RESET) -> int: """ - Constructs and sends the valve state override command. + Constructs and sends the RO valve state override command. Constraints: Must be logged into RO. Given valve ID must be one of the valve IDs listed below. @@ -261,8 +260,8 @@ """ Constructs and sends the valve state override command. Constraints: - Must be logged into DG. - Given interval must be non-zero and a multiple of the DG general task interval (50 ms). + Must be logged into RO. + Given interval must be non-zero and a multiple of the RO general task interval (50 ms). @param ms: unsigned int - broadcast interval (in ms) @param reset: integer - 1 to reset a previous override, 0 to override @@ -281,7 +280,7 @@ message_id=MsgIds.MSG_ID_RO_VALVE_PUBLISH_INTERVAL_OVERRIDE_REQUEST.value, payload=payload) - self.logger.debug("override valves states publish interval") + self.logger.debug("override RO valves states publish interval") # Send message received_message = self.can_interface.send(message) Index: leahi_dialin/ro/reverse_osmosis.py =================================================================== diff -u -r6889609993a4d32080c0ad182701c3b512cc54ba -r7ae7087e830140ab07b841b2c0ff437269a5fc2f --- leahi_dialin/ro/reverse_osmosis.py (.../reverse_osmosis.py) (revision 6889609993a4d32080c0ad182701c3b512cc54ba) +++ leahi_dialin/ro/reverse_osmosis.py (.../reverse_osmosis.py) (revision 7ae7087e830140ab07b841b2c0ff437269a5fc2f) @@ -5,7 +5,7 @@ # 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 treatment_delivery.py +# @file reverse_osmosis.py # # @author (last) Dara Navaei # @date (last) 26-Feb-2024 @@ -33,7 +33,7 @@ class RO(AbstractSubSystem): """ - Treatment Delivery (RO) Dialin object API. + Reverse Osmosis ( RO aka IOFP ) Dialin object API. It provides the basic interface to communicate with the RO firmware. """ # RO debug event max count @@ -104,7 +104,7 @@ # Create command groups self.conductivity = ROConductivitySensors(self.can_interface, self.logger) - self.flow = ROFlowSensors(self.can_interface, self.logger) + self.flows = ROFlowSensors(self.can_interface, self.logger) self.pumps = ROPumps(self.can_interface, self.logger) self.levels = ROLevels(self.can_interface, self.logger) self.pressures = ROPressureSensors(self.can_interface, self.logger)