Index: leahi_dialin/td/modules/valves.py =================================================================== diff -u -rf03c9a32180573f2430105ad69eb91d9f597a96b -r34b64ff2d8a64f4b7b60b80bb7cf4c36845e5943 --- leahi_dialin/td/modules/valves.py (.../valves.py) (revision f03c9a32180573f2430105ad69eb91d9f597a96b) +++ leahi_dialin/td/modules/valves.py (.../valves.py) (revision 34b64ff2d8a64f4b7b60b80bb7cf4c36845e5943) @@ -8,20 +8,22 @@ # @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.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.common import td_enum_repository -from leahi_dialin.protocols.CAN import DenaliCanMessenger, DenaliMessage, DenaliChannels +from leahi_dialin.protocols.CAN import DenaliCanMessenger, DenaliChannels from leahi_dialin.utils.abstract_classes import AbstractSubSystem from leahi_dialin.utils.base import publish from leahi_dialin.utils.conversions import integer_to_bytearray @@ -31,34 +33,7 @@ """ 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: DenaliCanMessenger, logger: Logger): """ TDValves constructor @@ -71,10 +46,9 @@ 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 = DenaliChannels.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 @@ -92,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