Index: leahi_dialin/td/modules/valves.py =================================================================== diff -u -r62e0f169dcd17b68ab7ec40a3f58f51ace9af24a -re45b20cdc5d4c5dcff8cef530b173ca94cb2e422 --- leahi_dialin/td/modules/valves.py (.../valves.py) (revision 62e0f169dcd17b68ab7ec40a3f58f51ace9af24a) +++ leahi_dialin/td/modules/valves.py (.../valves.py) (revision e45b20cdc5d4c5dcff8cef530b173ca94cb2e422) @@ -8,72 +8,47 @@ # @file valves.py # # @author (last) Zoltan Miskolci -# @date (last) 08-Jan-2026 +# @date (last) 05-May-2026 # @author (original) Dara Navaei # @date (original) 19-Aug-2020 # ############################################################################ -import struct +# Module imports from logging import Logger +# Project imports from leahi_dialin.common.constants import NO_RESET -from leahi_dialin.common.msg_defs import MsgIds +from leahi_dialin.common.generic_defs import DataTypes +from leahi_dialin.common.msg_ids import MsgIds from leahi_dialin.common.override_templates import cmd_generic_broadcast_interval_override, cmd_generic_override from leahi_dialin.common import td_enum_repository -from leahi_dialin.protocols.CAN import DenaliMessage, DenaliChannels -from leahi_dialin.utils.base import AbstractSubSystem, publish +from leahi_dialin.protocols.CAN import CanMessenger, 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 class TDValves(AbstractSubSystem): """ Treatment Delivery (TD) Dialin API sub-class for valves related commands. """ - # Valves states publish message field positions - # Note the MsgFieldPosition was not used since some of the published data are S16 - START_POS_VALVES_ID = DenaliMessage.PAYLOAD_START_INDEX - END_POS_VALVES_ID = START_POS_VALVES_ID + 4 - START_VALVES_STATE = END_POS_VALVES_ID - END_VALVES_STATE = START_VALVES_STATE + 4 - - START_POS_VALVES_CURR_POS_ID = END_VALVES_STATE - END_POS_VALVES_CURR_POS_ID = START_POS_VALVES_CURR_POS_ID + 4 - - START_POS_VALVES_CURR_POS = END_POS_VALVES_CURR_POS_ID - END_POS_VALVES_CURR_POS = START_POS_VALVES_CURR_POS + 2 - - START_POS_VALVES_NEXT_POS = END_POS_VALVES_CURR_POS - END_POS_VALVES_NEXT_POS = START_POS_VALVES_NEXT_POS + 2 - - START_POS_A = END_POS_VALVES_NEXT_POS - END_POS_A = START_POS_A + 2 - START_POS_B = END_POS_A - END_POS_B = START_POS_B + 2 - START_POS_C = END_POS_B - END_POS_C = START_POS_C + 2 - START_POS_D = END_POS_C - END_POS_D = START_POS_D + 2 - START_MAX_HOMING_ENC = END_POS_D - END_MAX_HOMING_ENC = START_MAX_HOMING_ENC + 2 - - def __init__(self, can_interface, logger: Logger): + def __init__(self, can_interface: CanMessenger, logger: Logger): """ TDValves constructor - @param can_interface: (DenaliCanMessenger) - Denali CAN messenger object. + @param can_interface: (CanMessenger) - Can Messenger object. @param logger: (Logger) - Dialin logger """ super().__init__() self.can_interface = can_interface self.logger = logger if self.can_interface is not None: - channel_id = DenaliChannels.td_sync_broadcast_ch_id - self.msg_id_td_valves_data = MsgIds.MSG_ID_TD_VALVES_DATA.value - self.can_interface.register_receiving_publication_function(channel_id, self.msg_id_td_valves_data, - self._handler_valves_sync) + self.can_interface.register_receiving_publication_function(channel_id = CanChannels.td_sync_broadcast_ch_id, + message_id = MsgIds.MSG_ID_TD_VALVES_DATA.value, + function = self._handler_valves_sync) self.td_valves_timestamp = 0.0 #: The timestamp of the latest message @@ -91,31 +66,29 @@ @param message: published TD valves data message @returns none """ - vlv_id = struct.unpack('i', bytearray( - message['message'][self.START_POS_VALVES_ID:self.END_POS_VALVES_ID]))[0] - state_id = struct.unpack('i', bytearray( - message['message'][self.START_VALVES_STATE:self.END_VALVES_STATE]))[0] - pos_id = struct.unpack('i', bytearray( - message['message'][self.START_POS_VALVES_CURR_POS_ID:self.END_POS_VALVES_CURR_POS_ID]))[0] - pos_cnt = struct.unpack('h', bytearray( - message['message'][self.START_POS_VALVES_CURR_POS:self.END_POS_VALVES_CURR_POS]))[0] - cmd_pos = struct.unpack('h', bytearray( - message['message'][self.START_POS_VALVES_NEXT_POS:self.END_POS_VALVES_NEXT_POS]))[0] + msg_list = [] + msg_list.append(('Valve', DataTypes.U32)) + msg_list.append(('State', DataTypes.U32)) + msg_list.append(('PosID', DataTypes.U32)) + msg_list.append(('PosCnt', DataTypes.U16)) + msg_list.append(('Cmd', DataTypes.U16)) + msg_list.append(('PosA', DataTypes.U16)) + msg_list.append(('PosB', DataTypes.U16)) + msg_list.append(('PosC', DataTypes.U16)) + msg_list.append(('PosD', DataTypes.U16)) + msg_list.append(('Max_homing_enc', DataTypes.U16)) - pos_a = struct.unpack('h', bytearray(message['message'][self.START_POS_A:self.END_POS_A]))[0] - pos_b = struct.unpack('h', bytearray(message['message'][self.START_POS_B:self.END_POS_B]))[0] - pos_c = struct.unpack('h', bytearray(message['message'][self.START_POS_C:self.END_POS_C]))[0] - pos_d = struct.unpack('h', bytearray(message['message'][self.START_POS_D:self.END_POS_D]))[0] - max_homing_enc = struct.unpack('h', bytearray( - message['message'][self.START_MAX_HOMING_ENC:self.END_MAX_HOMING_ENC]))[0] + result = self.process_into_vars(decoder_list = msg_list, + message = message) # To make sure values of the enums are not out of range - if td_enum_repository.TDValveNames.has_value(vlv_id) and td_enum_repository.TDValvePositions.has_value(pos_id) and td_enum_repository.TDValveStates.has_value(pos_id): - vlv_name = td_enum_repository.TDValveNames(vlv_id).name + if td_enum_repository.TDValveNames.has_value(result['Valve']) and td_enum_repository.TDValvePositions.has_value(result['PosID']) and td_enum_repository.TDValveStates.has_value(result['State']): + # Updating fields + result['Valve'] = td_enum_repository.TDValveNames(result['Valve']).name + result['State'] = td_enum_repository.TDValveStates(result['State']).name + result['PosID'] = td_enum_repository.TDValvePositions(result['PosID']).name # Update the valves dictionary - self.valves_status[vlv_name] = {'Valve': vlv_name, 'PosID': td_enum_repository.TDValvePositions(pos_id).name, 'PosCnt': pos_cnt, - 'Cmd': cmd_pos, 'State': td_enum_repository.TDValveStates(state_id).name, 'PosA': pos_a, - 'PosB': pos_b, 'PosC': pos_c, 'PosD': pos_d, 'Max_homing_enc': max_homing_enc} + self.valves_status[result['Valve']] = result self.td_valves_timestamp = timestamp @@ -133,7 +106,7 @@ return cmd_generic_broadcast_interval_override( ms = ms, reset = reset, - channel_id = DenaliChannels.dialin_to_td_ch_id, + channel_id = CanChannels.dialin_to_td_ch_id, msg_id = MsgIds.MSG_ID_TD_VALVES_PUBLISH_INTERVAL_OVERRIDE_REQUEST, module_name = 'TD Valves', logger = self.logger, @@ -157,7 +130,7 @@ return cmd_generic_override( payload = payload, reset = NO_RESET, - channel_id = DenaliChannels.dialin_to_td_ch_id, + channel_id = CanChannels.dialin_to_td_ch_id, msg_id = MsgIds.MSG_ID_TD_PINCH_VALVE_SET_POSITION_REQUEST, entity_name = f'TD {valve_name} Valve position', override_text = str(position), @@ -183,7 +156,7 @@ return cmd_generic_override( payload = payload, reset = NO_RESET, - channel_id = DenaliChannels.dialin_to_td_ch_id, + channel_id = CanChannels.dialin_to_td_ch_id, msg_id = MsgIds.MSG_ID_TD_PINCH_VALVE_HOME_REQUEST, entity_name = f'TD {valve_name} Valve homing', override_text = 'Forcefully' if force_home == 1 else 'Normally', @@ -209,7 +182,7 @@ return cmd_generic_override( payload = payload, reset = NO_RESET, - channel_id = DenaliChannels.dialin_to_td_ch_id, + channel_id = CanChannels.dialin_to_td_ch_id, msg_id = MsgIds.MSG_ID_TD_ROTARY_PINCH_VALVE_POSITION_OVERRIDE_REQUEST, entity_name = f'TD {valve_name} Valve position', override_text = f'move by {str(position_count)}', @@ -235,7 +208,7 @@ return cmd_generic_override( payload = payload, reset = NO_RESET, - channel_id = DenaliChannels.dialin_to_td_ch_id, + channel_id = CanChannels.dialin_to_td_ch_id, msg_id = MsgIds.MSG_ID_TD_ROTARY_PINCH_VALVE_STATUS_OVERRIDE_REQUEST, entity_name = f'TD {valve_name} Valve status', override_text = str(status), @@ -260,7 +233,7 @@ return cmd_generic_override( payload = payload, reset = NO_RESET, - channel_id = DenaliChannels.dialin_to_td_ch_id, + channel_id = CanChannels.dialin_to_td_ch_id, msg_id = MsgIds.MSG_ID_TD_ROTARY_PINCH_VALVE_POSITION_OVERRIDE_REQUEST, entity_name = f'TD {valve_name} Valve encoder position offset', override_text = str(counts),