Index: leahi_dialin/common/dd_defs.py =================================================================== diff -u -r6bde90d6f1ccc7c97119ec97687c57f9a8954ccd -ra291930ba38e329e2b373f6d2b2a7564a6b7a09a --- leahi_dialin/common/dd_defs.py (.../dd_defs.py) (revision 6bde90d6f1ccc7c97119ec97687c57f9a8954ccd) +++ leahi_dialin/common/dd_defs.py (.../dd_defs.py) (revision a291930ba38e329e2b373f6d2b2a7564a6b7a09a) @@ -7,8 +7,8 @@ # # @file dd_defs.py # -# @author (last) Dara Navaei -# @date (last) 08-Feb-2024 +# @author (last) Zoltan Miskolci +# @date (last) 09-Jan-2026 # @author (original) Peter Lucia # @date (original) 22-Jun-2021 # @@ -184,7 +184,7 @@ NUM_OF_D10_D11_CONCENTRATE_PUMP_ATTRIBUTES = 9 # Number of Acid (D11) and Bicarbonate (D10) Concentrate Pump Attributes @unique -class DDConductivitySensorsEnum(DialinEnum): +class DDConductivitySensorNames(DialinEnum): D17_COND = 0 # Closed Loop Control of Dosing for D74 Conductivity Sensor D27_COND = 1 # Closed Loop Control of Dosing for D29 Conductivity Sensor D29_COND = 2 # Water, Bicarbonate, and Acid Collective Conductivity Sensor Index: leahi_dialin/common/fp_defs.py =================================================================== diff -u -r18c90a1b2b6c7339bdd192a2d2fac32f2b8a35df -ra291930ba38e329e2b373f6d2b2a7564a6b7a09a --- leahi_dialin/common/fp_defs.py (.../fp_defs.py) (revision 18c90a1b2b6c7339bdd192a2d2fac32f2b8a35df) +++ leahi_dialin/common/fp_defs.py (.../fp_defs.py) (revision a291930ba38e329e2b373f6d2b2a7564a6b7a09a) @@ -8,14 +8,18 @@ # @file fp_defs.py # # @author (last) Zoltan Miskolci -# @date (last) 04-Dec-2025 +# @date (last) 09-Jan-2026 # @author (original) Peter Lucia # @date (original) 22-Jun-2021 # ############################################################################ + from enum import unique + +from .dd_defs import DDConductivitySensorNames, DDPressureNames, DDValveNames from ..utils.base import DialinEnum + @unique class FPOpModes(DialinEnum): MODE_FAUL = 0 # Fault mode @@ -163,6 +167,8 @@ P17_PRES = 3 # Pressure before the RO filter P46_PRES = 4 # Pressure after the RO filter NUM_OF_FP_PRES_SENSORS = 5 # Number of Pressure Sensors + FIRST_FP_SENSOR = P8_PRES # First FP Sensor + LAST_FP_SENSOR = P46_PRES # Last FP Sensor @unique class ROPumpNames(DialinEnum): @@ -182,31 +188,30 @@ FB_DUTY_CYCLE_PCT = 8 # Feedback Duty Cycle Percentage attribute for pumps NUM_OF_RO_PUMP_ATTRIBUTES = 9 # Number of pump attributes -BETA_CONDUCTIVITY_SENSOR_OFFSET = 3 # Offset to translate Dialin FPTemperaturesNames to DD firmware ConductivitySensors enum -BETA_FLOW_SENSOR_OFFSET = 7 # Offset to translate Dialin FPTemperaturesNames to DD firmware FlowSensors enum -BETA_IO_PRES_SENSOR_OFFSET = 5 # Offset to translate Dialin FPTemperaturesNames to DD firmware PressureSensors enum -BETA_FP_PRES_SENSOR_OFFSET = 3 # Offset to translate Dialin FPTemperaturesNames to DD firmware PressureSensors enum - @unique class FPTemperaturesNames(DialinEnum): M3_TEMP = 0 # Temperature after pressure regulator (M3) - P10_TEMP = 1 # P10 temperature from inlet conductivity sensor. - P19_TEMP = 2 # P19 temperature from outlet conductivity sensor. - P8_TEMP = 3 # Temperature before inlet conductivity sensor (P8) - P13_TEMP = 4 # Temperature before RO filter (P13) - P17_TEMP = 5 # Temperature after RO filter (P17) - P7_TEMP = 6 # Temperature at p7 flow meter - P16_TEMP = 7 # Temperature at p16 flow meter - P46_TEMP = 8 # Temperature after sediment filter (P46) + P8_TEMP = 1 # Temperature before inlet conductivity sensor (P8) + P13_TEMP = 2 # Temperature before RO filter (P13) + P17_TEMP = 3 # Temperature after RO filter (P17) + P46_TEMP = 4 # Temperature after sediment filter (P46) + P10_TEMP = 5 # P10 temperature from inlet conductivity sensor. + P19_TEMP = 6 # P19 temperature from outlet conductivity sensor. + P7_TEMP = 7 # Temperature at p7 flow meter + P16_TEMP = 8 # Temperature at p16 flow meter NUM_OF_TEMPERATURE_SENSORS = 9 # Number of Temperature Sensors + FIRST_PRESSURE_SENSOR = M3_TEMP # First Pressure Sensor + LAST_PRESSURE_SENSOR = P46_TEMP # Last Pressure Sensor + FIRST_CONDUCTIVITY_SENSOR = P10_TEMP # First Conductivity Sensor + LAST_CONDUCTIVITY_SENSOR = P19_TEMP # Last Conductivity Sensor + FIRST_FLOW_SENSOR = P7_TEMP # First FLow Sensor + LAST_FLOW_SENSOR = P16_TEMP # Last Flow Sensor @unique class FPValveStates(DialinEnum): VALVE_STATE_CLOSED = 0 # Valve Closed State VALVE_STATE_OPEN = 1 # Valve Open State -BETA_IOFP_VALVE_OFFSET = 32 # Offset to translate Dialin FPValveNames to DD firmware DD_Valves - @unique class FPValveNames(DialinEnum): M4_VALV = 0 # Valve (M4 VWi) @@ -222,4 +227,10 @@ @unique class FPPumpNames(DialinEnum): P12_PUMP_RO = 0 # RO Pump - P40_PUMP_BOOSTER = 1 # Booster Pump \ No newline at end of file + P40_PUMP_BOOSTER = 1 # Booster Pump + + +# To offset the FP enums with the DD values, as they lsited after the DD in the FW +BETA_IOFP_COND_SENSOR_OFFSET = DDConductivitySensorNames.NUM_OF_CONDUCTIVITY_SENSORS.value # Offset to translate Dialin FPTemperaturesNames to DD firmware PressureSensors enum +BETA_IOFP_PRES_SENSOR_OFFSET = DDPressureNames.NUM_OF_PRESSURE_SENSORS.value # Offset to translate Dialin FPTemperaturesNames to DD firmware PressureSensors enum +BETA_IOFP_VALVE_OFFSET = DDValveNames.NUM_OF_DD_VALVES.value # Offset to translate Dialin FPValveNames to DD firmware DD_Valves Index: leahi_dialin/dd/modules/conductivity_sensors.py =================================================================== diff -u -r18c90a1b2b6c7339bdd192a2d2fac32f2b8a35df -ra291930ba38e329e2b373f6d2b2a7564a6b7a09a --- leahi_dialin/dd/modules/conductivity_sensors.py (.../conductivity_sensors.py) (revision 18c90a1b2b6c7339bdd192a2d2fac32f2b8a35df) +++ leahi_dialin/dd/modules/conductivity_sensors.py (.../conductivity_sensors.py) (revision a291930ba38e329e2b373f6d2b2a7564a6b7a09a) @@ -19,7 +19,7 @@ from logging import Logger from leahi_dialin.common.constants import NO_RESET -from leahi_dialin.common.dd_defs import DDConductivitySensorsEnum +from leahi_dialin.common.dd_defs import DDConductivitySensorNames from leahi_dialin.common.msg_defs import MsgIds, MsgFieldPositions from leahi_dialin.common.override_templates import cmd_generic_broadcast_interval_override, cmd_generic_override from leahi_dialin.protocols.CAN import DenaliChannels @@ -50,11 +50,11 @@ self._handler_conductivity_sensors_sync) self.dd_conductivity = { - DDConductivitySensorsEnum.D17_COND.name: 0.0, - DDConductivitySensorsEnum.D27_COND.name: 0.0, - DDConductivitySensorsEnum.D29_COND.name: 0.0, - DDConductivitySensorsEnum.D43_COND.name: 0.0, - DDConductivitySensorsEnum.D74_COND.name: 0.0 + DDConductivitySensorNames.D17_COND.name: 0.0, + DDConductivitySensorNames.D27_COND.name: 0.0, + DDConductivitySensorNames.D29_COND.name: 0.0, + DDConductivitySensorNames.D43_COND.name: 0.0, + DDConductivitySensorNames.D74_COND.name: 0.0 } self.dd_conductivity_timestamp = 0.0 @@ -69,19 +69,19 @@ @param message: published DD conductivity sensor data message @return: None """ - self.dd_conductivity[DDConductivitySensorsEnum.D17_COND.name] = struct.unpack('f', bytearray( + self.dd_conductivity[DDConductivitySensorNames.D17_COND.name] = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_1:MsgFieldPositions.END_POS_FIELD_1]))[0] - self.dd_conductivity[DDConductivitySensorsEnum.D27_COND.name] = struct.unpack('f', bytearray( + self.dd_conductivity[DDConductivitySensorNames.D27_COND.name] = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_2:MsgFieldPositions.END_POS_FIELD_2]))[0] - self.dd_conductivity[DDConductivitySensorsEnum.D29_COND.name] = struct.unpack('f', bytearray( + self.dd_conductivity[DDConductivitySensorNames.D29_COND.name] = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_3:MsgFieldPositions.END_POS_FIELD_3]))[0] - self.dd_conductivity[DDConductivitySensorsEnum.D43_COND.name] = struct.unpack('f', bytearray( + self.dd_conductivity[DDConductivitySensorNames.D43_COND.name] = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_4:MsgFieldPositions.END_POS_FIELD_4]))[0] - self.dd_conductivity[DDConductivitySensorsEnum.D74_COND.name] = struct.unpack('f', bytearray( + self.dd_conductivity[DDConductivitySensorNames.D74_COND.name] = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_5:MsgFieldPositions.END_POS_FIELD_5]))[0] self.dd_conductivity_timestamp = timestamp @@ -125,7 +125,7 @@ sensor_byte_array = integer_to_bytearray(sensor_index) payload = reset_byte_array + cond_byte_array + sensor_byte_array - sensor_name = DDConductivitySensorsEnum(sensor_index).name.split('_')[0] + sensor_name = DDConductivitySensorNames(sensor_index).name.split('_')[0] return cmd_generic_override( payload = payload, reset = reset, @@ -154,7 +154,7 @@ sensor_byte_array = integer_to_bytearray(sensor_index) payload = reset_byte_array + read_byte_array + sensor_byte_array - sensor_name = DDConductivitySensorsEnum(sensor_index).name.split('_')[0] + sensor_name = DDConductivitySensorNames(sensor_index).name.split('_')[0] return cmd_generic_override( payload = payload, reset = reset, @@ -180,7 +180,7 @@ sensor_byte_array = integer_to_bytearray(sensor_index) payload = reset_byte_array + error_byte_array + sensor_byte_array - sensor_name = DDConductivitySensorsEnum(sensor_index).name.split('_')[0] + sensor_name = DDConductivitySensorNames(sensor_index).name.split('_')[0] return cmd_generic_override( payload = payload, reset = reset, Index: leahi_dialin/fp/filtration_purification.py =================================================================== diff -u -r79697500614904bafb56f3d33e368b954ba78f7d -ra291930ba38e329e2b373f6d2b2a7564a6b7a09a --- leahi_dialin/fp/filtration_purification.py (.../filtration_purification.py) (revision 79697500614904bafb56f3d33e368b954ba78f7d) +++ leahi_dialin/fp/filtration_purification.py (.../filtration_purification.py) (revision a291930ba38e329e2b373f6d2b2a7564a6b7a09a) @@ -7,18 +7,18 @@ # # @file filtration_purification.py # -# @author (last) Dara Navaei -# @date (last) 26-Feb-2024 +# @author (last) Zoltan Miskolci +# @date (last) 09-Jan-2026 # @author (original) Peter Lucia # @date (original) 02-Apr-2020 # ############################################################################ + import struct from .modules.alarms import FPAlarms from .modules.boost_pump import FPBoostPump from .modules.conductivity_sensors import FPConductivitySensors -from .modules.constants import NO_RESET, RESET from .modules.events import FPEvents from .modules.flow_sensors import FPFlowSensors from .modules.levels import FPLevels @@ -32,13 +32,13 @@ from .proxies.dd_proxy import DDProxy -from ..common.msg_defs import MsgIds, MsgFieldPositions, MsgFieldPositionsFWVersions +from ..common.constants import NO_RESET from ..common.fp_defs import FPOpModes +from ..common.msg_defs import MsgIds, MsgFieldPositions, MsgFieldPositionsFWVersions +from ..common.override_templates import cmd_generic_broadcast_interval_override, cmd_generic_override from ..protocols.CAN import DenaliMessage, DenaliCanMessenger, DenaliChannels from ..utils.base import AbstractSubSystem, publish, LogManager -from ..utils.checks import check_broadcast_interval_override_ms -from ..utils.conversions import integer_to_bytearray, unsigned_short_to_bytearray, bytearray_to_integer, \ - bytearray_to_byte +from ..utils.conversions import integer_to_bytearray, bytearray_to_byte class FP(AbstractSubSystem): @@ -66,7 +66,6 @@ @param can_interface: (str) CANBus interface name, e.g. "can0" @param log_level: (str) Logging level, defaults to None """ - super().__init__() self._log_manager = LogManager(log_level=log_level, log_filepath=self.__class__.__name__ + ".log") self.logger = self._log_manager.logger @@ -123,6 +122,7 @@ self.valves = FPValves(self.can_interface, self.logger) self.dd_proxy = DDProxy(self.can_interface, self.logger) + @publish(["msg_id_fp_debug_event", "fp_debug_events_timestamp","fp_debug_events"]) def _handler_fp_debug_event_sync(self, message, timestamp = 0.0): """ @@ -150,6 +150,7 @@ if self.fp_debug_event_index == self._FP_DEBUG_EVENT_LIST_COUNT: self.fp_debug_event_index = 0 + @publish(["fp_logged_in"]) def fp_set_logged_in_status(self, logged_in: bool = False): """ @@ -159,6 +160,7 @@ """ self.fp_logged_in = logged_in + @publish(["msg_id_fp_version_response", "fp_version, fp_fpga_version"]) def _handler_fp_version_response_sync(self,message, timestamp = 0.0): """ @@ -197,6 +199,7 @@ self.fp_version_response_timestamp = timestamp + @publish(["msg_id_fp_op_mode_data", "fp_op_mode_timestamp","fp_operation_mode", "fp_operation_sub_mode"]) def _handler_fp_op_mode_sync(self, message, timestamp = 0.0): """ @@ -215,6 +218,28 @@ self.fp_operation_sub_mode = smode[0] self.fp_op_mode_timestamp = timestamp + + def cmd_op_mode_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: + """ + Constructs and sends the measured op mode broadcast interval override command + Constraints: + Must be logged into FP. + Given interval must be non-zero and a multiple of the FP 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 + @return: 1 if successful, zero otherwise + """ + return cmd_generic_broadcast_interval_override( + ms = ms, + reset = reset, + channel_id = DenaliChannels.dialin_to_fp_ch_id, + msg_id = MsgIds.MSG_ID_FP_OPERATION_MODE_PUBLISH_INTERVAL_OVERRIDE_REQUEST, + module_name = 'FP Operation Mode', + logger = self.logger, + can_interface = self.can_interface) + + def cmd_log_in_to_fp(self, resend: bool = False) -> int: """ Constructs and sends a login command via CAN bus. Login required before \n @@ -223,7 +248,6 @@ @param resend: (bool) if False (default), try to login once. Otherwise, tries to login indefinitely @return: 1 if logged in, 0 if log in failed """ - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_fp_ch_id, message_id=MsgIds.MSG_ID_FP_TESTER_LOGIN_REQUEST.value, payload=list(map(int, map(ord, self.FP_LOGIN_PASSWORD)))) @@ -246,6 +270,7 @@ self.logger.debug("Login Timeout!!!!") return False + def cmd_fp_set_operation_mode(self, new_mode: int = 0) -> int: """ Constructs and sends a set operation mode request command via CAN bus. @@ -257,31 +282,19 @@ @param new_mode: ID of operation mode to transition to @return: 1 if successful, zero otherwise - """ - payload = integer_to_bytearray(new_mode) + return cmd_generic_override( + payload = payload, + reset = NO_RESET, + channel_id = DenaliChannels.dialin_to_fp_ch_id, + msg_id = MsgIds.MSG_ID_FP_SET_OP_MODE_REQUEST, + entity_name = 'FP Operation Mode', + override_text = FPOpModes(new_mode).name, + logger = self.logger, + can_interface = self.can_interface) - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_fp_ch_id, - message_id=MsgIds.MSG_ID_FP_SET_OP_MODE_REQUEST.value, - payload=payload) - self.logger.debug("Requesting FP mode change to " + str(new_mode)) - - # Send message - received_message = self.can_interface.send(message) - - if received_message is not None: - if received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] == 1: - self.logger.debug("Success: Mode change accepted") - else: - self.logger.debug("Failure: Mode change rejected.") - return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] - else: - self.logger.debug("FP mode change request Timeout!!!!") - return False - - def cmd_fp_software_reset_request(self) -> None: """ Constructs and sends an FP software reset request via CAN bus. @@ -290,60 +303,17 @@ @return: None """ + return cmd_generic_override( + payload = None, + reset = NO_RESET, + channel_id = DenaliChannels.dialin_to_fp_ch_id, + msg_id = MsgIds.MSG_ID_FP_SOFTWARE_RESET_REQUEST, + entity_name = 'FP Software Reset', + override_text = '', + logger = self.logger, + can_interface = self.can_interface) - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_fp_ch_id, - message_id=MsgIds.MSG_ID_FP_SOFTWARE_RESET_REQUEST.value) - self.logger.debug("requesting FP software reset") - - # Send message - self.can_interface.send(message, 0) - self.logger.debug("Sent request to FP to reset...") - self.fp_set_logged_in_status(False) - - def cmd_op_mode_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: - """ - Constructs and sends the measured op mode broadcast interval override command - Constraints: - Must be logged into FP. - Given interval must be non-zero and a multiple of the FP 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 - @return: 1 if successful, zero otherwise - """ - - if not check_broadcast_interval_override_ms(ms): - return False - - rst = integer_to_bytearray(reset) - mis = integer_to_bytearray(ms) - payload = rst + mis - - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_fp_ch_id, - message_id=MsgIds.MSG_ID_FP_OPERATION_MODE_PUBLISH_INTERVAL_OVERRIDE_REQUEST.value, - payload=payload) - - self.logger.debug("override op mode broadcast interval") - - # Send message - received_message = self.can_interface.send(message) - - # If there is content... - if received_message is not None: - # self.logger.debug(received_message) - if reset == RESET: - str_res = "reset back to normal: " - else: - str_res = str(ms) + " ms: " - self.logger.debug("operation mode 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] - else: - self.logger.debug("Timeout!!!!") - return False - def cmd_fp_safety_shutdown_override(self, active: int, reset: int = NO_RESET) -> int: """ Constructs and sends an FP safety shutdown override command via CAN bus. @@ -353,28 +323,17 @@ @param active: int - True to activate safety shutdown, False to deactivate @param reset: integer - 1 to reset a previous override, 0 to override @return: 1 if successful, zero otherwise - """ - rst = integer_to_bytearray(reset) saf = integer_to_bytearray(active) payload = rst + saf - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_fp_ch_id, - message_id=MsgIds.MSG_ID_FP_SAFETY_SHUTDOWN_OVERRIDE_REQUEST.value, - payload=payload) - - self.logger.debug("overriding FP safety shutdown") - - # Send message - received_message = self.can_interface.send(message) - - if received_message is not None: - if received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] == 1: - self.logger.debug("Safety shutdown signal overridden") - else: - self.logger.debug("Safety shutdown signal override failed.") - return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] - else: - self.logger.debug("Timeout!!!!") - return False + return cmd_generic_override( + payload = payload, + reset = NO_RESET, + channel_id = DenaliChannels.dialin_to_fp_ch_id, + msg_id = MsgIds.MSG_ID_FP_SAFETY_SHUTDOWN_OVERRIDE_REQUEST, + entity_name = 'FP Safety Shutdown', + override_text = str(active), + logger = self.logger, + can_interface = self.can_interface) Index: leahi_dialin/fp/modules/boost_pump.py =================================================================== diff -u -rec8a2600b9e8cf6fe7e02c200a1c24221ca86863 -ra291930ba38e329e2b373f6d2b2a7564a6b7a09a --- leahi_dialin/fp/modules/boost_pump.py (.../boost_pump.py) (revision ec8a2600b9e8cf6fe7e02c200a1c24221ca86863) +++ leahi_dialin/fp/modules/boost_pump.py (.../boost_pump.py) (revision a291930ba38e329e2b373f6d2b2a7564a6b7a09a) @@ -7,26 +7,25 @@ # # @file boost_pump.py # -# @author (last) Micahel Garthwaite -# @date (last) 17-Aug-2023 +# @author (last) Zoltan Miskolci +# @date (last) 09-Jan-2026 # @author (original) Peter Lucia # @date (original) 02-Apr-2020 # ############################################################################ -import struct +import struct from logging import Logger - -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.constants import NO_RESET from leahi_dialin.common.fp_defs import FPBoostPumpNames, FPPumpAttributes -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.common.msg_defs import MsgIds, MsgFieldPositions +from leahi_dialin.common.override_templates import cmd_generic_broadcast_interval_override, cmd_generic_override +from leahi_dialin.protocols.CAN import DenaliChannels +from leahi_dialin.utils.base import AbstractSubSystem, publish from leahi_dialin.utils.conversions import integer_to_bytearray, float_to_bytearray + class FPBoostPump(AbstractSubSystem): """ Dialin API sub-class for FP Boost pump controller related commands. @@ -60,6 +59,7 @@ } } + @publish(["msg_id_fp_boost_pump_data", "boost_pump", "boost_pump_timestamp"]) def _handler_pump_sync(self, message, timestamp=0.0): """ @@ -69,7 +69,6 @@ @param message: published FP ro pump data message @return: none """ - self.boost_pump[FPBoostPumpNames.P40_PUMP.name][FPPumpAttributes.STATE.name] = struct.unpack('i', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_1:MsgFieldPositions.END_POS_FIELD_1]))[0] self.boost_pump[FPBoostPumpNames.P40_PUMP.name][FPPumpAttributes.DUTY_CYCLE.name] = struct.unpack('i', bytearray( @@ -91,6 +90,7 @@ self.boost_pump_timestamp = timestamp + def cmd_boost_pump_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: """ Constructs and sends the FP boost pump broadcast interval override command @@ -102,38 +102,16 @@ @param reset: integer - 1 to reset a previous override, 0 to override @return: 1 if successful, zero otherwise """ + return cmd_generic_broadcast_interval_override( + ms = ms, + reset = reset, + channel_id = DenaliChannels.dialin_to_fp_ch_id, + msg_id = MsgIds.MSG_ID_FP_BOOST_PUMP_PUBLISH_INTERVAL_OVERRIDE_REQUEST, + module_name = 'FP Boost Pump', + logger = self.logger, + can_interface = self.can_interface) - if not check_broadcast_interval_override_ms(ms): - return False - rst = integer_to_bytearray(reset) - mis = integer_to_bytearray(ms) - payload = rst + mis - - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_fp_ch_id, - message_id=MsgIds.MSG_ID_FP_BOOST_PUMP_PUBLISH_INTERVAL_OVERRIDE_REQUEST.value, - payload=payload) - - self.logger.debug("override FP boost pump broadcast interval") - - # Send message - received_message = self.can_interface.send(message) - - # If there is content... - if received_message is not None: - # self.logger.debug(received_message) - if reset == RESET: - str_res = "reset back to normal" - else: - str_res = str(mis) - - self.logger.debug("broadcast overridden to " + str_res) - # response payload is OK or not OK - return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] - else: - self.logger.debug("Timeout!!!!") - return False - def cmd_boost_pump_target_pressure_override(self, pressure: float, reset: int = NO_RESET) -> int: """ Constructs and sends the target pressure override for the boost pump. This will drive @@ -149,29 +127,17 @@ prs = float_to_bytearray(pressure) payload = rst + prs - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_fp_ch_id, - message_id=MsgIds.MSG_ID_FP_BOOST_PUMP_TARGET_PRESSURE_OVERRIDE_REQUEST.value, - payload=payload) + return cmd_generic_override( + payload = payload, + reset = reset, + channel_id = DenaliChannels.dialin_to_fp_ch_id, + msg_id = MsgIds.MSG_ID_FP_BOOST_PUMP_TARGET_PRESSURE_OVERRIDE_REQUEST, + entity_name = f'FP P40 Boost Pump target pressure', + override_text = f'{str(pressure)} psi', + logger = self.logger, + can_interface = self.can_interface) - self.logger.debug("override boost pump target pressure") - # Send message - received_message = self.can_interface.send(message) - - # If there is content... - if received_message is not None: - if reset == RESET: - str_res = "reset back to normal" - else: - str_res = str(pressure) - - self.logger.debug("boost target pressure overridden to " + str_res) - # response payload is OK or not OK - return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] - else: - self.logger.debug("Timeout!!!!") - return False - def cmd_boost_pump_target_flow_override(self, flow: int, reset: int = NO_RESET) -> int: """ Constructs and sends the target flow override for the boost pump. This will drive @@ -187,29 +153,17 @@ flw = integer_to_bytearray(flow) payload = rst + flw - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_fp_ch_id, - message_id=MsgIds.MSG_ID_FP_BOOST_PUMP_TARGET_FLOW_OVERRIDE_REQUEST.value, - payload=payload) + return cmd_generic_override( + payload = payload, + reset = reset, + channel_id = DenaliChannels.dialin_to_fp_ch_id, + msg_id = MsgIds.MSG_ID_FP_BOOST_PUMP_TARGET_FLOW_OVERRIDE_REQUEST, + entity_name = f'FP P40 Boost Pump target flow', + override_text = f'{str(flow)}', + logger = self.logger, + can_interface = self.can_interface) - self.logger.debug("override BOOST pump target flow") - # Send message - received_message = self.can_interface.send(message) - - # If there is content... - if received_message is not None: - if reset == RESET: - str_res = "reset back to normal" - else: - str_res = str(flow) - - self.logger.debug("BOOST target flow overridden to " + str_res) - # response payload is OK or not OK - return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] - else: - self.logger.debug("Timeout!!!!") - return False - def cmd_boost_pump_target_pwm_override(self, duty_cycle: float, reset: int = NO_RESET) -> int: """ Constructs and sends the target duty cycle override for the boost pump. This will drive @@ -225,30 +179,17 @@ pwm = float_to_bytearray(duty_cycle) payload = rst + pwm - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_fp_ch_id, - message_id=MsgIds.MSG_ID_FP_BOOST_PUMP_TARGET_PWM_OVERRIDE_REQUEST.value, - payload=payload) + return cmd_generic_override( + payload = payload, + reset = reset, + channel_id = DenaliChannels.dialin_to_fp_ch_id, + msg_id = MsgIds.MSG_ID_FP_BOOST_PUMP_TARGET_FLOW_OVERRIDE_REQUEST, + entity_name = f'FP P40 Boost Pump target PWM', + override_text = f'{str(duty_cycle)}', + logger = self.logger, + can_interface = self.can_interface) - self.logger.debug("override boost pump target pwm") - # Send message - received_message = self.can_interface.send(message) - - # If there is content... - if received_message is not None: - if reset == RESET: - str_res = "reset back to normal" - else: - str_res = str(duty_cycle) - - self.logger.debug("boost target pwm overridden to " + str_res) - # response payload is OK or not OK - return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] - else: - self.logger.debug("Timeout!!!!") - return False - - def cmd_boost_pump_set_hard_stop(self) -> int: """ Constructs and sends the hard stop for the boost pump. This will stop @@ -258,21 +199,12 @@ @return: 1 if successful, zero otherwise """ - - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_fp_ch_id, - message_id=MsgIds.MSG_ID_FP_BOOST_PUMP_STOP_REQUEST.value) - - self.logger.debug("hard stopping boost pump") - - # Send message - received_message = self.can_interface.send(message) - - # If there is content... - if received_message is not None: - self.logger.debug(" boost pump stopped ") - # response payload is OK or not OK - return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] - else: - self.logger.debug("Timeout!!!!") - return False - + return cmd_generic_override( + payload = None, + reset = NO_RESET, + channel_id = DenaliChannels.dialin_to_fp_ch_id, + msg_id = MsgIds.MSG_ID_FP_BOOST_PUMP_STOP_REQUEST, + entity_name = f'FP P40 Boost Pump hard stop', + override_text = f'Active', + logger = self.logger, + can_interface = self.can_interface) Index: leahi_dialin/fp/modules/conductivity_sensors.py =================================================================== diff -u -r1f6d8db8a800b32a70eb1176fcbd5263550a7180 -ra291930ba38e329e2b373f6d2b2a7564a6b7a09a --- leahi_dialin/fp/modules/conductivity_sensors.py (.../conductivity_sensors.py) (revision 1f6d8db8a800b32a70eb1176fcbd5263550a7180) +++ leahi_dialin/fp/modules/conductivity_sensors.py (.../conductivity_sensors.py) (revision a291930ba38e329e2b373f6d2b2a7564a6b7a09a) @@ -8,19 +8,20 @@ # @file conductivity_sensors.py # # @author (last) Zoltan Miskolci -# @date (last) 04-Dec-2025 +# @date (last) 09-Jan-2026 # @author (original) Quang Nguyen # @date (original) 20-Jul-2020 # ############################################################################ + import struct from logging import Logger -from .constants import RESET, NO_RESET +from leahi_dialin.common.constants import NO_RESET +from leahi_dialin.common.fp_defs import FPConductivitySensorNames, FPRORejectionRatioEnum from leahi_dialin.common.msg_defs import MsgIds, MsgFieldPositions -from leahi_dialin.common.fp_defs import FPConductivitySensorsEnum, FPRORejectionRatioEnum -from leahi_dialin.common.override_templates import cmd_generic_broadcast_interval_override -from leahi_dialin.protocols.CAN import DenaliMessage, DenaliChannels +from leahi_dialin.common.override_templates import cmd_generic_broadcast_interval_override, cmd_generic_override +from leahi_dialin.protocols.CAN import DenaliChannels from leahi_dialin.utils.base import AbstractSubSystem, publish from leahi_dialin.utils.conversions import integer_to_bytearray, float_to_bytearray @@ -32,7 +33,6 @@ def __init__(self, can_interface, logger: Logger): """ - @param can_interface: Denali Can Messenger object """ super().__init__() @@ -51,8 +51,8 @@ self.ro_rejection_ratio_timestamp = 0.0 self.fp_conductivity = { - FPConductivitySensorsEnum.P9_COND.name: 0.0, - FPConductivitySensorsEnum.P18_COND.name: 0.0 + FPConductivitySensorNames.P9_COND.name: 0.0, + FPConductivitySensorNames.P18_COND.name: 0.0 } self.ro_rejection_ratio = { @@ -73,10 +73,9 @@ @param message: published conductivity sensor data message @return: None """ - - self.fp_conductivity[FPConductivitySensorsEnum.P9_COND.name] = struct.unpack('f', bytearray( + self.fp_conductivity[FPConductivitySensorNames.P9_COND.name] = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_1:MsgFieldPositions.END_POS_FIELD_1]))[0] - self.fp_conductivity[FPConductivitySensorsEnum.P18_COND.name] = struct.unpack('f', bytearray( + self.fp_conductivity[FPConductivitySensorNames.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 @@ -91,7 +90,6 @@ @param message: Published RO Rejection Ratio data message @return: None """ - self.ro_rejection_ratio[FPRORejectionRatioEnum.RAW_RO_REJECTION_RATIO.name] = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_1:MsgFieldPositions.END_POS_FIELD_1]))[0] self.ro_rejection_ratio[FPRORejectionRatioEnum.RAW_RO_REJECTION_RATIO_TANK_FILL.name] = struct.unpack('f', bytearray( @@ -117,13 +115,12 @@ @param reset: integer - 1 to reset a previous override, 0 to override @return: 1 if successful, zero otherwise """ - - cmd_generic_broadcast_interval_override( + return cmd_generic_broadcast_interval_override( ms = ms, reset = reset, channel_id = DenaliChannels.dialin_to_fp_ch_id, msg_id = MsgIds.MSG_ID_FP_CONDUCTIVITY_PUBLISH_INTERVAL_OVERRIDE_REQUEST, - module_name = 'FP conductivity sensor', + module_name = 'FP Conductivity Sensor', logger = self.logger, can_interface = self.can_interface) @@ -139,8 +136,7 @@ @param reset: integer - 1 to reset a previous override, 0 to override @return: 1 if successful, zero otherwise """ - - cmd_generic_broadcast_interval_override( + return cmd_generic_broadcast_interval_override( ms = ms, reset = reset, channel_id = DenaliChannels.dialin_to_fp_ch_id, @@ -160,36 +156,24 @@ @param conductivity: 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) cond_byte_array = float_to_bytearray(conductivity) sensor_byte_array = integer_to_bytearray(sensor) payload = reset_byte_array + cond_byte_array + sensor_byte_array - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_fp_ch_id, - message_id=MsgIds.MSG_ID_FP_CONDUCTIVITY_OVERRIDE_REQUEST.value, - payload=payload) + sensor_name = FPConductivitySensorNames(sensor).name.split('_')[0] + return cmd_generic_override( + payload = payload, + reset = reset, + channel_id = DenaliChannels.dialin_to_fp_ch_id, + msg_id = MsgIds.MSG_ID_FP_CONDUCTIVITY_OVERRIDE_REQUEST, + entity_name = f'FP {sensor_name} Conductivity Sensor reading', + override_text = f'{str(conductivity)} microsiemens/cm', + logger = self.logger, + can_interface = self.can_interface) - if reset == RESET: - str_res = "reset back to normal" - else: - str_res = str(conductivity) + " microsiemens/cm" - self.logger.debug("override FP 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 FP conductivity sensor read override command @@ -198,35 +182,24 @@ @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 - """ - reset_byte_array = integer_to_bytearray(reset) read_byte_array = integer_to_bytearray(counter) sensor_byte_array = integer_to_bytearray(sensor) payload = reset_byte_array + read_byte_array + sensor_byte_array - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_fp_ch_id, - message_id=MsgIds.MSG_ID_FP_CONDUCTIVITY_READ_COUNT_OVERRIDE_REQUEST.value, - payload=payload) + sensor_name = FPConductivitySensorNames(sensor).name.split('_')[0] + return cmd_generic_override( + payload = payload, + reset = reset, + channel_id = DenaliChannels.dialin_to_fp_ch_id, + msg_id = MsgIds.MSG_ID_FP_CONDUCTIVITY_READ_COUNT_OVERRIDE_REQUEST, + entity_name = f'FP {sensor_name} Conductivity Sensor read counter', + override_text = str(counter), + logger = self.logger, + can_interface = self.can_interface) - if reset == RESET: - str_res = "reset back to normal" - else: - str_res = str(counter) - self.logger.debug("override FP conductivity sensor read counter 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_error_counter_override(self, sensor: int, counter: int, reset: int = NO_RESET) -> int: """ Constructs and sends the FP conductivity error counter override command @@ -235,67 +208,42 @@ @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 - """ - reset_byte_array = integer_to_bytearray(reset) error_byte_array = integer_to_bytearray(counter) sensor_byte_array = integer_to_bytearray(sensor) payload = reset_byte_array + error_byte_array + sensor_byte_array - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_fp_ch_id, - message_id=MsgIds.MSG_ID_FP_CONDUCTIVITY_ERROR_COUNT_OVERRIDE_REQUEST.value, - payload=payload) + sensor_name = FPConductivitySensorNames(sensor).name.split('_')[0] + return cmd_generic_override( + payload = payload, + reset = reset, + channel_id = DenaliChannels.dialin_to_fp_ch_id, + msg_id = MsgIds.MSG_ID_FP_CONDUCTIVITY_ERROR_COUNT_OVERRIDE_REQUEST, + entity_name = f'FP {sensor_name} Conductivity Sensor error counter', + override_text = str(counter), + logger = self.logger, + can_interface = self.can_interface) - if reset == RESET: - str_res = "reset back to normal" - else: - str_res = str(counter) - self.logger.debug("override FP conductivity sensor error counter 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_ro_rejection_ratio_override(self, value: float, reset: int = NO_RESET) -> int: """ Constructs and sends the FP RO Rejection Ratio override command @param value: float - 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) value_byte_array = float_to_bytearray(value) payload = reset_byte_array + value_byte_array - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_fp_ch_id, - message_id=MsgIds.MSG_ID_FP_RO_FILTERED_REJECTION_RATIO_OVERRIDE_REQUEST.value, - payload=payload) - - if reset == RESET: - str_res = "reset back to normal" - else: - str_res = str(value) - self.logger.debug("override FP RO Rejection ratio value: " + 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 + return cmd_generic_override( + payload = payload, + reset = reset, + channel_id = DenaliChannels.dialin_to_fp_ch_id, + msg_id = MsgIds.MSG_ID_FP_RO_FILTERED_REJECTION_RATIO_OVERRIDE_REQUEST, + entity_name = f'FP RO Rejection Ratio', + override_text = str(value), + logger = self.logger, + can_interface = self.can_interface) Fisheye: Tag a291930ba38e329e2b373f6d2b2a7564a6b7a09a refers to a dead (removed) revision in file `leahi_dialin/fp/modules/constants.py'. Fisheye: No comparison available. Pass `N' to diff? Index: leahi_dialin/fp/modules/events.py =================================================================== diff -u -r03dc6c3ff80d7f76a5b6438ba067e02a37e2ce93 -ra291930ba38e329e2b373f6d2b2a7564a6b7a09a --- leahi_dialin/fp/modules/events.py (.../events.py) (revision 03dc6c3ff80d7f76a5b6438ba067e02a37e2ce93) +++ leahi_dialin/fp/modules/events.py (.../events.py) (revision a291930ba38e329e2b373f6d2b2a7564a6b7a09a) @@ -301,7 +301,6 @@ @param message: published FP operation mode broadcast message @return: None """ - mode = struct.unpack('i', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_1:MsgFieldPositions.END_POS_FIELD_1])) smode = struct.unpack('i', bytearray( Index: leahi_dialin/fp/modules/flow_sensors.py =================================================================== diff -u -r070dbb7a7bbd42c2879768f1eb592bcb188db1c9 -ra291930ba38e329e2b373f6d2b2a7564a6b7a09a --- leahi_dialin/fp/modules/flow_sensors.py (.../flow_sensors.py) (revision 070dbb7a7bbd42c2879768f1eb592bcb188db1c9) +++ leahi_dialin/fp/modules/flow_sensors.py (.../flow_sensors.py) (revision a291930ba38e329e2b373f6d2b2a7564a6b7a09a) @@ -7,37 +7,34 @@ # # @file flow_sensors.py # -# @author (last) Micahel Garthwaite -# @date (last) 17-Aug-2023 +# @author (last) Zoltan Miskolci +# @date (last) 09-Jan-2026 # @author (original) Peter Lucia # @date (original) 02-Apr-2020 # ############################################################################ + import struct -from enum import unique from logging import Logger -from .constants import RESET, NO_RESET -from leahi_dialin.common.msg_defs import MsgIds, MsgFieldPositions +from leahi_dialin.common.constants import NO_RESET from leahi_dialin.common.fp_defs import FPFlowSensorNames -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.common.msg_defs import MsgIds, MsgFieldPositions +from leahi_dialin.common.override_templates import cmd_generic_broadcast_interval_override, cmd_generic_override +from leahi_dialin.protocols.CAN import DenaliChannels +from leahi_dialin.utils.base import AbstractSubSystem, publish from leahi_dialin.utils.conversions import integer_to_bytearray, float_to_bytearray class FPFlowSensors(AbstractSubSystem): """ - API sub-class for FP flow sensor related commands. """ def __init__(self, can_interface, logger: Logger): """ - @param can_interface: Denali CAN Messenger object """ - super().__init__() self.can_interface = can_interface @@ -55,6 +52,7 @@ self.fp_flow_timestamp = 0 + @publish(["msg_id_fp_flow_data", "fp_flows", "fp_flows_timestamp"]) def _handler_flow_sensor_sync(self, message, timestamp=0.0): """ @@ -70,6 +68,7 @@ self.fp_flow_timestamp = timestamp + def cmd_flow_sensor_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: """ Constructs and sends an FP flow sensor broadcast interval override command message. @@ -81,29 +80,16 @@ @param reset: (int) 1 to reset a previous override, 0 to override @returns 1 if successful, zero otherwise """ - if not check_broadcast_interval_override_ms(ms): - return False + return cmd_generic_broadcast_interval_override( + ms = ms, + reset = reset, + channel_id = DenaliChannels.dialin_to_fp_ch_id, + msg_id = MsgIds.MSG_ID_FP_FLOWS_PUBLISH_INTERVAL_OVERRIDE_REQUEST, + module_name = 'FP Flow Sensor', + logger = self.logger, + can_interface = self.can_interface) - reset_value = integer_to_bytearray(reset) - interval_value = integer_to_bytearray(ms) - payload = reset_value + interval_value - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_fp_ch_id, - message_id=MsgIds.MSG_ID_FP_FLOWS_PUBLISH_INTERVAL_OVERRIDE_REQUEST.value, - payload=payload) - - self.logger.debug("Sending {} ms publish interval to the FP flow sensor module".format(ms)) - # Send message - received_message = self.can_interface.send(message) - - # If there is content in message - if received_message is not None: - # Response payload is OK or not - return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] - else: - self.logger.debug("Timeout!!!!") - return False - def cmd_flow_rate_override(self, flow_sensor: int, rate: int, reset: int = NO_RESET) -> int: """ Constructs and sends flow rate override command. @@ -118,20 +104,18 @@ lvl = integer_to_bytearray(flow_sensor) sts = integer_to_bytearray(rate) payload = reset_value + sts + lvl - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_fp_ch_id, - message_id=MsgIds.MSG_ID_FP_FLOW_RATE_OVERRIDE_REQUEST.value, - payload=payload) - # Send message - received_message = self.can_interface.send(message) + sensor_name = FPFlowSensorNames(flow_sensor).name.split('_')[0] + return cmd_generic_override( + payload = payload, + reset = reset, + channel_id = DenaliChannels.dialin_to_fp_ch_id, + msg_id = MsgIds.MSG_ID_FP_FLOW_RATE_OVERRIDE_REQUEST, + entity_name = f'FP {sensor_name} Flow Sensor flow rate', + override_text = f'{str(rate)}', + logger = self.logger, + can_interface = self.can_interface) - # If there is content in message - if received_message is not None: - # Response payload is OK or not - return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] - else: - self.logger.debug("Timeout!!!!") - return False def cmd_flow_temp_override(self, flow_sensor: int, temp: float, reset: int = NO_RESET) -> int: """ @@ -147,20 +131,18 @@ lvl = integer_to_bytearray(flow_sensor) sts = float_to_bytearray(temp) payload = reset_value + sts + lvl - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_fp_ch_id, - message_id=MsgIds.MSG_ID_FP_FLOW_TEMP_OVERRIDE_REQUEST.value, - payload=payload) - # Send message - received_message = self.can_interface.send(message) + sensor_name = FPFlowSensorNames(flow_sensor).name.split('_')[0] + return cmd_generic_override( + payload = payload, + reset = reset, + channel_id = DenaliChannels.dialin_to_fp_ch_id, + msg_id = MsgIds.MSG_ID_FP_FLOW_TEMP_OVERRIDE_REQUEST, + entity_name = f'FP {sensor_name} Flow Sensor temperature', + override_text = f'{str(temp)} C', + logger = self.logger, + can_interface = self.can_interface) - # If there is content in message - if received_message is not None: - # Response payload is OK or not - return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] - else: - self.logger.debug("Timeout!!!!") - return False def cmd_filtered_flow_rate_override(self, flow_sensor: int, rate: float, reset: int = NO_RESET) -> int: """ @@ -176,20 +158,18 @@ lvl = integer_to_bytearray(flow_sensor) sts = float_to_bytearray(rate) payload = reset_value + sts + lvl - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_fp_ch_id, - message_id=MsgIds.MSG_ID_FP_FILTERED_FLOW_RATE_OVERRIDE_REQUEST.value, - payload=payload) - # Send message - received_message = self.can_interface.send(message) + sensor_name = FPFlowSensorNames(flow_sensor).name.split('_')[0] + return cmd_generic_override( + payload = payload, + reset = reset, + channel_id = DenaliChannels.dialin_to_fp_ch_id, + msg_id = MsgIds.MSG_ID_FP_FILTERED_FLOW_RATE_OVERRIDE_REQUEST, + entity_name = f'FP {sensor_name} Flow Sensor filtered flow rate', + override_text = f'{str(rate)}', + logger = self.logger, + can_interface = self.can_interface) - # If there is content in message - if received_message is not None: - # Response payload is OK or not - return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] - else: - self.logger.debug("Timeout!!!!") - return False def cmd_filtered_flow_temp_override(self, flow_sensor: int, temp: float, reset: int = NO_RESET) -> int: """ @@ -205,17 +185,14 @@ lvl = integer_to_bytearray(flow_sensor) sts = float_to_bytearray(temp) payload = reset_value + sts + lvl - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_fp_ch_id, - message_id=MsgIds.MSG_ID_FP_FILTERED_FLOW_TEMP_OVERRIDE_REQUEST.value, - payload=payload) - # Send message - received_message = self.can_interface.send(message) - - # If there is content in message - if received_message is not None: - # Response payload is OK or not - return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] - else: - self.logger.debug("Timeout!!!!") - return False \ No newline at end of file + sensor_name = FPFlowSensorNames(flow_sensor).name.split('_')[0] + return cmd_generic_override( + payload = payload, + reset = reset, + channel_id = DenaliChannels.dialin_to_fp_ch_id, + msg_id = MsgIds.MSG_ID_FP_FILTERED_FLOW_TEMP_OVERRIDE_REQUEST, + entity_name = f'FP {sensor_name} Flow Sensor filtered temperature', + override_text = f'{str(temp)} C', + logger = self.logger, + can_interface = self.can_interface) Index: leahi_dialin/fp/modules/fp_test_configs.py =================================================================== diff -u -r03dc6c3ff80d7f76a5b6438ba067e02a37e2ce93 -ra291930ba38e329e2b373f6d2b2a7564a6b7a09a --- leahi_dialin/fp/modules/fp_test_configs.py (.../fp_test_configs.py) (revision 03dc6c3ff80d7f76a5b6438ba067e02a37e2ce93) +++ leahi_dialin/fp/modules/fp_test_configs.py (.../fp_test_configs.py) (revision a291930ba38e329e2b373f6d2b2a7564a6b7a09a) @@ -32,7 +32,6 @@ def __init__(self, can_interface, logger: Logger): """ - @param can_interface: Denali CAN Messenger object """ super().__init__() Index: leahi_dialin/fp/modules/levels.py =================================================================== diff -u -rec8a2600b9e8cf6fe7e02c200a1c24221ca86863 -ra291930ba38e329e2b373f6d2b2a7564a6b7a09a --- leahi_dialin/fp/modules/levels.py (.../levels.py) (revision ec8a2600b9e8cf6fe7e02c200a1c24221ca86863) +++ leahi_dialin/fp/modules/levels.py (.../levels.py) (revision a291930ba38e329e2b373f6d2b2a7564a6b7a09a) @@ -7,38 +7,34 @@ # # @file levels.py # -# @author (last) Michael Garthwaite -# @date (last) 28-Oct-2024 +# @author (last) Zoltan Miskolci +# @date (last) 09-Jan-2026 # @author (original) Dara Navaei # @date (original) 29-May-2020 # ############################################################################ import struct -from enum import unique from logging import Logger -from .constants import NO_RESET +from leahi_dialin.common.constants import NO_RESET +from leahi_dialin.common.fp_defs import FPFloaterLevelSensorNames 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 -from leahi_dialin.utils.conversions import integer_to_bytearray, float_to_bytearray +from leahi_dialin.common.override_templates import cmd_generic_broadcast_interval_override, cmd_generic_override +from leahi_dialin.protocols.CAN import DenaliChannels +from leahi_dialin.utils.base import AbstractSubSystem, publish +from leahi_dialin.utils.conversions import integer_to_bytearray class FPLevels(AbstractSubSystem): """ - Dialin API sub-class for levels related commands. """ def __init__(self, can_interface, logger: Logger): """ - @param can_interface: Denali CAN Messenger object """ - super().__init__() self.can_interface = can_interface @@ -54,6 +50,7 @@ } self.fp_levels_timestamp = 0 + @publish(["msg_id_fp_level_data", "fp_levels", "fp_levels_timestamp"]) @@ -69,6 +66,7 @@ self.fp_levels_timestamp = timestamp + def cmd_levels_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: """ Constructs and sends an FP levels data broadcast interval override command message. @@ -80,29 +78,16 @@ @param reset: (int) 1 to reset a previous override, 0 to override @returns 1 if successful, zero otherwise """ - if not check_broadcast_interval_override_ms(ms): - return False + return cmd_generic_broadcast_interval_override( + ms = ms, + reset = reset, + channel_id = DenaliChannels.dialin_to_fp_ch_id, + msg_id = MsgIds.MSG_ID_FP_LEVEL_PUBLISH_INTERVAL_OVERRIDE_REQUEST, + module_name = 'FP Levels', + logger = self.logger, + can_interface = self.can_interface) - reset_value = integer_to_bytearray(reset) - interval_value = integer_to_bytearray(ms) - payload = reset_value + interval_value - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_fp_ch_id, - message_id=MsgIds.MSG_ID_FP_LEVEL_PUBLISH_INTERVAL_OVERRIDE_REQUEST.value, - payload=payload) - - self.logger.debug("Sending {} ms publish interval to the FP Levels module".format(ms)) - # Send message - received_message = self.can_interface.send(message) - - # If there is content in message - if received_message is not None: - # Response payload is OK or not - return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] - else: - self.logger.debug("Timeout!!!!") - return False - def cmd_level_status_override(self, status: int, reset: int = NO_RESET) -> int: """ Constructs and sends level status override command. @@ -115,17 +100,13 @@ reset_value = integer_to_bytearray(reset) sts = integer_to_bytearray(status) payload = reset_value + sts - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_fp_ch_id, - message_id=MsgIds.MSG_ID_FP_LEVEL_OVERRIDE_REQUEST.value, - payload=payload) - # Send message - received_message = self.can_interface.send(message) - - # If there is content in message - if received_message is not None: - # Response payload is OK or not - return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] - else: - self.logger.debug("Timeout!!!!") - return False + return cmd_generic_override( + payload = payload, + reset = reset, + channel_id = DenaliChannels.dialin_to_fp_ch_id, + msg_id = MsgIds.MSG_ID_FP_FLOW_RATE_OVERRIDE_REQUEST, + entity_name = f'FP Levels status', + override_text = f'{str(status)}', + logger = self.logger, + can_interface = self.can_interface) Index: leahi_dialin/fp/modules/permeate_tank.py =================================================================== diff -u -rec8a2600b9e8cf6fe7e02c200a1c24221ca86863 -ra291930ba38e329e2b373f6d2b2a7564a6b7a09a --- leahi_dialin/fp/modules/permeate_tank.py (.../permeate_tank.py) (revision ec8a2600b9e8cf6fe7e02c200a1c24221ca86863) +++ leahi_dialin/fp/modules/permeate_tank.py (.../permeate_tank.py) (revision a291930ba38e329e2b373f6d2b2a7564a6b7a09a) @@ -7,23 +7,23 @@ # # @file permeate_tank.py # -# @author (last) Micahel Garthwaite -# @date (last) 07-Mar-2023 +# @author (last) Zoltan Miskolci +# @date (last) 09-Jan-2026 # @author (original) Micahel Garthwaite # @date (original) 29-Oct-2020 # ############################################################################ + import struct -from enum import unique from logging import Logger -from .constants import RESET, NO_RESET +from leahi_dialin.common.constants import NO_RESET from leahi_dialin.common.msg_defs import MsgIds, MsgFieldPositions -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 +from leahi_dialin.common.override_templates import cmd_generic_broadcast_interval_override +from leahi_dialin.protocols.CAN import DenaliChannels +from leahi_dialin.utils.base import AbstractSubSystem, publish + class FPPermeateTank(AbstractSubSystem): """ Permeate Tank @@ -33,7 +33,6 @@ def __init__(self, can_interface, logger: Logger): """ - @param can_interface: Leahi Can Messenger object """ super().__init__() @@ -50,6 +49,7 @@ self.permeate_tank_state = 0 self.permeate_tank_timestamp = 0.0 + @publish(["msg_id_fp_permeate_tank_data", "permeate_tank_state", "permeate_tank_timestamp"]) def _handler_permeate_tank_sync(self, message, timestamp=0.0): """ @@ -58,12 +58,12 @@ @param message: published permeate tank data message @return: None """ - self.permeate_tank_state = struct.unpack('I', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_1:MsgFieldPositions.END_POS_FIELD_1]))[0] self.permeate_tank_timestamp = timestamp + def cmd_permeate_tank_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: """ Constructs and sends the broadcast time interval override for permeate tank data. @@ -75,25 +75,11 @@ @param reset: (int) 1 to reset a previous override, 0 to override @returns 1 if successful, zero otherwise """ - if not check_broadcast_interval_override_ms(ms): - return False - - reset_value = integer_to_bytearray(reset) - interval_value = integer_to_bytearray(ms) - payload = reset_value + interval_value - - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_fp_ch_id, - message_id=MsgIds.MSG_ID_FP_PERMEATE_TANK_PUBLISH_INTERVAL_OVERRIDE_REQUEST.value, - payload=payload) - - self.logger.debug("Sending {} ms publish interval to the Permeate Tank module".format(ms)) - # Send message - received_message = self.can_interface.send(message) - - # If there is content in message - if received_message is not None: - # Response payload is OK or not - return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] - else: - self.logger.debug("Timeout!!!!") - return False \ No newline at end of file + return cmd_generic_broadcast_interval_override( + ms = ms, + reset = reset, + channel_id = DenaliChannels.dialin_to_fp_ch_id, + msg_id = MsgIds.MSG_ID_FP_PERMEATE_TANK_PUBLISH_INTERVAL_OVERRIDE_REQUEST, + module_name = 'FP Permeate Tank', + logger = self.logger, + can_interface = self.can_interface) Index: leahi_dialin/fp/modules/pressure_sensors.py =================================================================== diff -u -rd2774cbe954e861f6ec31d44134e74c8e9d66f22 -ra291930ba38e329e2b373f6d2b2a7564a6b7a09a --- leahi_dialin/fp/modules/pressure_sensors.py (.../pressure_sensors.py) (revision d2774cbe954e861f6ec31d44134e74c8e9d66f22) +++ leahi_dialin/fp/modules/pressure_sensors.py (.../pressure_sensors.py) (revision a291930ba38e329e2b373f6d2b2a7564a6b7a09a) @@ -7,22 +7,22 @@ # # @file pressure_sensors.py # -# @author (last) Vinayakam Mani -# @date (last) 02-May-2024 +# @author (last) Zoltan Miskolci +# @date (last) 09-Jan-2026 # @author (original) Peter Lucia # @date (original) 02-Apr-2020 # ############################################################################ + import struct -from enum import unique from logging import Logger -from .constants import RESET, NO_RESET -from leahi_dialin.common.msg_defs import MsgIds, MsgFieldPositions +from leahi_dialin.common.constants import NO_RESET 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 +from leahi_dialin.common.msg_defs import MsgIds, MsgFieldPositions +from leahi_dialin.common.override_templates import cmd_generic_broadcast_interval_override, cmd_generic_override +from leahi_dialin.protocols.CAN import DenaliChannels +from leahi_dialin.utils.base import AbstractSubSystem, publish from leahi_dialin.utils.conversions import integer_to_bytearray, float_to_bytearray @@ -34,7 +34,6 @@ def __init__(self, can_interface, logger: Logger): """ FPPressureSensors constructor - """ super().__init__() self.can_interface = can_interface @@ -56,6 +55,7 @@ self.fp_pressure_timestamp = 0.0 + @publish(["msg_id_fp_pressures_data", "fp_pressures", "fp_pressure_timestamp"]) def _handler_pressure_sync(self, message, timestamp=0.0): """ @@ -65,7 +65,6 @@ @param message: published FP pressure sensor data message @return: none """ - self.fp_pressures[FPPressureSensorNames.M3_PRES.name] = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_1:MsgFieldPositions.END_POS_FIELD_1]))[0] self.fp_pressures[FPPressureSensorNames.P8_PRES.name] = struct.unpack('f', bytearray( @@ -79,85 +78,51 @@ self.fp_pressure_timestamp = timestamp - def cmd_pressure_sensor_override(self, sensor: int, pressure: float, reset: int = NO_RESET) -> int: + + def cmd_pressure_sensors_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: """ - Constructs and sends a measured FP pressure override command message. + Constructs and sends the FP pressure data broadcast interval override command. Constraints: Must be logged into FP. + Given interval must be non-zero and a multiple of the FP general task interval (50 ms). - @param sensor: int - switch between filtered override and raw override - @param pressure: float - measured pressure (in PSI) to override with + @param ms: integer - interval (in ms) to override with @param reset: integer - 1 to reset a previous override, 0 to override @return: 1 if successful, zero otherwise """ + return cmd_generic_broadcast_interval_override( + ms = ms, + reset = reset, + channel_id = DenaliChannels.dialin_to_fp_ch_id, + msg_id = MsgIds.MSG_ID_FP_PRESSURE_PUBLISH_INTERVAL_OVERRIDE_REQUEST, + module_name = 'FP Pressure Sensors', + logger = self.logger, + can_interface = self.can_interface) - rst = integer_to_bytearray(reset) - sen = integer_to_bytearray(sensor) - prs = float_to_bytearray(pressure) - payload = rst + prs + sen - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_fp_ch_id, - message_id=MsgIds.MSG_ID_FP_PRESSURE_OVERRIDE_REQUEST.value, - payload=payload) - - self.logger.debug("override FP pressure sensor") - - # Send message - received_message = self.can_interface.send(message) - - # If there is content... - if received_message is not None: - if reset == RESET: - str_res = "reset back to normal. " - else: - str_res = str(pressure) + " PSI. " - self.logger.debug("FP pressure overridden to " + str_res + - str(received_message['message'][DenaliMessage.PAYLOAD_START_INDEX])) - # response payload is OK or not OK - return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] - else: - self.logger.debug("Timeout!!!!") - return False - - def cmd_pressure_sensors_broadcast_interval_override(self, ms: 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 FP pressure data broadcast interval override command. + Constructs and sends a measured FP pressure override command message. Constraints: Must be logged into FP. - Given interval must be non-zero and a multiple of the FP general task interval (50 ms). - @param ms: integer - interval (in ms) to override with + @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 """ - - if not check_broadcast_interval_override_ms(ms): - return False - rst = integer_to_bytearray(reset) - mis = integer_to_bytearray(ms) - payload = rst + mis + sen = integer_to_bytearray(sensor) + prs = float_to_bytearray(pressure) + payload = rst + prs + sen - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_fp_ch_id, - message_id=MsgIds.MSG_ID_FP_PRESSURE_PUBLISH_INTERVAL_OVERRIDE_REQUEST.value, - payload=payload) - - self.logger.debug("override FP pressure broadcast interval") - - # Send message - received_message = self.can_interface.send(message) - - # If there is content... - if received_message is not None: - # self.logger.debug(received_message) - if reset == RESET: - str_res = "reset back to normal: " - else: - str_res = str(ms) + " ms: " - self.logger.debug("FP 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] - else: - self.logger.debug("Timeout!!!!") - return False \ No newline at end of file + sensor_name = FPPressureSensorNames(sensor).name.split('_')[0] + return cmd_generic_override( + payload = payload, + reset = reset, + channel_id = DenaliChannels.dialin_to_fp_ch_id, + msg_id = MsgIds.MSG_ID_FP_PRESSURE_OVERRIDE_REQUEST, + entity_name = f'TD {sensor_name} Pressure Sensor pressure', + override_text = f'{str(pressure)} psi', + logger = self.logger, + can_interface = self.can_interface) Index: leahi_dialin/fp/modules/ro_pump.py =================================================================== diff -u -rec8a2600b9e8cf6fe7e02c200a1c24221ca86863 -ra291930ba38e329e2b373f6d2b2a7564a6b7a09a --- leahi_dialin/fp/modules/ro_pump.py (.../ro_pump.py) (revision ec8a2600b9e8cf6fe7e02c200a1c24221ca86863) +++ leahi_dialin/fp/modules/ro_pump.py (.../ro_pump.py) (revision a291930ba38e329e2b373f6d2b2a7564a6b7a09a) @@ -7,26 +7,25 @@ # # @file ro_pump.py # -# @author (last) Micahel Garthwaite -# @date (last) 17-Aug-2023 +# @author (last) Zoltan Miskolci +# @date (last) 09-Jan-2026 # @author (original) Peter Lucia # @date (original) 02-Apr-2020 # ############################################################################ + import struct -from enum import unique from logging import Logger -from enum import unique -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.constants import NO_RESET from leahi_dialin.common.fp_defs import ROPumpNames, FPPumpAttributes -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.common.msg_defs import MsgIds, MsgFieldPositions +from leahi_dialin.common.override_templates import cmd_generic_broadcast_interval_override, cmd_generic_override +from leahi_dialin.protocols.CAN import DenaliChannels +from leahi_dialin.utils.base import AbstractSubSystem, publish from leahi_dialin.utils.conversions import integer_to_bytearray, float_to_bytearray + class FPROPump(AbstractSubSystem): """ Dialin API sub-class for FP RO pump controller related commands. @@ -62,6 +61,7 @@ self.ro_pump_timestamp = 0.0 + @publish(["msg_id_fp_ro_pump_data", "ro_pump", "ro_pump_timestamp" ]) def _handler_pump_sync(self, message, timestamp=0.0): """ @@ -71,7 +71,6 @@ @param message: published FP ro pump data message @return: none """ - self.ro_pump[ROPumpNames.P12_PUMP.name][FPPumpAttributes.STATE.name] = struct.unpack('i', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_1:MsgFieldPositions.END_POS_FIELD_1]))[0] self.ro_pump[ROPumpNames.P12_PUMP.name][FPPumpAttributes.DUTY_CYCLE.name] = struct.unpack('i', bytearray( @@ -93,6 +92,7 @@ self.ro_pump_timestamp = timestamp + def cmd_ro_pump_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: """ Constructs and sends the FP RO pump broadcast interval override command @@ -104,38 +104,16 @@ @param reset: integer - 1 to reset a previous override, 0 to override @return: 1 if successful, zero otherwise """ + return cmd_generic_broadcast_interval_override( + ms = ms, + reset = reset, + channel_id = DenaliChannels.dialin_to_fp_ch_id, + msg_id = MsgIds.MSG_ID_FP_RO_PUMP_PUBLISH_INTERVAL_OVERRIDE_REQUEST, + module_name = 'FP RO Pump', + logger = self.logger, + can_interface = self.can_interface) - if not check_broadcast_interval_override_ms(ms): - return False - rst = integer_to_bytearray(reset) - mis = integer_to_bytearray(ms) - payload = rst + mis - - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_fp_ch_id, - message_id=MsgIds.MSG_ID_FP_RO_PUMP_PUBLISH_INTERVAL_OVERRIDE_REQUEST.value, - payload=payload) - - self.logger.debug("override FP pump broadcast interval") - - # Send message - received_message = self.can_interface.send(message) - - # If there is content... - if received_message is not None: - # self.logger.debug(received_message) - if reset == RESET: - str_res = "reset back to normal" - else: - str_res = str(mis) - - self.logger.debug("broadcast overridden to " + str_res) - # response payload is OK or not OK - return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] - else: - self.logger.debug("Timeout!!!!") - return False - def cmd_ro_pump_target_pressure_override(self, pressure: float, reset: int = NO_RESET) -> int: """ Constructs and sends the target pressure override for the RO pump. This will drive @@ -151,29 +129,17 @@ prs = float_to_bytearray(pressure) payload = rst + prs - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_fp_ch_id, - message_id=MsgIds.MSG_ID_FP_RO_PUMP_TARGET_PRESSURE_OVERRIDE_REQUEST.value, - payload=payload) + return cmd_generic_override( + payload = payload, + reset = reset, + channel_id = DenaliChannels.dialin_to_fp_ch_id, + msg_id = MsgIds.MSG_ID_FP_RO_PUMP_TARGET_PRESSURE_OVERRIDE_REQUEST, + entity_name = f'FP P12 RO Pump target pressure', + override_text = f'{str(pressure)} psi', + logger = self.logger, + can_interface = self.can_interface) - self.logger.debug("override RO pump target pressure") - # Send message - received_message = self.can_interface.send(message) - - # If there is content... - if received_message is not None: - if reset == RESET: - str_res = "reset back to normal" - else: - str_res = str(pressure) - - self.logger.debug("RO target pressure overridden to " + str_res) - # response payload is OK or not OK - return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] - else: - self.logger.debug("Timeout!!!!") - return False - def cmd_ro_pump_target_flow_override(self, flow: int, reset: int = NO_RESET) -> int: """ Constructs and sends the target flow override for the RO pump. This will drive @@ -189,29 +155,17 @@ flw = integer_to_bytearray(flow) payload = rst + flw - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_fp_ch_id, - message_id=MsgIds.MSG_ID_FP_RO_PUMP_TARGET_FLOW_OVERRIDE_REQUEST.value, - payload=payload) + return cmd_generic_override( + payload = payload, + reset = reset, + channel_id = DenaliChannels.dialin_to_fp_ch_id, + msg_id = MsgIds.MSG_ID_FP_RO_PUMP_TARGET_FLOW_OVERRIDE_REQUEST, + entity_name = f'FP P12 RO Pump target flow', + override_text = f'{str(flow)}', + logger = self.logger, + can_interface = self.can_interface) - self.logger.debug("override RO pump target flow") - # Send message - received_message = self.can_interface.send(message) - - # If there is content... - if received_message is not None: - if reset == RESET: - str_res = "reset back to normal" - else: - str_res = str(flow) - - self.logger.debug("RO target flow overridden to " + str_res) - # response payload is OK or not OK - return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] - else: - self.logger.debug("Timeout!!!!") - return False - def cmd_ro_pump_target_pwm_override(self, duty_cycle: float, reset: int = NO_RESET) -> int: """ Constructs and sends the target duty cycle override for the RO pump. This will drive @@ -227,29 +181,17 @@ pwm = float_to_bytearray(duty_cycle) payload = rst + pwm - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_fp_ch_id, - message_id=MsgIds.MSG_ID_FP_RO_PUMP_TARGET_PWM_OVERRIDE_REQUEST.value, - payload=payload) + return cmd_generic_override( + payload = payload, + reset = reset, + channel_id = DenaliChannels.dialin_to_fp_ch_id, + msg_id = MsgIds.MSG_ID_FP_RO_PUMP_TARGET_PWM_OVERRIDE_REQUEST, + entity_name = f'FP P12 RO Pump target PWM', + override_text = f'{str(duty_cycle)}', + logger = self.logger, + can_interface = self.can_interface) - self.logger.debug("override RO pump target pwm") - # Send message - received_message = self.can_interface.send(message) - - # If there is content... - if received_message is not None: - if reset == RESET: - str_res = "reset back to normal" - else: - str_res = str(duty_cycle) - - self.logger.debug("RO target pwm overridden to " + str_res) - # response payload is OK or not OK - return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] - else: - self.logger.debug("Timeout!!!!") - return False - def cmd_ro_pump_set_hard_stop(self) -> int: """ Constructs and sends the hard stop for the RO pump. This will stop @@ -259,20 +201,12 @@ @return: 1 if successful, zero otherwise """ - - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_fp_ch_id, - message_id=MsgIds.MSG_ID_FP_RO_PUMP_STOP_REQUEST.value) - - self.logger.debug("hard stopping RO pump") - - # Send message - received_message = self.can_interface.send(message) - - # If there is content... - if received_message is not None: - self.logger.debug(" RO pump stopped ") - # response payload is OK or not OK - return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] - else: - self.logger.debug("Timeout!!!!") - return False + return cmd_generic_override( + payload = None, + reset = NO_RESET, + channel_id = DenaliChannels.dialin_to_fp_ch_id, + msg_id = MsgIds.MSG_ID_FP_RO_PUMP_STOP_REQUEST, + entity_name = f'FP P12 RO Pump hard stop', + override_text = f'Active', + logger = self.logger, + can_interface = self.can_interface) Index: leahi_dialin/fp/modules/temperatures.py =================================================================== diff -u -ra6c8026470fbbead9a90b727be257d3076397670 -ra291930ba38e329e2b373f6d2b2a7564a6b7a09a --- leahi_dialin/fp/modules/temperatures.py (.../temperatures.py) (revision a6c8026470fbbead9a90b727be257d3076397670) +++ leahi_dialin/fp/modules/temperatures.py (.../temperatures.py) (revision a291930ba38e329e2b373f6d2b2a7564a6b7a09a) @@ -7,22 +7,22 @@ # # @file temperature_sensors.py # -# @author (last) Micahel Garthwaite -# @date (last) 28-Jul-2023 +# @author (last) Zoltan Miskolci +# @date (last) 09-Jan-2026 # @author (original) Dara Navaei # @date (original) 01-Dec-2021 # ############################################################################ + import struct -from enum import unique from logging import Logger -from .constants import NO_RESET, RESET -from leahi_dialin.common.fp_defs import FPTemperaturesNames, BETA_CONDUCTIVITY_SENSOR_OFFSET, BETA_FLOW_SENSOR_OFFSET, BETA_IO_PRES_SENSOR_OFFSET, BETA_FP_PRES_SENSOR_OFFSET +from leahi_dialin.common.constants import NO_RESET +from leahi_dialin.common.fp_defs import FPTemperaturesNames, BETA_IOFP_COND_SENSOR_OFFSET, BETA_IOFP_PRES_SENSOR_OFFSET from leahi_dialin.common.msg_defs import MsgIds, MsgFieldPositions -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.common.override_templates import cmd_generic_broadcast_interval_override, cmd_generic_override +from leahi_dialin.protocols.CAN import DenaliChannels +from leahi_dialin.utils.base import AbstractSubSystem, publish from leahi_dialin.utils.conversions import integer_to_bytearray, float_to_bytearray @@ -54,6 +54,7 @@ FPTemperaturesNames.P46_TEMP.name: 0.0 } + @publish(["msg_id_fp_temperature_data", "fp_temperatures", "fp_temperatures_timestamp"]) def _handler_temperature_sensors_sync(self, message,timestamp=0.0): """ @@ -91,6 +92,7 @@ self.fp_temperature_sensors_timestamp = timestamp + def cmd_temperatures_data_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: """ Constructs and sends broadcast time interval. @@ -102,30 +104,16 @@ @param reset: (int) 1 to reset a previous override, 0 to override @returns 1 if successful, zero otherwise """ - if not check_broadcast_interval_override_ms(ms): - return False + return cmd_generic_broadcast_interval_override( + ms = ms, + reset = reset, + channel_id = DenaliChannels.dialin_to_fp_ch_id, + msg_id = MsgIds.MSG_ID_FP_TEMPERATURE_SENSOR_PUBLISH_INTERVAL_OVERRIDE_REQUEST, + module_name = 'FP Temperature Sensors', + logger = self.logger, + can_interface = self.can_interface) - reset_value = integer_to_bytearray(reset) - interval_value = integer_to_bytearray(ms) - payload = reset_value + interval_value - message = DenaliMessage.build_message( - channel_id=DenaliChannels.dialin_to_fp_ch_id, - message_id=MsgIds.MSG_ID_FP_TEMPERATURE_SENSOR_PUBLISH_INTERVAL_OVERRIDE_REQUEST.value, - payload=payload) - - self.logger.debug("Sending {} ms publish interval to the Temperature Sensors module".format(ms)) - # Send message - received_message = self.can_interface.send(message) - - # If there is content in message - if received_message is not None: - # Response payload is OK or not - return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] - else: - self.logger.debug("Timeout!!!!") - return False - def cmd_temperatures_value_override(self, sensor_index: int, sensor_value: float, reset: int = NO_RESET) -> int: """ Constructs and sends the value override of a temperature sensor. @@ -137,49 +125,35 @@ @param sensor_value: (float) Value of the sensor to override @param reset: (int) whether to reset the override value. The default is NO_RESET @returns 1 if successful, zero otherwise - """ - rst = integer_to_bytearray(reset) - value = float_to_bytearray(sensor_value) + # FP Conductivity Sensors' Temperature Override - if FPTemperaturesNames.P10_TEMP.value <= sensor_index <= FPTemperaturesNames.P19_TEMP.value: - index = integer_to_bytearray(sensor_index + BETA_CONDUCTIVITY_SENSOR_OFFSET) - payload = rst + value + index - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_fp_ch_id, - message_id=MsgIds.MSG_ID_FP_CONDUCTIVITY_TEMP_OVERRIDE_REQUEST.value, - payload=payload) + if FPTemperaturesNames.FIRST_CONDUCTIVITY_SENSOR.value <= sensor_index <= FPTemperaturesNames.LAST_CONDUCTIVITY_SENSOR.value: + index = integer_to_bytearray(sensor_index - FPTemperaturesNames.FIRST_CONDUCTIVITY_SENSOR.value + BETA_IOFP_COND_SENSOR_OFFSET) + msg_id = MsgIds.MSG_ID_FP_CONDUCTIVITY_TEMP_OVERRIDE_REQUEST + # FP Flow Sensors' Temperature Override - elif FPTemperaturesNames.P7_TEMP.value <= sensor_index < FPTemperaturesNames.NUM_OF_TEMPERATURE_SENSORS.value: - index = integer_to_bytearray(sensor_index - BETA_FLOW_SENSOR_OFFSET) - payload = rst + value + index - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_fp_ch_id, - message_id=MsgIds.MSG_ID_FP_FLOW_TEMP_OVERRIDE_REQUEST.value, - payload=payload) - # IO Pressure Sensors' Temperature Override - elif FPTemperaturesNames.M1_TEMP.value <= sensor_index <= FPTemperaturesNames.M3_TEMP.value: - index = integer_to_bytearray(sensor_index + BETA_IO_PRES_SENSOR_OFFSET) - payload = rst + value + index - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_fp_ch_id, - message_id=MsgIds.MSG_ID_FP_PRESSURE_TEMP_OVERRIDE_REQUEST.value, - payload=payload) + elif FPTemperaturesNames.FIRST_FLOW_SENSOR.value <= sensor_index < FPTemperaturesNames.LAST_FLOW_SENSOR.value: + index = integer_to_bytearray(sensor_index - FPTemperaturesNames.FIRST_FLOW_SENSOR.value) + msg_id = MsgIds.MSG_ID_FP_FLOW_TEMP_OVERRIDE_REQUEST + # FP Pressure Sensors' Temperature Override else: - index = integer_to_bytearray(sensor_index + BETA_FP_PRES_SENSOR_OFFSET) - payload = rst + value + index - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_fp_ch_id, - message_id=MsgIds.MSG_ID_FP_PRESSURE_TEMP_OVERRIDE_REQUEST.value, - payload=payload) - - self.logger.debug("Setting sensor {} to {} C".format(FPTemperaturesNames[str(sensor_index)].name, sensor_value)) - - # Send message - received_message = self.can_interface.send(message) - - # If there is content in message - if received_message is not None: - # Response payload is OK or not - return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] - else: - self.logger.debug("Timeout!!!!") - return False \ No newline at end of file + index = integer_to_bytearray(sensor_index - FPTemperaturesNames.FIRST_PRESSURE_SENSOR.value + BETA_IOFP_PRES_SENSOR_OFFSET) + msg_id = MsgIds.MSG_ID_FP_PRESSURE_TEMP_OVERRIDE_REQUEST + + rst = integer_to_bytearray(reset) + value = float_to_bytearray(sensor_value) + payload = rst + value + index + + valve_name = FPTemperaturesNames(sensor_index).name.split('_')[0] + return cmd_generic_override( + payload = payload, + reset = reset, + channel_id = DenaliChannels.dialin_to_fp_ch_id, + msg_id = msg_id, + entity_name = f'FP {valve_name} Temperature Sensor temperature', + override_text = str(sensor_value), + logger = self.logger, + can_interface = self.can_interface) Index: leahi_dialin/fp/modules/valves.py =================================================================== diff -u -ree0ca62a34e13183d43fb3830b774f3fed9989b6 -ra291930ba38e329e2b373f6d2b2a7564a6b7a09a --- leahi_dialin/fp/modules/valves.py (.../valves.py) (revision ee0ca62a34e13183d43fb3830b774f3fed9989b6) +++ leahi_dialin/fp/modules/valves.py (.../valves.py) (revision a291930ba38e329e2b373f6d2b2a7564a6b7a09a) @@ -8,23 +8,22 @@ # @file valves.py # # @author (last) Zoltan Miskolci -# @date (last) 08-Dec-2025 +# @date (last) 09-Jan-2026 # @author (original) Peman Montazemi # @date (original) 19-May-2020 # ############################################################################ import struct -from enum import unique from logging import Logger from collections import OrderedDict -from .constants import NO_RESET +from leahi_dialin.common.constants import NO_RESET from leahi_dialin.common.fp_defs import FPValveStates, FPValveNames, BETA_IOFP_VALVE_OFFSET from leahi_dialin.common.msg_defs import MsgIds +from leahi_dialin.common.override_templates import cmd_generic_broadcast_interval_override, cmd_generic_override 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.base import AbstractSubSystem, publish from leahi_dialin.utils.conversions import integer_to_bytearray @@ -46,10 +45,8 @@ def __init__(self, can_interface, logger: Logger): """ - @param can_interface: Denali CAN Messenger object """ - super().__init__() self.can_interface = can_interface self.logger = logger @@ -77,6 +74,7 @@ for valve in FPValveNames.__members__: self.valves_sensed_states[valve] = '' + def get_valve_states(self): """ Gets the valve states @@ -93,7 +91,38 @@ self.p39_valv.get("state"), self.p6_valv.get("state") ] + + + @staticmethod + def sort_by_id(observation): + """ + Converts a published dictionary of valve state information to an ordered list + of tuples. + @param observation: dictionary of the observed valve states + @return: a list of tuples of the valve states + """ + result = [] + for key, value in observation.items(): + if isinstance(value, dict): + result.append((key, value.get("id", None), value.get("state", None))) + + result = sorted(result, key=lambda each: each[1]) + return result + + + @staticmethod + def _binary_to_valve_state(binary) -> bool: + """ + @param binary: binary value + @return: 1 = energized, otherwise de-energized + """ + if binary != 0: + return ENERGIZED + else: + return DEENERGIZED + + @publish([ "msg_id_fp_valves_states_data", "valve_states_all", @@ -115,7 +144,6 @@ @param message: published FP valves states message @return: none """ - # Extract each valve state from U08 valves states using bit-masking io_valves = struct.unpack('B', bytearray(message['message'][self.START_IO_VALVES_STATES:self.END_IO_VALVES_STATES])) self.m4_valv["state"] = self._binary_to_valve_state(io_valves[0] & 1) @@ -143,35 +171,27 @@ self.fp_valves_states_timestamp = timestamp - @staticmethod - def sort_by_id(observation): - """ - Converts a published dictionary of valve state information to an ordered list - of tuples. - @param observation: dictionary of the observed valve states - @return: a list of tuples of the valve states + def cmd_valve_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: """ + Constructs and sends the FP valve state override command. + Constraints: + Must be logged into FP. + Given interval must be non-zero and a multiple of the FP general task interval (50 ms). - result = [] - for key, value in observation.items(): - if isinstance(value, dict): - result.append((key, value.get("id", None), value.get("state", None))) - - result = sorted(result, key=lambda each: each[1]) - return result - - @staticmethod - def _binary_to_valve_state(binary) -> bool: + @param ms: unsigned int - broadcast interval (in ms) + @param reset: integer - 1 to reset a previous override, 0 to override + @return: 1 if successful, zero otherwise """ - @param binary: binary value - @return: 1 = energized, otherwise de-energized - """ + return cmd_generic_broadcast_interval_override( + ms = ms, + reset = reset, + channel_id = DenaliChannels.dialin_to_fp_ch_id, + msg_id = MsgIds.MSG_ID_FP_VALVE_PUBLISH_INTERVAL_OVERRIDE_REQUEST, + module_name = 'FP Valves', + logger = self.logger, + can_interface = self.can_interface) - if binary != 0: - return ENERGIZED - else: - return DEENERGIZED def cmd_valve_sensed_state_override(self, valve: int, state: bool, reset: int = NO_RESET) -> int: """ @@ -185,29 +205,23 @@ @param reset: integer - 1 to reset a previous override, 0 to override @return: 1 if successful, zero otherwise """ - rst = integer_to_bytearray(reset) ste = integer_to_bytearray(int(state)) vlv = integer_to_bytearray(valve) payload = rst + ste + vlv - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_fp_ch_id, - message_id=MsgIds.MSG_ID_FP_VALVE_SENSED_STATE_OVERRIDE_REQUEST.value, - payload=payload) + valve_name = FPValveNames(valve).name.split('_')[0] + return cmd_generic_override( + payload = payload, + reset = reset, + channel_id = DenaliChannels.dialin_to_fp_ch_id, + msg_id = MsgIds.MSG_ID_FP_VALVE_SENSED_STATE_OVERRIDE_REQUEST, + entity_name = f'FP {valve_name} Valve sensed state', + override_text = str(state), + logger = self.logger, + can_interface = self.can_interface) - self.logger.debug("Override valve sensed state") - # 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.debug("Timeout!!!!") - return False - def cmd_valve_override(self, valve: int, state: int, reset: int = NO_RESET) -> int: """ Constructs and sends the FP valve state override command. @@ -220,62 +234,18 @@ @param reset: integer - 1 to reset a previous override, 0 to override @return: 1 if successful, zero otherwise """ - rst = integer_to_bytearray(reset) ste = integer_to_bytearray(int(state)) vlv = integer_to_bytearray(valve + BETA_IOFP_VALVE_OFFSET) payload = rst + ste + vlv - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_fp_ch_id, - message_id=MsgIds.MSG_ID_FP_VALVE_CMD_STATE_OVERRIDE_REQUEST.value, - payload=payload) - - self.logger.debug("Override valve state") - - # 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.debug("Timeout!!!!") - return False - - def cmd_valve_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: - """ - Constructs and sends the FP valve state override command. - Constraints: - Must be logged into FP. - Given interval must be non-zero and a multiple of the FP 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 - @return: 1 if successful, zero otherwise - - """ - - if not check_broadcast_interval_override_ms(ms): - return False - - rst = integer_to_bytearray(reset) - ivl = integer_to_bytearray(ms) - payload = rst + ivl - - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_fp_ch_id, - message_id=MsgIds.MSG_ID_FP_VALVE_PUBLISH_INTERVAL_OVERRIDE_REQUEST.value, - payload=payload) - - self.logger.debug("override FP valves states publish interval") - - # Send message - received_message = self.can_interface.send(message) - - # If there is content in message - if received_message is not None: - # Response payload is OK or not - return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] - else: - self.logger.debug("Timeout!!!!") - return False + valve_name = FPValveNames(valve).name.split('_')[0] + return cmd_generic_override( + payload = payload, + reset = reset, + channel_id = DenaliChannels.dialin_to_fp_ch_id, + msg_id = MsgIds.MSG_ID_FP_VALVE_CMD_STATE_OVERRIDE_REQUEST, + entity_name = f'FP {valve_name} Valve state', + override_text = str(state), + logger = self.logger, + can_interface = self.can_interface) Index: leahi_dialin/fp/modules/water_pumps.py =================================================================== diff -u -r77740bc2ccace473a471515cadd4bc1353360cd6 -ra291930ba38e329e2b373f6d2b2a7564a6b7a09a --- leahi_dialin/fp/modules/water_pumps.py (.../water_pumps.py) (revision 77740bc2ccace473a471515cadd4bc1353360cd6) +++ leahi_dialin/fp/modules/water_pumps.py (.../water_pumps.py) (revision a291930ba38e329e2b373f6d2b2a7564a6b7a09a) @@ -7,21 +7,21 @@ # # @file water_pumps.py # -# @author (last) Micahel Garthwaite -# @date (last) 17-Aug-2023 +# @author (last) Zoltan Miskolci +# @date (last) 09-Jan-2026 # @author (original) Peter Lucia # @date (original) 02-Apr-2020 # ############################################################################ -import struct -from enum import unique + from logging import Logger -from .constants import RESET, NO_RESET -from leahi_dialin.common.msg_defs import MsgIds, MsgFieldPositions -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.common.constants import NO_RESET +from leahi_dialin.common.fp_defs import FPPumpNames +from leahi_dialin.common.msg_defs import MsgIds +from leahi_dialin.common.override_templates import cmd_generic_override +from leahi_dialin.protocols.CAN import DenaliChannels +from leahi_dialin.utils.base import AbstractSubSystem from leahi_dialin.utils.conversions import integer_to_bytearray, float_to_bytearray @@ -40,6 +40,7 @@ # no current registered call back methods + def cmd_pump_set_speed_rate_override(self, pump: int, rpm: int, reset: int = NO_RESET) -> int: """ Constructs and sends the boost pump set speed rate command @@ -54,29 +55,18 @@ pmp = integer_to_bytearray(pump) payload = rst + rpm + pmp - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_fp_ch_id, - message_id=MsgIds.MSG_ID_FP_FLUID_PUMP_SPEED_OVERRIDE_REQUEST.value, - payload=payload) + pump_name = FPPumpNames(pump).name + return cmd_generic_override( + payload = payload, + reset = reset, + channel_id = DenaliChannels.dialin_to_fp_ch_id, + msg_id = MsgIds.MSG_ID_FP_FLUID_PUMP_SPEED_OVERRIDE_REQUEST, + entity_name = f'FP {pump_name} Water Pump speed', + override_text = str(rpm), + logger = self.logger, + can_interface = self.can_interface) - self.logger.debug("override pump set speed rate point") - # Send message - received_message = self.can_interface.send(message) - - # If there is content... - if received_message is not None: - if reset == RESET: - str_res = "reset back to normal" - else: - str_res = str(rpm) - - self.logger.debug("rpm overridden to " + str_res) - # response payload is OK or not OK - return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] - else: - self.logger.debug("Timeout!!!!") - return False - def cmd_pump_set_pwm_request(self, pump: int, pwm: int) -> int: """ Constructs and sends set pwm request for FP pumps \n @@ -88,30 +78,22 @@ @param pwm: integer - counts to override the pwm ( 0 - 500 ) @return: 1 if successful, zero otherwise """ - spd = integer_to_bytearray(pwm) pmp = integer_to_bytearray(pump) payload = pmp + spd - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_fp_ch_id, - message_id=MsgIds.MSG_ID_FP_FLUID_PUMP_SET_PWM_REQUEST.value, - payload=payload) + pump_name = FPPumpNames(pump).name + return cmd_generic_override( + payload = payload, + reset = NO_RESET, + channel_id = DenaliChannels.dialin_to_fp_ch_id, + msg_id = MsgIds.MSG_ID_FP_FLUID_PUMP_SET_PWM_REQUEST, + entity_name = f'FP {pump_name} Water Pump PWM', + override_text = str(pwm), + logger = self.logger, + can_interface = self.can_interface) - 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 set to " + str(pwm)) - # response payload is OK or not OK - return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] - else: - self.logger.debug("Timeout!!!!") - return False - def cmd_pump_read_pwm_override(self, pump: int, pwm: float, reset: int = NO_RESET) -> int: """ Constructs and sends the read pwm override for the FP pumps \n @@ -123,31 +105,18 @@ @param reset: integer - 1 to reset a previous override, 0 to override @return: 1 if successful, zero otherwise """ - rst = integer_to_bytearray(reset) rpwm = float_to_bytearray(pwm) pmp = integer_to_bytearray(pump) payload = rst + rpwm + pmp - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_fp_ch_id, - message_id=MsgIds.MSG_ID_FP_FLUID_PUMP_READ_PWM_OVERRIDE_REQUEST.value, - payload=payload) - - 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: - if reset == RESET: - str_res = "reset back to normal" - else: - str_res = str(rpwm) - - self.logger.debug("pwm overridden to " + str_res) - # response payload is OK or not OK - return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] - else: - self.logger.debug("Timeout!!!!") - return False \ No newline at end of file + pump_name = FPPumpNames(pump).name + return cmd_generic_override( + payload = payload, + reset = reset, + channel_id = DenaliChannels.dialin_to_fp_ch_id, + msg_id = MsgIds.MSG_ID_FP_FLUID_PUMP_SET_PWM_REQUEST, + entity_name = f'FP {pump_name} Water Pump read PWM', + override_text = str(pwm), + logger = self.logger, + can_interface = self.can_interface) Index: leahi_dialin/fp/proxies/dd_proxy.py =================================================================== diff -u -r68422d08c4141999a13496343264483a32314d37 -ra291930ba38e329e2b373f6d2b2a7564a6b7a09a --- leahi_dialin/fp/proxies/dd_proxy.py (.../dd_proxy.py) (revision 68422d08c4141999a13496343264483a32314d37) +++ leahi_dialin/fp/proxies/dd_proxy.py (.../dd_proxy.py) (revision a291930ba38e329e2b373f6d2b2a7564a6b7a09a) @@ -7,19 +7,19 @@ # # @file dd_proxy.py # -# @author (last) Micahel Garthwaite -# @date (last) 18-Aug-2023 +# @author (last) Zoltan Miskolci +# @date (last) 09-Jan-2026 # @author (original) Peter Lucia # @date (original) 02-Apr-2020 # ############################################################################ -import struct + from logging import Logger -from leahi_dialin.common.msg_defs import MsgIds, MsgFieldPositions +from leahi_dialin.common.msg_defs import MsgIds from leahi_dialin.protocols.CAN import DenaliMessage, DenaliCanMessenger, DenaliChannels -from leahi_dialin.utils.base import AbstractSubSystem, publish -from leahi_dialin.utils.conversions import integer_to_bytearray, byte_to_bytearray, float_to_bytearray +from leahi_dialin.utils.base import AbstractSubSystem +from leahi_dialin.utils.conversions import integer_to_bytearray, float_to_bytearray class DDProxy(AbstractSubSystem): @@ -33,13 +33,13 @@ @param can_interface: the Denali CAN interface object """ - super().__init__() self.can_interface = can_interface self.logger = logger # no current registered call back methods + def cmd_dd_send_ro_start_stop_request(self, cmdID: int = 0, start: bool = 0, ro_rate: float = 0): """ Constructs and sends a DD command request to the FP. @@ -53,10 +53,10 @@ stt = integer_to_bytearray(start) rtt = float_to_bytearray(ro_rate) payload = cmd + stt + rtt + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_fp_ch_id, message_id=MsgIds.MSG_ID_DD_FP_START_STOP_CMD_REQUEST.value, payload=payload) self.logger.debug("Sending DD start stop request to FP.") self.can_interface.send(message, 0) -