From 84ef868d903f0c52c2f3fb2d79c344ff784580dc Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 6 May 2021 15:35:01 +0200 Subject: [PATCH 01/10] a lot of refactoring --- src/tests/test_obj_id_manager.py | 2 +- src/tests/test_pus.py | 2 +- src/tmtccmd/com_if/com_interface_base.py | 1 - src/tmtccmd/com_if/tcpip_udp_com_if.py | 6 ++--- src/tmtccmd/config/objects.py | 7 ++++-- src/tmtccmd/core/hook_base.py | 14 ++++++------ src/tmtccmd/defaults/com_setup.py | 22 ++++++++++--------- src/tmtccmd/pus_tc/service_5_event.py | 2 -- src/tmtccmd/pus_tm/service_5_event.py | 10 ++++----- .../pus_tm/service_8_functional_cmd.py | 4 ++-- 10 files changed, 36 insertions(+), 34 deletions(-) diff --git a/src/tests/test_obj_id_manager.py b/src/tests/test_obj_id_manager.py index 0344d1bc..ae8aa627 100644 --- a/src/tests/test_obj_id_manager.py +++ b/src/tests/test_obj_id_manager.py @@ -1,5 +1,5 @@ from unittest import TestCase -from tmtccmd.core.object_id_manager import insert_object_id, get_object_id_info, insert_object_ids +from tmtccmd.core.object_id_manager import insert_object_id, get_object_id_info TEST_ID_0 = bytearray([0x00, 0x01, 0x02, 0x03]) diff --git a/src/tests/test_pus.py b/src/tests/test_pus.py index 4e1d5ad2..83476919 100755 --- a/src/tests/test_pus.py +++ b/src/tests/test_pus.py @@ -7,7 +7,7 @@ from tmtccmd.ecss.tc import PusTelecommand from tmtccmd.ecss.tc import generate_crc, generate_packet_crc from tmtccmd.ccsds.spacepacket import get_sp_packet_sequence_control -from tmtccmd.ecss.conf import set_default_apid, get_default_apid, PusVersion, set_pus_tm_version, get_pus_tm_version +from tmtccmd.ecss.conf import set_default_apid, get_default_apid, PusVersion, get_pus_tm_version from tmtccmd.pus_tm.service_17_test import Service17TM, Service17TmPacked from tmtccmd.ecss.tm import PusTelemetry diff --git a/src/tmtccmd/com_if/com_interface_base.py b/src/tmtccmd/com_if/com_interface_base.py index 9b626588..8702eebc 100644 --- a/src/tmtccmd/com_if/com_interface_base.py +++ b/src/tmtccmd/com_if/com_interface_base.py @@ -9,7 +9,6 @@ :author: R. Mueller """ from abc import abstractmethod -from typing import Tuple from tmtccmd.ecss.tc import PusTelecommand from tmtccmd.pus_tm.factory import PusTmListT diff --git a/src/tmtccmd/com_if/tcpip_udp_com_if.py b/src/tmtccmd/com_if/tcpip_udp_com_if.py index 02e9d490..cff423f6 100644 --- a/src/tmtccmd/com_if/tcpip_udp_com_if.py +++ b/src/tmtccmd/com_if/tcpip_udp_com_if.py @@ -7,7 +7,7 @@ """ import select import socket -from typing import Tuple, Union +from typing import Union from tmtccmd.utility.tmtcc_logger import get_logger from tmtccmd.core.definitions import CoreModeList @@ -59,7 +59,7 @@ def __del__(self): except IOError: LOGGER.warning("Could not close UDP communication interface!") - def initialize(self) -> None: + def initialize(self, args: any = None) -> any: pass def open(self, args: any = None): @@ -78,7 +78,7 @@ def open(self, args: any = None): ping_cmd = pack_service17_ping_command(ssc=0) self.send_telecommand(ping_cmd.pack(), ping_cmd) - def close(self) -> None: + def close(self, args: any = None) -> None: if self.udp_socket is not None: self.udp_socket.close() diff --git a/src/tmtccmd/config/objects.py b/src/tmtccmd/config/objects.py index f9b840ba..0b55207a 100644 --- a/src/tmtccmd/config/objects.py +++ b/src/tmtccmd/config/objects.py @@ -2,13 +2,16 @@ from tmtccmd.core.definitions import CoreObjectIds -def get_core_object_ids() -> Dict[int, bytearray]: +INVALID_ID = bytearray([0xff, 0xff, 0xff, 0xff]) + + +def get_core_object_ids() -> Dict[bytearray, list]: """ These are the object IDs for the tmtccmd core. The core will usually take care of inserting these into the object manager during the program initialization. :return: Dictionary of the core object IDs """ object_id_dict = { - CoreObjectIds.INVALID: bytearray([0xff, 0xff, 0xff, 0xff]), + INVALID_ID: ["Invalid ID"], } return object_id_dict diff --git a/src/tmtccmd/core/hook_base.py b/src/tmtccmd/core/hook_base.py index fc0886e3..a5c1d9a2 100644 --- a/src/tmtccmd/core/hook_base.py +++ b/src/tmtccmd/core/hook_base.py @@ -44,13 +44,18 @@ def add_globals_pre_args_parsing(self, gui: bool = False): set_default_globals_pre_args_parsing(gui=gui, apid=DEFAULT_APID) @abstractmethod - def add_globals_post_args_parsing(self, args: argparse.Namespace, json_cfg_path: str = ""): + def set_json_config_file_path(self) -> str: + return "tmtc_config.json" + + @abstractmethod + def add_globals_post_args_parsing(self, args: argparse.Namespace, json_cfg_path: str): """ Add global variables prior after parsing the CLI arguments. :param gui: Specify whether a GUI is used + :param json_cfg_path: Config path which will be the path return in set_json_config_file_path """ from tmtccmd.defaults.globals_setup import set_default_globals_post_args_parsing - set_default_globals_post_args_parsing(args=args) + set_default_globals_post_args_parsing(args=args, json_cfg_path=json_cfg_path) @abstractmethod def assign_communication_interface( @@ -154,8 +159,3 @@ def handle_service_5_event( :return: Custom information string which will be printed with the event """ return "" - - @abstractmethod - def set_json_config_file_path(self) -> str: - return "tmtc_config.json" - diff --git a/src/tmtccmd/defaults/com_setup.py b/src/tmtccmd/defaults/com_setup.py index 6d949080..b1a0d1d3 100644 --- a/src/tmtccmd/defaults/com_setup.py +++ b/src/tmtccmd/defaults/com_setup.py @@ -6,7 +6,7 @@ from tmtccmd.com_if.com_interface_base import CommunicationInterface from tmtccmd.com_if.serial_com_if import SerialConfigIds, SerialCommunicationType from tmtccmd.com_if.serial_utilities import determine_com_port, determine_baud_rate -from tmtccmd.com_if.tcpip_utilities import TcpIpConfigIds, ethernet_address_t +from tmtccmd.com_if.tcpip_utilities import TcpIpConfigIds from tmtccmd.utility.tmtcc_logger import get_logger from tmtccmd.utility.tmtc_printer import TmTcPrinter @@ -15,7 +15,7 @@ def create_communication_interface_default( - com_if: int, tmtc_printer: TmTcPrinter + com_if: int, tmtc_printer: TmTcPrinter, json_cfg_path: str ) -> Union[CommunicationInterface, None]: from tmtccmd.com_if.serial_com_if import SerialComIF from tmtccmd.com_if.dummy_com_if import DummyComIF @@ -45,7 +45,7 @@ def create_communication_interface_default( serial_baudrate = serial_cfg[SerialConfigIds.SERIAL_BAUD_RATE] serial_timeout = serial_cfg[SerialConfigIds.SERIAL_TIMEOUT] # Determine COM port, either extract from JSON file or ask from user. - com_port = determine_com_port() + com_port = determine_com_port(json_cfg_path=json_cfg_path) communication_interface = SerialComIF( tmtc_printer=tmtc_printer, com_port=com_port, baud_rate=serial_baudrate, serial_timeout=serial_timeout, @@ -63,7 +63,8 @@ def create_communication_interface_default( dle_max_queue_len = serial_cfg[SerialConfigIds.SERIAL_DLE_QUEUE_LEN] dle_max_frame_size = serial_cfg[SerialConfigIds.SERIAL_DLE_MAX_FRAME_SIZE] communication_interface.set_dle_settings( - dle_max_queue_len, dle_max_frame_size, serial_timeout) + dle_max_queue_len, dle_max_frame_size, serial_timeout + ) else: communication_interface = DummyComIF(tmtc_printer=tmtc_printer) if not communication_interface.valid: @@ -92,23 +93,24 @@ def default_tcpip_udp_cfg_setup(json_cfg_path: str): update_global(CoreGlobalIds.ETHERNET_CONFIG, ethernet_cfg_dict) -def default_serial_cfg_setup(com_if: int): - baud_rate = determine_baud_rate() +def default_serial_cfg_setup(json_cfg_path: str, com_if: int): + baud_rate = determine_baud_rate(json_cfg_path=json_cfg_path) if com_if == CoreComInterfaces.SERIAL_DLE: - serial_port = determine_com_port() + serial_port = determine_com_port(json_cfg_path=json_cfg_path) else: serial_port = "" - set_up_serial_cfg(com_if=com_if, baud_rate=baud_rate, com_port=serial_port) + set_up_serial_cfg(json_cfg_path=json_cfg_path, com_if=com_if, baud_rate=baud_rate, com_port=serial_port) def set_up_serial_cfg( - com_if: int, baud_rate: int, com_port: str = "", tm_timeout: float = 0.01, + json_cfg_path: str, com_if: int, baud_rate: int, com_port: str = "", tm_timeout: float = 0.01, ser_com_type: SerialCommunicationType = SerialCommunicationType.DLE_ENCODING, ser_frame_size: int = 256, dle_queue_len: int = 25, dle_frame_size: int = 1024 ): """ Default configuration to set up serial communication. The serial port and the baud rate will be determined from a JSON configuration file and prompted from the user + :param json_cfg_path: :param com_if: :param com_port: :param baud_rate: @@ -122,7 +124,7 @@ def set_up_serial_cfg( update_global(CoreGlobalIds.USE_SERIAL, True) if com_if == CoreComInterfaces.SERIAL_DLE and com_port == "": LOGGER.warning("Invalid com port specified!") - com_port = determine_com_port() + com_port = determine_com_port(json_cfg_path=json_cfg_path) serial_cfg_dict = get_global(CoreGlobalIds.SERIAL_CONFIG) serial_cfg_dict.update({SerialConfigIds.SERIAL_PORT: com_port}) serial_cfg_dict.update({SerialConfigIds.SERIAL_BAUD_RATE: baud_rate}) diff --git a/src/tmtccmd/pus_tc/service_5_event.py b/src/tmtccmd/pus_tc/service_5_event.py index bb01f055..3046ab6a 100644 --- a/src/tmtccmd/pus_tc/service_5_event.py +++ b/src/tmtccmd/pus_tc/service_5_event.py @@ -1,5 +1,3 @@ -import enum - from tmtccmd.config.globals import get_global_apid from tmtccmd.core.definitions import QueueCommands from tmtccmd.pus_tc.definitions import PusTelecommand, TcQueueT diff --git a/src/tmtccmd/pus_tm/service_5_event.py b/src/tmtccmd/pus_tm/service_5_event.py index 7dd571e5..87b11c0a 100644 --- a/src/tmtccmd/pus_tm/service_5_event.py +++ b/src/tmtccmd/pus_tm/service_5_event.py @@ -42,7 +42,6 @@ def __init__(self, byte_array, call_srv5_hook: bool = True): self.param_2 = struct.unpack('>I', self._tm_data[10:14])[0] self.custom_service_5_print = "" if call_srv5_hook: - from tmtccmd.core.hook_base import TmTcHookBase from tmtccmd.core.hook_helper import get_global_hook_obj hook_obj = get_global_hook_obj() self.custom_service_5_print = hook_obj.handle_service_5_event( @@ -63,16 +62,17 @@ def append_telemetry_column_headers(self, header_list: list): header_list.append("Parameter 1") header_list.append("Parameter 2") - def handle_service_5_event(self, object_id: int, event_id: int, param_1: int, param_2: int) -> str: + def handle_service_5_event(self, object_id: bytearray, event_id: int, param_1: int, param_2: int) -> str: try: from tmtccmd.core.hook_helper import get_global_hook_obj hook_obj = get_global_hook_obj() - self.custom_data_header, self.custom_data_content = \ - hook_obj.handle_service_5_event( - object_id=self.object_id_key, event_id=event_id, param_1=param_1, param_2=param_2 + custom_string = hook_obj.handle_service_5_event( + object_id=self.object_id, event_id=event_id, param_1=param_1, param_2=param_2 ) + return custom_string except ImportError: LOGGER.warning("Service 5 user data hook not supplied!") + return "" def get_custom_printout(self) -> str: return self.custom_service_5_print diff --git a/src/tmtccmd/pus_tm/service_8_functional_cmd.py b/src/tmtccmd/pus_tm/service_8_functional_cmd.py index f0d3c5f5..afafd525 100644 --- a/src/tmtccmd/pus_tm/service_8_functional_cmd.py +++ b/src/tmtccmd/pus_tm/service_8_functional_cmd.py @@ -22,8 +22,8 @@ def __init__(self, byte_array, call_srv8_hook: bool = True): self.specify_packet_info("Functional Data Reply") self.source_object_id = struct.unpack('!I', self.get_tm_data()[0:4])[0] self.object_id_bytes = self.get_tm_data()[0:4] - if self.object_id_key == CoreObjectIds.INVALID: - logger.warning("Service8TM: Unknown object ID") + # if self.object_id == CoreObjectIds.INVALID: + # logger.warning("Service8TM: Unknown object ID") self.source_action_id = struct.unpack('!I', self.get_tm_data()[4:8])[0] self.custom_data = self.get_tm_data()[8:] else: From 3118124272cc036ebd75c951949eb7acd2f4f012 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 6 May 2021 15:42:22 +0200 Subject: [PATCH 02/10] minor updates --- example/config/hook_implementation.py | 7 ++++++- src/tmtccmd/core/hook_base.py | 4 ++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/example/config/hook_implementation.py b/example/config/hook_implementation.py index e7022281..2555e33b 100644 --- a/example/config/hook_implementation.py +++ b/example/config/hook_implementation.py @@ -10,6 +10,9 @@ class ExampleHookClass(TmTcHookBase): + def set_json_config_file_path(self) -> str: + return "tmtc_config.json" + def get_version(self) -> str: return "My Version String" @@ -25,7 +28,9 @@ def assign_communication_interface(self, com_if: int, tmtc_printer: TmTcPrinter) Union[CommunicationInterface, None]: from tmtccmd.defaults.com_setup import create_communication_interface_default LOGGER.info("Communication interface assignment function was called") - return create_communication_interface_default(com_if=com_if, tmtc_printer=tmtc_printer) + return create_communication_interface_default( + com_if=com_if, tmtc_printer=tmtc_printer, json_cfg_path=self.set_json_config_file_path() + ) def perform_mode_operation(self, tmtc_backend: TmTcHandler, mode: int): LOGGER.info("Mode operation hook was called") diff --git a/src/tmtccmd/core/hook_base.py b/src/tmtccmd/core/hook_base.py index a5c1d9a2..9eee72c8 100644 --- a/src/tmtccmd/core/hook_base.py +++ b/src/tmtccmd/core/hook_base.py @@ -48,14 +48,14 @@ def set_json_config_file_path(self) -> str: return "tmtc_config.json" @abstractmethod - def add_globals_post_args_parsing(self, args: argparse.Namespace, json_cfg_path: str): + def add_globals_post_args_parsing(self, args: argparse.Namespace): """ Add global variables prior after parsing the CLI arguments. :param gui: Specify whether a GUI is used :param json_cfg_path: Config path which will be the path return in set_json_config_file_path """ from tmtccmd.defaults.globals_setup import set_default_globals_post_args_parsing - set_default_globals_post_args_parsing(args=args, json_cfg_path=json_cfg_path) + set_default_globals_post_args_parsing(args=args, json_cfg_path=self.set_json_config_file_path()) @abstractmethod def assign_communication_interface( From 28e05ecd590a19d47722fcc899f58ceafd8f57cb Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 6 May 2021 16:03:58 +0200 Subject: [PATCH 03/10] important fixes --- src/tmtccmd/config/objects.py | 4 ++-- src/tmtccmd/runner.py | 8 +------- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/src/tmtccmd/config/objects.py b/src/tmtccmd/config/objects.py index 0b55207a..75f2f10d 100644 --- a/src/tmtccmd/config/objects.py +++ b/src/tmtccmd/config/objects.py @@ -5,13 +5,13 @@ INVALID_ID = bytearray([0xff, 0xff, 0xff, 0xff]) -def get_core_object_ids() -> Dict[bytearray, list]: +def get_core_object_ids() -> Dict[bytes, list]: """ These are the object IDs for the tmtccmd core. The core will usually take care of inserting these into the object manager during the program initialization. :return: Dictionary of the core object IDs """ object_id_dict = { - INVALID_ID: ["Invalid ID"], + bytes(INVALID_ID): ["Invalid ID"], } return object_id_dict diff --git a/src/tmtccmd/runner.py b/src/tmtccmd/runner.py index 43cfbf83..e00ac26d 100644 --- a/src/tmtccmd/runner.py +++ b/src/tmtccmd/runner.py @@ -165,14 +165,8 @@ def __handle_cli_args_and_globals(): LOGGER.info("Parsing input arguments..") args = parse_input_arguments() - - json_cfg_path = hook_obj.set_json_config_file_path() - - set_json_cfg_path(json_cfg_path=json_cfg_path) - get_global(CoreGlobalIds.JSON_CFG_PATH) - LOGGER.info("Setting up post-globals..") - hook_obj.add_globals_post_args_parsing(args, json_cfg_path=json_cfg_path) + hook_obj.add_globals_post_args_parsing(args=args) def __start_tmtc_commander_cli(tmtc_backend: BackendBase): From 41e5104e0b0ed0439a65a1612cada14a4392df88 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 6 May 2021 16:14:03 +0200 Subject: [PATCH 04/10] doc tweaks and typing corrections --- src/tmtccmd/core/frontend_base.py | 2 +- src/tmtccmd/core/hook_base.py | 15 ++++++++++----- src/tmtccmd/core/object_id_manager.py | 6 +++--- src/tmtccmd/defaults/globals_setup.py | 1 + src/tmtccmd/ecss/tm.py | 4 ++-- 5 files changed, 17 insertions(+), 11 deletions(-) diff --git a/src/tmtccmd/core/frontend_base.py b/src/tmtccmd/core/frontend_base.py index 982b80c9..15ea68ca 100644 --- a/src/tmtccmd/core/frontend_base.py +++ b/src/tmtccmd/core/frontend_base.py @@ -1,7 +1,7 @@ from abc import abstractmethod -class FrontendBase(): +class FrontendBase: @abstractmethod def start(self, args: any): diff --git a/src/tmtccmd/core/hook_base.py b/src/tmtccmd/core/hook_base.py index 9eee72c8..7953c807 100644 --- a/src/tmtccmd/core/hook_base.py +++ b/src/tmtccmd/core/hook_base.py @@ -45,14 +45,17 @@ def add_globals_pre_args_parsing(self, gui: bool = False): @abstractmethod def set_json_config_file_path(self) -> str: + """ + The user can specify a path and filename for the JSON configuration file by overriding this function. + :return: + """ return "tmtc_config.json" @abstractmethod def add_globals_post_args_parsing(self, args: argparse.Namespace): """ Add global variables prior after parsing the CLI arguments. - :param gui: Specify whether a GUI is used - :param json_cfg_path: Config path which will be the path return in set_json_config_file_path + :param args: Specify whether a GUI is used """ from tmtccmd.defaults.globals_setup import set_default_globals_post_args_parsing set_default_globals_post_args_parsing(args=args, json_cfg_path=self.set_json_config_file_path()) @@ -67,7 +70,9 @@ def assign_communication_interface( :param tmtc_printer: Printer utility instance. """ from tmtccmd.defaults.com_setup import create_communication_interface_default - return create_communication_interface_default(com_if=com_if, tmtc_printer=tmtc_printer) + return create_communication_interface_default( + com_if=com_if, tmtc_printer=tmtc_printer, json_cfg_path=self.set_json_config_file_path() + ) @abstractmethod def perform_mode_operation(self, tmtc_backend: TmTcHandler, mode: int): @@ -125,7 +130,7 @@ def handle_service_3_housekeeping( ) -> Tuple[list, list, bytearray, int]: """ This function is called when a Service 3 Housekeeping packet is received. - :param object_id_key: Integer representation of the found object ID. See + :param object_id: Integer representation of the found object ID. See the :func:`~tmtccmd.core.hook_base.set_object_ids function for more information :param set_id: Unique set ID of the HK reply :param hk_data: HK data. For custom HK handling, whole HK data will be passed here. @@ -151,7 +156,7 @@ def handle_service_5_event( """ This function is called when a Service 5 Event Packet is received. The user can specify a custom string here which will be printed to display additional information related to an event. - :param object_id_key: Integer representation of the found object ID. See + :param object_id: Integer representation of the found object ID. See the :func:`~tmtccmd.core.hook_base.set_object_ids function for more information :param event_id: Two-byte event ID :param param_1: Four-byte Parameter 1 diff --git a/src/tmtccmd/core/object_id_manager.py b/src/tmtccmd/core/object_id_manager.py index 807b830d..d3e0e43f 100644 --- a/src/tmtccmd/core/object_id_manager.py +++ b/src/tmtccmd/core/object_id_manager.py @@ -40,12 +40,12 @@ def get_object_id_info(self, object_id: bytearray): def get_object_id_info_from_int_id(self, object_id: int): object_id_bytearray = struct.pack('!I', object_id) - return get_object_id_info(object_id=object_id_bytearray) + return self.get_object_id_info(object_id=bytearray(object_id_bytearray)) def insert_object_id(self, object_id: bytearray, object_id_info: list): self.object_id_dict.update({bytes(object_id): object_id_info}) - def insert_object_ids(self, object_id_dict: Dict[bytearray, list]): + def insert_object_ids(self, object_id_dict: Dict[bytes, list]): self.object_id_dict.update(object_id_dict) @@ -55,7 +55,7 @@ def insert_object_id(object_id: bytearray, object_id_info: list): ) -def insert_object_ids(object_id_dict: Dict[bytearray, list]): +def insert_object_ids(object_id_dict: Dict[bytes, list]): if object_id_dict is not None: return ObjectIdManager.get_manager().insert_object_ids(object_id_dict=object_id_dict) diff --git a/src/tmtccmd/defaults/globals_setup.py b/src/tmtccmd/defaults/globals_setup.py index e7734b67..a2247b9f 100644 --- a/src/tmtccmd/defaults/globals_setup.py +++ b/src/tmtccmd/defaults/globals_setup.py @@ -62,6 +62,7 @@ def set_default_globals_post_args_parsing( integers as keys and the string representation of the command line argument as value. This will be used for internalization. :param args: Namespace generated by parsing command line arguments. + :param json_cfg_path: :param custom_modes_list: List of collections or dictionaries containing custom modes :param custom_services_list: List of collections or dictionaries containing custom services :param custom_com_ifs_lists: List of collections or dictionaries containing customcommunication interfaces diff --git a/src/tmtccmd/ecss/tm.py b/src/tmtccmd/ecss/tm.py index 7003c6c0..1c642616 100644 --- a/src/tmtccmd/ecss/tm.py +++ b/src/tmtccmd/ecss/tm.py @@ -25,9 +25,9 @@ def __init__(self, raw_telemetry: bytearray = bytearray()): @param raw_telemetry: """ if raw_telemetry is None or raw_telemetry == bytearray(): - if(raw_telemetry is None): + if raw_telemetry is None: print("PusTelemetry: Given byte stream ivalid!") - elif (raw_telemetry == bytearray()): + elif raw_telemetry == bytearray(): print("PusTelemetry: Given byte stream empty!") raise ValueError self.pus_version = get_pus_tm_version() From d62293653690b3bb269c01539ccbe45617b94a83 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 6 May 2021 16:18:38 +0200 Subject: [PATCH 05/10] some more minor corrections --- src/tmtccmd/com_if/dummy_com_if.py | 8 ++++---- src/tmtccmd/config/globals.py | 2 +- src/tmtccmd/pus_tm/service_3_housekeeping.py | 7 ++++--- src/tmtccmd/runner.py | 5 +++-- src/tmtccmd/utility/tmtc_printer.py | 2 +- 5 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/tmtccmd/com_if/dummy_com_if.py b/src/tmtccmd/com_if/dummy_com_if.py index 677a990b..14c70935 100644 --- a/src/tmtccmd/com_if/dummy_com_if.py +++ b/src/tmtccmd/com_if/dummy_com_if.py @@ -3,7 +3,7 @@ :date: 09.03.2020 :brief: Dummy Communication Interface. Currently serves to provide an example without external hardware """ -from typing import Tuple, cast +from typing import cast from tmtccmd.com_if.com_interface_base import CommunicationInterface from tmtccmd.ecss.tc import PusTelecommand @@ -24,13 +24,13 @@ def __init__(self, tmtc_printer): self.tc_ssc = 0 self.tc_packet_id = 0 - def initialize(self) -> any: + def initialize(self, args: any = None) -> any: pass - def open(self): + def open(self, args: any = None) -> None: pass - def close(self) -> None: + def close(self, args: any = None) -> None: pass def data_available(self, parameters): diff --git a/src/tmtccmd/config/globals.py b/src/tmtccmd/config/globals.py index 3f9f2683..26534e2e 100644 --- a/src/tmtccmd/config/globals.py +++ b/src/tmtccmd/config/globals.py @@ -1,4 +1,4 @@ -import collections +import collections.abc from typing import List, Union from tmtccmd.utility.tmtcc_logger import get_logger diff --git a/src/tmtccmd/pus_tm/service_3_housekeeping.py b/src/tmtccmd/pus_tm/service_3_housekeeping.py index be12a02d..0f08941c 100644 --- a/src/tmtccmd/pus_tm/service_3_housekeeping.py +++ b/src/tmtccmd/pus_tm/service_3_housekeeping.py @@ -50,7 +50,8 @@ def __init__(self, byte_array: bytearray, custom_hk_handling: bool = False, self.min_hk_reply_size = minimum_reply_size self.custom_hk_handling = custom_hk_handling self.hk_structure_report_header_size = minimum_structure_report_header_size - self.object_id = struct.unpack('!I', self._tm_data[0:4])[0] + self.object_id_bytes = self._tm_data[0:4] + self.object_id = struct.unpack('!I', self.object_id_bytes)[0] self.set_id = struct.unpack('!I', self._tm_data[4:8])[0] self.specify_packet_info("Housekeeping Packet") @@ -123,14 +124,14 @@ def handle_filling_hk_arrays(self): if self.custom_hk_handling: (self.hk_header, self.hk_content, self.validity_buffer, self.number_of_parameters) \ = hook_obj.handle_service_3_housekeeping( - object_id=0, set_id=0, hk_data=self._tm_data[0:], + object_id=bytearray(), set_id=0, hk_data=self._tm_data[0:], service3_packet=self ) else: (self.hk_header, self.hk_content, self.validity_buffer, self.number_of_parameters) = \ hook_obj.handle_service_3_housekeeping( - object_id=self.object_id_key, set_id=self.set_id, hk_data=self._tm_data[8:], + object_id=self.object_id_bytes, set_id=self.set_id, hk_data=self._tm_data[8:], service3_packet=self ) except ImportError: diff --git a/src/tmtccmd/runner.py b/src/tmtccmd/runner.py index e00ac26d..1efdd821 100644 --- a/src/tmtccmd/runner.py +++ b/src/tmtccmd/runner.py @@ -38,9 +38,8 @@ def initialize_tmtc_commander(hook_object: TmTcHookBase): initialize_tmtccmd(hook_obj) run_tmtc_client(False) - :param hook_base: Instantiation of a custom hook object. The TMTC core will call the various + :param hook_object: Instantiation of a custom hook object. The TMTC core will call the various hook functions during program run-time. - :param tmtc_backend: Custom backend :raises: ValueError for an invalid hook object. """ __assign_tmtc_commander_hooks(hook_object=hook_object) @@ -66,6 +65,8 @@ def run_tmtc_commander( :param use_gui: Specify whether the GUI is used or not :param reduced_printout: It is possible to reduce the initial printout with this flag :param ansi_colors: Enable ANSI color output for terminal + :param tmtc_backend: + :param tmtc_frontend: :raises: ValueError if initialize_tmtc_commander was not called before :return: """ diff --git a/src/tmtccmd/utility/tmtc_printer.py b/src/tmtccmd/utility/tmtc_printer.py index 9a89e180..5397c7ea 100644 --- a/src/tmtccmd/utility/tmtc_printer.py +++ b/src/tmtccmd/utility/tmtc_printer.py @@ -357,8 +357,8 @@ def bit_extractor(byte: int, position: int): def print_telecommand(self, tc_packet_obj: PusTelecommand, tc_packet_raw: bytearray = bytearray()): """ This function handles the printing of Telecommands. It assumed the packets are sent shortly before or after. - :param tc_packet: :param tc_packet_obj: + :param tc_packet_raw: :return: """ if self.print_tc: From 8820e36fce0bc9de6c75a1dbc3a486258ab1bc7b Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 6 May 2021 16:21:52 +0200 Subject: [PATCH 06/10] serial cfg call correction --- src/tmtccmd/com_if/qemu_com_if.py | 6 +++--- src/tmtccmd/com_if/serial_com_if.py | 6 +++--- src/tmtccmd/defaults/globals_setup.py | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/tmtccmd/com_if/qemu_com_if.py b/src/tmtccmd/com_if/qemu_com_if.py index bead649a..dbb57dc7 100644 --- a/src/tmtccmd/com_if/qemu_com_if.py +++ b/src/tmtccmd/com_if/qemu_com_if.py @@ -98,7 +98,7 @@ def set_dle_settings(self, dle_queue_len: int, dle_max_frame: int, dle_timeout: self.dle_max_frame = dle_max_frame self.dle_timeout = dle_timeout - def initialize(self) -> None: + def initialize(self, args: any = None) -> any: """ Needs to be called by application code once for DLE mode! """ @@ -106,7 +106,7 @@ def initialize(self) -> None: self.background_loop_thread = Thread( target=start_background_loop, args=(self.loop,), daemon=True) - def open(self) -> None: + def open(self, args: any = None) -> None: self.background_loop_thread.start() try: self.usart = asyncio.run_coroutine_threadsafe( @@ -119,7 +119,7 @@ def open(self) -> None: self.reception_buffer = deque(maxlen=self.dle_queue_len) asyncio.run_coroutine_threadsafe(self.start_dle_polling(), self.loop) - def close(self): + def close(self, args: any = None) -> None: if self.loop.is_closed(): return diff --git a/src/tmtccmd/com_if/serial_com_if.py b/src/tmtccmd/com_if/serial_com_if.py index de353391..8c338bb6 100644 --- a/src/tmtccmd/com_if/serial_com_if.py +++ b/src/tmtccmd/com_if/serial_com_if.py @@ -98,12 +98,12 @@ def set_dle_settings(self, dle_queue_len: int, dle_max_frame: int, dle_timeout: self.dle_max_frame = dle_max_frame self.dle_timeout = dle_timeout - def initialize(self): + def initialize(self, args: any = None) -> any: if self.ser_com_type == SerialCommunicationType.DLE_ENCODING: self.reception_buffer = deque(maxlen=self.dle_queue_len) self.dle_polling_active_event = threading.Event() - def open(self) -> None: + def open(self, args: any = None) -> None: try: if self.ser_com_type == SerialCommunicationType.DLE_ENCODING: self.dle_polling_active_event.set() @@ -119,7 +119,7 @@ def open(self) -> None: if self.ser_com_type == SerialCommunicationType.DLE_ENCODING: self.reception_thread.start() - def close(self): + def close(self, args: any = None) -> None: try: if self.ser_com_type == SerialCommunicationType.DLE_ENCODING: self.dle_polling_active_event.clear() diff --git a/src/tmtccmd/defaults/globals_setup.py b/src/tmtccmd/defaults/globals_setup.py index a2247b9f..f2b3f534 100644 --- a/src/tmtccmd/defaults/globals_setup.py +++ b/src/tmtccmd/defaults/globals_setup.py @@ -1,5 +1,5 @@ import argparse -import collections +import collections.abc import pprint from typing import Union, List @@ -135,7 +135,7 @@ def set_default_globals_post_args_parsing( if com_if_param == CoreComInterfaces.SERIAL_DLE or \ com_if_param == CoreComInterfaces.SERIAL_FIXED_FRAME or \ com_if_param == CoreComInterfaces.SERIAL_QEMU: - default_serial_cfg_setup(com_if=com_if_param) + default_serial_cfg_setup(com_if=com_if_param, json_cfg_path=json_cfg_path) # Same as above, but for server address and server port if com_if_param == CoreComInterfaces.TCPIP_UDP: From a2f9a85a5fcc8495542ecbd30322d62f654aca04 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 6 May 2021 16:25:15 +0200 Subject: [PATCH 07/10] removed obsolete code --- src/tmtccmd/config/objects.py | 5 ++--- src/tmtccmd/core/definitions.py | 6 ------ 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/src/tmtccmd/config/objects.py b/src/tmtccmd/config/objects.py index 75f2f10d..fca887b3 100644 --- a/src/tmtccmd/config/objects.py +++ b/src/tmtccmd/config/objects.py @@ -1,8 +1,7 @@ from typing import Dict -from tmtccmd.core.definitions import CoreObjectIds -INVALID_ID = bytearray([0xff, 0xff, 0xff, 0xff]) +INVALID_ID = bytes([0xff, 0xff, 0xff, 0xff]) def get_core_object_ids() -> Dict[bytes, list]: @@ -12,6 +11,6 @@ def get_core_object_ids() -> Dict[bytes, list]: :return: Dictionary of the core object IDs """ object_id_dict = { - bytes(INVALID_ID): ["Invalid ID"], + INVALID_ID: ["Invalid ID"], } return object_id_dict diff --git a/src/tmtccmd/core/definitions.py b/src/tmtccmd/core/definitions.py index 4296d00f..8ada0862 100644 --- a/src/tmtccmd/core/definitions.py +++ b/src/tmtccmd/core/definitions.py @@ -1,7 +1,6 @@ """ @brief Definitions for the TMTC commander core """ - import enum from typing import Tuple @@ -35,10 +34,6 @@ class QueueCommands(enum.Enum): SET_TIMEOUT = enum.auto() -class CoreObjectIds(enum.IntEnum): - INVALID = 999 - - # Mode options, set by args parser class CoreModeList(enum.IntEnum): SINGLE_CMD_MODE = 0 @@ -110,4 +105,3 @@ class CoreGlobalIds(enum.IntEnum): DEFAULT_APID = 0xef DEBUG_MODE = False - From 0e8b182964a9638fd9a1f851a59cfe84a8d89d94 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 6 May 2021 16:27:36 +0200 Subject: [PATCH 08/10] removed now invalid imports --- src/tmtccmd/core/object_id_manager.py | 1 - src/tmtccmd/pus_tm/service_8_functional_cmd.py | 5 ++--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/tmtccmd/core/object_id_manager.py b/src/tmtccmd/core/object_id_manager.py index d3e0e43f..11fe9d00 100644 --- a/src/tmtccmd/core/object_id_manager.py +++ b/src/tmtccmd/core/object_id_manager.py @@ -2,7 +2,6 @@ from typing import Dict from tmtccmd.utility.tmtcc_logger import get_logger -from tmtccmd.core.definitions import CoreObjectIds LOGGER = get_logger() diff --git a/src/tmtccmd/pus_tm/service_8_functional_cmd.py b/src/tmtccmd/pus_tm/service_8_functional_cmd.py index afafd525..b8fa3820 100644 --- a/src/tmtccmd/pus_tm/service_8_functional_cmd.py +++ b/src/tmtccmd/pus_tm/service_8_functional_cmd.py @@ -5,9 +5,8 @@ from tmtccmd.ecss.tm import PusTelemetry from tmtccmd.utility.tmtcc_logger import get_logger -from tmtccmd.core.definitions import CoreObjectIds -logger = get_logger() +LOGGER = get_logger() class Service8TM(PusTelemetry): @@ -38,7 +37,7 @@ def __init__(self, byte_array, call_srv8_hook: bool = True): custom_data=self.custom_data ) except ImportError: - logger.warning("Service 8 user data hook not supplied!") + LOGGER.warning("Service 8 user data hook not supplied!") def append_telemetry_content(self, content_list: list): super().append_telemetry_content(content_list=content_list) From 75dd5d0266b70fcdf6971ac7b692a3b78b43a772 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 6 May 2021 16:33:33 +0200 Subject: [PATCH 09/10] removed obsolete code, minor refactoring --- src/tmtccmd/pus_tm/service_8_functional_cmd.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/tmtccmd/pus_tm/service_8_functional_cmd.py b/src/tmtccmd/pus_tm/service_8_functional_cmd.py index b8fa3820..3c8978b2 100644 --- a/src/tmtccmd/pus_tm/service_8_functional_cmd.py +++ b/src/tmtccmd/pus_tm/service_8_functional_cmd.py @@ -19,10 +19,8 @@ def __init__(self, byte_array, call_srv8_hook: bool = True): self.custom_data_content = [] if self.get_subservice() == 130: self.specify_packet_info("Functional Data Reply") - self.source_object_id = struct.unpack('!I', self.get_tm_data()[0:4])[0] self.object_id_bytes = self.get_tm_data()[0:4] - # if self.object_id == CoreObjectIds.INVALID: - # logger.warning("Service8TM: Unknown object ID") + self.source_object_id = struct.unpack('!I', self.object_id_bytes)[0] self.source_action_id = struct.unpack('!I', self.get_tm_data()[4:8])[0] self.custom_data = self.get_tm_data()[8:] else: From 275b675d87aa7dd22178d99068ea9fc942c4db04 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Sun, 9 May 2021 18:10:33 +0200 Subject: [PATCH 10/10] pushing version revision --- src/tmtccmd/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/tmtccmd/__init__.py b/src/tmtccmd/__init__.py index 42ebff69..e81fbc28 100644 --- a/src/tmtccmd/__init__.py +++ b/src/tmtccmd/__init__.py @@ -1,9 +1,9 @@ VERSION_NAME = "tmtccmd" VERSION_MAJOR = 1 VERSION_MINOR = 4 -VERSION_REVISION = 3 +VERSION_REVISION = 4 # I think this needs to be in string representation to be parsed so we can't # use a formatted string here. -__version__ = "1.4.3" +__version__ = "1.4.4"