Index: leahi_dialin/fp/modules/valves.py =================================================================== diff -u -r90f9b4334fd2c3e51dbe204b3b5e224ce5e88588 -r1f2bf6d939eb4033dbedb7d7005494cc12fccbc6 --- leahi_dialin/fp/modules/valves.py (.../valves.py) (revision 90f9b4334fd2c3e51dbe204b3b5e224ce5e88588) +++ leahi_dialin/fp/modules/valves.py (.../valves.py) (revision 1f2bf6d939eb4033dbedb7d7005494cc12fccbc6) @@ -8,22 +8,27 @@ # @file valves.py # # @author (last) Zoltan Miskolci -# @date (last) 09-Jan-2026 +# @date (last) 05-May-2026 # @author (original) Peman Montazemi # @date (original) 19-May-2020 # ############################################################################ +# Module imports import struct from logging import Logger from collections import OrderedDict +# Project imports from leahi_dialin.common.constants import NO_RESET -from leahi_dialin.common.fp_defs import fp_enum_repository, BETA_IOFP_VALVE_OFFSET +from leahi_dialin.common import fp_enum_repository +from leahi_dialin.common.generic_defs import DataTypes +from leahi_dialin.common.fp_defs import 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 +from leahi_dialin.protocols.CAN import CanMessenger, CanMessage, CanChannels +from leahi_dialin.utils.abstract_classes import AbstractSubSystem +from leahi_dialin.utils.base import publish from leahi_dialin.utils.conversions import integer_to_bytearray @@ -38,59 +43,42 @@ """ # Valves states publish message field positions - START_IO_VALVES_STATES = DenaliMessage.PAYLOAD_START_INDEX + START_IO_VALVES_STATES = CanMessage.PAYLOAD_START_INDEX END_IO_VALVES_STATES = START_IO_VALVES_STATES + 1 # IO Valves States come in as a U08 value (1 byte) START_FP_VALVES_STATES = END_IO_VALVES_STATES END_FP_VALVES_STATES = START_FP_VALVES_STATES + 1 # FP Valves States come in as a U08 value (1 byte) - def __init__(self, can_interface, logger: Logger): + def __init__(self, can_interface: CanMessenger, logger: Logger): """ - @param can_interface: Denali CAN Messenger object + @param can_interface: Can Messenger object """ super().__init__() self.can_interface = can_interface self.logger = logger - self.valves_sensed_states = OrderedDict() - self.fp_valves_states_timestamp = 0.0 if self.can_interface is not None: - channel_id = DenaliChannels.fp_sync_broadcast_ch_id - self.msg_id_fp_valves_states_data = MsgIds.MSG_ID_FP_VALVES_STATES_DATA.value - self.can_interface.register_receiving_publication_function(channel_id, self.msg_id_fp_valves_states_data, self._handler_valves_sync) + self.can_interface.register_receiving_publication_function(channel_id = CanChannels.fp_sync_broadcast_ch_id, + message_id = MsgIds.MSG_ID_FP_VALVES_STATES_DATA.value, + function = self._handler_valves_sync) - self.valve_states_all = 0x0000 - self.m4_valv = {"id": fp_enum_repository.FPValveNames.M4_VALV.value, "state": DEENERGIZED} - self.m12_valv = {"id": fp_enum_repository.FPValveNames.M12_VALV.value, "state": DEENERGIZED} - self.p11_valv = {"id": fp_enum_repository.FPValveNames.P11_VALV.value, "state": DEENERGIZED} - self.p33_valv = {"id": fp_enum_repository.FPValveNames.P33_VALV.value, "state": DEENERGIZED} - self.p34_valv = {"id": fp_enum_repository.FPValveNames.P34_VALV.value, "state": DEENERGIZED} - self.p37_valv = {"id": fp_enum_repository.FPValveNames.P37_VALV.value, "state": DEENERGIZED} - self.p39_valv = {"id": fp_enum_repository.FPValveNames.P39_VALV.value, "state": DEENERGIZED} - self.p6_valv = {"id": fp_enum_repository.FPValveNames.P6_VALV.value, "state": DEENERGIZED} + self.fp_valves_states_timestamp = 0.0 #: The timestamp of the last message + self.valve_states_all = 0x0000 #: States of all the vales in binary format + self.valves_sensed_states = OrderedDict() #: The Valve's Sensed State data in dictionary format + self.m4_valv = {"id": fp_enum_repository.FPValveNames.M4_VALV.value, "state": DEENERGIZED} #: The M4 valve's value + self.m12_valv = {"id": fp_enum_repository.FPValveNames.M12_VALV.value, "state": DEENERGIZED} #: The M12 valve's value + self.p11_valv = {"id": fp_enum_repository.FPValveNames.P11_VALV.value, "state": DEENERGIZED} #: The P11 valve's value + self.p33_valv = {"id": fp_enum_repository.FPValveNames.P33_VALV.value, "state": DEENERGIZED} #: The P33 valve's value + self.p34_valv = {"id": fp_enum_repository.FPValveNames.P34_VALV.value, "state": DEENERGIZED} #: The P34 valve's value + self.p37_valv = {"id": fp_enum_repository.FPValveNames.P37_VALV.value, "state": DEENERGIZED} #: The P37 valve's value + self.p39_valv = {"id": fp_enum_repository.FPValveNames.P39_VALV.value, "state": DEENERGIZED} #: The P39 valve's value + self.p6_valv = {"id": fp_enum_repository.FPValveNames.P6_VALV.value, "state": DEENERGIZED} #: The P6 valve's value - # NOTE: The len function counts the enums with the same number only once. - self.valve_states_enum = [0 for _ in range(fp_enum_repository.FPValveNames.NUM_OF_FP_VALVES.value - 1)] - - for valve in fp_enum_repository.FPValveNames.__members__: - self.valves_sensed_states[valve] = '' - - - def get_valve_states(self): - """ - Gets the valve states - - @return: All valve states - """ - return [ - self.m4_valv.get("state"), - self.m12_valv.get("state"), - self.p11_valv.get("state"), - self.p33_valv.get("state"), - self.p34_valv.get("state"), - self.p37_valv.get("state"), - self.p39_valv.get("state"), - self.p6_valv.get("state") - ] + #: States of all the vales in list format + self.valve_states_enum = {} + for i in range(0, fp_enum_repository.FPValveNames.NUM_OF_FP_VALVES.value): + valve_name = fp_enum_repository.FPValveNames(i).name + self.valve_states_enum[valve_name] = 0 + self.valves_sensed_states[valve_name] = '' @staticmethod @@ -145,13 +133,13 @@ @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])) + io_valves = struct.unpack(DataTypes.U08.unpack_attrib(), 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) self.m12_valv["state"] = self._binary_to_valve_state(io_valves[0] & 2) self.valve_states_all = io_valves[0] # Extract each valve state from U08 valves states using bit-masking - fp_valves = struct.unpack('B', bytearray(message['message'][self.START_FP_VALVES_STATES:self.END_FP_VALVES_STATES])) + fp_valves = struct.unpack(DataTypes.U08.unpack_attrib(), bytearray(message['message'][self.START_FP_VALVES_STATES:self.END_FP_VALVES_STATES])) self.p11_valv["state"] = self._binary_to_valve_state(fp_valves[0] & 1) self.p33_valv["state"] = self._binary_to_valve_state(fp_valves[0] & 2) self.p34_valv["state"] = self._binary_to_valve_state(fp_valves[0] & 4) @@ -161,16 +149,15 @@ self.valve_states_all += fp_valves[0] << 8 # Updating Valve_states_enum - for i in range(0, fp_enum_repository.FPValveNames.NUM_OF_FP_VALVES.value - 1): - self.valve_states_enum[i] = eval(f'self.{fp_enum_repository.FPValveNames(i).name.lower()}["state"]') + for i in range(0, fp_enum_repository.FPValveNames.NUM_OF_FP_VALVES.value): + valve_name = fp_enum_repository.FPValveNames(i).name + self.valve_states_enum[valve_name] = eval(f'self.{valve_name.lower()}["state"]') # Extract each valve sensed state from U08 valves states using bit-masking start = self.END_FP_VALVES_STATES end = start + 1 for valve_id in self.valves_sensed_states: - if valve_id.lower().startswith('num'): - continue - self.valves_sensed_states[valve_id] = struct.unpack('B', bytearray(message['message'][start:end]))[0] + self.valves_sensed_states[valve_id] = struct.unpack(DataTypes.U08.unpack_attrib(), bytearray(message['message'][start:end]))[0] start = end end += 1 self.fp_valves_states_timestamp = timestamp @@ -190,7 +177,7 @@ return cmd_generic_broadcast_interval_override( ms = ms, reset = reset, - channel_id = DenaliChannels.dialin_to_fp_ch_id, + channel_id = CanChannels.dialin_to_fp_ch_id, msg_id = MsgIds.MSG_ID_FP_VALVE_PUBLISH_INTERVAL_OVERRIDE_REQUEST, module_name = 'FP Valves', logger = self.logger, @@ -218,7 +205,7 @@ return cmd_generic_override( payload = payload, reset = reset, - channel_id = DenaliChannels.dialin_to_fp_ch_id, + channel_id = CanChannels.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), @@ -247,7 +234,7 @@ return cmd_generic_override( payload = payload, reset = reset, - channel_id = DenaliChannels.dialin_to_fp_ch_id, + channel_id = CanChannels.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),