Index: leahi_dialin/dd/modules/valves.py =================================================================== diff -u -r62640bb1dfcb4279d31719ca933c3ce69bfb46be -r1f2bf6d939eb4033dbedb7d7005494cc12fccbc6 --- leahi_dialin/dd/modules/valves.py (.../valves.py) (revision 62640bb1dfcb4279d31719ca933c3ce69bfb46be) +++ leahi_dialin/dd/modules/valves.py (.../valves.py) (revision 1f2bf6d939eb4033dbedb7d7005494cc12fccbc6) @@ -8,23 +8,28 @@ # @file valves.py # # @author (last) Zoltan Miskolci -# @date (last) 07-Jan-2026 +# @date (last) 04-May-2026 # @author (original) Peman Montazemi # @date (original) 19-May-2020 # ############################################################################ -import struct -from logging import Logger +# Module imports from collections import OrderedDict +from logging import Logger +import struct +# Project imports from leahi_dialin.common.constants import NO_RESET -from leahi_dialin.common.dd_defs import dd_enum_repository +from leahi_dialin.common import dd_enum_repository +from leahi_dialin.common.generic_defs import DataTypes 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.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.abstract_classes import AbstractSubSystem +from leahi_dialin.utils.base import publish from leahi_dialin.utils.conversions import integer_to_bytearray # Valve states @@ -39,74 +44,73 @@ """ # Valves states publish message field positions - START_POS_VALVES_STATES = DenaliMessage.PAYLOAD_START_INDEX + START_POS_VALVES_STATES = CanMessage.PAYLOAD_START_INDEX END_POS_VALVES_STATES = START_POS_VALVES_STATES + 2 # Valves States come in as a U16 value (2 bytes) START_POS_BCV_VALVES_STATES = END_POS_VALVES_STATES END_POS_BCV_VALVES_STATES = START_POS_BCV_VALVES_STATES + 1 START_POS_SPARE_VALVES_STATES = END_POS_BCV_VALVES_STATES END_POS_SPARE_VALVES_STATES = START_POS_SPARE_VALVES_STATES + 1 END_POS_ALL_VALVES = START_POS_VALVES_STATES + 4 - 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.dd_valves_states_timestamp = 0.0 if self.can_interface is not None: - channel_id = DenaliChannels.dd_sync_broadcast_ch_id - self.msg_id_dd_valves_states_data = MsgIds.MSG_ID_DD_VALVES_STATES_DATA.value - self.can_interface.register_receiving_publication_function(channel_id, self.msg_id_dd_valves_states_data, self._handler_valves_sync) + self.can_interface.register_receiving_publication_function(channel_id = CanChannels.dd_sync_broadcast_ch_id, + message_id = MsgIds.MSG_ID_DD_VALVES_STATES_DATA.value, + function = self._handler_valves_sync) - self.valve_states_all = 0x00000000 + self.dd_valves_states_timestamp = 0.0 #: The timestamp of the latest message + self.valve_states_all = 0x00000000 #: States of all the vales in binary format + self.valves_sensed_states = OrderedDict() #: The Valve's Sensed State data in dictionary format + self.d14_valv = {"id": dd_enum_repository.DDValveNames.D14_VALV.value, "state": DEENERGIZED} #: The D14 valve's value + self.d52_valv = {"id": dd_enum_repository.DDValveNames.D52_VALV.value, "state": DEENERGIZED} #: The D52 valve's value + self.d8_valv = {"id": dd_enum_repository.DDValveNames.D8_VALV.value, "state": DEENERGIZED} #: The D8 valve's value + self.d54_valv = {"id": dd_enum_repository.DDValveNames.D54_VALV.value, "state": DEENERGIZED} #: The D54 valve's value + self.d53_valv = {"id": dd_enum_repository.DDValveNames.D53_VALV.value, "state": DEENERGIZED} #: The D53 valve's value + self.d34_valv = {"id": dd_enum_repository.DDValveNames.D34_VALV.value, "state": DEENERGIZED} #: The D34 valve's value + self.d64_valv = {"id": dd_enum_repository.DDValveNames.D64_VALV.value, "state": DEENERGIZED} #: The D64 valve's value + self.d31_valv = {"id": dd_enum_repository.DDValveNames.D31_VALV.value, "state": DEENERGIZED} #: The D31 valve's value + self.d65_valv = {"id": dd_enum_repository.DDValveNames.D65_VALV.value, "state": DEENERGIZED} #: The D65 valve's value + self.d35_valv = {"id": dd_enum_repository.DDValveNames.D35_VALV.value, "state": DEENERGIZED} #: The D35 valve's value + self.d40_valv = {"id": dd_enum_repository.DDValveNames.D40_VALV.value, "state": DEENERGIZED} #: The D40 valve's value + self.d47_valv = {"id": dd_enum_repository.DDValveNames.D47_VALV.value, "state": DEENERGIZED} #: The D47 valve's value + self.d3_valv = {"id": dd_enum_repository.DDValveNames.D3_VALV.value, "state": DEENERGIZED} #: The D3 valve's value + self.d80_valv = {"id": dd_enum_repository.DDValveNames.D80_VALV.value, "state": DEENERGIZED} #: The D80 valve's value + self.d81_valv = {"id": dd_enum_repository.DDValveNames.D81_VALV.value, "state": DEENERGIZED} #: The D81 valve's value + self.d85_valv = {"id": dd_enum_repository.DDValveNames.D85_VALV.value, "state": DEENERGIZED} #: The D85 valve's value - self.d14_valv = {"id": dd_enum_repository.DDValveNames.D14_VALV.value, "state": DEENERGIZED} - self.d52_valv = {"id": dd_enum_repository.DDValveNames.D52_VALV.value, "state": DEENERGIZED} - self.d8_valv = {"id": dd_enum_repository.DDValveNames.D8_VALV.value, "state": DEENERGIZED} - self.d54_valv = {"id": dd_enum_repository.DDValveNames.D54_VALV.value, "state": DEENERGIZED} - self.d53_valv = {"id": dd_enum_repository.DDValveNames.D53_VALV.value, "state": DEENERGIZED} - self.d34_valv = {"id": dd_enum_repository.DDValveNames.D34_VALV.value, "state": DEENERGIZED} - self.d64_valv = {"id": dd_enum_repository.DDValveNames.D64_VALV.value, "state": DEENERGIZED} - self.d31_valv = {"id": dd_enum_repository.DDValveNames.D31_VALV.value, "state": DEENERGIZED} - self.d65_valv = {"id": dd_enum_repository.DDValveNames.D65_VALV.value, "state": DEENERGIZED} - self.d35_valv = {"id": dd_enum_repository.DDValveNames.D35_VALV.value, "state": DEENERGIZED} - self.d40_valv = {"id": dd_enum_repository.DDValveNames.D40_VALV.value, "state": DEENERGIZED} - self.d47_valv = {"id": dd_enum_repository.DDValveNames.D47_VALV.value, "state": DEENERGIZED} - self.d3_valv = {"id": dd_enum_repository.DDValveNames.D3_VALV.value, "state": DEENERGIZED} - self.d80_valv = {"id": dd_enum_repository.DDValveNames.D80_VALV.value, "state": DEENERGIZED} - self.d81_valv = {"id": dd_enum_repository.DDValveNames.D81_VALV.value, "state": DEENERGIZED} - self.d85_valv = {"id": dd_enum_repository.DDValveNames.D85_VALV.value, "state": DEENERGIZED} + self.d23_valv = {"id": dd_enum_repository.DDValveNames.D23_VALV.value, "state": DEENERGIZED} #: The D23 valve's value + self.d19_valv = {"id": dd_enum_repository.DDValveNames.D19_VALV.value, "state": DEENERGIZED} #: The D19 valve's value + self.d25_valv = {"id": dd_enum_repository.DDValveNames.D25_VALV.value, "state": DEENERGIZED} #: The D25 valve's value + self.d21_valv = {"id": dd_enum_repository.DDValveNames.D21_VALV.value, "state": DEENERGIZED} #: The D31 valve's value + self.d24_valv = {"id": dd_enum_repository.DDValveNames.D24_VALV.value, "state": DEENERGIZED} #: The D24 valve's value + self.d20_valv = {"id": dd_enum_repository.DDValveNames.D20_VALV.value, "state": DEENERGIZED} #: The D20 valve's value + self.d26_valv = {"id": dd_enum_repository.DDValveNames.D26_VALV.value, "state": DEENERGIZED} #: The D26 valve's value + self.d22_valv = {"id": dd_enum_repository.DDValveNames.D22_VALV.value, "state": DEENERGIZED} #: The D22 valve's value - self.d23_valv = {"id": dd_enum_repository.DDValveNames.D23_VALV.value, "state": DEENERGIZED} - self.d19_valv = {"id": dd_enum_repository.DDValveNames.D19_VALV.value, "state": DEENERGIZED} - self.d25_valv = {"id": dd_enum_repository.DDValveNames.D25_VALV.value, "state": DEENERGIZED} - self.d21_valv = {"id": dd_enum_repository.DDValveNames.D21_VALV.value, "state": DEENERGIZED} - self.d24_valv = {"id": dd_enum_repository.DDValveNames.D24_VALV.value, "state": DEENERGIZED} - self.d20_valv = {"id": dd_enum_repository.DDValveNames.D20_VALV.value, "state": DEENERGIZED} - self.d26_valv = {"id": dd_enum_repository.DDValveNames.D26_VALV.value, "state": DEENERGIZED} - self.d22_valv = {"id": dd_enum_repository.DDValveNames.D22_VALV.value, "state": DEENERGIZED} + self.d88_d79_valv = {"id": dd_enum_repository.DDValveNames.D88_D79_VALV.value, "state": DEENERGIZED} #: The D88 or D79 valve's value + self.d83_valv = {"id": dd_enum_repository.DDValveNames.D83_VALV.value, "state": DEENERGIZED} #: The D83 valve's value + self.d91_valv = {"id": dd_enum_repository.DDValveNames.D91_VALV.value, "state": DEENERGIZED} #: The D91 valve's value + self.d104_valv = {"id": dd_enum_repository.DDValveNames.D104_VALV.value, "state": DEENERGIZED} #: The D104 valve's value + self.d95_valv = {"id": dd_enum_repository.DDValveNames.D95_VALV.value, "state": DEENERGIZED} #: The D95 valve's value + self.spare5_valv = {"id": dd_enum_repository.DDValveNames.SPARE5_VALV.value, "state": DEENERGIZED} #: The Spare5 valve's value + self.d100_valv = {"id": dd_enum_repository.DDValveNames.D100_VALV.value, "state": DEENERGIZED} #: The D100 valve's value + self.spare7_valv = {"id": dd_enum_repository.DDValveNames.SPARE7_VALV.value, "state": DEENERGIZED} #: The Spare7 valve's value - self.d79_pmp_valv = {"id": dd_enum_repository.DDValveNames.D79_PMP_VALV.value, "state": DEENERGIZED} - self.d83_valv = {"id": dd_enum_repository.DDValveNames.D83_VALV.value, "state": DEENERGIZED} - self.d91_valv = {"id": dd_enum_repository.DDValveNames.D91_VALV.value, "state": DEENERGIZED} - self.spare3_valv = {"id": dd_enum_repository.DDValveNames.SPARE3_VALV.value, "state": DEENERGIZED} - self.spare4_valv = {"id": dd_enum_repository.DDValveNames.SPARE4_VALV.value, "state": DEENERGIZED} - self.spare5_valv = {"id": dd_enum_repository.DDValveNames.SPARE5_VALV.value, "state": DEENERGIZED} - self.d100_valv = {"id": dd_enum_repository.DDValveNames.D100_VALV.value, "state": DEENERGIZED} - self.spare7_valv = {"id": dd_enum_repository.DDValveNames.SPARE7_VALV.value, "state": DEENERGIZED} + #: States of all the vales in list format + self.valve_states_enum = {} + for i in range(0, dd_enum_repository.DDValveNames.NUM_OF_DD_VALVES.value): + valve_name = dd_enum_repository.DDValveNames(i).name + self.valve_states_enum[valve_name] = 0 + self.valves_sensed_states[valve_name] = '' - # NOTE: The len function counts the enums with the same number only once. This is not the case in the DD valves - # class because each valve must have a unique ID. - self.valve_states_enum = [0 for _ in range(dd_enum_repository.DDValveNames.NUM_OF_DD_VALVES.value - 1)] - for valve in dd_enum_repository.DDValveNames.__members__: - self.valves_sensed_states[valve] = '' - - def get_valve_states(self): """ Gets the valve states @@ -140,11 +144,11 @@ self.d26_valv.get("state", None), self.d22_valv.get("state", None), - self.d79_pmp_valv.get("state", None), + self.d88_d79_valv.get("state", None), self.d83_valv.get("state", None), self.d91_valv.get("state", None), - self.spare3_valv.get("state", None), - self.spare4_valv.get("state", None), + self.d104_valv.get("state", None), + self.d95_valv.get("state", None), self.spare5_valv.get("state", None), self.d100_valv.get("state", None), self.spare7_valv.get("state", None) @@ -207,13 +211,13 @@ "d20_valv", "d26_valv", "d22_valv", - "d79_pmp_valv", - "D83_valv", - "D91_valv", - "spare3_valv", - "spare4_valv", + "d88_d79_valv", + "d83_valv", + "d91_valv", + "d104_valv", + "d95_valv", "spare5_valv", - "D100_valv", + "d100_valv", "spare7_valv", "valve_states_enum", "valves_sensed_states", @@ -226,10 +230,10 @@ @param message: published DD valves states message @return: none """ - vsa = struct.unpack('I', bytearray(message['message'][self.START_POS_VALVES_STATES:self.END_POS_ALL_VALVES])) + vsa = struct.unpack(DataTypes.U32.unpack_attrib(), bytearray(message['message'][self.START_POS_VALVES_STATES:self.END_POS_ALL_VALVES])) self.valve_states_all = vsa[0] - vst = struct.unpack('H', bytearray(message['message'][self.START_POS_VALVES_STATES:self.END_POS_VALVES_STATES])) + vst = struct.unpack(DataTypes.U16.unpack_attrib(), bytearray(message['message'][self.START_POS_VALVES_STATES:self.END_POS_VALVES_STATES])) # Extract each valve state from U16 valves states using bit-masking self.d14_valv["state"] = self._binary_to_valve_state(vst[0] & 1) self.d52_valv["state"] = self._binary_to_valve_state(vst[0] & 2) @@ -248,7 +252,7 @@ self.d81_valv["state"] = self._binary_to_valve_state(vst[0] & 16384) self.d85_valv["state"] = self._binary_to_valve_state(vst[0] & 32768) - bcv = struct.unpack('B', bytearray(message['message'][self.START_POS_BCV_VALVES_STATES:self.END_POS_BCV_VALVES_STATES])) + bcv = struct.unpack(DataTypes.U08.unpack_attrib(), bytearray(message['message'][self.START_POS_BCV_VALVES_STATES:self.END_POS_BCV_VALVES_STATES])) self.d23_valv["state"] = self._binary_to_valve_state(bcv[0] & 1) self.d19_valv["state"] = self._binary_to_valve_state(bcv[0] & 2) self.d25_valv["state"] = self._binary_to_valve_state(bcv[0] & 4) @@ -258,28 +262,28 @@ self.d26_valv["state"] = self._binary_to_valve_state(bcv[0] & 64) self.d22_valv["state"] = self._binary_to_valve_state(bcv[0] & 128) - spv = struct.unpack('B', bytearray(message['message'][self.START_POS_SPARE_VALVES_STATES:self.END_POS_SPARE_VALVES_STATES])) - self.d79_pmp_valv["state"] = self._binary_to_valve_state(spv[0] & 1) + spv = struct.unpack(DataTypes.U08.unpack_attrib(), bytearray(message['message'][self.START_POS_SPARE_VALVES_STATES:self.END_POS_SPARE_VALVES_STATES])) + self.d88_d79_valv["state"] = self._binary_to_valve_state(spv[0] & 1) self.d83_valv["state"] = self._binary_to_valve_state(spv[0] & 2) self.d91_valv["state"] = self._binary_to_valve_state(spv[0] & 4) - self.spare3_valv["state"] = self._binary_to_valve_state(spv[0] & 8) - self.spare4_valv["state"] = self._binary_to_valve_state(spv[0] & 16) + self.d104_valv["state"] = self._binary_to_valve_state(spv[0] & 8) + self.d95_valv["state"] = self._binary_to_valve_state(spv[0] & 16) self.spare5_valv["state"] = self._binary_to_valve_state(spv[0] & 32) self.d100_valv["state"] = self._binary_to_valve_state(spv[0] & 64) self.spare7_valv["state"] = self._binary_to_valve_state(spv[0] & 128) # Updating Valve_states_enum - for i in range(0, dd_enum_repository.DDValveNames.NUM_OF_DD_VALVES.value - 1): - self.valve_states_enum[i] = eval(f'self.{dd_enum_repository.DDValveNames(i).name.lower()}["state"]') + for i in range(0, dd_enum_repository.DDValveNames.NUM_OF_DD_VALVES.value): + valve_name = dd_enum_repository.DDValveNames(i).name + self.valve_states_enum[valve_name] = eval(f'self.{valve_name.lower()}["state"]') start = self.END_POS_SPARE_VALVES_STATES end = start + 1 for valve_id in self.valves_sensed_states: - valve_state_number = struct.unpack('B', bytearray(message['message'][start:end]))[0] + valve_state_number = struct.unpack(DataTypes.U08.unpack_attrib(), bytearray(message['message'][start:end]))[0] self.valves_sensed_states[valve_id] = valve_state_number start = end end += 1 - self.dd_valves_states_timestamp = timestamp @@ -297,7 +301,7 @@ return cmd_generic_broadcast_interval_override( ms = ms, reset = reset, - channel_id = DenaliChannels.dialin_to_dd_ch_id, + channel_id = CanChannels.dialin_to_dd_ch_id, msg_id = MsgIds.MSG_ID_DD_VALVE_PUBLISH_INTERVAL_OVERRIDE_REQUEST, module_name = 'DD Valves', logger = self.logger, @@ -325,7 +329,7 @@ return cmd_generic_override( payload = payload, reset = reset, - channel_id = DenaliChannels.dialin_to_dd_ch_id, + channel_id = CanChannels.dialin_to_dd_ch_id, msg_id = MsgIds.MSG_ID_DD_VALVE_SENSED_STATE_OVERRIDE_REQUEST, entity_name = f'DD {valve_name} Valve sensed state', override_text = str(state), @@ -354,7 +358,7 @@ return cmd_generic_override( payload = payload, reset = reset, - channel_id = DenaliChannels.dialin_to_dd_ch_id, + channel_id = CanChannels.dialin_to_dd_ch_id, msg_id = MsgIds.MSG_ID_DD_VALVE_STATE_OVERRIDE_REQUEST, entity_name = f'DD {valve_name} Valve state', override_text = str(state), @@ -405,7 +409,7 @@ return cmd_generic_override( payload = payload, reset = reset, - channel_id = DenaliChannels.dialin_to_dd_ch_id, + channel_id = CanChannels.dialin_to_dd_ch_id, msg_id = MsgIds.MSG_ID_DD_BC_VALVE_STATES_OVERRIDE_REQUEST, entity_name = f'DD Balancing Chamber Valves state', override_text = '', @@ -431,7 +435,7 @@ return cmd_generic_override( payload = payload, reset = NO_RESET, - channel_id = DenaliChannels.dialin_to_dd_ch_id, + channel_id = CanChannels.dialin_to_dd_ch_id, msg_id = MsgIds.MSG_ID_DD_VALVES_OPEN_CLOSE_STATE_OVERRIDE_REQUEST, entity_name = f'DD {valve_name} Valve state', override_text = str(state),