########################################################################### # # Copyright (c) 2020-2024 Diality Inc. - All Rights Reserved. # # THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN # WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. # # @file records.py # # @author (last) Zoltan Miskolci # @date (last) 05-Aug-2026 # @author (original) Zoltan Miskolci # @date (original) 04-May-2026 # ############################################################################ # Module imports from logging import Logger # Project imports from leahi_dialin.dd.modules.records_get_responses import DDRecordsGetHandlers from leahi_dialin.dd.modules.records_get_requests import DDRecordsGetRequests from leahi_dialin.dd.modules.records_set_responses import DDRecordsSetHandlers from leahi_dialin.dd.modules.records_set_requests import DDRecordsSetRequests from leahi_dialin.common import td_enum_repository from leahi_dialin.common.msg_defs import RequestRejectReasons from leahi_dialin.common.msg_ids import MsgIds from leahi_dialin.common.override_templates import cmd_generic_override from leahi_dialin.protocols.CAN import CanMessenger, CanChannels from leahi_dialin.utils.conversions import integer_to_bytearray class TDRecords(DDRecordsGetHandlers, DDRecordsGetRequests, DDRecordsSetHandlers, DDRecordsSetRequests): """ TD interface containing records related commands. """ def __init__(self, can_interface: CanMessenger, logger: Logger): """ The main record class to handle all the subclasses. :param can_interface: (CanMessenger) The CanMessenger object :param logger: (Logger) The Logger object """ self.can_interface = can_interface self.logger = logger self.get_system_rec_timestamp = 0 #: The timestamp of the latest System Records message self.get_system_rec_ack = False self.get_system_rec_rr = RequestRejectReasons.REQUEST_REJECT_REASON_NONE self.system_records = { } self.set_system_rec_rr_timestamp = 0 #: The timestamp of the latest Set System Reject Reason message self.set_system_rec_ack = False self.set_system_rec_rr = { } self.get_service_rec_timestamp = 0 #: The timestamp of the latest Service Records message self.get_service_rec_ack = False self.get_service_rec_rr = RequestRejectReasons.REQUEST_REJECT_REASON_NONE self.service_records = { } self.set_service_rec_rr_timestamp = 0 #: The timestamp of the latest Set Service Reject Reason message self.set_service_rec_ack = False self.set_service_rec_rr = { } self.get_calibration_rec_timestamp = 0 #: The timestamp of the latest Calibration Records message self.get_calibration_rec_ack = { } self.get_calibration_rec_rr = { } self.calibration_records = { } self.set_calibration_rec_rr_timestamp = 0 #: The timestamp of the latest Set Calibration Reject Reason message self.set_calibration_rec_ack = { } self.set_calibration_rec_rr = { } self.get_institutional_rec_timestamp = 0 #: The timestamp of the latest Institutional Records message self.get_institutional_rec_ack = { } self.get_institutional_rec_rr = { } self.institutional_records = { } self.set_institutional_rec_rr_timestamp = 0 #: The timestamp of the latest Set Institutional Reject Reason message self.set_institutional_rec_ack = False self.set_institutional_rec_rr = { } self.get_usage_info_rec_timestamp = 0 #: The timestamp of the latest Usage Information Records message self.get_usage_info_rec_ack = False self.get_usage_info_rec_rr = RequestRejectReasons.REQUEST_REJECT_REASON_NONE self.usage_info_records = { } self.set_usage_info_rec_rr_timestamp = 0 #: The timestamp of the latest Set Usage Information Reject Reason message self.set_usage_info_rec_ack = False self.set_usage_info_rec_rr = { } # Calling the Sub classes: TDRecordsGetHandlers, TDRecordsGetRequests, TDRecordsSetHandlers, TDRecordsSetRequests # Doing it after initializeing the parameters will make those parameters accessable to the sub classes super().__init__() # ============================================================ Properties ============================================================ @property def system_records(self) -> dict: """ The System Records data """ return self._system_records @system_records.setter def system_records(self, value): self._system_records = value @property def service_records(self) -> dict: """ The Service Records data """ return self._service_records @service_records.setter def service_records(self, value): self._service_records = value @property def calibration_records(self) -> dict: """ The Calibration Records data """ return self._calibration_records @calibration_records.setter def calibration_records(self, value): self._calibration_records = value @property def institutional_records(self) -> dict: """ The Institutional Records data """ return self._institutional_records @institutional_records.setter def institutional_records(self, value): self._institutional_records = value @property def usage_info_records(self) -> dict: """ The Usage Information Records data """ return self._usage_info_records @usage_info_records.setter def usage_info_records(self, value): self._usage_info_records = value @property def get_system_rec_ack(self) -> bool: """ The Get System Records message acceptance """ return self._get_system_rec_ack @get_system_rec_ack.setter def get_system_rec_ack(self, value): self._get_system_rec_ack = value @property def get_service_rec_ack(self) -> bool: """ The Get Service Records message acceptance """ return self._get_service_rec_ack @get_service_rec_ack.setter def get_service_rec_ack(self, value): self._get_service_rec_ack = value @property def get_calibration_rec_ack(self) -> dict: """ The Get Calibration Records message acceptance """ return self._get_calibration_rec_ack @get_calibration_rec_ack.setter def get_calibration_rec_ack(self, value): self._get_calibration_rec_ack = value @property def get_institutional_rec_ack(self) -> dict: """ The Get Institutional Records message acceptance """ return self._get_institutional_rec_ack @get_institutional_rec_ack.setter def get_institutional_rec_ack(self, value): self._get_institutional_rec_ack = value @property def get_usage_info_rec_ack(self) -> bool: """ The Get Usage Information Records message acceptance """ return self._get_usage_info_rec_ack @get_usage_info_rec_ack.setter def get_usage_info_rec_ack(self, value): self._get_usage_info_rec_ack = value @property def get_system_rec_rr(self) -> dict: """ The Get System Records Request reject reason data """ return self._get_system_rec_rr @get_system_rec_rr.setter def get_system_rec_rr(self, value): self._get_system_rec_rr = value @property def get_service_rec_rr(self) -> dict: """ The Get Service Records Request reject reason data """ return self._get_service_rec_rr @get_service_rec_rr.setter def get_service_rec_rr(self, value): self._get_service_rec_rr = value @property def get_calibration_rec_rr(self) -> dict: """ The Get Calibration Records Request reject reason data """ return self._get_calibration_rec_rr @get_calibration_rec_rr.setter def get_calibration_rec_rr(self, value): self._get_calibration_rec_rr = value @property def get_institutional_rec_rr(self) -> dict: """ The Get Institutional Records Request reject reason data """ return self._get_institutional_rec_rr @get_institutional_rec_rr.setter def get_institutional_rec_rr(self, value): self._get_institutional_rec_rr = value @property def get_usage_info_rec_rr(self) -> dict: """ The Get Usage Information Records Request reject reason data """ return self._get_usage_info_rec_rr @get_usage_info_rec_rr.setter def get_usage_info_rec_rr(self, value): self._get_usage_info_rec_rr = value @property def set_system_rec_ack(self) -> bool: """ The Set System Records message acceptance """ return self._set_system_rec_ack @set_system_rec_ack.setter def set_system_rec_ack(self, value): self._set_system_rec_ack = value @property def set_service_rec_ack(self) -> bool: """ The Set Service Records message acceptance """ return self._set_service_rec_ack @set_service_rec_ack.setter def set_service_rec_ack(self, value): self._set_service_rec_ack = value @property def set_calibration_rec_ack(self) -> dict: """ The Set Calibration Records message acceptance """ return self._set_calibration_rec_ack @set_calibration_rec_ack.setter def set_calibration_rec_ack(self, value): self._set_calibration_rec_ack = value @property def set_institutional_rec_ack(self) -> dict: """ The Set Institutional Records message acceptance """ return self._set_institutional_rec_ack @set_institutional_rec_ack.setter def set_institutional_rec_ack(self, value): self._set_institutional_rec_ack = value @property def set_usage_info_rec_ack(self) -> bool: """ The Set Usage Information Records message acceptance """ return self._set_usage_info_rec_ack @set_usage_info_rec_ack.setter def set_usage_info_rec_ack(self, value): self._set_usage_info_rec_ack = value @property def set_system_rec_rr(self) -> dict: """ The Set System Records Request reject reason data """ return self._set_system_rec_rr @set_system_rec_rr.setter def set_system_rec_rr(self, value): self._set_system_rec_rr = value @property def set_service_rec_rr(self) -> dict: """ The Set Service Records Request reject reason data """ return self._set_service_rec_rr @set_service_rec_rr.setter def set_service_rec_rr(self, value): self._set_service_rec_rr = value @property def set_calibration_rec_rr(self) -> dict: """ The Set Calibration Records Request reject reason data """ return self._set_calibration_rec_rr @set_calibration_rec_rr.setter def set_calibration_rec_rr(self, value): self._set_calibration_rec_rr = value @property def set_institutional_rec_rr(self) -> dict: """ The Set Institutional Records Request reject reason data """ return self._set_institutional_rec_rr @set_institutional_rec_rr.setter def set_institutional_rec_rr(self, value): self._set_institutional_rec_rr = value @property def set_usage_info_rec_rr(self) -> dict: """ The Set Usage Information Records Request reject reason data """ return self._set_usage_info_rec_rr @set_usage_info_rec_rr.setter def set_usage_info_rec_rr(self, value): self._set_usage_info_rec_rr = value # ================================================= Go to Service Mode Method ================================================= def cmd_initiate_service_mode(self) -> int: """ Constructs and sends a request to change to Service operation mode via CAN bus. Constraints: Must be logged into TD. Transition from current to requested op mode must be legal. @return: 1 if successful, zero otherwise """ service_mode = td_enum_repository.TDOpModes.MODE_SERV payload = integer_to_bytearray(service_mode.value) return cmd_generic_override( payload = payload, reset = None, channel_id = CanChannels.dialin_to_dd_ch_id, msg_id = MsgIds.MSG_ID_TD_SET_OPERATION_MODE_OVERRIDE_REQUEST, entity_name = 'TD Operation Mode', override_text = f'set to {service_mode.name}', logger = self.logger, can_interface = self.can_interface)