From f061e71d40db6bcf195f2c5d44bc5f79b5c2a6f5 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 6 Dec 2021 17:36:31 +0100 Subject: [PATCH 001/221] added init cfdp handler --- src/tmtccmd/cfdp/__init__.py | 0 src/tmtccmd/cfdp/handler.py | 9 +++++++++ 2 files changed, 9 insertions(+) create mode 100644 src/tmtccmd/cfdp/__init__.py create mode 100644 src/tmtccmd/cfdp/handler.py diff --git a/src/tmtccmd/cfdp/__init__.py b/src/tmtccmd/cfdp/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/tmtccmd/cfdp/handler.py b/src/tmtccmd/cfdp/handler.py new file mode 100644 index 00000000..f486ee9d --- /dev/null +++ b/src/tmtccmd/cfdp/handler.py @@ -0,0 +1,9 @@ +from tmtccmd.utility.tmtc_printer import TmTcPrinter + + +class CfdpHandler: + def __init__(self): + pass + + def pass_packet(self, apid: int, raw_tm_packet: bytearray, tmtc_printer: TmTcPrinter): + pass From 34df6e460d4812f9b5c70a77e1ed982dd37da9c3 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 6 Dec 2021 18:00:54 +0100 Subject: [PATCH 002/221] continued CFDP handler --- src/tmtccmd/cfdp/handler.py | 52 ++++++++++++++++++++++++++++++++++++- 1 file changed, 51 insertions(+), 1 deletion(-) diff --git a/src/tmtccmd/cfdp/handler.py b/src/tmtccmd/cfdp/handler.py index f486ee9d..b6038a74 100644 --- a/src/tmtccmd/cfdp/handler.py +++ b/src/tmtccmd/cfdp/handler.py @@ -1,9 +1,59 @@ +import abc +import enum +import os + from tmtccmd.utility.tmtc_printer import TmTcPrinter +from tmtccmd.com_if.com_interface_base import CommunicationInterface +from spacepackets.cfdp.pdu.metadata import MetadataPdu +from spacepackets.cfdp.conf import PduConfig +from spacepackets.cfdp.definitions import TransmissionModes, ChecksumTypes + + +class CfdpClass(enum.Enum): + UNRELIABLE_CL1 = 0, + RELIABLE_CL2 = 1 class CfdpHandler: - def __init__(self): + def __init__(self, com_if: CommunicationInterface, cfdp_type: CfdpClass): + self.cfdp_type = cfdp_type + self.com_if = com_if + self.__busy = False + pass + + def state_machine(self): pass def pass_packet(self, apid: int, raw_tm_packet: bytearray, tmtc_printer: TmTcPrinter): pass + + def put_request(self, cfdp_type: CfdpClass): + if self.__is_busy(): + # TODO: Custom exception + return + if self.cfdp_type != cfdp_type: + self.cfdp_type = cfdp_type + + def send_metadata_pdu( + self, pdu_conf: PduConfig, file_repository: str, file_name: str, dest_repository: str, + dest_name: str + ): + if self.cfdp_type == CfdpClass.RELIABLE_CL2: + pdu_conf.trans_mode = TransmissionModes.ACKNOWLEDGED + else: + pdu_conf.trans_mode = TransmissionModes.UNACKNOWLEDGED + source_file = os.path.join(file_repository, file_name) + dest_file = os.path.join(dest_repository, dest_name) + metadata_pdu = MetadataPdu( + pdu_conf=pdu_conf, file_size=0, source_file_name=source_file, dest_file_name=dest_file, + checksum_type=ChecksumTypes.NULL_CHECKSUM, closure_requested=False + ) + data = metadata_pdu.pack() + self.com_if.send(data=data) + + @abc.abstractmethod + def transaction_indication(self): + pass + + def __is_busy(self) -> bool: + return self.__busy From bdbf2a930ddd5752db65958e78a3c8b9effd1125 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 7 Dec 2021 14:10:19 +0100 Subject: [PATCH 003/221] some tweaks --- src/tmtccmd/ccsds/handler.py | 4 ++++ src/tmtccmd/cfdp/handler.py | 21 ++++++++++++++++----- src/tmtccmd/config/definitions.py | 3 ++- src/tmtccmd/core/backend.py | 13 ++++++++++--- src/tmtccmd/runner.py | 4 +++- 5 files changed, 35 insertions(+), 10 deletions(-) diff --git a/src/tmtccmd/ccsds/handler.py b/src/tmtccmd/ccsds/handler.py index 42919a5f..4fb37998 100644 --- a/src/tmtccmd/ccsds/handler.py +++ b/src/tmtccmd/ccsds/handler.py @@ -1,6 +1,7 @@ from typing import Callable, Dict, Optional, Tuple, List from tmtccmd.tm.handler import TmHandler +from tmtccmd.cfdp.handler import CfdpHandler from tmtccmd.tm.definitions import TelemetryQueueT, TmTypes from tmtccmd.sendreceive.tm_listener import QueueListT from tmtccmd.utility.tmtc_printer import TmTcPrinter @@ -33,6 +34,9 @@ def add_tm_handler(self, apid: int, pus_tm_handler: CcsdsCallbackT, max_queue_le """ self._handler_dict[apid] = pus_tm_handler, max_queue_len + def add_cfdp_handler(self, apid: int, cfdp_handler: CfdpHandler, max_queue_len: int): + self._handler_dict[apid] = cfdp_handler.pass_packet, max_queue_len + def get_apid_queue_len_list(self) -> List[Tuple[int, int]]: list = [] for apid, handler_tuple in self._handler_dict.items(): diff --git a/src/tmtccmd/cfdp/handler.py b/src/tmtccmd/cfdp/handler.py index b6038a74..c22a68c3 100644 --- a/src/tmtccmd/cfdp/handler.py +++ b/src/tmtccmd/cfdp/handler.py @@ -3,21 +3,36 @@ import os from tmtccmd.utility.tmtc_printer import TmTcPrinter +from tmtccmd.utility.logger import get_console_logger from tmtccmd.com_if.com_interface_base import CommunicationInterface from spacepackets.cfdp.pdu.metadata import MetadataPdu from spacepackets.cfdp.conf import PduConfig from spacepackets.cfdp.definitions import TransmissionModes, ChecksumTypes +LOGGER = get_console_logger() + class CfdpClass(enum.Enum): UNRELIABLE_CL1 = 0, RELIABLE_CL2 = 1 +class CfdpUserBase: + def __init__(self): + pass + + @abc.abstractmethod + def transaction_indication(self): + LOGGER.info("Received transaction indication") + + class CfdpHandler: - def __init__(self, com_if: CommunicationInterface, cfdp_type: CfdpClass): + def __init__( + self, com_if: CommunicationInterface, cfdp_type: CfdpClass, cfdp_user: CfdpUserBase + ): self.cfdp_type = cfdp_type self.com_if = com_if + self.cfdp_user = cfdp_user self.__busy = False pass @@ -51,9 +66,5 @@ def send_metadata_pdu( data = metadata_pdu.pack() self.com_if.send(data=data) - @abc.abstractmethod - def transaction_indication(self): - pass - def __is_busy(self) -> bool: return self.__busy diff --git a/src/tmtccmd/config/definitions.py b/src/tmtccmd/config/definitions.py index eeb41331..abe86201 100644 --- a/src/tmtccmd/config/definitions.py +++ b/src/tmtccmd/config/definitions.py @@ -14,7 +14,8 @@ class CoreGlobalIds(enum.IntEnum): TM_LISTENER_HANDLE = 130 TMTC_PRINTER_HANDLE = 131 TM_HANDLER_HANDLE = 132 - PRETTY_PRINTER = 133 + TMTC_BACKEND = 134 + PRETTY_PRINTER = 135 # Parameters JSON_CFG_PATH = 139 diff --git a/src/tmtccmd/core/backend.py b/src/tmtccmd/core/backend.py index b3724cd0..401b9fa4 100644 --- a/src/tmtccmd/core/backend.py +++ b/src/tmtccmd/core/backend.py @@ -1,6 +1,7 @@ import atexit import time import sys +from typing import cast from threading import Thread from abc import abstractmethod from collections import deque @@ -63,7 +64,7 @@ def __init__( self.__tmtc_printer = tmtc_printer self.__tm_listener = tm_listener if tm_handler.get_type() == TmTypes.CCSDS_SPACE_PACKETS: - self.__tm_handler: CcsdsTmHandler = tm_handler + self.__tm_handler: CcsdsTmHandler = cast(CcsdsTmHandler, tm_handler) for apid_queue_len_tuple in self.__tm_handler.get_apid_queue_len_list(): self.__tm_listener.subscribe_ccsds_tm_handler( apid_queue_len_tuple[0], apid_queue_len_tuple[1] @@ -133,13 +134,14 @@ def set_current_apid(self, apid: int): @staticmethod def prepare_tmtc_handler_start( com_if: CommunicationInterface, tmtc_printer: TmTcPrinter, tm_listener: TmListener, - init_mode: int, init_service: Union[str, int] = CoreServiceList.SERVICE_17.value, + init_mode: int, tm_handler: TmHandler, + init_service: Union[str, int] = CoreServiceList.SERVICE_17.value, init_opcode: str = "0" ): from multiprocessing import Process tmtc_handler = TmTcHandler( com_if=com_if, tmtc_printer=tmtc_printer, tm_listener=tm_listener, init_mode=init_mode, - init_service=init_service, init_opcode=init_opcode + init_service=init_service, init_opcode=init_opcode, tm_handler=tm_handler ) tmtc_task = Process(target=TmTcHandler.start_handler, args=(tmtc_handler, )) return tmtc_task @@ -259,3 +261,8 @@ def __core_operation(self, one_shot): time.sleep(1) else: self.__handle_action() + + +def get_tmtc_backend() -> BackendBase: + from tmtccmd.config.globals import get_global, CoreGlobalIds + return get_global(CoreGlobalIds.TMTC_BACKEND) diff --git a/src/tmtccmd/runner.py b/src/tmtccmd/runner.py index a413d02c..3e9d4139 100644 --- a/src/tmtccmd/runner.py +++ b/src/tmtccmd/runner.py @@ -58,7 +58,7 @@ def initialize_tmtc_commander(hook_object: TmTcHookBase): def add_ccsds_handler(ccsds_handler: CcsdsTmHandler): """Add a handler for CCSDS space packets, for example PUS packets - :param pus_handler: + :param ccsds_handler: Handler for CCSDS packets :return: """ lock_global_pool() @@ -102,12 +102,14 @@ def run_tmtc_commander( else: if tmtc_backend is None: from tmtccmd.config.hook import get_global_hook_obj + from tmtccmd.config.globals import get_global, update_global hook_obj = get_global_hook_obj() json_cfg_path = hook_obj.get_json_config_file_path() tm_handler = get_global(CoreGlobalIds.TM_HANDLER_HANDLE) tmtc_backend = get_default_tmtc_backend( hook_obj=hook_obj, tm_handler=tm_handler, json_cfg_path=json_cfg_path ) + update_global(CoreGlobalIds.TMTC_BACKEND, tmtc_backend) __start_tmtc_commander_cli(tmtc_backend=tmtc_backend) From 593ab83d900e26b4444247a9b2d39e86d130722f Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 7 Dec 2021 14:18:50 +0100 Subject: [PATCH 004/221] integrating cfdp into tmtccmd --- src/tmtccmd/cfdp/handler.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/tmtccmd/cfdp/handler.py b/src/tmtccmd/cfdp/handler.py index c22a68c3..1e75e258 100644 --- a/src/tmtccmd/cfdp/handler.py +++ b/src/tmtccmd/cfdp/handler.py @@ -1,6 +1,7 @@ import abc import enum import os +from typing import Optional, Type from tmtccmd.utility.tmtc_printer import TmTcPrinter from tmtccmd.utility.logger import get_console_logger @@ -28,7 +29,8 @@ def transaction_indication(self): class CfdpHandler: def __init__( - self, com_if: CommunicationInterface, cfdp_type: CfdpClass, cfdp_user: CfdpUserBase + self, com_if: Optional[CommunicationInterface], cfdp_type: Optional[CfdpClass], + cfdp_user: Type[CfdpUserBase] ): self.cfdp_type = cfdp_type self.com_if = com_if @@ -36,6 +38,14 @@ def __init__( self.__busy = False pass + @property + def com_if(self): + return self.__com_if + + @com_if.setter + def com_if(self, com_if: CommunicationInterface): + self.__com_if = com_if + def state_machine(self): pass From 32ce8746894ff6eee7977846c28109f8acc9fa1f Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 7 Dec 2021 14:34:35 +0100 Subject: [PATCH 005/221] added CFDP mode to backend --- src/tmtccmd/config/definitions.py | 4 +++- src/tmtccmd/core/backend.py | 7 +++++++ src/tmtccmd/tc/packer.py | 4 +++- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/tmtccmd/config/definitions.py b/src/tmtccmd/config/definitions.py index abe86201..f9021e07 100644 --- a/src/tmtccmd/config/definitions.py +++ b/src/tmtccmd/config/definitions.py @@ -100,7 +100,8 @@ class QueueCommands(enum.Enum): class CoreModeList(enum.IntEnum): SEQUENTIAL_CMD_MODE = 0 LISTENER_MODE = 1 - GUI_MODE = 2 + CFDP_MODE = 2 + GUI_MODE = 3 IDLE = 5 PROMPT_MODE = 6 @@ -108,6 +109,7 @@ class CoreModeList(enum.IntEnum): CoreModeStrings = { CoreModeList.SEQUENTIAL_CMD_MODE: "seqcmd", CoreModeList.LISTENER_MODE: "listener", + CoreModeList.CFDP_MODE: "cfdp", CoreModeList.GUI_MODE: "gui" } diff --git a/src/tmtccmd/core/backend.py b/src/tmtccmd/core/backend.py index 401b9fa4..e28dc4d2 100644 --- a/src/tmtccmd/core/backend.py +++ b/src/tmtccmd/core/backend.py @@ -239,6 +239,13 @@ def __handle_action(self): ) sender_and_receiver.send_queue_tc_and_receive_tm_sequentially() self.mode = CoreModeList.LISTENER_MODE + elif self.mode == CoreModeList.CFDP_MODE: + # Handle replies. These will be passed to the CFDP handler automatically + if self.__tm_listener.reply_event(): + packet_queues = self.__tm_listener.retrieve_tm_packet_queues(clear=True) + if len(packet_queues) > 0: + self.__tm_handler.handle_packet_queues(packet_queue_list=packet_queues) + self.__tm_listener.clear_reply_event() else: try: from tmtccmd.config.hook import get_global_hook_obj diff --git a/src/tmtccmd/tc/packer.py b/src/tmtccmd/tc/packer.py index 03f7995b..8e3bdfa9 100644 --- a/src/tmtccmd/tc/packer.py +++ b/src/tmtccmd/tc/packer.py @@ -42,7 +42,9 @@ def default_single_packet_preparation() -> PusTelecommand: return pack_service_17_ping_command(ssc=1700) -def default_service_queue_preparation(service: Union[str, int], op_code: str, service_queue: TcQueueT): +def default_service_queue_preparation( + service: Union[str, int], op_code: str, service_queue: TcQueueT +): from tmtccmd.config.definitions import CoreServiceList, QueueCommands if service == CoreServiceList.SERVICE_5.value: pack_generic_service5_test_into(service_queue) From c3874f98b1c0d486d61ae80c78ad24e42ea6a3bb Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 7 Dec 2021 15:57:08 +0100 Subject: [PATCH 006/221] reduced number of globals by grouping them --- src/tmtccmd/config/args.py | 32 +++++++- src/tmtccmd/config/com_if.py | 15 ++-- src/tmtccmd/config/definitions.py | 37 +++++---- src/tmtccmd/config/globals.py | 80 +++++++++++++------ src/tmtccmd/core/backend.py | 5 +- src/tmtccmd/runner.py | 23 +++--- .../sendreceive/cmd_sender_receiver.py | 50 +++--------- .../sendreceive/sequential_sender_receiver.py | 7 +- src/tmtccmd/sendreceive/tm_listener.py | 7 +- 9 files changed, 149 insertions(+), 107 deletions(-) diff --git a/src/tmtccmd/config/args.py b/src/tmtccmd/config/args.py index e2696bf8..58c515ae 100644 --- a/src/tmtccmd/config/args.py +++ b/src/tmtccmd/config/args.py @@ -97,6 +97,28 @@ def add_generic_arguments(arg_parser: argparse.ArgumentParser): help='Determine whether the listener mode will be active after performing the operation', action='store_false' ) + arg_parser.add_argument( + '-f', '--file', + help='Specify file to send for CFDP put request operation' + ) + arg_parser.add_argument( + '--sf', '--source_file', + help='Source file for CFDP transactions' + ) + arg_parser.add_argument( + '--df', '--dest_file', + help='Destination file for CFDP transactions' + ) + arg_parser.add_argument( + '--tr', '--towards_receiver', + action='store_true', help='CFDP transaction direction. If no direction information is ' + 'specified, default to send towards sender' + ) + arg_parser.add_argument( + '--ts', '--towards_sender', + action='store_true', help='CFDP transaction direction. If no direction information is ' + 'specified, default to send towards sender' + ) arg_parser.add_argument( '-t', '--tm_timeout', type=float, help='TM Timeout when listening to verification sequence.' ' Default: 5 seconds', default=5.0 @@ -118,6 +140,10 @@ def add_default_mode_arguments(arg_parser: argparse.ArgumentParser): f"{CoreModeList.SEQUENTIAL_CMD_MODE} or " \ f"{CoreModeStrings[CoreModeList.SEQUENTIAL_CMD_MODE]}: " \ f"Sequential Command Mode\n" + cfdp_help = \ + f"{CoreModeList.CFDP_MODE} or " \ + f"{CoreModeStrings[CoreModeList.CFDP_MODE]}: " \ + f"GUI mode\n" listener_help = \ f"{CoreModeList.LISTENER_MODE} or {CoreModeStrings[CoreModeList.LISTENER_MODE]}: " \ f"Listener Mode\n" @@ -125,7 +151,7 @@ def add_default_mode_arguments(arg_parser: argparse.ArgumentParser): f"{CoreModeList.GUI_MODE} or " \ f"{CoreModeStrings[CoreModeList.GUI_MODE]}: " \ f"GUI mode\n" - help_text += seq_help + listener_help + gui_help + help_text += seq_help + cfdp_help + listener_help + gui_help arg_parser.add_argument( '-m', '--mode', type=str, help=help_text, default=CoreModeStrings[CoreModeList.SEQUENTIAL_CMD_MODE] @@ -203,7 +229,9 @@ def handle_unspecified_args(args) -> None: ) elif args.op_code is None: current_service = args.service - args.op_code = prompt_op_code(service_op_code_dict=service_op_code_dict, service=current_service) + args.op_code = prompt_op_code( + service_op_code_dict=service_op_code_dict, service=current_service + ) def handle_empty_args(args) -> None: diff --git a/src/tmtccmd/config/com_if.py b/src/tmtccmd/config/com_if.py index 44efc3f3..82a15282 100644 --- a/src/tmtccmd/config/com_if.py +++ b/src/tmtccmd/config/com_if.py @@ -24,8 +24,7 @@ def create_communication_interface_default( :param com_if_key: :param tmtc_printer: :param json_cfg_path: - TODO: List of packet IDs? - :param space_packet_id: Can be used by communication interfaces as a start marker (e.g. TCP) + :param space_packet_ids: Can be used by communication interfaces as a start marker (e.g. TCP) :return: """ from tmtccmd.com_if.dummy_com_if import DummyComIF @@ -83,7 +82,7 @@ def default_tcpip_cfg_setup( :func:`create_default_tcpip_interface` :param tcpip_type: :param json_cfg_path: - :param space_packet_id: Required if the TCP com interface needs to parse space packets + :param space_packet_ids: Required if the TCP com interface needs to parse space packets :return: """ from tmtccmd.com_if.tcpip_utilities import determine_udp_send_address, \ @@ -128,6 +127,7 @@ def create_default_tcpip_interface( com_if_key: str, tmtc_printer: TmTcPrinter, json_cfg_path: str, space_packet_ids: Tuple[int] = (0,) ) -> Optional[CommunicationInterface]: + from tmtccmd.config.globals import get_seq_cmd_cfg """Create a default serial interface. Requires a certain set of global variables set up. See :func:`default_tcpip_cfg_setup` for more details. @@ -152,19 +152,20 @@ def create_default_tcpip_interface( recv_addr = ethernet_cfg_dict[TcpIpConfigIds.RECV_ADDRESS] max_recv_size = ethernet_cfg_dict[TcpIpConfigIds.RECV_MAX_SIZE] init_mode = get_global(CoreGlobalIds.MODE) + seq_cmd_cfg = get_seq_cmd_cfg() space_packet_id = ethernet_cfg_dict[TcpIpConfigIds.SPACE_PACKET_ID] if com_if_key == CoreComInterfaces.TCPIP_UDP.value: communication_interface = TcpIpUdpComIF( - com_if_key=com_if_key, tm_timeout=get_global(CoreGlobalIds.TM_TIMEOUT), - tc_timeout_factor=get_global(CoreGlobalIds.TC_SEND_TIMEOUT_FACTOR), + com_if_key=com_if_key, tm_timeout=seq_cmd_cfg.tm_timeout, + tc_timeout_factor=seq_cmd_cfg.tc_send_timeout_factor, send_address=send_addr, recv_addr=recv_addr, max_recv_size=max_recv_size, tmtc_printer=tmtc_printer, init_mode=init_mode ) elif com_if_key == CoreComInterfaces.TCPIP_TCP.value: communication_interface = TcpIpTcpComIF( com_if_key=com_if_key, com_type=TcpCommunicationType.SPACE_PACKETS, - space_packet_ids=space_packet_ids, tm_timeout=get_global(CoreGlobalIds.TM_TIMEOUT), - tc_timeout_factor=get_global(CoreGlobalIds.TC_SEND_TIMEOUT_FACTOR), + space_packet_ids=space_packet_ids, tm_timeout=seq_cmd_cfg.tm_timeout, + tc_timeout_factor=seq_cmd_cfg.tc_send_timeout_factor, tm_polling_freqency=0.5, send_address=send_addr, max_recv_size=max_recv_size, tmtc_printer=tmtc_printer, init_mode=init_mode ) diff --git a/src/tmtccmd/config/definitions.py b/src/tmtccmd/config/definitions.py index f9021e07..291c8702 100644 --- a/src/tmtccmd/config/definitions.py +++ b/src/tmtccmd/config/definitions.py @@ -17,25 +17,18 @@ class CoreGlobalIds(enum.IntEnum): TMTC_BACKEND = 134 PRETTY_PRINTER = 135 - # Parameters + # Core Parameters JSON_CFG_PATH = 139 + COM_IF_DICT = 140 MODE = 141 - CURRENT_SERVICE = 142 - COM_IF = 144 - OP_CODE = 145 - TM_TIMEOUT = 146 - SERVICE_OP_CODE_DICT = 147 - COM_IF_DICT = 148 + COM_IF = 142 + SEQ_CMD_CFG = 143 + + # CFDP + CFDP_DIRECTION = 149 # Miscellaneous - DISPLAY_MODE = 150 - USE_LISTENER_AFTER_OP = 151 - PRINT_HK = 152 - PRINT_TM = 153 - PRINT_RAW_TM = 154 PRINT_TO_FILE = 155 - RESEND_TC = 156 - TC_SEND_TIMEOUT_FACTOR = 157 # Config dictionaries USE_SERIAL = 160 @@ -45,7 +38,7 @@ class CoreGlobalIds(enum.IntEnum): class OpCodeDictKeys(enum.IntEnum): - TIMEOUT = CoreGlobalIds.TM_TIMEOUT + TIMEOUT = 0 # Service Op Code Dictionary Types @@ -127,5 +120,19 @@ class CoreServiceList(enum.Enum): SERVICE_200 = "200" +class SeqTransferCfg: + service = CoreServiceList.SERVICE_17 + op_code = '0' + tm_timeout = 2.0 + tc_send_timeout_factor = 2.5 + resend_tc = False + print_hk = False + print_tm = True + print_raw_tm = True + display_mode = 'long' + service_op_code_dict = dict() + listener_after_op = False + + DEFAULT_APID = 0xef DEBUG_MODE = False diff --git a/src/tmtccmd/config/globals.py b/src/tmtccmd/config/globals.py index 4e67e51e..b5a3567b 100644 --- a/src/tmtccmd/config/globals.py +++ b/src/tmtccmd/config/globals.py @@ -9,15 +9,25 @@ set_pus_tc_version, set_pus_tm_version from tmtccmd.core.globals_manager import update_global, get_global from tmtccmd.config.definitions import CoreGlobalIds, CoreModeList, CoreServiceList, \ - CoreModeStrings, CoreComInterfacesDict, CoreComInterfaces + CoreModeStrings, CoreComInterfacesDict, CoreComInterfaces, SeqTransferCfg from tmtccmd.com_if.com_if_utilities import determine_com_if from tmtccmd.config.definitions import DEBUG_MODE, ServiceOpCodeDictT, OpCodeDictKeys, ComIFDictT, \ ServiceDictValueT, OpCodeEntryT, OpCodeInfoT, OpCodeOptionsT, OpCodeNameT +from spacepackets.cfdp.definitions import Direction + LOGGER = get_console_logger() SERVICE_OP_CODE_DICT = dict() +def set_seq_cmd_cfg(seq_cmd_cfg: SeqTransferCfg): + update_global(CoreGlobalIds.SEQ_CMD_CFG, seq_cmd_cfg) + + +def get_seq_cmd_cfg() -> SeqTransferCfg: + return get_global(CoreGlobalIds.SEQ_CMD_CFG) + + def set_json_cfg_path(json_cfg_path: str): update_global(CoreGlobalIds.JSON_CFG_PATH, json_cfg_path) @@ -39,7 +49,7 @@ def set_default_globals_pre_args_parsing( gui: bool, tc_apid: int, tm_apid: int, pus_tc_version: PusVersion = PusVersion.PUS_C, pus_tm_version: PusVersion = PusVersion.PUS_C, com_if_id: str = CoreComInterfaces.DUMMY.value, custom_com_if_dict=None, - display_mode="long", tm_timeout: float = 4.0, print_to_file: bool = True, + display_mode='long', tm_timeout: float = 4.0, print_to_file: bool = True, tc_send_timeout_factor: float = 2.0 ): if custom_com_if_dict is None: @@ -48,12 +58,9 @@ def set_default_globals_pre_args_parsing( set_default_tm_apid(tm_apid=tm_apid) set_pus_tc_version(pus_tc_version) set_pus_tm_version(pus_tm_version) + update_global(CoreGlobalIds.COM_IF, com_if_id) - update_global(CoreGlobalIds.TC_SEND_TIMEOUT_FACTOR, tc_send_timeout_factor) - update_global(CoreGlobalIds.TM_TIMEOUT, tm_timeout) - update_global(CoreGlobalIds.DISPLAY_MODE, display_mode) update_global(CoreGlobalIds.PRINT_TO_FILE, print_to_file) - update_global(CoreGlobalIds.CURRENT_SERVICE, CoreServiceList.SERVICE_17.value) update_global(CoreGlobalIds.SERIAL_CONFIG, dict()) update_global(CoreGlobalIds.ETHERNET_CONFIG, dict()) set_glob_com_if_dict(custom_com_if_dict=custom_com_if_dict) @@ -62,10 +69,18 @@ def set_default_globals_pre_args_parsing( update_global(CoreGlobalIds.TM_LISTENER_HANDLE, None) update_global(CoreGlobalIds.COM_INTERFACE_HANDLE, None) update_global(CoreGlobalIds.TMTC_PRINTER_HANDLE, None) - update_global(CoreGlobalIds.PRINT_RAW_TM, False) - update_global(CoreGlobalIds.USE_LISTENER_AFTER_OP, True) - update_global(CoreGlobalIds.RESEND_TC, False) - update_global(CoreGlobalIds.OP_CODE, "0") + + seq_cmd_cfg = SeqTransferCfg() + seq_cmd_cfg.display_mode = display_mode + seq_cmd_cfg.op_code = '0' + seq_cmd_cfg.resend_tc = False + seq_cmd_cfg.print_raw_tm = False + seq_cmd_cfg.listener_after_op = True + seq_cmd_cfg.tc_send_timeout_factor = tc_send_timeout_factor + seq_cmd_cfg.tm_timeout = tm_timeout + seq_cmd_cfg.service = CoreServiceList.SERVICE_17.value + set_seq_cmd_cfg(seq_cmd_cfg=seq_cmd_cfg) + update_global(CoreGlobalIds.MODE, CoreModeList.LISTENER_MODE) @@ -86,7 +101,8 @@ def set_default_globals_post_args_parsing( :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_if_dict: List of collections or dictionaries containing customcommunication interfaces + :param custom_com_if_dict: List of collections or dictionaries containing custom communication + interfaces :return: """ @@ -99,7 +115,20 @@ def set_default_globals_post_args_parsing( display_mode_param = "short" else: display_mode_param = "long" - update_global(CoreGlobalIds.DISPLAY_MODE, display_mode_param) + seq_cmd_cfg = get_seq_cmd_cfg() + seq_cmd_cfg.display_mode = display_mode_param + if args.mode == 'cfdp': + if not args.ts and not args.tr: + LOGGER.info('No CFDP direction specified. Assuming direction towards sender') + update_global(CoreGlobalIds.CFDP_DIRECTION, Direction.TOWARDS_SENDER) + elif args.ts and args.tr: + LOGGER.warning('CFDP direction: Both towards sender and towards receiver were specified') + LOGGER.warning('Assuming direction towards towards sender') + update_global(CoreGlobalIds.CFDP_DIRECTION, Direction.TOWARDS_SENDER) + elif args.ts: + update_global(CoreGlobalIds.CFDP_DIRECTION, Direction.TOWARDS_SENDER) + elif args.tr: + update_global(CoreGlobalIds.CFDP_DIRECTION, Direction.TOWARDS_RECEIVER) try: service_param = args.service @@ -109,7 +138,7 @@ def set_default_globals_post_args_parsing( "Setting test service ID (17)" ) service_param = CoreServiceList.SERVICE_17.value - update_global(CoreGlobalIds.CURRENT_SERVICE, service_param) + seq_cmd_cfg.service = service_param # Not used for now """ check_and_set_core_service_arg( @@ -121,8 +150,9 @@ def set_default_globals_post_args_parsing( op_code = 0 else: op_code = str(args.op_code).lower() - update_global(CoreGlobalIds.OP_CODE, op_code) + seq_cmd_cfg.op_code = op_code + set_seq_cmd_cfg(seq_cmd_cfg=seq_cmd_cfg) try: check_and_set_other_args(args=args) except AttributeError: @@ -170,21 +200,22 @@ def handle_com_if_arg( def check_and_set_other_args(args): + seq_cmd_cfg = get_seq_cmd_cfg() if args.listener is not None: - update_global(CoreGlobalIds.USE_LISTENER_AFTER_OP, args.listener) + seq_cmd_cfg.listener_after_op = args.listener if args.tm_timeout is not None: - update_global(CoreGlobalIds.TM_TIMEOUT, args.tm_timeout) + seq_cmd_cfg.tm_timeout = args.tm_timeout if args.print_hk is not None: - update_global(CoreGlobalIds.PRINT_HK, args.print_hk) + seq_cmd_cfg.print_hk = args.print_hk if args.print_tm is not None: - update_global(CoreGlobalIds.PRINT_TM, args.print_tm) + seq_cmd_cfg.print_hk = args.print_tm if args.raw_data_print is not None: - update_global(CoreGlobalIds.PRINT_RAW_TM, args.raw_data_print) + seq_cmd_cfg.print_raw_tm = args.raw_data_print if args.print_log is not None: update_global(CoreGlobalIds.PRINT_TO_FILE, args.print_log) if args.resend_tc is not None: - update_global(CoreGlobalIds.RESEND_TC, args.resend_tc) - update_global(CoreGlobalIds.TC_SEND_TIMEOUT_FACTOR, 3) + seq_cmd_cfg.resend_tc = args.resend_tc + set_seq_cmd_cfg(seq_cmd_cfg=seq_cmd_cfg) def check_and_set_core_mode_arg( @@ -237,11 +268,13 @@ def check_and_set_core_mode_arg( def check_and_set_core_service_arg( service_arg: any, custom_service_list: collections.abc.Iterable = None ): + seq_cmd_cfg = get_seq_cmd_cfg() in_enum, service_value = check_args_in_dict( param=service_arg, iterable=CoreServiceList, warning_hint="service" ) if in_enum: - update_global(CoreGlobalIds.CURRENT_SERVICE, service_value) + seq_cmd_cfg.service = service_value + set_seq_cmd_cfg(seq_cmd_cfg=seq_cmd_cfg) return service_arg_invalid = False @@ -263,7 +296,8 @@ def check_and_set_core_service_arg( f"setting to {CoreServiceList.SERVICE_17}" ) service_value = CoreServiceList.SERVICE_17 - update_global(CoreGlobalIds.CURRENT_SERVICE, service_value) + seq_cmd_cfg.service = service_value + set_seq_cmd_cfg(seq_cmd_cfg=seq_cmd_cfg) def get_default_service_op_code_dict() -> ServiceOpCodeDictT: diff --git a/src/tmtccmd/core/backend.py b/src/tmtccmd/core/backend.py index e28dc4d2..0000241e 100644 --- a/src/tmtccmd/core/backend.py +++ b/src/tmtccmd/core/backend.py @@ -234,8 +234,9 @@ def __handle_action(self): return LOGGER.info("Performing service command operation") sender_and_receiver = SequentialCommandSenderReceiver( - com_if=self.__com_if, tmtc_printer=self.__tmtc_printer, tm_handler=self.__tm_handler, - tm_listener=self.__tm_listener, tc_queue=service_queue, apid=self.__apid + com_if=self.__com_if, tmtc_printer=self.__tmtc_printer, + tm_handler=self.__tm_handler, tm_listener=self.__tm_listener, + tc_queue=service_queue, apid=self.__apid ) sender_and_receiver.send_queue_tc_and_receive_tm_sequentially() self.mode = CoreModeList.LISTENER_MODE diff --git a/src/tmtccmd/runner.py b/src/tmtccmd/runner.py index 3e9d4139..e014a7d5 100644 --- a/src/tmtccmd/runner.py +++ b/src/tmtccmd/runner.py @@ -197,7 +197,6 @@ def __handle_cli_args_and_globals(): def __start_tmtc_commander_cli(tmtc_backend: BackendBase): - __get_backend_init_variables() tmtc_backend.initialize() tmtc_backend.start_listener() @@ -228,21 +227,17 @@ def __start_tmtc_commander_qt_gui( tmtc_frontend.start(app) -def __get_backend_init_variables(): - service = get_global(CoreGlobalIds.CURRENT_SERVICE) - op_code = get_global(CoreGlobalIds.OP_CODE) - com_if = get_global(CoreGlobalIds.COM_IF) - mode = get_global(CoreGlobalIds.MODE) - return service, op_code, com_if, mode - - def get_default_tmtc_backend(hook_obj: TmTcHookBase, tm_handler: TmHandler, json_cfg_path: str): from tmtccmd.core.backend import TmTcHandler + from tmtccmd.config.globals import get_seq_cmd_cfg from tmtccmd.utility.tmtc_printer import TmTcPrinter from tmtccmd.sendreceive.tm_listener import TmListener from typing import cast - service, op_code, com_if_id, mode = __get_backend_init_variables() - display_mode = get_global(CoreGlobalIds.DISPLAY_MODE) + seq_cmd_cfg = get_seq_cmd_cfg() + service, op_code = seq_cmd_cfg.service, seq_cmd_cfg.op_code + com_if = get_global(CoreGlobalIds.COM_IF) + mode = get_global(CoreGlobalIds.MODE) + display_mode = seq_cmd_cfg.display_mode print_to_file = get_global(CoreGlobalIds.PRINT_TO_FILE) tmtc_printer = TmTcPrinter(display_mode, print_to_file, True) if tm_handler is None: @@ -258,8 +253,8 @@ def get_default_tmtc_backend(hook_obj: TmTcHookBase, tm_handler: TmHandler, json com_if = hook_obj.assign_communication_interface( com_if_key=get_global(CoreGlobalIds.COM_IF), tmtc_printer=tmtc_printer ) - tc_send_timeout_factor = get_global(CoreGlobalIds.TC_SEND_TIMEOUT_FACTOR) - tm_timeout = get_global(CoreGlobalIds.TM_TIMEOUT) + tc_send_timeout_factor = seq_cmd_cfg.tc_send_timeout_factor + tm_timeout = seq_cmd_cfg.tm_timeout tm_listener = TmListener( com_if=com_if, tm_timeout=tm_timeout, tc_timeout_factor=tc_send_timeout_factor ) @@ -269,5 +264,5 @@ def get_default_tmtc_backend(hook_obj: TmTcHookBase, tm_handler: TmHandler, json init_service=service, init_opcode=op_code, tm_handler=tm_handler ) tmtc_backend.set_current_apid(apid=apid) - tmtc_backend.set_one_shot_or_loop_handling(get_global(CoreGlobalIds.USE_LISTENER_AFTER_OP)) + tmtc_backend.set_one_shot_or_loop_handling(seq_cmd_cfg.listener_after_op) return tmtc_backend diff --git a/src/tmtccmd/sendreceive/cmd_sender_receiver.py b/src/tmtccmd/sendreceive/cmd_sender_receiver.py index b4dec13f..aca31fcd 100644 --- a/src/tmtccmd/sendreceive/cmd_sender_receiver.py +++ b/src/tmtccmd/sendreceive/cmd_sender_receiver.py @@ -1,16 +1,4 @@ -""" -Program: obsw_module_test.py -Date: 01.11.2019 -Description: All functions related to TmTc Sending and Receiving, used by UDP client - -Manual: -Set up the UDP client as specified in the header comment and use the unit testing mode - -A separate thread is used to listen for replies and send a new telecommand -if the first reply has not been received. - -@author: R. Mueller -""" +"""cmd_sender_receiver.py""" import time from tmtccmd.com_if.com_interface_base import CommunicationInterface @@ -28,24 +16,25 @@ # pylint: disable=too-many-instance-attributes class CommandSenderReceiver: - """ - This is the generic CommandSenderReceiver object. All TMTC objects inherit this object, + """This is the generic CommandSenderReceiver object. All TMTC objects inherit this object, for example specific implementations (e.g. SingleCommandSenderReceiver) """ def __init__( self, com_if: CommunicationInterface, tmtc_printer: TmTcPrinter, - tm_listener: TmListener, tm_handler: CcsdsTmHandler, apid: int + tm_listener: TmListener, tm_handler: CcsdsTmHandler, apid: int, + tm_timeout: float = 2.5, tc_send_timeout_factor: float = 2.5, + resend_tc: bool = False ): - """ :param com_if: CommunicationInterface object. Instantiate the desired one and pass it here :param tmtc_printer: TmTcPrinter object. Instantiate it and pass it here. """ - self._tm_timeout = get_global(CoreGlobalIds.TM_TIMEOUT) + self._tm_timeout = tm_timeout self._tm_handler = tm_handler - self._tc_send_timeout_factor = get_global(CoreGlobalIds.TC_SEND_TIMEOUT_FACTOR) + self._tc_send_timeout_factor = tc_send_timeout_factor self._apid = apid + self.resend_tc = resend_tc if isinstance(com_if, CommunicationInterface): self._com_if = com_if @@ -81,27 +70,22 @@ def __init__( self._wait_period = 0 self._wait_start = 0 - def set_tm_timeout(self, tm_timeout: float = -1): + def set_tm_timeout(self, tm_timeout: float): """ Set the TM timeout. Usually, the global value set by the args parser is set, but the TM timeout can be reset (e.g. for slower architectures) :param tm_timeout: New TM timeout value as a float value in seconds :return: """ - if tm_timeout == -1: - tm_timeout = get_global(CoreGlobalIds.TM_TIMEOUT) self._tm_timeout = tm_timeout - def set_tc_send_timeout_factor( - self, new_factor: float = -1): + def set_tc_send_timeout_factor(self, new_factor: float): """ Set the TC resend timeout factor. After self._tm_timeout * new_factor seconds, a telecommand will be resent again. :param new_factor: Factor as a float number :return: """ - if new_factor == -1: - new_factor = get_global(CoreGlobalIds.TC_SEND_TIMEOUT_FACTOR) self._tc_send_timeout_factor = new_factor def _check_for_first_reply(self) -> None: @@ -209,8 +193,7 @@ def _check_for_timeout(self, last_timeout: bool = True): if self._start_time != 0: self._elapsed_time = time.time() - self._start_time if self._elapsed_time >= self._tm_timeout * self._tc_send_timeout_factor: - from tmtccmd.core.globals_manager import get_global - if get_global(CoreGlobalIds.RESEND_TC): + if self.resend_tc: LOGGER.info("CommandSenderReceiver: Timeout, sending TC again !") self._com_if.send(self._last_tc) self._timeout_counter = self._timeout_counter + 1 @@ -219,14 +202,3 @@ def _check_for_timeout(self, last_timeout: bool = True): # todo: we could also stop sending and clear the TC queue self._reply_received = True time.sleep(0.5) - - # TODO: Move to TMTC printer to decouple this module? - # def print_tm_queue(self, tm_queue: TelemetryQueueT): - # while tm_queue: - # try: - # tm_packet_list = tm_queue.pop() - # for tm_packet in tm_packet_list: - # telemetry = PusTelemetry(tm_packet) - # self._tmtc_printer.print_telemetry() - # except AttributeError as e: - # LOGGER.exception("CommandSenderReceiver Exception: Invalid queue entry. Traceback:", e) diff --git a/src/tmtccmd/sendreceive/sequential_sender_receiver.py b/src/tmtccmd/sendreceive/sequential_sender_receiver.py index 2b92acd8..f37bdf51 100644 --- a/src/tmtccmd/sendreceive/sequential_sender_receiver.py +++ b/src/tmtccmd/sendreceive/sequential_sender_receiver.py @@ -22,7 +22,9 @@ class SequentialCommandSenderReceiver(CommandSenderReceiver): """Specific implementation of CommandSenderReceiver to send multiple telecommands in sequence""" def __init__( self, com_if: CommunicationInterface, tmtc_printer: TmTcPrinter, - tm_handler: CcsdsTmHandler, apid: int, tm_listener: TmListener, tc_queue: TcQueueT): + tm_handler: CcsdsTmHandler, apid: int, tm_listener: TmListener, tc_queue: TcQueueT, + tm_timeout: float = 2.5, tc_send_timeout_factor: float = 2.5 + ): """ :param com_if: CommunicationInterface object, passed on to CommandSenderReceiver :param tm_listener: TmListener object which runs in the background and receives @@ -32,7 +34,8 @@ def __init__( """ super().__init__( com_if=com_if, tmtc_printer=tmtc_printer, tm_listener=tm_listener, - tm_handler=tm_handler, apid=apid + tm_handler=tm_handler, apid=apid, tm_timeout=tm_timeout, + tc_send_timeout_factor=tc_send_timeout_factor ) self._tc_queue = tc_queue self.__all_replies_received = False diff --git a/src/tmtccmd/sendreceive/tm_listener.py b/src/tmtccmd/sendreceive/tm_listener.py index e7a77b05..ad45ae90 100644 --- a/src/tmtccmd/sendreceive/tm_listener.py +++ b/src/tmtccmd/sendreceive/tm_listener.py @@ -316,10 +316,11 @@ def __read_telemetry_sequence(self): time.sleep(0.1) # the timeout value can be set by special TC queue entries if wiretapping_packet handling # takes longer, but it is reset here to the global value - from tmtccmd.core.globals_manager import get_global + from tmtccmd.config.globals import get_seq_cmd_cfg from tmtccmd.config.definitions import CoreGlobalIds - if self.__tm_timeout is not get_global(CoreGlobalIds.TM_TIMEOUT): - self.__tm_timeout = get_global(CoreGlobalIds.TM_TIMEOUT) + seq_cmd_cfg = get_seq_cmd_cfg() + if self.__tm_timeout is not seq_cmd_cfg.tm_timeout: + self.__tm_timeout = seq_cmd_cfg.tm_timeout def __route_packets(self, tm_packet_list: TelemetryListT): """Route given packets. For CCSDS packets, use APID to do this""" From c441289c53ba39ea30f3aeb2fb49f34253447110 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 7 Dec 2021 15:59:37 +0100 Subject: [PATCH 007/221] some tweaks --- src/tmtccmd/config/globals.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/tmtccmd/config/globals.py b/src/tmtccmd/config/globals.py index b5a3567b..c19d750c 100644 --- a/src/tmtccmd/config/globals.py +++ b/src/tmtccmd/config/globals.py @@ -12,7 +12,7 @@ CoreModeStrings, CoreComInterfacesDict, CoreComInterfaces, SeqTransferCfg from tmtccmd.com_if.com_if_utilities import determine_com_if from tmtccmd.config.definitions import DEBUG_MODE, ServiceOpCodeDictT, OpCodeDictKeys, ComIFDictT, \ - ServiceDictValueT, OpCodeEntryT, OpCodeInfoT, OpCodeOptionsT, OpCodeNameT + OpCodeEntryT, OpCodeOptionsT, OpCodeNameT from spacepackets.cfdp.definitions import Direction @@ -315,7 +315,6 @@ def get_default_service_op_code_dict() -> ServiceOpCodeDictT: service_op_code_dict[CoreServiceList.SERVICE_5.value] = service_5_tuple service_op_code_dict[CoreServiceList.SERVICE_17.value] = service_17_tuple - # SERVICE_OP_CODE_DICT = service_op_code_dict return service_op_code_dict From 243c8b2f5da2db9c313452c06a9fecd1db94aab1 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 7 Dec 2021 16:08:17 +0100 Subject: [PATCH 008/221] found a place to transfer cfdp cfg --- src/tmtccmd/config/cfdp.py | 7 +++++++ src/tmtccmd/config/definitions.py | 2 +- src/tmtccmd/config/globals.py | 19 ++++++++++++++----- 3 files changed, 22 insertions(+), 6 deletions(-) create mode 100644 src/tmtccmd/config/cfdp.py diff --git a/src/tmtccmd/config/cfdp.py b/src/tmtccmd/config/cfdp.py new file mode 100644 index 00000000..ea6d65a7 --- /dev/null +++ b/src/tmtccmd/config/cfdp.py @@ -0,0 +1,7 @@ +from spacepackets.cfdp.definitions import Direction + + +class CfdpCfg: + direction = Direction.TOWARDS_SENDER + source_file_name = "" + dest_file_name = "" diff --git a/src/tmtccmd/config/definitions.py b/src/tmtccmd/config/definitions.py index 291c8702..f21d0a0a 100644 --- a/src/tmtccmd/config/definitions.py +++ b/src/tmtccmd/config/definitions.py @@ -25,7 +25,7 @@ class CoreGlobalIds(enum.IntEnum): SEQ_CMD_CFG = 143 # CFDP - CFDP_DIRECTION = 149 + CFDP_CFG = 150 # Miscellaneous PRINT_TO_FILE = 155 diff --git a/src/tmtccmd/config/globals.py b/src/tmtccmd/config/globals.py index c19d750c..914e9fac 100644 --- a/src/tmtccmd/config/globals.py +++ b/src/tmtccmd/config/globals.py @@ -11,6 +11,7 @@ from tmtccmd.config.definitions import CoreGlobalIds, CoreModeList, CoreServiceList, \ CoreModeStrings, CoreComInterfacesDict, CoreComInterfaces, SeqTransferCfg from tmtccmd.com_if.com_if_utilities import determine_com_if +from tmtccmd.config.cfdp import CfdpCfg from tmtccmd.config.definitions import DEBUG_MODE, ServiceOpCodeDictT, OpCodeDictKeys, ComIFDictT, \ OpCodeEntryT, OpCodeOptionsT, OpCodeNameT @@ -28,6 +29,14 @@ def get_seq_cmd_cfg() -> SeqTransferCfg: return get_global(CoreGlobalIds.SEQ_CMD_CFG) +def set_cfdp_cfg(cfdp_cfg: CfdpCfg): + update_global(CoreGlobalIds.CFDP_CFG, cfdp_cfg) + + +def get_cfdp_cfg() -> CfdpCfg: + return get_global(CoreGlobalIds.CFDP_CFG) + + def set_json_cfg_path(json_cfg_path: str): update_global(CoreGlobalIds.JSON_CFG_PATH, json_cfg_path) @@ -118,17 +127,17 @@ def set_default_globals_post_args_parsing( seq_cmd_cfg = get_seq_cmd_cfg() seq_cmd_cfg.display_mode = display_mode_param if args.mode == 'cfdp': + cfdp_cfg = get_cfdp_cfg() + direction = Direction.TOWARDS_SENDER if not args.ts and not args.tr: LOGGER.info('No CFDP direction specified. Assuming direction towards sender') - update_global(CoreGlobalIds.CFDP_DIRECTION, Direction.TOWARDS_SENDER) elif args.ts and args.tr: LOGGER.warning('CFDP direction: Both towards sender and towards receiver were specified') LOGGER.warning('Assuming direction towards towards sender') - update_global(CoreGlobalIds.CFDP_DIRECTION, Direction.TOWARDS_SENDER) - elif args.ts: - update_global(CoreGlobalIds.CFDP_DIRECTION, Direction.TOWARDS_SENDER) elif args.tr: - update_global(CoreGlobalIds.CFDP_DIRECTION, Direction.TOWARDS_RECEIVER) + direction = Direction.TOWARDS_RECEIVER + cfdp_cfg.direction = direction + set_cfdp_cfg(cfdp_cfg=cfdp_cfg) try: service_param = args.service From 909662165aa6da4a572a4b33238b0582f0a995d7 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 7 Dec 2021 16:12:01 +0100 Subject: [PATCH 009/221] applied black formatter --- docs/conf.py | 29 ++- example/config/definitions.py | 2 +- example/config/hook_implementation.py | 24 +- example/tmtc_cli.py | 8 +- example/tmtc_gui.py | 2 +- lint.py | 29 +-- src/tests/backend_mock.py | 22 +- src/tests/hook_obj_mock.py | 21 +- src/tests/test_global_manager.py | 43 ++-- src/tests/test_obj_id_manager.py | 1 - src/tests/test_printer.py | 14 +- src/tests/test_pus.py | 15 +- src/tests/test_runner.py | 19 +- src/tmtccmd/ccsds/handler.py | 15 +- src/tmtccmd/cfdp/handler.py | 28 ++- src/tmtccmd/com_if/com_if_utilities.py | 10 +- src/tmtccmd/com_if/com_interface_base.py | 1 + src/tmtccmd/com_if/dummy_com_if.py | 21 +- src/tmtccmd/com_if/qemu_com_if.py | 53 ++-- src/tmtccmd/com_if/serial_com_if.py | 55 +++-- src/tmtccmd/com_if/serial_utilities.py | 116 +++++---- src/tmtccmd/com_if/tcpip_tcp_com_if.py | 37 ++- src/tmtccmd/com_if/tcpip_udp_com_if.py | 20 +- src/tmtccmd/com_if/tcpip_utilities.py | 45 ++-- src/tmtccmd/config/args.py | 210 ++++++++++------ src/tmtccmd/config/com_if.py | 151 ++++++++---- src/tmtccmd/config/definitions.py | 11 +- src/tmtccmd/config/globals.py | 113 ++++++--- src/tmtccmd/config/hook.py | 19 +- src/tmtccmd/config/objects.py | 2 +- src/tmtccmd/core/backend.py | 70 ++++-- src/tmtccmd/core/frontend.py | 104 ++++---- src/tmtccmd/core/frontend_base.py | 1 - src/tmtccmd/pus/obj_id.py | 10 +- src/tmtccmd/pus/service_17_test.py | 37 ++- src/tmtccmd/pus/service_1_verification.py | 48 ++-- src/tmtccmd/pus/service_20_parameter.py | 2 +- src/tmtccmd/pus/service_5_event.py | 10 +- src/tmtccmd/pus/service_8_func_cmd.py | 2 +- src/tmtccmd/runner.py | 61 +++-- .../sendreceive/cmd_sender_receiver.py | 21 +- .../multiple_cmds_sender_receiver.py | 29 ++- .../sendreceive/sequential_sender_receiver.py | 31 ++- .../single_command_sender_receiver.py | 20 +- src/tmtccmd/sendreceive/tm_listener.py | 109 ++++++--- src/tmtccmd/tc/packer.py | 12 +- src/tmtccmd/tc/service_200_mode.py | 11 +- src/tmtccmd/tc/service_20_parameter.py | 24 +- src/tmtccmd/tc/service_3_housekeeping.py | 28 +-- src/tmtccmd/tc/service_5_event.py | 9 +- src/tmtccmd/tc/service_8_functional_cmd.py | 17 +- src/tmtccmd/tm/base.py | 33 +-- src/tmtccmd/tm/handler.py | 8 +- src/tmtccmd/tm/service_200_mode.py | 45 ++-- src/tmtccmd/tm/service_20_parameters.py | 70 ++++-- src/tmtccmd/tm/service_23_file_mgmt.py | 48 ++-- src/tmtccmd/tm/service_2_raw_cmd.py | 25 +- src/tmtccmd/tm/service_3_base.py | 1 + src/tmtccmd/tm/service_3_housekeeping.py | 99 +++++--- src/tmtccmd/tm/service_5_event.py | 46 ++-- src/tmtccmd/tm/service_8_functional_cmd.py | 43 +++- src/tmtccmd/utility/conf_util.py | 20 +- src/tmtccmd/utility/exit_handler.py | 4 +- src/tmtccmd/utility/hammingcode.py | 96 +++++--- src/tmtccmd/utility/json_handler.py | 50 ++-- src/tmtccmd/utility/logger.py | 44 ++-- src/tmtccmd/utility/tmtc_printer.py | 229 +++++++++++------- 67 files changed, 1702 insertions(+), 951 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index c81210ed..1a90a41f 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -12,14 +12,15 @@ # import os import sys -sys.path.insert(0, os.path.abspath('../src')) + +sys.path.insert(0, os.path.abspath("../src")) import tmtccmd # -- Project information ----------------------------------------------------- -project = 'tmtccmd' -copyright = '2021, Robin Mueller' -author = 'Robin Mueller' +project = "tmtccmd" +copyright = "2021, Robin Mueller" +author = "Robin Mueller" # The full version, including alpha/beta/rc tags version = release = tmtccmd.__version__ @@ -29,37 +30,35 @@ # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. -extensions = ['sphinx.ext.autodoc', 'sphinx.ext.intersphinx'] +extensions = ["sphinx.ext.autodoc", "sphinx.ext.intersphinx"] # Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] +templates_path = ["_templates"] # The suffix of source filenames. -source_suffix = '.rst' +source_suffix = ".rst" # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. # This pattern also affects html_static_path and html_extra_path. -exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] +exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] # List of directories, relative to source directory, that shouldn't be searched # for source files. -exclude_trees = ['_build'] +exclude_trees = ["_build"] -intersphinx_mapping = { - "python": ("https://docs.python.org/3", None) -} +intersphinx_mapping = {"python": ("https://docs.python.org/3", None)} # -- Options for HTML output ------------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. # -html_theme = 'alabaster' +html_theme = "alabaster" # The name of an image file (relative to this directory) to place at the top # of the sidebar. -html_logo = 'logo_tmtccmd.png' +html_logo = "logo_tmtccmd.png" # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, @@ -70,4 +69,4 @@ # The name of an image file (relative to this directory) to place at the top of # the title page. -latex_logo = 'logo_tmtccmd.png' +latex_logo = "logo_tmtccmd.png" diff --git a/example/config/definitions.py b/example/config/definitions.py index d18cad0f..86b23cc0 100644 --- a/example/config/definitions.py +++ b/example/config/definitions.py @@ -1 +1 @@ -APID = 0xef +APID = 0xEF diff --git a/example/config/hook_implementation.py b/example/config/hook_implementation.py index 33b9be52..9ad6afcf 100644 --- a/example/config/hook_implementation.py +++ b/example/config/hook_implementation.py @@ -11,36 +11,44 @@ from tmtccmd.tm.service_3_base import Service3Base from config.definitions import APID + LOGGER = get_console_logger() class ExampleHookClass(TmTcHookBase): - def add_globals_pre_args_parsing(self, gui: bool = False): from tmtccmd.config.globals import set_default_globals_pre_args_parsing + set_default_globals_pre_args_parsing(gui=gui, tc_apid=APID, tm_apid=APID) def add_globals_post_args_parsing(self, args: argparse.Namespace): from tmtccmd.config.globals import set_default_globals_post_args_parsing + set_default_globals_post_args_parsing( args=args, json_cfg_path=self.get_json_config_file_path() ) - def assign_communication_interface(self, com_if_key: str, tmtc_printer: TmTcPrinter) -> \ - Union[CommunicationInterface, None]: + def assign_communication_interface( + self, com_if_key: str, tmtc_printer: TmTcPrinter + ) -> Union[CommunicationInterface, None]: from tmtccmd.config.com_if import create_communication_interface_default + LOGGER.info("Communication interface assignment function was called") return create_communication_interface_default( - com_if_key=com_if_key, tmtc_printer=tmtc_printer, - json_cfg_path=self.get_json_config_file_path() + com_if_key=com_if_key, + tmtc_printer=tmtc_printer, + json_cfg_path=self.get_json_config_file_path(), ) def perform_mode_operation(self, tmtc_backend: TmTcHandler, mode: int): LOGGER.info("Mode operation hook was called") pass - def pack_service_queue(self, service: Union[str, int], op_code: str, service_queue: TcQueueT): + def pack_service_queue( + self, service: Union[str, int], op_code: str, service_queue: TcQueueT + ): from tmtccmd.tc.packer import default_service_queue_preparation + LOGGER.info("Service queue packer hook was called") default_service_queue_preparation( service=service, op_code=op_code, service_queue=service_queue @@ -48,15 +56,17 @@ def pack_service_queue(self, service: Union[str, int], op_code: str, service_que def get_object_ids(self) -> Dict[bytes, list]: from tmtccmd.config.objects import get_core_object_ids + return get_core_object_ids() def get_service_op_code_dictionary(self) -> ServiceOpCodeDictT: from tmtccmd.config.globals import get_default_service_op_code_dict + return get_default_service_op_code_dict() @staticmethod def handle_service_8_telemetry( - object_id: int, action_id: int, custom_data: bytearray + object_id: int, action_id: int, custom_data: bytearray ) -> Tuple[list, list]: pass diff --git a/example/tmtc_cli.py b/example/tmtc_cli.py index 2b3e1e26..02372089 100755 --- a/example/tmtc_cli.py +++ b/example/tmtc_cli.py @@ -2,7 +2,11 @@ """Example application for the TMTC Commander """ from tmtccmd.ccsds.handler import CcsdsTmHandler -from tmtccmd.runner import run_tmtc_commander, initialize_tmtc_commander, add_ccsds_handler +from tmtccmd.runner import ( + run_tmtc_commander, + initialize_tmtc_commander, + add_ccsds_handler, +) from tmtccmd.tm.handler import default_ccsds_packet_handler from config.hook_implementation import ExampleHookClass @@ -20,5 +24,5 @@ def main(): run_tmtc_commander(use_gui=False) -if __name__ == '__main__': +if __name__ == "__main__": main() diff --git a/example/tmtc_gui.py b/example/tmtc_gui.py index b032ff46..9ee90c02 100644 --- a/example/tmtc_gui.py +++ b/example/tmtc_gui.py @@ -12,5 +12,5 @@ def main(): run_tmtc_commander(use_gui=True, app_name="TMTC Commander Example") -if __name__ == '__main__': +if __name__ == "__main__": main() diff --git a/lint.py b/lint.py index 79ef08e1..91933a0a 100755 --- a/lint.py +++ b/lint.py @@ -5,25 +5,26 @@ def main(): # Ignore folder created by venv - exclude_dirs_flag = '--exclude bin,lib' - additional_flags_both_steps = '--count --statistics' - additional_flags_first_step = '--select=E9,F63,F7,F82 --show-source' - flake8_first_step_cmd = \ - f'flake8 . {additional_flags_both_steps} {additional_flags_first_step} {exclude_dirs_flag}' + exclude_dirs_flag = "--exclude bin,lib" + additional_flags_both_steps = "--count --statistics" + additional_flags_first_step = "--select=E9,F63,F7,F82 --show-source" + flake8_first_step_cmd = f"flake8 . {additional_flags_both_steps} {additional_flags_first_step} {exclude_dirs_flag}" status = os.system(flake8_first_step_cmd) - if os.name == 'nt': + if os.name == "nt": if status != 0: - print(f'Flake8 linter errors with status {status}') + print(f"Flake8 linter errors with status {status}") else: if os.WEXITSTATUS(status) != 0: - print(f'Flake8 linter errors with status {status}') + print(f"Flake8 linter errors with status {status}") sys.exit(0) - additional_flags_second_step = \ - '--exit-zero --max-complexity=10 --per-file-ignores="__init__.py:F401" ' \ - '--max-line-length=127' - flake8_second_step_cmd = \ - f'flake8 . {additional_flags_both_steps} {additional_flags_second_step}' \ - f' {exclude_dirs_flag}' + additional_flags_second_step = ( + '--exit-zero --max-complexity=10 --per-file-ignores="__init__.py:F401" ' + "--max-line-length=127" + ) + flake8_second_step_cmd = ( + f"flake8 . {additional_flags_both_steps} {additional_flags_second_step}" + f" {exclude_dirs_flag}" + ) os.system(flake8_second_step_cmd) diff --git a/src/tests/backend_mock.py b/src/tests/backend_mock.py index da3d8ba8..97bb32aa 100644 --- a/src/tests/backend_mock.py +++ b/src/tests/backend_mock.py @@ -10,17 +10,24 @@ def create_backend_mock(tm_handler: CcsdsTmHandler) -> TmTcHandler: - tmtc_printer = TmTcPrinter(display_mode=DisplayMode.LONG, do_print_to_file=False, print_tc=True) - com_if = create_communication_interface_default( - com_if_key=CoreComInterfaces.DUMMY.value, json_cfg_path="tmtc_config.json", tmtc_printer=tmtc_printer + tmtc_printer = TmTcPrinter( + display_mode=DisplayMode.LONG, do_print_to_file=False, print_tc=True ) - tm_listener = TmListener( - com_if=com_if, tm_timeout=3.0, tc_timeout_factor=3.0 + com_if = create_communication_interface_default( + com_if_key=CoreComInterfaces.DUMMY.value, + json_cfg_path="tmtc_config.json", + tmtc_printer=tmtc_printer, ) + tm_listener = TmListener(com_if=com_if, tm_timeout=3.0, tc_timeout_factor=3.0) # The global variables are set by the argument parser. tmtc_backend = TmTcHandler( - com_if=com_if, tmtc_printer=tmtc_printer, tm_listener=tm_listener, - init_mode=CoreModeList.IDLE, init_service=17, init_opcode="0", tm_handler=tm_handler + com_if=com_if, + tmtc_printer=tmtc_printer, + tm_listener=tm_listener, + init_mode=CoreModeList.IDLE, + init_service=17, + init_opcode="0", + tm_handler=tm_handler, ) tmtc_backend.start_listener = MagicMock(return_value=0) tmtc_backend.initialize = MagicMock(return_value=0) @@ -29,6 +36,7 @@ def create_backend_mock(tm_handler: CcsdsTmHandler) -> TmTcHandler: def create_frontend_mock() -> FrontendBase: from tmtccmd.core.frontend_base import FrontendBase + tmtc_frontend = FrontendBase() tmtc_frontend.start = MagicMock(return_value=0) return tmtc_frontend diff --git a/src/tests/hook_obj_mock.py b/src/tests/hook_obj_mock.py index bac709d6..83c0917a 100644 --- a/src/tests/hook_obj_mock.py +++ b/src/tests/hook_obj_mock.py @@ -35,7 +35,9 @@ def create_hook_mock_with_srv_handlers() -> TmTcHookBase: tmtc_hook_base.handle_service_5_event = MagicMock(return_value="Test Custom String") # Valid returnvalue for now srv_3_return_tuple = (["Test"], [0], bytearray(0b10000000), 1) - tmtc_hook_base.handle_service_3_housekeeping = MagicMock(return_value=srv_3_return_tuple) + tmtc_hook_base.handle_service_3_housekeeping = MagicMock( + return_value=srv_3_return_tuple + ) return tmtc_hook_base @@ -67,6 +69,7 @@ def add_globals_pre_args_parsing(self, gui: bool = False): :return: """ from tmtccmd.config.globals import set_default_globals_pre_args_parsing + set_default_globals_pre_args_parsing(gui=gui, apid=DEFAULT_APID) @abstractmethod @@ -76,13 +79,14 @@ def add_globals_post_args_parsing(self, args: argparse.Namespace): :param args: Specify whether a GUI is used """ from tmtccmd.config.globals import set_default_globals_post_args_parsing + set_default_globals_post_args_parsing( args=args, json_cfg_path=self.get_json_config_file_path() ) @abstractmethod def assign_communication_interface( - self, com_if_key: str, tmtc_printer: TmTcPrinter + self, com_if_key: str, tmtc_printer: TmTcPrinter ) -> Optional[CommunicationInterface]: """Assign the communication interface used by the TMTC commander to send and receive TMTC with. @@ -91,9 +95,11 @@ def assign_communication_interface( :param tmtc_printer: Printer utility instance. """ from tmtccmd.config.com_if import create_communication_interface_default + return create_communication_interface_default( - com_if_key=com_if_key, tmtc_printer=tmtc_printer, - json_cfg_path=self.get_json_config_file_path() + com_if_key=com_if_key, + tmtc_printer=tmtc_printer, + json_cfg_path=self.get_json_config_file_path(), ) @abstractmethod @@ -104,6 +110,7 @@ def get_service_op_code_dictionary(self) -> ServiceOpCodeDictT: :return: """ from tmtccmd.config.globals import get_default_service_op_code_dict + return get_default_service_op_code_dict() @abstractmethod @@ -116,7 +123,9 @@ def perform_mode_operation(self, tmtc_backend: TmTcHandler, mode: int): pass @abstractmethod - def pack_service_queue(self, service: Union[int, str], op_code: str, service_queue: TcQueueT): + def pack_service_queue( + self, service: Union[int, str], op_code: str, service_queue: TcQueueT + ): """Overriding this function allows the user to package a telecommand queue for a given service and operation code combination. @@ -129,7 +138,7 @@ def pack_service_queue(self, service: Union[int, str], op_code: str, service_que @staticmethod def handle_service_8_telemetry( - object_id: bytes, action_id: int, custom_data: bytearray + object_id: bytes, action_id: int, custom_data: bytearray ) -> Tuple[list, list]: """This function is called by the TMTC core to handle Service 8 packets The user can return a tuple of two lists, where the first list diff --git a/src/tests/test_global_manager.py b/src/tests/test_global_manager.py index 4406866e..91b00bea 100644 --- a/src/tests/test_global_manager.py +++ b/src/tests/test_global_manager.py @@ -1,39 +1,44 @@ from unittest import TestCase -from tmtccmd.config.globals import update_global, get_global, \ - set_json_cfg_path, get_json_cfg_path, set_glob_com_if_dict, get_glob_com_if_dict, \ - set_default_globals_pre_args_parsing, check_and_set_core_mode_arg, CoreModeList, \ - CoreGlobalIds +from tmtccmd.config.globals import ( + update_global, + get_global, + set_json_cfg_path, + get_json_cfg_path, + set_glob_com_if_dict, + get_glob_com_if_dict, + set_default_globals_pre_args_parsing, + check_and_set_core_mode_arg, + CoreModeList, + CoreGlobalIds, +) class TestGlobalManager(TestCase): - def test_global_module(self): - update_global(global_param_id=30, parameter='hello') - self.assertTrue(get_global(global_param_id=30) == 'hello') + update_global(global_param_id=30, parameter="hello") + self.assertTrue(get_global(global_param_id=30) == "hello") current_path = get_json_cfg_path() - set_json_cfg_path('.') - self.assertTrue(get_json_cfg_path() == '.') + set_json_cfg_path(".") + self.assertTrue(get_json_cfg_path() == ".") set_json_cfg_path(current_path) - custom_com_if_dict = { - "test": ("Test Interface", "") - } + custom_com_if_dict = {"test": ("Test Interface", "")} set_glob_com_if_dict(custom_com_if_dict=custom_com_if_dict) com_if_dict = get_glob_com_if_dict() self.assertTrue(com_if_dict["test"][0] == "Test Interface") - set_default_globals_pre_args_parsing( - gui=False, tc_apid=0x02, tm_apid=0x03 - ) + set_default_globals_pre_args_parsing(gui=False, tc_apid=0x02, tm_apid=0x03) - result = check_and_set_core_mode_arg(mode_arg='udp') + result = check_and_set_core_mode_arg(mode_arg="udp") self.assertTrue(result == CoreModeList.SEQUENTIAL_CMD_MODE) - result = check_and_set_core_mode_arg(mode_arg='listener') + result = check_and_set_core_mode_arg(mode_arg="listener") self.assertTrue(get_global(CoreGlobalIds.MODE) == CoreModeList.LISTENER_MODE) self.assertTrue(result == CoreModeList.LISTENER_MODE) - result = check_and_set_core_mode_arg(mode_arg='seqcmd') - self.assertTrue(get_global(CoreGlobalIds.MODE) == CoreModeList.SEQUENTIAL_CMD_MODE) + result = check_and_set_core_mode_arg(mode_arg="seqcmd") + self.assertTrue( + get_global(CoreGlobalIds.MODE) == CoreModeList.SEQUENTIAL_CMD_MODE + ) self.assertTrue(result == CoreModeList.SEQUENTIAL_CMD_MODE) diff --git a/src/tests/test_obj_id_manager.py b/src/tests/test_obj_id_manager.py index 8158d199..db1facbf 100644 --- a/src/tests/test_obj_id_manager.py +++ b/src/tests/test_obj_id_manager.py @@ -5,7 +5,6 @@ class TestObjIdManager(TestCase): - def test_obj_id_manager(self): insert_object_id(object_id=TEST_ID_0, object_id_info=["TEST_ID_0"]) info_list = get_object_id_info(object_id=TEST_ID_0) diff --git a/src/tests/test_printer.py b/src/tests/test_printer.py index bdf8fd6b..d76d1abb 100644 --- a/src/tests/test_printer.py +++ b/src/tests/test_printer.py @@ -14,7 +14,6 @@ class TestPrinter(TestCase): - def setUp(self): self.tmtc_printer = TmTcPrinter() self.logger = get_console_logger() @@ -46,8 +45,12 @@ def test_print_functions(self): self.tmtc_printer.set_display_mode(DisplayMode.LONG) service_5_tm = Service5TM( - subservice=Srv5Subservices.INFO_EVENT, object_id=bytearray([0x01, 0x02, 0x03, 0x04]), - event_id=22, param_1=32, param_2=82452, time=CdsShortTimestamp.init_from_current_time() + subservice=Srv5Subservices.INFO_EVENT, + object_id=bytearray([0x01, 0x02, 0x03, 0x04]), + event_id=22, + param_1=32, + param_2=82452, + time=CdsShortTimestamp.init_from_current_time(), ) hook_base = create_hook_mock_with_srv_handlers() initialize_tmtc_commander(hook_object=hook_base) @@ -56,7 +59,10 @@ def test_print_functions(self): self.tmtc_printer.print_telemetry(packet_if=service_5_tm, info_if=service_5_tm) hook_base.handle_service_5_event.assert_called_with( - object_id=bytes([0x01, 0x02, 0x03, 0x04]), event_id=22, param_1=32, param_2=82452 + object_id=bytes([0x01, 0x02, 0x03, 0x04]), + event_id=22, + param_1=32, + param_2=82452, ) service_17_command = pack_service_17_ping_command(ssc=0, apid=42) diff --git a/src/tests/test_pus.py b/src/tests/test_pus.py index 8796ba65..cccaf691 100755 --- a/src/tests/test_pus.py +++ b/src/tests/test_pus.py @@ -10,11 +10,12 @@ class TestTelemetry(TestCase): - def test_generic_pus_c(self): pus_17_telemetry = Service17TMExtended( - subservice=1, ssc=36, time=CdsShortTimestamp.init_from_current_time(), - apid=0xef + subservice=1, + ssc=36, + time=CdsShortTimestamp.init_from_current_time(), + apid=0xEF, ) pus_17_raw = pus_17_telemetry.pack() @@ -29,7 +30,7 @@ def tm_func(raw_telemetry: bytearray): pus_17_telemetry = Service17TMExtended.unpack(raw_telemetry=pus_17_raw) self.assertTrue(get_pus_tm_version() == PusVersion.PUS_C) self.assertTrue(pus_17_telemetry.service == 17) - self.assertTrue(pus_17_telemetry.apid == 0xef) + self.assertTrue(pus_17_telemetry.apid == 0xEF) self.assertTrue(pus_17_telemetry.subservice == 1) self.assertTrue(pus_17_telemetry.ssc == 36) self.assertTrue(pus_17_telemetry.tm_data == bytearray()) @@ -39,11 +40,13 @@ def tm_func(raw_telemetry: bytearray): pus_17_telemetry.pus_tm.print_source_data(print_format=PrintFormats.HEX) pus_17_telemetry.pus_tm.print_full_packet_string(print_format=PrintFormats.HEX) # This string changes depending on system time, so its complicated to test its validity - full_string = pus_17_telemetry.pus_tm.get_full_packet_string(print_format=PrintFormats.HEX) + full_string = pus_17_telemetry.pus_tm.get_full_packet_string( + print_format=PrintFormats.HEX + ) print(full_string) print(pus_17_telemetry) print(repr(pus_17_telemetry)) - self.assertTrue(pus_17_telemetry.pus_tm.packet_id == 0x8 << 8 | 0xef) + self.assertTrue(pus_17_telemetry.pus_tm.packet_id == 0x8 << 8 | 0xEF) def test_list_functionality(self): pus_17_telecommand = Service17TMExtended( diff --git a/src/tests/test_runner.py b/src/tests/test_runner.py index ca23ae2f..cfd235d6 100644 --- a/src/tests/test_runner.py +++ b/src/tests/test_runner.py @@ -1,13 +1,16 @@ from unittest import TestCase from tmtccmd.ccsds.handler import CcsdsTmHandler -from tmtccmd.runner import run_tmtc_commander, initialize_tmtc_commander, get_default_tmtc_backend +from tmtccmd.runner import ( + run_tmtc_commander, + initialize_tmtc_commander, + get_default_tmtc_backend, +) from tests.backend_mock import create_backend_mock, create_frontend_mock from tests.hook_obj_mock import create_hook_mock class TestTmtcRunner(TestCase): - def test_tmtc_runner(self): hook_base = create_hook_mock() tm_handler = CcsdsTmHandler(tmtc_printer=None) @@ -30,12 +33,6 @@ def test_tmtc_runner(self): self.assertTrue(default_backend is not None) def test_errors(self): - self.assertRaises( - ValueError, initialize_tmtc_commander, None - ) - self.assertRaises( - TypeError, run_tmtc_commander - ) - self.assertRaises( - RuntimeError, run_tmtc_commander, False - ) + self.assertRaises(ValueError, initialize_tmtc_commander, None) + self.assertRaises(TypeError, run_tmtc_commander) + self.assertRaises(RuntimeError, run_tmtc_commander, False) diff --git a/src/tmtccmd/ccsds/handler.py b/src/tmtccmd/ccsds/handler.py index 4fb37998..658cf2bd 100644 --- a/src/tmtccmd/ccsds/handler.py +++ b/src/tmtccmd/ccsds/handler.py @@ -16,6 +16,7 @@ class CcsdsTmHandler(TmHandler): """Generic CCSDS handler class. The user can create an instance of this class to handle CCSDS packets with different APIDs""" + def __init__(self, tmtc_printer: Optional[TmTcPrinter] = None): super().__init__(tm_type=TmTypes.CCSDS_SPACE_PACKETS) self._handler_dict: HandlerDictT = dict() @@ -24,7 +25,9 @@ def __init__(self, tmtc_printer: Optional[TmTcPrinter] = None): def initialize(self, tmtc_printer: TmTcPrinter): self._tmtc_printer = tmtc_printer - def add_tm_handler(self, apid: int, pus_tm_handler: CcsdsCallbackT, max_queue_len: int): + def add_tm_handler( + self, apid: int, pus_tm_handler: CcsdsCallbackT, max_queue_len: int + ): """Add a TM handler for a certain APID. The handler is a callback function which will be called if telemetry with that APID arrives :param apid: CCSDS Application Process ID @@ -34,7 +37,9 @@ def add_tm_handler(self, apid: int, pus_tm_handler: CcsdsCallbackT, max_queue_le """ self._handler_dict[apid] = pus_tm_handler, max_queue_len - def add_cfdp_handler(self, apid: int, cfdp_handler: CfdpHandler, max_queue_len: int): + def add_cfdp_handler( + self, apid: int, cfdp_handler: CfdpHandler, max_queue_len: int + ): self._handler_dict[apid] = cfdp_handler.pass_packet, max_queue_len def get_apid_queue_len_list(self) -> List[Tuple[int, int]]: @@ -54,8 +59,10 @@ def handle_packet_queues(self, packet_queue_list: QueueListT): ) def handle_ccsds_packet_queue( - self, apid: int, packet_queue: TelemetryQueueT, - ccsds_cb: Optional[CcsdsCallbackT] = None + self, + apid: int, + packet_queue: TelemetryQueueT, + ccsds_cb: Optional[CcsdsCallbackT] = None, ): for tm_packet in packet_queue: if ccsds_cb is None: diff --git a/src/tmtccmd/cfdp/handler.py b/src/tmtccmd/cfdp/handler.py index 1e75e258..48247672 100644 --- a/src/tmtccmd/cfdp/handler.py +++ b/src/tmtccmd/cfdp/handler.py @@ -14,7 +14,7 @@ class CfdpClass(enum.Enum): - UNRELIABLE_CL1 = 0, + UNRELIABLE_CL1 = (0,) RELIABLE_CL2 = 1 @@ -29,8 +29,10 @@ def transaction_indication(self): class CfdpHandler: def __init__( - self, com_if: Optional[CommunicationInterface], cfdp_type: Optional[CfdpClass], - cfdp_user: Type[CfdpUserBase] + self, + com_if: Optional[CommunicationInterface], + cfdp_type: Optional[CfdpClass], + cfdp_user: Type[CfdpUserBase], ): self.cfdp_type = cfdp_type self.com_if = com_if @@ -49,7 +51,9 @@ def com_if(self, com_if: CommunicationInterface): def state_machine(self): pass - def pass_packet(self, apid: int, raw_tm_packet: bytearray, tmtc_printer: TmTcPrinter): + def pass_packet( + self, apid: int, raw_tm_packet: bytearray, tmtc_printer: TmTcPrinter + ): pass def put_request(self, cfdp_type: CfdpClass): @@ -60,8 +64,12 @@ def put_request(self, cfdp_type: CfdpClass): self.cfdp_type = cfdp_type def send_metadata_pdu( - self, pdu_conf: PduConfig, file_repository: str, file_name: str, dest_repository: str, - dest_name: str + self, + pdu_conf: PduConfig, + file_repository: str, + file_name: str, + dest_repository: str, + dest_name: str, ): if self.cfdp_type == CfdpClass.RELIABLE_CL2: pdu_conf.trans_mode = TransmissionModes.ACKNOWLEDGED @@ -70,8 +78,12 @@ def send_metadata_pdu( source_file = os.path.join(file_repository, file_name) dest_file = os.path.join(dest_repository, dest_name) metadata_pdu = MetadataPdu( - pdu_conf=pdu_conf, file_size=0, source_file_name=source_file, dest_file_name=dest_file, - checksum_type=ChecksumTypes.NULL_CHECKSUM, closure_requested=False + pdu_conf=pdu_conf, + file_size=0, + source_file_name=source_file, + dest_file_name=dest_file, + checksum_type=ChecksumTypes.NULL_CHECKSUM, + closure_requested=False, ) data = metadata_pdu.pack() self.com_if.send(data=data) diff --git a/src/tmtccmd/com_if/com_if_utilities.py b/src/tmtccmd/com_if/com_if_utilities.py index d59352a5..b8452768 100644 --- a/src/tmtccmd/com_if/com_if_utilities.py +++ b/src/tmtccmd/com_if/com_if_utilities.py @@ -22,8 +22,10 @@ def determine_com_if(com_if_dict: ComIFDictT, json_cfg_path: str) -> str: com_if_string = str(com_if_string) if do_prompt_com_if: com_if_string = prompt_com_if(com_if_dict=com_if_dict) - save_to_json = input("Do you want to store the communication interface? (y/n): ") - if save_to_json.lower() in ['y', "yes", "1"]: + save_to_json = input( + "Do you want to store the communication interface? (y/n): " + ) + if save_to_json.lower() in ["y", "yes", "1"]: store_com_if_json(com_if_string=com_if_string, json_cfg_path=json_cfg_path) return com_if_string @@ -53,7 +55,7 @@ def store_com_if_json(com_if_string: str, json_cfg_path: str): data[JsonKeyNames.COM_IF.value] = com_if_string file.seek(0) json.dump(data, file, indent=4) + LOGGER.info(f"Communication interface was stored in the JSON file {json_cfg_path}") LOGGER.info( - f"Communication interface was stored in the JSON file {json_cfg_path}" + "Delete this file or edit it manually to edit the communication interface" ) - LOGGER.info("Delete this file or edit it manually to edit the communication interface") diff --git a/src/tmtccmd/com_if/com_interface_base.py b/src/tmtccmd/com_if/com_interface_base.py index 93186a61..4569318e 100644 --- a/src/tmtccmd/com_if/com_interface_base.py +++ b/src/tmtccmd/com_if/com_interface_base.py @@ -21,6 +21,7 @@ class CommunicationInterface: """Generic form of a communication interface to separate communication logic from the underlying interface. """ + def __init__(self, tmtc_printer: TmTcPrinter, com_if_key: str): self.tmtc_printer = tmtc_printer self.valid = True diff --git a/src/tmtccmd/com_if/dummy_com_if.py b/src/tmtccmd/com_if/dummy_com_if.py index 55e156d0..f610e110 100644 --- a/src/tmtccmd/com_if/dummy_com_if.py +++ b/src/tmtccmd/com_if/dummy_com_if.py @@ -1,7 +1,10 @@ """Dummy Communication Interface. Currently serves to provide an example without external hardware """ from spacepackets.ecss.tc import PusTelecommand -from spacepackets.ccsds.spacepacket import get_space_packet_sequence_control, SequenceFlags +from spacepackets.ccsds.spacepacket import ( + get_space_packet_sequence_control, + SequenceFlags, +) from tmtccmd.com_if.com_interface_base import CommunicationInterface from tmtccmd.tm import TelemetryListT @@ -56,7 +59,7 @@ def __init__(self): def pass_telecommand(self, data: bytearray): # TODO: Need TC deserializer for cleaner implementation self.last_telecommand = data - self.last_tc_ssc = ((data[2] << 8) | data[3]) & 0x3fff + self.last_tc_ssc = ((data[2] << 8) | data[3]) & 0x3FFF self.last_service = data[7] self.last_subservice = data[8] self.tc_packet_id = data[0] << 8 | data[1] @@ -75,19 +78,23 @@ def generate_reply_package(self): if self.last_subservice == 1: tc_psc = get_space_packet_sequence_control( sequence_flags=SequenceFlags.UNSEGMENTED, - source_sequence_count=self.last_tc_ssc + source_sequence_count=self.last_tc_ssc, ) tm_packer = Service1TMExtended( - subservice=1, ssc=self.current_ssc, tc_packet_id=self.last_tc_packet_id, - tc_psc=tc_psc + subservice=1, + ssc=self.current_ssc, + tc_packet_id=self.last_tc_packet_id, + tc_psc=tc_psc, ) self.current_ssc += 1 tm_packet_raw = tm_packer.pack() self.next_telemetry_package.append(tm_packet_raw) tm_packer = Service1TMExtended( - subservice=7, ssc=self.current_ssc, tc_packet_id=self.last_tc_packet_id, - tc_psc=tc_psc + subservice=7, + ssc=self.current_ssc, + tc_packet_id=self.last_tc_packet_id, + tc_psc=tc_psc, ) tm_packet_raw = tm_packer.pack() self.next_telemetry_package.append(tm_packet_raw) diff --git a/src/tmtccmd/com_if/qemu_com_if.py b/src/tmtccmd/com_if/qemu_com_if.py index fb90f03e..357f9aae 100644 --- a/src/tmtccmd/com_if/qemu_com_if.py +++ b/src/tmtccmd/com_if/qemu_com_if.py @@ -65,8 +65,13 @@ class QEMUComIF(CommunicationInterface): """ Specific Communication Interface implementation of the QEMU_SERIAL USART protocol for the TMTC software """ - def __init__(self, tmtc_printer: TmTcPrinter, serial_timeout: float, - ser_com_type: SerialCommunicationType = SerialCommunicationType.FIXED_FRAME_BASED): + + def __init__( + self, + tmtc_printer: TmTcPrinter, + serial_timeout: float, + ser_com_type: SerialCommunicationType = SerialCommunicationType.FIXED_FRAME_BASED, + ): super().__init__(tmtc_printer) self.serial_timeout = serial_timeout self.loop = asyncio.get_event_loop() @@ -93,7 +98,9 @@ def __del__(self): def set_fixed_frame_settings(self, serial_frame_size: int): self.serial_frame_size = serial_frame_size - def set_dle_settings(self, dle_queue_len: int, dle_max_frame: int, dle_timeout: float): + def set_dle_settings( + self, dle_queue_len: int, dle_max_frame: int, dle_timeout: float + ): self.dle_queue_len = dle_queue_len self.dle_max_frame = dle_max_frame self.dle_timeout = dle_timeout @@ -104,13 +111,15 @@ def initialize(self, args: any = None) -> any: """ if not self.loop.is_running(): self.background_loop_thread = Thread( - target=start_background_loop, args=(self.loop,), daemon=True) + target=start_background_loop, args=(self.loop,), daemon=True + ) def open(self, args: any = None) -> None: self.background_loop_thread.start_listener() try: self.usart = asyncio.run_coroutine_threadsafe( - Usart.create_async(QEMU_ADDR_AT91_USART0), self.loop).result() + Usart.create_async(QEMU_ADDR_AT91_USART0), self.loop + ).result() asyncio.run_coroutine_threadsafe(self.usart.open(), self.loop).result() except NotImplementedError: LOGGER.exception("QEMU_SERIAL Initialization error, file does not exist!") @@ -144,8 +153,7 @@ def send(self, data: bytearray): self.send_data(data_encoded) def send_data(self, data: bytearray): - asyncio.run_coroutine_threadsafe( - self.send_data_async(data), self.loop).result() + asyncio.run_coroutine_threadsafe(self.send_data_async(data), self.loop).result() def receive(self, parameters=0) -> TelemetryListT: packet_list = [] @@ -219,21 +227,26 @@ async def poll_dle_packets(self): data.append(rcvd[0]) if data[0] == STX_CHAR: - data.extend(await self.usart.read_until_async( - bytes([ETX_CHAR]), DLE_FRAME_LENGTH, self.serial_timeout)) + data.extend( + await self.usart.read_until_async( + bytes([ETX_CHAR]), DLE_FRAME_LENGTH, self.serial_timeout + ) + ) # check for success if data[-1] == ETX_CHAR: self.reception_buffer.appendleft(data) continue - else: # not a start byte: flush input buffer + else: # not a start byte: flush input buffer data.extend(self.usart.read(self.usart.get_data_in_waiting())) # handle erroneous data print(data) # It is assumed that all packets are DLE encoded, so throw it away for now. - LOGGER.info("Non DLE-Encoded data with length " + str(len(data) + 1) + " found..") + LOGGER.info( + "Non DLE-Encoded data with length " + str(len(data) + 1) + " found.." + ) class QmpException(Exception): @@ -246,6 +259,7 @@ def __init__(self, ret, *args, **kwargs): class QmpConnection: """A connection to a QEMU_SERIAL machine via QMP""" + def __init__(self, addr=QEMU_ADDR_QMP): self.transport = None self.addr = addr @@ -386,16 +400,18 @@ def bytes(self): return bytes([self.seq, self.cat, self.id, len(data)]) + bytes(data) def __repr__(self): - return f"{{ seq: 0x{self.seq:02x}, cat: 0x{self.cat:02x}," \ - f" id: 0x{self.id:02x}, data: {self.data} }}" + return ( + f"{{ seq: 0x{self.seq:02x}, cat: 0x{self.cat:02x}," + f" id: 0x{self.id:02x}, data: {self.data} }}" + ) def parse_dataframes(buf): """Parse a variable number of DataFrames from the given byte buffer""" while len(buf) >= 4 and len(buf) >= 4 + buf[3]: - frame = DataFrame(buf[0], buf[1], buf[2], buf[4: 4 + buf[3]]) - buf = buf[4 + buf[3]:] + frame = DataFrame(buf[0], buf[1], buf[2], buf[4 : 4 + buf[3]]) + buf = buf[4 + buf[3] :] yield buf, frame return buf, None @@ -413,6 +429,7 @@ class Usart: @staticmethod async def create_async(addr): return Usart(addr) + """Connection to emulate a USART device for a given QEMU_SERIAL/At91 instance""" def __init__(self, addr): @@ -501,7 +518,7 @@ async def read_async(self, n, timeout=None): try: await asyncio.wait_for(self.__read_async(n), timeout) except asyncio.TimeoutError: - pass # ignore timeouts, return data received up to now + pass # ignore timeouts, return data received up to now finally: m = min(len(self.datab), n) data, self.datab = self.datab[:m], self.datab[m:] @@ -529,7 +546,7 @@ async def read_until_async(self, expected, size=None, timeout=None): try: await asyncio.wait_for(self.__read_until_async(expected, size), timeout) except asyncio.TimeoutError: - pass # ignore timeouts, return data received up to now + pass # ignore timeouts, return data received up to now finally: end = self.datab.find(expected) if end == -1: @@ -543,7 +560,7 @@ async def read_until_async(self, expected, size=None, timeout=None): def read(self, n): """Wait for 'n' bytes to be received from the USART - timeout in seconds""" + timeout in seconds""" try: while len(self.datab) < n: diff --git a/src/tmtccmd/com_if/serial_com_if.py b/src/tmtccmd/com_if/serial_com_if.py index 6381be23..affdf664 100644 --- a/src/tmtccmd/com_if/serial_com_if.py +++ b/src/tmtccmd/com_if/serial_com_if.py @@ -24,6 +24,7 @@ class SerialConfigIds(enum.Enum): from enum import auto + SERIAL_PORT = auto() SERIAL_BAUD_RATE = auto() SERIAL_TIMEOUT = auto() @@ -40,6 +41,7 @@ class SerialCommunicationType(enum.Enum): If DLE is used, it is expected that the sender side encoded the packets with the DLE protocol. Any packets sent will also be encoded. """ + FIXED_FRAME_BASED = 1 DLE_ENCODING = 2 @@ -49,10 +51,15 @@ class SerialComIF(CommunicationInterface): """ Communication Interface to use serial communication. This requires the PySerial library. """ + def __init__( - self, com_if_key: str, tmtc_printer: TmTcPrinter, com_port: str, baud_rate: int, - serial_timeout: float, - ser_com_type: SerialCommunicationType = SerialCommunicationType.FIXED_FRAME_BASED + self, + com_if_key: str, + tmtc_printer: TmTcPrinter, + com_port: str, + baud_rate: int, + serial_timeout: float, + ser_com_type: SerialCommunicationType = SerialCommunicationType.FIXED_FRAME_BASED, ): """ Initiaze a serial communication handler. @@ -93,7 +100,11 @@ def set_fixed_frame_settings(self, serial_frame_size: int): self.serial_frame_size = serial_frame_size def set_dle_settings( - self, dle_queue_len: int, dle_max_frame: int, dle_timeout: float, encode_cr: bool = True + self, + dle_queue_len: int, + dle_max_frame: int, + dle_timeout: float, + encode_cr: bool = True, ): self.dle_queue_len = dle_queue_len self.dle_max_frame = dle_max_frame @@ -109,9 +120,12 @@ def open(self, args: any = None) -> None: try: if self.ser_com_type == SerialCommunicationType.DLE_ENCODING: self.dle_polling_active_event.set() - self.reception_thread = threading.Thread(target=self.poll_dle_packets, daemon=True) + self.reception_thread = threading.Thread( + target=self.poll_dle_packets, daemon=True + ) self.serial = serial.Serial( - port=self.com_port, baudrate=self.baud_rate, timeout=self.serial_timeout) + port=self.com_port, baudrate=self.baud_rate, timeout=self.serial_timeout + ) except serial.SerialException: LOGGER.error("Serial Port opening failure!") raise IOError @@ -134,9 +148,7 @@ def send(self, data: bytearray): if self.ser_com_type == SerialCommunicationType.FIXED_FRAME_BASED: encoded_data = data elif self.ser_com_type == SerialCommunicationType.DLE_ENCODING: - encoded_data = self.encoder.encode( - source_packet=data, add_stx_etx=True - ) + encoded_data = self.encoder.encode(source_packet=data, add_stx_etx=True) else: LOGGER.warning("This communication type was not implemented yet!") return @@ -169,7 +181,9 @@ def data_available(self, timeout: float = 0, parameters: any = 0) -> int: start_time = time.time() sleep_time = timeout / 3.0 if self.ser_com_type == SerialCommunicationType.FIXED_FRAME_BASED: - return self.data_available_fixed_frame(timeout=timeout, sleep_time=sleep_time) + return self.data_available_fixed_frame( + timeout=timeout, sleep_time=sleep_time + ) elif self.ser_com_type == SerialCommunicationType.DLE_ENCODING: if timeout > 0: while elapsed_time < timeout: @@ -202,7 +216,9 @@ def poll_dle_packets(self): if len(byte) == 1 and byte[0] == STX_CHAR: data.append(byte[0]) self.serial.timeout = 0.1 - bytes_rcvd = self.serial.read_until(serial.to_bytes([ETX_CHAR]), DLE_FRAME_LENGTH) + bytes_rcvd = self.serial.read_until( + serial.to_bytes([ETX_CHAR]), DLE_FRAME_LENGTH + ) if bytes_rcvd[len(bytes_rcvd) - 1] == ETX_CHAR: data.extend(bytes_rcvd) self.reception_buffer.appendleft(data) @@ -210,7 +226,7 @@ def poll_dle_packets(self): data.append(byte[0]) data.extend(self.serial.read(self.serial.inWaiting())) # It is assumed that all packets are DLE encoded, so throw it away for now. - LOGGER.info(f'Non DLE-Encoded data with length {len(data) + 1} found..') + LOGGER.info(f"Non DLE-Encoded data with length {len(data) + 1} found..") @staticmethod def poll_pus_packets_fixed_frames(data: bytearray) -> list: @@ -230,15 +246,18 @@ def poll_pus_packets_fixed_frames(data: bytearray) -> list: return pus_data_list @staticmethod - def read_multiple_packets(data: bytearray, start_index: int, frame_size: int, - pus_data_list: list): + def read_multiple_packets( + data: bytearray, start_index: int, frame_size: int, pus_data_list: list + ): while start_index < frame_size: - start_index = SerialComIF.parse_next_packets(data, start_index, frame_size, - pus_data_list) + start_index = SerialComIF.parse_next_packets( + data, start_index, frame_size, pus_data_list + ) @staticmethod - def parse_next_packets(data: bytearray, start_index: int, frame_size: int, - pus_data_list: list) -> int: + def parse_next_packets( + data: bytearray, start_index: int, frame_size: int, pus_data_list: list + ) -> int: next_payload_len = data[start_index + 4] << 8 | data[start_index + 5] if next_payload_len == 0: end_index = frame_size diff --git a/src/tmtccmd/com_if/serial_utilities.py b/src/tmtccmd/com_if/serial_utilities.py index 6b4ca7e4..678ca7b2 100644 --- a/src/tmtccmd/com_if/serial_utilities.py +++ b/src/tmtccmd/com_if/serial_utilities.py @@ -4,7 +4,11 @@ import serial import serial.tools.list_ports from tmtccmd.utility.logger import get_console_logger -from tmtccmd.utility.json_handler import check_json_file, JsonKeyNames, save_to_json_with_prompt +from tmtccmd.utility.json_handler import ( + check_json_file, + JsonKeyNames, + save_to_json_with_prompt, +) LOGGER = get_console_logger() @@ -29,17 +33,20 @@ def determine_baud_rate(json_cfg_path: str) -> int: if prompt_baud_rate: while True: - baud_rate = input('Please enter the baudrate for the serial protocol: ') + baud_rate = input("Please enter the baudrate for the serial protocol: ") if baud_rate.isdigit(): baud_rate = int(baud_rate) break else: - print('Invalid baud rate specified, try again.') - with open(json_cfg_path, 'r+') as json_file: + print("Invalid baud rate specified, try again.") + with open(json_cfg_path, "r+") as json_file: json_obj = json.load(fp=json_file) if save_to_json_with_prompt( - key=JsonKeyNames.SERIAL_BAUDRATE.value, value=baud_rate, - json_cfg_path=json_cfg_path, json_obj=json_obj, name='baudrate' + key=JsonKeyNames.SERIAL_BAUDRATE.value, + value=baud_rate, + json_cfg_path=json_cfg_path, + json_obj=json_obj, + name="baudrate", ): json_file.seek(0) json.dump(json_obj, json_file, indent=4) @@ -54,31 +61,38 @@ def determine_com_port(json_cfg_path: str) -> str: reconfig_com_port = False if not check_json_file(json_cfg_path=json_cfg_path): reconfig_com_port = True - with open(json_cfg_path, 'r+') as json_file: + with open(json_cfg_path, "r+") as json_file: com_port = __det_com_port_with_json_file( - json_cfg_path=json_cfg_path, json_file=json_file, reconfig_com_port=reconfig_com_port + json_cfg_path=json_cfg_path, + json_file=json_file, + reconfig_com_port=reconfig_com_port, ) return com_port def __det_com_port_with_json_file( - json_cfg_path: str, json_file: TextIO, reconfig_com_port: bool + json_cfg_path: str, json_file: TextIO, reconfig_com_port: bool ) -> str: try_hint = False json_obj = json.load(json_file) - com_port = '' + com_port = "" if not reconfig_com_port: reconfig_com_port, try_hint, com_port = __try_com_port_load(json_obj=json_obj) if try_hint: reconfig_com_port, com_port = __try_hint_handling( - json_cfg_path=json_cfg_path, reconfig_com_port=reconfig_com_port, json_obj=json_obj + json_cfg_path=json_cfg_path, + reconfig_com_port=reconfig_com_port, + json_obj=json_obj, ) if reconfig_com_port: com_port = prompt_com_port() save_to_json_with_prompt( - key=JsonKeyNames.SERIAL_PORT.value, value=com_port, name='serial port', - json_cfg_path=json_cfg_path, json_obj=json_obj + key=JsonKeyNames.SERIAL_PORT.value, + value=com_port, + name="serial port", + json_cfg_path=json_cfg_path, + json_obj=json_obj, ) json_file.seek(0) json.dump(json_obj, json_file, indent=4) @@ -88,26 +102,26 @@ def __det_com_port_with_json_file( def __try_com_port_load(json_obj) -> (bool, bool, str): reconfig_com_port = False try_hint = False - com_port = '' + com_port = "" try: com_port = json_obj[JsonKeyNames.SERIAL_PORT.value] - LOGGER.info(f'Loaded COM port {com_port} from JSON configuration file') + LOGGER.info(f"Loaded COM port {com_port} from JSON configuration file") if not check_port_validity(com_port): while True: LOGGER.info( - 'COM port from configuration file not contained within serial port list' + "COM port from configuration file not contained within serial port list" ) reconfigure = input( - 'Reconfigure serial port or try to determine from hint? ' - '[r (reconfigure) / h (hint) / c(cancel)]: ' + "Reconfigure serial port or try to determine from hint? " + "[r (reconfigure) / h (hint) / c(cancel)]: " ) - if reconfigure.lower() in ['r']: + if reconfigure.lower() in ["r"]: reconfig_com_port = True break - elif reconfigure.lower() in ['h']: + elif reconfigure.lower() in ["h"]: try_hint = True break - elif reconfigure.lower() in ['c']: + elif reconfigure.lower() in ["c"]: return com_port else: continue @@ -116,7 +130,9 @@ def __try_com_port_load(json_obj) -> (bool, bool, str): return reconfig_com_port, try_hint, com_port -def __try_hint_handling(json_cfg_path: str, reconfig_com_port: bool, json_obj) -> (bool, str): +def __try_hint_handling( + json_cfg_path: str, reconfig_com_port: bool, json_obj +) -> (bool, str): reconfig_hint = False try: hint = json_obj[JsonKeyNames.SERIAL_HINT.value] @@ -125,72 +141,78 @@ def __try_hint_handling(json_cfg_path: str, reconfig_com_port: bool, json_obj) - com_port_found, com_port = find_com_port_from_hint(hint=hint) if com_port_found: - LOGGER.info(f'Found {com_port} based on hint {hint}') + LOGGER.info(f"Found {com_port} based on hint {hint}") if reconfig_hint: if save_to_json_with_prompt( - key=JsonKeyNames.SERIAL_PORT.value, value=com_port, name='serial port', - json_cfg_path=json_cfg_path, json_obj=json_obj + key=JsonKeyNames.SERIAL_PORT.value, + value=com_port, + name="serial port", + json_cfg_path=json_cfg_path, + json_obj=json_obj, ): reconfig_com_port = False else: - LOGGER.info('No COM port found based on hint..') + LOGGER.info("No COM port found based on hint..") reconfig_com_port = True return reconfig_com_port, com_port def __prompt_hint_handling(json_obj) -> (bool, str): reconfig_hint = False - hint = '' + hint = "" ports = serial.tools.list_ports.comports() prompt_hint = input( - 'No hint found in config JSON. Do you want to print the list of devices ' - 'and then specify a hint based on it? [y/n]: ' + "No hint found in config JSON. Do you want to print the list of devices " + "and then specify a hint based on it? [y/n]: " ) - if prompt_hint.lower() in ['y', 'yes', '1']: + if prompt_hint.lower() in ["y", "yes", "1"]: while True: - LOGGER.info('Found serial devices:') + LOGGER.info("Found serial devices:") for port, desc, hwid in sorted(ports): - print('{}: {} [{}]'.format(port, desc, hwid)) - hint = input('Specify hint: ') + print("{}: {} [{}]".format(port, desc, hwid)) + hint = input("Specify hint: ") save_to_json = input( - 'Do you want to store the hint to the configuration file or ' - 'specify a new one? (y/r): ' + "Do you want to store the hint to the configuration file or " + "specify a new one? (y/r): " ) - if save_to_json in ['y', 'yes', '1']: + if save_to_json in ["y", "yes", "1"]: json_obj[JsonKeyNames.SERIAL_HINT.value] = hint reconfig_hint = True break - elif save_to_json in ['r']: + elif save_to_json in ["r"]: continue return reconfig_hint, hint def find_com_port_from_hint(hint: str) -> (bool, str): """Find a COM port based on a hint string""" - if hint == '': - LOGGER.warning('Invalid hint, is empty..') - return False, '' + if hint == "": + LOGGER.warning("Invalid hint, is empty..") + return False, "" ports = serial.tools.list_ports.comports() for port, desc, hwid in sorted(ports): if hint in desc: return True, port - return False, '' + return False, "" def prompt_com_port() -> str: while True: com_port = input( - 'Configuring serial port. Please enter COM Port' - '(enter h to display list of COM ports): ') - if com_port == 'h': + "Configuring serial port. Please enter COM Port" + "(enter h to display list of COM ports): " + ) + if com_port == "h": ports = serial.tools.list_ports.comports() for port, desc, hwid in sorted(ports): - print('{}: {} [{}]'.format(port, desc, hwid)) + print("{}: {} [{}]".format(port, desc, hwid)) else: if not check_port_validity(com_port): - print('Serial port not in list of available serial ports. Try again? [y/n]') + print( + "Serial port not in list of available serial ports. Try again? [y/n]" + ) try_again = input() - if try_again.lower() in ['y', 'yes']: + if try_again.lower() in ["y", "yes"]: continue else: break diff --git a/src/tmtccmd/com_if/tcpip_tcp_com_if.py b/src/tmtccmd/com_if/tcpip_tcp_com_if.py index 19aa0737..6b710d0b 100644 --- a/src/tmtccmd/com_if/tcpip_tcp_com_if.py +++ b/src/tmtccmd/com_if/tcpip_tcp_com_if.py @@ -30,6 +30,7 @@ class TcpCommunicationType(enum.Enum): """Parse for space packets in the TCP stream, using the space packet header""" + SPACE_PACKETS = 0 @@ -38,16 +39,24 @@ class TcpCommunicationType(enum.Enum): # pylint: disable=too-many-arguments class TcpIpTcpComIF(CommunicationInterface): """Communication interface for TCP communication.""" + DEFAULT_LOCK_TIMEOUT = 0.4 TM_LOOP_DELAY = 0.2 def __init__( - self, com_if_key: str, com_type: TcpCommunicationType, space_packet_ids: Tuple[int], - tm_polling_freqency: float, tm_timeout: float, tc_timeout_factor: float, - send_address: EthernetAddressT, max_recv_size: int, - max_packets_stored: int = 50, - tmtc_printer: Union[None, TmTcPrinter] = None, - init_mode: int = CoreModeList.LISTENER_MODE): + self, + com_if_key: str, + com_type: TcpCommunicationType, + space_packet_ids: Tuple[int], + tm_polling_freqency: float, + tm_timeout: float, + tc_timeout_factor: float, + send_address: EthernetAddressT, + max_recv_size: int, + max_packets_stored: int = 50, + tmtc_printer: Union[None, TmTcPrinter] = None, + init_mode: int = CoreModeList.LISTENER_MODE, + ): """Initialize a communication interface to send and receive TMTC via TCP :param com_if_key: :param com_type: Communication Type. By default, it is assumed that @@ -73,7 +82,9 @@ def __init__( self.__last_connection_time = 0 self.__tm_thread_kill_signal = threading.Event() # Separate thread to request TM packets periodically if no TCs are being sent - self.__tcp_conn_thread = threading.Thread(target=self.__tcp_tm_client, daemon=True) + self.__tcp_conn_thread = threading.Thread( + target=self.__tcp_tm_client, daemon=True + ) self.__tm_queue = deque() self.__analysis_queue = deque() # Only allow one connection to OBSW at a time for now by using this lock @@ -112,8 +123,9 @@ def send(self, data: bytearray): def receive(self, poll_timeout: float = 0) -> TelemetryListT: tm_packet_list = [] - with acquire_timeout(self.__queue_lock, timeout=self.DEFAULT_LOCK_TIMEOUT) as \ - acquired: + with acquire_timeout( + self.__queue_lock, timeout=self.DEFAULT_LOCK_TIMEOUT + ) as acquired: if not acquired: LOGGER.warning("Acquiring queue lock failed!") while self.__tm_queue: @@ -142,8 +154,9 @@ def __receive_tm_packets(self): ready = select.select([self.__tcp_socket], [], [], 0) if ready[0]: bytes_recvd = self.__tcp_socket.recv(self.max_recv_size) - with acquire_timeout(self.__queue_lock, timeout=self.DEFAULT_LOCK_TIMEOUT) as \ - acquired: + with acquire_timeout( + self.__queue_lock, timeout=self.DEFAULT_LOCK_TIMEOUT + ) as acquired: if not acquired: LOGGER.warning("Acquiring queue lock failed!") if self.__tm_queue.__len__() >= self.max_packets_stored: @@ -154,7 +167,7 @@ def __receive_tm_packets(self): self.__tm_queue.pop() self.__tm_queue.appendleft(bytearray(bytes_recvd)) except ConnectionResetError: - LOGGER.exception('ConnectionResetError. TCP server might not be up') + LOGGER.exception("ConnectionResetError. TCP server might not be up") def data_available(self, timeout: float = 0, parameters: any = 0) -> bool: if self.__tm_queue: diff --git a/src/tmtccmd/com_if/tcpip_udp_com_if.py b/src/tmtccmd/com_if/tcpip_udp_com_if.py index 1bc9b82e..a0b5fa5f 100644 --- a/src/tmtccmd/com_if/tcpip_udp_com_if.py +++ b/src/tmtccmd/com_if/tcpip_udp_com_if.py @@ -25,12 +25,17 @@ # pylint: disable=too-many-arguments class TcpIpUdpComIF(CommunicationInterface): """Communication interface for UDP communication.""" + def __init__( - self, com_if_key: str, tm_timeout: float, tc_timeout_factor: float, - send_address: EthernetAddressT, max_recv_size: int, - recv_addr: Union[None, EthernetAddressT] = None, - tmtc_printer: Union[None, TmTcPrinter] = None, - init_mode: int = CoreModeList.LISTENER_MODE + self, + com_if_key: str, + tm_timeout: float, + tc_timeout_factor: float, + send_address: EthernetAddressT, + max_recv_size: int, + recv_addr: Union[None, EthernetAddressT] = None, + tmtc_printer: Union[None, TmTcPrinter] = None, + init_mode: int = CoreModeList.LISTENER_MODE, ): """Initialize a communication interface to send and receive UDP datagrams. :param tm_timeout: @@ -64,12 +69,15 @@ def open(self, args: any = None): # being used. # See: https://docs.microsoft.com/en-us/windows/win32/api/winsock/nf-winsock-bind if self.recv_addr is not None: - LOGGER.info(f"Binding UDP socket to {self.recv_addr[0]} and port {self.recv_addr[1]}") + LOGGER.info( + f"Binding UDP socket to {self.recv_addr[0]} and port {self.recv_addr[1]}" + ) self.udp_socket.bind(self.recv_addr) # Set non-blocking because we use select. self.udp_socket.setblocking(False) if self.init_mode == CoreModeList.LISTENER_MODE: from tmtccmd.pus.service_17_test import pack_service17_ping_command + # Send ping command immediately so the reception address is known for UDP ping_cmd = pack_service17_ping_command(ssc=0) self.send(ping_cmd.pack()) diff --git a/src/tmtccmd/com_if/tcpip_utilities.py b/src/tmtccmd/com_if/tcpip_utilities.py index e45b3b1f..9c416657 100644 --- a/src/tmtccmd/com_if/tcpip_utilities.py +++ b/src/tmtccmd/com_if/tcpip_utilities.py @@ -22,6 +22,7 @@ class TcpIpType(enum.Enum): class TcpIpConfigIds(enum.Enum): from enum import auto + SEND_ADDRESS = auto() RECV_ADDRESS = auto() RECV_MAX_SIZE = auto() @@ -30,18 +31,26 @@ class TcpIpConfigIds(enum.Enum): def determine_udp_send_address(json_cfg_path: str) -> EthernetAddressT: - return determine_tcpip_address(tcpip_type=TcpIpType.UDP, json_cfg_path=json_cfg_path) + return determine_tcpip_address( + tcpip_type=TcpIpType.UDP, json_cfg_path=json_cfg_path + ) def determine_tcp_send_address(json_cfg_path: str) -> EthernetAddressT: - return determine_tcpip_address(tcpip_type=TcpIpType.TCP, json_cfg_path=json_cfg_path) + return determine_tcpip_address( + tcpip_type=TcpIpType.TCP, json_cfg_path=json_cfg_path + ) def determine_udp_recv_address(json_cfg_path: str) -> EthernetAddressT: - return determine_tcpip_address(tcpip_type=TcpIpType.UDP_RECV, json_cfg_path=json_cfg_path) + return determine_tcpip_address( + tcpip_type=TcpIpType.UDP_RECV, json_cfg_path=json_cfg_path + ) -def determine_tcpip_address(tcpip_type: TcpIpType, json_cfg_path: str) -> EthernetAddressT: +def determine_tcpip_address( + tcpip_type: TcpIpType, json_cfg_path: str +) -> EthernetAddressT: address_tuple = () reconfigure_ip_address = False if not check_json_file(json_cfg_path=json_cfg_path): @@ -75,8 +84,10 @@ def determine_tcpip_address(tcpip_type: TcpIpType, json_cfg_path: str) -> Ethern if reconfigure_ip_address: address_tuple = prompt_ip_address(type_str=info_string) - save_to_json = input(f"Do you want to store the {info_string} configuration? [y/n]: ") - if save_to_json.lower() in ['y', "yes"]: + save_to_json = input( + f"Do you want to store the {info_string} configuration? [y/n]: " + ) + if save_to_json.lower() in ["y", "yes"]: with open(json_cfg_path, "r+") as file: json_dict = json.load(file) json_dict[json_key_address] = address_tuple[0] @@ -86,7 +97,9 @@ def determine_tcpip_address(tcpip_type: TcpIpType, json_cfg_path: str) -> Ethern LOGGER.info( f"{info_string} was stored to the JSON file config/tmtcc_config.json." ) - LOGGER.info("Delete this file or edit it manually to change the used addresses.") + LOGGER.info( + "Delete this file or edit it manually to change the used addresses." + ) return address_tuple @@ -95,15 +108,15 @@ def prompt_ip_address(type_str: str) -> EthernetAddressT: while True: ip_address = input( f"Configuring {type_str} IP address. " - "Please enter the IP address (\"localhost\" and \"any\" is valid): " + 'Please enter the IP address ("localhost" and "any" is valid): ' ) check_ip = True if ip_address == "localhost": - ip_address = socket.inet_ntoa(struct.pack('!L', socket.INADDR_LOOPBACK)) + ip_address = socket.inet_ntoa(struct.pack("!L", socket.INADDR_LOOPBACK)) check_ip = False elif ip_address == "any": - ip_address = socket.inet_ntoa(struct.pack('!L', socket.INADDR_ANY)) + ip_address = socket.inet_ntoa(struct.pack("!L", socket.INADDR_ANY)) check_ip = False if check_ip: try: @@ -112,16 +125,14 @@ def prompt_ip_address(type_str: str) -> EthernetAddressT: LOGGER.warning("Invalid IP address format!") continue - port = input( - f"Please enter {type_str} port: " - ) + port = input(f"Please enter {type_str} port: ") address_tuple = (ip_address, int(port)) LOGGER.info(f"Specified {type_str} IP address: {ip_address}") LOGGER.info(f"Specified {type_str} port: {port}") confirm = input("Please confirm selection [y/n]: ") - if not confirm.lower() in ['y', "yes", 1]: + if not confirm.lower() in ["y", "yes", 1]: continue break return address_tuple @@ -147,7 +158,9 @@ def determine_recv_buffer_len(json_cfg_path: str, tcpip_type: TcpIpType): recv_max_size = load_data[json_key] if reconfigure_recv_buf_size: recv_max_size = prompt_recv_buffer_len(tcpip_type=tcpip_type) - store_size = input("Do you store the maximum receive size configuration? [y/n]: ") + store_size = input( + "Do you store the maximum receive size configuration? [y/n]: " + ) if store_size.lower() in ["y", "yes", "1"]: with open(json_cfg_path, "r+") as file: json_dict = json.load(file) @@ -164,7 +177,7 @@ def prompt_recv_buffer_len(tcpip_type: TcpIpType) -> int: type_str = "TCP" while True: recv_max_size = input( - f'Please enter maximum receive size for {type_str} packets [1500 default]: ' + f"Please enter maximum receive size for {type_str} packets [1500 default]: " ) if not recv_max_size: return DEFAULT_MAX_RECV_SIZE diff --git a/src/tmtccmd/config/args.py b/src/tmtccmd/config/args.py index 58c515ae..a9641c6b 100644 --- a/src/tmtccmd/config/args.py +++ b/src/tmtccmd/config/args.py @@ -12,10 +12,11 @@ def parse_input_arguments( - print_known_args: bool = False, print_unknown_args: bool = False + print_known_args: bool = False, print_unknown_args: bool = False ) -> argparse.Namespace: try: from tmtccmd.config.hook import get_global_hook_obj + hook_obj = get_global_hook_obj() args = hook_obj.custom_args_parsing() if args is None: @@ -24,22 +25,25 @@ def parse_input_arguments( return parse_default_input_arguments(print_known_args, print_unknown_args) -def parse_default_input_arguments(print_known_args: bool = False, print_unknown_args: bool = False): +def parse_default_input_arguments( + print_known_args: bool = False, print_unknown_args: bool = False +): """Parses all input arguments :return: Input arguments contained in a special namespace and accessable by args. """ from tmtccmd.utility.conf_util import AnsiColors - descrip_text = \ - f"{AnsiColors.GREEN}TMTC Client Command Line Interface\n" \ - f"{AnsiColors.RESET}This application provides generic components to execute " \ - f"TMTC commanding.\n" \ - f"The developer is expected to specify the packaged telecommands for a given\n" \ - "service and operation code combination. The developer is also expected\n" \ - "to implement the handling of telemetry. All these tasks can be done by implementing\n" \ + + descrip_text = ( + f"{AnsiColors.GREEN}TMTC Client Command Line Interface\n" + f"{AnsiColors.RESET}This application provides generic components to execute " + f"TMTC commanding.\n" + f"The developer is expected to specify the packaged telecommands for a given\n" + "service and operation code combination. The developer is also expected\n" + "to implement the handling of telemetry. All these tasks can be done by implementing\n" "a hook object and passing it to the core." + ) arg_parser = argparse.ArgumentParser( - description=descrip_text, - formatter_class=argparse.RawTextHelpFormatter + description=descrip_text, formatter_class=argparse.RawTextHelpFormatter ) add_default_mode_arguments(arg_parser) @@ -50,26 +54,41 @@ def parse_default_input_arguments(print_known_args: bool = False, print_unknown_ add_ethernet_arguments(arg_parser) arg_parser.add_argument( - '--tc_timeout_factor', type=float, help='TC Timeout Factor. Multiplied with ' - 'TM Timeout, TC sent again after this time period. Default: 3.5', default=3.5 + "--tc_timeout_factor", + type=float, + help="TC Timeout Factor. Multiplied with " + "TM Timeout, TC sent again after this time period. Default: 3.5", + default=3.5, ) arg_parser.add_argument( - '-r', '--raw_data_print', help='Supply -r to print all raw TM data directly', - action='store_true' + "-r", + "--raw_data_print", + help="Supply -r to print all raw TM data directly", + action="store_true", ) arg_parser.add_argument( - '-d', '--short_display_mode', help='Supply -d to print short output', action='store_true' + "-d", + "--short_display_mode", + help="Supply -d to print short output", + action="store_true", ) arg_parser.add_argument( - '--hk', dest='print_hk', help='Supply -k or --hk to print HK data', action='store_true' + "--hk", + dest="print_hk", + help="Supply -k or --hk to print HK data", + action="store_true", ) arg_parser.add_argument( - '--rs', dest="resend_tc", help='Specify whether TCs are sent again after timeout', - action='store_true' + "--rs", + dest="resend_tc", + help="Specify whether TCs are sent again after timeout", + action="store_true", ) if len(sys.argv) == 1: - LOGGER.info("No input arguments specified. Run with -h to get list of arguments") + LOGGER.info( + "No input arguments specified. Run with -h to get list of arguments" + ) args, unknown = arg_parser.parse_known_args() @@ -87,105 +106,141 @@ def parse_default_input_arguments(print_known_args: bool = False, print_unknown_ def add_generic_arguments(arg_parser: argparse.ArgumentParser): - arg_parser.add_argument('-s', '--service', type=str, help='Service to test', default=None) arg_parser.add_argument( - '-o', '--op_code', help='Operation code, which is passed to the TC packer functions', - default=None + "-s", "--service", type=str, help="Service to test", default=None + ) + arg_parser.add_argument( + "-o", + "--op_code", + help="Operation code, which is passed to the TC packer functions", + default=None, ) arg_parser.add_argument( - '-l', '--listener', - help='Determine whether the listener mode will be active after performing the operation', - action='store_false' + "-l", + "--listener", + help="Determine whether the listener mode will be active after performing the operation", + action="store_false", ) arg_parser.add_argument( - '-f', '--file', - help='Specify file to send for CFDP put request operation' + "-f", "--file", help="Specify file to send for CFDP put request operation" ) arg_parser.add_argument( - '--sf', '--source_file', - help='Source file for CFDP transactions' + "--sf", "--source_file", help="Source file for CFDP transactions" ) arg_parser.add_argument( - '--df', '--dest_file', - help='Destination file for CFDP transactions' + "--df", "--dest_file", help="Destination file for CFDP transactions" ) arg_parser.add_argument( - '--tr', '--towards_receiver', - action='store_true', help='CFDP transaction direction. If no direction information is ' - 'specified, default to send towards sender' + "--tr", + "--towards_receiver", + action="store_true", + help="CFDP transaction direction. If no direction information is " + "specified, default to send towards sender", ) arg_parser.add_argument( - '--ts', '--towards_sender', - action='store_true', help='CFDP transaction direction. If no direction information is ' - 'specified, default to send towards sender' + "--ts", + "--towards_sender", + action="store_true", + help="CFDP transaction direction. If no direction information is " + "specified, default to send towards sender", ) arg_parser.add_argument( - '-t', '--tm_timeout', type=float, help='TM Timeout when listening to verification sequence.' - ' Default: 5 seconds', default=5.0 + "-t", + "--tm_timeout", + type=float, + help="TM Timeout when listening to verification sequence." + " Default: 5 seconds", + default=5.0, ) arg_parser.add_argument( - '--nl', dest='print_log', help='Supply --nl to suppress print output to log files.', - action='store_false' + "--nl", + dest="print_log", + help="Supply --nl to suppress print output to log files.", + action="store_false", ) arg_parser.add_argument( - '--np', dest='print_tm', help='Supply --np to suppress print output to console.', - action='store_false' + "--np", + dest="print_tm", + help="Supply --np to suppress print output to console.", + action="store_false", ) def add_default_mode_arguments(arg_parser: argparse.ArgumentParser): from tmtccmd.config.definitions import CoreModeList, CoreModeStrings - help_text = 'Core Modes. Default: seqcmd\n' - seq_help = \ - f"{CoreModeList.SEQUENTIAL_CMD_MODE} or " \ - f"{CoreModeStrings[CoreModeList.SEQUENTIAL_CMD_MODE]}: " \ + + help_text = "Core Modes. Default: seqcmd\n" + seq_help = ( + f"{CoreModeList.SEQUENTIAL_CMD_MODE} or " + f"{CoreModeStrings[CoreModeList.SEQUENTIAL_CMD_MODE]}: " f"Sequential Command Mode\n" - cfdp_help = \ - f"{CoreModeList.CFDP_MODE} or " \ - f"{CoreModeStrings[CoreModeList.CFDP_MODE]}: " \ + ) + cfdp_help = ( + f"{CoreModeList.CFDP_MODE} or " + f"{CoreModeStrings[CoreModeList.CFDP_MODE]}: " f"GUI mode\n" - listener_help = \ - f"{CoreModeList.LISTENER_MODE} or {CoreModeStrings[CoreModeList.LISTENER_MODE]}: " \ + ) + listener_help = ( + f"{CoreModeList.LISTENER_MODE} or {CoreModeStrings[CoreModeList.LISTENER_MODE]}: " f"Listener Mode\n" - gui_help = \ - f"{CoreModeList.GUI_MODE} or " \ - f"{CoreModeStrings[CoreModeList.GUI_MODE]}: " \ + ) + gui_help = ( + f"{CoreModeList.GUI_MODE} or " + f"{CoreModeStrings[CoreModeList.GUI_MODE]}: " f"GUI mode\n" + ) help_text += seq_help + cfdp_help + listener_help + gui_help arg_parser.add_argument( - '-m', '--mode', type=str, help=help_text, - default=CoreModeStrings[CoreModeList.SEQUENTIAL_CMD_MODE] + "-m", + "--mode", + type=str, + help=help_text, + default=CoreModeStrings[CoreModeList.SEQUENTIAL_CMD_MODE], ) def add_default_com_if_arguments(arg_parser: argparse.ArgumentParser): from tmtccmd.config.definitions import CoreComInterfacesDict, CoreComInterfaces - help_text = "Core Communication Interface. If this is not specified, the commander core\n" \ - "will try to extract it from the JSON or prompt it from the user.\n" - dummy_line = \ + + help_text = ( + "Core Communication Interface. If this is not specified, the commander core\n" + "will try to extract it from the JSON or prompt it from the user.\n" + ) + dummy_line = ( f"{CoreComInterfacesDict[CoreComInterfaces.DUMMY.value]}: Dummy Interface\n" - udp_line = \ - f"{CoreComInterfacesDict[CoreComInterfaces.TCPIP_UDP.value]}: " \ - f"UDP client\n" - ser_dle_line = \ - f"{CoreComInterfacesDict[CoreComInterfaces.SERIAL_DLE.value]}: " \ + ) + udp_line = ( + f"{CoreComInterfacesDict[CoreComInterfaces.TCPIP_UDP.value]}: " f"UDP client\n" + ) + ser_dle_line = ( + f"{CoreComInterfacesDict[CoreComInterfaces.SERIAL_DLE.value]}: " f"Serial with DLE transport layer\n" - ser_fixed_line = \ - f"{CoreComInterfacesDict[CoreComInterfaces.SERIAL_FIXED_FRAME.value]}: " \ + ) + ser_fixed_line = ( + f"{CoreComInterfacesDict[CoreComInterfaces.SERIAL_FIXED_FRAME.value]}: " f"Serial with fixed frames\n" - ser_qemu_line = \ - f"{CoreComInterfacesDict[CoreComInterfaces.SERIAL_QEMU.value]}: " \ + ) + ser_qemu_line = ( + f"{CoreComInterfacesDict[CoreComInterfaces.SERIAL_QEMU.value]}: " f"QEMU serial interface\n" + ) help_text += dummy_line + ser_dle_line + udp_line + ser_fixed_line + ser_qemu_line arg_parser.add_argument( - '-c', '--com_if', type=str, help=help_text, default=CoreComInterfaces.UNSPECIFIED.value + "-c", + "--com_if", + type=str, + help=help_text, + default=CoreComInterfaces.UNSPECIFIED.value, ) def add_ethernet_arguments(arg_parser: argparse.ArgumentParser): - arg_parser.add_argument('--clientIP', help='Client(Computer) IP. Default:\'\'', default='') arg_parser.add_argument( - '--boardIP', help='Board IP. Default: Localhost 127.0.0.1', default="127.0.0.1") + "--clientIP", help="Client(Computer) IP. Default:''", default="" + ) + arg_parser.add_argument( + "--boardIP", help="Board IP. Default: Localhost 127.0.0.1", default="127.0.0.1" + ) def args_post_processing(args, unknown: list) -> None: @@ -209,6 +264,7 @@ def handle_unspecified_args(args) -> None: """ from tmtccmd.config.hook import get_global_hook_obj from tmtccmd.config.definitions import CoreModeStrings + if args.tm_timeout is None: args.tm_timeout = 5.0 if args.mode is None: @@ -281,12 +337,16 @@ def prompt_op_code(service_op_code_dict: ServiceOpCodeDictT, service: str) -> st adjusted_op_code_entry = op_code_entry[0].ljust(op_code_adjustment) adjusted_op_code_info = op_code_entry[1][0].ljust(info_adjustment) LOGGER.info(f"{adjusted_op_code_entry} | {adjusted_op_code_info}") - op_code_string = input("Please select an operation code by specifying the key: ") + op_code_string = input( + "Please select an operation code by specifying the key: " + ) if op_code_string in op_code_dict: LOGGER.info(f"Selected op code: {op_code_string}") return op_code_string else: LOGGER.warning("Invalid key, try again") else: - LOGGER.warning("Service not in dictionary. Setting default operation code 0") + LOGGER.warning( + "Service not in dictionary. Setting default operation code 0" + ) return "0" diff --git a/src/tmtccmd/config/com_if.py b/src/tmtccmd/config/com_if.py index 82a15282..cc5c7d84 100644 --- a/src/tmtccmd/config/com_if.py +++ b/src/tmtccmd/config/com_if.py @@ -4,7 +4,11 @@ from tmtccmd.config.definitions import CoreGlobalIds, CoreComInterfaces from tmtccmd.core.globals_manager import get_global, update_global from tmtccmd.com_if.com_interface_base import CommunicationInterface -from tmtccmd.com_if.serial_com_if import SerialConfigIds, SerialCommunicationType, SerialComIF +from tmtccmd.com_if.serial_com_if import ( + SerialConfigIds, + SerialCommunicationType, + SerialComIF, +) from tmtccmd.com_if.serial_utilities import determine_com_port, determine_baud_rate from tmtccmd.com_if.tcpip_utilities import TcpIpConfigIds, TcpIpType from tmtccmd.utility.logger import get_console_logger @@ -16,8 +20,10 @@ def create_communication_interface_default( - com_if_key: str, tmtc_printer: TmTcPrinter, json_cfg_path: str, - space_packet_ids: Tuple[int] = (0,) + com_if_key: str, + tmtc_printer: TmTcPrinter, + json_cfg_path: str, + space_packet_ids: Tuple[int] = (0,), ) -> Optional[CommunicationInterface]: """Return the desired communication interface object @@ -31,30 +37,42 @@ def create_communication_interface_default( from tmtccmd.com_if.qemu_com_if import QEMUComIF try: - if com_if_key == CoreComInterfaces.TCPIP_UDP.value or \ - com_if_key == CoreComInterfaces.TCPIP_TCP.value: + if ( + com_if_key == CoreComInterfaces.TCPIP_UDP.value + or com_if_key == CoreComInterfaces.TCPIP_TCP.value + ): communication_interface = create_default_tcpip_interface( - com_if_key=com_if_key, json_cfg_path=json_cfg_path, tmtc_printer=tmtc_printer, - space_packet_ids=space_packet_ids + com_if_key=com_if_key, + json_cfg_path=json_cfg_path, + tmtc_printer=tmtc_printer, + space_packet_ids=space_packet_ids, ) - elif com_if_key == CoreComInterfaces.SERIAL_DLE.value or \ - com_if_key == CoreComInterfaces.SERIAL_FIXED_FRAME.value: + elif ( + com_if_key == CoreComInterfaces.SERIAL_DLE.value + or com_if_key == CoreComInterfaces.SERIAL_FIXED_FRAME.value + ): communication_interface = create_default_serial_interface( - com_if_key=com_if_key, tmtc_printer=tmtc_printer, json_cfg_path=json_cfg_path + com_if_key=com_if_key, + tmtc_printer=tmtc_printer, + json_cfg_path=json_cfg_path, ) elif com_if_key == CoreComInterfaces.SERIAL_QEMU.value: serial_cfg = get_global(CoreGlobalIds.SERIAL_CONFIG) serial_timeout = serial_cfg[SerialConfigIds.SERIAL_TIMEOUT] communication_interface = QEMUComIF( - tmtc_printer=tmtc_printer, serial_timeout=serial_timeout, - ser_com_type=SerialCommunicationType.DLE_ENCODING) + tmtc_printer=tmtc_printer, + serial_timeout=serial_timeout, + ser_com_type=SerialCommunicationType.DLE_ENCODING, + ) 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 ) else: - communication_interface = DummyComIF(com_if_key=com_if_key, tmtc_printer=tmtc_printer) + communication_interface = DummyComIF( + com_if_key=com_if_key, tmtc_printer=tmtc_printer + ) if communication_interface is None: return communication_interface if not communication_interface.valid: @@ -63,19 +81,19 @@ def create_communication_interface_default( communication_interface.initialize() return communication_interface except ConnectionRefusedError: - LOGGER.exception(f'TCP/IP connection refused') + LOGGER.exception(f"TCP/IP connection refused") if com_if_key == CoreComInterfaces.TCPIP_UDP.value: - LOGGER.warning('Make sure that a UDP server is running') + LOGGER.warning("Make sure that a UDP server is running") if com_if_key == CoreComInterfaces.TCPIP_TCP.value: - LOGGER.warning('Make sure that a TCP server is running') + LOGGER.warning("Make sure that a TCP server is running") sys.exit(1) except (IOError, OSError): - LOGGER.exception(f'Error setting up communication interface') + LOGGER.exception(f"Error setting up communication interface") sys.exit(1) def default_tcpip_cfg_setup( - tcpip_type: TcpIpType, json_cfg_path: str, space_packet_ids: Tuple[int] = (0,) + tcpip_type: TcpIpType, json_cfg_path: str, space_packet_ids: Tuple[int] = (0,) ): """Default setup for TCP/IP communication interfaces. This intantiates all required data in the globals manager so a TCP/IP communication interface can be built with @@ -85,8 +103,12 @@ def default_tcpip_cfg_setup( :param space_packet_ids: Required if the TCP com interface needs to parse space packets :return: """ - from tmtccmd.com_if.tcpip_utilities import determine_udp_send_address, \ - determine_tcp_send_address, determine_recv_buffer_len + from tmtccmd.com_if.tcpip_utilities import ( + determine_udp_send_address, + determine_tcp_send_address, + determine_recv_buffer_len, + ) + update_global(CoreGlobalIds.USE_ETHERNET, True) recv_tuple = None if tcpip_type == TcpIpType.UDP: @@ -95,14 +117,16 @@ def default_tcpip_cfg_setup( send_tuple = determine_tcp_send_address(json_cfg_path=json_cfg_path) else: send_tuple = () - max_recv_buf_size = determine_recv_buffer_len(json_cfg_path=json_cfg_path, tcpip_type=tcpip_type) + max_recv_buf_size = determine_recv_buffer_len( + json_cfg_path=json_cfg_path, tcpip_type=tcpip_type + ) ethernet_cfg_dict = get_global(CoreGlobalIds.ETHERNET_CONFIG) ethernet_cfg_dict.update({TcpIpConfigIds.SEND_ADDRESS: send_tuple}) ethernet_cfg_dict.update({TcpIpConfigIds.RECV_ADDRESS: recv_tuple}) ethernet_cfg_dict.update({TcpIpConfigIds.RECV_MAX_SIZE: max_recv_buf_size}) if space_packet_ids == (0,) and tcpip_type == TcpIpType.TCP: LOGGER.warning( - 'TCP communication interface without any specified space packet ID might not work!' + "TCP communication interface without any specified space packet ID might not work!" ) ethernet_cfg_dict.update({TcpIpConfigIds.SPACE_PACKET_ID: space_packet_ids}) update_global(CoreGlobalIds.ETHERNET_CONFIG, ethernet_cfg_dict) @@ -118,16 +142,21 @@ def default_serial_cfg_setup(com_if_key: str, json_cfg_path: str): baud_rate = determine_baud_rate(json_cfg_path=json_cfg_path) serial_port = determine_com_port(json_cfg_path=json_cfg_path) set_up_serial_cfg( - json_cfg_path=json_cfg_path, com_if_key=com_if_key, baud_rate=baud_rate, - com_port=serial_port + json_cfg_path=json_cfg_path, + com_if_key=com_if_key, + baud_rate=baud_rate, + com_port=serial_port, ) def create_default_tcpip_interface( - com_if_key: str, tmtc_printer: TmTcPrinter, json_cfg_path: str, - space_packet_ids: Tuple[int] = (0,) + com_if_key: str, + tmtc_printer: TmTcPrinter, + json_cfg_path: str, + space_packet_ids: Tuple[int] = (0,), ) -> Optional[CommunicationInterface]: from tmtccmd.config.globals import get_seq_cmd_cfg + """Create a default serial interface. Requires a certain set of global variables set up. See :func:`default_tcpip_cfg_setup` for more details. @@ -139,13 +168,12 @@ def create_default_tcpip_interface( """ communication_interface = None if com_if_key == CoreComInterfaces.TCPIP_UDP.value: - default_tcpip_cfg_setup( - tcpip_type=TcpIpType.UDP, json_cfg_path=json_cfg_path - ) + default_tcpip_cfg_setup(tcpip_type=TcpIpType.UDP, json_cfg_path=json_cfg_path) elif com_if_key == CoreComInterfaces.TCPIP_TCP.value: default_tcpip_cfg_setup( - tcpip_type=TcpIpType.TCP, json_cfg_path=json_cfg_path, - space_packet_ids=space_packet_ids + tcpip_type=TcpIpType.TCP, + json_cfg_path=json_cfg_path, + space_packet_ids=space_packet_ids, ) ethernet_cfg_dict = get_global(CoreGlobalIds.ETHERNET_CONFIG) send_addr = ethernet_cfg_dict[TcpIpConfigIds.SEND_ADDRESS] @@ -156,24 +184,33 @@ def create_default_tcpip_interface( space_packet_id = ethernet_cfg_dict[TcpIpConfigIds.SPACE_PACKET_ID] if com_if_key == CoreComInterfaces.TCPIP_UDP.value: communication_interface = TcpIpUdpComIF( - com_if_key=com_if_key, tm_timeout=seq_cmd_cfg.tm_timeout, + com_if_key=com_if_key, + tm_timeout=seq_cmd_cfg.tm_timeout, tc_timeout_factor=seq_cmd_cfg.tc_send_timeout_factor, - send_address=send_addr, recv_addr=recv_addr, max_recv_size=max_recv_size, - tmtc_printer=tmtc_printer, init_mode=init_mode + send_address=send_addr, + recv_addr=recv_addr, + max_recv_size=max_recv_size, + tmtc_printer=tmtc_printer, + init_mode=init_mode, ) elif com_if_key == CoreComInterfaces.TCPIP_TCP.value: communication_interface = TcpIpTcpComIF( - com_if_key=com_if_key, com_type=TcpCommunicationType.SPACE_PACKETS, - space_packet_ids=space_packet_ids, tm_timeout=seq_cmd_cfg.tm_timeout, + com_if_key=com_if_key, + com_type=TcpCommunicationType.SPACE_PACKETS, + space_packet_ids=space_packet_ids, + tm_timeout=seq_cmd_cfg.tm_timeout, tc_timeout_factor=seq_cmd_cfg.tc_send_timeout_factor, - tm_polling_freqency=0.5, send_address=send_addr, max_recv_size=max_recv_size, - tmtc_printer=tmtc_printer, init_mode=init_mode + tm_polling_freqency=0.5, + send_address=send_addr, + max_recv_size=max_recv_size, + tmtc_printer=tmtc_printer, + init_mode=init_mode, ) return communication_interface def create_default_serial_interface( - com_if_key: str, tmtc_printer: TmTcPrinter, json_cfg_path: str + com_if_key: str, tmtc_printer: TmTcPrinter, json_cfg_path: str ) -> Optional[CommunicationInterface]: """Create a default serial interface. Requires a certain set of global variables set up. See :func:`set_up_serial_cfg` for more details. @@ -188,9 +225,11 @@ def create_default_serial_interface( # baud rate and serial port which need to be set once but are expected to stay # the same for a given machine. Therefore, we use a JSON file to store and extract # those values - if com_if_key == CoreComInterfaces.SERIAL_DLE.value or \ - com_if_key == CoreComInterfaces.SERIAL_FIXED_FRAME.value or \ - com_if_key == CoreComInterfaces.SERIAL_QEMU.value: + if ( + com_if_key == CoreComInterfaces.SERIAL_DLE.value + or com_if_key == CoreComInterfaces.SERIAL_FIXED_FRAME.value + or com_if_key == CoreComInterfaces.SERIAL_QEMU.value + ): default_serial_cfg_setup(com_if_key=com_if_key, json_cfg_path=json_cfg_path) serial_cfg = get_global(CoreGlobalIds.SERIAL_CONFIG) serial_baudrate = serial_cfg[SerialConfigIds.SERIAL_BAUD_RATE] @@ -201,8 +240,12 @@ def create_default_serial_interface( else: ser_com_type = SerialCommunicationType.FIXED_FRAME_BASED communication_interface = SerialComIF( - com_if_key=com_if_key, tmtc_printer=tmtc_printer, com_port=com_port, - baud_rate=serial_baudrate, serial_timeout=serial_timeout, ser_com_type=ser_com_type + com_if_key=com_if_key, + tmtc_printer=tmtc_printer, + com_port=com_port, + baud_rate=serial_baudrate, + serial_timeout=serial_timeout, + ser_com_type=ser_com_type, ) if com_if_key == CoreComInterfaces.SERIAL_DLE: dle_max_queue_len = serial_cfg[SerialConfigIds.SERIAL_DLE_QUEUE_LEN] @@ -217,10 +260,15 @@ def create_default_serial_interface( def set_up_serial_cfg( - json_cfg_path: str, com_if_key: str, 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 + json_cfg_path: str, + com_if_key: str, + 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. Sets up all @@ -238,9 +286,10 @@ def set_up_serial_cfg( :return: """ update_global(CoreGlobalIds.USE_SERIAL, True) - if (com_if_key == CoreComInterfaces.SERIAL_DLE.value or - com_if_key == CoreComInterfaces.SERIAL_FIXED_FRAME.value) \ - and com_port == "": + if ( + com_if_key == CoreComInterfaces.SERIAL_DLE.value + or com_if_key == CoreComInterfaces.SERIAL_FIXED_FRAME.value + ) and com_port == "": LOGGER.warning("Invalid serial port specified!") com_port = determine_com_port(json_cfg_path=json_cfg_path) serial_cfg_dict = get_global(CoreGlobalIds.SERIAL_CONFIG) diff --git a/src/tmtccmd/config/definitions.py b/src/tmtccmd/config/definitions.py index f21d0a0a..ae7120c6 100644 --- a/src/tmtccmd/config/definitions.py +++ b/src/tmtccmd/config/definitions.py @@ -8,6 +8,7 @@ class CoreGlobalIds(enum.IntEnum): """ Numbers from 128 to 200 are reserved for core globals """ + # Object handles TMTC_HOOK = 128 COM_INTERFACE_HANDLE = 129 @@ -77,7 +78,7 @@ class CoreComInterfaces(enum.Enum): CoreComInterfaces.TCPIP_TCP.value: "TCP/IP with TCP", CoreComInterfaces.SERIAL_FIXED_FRAME.value: "Serial Interface with fixed size frames", CoreComInterfaces.SERIAL_QEMU.value: "Serial Interface using QEMU", - CoreComInterfaces.UNSPECIFIED.value: "Unspecified" + CoreComInterfaces.UNSPECIFIED.value: "Unspecified", } @@ -103,7 +104,7 @@ class CoreModeList(enum.IntEnum): CoreModeList.SEQUENTIAL_CMD_MODE: "seqcmd", CoreModeList.LISTENER_MODE: "listener", CoreModeList.CFDP_MODE: "cfdp", - CoreModeList.GUI_MODE: "gui" + CoreModeList.GUI_MODE: "gui", } @@ -122,17 +123,17 @@ class CoreServiceList(enum.Enum): class SeqTransferCfg: service = CoreServiceList.SERVICE_17 - op_code = '0' + op_code = "0" tm_timeout = 2.0 tc_send_timeout_factor = 2.5 resend_tc = False print_hk = False print_tm = True print_raw_tm = True - display_mode = 'long' + display_mode = "long" service_op_code_dict = dict() listener_after_op = False -DEFAULT_APID = 0xef +DEFAULT_APID = 0xEF DEBUG_MODE = False diff --git a/src/tmtccmd/config/globals.py b/src/tmtccmd/config/globals.py index 914e9fac..9ab7deba 100644 --- a/src/tmtccmd/config/globals.py +++ b/src/tmtccmd/config/globals.py @@ -5,15 +5,34 @@ from tmtccmd.utility.logger import get_console_logger from tmtccmd.utility.conf_util import check_args_in_dict, print_core_globals -from spacepackets.ecss.conf import PusVersion, set_default_tc_apid, set_default_tm_apid, \ - set_pus_tc_version, set_pus_tm_version +from spacepackets.ecss.conf import ( + PusVersion, + set_default_tc_apid, + set_default_tm_apid, + set_pus_tc_version, + set_pus_tm_version, +) from tmtccmd.core.globals_manager import update_global, get_global -from tmtccmd.config.definitions import CoreGlobalIds, CoreModeList, CoreServiceList, \ - CoreModeStrings, CoreComInterfacesDict, CoreComInterfaces, SeqTransferCfg +from tmtccmd.config.definitions import ( + CoreGlobalIds, + CoreModeList, + CoreServiceList, + CoreModeStrings, + CoreComInterfacesDict, + CoreComInterfaces, + SeqTransferCfg, +) from tmtccmd.com_if.com_if_utilities import determine_com_if from tmtccmd.config.cfdp import CfdpCfg -from tmtccmd.config.definitions import DEBUG_MODE, ServiceOpCodeDictT, OpCodeDictKeys, ComIFDictT, \ - OpCodeEntryT, OpCodeOptionsT, OpCodeNameT +from tmtccmd.config.definitions import ( + DEBUG_MODE, + ServiceOpCodeDictT, + OpCodeDictKeys, + ComIFDictT, + OpCodeEntryT, + OpCodeOptionsT, + OpCodeNameT, +) from spacepackets.cfdp.definitions import Direction @@ -55,11 +74,17 @@ def get_glob_com_if_dict() -> ComIFDictT: def set_default_globals_pre_args_parsing( - gui: bool, tc_apid: int, tm_apid: int, pus_tc_version: PusVersion = PusVersion.PUS_C, - pus_tm_version: PusVersion = PusVersion.PUS_C, - com_if_id: str = CoreComInterfaces.DUMMY.value, custom_com_if_dict=None, - display_mode='long', tm_timeout: float = 4.0, print_to_file: bool = True, - tc_send_timeout_factor: float = 2.0 + gui: bool, + tc_apid: int, + tm_apid: int, + pus_tc_version: PusVersion = PusVersion.PUS_C, + pus_tm_version: PusVersion = PusVersion.PUS_C, + com_if_id: str = CoreComInterfaces.DUMMY.value, + custom_com_if_dict=None, + display_mode="long", + tm_timeout: float = 4.0, + print_to_file: bool = True, + tc_send_timeout_factor: float = 2.0, ): if custom_com_if_dict is None: custom_com_if_dict = dict() @@ -81,7 +106,7 @@ def set_default_globals_pre_args_parsing( seq_cmd_cfg = SeqTransferCfg() seq_cmd_cfg.display_mode = display_mode - seq_cmd_cfg.op_code = '0' + seq_cmd_cfg.op_code = "0" seq_cmd_cfg.resend_tc = False seq_cmd_cfg.print_raw_tm = False seq_cmd_cfg.listener_after_op = True @@ -94,11 +119,13 @@ def set_default_globals_pre_args_parsing( def set_default_globals_post_args_parsing( - args: argparse.Namespace, - json_cfg_path: str, - custom_modes_list: Union[None, List[Union[collections.abc.Iterable, dict]]] = None, - custom_services_list: Union[None, List[Union[collections.abc.Iterable, dict]]] = None, - custom_com_if_dict: Dict[str, any] = None + args: argparse.Namespace, + json_cfg_path: str, + custom_modes_list: Union[None, List[Union[collections.abc.Iterable, dict]]] = None, + custom_services_list: Union[ + None, List[Union[collections.abc.Iterable, dict]] + ] = None, + custom_com_if_dict: Dict[str, any] = None, ): """This function takes the argument namespace as a parameter and determines a set of globals from the parsed arguments. @@ -116,7 +143,9 @@ def set_default_globals_post_args_parsing( """ handle_mode_arg(args=args, custom_modes_list=custom_modes_list) - handle_com_if_arg(args=args, json_cfg_path=json_cfg_path, custom_com_if_dict=custom_com_if_dict) + handle_com_if_arg( + args=args, json_cfg_path=json_cfg_path, custom_com_if_dict=custom_com_if_dict + ) display_mode_param = "long" if args.short_display_mode is not None: @@ -126,14 +155,18 @@ def set_default_globals_post_args_parsing( display_mode_param = "long" seq_cmd_cfg = get_seq_cmd_cfg() seq_cmd_cfg.display_mode = display_mode_param - if args.mode == 'cfdp': + if args.mode == "cfdp": cfdp_cfg = get_cfdp_cfg() direction = Direction.TOWARDS_SENDER if not args.ts and not args.tr: - LOGGER.info('No CFDP direction specified. Assuming direction towards sender') + LOGGER.info( + "No CFDP direction specified. Assuming direction towards sender" + ) elif args.ts and args.tr: - LOGGER.warning('CFDP direction: Both towards sender and towards receiver were specified') - LOGGER.warning('Assuming direction towards towards sender') + LOGGER.warning( + "CFDP direction: Both towards sender and towards receiver were specified" + ) + LOGGER.warning("Assuming direction towards towards sender") elif args.tr: direction = Direction.TOWARDS_RECEIVER cfdp_cfg.direction = direction @@ -172,7 +205,8 @@ def set_default_globals_post_args_parsing( def handle_mode_arg( - args, custom_modes_list: Union[None, List[Union[collections.abc.Iterable, dict]]] = None + args, + custom_modes_list: Union[None, List[Union[collections.abc.Iterable, dict]]] = None, ) -> int: # Determine communication interface from arguments. Must be contained in core modes list try: @@ -188,7 +222,7 @@ def handle_mode_arg( def handle_com_if_arg( - args, json_cfg_path: str, custom_com_if_dict: Dict[str, any] = None + args, json_cfg_path: str, custom_com_if_dict: Dict[str, any] = None ): all_com_ifs = CoreComInterfacesDict if custom_com_if_dict is not None: @@ -198,14 +232,18 @@ def handle_com_if_arg( except AttributeError: LOGGER.warning("No communication interface specified") LOGGER.warning("Trying to set from existing configuration..") - com_if_key = determine_com_if(com_if_dict=all_com_ifs, json_cfg_path=json_cfg_path) + com_if_key = determine_com_if( + com_if_dict=all_com_ifs, json_cfg_path=json_cfg_path + ) if com_if_key == CoreComInterfaces.UNSPECIFIED.value: - com_if_key = determine_com_if(com_if_dict=all_com_ifs, json_cfg_path=json_cfg_path) + com_if_key = determine_com_if( + com_if_dict=all_com_ifs, json_cfg_path=json_cfg_path + ) update_global(CoreGlobalIds.COM_IF, com_if_key) try: LOGGER.info(f"Communication interface: {all_com_ifs[com_if_key]}") except KeyError as e: - LOGGER.error(f'Invalid communication interface key {com_if_key}, error {e}') + LOGGER.error(f"Invalid communication interface key {com_if_key}, error {e}") def check_and_set_other_args(args): @@ -228,8 +266,8 @@ def check_and_set_other_args(args): def check_and_set_core_mode_arg( - mode_arg: any, - custom_modes_list: Union[None, List[Union[dict, collections.abc.Iterable]]] = None + mode_arg: any, + custom_modes_list: Union[None, List[Union[dict, collections.abc.Iterable]]] = None, ) -> int: """Checks whether the mode argument is contained inside the core mode list integer enumeration or a custom mode list integer which can be passed optionally. @@ -275,7 +313,7 @@ def check_and_set_core_mode_arg( def check_and_set_core_service_arg( - service_arg: any, custom_service_list: collections.abc.Iterable = None + service_arg: any, custom_service_list: collections.abc.Iterable = None ): seq_cmd_cfg = get_seq_cmd_cfg() in_enum, service_value = check_args_in_dict( @@ -290,7 +328,9 @@ def check_and_set_core_service_arg( if custom_service_list is not None: for custom_services_entry in custom_service_list: in_enum, service_value = check_args_in_dict( - param=service_arg, iterable=custom_services_entry, warning_hint="custom mode" + param=service_arg, + iterable=custom_services_entry, + warning_hint="custom mode", ) if in_enum: break @@ -328,8 +368,10 @@ def get_default_service_op_code_dict() -> ServiceOpCodeDictT: def add_op_code_entry( - op_code_dict: OpCodeEntryT, keys: OpCodeNameT, info: str, - options: OpCodeOptionsT = None + op_code_dict: OpCodeEntryT, + keys: OpCodeNameT, + info: str, + options: OpCodeOptionsT = None, ): if isinstance(keys, str): keys = [keys] @@ -337,6 +379,9 @@ def add_op_code_entry( def add_service_op_code_entry( - srv_op_code_dict: ServiceOpCodeDictT, name: str, info: str, op_code_entry: OpCodeEntryT + srv_op_code_dict: ServiceOpCodeDictT, + name: str, + info: str, + op_code_entry: OpCodeEntryT, ): srv_op_code_dict.update({name: (info, op_code_entry)}) diff --git a/src/tmtccmd/config/hook.py b/src/tmtccmd/config/hook.py index 2e26227a..38422dc4 100644 --- a/src/tmtccmd/config/hook.py +++ b/src/tmtccmd/config/hook.py @@ -26,6 +26,7 @@ def __init__(self): @abstractmethod def get_object_ids(self) -> Dict[bytes, list]: from tmtccmd.config.objects import get_core_object_ids + """The user can specify an object ID dictionary here mapping object ID bytearrays to a list. This list could contain containing the string representation or additional information about that object ID. @@ -40,6 +41,7 @@ def add_globals_pre_args_parsing(self, gui: bool = False): :return: """ from tmtccmd.config.globals import set_default_globals_pre_args_parsing + set_default_globals_pre_args_parsing(gui=gui, apid=DEFAULT_APID) @abstractmethod @@ -49,13 +51,14 @@ def add_globals_post_args_parsing(self, args: argparse.Namespace): :param args: Specify whether a GUI is used """ from tmtccmd.config.globals import set_default_globals_post_args_parsing + set_default_globals_post_args_parsing( args=args, json_cfg_path=self.get_json_config_file_path() ) @abstractmethod def assign_communication_interface( - self, com_if_key: str, tmtc_printer: TmTcPrinter + self, com_if_key: str, tmtc_printer: TmTcPrinter ) -> Optional[CommunicationInterface]: """Assign the communication interface used by the TMTC commander to send and receive TMTC with. @@ -64,9 +67,11 @@ def assign_communication_interface( :param tmtc_printer: Printer utility instance. """ from tmtccmd.config.com_if import create_communication_interface_default + return create_communication_interface_default( - com_if_key=com_if_key, tmtc_printer=tmtc_printer, - json_cfg_path=self.get_json_config_file_path() + com_if_key=com_if_key, + tmtc_printer=tmtc_printer, + json_cfg_path=self.get_json_config_file_path(), ) @abstractmethod @@ -77,6 +82,7 @@ def get_service_op_code_dictionary(self) -> ServiceOpCodeDictT: :return: """ from tmtccmd.config.globals import get_default_service_op_code_dict + return get_default_service_op_code_dict() @abstractmethod @@ -89,7 +95,9 @@ def perform_mode_operation(self, tmtc_backend: TmTcHandler, mode: int): pass @abstractmethod - def pack_service_queue(self, service: Union[int, str], op_code: str, service_queue: TcQueueT): + def pack_service_queue( + self, service: Union[int, str], op_code: str, service_queue: TcQueueT + ): """Overriding this function allows the user to package a telecommand queue for a given service and operation code combination. @@ -118,7 +126,7 @@ def get_json_config_file_path(self) -> str: @staticmethod def handle_service_8_telemetry( - object_id: bytes, action_id: int, custom_data: bytearray + object_id: bytes, action_id: int, custom_data: bytearray ) -> Tuple[list, list]: """This function is called by the TMTC core to handle Service 8 packets The user can return a tuple of two lists, where the first list @@ -186,6 +194,7 @@ def get_global_hook_obj() -> Optional[TmTcHookBase]: from tmtccmd.config.definitions import CoreGlobalIds from typing import cast + hook_obj_raw = get_global(CoreGlobalIds.TMTC_HOOK) if hook_obj_raw is None: LOGGER.error("Hook object is invalid!") diff --git a/src/tmtccmd/config/objects.py b/src/tmtccmd/config/objects.py index fca887b3..b94e2b92 100644 --- a/src/tmtccmd/config/objects.py +++ b/src/tmtccmd/config/objects.py @@ -1,7 +1,7 @@ from typing import Dict -INVALID_ID = bytes([0xff, 0xff, 0xff, 0xff]) +INVALID_ID = bytes([0xFF, 0xFF, 0xFF, 0xFF]) def get_core_object_ids() -> Dict[bytes, list]: diff --git a/src/tmtccmd/core/backend.py b/src/tmtccmd/core/backend.py index 0000241e..36a2144c 100644 --- a/src/tmtccmd/core/backend.py +++ b/src/tmtccmd/core/backend.py @@ -11,7 +11,9 @@ from tmtccmd.tm.definitions import TmTypes from tmtccmd.tm.handler import TmHandler from tmtccmd.utility.logger import get_console_logger -from tmtccmd.sendreceive.sequential_sender_receiver import SequentialCommandSenderReceiver +from tmtccmd.sendreceive.sequential_sender_receiver import ( + SequentialCommandSenderReceiver, +) from tmtccmd.sendreceive.tm_listener import TmListener from tmtccmd.ccsds.handler import CcsdsTmHandler from tmtccmd.com_if.com_interface_base import CommunicationInterface @@ -45,10 +47,14 @@ class TmTcHandler(BackendBase): """ def __init__( - self, com_if: CommunicationInterface, tmtc_printer: TmTcPrinter, - tm_listener: TmListener, tm_handler: TmHandler, init_mode: int, - init_service: Union[str, int] = CoreServiceList.SERVICE_17.value, - init_opcode: str = "0" + self, + com_if: CommunicationInterface, + tmtc_printer: TmTcPrinter, + tm_listener: TmListener, + tm_handler: TmHandler, + init_mode: int, + init_service: Union[str, int] = CoreServiceList.SERVICE_17.value, + init_opcode: str = "0", ): self.mode = init_mode self.com_if_key = com_if.get_id() @@ -133,17 +139,26 @@ def set_current_apid(self, apid: int): @staticmethod def prepare_tmtc_handler_start( - com_if: CommunicationInterface, tmtc_printer: TmTcPrinter, tm_listener: TmListener, - init_mode: int, tm_handler: TmHandler, - init_service: Union[str, int] = CoreServiceList.SERVICE_17.value, - init_opcode: str = "0" + com_if: CommunicationInterface, + tmtc_printer: TmTcPrinter, + tm_listener: TmListener, + init_mode: int, + tm_handler: TmHandler, + init_service: Union[str, int] = CoreServiceList.SERVICE_17.value, + init_opcode: str = "0", ): from multiprocessing import Process + tmtc_handler = TmTcHandler( - com_if=com_if, tmtc_printer=tmtc_printer, tm_listener=tm_listener, init_mode=init_mode, - init_service=init_service, init_opcode=init_opcode, tm_handler=tm_handler + com_if=com_if, + tmtc_printer=tmtc_printer, + tm_listener=tm_listener, + init_mode=init_mode, + init_service=init_service, + init_opcode=init_opcode, + tm_handler=tm_handler, ) - tmtc_task = Process(target=TmTcHandler.start_handler, args=(tmtc_handler, )) + tmtc_task = Process(target=TmTcHandler.start_handler, args=(tmtc_handler,)) return tmtc_task @staticmethod @@ -156,13 +171,16 @@ def start_handler(executed_handler): def initialize(self): from tmtccmd.utility.exit_handler import keyboard_interrupt_handler + """ Perform initialization steps which might be necessary after class construction. This has to be called at some point before using the class! """ if self.mode == CoreModeList.LISTENER_MODE: - LOGGER.info('Running in listener mode..') - atexit.register(keyboard_interrupt_handler, tmtc_backend=self, com_interface=self.__com_if) + LOGGER.info("Running in listener mode..") + atexit.register( + keyboard_interrupt_handler, tmtc_backend=self, com_interface=self.__com_if + ) def start_listener(self, perform_op_immediately: bool = True): try: @@ -223,20 +241,28 @@ def __handle_action(self): LOGGER.info("TmTcHandler: Packets received.") packet_queues = self.__tm_listener.retrieve_tm_packet_queues(clear=True) if len(packet_queues) > 0: - self.__tm_handler.handle_packet_queues(packet_queue_list=packet_queues) + self.__tm_handler.handle_packet_queues( + packet_queue_list=packet_queues + ) self.__tm_listener.clear_reply_event() elif self.mode == CoreModeList.SEQUENTIAL_CMD_MODE: service_queue = deque() service_queue_packer = ServiceQueuePacker() service_queue_packer.pack_service_queue_core( - service=self.__service, service_queue=service_queue, op_code=self.__op_code) + service=self.__service, + service_queue=service_queue, + op_code=self.__op_code, + ) if not self.__com_if.valid: return LOGGER.info("Performing service command operation") sender_and_receiver = SequentialCommandSenderReceiver( - com_if=self.__com_if, tmtc_printer=self.__tmtc_printer, - tm_handler=self.__tm_handler, tm_listener=self.__tm_listener, - tc_queue=service_queue, apid=self.__apid + com_if=self.__com_if, + tmtc_printer=self.__tmtc_printer, + tm_handler=self.__tm_handler, + tm_listener=self.__tm_listener, + tc_queue=service_queue, + apid=self.__apid, ) sender_and_receiver.send_queue_tc_and_receive_tm_sequentially() self.mode = CoreModeList.LISTENER_MODE @@ -245,11 +271,14 @@ def __handle_action(self): if self.__tm_listener.reply_event(): packet_queues = self.__tm_listener.retrieve_tm_packet_queues(clear=True) if len(packet_queues) > 0: - self.__tm_handler.handle_packet_queues(packet_queue_list=packet_queues) + self.__tm_handler.handle_packet_queues( + packet_queue_list=packet_queues + ) self.__tm_listener.clear_reply_event() else: try: from tmtccmd.config.hook import get_global_hook_obj + hook_obj = get_global_hook_obj() hook_obj.perform_mode_operation(mode=self.mode, tmtc_backend=self) except ImportError as error: @@ -273,4 +302,5 @@ def __core_operation(self, one_shot): def get_tmtc_backend() -> BackendBase: from tmtccmd.config.globals import get_global, CoreGlobalIds + return get_global(CoreGlobalIds.TMTC_BACKEND) diff --git a/src/tmtccmd/core/frontend.py b/src/tmtccmd/core/frontend.py index 22f421b9..0de88b15 100644 --- a/src/tmtccmd/core/frontend.py +++ b/src/tmtccmd/core/frontend.py @@ -15,8 +15,22 @@ from multiprocessing import Process from typing import Union -from PyQt5.QtWidgets import QMainWindow, QGridLayout, QTableWidget, QWidget, QLabel, QCheckBox, \ - QDoubleSpinBox, QFrame, QComboBox, QPushButton, QTableWidgetItem, QMenu, QAction, QMenuBar +from PyQt5.QtWidgets import ( + QMainWindow, + QGridLayout, + QTableWidget, + QWidget, + QLabel, + QCheckBox, + QDoubleSpinBox, + QFrame, + QComboBox, + QPushButton, + QTableWidgetItem, + QMenu, + QAction, + QMenuBar, +) from PyQt5.QtGui import QPixmap, QIcon from PyQt5.QtCore import Qt, pyqtSignal, QObject, QThread, QRunnable @@ -34,31 +48,34 @@ LOGGER = get_console_logger() -CONNECT_BTTN_STYLE = \ - "background-color: #1fc600;" \ - "border-style: inset;" \ - "font: bold;" \ - "padding: 6px;" \ - "border-width: 2px;" \ +CONNECT_BTTN_STYLE = ( + "background-color: #1fc600;" + "border-style: inset;" + "font: bold;" + "padding: 6px;" + "border-width: 2px;" "border-radius: 6px;" +) -DISCONNECT_BTTN_STYLE = \ - "background-color: orange;" \ - "border-style: inset;" \ - "font: bold;" \ - "padding: 6px;" \ - "border-width: 2px;" \ +DISCONNECT_BTTN_STYLE = ( + "background-color: orange;" + "border-style: inset;" + "font: bold;" + "padding: 6px;" + "border-width: 2px;" "border-radius: 6px;" +) -COMMAND_BUTTON_STYLE = \ - "background-color: #cdeefd;" \ - "border-style: inset;" \ - "font: bold;" \ - "padding: 6px;" \ - "border-width: 2px;" \ +COMMAND_BUTTON_STYLE = ( + "background-color: #cdeefd;" + "border-style: inset;" + "font: bold;" + "padding: 6px;" + "border-width: 2px;" "border-radius: 6px;" +) class WorkerOperationsCodes(enum.IntEnum): @@ -97,12 +114,15 @@ class RunnableThread(QRunnable): """ Runnable thread which can be used with QThreadPool. Not used for now, might be needed in the future. """ + def run(self): pass class TmTcFrontend(QMainWindow, FrontendBase): - def __init__(self, hook_obj: TmTcHookBase, tmtc_backend: TmTcHandler, app_name: str): + def __init__( + self, hook_obj: TmTcHookBase, tmtc_backend: TmTcHandler, app_name: str + ): super(TmTcFrontend, self).__init__() super(QMainWindow, self).__init__() self._tmtc_handler = tmtc_backend @@ -169,9 +189,7 @@ def __start_ui(self): self.__command_button = QPushButton() self.__command_button.setText("Send Command") - self.__command_button.setStyleSheet( - COMMAND_BUTTON_STYLE - ) + self.__command_button.setStyleSheet(COMMAND_BUTTON_STYLE) self.__command_button.clicked.connect(self.__start_seq_cmd_op) self.__command_button.setEnabled(False) grid.addWidget(self.__command_button, row, 0, 1, 2) @@ -187,7 +205,8 @@ def __start_seq_cmd_op(self): self._tmtc_handler.set_service(self._current_service) self._tmtc_handler.set_opcode(self._current_op_code) self.__start_qthread_task( - op_code=WorkerOperationsCodes.SEQUENTIAL_COMMANDING, finish_callback=self.__finish_seq_cmd_op + op_code=WorkerOperationsCodes.SEQUENTIAL_COMMANDING, + finish_callback=self.__finish_seq_cmd_op, ) def __finish_seq_cmd_op(self): @@ -200,13 +219,12 @@ def __connect_button_action(self): if self._current_com_if != self._last_com_if: hook_obj = get_global_hook_obj() new_com_if = hook_obj.assign_communication_interface( - com_if_key=self._current_com_if, tmtc_printer=self._tmtc_handler.get_printer() + com_if_key=self._current_com_if, + tmtc_printer=self._tmtc_handler.get_printer(), ) self._tmtc_handler.set_com_if(new_com_if) self._tmtc_handler.start_listener(False) - self.__connect_button.setStyleSheet( - DISCONNECT_BTTN_STYLE - ) + self.__connect_button.setStyleSheet(DISCONNECT_BTTN_STYLE) self.__command_button.setEnabled(True) self.__connect_button.setText("Disconnect") self.__connected = True @@ -215,15 +233,14 @@ def __connect_button_action(self): self.__command_button.setEnabled(False) self.__connect_button.setEnabled(False) self.__start_qthread_task( - op_code=WorkerOperationsCodes.DISCONNECT, finish_callback=self.__finish_disconnect_button_op + op_code=WorkerOperationsCodes.DISCONNECT, + finish_callback=self.__finish_disconnect_button_op, ) def __finish_disconnect_button_op(self): self.__connect_button.setEnabled(True) # self.__disconnect_button.setEnabled(False) - self.__connect_button.setStyleSheet( - CONNECT_BTTN_STYLE - ) + self.__connect_button.setStyleSheet(CONNECT_BTTN_STYLE) self.__connect_button.setText("Connect") LOGGER.info("Disconnect successfull") self.__connected = False @@ -242,7 +259,7 @@ def __create_menu_bar(self): @staticmethod def __help_url(): - webbrowser.open('https://tmtccmd.readthedocs.io/en/latest/') + webbrowser.open("https://tmtccmd.readthedocs.io/en/latest/") def __set_up_config_section(self, grid: QGridLayout, row: int) -> int: grid.addWidget(QLabel("Configuration:"), row, 0, 1, 2) @@ -322,9 +339,7 @@ def __set_up_com_if_section(self, grid: QGridLayout, row: int) -> int: self.__connect_button = QPushButton() self.__connect_button.setText("Connect") - self.__connect_button.setStyleSheet( - CONNECT_BTTN_STYLE - ) + self.__connect_button.setStyleSheet(CONNECT_BTTN_STYLE) self.__connect_button.clicked.connect(self.__connect_button_action) grid.addWidget(self.__connect_button, row, 0, 1, 2) @@ -343,6 +358,7 @@ def __set_up_service_op_code_section(self, grid: QGridLayout, row: int): LOGGER.warning("Invalid service to operation code dictionary") LOGGER.warning("Setting default dictionary") from tmtccmd.config.globals import get_default_service_op_code_dict + self.service_op_code_dict = get_default_service_op_code_dict() index = 0 default_index = 0 @@ -361,7 +377,9 @@ def __set_up_service_op_code_section(self, grid: QGridLayout, row: int): self.__combo_box_op_codes = QComboBox() self._current_service = self._service_list[default_index] self.__update_op_code_combo_box() - self.__combo_box_op_codes.currentIndexChanged.connect(self.__op_code_index_changed) + self.__combo_box_op_codes.currentIndexChanged.connect( + self.__op_code_index_changed + ) # TODO: Combo box also needs to be updated if another service is selected grid.addWidget(self.__combo_box_op_codes, row, 1, 1, 1) row += 1 @@ -377,7 +395,9 @@ def __set_up_pixmap(self, grid: QGridLayout, row: int) -> int: pixmap_height = pixmap.height() row += 1 - pixmap_scaled = pixmap.scaled(pixmap_width * 0.3, pixmap_height * 0.3, Qt.KeepAspectRatio) + pixmap_scaled = pixmap.scaled( + pixmap_width * 0.3, pixmap_height * 0.3, Qt.KeepAspectRatio + ) label.setPixmap(pixmap_scaled) label.setScaledContents(True) @@ -387,9 +407,7 @@ def __set_up_pixmap(self, grid: QGridLayout, row: int) -> int: def __start_qthread_task(self, op_code: WorkerOperationsCodes, finish_callback): self.__thread = QThread() - self.__worker = WorkerThread( - op_code=op_code, tmtc_handler=self._tmtc_handler - ) + self.__worker = WorkerThread(op_code=op_code, tmtc_handler=self._tmtc_handler) self.__worker.moveToThread(self.__thread) self.__thread.started.connect(self.__worker.run_worker) @@ -429,7 +447,7 @@ def __update_op_code_combo_box(self): self._op_code_list.append(op_code_key) self.__combo_box_op_codes.addItem(op_code_value[0]) except TypeError: - LOGGER.warning(f'Invalid op code entry {op_code_value}, skipping..') + LOGGER.warning(f"Invalid op code entry {op_code_value}, skipping..") self._current_op_code = self._op_code_list[0] def __checkbox_log_update(self, state: int): diff --git a/src/tmtccmd/core/frontend_base.py b/src/tmtccmd/core/frontend_base.py index a1ea54b7..ee16796a 100644 --- a/src/tmtccmd/core/frontend_base.py +++ b/src/tmtccmd/core/frontend_base.py @@ -2,7 +2,6 @@ class FrontendBase: - @abstractmethod def start(self, args: any): """ diff --git a/src/tmtccmd/pus/obj_id.py b/src/tmtccmd/pus/obj_id.py index b232e6bc..0ae26c41 100644 --- a/src/tmtccmd/pus/obj_id.py +++ b/src/tmtccmd/pus/obj_id.py @@ -13,7 +13,7 @@ def __init__(self, object_id: int): @classmethod def from_bytes(cls, obj_id_as_bytes: bytearray) -> ObjectId: obj_id = ObjectId(object_id=0) - obj_id.id=obj_id_as_bytes + obj_id.id = obj_id_as_bytes return obj_id @property @@ -24,13 +24,13 @@ def id(self) -> int: def id(self, new_id: Union[int, bytearray]): if isinstance(new_id, int): self._object_id = new_id - self._id_as_bytes = struct.pack('!I', self._object_id) + self._id_as_bytes = struct.pack("!I", self._object_id) elif isinstance(new_id, bytearray): if len(new_id) != 4: - LOGGER.warning(f'Invalid object ID length {len(new_id)}') + LOGGER.warning(f"Invalid object ID length {len(new_id)}") raise ValueError self._id_as_bytes = new_id - self._object_id = struct.unpack('!I', self._id_as_bytes[:])[0] + self._object_id = struct.unpack("!I", self._id_as_bytes[:])[0] else: raise ValueError @@ -44,4 +44,4 @@ def as_bytes(self) -> bytes: @property def as_string(self) -> str: - return f'0x{self._object_id:08x}' + return f"0x{self._object_id:08x}" diff --git a/src/tmtccmd/pus/service_17_test.py b/src/tmtccmd/pus/service_17_test.py index f0462c2a..46365e8e 100644 --- a/src/tmtccmd/pus/service_17_test.py +++ b/src/tmtccmd/pus/service_17_test.py @@ -13,17 +13,24 @@ class Srv17Subservices(enum.IntEnum): - PING_CMD = 1, - PING_REPLY = 2, + PING_CMD = (1,) + PING_REPLY = (2,) GEN_EVENT = 128 class Service17TMExtended(PusTmBase, PusTmInfoBase, Service17TM): def __init__( - self, subservice: int, time: CdsShortTimestamp = None, ssc: int = 0, - source_data: bytearray = bytearray([]), apid: int = -1, packet_version: int = 0b000, - pus_version: PusVersion = PusVersion.GLOBAL_CONFIG, secondary_header_flag: bool = True, - space_time_ref: int = 0b0000, destination_id: int = 0 + self, + subservice: int, + time: CdsShortTimestamp = None, + ssc: int = 0, + source_data: bytearray = bytearray([]), + apid: int = -1, + packet_version: int = 0b000, + pus_version: PusVersion = PusVersion.GLOBAL_CONFIG, + secondary_header_flag: bool = True, + space_time_ref: int = 0b0000, + destination_id: int = 0, ): Service17TM.__init__( self, @@ -36,7 +43,7 @@ def __init__( pus_version=pus_version, secondary_header_flag=secondary_header_flag, space_time_ref=space_time_ref, - destination_id=destination_id + destination_id=destination_id, ) PusTmBase.__init__(self, pus_tm=self.pus_tm) PusTmInfoBase.__init__(self, pus_tm=self.pus_tm) @@ -45,13 +52,13 @@ def __init__( @classmethod def __empty(cls) -> Service17TMExtended: - return cls( - subservice=0 - ) + return cls(subservice=0) @classmethod def unpack( - cls, raw_telemetry: bytearray, pus_version: PusVersion = PusVersion.GLOBAL_CONFIG + cls, + raw_telemetry: bytearray, + pus_version: PusVersion = PusVersion.GLOBAL_CONFIG, ) -> Service17TMExtended: service_17_tm = cls.__empty() service_17_tm.pus_tm = PusTelemetry.unpack( @@ -64,10 +71,14 @@ def pack_service_17_ping_command(ssc: int, apid: int = -1) -> PusTelecommand: """Generate a simple ping PUS telecommand packet""" if apid == -1: apid = get_default_tc_apid() - return PusTelecommand(service=17, subservice=Srv17Subservices.PING_CMD, ssc=ssc, apid=apid) + return PusTelecommand( + service=17, subservice=Srv17Subservices.PING_CMD, ssc=ssc, apid=apid + ) -def pack_generic_service17_test(init_ssc: int, tc_queue: TcQueueT, apid: int = -1) -> int: +def pack_generic_service17_test( + init_ssc: int, tc_queue: TcQueueT, apid: int = -1 +) -> int: if apid == -1: apid = get_default_tc_apid() new_ssc = init_ssc diff --git a/src/tmtccmd/pus/service_1_verification.py b/src/tmtccmd/pus/service_1_verification.py index 2f70ac80..79ab7bac 100644 --- a/src/tmtccmd/pus/service_1_verification.py +++ b/src/tmtccmd/pus/service_1_verification.py @@ -17,15 +17,22 @@ class Service1TMExtended(PusTmBase, PusTmInfoBase, Service1TM): - """Service 1 TM class representation. Can be used to deserialize raw service 1 packets. - """ + """Service 1 TM class representation. Can be used to deserialize raw service 1 packets.""" + def __init__( - self, subservice: int, time: CdsShortTimestamp = None, - tc_packet_id: int = 0, tc_psc: int = 0, ssc: int = 0, - source_data: bytearray = bytearray([]), apid: int = -1, packet_version: int = 0b000, - pus_version: PusVersion = PusVersion.GLOBAL_CONFIG, - secondary_header_flag: bool = True, space_time_ref: int = 0b0000, - destination_id: int = 0 + self, + subservice: int, + time: CdsShortTimestamp = None, + tc_packet_id: int = 0, + tc_psc: int = 0, + ssc: int = 0, + source_data: bytearray = bytearray([]), + apid: int = -1, + packet_version: int = 0b000, + pus_version: PusVersion = PusVersion.GLOBAL_CONFIG, + secondary_header_flag: bool = True, + space_time_ref: int = 0b0000, + destination_id: int = 0, ): Service1TM.__init__( self, @@ -38,20 +45,20 @@ def __init__( pus_version=pus_version, secondary_header_flag=secondary_header_flag, space_time_ref=space_time_ref, - destination_id=destination_id + destination_id=destination_id, ) PusTmBase.__init__(self, pus_tm=self.pus_tm) PusTmInfoBase.__init__(self, pus_tm=self.pus_tm) @classmethod def __empty(cls) -> Service1TMExtended: - return cls( - subservice=0 - ) + return cls(subservice=0) @classmethod def unpack( - cls, raw_telemetry: bytearray, pus_version: PusVersion = PusVersion.GLOBAL_CONFIG + cls, + raw_telemetry: bytearray, + pus_version: PusVersion = PusVersion.GLOBAL_CONFIG, ) -> Service1TMExtended: """Parse a service 1 telemetry packet @@ -70,7 +77,7 @@ def unpack( raise ValueError service_1_tm.tc_packet_id = tm_data[0] << 8 | tm_data[1] service_1_tm.tc_psc = tm_data[2] << 8 | tm_data[3] - service_1_tm.tc_ssc = service_1_tm.tc_psc & 0x3fff + service_1_tm.tc_ssc = service_1_tm.tc_psc & 0x3FFF if service_1_tm.subservice % 2 == 0: service_1_tm._handle_failure_verification() else: @@ -86,8 +93,12 @@ def append_telemetry_content(self, content_list: list): if self.is_step_reply: content_list.append(str(self.step_number)) content_list.append(str(hex(self.error_code))) - content_list.append(f'hex {self.error_param_1:04x} dec {self.error_param_1}') - content_list.append(f'hex {self.error_param_2:04x} dec {self.error_param_2}') + content_list.append( + f"hex {self.error_param_1:04x} dec {self.error_param_1}" + ) + content_list.append( + f"hex {self.error_param_2:04x} dec {self.error_param_2}" + ) elif self.is_step_reply: content_list.append(str(self.step_number)) @@ -106,8 +117,7 @@ def append_telemetry_column_headers(self, header_list: list): header_list.append("Step Number") def _handle_failure_verification(self): - """Handle parsing a verification failure packet, subservice ID 2, 4, 6 or 8 - """ + """Handle parsing a verification failure packet, subservice ID 2, 4, 6 or 8""" super()._handle_failure_verification() self.set_packet_info("Failure Verficiation") subservice = self.pus_tm.subservice @@ -122,7 +132,7 @@ def _handle_failure_verification(self): def _handle_success_verification(self): super()._handle_success_verification() - self.set_packet_info('Success Verification') + self.set_packet_info("Success Verification") if self.subservice == 1: self.append_packet_info(" : Acceptance success") elif self.subservice == 3: diff --git a/src/tmtccmd/pus/service_20_parameter.py b/src/tmtccmd/pus/service_20_parameter.py index 3dcb4c59..cb102f53 100644 --- a/src/tmtccmd/pus/service_20_parameter.py +++ b/src/tmtccmd/pus/service_20_parameter.py @@ -68,5 +68,5 @@ class EcssPfcReal(enum.IntEnum): class CustomSubservices(enum.IntEnum): - LOAD = 128, + LOAD = (128,) DUMP = 129 diff --git a/src/tmtccmd/pus/service_5_event.py b/src/tmtccmd/pus/service_5_event.py index 4965e9c8..9f81edb1 100644 --- a/src/tmtccmd/pus/service_5_event.py +++ b/src/tmtccmd/pus/service_5_event.py @@ -9,9 +9,9 @@ class Srv5Severity(enum.IntEnum): class Srv5Subservices(enum.IntEnum): - INFO_EVENT = Srv5Severity.INFO, - LOW_SEVERITY_EVENT = Srv5Severity.LOW_SEVERITY, - MEDIUM_SEVERITY_EVENT = Srv5Severity.MEDIUM_SEVERITY, - HIGH_SEVERITY_EVENT = Srv5Severity.HIGH_SEVERITY, - ENABLE_EVENT_REPORTING = 5, + INFO_EVENT = (Srv5Severity.INFO,) + LOW_SEVERITY_EVENT = (Srv5Severity.LOW_SEVERITY,) + MEDIUM_SEVERITY_EVENT = (Srv5Severity.MEDIUM_SEVERITY,) + HIGH_SEVERITY_EVENT = (Srv5Severity.HIGH_SEVERITY,) + ENABLE_EVENT_REPORTING = (5,) DISABLE_EVENT_REPORTING = 6 diff --git a/src/tmtccmd/pus/service_8_func_cmd.py b/src/tmtccmd/pus/service_8_func_cmd.py index 226c4af6..9dc319d3 100644 --- a/src/tmtccmd/pus/service_8_func_cmd.py +++ b/src/tmtccmd/pus/service_8_func_cmd.py @@ -2,5 +2,5 @@ class Srv8Subservices(enum.IntEnum): - FUNCTIONAL_CMD = 128, + FUNCTIONAL_CMD = (128,) DATA_REPLY = 130 diff --git a/src/tmtccmd/runner.py b/src/tmtccmd/runner.py index e014a7d5..57be606a 100644 --- a/src/tmtccmd/runner.py +++ b/src/tmtccmd/runner.py @@ -17,7 +17,12 @@ from tmtccmd.tm.definitions import TmTypes from tmtccmd.tm.handler import TmHandler from tmtccmd.ccsds.handler import CcsdsTmHandler -from tmtccmd.core.globals_manager import update_global, get_global, lock_global_pool, unlock_global_pool +from tmtccmd.core.globals_manager import ( + update_global, + get_global, + lock_global_pool, + unlock_global_pool, +) from tmtccmd.core.object_id_manager import insert_object_ids from tmtccmd.config.args import parse_input_arguments from tmtccmd.config.objects import get_core_object_ids @@ -49,8 +54,9 @@ def initialize_tmtc_commander(hook_object: TmTcHookBase): various hook functions during program run-time. :raises: ValueError for an invalid hook object. """ - if os.name == 'nt': + if os.name == "nt": import colorama + colorama.init() __assign_tmtc_commander_hooks(hook_object=hook_object) @@ -69,10 +75,12 @@ def add_ccsds_handler(ccsds_handler: CcsdsTmHandler): def run_tmtc_commander( - use_gui: bool, reduced_printout: bool = False, ansi_colors: bool = True, - tmtc_backend: Union[BackendBase, None] = None, - tmtc_frontend: Union[FrontendBase, None] = None, - app_name: str = "TMTC Commander" + use_gui: bool, + reduced_printout: bool = False, + ansi_colors: bool = True, + tmtc_backend: Union[BackendBase, None] = None, + tmtc_frontend: Union[FrontendBase, None] = None, + app_name: str = "TMTC Commander", ): """This is the primary function to run the TMTC commander. Users should call this function to start the TMTC commander. Please note that :py:func:`initialize_tmtc_commander` needs to be @@ -103,6 +111,7 @@ def run_tmtc_commander( if tmtc_backend is None: from tmtccmd.config.hook import get_global_hook_obj from tmtccmd.config.globals import get_global, update_global + hook_obj = get_global_hook_obj() json_cfg_path = hook_obj.get_json_config_file_path() tm_handler = get_global(CoreGlobalIds.TM_HANDLER_HANDLE) @@ -119,8 +128,10 @@ def __assign_tmtc_commander_hooks(hook_object: TmTcHookBase): # Check whether all required hook functions have bee implemented properly, Python # does not enforce this. - if hook_object.add_globals_pre_args_parsing is None \ - or hook_object.add_globals_post_args_parsing is None: + if ( + hook_object.add_globals_pre_args_parsing is None + or hook_object.add_globals_post_args_parsing is None + ): LOGGER.error( "Passed hook base object handle is invalid. Abstract functions have to be implemented!" ) @@ -134,8 +145,10 @@ def __assign_tmtc_commander_hooks(hook_object: TmTcHookBase): def __set_up_tmtc_commander( - use_gui: bool, reduced_printout: bool, ansi_colors: bool = True, - tmtc_backend: Union[BackendBase, None] = None + use_gui: bool, + reduced_printout: bool, + ansi_colors: bool = True, + tmtc_backend: Union[BackendBase, None] = None, ): """Set up the TMTC commander. Raise ValueError if a passed parameter is invalid. :param use_gui: @@ -146,6 +159,7 @@ def __set_up_tmtc_commander( """ from tmtccmd.config.hook import TmTcHookBase from typing import cast + set_tmtc_console_logger() # First, we check whether a hook object was passed to the TMTC commander. This hook object @@ -173,13 +187,13 @@ def __set_up_tmtc_commander( def __handle_init_printout(use_gui: bool, ansi_colors: bool): if ansi_colors: - print(f'{AnsiColors.CYAN}-- Python TMTC Commander --{AnsiColors.RESET}') + print(f"{AnsiColors.CYAN}-- Python TMTC Commander --{AnsiColors.RESET}") if use_gui: - print('-- GUI mode --') + print("-- GUI mode --") else: - print('-- Command line mode --') + print("-- Command line mode --") - print(f'-- tmtccmd version v{get_tmtccmd_version()} --') + print(f"-- tmtccmd version v{get_tmtccmd_version()} --") def __handle_cli_args_and_globals(): @@ -187,7 +201,7 @@ def __handle_cli_args_and_globals(): from tmtccmd.core.globals_manager import get_global hook_obj = cast(TmTcHookBase, get_global(CoreGlobalIds.TMTC_HOOK)) - LOGGER.info('Setting up pre-globals..') + LOGGER.info("Setting up pre-globals..") hook_obj.add_globals_pre_args_parsing(False) LOGGER.info("Parsing input arguments..") @@ -202,12 +216,13 @@ def __start_tmtc_commander_cli(tmtc_backend: BackendBase): def __start_tmtc_commander_qt_gui( - tmtc_frontend: Union[None, FrontendBase] = None, app_name: str = "TMTC Commander" + tmtc_frontend: Union[None, FrontendBase] = None, app_name: str = "TMTC Commander" ): app = None if tmtc_frontend is None: from tmtccmd.core.frontend import TmTcFrontend from tmtccmd.config.hook import get_global_hook_obj + try: from PyQt5.QtWidgets import QApplication except ImportError: @@ -227,12 +242,15 @@ def __start_tmtc_commander_qt_gui( tmtc_frontend.start(app) -def get_default_tmtc_backend(hook_obj: TmTcHookBase, tm_handler: TmHandler, json_cfg_path: str): +def get_default_tmtc_backend( + hook_obj: TmTcHookBase, tm_handler: TmHandler, json_cfg_path: str +): from tmtccmd.core.backend import TmTcHandler from tmtccmd.config.globals import get_seq_cmd_cfg from tmtccmd.utility.tmtc_printer import TmTcPrinter from tmtccmd.sendreceive.tm_listener import TmListener from typing import cast + seq_cmd_cfg = get_seq_cmd_cfg() service, op_code = seq_cmd_cfg.service, seq_cmd_cfg.op_code com_if = get_global(CoreGlobalIds.COM_IF) @@ -260,8 +278,13 @@ def get_default_tmtc_backend(hook_obj: TmTcHookBase, tm_handler: TmHandler, json ) # The global variables are set by the argument parser. tmtc_backend = TmTcHandler( - com_if=com_if, tmtc_printer=tmtc_printer, tm_listener=tm_listener, init_mode=mode, - init_service=service, init_opcode=op_code, tm_handler=tm_handler + com_if=com_if, + tmtc_printer=tmtc_printer, + tm_listener=tm_listener, + init_mode=mode, + init_service=service, + init_opcode=op_code, + tm_handler=tm_handler, ) tmtc_backend.set_current_apid(apid=apid) tmtc_backend.set_one_shot_or_loop_handling(seq_cmd_cfg.listener_after_op) diff --git a/src/tmtccmd/sendreceive/cmd_sender_receiver.py b/src/tmtccmd/sendreceive/cmd_sender_receiver.py index aca31fcd..0bc90903 100644 --- a/src/tmtccmd/sendreceive/cmd_sender_receiver.py +++ b/src/tmtccmd/sendreceive/cmd_sender_receiver.py @@ -19,11 +19,17 @@ class CommandSenderReceiver: """This is the generic CommandSenderReceiver object. All TMTC objects inherit this object, for example specific implementations (e.g. SingleCommandSenderReceiver) """ + def __init__( - self, com_if: CommunicationInterface, tmtc_printer: TmTcPrinter, - tm_listener: TmListener, tm_handler: CcsdsTmHandler, apid: int, - tm_timeout: float = 2.5, tc_send_timeout_factor: float = 2.5, - resend_tc: bool = False + self, + com_if: CommunicationInterface, + tmtc_printer: TmTcPrinter, + tm_listener: TmListener, + tm_handler: CcsdsTmHandler, + apid: int, + tm_timeout: float = 2.5, + tc_send_timeout_factor: float = 2.5, + resend_tc: bool = False, ): """ :param com_if: CommunicationInterface object. Instantiate the desired one @@ -100,8 +106,11 @@ def _check_for_first_reply(self) -> None: else: self._check_for_timeout() - def wait_period_ongoing(self, sleep_rest_of_wait_period: bool = False, - set_reply_rcvd_to_true: bool = True): + def wait_period_ongoing( + self, + sleep_rest_of_wait_period: bool = False, + set_reply_rcvd_to_true: bool = True, + ): if sleep_rest_of_wait_period: # wait rest of wait time sleep_time = self._wait_start + self._wait_period - time.time() diff --git a/src/tmtccmd/sendreceive/multiple_cmds_sender_receiver.py b/src/tmtccmd/sendreceive/multiple_cmds_sender_receiver.py index 1c70f8c7..099770e1 100644 --- a/src/tmtccmd/sendreceive/multiple_cmds_sender_receiver.py +++ b/src/tmtccmd/sendreceive/multiple_cmds_sender_receiver.py @@ -6,7 +6,9 @@ from collections import deque from tmtccmd.config.definitions import CoreGlobalIds -from tmtccmd.sendreceive.sequential_sender_receiver import SequentialCommandSenderReceiver +from tmtccmd.sendreceive.sequential_sender_receiver import ( + SequentialCommandSenderReceiver, +) from tmtccmd.com_if.com_interface_base import CommunicationInterface from tmtccmd.utility.tmtc_printer import TmTcPrinter from tmtccmd.core.globals_manager import get_global @@ -22,9 +24,17 @@ class MultipleCommandSenderReceiver(SequentialCommandSenderReceiver): Wait intervals can be specified with wait time between the send bursts. This is generally done in the separate test classes in UnitTest """ - def __init__(self, com_if: CommunicationInterface, tmtc_printer: TmTcPrinter, - tc_queue: Deque, tm_listener: TmListener, wait_intervals: list, - wait_time: Union[float, list], print_tm: bool): + + def __init__( + self, + com_if: CommunicationInterface, + tmtc_printer: TmTcPrinter, + tc_queue: Deque, + tm_listener: TmListener, + wait_intervals: list, + wait_time: Union[float, list], + print_tm: bool, + ): """TCs are sent in burst when applicable. Wait intervals can be specified by supplying respective arguments @@ -38,7 +48,10 @@ def __init__(self, com_if: CommunicationInterface, tmtc_printer: TmTcPrinter, :param print_tm: """ super().__init__( - com_if=com_if, tmtc_printer=tmtc_printer, tm_listener=tm_listener, tc_queue=tc_queue + com_if=com_if, + tmtc_printer=tmtc_printer, + tm_listener=tm_listener, + tc_queue=tc_queue, ) self.waitIntervals = wait_intervals self.waitTime = wait_time @@ -103,8 +116,10 @@ def __retrieve_listener_tm_packet_queue(self): if self._tm_listener.reply_event(): return self._tm_listener.retrieve_tm_packet_queue() else: - LOGGER.error("Multiple Command SenderReceiver: Configuration error, " - "reply event not set in TM listener") + LOGGER.error( + "Multiple Command SenderReceiver: Configuration error, " + "reply event not set in TM listener" + ) def __clear_listener_tm_info_queue(self): self._tm_listener.clear_tm_packet_queue() diff --git a/src/tmtccmd/sendreceive/sequential_sender_receiver.py b/src/tmtccmd/sendreceive/sequential_sender_receiver.py index f37bdf51..cb1872eb 100644 --- a/src/tmtccmd/sendreceive/sequential_sender_receiver.py +++ b/src/tmtccmd/sendreceive/sequential_sender_receiver.py @@ -20,10 +20,17 @@ class SequentialCommandSenderReceiver(CommandSenderReceiver): """Specific implementation of CommandSenderReceiver to send multiple telecommands in sequence""" + def __init__( - self, com_if: CommunicationInterface, tmtc_printer: TmTcPrinter, - tm_handler: CcsdsTmHandler, apid: int, tm_listener: TmListener, tc_queue: TcQueueT, - tm_timeout: float = 2.5, tc_send_timeout_factor: float = 2.5 + self, + com_if: CommunicationInterface, + tmtc_printer: TmTcPrinter, + tm_handler: CcsdsTmHandler, + apid: int, + tm_listener: TmListener, + tc_queue: TcQueueT, + tm_timeout: float = 2.5, + tc_send_timeout_factor: float = 2.5, ): """ :param com_if: CommunicationInterface object, passed on to CommandSenderReceiver @@ -33,9 +40,13 @@ def __init__( this time period """ super().__init__( - com_if=com_if, tmtc_printer=tmtc_printer, tm_listener=tm_listener, - tm_handler=tm_handler, apid=apid, tm_timeout=tm_timeout, - tc_send_timeout_factor=tc_send_timeout_factor + com_if=com_if, + tmtc_printer=tmtc_printer, + tm_listener=tm_listener, + tm_handler=tm_handler, + apid=apid, + tm_timeout=tm_timeout, + tc_send_timeout_factor=tc_send_timeout_factor, ) self._tc_queue = tc_queue self.__all_replies_received = False @@ -84,13 +95,17 @@ def __check_for_reply(self): packet_queue = self._tm_listener.retrieve_ccsds_tm_packet_queue( apid=self._apid, clear=True ) - self._tm_handler.handle_ccsds_packet_queue(apid=self._apid, packet_queue=packet_queue) + self._tm_handler.handle_ccsds_packet_queue( + apid=self._apid, packet_queue=packet_queue + ) # This makes reply reception more responsive elif self._tm_listener.tm_packets_available(): packet_queue = self._tm_listener.retrieve_ccsds_tm_packet_queue( apid=self._apid, clear=True ) - self._tm_handler.handle_ccsds_packet_queue(apid=self._apid, packet_queue=packet_queue) + self._tm_handler.handle_ccsds_packet_queue( + apid=self._apid, packet_queue=packet_queue + ) def __check_next_tc_send(self): if self.wait_period_ongoing(): diff --git a/src/tmtccmd/sendreceive/single_command_sender_receiver.py b/src/tmtccmd/sendreceive/single_command_sender_receiver.py index f1e3719f..65f1c276 100644 --- a/src/tmtccmd/sendreceive/single_command_sender_receiver.py +++ b/src/tmtccmd/sendreceive/single_command_sender_receiver.py @@ -27,9 +27,14 @@ class SingleCommandSenderReceiver(CommandSenderReceiver): Specific implementation of CommandSenderReceiver to send a single telecommand This object can be used by instantiating it and calling sendSingleTcAndReceiveTm() """ + def __init__( - self, com_if: CommunicationInterface, tmtc_printer: TmTcPrinter, - tm_listener: TmListener, tm_handler: CcsdsTmHandler, apid: int + self, + com_if: CommunicationInterface, + tmtc_printer: TmTcPrinter, + tm_listener: TmListener, + tm_handler: CcsdsTmHandler, + apid: int, ): """ :param com_if: CommunicationInterface object, passed on to CommandSenderReceiver @@ -37,8 +42,11 @@ def __init__( :param tmtc_printer: TmTcPrinter object, passed on to CommandSenderReceiver """ super().__init__( - com_if=com_if, tm_listener=tm_listener, tmtc_printer=tmtc_printer, - tm_handler=tm_handler,apid=apid + com_if=com_if, + tm_listener=tm_listener, + tmtc_printer=tmtc_printer, + tm_handler=tm_handler, + apid=apid, ) def send_single_tc_and_receive_tm(self, pus_packet_tuple: PusTcTupleT): @@ -67,6 +75,8 @@ def send_single_tc_and_receive_tm(self, pus_packet_tuple: PusTcTupleT): packet_queue = self._tm_listener.retrieve_ccsds_tm_packet_queue( apid=self._apid, clear=True ) - self._tm_handler.handle_ccsds_packet_queue(apid=self._apid, packet_queue=packet_queue) + self._tm_handler.handle_ccsds_packet_queue( + apid=self._apid, packet_queue=packet_queue + ) logger.info("SingleCommandSenderReceiver: Reply received") logger.info("Listening for packages ...") diff --git a/src/tmtccmd/sendreceive/tm_listener.py b/src/tmtccmd/sendreceive/tm_listener.py index ad45ae90..64136212 100644 --- a/src/tmtccmd/sendreceive/tm_listener.py +++ b/src/tmtccmd/sendreceive/tm_listener.py @@ -32,6 +32,7 @@ class TmListener: to poll data with the provided communication interface. Dedicated sender and receiver object or any other software component can get the received packets from the internal deque container. """ + MODE_OPERATION_TIMEOUT = 300 DEFAULT_UNKNOWN_QUEUE_MAX_LEN = 50 QUEUE_DICT_QUEUE_IDX = 0 @@ -40,13 +41,16 @@ class TmListener: DEFAULT_LOCK_TIMEOUT = 0.5 class ListenerModes(Enum): - MANUAL = 1, - LISTENER = 2, - SEQUENCE = 3, + MANUAL = (1,) + LISTENER = (2,) + SEQUENCE = (3,) def __init__( - self, com_if: CommunicationInterface, tm_timeout: float, tc_timeout_factor: float, - tm_type: TmTypes = TmTypes.CCSDS_SPACE_PACKETS + self, + com_if: CommunicationInterface, + tm_timeout: float, + tc_timeout_factor: float, + tm_type: TmTypes = TmTypes.CCSDS_SPACE_PACKETS, ): """Initiate a TM listener. :param com_if: Type of communication interface, e.g. a serial or ethernet interface @@ -63,7 +67,9 @@ def __init__( self.current_apid = INVALID_APID # Listener is daemon and will exit automatically if all other threads are closed - self.listener_thread = threading.Thread(target=self.__perform_operation, daemon=True) + self.listener_thread = threading.Thread( + target=self.__perform_operation, daemon=True + ) self.lock_listener = threading.Lock() # This Event is set by sender objects to perform mode operations self.event_mode_change = threading.Event() @@ -76,9 +82,9 @@ def __init__( self.__listener_mode = self.ListenerModes.LISTENER self.__tm_type = tm_type - self.__queue_dict: QueueDictT = dict({ - UNKNOWN_TARGET_ID: (deque(), self.DEFAULT_UNKNOWN_QUEUE_MAX_LEN) - }) + self.__queue_dict: QueueDictT = dict( + {UNKNOWN_TARGET_ID: (deque(), self.DEFAULT_UNKNOWN_QUEUE_MAX_LEN)} + ) def start(self): if not self.event_listener_active.is_set(): @@ -131,7 +137,7 @@ def ccsds_tm_received(self, apid: int = INVALID_APID): """This function is used to check whether any data has been received""" queue_dict_list = self.__queue_dict.get(apid) if queue_dict_list is None: - LOGGER.warning(f'No queue available for APID {apid}') + LOGGER.warning(f"No queue available for APID {apid}") queue_dict = queue_dict_list[self.QUEUE_DICT_QUEUE_IDX] if queue_dict.__len__() > 0: return True @@ -139,7 +145,9 @@ def ccsds_tm_received(self, apid: int = INVALID_APID): return False def tm_packets_available(self): - with acquire_timeout(self.lock_listener, timeout=self.DEFAULT_LOCK_TIMEOUT) as acquired: + with acquire_timeout( + self.lock_listener, timeout=self.DEFAULT_LOCK_TIMEOUT + ) as acquired: if acquired: for queue_lists in self.__queue_dict.values(): if queue_lists[self.QUEUE_DICT_QUEUE_IDX]: @@ -148,7 +156,9 @@ def tm_packets_available(self): def retrieve_tm_packet_queues(self, clear: bool) -> QueueListT: queues = [] - with acquire_timeout(self.lock_listener, timeout=self.DEFAULT_LOCK_TIMEOUT) as acquired: + with acquire_timeout( + self.lock_listener, timeout=self.DEFAULT_LOCK_TIMEOUT + ) as acquired: if not acquired: LOGGER.error("Could not acquire lock!") # Still continue @@ -158,22 +168,26 @@ def retrieve_tm_packet_queues(self, clear: bool) -> QueueListT: self.clear_tm_packet_queues(lock=False) return queues - def retrieve_ccsds_tm_packet_queue(self, apid: int = -1, clear: bool = False) -> TelemetryQueueT: + def retrieve_ccsds_tm_packet_queue( + self, apid: int = -1, clear: bool = False + ) -> TelemetryQueueT: """Retrieve the packet queue for a given APID. The TM listener will handle routing packets into the correct queue.""" if apid == -1: apid = self.current_apid target_queue_list = self.__queue_dict.get(apid) if target_queue_list is None: - LOGGER.warning(f'No queue available for APID {apid}') + LOGGER.warning(f"No queue available for APID {apid}") return deque() target_queue = target_queue_list[self.QUEUE_DICT_QUEUE_IDX] # We make sure that the queue is not manipulated while it is being copied. - with acquire_timeout(self.lock_listener, timeout=self.DEFAULT_LOCK_TIMEOUT) as acquired: + with acquire_timeout( + self.lock_listener, timeout=self.DEFAULT_LOCK_TIMEOUT + ) as acquired: if not acquired: LOGGER.warning( - f'TmListener: Blocked on lock acquisition for longer than' - f'{self.DEFAULT_LOCK_TIMEOUT} second!' + f"TmListener: Blocked on lock acquisition for longer than" + f"{self.DEFAULT_LOCK_TIMEOUT} second!" ) tm_queue_copy = target_queue.copy() if clear: @@ -185,13 +199,15 @@ def clear_ccsds_tm_packet_queue(self, apid: int): apid = self.current_apid target_queue = self.__queue_dict.get(apid) if target_queue is None: - LOGGER.warning(f'No queue available for APID {apid}') + LOGGER.warning(f"No queue available for APID {apid}") return - with acquire_timeout(self.lock_listener, timeout=self.DEFAULT_LOCK_TIMEOUT) as acquired: + with acquire_timeout( + self.lock_listener, timeout=self.DEFAULT_LOCK_TIMEOUT + ) as acquired: if not acquired: LOGGER.warning( - f'TmListener: Blocked on lock acquisition for longer than' - f'{self.DEFAULT_LOCK_TIMEOUT} second!' + f"TmListener: Blocked on lock acquisition for longer than" + f"{self.DEFAULT_LOCK_TIMEOUT} second!" ) target_queue[0].clear() @@ -205,8 +221,12 @@ def clear_tm_packet_queues(self, lock: bool): self.lock_listener.release() def retrieve_unknown_target_queue(self): - target_queue = self.__queue_dict.get(UNKNOWN_TARGET_ID)[self.QUEUE_DICT_QUEUE_IDX] - with acquire_timeout(self.lock_listener, timeout=self.DEFAULT_LOCK_TIMEOUT) as acquired: + target_queue = self.__queue_dict.get(UNKNOWN_TARGET_ID)[ + self.QUEUE_DICT_QUEUE_IDX + ] + with acquire_timeout( + self.lock_listener, timeout=self.DEFAULT_LOCK_TIMEOUT + ) as acquired: if acquired: return target_queue.copy() @@ -257,11 +277,13 @@ def __perform_core_operation(self): """The core operation listens for packets.""" packet_list = self.__com_if.receive() if len(packet_list) > 0: - with acquire_timeout(self.lock_listener, timeout=self.DEFAULT_LOCK_TIMEOUT) as acquired: + with acquire_timeout( + self.lock_listener, timeout=self.DEFAULT_LOCK_TIMEOUT + ) as acquired: if not acquired: LOGGER.warning( - f'TmListener: Blocked on lock acquisition for longer than' - f'{self.DEFAULT_LOCK_TIMEOUT} second!' + f"TmListener: Blocked on lock acquisition for longer than" + f"{self.DEFAULT_LOCK_TIMEOUT} second!" ) self.__route_packets(packet_list) if not self.__event_reply_received.is_set(): @@ -301,14 +323,18 @@ def __read_telemetry_sequence(self): if self.__event_mode_op_finished.is_set(): if self.__listener_mode == self.ListenerModes.SEQUENCE: return - packets_available = self.__com_if.data_available(timeout=0.2, parameters=None) + packets_available = self.__com_if.data_available( + timeout=0.2, parameters=None + ) if packets_available > 0: packet_list = self.__com_if.receive() - with acquire_timeout(self.lock_listener, timeout=self.DEFAULT_LOCK_TIMEOUT) as acquired: + with acquire_timeout( + self.lock_listener, timeout=self.DEFAULT_LOCK_TIMEOUT + ) as acquired: if not acquired: LOGGER.warning( - f'TmListener: Blocked on lock acquisition for longer than' - f'{self.DEFAULT_LOCK_TIMEOUT} second!' + f"TmListener: Blocked on lock acquisition for longer than" + f"{self.DEFAULT_LOCK_TIMEOUT} second!" ) self.__route_packets(packet_list) elapsed_time = time.time() - start_time @@ -318,6 +344,7 @@ def __read_telemetry_sequence(self): # takes longer, but it is reset here to the global value from tmtccmd.config.globals import get_seq_cmd_cfg from tmtccmd.config.definitions import CoreGlobalIds + seq_cmd_cfg = get_seq_cmd_cfg() if self.__tm_timeout is not seq_cmd_cfg.tm_timeout: self.__tm_timeout = seq_cmd_cfg.tm_timeout @@ -330,26 +357,34 @@ def __route_packets(self, tm_packet_list: TelemetryListT): if packet_handled: continue # No queue was found - LOGGER.warning('No target queue found, inserting into unknown target queue') + LOGGER.warning("No target queue found, inserting into unknown target queue") unknown_target_list = self.__queue_dict[UNKNOWN_TARGET_ID] unknown_target_queue = unknown_target_list[self.QUEUE_DICT_QUEUE_IDX] - if unknown_target_queue.__len__() > unknown_target_list[self.QUEUE_DICT_MAX_LEN_IDX]: - LOGGER.warning('Unknown target queue full. Removing oldest packet..') + if ( + unknown_target_queue.__len__() + > unknown_target_list[self.QUEUE_DICT_MAX_LEN_IDX] + ): + LOGGER.warning("Unknown target queue full. Removing oldest packet..") unknown_target_queue.pop() unknown_target_queue.appendleft(tm_packet) def __handle_ccsds_space_packet(self, tm_packet: bytearray) -> bool: if len(tm_packet) < 6: - LOGGER.warning('TM packet to small to be a CCSDS space packet') + LOGGER.warning("TM packet to small to be a CCSDS space packet") else: apid = get_apid_from_raw_space_packet(raw_packet=tm_packet) target_queue_list = self.__queue_dict.get(apid) if target_queue_list is None: - LOGGER.warning(f'No TM handler assigned for APID {apid}') + LOGGER.warning(f"No TM handler assigned for APID {apid}") else: target_queue = target_queue_list[self.QUEUE_DICT_QUEUE_IDX] - if target_queue.__len__() > target_queue_list[self.QUEUE_DICT_MAX_LEN_IDX]: - LOGGER.warning(f'Target queue for APID {apid} full. Removing oldest packet..') + if ( + target_queue.__len__() + > target_queue_list[self.QUEUE_DICT_MAX_LEN_IDX] + ): + LOGGER.warning( + f"Target queue for APID {apid} full. Removing oldest packet.." + ) target_queue.pop() target_queue.appendleft(tm_packet) return True diff --git a/src/tmtccmd/tc/packer.py b/src/tmtccmd/tc/packer.py index 8e3bdfa9..0b395222 100644 --- a/src/tmtccmd/tc/packer.py +++ b/src/tmtccmd/tc/packer.py @@ -27,6 +27,7 @@ def pack_service_queue_core(service: int, op_code: str, service_queue: TcQueueT) """ try: from tmtccmd.config.hook import get_global_hook_obj + hook_obj = get_global_hook_obj() hook_obj.pack_service_queue( service=service, op_code=op_code, service_queue=service_queue @@ -43,13 +44,18 @@ def default_single_packet_preparation() -> PusTelecommand: def default_service_queue_preparation( - service: Union[str, int], op_code: str, service_queue: TcQueueT + service: Union[str, int], op_code: str, service_queue: TcQueueT ): from tmtccmd.config.definitions import CoreServiceList, QueueCommands + if service == CoreServiceList.SERVICE_5.value: pack_generic_service5_test_into(service_queue) elif service == CoreServiceList.SERVICE_17.value: - service_queue.appendleft((QueueCommands.PRINT, "Sending ping command PUS TC[17,1]")) - service_queue.appendleft(pack_service_17_ping_command(ssc=1700).pack_command_tuple()) + service_queue.appendleft( + (QueueCommands.PRINT, "Sending ping command PUS TC[17,1]") + ) + service_queue.appendleft( + pack_service_17_ping_command(ssc=1700).pack_command_tuple() + ) else: LOGGER.warning("Invalid Service!") diff --git a/src/tmtccmd/tc/service_200_mode.py b/src/tmtccmd/tc/service_200_mode.py index 0d966498..1a00ea1f 100644 --- a/src/tmtccmd/tc/service_200_mode.py +++ b/src/tmtccmd/tc/service_200_mode.py @@ -6,18 +6,17 @@ class Modes(enum.IntEnum): - OFF = 0, - ON = 1, - NORMAL = 2, + OFF = (0,) + ON = (1,) + NORMAL = (2,) RAW = 3 def pack_mode_data(object_id: bytearray, mode: Modes, submode: int) -> bytearray: - """Mode 0: Off, Mode 1: Mode On, Mode 2: Mode Normal, Mode 3: Mode Raw - """ + """Mode 0: Off, Mode 1: Mode On, Mode 2: Mode Normal, Mode 3: Mode Raw""" # Normal mode mode_packed = struct.pack("!I", mode) # Submode default - submode_byte = struct.pack('B', submode) + submode_byte = struct.pack("B", submode) mode_data = object_id + mode_packed + submode_byte return mode_data diff --git a/src/tmtccmd/tc/service_20_parameter.py b/src/tmtccmd/tc/service_20_parameter.py index 32021b30..e65c560b 100644 --- a/src/tmtccmd/tc/service_20_parameter.py +++ b/src/tmtccmd/tc/service_20_parameter.py @@ -10,8 +10,12 @@ def pack_boolean_parameter_command( - object_id: bytearray, domain_id: int, unique_id: int, parameter: bool, ssc: int, - apid: int = -1 + object_id: bytearray, + domain_id: int, + unique_id: int, + parameter: bool, + ssc: int, + apid: int = -1, ) -> Union[PusTelecommand, None]: """Generic function to pack a telecommand to tweak a boolean parameter :param object_id: @@ -45,12 +49,18 @@ def pack_boolean_parameter_command( data_to_pack.append(rows) data_to_pack.append(columns) data_to_pack.append(parameter) - return PusTelecommand(service=20, subservice=128, ssc=ssc, app_data=data_to_pack, apid=apid) + return PusTelecommand( + service=20, subservice=128, ssc=ssc, app_data=data_to_pack, apid=apid + ) def pack_float_vector_parameter_command( - object_id: bytearray, domain_id: int, unique_id: int, parameter: bytearray, ssc: int, - apid: int = -1 + object_id: bytearray, + domain_id: int, + unique_id: int, + parameter: bytearray, + ssc: int, + apid: int = -1, ): pass @@ -86,6 +96,6 @@ def pack_parameter_id(domain_id: int, unique_id: int, linear_index: int) -> byte parameter_id = bytearray(4) parameter_id[0] = domain_id parameter_id[1] = unique_id - parameter_id[2] = linear_index >> 8 & 0xff - parameter_id[3] = linear_index & 0xff + parameter_id[2] = linear_index >> 8 & 0xFF + parameter_id[3] = linear_index & 0xFF return parameter_id diff --git a/src/tmtccmd/tc/service_3_housekeeping.py b/src/tmtccmd/tc/service_3_housekeeping.py index 65b7a091..23ea534a 100644 --- a/src/tmtccmd/tc/service_3_housekeeping.py +++ b/src/tmtccmd/tc/service_3_housekeeping.py @@ -7,25 +7,25 @@ class Srv3Subservice(enum.IntEnum): - ENABLE_PERIODIC_HK_GEN = 5, - DISABLE_PERIODIC_HK_GEN = 6, - ENABLE_PERIODIC_DIAGNOSTICS_GEN = 7, - DISABLE_PERIODIC_DIAGNOSTICS_GEN = 8, + ENABLE_PERIODIC_HK_GEN = (5,) + DISABLE_PERIODIC_HK_GEN = (6,) + ENABLE_PERIODIC_DIAGNOSTICS_GEN = (7,) + DISABLE_PERIODIC_DIAGNOSTICS_GEN = (8,) - REPORT_HK_REPORT_STRUCTURES = 9, - REPORT_DIAG_REPORT_STRUCTURES = 11, + REPORT_HK_REPORT_STRUCTURES = (9,) + REPORT_DIAG_REPORT_STRUCTURES = (11,) - HK_DEFINITIONS_REPORT = 10, - DIAG_DEFINITION_REPORT = 12, + HK_DEFINITIONS_REPORT = (10,) + DIAG_DEFINITION_REPORT = (12,) - HK_REPORT = 25, - DIAGNOSTICS_REPORT = 26, + HK_REPORT = (25,) + DIAGNOSTICS_REPORT = (26,) - GENERATE_ONE_PARAMETER_REPORT = 27, - GENERATE_ONE_DIAGNOSTICS_REPORT = 28, + GENERATE_ONE_PARAMETER_REPORT = (27,) + GENERATE_ONE_DIAGNOSTICS_REPORT = (28,) - MODIFY_PARAMETER_REPORT_COLLECTION_INTERVAL = 31, - MODIFY_DIAGNOSTICS_REPORT_COLLECTION_INTERVAL = 32, + MODIFY_PARAMETER_REPORT_COLLECTION_INTERVAL = (31,) + MODIFY_DIAGNOSTICS_REPORT_COLLECTION_INTERVAL = (32,) def make_sid(object_id: bytearray, set_id: int) -> bytearray: diff --git a/src/tmtccmd/tc/service_5_event.py b/src/tmtccmd/tc/service_5_event.py index e5d74e2b..41572727 100644 --- a/src/tmtccmd/tc/service_5_event.py +++ b/src/tmtccmd/tc/service_5_event.py @@ -19,7 +19,10 @@ def pack_disable_event_reporting_command(ssc: int, apid: int = -1): if apid == -1: apid = get_default_tc_apid() return PusTelecommand( - service=5, subservice=Srv5Subservices.DISABLE_EVENT_REPORTING, ssc=ssc, apid=apid + service=5, + subservice=Srv5Subservices.DISABLE_EVENT_REPORTING, + ssc=ssc, + apid=apid, ) @@ -44,7 +47,9 @@ def pack_generic_service5_test_into(tc_queue: TcQueueT, apid: int = -1): command = pack_enable_event_reporting_command(ssc=520) tc_queue.appendleft(command.pack_command_tuple()) # trigger event - tc_queue.appendleft((QueueCommands.PRINT, "Testing Service 5: Trigger another event")) + tc_queue.appendleft( + (QueueCommands.PRINT, "Testing Service 5: Trigger another event") + ) command = PusTelecommand(service=17, subservice=128, apid=apid, ssc=530) tc_queue.appendleft(command.pack_command_tuple()) tc_queue.appendleft((QueueCommands.EXPORT_LOG, "log/tmtc_log_service5.txt")) diff --git a/src/tmtccmd/tc/service_8_functional_cmd.py b/src/tmtccmd/tc/service_8_functional_cmd.py index a6a6bae1..01bf4324 100644 --- a/src/tmtccmd/tc/service_8_functional_cmd.py +++ b/src/tmtccmd/tc/service_8_functional_cmd.py @@ -6,22 +6,29 @@ class Srv8Subservices(enum.IntEnum): - FUNC_CMD = 128, + FUNC_CMD = (128,) DATA_REPLY = 130 def generate_action_command( - object_id: bytes, action_id: int, app_data: bytes = bytes(), - ssc: int = 0, apid: int = -1 + object_id: bytes, + action_id: int, + app_data: bytes = bytes(), + ssc: int = 0, + apid: int = -1, ) -> PusTelecommand: if apid == -1: apid = get_default_tc_apid() data_to_pack = bytearray(object_id) data_to_pack += make_action_id(action_id) + app_data return PusTelecommand( - service=8, subservice=Srv8Subservices.FUNC_CMD, ssc=ssc, app_data=data_to_pack, apid=apid + service=8, + subservice=Srv8Subservices.FUNC_CMD, + ssc=ssc, + app_data=data_to_pack, + apid=apid, ) def make_action_id(action_id: int) -> bytearray: - return bytearray(struct.pack('!I', action_id)) + return bytearray(struct.pack("!I", action_id)) diff --git a/src/tmtccmd/tm/base.py b/src/tmtccmd/tm/base.py index 1de22cac..4bb8f1b5 100644 --- a/src/tmtccmd/tm/base.py +++ b/src/tmtccmd/tm/base.py @@ -7,7 +7,6 @@ class PusTmInterface: - @abstractmethod def pack(self) -> bytearray: raise NotImplementedError @@ -46,15 +45,15 @@ def subservice(self) -> int: class PusTmInfoInterface: @abstractmethod def get_print_info(self) -> str: - return '' + return "" @abstractmethod def get_custom_printout(self) -> str: - return '' + return "" @abstractmethod def get_source_data_string(self) -> str: - return '' + return "" @abstractmethod def set_packet_info(self, print_info: str): @@ -108,8 +107,8 @@ def subservice(self) -> int: class PusTmInfoBase(PusTmInfoInterface): def __init__(self, pus_tm: PusTelemetry): self.pus_tm = pus_tm - self._custom_printout = '' - self._print_info = '' + self._custom_printout = "" + self._print_info = "" def get_print_info(self) -> str: return self._print_info @@ -120,7 +119,9 @@ def get_custom_printout(self) -> str: def set_custom_printout(self, custom_string: str): self._custom_printout = custom_string - def get_source_data_string(self, print_format: PrintFormats = PrintFormats.HEX) -> str: + def get_source_data_string( + self, print_format: PrintFormats = PrintFormats.HEX + ) -> str: return self.pus_tm.get_source_data_string(print_format=print_format) def set_packet_info(self, print_info: str): @@ -137,13 +138,17 @@ def append_telemetry_content(self, content_list: list): :param content_list: Header content will be appended to this list :return: """ - content_list.append(f'{self.pus_tm.service}') - content_list.append(f'{self.pus_tm.subservice}') - content_list.append(f'{self.pus_tm.secondary_packet_header.message_counter}') - content_list.append(f'{self.pus_tm.secondary_packet_header.time.return_unix_seconds()}') - content_list.append(f'{self.pus_tm.secondary_packet_header.time.return_time_string()}') - content_list.append(f'0x{self.pus_tm.space_packet_header.apid:02x}') - content_list.append(f'{self.pus_tm.space_packet_header.ssc}') + content_list.append(f"{self.pus_tm.service}") + content_list.append(f"{self.pus_tm.subservice}") + content_list.append(f"{self.pus_tm.secondary_packet_header.message_counter}") + content_list.append( + f"{self.pus_tm.secondary_packet_header.time.return_unix_seconds()}" + ) + content_list.append( + f"{self.pus_tm.secondary_packet_header.time.return_time_string()}" + ) + content_list.append(f"0x{self.pus_tm.space_packet_header.apid:02x}") + content_list.append(f"{self.pus_tm.space_packet_header.ssc}") if self.pus_tm.valid: content_list.append("Yes") else: diff --git a/src/tmtccmd/tm/handler.py b/src/tmtccmd/tm/handler.py index 443a50e8..b57814f9 100644 --- a/src/tmtccmd/tm/handler.py +++ b/src/tmtccmd/tm/handler.py @@ -17,7 +17,9 @@ def get_type(self): return self._tm_type -def default_ccsds_packet_handler(apid: int, raw_tm_packet: bytearray, tmtc_printer: TmTcPrinter): +def default_ccsds_packet_handler( + apid: int, raw_tm_packet: bytearray, tmtc_printer: TmTcPrinter +): """Default implementation only prints the packet""" default_factory_hook(raw_tm_packet=raw_tm_packet, tmtc_printer=tmtc_printer) @@ -32,6 +34,8 @@ def default_factory_hook(raw_tm_packet: bytearray, tmtc_printer: TmTcPrinter): if service_type == 17: tm_packet = Service17TMExtended.unpack(raw_telemetry=raw_tm_packet) if tm_packet is None: - LOGGER.info(f'The service {service_type} is not implemented in Telemetry Factory') + LOGGER.info( + f"The service {service_type} is not implemented in Telemetry Factory" + ) tm_packet = PusTelemetry.unpack(raw_telemetry=raw_tm_packet) tmtc_printer.print_telemetry(packet_if=tm_packet, info_if=tm_packet) diff --git a/src/tmtccmd/tm/service_200_mode.py b/src/tmtccmd/tm/service_200_mode.py index 41da6e7d..86a734ea 100644 --- a/src/tmtccmd/tm/service_200_mode.py +++ b/src/tmtccmd/tm/service_200_mode.py @@ -10,20 +10,29 @@ class Service200TM(PusTmBase, PusTmInfoBase): def __init__( - self, subservice_id: int, object_id: bytearray, - return_value: int = 0, mode: int = 0, submode: int = 0, - time: CdsShortTimestamp = None, ssc: int = 0, source_data: bytearray = bytearray([]), - apid: int = -1, packet_version: int = 0b000, - pus_version: PusVersion = PusVersion.GLOBAL_CONFIG, pus_tm_version: int = 0b0001, - secondary_header_flag: bool = True, - space_time_ref: int = 0b0000, destination_id: int = 0 + self, + subservice_id: int, + object_id: bytearray, + return_value: int = 0, + mode: int = 0, + submode: int = 0, + time: CdsShortTimestamp = None, + ssc: int = 0, + source_data: bytearray = bytearray([]), + apid: int = -1, + packet_version: int = 0b000, + pus_version: PusVersion = PusVersion.GLOBAL_CONFIG, + pus_tm_version: int = 0b0001, + secondary_header_flag: bool = True, + space_time_ref: int = 0b0000, + destination_id: int = 0, ): source_data = bytearray() source_data.extend(object_id) if subservice_id == 7: - source_data.extend(struct.pack('!H', return_value)) + source_data.extend(struct.pack("!H", return_value)) elif subservice_id == 6 or subservice_id == 8: - source_data.extend(struct.pack('!I', mode)) + source_data.extend(struct.pack("!I", mode)) source_data.append(submode) pus_tm = PusTelemetry( service=CustomPusServices.SERVICE_200_MODE, @@ -36,7 +45,7 @@ def __init__( pus_version=pus_version, secondary_header_flag=secondary_header_flag, space_time_ref=space_time_ref, - destination_id=destination_id + destination_id=destination_id, ) PusTmBase.__init__(self, pus_tm=pus_tm) PusTmInfoBase.__init__(self, pus_tm=pus_tm) @@ -58,24 +67,24 @@ def __init_without_base(instance: Service200TM): instance.append_packet_info(": Can't reach mode") instance.is_cant_reach_mode_reply = True instance.return_value = tm_data[4] << 8 | tm_data[5] - elif instance.subservice == 6 or instance.subservice== 8: + elif instance.subservice == 6 or instance.subservice == 8: instance.is_mode_reply = True if instance.subservice == 8: instance.append_packet_info(": Wrong Mode") elif instance.subservice == 6: instance.append_packet_info(": Mode reached") - instance.mode = struct.unpack('!I', tm_data[4:8])[0] + instance.mode = struct.unpack("!I", tm_data[4:8])[0] instance.submode = tm_data[8] @classmethod def __empty(cls) -> Service200TM: - return cls( - subservice_id=0, object_id=bytearray(4) - ) + return cls(subservice_id=0, object_id=bytearray(4)) @classmethod def unpack( - cls, raw_telemetry: bytearray, pus_version: PusVersion = PusVersion.GLOBAL_CONFIG + cls, + raw_telemetry: bytearray, + pus_version: PusVersion = PusVersion.GLOBAL_CONFIG, ) -> Service200TM: service_200_tm = cls.__empty() service_200_tm.pus_tm = PusTelemetry.unpack( @@ -86,8 +95,8 @@ def unpack( def append_telemetry_content(self, content_list: list): super().append_telemetry_content(content_list=content_list) - object_id_num = struct.unpack('!I', self.object_id)[0] - content_list.append(f'0x{object_id_num:08x}') + object_id_num = struct.unpack("!I", self.object_id)[0] + content_list.append(f"0x{object_id_num:08x}") if self.is_cant_reach_mode_reply: content_list.append(hex(self.return_value)) elif self.is_mode_reply: diff --git a/src/tmtccmd/tm/service_20_parameters.py b/src/tmtccmd/tm/service_20_parameters.py index 73706208..e16b107b 100644 --- a/src/tmtccmd/tm/service_20_parameters.py +++ b/src/tmtccmd/tm/service_20_parameters.py @@ -14,26 +14,35 @@ class ParamStruct: def __init__(self): - self.param_id = 0, - self.domain_id = 0, - self.unique_id = 0, - self.linear_index = 0, + self.param_id = (0,) + self.domain_id = (0,) + self.unique_id = (0,) + self.linear_index = (0,) self.type_ptc = 0 self.type_pfc = 0 - self.column = 0, - self.row = 0, + self.column = (0,) + self.row = (0,) self.param: any = 0 class Service20TM(PusTmInfoBase, PusTmBase): def __init__( - self, subservice_id: int, object_id: bytearray, param_id: bytearray, - domain_id: int, unique_id: int, linear_index: int, - time: CdsShortTimestamp = None, ssc: int = 0, - source_data: bytearray = bytearray([]), apid: int = -1, packet_version: int = 0b000, - pus_version: PusVersion = PusVersion.GLOBAL_CONFIG, - secondary_header_flag: bool = True, space_time_ref: int = 0b0000, - destination_id: int = 0 + self, + subservice_id: int, + object_id: bytearray, + param_id: bytearray, + domain_id: int, + unique_id: int, + linear_index: int, + time: CdsShortTimestamp = None, + ssc: int = 0, + source_data: bytearray = bytearray([]), + apid: int = -1, + packet_version: int = 0b000, + pus_version: PusVersion = PusVersion.GLOBAL_CONFIG, + secondary_header_flag: bool = True, + space_time_ref: int = 0b0000, + destination_id: int = 0, ): pus_tm = PusTelemetry( service=PusServices.SERVICE_20_PARAMETER, @@ -46,7 +55,7 @@ def __init__( pus_version=pus_version, secondary_header_flag=secondary_header_flag, space_time_ref=space_time_ref, - destination_id=destination_id + destination_id=destination_id, ) self.object_id = ObjectId.from_bytes(obj_id_as_bytes=object_id) @@ -67,7 +76,7 @@ def __init_without_base(instance: Service20TM): return data_size = len(tm_data) instance.object_id = ObjectId.from_bytes(obj_id_as_bytes=tm_data[0:4]) - instance.param_struct.param_id = struct.unpack('!I', tm_data[4:8])[0] + instance.param_struct.param_id = struct.unpack("!I", tm_data[4:8])[0] instance.param_struct.domain_id = tm_data[4] instance.param_struct.unique_id = tm_data[5] instance.param_struct.linear_index = tm_data[6] << 8 | tm_data[7] @@ -80,12 +89,21 @@ def __init_without_base(instance: Service20TM): instance.param_struct.column = tm_data[10] instance.param_struct.row = tm_data[11] if data_size > 12: - if instance.param_struct.type_ptc == 3 and instance.param_struct.type_pfc == 14: - instance.param_struct.param = struct.unpack('!I', tm_data[12:16])[0] - if instance.param_struct.type_ptc == 4 and instance.param_struct.type_pfc == 14: - instance.param_struct.param = struct.unpack('!i', tm_data[12:16])[0] - if instance.param_struct.type_ptc == 5 and instance.param_struct.type_pfc == 1: - instance.param_struct.param = struct.unpack('!f', tm_data[12:16])[0] + if ( + instance.param_struct.type_ptc == 3 + and instance.param_struct.type_pfc == 14 + ): + instance.param_struct.param = struct.unpack("!I", tm_data[12:16])[0] + if ( + instance.param_struct.type_ptc == 4 + and instance.param_struct.type_pfc == 14 + ): + instance.param_struct.param = struct.unpack("!i", tm_data[12:16])[0] + if ( + instance.param_struct.type_ptc == 5 + and instance.param_struct.type_pfc == 1 + ): + instance.param_struct.param = struct.unpack("!f", tm_data[12:16])[0] else: LOGGER.info( "Error when receiving Pus Service 20 TM: subservice is not 130" @@ -99,12 +117,14 @@ def __empty(cls) -> Service20TM: param_id=bytearray(), domain_id=0, unique_id=0, - linear_index=0 + linear_index=0, ) @classmethod def unpack( - cls, raw_telemetry: bytearray, pus_version: PusVersion = PusVersion.GLOBAL_CONFIG + cls, + raw_telemetry: bytearray, + pus_version: PusVersion = PusVersion.GLOBAL_CONFIG, ) -> Service20TM: service_20_tm = cls.__empty() service_20_tm.pus_tm = PusTelemetry.unpack( @@ -113,7 +133,9 @@ def unpack( if len(service_20_tm.pus_tm.tm_data) < 4: LOGGER.warning("Invalid data length, less than 4") elif len(service_20_tm.pus_tm.tm_data) < 8: - LOGGER.warning("Invalid data length, less than 8 (Object ID and Parameter ID)") + LOGGER.warning( + "Invalid data length, less than 8 (Object ID and Parameter ID)" + ) service_20_tm.__init_without_base(instance=service_20_tm) return service_20_tm diff --git a/src/tmtccmd/tm/service_23_file_mgmt.py b/src/tmtccmd/tm/service_23_file_mgmt.py index 51d34b4f..cf8e8bb0 100644 --- a/src/tmtccmd/tm/service_23_file_mgmt.py +++ b/src/tmtccmd/tm/service_23_file_mgmt.py @@ -12,7 +12,11 @@ class FileInfo: def __init__( - self, file_name: str, repo_path: str, file_size: int = 0, lock_status: bool = False + self, + file_name: str, + repo_path: str, + file_size: int = 0, + lock_status: bool = False, ): self.file_name = file_name self.repo_path = repo_path @@ -25,13 +29,22 @@ class Service23TM(PusTmInfoBase, PusTmBase): MAX_FILENAME_LENGTH = 12 def __init__( - self, subservice_id: int, - object_id: bytearray, repo_path: str, file_name: str, - time: CdsShortTimestamp = None, ssc: int = 0, - source_data: bytearray = bytearray([]), apid: int = -1, packet_version: int = 0b000, - pus_version: PusVersion = PusVersion.GLOBAL_CONFIG, pus_tm_version: int = 0b0001, - ack: int = 0b1111, secondary_header_flag: bool = True, space_time_ref: int = 0b0000, - destination_id: int = 0 + self, + subservice_id: int, + object_id: bytearray, + repo_path: str, + file_name: str, + time: CdsShortTimestamp = None, + ssc: int = 0, + source_data: bytearray = bytearray([]), + apid: int = -1, + packet_version: int = 0b000, + pus_version: PusVersion = PusVersion.GLOBAL_CONFIG, + pus_tm_version: int = 0b0001, + ack: int = 0b1111, + secondary_header_flag: bool = True, + space_time_ref: int = 0b0000, + destination_id: int = 0, ): self.object_id = object_id self.data_start_idx = 0 @@ -49,7 +62,7 @@ def __init__( ack=ack, secondary_header_flag=secondary_header_flag, space_time_ref=space_time_ref, - destination_id=destination_id + destination_id=destination_id, ) PusTmBase.__init__(self, pus_tm=pus_tm) PusTmInfoBase.__init__(self, pus_tm=pus_tm) @@ -62,7 +75,7 @@ def __init_without_base(instance: Service23TM): if len(tm_data) < 4: LOGGER.error("Service23TM: Invalid packet format!") return - instance.object_id = struct.unpack('!I', tm_data[0:4])[0] + instance.object_id = struct.unpack("!I", tm_data[0:4])[0] instance.file_info.file_size = 0 instance.file_info.lock_status = False instance.data_start_idx = 0 @@ -74,13 +87,13 @@ def __init_without_base(instance: Service23TM): @classmethod def __empty(cls) -> Service23TM: - return cls( - subservice_id=-1, object_id=bytearray(4), repo_path="", file_name="" - ) + return cls(subservice_id=-1, object_id=bytearray(4), repo_path="", file_name="") @classmethod def unpack( - cls, raw_telemetry: bytearray, pus_version: PusVersion = PusVersion.GLOBAL_CONFIG + cls, + raw_telemetry: bytearray, + pus_version: PusVersion = PusVersion.GLOBAL_CONFIG, ) -> Service23TM: service_23_tm = cls.__empty() service_23_tm.pus_tm = PusTelemetry.unpack( @@ -97,14 +110,14 @@ def unpack_repo_and_filename(self): for idx in range(4, max_len_to_scan): if not repo_path_found and tm_data[idx] == 0: repo_bytes = tm_data[4:idx] - self.file_info.repo_path = repo_bytes.decode('utf-8') + self.file_info.repo_path = repo_bytes.decode("utf-8") path_idx_start = idx + 1 idx += 1 repo_path_found = True if repo_path_found: if tm_data[idx] == 0: filename_bytes = tm_data[path_idx_start:idx] - self.file_info.file_name = filename_bytes.decode('utf-8') + self.file_info.file_name = filename_bytes.decode("utf-8") self.data_start_idx = idx + 1 break @@ -115,7 +128,8 @@ def unpack_file_attributes(self): LOGGER.error("Service23TM: Invalid lenght of file attributes data") return self.file_info.file_size = struct.unpack( - '!I', self.get_tm_data()[self.data_start_idx: self.data_start_idx + 4])[0] + "!I", self.get_tm_data()[self.data_start_idx : self.data_start_idx + 4] + )[0] self.file_info.lock_status = self.get_tm_data()[self.data_start_idx + 4] def append_telemetry_content(self, content_list: list): diff --git a/src/tmtccmd/tm/service_2_raw_cmd.py b/src/tmtccmd/tm/service_2_raw_cmd.py index b869442b..821da42e 100644 --- a/src/tmtccmd/tm/service_2_raw_cmd.py +++ b/src/tmtccmd/tm/service_2_raw_cmd.py @@ -8,10 +8,17 @@ class Service2TM(PusTmInfoBase, PusTmBase): def __init__( - self, subservice: int, time: CdsShortTimestamp = None, ssc: int = 0, - source_data: bytearray = bytearray([]), apid: int = -1, packet_version: int = 0b000, - pus_version: PusVersion = PusVersion.GLOBAL_CONFIG, secondary_header_flag: bool = True, - space_time_ref: int = 0b0000, destination_id: int = 0 + self, + subservice: int, + time: CdsShortTimestamp = None, + ssc: int = 0, + source_data: bytearray = bytearray([]), + apid: int = -1, + packet_version: int = 0b000, + pus_version: PusVersion = PusVersion.GLOBAL_CONFIG, + secondary_header_flag: bool = True, + space_time_ref: int = 0b0000, + destination_id: int = 0, ): pus_tm = PusTelemetry( service=2, @@ -24,7 +31,7 @@ def __init__( pus_version=pus_version, secondary_header_flag=secondary_header_flag, space_time_ref=space_time_ref, - destination_id=destination_id + destination_id=destination_id, ) PusTmInfoBase.__init__(self, pus_tm=pus_tm) PusTmBase.__init__(self, pus_tm=pus_tm) @@ -32,13 +39,13 @@ def __init__( @classmethod def __empty(cls) -> Service2TM: - return cls( - subservice=0 - ) + return cls(subservice=0) @classmethod def unpack( - cls, raw_telemetry: bytearray, pus_version: PusVersion = PusVersion.GLOBAL_CONFIG + cls, + raw_telemetry: bytearray, + pus_version: PusVersion = PusVersion.GLOBAL_CONFIG, ) -> Service2TM: service_2_tm = cls.__empty() service_2_tm.pus_tm = PusTelemetry.unpack( diff --git a/src/tmtccmd/tm/service_3_base.py b/src/tmtccmd/tm/service_3_base.py index 434fc167..223f9d36 100644 --- a/src/tmtccmd/tm/service_3_base.py +++ b/src/tmtccmd/tm/service_3_base.py @@ -17,6 +17,7 @@ class Service3Base: if a custom class is defined, the user should implement this class and fill the fields in the TM handling hook if printout of the HK field and validity checking is desired. """ + def __init__(self, object_id: int, custom_hk_handling: bool = False): self._object_id = ObjectId(object_id=object_id) self._set_id = 0 diff --git a/src/tmtccmd/tm/service_3_housekeeping.py b/src/tmtccmd/tm/service_3_housekeeping.py index ad626c54..c6e07ce7 100644 --- a/src/tmtccmd/tm/service_3_housekeeping.py +++ b/src/tmtccmd/tm/service_3_housekeeping.py @@ -21,6 +21,7 @@ class Service3TM(Service3Base, PusTmBase, PusTmInfoBase): based on the Flight Software Framework (FSFW). A custom class can be defined, but should then implement Service3Base. """ + # Minimal packet contains SID, which consists of object ID(4) and set ID(4) DEFAULT_MINIMAL_PACKET_SIZE = 8 # Minimal structure report contains SID (8), reporting status(1), validity flag (1), @@ -28,13 +29,21 @@ class Service3TM(Service3Base, PusTmBase, PusTmInfoBase): STRUCTURE_REPORT_FIXED_HEADER_SIZE = DEFAULT_MINIMAL_PACKET_SIZE + 7 def __init__( - self, subservice_id: int, time: CdsShortTimestamp, hk_data: bytearray, - custom_hk_handling: bool = False, ssc: int = 0, apid: int = -1, - minimum_reply_size: int = DEFAULT_MINIMAL_PACKET_SIZE, - minimum_structure_report_header_size: int = STRUCTURE_REPORT_FIXED_HEADER_SIZE, - packet_version: int = 0b000, pus_version: PusVersion = PusVersion.GLOBAL_CONFIG, - pus_tm_version: int = 0b0001, secondary_header_flag: bool = True, - space_time_ref: int = 0b0000, destination_id: int = 0 + self, + subservice_id: int, + time: CdsShortTimestamp, + hk_data: bytearray, + custom_hk_handling: bool = False, + ssc: int = 0, + apid: int = -1, + minimum_reply_size: int = DEFAULT_MINIMAL_PACKET_SIZE, + minimum_structure_report_header_size: int = STRUCTURE_REPORT_FIXED_HEADER_SIZE, + packet_version: int = 0b000, + pus_version: PusVersion = PusVersion.GLOBAL_CONFIG, + pus_tm_version: int = 0b0001, + secondary_header_flag: bool = True, + space_time_ref: int = 0b0000, + destination_id: int = 0, ): """Service 3 packet class representation which can be built from a raw bytearray :param subservice_id: @@ -47,8 +56,8 @@ def __init__( """ Service3Base.__init__(self, object_id=0, custom_hk_handling=custom_hk_handling) source_data = bytearray() - source_data.extend(struct.pack('!I', self.object_id.id)) - source_data.extend(struct.pack('!I', self.set_id)) + source_data.extend(struct.pack("!I", self.object_id.id)) + source_data.extend(struct.pack("!I", self.set_id)) if subservice_id == 25 or subservice_id == 26: source_data.extend(hk_data) pus_tm = PusTelemetry( @@ -62,37 +71,39 @@ def __init__( pus_version=pus_version, secondary_header_flag=secondary_header_flag, space_time_ref=space_time_ref, - destination_id=destination_id + destination_id=destination_id, ) PusTmBase.__init__(self, pus_tm=pus_tm) PusTmInfoBase.__init__(self, pus_tm=pus_tm) self.__init_without_base( - instance=self, custom_hk_handling=custom_hk_handling, + instance=self, + custom_hk_handling=custom_hk_handling, minimum_reply_size=minimum_reply_size, minimum_structure_report_header_size=minimum_structure_report_header_size, - check_tm_data_size=False + check_tm_data_size=False, ) @staticmethod def __init_without_base( - instance: Service3TM, custom_hk_handling: bool, - check_tm_data_size: bool, - minimum_reply_size: int = DEFAULT_MINIMAL_PACKET_SIZE, - minimum_structure_report_header_size: int = STRUCTURE_REPORT_FIXED_HEADER_SIZE + instance: Service3TM, + custom_hk_handling: bool, + check_tm_data_size: bool, + minimum_reply_size: int = DEFAULT_MINIMAL_PACKET_SIZE, + minimum_structure_report_header_size: int = STRUCTURE_REPORT_FIXED_HEADER_SIZE, ): - instance.custom_hk_handling=custom_hk_handling + instance.custom_hk_handling = custom_hk_handling if instance.custom_hk_handling: return tm_data = instance.tm_data if len(tm_data) < 8: LOGGER.warning( - f'Invalid Service 3 packet, is too short. Detected TM data length: {len(tm_data)}' + f"Invalid Service 3 packet, is too short. Detected TM data length: {len(tm_data)}" ) raise ValueError instance.min_hk_reply_size = minimum_reply_size instance.hk_structure_report_header_size = minimum_structure_report_header_size instance.object_id.id = tm_data[0:4] - instanceset_id = struct.unpack('!I', tm_data[4:8])[0] + instanceset_id = struct.unpack("!I", tm_data[4:8])[0] if instance.subservice == 25 or instance.subservice == 26: if len(tm_data) > 8: instance._param_length = len(tm_data[8:]) @@ -103,21 +114,24 @@ def __empty(cls) -> Service3TM: return cls( subservice_id=-1, time=CdsShortTimestamp.init_from_current_time(), - hk_data=bytearray() + hk_data=bytearray(), ) @classmethod def unpack( - cls, raw_telemetry: bytearray, custom_hk_handling: bool, - pus_version: PusVersion = PusVersion.GLOBAL_CONFIG, + cls, + raw_telemetry: bytearray, + custom_hk_handling: bool, + pus_version: PusVersion = PusVersion.GLOBAL_CONFIG, ) -> Service3TM: service_3_tm = cls.__empty() service_3_tm.pus_tm = PusTelemetry.unpack( raw_telemetry=raw_telemetry, pus_version=pus_version ) service_3_tm.__init_without_base( - instance=service_3_tm, custom_hk_handling=custom_hk_handling, - check_tm_data_size=True + instance=service_3_tm, + custom_hk_handling=custom_hk_handling, + check_tm_data_size=True, ) return service_3_tm @@ -139,34 +153,39 @@ def get_hk_definitions_list(self) -> Tuple[List, List]: tm_data = self.tm_data if len(tm_data) < self.hk_structure_report_header_size: LOGGER.warning( - f'Service3TM: handle_filling_definition_arrays: Invalid structure report ' - f'from {self.object_id.as_string}, is shorter ' - f'than {self.hk_structure_report_header_size}' + f"Service3TM: handle_filling_definition_arrays: Invalid structure report " + f"from {self.object_id.as_string}, is shorter " + f"than {self.hk_structure_report_header_size}" ) return [], [] definitions_header = [ - "Object ID", "Set ID", "Report Status", "Is valid", "Collection Interval (s)", - "Number Of IDs" + "Object ID", + "Set ID", + "Report Status", + "Is valid", + "Collection Interval (s)", + "Number Of IDs", ] reporting_enabled = tm_data[8] set_valid = tm_data[9] - collection_interval_seconds = struct.unpack('!f', tm_data[10:14])[0] / 1000.0 + collection_interval_seconds = struct.unpack("!f", tm_data[10:14])[0] / 1000.0 num_params = tm_data[14] if len(tm_data) < self.hk_structure_report_header_size + num_params * 4: LOGGER.warning( - f'Service3TM: handle_filling_definition_arrays: Invalid structure report ' - f'from {self.object_id.as_string}, is shorter than ' - f'{self.hk_structure_report_header_size + num_params * 4}' + f"Service3TM: handle_filling_definition_arrays: Invalid structure report " + f"from {self.object_id.as_string}, is shorter than " + f"{self.hk_structure_report_header_size + num_params * 4}" ) return [], [] parameters = [] counter = 1 for array_index in range( - self.hk_structure_report_header_size, - self.hk_structure_report_header_size + 4 * num_params, 4 + self.hk_structure_report_header_size, + self.hk_structure_report_header_size + 4 * num_params, + 4, ): - parameter = struct.unpack('!I', tm_data[array_index:array_index + 4])[0] + parameter = struct.unpack("!I", tm_data[array_index : array_index + 4])[0] definitions_header.append("Pool ID " + str(counter)) parameters.append(str(hex(parameter))) counter = counter + 1 @@ -179,8 +198,12 @@ def get_hk_definitions_list(self) -> Tuple[List, List]: else: valid_string = "No" definitions_content = [ - self.object_id.as_string, self._set_id, status_string, valid_string, - collection_interval_seconds, num_params + self.object_id.as_string, + self._set_id, + status_string, + valid_string, + collection_interval_seconds, + num_params, ] definitions_content.extend(parameters) return definitions_header, definitions_content diff --git a/src/tmtccmd/tm/service_5_event.py b/src/tmtccmd/tm/service_5_event.py index 49d841cd..af9868b5 100644 --- a/src/tmtccmd/tm/service_5_event.py +++ b/src/tmtccmd/tm/service_5_event.py @@ -18,12 +18,20 @@ class Service5TM(PusTmBase, PusTmInfoBase): def __init__( - self, subservice: Srv5Subservices, event_id: int, object_id: bytearray, - param_1: int, param_2: int, time: CdsShortTimestamp = None, - ssc: int = 0, apid: int = -1, packet_version: int = 0b000, - pus_version: PusVersion = PusVersion.GLOBAL_CONFIG, - secondary_header_flag: bool = True, space_time_ref: int = 0b0000, - destination_id: int = 0 + self, + subservice: Srv5Subservices, + event_id: int, + object_id: bytearray, + param_1: int, + param_2: int, + time: CdsShortTimestamp = None, + ssc: int = 0, + apid: int = -1, + packet_version: int = 0b000, + pus_version: PusVersion = PusVersion.GLOBAL_CONFIG, + secondary_header_flag: bool = True, + space_time_ref: int = 0b0000, + destination_id: int = 0, ): """Create a Service 5 telemetry instance. Use the unpack function to create an instance from a raw bytestream instead. @@ -37,13 +45,13 @@ def __init__( self._param_1 = param_1 self._param_2 = param_2 source_data = bytearray() - source_data.extend(struct.pack('!H', self._event_id)) + source_data.extend(struct.pack("!H", self._event_id)) if len(object_id) != 4: - LOGGER.warning('Object ID must be a bytrarray with length 4') + LOGGER.warning("Object ID must be a bytrarray with length 4") raise ValueError source_data.extend(object_id) - source_data.extend(struct.pack('!I', self._param_1)) - source_data.extend(struct.pack('!I', self._param_2)) + source_data.extend(struct.pack("!I", self._param_1)) + source_data.extend(struct.pack("!I", self._param_2)) pus_tm = PusTelemetry( service=PusServices.SERVICE_5_EVENT, subservice=subservice, @@ -55,7 +63,7 @@ def __init__( pus_version=pus_version, secondary_header_flag=secondary_header_flag, space_time_ref=space_time_ref, - destination_id=destination_id + destination_id=destination_id, ) PusTmBase.__init__(self, pus_tm=pus_tm) PusTmInfoBase.__init__(self, pus_tm=pus_tm) @@ -68,12 +76,14 @@ def __empty(cls) -> Service5TM: event_id=0, object_id=bytearray(4), param_1=0, - param_2=0 + param_2=0, ) @classmethod def unpack( - cls, raw_telemetry: bytearray, pus_version: PusVersion = PusVersion.GLOBAL_CONFIG + cls, + raw_telemetry: bytearray, + pus_version: PusVersion = PusVersion.GLOBAL_CONFIG, ) -> Service5TM: service_5_tm = cls.__empty() service_5_tm.pus_tm = PusTelemetry.unpack( @@ -133,10 +143,12 @@ def __init_without_base(instance: Service5TM, set_attrs_from_tm_data: bool = Fal instance.append_packet_info(" Error High Severity") tm_data = instance.tm_data if len(tm_data) < 14: - LOGGER.warning(f'Length of TM data field {len(tm_data)} shorter than expected 14 bytes') + LOGGER.warning( + f"Length of TM data field {len(tm_data)} shorter than expected 14 bytes" + ) raise ValueError if set_attrs_from_tm_data: - instance._event_id = struct.unpack('>H', tm_data[0:2])[0] + instance._event_id = struct.unpack(">H", tm_data[0:2])[0] instance._object_id.set_from_bytes(tm_data[2:6]) - instance._param_1 = struct.unpack('>I', tm_data[6:10])[0] - instance._param_2 = struct.unpack('>I', tm_data[10:14])[0] + instance._param_1 = struct.unpack(">I", tm_data[6:10])[0] + instance._param_2 = struct.unpack(">I", tm_data[10:14])[0] diff --git a/src/tmtccmd/tm/service_8_functional_cmd.py b/src/tmtccmd/tm/service_8_functional_cmd.py index 0ce8df1b..49494b91 100644 --- a/src/tmtccmd/tm/service_8_functional_cmd.py +++ b/src/tmtccmd/tm/service_8_functional_cmd.py @@ -13,12 +13,22 @@ class Service8TM(PusTmBase, PusTmInfoBase): def __init__( - self, subservice_id: int, object_id: bytearray, action_id: int, - custom_data: bytearray, time: CdsShortTimestamp = None, ssc: int = 0, - source_data: bytearray = bytearray([]), apid: int = -1, packet_version: int = 0b000, - pus_version: PusVersion = PusVersion.GLOBAL_CONFIG, pus_tm_version: int = 0b0001, - ack: int = 0b1111, secondary_header_flag: bool = True, space_time_ref: int = 0b0000, - destination_id: int = 0 + self, + subservice_id: int, + object_id: bytearray, + action_id: int, + custom_data: bytearray, + time: CdsShortTimestamp = None, + ssc: int = 0, + source_data: bytearray = bytearray([]), + apid: int = -1, + packet_version: int = 0b000, + pus_version: PusVersion = PusVersion.GLOBAL_CONFIG, + pus_tm_version: int = 0b0001, + ack: int = 0b1111, + secondary_header_flag: bool = True, + space_time_ref: int = 0b0000, + destination_id: int = 0, ): """This class can be used to deserialize service 8 packets. :param raw_telemetry: Raw bytearray which will be deserialized @@ -30,7 +40,7 @@ def __init__( self._custom_data = custom_data source_data = bytearray() source_data.extend(object_id) - source_data.extend(struct.pack('!I', self._action_id)) + source_data.extend(struct.pack("!I", self._action_id)) source_data.extend(self._custom_data) pus_tm = PusTelemetry( service_id=5, @@ -45,7 +55,7 @@ def __init__( ack=ack, secondary_header_flag=secondary_header_flag, space_time_ref=space_time_ref, - destination_id=destination_id + destination_id=destination_id, ) PusTmBase.__init__(self, pus_tm=pus_tm) PusTmInfoBase.__init__(self, pus_tm=pus_tm) @@ -56,11 +66,13 @@ def __init_without_base(instance: Service8TM): if instance.get_subservice() == 130: tm_data = instance.get_tm_data() if len(tm_data) < 8: - LOGGER.warning(f'Length of Service 8 TM data field {len(tm_data)} short than 8') + LOGGER.warning( + f"Length of Service 8 TM data field {len(tm_data)} short than 8" + ) raise ValueError instance.specify_packet_info("Functional Data Reply") instance._object_id = ObjectId.from_bytes(obj_id_as_bytes=tm_data[0:4]) - instance._action_id = struct.unpack('!I', tm_data[4:8])[0] + instance._action_id = struct.unpack("!I", tm_data[4:8])[0] instance._custom_data = tm_data[8:] else: instance.specify_packet_info("Unknown functional commanding reply") @@ -68,11 +80,18 @@ def __init_without_base(instance: Service8TM): @classmethod def __empty(cls) -> Service8TM: return cls( - subservice_id=-1, object_id=bytearray(4), action_id=0, custom_data=bytearray() + subservice_id=-1, + object_id=bytearray(4), + action_id=0, + custom_data=bytearray(), ) @classmethod - def unpack(cls, raw_telemetry: bytearray, pus_version: PusVersion = PusVersion.GLOBAL_CONFIG): + def unpack( + cls, + raw_telemetry: bytearray, + pus_version: PusVersion = PusVersion.GLOBAL_CONFIG, + ): service_8_tm = cls.__empty() service_8_tm.pus_tm = PusTelemetry.unpack( raw_telemetry=raw_telemetry, pus_version=pus_version diff --git a/src/tmtccmd/utility/conf_util.py b/src/tmtccmd/utility/conf_util.py index 275d9fea..4353328d 100644 --- a/src/tmtccmd/utility/conf_util.py +++ b/src/tmtccmd/utility/conf_util.py @@ -21,7 +21,7 @@ class AnsiColors: def check_args_in_dict( - param: any, iterable: Union[collections.abc.Iterable, dict], warning_hint: str + param: any, iterable: Union[collections.abc.Iterable, dict], warning_hint: str ) -> Tuple[bool, int]: """This functions checks whether the integer representation of a given parameter in contained within the passed collections, for example an (integer) enumeration. @@ -54,15 +54,19 @@ def check_args_in_dict( return True, idx else: res_tuple = __handle_iterable_non_dict( - param=param, iterable=iterable, might_be_integer=might_be_integer, - init_res_tuple=res_tuple + param=param, + iterable=iterable, + might_be_integer=might_be_integer, + init_res_tuple=res_tuple, ) return res_tuple def __handle_iterable_non_dict( - param: any, iterable: collections.abc.Iterable, might_be_integer: bool, - init_res_tuple: Tuple[bool, any] + param: any, + iterable: collections.abc.Iterable, + might_be_integer: bool, + init_res_tuple: Tuple[bool, any], ) -> (bool, any): param_list = list() for idx, enum_value in enumerate(iterable): @@ -87,8 +91,10 @@ def print_core_globals(): service_param = get_global(CoreGlobalIds.CURRENT_SERVICE) mode_param = get_global(CoreGlobalIds.MODE) com_if_param = get_global(CoreGlobalIds.COM_IF) - print(f"Current globals | Mode(-m): {mode_param} | Service(-s): {service_param} | " - f"ComIF(-c): {com_if_param}") + print( + f"Current globals | Mode(-m): {mode_param} | Service(-s): {service_param} | " + f"ComIF(-c): {com_if_param}" + ) @contextmanager diff --git a/src/tmtccmd/utility/exit_handler.py b/src/tmtccmd/utility/exit_handler.py index dc23e378..3136c204 100644 --- a/src/tmtccmd/utility/exit_handler.py +++ b/src/tmtccmd/utility/exit_handler.py @@ -6,7 +6,9 @@ LOGGER = get_console_logger() -def keyboard_interrupt_handler(tmtc_backend: TmTcHandler, com_interface: CommunicationInterface): +def keyboard_interrupt_handler( + tmtc_backend: TmTcHandler, com_interface: CommunicationInterface +): tmtc_backend.close_listener(join=True, join_timeout_seconds=1.0) LOGGER.info("Closing TMTC client") diff --git a/src/tmtccmd/utility/hammingcode.py b/src/tmtccmd/utility/hammingcode.py index 88b3f8c3..b196df65 100644 --- a/src/tmtccmd/utility/hammingcode.py +++ b/src/tmtccmd/utility/hammingcode.py @@ -44,11 +44,11 @@ class HammingReturnCodes(Enum): # No bit flips - CODE_OKAY = 0, + CODE_OKAY = (0,) # Single bit flip which can be corrected - ERROR_SINGLE_BIT = 1, + ERROR_SINGLE_BIT = (1,) # Error in the hamming code - ERROR_ECC = 2, + ERROR_ECC = (2,) # Multi bit error which can not be corrected ERROR_MULTI_BIT = 3 # Invalid input @@ -64,28 +64,36 @@ def hamming_compute_256x(data: bytearray) -> bytearray: is invalid. """ if len(data) % 256 != 0: - LOGGER.error("hamming_compute_256: Invalid input, datablock is not a multiple of " - "256 bytes!") + LOGGER.error( + "hamming_compute_256: Invalid input, datablock is not a multiple of " + "256 bytes!" + ) return bytearray() remaining_size = len(data) hamming_code = bytearray() current_idx = 0 while remaining_size > 0: - hamming_code.extend(hamming_compute_256(data[current_idx: current_idx + 256])) + hamming_code.extend(hamming_compute_256(data[current_idx : current_idx + 256])) remaining_size -= 256 current_idx += 256 return hamming_code -def hamming_verify_256x(data: bytearray, original_hamming_code: bytearray) -> HammingReturnCodes: +def hamming_verify_256x( + data: bytearray, original_hamming_code: bytearray +) -> HammingReturnCodes: if len(data) % 256 != 0: - LOGGER.error("hamming_compute_256: Invalid input, datablock is not a multiple of " - "256 bytes!") + LOGGER.error( + "hamming_compute_256: Invalid input, datablock is not a multiple of " + "256 bytes!" + ) return HammingReturnCodes.OTHER_ERROR if len(original_hamming_code) != len(data) / 256 * 3: - LOGGER.error("hamming_compute_256: Invalid input, original hamming code does not have the" - "correct size!") + LOGGER.error( + "hamming_compute_256: Invalid input, original hamming code does not have the" + "correct size!" + ) return HammingReturnCodes.OTHER_ERROR remaining_size = len(data) @@ -93,20 +101,25 @@ def hamming_verify_256x(data: bytearray, original_hamming_code: bytearray) -> Ha current_hamming_idx = 0 error_code = HammingReturnCodes.CODE_OKAY while remaining_size > 0: - current_data = bytearray(data[current_data_idx:current_data_idx + 256]) + current_data = bytearray(data[current_data_idx : current_data_idx + 256]) error_code = hamming_verify_256( - current_data, original_hamming_code[current_hamming_idx:current_hamming_idx + 3] + current_data, + original_hamming_code[current_hamming_idx : current_hamming_idx + 3], ) if error_code == HammingReturnCodes.ERROR_SINGLE_BIT: # Assign corrected data - data[current_data_idx:current_data_idx + 256] = current_data - LOGGER.info(f"Corrected single bit error at data block starting at {current_data_idx}") + data[current_data_idx : current_data_idx + 256] = current_data + LOGGER.info( + f"Corrected single bit error at data block starting at {current_data_idx}" + ) error_code = HammingReturnCodes.ERROR_SINGLE_BIT elif error_code == HammingReturnCodes.ERROR_MULTI_BIT: - LOGGER.info(f"Detected multi-bit error at data block starting at {current_data_idx}") + LOGGER.info( + f"Detected multi-bit error at data block starting at {current_data_idx}" + ) return error_code elif error_code == HammingReturnCodes.ERROR_ECC: - LOGGER.info('Possible error in ECC code') + LOGGER.info("Possible error in ECC code") return error_code current_data_idx += 256 current_hamming_idx += 3 @@ -122,8 +135,10 @@ def hamming_compute_256(data: bytearray) -> bytearray: """ hamming_code = bytearray(3) if len(data) != 256: - LOGGER.error("hamming_compute_256: Invalid input, data does not have " - "a length of 256 bytes!") + LOGGER.error( + "hamming_compute_256: Invalid input, data does not have " + "a length of 256 bytes!" + ) return hamming_code # Xor all bytes together to get the column sum; @@ -135,7 +150,7 @@ def hamming_compute_256(data: bytearray) -> bytearray: odd_column_code = 0 for index, byte in enumerate(data): column_sum ^= byte - if (bin(byte).count('1') & 1) == 1: + if (bin(byte).count("1") & 1) == 1: """ Parity groups are formed by forcing a particular index bit to 0 (even) or 1 (odd). @@ -165,7 +180,7 @@ def hamming_compute_256(data: bytearray) -> bytearray: evenLineCode bits: P128 P64 P32 P16 P8 P4 P2 P1 oddLineCode bits: P128' P64' P32' P16' P8' P4' P2' P1' """ - even_line_code ^= (255 - index) + even_line_code ^= 255 - index odd_line_code ^= index # At this point, we have the line parities, and the column sum. @@ -222,7 +237,9 @@ def hamming_compute_256(data: bytearray) -> bytearray: return hamming_code -def hamming_verify_256(data: bytearray, original_hamming_code: bytearray) -> HammingReturnCodes: +def hamming_verify_256( + data: bytearray, original_hamming_code: bytearray +) -> HammingReturnCodes: """Verifies and corrects a 256-bytes block of data using the given 22-bits hamming code. Returns 0 if there is no error, otherwise returns a HAMMING_ERROR code. :param data: 256 code block to verify @@ -235,12 +252,16 @@ def hamming_verify_256(data: bytearray, original_hamming_code: bytearray) -> Ham - 3 if there was a multi bit error which can not be corrected """ if len(data) != 256: - LOGGER.error("hamming_compute_256: Invalid input, data does not have " - "a length of 256 bytes!") + LOGGER.error( + "hamming_compute_256: Invalid input, data does not have " + "a length of 256 bytes!" + ) return HammingReturnCodes.OTHER_ERROR if len(original_hamming_code) != 3: - LOGGER.error("hamming_compute_256: Invalid input, hamming code does not have " - "a length of 3 bytes!") + LOGGER.error( + "hamming_compute_256: Invalid input, hamming code does not have " + "a length of 3 bytes!" + ) return HammingReturnCodes.OTHER_ERROR # Calculate new code @@ -257,9 +278,11 @@ def hamming_verify_256(data: bytearray, original_hamming_code: bytearray) -> Ham return HammingReturnCodes.CODE_OKAY # If there is a single bit error, there are 11 bits set to 1 - hamming_bit_count = \ - bin(correction_code[0]).count('1') + bin(correction_code[1]).count('1') + \ - bin(correction_code[2]).count('1') + hamming_bit_count = ( + bin(correction_code[0]).count("1") + + bin(correction_code[1]).count("1") + + bin(correction_code[2]).count("1") + ) if hamming_bit_count == 11: # Get byte and bit indexes byte_idx = correction_code[0] & 0x80 @@ -279,7 +302,7 @@ def hamming_verify_256(data: bytearray, original_hamming_code: bytearray) -> Ham # Correct bit print_string = "Correcting byte " + str(byte_idx) + " at bit " + str(bit_idx) LOGGER.info(print_string) - data[byte_idx] ^= (1 << bit_idx) + data[byte_idx] ^= 1 << bit_idx return HammingReturnCodes.ERROR_SINGLE_BIT # Check whether ECC has been corrupted @@ -291,13 +314,18 @@ def hamming_verify_256(data: bytearray, original_hamming_code: bytearray) -> Ham def hamming_test(): - """Algorithm was verified with this simple test. - """ + """Algorithm was verified with this simple test.""" test_data = bytearray(256) for index in range(128): test_data[index] = index for index in range(128): test_data[index + 128] = 128 - index hamming_code = hamming_compute_256(test_data) - print("Hamming code: " + str(hex(hamming_code[0])) + ", " + str(hex(hamming_code[1])) + - ", " + str(hex(hamming_code[2]))) + print( + "Hamming code: " + + str(hex(hamming_code[0])) + + ", " + + str(hex(hamming_code[1])) + + ", " + + str(hex(hamming_code[2])) + ) diff --git a/src/tmtccmd/utility/json_handler.py b/src/tmtccmd/utility/json_handler.py index 790c857c..f2f542c2 100644 --- a/src/tmtccmd/utility/json_handler.py +++ b/src/tmtccmd/utility/json_handler.py @@ -7,20 +7,20 @@ class JsonKeyNames(enum.Enum): - COM_IF = 'com_if' - TCPIP_UDP_DEST_IP_ADDRESS = 'tcpip_udp_ip_addr' - TCPIP_UDP_DEST_PORT = 'tcpip_udp_port' - TCPIP_UDP_RECV_IP_ADDRESS = 'tcpip_udp_recv_addr' - TCPIP_UDP_RECV_PORT = 'tcpip_udp_recv_port' - TCPIP_UDP_RECV_MAX_SIZE = 'tcpip_udp_recv_max_size' + COM_IF = "com_if" + TCPIP_UDP_DEST_IP_ADDRESS = "tcpip_udp_ip_addr" + TCPIP_UDP_DEST_PORT = "tcpip_udp_port" + TCPIP_UDP_RECV_IP_ADDRESS = "tcpip_udp_recv_addr" + TCPIP_UDP_RECV_PORT = "tcpip_udp_recv_port" + TCPIP_UDP_RECV_MAX_SIZE = "tcpip_udp_recv_max_size" - TCPIP_TCP_DEST_IP_ADDRESS = 'tcpip_tcp_ip_addr' - TCPIP_TCP_DEST_PORT = 'tcpip_tcp_port' - TCPIP_TCP_RECV_MAX_SIZE = 'tcpip_tcp_recv_max_size' + TCPIP_TCP_DEST_IP_ADDRESS = "tcpip_tcp_ip_addr" + TCPIP_TCP_DEST_PORT = "tcpip_tcp_port" + TCPIP_TCP_RECV_MAX_SIZE = "tcpip_tcp_recv_max_size" - SERIAL_BAUDRATE = 'serial_baudrate' - SERIAL_PORT = 'serial_port' - SERIAL_HINT = 'serial_hint' + SERIAL_BAUDRATE = "serial_baudrate" + SERIAL_PORT = "serial_port" + SERIAL_HINT = "serial_hint" def check_json_file(json_cfg_path: str) -> bool: @@ -28,20 +28,24 @@ def check_json_file(json_cfg_path: str) -> bool: if it does not exist or the format ins invalid. :return: True if JSON file is valid, False if not and a new one was created at the specified path """ - if json_cfg_path == '': - json_cfg_path = 'tmtc_config.json' + if json_cfg_path == "": + json_cfg_path = "tmtc_config.json" if not os.path.isfile(json_cfg_path): - with open(json_cfg_path, 'w') as file: + with open(json_cfg_path, "w") as file: load_data = dict() json.dump(load_data, file) - print(f'Configuration JSON {json_cfg_path} did not exist, created a new one.') + print( + f"Configuration JSON {json_cfg_path} did not exist, created a new one." + ) return False else: - with open(json_cfg_path, 'r+') as file: + with open(json_cfg_path, "r+") as file: try: json.load(file) except json.decoder.JSONDecodeError: - LOGGER.warning('JSON decode error, file format might be invalid. Replacing JSON') + LOGGER.warning( + "JSON decode error, file format might be invalid. Replacing JSON" + ) file.flush() file.truncate(0) file.seek(0) @@ -52,15 +56,15 @@ def check_json_file(json_cfg_path: str) -> bool: def save_to_json_with_prompt( - key: str, value: any, name: str, json_cfg_path: str, json_obj: any + key: str, value: any, name: str, json_cfg_path: str, json_obj: any ) -> bool: logger = get_console_logger() save_to_json = input( - f'Do you want to store the {name} to the configuration file? (y/n): ' + f"Do you want to store the {name} to the configuration file? (y/n): " ) - if save_to_json.lower() in ['y', 'yes']: + if save_to_json.lower() in ["y", "yes"]: json_obj[key] = value - logger.info(f'The {name} was stored to the JSON file {json_cfg_path}') - logger.info('Delete this file or edit it manually to change it') + logger.info(f"The {name} was stored to the JSON file {json_cfg_path}") + logger.info("Delete this file or edit it manually to change it") return True return False diff --git a/src/tmtccmd/utility/logger.py b/src/tmtccmd/utility/logger.py index 1b1aea55..69b74bfa 100644 --- a/src/tmtccmd/utility/logger.py +++ b/src/tmtccmd/utility/logger.py @@ -16,8 +16,8 @@ # pylint: disable=arguments-differ # pylint: disable=too-few-public-methods class InfoFilter(logging.Filter): - """Filter object, which is used so that only INFO and DEBUG messages are printed to stdout. - """ + """Filter object, which is used so that only INFO and DEBUG messages are printed to stdout.""" + def filter(self, rec): if rec.levelno == logging.INFO: return rec.levelno @@ -25,8 +25,8 @@ def filter(self, rec): class DebugFilter(logging.Filter): - """Filter object, which is used so that only DEBUG messages are printed to stdout. - """ + """Filter object, which is used so that only DEBUG messages are printed to stdout.""" + def filter(self, rec): if rec.levelno == logging.DEBUG: return rec.levelno @@ -49,8 +49,8 @@ def set_tmtc_console_logger() -> logging.Logger: # set_up_coloredlogs_logger(logger=logger) file_format = logging.Formatter( - fmt='%(levelname)-8s: %(asctime)s.%(msecs)03d | [%(filename)s:%(lineno)d] | %(message)s', - datefmt='%Y-%m-%d %H:%M:%S' + fmt="%(levelname)-8s: %(asctime)s.%(msecs)03d | [%(filename)s:%(lineno)d] | %(message)s", + datefmt="%Y-%m-%d %H:%M:%S", ) console_error_handler = logging.StreamHandler(stream=sys.stderr) @@ -58,12 +58,12 @@ def set_tmtc_console_logger() -> logging.Logger: try: error_file_handler = logging.FileHandler( - filename=f"log/{ERROR_LOG_FILE_NAME}", encoding='utf-8', mode='w' + filename=f"log/{ERROR_LOG_FILE_NAME}", encoding="utf-8", mode="w" ) except FileNotFoundError: os.mkdir("log") error_file_handler = logging.FileHandler( - filename=f"log/{ERROR_LOG_FILE_NAME}", encoding='utf-8', mode='w' + filename=f"log/{ERROR_LOG_FILE_NAME}", encoding="utf-8", mode="w" ) error_file_handler.setLevel(level=logging.WARNING) error_file_handler.setFormatter(file_format) @@ -76,10 +76,13 @@ def set_tmtc_console_logger() -> logging.Logger: def set_up_coloredlogs_logger(logger: logging.Logger): try: import coloredlogs + coloredlogs.install( - level='INFO', logger=logger, milliseconds=True, - fmt='%(asctime)s.%(msecs)03d %(hostname)s %(name)s[%(process)d] %(levelname)s %(message)s', - datefmt='%Y-%m-%d %H:%M:%S' + level="INFO", + logger=logger, + milliseconds=True, + fmt="%(asctime)s.%(msecs)03d %(hostname)s %(name)s[%(process)d] %(levelname)s %(message)s", + datefmt="%Y-%m-%d %H:%M:%S", ) except ImportError: print("Please install coloredlogs package first") @@ -87,20 +90,21 @@ def set_up_coloredlogs_logger(logger: logging.Logger): def set_up_colorlog_logger(logger: logging.Logger): from colorlog import ColoredFormatter, StreamHandler + generic_format = ColoredFormatter( - fmt='%(log_color)s%(levelname)-8s %(cyan)s%(asctime)s.%(msecs)03d %(reset)s%(message)s', - datefmt='%Y-%m-%d %H:%M:%S' + fmt="%(log_color)s%(levelname)-8s %(cyan)s%(asctime)s.%(msecs)03d %(reset)s%(message)s", + datefmt="%Y-%m-%d %H:%M:%S", ) fault_format = ColoredFormatter( - fmt='%(log_color)s%(levelname)-8s %(cyan)s%(asctime)s.%(msecs)03d ' - '[%(filename)s:%(lineno)d] %(reset)s%(message)s', - datefmt='%Y-%m-%d %H:%M:%S' + fmt="%(log_color)s%(levelname)-8s %(cyan)s%(asctime)s.%(msecs)03d " + "[%(filename)s:%(lineno)d] %(reset)s%(message)s", + datefmt="%Y-%m-%d %H:%M:%S", ) file_format = logging.Formatter( - fmt='%(levelname)-8s: %(asctime)s.%(msecs)03d [%(filename)s:%(lineno)d] %(message)s', - datefmt='%Y-%m-%d %H:%M:%S' + fmt="%(levelname)-8s: %(asctime)s.%(msecs)03d [%(filename)s:%(lineno)d] %(message)s", + datefmt="%Y-%m-%d %H:%M:%S", ) console_info_handler = StreamHandler(stream=sys.stdout) @@ -116,12 +120,12 @@ def set_up_colorlog_logger(logger: logging.Logger): try: error_file_handler = logging.FileHandler( - filename=f"log/{ERROR_LOG_FILE_NAME}", encoding='utf-8', mode='w' + filename=f"log/{ERROR_LOG_FILE_NAME}", encoding="utf-8", mode="w" ) except FileNotFoundError: os.mkdir("log") error_file_handler = logging.FileHandler( - filename=f"log/{ERROR_LOG_FILE_NAME}", encoding='utf-8', mode='w' + filename=f"log/{ERROR_LOG_FILE_NAME}", encoding="utf-8", mode="w" ) error_file_handler.setLevel(level=logging.WARNING) diff --git a/src/tmtccmd/utility/tmtc_printer.py b/src/tmtccmd/utility/tmtc_printer.py index bea71d10..56f2e06e 100644 --- a/src/tmtccmd/utility/tmtc_printer.py +++ b/src/tmtccmd/utility/tmtc_printer.py @@ -20,7 +20,8 @@ class DisplayMode(enum.Enum): - """ List of display modes """ + """List of display modes""" + SHORT = enum.auto() LONG = enum.auto() @@ -28,9 +29,12 @@ class DisplayMode(enum.Enum): class TmTcPrinter: """This class handles printing to the command line and to files. TODO: Introduce file logger""" + def __init__( - self, display_mode: DisplayMode = DisplayMode.LONG, do_print_to_file: bool = True, - print_tc: bool = True + self, + display_mode: DisplayMode = DisplayMode.LONG, + do_print_to_file: bool = True, + print_tc: bool = True, ): """ :param display_mode: @@ -59,8 +63,10 @@ def print_telemetry_queue(self, tm_queue: PusIFQueueT): self.print_telemetry(packet_if=tm_packet, info_if=tm_packet) def print_telemetry( - self, packet_if: PusTmInterface, info_if: PusTmInfoInterface, - print_raw_tm: bool = False + self, + packet_if: PusTmInterface, + info_if: PusTmInfoInterface, + print_raw_tm: bool = False, ): """This function handles printing telemetry :param packet_if: Core interface to work with PUS packets @@ -68,8 +74,9 @@ def print_telemetry( :param print_raw_tm: Specify whether the TM packet is printed in a raw way. :return: """ - if not isinstance(packet_if, PusTmInterface) or \ - not isinstance(info_if, PusTmInfoInterface): + if not isinstance(packet_if, PusTmInterface) or not isinstance( + info_if, PusTmInfoInterface + ): LOGGER.warning("Passed packet does not implement necessary interfaces!") return @@ -87,13 +94,15 @@ def print_telemetry( self.handle_service_3_packet(packet_if=packet_if) if packet_if.service == PusServices.SERVICE_5_EVENT: self.handle_service_5_packet(packet_if=packet_if) - if packet_if.service == PusServices.SERVICE_8_FUNC_CMD and \ - packet_if.subservice == Srv8Subservices.DATA_REPLY: + if ( + packet_if.service == PusServices.SERVICE_8_FUNC_CMD + and packet_if.subservice == Srv8Subservices.DATA_REPLY + ): self.handle_service_8_packet(packet_if=packet_if) if print_raw_tm: tm_data_string = get_printable_data_string( - print_format= PrintFormats.HEX, data=packet_if.pack() + print_format=PrintFormats.HEX, data=packet_if.pack() ) self.__print_buffer = f"TM Data:\n{tm_data_string}" LOGGER.info(self.__print_buffer) @@ -101,51 +110,71 @@ def print_telemetry( def handle_service_3_packet(self, packet_if: PusTmInterface): from tmtccmd.config.hook import get_global_hook_obj + if packet_if.service != 3: - LOGGER.warning('This packet is not a service 3 packet!') + LOGGER.warning("This packet is not a service 3 packet!") return hook_obj = get_global_hook_obj() if hook_obj is None: - LOGGER.warning('Hook object not set') + LOGGER.warning("Hook object not set") return srv3_packet = cast(Service3Base, packet_if) if srv3_packet.custom_hk_handling: - (hk_header, hk_content, validity_buffer, num_vars) = \ - hook_obj.handle_service_3_housekeeping( - object_id=bytes(), set_id=srv3_packet.set_id, - hk_data=packet_if.tm_data, service3_packet=srv3_packet + ( + hk_header, + hk_content, + validity_buffer, + num_vars, + ) = hook_obj.handle_service_3_housekeeping( + object_id=bytes(), + set_id=srv3_packet.set_id, + hk_data=packet_if.tm_data, + service3_packet=srv3_packet, ) else: - (hk_header, hk_content, validity_buffer, num_vars) = \ - hook_obj.handle_service_3_housekeeping( - object_id=srv3_packet.object_id.as_bytes, set_id=srv3_packet.set_id, - hk_data=packet_if.tm_data[8:], service3_packet=srv3_packet + ( + hk_header, + hk_content, + validity_buffer, + num_vars, + ) = hook_obj.handle_service_3_housekeeping( + object_id=srv3_packet.object_id.as_bytes, + set_id=srv3_packet.set_id, + hk_data=packet_if.tm_data[8:], + service3_packet=srv3_packet, ) if packet_if.subservice == 25 or packet_if.subservice == 26: self.handle_hk_print( - object_id=srv3_packet.object_id.as_int, set_id=srv3_packet.set_id, - hk_header=hk_header, hk_content=hk_content, validity_buffer=validity_buffer, - num_vars=num_vars + object_id=srv3_packet.object_id.as_int, + set_id=srv3_packet.set_id, + hk_header=hk_header, + hk_content=hk_content, + validity_buffer=validity_buffer, + num_vars=num_vars, ) if packet_if.subservice == 10 or packet_if.subservice == 12: self.handle_hk_definition_print( - object_id=srv3_packet.object_id.id, set_id=srv3_packet.set_id, - srv3_packet=srv3_packet + object_id=srv3_packet.object_id.id, + set_id=srv3_packet.set_id, + srv3_packet=srv3_packet, ) def handle_service_5_packet(self, packet_if: PusTmInterface): from tmtccmd.config.hook import get_global_hook_obj + if packet_if.service != 5: - LOGGER.warning('This packet is not a service 5 packet!') + LOGGER.warning("This packet is not a service 5 packet!") return hook_obj = get_global_hook_obj() if hook_obj is None: - LOGGER.warning('Hook object not set') + LOGGER.warning("Hook object not set") return srv5_packet = cast(Service5TM, packet_if) custom_string = hook_obj.handle_service_5_event( - object_id=srv5_packet.reporter_id_as_bytes, event_id=srv5_packet.event_id, - param_1=srv5_packet.param_1, param_2=srv5_packet.param_2 + object_id=srv5_packet.reporter_id_as_bytes, + event_id=srv5_packet.event_id, + param_1=srv5_packet.param_1, + param_2=srv5_packet.param_2, ) self.__print_buffer = custom_string LOGGER.info(self.__print_buffer) @@ -153,35 +182,34 @@ def handle_service_5_packet(self, packet_if: PusTmInterface): def handle_service_8_packet(self, packet_if: PusTmInterface): from tmtccmd.config.hook import get_global_hook_obj + if packet_if.service != PusServices.SERVICE_8_FUNC_CMD: - LOGGER.warning('This packet is not a service 8 packet!') + LOGGER.warning("This packet is not a service 8 packet!") return if packet_if.subservice != Srv8Subservices.DATA_REPLY: LOGGER.warning( - f'This packet is not data reply packet with ' - f'subservice {Srv8Subservices.DATA_REPLY}!' + f"This packet is not data reply packet with " + f"subservice {Srv8Subservices.DATA_REPLY}!" ) return hook_obj = get_global_hook_obj() if hook_obj is None: - LOGGER.warning('Hook object not set') + LOGGER.warning("Hook object not set") return srv8_packet = cast(Service8TM, packet_if) if srv8_packet is None: - LOGGER.warning('Service 8 object is not instance of Service8TM') + LOGGER.warning("Service 8 object is not instance of Service8TM") return obj_id = srv8_packet.source_object_id_as_bytes action_id = srv8_packet.action_id header_list, content_list = hook_obj.handle_service_8_telemetry( - object_id=obj_id, action_id=action_id, - custom_data=srv8_packet.custom_data + object_id=obj_id, action_id=action_id, custom_data=srv8_packet.custom_data ) obj_id_dict = hook_obj.get_object_ids() rep_str = obj_id_dict.get(bytes(obj_id)) if rep_str is None: rep_str = "unknown object" - print_string = \ - f'Service 8 data reply from {rep_str} with action ID {action_id}' + print_string = f"Service 8 data reply from {rep_str} with action ID {action_id}" self.__print_buffer = print_string LOGGER.info(self.__print_buffer) self.add_print_buffer_to_file_buffer() @@ -193,8 +221,13 @@ def handle_service_8_packet(self, packet_if: PusTmInterface): self.add_print_buffer_to_file_buffer() def handle_hk_print( - self, object_id: int, set_id: int, hk_header: list, hk_content: list, - validity_buffer: bytearray, num_vars: int + self, + object_id: int, + set_id: int, + hk_header: list, + hk_content: list, + validity_buffer: bytearray, + num_vars: int, ): """Prints the passed housekeeping packet, if HK printout is enabled and also adds it to the internal print buffer. @@ -207,32 +240,49 @@ def handle_hk_print( :return: """ self.__print_hk( - content_type=HkContentType.HK, object_id=object_id, set_id=set_id, - header=hk_header, content=hk_content + content_type=HkContentType.HK, + object_id=object_id, + set_id=set_id, + header=hk_header, + content=hk_content, ) self.__print_validity_buffer(validity_buffer=validity_buffer, num_vars=num_vars) - def handle_hk_definition_print(self, object_id: int, set_id: int, srv3_packet: Service3Base): + def handle_hk_definition_print( + self, object_id: int, set_id: int, srv3_packet: Service3Base + ): """ :param object_id: :param set_id: :param srv3_packet: :return: """ - self.__print_buffer = f'HK Definition from Object ID {object_id:#010x} and set ID {set_id}:' + self.__print_buffer = ( + f"HK Definition from Object ID {object_id:#010x} and set ID {set_id}:" + ) def_header, def_list = srv3_packet.get_hk_definitions_list() self.__print_hk( - content_type=HkContentType.DEFINITIONS, object_id=object_id, set_id=set_id, - header=def_header, content=def_list + content_type=HkContentType.DEFINITIONS, + object_id=object_id, + set_id=set_id, + header=def_header, + content=def_list, ) def __handle_short_print(self, packet_if: PusTmInterface): - self.__print_buffer = "Received TM[" + str(packet_if.service) + "," + str( - packet_if.subservice) + "]" + self.__print_buffer = ( + "Received TM[" + + str(packet_if.service) + + "," + + str(packet_if.subservice) + + "]" + ) LOGGER.info(self.__print_buffer) self.add_print_buffer_to_file_buffer() - def __handle_long_tm_print(self, packet_if: PusTmInterface, info_if: PusTmInfoInterface): + def __handle_long_tm_print( + self, packet_if: PusTmInterface, info_if: PusTmInfoInterface + ): """Main function to print the most important information inside the telemetry :param packet_if: Core packet interface :param info_if: Information interface @@ -276,8 +326,12 @@ def __handle_additional_printout(self, info_if: PusTmInfoInterface): LOGGER.info(self.__print_buffer) def __print_hk( - self, content_type: HkContentType, object_id: int, set_id: int, header: list, - content: list + self, + content_type: HkContentType, + object_id: int, + set_id: int, + header: list, + content: list, ): """This function pretty prints HK packets with a given header and content list :param content_type: Type of content for HK packet @@ -289,12 +343,13 @@ def __print_hk( print_prefix = "Housekeeping definitions" else: print_prefix = "Unknown housekeeping data" - self.__print_buffer = \ - f'{print_prefix} from Object ID {object_id:#010x} with Set ID {set_id}' + self.__print_buffer = ( + f"{print_prefix} from Object ID {object_id:#010x} with Set ID {set_id}" + ) LOGGER.info(self.__print_buffer) self.add_print_buffer_to_file_buffer() if len(content) == 0 or len(header) == 0: - self.__print_buffer = 'Content and header list empty..' + self.__print_buffer = "Content and header list empty.." LOGGER.info(self.__print_buffer) self.add_print_buffer_to_file_buffer() return @@ -341,20 +396,22 @@ def __handle_validity_buffer_print(self, validity_buffer: bytes, num_vars: int): LOGGER.info(self.__print_buffer) self.add_print_buffer_to_file_buffer() - def __handle_wiretapping_packet(self, packet_if: PusTmInterface, info_if: PusTmInfoInterface): + def __handle_wiretapping_packet( + self, packet_if: PusTmInterface, info_if: PusTmInfoInterface + ): """ :param packet_if: Core packet interface :param info_if: Information interface :return: """ - if packet_if.service == 2 and \ - (packet_if.subservice == 131 - or packet_if.subservice == 130): - self.__print_buffer = \ - f"Wiretapping Packet or Raw Reply from TM [{packet_if.service}," \ + if packet_if.service == 2 and ( + packet_if.subservice == 131 or packet_if.subservice == 130 + ): + self.__print_buffer = ( + f"Wiretapping Packet or Raw Reply from TM [{packet_if.service}," f"{packet_if.subservice}]: " - self.__print_buffer = \ - self.__print_buffer + info_if.get_source_data_string() + ) + self.__print_buffer = self.__print_buffer + info_if.get_source_data_string() LOGGER.info(self.__print_buffer) self.add_print_buffer_to_file_buffer() @@ -378,11 +435,12 @@ def print_string(self, string: str, add_cr_to_file_buffer: bool = False): self.add_print_buffer_to_file_buffer(add_cr_to_file_buffer) def add_to_print_string(self, string_to_add: str = ""): - """ Add a specific string to the current print buffer """ + """Add a specific string to the current print buffer""" self.__print_buffer += string_to_add - def add_print_buffer_to_file_buffer(self, additional_newline: bool = False, - newline_before: bool = True): + def add_print_buffer_to_file_buffer( + self, additional_newline: bool = False, newline_before: bool = True + ): """ Add to file buffer. Some options to optimize the output. """ @@ -396,33 +454,36 @@ def add_print_buffer_to_file_buffer(self, additional_newline: bool = False, self.__file_buffer += f"{self.__print_buffer}\n" def add_print_buffer_to_buffer_list(self): - """ Add the current print buffer to the buffer list """ + """Add the current print buffer to the buffer list""" self.file_buffer_list.append(self.__file_buffer) def clear_file_buffer(self): - """ Clears the file buffer """ + """Clears the file buffer""" self.__file_buffer = "" - def print_to_file(self, log_name: str = "log/tmtc_log.txt", clear_file_buffer: bool = False): + def print_to_file( + self, log_name: str = "log/tmtc_log.txt", clear_file_buffer: bool = False + ): """ :param log_name: :param clear_file_buffer: :return: """ try: - file = open(log_name, 'w') + file = open(log_name, "w") except FileNotFoundError: LOGGER.info("Log directory does not exists, creating log folder.") - os.mkdir('log') - file = open(log_name, 'w') + os.mkdir("log") + file = open(log_name, "w") file.write(self.__file_buffer) if clear_file_buffer: self.__file_buffer = "" LOGGER.info("Log file written to %s", log_name) file.close() - def print_file_buffer_list_to_file(self, log_name: str = "log/tmtc_log.txt", - clear_list: bool = True): + def print_file_buffer_list_to_file( + self, log_name: str = "log/tmtc_log.txt", clear_list: bool = True + ): """ Joins the string list and prints it to an output file. :param log_name: @@ -430,12 +491,12 @@ def print_file_buffer_list_to_file(self, log_name: str = "log/tmtc_log.txt", :return: """ try: - file = open(log_name, 'w') + file = open(log_name, "w") except FileNotFoundError: LOGGER.info("Log directory does not exists, creating log folder.") - os.mkdir('log') - file = open(log_name, 'w') - file_buffer = ''.join(self.file_buffer_list) + os.mkdir("log") + file = open(log_name, "w") + file_buffer = "".join(self.file_buffer_list) file.write(file_buffer) if clear_list: self.file_buffer_list = [] @@ -454,7 +515,7 @@ def bit_extractor(byte: int, position: int): return (byte >> shift_number) & 1 def print_telecommand( - self, tc_packet_obj: PusTelecommand, tc_packet_raw: bytearray = bytes() + self, tc_packet_obj: PusTelecommand, tc_packet_raw: bytearray = bytes() ): """ This function handles the printing of Telecommands. It assumed the packets are sent @@ -478,9 +539,10 @@ def _handle_short_tc_print(self, tc_packet_obj: PusTelecommand): :param tc_packet_obj: :return: """ - self.__print_buffer = \ - f"Sent TC[{tc_packet_obj.service}, {tc_packet_obj.subservice}] with SSC " \ + self.__print_buffer = ( + f"Sent TC[{tc_packet_obj.service}, {tc_packet_obj.subservice}] with SSC " f"{tc_packet_obj.ssc}" + ) LOGGER.info(self.__print_buffer) self.add_print_buffer_to_file_buffer() @@ -494,10 +556,11 @@ def _handle_long_tc_print(self, tc_packet_obj: PusTelecommand): print_format=PrintFormats.HEX, data=tc_packet_obj.app_data ) try: - self.__print_buffer = \ - f"Telecommand TC[{tc_packet_obj.service}, {tc_packet_obj.subservice}] " \ - f"with SSC {tc_packet_obj.ssc} sent with data " \ + self.__print_buffer = ( + f"Telecommand TC[{tc_packet_obj.service}, {tc_packet_obj.subservice}] " + f"with SSC {tc_packet_obj.ssc} sent with data " f"{data_print}" + ) LOGGER.info(self.__print_buffer) self.add_print_buffer_to_file_buffer() except TypeError as error: From 150c7ebc3e526067eb60a56eb915445634386eb1 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 7 Dec 2021 16:52:04 +0100 Subject: [PATCH 010/221] fix for enum --- src/tmtccmd/tc/service_3_housekeeping.py | 28 ++++++++++++------------ 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/tmtccmd/tc/service_3_housekeeping.py b/src/tmtccmd/tc/service_3_housekeeping.py index 23ea534a..bf35054a 100644 --- a/src/tmtccmd/tc/service_3_housekeeping.py +++ b/src/tmtccmd/tc/service_3_housekeeping.py @@ -7,25 +7,25 @@ class Srv3Subservice(enum.IntEnum): - ENABLE_PERIODIC_HK_GEN = (5,) - DISABLE_PERIODIC_HK_GEN = (6,) - ENABLE_PERIODIC_DIAGNOSTICS_GEN = (7,) - DISABLE_PERIODIC_DIAGNOSTICS_GEN = (8,) + ENABLE_PERIODIC_HK_GEN = 5 + DISABLE_PERIODIC_HK_GEN = 6 + ENABLE_PERIODIC_DIAGNOSTICS_GEN = 7 + DISABLE_PERIODIC_DIAGNOSTICS_GEN = 8 - REPORT_HK_REPORT_STRUCTURES = (9,) - REPORT_DIAG_REPORT_STRUCTURES = (11,) + REPORT_HK_REPORT_STRUCTURES = 9 + REPORT_DIAG_REPORT_STRUCTURES = 11 - HK_DEFINITIONS_REPORT = (10,) - DIAG_DEFINITION_REPORT = (12,) + HK_DEFINITIONS_REPORT = 10 + DIAG_DEFINITION_REPORT = 12 - HK_REPORT = (25,) - DIAGNOSTICS_REPORT = (26,) + HK_REPORT = 25 + DIAGNOSTICS_REPORT = 26 - GENERATE_ONE_PARAMETER_REPORT = (27,) - GENERATE_ONE_DIAGNOSTICS_REPORT = (28,) + GENERATE_ONE_PARAMETER_REPORT = 27 + GENERATE_ONE_DIAGNOSTICS_REPORT = 28 - MODIFY_PARAMETER_REPORT_COLLECTION_INTERVAL = (31,) - MODIFY_DIAGNOSTICS_REPORT_COLLECTION_INTERVAL = (32,) + MODIFY_PARAMETER_REPORT_COLLECTION_INTERVAL = 31 + MODIFY_DIAGNOSTICS_REPORT_COLLECTION_INTERVAL = 32 def make_sid(object_id: bytearray, set_id: int) -> bytearray: From 9ef1879111224f30b89f5d32d3a46b8222552d81 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 7 Dec 2021 16:53:22 +0100 Subject: [PATCH 011/221] update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2517125b..e460b20e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,3 +11,4 @@ and this project adheres to [Semantic Versioning](http://semver.org/). ## [v1.11.0] - New API to build service/opcode dictionary +- Applied consistent formatting with `black` tool \ No newline at end of file From 241f0a35ba997cece1491497ff7736dff05244cc Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 9 Dec 2021 10:20:55 +0100 Subject: [PATCH 012/221] added function to add CFDP handler --- src/tmtccmd/config/definitions.py | 1 + src/tmtccmd/config/hook.py | 7 ++++++- src/tmtccmd/core/globals_manager.py | 10 +++++----- src/tmtccmd/runner.py | 15 +++++++-------- 4 files changed, 19 insertions(+), 14 deletions(-) diff --git a/src/tmtccmd/config/definitions.py b/src/tmtccmd/config/definitions.py index ae7120c6..149150b7 100644 --- a/src/tmtccmd/config/definitions.py +++ b/src/tmtccmd/config/definitions.py @@ -15,6 +15,7 @@ class CoreGlobalIds(enum.IntEnum): TM_LISTENER_HANDLE = 130 TMTC_PRINTER_HANDLE = 131 TM_HANDLER_HANDLE = 132 + CFDP_HANDLER_HANDLE = 133 TMTC_BACKEND = 134 PRETTY_PRINTER = 135 diff --git a/src/tmtccmd/config/hook.py b/src/tmtccmd/config/hook.py index 38422dc4..5310cde6 100644 --- a/src/tmtccmd/config/hook.py +++ b/src/tmtccmd/config/hook.py @@ -4,6 +4,7 @@ from typing import Dict, Tuple, Optional, Union from tmtccmd.config.definitions import DEFAULT_APID, ServiceOpCodeDictT +from tmtccmd.cfdp.handler import CfdpHandler from tmtccmd.utility.logger import get_console_logger from tmtccmd.core.backend import TmTcHandler from tmtccmd.utility.tmtc_printer import TmTcPrinter @@ -42,7 +43,7 @@ def add_globals_pre_args_parsing(self, gui: bool = False): """ from tmtccmd.config.globals import set_default_globals_pre_args_parsing - set_default_globals_pre_args_parsing(gui=gui, apid=DEFAULT_APID) + set_default_globals_pre_args_parsing(gui=gui, tc_apid=DEFAULT_APID, tm_apid=DEFAULT_APID) @abstractmethod def add_globals_post_args_parsing(self, args: argparse.Namespace): @@ -124,6 +125,10 @@ def get_json_config_file_path(self) -> str: """ return "tmtc_config.json" + @staticmethod + def get_cfdp_handler() -> Optional[CfdpHandler]: + return None + @staticmethod def handle_service_8_telemetry( object_id: bytes, action_id: int, custom_data: bytearray diff --git a/src/tmtccmd/core/globals_manager.py b/src/tmtccmd/core/globals_manager.py index bd1d37f9..aab4b7d2 100644 --- a/src/tmtccmd/core/globals_manager.py +++ b/src/tmtccmd/core/globals_manager.py @@ -8,7 +8,7 @@ def get_global(global_param_id: int, lock: bool = False): global __LOCK_TIMEOUT, __GLOBALS_DICT if lock: - __GLOBALS_LOCK.acquire(timeout=__LOCK_TIMEOUT) + __GLOBALS_LOCK.acquire(blocking=True, timeout=__LOCK_TIMEOUT) global_param = __GLOBALS_DICT.get(global_param_id) if lock: __GLOBALS_LOCK.release() @@ -18,13 +18,13 @@ def get_global(global_param_id: int, lock: bool = False): def update_global(global_param_id: int, parameter: any, lock: bool = False): global __LOCK_TIMEOUT, __GLOBALS_DICT if lock: - __GLOBALS_LOCK.acquire(timeout=__LOCK_TIMEOUT) + __GLOBALS_LOCK.acquire(blocking=True, timeout=__LOCK_TIMEOUT) __GLOBALS_DICT[global_param_id] = parameter if lock: __GLOBALS_LOCK.release() -def lock_global_pool() -> bool: +def __lock_global_pool() -> bool: global __LOCK_TIMEOUT, __GLOBALS_LOCK """Lock the global objects. This is important if the values are changed. Don't forget to unlock the pool after finishing work with the globals! @@ -32,10 +32,10 @@ def lock_global_pool() -> bool: released. :return: Returns whether lock was locked or not. """ - return __GLOBALS_LOCK.acquire(__LOCK_TIMEOUT) + return __GLOBALS_LOCK.acquire(True, __LOCK_TIMEOUT) -def unlock_global_pool(): +def __unlock_global_pool(): global __GLOBALS_LOCK """Releases the lock so other objects can use the global pool as well""" return __GLOBALS_LOCK.release() diff --git a/src/tmtccmd/runner.py b/src/tmtccmd/runner.py index 57be606a..c5632997 100644 --- a/src/tmtccmd/runner.py +++ b/src/tmtccmd/runner.py @@ -19,10 +19,9 @@ from tmtccmd.ccsds.handler import CcsdsTmHandler from tmtccmd.core.globals_manager import ( update_global, - get_global, - lock_global_pool, - unlock_global_pool, + get_global ) +from tmtccmd.cfdp.handler import CfdpHandler from tmtccmd.core.object_id_manager import insert_object_ids from tmtccmd.config.args import parse_input_arguments from tmtccmd.config.objects import get_core_object_ids @@ -67,11 +66,11 @@ def add_ccsds_handler(ccsds_handler: CcsdsTmHandler): :param ccsds_handler: Handler for CCSDS packets :return: """ - lock_global_pool() - tm_handler = get_global(CoreGlobalIds.TM_HANDLER_HANDLE) - if tm_handler is None: - update_global(CoreGlobalIds.TM_HANDLER_HANDLE, ccsds_handler) - unlock_global_pool() + update_global(CoreGlobalIds.TM_HANDLER_HANDLE, ccsds_handler) + + +def add_cfdp_handler(cfdp_handler: CfdpHandler): + update_global(CoreGlobalIds.CFDP_HANDLER_HANDLE, cfdp_handler) def run_tmtc_commander( From aaeddbf7c7e610698085ff5137396c298a761301 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 9 Dec 2021 10:23:35 +0100 Subject: [PATCH 013/221] added docs for new function --- src/tmtccmd/runner.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/tmtccmd/runner.py b/src/tmtccmd/runner.py index c5632997..1c9f0d9a 100644 --- a/src/tmtccmd/runner.py +++ b/src/tmtccmd/runner.py @@ -70,6 +70,12 @@ def add_ccsds_handler(ccsds_handler: CcsdsTmHandler): def add_cfdp_handler(cfdp_handler: CfdpHandler): + """Add a handler for CFDP requests. Please note that you still have take care of routing CFDP + TM packets to the handler as well, for example by adding the CFDP handler to the CCSDS TM + handler + + :param cfdp_handler: Handler for CFDP user requests + """ update_global(CoreGlobalIds.CFDP_HANDLER_HANDLE, cfdp_handler) From 64d560e3bfa69ea194abbb612504929da42c330c Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 9 Dec 2021 11:25:39 +0100 Subject: [PATCH 014/221] continued cfdp state machine --- src/tmtccmd/cfdp/filestore.py | 44 +++++++++++++++++++ src/tmtccmd/cfdp/handler.py | 35 ++++++++++++--- src/tmtccmd/config/hook.py | 4 +- src/tmtccmd/core/backend.py | 15 ++++++- src/tmtccmd/runner.py | 15 ++++--- .../sendreceive/sequential_sender_receiver.py | 5 ++- 6 files changed, 102 insertions(+), 16 deletions(-) create mode 100644 src/tmtccmd/cfdp/filestore.py diff --git a/src/tmtccmd/cfdp/filestore.py b/src/tmtccmd/cfdp/filestore.py new file mode 100644 index 00000000..92e5e6dc --- /dev/null +++ b/src/tmtccmd/cfdp/filestore.py @@ -0,0 +1,44 @@ +import abc +import os + +from tmtccmd.utility.logger import get_console_logger + +LOGGER = get_console_logger() + + +class VirtualFilestore: + @abc.abstractmethod + def create_file(self, file_path: str): + LOGGER.warning("Creating file not implemented in virtual filestore") + + @abc.abstractmethod + def delete_file(self, file_path: str): + LOGGER.warning("Deleting file not implemented in virtual filestore") + + @abc.abstractmethod + def rename_file(self, _old_file_path: str, _new_file_path: str): + LOGGER.warning("Renaming file not implemented in virtual filestore") + + @abc.abstractmethod + def append_file(self, _file_path: str, _data: bytes): + LOGGER.warning("Appending to file not implemented in virtual filestore") + + @abc.abstractmethod + def replace_file(self, _replaced_file: str, _new_file: str): + LOGGER.warning("Replacing file not implemented in virtual filestore") + + @abc.abstractmethod + def create_directory(self, _dir_name: str): + LOGGER.warning("Creating directory not implemented in virtual filestore") + + @abc.abstractmethod + def list_directory(self, _dir_name: str, _recursive: bool): + LOGGER.warning("Listing directory not implemented in virtual filestore") + + +class HostFilestore(VirtualFilestore): + def create_file(self, file_path: str): + pass + + def delete_file(self, file_path: str): + pass diff --git a/src/tmtccmd/cfdp/handler.py b/src/tmtccmd/cfdp/handler.py index 48247672..a2215f96 100644 --- a/src/tmtccmd/cfdp/handler.py +++ b/src/tmtccmd/cfdp/handler.py @@ -1,8 +1,9 @@ -import abc import enum import os +import abc from typing import Optional, Type +from .filestore import VirtualFilestore from tmtccmd.utility.tmtc_printer import TmTcPrinter from tmtccmd.utility.logger import get_console_logger from tmtccmd.com_if.com_interface_base import CommunicationInterface @@ -13,18 +14,40 @@ LOGGER = get_console_logger() +class CfdpRequest(enum.Enum): + PUT = 0 + REPORT = 1 + CANCEL = 2 + SUSPEND = 3 + RESUME = 4 + + +class CfdpIndication(enum.Enum): + TRANSACTION = 0 + EOF = 1 + FINISHED = 2 + METADATA = 3 + FILE_SEGMENT_RECV = 4 + REPORT = 5 + SUSPENDED = 6 + RESUMED = 7 + FAULT = 8 + ABANDONED = 9 + EOF_RECV = 10 + + class CfdpClass(enum.Enum): - UNRELIABLE_CL1 = (0,) + UNRELIABLE_CL1 = 0 RELIABLE_CL2 = 1 class CfdpUserBase: - def __init__(self): - pass + def __init__(self, vfs: Type[VirtualFilestore]): + self.vfs = vfs @abc.abstractmethod - def transaction_indication(self): - LOGGER.info("Received transaction indication") + def transaction_indication(self, code: CfdpIndication): + LOGGER.info(f"Received transaction indication {code}") class CfdpHandler: diff --git a/src/tmtccmd/config/hook.py b/src/tmtccmd/config/hook.py index 5310cde6..c14cd35b 100644 --- a/src/tmtccmd/config/hook.py +++ b/src/tmtccmd/config/hook.py @@ -43,7 +43,9 @@ def add_globals_pre_args_parsing(self, gui: bool = False): """ from tmtccmd.config.globals import set_default_globals_pre_args_parsing - set_default_globals_pre_args_parsing(gui=gui, tc_apid=DEFAULT_APID, tm_apid=DEFAULT_APID) + set_default_globals_pre_args_parsing( + gui=gui, tc_apid=DEFAULT_APID, tm_apid=DEFAULT_APID + ) @abstractmethod def add_globals_post_args_parsing(self, args: argparse.Namespace): diff --git a/src/tmtccmd/core/backend.py b/src/tmtccmd/core/backend.py index 36a2144c..a3ae6d84 100644 --- a/src/tmtccmd/core/backend.py +++ b/src/tmtccmd/core/backend.py @@ -5,9 +5,10 @@ from threading import Thread from abc import abstractmethod from collections import deque -from typing import Union +from typing import Union, Optional from tmtccmd.config.definitions import CoreServiceList, CoreModeList +from tmtccmd.cfdp.handler import CfdpHandler from tmtccmd.tm.definitions import TmTypes from tmtccmd.tm.handler import TmHandler from tmtccmd.utility.logger import get_console_logger @@ -69,6 +70,7 @@ def __init__( self.__com_if = com_if self.__tmtc_printer = tmtc_printer self.__tm_listener = tm_listener + self.__cfdp_handler: Optional[CfdpHandler] = None if tm_handler.get_type() == TmTypes.CCSDS_SPACE_PACKETS: self.__tm_handler: CcsdsTmHandler = cast(CcsdsTmHandler, tm_handler) for apid_queue_len_tuple in self.__tm_handler.get_apid_queue_len_list(): @@ -78,6 +80,9 @@ def __init__( self.exit_on_com_if_init_failure = True self.single_command_package = bytearray(), None + def set_cfdp_handler(self, cfdp_handler: CfdpHandler): + self.__cfdp_handler = cfdp_handler + def get_com_if_id(self): return self.com_if_key @@ -267,6 +272,14 @@ def __handle_action(self): sender_and_receiver.send_queue_tc_and_receive_tm_sequentially() self.mode = CoreModeList.LISTENER_MODE elif self.mode == CoreModeList.CFDP_MODE: + if self.__cfdp_handler is None: + LOGGER.warning( + "TMTC commander is in CFDP mode but no CFDP handler has been set. " + "Transitioning to listener mode" + ) + self.mode = CoreModeList.LISTENER_MODE + return + self.__cfdp_handler.state_machine() # Handle replies. These will be passed to the CFDP handler automatically if self.__tm_listener.reply_event(): packet_queues = self.__tm_listener.retrieve_tm_packet_queues(clear=True) diff --git a/src/tmtccmd/runner.py b/src/tmtccmd/runner.py index 1c9f0d9a..4ae00ca8 100644 --- a/src/tmtccmd/runner.py +++ b/src/tmtccmd/runner.py @@ -17,10 +17,7 @@ from tmtccmd.tm.definitions import TmTypes from tmtccmd.tm.handler import TmHandler from tmtccmd.ccsds.handler import CcsdsTmHandler -from tmtccmd.core.globals_manager import ( - update_global, - get_global -) +from tmtccmd.core.globals_manager import update_global, get_global from tmtccmd.cfdp.handler import CfdpHandler from tmtccmd.core.object_id_manager import insert_object_ids from tmtccmd.config.args import parse_input_arguments @@ -273,14 +270,17 @@ def get_default_tmtc_backend( if json_cfg_path: pass - com_if = hook_obj.assign_communication_interface( - com_if_key=get_global(CoreGlobalIds.COM_IF), tmtc_printer=tmtc_printer - ) + # Convert string to communication interface object + if isinstance(str, com_if): + com_if = hook_obj.assign_communication_interface( + com_if_key=get_global(CoreGlobalIds.COM_IF), tmtc_printer=tmtc_printer + ) tc_send_timeout_factor = seq_cmd_cfg.tc_send_timeout_factor tm_timeout = seq_cmd_cfg.tm_timeout tm_listener = TmListener( com_if=com_if, tm_timeout=tm_timeout, tc_timeout_factor=tc_send_timeout_factor ) + cfdp_handler = get_global(CoreGlobalIds.CFDP_HANDLER_HANDLE) # The global variables are set by the argument parser. tmtc_backend = TmTcHandler( com_if=com_if, @@ -292,5 +292,6 @@ def get_default_tmtc_backend( tm_handler=tm_handler, ) tmtc_backend.set_current_apid(apid=apid) + tmtc_backend.set_cfdp_handler(cfdp_handler=cfdp_handler) tmtc_backend.set_one_shot_or_loop_handling(seq_cmd_cfg.listener_after_op) return tmtc_backend diff --git a/src/tmtccmd/sendreceive/sequential_sender_receiver.py b/src/tmtccmd/sendreceive/sequential_sender_receiver.py index cb1872eb..526259b5 100644 --- a/src/tmtccmd/sendreceive/sequential_sender_receiver.py +++ b/src/tmtccmd/sendreceive/sequential_sender_receiver.py @@ -52,7 +52,10 @@ def __init__( self.__all_replies_received = False def send_queue_tc_and_receive_tm_sequentially(self): - """Primary function which is called for sequential transfer. + """Primary function which is called for sequential transfer. Please note that this function + will only return once the whole TC queue has been handled and might block for a prolonged + period + :return: """ self._tm_listener.set_listener_mode(TmListener.ListenerModes.SEQUENCE) From 28d40f08bd1451428bcfcf22d2f7685125827444 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 9 Dec 2021 11:52:48 +0100 Subject: [PATCH 015/221] continued host filestore impl --- src/tmtccmd/cfdp/filestore.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/tmtccmd/cfdp/filestore.py b/src/tmtccmd/cfdp/filestore.py index 92e5e6dc..dbe85b0f 100644 --- a/src/tmtccmd/cfdp/filestore.py +++ b/src/tmtccmd/cfdp/filestore.py @@ -42,3 +42,18 @@ def create_file(self, file_path: str): def delete_file(self, file_path: str): pass + + def rename_file(self, _old_file_path: str, _new_file_path: str): + pass + + def append_file(self, _file_path: str, _data: bytes): + pass + + def replace_file(self, _replaced_file: str, _new_file: str): + pass + + def create_directory(self, _dir_name: str): + pass + + def list_directory(self, _dir_name: str, _recursive: bool): + pass From 112f77a861fc5df69753218186d423f63a058f5b Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 9 Dec 2021 11:59:31 +0100 Subject: [PATCH 016/221] fix --- src/tmtccmd/runner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tmtccmd/runner.py b/src/tmtccmd/runner.py index 4ae00ca8..b098dd94 100644 --- a/src/tmtccmd/runner.py +++ b/src/tmtccmd/runner.py @@ -271,7 +271,7 @@ def get_default_tmtc_backend( if json_cfg_path: pass # Convert string to communication interface object - if isinstance(str, com_if): + if isinstance(com_if, str): com_if = hook_obj.assign_communication_interface( com_if_key=get_global(CoreGlobalIds.COM_IF), tmtc_printer=tmtc_printer ) From cd92c2727a8b41ef535ce6d70a3047772ec7156a Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 9 Dec 2021 15:43:15 +0100 Subject: [PATCH 017/221] created host filestore handler --- src/tmtccmd/cfdp/filestore.py | 199 +++++++++++++++++++++++++++++----- 1 file changed, 172 insertions(+), 27 deletions(-) diff --git a/src/tmtccmd/cfdp/filestore.py b/src/tmtccmd/cfdp/filestore.py index dbe85b0f..85b02e69 100644 --- a/src/tmtccmd/cfdp/filestore.py +++ b/src/tmtccmd/cfdp/filestore.py @@ -1,59 +1,204 @@ import abc import os +import shutil +import datetime +import platform from tmtccmd.utility.logger import get_console_logger +from spacepackets.cfdp.tlv import FilestoreResponseStatusCode LOGGER = get_console_logger() class VirtualFilestore: @abc.abstractmethod - def create_file(self, file_path: str): + def copy_procecdure_handler( + self, file_path: str, offset: int, data: bytes + ) -> FilestoreResponseStatusCode: + """This is not used as part of a filestore request, it is used to build up the received + file""" + LOGGER.warning("Appending to file not implemented in virtual filestore") + return FilestoreResponseStatusCode.NOT_PERFORMED + + @abc.abstractmethod + def create_file(self, file_path: str) -> FilestoreResponseStatusCode: LOGGER.warning("Creating file not implemented in virtual filestore") + return FilestoreResponseStatusCode.NOT_PERFORMED @abc.abstractmethod - def delete_file(self, file_path: str): + def delete_file(self, file_path: str) -> FilestoreResponseStatusCode: LOGGER.warning("Deleting file not implemented in virtual filestore") + return FilestoreResponseStatusCode.NOT_PERFORMED @abc.abstractmethod - def rename_file(self, _old_file_path: str, _new_file_path: str): + def rename_file( + self, _old_file_path: str, _new_file_path: str + ) -> FilestoreResponseStatusCode: LOGGER.warning("Renaming file not implemented in virtual filestore") + return FilestoreResponseStatusCode.NOT_PERFORMED @abc.abstractmethod - def append_file(self, _file_path: str, _data: bytes): + def append_file( + self, source_file: str, appended_on_source: str + ) -> FilestoreResponseStatusCode: + """The source file name will be the name of the resulting file""" LOGGER.warning("Appending to file not implemented in virtual filestore") + return FilestoreResponseStatusCode.NOT_PERFORMED @abc.abstractmethod - def replace_file(self, _replaced_file: str, _new_file: str): + def replace_file( + self, _replaced_file: str, _source_file: str + ) -> FilestoreResponseStatusCode: LOGGER.warning("Replacing file not implemented in virtual filestore") + return FilestoreResponseStatusCode.NOT_PERFORMED @abc.abstractmethod - def create_directory(self, _dir_name: str): + def create_directory(self, _dir_name: str) -> FilestoreResponseStatusCode: LOGGER.warning("Creating directory not implemented in virtual filestore") + return FilestoreResponseStatusCode.NOT_PERFORMED @abc.abstractmethod - def list_directory(self, _dir_name: str, _recursive: bool): + def remove_directory( + self, _dir_name: str, recursive: bool + ) -> FilestoreResponseStatusCode: + LOGGER.warning("Removing directory not implemented in virtual filestore") + return FilestoreResponseStatusCode.NOT_PERFORMED + + @abc.abstractmethod + def list_directory( + self, _dir_name: str, _recursive: bool + ) -> FilestoreResponseStatusCode: LOGGER.warning("Listing directory not implemented in virtual filestore") + return FilestoreResponseStatusCode.NOT_PERFORMED class HostFilestore(VirtualFilestore): - def create_file(self, file_path: str): - pass - - def delete_file(self, file_path: str): - pass - - def rename_file(self, _old_file_path: str, _new_file_path: str): - pass - - def append_file(self, _file_path: str, _data: bytes): - pass - - def replace_file(self, _replaced_file: str, _new_file: str): - pass - - def create_directory(self, _dir_name: str): - pass - - def list_directory(self, _dir_name: str, _recursive: bool): - pass + @abc.abstractmethod + def copy_procecdure_handler( + self, file_path: str, offset: int, data: bytes + ) -> FilestoreResponseStatusCode: + """This is not used as part of a filestore request, it is used to build up the received + file""" + if os.path.exists(file_path) and offset == 0: + LOGGER.warning( + "Offset is 0 and file already exists. Rejecting copy procedure" + ) + return FilestoreResponseStatusCode.COPY_PROC_OFFSET_ZERO_FILE_EXISTS + elif not os.path.exists(file_path): + file = open(file_path, "wb") + file_size = os.path.getsize(file_path) + else: + file = open(file_path, "r+b") + file_size = os.path.getsize(file_path) + if offset > file_size: + return FilestoreResponseStatusCode.NOT_PERFORMED + file.seek(offset=offset) + file.write(data) + return FilestoreResponseStatusCode.SUCCESS + + def create_file(self, file_path: str) -> FilestoreResponseStatusCode: + if os.path.exists(file_path): + LOGGER.warning("File already exists") + return FilestoreResponseStatusCode.CREATE_NOT_PERFORMED + try: + open(file_path, "x") + return FilestoreResponseStatusCode.CREATE_SUCCESS + except OSError: + LOGGER.exception(f"Creating file {file_path} failed") + return FilestoreResponseStatusCode.CREATE_NOT_ALLOWED + + def delete_file(self, file_path: str) -> FilestoreResponseStatusCode: + if not os.path.exists(file_path): + return FilestoreResponseStatusCode.DELETE_FILE_DOES_NOT_EXIST + try: + os.remove(file_path) + except IsADirectoryError: + LOGGER.exception(f"{file_path} is a directory") + return FilestoreResponseStatusCode.DELETE_NOT_ALLOWED + + def rename_file( + self, old_file_path: str, new_file_path: str + ) -> FilestoreResponseStatusCode: + if os.path.isdir(old_file_path) or os.path.isdir(new_file_path): + LOGGER.exception(f"{old_file_path} or {new_file_path} is a directory") + return FilestoreResponseStatusCode.RENAME_NOT_PERFORMED + if not os.path.exists(old_file_path): + return FilestoreResponseStatusCode.RENAME_OLD_FILE_DOES_NOT_EXIST + try: + os.rename(old_file_path, new_file_path) + except FileExistsError: + LOGGER.exception(f"{new_file_path} already exists") + return FilestoreResponseStatusCode.RENAME_NEW_FILE_DOES_EXIST + + def append_file( + self, source_file: str, appended_on_source: str + ) -> FilestoreResponseStatusCode: + if not os.path.exists(source_file): + return FilestoreResponseStatusCode.APPEND_FILE_NAME_ONE_NOT_EXISTS + if not os.path.exists(appended_on_source): + return FilestoreResponseStatusCode.APPEND_FILE_NAME_TWO_NOT_EXISTS + try: + file_one = open(source_file, "ab") + file_two = open(appended_on_source, "rb") + file_one.write(file_two.read()) + return FilestoreResponseStatusCode.APPEND_SUCCESS + except IOError: + LOGGER.exception(f"Appending {appended_on_source} on {source_file} failed") + return FilestoreResponseStatusCode.APPEND_NOT_PERFORMED + + def replace_file( + self, replaced_file: str, source_file: str + ) -> FilestoreResponseStatusCode: + if os.path.isdir(replaced_file) or os.path.isdir(source_file): + LOGGER.warning(f"{replaced_file} is a directory") + return FilestoreResponseStatusCode.REPLACE_NOT_ALLOWED + if not os.path.exists(replaced_file): + return FilestoreResponseStatusCode.REPLACE_FILE_NAME_ONE_TO_BE_REPLACED_DOES_NOT_EXIST + if not os.path.exists(source_file): + return FilestoreResponseStatusCode.REPLACE_FILE_NAME_TWO_REPLACE_SOURCE_NOT_EXIST + os.replace(replaced_file, source_file) + + def remove_directory( + self, dir_name: str, recursive: bool = False + ) -> FilestoreResponseStatusCode: + if not os.path.exists(dir_name): + LOGGER.warning(f"{dir_name} does not exist") + return FilestoreResponseStatusCode.REMOVE_DIR_DOES_NOT_EXIST + elif not os.path.isdir(dir_name): + LOGGER.warning(f"{dir_name} is not a directory") + return FilestoreResponseStatusCode.REMOVE_DIR_NOT_ALLOWED + if recursive: + shutil.rmtree(dir_name) + else: + try: + os.rmdir(dir_name) + return FilestoreResponseStatusCode.REMOVE_DIR_SUCCESS + except OSError: + LOGGER.exception(f"Removing directory {dir_name} failed") + return FilestoreResponseStatusCode.RENAME_NOT_PERFORMED + + def create_directory(self, dir_name: str) -> FilestoreResponseStatusCode: + if os.path.exists(dir_name): + # It does not really matter if the existing structure is a file or a directory + return FilestoreResponseStatusCode.CREATE_DIR_CAN_NOT_BE_CREATED + os.mkdir(dir_name) + return FilestoreResponseStatusCode.CREATE_DIR_SUCCESS + + def list_directory( + self, dir_name: str, recursive: bool = False + ) -> FilestoreResponseStatusCode: + now = datetime.datetime.now() + date_time = now.strftime("%d%m%Y_%H%M%S") + # Create a unique name by using the current time + res_name = "list_" + dir_name + "_" + date_time + ".txt" + if os.path.exists(res_name): + # This really should not happen + LOGGER.warning("Duplicate file name for listing directory") + return FilestoreResponseStatusCode.NOT_PERFORMED + file = open(res_name, "w") + file.write(f"Contents of directory {dir_name}\n") + if platform.system() == "Linux" or platform.system() == "Darwin": + os.system(f'll >> {res_name}') + elif platform.system() == "Windows": + os.system(f'dir >> {res_name}') + return FilestoreResponseStatusCode.SUCCESS From 0b9e9bb3f2db7560978c92a771104cf44e82dd62 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 9 Dec 2021 16:36:07 +0100 Subject: [PATCH 018/221] added more tests --- src/tests/test_cfdp_filestore.py | 68 ++++++++++++++++++++++++++++++++ src/tmtccmd/cfdp/filestore.py | 54 +++++++++++++++++-------- 2 files changed, 106 insertions(+), 16 deletions(-) create mode 100644 src/tests/test_cfdp_filestore.py diff --git a/src/tests/test_cfdp_filestore.py b/src/tests/test_cfdp_filestore.py new file mode 100644 index 00000000..ebf347f7 --- /dev/null +++ b/src/tests/test_cfdp_filestore.py @@ -0,0 +1,68 @@ +import os.path +import shutil +from unittest import TestCase +from tmtccmd.cfdp.filestore import HostFilestore, FilestoreResult + + +TEST_FILE_NAME_0 = "/tmp/cfdp_unittest0.txt" +TEST_FILE_NAME_1 = "/tmp/cfdp_unittest1.txt" +TEST_DIR_NAME_0 = "/tmp/cfdp_test_folder0" +TEST_DIR_NAME_1 = "/tmp/cfdp_test_folder1" +TEST_LIST_DIR_NAME = "/tmp/list-dir-test.txt" + + +class TestCfdpHostFilestore(TestCase): + def test_filestore(self): + filestore = HostFilestore() + if os.path.exists(TEST_FILE_NAME_0): + if os.path.isdir(TEST_DIR_NAME_0): + os.rmdir(TEST_FILE_NAME_0) + else: + os.remove(TEST_FILE_NAME_0) + if os.path.exists(TEST_FILE_NAME_1): + if os.path.isdir(TEST_DIR_NAME_1): + os.rmdir(TEST_FILE_NAME_1) + else: + os.remove(TEST_FILE_NAME_1) + if os.path.exists(TEST_DIR_NAME_0): + shutil.rmtree(TEST_DIR_NAME_0) + if os.path.exists(TEST_DIR_NAME_1): + shutil.rmtree(TEST_DIR_NAME_1) + res = filestore.create_file(TEST_FILE_NAME_0) + self.assertTrue(res == FilestoreResult.CREATE_SUCCESS) + self.assertTrue(os.path.exists(TEST_FILE_NAME_0)) + res = filestore.create_file(TEST_FILE_NAME_0) + self.assertTrue(res == FilestoreResult.CREATE_NOT_ALLOWED) + + res = filestore.delete_file(TEST_FILE_NAME_0) + self.assertTrue(res == FilestoreResult.DELETE_SUCCESS) + self.assertFalse(os.path.exists(TEST_FILE_NAME_0)) + res = filestore.delete_file(TEST_FILE_NAME_0) + self.assertTrue(res == FilestoreResult.DELETE_FILE_DOES_NOT_EXIST) + + filestore.create_file(TEST_FILE_NAME_0) + res = filestore.rename_file(old_file_path=TEST_FILE_NAME_0, new_file_path=TEST_FILE_NAME_1) + self.assertTrue(res == FilestoreResult.RENAME_SUCCESS) + self.assertTrue(os.path.exists(TEST_FILE_NAME_1)) + self.assertFalse(os.path.exists(TEST_FILE_NAME_0)) + res = filestore.delete_file(TEST_FILE_NAME_1) + self.assertTrue(res == FilestoreResult.DELETE_SUCCESS) + + res = filestore.create_directory(TEST_DIR_NAME_0) + self.assertTrue(res == FilestoreResult.CREATE_DIR_SUCCESS) + self.assertTrue(os.path.isdir(TEST_DIR_NAME_0)) + res = filestore.create_directory(TEST_DIR_NAME_0) + self.assertTrue(res == FilestoreResult.CREATE_DIR_CAN_NOT_BE_CREATED) + + res = filestore.delete_file(TEST_DIR_NAME_0) + self.assertTrue(res == FilestoreResult.DELETE_NOT_ALLOWED) + res = filestore.remove_directory(TEST_DIR_NAME_0) + self.assertTrue(res == FilestoreResult.REMOVE_DIR_SUCCESS) + + def test_list_dir(self): + filestore = HostFilestore() + if os.path.exists(TEST_LIST_DIR_NAME): + os.remove(TEST_LIST_DIR_NAME) + # Do not delete, user can check file content now + res = filestore.list_directory(dir_name="/tmp", file_name=TEST_LIST_DIR_NAME) + self.assertTrue(res == FilestoreResult.SUCCESS) diff --git a/src/tmtccmd/cfdp/filestore.py b/src/tmtccmd/cfdp/filestore.py index 85b02e69..98603006 100644 --- a/src/tmtccmd/cfdp/filestore.py +++ b/src/tmtccmd/cfdp/filestore.py @@ -9,6 +9,8 @@ LOGGER = get_console_logger() +FilestoreResult = FilestoreResponseStatusCode + class VirtualFilestore: @abc.abstractmethod @@ -66,13 +68,16 @@ def remove_directory( @abc.abstractmethod def list_directory( - self, _dir_name: str, _recursive: bool + self, _dir_name: str, _file_name: str, _recursive: bool = False ) -> FilestoreResponseStatusCode: LOGGER.warning("Listing directory not implemented in virtual filestore") return FilestoreResponseStatusCode.NOT_PERFORMED class HostFilestore(VirtualFilestore): + def __init__(self): + pass + @abc.abstractmethod def copy_procecdure_handler( self, file_path: str, offset: int, data: bytes @@ -94,14 +99,17 @@ def copy_procecdure_handler( return FilestoreResponseStatusCode.NOT_PERFORMED file.seek(offset=offset) file.write(data) + file.close() return FilestoreResponseStatusCode.SUCCESS def create_file(self, file_path: str) -> FilestoreResponseStatusCode: + """Returns CREATE_NOT_ALLOWED if the file already exists""" if os.path.exists(file_path): LOGGER.warning("File already exists") - return FilestoreResponseStatusCode.CREATE_NOT_PERFORMED + return FilestoreResponseStatusCode.CREATE_NOT_ALLOWED try: - open(file_path, "x") + file = open(file_path, "x") + file.close() return FilestoreResponseStatusCode.CREATE_SUCCESS except OSError: LOGGER.exception(f"Creating file {file_path} failed") @@ -112,6 +120,7 @@ def delete_file(self, file_path: str) -> FilestoreResponseStatusCode: return FilestoreResponseStatusCode.DELETE_FILE_DOES_NOT_EXIST try: os.remove(file_path) + return FilestoreResponseStatusCode.DELETE_SUCCESS except IsADirectoryError: LOGGER.exception(f"{file_path} is a directory") return FilestoreResponseStatusCode.DELETE_NOT_ALLOWED @@ -124,11 +133,10 @@ def rename_file( return FilestoreResponseStatusCode.RENAME_NOT_PERFORMED if not os.path.exists(old_file_path): return FilestoreResponseStatusCode.RENAME_OLD_FILE_DOES_NOT_EXIST - try: - os.rename(old_file_path, new_file_path) - except FileExistsError: - LOGGER.exception(f"{new_file_path} already exists") + if os.path.exists(new_file_path): return FilestoreResponseStatusCode.RENAME_NEW_FILE_DOES_EXIST + os.rename(old_file_path, new_file_path) + return FilestoreResponseStatusCode.RENAME_SUCCESS def append_file( self, source_file: str, appended_on_source: str @@ -141,6 +149,8 @@ def append_file( file_one = open(source_file, "ab") file_two = open(appended_on_source, "rb") file_one.write(file_two.read()) + file_one.close() + file_two.close() return FilestoreResponseStatusCode.APPEND_SUCCESS except IOError: LOGGER.exception(f"Appending {appended_on_source} on {source_file} failed") @@ -185,20 +195,32 @@ def create_directory(self, dir_name: str) -> FilestoreResponseStatusCode: return FilestoreResponseStatusCode.CREATE_DIR_SUCCESS def list_directory( - self, dir_name: str, recursive: bool = False + self, dir_name: str, file_name: str, recursive: bool = False ) -> FilestoreResponseStatusCode: - now = datetime.datetime.now() - date_time = now.strftime("%d%m%Y_%H%M%S") + """List a directory + + :param dir_name: Name of directory to list + :param file_name: The list will be written into this target file + :param recursive: + :return: + """ # Create a unique name by using the current time - res_name = "list_" + dir_name + "_" + date_time + ".txt" - if os.path.exists(res_name): + if os.path.exists(file_name): # This really should not happen LOGGER.warning("Duplicate file name for listing directory") return FilestoreResponseStatusCode.NOT_PERFORMED - file = open(res_name, "w") - file.write(f"Contents of directory {dir_name}\n") + file = open(file_name, "w") if platform.system() == "Linux" or platform.system() == "Darwin": - os.system(f'll >> {res_name}') + cmd = "ls -al" elif platform.system() == "Windows": - os.system(f'dir >> {res_name}') + cmd = "dir" + else: + LOGGER.warning(f"Unknown OS {platform.system()}, do not know how to list directory") + return FilestoreResponseStatusCode.NOT_PERFORMED + file.write(f"Contents of directory {dir_name} generated with '{cmd}':\n") + file.close() + curr_path = os.getcwd() + os.chdir(dir_name) + os.system(f'{cmd} >> {file_name}') + os.chdir(curr_path) return FilestoreResponseStatusCode.SUCCESS From 81144248a5359808fc9eac9e1a24e7492fbb18e3 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 9 Dec 2021 16:42:34 +0100 Subject: [PATCH 019/221] refactored some functions --- src/tmtccmd/cfdp/filestore.py | 25 +++++++++---------------- 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/src/tmtccmd/cfdp/filestore.py b/src/tmtccmd/cfdp/filestore.py index 98603006..ec4005e8 100644 --- a/src/tmtccmd/cfdp/filestore.py +++ b/src/tmtccmd/cfdp/filestore.py @@ -14,7 +14,7 @@ class VirtualFilestore: @abc.abstractmethod - def copy_procecdure_handler( + def append_data_to_file( self, file_path: str, offset: int, data: bytes ) -> FilestoreResponseStatusCode: """This is not used as part of a filestore request, it is used to build up the received @@ -79,24 +79,17 @@ def __init__(self): pass @abc.abstractmethod - def copy_procecdure_handler( + def append_data_to_file( self, file_path: str, offset: int, data: bytes ) -> FilestoreResponseStatusCode: - """This is not used as part of a filestore request, it is used to build up the received - file""" - if os.path.exists(file_path) and offset == 0: - LOGGER.warning( - "Offset is 0 and file already exists. Rejecting copy procedure" - ) - return FilestoreResponseStatusCode.COPY_PROC_OFFSET_ZERO_FILE_EXISTS - elif not os.path.exists(file_path): - file = open(file_path, "wb") - file_size = os.path.getsize(file_path) - else: - file = open(file_path, "r+b") - file_size = os.path.getsize(file_path) + """Primary function used to perform the CFDP Copy Procedure. This will also create a new + file as long as no other file with the same name exists""" + if not os.path.exists(file_path): + return FilestoreResponseStatusCode.APPEND_FROM_DATA_FILE_NOT_EXISTS + file = open(file_path, "r+b") + file_size = os.path.getsize(file_path) if offset > file_size: - return FilestoreResponseStatusCode.NOT_PERFORMED + return FilestoreResponseStatusCode.APPEND_FROM_DATA_INVALID_OFFSET file.seek(offset=offset) file.write(data) file.close() From a5840966b355f8769844d247202b8c43d5c7f683 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 9 Dec 2021 16:45:07 +0100 Subject: [PATCH 020/221] removed unused include --- src/tmtccmd/cfdp/filestore.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/tmtccmd/cfdp/filestore.py b/src/tmtccmd/cfdp/filestore.py index ec4005e8..8a962cd9 100644 --- a/src/tmtccmd/cfdp/filestore.py +++ b/src/tmtccmd/cfdp/filestore.py @@ -1,7 +1,6 @@ import abc import os import shutil -import datetime import platform from tmtccmd.utility.logger import get_console_logger From 1f6d0378d30191231022557f1d53b4adbcfd8d28 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 9 Dec 2021 16:46:39 +0100 Subject: [PATCH 021/221] update doc string --- src/tmtccmd/cfdp/filestore.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/tmtccmd/cfdp/filestore.py b/src/tmtccmd/cfdp/filestore.py index 8a962cd9..66cd3270 100644 --- a/src/tmtccmd/cfdp/filestore.py +++ b/src/tmtccmd/cfdp/filestore.py @@ -82,7 +82,12 @@ def append_data_to_file( self, file_path: str, offset: int, data: bytes ) -> FilestoreResponseStatusCode: """Primary function used to perform the CFDP Copy Procedure. This will also create a new - file as long as no other file with the same name exists""" + file as long as no other file with the same name exists + + :return: + - FilestoreResponseStatusCode.APPEND_FROM_DATA_FILE_NOT_EXISTS: File does not exist yet + - FilestoreResponseStatusCode.APPEND_FROM_DATA_INVALID_OFFSET: Invalid offset + """ if not os.path.exists(file_path): return FilestoreResponseStatusCode.APPEND_FROM_DATA_FILE_NOT_EXISTS file = open(file_path, "r+b") From a8444adc4b6652e5572797259f1741dc3a174f4b Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 9 Dec 2021 16:54:06 +0100 Subject: [PATCH 022/221] doc fixes --- docs/api.rst | 1 - docs/api/tmtccmd.tc.rst | 8 --- docs/api/tmtccmd.tm.rst | 16 ----- docs/api/tmtccmd.utility.rst | 8 --- src/tmtccmd/com_if/com_interface_base.py | 8 +-- src/tmtccmd/utility/hammingcode.py | 81 ++++++++++++------------ 6 files changed, 42 insertions(+), 80 deletions(-) diff --git a/docs/api.rst b/docs/api.rst index 1d96f974..4984dcf3 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -36,7 +36,6 @@ ECSS & PUS Submodules api/tmtccmd.ccsds api/tmtccmd.cfdp - api/tmtccmd.ecss api/tmtccmd.pus api/tmtccmd.tc api/tmtccmd.tm diff --git a/docs/api/tmtccmd.tc.rst b/docs/api/tmtccmd.tc.rst index e0439c18..25d10fbc 100644 --- a/docs/api/tmtccmd.tc.rst +++ b/docs/api/tmtccmd.tc.rst @@ -20,14 +20,6 @@ tmtccmd.tc.packer module :undoc-members: :show-inheritance: -tmtccmd.tc.service\_17\_test module ----------------------------------------- - -.. automodule:: tmtccmd.tc.service_17_test - :members: - :undoc-members: - :show-inheritance: - tmtccmd.tc.service\_200\_mode module ----------------------------------------- diff --git a/docs/api/tmtccmd.tm.rst b/docs/api/tmtccmd.tm.rst index b88540a1..e756f5dd 100644 --- a/docs/api/tmtccmd.tm.rst +++ b/docs/api/tmtccmd.tm.rst @@ -20,22 +20,6 @@ tmtccmd.tm.handler module :undoc-members: :show-inheritance: -tmtccmd.tm.service\_17\_test module ----------------------------------------- - -.. automodule:: tmtccmd.tm.service_17_test - :members: - :undoc-members: - :show-inheritance: - -tmtccmd.tm.service\_1\_verification module ------------------------------------------------ - -.. automodule:: tmtccmd.tm.service_1_verification - :members: - :undoc-members: - :show-inheritance: - tmtccmd.tm.service\_200\_mode module ----------------------------------------- diff --git a/docs/api/tmtccmd.utility.rst b/docs/api/tmtccmd.utility.rst index d6241579..f1aa9f42 100644 --- a/docs/api/tmtccmd.utility.rst +++ b/docs/api/tmtccmd.utility.rst @@ -12,14 +12,6 @@ tmtccmd.utility.conf\_util module :undoc-members: :show-inheritance: -tmtccmd.utility.dle\_encoder module ------------------------------------ - -.. automodule:: tmtccmd.utility.dle_encoder - :members: - :undoc-members: - :show-inheritance: - tmtccmd.utility.exit\_handler module ------------------------------------ diff --git a/src/tmtccmd/com_if/com_interface_base.py b/src/tmtccmd/com_if/com_interface_base.py index 4569318e..6142e693 100644 --- a/src/tmtccmd/com_if/com_interface_base.py +++ b/src/tmtccmd/com_if/com_interface_base.py @@ -1,12 +1,6 @@ # -*- coding: utf-8 -*- -""" -:file: tmtcc_com_interface_base.py -:data: 01.11.2019 -:details: -Generic Communication Interface. Defines the syntax of the communication functions. +"""Generic Communication Interface. Defines the syntax of the communication functions. Abstract methods must be implemented by child class (e.g. Ethernet Com IF) - -:author: R. Mueller """ from abc import abstractmethod diff --git a/src/tmtccmd/utility/hammingcode.py b/src/tmtccmd/utility/hammingcode.py index b196df65..e26f5f76 100644 --- a/src/tmtccmd/utility/hammingcode.py +++ b/src/tmtccmd/utility/hammingcode.py @@ -1,40 +1,38 @@ -""" -:brief: Hamming Code Implementation -:details: +"""Hamming Code Implementation Hamming codes belong to the family of linear error correcting codes. Documentation: https://en.wikipedia.org/wiki/Hamming_code They can be used to identify up to two bit errors and correct one bit error per 256 byte block. - -Translated from ATMEL C library. -/* ---------------------------------------------------------------------------- - * ATMEL Microcontroller Software Support - * ---------------------------------------------------------------------------- - * Copyright (c) 2008, Atmel Corporation - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, - * this list of conditions and the disclaimer below. - * - * Atmel's name may not be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE - * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, - * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, - * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * ---------------------------------------------------------------------------- - */ """ + +# Translated from ATMEL C library. +# /* ---------------------------------------------------------------------------- +# * ATMEL Microcontroller Software Support +# * ---------------------------------------------------------------------------- +# * Copyright (c) 2008, Atmel Corporation +# * +# * All rights reserved. +# * +# * Redistribution and use in source and binary forms, with or without +# * modification, are permitted provided that the following conditions are met: +# * +# * - Redistributions of source code must retain the above copyright notice, +# * this list of conditions and the disclaimer below. +# * +# * Atmel's name may not be used to endorse or promote products derived from +# * this software without specific prior written permission. +# * +# * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR +# * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE +# * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT, +# * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, +# * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +# * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +# * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +# * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# * ---------------------------------------------------------------------------- +# */ from enum import Enum from tmtccmd.utility.logger import get_console_logger @@ -58,10 +56,11 @@ class HammingReturnCodes(Enum): def hamming_compute_256x(data: bytearray) -> bytearray: """Computes 3-bytes hamming codes for a data block whose size is multiple of 256 bytes. Each 256 bytes block gets its own code. + :param data: Data to compute code for. Should be a multiple of 256 bytes, pad data with 0 - if necessary! + if necessary! :return: bytearray of hamming codes with the size (3 / 256 * size). Empty bytearray if input - is invalid. + is invalid. """ if len(data) % 256 != 0: LOGGER.error( @@ -130,6 +129,7 @@ def hamming_verify_256x( def hamming_compute_256(data: bytearray) -> bytearray: """Takes a bytearray with the size of 256 bytes and calculates the 22 parity bits for the hamming code which will be returned as a three byte bytearray. + :param data: :return: """ @@ -242,14 +242,15 @@ def hamming_verify_256( ) -> HammingReturnCodes: """Verifies and corrects a 256-bytes block of data using the given 22-bits hamming code. Returns 0 if there is no error, otherwise returns a HAMMING_ERROR code. + :param data: 256 code block to verify :param original_hamming_code: Original 3 byte hamming code with 22 parity bits :return: See HammingReturnCodes enums. - - -1 for invalid input - - 0 if there are no errors. - - 1 if there is a single bit error which has been corrected - - 2 if the hamming code has been corrupted - - 3 if there was a multi bit error which can not be corrected + - -1 for invalid input + - 0 if there are no errors. + - 1 if there is a single bit error which has been corrected + - 2 if the hamming code has been corrupted + - 3 if there was a multi bit error which can not be corrected """ if len(data) != 256: LOGGER.error( From c7ac1cf348dcc97cc1b4307f75f4d11c9ad861aa Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 9 Dec 2021 16:54:18 +0100 Subject: [PATCH 023/221] formatting with black --- src/tests/test_cfdp_filestore.py | 4 +++- src/tmtccmd/cfdp/filestore.py | 14 ++++++++++---- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/tests/test_cfdp_filestore.py b/src/tests/test_cfdp_filestore.py index ebf347f7..baf0c4ec 100644 --- a/src/tests/test_cfdp_filestore.py +++ b/src/tests/test_cfdp_filestore.py @@ -41,7 +41,9 @@ def test_filestore(self): self.assertTrue(res == FilestoreResult.DELETE_FILE_DOES_NOT_EXIST) filestore.create_file(TEST_FILE_NAME_0) - res = filestore.rename_file(old_file_path=TEST_FILE_NAME_0, new_file_path=TEST_FILE_NAME_1) + res = filestore.rename_file( + old_file_path=TEST_FILE_NAME_0, new_file_path=TEST_FILE_NAME_1 + ) self.assertTrue(res == FilestoreResult.RENAME_SUCCESS) self.assertTrue(os.path.exists(TEST_FILE_NAME_1)) self.assertFalse(os.path.exists(TEST_FILE_NAME_0)) diff --git a/src/tmtccmd/cfdp/filestore.py b/src/tmtccmd/cfdp/filestore.py index 66cd3270..bc8eb865 100644 --- a/src/tmtccmd/cfdp/filestore.py +++ b/src/tmtccmd/cfdp/filestore.py @@ -160,9 +160,13 @@ def replace_file( LOGGER.warning(f"{replaced_file} is a directory") return FilestoreResponseStatusCode.REPLACE_NOT_ALLOWED if not os.path.exists(replaced_file): - return FilestoreResponseStatusCode.REPLACE_FILE_NAME_ONE_TO_BE_REPLACED_DOES_NOT_EXIST + return ( + FilestoreResponseStatusCode.REPLACE_FILE_NAME_ONE_TO_BE_REPLACED_DOES_NOT_EXIST + ) if not os.path.exists(source_file): - return FilestoreResponseStatusCode.REPLACE_FILE_NAME_TWO_REPLACE_SOURCE_NOT_EXIST + return ( + FilestoreResponseStatusCode.REPLACE_FILE_NAME_TWO_REPLACE_SOURCE_NOT_EXIST + ) os.replace(replaced_file, source_file) def remove_directory( @@ -212,12 +216,14 @@ def list_directory( elif platform.system() == "Windows": cmd = "dir" else: - LOGGER.warning(f"Unknown OS {platform.system()}, do not know how to list directory") + LOGGER.warning( + f"Unknown OS {platform.system()}, do not know how to list directory" + ) return FilestoreResponseStatusCode.NOT_PERFORMED file.write(f"Contents of directory {dir_name} generated with '{cmd}':\n") file.close() curr_path = os.getcwd() os.chdir(dir_name) - os.system(f'{cmd} >> {file_name}') + os.system(f"{cmd} >> {file_name}") os.chdir(curr_path) return FilestoreResponseStatusCode.SUCCESS From 631c668cc765909cbd1e623fbc18148f7954947f Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 9 Dec 2021 17:01:03 +0100 Subject: [PATCH 024/221] gui fixes --- src/tmtccmd/config/definitions.py | 2 +- src/tmtccmd/core/frontend.py | 39 ++++++++++++++++++++----------- 2 files changed, 26 insertions(+), 15 deletions(-) diff --git a/src/tmtccmd/config/definitions.py b/src/tmtccmd/config/definitions.py index 149150b7..05ffc9c9 100644 --- a/src/tmtccmd/config/definitions.py +++ b/src/tmtccmd/config/definitions.py @@ -24,7 +24,7 @@ class CoreGlobalIds(enum.IntEnum): COM_IF_DICT = 140 MODE = 141 COM_IF = 142 - SEQ_CMD_CFG = 143 + SEQ_CMD_CFG = 144 # CFDP CFDP_CFG = 150 diff --git a/src/tmtccmd/core/frontend.py b/src/tmtccmd/core/frontend.py index 0de88b15..92356c86 100644 --- a/src/tmtccmd/core/frontend.py +++ b/src/tmtccmd/core/frontend.py @@ -1,11 +1,5 @@ #!/usr/bin/env python3 -""" -@file tmtc_frontend.py -@date 01.11.2019 -@brief This is part of the TMTC client developed by the SOURCE project by KSat -@description GUI is still work-in-progress -@manual -@author R. Mueller, P. Scheurenbrand, D. Nguyen +"""This is part of the TMTC client developed by the SOURCE project by KSat """ import enum import os @@ -34,6 +28,7 @@ from PyQt5.QtGui import QPixmap, QIcon from PyQt5.QtCore import Qt, pyqtSignal, QObject, QThread, QRunnable +from tmtccmd.config.globals import get_seq_cmd_cfg, set_seq_cmd_cfg from tmtccmd.core.frontend_base import FrontendBase from tmtccmd.core.backend import TmTcHandler from tmtccmd.config.hook import TmTcHookBase @@ -352,7 +347,7 @@ def __set_up_service_op_code_section(self, grid: QGridLayout, row: int): row += 1 combo_box_services = QComboBox() - default_service = get_global(CoreGlobalIds.CURRENT_SERVICE) + default_service = get_seq_cmd_cfg().service self.service_op_code_dict = self._hook_obj.get_service_op_code_dictionary() if self.service_op_code_dict is None: LOGGER.warning("Invalid service to operation code dictionary") @@ -456,12 +451,16 @@ def __checkbox_log_update(self, state: int): LOGGER.info(["Enabled", "Disabled"][state == 0] + " print to log.") def __checkbox_console_update(self, state: bool): - update_global(CoreGlobalIds.PRINT_TM, state) + seq_cmd_cfg = get_seq_cmd_cfg() + seq_cmd_cfg.print_tm = state + set_seq_cmd_cfg(seq_cmd_cfg) if self.__debug_mode: LOGGER.info(["enabled", "disabled"][state == 0] + " console print") def __checkbox_print_raw_data_update(self, state: int): - update_global(CoreGlobalIds.PRINT_RAW_TM, state) + seq_cmd_cfg = get_seq_cmd_cfg() + seq_cmd_cfg.print_raw_tm = state + set_seq_cmd_cfg(seq_cmd_cfg) if self.__debug_mode: LOGGER.info(["enabled", "disabled"][state == 0] + " printing of raw data") @@ -493,22 +492,34 @@ def __init__(self): def checkbox_print_hk_data(state: int): - update_global(CoreGlobalIds.PRINT_HK, state) + seq_cmd_cfg = get_seq_cmd_cfg() + seq_cmd_cfg.print_hk = state + set_seq_cmd_cfg(seq_cmd_cfg) LOGGER.info(["enabled", "disabled"][state == 0] + " printing of hk data") def checkbox_short_display_mode(state: int): - update_global(CoreGlobalIds.DISPLAY_MODE, state) + seq_cmd_cfg = get_seq_cmd_cfg() + if state: + state = "short" + else: + state = "long" + seq_cmd_cfg.display_mode = state + set_seq_cmd_cfg(seq_cmd_cfg) LOGGER.info(["enabled", "disabled"][state == 0] + " short display mode") def number_timeout(value: float): - update_global(CoreGlobalIds.TM_TIMEOUT, value) + seq_cmd_cfg = get_seq_cmd_cfg() + seq_cmd_cfg.tm_timeout = value + set_seq_cmd_cfg(seq_cmd_cfg) LOGGER.info("PUS TM timeout changed to: " + str(value)) def number_timeout_factor(value: float): - update_global(CoreGlobalIds.TC_SEND_TIMEOUT_FACTOR, value) + seq_cmd_cfg = get_seq_cmd_cfg() + seq_cmd_cfg.tc_send_timeout_factor = value + set_seq_cmd_cfg(seq_cmd_cfg) LOGGER.info("PUS TM timeout factor changed to: " + str(value)) From b6a2e46077edccc7e1dfcc5f8fb22624ea57ade1 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 9 Dec 2021 17:01:46 +0100 Subject: [PATCH 025/221] tiny tweak --- src/tmtccmd/core/frontend.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/tmtccmd/core/frontend.py b/src/tmtccmd/core/frontend.py index 92356c86..32a0ef94 100644 --- a/src/tmtccmd/core/frontend.py +++ b/src/tmtccmd/core/frontend.py @@ -97,7 +97,8 @@ def run_worker(self): self.finished.emit() elif self.op_code == WorkerOperationsCodes.SEQUENTIAL_COMMANDING: self.tmtc_handler.set_mode(CoreModeList.SEQUENTIAL_CMD_MODE) - # It is expected that the TMTC handler is in the according state to perform the operation + # It is expected that the TMTC handler is in the according state to perform + # the operation self.tmtc_handler.perform_operation() self.finished.emit() else: From cd726bb6f98959dc773f71350e69cf61f881763d Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 9 Dec 2021 17:12:38 +0100 Subject: [PATCH 026/221] using a fake filesystem now for tests --- setup.cfg | 4 +++- src/tests/test_cfdp_filestore.py | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/setup.cfg b/setup.cfg index ac020cf7..72d9cc0f 100644 --- a/setup.cfg +++ b/setup.cfg @@ -44,4 +44,6 @@ where = src [options.extras_require] gui = PyQt5>=5.0 - PyQt5-stubs>=5.0 \ No newline at end of file + PyQt5-stubs>=5.0 +tests = + pyfakefs>=4.5.3 \ No newline at end of file diff --git a/src/tests/test_cfdp_filestore.py b/src/tests/test_cfdp_filestore.py index baf0c4ec..a291bb3c 100644 --- a/src/tests/test_cfdp_filestore.py +++ b/src/tests/test_cfdp_filestore.py @@ -1,6 +1,6 @@ import os.path import shutil -from unittest import TestCase +from pyfakefs.fake_filesystem_unittest import TestCase from tmtccmd.cfdp.filestore import HostFilestore, FilestoreResult From d1ad9962e997b85af79b8d5b18a36ed5d0162f72 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 9 Dec 2021 17:14:16 +0100 Subject: [PATCH 027/221] update workflow file to install pyfakefs --- .github/workflows/package.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/package.yml b/.github/workflows/package.yml index c93ef670..777b61e8 100644 --- a/.github/workflows/package.yml +++ b/.github/workflows/package.yml @@ -32,7 +32,7 @@ jobs: flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics - name: Run tests and generate coverage data run: | - python3 -m pip install coverage pytest + python3 -m pip install coverage pytest pyfakefs coverage run -m pytest - name: Upload coverage to Codecov From 654ca30b9690051aa62ecbf8d91bd9331bc2ccea Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 9 Dec 2021 17:20:06 +0100 Subject: [PATCH 028/221] added missing function --- src/tests/test_cfdp_filestore.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/tests/test_cfdp_filestore.py b/src/tests/test_cfdp_filestore.py index a291bb3c..1b1093db 100644 --- a/src/tests/test_cfdp_filestore.py +++ b/src/tests/test_cfdp_filestore.py @@ -12,6 +12,9 @@ class TestCfdpHostFilestore(TestCase): + def setUp(self): + self.setUpPyfakefs() + def test_filestore(self): filestore = HostFilestore() if os.path.exists(TEST_FILE_NAME_0): From ec1a0491279dba19c3c04f5bfac99c0870473b04 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 9 Dec 2021 17:28:48 +0100 Subject: [PATCH 029/221] bump minimum spacepackets version --- setup.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.cfg b/setup.cfg index 72d9cc0f..f14e646e 100644 --- a/setup.cfg +++ b/setup.cfg @@ -32,7 +32,7 @@ install_requires = colorama>=0.4.4 colorlog>=5.0.0 dle-encoder>=0.2 - spacepackets>=0.5 + spacepackets>=0.5.2 package_dir = = src packages = find: From 527930f90a8e009eb4b4f1e945de1c512860fb54 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 13 Dec 2021 10:11:49 +0100 Subject: [PATCH 030/221] srv20 correction --- src/tmtccmd/tm/service_20_parameters.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/tmtccmd/tm/service_20_parameters.py b/src/tmtccmd/tm/service_20_parameters.py index e16b107b..cba13d3d 100644 --- a/src/tmtccmd/tm/service_20_parameters.py +++ b/src/tmtccmd/tm/service_20_parameters.py @@ -14,14 +14,14 @@ class ParamStruct: def __init__(self): - self.param_id = (0,) - self.domain_id = (0,) - self.unique_id = (0,) - self.linear_index = (0,) + self.param_id = 0 + self.domain_id = 0 + self.unique_id = 0 + self.linear_index = 0 self.type_ptc = 0 self.type_pfc = 0 - self.column = (0,) - self.row = (0,) + self.column = 0 + self.row = 0 self.param: any = 0 From 6965610d988da64dd8c6aabfe3367825670779ff Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 13 Dec 2021 10:28:47 +0100 Subject: [PATCH 031/221] added PutRequest definition --- src/tmtccmd/cfdp/handler.py | 52 ++++++++++++++++++++++++++++++------- 1 file changed, 43 insertions(+), 9 deletions(-) diff --git a/src/tmtccmd/cfdp/handler.py b/src/tmtccmd/cfdp/handler.py index a2215f96..5ae0044c 100644 --- a/src/tmtccmd/cfdp/handler.py +++ b/src/tmtccmd/cfdp/handler.py @@ -1,7 +1,7 @@ import enum import os import abc -from typing import Optional, Type +from typing import Optional, Type, List from .filestore import VirtualFilestore from tmtccmd.utility.tmtc_printer import TmTcPrinter @@ -9,7 +9,17 @@ from tmtccmd.com_if.com_interface_base import CommunicationInterface from spacepackets.cfdp.pdu.metadata import MetadataPdu from spacepackets.cfdp.conf import PduConfig -from spacepackets.cfdp.definitions import TransmissionModes, ChecksumTypes +from spacepackets.cfdp.definitions import ( + TransmissionModes, + ChecksumTypes, + SegmentationControl, +) +from spacepackets.cfdp.tlv import ( + FaultHandlerOverrideTlv, + FlowLabelTlv, + MessageToUserTlv, + FileStoreRequestTlv, +) LOGGER = get_console_logger() @@ -41,6 +51,23 @@ class CfdpClass(enum.Enum): RELIABLE_CL2 = 1 +class PutRequest: + destination_id: bytes + source_file_name: str + dest_file_name: str + seg_ctrl: SegmentationControl + fault_handler_overrides: Optional[FaultHandlerOverrideTlv] = None + flow_label_tlv: Optional[FlowLabelTlv] = None + trans_mode: TransmissionModes + closure_requested: bool + msgs_to_user: Optional[List[MessageToUserTlv]] = None + fs_requests: Optional[List[FileStoreRequestTlv]] = None + + +class BusyError(Exception): + pass + + class CfdpUserBase: def __init__(self, vfs: Type[VirtualFilestore]): self.vfs = vfs @@ -56,12 +83,15 @@ def __init__( com_if: Optional[CommunicationInterface], cfdp_type: Optional[CfdpClass], cfdp_user: Type[CfdpUserBase], + send_interval: float, ): self.cfdp_type = cfdp_type self.com_if = com_if self.cfdp_user = cfdp_user - self.__busy = False - pass + self.send_interval = send_interval + + self.__current_put_request: Optional[PutRequest] = None + self.__copy_procedure_pending = False @property def com_if(self): @@ -72,19 +102,23 @@ def com_if(self, com_if: CommunicationInterface): self.__com_if = com_if def state_machine(self): - pass + if self.__copy_procedure_pending: + pass def pass_packet( self, apid: int, raw_tm_packet: bytearray, tmtc_printer: TmTcPrinter ): pass - def put_request(self, cfdp_type: CfdpClass): - if self.__is_busy(): - # TODO: Custom exception - return + def put_request(self, put_request: PutRequest): + """A put request initiates a copy procedure. For now, only one put request at a time + is allowed""" + if self.__copy_procedure_pending(): + raise BusyError if self.cfdp_type != cfdp_type: self.cfdp_type = cfdp_type + self.__current_put_request = put_request + self.__copy_procedure_pending = True def send_metadata_pdu( self, From 01c5aa5cfda10de0e928a114c249c613f93d3647 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 13 Dec 2021 10:29:44 +0100 Subject: [PATCH 032/221] added empty mib file --- src/tmtccmd/cfdp/mib.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/tmtccmd/cfdp/mib.py diff --git a/src/tmtccmd/cfdp/mib.py b/src/tmtccmd/cfdp/mib.py new file mode 100644 index 00000000..e69de29b From 443d0db6a185fd159334bbb835e579f17c649b23 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 13 Dec 2021 15:07:19 +0100 Subject: [PATCH 033/221] update handler --- src/tmtccmd/cfdp/handler.py | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/src/tmtccmd/cfdp/handler.py b/src/tmtccmd/cfdp/handler.py index 5ae0044c..2fb45fb0 100644 --- a/src/tmtccmd/cfdp/handler.py +++ b/src/tmtccmd/cfdp/handler.py @@ -64,6 +64,16 @@ class PutRequest: fs_requests: Optional[List[FileStoreRequestTlv]] = None +class CfdpStates(enum.Enum): + IDLE = 0 + CRC_PROCEDURE = 1 + SENDING_METADATA = 2 + SENDING_FILE_DATA_PDUS = 3 + SENDING_EOF_DATA_PDU = 4 + SENDING_FINISH_PDU = 5 + SEND_ACK_PDU = 6 + + class BusyError(Exception): pass @@ -88,10 +98,10 @@ def __init__( self.cfdp_type = cfdp_type self.com_if = com_if self.cfdp_user = cfdp_user + self.state = CfdpStates.IDLE self.send_interval = send_interval self.__current_put_request: Optional[PutRequest] = None - self.__copy_procedure_pending = False @property def com_if(self): @@ -102,7 +112,12 @@ def com_if(self, com_if: CommunicationInterface): self.__com_if = com_if def state_machine(self): - if self.__copy_procedure_pending: + if self.state != CfdpStates.IDLE: + if self.state == CfdpStates.CRC_PROCEDURE: + # Skip this step for now + self.state = CfdpStates.SENDING_METADATA + if self.state == CfdpStates.SENDING_METADATA: + self.state = CfdpStates.SENDING_FILE_DATA_PDUS pass def pass_packet( @@ -113,12 +128,10 @@ def pass_packet( def put_request(self, put_request: PutRequest): """A put request initiates a copy procedure. For now, only one put request at a time is allowed""" - if self.__copy_procedure_pending(): + if self.state != CfdpStates.IDLE: raise BusyError - if self.cfdp_type != cfdp_type: - self.cfdp_type = cfdp_type self.__current_put_request = put_request - self.__copy_procedure_pending = True + self.state = CfdpStates.CRC_PROCEDURE def send_metadata_pdu( self, @@ -144,6 +157,3 @@ def send_metadata_pdu( ) data = metadata_pdu.pack() self.com_if.send(data=data) - - def __is_busy(self) -> bool: - return self.__busy From fa479e1adda35e30a7173b5f2f70ea57893e1d0d Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 13 Dec 2021 15:52:12 +0100 Subject: [PATCH 034/221] adapted CFDP config init --- src/tmtccmd/config/args.py | 19 +++++-------------- src/tmtccmd/config/globals.py | 23 ++++++++++------------- src/tmtccmd/tm/service_5_event.py | 6 +++--- 3 files changed, 18 insertions(+), 30 deletions(-) diff --git a/src/tmtccmd/config/args.py b/src/tmtccmd/config/args.py index a9641c6b..e45002ae 100644 --- a/src/tmtccmd/config/args.py +++ b/src/tmtccmd/config/args.py @@ -121,9 +121,6 @@ def add_generic_arguments(arg_parser: argparse.ArgumentParser): help="Determine whether the listener mode will be active after performing the operation", action="store_false", ) - arg_parser.add_argument( - "-f", "--file", help="Specify file to send for CFDP put request operation" - ) arg_parser.add_argument( "--sf", "--source_file", help="Source file for CFDP transactions" ) @@ -131,18 +128,12 @@ def add_generic_arguments(arg_parser: argparse.ArgumentParser): "--df", "--dest_file", help="Destination file for CFDP transactions" ) arg_parser.add_argument( - "--tr", - "--towards_receiver", - action="store_true", - help="CFDP transaction direction. If no direction information is " - "specified, default to send towards sender", - ) - arg_parser.add_argument( - "--ts", - "--towards_sender", + "-p", + "--proxy", action="store_true", - help="CFDP transaction direction. If no direction information is " - "specified, default to send towards sender", + help="CFDP proxy put operation. Can be used to request files from the remote entity. " + "The destination file should then be the file path on the sender side while the " + "source file should be the remote file to download.", ) arg_parser.add_argument( "-t", diff --git a/src/tmtccmd/config/globals.py b/src/tmtccmd/config/globals.py index 9ab7deba..5eb10d8c 100644 --- a/src/tmtccmd/config/globals.py +++ b/src/tmtccmd/config/globals.py @@ -157,19 +157,16 @@ def set_default_globals_post_args_parsing( seq_cmd_cfg.display_mode = display_mode_param if args.mode == "cfdp": cfdp_cfg = get_cfdp_cfg() - direction = Direction.TOWARDS_SENDER - if not args.ts and not args.tr: - LOGGER.info( - "No CFDP direction specified. Assuming direction towards sender" - ) - elif args.ts and args.tr: - LOGGER.warning( - "CFDP direction: Both towards sender and towards receiver were specified" - ) - LOGGER.warning("Assuming direction towards towards sender") - elif args.tr: - direction = Direction.TOWARDS_RECEIVER - cfdp_cfg.direction = direction + if args.sf is None: + # TODO: prompt from user? + LOGGER.warning("CFDP: No source file specified!") + else: + cfdp_cfg.source_file_name = args.sf + if args.df is None: + # TODO: prompt from user? + LOGGER.warning("CFDP: No destination file specified!") + else: + cfdp_cfg.dest_file_name = args.df set_cfdp_cfg(cfdp_cfg=cfdp_cfg) try: diff --git a/src/tmtccmd/tm/service_5_event.py b/src/tmtccmd/tm/service_5_event.py index d8bda854..994ddfc9 100644 --- a/src/tmtccmd/tm/service_5_event.py +++ b/src/tmtccmd/tm/service_5_event.py @@ -148,7 +148,7 @@ def __init_without_base(instance: Service5TM, set_attrs_from_tm_data: bool = Fal ) raise ValueError if set_attrs_from_tm_data: - instance._event_id = struct.unpack('>H', tm_data[0:2])[0] + instance._event_id = struct.unpack(">H", tm_data[0:2])[0] instance._object_id.from_bytes(tm_data[2:6]) - instance._param_1 = struct.unpack('>I', tm_data[6:10])[0] - instance._param_2 = struct.unpack('>I', tm_data[10:14])[0] + instance._param_1 = struct.unpack(">I", tm_data[6:10])[0] + instance._param_2 = struct.unpack(">I", tm_data[10:14])[0] From 0f94f7632fd740ba17cda9659ddaa657a202c7bc Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 13 Dec 2021 18:17:12 +0100 Subject: [PATCH 035/221] continued CFDP state machine --- src/tmtccmd/cfdp/handler.py | 90 ++++++++++++++++++++++++++++--------- src/tmtccmd/cfdp/mib.py | 21 +++++++++ 2 files changed, 91 insertions(+), 20 deletions(-) diff --git a/src/tmtccmd/cfdp/handler.py b/src/tmtccmd/cfdp/handler.py index 2fb45fb0..3992053a 100644 --- a/src/tmtccmd/cfdp/handler.py +++ b/src/tmtccmd/cfdp/handler.py @@ -1,9 +1,11 @@ import enum import os import abc +import struct from typing import Optional, Type, List from .filestore import VirtualFilestore +from .mib import LocalEntityCfg from tmtccmd.utility.tmtc_printer import TmTcPrinter from tmtccmd.utility.logger import get_console_logger from tmtccmd.com_if.com_interface_base import CommunicationInterface @@ -13,6 +15,7 @@ TransmissionModes, ChecksumTypes, SegmentationControl, + Direction, ) from spacepackets.cfdp.tlv import ( FaultHandlerOverrideTlv, @@ -46,15 +49,10 @@ class CfdpIndication(enum.Enum): EOF_RECV = 10 -class CfdpClass(enum.Enum): - UNRELIABLE_CL1 = 0 - RELIABLE_CL2 = 1 - - class PutRequest: destination_id: bytes - source_file_name: str - dest_file_name: str + source_file: str + dest_file: str seg_ctrl: SegmentationControl fault_handler_overrides: Optional[FaultHandlerOverrideTlv] = None flow_label_tlv: Optional[FlowLabelTlv] = None @@ -78,6 +76,10 @@ class BusyError(Exception): pass +class SequenceNumberOverflow(Exception): + pass + + class CfdpUserBase: def __init__(self, vfs: Type[VirtualFilestore]): self.vfs = vfs @@ -90,16 +92,27 @@ def transaction_indication(self, code: CfdpIndication): class CfdpHandler: def __init__( self, + cfg: LocalEntityCfg, com_if: Optional[CommunicationInterface], - cfdp_type: Optional[CfdpClass], cfdp_user: Type[CfdpUserBase], send_interval: float, ): - self.cfdp_type = cfdp_type + """ + + :param cfg: Local entity configuration + :param com_if: Communication interface used to send messages + :param cfdp_user: CFDP user which will receive indication messages and which also contains + the virtual filestore implementation + :param send_interval: + """ + # The ID is going to be constant after initialization, store in separately + self.id = cfg.local_entity_id + self.cfg = cfg self.com_if = com_if self.cfdp_user = cfdp_user self.state = CfdpStates.IDLE self.send_interval = send_interval + self.seq_num = 0 self.__current_put_request: Optional[PutRequest] = None @@ -112,14 +125,58 @@ def com_if(self, com_if: CommunicationInterface): self.__com_if = com_if def state_machine(self): + """Perform the CFDP state machine + + + :raises SequenceNumberOverflow: Overflow of sequence number occured. In this case, the + number will be reset but no operation will occured and the state machine needs + to be called again + """ if self.state != CfdpStates.IDLE: if self.state == CfdpStates.CRC_PROCEDURE: # Skip this step for now self.state = CfdpStates.SENDING_METADATA if self.state == CfdpStates.SENDING_METADATA: + # TODO: CRC flag is derived from remote entity ID configuration + pdu_conf = PduConfig( + seg_ctrl=self.__current_put_request.seg_ctrl, + dest_entity_id=self.__current_put_request.destination_id, + source_entity_id=self.id, + crc_flag=False, + direction=Direction.TOWARDS_RECEIVER, + transaction_seq_num=self.__get_next_seq_num(), + file_size=0, + trans_mode=self.__current_put_request.trans_mode, + ) + self.send_metadata_pdu( + pdu_conf=pdu_conf, + dest_file=self.__current_put_request.dest_file, + source_file=self.__current_put_request.source_file, + ) self.state = CfdpStates.SENDING_FILE_DATA_PDUS pass + def __get_next_seq_num(self) -> bytes: + if self.cfg.length_seq_num == 1: + if self.seq_num == pow(2, 8) - 1: + LOGGER.warning("8-bit transaction sequence number overflowed!") + self.seq_num = 0 + raise SequenceNumberOverflow + self.seq_num += 1 + return bytes([self.seq_num]) + elif self.cfg.length_seq_num == 2: + if self.seq_num == pow(2, 16) - 1: + LOGGER.warning("16-bit transaction sequence number overflowed!") + self.seq_num = 0 + raise SequenceNumberOverflow + return struct.pack("!H", self.seq_num) + elif self.cfg.length_seq_num == 4: + if self.seq_num == pow(2, 32) - 1: + LOGGER.warning("32-bit transaction sequence number overflowed!") + self.seq_num = 0 + raise SequenceNumberOverflow + return struct.pack("!I", self.seq_num) + def pass_packet( self, apid: int, raw_tm_packet: bytearray, tmtc_printer: TmTcPrinter ): @@ -136,24 +193,17 @@ def put_request(self, put_request: PutRequest): def send_metadata_pdu( self, pdu_conf: PduConfig, - file_repository: str, - file_name: str, - dest_repository: str, - dest_name: str, + source_file: str, + dest_file: str, + closure_requested: bool, ): - if self.cfdp_type == CfdpClass.RELIABLE_CL2: - pdu_conf.trans_mode = TransmissionModes.ACKNOWLEDGED - else: - pdu_conf.trans_mode = TransmissionModes.UNACKNOWLEDGED - source_file = os.path.join(file_repository, file_name) - dest_file = os.path.join(dest_repository, dest_name) metadata_pdu = MetadataPdu( pdu_conf=pdu_conf, file_size=0, source_file_name=source_file, dest_file_name=dest_file, checksum_type=ChecksumTypes.NULL_CHECKSUM, - closure_requested=False, + closure_requested=closure_requested, ) data = metadata_pdu.pack() self.com_if.send(data=data) diff --git a/src/tmtccmd/cfdp/mib.py b/src/tmtccmd/cfdp/mib.py index e69de29b..28e4008b 100644 --- a/src/tmtccmd/cfdp/mib.py +++ b/src/tmtccmd/cfdp/mib.py @@ -0,0 +1,21 @@ +from dataclasses import dataclass +from typing import Callable +from spacepackets.cfdp.definitions import FaultHandlerCodes + +# User can specify a function which takes the fault handler code as an argument and returns nothing +FaultHandlerT = Callable[[FaultHandlerCodes]] + + +@dataclass +class LocalEntityCfg: + local_entity_id: bytes + eof_sent_indication_required: bool + eof_recv_indication_required: bool + file_segment_recvd_required: bool + transaction_finished_indication_required: bool + suspended_indication_required: bool + resumed_indication_required: bool + default_fault_handlers: FaultHandlerT + length_seq_num: int = 2 + # I'm just going to assume that 255 possible IDs are sufficient for most applications + length_entity_ids: int = 1 From 2aa8011da9cd37121d94af12eff373023ddd2b6e Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 13 Dec 2021 18:24:44 +0100 Subject: [PATCH 036/221] added byte flow control configuration --- src/tmtccmd/cfdp/handler.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/tmtccmd/cfdp/handler.py b/src/tmtccmd/cfdp/handler.py index 3992053a..c9196e6b 100644 --- a/src/tmtccmd/cfdp/handler.py +++ b/src/tmtccmd/cfdp/handler.py @@ -72,6 +72,11 @@ class CfdpStates(enum.Enum): SEND_ACK_PDU = 6 +class ByteFlowControl: + period: float + max_bytes: int + + class BusyError(Exception): pass @@ -95,7 +100,7 @@ def __init__( cfg: LocalEntityCfg, com_if: Optional[CommunicationInterface], cfdp_user: Type[CfdpUserBase], - send_interval: float, + byte_flow_control: ByteFlowControl ): """ @@ -103,7 +108,9 @@ def __init__( :param com_if: Communication interface used to send messages :param cfdp_user: CFDP user which will receive indication messages and which also contains the virtual filestore implementation - :param send_interval: + :param byte_flow_control: Controls the number of bytes sent in a certain interval + The state machine will only send packets if the maximum number of specified bytes + is not exceeded in the specified time interval """ # The ID is going to be constant after initialization, store in separately self.id = cfg.local_entity_id @@ -138,6 +145,7 @@ def state_machine(self): self.state = CfdpStates.SENDING_METADATA if self.state == CfdpStates.SENDING_METADATA: # TODO: CRC flag is derived from remote entity ID configuration + # TODO: Determine file size and check whether source file is valid pdu_conf = PduConfig( seg_ctrl=self.__current_put_request.seg_ctrl, dest_entity_id=self.__current_put_request.destination_id, From bf86b1b586e77ac45be872b5a78202da6c7193b5 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 13 Dec 2021 18:25:37 +0100 Subject: [PATCH 037/221] storing the byte flow control parameter --- src/tmtccmd/cfdp/handler.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/tmtccmd/cfdp/handler.py b/src/tmtccmd/cfdp/handler.py index c9196e6b..b1aa31fb 100644 --- a/src/tmtccmd/cfdp/handler.py +++ b/src/tmtccmd/cfdp/handler.py @@ -100,7 +100,7 @@ def __init__( cfg: LocalEntityCfg, com_if: Optional[CommunicationInterface], cfdp_user: Type[CfdpUserBase], - byte_flow_control: ByteFlowControl + byte_flow_ctrl: ByteFlowControl ): """ @@ -120,6 +120,7 @@ def __init__( self.state = CfdpStates.IDLE self.send_interval = send_interval self.seq_num = 0 + self.byte_flow_ctrl = byte_flow_ctrl self.__current_put_request: Optional[PutRequest] = None From 0155275ca4cd8ffb19bbc5a306b739d772441bc9 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 13 Jun 2022 11:08:24 +0200 Subject: [PATCH 038/221] some documentation for APID handler --- src/tmtccmd/ccsds/handler.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/tmtccmd/ccsds/handler.py b/src/tmtccmd/ccsds/handler.py index c26982e3..fbfcea09 100644 --- a/src/tmtccmd/ccsds/handler.py +++ b/src/tmtccmd/ccsds/handler.py @@ -12,6 +12,9 @@ class ApidHandler: + """Handler function for space packets with an APID. The APID will be passed to the + CCSDS callback as the first argument. The raw packets will be passed as the second argument + and the user arguments will be passed as a third argument""" def __init__(self, cb: CcsdsCallbackT, queue_len: int, user_args: any): self.callback: CcsdsCallbackT = cb self.queue_len: int = queue_len From c1dc9d8a258d57ecab2dd5c088a62e28f2a3f177 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 13 Jun 2022 11:35:02 +0200 Subject: [PATCH 039/221] added back test dependency --- setup.cfg | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/setup.cfg b/setup.cfg index 978c6bad..bfbdd3e2 100644 --- a/setup.cfg +++ b/setup.cfg @@ -34,7 +34,6 @@ install_requires = dle-encoder>=0.2 spacepackets>=0.8.1 prompt-toolkit>=3.0.28 ->>>>>>> source package_dir = = src packages = find: @@ -47,6 +46,8 @@ where = src gui = PyQt5>=5.15.6 PyQt5-stubs>=5.15.0 +test = + pyfakefs>=4.5.3 [flake8] max-line-length = 100 From bf50be2442a5a69dc2f07e327f5498f3f72900cb Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 13 Jun 2022 11:37:23 +0200 Subject: [PATCH 040/221] smaller fixes --- src/tmtccmd/utility/hammingcode.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/tmtccmd/utility/hammingcode.py b/src/tmtccmd/utility/hammingcode.py index e26f5f76..7dcafadd 100644 --- a/src/tmtccmd/utility/hammingcode.py +++ b/src/tmtccmd/utility/hammingcode.py @@ -3,7 +3,8 @@ Documentation: https://en.wikipedia.org/wiki/Hamming_code They can be used to identify up to two bit errors and correct one bit error per 256 byte block. """ - +from enum import Enum +from tmtccmd.logging import get_console_logger # Translated from ATMEL C library. # /* ---------------------------------------------------------------------------- # * ATMEL Microcontroller Software Support @@ -33,20 +34,18 @@ # * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # * ---------------------------------------------------------------------------- # */ -from enum import Enum -from tmtccmd.utility.logger import get_console_logger LOGGER = get_console_logger() class HammingReturnCodes(Enum): # No bit flips - CODE_OKAY = (0,) + CODE_OKAY = 0 # Single bit flip which can be corrected - ERROR_SINGLE_BIT = (1,) + ERROR_SINGLE_BIT = 1 # Error in the hamming code - ERROR_ECC = (2,) + ERROR_ECC = 2 # Multi bit error which can not be corrected ERROR_MULTI_BIT = 3 # Invalid input From 3c640b2007d4550d45a8c2dd2971cf7aa55df6a0 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 13 Jun 2022 11:55:51 +0200 Subject: [PATCH 041/221] some fixes --- src/tmtccmd/ccsds/handler.py | 12 ++++-------- src/tmtccmd/cfdp/handler.py | 13 ++++--------- src/tmtccmd/cfdp/mib.py | 2 +- src/tmtccmd/com_if/tcpip_tcp_com_if.py | 2 +- src/tmtccmd/utility/hammingcode.py | 1 + 5 files changed, 11 insertions(+), 19 deletions(-) diff --git a/src/tmtccmd/ccsds/handler.py b/src/tmtccmd/ccsds/handler.py index 53980301..1645ed2f 100644 --- a/src/tmtccmd/ccsds/handler.py +++ b/src/tmtccmd/ccsds/handler.py @@ -16,6 +16,7 @@ class ApidHandler: """Handler function for space packets with an APID. The APID will be passed to the CCSDS callback as the first argument. The raw packets will be passed as the second argument and the user arguments will be passed as a third argument""" + def __init__(self, cb: CcsdsCallbackT, queue_len: int, user_args: any): self.callback: CcsdsCallbackT = cb self.queue_len: int = queue_len @@ -42,16 +43,11 @@ def add_tm_handler(self, apid: int, handler: ApidHandler): """ self._handler_dict[apid] = handler - def add_cfdp_handler( - self, apid: int, cfdp_handler: CfdpHandler, max_queue_len: int - ): - self._handler_dict[apid] = cfdp_handler.pass_packet, max_queue_len - def get_apid_queue_len_list(self) -> List[Tuple[int, int]]: - list = [] + apid_queue_len_list = [] for apid, handler_value in self._handler_dict.items(): - list.append((apid, handler_value.queue_len)) - return list + apid_queue_len_list.append((apid, handler_value.queue_len)) + return apid_queue_len_list def handle_packet_queues(self, packet_queue_list: QueueListT): for queue_tuple in packet_queue_list: diff --git a/src/tmtccmd/cfdp/handler.py b/src/tmtccmd/cfdp/handler.py index b1aa31fb..5bd8ad24 100644 --- a/src/tmtccmd/cfdp/handler.py +++ b/src/tmtccmd/cfdp/handler.py @@ -1,13 +1,11 @@ import enum -import os import abc import struct -from typing import Optional, Type, List +from typing import Optional, Type, List, Any from .filestore import VirtualFilestore from .mib import LocalEntityCfg -from tmtccmd.utility.tmtc_printer import TmTcPrinter -from tmtccmd.utility.logger import get_console_logger +from tmtccmd.logging import get_console_logger from tmtccmd.com_if.com_interface_base import CommunicationInterface from spacepackets.cfdp.pdu.metadata import MetadataPdu from spacepackets.cfdp.conf import PduConfig @@ -100,7 +98,7 @@ def __init__( cfg: LocalEntityCfg, com_if: Optional[CommunicationInterface], cfdp_user: Type[CfdpUserBase], - byte_flow_ctrl: ByteFlowControl + byte_flow_ctrl: ByteFlowControl, ): """ @@ -118,7 +116,6 @@ def __init__( self.com_if = com_if self.cfdp_user = cfdp_user self.state = CfdpStates.IDLE - self.send_interval = send_interval self.seq_num = 0 self.byte_flow_ctrl = byte_flow_ctrl @@ -186,9 +183,7 @@ def __get_next_seq_num(self) -> bytes: raise SequenceNumberOverflow return struct.pack("!I", self.seq_num) - def pass_packet( - self, apid: int, raw_tm_packet: bytearray, tmtc_printer: TmTcPrinter - ): + def pass_packet(self, apid: int, raw_tm_packet: bytearray, args: Any): pass def put_request(self, put_request: PutRequest): diff --git a/src/tmtccmd/cfdp/mib.py b/src/tmtccmd/cfdp/mib.py index 28e4008b..bf32a9be 100644 --- a/src/tmtccmd/cfdp/mib.py +++ b/src/tmtccmd/cfdp/mib.py @@ -3,7 +3,7 @@ from spacepackets.cfdp.definitions import FaultHandlerCodes # User can specify a function which takes the fault handler code as an argument and returns nothing -FaultHandlerT = Callable[[FaultHandlerCodes]] +FaultHandlerT = Callable[[FaultHandlerCodes], None] @dataclass diff --git a/src/tmtccmd/com_if/tcpip_tcp_com_if.py b/src/tmtccmd/com_if/tcpip_tcp_com_if.py index d410430f..17089bfd 100644 --- a/src/tmtccmd/com_if/tcpip_tcp_com_if.py +++ b/src/tmtccmd/com_if/tcpip_tcp_com_if.py @@ -170,7 +170,7 @@ def __receive_tm_packets(self): ready = select.select([self.__tcp_socket], [], [], 0) if ready[0]: bytes_recvd = self.__tcp_socket.recv(self.max_recv_size) - if bytes_recvd == b'': + if bytes_recvd == b"": self.__close_tcp_socket() LOGGER.info("TCP server has been closed") return diff --git a/src/tmtccmd/utility/hammingcode.py b/src/tmtccmd/utility/hammingcode.py index 7dcafadd..dc60eabb 100644 --- a/src/tmtccmd/utility/hammingcode.py +++ b/src/tmtccmd/utility/hammingcode.py @@ -5,6 +5,7 @@ """ from enum import Enum from tmtccmd.logging import get_console_logger + # Translated from ATMEL C library. # /* ---------------------------------------------------------------------------- # * ATMEL Microcontroller Software Support From 900e9c7f615fbf73755b024c071c42999994cf0a Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 13 Jun 2022 12:05:57 +0200 Subject: [PATCH 042/221] some minor fixes --- src/tmtccmd/cfdp/handler.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/tmtccmd/cfdp/handler.py b/src/tmtccmd/cfdp/handler.py index 5bd8ad24..16871bfd 100644 --- a/src/tmtccmd/cfdp/handler.py +++ b/src/tmtccmd/cfdp/handler.py @@ -97,7 +97,7 @@ def __init__( self, cfg: LocalEntityCfg, com_if: Optional[CommunicationInterface], - cfdp_user: Type[CfdpUserBase], + cfdp_user: CfdpUserBase, byte_flow_ctrl: ByteFlowControl, ): """ @@ -106,7 +106,7 @@ def __init__( :param com_if: Communication interface used to send messages :param cfdp_user: CFDP user which will receive indication messages and which also contains the virtual filestore implementation - :param byte_flow_control: Controls the number of bytes sent in a certain interval + :param byte_flow_ctrl: Controls the number of bytes sent in a certain interval The state machine will only send packets if the maximum number of specified bytes is not exceeded in the specified time interval """ From 06324101006f38abca9aacd7872e102a66172297 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 13 Jun 2022 12:08:24 +0200 Subject: [PATCH 043/221] include fix --- src/tmtccmd/cfdp/filestore.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/tmtccmd/cfdp/filestore.py b/src/tmtccmd/cfdp/filestore.py index bc8eb865..2179af09 100644 --- a/src/tmtccmd/cfdp/filestore.py +++ b/src/tmtccmd/cfdp/filestore.py @@ -3,7 +3,7 @@ import shutil import platform -from tmtccmd.utility.logger import get_console_logger +from tmtccmd.logging import get_console_logger from spacepackets.cfdp.tlv import FilestoreResponseStatusCode LOGGER = get_console_logger() @@ -94,7 +94,7 @@ def append_data_to_file( file_size = os.path.getsize(file_path) if offset > file_size: return FilestoreResponseStatusCode.APPEND_FROM_DATA_INVALID_OFFSET - file.seek(offset=offset) + file.seek(offset) file.write(data) file.close() return FilestoreResponseStatusCode.SUCCESS From d3f9bbf993efaef70b1aaa163d48926e8e8737be Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 13 Jun 2022 14:01:50 +0200 Subject: [PATCH 044/221] some minor improvements --- src/tmtccmd/cfdp/handler.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/tmtccmd/cfdp/handler.py b/src/tmtccmd/cfdp/handler.py index 16871bfd..8c33003e 100644 --- a/src/tmtccmd/cfdp/handler.py +++ b/src/tmtccmd/cfdp/handler.py @@ -84,7 +84,7 @@ class SequenceNumberOverflow(Exception): class CfdpUserBase: - def __init__(self, vfs: Type[VirtualFilestore]): + def __init__(self, vfs: VirtualFilestore): self.vfs = vfs @abc.abstractmethod @@ -183,7 +183,7 @@ def __get_next_seq_num(self) -> bytes: raise SequenceNumberOverflow return struct.pack("!I", self.seq_num) - def pass_packet(self, apid: int, raw_tm_packet: bytearray, args: Any): + def pass_packet(self, apid: int, raw_tm_packet: bytes, args: Any): pass def put_request(self, put_request: PutRequest): From dc56d4f77135ddb9eb913d28e0012581fe1b9a6b Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 13 Jun 2022 16:24:07 +0200 Subject: [PATCH 045/221] some improvements --- src/tmtccmd/cfdp/handler.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/tmtccmd/cfdp/handler.py b/src/tmtccmd/cfdp/handler.py index 8c33003e..f1f71127 100644 --- a/src/tmtccmd/cfdp/handler.py +++ b/src/tmtccmd/cfdp/handler.py @@ -13,7 +13,7 @@ TransmissionModes, ChecksumTypes, SegmentationControl, - Direction, + Direction, CrcFlag, FileSize, ) from spacepackets.cfdp.tlv import ( FaultHandlerOverrideTlv, @@ -148,16 +148,17 @@ def state_machine(self): seg_ctrl=self.__current_put_request.seg_ctrl, dest_entity_id=self.__current_put_request.destination_id, source_entity_id=self.id, - crc_flag=False, + crc_flag=CrcFlag.GLOBAL_CONFIG, direction=Direction.TOWARDS_RECEIVER, transaction_seq_num=self.__get_next_seq_num(), - file_size=0, + file_size=FileSize.GLOBAL_CONFIG, trans_mode=self.__current_put_request.trans_mode, ) self.send_metadata_pdu( pdu_conf=pdu_conf, dest_file=self.__current_put_request.dest_file, source_file=self.__current_put_request.source_file, + closure_requested=False ) self.state = CfdpStates.SENDING_FILE_DATA_PDUS pass From 8d3dd1bf533be030b8fdc5decaa526f5a1bc5882 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Wed, 15 Jun 2022 13:55:52 +0200 Subject: [PATCH 046/221] add proper CFDP subparser --- src/tmtccmd/cfdp/handler.py | 6 ++-- src/tmtccmd/config/args.py | 49 +++++++++++++++---------------- src/tmtccmd/config/definitions.py | 1 + 3 files changed, 29 insertions(+), 27 deletions(-) diff --git a/src/tmtccmd/cfdp/handler.py b/src/tmtccmd/cfdp/handler.py index f1f71127..50134497 100644 --- a/src/tmtccmd/cfdp/handler.py +++ b/src/tmtccmd/cfdp/handler.py @@ -13,7 +13,9 @@ TransmissionModes, ChecksumTypes, SegmentationControl, - Direction, CrcFlag, FileSize, + Direction, + CrcFlag, + FileSize, ) from spacepackets.cfdp.tlv import ( FaultHandlerOverrideTlv, @@ -158,7 +160,7 @@ def state_machine(self): pdu_conf=pdu_conf, dest_file=self.__current_put_request.dest_file, source_file=self.__current_put_request.source_file, - closure_requested=False + closure_requested=False, ) self.state = CfdpStates.SENDING_FILE_DATA_PDUS pass diff --git a/src/tmtccmd/config/args.py b/src/tmtccmd/config/args.py index f169ba4f..c4b7e5a1 100644 --- a/src/tmtccmd/config/args.py +++ b/src/tmtccmd/config/args.py @@ -27,11 +27,7 @@ def get_default_descript_txt() -> str: return ( f"{AnsiColors.GREEN}TMTC Client Command Line Interface\n" f"{AnsiColors.RESET}This application provides generic components to execute " - f"TMTC commanding.\n" - f"The developer is expected to specify the packaged telecommands for a given\n" - "service and operation code combination. The developer is also expected\n" - "to implement the handling of telemetry. All these tasks can be done by implementing\n" - "a hook object and passing it to the core." + f"TMTC commanding\n" ) @@ -49,6 +45,7 @@ def add_default_tmtccmd_args(parser: argparse.ArgumentParser): add_default_mode_arguments(parser) add_default_com_if_arguments(parser) add_generic_arguments(parser) + add_cfdp_parser(parser) add_ethernet_arguments(parser) @@ -116,6 +113,27 @@ def parse_default_input_arguments( return args +def add_cfdp_parser(arg_parser: argparse.ArgumentParser): + subparsers = arg_parser.add_subparsers( + title="CFDP", + description="CCSDS File Delivery Protocol commands", + help="CCDSDS File Delivery Commands", + dest="cfdp", + ) + cfdp = subparsers.add_parser("cfdp") + cfdp.add_argument("-p", "--proxy") + cfdp.add_argument( + "-f", "--file", dest="cfdp_file", help="CFDP target file", default=None + ) + cfdp.add_argument( + "-d", + "--dest", + dest="cfdp_dest", + help="CFDP file destination path", + default=None, + ) + + def add_generic_arguments(arg_parser: argparse.ArgumentParser): arg_parser.add_argument( "-s", "--service", type=str, help="Service to test", default=None @@ -133,20 +151,6 @@ def add_generic_arguments(arg_parser: argparse.ArgumentParser): action="store_true", default=None, ) - arg_parser.add_argument( - "--sf", "--source_file", help="Source file for CFDP transactions" - ) - arg_parser.add_argument( - "--df", "--dest_file", help="Destination file for CFDP transactions" - ) - arg_parser.add_argument( - "-p", - "--proxy", - action="store_true", - help="CFDP proxy put operation. Can be used to request files from the remote entity. " - "The destination file should then be the file path on the sender side while the " - "source file should be the remote file to download.", - ) arg_parser.add_argument( "-t", "--tm_timeout", @@ -178,11 +182,6 @@ def add_default_mode_arguments(arg_parser: argparse.ArgumentParser): f"{CoreModeStrings[CoreModeList.SEQUENTIAL_CMD_MODE]}: " f"Sequential Command Mode\n" ) - cfdp_help = ( - f"{CoreModeList.CFDP_MODE} or " - f"{CoreModeStrings[CoreModeList.CFDP_MODE]}: " - f"GUI mode\n" - ) listener_help = ( f"{CoreModeList.LISTENER_MODE} or {CoreModeStrings[CoreModeList.LISTENER_MODE]}: " f"Listener Mode\n" @@ -192,7 +191,7 @@ def add_default_mode_arguments(arg_parser: argparse.ArgumentParser): f"{CoreModeStrings[CoreModeList.GUI_MODE]}: " f"GUI mode\n" ) - help_text += seq_help + cfdp_help + listener_help + gui_help + help_text += seq_help + listener_help + gui_help arg_parser.add_argument( "-m", "--mode", diff --git a/src/tmtccmd/config/definitions.py b/src/tmtccmd/config/definitions.py index a101fa08..cf1a2777 100644 --- a/src/tmtccmd/config/definitions.py +++ b/src/tmtccmd/config/definitions.py @@ -155,6 +155,7 @@ class CoreModeList(enum.IntEnum): CONTINUOUS_MODE = ( 7 # will start a daemon handling tm and return after sending one tc ) + CFDP_MODE = 8 CoreModeStrings = { From c4b71f4e09f94ce61c7e0ea3e7ffc87cc59f91a1 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Wed, 15 Jun 2022 14:05:13 +0200 Subject: [PATCH 047/221] reduce duplicate code --- src/tmtccmd/core/backend.py | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/src/tmtccmd/core/backend.py b/src/tmtccmd/core/backend.py index c646bca5..e520e52a 100644 --- a/src/tmtccmd/core/backend.py +++ b/src/tmtccmd/core/backend.py @@ -7,6 +7,7 @@ from typing import Union, cast, Optional, Tuple from tmtccmd.config.definitions import CoreServiceList, CoreModeList +from tmtccmd.tc.definitions import TcQueueT from tmtccmd.tm.definitions import TmTypes from tmtccmd.tm.handler import TmHandler from tmtccmd.logging import get_console_logger @@ -263,14 +264,8 @@ def __handle_action(self): ) self.__tm_listener.clear_reply_event() elif self.mode == CoreModeList.SEQUENTIAL_CMD_MODE: - service_queue = deque() - service_queue_packer = ServiceQueuePacker() - service_queue_packer.pack_service_queue_core( - service=self.__service, - service_queue=service_queue, - op_code=self.__op_code, - ) - if not self.__com_if.valid: + service_queue = self.__prepare_tc_queue() + if service_queue is None: return LOGGER.info("Performing sequential command operation") sender_and_receiver = SequentialCommandSenderReceiver( @@ -284,14 +279,8 @@ def __handle_action(self): sender_and_receiver.send_queue_tc_and_receive_tm_sequentially() self.mode = CoreModeList.LISTENER_MODE elif self.mode == CoreModeList.CONTINUOUS_MODE: - service_queue = deque() - service_queue_packer = ServiceQueuePacker() - service_queue_packer.pack_service_queue_core( - service=self.__service, - service_queue=service_queue, - op_code=self.__op_code, - ) - if not self.__com_if.valid: + service_queue = self.__prepare_tc_queue() + if service_queue is None: return LOGGER.info("Performing service command operation") self.daemon_receiver.set_tc_queue(service_queue) @@ -317,3 +306,15 @@ def __core_operation(self, one_shot: bool): time.sleep(1) else: self.__handle_action() + + def __prepare_tc_queue(self) -> Optional[TcQueueT]: + service_queue = deque() + service_queue_packer = ServiceQueuePacker() + service_queue_packer.pack_service_queue_core( + service=self.__service, + service_queue=service_queue, + op_code=self.__op_code, + ) + if not self.__com_if.valid: + return None + return service_queue From 63fcafdc7dbc94ab6eaeb5e65a5fb1141938f568 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Wed, 15 Jun 2022 14:16:27 +0200 Subject: [PATCH 048/221] pass hook object explicitely --- src/tmtccmd/config/hook.py | 2 +- src/tmtccmd/core/backend.py | 31 +++++++++---------------------- src/tmtccmd/core/base.py | 18 ++++++++++++++++++ src/tmtccmd/runner.py | 12 ++++-------- 4 files changed, 32 insertions(+), 31 deletions(-) create mode 100644 src/tmtccmd/core/base.py diff --git a/src/tmtccmd/config/hook.py b/src/tmtccmd/config/hook.py index 8bf52dcd..99e9a9fc 100644 --- a/src/tmtccmd/config/hook.py +++ b/src/tmtccmd/config/hook.py @@ -9,7 +9,7 @@ from tmtccmd.logging import get_console_logger from tmtccmd.utility.retval import RetvalDictT from tmtccmd.utility.obj_id import ObjectIdDictT -from tmtccmd.core.backend import BackendBase +from tmtccmd.core.base import BackendBase from tmtccmd.tc.definitions import TcQueueT from tmtccmd.com_if.com_interface_base import CommunicationInterface diff --git a/src/tmtccmd/core/backend.py b/src/tmtccmd/core/backend.py index e520e52a..b1f33931 100644 --- a/src/tmtccmd/core/backend.py +++ b/src/tmtccmd/core/backend.py @@ -2,11 +2,12 @@ import time import sys from threading import Thread -from abc import abstractmethod from collections import deque from typing import Union, cast, Optional, Tuple +from tmtccmd.config.hook import TmTcHookBase from tmtccmd.config.definitions import CoreServiceList, CoreModeList +from tmtccmd.core.base import BackendBase from tmtccmd.tc.definitions import TcQueueT from tmtccmd.tm.definitions import TmTypes from tmtccmd.tm.handler import TmHandler @@ -24,23 +25,6 @@ LOGGER = get_console_logger() -class BackendBase: - @abstractmethod - def initialize(self): - """Initialize the backend. Raise RuntimeError or ValueError on failure""" - - @abstractmethod - def start_listener(self): - """Start the backend. Raise RuntimeError on failure""" - - @abstractmethod - def set_mode(self, mode: int): - """Set backend mode - :param mode: - :return: - """ - - class TmTcHandler(BackendBase): """This is the primary class which handles TMTC reception. This can be seen as the backend in case a GUI or front-end is implemented. @@ -48,6 +32,7 @@ class TmTcHandler(BackendBase): def __init__( self, + hook_obj: TmTcHookBase, com_if: CommunicationInterface, tm_listener: TmListener, tm_handler: TmHandler, @@ -57,6 +42,7 @@ def __init__( ): self.mode = init_mode self.com_if_key = com_if.get_id() + self.__hook_obj = hook_obj self.__com_if_active = False self.__service = init_service self.__op_code = init_opcode @@ -147,6 +133,7 @@ def set_current_apid(self, apid: int): @staticmethod def prepare_tmtc_handler_start( + hook_obj: TmTcHookBase, com_if: CommunicationInterface, tm_listener: TmListener, tm_handler: TmHandler, @@ -157,6 +144,7 @@ def prepare_tmtc_handler_start( from multiprocessing import Process tmtc_handler = TmTcHandler( + hook_obj=hook_obj, com_if=com_if, tm_listener=tm_listener, init_mode=init_mode, @@ -287,10 +275,9 @@ def __handle_action(self): self.daemon_receiver.send_queue_tc_and_return() else: try: - from tmtccmd.config.hook import get_global_hook_obj - - hook_obj = get_global_hook_obj() - hook_obj.perform_mode_operation(mode=self.mode, tmtc_backend=self) + self.__hook_obj.perform_mode_operation( + mode=self.mode, tmtc_backend=self + ) except ImportError as error: print(error) LOGGER.error("Custom mode handling module not provided!") diff --git a/src/tmtccmd/core/base.py b/src/tmtccmd/core/base.py new file mode 100644 index 00000000..40e1956c --- /dev/null +++ b/src/tmtccmd/core/base.py @@ -0,0 +1,18 @@ +from abc import abstractmethod + + +class BackendBase: + @abstractmethod + def initialize(self): + """Initialize the backend. Raise RuntimeError or ValueError on failure""" + + @abstractmethod + def start_listener(self, perform_op_immediately: bool): + """Start the backend. Raise RuntimeError on failure""" + + @abstractmethod + def set_mode(self, mode: int): + """Set backend mode + :param mode: + :return: + """ diff --git a/src/tmtccmd/runner.py b/src/tmtccmd/runner.py index 566426e3..efb98e53 100644 --- a/src/tmtccmd/runner.py +++ b/src/tmtccmd/runner.py @@ -1,7 +1,7 @@ """Contains core methods called by entry point files to setup and start a tmtccmd application""" import sys import os -from typing import Union +from typing import Union, cast from spacepackets.ecss.conf import get_default_tc_apid @@ -112,11 +112,6 @@ def __assign_tmtc_commander_hooks(hook_object: TmTcHookBase): raise ValueError # Insert hook object handle into global dictionary so it can be used by the TMTC commander update_global(CoreGlobalIds.TMTC_HOOK, hook_object) - # TODO: Maybe this is not required anymore.. - # Set core object IDs - # insert_object_ids(get_core_object_ids()) - # Set object IDs specified by the user. - # insert_object_ids(hook_object.get_object_ids()) def init_printout(use_gui: bool, ansi_colors: bool = True): @@ -160,15 +155,15 @@ def __start_tmtc_commander_qt_gui( if not __SETUP_WAS_CALLED: LOGGER.warning("setup_tmtccmd was not called first. Call it first") sys.exit(1) - app = None app = QApplication([app_name]) if tmtc_frontend is None: from tmtccmd.core.frontend import TmTcFrontend from tmtccmd.config.hook import get_global_hook_obj + from tmtccmd.core.backend import TmTcHandler tmtc_frontend = TmTcFrontend( hook_obj=get_global_hook_obj(), - tmtc_backend=tmtc_backend, + tmtc_backend=cast(TmTcHandler, tmtc_backend), app_name=app_name, ) tmtc_frontend.start(app) @@ -217,6 +212,7 @@ def create_default_tmtc_backend(setup_args: SetupArgs, tm_handler: TmHandler): tm_listener = TmListener(com_if=com_if, seq_timeout=tm_timeout) # The global variables are set by the argument parser. tmtc_backend = TmTcHandler( + hook_obj=setup_args.hook_obj, com_if=com_if, tm_listener=tm_listener, init_mode=mode, From 6b55f470af3400b192e45cb7c8214da2a1dd5547 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Wed, 15 Jun 2022 15:05:22 +0200 Subject: [PATCH 049/221] use abstract function in ApidHandler instead of callback --- examples/config/hook_implementation.py | 4 ++-- examples/tmtccli.py | 4 ++-- examples/tmtcgui.py | 4 ++-- src/tests/hook_obj_mock.py | 4 ++-- src/tmtccmd/ccsds/handler.py | 32 +++++++++++++------------- src/tmtccmd/config/definitions.py | 12 ++++++---- src/tmtccmd/config/hook.py | 8 +++++-- src/tmtccmd/core/backend.py | 4 +--- src/tmtccmd/tc/packer.py | 2 +- 9 files changed, 39 insertions(+), 35 deletions(-) diff --git a/examples/config/hook_implementation.py b/examples/config/hook_implementation.py index d9bda02d..49f6ac32 100644 --- a/examples/config/hook_implementation.py +++ b/examples/config/hook_implementation.py @@ -33,13 +33,13 @@ def perform_mode_operation(self, tmtc_backend: TmTcHandler, mode: int): pass def pack_service_queue( - self, service: Union[str, int], op_code: str, service_queue: TcQueueT + self, service: Union[str, int], op_code: str, tc_queue: TcQueueT ): from tmtccmd.tc.packer import default_service_queue_preparation LOGGER.info("Service queue packer hook was called") default_service_queue_preparation( - service=service, op_code=op_code, service_queue=service_queue + service=service, op_code=op_code, service_queue=tc_queue ) def get_object_ids(self) -> ObjectIdDictT: diff --git a/examples/tmtccli.py b/examples/tmtccli.py index e24da7f1..17089eae 100755 --- a/examples/tmtccli.py +++ b/examples/tmtccli.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 """Example application for the TMTC Commander""" import tmtccmd.runner -from tmtccmd.ccsds.handler import CcsdsTmHandler, ApidHandler +from tmtccmd.ccsds.handler import CcsdsTmHandler, ApidTmHandlerBase from tmtccmd.config import SetupArgs, default_json_path from tmtccmd.config.args import ( create_default_args_parser, @@ -24,7 +24,7 @@ def main(): add_default_tmtccmd_args(arg_parser) args = parse_default_input_arguments(arg_parser, hook_obj) setup_args = SetupArgs(hook_obj=hook_obj, use_gui=False, apid=APID, cli_args=args) - apid_handler = ApidHandler( + apid_handler = ApidTmHandlerBase( cb=default_ccsds_packet_handler, queue_len=50, user_args=None ) ccsds_handler = CcsdsTmHandler() diff --git a/examples/tmtcgui.py b/examples/tmtcgui.py index 426b9cae..8f8ec94b 100755 --- a/examples/tmtcgui.py +++ b/examples/tmtcgui.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 """Example application for the TMTC Commander""" import tmtccmd.runner as runner -from tmtccmd.ccsds.handler import CcsdsTmHandler, ApidHandler +from tmtccmd.ccsds.handler import CcsdsTmHandler, ApidTmHandlerBase from tmtccmd.config import SetupArgs, default_json_path from tmtccmd.logging import get_console_logger @@ -16,7 +16,7 @@ def main(): runner.init_printout(True) hook_obj = ExampleHookClass(json_cfg_path=default_json_path()) setup_args = SetupArgs(hook_obj=hook_obj, use_gui=True, apid=APID, cli_args=None) - apid_handler = ApidHandler( + apid_handler = ApidTmHandlerBase( cb=default_ccsds_packet_handler, queue_len=50, user_args=None ) ccsds_handler = CcsdsTmHandler() diff --git a/src/tests/hook_obj_mock.py b/src/tests/hook_obj_mock.py index ccb6c27a..012b12eb 100644 --- a/src/tests/hook_obj_mock.py +++ b/src/tests/hook_obj_mock.py @@ -121,14 +121,14 @@ def perform_mode_operation(self, tmtc_backend: TmTcHandler, mode: int): @abstractmethod def pack_service_queue( - self, service: Union[int, str], op_code: str, service_queue: TcQueueT + self, service: Union[int, str], op_code: str, tc_queue: TcQueueT ): """Overriding this function allows the user to package a telecommand queue for a given service and operation code combination. :param service: :param op_code: - :param service_queue: + :param tc_queue: :return: """ pass diff --git a/src/tmtccmd/ccsds/handler.py b/src/tmtccmd/ccsds/handler.py index 1645ed2f..31f9df19 100644 --- a/src/tmtccmd/ccsds/handler.py +++ b/src/tmtccmd/ccsds/handler.py @@ -1,3 +1,4 @@ +import abc from typing import Callable, Dict, Optional, Tuple, List, Type, Any from tmtccmd.tm.handler import TmHandler @@ -12,18 +13,20 @@ CcsdsCallbackT = Callable[[int, bytes, Any], None] -class ApidHandler: - """Handler function for space packets with an APID. The APID will be passed to the - CCSDS callback as the first argument. The raw packets will be passed as the second argument - and the user arguments will be passed as a third argument""" +class ApidTmHandlerBase: + """Handler base for space packets with an APID. If a packet is received for a certain APID, + the :py:func:`handle_tm_for_apid` function will be called""" - def __init__(self, cb: CcsdsCallbackT, queue_len: int, user_args: any): - self.callback: CcsdsCallbackT = cb + def __init__(self, queue_len: int, user_args: any): self.queue_len: int = queue_len self.user_args: any = user_args + @abc.abstractmethod + def handle_tm_for_apid(self, apid: int, packet: bytes, user_args: any): + pass -HandlerDictT = Dict[int, ApidHandler] + +HandlerDictT = Dict[int, ApidTmHandlerBase] class CcsdsTmHandler(TmHandler): @@ -34,7 +37,7 @@ def __init__(self): super().__init__(tm_type=TmTypes.CCSDS_SPACE_PACKETS) self._handler_dict: HandlerDictT = dict() - def add_tm_handler(self, apid: int, handler: ApidHandler): + def add_tm_handler(self, apid: int, handler: ApidTmHandlerBase): """Add a TM handler for a certain APID. The handler is a callback function which will be called if telemetry with that APID arrives :param apid: CCSDS Application Process ID @@ -57,17 +60,14 @@ def handle_packet_queues(self, packet_queue_list: QueueListT): self.handle_ccsds_packet_queue( tm_queue=queue_tuple[1], apid=apid, handler=handler_obj ) + else: + LOGGER.warning(f"No valid handler for TM with APID {apid} found") + @staticmethod def handle_ccsds_packet_queue( - self, tm_queue: TelemetryQueueT, apid: int, - handler: Optional[ApidHandler] = None, + handler: ApidTmHandlerBase, ): - if handler is None: - handler = self._handler_dict.get(apid) for tm_packet in tm_queue: - if handler is not None: - handler.callback(apid, tm_packet, handler.user_args) - else: - LOGGER.warning(f"No valid handler for TM with APID {apid} found") + handler.handle_tm_for_apid(apid, tm_packet, handler.user_args) diff --git a/src/tmtccmd/config/definitions.py b/src/tmtccmd/config/definitions.py index cf1a2777..6d5b6c90 100644 --- a/src/tmtccmd/config/definitions.py +++ b/src/tmtccmd/config/definitions.py @@ -151,17 +151,19 @@ class CoreModeList(enum.IntEnum): LISTENER_MODE = 1 GUI_MODE = 2 IDLE = 5 - PROMPT_MODE = 6 - CONTINUOUS_MODE = ( - 7 # will start a daemon handling tm and return after sending one tc - ) - CFDP_MODE = 8 + # will start a daemon handling tm and return after sending one tc + CONTINUOUS_MODE = 7 + # The user can interactively specify the next queue to send and when to exit or switch + # to listener mode + FEEDBACK_MODE = 8 CoreModeStrings = { CoreModeList.SEQUENTIAL_CMD_MODE: "seqcmd", CoreModeList.LISTENER_MODE: "listener", CoreModeList.GUI_MODE: "gui", + CoreModeList.CONTINUOUS_MODE: "continuous", + CoreModeList.FEEDBACK_MODE: "feedback", } diff --git a/src/tmtccmd/config/hook.py b/src/tmtccmd/config/hook.py index 99e9a9fc..1d955e04 100644 --- a/src/tmtccmd/config/hook.py +++ b/src/tmtccmd/config/hook.py @@ -74,18 +74,22 @@ def perform_mode_operation(self, tmtc_backend: BackendBase, mode: int): @abstractmethod def pack_service_queue( - self, service: Union[int, str], op_code: str, service_queue: TcQueueT + self, service: Union[int, str], op_code: str, tc_queue: TcQueueT ): """Overriding this function allows the user to package a telecommand queue for a given service and operation code combination. :param service: :param op_code: - :param service_queue: + :param tc_queue: :return: """ pass + def feedback_handler(self, com_if: CommunicationInterface, tc_queue: TcQueueT): + """This function will be called""" + pass + def get_retval_dict(self) -> RetvalDictT: LOGGER.info("No return value dictionary specified") return dict() diff --git a/src/tmtccmd/core/backend.py b/src/tmtccmd/core/backend.py index b1f33931..9fa90e40 100644 --- a/src/tmtccmd/core/backend.py +++ b/src/tmtccmd/core/backend.py @@ -26,9 +26,7 @@ class TmTcHandler(BackendBase): - """This is the primary class which handles TMTC reception. This can be seen as the backend - in case a GUI or front-end is implemented. - """ + """This is the primary class which handles TMTC reception and sending""" def __init__( self, diff --git a/src/tmtccmd/tc/packer.py b/src/tmtccmd/tc/packer.py index 895281cc..b6aff100 100644 --- a/src/tmtccmd/tc/packer.py +++ b/src/tmtccmd/tc/packer.py @@ -30,7 +30,7 @@ def pack_service_queue_core(service: int, op_code: str, service_queue: TcQueueT) hook_obj = get_global_hook_obj() hook_obj.pack_service_queue( - service=service, op_code=op_code, service_queue=service_queue + service=service, op_code=op_code, tc_queue=service_queue ) except ImportError: LOGGER.exception( From 5cfb62d648a318fb1f8bea3e23af31831ab094ae Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Wed, 15 Jun 2022 15:13:52 +0200 Subject: [PATCH 050/221] some smaller fixes --- src/tmtccmd/ccsds/handler.py | 25 ++++++++++--------- .../sendreceive/sequential_sender_receiver.py | 4 +-- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/src/tmtccmd/ccsds/handler.py b/src/tmtccmd/ccsds/handler.py index 31f9df19..a60a582e 100644 --- a/src/tmtccmd/ccsds/handler.py +++ b/src/tmtccmd/ccsds/handler.py @@ -55,19 +55,20 @@ def get_apid_queue_len_list(self) -> List[Tuple[int, int]]: def handle_packet_queues(self, packet_queue_list: QueueListT): for queue_tuple in packet_queue_list: apid = queue_tuple[0] - handler_obj = self._handler_dict.get(apid) - if handler_obj is not None: - self.handle_ccsds_packet_queue( - tm_queue=queue_tuple[1], apid=apid, handler=handler_obj - ) - else: - LOGGER.warning(f"No valid handler for TM with APID {apid} found") - - @staticmethod + self.handle_ccsds_packet_queue( + tm_queue=queue_tuple[1], apid=apid, handler=self._handler_dict.get(apid) + ) + def handle_ccsds_packet_queue( + self, tm_queue: TelemetryQueueT, apid: int, - handler: ApidTmHandlerBase, + handler: Optional[ApidTmHandlerBase], ): - for tm_packet in tm_queue: - handler.handle_tm_for_apid(apid, tm_packet, handler.user_args) + if handler is None: + handler = self._handler_dict.get(apid) + if handler is None: + LOGGER.warning(f"No valid handler for TM with APID {apid} found") + else: + for tm_packet in tm_queue: + handler.handle_tm_for_apid(apid, tm_packet, handler.user_args) diff --git a/src/tmtccmd/sendreceive/sequential_sender_receiver.py b/src/tmtccmd/sendreceive/sequential_sender_receiver.py index c273c542..efea81a1 100644 --- a/src/tmtccmd/sendreceive/sequential_sender_receiver.py +++ b/src/tmtccmd/sendreceive/sequential_sender_receiver.py @@ -155,7 +155,7 @@ def __check_for_reply(self): apid=self._apid, clear=True ) self._tm_handler.handle_ccsds_packet_queue( - apid=self._apid, tm_queue=packet_queue + apid=self._apid, tm_queue=packet_queue, handler=None ) # This makes reply reception more responsive elif self._tm_listener.tm_packets_available(): @@ -163,7 +163,7 @@ def __check_for_reply(self): apid=self._apid, clear=True ) self._tm_handler.handle_ccsds_packet_queue( - apid=self._apid, tm_queue=packet_queue + apid=self._apid, tm_queue=packet_queue, handler=None ) def __check_next_tc_send(self): From 34bbf5d512f5596eb11094fa2432241441c5c181 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Wed, 15 Jun 2022 15:28:59 +0200 Subject: [PATCH 051/221] better exception handling --- src/tmtccmd/com_if/tcpip_tcp_com_if.py | 10 ++++++++-- src/tmtccmd/core/backend.py | 20 +++++++++++++------- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/src/tmtccmd/com_if/tcpip_tcp_com_if.py b/src/tmtccmd/com_if/tcpip_tcp_com_if.py index 17089bfd..411ca25f 100644 --- a/src/tmtccmd/com_if/tcpip_tcp_com_if.py +++ b/src/tmtccmd/com_if/tcpip_tcp_com_if.py @@ -93,7 +93,11 @@ def initialize(self, args: any = None) -> any: def open(self, args: any = None): self.__tm_thread_kill_signal.clear() - self.set_up_socket() + try: + self.set_up_socket() + except IOError as e: + LOGGER.exception("Issues setting up the TCP socket") + raise e self.set_up_tcp_thread() self.__tcp_conn_thread.start() @@ -111,7 +115,7 @@ def set_up_tcp_thread(self): def close(self, args: any = None) -> None: self.__tm_thread_kill_signal.set() - if self.__tcp_conn_thread != None: + if self.__tcp_conn_thread is not None: if self.__tcp_conn_thread.is_alive(): self.__tcp_conn_thread.join(self.tm_polling_frequency) if self.connected: @@ -130,6 +134,8 @@ def send(self, data: bytearray): if not self.connected: self.set_up_socket() self.__tcp_socket.sendto(data, self.target_address) + except BrokenPipeError: + LOGGER.exception("Communication Interface setup might have failed") except ConnectionRefusedError or OSError: self.connected = False self.__tcp_socket.close() diff --git a/src/tmtccmd/core/backend.py b/src/tmtccmd/core/backend.py index 9fa90e40..fd3c3db6 100644 --- a/src/tmtccmd/core/backend.py +++ b/src/tmtccmd/core/backend.py @@ -174,18 +174,24 @@ def initialize(self): keyboard_interrupt_handler, tmtc_backend=self, com_interface=self.__com_if ) + def __listener_io_error_handler(self, ctx: str): + LOGGER.error(f"Communication Interface could not be {ctx}") + LOGGER.info("TM listener will not be started") + if self.exit_on_com_if_init_failure: + LOGGER.error("Closing TMTC commander..") + self.__com_if.close() + sys.exit(1) + def start_listener(self, perform_op_immediately: bool = True): try: self.__com_if.open() + except IOError: + self.__listener_io_error_handler("opened") + try: self.__tm_listener.start() - self.__com_if_active = True except IOError: - LOGGER.error("Communication Interface could not be opened!") - LOGGER.info("TM listener will not be started") - if self.exit_on_com_if_init_failure: - LOGGER.error("Closing TMTC commander..") - self.__com_if.close() - sys.exit(1) + self.__listener_io_error_handler("started") + self.__com_if_active = True if self.mode == CoreModeList.CONTINUOUS_MODE: self.daemon_receiver.start_daemon() if perform_op_immediately: From d8505fb2e628cab8da698b70bafe02c2685602a3 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Wed, 15 Jun 2022 17:36:52 +0200 Subject: [PATCH 052/221] add tc handler base --- src/tmtccmd/cfdp/handler.py | 1 - src/tmtccmd/core/backend.py | 4 ++++ src/tmtccmd/tc/handler.py | 22 ++++++++++++++++++++++ 3 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 src/tmtccmd/tc/handler.py diff --git a/src/tmtccmd/cfdp/handler.py b/src/tmtccmd/cfdp/handler.py index 50134497..21985836 100644 --- a/src/tmtccmd/cfdp/handler.py +++ b/src/tmtccmd/cfdp/handler.py @@ -134,7 +134,6 @@ def com_if(self, com_if: CommunicationInterface): def state_machine(self): """Perform the CFDP state machine - :raises SequenceNumberOverflow: Overflow of sequence number occured. In this case, the number will be reset but no operation will occured and the state machine needs to be called again diff --git a/src/tmtccmd/core/backend.py b/src/tmtccmd/core/backend.py index fd3c3db6..76c97b77 100644 --- a/src/tmtccmd/core/backend.py +++ b/src/tmtccmd/core/backend.py @@ -9,6 +9,7 @@ from tmtccmd.config.definitions import CoreServiceList, CoreModeList from tmtccmd.core.base import BackendBase from tmtccmd.tc.definitions import TcQueueT +from tmtccmd.tc.handler import TcHandlerBase from tmtccmd.tm.definitions import TmTypes from tmtccmd.tm.handler import TmHandler from tmtccmd.logging import get_console_logger @@ -34,6 +35,7 @@ def __init__( com_if: CommunicationInterface, tm_listener: TmListener, tm_handler: TmHandler, + tc_handler: TcHandlerBase, init_mode: int, init_service: Union[str, int] = CoreServiceList.SERVICE_17.value, init_opcode: str = "0", @@ -277,6 +279,8 @@ def __handle_action(self): LOGGER.info("Performing service command operation") self.daemon_receiver.set_tc_queue(service_queue) self.daemon_receiver.send_queue_tc_and_return() + elif self.mode == CoreModeList.FEEDBACK_MODE: + pass else: try: self.__hook_obj.perform_mode_operation( diff --git a/src/tmtccmd/tc/handler.py b/src/tmtccmd/tc/handler.py new file mode 100644 index 00000000..48b21690 --- /dev/null +++ b/src/tmtccmd/tc/handler.py @@ -0,0 +1,22 @@ +from abc import abstractmethod + +from typing import Union, Any + +from tmtccmd.com_if.com_interface_base import CommunicationInterface +from tmtccmd.config import QueueCommands +from tmtccmd.config.definitions import TcQueueEntryArg + + +class TcHandlerBase: + def __init__(self): + pass + + @abstractmethod + def send_callback( + self, + tc_queue_entry: Union[bytes, QueueCommands], + com_if: CommunicationInterface, + queue_entry_arg: TcQueueEntryArg, + user_arg: Any, + ): + pass From 7abeabaa2f44cec2440f449b63e92c9fd39a8249 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Wed, 15 Jun 2022 18:45:18 +0200 Subject: [PATCH 053/221] refactored cli mode --- examples/tmtccli.py | 2 +- examples/tmtcgui.py | 2 +- src/tmtccmd/core/backend.py | 70 +++++++++++++----------------------- src/tmtccmd/core/base.py | 18 ++++++++++ src/tmtccmd/core/frontend.py | 4 +-- src/tmtccmd/runner.py | 9 +++-- src/tmtccmd/tc/handler.py | 3 ++ 7 files changed, 57 insertions(+), 51 deletions(-) diff --git a/examples/tmtccli.py b/examples/tmtccli.py index 17089eae..e52ffd86 100755 --- a/examples/tmtccli.py +++ b/examples/tmtccli.py @@ -36,7 +36,7 @@ def main(): tm_handler=ccsds_handler, ) tmtc_backend.usr_send_wrapper = (pre_send_cb, None) - tmtccmd.runner.run(tmtc_backend=tmtc_backend) + tmtccmd.runner.start(tmtc_backend=tmtc_backend) if __name__ == "__main__": diff --git a/examples/tmtcgui.py b/examples/tmtcgui.py index 8f8ec94b..4f32c2f5 100755 --- a/examples/tmtcgui.py +++ b/examples/tmtcgui.py @@ -28,7 +28,7 @@ def main(): tm_handler=ccsds_handler, ) tmtc_backend.usr_send_wrapper = (pre_send_cb, None) - runner.run(tmtc_backend=tmtc_backend) + runner.start(tmtc_backend=tmtc_backend) if __name__ == "__main__": diff --git a/src/tmtccmd/core/backend.py b/src/tmtccmd/core/backend.py index 76c97b77..bc49c94d 100644 --- a/src/tmtccmd/core/backend.py +++ b/src/tmtccmd/core/backend.py @@ -1,4 +1,5 @@ import atexit +import enum import time import sys from threading import Thread @@ -7,7 +8,7 @@ from tmtccmd.config.hook import TmTcHookBase from tmtccmd.config.definitions import CoreServiceList, CoreModeList -from tmtccmd.core.base import BackendBase +from tmtccmd.core.base import BackendBase, BackendResult, Request from tmtccmd.tc.definitions import TcQueueT from tmtccmd.tc.handler import TcHandlerBase from tmtccmd.tm.definitions import TmTypes @@ -47,6 +48,7 @@ def __init__( self.__service = init_service self.__op_code = init_opcode self.__apid = 0 + self.__res = BackendResult(Request.NONE) self.__usr_send_wrapper: Optional[Tuple[UsrSendCbT, any]] = None # This flag could be used later to command the TMTC Client with a front-end @@ -131,30 +133,6 @@ def set_current_apid(self, apid: int): self.__apid = apid self.daemon_receiver._apid = apid - @staticmethod - def prepare_tmtc_handler_start( - hook_obj: TmTcHookBase, - com_if: CommunicationInterface, - tm_listener: TmListener, - tm_handler: TmHandler, - init_mode: int, - init_service: Union[str, int] = CoreServiceList.SERVICE_17.value, - init_opcode: str = "0", - ): - from multiprocessing import Process - - tmtc_handler = TmTcHandler( - hook_obj=hook_obj, - com_if=com_if, - tm_listener=tm_listener, - init_mode=init_mode, - init_service=init_service, - init_opcode=init_opcode, - tm_handler=tm_handler, - ) - tmtc_task = Process(target=TmTcHandler.start_handler, args=(tmtc_handler,)) - return tmtc_task - @staticmethod def start_handler(executed_handler): if not isinstance(executed_handler, TmTcHandler): @@ -197,7 +175,7 @@ def start_listener(self, perform_op_immediately: bool = True): if self.mode == CoreModeList.CONTINUOUS_MODE: self.daemon_receiver.start_daemon() if perform_op_immediately: - self.perform_operation() + self.periodic_op() def close_listener(self, join: bool = False, join_timeout_seconds: float = 1.0): """Closes the TM listener and the communication interface. This is started in a separarate @@ -215,16 +193,30 @@ def close_listener(self, join: bool = False, join_timeout_seconds: float = 1.0): if join: close_thread.join(timeout=join_timeout_seconds) - def perform_operation(self): - """Periodic operation""" + def periodic_op(self) -> BackendResult: + """Periodic operation + :raises KeyboardInterrupt: Yields info output and then propagates the exception + :raises IOError: Yields informative output and propagates exception + :""" try: - self.__core_operation(self.one_shot_operation) - except KeyboardInterrupt: + return self.__core_operation(self.one_shot_operation) + except KeyboardInterrupt as e: LOGGER.info("Keyboard Interrupt.") - sys.exit() - except IOError: + raise e + except IOError as e: LOGGER.exception("IO Error occured") - sys.exit() + raise e + + def __core_operation(self, one_shot: bool) -> BackendResult: + self.__handle_action() + if one_shot: + self.__res.req = Request.TERMINATION_NO_ERROR + else: + if self.mode == CoreModeList.IDLE: + self.__res.req = Request.DELAY_IDLE + elif self.mode == CoreModeList.LISTENER_MODE: + self.__res.req = Request.DELAY_LISTENER + return self.__res def __com_if_closing(self): self.__tm_listener.stop() @@ -290,18 +282,6 @@ def __handle_action(self): print(error) LOGGER.error("Custom mode handling module not provided!") - def __core_operation(self, one_shot: bool): - if not one_shot: - while True: - self.__handle_action() - if self.mode == CoreModeList.IDLE: - LOGGER.info("TMTC Client in idle mode") - time.sleep(5) - elif self.mode == CoreModeList.LISTENER_MODE: - time.sleep(1) - else: - self.__handle_action() - def __prepare_tc_queue(self) -> Optional[TcQueueT]: service_queue = deque() service_queue_packer = ServiceQueuePacker() diff --git a/src/tmtccmd/core/base.py b/src/tmtccmd/core/base.py index 40e1956c..3fb1a723 100644 --- a/src/tmtccmd/core/base.py +++ b/src/tmtccmd/core/base.py @@ -1,6 +1,20 @@ +import enum from abc import abstractmethod +class Request(enum.IntEnum): + NONE = 0 + TERMINATION_NO_ERROR = 1 + DELAY_IDLE = 2 + DELAY_LISTENER = 3 + + +class BackendResult: + def __init__(self, req: Request): + self.req = req + self.mode_changed = False + + class BackendBase: @abstractmethod def initialize(self): @@ -16,3 +30,7 @@ def set_mode(self, mode: int): :param mode: :return: """ + + @abstractmethod + def periodic_op(self) -> BackendResult: + pass diff --git a/src/tmtccmd/core/frontend.py b/src/tmtccmd/core/frontend.py index 73d591de..245d0e38 100644 --- a/src/tmtccmd/core/frontend.py +++ b/src/tmtccmd/core/frontend.py @@ -114,13 +114,13 @@ def run_worker(self): self.tmtc_handler.one_shot_operation = True # It is expected that the TMTC handler is in the according state to perform the # operation - self.tmtc_handler.perform_operation() + self.tmtc_handler.periodic_op() self.op_code = WorkerOperationsCodes.LISTENING self.command_executed.emit() elif op_code == WorkerOperationsCodes.LISTENING: self.tmtc_handler.one_shot_operation = True self.tmtc_handler.set_mode(CoreModeList.LISTENER_MODE) - self.tmtc_handler.perform_operation() + self.tmtc_handler.periodic_op() elif op_code == WorkerOperationsCodes.IDLE: pass else: diff --git a/src/tmtccmd/runner.py b/src/tmtccmd/runner.py index efb98e53..5f05024d 100644 --- a/src/tmtccmd/runner.py +++ b/src/tmtccmd/runner.py @@ -20,6 +20,7 @@ ) from tmtccmd.logging import get_console_logger from .config.globals import set_default_globals_pre_args_parsing +from .tc.handler import TcHandlerBase LOGGER = get_console_logger() @@ -69,7 +70,7 @@ def setup(setup_args: SetupArgs): __SETUP_WAS_CALLED = True -def run( +def start( tmtc_backend: BackendBase, tmtc_frontend: Union[FrontendBase, None] = None, app_name: str = "TMTC Commander", @@ -180,9 +181,12 @@ def __get_backend_init_variables(): return service, op_code, com_if, mode -def create_default_tmtc_backend(setup_args: SetupArgs, tm_handler: TmHandler): +def create_default_tmtc_backend( + setup_args: SetupArgs, tm_handler: TmHandler, tc_handler: TcHandlerBase +) -> BackendBase: """Creates a default TMTC backend instance which can be passed to the tmtccmd runner + :param tc_handler: :param setup_args: :param tm_handler: :return: @@ -219,6 +223,7 @@ def create_default_tmtc_backend(setup_args: SetupArgs, tm_handler: TmHandler): init_service=service, init_opcode=op_code, tm_handler=tm_handler, + tc_handler=tc_handler, ) tmtc_backend.set_current_apid(apid=apid) tmtc_backend.one_shot_operation = not get_global( diff --git a/src/tmtccmd/tc/handler.py b/src/tmtccmd/tc/handler.py index 48b21690..f68b7f7b 100644 --- a/src/tmtccmd/tc/handler.py +++ b/src/tmtccmd/tc/handler.py @@ -20,3 +20,6 @@ def send_callback( user_arg: Any, ): pass + + def feedback_call(self): + pass From 3cabb3a381a3fb836ec2c6d41cc356452826582d Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 21 Jun 2022 18:50:40 +0200 Subject: [PATCH 054/221] significant refactoring --- src/tmtccmd/ccsds/handler.py | 10 +- src/tmtccmd/com_if/com_if_utilities.py | 2 + src/tmtccmd/core/backend.py | 80 ++++-------- src/tmtccmd/core/base.py | 7 -- src/tmtccmd/core/frontend.py | 19 ++- src/tmtccmd/core/object_id_manager.py | 19 --- src/tmtccmd/runner.py | 12 +- ...r_receiver.py => ccsds_sender_receiver.py} | 20 ++- .../multiple_cmds_sender_receiver.py | 116 ------------------ ...ceiver.py => seq_ccsds_sender_receiver.py} | 51 +++----- .../single_command_sender_receiver.py | 85 ------------- src/tmtccmd/sendreceive/tm_listener.py | 7 +- src/tmtccmd/tc/definitions.py | 52 +++++++- src/tmtccmd/tc/handler.py | 24 ++-- src/tmtccmd/tc/packer.py | 28 ++--- src/tmtccmd/tm/handler.py | 2 +- 16 files changed, 132 insertions(+), 402 deletions(-) delete mode 100644 src/tmtccmd/core/object_id_manager.py rename src/tmtccmd/sendreceive/{cmd_sender_receiver.py => ccsds_sender_receiver.py} (92%) delete mode 100644 src/tmtccmd/sendreceive/multiple_cmds_sender_receiver.py rename src/tmtccmd/sendreceive/{sequential_sender_receiver.py => seq_ccsds_sender_receiver.py} (83%) delete mode 100644 src/tmtccmd/sendreceive/single_command_sender_receiver.py diff --git a/src/tmtccmd/ccsds/handler.py b/src/tmtccmd/ccsds/handler.py index a60a582e..8339817e 100644 --- a/src/tmtccmd/ccsds/handler.py +++ b/src/tmtccmd/ccsds/handler.py @@ -1,17 +1,13 @@ import abc -from typing import Callable, Dict, Optional, Tuple, List, Type, Any +from typing import Dict, Optional, Tuple, List -from tmtccmd.tm.handler import TmHandler -from tmtccmd.cfdp.handler import CfdpHandler +from tmtccmd.tm.handler import TmHandlerBase from tmtccmd.tm.definitions import TelemetryQueueT, TmTypes from tmtccmd.sendreceive.tm_listener import QueueListT -from tmtccmd.utility.tmtc_printer import FsfwTmTcPrinter from tmtccmd.logging import get_console_logger LOGGER = get_console_logger() -CcsdsCallbackT = Callable[[int, bytes, Any], None] - class ApidTmHandlerBase: """Handler base for space packets with an APID. If a packet is received for a certain APID, @@ -29,7 +25,7 @@ def handle_tm_for_apid(self, apid: int, packet: bytes, user_args: any): HandlerDictT = Dict[int, ApidTmHandlerBase] -class CcsdsTmHandler(TmHandler): +class CcsdsTmHandler(TmHandlerBase): """Generic CCSDS handler class. The user can create an instance of this class to handle CCSDS packets with different APIDs""" diff --git a/src/tmtccmd/com_if/com_if_utilities.py b/src/tmtccmd/com_if/com_if_utilities.py index 0f62fff0..18549555 100644 --- a/src/tmtccmd/com_if/com_if_utilities.py +++ b/src/tmtccmd/com_if/com_if_utilities.py @@ -9,6 +9,7 @@ def determine_com_if(com_if_dict: ComIFDictT, json_cfg_path: str) -> str: do_prompt_com_if = False + com_if_string = "" if not check_json_file(json_cfg_path=json_cfg_path): do_prompt_com_if = True if not do_prompt_com_if: @@ -31,6 +32,7 @@ def determine_com_if(com_if_dict: ComIFDictT, json_cfg_path: str) -> str: def prompt_com_if(com_if_dict: dict) -> str: + com_if_string = "" while True: com_if_list = [] for index, com_if_value in enumerate(com_if_dict.items()): diff --git a/src/tmtccmd/core/backend.py b/src/tmtccmd/core/backend.py index bc49c94d..2dc123be 100644 --- a/src/tmtccmd/core/backend.py +++ b/src/tmtccmd/core/backend.py @@ -1,27 +1,24 @@ import atexit -import enum import time import sys from threading import Thread from collections import deque -from typing import Union, cast, Optional, Tuple +from typing import cast, Optional from tmtccmd.config.hook import TmTcHookBase from tmtccmd.config.definitions import CoreServiceList, CoreModeList from tmtccmd.core.base import BackendBase, BackendResult, Request -from tmtccmd.tc.definitions import TcQueueT +from tmtccmd.tc.definitions import TcQueueT, ProcedureInfo from tmtccmd.tc.handler import TcHandlerBase from tmtccmd.tm.definitions import TmTypes -from tmtccmd.tm.handler import TmHandler +from tmtccmd.tm.handler import TmHandlerBase from tmtccmd.logging import get_console_logger -from tmtccmd.sendreceive.sequential_sender_receiver import ( - SequentialCommandSenderReceiver, - UsrSendCbT, +from tmtccmd.sendreceive.seq_ccsds_sender_receiver import ( + SequentialCcsdsSenderReceiver, ) from tmtccmd.sendreceive.tm_listener import TmListener from tmtccmd.ccsds.handler import CcsdsTmHandler from tmtccmd.com_if.com_interface_base import CommunicationInterface -from tmtccmd.tc.packer import ServiceQueuePacker LOGGER = get_console_logger() @@ -35,27 +32,23 @@ def __init__( hook_obj: TmTcHookBase, com_if: CommunicationInterface, tm_listener: TmListener, - tm_handler: TmHandler, + tm_handler: TmHandlerBase, tc_handler: TcHandlerBase, - init_mode: int, - init_service: Union[str, int] = CoreServiceList.SERVICE_17.value, - init_opcode: str = "0", ): - self.mode = init_mode + self.mode = CoreModeList.LISTENER_MODE self.com_if_key = com_if.get_id() self.__hook_obj = hook_obj self.__com_if_active = False - self.__service = init_service - self.__op_code = init_opcode self.__apid = 0 self.__res = BackendResult(Request.NONE) - self.__usr_send_wrapper: Optional[Tuple[UsrSendCbT, any]] = None + self.__tc_handler = tc_handler # This flag could be used later to command the TMTC Client with a front-end self.one_shot_operation = False self.__com_if = com_if self.__tm_listener = tm_listener + self._current_proc_info = ProcedureInfo(CoreServiceList.SERVICE_17.value, "0") if tm_handler.get_type() == TmTypes.CCSDS_SPACE_PACKETS: self.__tm_handler: CcsdsTmHandler = cast(CcsdsTmHandler, tm_handler) for apid_queue_len_tuple in self.__tm_handler.get_apid_queue_len_list(): @@ -66,13 +59,13 @@ def __init__( self.single_command_package = bytearray(), None # WIP: optionally having a receiver run in the background - self.daemon_receiver = SequentialCommandSenderReceiver( + self.daemon_receiver = SequentialCcsdsSenderReceiver( com_if=self.__com_if, tm_handler=self.__tm_handler, tm_listener=self.__tm_listener, tc_queue=deque(), + tc_handler=tc_handler, apid=self.__apid, - usr_send_wrapper=self.usr_send_wrapper, ) def get_com_if_id(self): @@ -94,42 +87,23 @@ def set_com_if(self, com_if: CommunicationInterface): "reassigning a new one" ) - @property - def usr_send_wrapper(self): - return self.__usr_send_wrapper - - @usr_send_wrapper.setter - def usr_send_wrapper(self, usr_send_wrapper: UsrSendCbT): - self.__usr_send_wrapper = usr_send_wrapper - def is_com_if_active(self): return self.__com_if_active - def set_mode(self, mode: int): - """ - Set the mode which will determine what perform_operation does. - """ - self.mode = mode - - def get_mode(self) -> int: - return self.mode - - def set_service(self, service: Union[str, int]): - self.__service = service - - def set_opcode(self, op_code: str): - self.__op_code = op_code - - def get_service(self) -> Union[str, int]: - return self.__service + @property + def current_proc_info(self) -> ProcedureInfo: + return self._current_proc_info - def get_opcode(self) -> str: - return self.__op_code + @current_proc_info.setter + def current_proc_info(self, proc_info: ProcedureInfo): + self._current_proc_info = proc_info - def get_current_apid(self) -> int: + @property + def apid(self) -> int: return self.__apid - def set_current_apid(self, apid: int): + @apid.setter + def apid(self, apid: int): self.__apid = apid self.daemon_receiver._apid = apid @@ -254,13 +228,13 @@ def __handle_action(self): if service_queue is None: return LOGGER.info("Performing sequential command operation") - sender_and_receiver = SequentialCommandSenderReceiver( + sender_and_receiver = SequentialCcsdsSenderReceiver( com_if=self.__com_if, tm_handler=self.__tm_handler, tm_listener=self.__tm_listener, tc_queue=service_queue, apid=self.__apid, - usr_send_wrapper=self.usr_send_wrapper, + tc_handler=self.__tc_handler, ) sender_and_receiver.send_queue_tc_and_receive_tm_sequentially() self.mode = CoreModeList.LISTENER_MODE @@ -283,13 +257,7 @@ def __handle_action(self): LOGGER.error("Custom mode handling module not provided!") def __prepare_tc_queue(self) -> Optional[TcQueueT]: - service_queue = deque() - service_queue_packer = ServiceQueuePacker() - service_queue_packer.pack_service_queue_core( - service=self.__service, - service_queue=service_queue, - op_code=self.__op_code, - ) + service_queue = self.__tc_handler.pass_queue(self.current_proc_info) if not self.__com_if.valid: return None return service_queue diff --git a/src/tmtccmd/core/base.py b/src/tmtccmd/core/base.py index 3fb1a723..f20c7ed0 100644 --- a/src/tmtccmd/core/base.py +++ b/src/tmtccmd/core/base.py @@ -24,13 +24,6 @@ def initialize(self): def start_listener(self, perform_op_immediately: bool): """Start the backend. Raise RuntimeError on failure""" - @abstractmethod - def set_mode(self, mode: int): - """Set backend mode - :param mode: - :return: - """ - @abstractmethod def periodic_op(self) -> BackendResult: pass diff --git a/src/tmtccmd/core/frontend.py b/src/tmtccmd/core/frontend.py index 245d0e38..e4d78fb4 100644 --- a/src/tmtccmd/core/frontend.py +++ b/src/tmtccmd/core/frontend.py @@ -1,10 +1,4 @@ -#!/usr/bin/env python3 -""" -@file tmtc_frontend.py -@date 01.11.2019 -@brief This is part of the TMTC client developed by the SOURCE project by KSat -@description GUI is still work-in-progress -@manual +"""PyQt front end components for the tmtccmd framework. @author R. Mueller, P. Scheurenbrand, D. Nguyen """ import enum @@ -43,7 +37,7 @@ from tmtccmd.core.globals_manager import get_global, update_global from tmtccmd.com_if.tcpip_utilities import TcpIpConfigIds import tmtccmd.config as config_module - +from tmtccmd.tc.definitions import ProcedureInfo LOGGER = get_console_logger() @@ -119,7 +113,7 @@ def run_worker(self): self.command_executed.emit() elif op_code == WorkerOperationsCodes.LISTENING: self.tmtc_handler.one_shot_operation = True - self.tmtc_handler.set_mode(CoreModeList.LISTENER_MODE) + self.tmtc_handler.mode = CoreModeList.LISTENER_MODE self.tmtc_handler.periodic_op() elif op_code == WorkerOperationsCodes.IDLE: pass @@ -221,9 +215,10 @@ def __start_seq_cmd_op(self): if not self.__get_send_button(): return self.__set_send_button(False) - self._tmtc_handler.set_service(self._current_service) - self._tmtc_handler.set_opcode(self._current_op_code) - self._tmtc_handler.set_mode(CoreModeList.SEQUENTIAL_CMD_MODE) + self._tmtc_handler.current_proc_info = ProcedureInfo( + self._current_service, self._current_op_code + ) + self._tmtc_handler.mode = CoreModeList.SEQUENTIAL_CMD_MODE self.__worker.set_op_code(WorkerOperationsCodes.SEQUENTIAL_COMMANDING) self.__worker.command_executed.connect(self.__finish_seq_cmd_op) diff --git a/src/tmtccmd/core/object_id_manager.py b/src/tmtccmd/core/object_id_manager.py deleted file mode 100644 index d6d8d7c9..00000000 --- a/src/tmtccmd/core/object_id_manager.py +++ /dev/null @@ -1,19 +0,0 @@ -from typing import Dict - -from tmtccmd.logging import get_console_logger - -LOGGER = get_console_logger() -__OBJECT_ID_DICT = dict() - - -def insert_object_id(object_id: bytes, object_id_info: list): - __OBJECT_ID_DICT[object_id] = object_id_info - - -def insert_object_ids(object_id_dict: Dict[bytes, list]): - if object_id_dict is not None: - __OBJECT_ID_DICT.update(object_id_dict) - - -def get_object_id_info(object_id: bytes): - return __OBJECT_ID_DICT.get(object_id) diff --git a/src/tmtccmd/runner.py b/src/tmtccmd/runner.py index 5f05024d..62dcd06a 100644 --- a/src/tmtccmd/runner.py +++ b/src/tmtccmd/runner.py @@ -10,7 +10,7 @@ from tmtccmd.core.backend import BackendBase from tmtccmd.core.frontend_base import FrontendBase from tmtccmd.tm.definitions import TmTypes -from tmtccmd.tm.handler import TmHandler +from tmtccmd.tm.handler import TmHandlerBase from tmtccmd.ccsds.handler import CcsdsTmHandler from tmtccmd.core.globals_manager import ( update_global, @@ -20,6 +20,7 @@ ) from tmtccmd.logging import get_console_logger from .config.globals import set_default_globals_pre_args_parsing +from .tc.definitions import ProcedureInfo from .tc.handler import TcHandlerBase LOGGER = get_console_logger() @@ -182,7 +183,7 @@ def __get_backend_init_variables(): def create_default_tmtc_backend( - setup_args: SetupArgs, tm_handler: TmHandler, tc_handler: TcHandlerBase + setup_args: SetupArgs, tm_handler: TmHandlerBase, tc_handler: TcHandlerBase ) -> BackendBase: """Creates a default TMTC backend instance which can be passed to the tmtccmd runner @@ -219,13 +220,12 @@ def create_default_tmtc_backend( hook_obj=setup_args.hook_obj, com_if=com_if, tm_listener=tm_listener, - init_mode=mode, - init_service=service, - init_opcode=op_code, tm_handler=tm_handler, tc_handler=tc_handler, ) - tmtc_backend.set_current_apid(apid=apid) + tmtc_backend.mode = mode + tmtc_backend.current_proc_info = ProcedureInfo(service, op_code) + tmtc_backend.apid = apid tmtc_backend.one_shot_operation = not get_global( CoreGlobalIds.USE_LISTENER_AFTER_OP ) diff --git a/src/tmtccmd/sendreceive/cmd_sender_receiver.py b/src/tmtccmd/sendreceive/ccsds_sender_receiver.py similarity index 92% rename from src/tmtccmd/sendreceive/cmd_sender_receiver.py rename to src/tmtccmd/sendreceive/ccsds_sender_receiver.py index fd45c0f8..3012e1e4 100644 --- a/src/tmtccmd/sendreceive/cmd_sender_receiver.py +++ b/src/tmtccmd/sendreceive/ccsds_sender_receiver.py @@ -2,20 +2,20 @@ @author: R. Mueller """ import time -from typing import Optional, Tuple from tmtccmd.com_if.com_interface_base import CommunicationInterface -from tmtccmd.config.definitions import QueueCommands, CoreGlobalIds, UsrSendCbT +from tmtccmd.config.definitions import QueueCommands, CoreGlobalIds from tmtccmd.logging import get_console_logger from tmtccmd.ccsds.handler import CcsdsTmHandler from tmtccmd.sendreceive.tm_listener import TmListener -from tmtccmd.tc.definitions import TcQueueEntryT +from tmtccmd.tc.definitions import TcQueueEntryBase from tmtccmd.core.globals_manager import get_global +from tmtccmd.tc.handler import TcHandlerBase LOGGER = get_console_logger() -class CommandSenderReceiver: +class CcsdsCommandSenderReceiver: """ This is the generic CommandSenderReceiver object. All TMTC objects inherit this object, for example specific implementations (e.g. SingleCommandSenderReceiver) @@ -26,8 +26,8 @@ def __init__( com_if: CommunicationInterface, tm_listener: TmListener, tm_handler: CcsdsTmHandler, + tc_handler: TcHandlerBase, apid: int, - usr_send_wrapper: Optional[Tuple[UsrSendCbT, any]] = None, ): """ @@ -36,13 +36,9 @@ def __init__( """ self._tm_timeout = get_global(CoreGlobalIds.TM_TIMEOUT) self._tm_handler = tm_handler + self._tc_handler = tc_handler self._tc_send_timeout_factor = get_global(CoreGlobalIds.TC_SEND_TIMEOUT_FACTOR) self._apid = apid - self._usr_send_cb: Optional[UsrSendCbT] = None - self._usr_send_args: Optional[any] = None - if usr_send_wrapper is not None: - self._usr_send_cb = usr_send_wrapper[0] - self._usr_send_args = usr_send_wrapper[1] if isinstance(com_if, CommunicationInterface): self._com_if = com_if @@ -131,7 +127,7 @@ def wait_period_ongoing( return False @staticmethod - def check_queue_entry_static(tc_queue_entry: TcQueueEntryT) -> bool: + def check_queue_entry_static(tc_queue_entry: TcQueueEntryBase) -> bool: """Static method to check whether a queue entry is a valid telecommand""" queue_entry_first, queue_entry_second = tc_queue_entry if isinstance(queue_entry_first, str): @@ -144,7 +140,7 @@ def check_queue_entry_static(tc_queue_entry: TcQueueEntryT) -> bool: else: return False - def check_queue_entry(self, tc_queue_entry: TcQueueEntryT) -> bool: + def check_queue_entry(self, tc_queue_entry: TcQueueEntryBase) -> bool: """ Checks whether the entry in the pus_tc queue is a telecommand. The last telecommand and respective information are stored in _last_tc diff --git a/src/tmtccmd/sendreceive/multiple_cmds_sender_receiver.py b/src/tmtccmd/sendreceive/multiple_cmds_sender_receiver.py deleted file mode 100644 index a2272b18..00000000 --- a/src/tmtccmd/sendreceive/multiple_cmds_sender_receiver.py +++ /dev/null @@ -1,116 +0,0 @@ -"""Used to send multiple TCs as bursts and listen for replies simultaneously. Used by Module Tester -""" -import sys -import time -from typing import Union, Deque, Optional, Tuple -from collections import deque - -from tmtccmd.ccsds.handler import CcsdsTmHandler -from tmtccmd.config.definitions import UsrSendCbT -from tmtccmd.sendreceive.sequential_sender_receiver import ( - SequentialCommandSenderReceiver, -) -from tmtccmd.com_if.com_interface_base import CommunicationInterface -from tmtccmd.sendreceive.tm_listener import TmListener -from tmtccmd.utility.tmtc_printer import get_console_logger - - -LOGGER = get_console_logger() - - -class MultipleCommandSenderReceiver(SequentialCommandSenderReceiver): - """Difference to sequential sender: This class can send TCs in bursts. - Wait intervals can be specified with wait time between the send bursts. - """ - - def __init__( - self, - com_if: CommunicationInterface, - apid: int, - tm_handler: CcsdsTmHandler, - tm_listener: TmListener, - tc_queue: Deque, - wait_intervals: list, - wait_time: Union[float, list], - print_tm: bool, - usr_send_wrapper: Optional[Tuple[UsrSendCbT, any]] = None, - ): - """TCs are sent in burst when applicable. Wait intervals can be specified by supplying - respective arguments - - :param com_if: - :param tc_queue: - :param wait_intervals: List of pause intervals. For example [1,3] means that a wait_time - is applied after - sendinf the first and the third telecommand - :param wait_time: List of wait times or uniform wait time as float - :param print_tm: - """ - super().__init__( - com_if=com_if, - tm_listener=tm_listener, - tc_queue=tc_queue, - apid=apid, - tm_handler=tm_handler, - usr_send_wrapper=usr_send_wrapper, - ) - self.waitIntervals = wait_intervals - self.waitTime = wait_time - self.printTm = print_tm - self.tm_packet_queue = deque() - self.tc_info_queue = deque() - self.pusPacketInfo = [] - self.pusPacket = [] - self.waitCounter = 0 - - def send_tc_queue_and_return_info(self): - try: - self._tm_listener.manual_mode() - self._tm_listener.event_mode_change.set() - time.sleep(0.1) - # TC info queue is set in this function - self.__send_all_queue() - time.sleep(self._tm_timeout / 1.4) - # Get a copy of the queue, otherwise we will lose the data. - tm_packet_queue_list = ( - self._tm_listener.retrieve_ccsds_tm_packet_queue().copy() - ) - self._tm_listener.clear_ccsds_tm_packet_queue(apid=self._apid) - return self.tc_info_queue, tm_packet_queue_list - except (KeyboardInterrupt, SystemExit): - LOGGER.info("Keyboard Interrupt.") - sys.exit() - - def __handle_tc_resending(self): - while not self.__all_replies_received: - if self._tc_queue.__len__ == 0: - if self._start_time == 0: - self._start_time = time.time() - self._check_for_tm_timeout() - - def __send_all_queue(self): - while not self._tc_queue.__len__() == 0: - self._send_next_telecommand() - - def __handle_waiting(self): - self.waitCounter = self.waitCounter + 1 - if self.waitCounter in self.waitIntervals: - if isinstance(self.waitTime, list): - time.sleep(self.waitTime[self.waitIntervals.index(self.waitCounter)]) - else: - time.sleep(self.waitTime) - if self.waitTime == 0: - # To prevent thread starvation - time.sleep(0.1) - - def __retrieve_listener_tm_packet_queue(self): - if self._tm_listener.reply_event(): - return self._tm_listener.retrieve_ccsds_tm_packet_queue(apid=self._apid) - else: - LOGGER.error( - "Multiple Command SenderReceiver: Configuration error, " - "reply event not set in TM listener" - ) - - def __clear_listener_tm_info_queue(self): - self._tm_listener.clear_tm_packet_queues(True) diff --git a/src/tmtccmd/sendreceive/sequential_sender_receiver.py b/src/tmtccmd/sendreceive/seq_ccsds_sender_receiver.py similarity index 83% rename from src/tmtccmd/sendreceive/sequential_sender_receiver.py rename to src/tmtccmd/sendreceive/seq_ccsds_sender_receiver.py index efea81a1..5f8153b2 100644 --- a/src/tmtccmd/sendreceive/sequential_sender_receiver.py +++ b/src/tmtccmd/sendreceive/seq_ccsds_sender_receiver.py @@ -1,37 +1,30 @@ -#!/usr/bin/python3.8 -""" -@file tmtcc_sequential_sender_receiver.py -@date 01.11.2019 -@brief Used to send multiple TCs in sequence and listen for replies after each sent TC -""" +"""Used to send multiple TCs in sequence and listen for replies after each sent TC""" import sys import time -from typing import Optional, Tuple +import threading -from tmtccmd.config.definitions import UsrSendCbT -from tmtccmd.sendreceive.cmd_sender_receiver import CommandSenderReceiver +from tmtccmd.sendreceive.ccsds_sender_receiver import CcsdsCommandSenderReceiver from tmtccmd.ccsds.handler import CcsdsTmHandler from tmtccmd.sendreceive.tm_listener import TmListener from tmtccmd.com_if.com_interface_base import CommunicationInterface from tmtccmd.logging import get_console_logger from tmtccmd.tc.definitions import TcQueueT - -import threading +from tmtccmd.tc.handler import TcHandlerBase LOGGER = get_console_logger() -class SequentialCommandSenderReceiver(CommandSenderReceiver): +class SequentialCcsdsSenderReceiver(CcsdsCommandSenderReceiver): """Specific implementation of CommandSenderReceiver to send multiple telecommands in sequence""" def __init__( self, + tc_queue: TcQueueT, com_if: CommunicationInterface, + tm_listener: TmListener, tm_handler: CcsdsTmHandler, + tc_handler: TcHandlerBase, apid: int, - tm_listener: TmListener, - tc_queue: TcQueueT, - usr_send_wrapper: Optional[Tuple[UsrSendCbT, any]] = None, ): """ :param com_if: CommunicationInterface object, passed on to CommandSenderReceiver @@ -43,8 +36,9 @@ def __init__( tm_listener=tm_listener, tm_handler=tm_handler, apid=apid, - usr_send_wrapper=usr_send_wrapper, + tc_handler=tc_handler, ) + self._tc_handler = tc_handler self._tc_queue = tc_queue self.__all_replies_received = False # This flag can be used to notify the sender to send the next TC @@ -183,20 +177,10 @@ def _send_next_telecommand(self) -> bool: return False if self.wait_period_ongoing(): return False - tc_queue_tuple = self._tc_queue.pop() - if self.check_queue_entry(tc_queue_tuple): + next_queue_entry = self._tc_queue.pop() + if self.check_queue_entry(next_queue_entry): self._start_time = time.time() - packet, cmd_info = tc_queue_tuple - if self._usr_send_cb is not None: - try: - self._usr_send_cb( - packet, self._com_if, cmd_info, self._usr_send_args - ) - except TypeError: - LOGGER.exception("User TC send callback invalid") - else: - self._com_if.send(packet) - return True + self._tc_handler.pre_send_cb(next_queue_entry, self._com_if) # queue empty. elif not self._tc_queue: @@ -208,14 +192,7 @@ def _send_next_telecommand(self) -> bool: self.__all_replies_received = True return False else: - if self._usr_send_cb is not None: - queue_cmd, queue_cmd_arg = tc_queue_tuple - try: - self._usr_send_cb( - queue_cmd, self._com_if, queue_cmd_arg, self._usr_send_args - ) - except TypeError: - LOGGER.exception("User TC send callback invalid") + self._tc_handler.pre_send_cb(next_queue_entry, self._com_if) # If the queue entry was not a telecommand, send next telecommand self.__check_next_tc_send() return True diff --git a/src/tmtccmd/sendreceive/single_command_sender_receiver.py b/src/tmtccmd/sendreceive/single_command_sender_receiver.py deleted file mode 100644 index 25f04647..00000000 --- a/src/tmtccmd/sendreceive/single_command_sender_receiver.py +++ /dev/null @@ -1,85 +0,0 @@ -#!/usr/bin/python3.8 -""" -@file - tmtcc_config.py -@date - 01.11.2019 -@brief - Used to send single tcs and listen for replies after that -""" -from typing import Optional, Tuple - -from tmtccmd.ccsds.handler import CcsdsTmHandler -from tmtccmd.config.definitions import UsrSendCbT -from tmtccmd.sendreceive.cmd_sender_receiver import CommandSenderReceiver -from tmtccmd.sendreceive.tm_listener import TmListener -from tmtccmd.com_if.com_interface_base import CommunicationInterface - -from tmtccmd.logging import get_console_logger - -from tmtccmd.tc.definitions import PusTcTupleT - - -logger = get_console_logger() - - -class SingleCommandSenderReceiver(CommandSenderReceiver): - """ - Specific implementation of CommandSenderReceiver to send a single telecommand - This object can be used by instantiating it and calling sendSingleTcAndReceiveTm() - """ - - def __init__( - self, - com_if: CommunicationInterface, - tm_listener: TmListener, - tm_handler: CcsdsTmHandler, - apid: int, - usr_send_wrapper: Optional[Tuple[UsrSendCbT, any]] = None, - ): - """ - :param com_if: CommunicationInterface object, passed on to CommandSenderReceiver - :param tm_listener: TmListener object which runs in the background and receives all TM - """ - super().__init__( - com_if=com_if, - tm_listener=tm_listener, - tm_handler=tm_handler, - apid=apid, - usr_send_wrapper=usr_send_wrapper, - ) - - def send_single_tc_and_receive_tm(self, pus_packet_tuple: PusTcTupleT): - """ - Send a single telecommand passed to the class and wait for replies - :return: - """ - try: - tuple_first, tuple_second = pus_packet_tuple - except TypeError: - logger.error("SingleCommandSenderReceiver: Invalid command input") - return - self._operation_pending = True - self._tm_listener.sequence_mode() - if self._usr_send_cb is not None: - self._usr_send_cb( - tuple_first, self._com_if, tuple_first, self._usr_send_args - ) - else: - self._com_if.send(tuple_first) - # TODO: What if entry is not a telecommand? - self._last_tc = tuple_first - self._last_tc_obj = tuple_second - while self._operation_pending: - # wait until reply is received - super()._check_for_first_reply() - if self._next_send_condition: - self._tm_listener.set_mode_op_finished() - packet_queue = self._tm_listener.retrieve_ccsds_tm_packet_queue( - apid=self._apid, clear=True - ) - self._tm_handler.handle_ccsds_packet_queue( - apid=self._apid, tm_queue=packet_queue - ) - logger.info("SingleCommandSenderReceiver: Reply received") - logger.info("Listening for packages ...") diff --git a/src/tmtccmd/sendreceive/tm_listener.py b/src/tmtccmd/sendreceive/tm_listener.py index 2e924491..ef6042f4 100644 --- a/src/tmtccmd/sendreceive/tm_listener.py +++ b/src/tmtccmd/sendreceive/tm_listener.py @@ -1,9 +1,4 @@ -""" -@file tmtcc_tm_listener.py -@date 01.11.2019 -@brief Separate class to listen to telecommands. -@author R. Mueller -""" +"""Contains the TmListener which can be used to listen to Telemetry in the background""" import sys import time import threading diff --git a/src/tmtccmd/tc/definitions.py b/src/tmtccmd/tc/definitions.py index 6652a6c0..a384a010 100644 --- a/src/tmtccmd/tc/definitions.py +++ b/src/tmtccmd/tc/definitions.py @@ -1,8 +1,48 @@ -from typing import Tuple, Union, Deque -from tmtccmd.config.definitions import QueueCommands +from enum import Enum +from typing import Deque from spacepackets.ecss.tc import PusTelecommand -TcAuxiliaryTupleT = Tuple[QueueCommands, any] -PusTcTupleT = Tuple[bytearray, Union[None, PusTelecommand]] -TcQueueEntryT = Union[TcAuxiliaryTupleT, PusTcTupleT] -TcQueueT = Deque[TcQueueEntryT] + +class TcQueueEntryType(Enum): + PUS_CMD = "pus-cmd" + RAW_CMD = "raw-cmd" + CUSTOM = "custom" + PRINT = "print" + WAIT = "wait" + RAW_PRINT = "raw-print" + SET_TIMEOUT = "set-timeout" + + +class TcQueueEntryBase: + def __init__(self, etype: TcQueueEntryType): + self.etype = etype + + +TcQueueT = Deque[TcQueueEntryBase] + + +class PusTcEntry(TcQueueEntryBase): + def __init__(self, pus_tc: PusTelecommand): + super().__init__(TcQueueEntryType.PUS_CMD) + self.pus_tc = pus_tc + + +class PrintEntry(TcQueueEntryBase): + def __init__(self, print_str: str): + super().__init__(TcQueueEntryType.PRINT) + self.print_str = print_str + + +class RawTcEntry(TcQueueEntryBase): + def __init__(self, raw_tc: bytes): + super().__init__(TcQueueEntryType.RAW_CMD) + self.raw_tc = raw_tc + + +class ProcedureInfo: + def __init__(self, service: str, op_code: str): + self.service = service + self.op_code = op_code + + def __repr__(self): + return f"CmdInfo(service={self.service!r}, op_code={self.op_code!r}" diff --git a/src/tmtccmd/tc/handler.py b/src/tmtccmd/tc/handler.py index f68b7f7b..ad6bbd10 100644 --- a/src/tmtccmd/tc/handler.py +++ b/src/tmtccmd/tc/handler.py @@ -1,10 +1,8 @@ from abc import abstractmethod -from typing import Union, Any - from tmtccmd.com_if.com_interface_base import CommunicationInterface -from tmtccmd.config import QueueCommands -from tmtccmd.config.definitions import TcQueueEntryArg +from tmtccmd.core.backend import ProcedureInfo +from tmtccmd.tc.definitions import TcQueueT, TcQueueEntryBase class TcHandlerBase: @@ -12,14 +10,18 @@ def __init__(self): pass @abstractmethod - def send_callback( - self, - tc_queue_entry: Union[bytes, QueueCommands], - com_if: CommunicationInterface, - queue_entry_arg: TcQueueEntryArg, - user_arg: Any, + def pre_send_cb( + self, tc_queue_entry: TcQueueEntryBase, com_if: CommunicationInterface ): pass - def feedback_call(self): + @abstractmethod + def pass_queue(self, info: ProcedureInfo) -> TcQueueT: + pass + + @abstractmethod + def queue_finished_cb(self, service: str, op_code: str): + pass + + def feed_cb(self): pass diff --git a/src/tmtccmd/tc/packer.py b/src/tmtccmd/tc/packer.py index b6aff100..24a4588e 100644 --- a/src/tmtccmd/tc/packer.py +++ b/src/tmtccmd/tc/packer.py @@ -16,15 +16,13 @@ LOGGER = get_console_logger() +""" class ServiceQueuePacker: def __init__(self): pass @staticmethod def pack_service_queue_core(service: int, op_code: str, service_queue: TcQueueT): - """ - Use hook object supplied by user - """ try: from tmtccmd.config.hook import get_global_hook_obj @@ -37,25 +35,13 @@ def pack_service_queue_core(service: int, op_code: str, service_queue: TcQueueT) "Could not import custom telecommand hook! Make sure to implement it." ) sys.exit(1) +""" -def default_single_packet_preparation() -> PusTelecommand: - return pack_service_17_ping_command(ssc=1700) - - -def default_service_queue_preparation( - service: Union[str, int], op_code: str, service_queue: TcQueueT -): +def ping_queue(service_queue: TcQueueT): from tmtccmd.config.definitions import CoreServiceList, QueueCommands - if service == CoreServiceList.SERVICE_5.value: - pack_generic_service5_test_into(service_queue) - elif service == CoreServiceList.SERVICE_17.value: - service_queue.appendleft( - (QueueCommands.PRINT, "Sending ping command PUS TC[17,1]") - ) - service_queue.appendleft( - pack_service_17_ping_command(ssc=1700).pack_command_tuple() - ) - else: - LOGGER.warning("Invalid Service!") + service_queue.appendleft((QueueCommands.PRINT, "Sending ping command PUS TC[17,1]")) + service_queue.appendleft( + pack_service_17_ping_command(ssc=1700).pack_command_tuple() + ) diff --git a/src/tmtccmd/tm/handler.py b/src/tmtccmd/tm/handler.py index 44829f2b..dde37223 100644 --- a/src/tmtccmd/tm/handler.py +++ b/src/tmtccmd/tm/handler.py @@ -1,7 +1,7 @@ from tmtccmd.tm.definitions import TmTypes -class TmHandler: +class TmHandlerBase: def __init__(self, tm_type: TmTypes): self._tm_type = tm_type From 9574e218596ca97e8a0281338aca78418d16767b Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 21 Jun 2022 19:32:17 +0200 Subject: [PATCH 055/221] refactored queue entry handling --- .../sendreceive/ccsds_sender_receiver.py | 77 +++++++++---------- src/tmtccmd/tc/definitions.py | 67 +++++++++++++--- src/tmtccmd/tc/helper.py | 25 ++++++ 3 files changed, 121 insertions(+), 48 deletions(-) create mode 100644 src/tmtccmd/tc/helper.py diff --git a/src/tmtccmd/sendreceive/ccsds_sender_receiver.py b/src/tmtccmd/sendreceive/ccsds_sender_receiver.py index 3012e1e4..be65055c 100644 --- a/src/tmtccmd/sendreceive/ccsds_sender_receiver.py +++ b/src/tmtccmd/sendreceive/ccsds_sender_receiver.py @@ -2,13 +2,23 @@ @author: R. Mueller """ import time +from typing import Optional + from tmtccmd.com_if.com_interface_base import CommunicationInterface from tmtccmd.config.definitions import QueueCommands, CoreGlobalIds from tmtccmd.logging import get_console_logger from tmtccmd.ccsds.handler import CcsdsTmHandler from tmtccmd.sendreceive.tm_listener import TmListener -from tmtccmd.tc.definitions import TcQueueEntryBase +from tmtccmd.tc.definitions import ( + TcQueueEntryBase, + TcQueueEntryType, + cast_pus_tc_entry_from_base, + cast_raw_tc_entry_from_base, + cast_print_entry_from_base, + cast_wait_entry_from_base, + cast_timeout_entry_from_base, +) from tmtccmd.core.globals_manager import get_global from tmtccmd.tc.handler import TcHandlerBase @@ -57,8 +67,8 @@ def __init__( self._timeout_counter = 0 # needed to store last actual TC packet from queue - self._last_tc = bytearray() - self._last_tc_obj = None + self._last_queue_entry: Optional[TcQueueEntryBase] = None + self._last_tc: Optional[TcQueueEntryBase] = None # this flag can be used to notify when the operation is finished self._operation_pending = False @@ -140,41 +150,37 @@ def check_queue_entry_static(tc_queue_entry: TcQueueEntryBase) -> bool: else: return False - def check_queue_entry(self, tc_queue_entry: TcQueueEntryBase) -> bool: + def check_queue_entry(self, queue_entry: TcQueueEntryBase) -> bool: """ Checks whether the entry in the pus_tc queue is a telecommand. - The last telecommand and respective information are stored in _last_tc - and _last_tc_info - :param tc_queue_entry: + :param queue_entry: Generic queue entry :return: True if queue entry is telecommand, False if it is not """ - queue_entry_first, queue_entry_second = tc_queue_entry - queue_entry_is_telecommand = False - - if isinstance(queue_entry_first, str): - LOGGER.warning("Invalid telecommand. Queue entry is a string!") - return queue_entry_is_telecommand + if not isinstance(queue_entry, TcQueueEntryBase): + LOGGER.warning("Invalid queue entry detected") + raise ValueError("Invalid queue entry detected") - if queue_entry_first == QueueCommands.WAIT: - wait_time = queue_entry_second - self._wait_period = wait_time + if queue_entry.etype == TcQueueEntryType.WAIT: + wait_entry = cast_wait_entry_from_base(queue_entry) + self._wait_period = wait_entry.wait_time self._wait_start = time.time() self._wait_end = self._wait_start + self._wait_period LOGGER.info(f"Waiting for {self._wait_period} seconds.") - # printout optimized for LOGGER and debugging - elif queue_entry_first == QueueCommands.PRINT: - LOGGER.info(queue_entry_second) - elif queue_entry_first == QueueCommands.RAW_PRINT: - LOGGER.info(f"Raw command: {queue_entry_second.hex(sep=',')}") - elif queue_entry_first == QueueCommands.SET_TIMEOUT: - self._tm_timeout = queue_entry_second - self._tm_listener.seq_timeout = queue_entry_second - else: - self._last_tc, self._last_tc_obj = (queue_entry_first, queue_entry_second) - return True - return queue_entry_is_telecommand - - def _check_for_tm_timeout(self, resend_tc: bool = False) -> bool: + elif queue_entry.etype == TcQueueEntryType.SET_TIMEOUT: + timeout_entry = cast_timeout_entry_from_base(queue_entry) + self._tm_timeout = timeout_entry.timeout_secs + self._tm_listener.seq_timeout = timeout_entry.timeout_secs + is_tc = False + if ( + queue_entry.etype == TcQueueEntryType.RAW_TC + or queue_entry.etype == TcQueueEntryType.PUS_TC + ): + self._last_tc = queue_entry + is_tc = True + self._last_queue_entry = queue_entry + return is_tc + + def _check_for_tm_timeout(self) -> bool: """ Checks whether a timeout after sending a telecommand has occured and sends telecommand again. If resending reached certain counter, exit the program. @@ -187,14 +193,7 @@ def _check_for_tm_timeout(self, resend_tc: bool = False) -> bool: self._operation_pending = False self._elapsed_time = time.time() - self._start_time if self._elapsed_time >= self._tm_timeout * self._tc_send_timeout_factor: - if resend_tc: - LOGGER.info("CommandSenderReceiver: Timeout, sending TC again !") - self._com_if.send(self._last_tc) - self._timeout_counter = self._timeout_counter + 1 - self._start_time = time.time() - return False - else: - # todo: we could also stop sending and clear the TC queue - return True + # TODO: The user should be able to select via Python code whether TCs should be resent + return True else: return False diff --git a/src/tmtccmd/tc/definitions.py b/src/tmtccmd/tc/definitions.py index a384a010..ee70e85c 100644 --- a/src/tmtccmd/tc/definitions.py +++ b/src/tmtccmd/tc/definitions.py @@ -1,11 +1,13 @@ +from __future__ import annotations from enum import Enum from typing import Deque +from typing import cast from spacepackets.ecss.tc import PusTelecommand class TcQueueEntryType(Enum): - PUS_CMD = "pus-cmd" - RAW_CMD = "raw-cmd" + PUS_TC = "pus-tc" + RAW_TC = "raw-tc" CUSTOM = "custom" PRINT = "print" WAIT = "wait" @@ -23,20 +25,67 @@ def __init__(self, etype: TcQueueEntryType): class PusTcEntry(TcQueueEntryBase): def __init__(self, pus_tc: PusTelecommand): - super().__init__(TcQueueEntryType.PUS_CMD) + super().__init__(TcQueueEntryType.PUS_TC) self.pus_tc = pus_tc + def __repr__(self): + return f"{self.__class__.__name__}(pus_tc={self.pus_tc!r}" + -class PrintEntry(TcQueueEntryBase): - def __init__(self, print_str: str): +class LogQueueEntry(TcQueueEntryBase): + def __init__(self, log_str: str): super().__init__(TcQueueEntryType.PRINT) - self.print_str = print_str + self.print_str = log_str + + def __repr__(self): + return f"{self.__class__.__name__}(print_str={self.print_str!r}" class RawTcEntry(TcQueueEntryBase): - def __init__(self, raw_tc: bytes): - super().__init__(TcQueueEntryType.RAW_CMD) - self.raw_tc = raw_tc + def __init__(self, tc: bytes): + super().__init__(TcQueueEntryType.RAW_TC) + self.tc = tc + + def __repr__(self): + return f"{self.__class__.__name__}(tc={self.tc!r}" + + +class WaitEntry(TcQueueEntryBase): + def __init__(self, wait_secs: float): + super().__init__(TcQueueEntryType.WAIT) + self.wait_time = wait_secs + + def __repr__(self): + return f"{self.__class__.__name__}(wait_time={self.wait_time!r}" + + +class TimeoutEntry(TcQueueEntryBase): + def __init__(self, timeout_secs: float): + super().__init__(TcQueueEntryType.SET_TIMEOUT) + self.timeout_secs = timeout_secs + + def __repr__(self): + return f"{self.__class__.__name__}(timeout_secs={self.timeout_secs!r}" + + +def cast_print_entry_from_base(base: TcQueueEntryBase) -> LogQueueEntry: + return cast(LogQueueEntry, base) + + +def cast_pus_tc_entry_from_base(base: TcQueueEntryBase) -> PusTcEntry: + return cast(PusTcEntry, base) + + +def cast_raw_tc_entry_from_base(base: TcQueueEntryBase) -> RawTcEntry: + return cast(RawTcEntry, base) + + +def cast_wait_entry_from_base(base: TcQueueEntryBase) -> WaitEntry: + return cast(WaitEntry, base) + + +def cast_timeout_entry_from_base(base: TcQueueEntryBase) -> TimeoutEntry: + return cast(TimeoutEntry, base) class ProcedureInfo: diff --git a/src/tmtccmd/tc/helper.py b/src/tmtccmd/tc/helper.py new file mode 100644 index 00000000..f5cfbd94 --- /dev/null +++ b/src/tmtccmd/tc/helper.py @@ -0,0 +1,25 @@ +from spacepackets.ecss import PusTelecommand +from tmtccmd.tc.definitions import ( + TcQueueT, + LogQueueEntry, + PusTcEntry, + RawTcEntry, + WaitEntry, +) + + +class QueueHelper: + def __init__(self, queue: TcQueueT): + self.queue = queue + + def add_log_cmd(self, print_str: str): + self.queue.appendleft(LogQueueEntry(print_str)) + + def add_pus_tc(self, pus_tc: PusTelecommand): + self.queue.appendleft(PusTcEntry(pus_tc)) + + def add_raw_tc(self, tc: bytes): + self.queue.appendleft(RawTcEntry(tc)) + + def add_wait(self, wait_secs: float): + self.queue.appendleft(WaitEntry(wait_secs)) From 781419ff4e4f8f63fb10f5d88f0eebf22e027aac Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 21 Jun 2022 19:49:47 +0200 Subject: [PATCH 056/221] some tweaks and improvements --- src/tmtccmd/sendreceive/seq_ccsds_sender_receiver.py | 7 ++++++- src/tmtccmd/tc/helper.py | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/tmtccmd/sendreceive/seq_ccsds_sender_receiver.py b/src/tmtccmd/sendreceive/seq_ccsds_sender_receiver.py index 5f8153b2..1ab039f2 100644 --- a/src/tmtccmd/sendreceive/seq_ccsds_sender_receiver.py +++ b/src/tmtccmd/sendreceive/seq_ccsds_sender_receiver.py @@ -51,7 +51,12 @@ def __init__( target=self.__perform_daemon_operation, daemon=True ) - def set_tc_queue(self, tc_queue: TcQueueT): + @property + def tc_queue(self): + return self._tc_queue + + @tc_queue.setter + def tc_queue(self, tc_queue: TcQueueT): self._tc_queue = tc_queue def send_queue_tc_and_receive_tm_sequentially(self): diff --git a/src/tmtccmd/tc/helper.py b/src/tmtccmd/tc/helper.py index f5cfbd94..9a1d0d56 100644 --- a/src/tmtccmd/tc/helper.py +++ b/src/tmtccmd/tc/helper.py @@ -8,7 +8,7 @@ ) -class QueueHelper: +class QueueWrapper: def __init__(self, queue: TcQueueT): self.queue = queue From 817ad463b751e6086582cf08de7c06cc6c19b8a8 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Wed, 22 Jun 2022 11:26:09 +0200 Subject: [PATCH 057/221] a lot more refactoring --- examples/config/hook_implementation.py | 10 +- examples/tmtccli.py | 4 +- src/tests/backend_mock.py | 4 +- src/tests/hook_obj_mock.py | 20 +- src/tests/test_global_manager.py | 8 +- src/tmtccmd/ccsds/handler.py | 2 +- src/tmtccmd/config/__init__.py | 33 +-- src/tmtccmd/config/args.py | 235 ++++++++---------- src/tmtccmd/config/{hook.py => cfg_hook.py} | 40 +-- src/tmtccmd/config/definitions.py | 87 ++----- src/tmtccmd/config/globals.py | 81 ++---- src/tmtccmd/config/tmtc_defs.py | 71 ++++++ src/tmtccmd/core/backend.py | 83 +++---- src/tmtccmd/core/frontend.py | 14 +- src/tmtccmd/runner.py | 10 +- src/tmtccmd/sendreceive/__init__.py | 0 .../ccsds_sender_receiver.py | 22 +- .../ccsds_seq_sender_receiver.py} | 42 ++-- src/tmtccmd/tc/definitions.py | 8 + src/tmtccmd/tc/handler.py | 10 +- src/tmtccmd/tc/helper.py | 25 -- src/tmtccmd/tc/queue.py | 33 +++ .../ccsds_tm_listener.py} | 19 +- src/tmtccmd/utility/countdown.py | 38 +++ 24 files changed, 411 insertions(+), 488 deletions(-) rename src/tmtccmd/config/{hook.py => cfg_hook.py} (73%) create mode 100644 src/tmtccmd/config/tmtc_defs.py delete mode 100644 src/tmtccmd/sendreceive/__init__.py rename src/tmtccmd/{sendreceive => tc}/ccsds_sender_receiver.py (89%) rename src/tmtccmd/{sendreceive/seq_ccsds_sender_receiver.py => tc/ccsds_seq_sender_receiver.py} (89%) create mode 100644 src/tmtccmd/tc/queue.py rename src/tmtccmd/{sendreceive/tm_listener.py => tm/ccsds_tm_listener.py} (96%) create mode 100644 src/tmtccmd/utility/countdown.py diff --git a/examples/config/hook_implementation.py b/examples/config/hook_implementation.py index 49f6ac32..7ef3c8df 100644 --- a/examples/config/hook_implementation.py +++ b/examples/config/hook_implementation.py @@ -2,7 +2,7 @@ from typing import Union, Tuple from tmtccmd.config.definitions import ServiceOpCodeDictT -from tmtccmd.config.hook import TmTcHookBase, ObjectIdDictT +from tmtccmd.config.cfg_hook import TmTcCfgHookBase, ObjectIdDictT from tmtccmd.logging import get_console_logger from tmtccmd.core.backend import TmTcHandler from tmtccmd.tc.definitions import TcQueueT @@ -13,7 +13,7 @@ LOGGER = get_console_logger() -class ExampleHookClass(TmTcHookBase): +class ExampleHookClass(TmTcCfgHookBase): def __init__(self, json_cfg_path: str): super().__init__(json_cfg_path=json_cfg_path) @@ -47,10 +47,10 @@ def get_object_ids(self) -> ObjectIdDictT: return get_core_object_ids() - def get_service_op_code_dictionary(self) -> ServiceOpCodeDictT: - from tmtccmd.config.globals import get_default_service_op_code_dict + def get_tmtc_definitions(self) -> ServiceOpCodeDictT: + from tmtccmd.config.globals import get_default_tmtc_defs - return get_default_service_op_code_dict() + return get_default_tmtc_defs() @staticmethod def handle_service_8_telemetry( diff --git a/examples/tmtccli.py b/examples/tmtccli.py index e52ffd86..f63b019d 100755 --- a/examples/tmtccli.py +++ b/examples/tmtccli.py @@ -6,7 +6,7 @@ from tmtccmd.config.args import ( create_default_args_parser, add_default_tmtccmd_args, - parse_default_input_arguments, + parse_default_tmtccmd_input_arguments, ) from tmtccmd.logging import get_console_logger @@ -22,7 +22,7 @@ def main(): hook_obj = ExampleHookClass(json_cfg_path=default_json_path()) arg_parser = create_default_args_parser() add_default_tmtccmd_args(arg_parser) - args = parse_default_input_arguments(arg_parser, hook_obj) + args = parse_default_tmtccmd_input_arguments(arg_parser, hook_obj) setup_args = SetupArgs(hook_obj=hook_obj, use_gui=False, apid=APID, cli_args=args) apid_handler = ApidTmHandlerBase( cb=default_ccsds_packet_handler, queue_len=50, user_args=None diff --git a/src/tests/backend_mock.py b/src/tests/backend_mock.py index a64c9e93..a7d9187b 100644 --- a/src/tests/backend_mock.py +++ b/src/tests/backend_mock.py @@ -3,7 +3,7 @@ from tmtccmd.core.backend import TmTcHandler from tmtccmd.ccsds.handler import CcsdsTmHandler from tmtccmd.config.com_if import create_communication_interface_default -from tmtccmd.sendreceive.tm_listener import TmListener +from tmtccmd.sendreceive.ccsds_tm_listener import CcsdsTmListener from tmtccmd.utility.tmtc_printer import FsfwTmTcPrinter, DisplayMode from tmtccmd.config.definitions import CoreComInterfaces, CoreModeList from tmtccmd.core.frontend_base import FrontendBase @@ -15,7 +15,7 @@ def create_backend_mock(tm_handler: CcsdsTmHandler) -> TmTcHandler: com_if_key=CoreComInterfaces.DUMMY.value, json_cfg_path="tmtc_config.json", ) - tm_listener = TmListener(com_if=com_if, seq_timeout=3.0) + tm_listener = CcsdsTmListener(com_if=com_if, seq_timeout=3.0) # The global variables are set by the argument parser. tmtc_backend = TmTcHandler( com_if=com_if, diff --git a/src/tests/hook_obj_mock.py b/src/tests/hook_obj_mock.py index 012b12eb..d2ad1577 100644 --- a/src/tests/hook_obj_mock.py +++ b/src/tests/hook_obj_mock.py @@ -10,17 +10,17 @@ from tmtccmd.tm.pus_3_hk_base import Service3Base from tmtccmd.core.backend import TmTcHandler from tmtccmd.tc.definitions import TcQueueT -from tmtccmd.config.hook import TmTcHookBase +from tmtccmd.config.cfg_hook import TmTcCfgHookBase from tmtccmd.logging import get_console_logger LOGGER = get_console_logger() -def create_hook_mock() -> TmTcHookBase: +def create_hook_mock() -> TmTcCfgHookBase: """Create simple minimal hook mock using the MagicMock facilities by unittest :return: """ - tmtc_hook_base = TmTcHookBase() + tmtc_hook_base = TmTcCfgHookBase() tmtc_hook_base.add_globals_pre_args_parsing = MagicMock(return_value=0) tmtc_hook_base.add_globals_post_args_parsing = MagicMock(return_value=0) tmtc_hook_base.custom_args_parsing = MagicMock( @@ -29,7 +29,7 @@ def create_hook_mock() -> TmTcHookBase: return tmtc_hook_base -def create_hook_mock_with_srv_handlers() -> TmTcHookBase: +def create_hook_mock_with_srv_handlers() -> TmTcCfgHookBase: tmtc_hook_base = create_hook_mock() tmtc_hook_base.handle_service_8_telemetry = MagicMock(return_value=(["Test"], [0])) # Valid returnvalue for now @@ -40,13 +40,13 @@ def create_hook_mock_with_srv_handlers() -> TmTcHookBase: return tmtc_hook_base -class TestHookObj(TmTcHookBase): +class TestHookObj(TmTcCfgHookBase): service_8_handler_called = False service_5_handler_called = False service_3_handler_called = False def __init__(self): - super(self, TmTcHookBase).__init__() + super(self, TmTcCfgHookBase).__init__() self.get_obj_id_called = False self.add_globals_pre_args_parsing_called = False self.add_globals_post_args_parsing_called = False @@ -58,7 +58,7 @@ def get_object_ids(self) -> Dict[bytes, list]: list. This list could contain containing the string representation or additional information about that object ID. """ - return TmTcHookBase.get_object_ids() + return TmTcCfgHookBase.get_object_ids() @abstractmethod def add_globals_pre_args_parsing(self, gui: bool = False): @@ -100,15 +100,15 @@ def assign_communication_interface( ) @abstractmethod - def get_service_op_code_dictionary(self) -> ServiceOpCodeDictT: + def get_tmtc_definitions(self) -> ServiceOpCodeDictT: """This is a dicitonary mapping services represented by strings to an operation code dictionary. :return: """ - from tmtccmd.config.globals import get_default_service_op_code_dict + from tmtccmd.config.globals import get_default_tmtc_defs - return get_default_service_op_code_dict() + return get_default_tmtc_defs() @abstractmethod def perform_mode_operation(self, tmtc_backend: TmTcHandler, mode: int): diff --git a/src/tests/test_global_manager.py b/src/tests/test_global_manager.py index 91b00bea..67c22d64 100644 --- a/src/tests/test_global_manager.py +++ b/src/tests/test_global_manager.py @@ -31,14 +31,12 @@ def test_global_module(self): set_default_globals_pre_args_parsing(gui=False, tc_apid=0x02, tm_apid=0x03) result = check_and_set_core_mode_arg(mode_arg="udp") - self.assertTrue(result == CoreModeList.SEQUENTIAL_CMD_MODE) + self.assertTrue(result == CoreModeList.ONE_QUEUE_MODE) result = check_and_set_core_mode_arg(mode_arg="listener") self.assertTrue(get_global(CoreGlobalIds.MODE) == CoreModeList.LISTENER_MODE) self.assertTrue(result == CoreModeList.LISTENER_MODE) result = check_and_set_core_mode_arg(mode_arg="seqcmd") - self.assertTrue( - get_global(CoreGlobalIds.MODE) == CoreModeList.SEQUENTIAL_CMD_MODE - ) - self.assertTrue(result == CoreModeList.SEQUENTIAL_CMD_MODE) + self.assertTrue(get_global(CoreGlobalIds.MODE) == CoreModeList.ONE_QUEUE_MODE) + self.assertTrue(result == CoreModeList.ONE_QUEUE_MODE) diff --git a/src/tmtccmd/ccsds/handler.py b/src/tmtccmd/ccsds/handler.py index 8339817e..30912ed7 100644 --- a/src/tmtccmd/ccsds/handler.py +++ b/src/tmtccmd/ccsds/handler.py @@ -3,7 +3,7 @@ from tmtccmd.tm.handler import TmHandlerBase from tmtccmd.tm.definitions import TelemetryQueueT, TmTypes -from tmtccmd.sendreceive.tm_listener import QueueListT +from tmtccmd.tm.ccsds_tm_listener import QueueListT from tmtccmd.logging import get_console_logger LOGGER = get_console_logger() diff --git a/src/tmtccmd/config/__init__.py b/src/tmtccmd/config/__init__.py index 56e7e84b..b254f253 100644 --- a/src/tmtccmd/config/__init__.py +++ b/src/tmtccmd/config/__init__.py @@ -1,36 +1,24 @@ import argparse -import collections.abc -from typing import Optional, Union, List, Dict +from typing import Optional from tmtccmd.config.globals import ( CoreServiceList, - add_op_code_entry, - add_service_op_code_entry, - generate_op_code_options, handle_mode_arg, check_and_set_other_args, handle_com_if_arg, ) from .definitions import ( - QueueCommands, CoreGlobalIds, - ServiceOpCodeDictT, OpCodeDictKeys, - HkReplyUnpacked, - DataReplyUnpacked, default_json_path, ) - -from tmtccmd.logging import get_console_logger -from tmtccmd.core.globals_manager import update_global - -from .hook import TmTcHookBase +from .cfg_hook import TmTcCfgHookBase class SetupArgs: def __init__( self, - hook_obj: TmTcHookBase, + hook_obj: TmTcCfgHookBase, use_gui: bool, apid: int, cli_args: Optional[argparse.Namespace], @@ -58,24 +46,13 @@ def __init__( self.json_cfg_path = default_json_path() +""" def pass_cli_args( setup_args: SetupArgs, custom_modes_list: Optional[List[Union[collections.abc.Iterable, Dict]]] = None, - custom_services_list: Optional[List[Union[collections.abc.Iterable, Dict]]] = None, custom_com_if_dict: Dict[str, any] = None, ): - """This function takes the argument namespace as a parameter and determines - a set of globals from the parsed arguments. - If custom dictionaries are specified, the developer should take care of specifying - integers as keys and the string representation of the command line argument as value. - This will be used for internalization. - :param setup_args: Setup arguments - :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_if_dict: List of collections or dictionaries containing customcommunication interfaces - :return: - """ logger = get_console_logger() args = setup_args.cli_args handle_mode_arg(args=args, custom_modes_list=custom_modes_list) @@ -113,3 +90,5 @@ def pass_cli_args( check_and_set_other_args(args=args) except AttributeError: logger.exception("Passed arguments are missing components.") + +""" diff --git a/src/tmtccmd/config/args.py b/src/tmtccmd/config/args.py index c4b7e5a1..8ac6603e 100644 --- a/src/tmtccmd/config/args.py +++ b/src/tmtccmd/config/args.py @@ -3,19 +3,16 @@ """ import argparse import sys -from typing import Optional +from typing import Optional, List +from dataclasses import dataclass from prompt_toolkit.completion import WordCompleter from prompt_toolkit.shortcuts import CompleteStyle import prompt_toolkit -from tmtccmd.config.definitions import ( - CoreModeList, - ServiceOpCodeDictT, - OpCodeEntryT, - OpCodeDictKeys, -) -from tmtccmd.config.hook import TmTcHookBase +from tmtccmd.config.definitions import CoreModeList +from tmtccmd.config.tmtc_defs import TmTcDefWrapper, OpCodeEntry +from tmtccmd.config.cfg_hook import TmTcCfgHookBase from tmtccmd.utility.conf_util import AnsiColors from tmtccmd.logging import get_console_logger @@ -41,6 +38,39 @@ def create_default_args_parser( ) +@dataclass +class ArgsGroup: + service: str + op_code: str + mode: str + listener: bool = False + interactive: bool = False + + +class TmtccmdArgsWrapper: + def __init__(self, descript_txt: Optional[str] = None): + self.args_parser = create_default_args_parser(descript_txt) + self.print_known_args = False + self.print_unknown_args = False + self.unknown_args = [""] + self.args = ArgsGroup("", "", "") + + def add_default_tmtccmd_args(self): + add_default_tmtccmd_args(self.args_parser) + + def parse(self, hook_obj: TmTcCfgHookBase): + args, self.unknown_args = parse_default_tmtccmd_input_arguments( + self.args_parser, + hook_obj, + print_known_args=self.print_known_args, + print_unknown_args=self.print_unknown_args, + ) + self.args.service = args.service + self.args.op_code = args.op_code + self.args.mode = args.mode + self.args.listener = args.listener + + def add_default_tmtccmd_args(parser: argparse.ArgumentParser): add_default_mode_arguments(parser) add_default_com_if_arguments(parser) @@ -49,46 +79,13 @@ def add_default_tmtccmd_args(parser: argparse.ArgumentParser): add_ethernet_arguments(parser) - parser.add_argument( - "--tctf", - type=float, - help="TC Timeout Factor. Multiplied with " - "TM Timeout, TC sent again after this time period. Default: 3.5", - default=3.5, - ) - parser.add_argument( - "-r", - "--raw-print", - help="Supply -r to print all raw TM data directly", - action="store_true", - ) - parser.add_argument( - "-d", - "--sh-display", - help="Supply -d to print short output", - action="store_true", - ) - parser.add_argument( - "-k", - "--hk", - dest="print_hk", - help="Supply -k or --hk to print HK data", - action="store_true", - ) - parser.add_argument( - "--rs", - dest="resend_tc", - help="Specify whether TCs are sent again after timeout", - action="store_true", - ) - -def parse_default_input_arguments( +def parse_default_tmtccmd_input_arguments( parser: argparse.ArgumentParser, - hook_obj: TmTcHookBase, + hook_obj: TmTcCfgHookBase, print_known_args: bool = False, print_unknown_args: bool = False, -) -> argparse.Namespace: +) -> (argparse.Namespace, List[str]): """Parses all input arguments :return: Input arguments contained in a special namespace and accessable by args. """ @@ -109,8 +106,8 @@ def parse_default_input_arguments( for argument in unknown: LOGGER.info(argument) - args_post_processing(args, unknown, hook_obj.get_service_op_code_dictionary()) - return args + args_post_processing(args, unknown, hook_obj.get_tmtc_definitions()) + return args, unknown def add_cfdp_parser(arg_parser: argparse.ArgumentParser): @@ -136,68 +133,72 @@ def add_cfdp_parser(arg_parser: argparse.ArgumentParser): def add_generic_arguments(arg_parser: argparse.ArgumentParser): arg_parser.add_argument( - "-s", "--service", type=str, help="Service to test", default=None + "-s", + "--service", + help="Procedure service code which is passed to the TC handler objects", + default=None, ) arg_parser.add_argument( "-o", "--op_code", - help="Operation code, which is passed to the TC packer functions", + help="Procedcure operation code, which is passed to the TC packer functions", default=None, ) arg_parser.add_argument( "-l", "--listener", - help="Determine whether the listener mode will be active after performing the operation", + help="The backend will be configured to go into listener mode after " + "finishing the first queue", action="store_true", - default=None, + default=False, + ) + arg_parser.add_argument( + "-i", + "--interactive", + help="Enables interactive or multi-queue mode, where the backend will be confiogured " + "to handle multiple queues", + action="store_true", + default=False, ) arg_parser.add_argument( "-t", "--tm_timeout", type=float, - help="TM Timeout when listening to verification sequence." - " Default: 5 seconds", - default=None, - ) - arg_parser.add_argument( - "--nl", - dest="print_log", - help="Supply --nl to suppress print output to log files.", - action="store_false", - ) - arg_parser.add_argument( - "--np", - dest="print_tm", - help="Supply --np to suppress print output to console.", - action="store_false", + help="Default inter-packet delay" " Default: 3 seconds", + default=3.0, ) def add_default_mode_arguments(arg_parser: argparse.ArgumentParser): from tmtccmd.config.definitions import CoreModeList, CoreModeStrings - help_text = "Core Modes. Default: seqcmd\n" - seq_help = ( - f"{CoreModeList.SEQUENTIAL_CMD_MODE} or " - f"{CoreModeStrings[CoreModeList.SEQUENTIAL_CMD_MODE]}: " - f"Sequential Command Mode\n" + help_text = f"Core Modes. Default: {CoreModeStrings[CoreModeList.ONE_QUEUE_MODE]}\n" + one_q = ( + f"{CoreModeList.ONE_QUEUE_MODE} or " + f"{CoreModeStrings[CoreModeList.ONE_QUEUE_MODE]}: " + f"One Queue Command Mode\n" ) listener_help = ( f"{CoreModeList.LISTENER_MODE} or {CoreModeStrings[CoreModeList.LISTENER_MODE]}: " f"Listener Mode\n" ) + multi_q = ( + f"{CoreModeList.MULTI_INTERACTIVE_QUEUE_MODE} or " + f"{CoreModeStrings[CoreModeList.MULTI_INTERACTIVE_QUEUE_MODE]}: " + f"Multi Queue and Interactive Command Mode\n" + ) gui_help = ( f"{CoreModeList.GUI_MODE} or " f"{CoreModeStrings[CoreModeList.GUI_MODE]}: " f"GUI mode\n" ) - help_text += seq_help + listener_help + gui_help + help_text += one_q + listener_help + gui_help arg_parser.add_argument( "-m", "--mode", type=str, help=help_text, - default=CoreModeStrings[CoreModeList.SEQUENTIAL_CMD_MODE], + default=CoreModeStrings[CoreModeList.ONE_QUEUE_MODE], ) @@ -237,18 +238,17 @@ def add_default_com_if_arguments(arg_parser: argparse.ArgumentParser): def add_ethernet_arguments(arg_parser: argparse.ArgumentParser): + arg_parser.add_argument("--h-ip", help="Host (Computer) IP. Default:''", default="") arg_parser.add_argument( - "--client-ip", help="Client(Computer) IP. Default:''", default="" - ) - arg_parser.add_argument( - "--board-ip", help="Board IP. Default: Localhost 127.0.0.1", default="127.0.0.1" + "--t-ip", help="Target IP. Default: Localhost 127.0.0.1", default="127.0.0.1" ) def args_post_processing( - args, unknown: list, service_op_code_dict: ServiceOpCodeDictT + args, unknown: list, service_op_code_dict: TmTcDefWrapper ) -> None: """Handles the parsed arguments. + :param service_op_code_dict: :param args: Namespace objects (see https://docs.python.org/dev/library/argparse.html#argparse.Namespace) :param unknown: List of unknown parameters. @@ -262,17 +262,17 @@ def args_post_processing( handle_empty_args(args, service_op_code_dict) -def handle_unspecified_args(args, service_op_code_dict: ServiceOpCodeDictT) -> None: +def handle_unspecified_args(args, tmtc_defs: TmTcDefWrapper) -> None: """If some arguments are unspecified, they are set here with (variable) default values. :param args: Arguments from calling parse method - :param service_op_code_dict: + :param tmtc_defs: :return: None """ from tmtccmd.config.definitions import CoreModeStrings if args.mode is None: - args.mode = CoreModeStrings[CoreModeList.SEQUENTIAL_CMD_MODE] - if service_op_code_dict is None: + args.mode = CoreModeStrings[CoreModeList.ONE_QUEUE_MODE] + if tmtc_defs is None: LOGGER.warning("Invalid Service to Op-Code dictionary detected") if args.service is None: args.service = "0" @@ -280,55 +280,22 @@ def handle_unspecified_args(args, service_op_code_dict: ServiceOpCodeDictT) -> N args.op_code = "0" return if args.service is None: - if args.mode == CoreModeStrings[CoreModeList.SEQUENTIAL_CMD_MODE]: + if args.mode == CoreModeStrings[CoreModeList.ONE_QUEUE_MODE]: LOGGER.info("No service argument (-s) specified, prompting from user..") # Try to get the service list from the hook base and prompt service from user - args.service = prompt_service(service_op_code_dict) + args.service = prompt_service(tmtc_defs) if args.op_code is None: current_service = args.service - args.op_code = prompt_op_code( - service_op_code_dict=service_op_code_dict, service=current_service - ) - if args.service is not None: - service_entry = service_op_code_dict.get(args.service) - if service_entry is not None: - op_code_value = service_op_code_dict[args.service][1] - op_code_options = None - op_code_value = op_code_value.get(args.op_code) - if op_code_value is not None: - op_code_options = op_code_value[1] - if op_code_options is not None and isinstance(op_code_options, dict): - if op_code_options.get(OpCodeDictKeys.ENTER_LISTENER_MODE): - if args.listener is None: - LOGGER.info( - "Detected op code configuration: Enter listener mode after command" - ) - args.listener = True - else: - LOGGER.warning( - "Detected op code listerner mode configuration but is " - "overriden by CLI argument" - ) - timeout = op_code_options.get(OpCodeDictKeys.TIMEOUT) - if timeout is not None: - if args.tm_timeout is None: - LOGGER.info( - f"Detected op code configuration: Set custom timeout {timeout}" - ) - args.tm_timeout = timeout - else: - LOGGER.warning( - "Detected op code timeout configuration but is overriden by " - "CLI argument" - ) + args.op_code = prompt_op_code(tmtc_defs, current_service) if args.tm_timeout is None: args.tm_timeout = 5.0 if args.listener is None: args.listener = False -def handle_empty_args(args, service_op_code_dict: ServiceOpCodeDictT) -> None: +def handle_empty_args(args, service_op_code_dict: TmTcDefWrapper) -> None: """If no args were supplied, request input from user directly. + :param service_op_code_dict: :param args: :return: """ @@ -336,7 +303,7 @@ def handle_empty_args(args, service_op_code_dict: ServiceOpCodeDictT) -> None: handle_unspecified_args(args, service_op_code_dict) -def prompt_service(service_op_code_dict: ServiceOpCodeDictT) -> str: +def prompt_service(tmtc_defs: TmTcDefWrapper) -> str: service_adjustment = 20 info_adjustment = 30 horiz_line_num = service_adjustment + info_adjustment + 3 @@ -347,10 +314,8 @@ def prompt_service(service_op_code_dict: ServiceOpCodeDictT) -> str: print(f" {horiz_line}") print(f"|{service_string} | {info_string}|") print(f" {horiz_line}") - srv_completer = build_service_word_completer( - service_op_code_dict=service_op_code_dict - ) - for service_entry in service_op_code_dict.items(): + srv_completer = build_service_word_completer(tmtc_defs) + for service_entry in tmtc_defs.defs.items(): try: adjusted_service_entry = service_entry[0].ljust(service_adjustment) adjusted_service_info = service_entry[1][0].ljust(info_adjustment) @@ -365,7 +330,7 @@ def prompt_service(service_op_code_dict: ServiceOpCodeDictT) -> str: completer=srv_completer, complete_style=CompleteStyle.MULTI_COLUMN, ) - if service_string in service_op_code_dict: + if service_string in tmtc_defs: LOGGER.info(f"Selected service: {service_string}") return service_string else: @@ -373,16 +338,16 @@ def prompt_service(service_op_code_dict: ServiceOpCodeDictT) -> str: def build_service_word_completer( - service_op_code_dict: ServiceOpCodeDictT, + tmtc_defs: TmTcDefWrapper, ) -> WordCompleter: srv_list = [] - for service_entry in service_op_code_dict.items(): + for service_entry in tmtc_defs.defs.items(): srv_list.append(service_entry[0]) srv_completer = WordCompleter(words=srv_list, ignore_case=True) return srv_completer -def prompt_op_code(service_op_code_dict: ServiceOpCodeDictT, service: str) -> str: +def prompt_op_code(tmtc_defs: TmTcDefWrapper, service: str) -> str: op_code_adjustment = 24 info_adjustment = 56 horz_line_num = op_code_adjustment + info_adjustment + 3 @@ -393,12 +358,12 @@ def prompt_op_code(service_op_code_dict: ServiceOpCodeDictT, service: str) -> st print(f" {horiz_line}") print(f"|{op_code_info_str} | {info_string}|") print(f" {horiz_line}") - if service in service_op_code_dict: - op_code_dict = service_op_code_dict[service][1] + if service in tmtc_defs.defs: + op_code_entry = tmtc_defs.op_code_entry(service) completer = build_op_code_word_completer( - service=service, op_code_dict=op_code_dict + service=service, op_code_entry=op_code_entry ) - for op_code_entry in op_code_dict.items(): + for op_code_entry in op_code_entry.op_code_dict.items(): adjusted_op_code_entry = op_code_entry[0].ljust(op_code_adjustment) adjusted_op_code_info = op_code_entry[1][0].ljust(info_adjustment) print(f"|{adjusted_op_code_entry} | {adjusted_op_code_info}|") @@ -408,7 +373,7 @@ def prompt_op_code(service_op_code_dict: ServiceOpCodeDictT, service: str) -> st completer=completer, complete_style=CompleteStyle.MULTI_COLUMN, ) - if op_code_string in op_code_dict: + if op_code_string in op_code_entry: LOGGER.info(f"Selected op code: {op_code_string}") return op_code_string else: @@ -421,10 +386,10 @@ def prompt_op_code(service_op_code_dict: ServiceOpCodeDictT, service: str) -> st def build_op_code_word_completer( - service: str, op_code_dict: OpCodeEntryT + service: str, op_code_entry: OpCodeEntry ) -> WordCompleter: op_code_list = [] - for op_code_entry in op_code_dict.items(): + for op_code_entry in op_code_entry.op_code_dict.items(): op_code_list.append(op_code_entry[0]) op_code_completer = WordCompleter(words=op_code_list, ignore_case=True) return op_code_completer diff --git a/src/tmtccmd/config/hook.py b/src/tmtccmd/config/cfg_hook.py similarity index 73% rename from src/tmtccmd/config/hook.py rename to src/tmtccmd/config/cfg_hook.py index 1d955e04..824e5f12 100644 --- a/src/tmtccmd/config/hook.py +++ b/src/tmtccmd/config/cfg_hook.py @@ -1,22 +1,18 @@ from abc import abstractmethod -from typing import Optional, Union +from typing import Optional -from tmtccmd.config.definitions import ( - ServiceOpCodeDictT, - DataReplyUnpacked, - default_json_path, -) +from tmtccmd.config.definitions import default_json_path +from tmtccmd.config.tmtc_defs import TmTcDefWrapper from tmtccmd.logging import get_console_logger from tmtccmd.utility.retval import RetvalDictT from tmtccmd.utility.obj_id import ObjectIdDictT from tmtccmd.core.base import BackendBase -from tmtccmd.tc.definitions import TcQueueT from tmtccmd.com_if.com_interface_base import CommunicationInterface LOGGER = get_console_logger() -class TmTcHookBase: +class TmTcCfgHookBase: """This hook allows users to adapt the TMTC commander core to the unique mission requirements. It is used by implementing all abstract functions and then passing the instance to the TMTC commander core. @@ -53,15 +49,15 @@ def assign_communication_interface( ) @abstractmethod - def get_service_op_code_dictionary(self) -> ServiceOpCodeDictT: + def get_tmtc_definitions(self) -> TmTcDefWrapper: """This is a dicitonary mapping services represented by strings to an operation code dictionary. :return: """ - from tmtccmd.config.globals import get_default_service_op_code_dict + from tmtccmd.config.globals import get_default_tmtc_defs - return get_default_service_op_code_dict() + return get_default_tmtc_defs() @abstractmethod def perform_mode_operation(self, tmtc_backend: BackendBase, mode: int): @@ -72,30 +68,12 @@ def perform_mode_operation(self, tmtc_backend: BackendBase, mode: int): """ pass - @abstractmethod - def pack_service_queue( - self, service: Union[int, str], op_code: str, tc_queue: TcQueueT - ): - """Overriding this function allows the user to package a telecommand queue for a given - service and operation code combination. - - :param service: - :param op_code: - :param tc_queue: - :return: - """ - pass - - def feedback_handler(self, com_if: CommunicationInterface, tc_queue: TcQueueT): - """This function will be called""" - pass - def get_retval_dict(self) -> RetvalDictT: LOGGER.info("No return value dictionary specified") return dict() -def get_global_hook_obj() -> Optional[TmTcHookBase]: +def get_global_hook_obj() -> Optional[TmTcCfgHookBase]: """This function can be used to get the handle to the global hook object. :return: """ @@ -109,7 +87,7 @@ def get_global_hook_obj() -> Optional[TmTcHookBase]: if hook_obj_raw is None: LOGGER.error("Hook object is invalid!") return None - return cast(TmTcHookBase, hook_obj_raw) + return cast(TmTcCfgHookBase, hook_obj_raw) except ImportError: LOGGER.exception("Issues importing modules to get global hook handle!") return None diff --git a/src/tmtccmd/config/definitions.py b/src/tmtccmd/config/definitions.py index 6d5b6c90..fa4b93c1 100644 --- a/src/tmtccmd/config/definitions.py +++ b/src/tmtccmd/config/definitions.py @@ -1,11 +1,7 @@ """Definitions for the TMTC commander core """ import enum -from typing import Tuple, Dict, Optional, List, Union, Callable, Any - -from spacepackets.ecss import PusTelecommand - -from tmtccmd.com_if.com_interface_base import CommunicationInterface +from typing import Tuple, Dict def default_json_path() -> str: @@ -58,18 +54,6 @@ class OpCodeDictKeys(enum.IntEnum): ENTER_LISTENER_MODE = CoreGlobalIds.USE_LISTENER_AFTER_OP -# Service Op Code Dictionary Types -ServiceNameT = str -ServiceInfoT = str -OpCodeNameT = Union[str, List[str]] -OpCodeInfoT = str -# Operation code options are optional. If none are supplied, default values are assumed -OpCodeOptionsT = Optional[Dict[OpCodeDictKeys, any]] -OpCodeEntryT = Dict[OpCodeNameT, Tuple[OpCodeInfoT, OpCodeOptionsT]] -# It is possible to specify a service without any op codes -ServiceDictValueT = Optional[Tuple[ServiceInfoT, OpCodeEntryT]] -ServiceOpCodeDictT = Dict[ServiceNameT, ServiceDictValueT] - # Com Interface Types ComIFValueT = Tuple[str, any] ComIFDictT = Dict[str, ComIFValueT] @@ -77,53 +61,6 @@ class OpCodeDictKeys(enum.IntEnum): EthernetAddressT = Tuple[str, int] -class QueueCommands(enum.Enum): - PRINT = "print" - RAW_PRINT = "raw_print" - WAIT = "wait" - SET_TIMEOUT = "set_timeout" - - -TcQueueEntryArg = Any -UserArg = Any -"""Third Argument: Second argument in TC queue tuple. Fouth Argument -""" -UsrSendCbT = Callable[ - [Union[bytes, QueueCommands], CommunicationInterface, TcQueueEntryArg, UserArg], - None, -] - - -class DataReplyUnpacked: - def __init__(self): - # Name of the data fields inside a data set - self.header_list = [] - # Corresponding list of content - self.content_list = [] - - -class HkReplyUnpacked(DataReplyUnpacked): - def __init__(self): - super().__init__() - # Validity buffer - self.validity_buffer = bytearray() - # Number of variables contained in HK set - self._num_of_vars = None - - @property - def num_of_vars(self): - """Unless set to a specific number, will return the length of the content list - :return: - """ - if self._num_of_vars is None: - return len(self.header_list) - return self._num_of_vars - - @num_of_vars.setter - def num_of_vars(self, num_of_vars: int): - self._num_of_vars = num_of_vars - - class CoreComInterfaces(enum.Enum): DUMMY = "dummy" SERIAL_DLE = "ser_dle" @@ -147,23 +84,27 @@ class CoreComInterfaces(enum.Enum): # Mode options, set by args parser class CoreModeList(enum.IntEnum): - SEQUENTIAL_CMD_MODE = 0 + # This mode is optimized to handle one queue. It will configure the backend to request + # program termination upon finishing the queue handling. This is also the appropriate solution + # for single commands where the queue only consists of one telecommand. + ONE_QUEUE_MODE = 0 LISTENER_MODE = 1 + # Interactive GUI mode which allows sending and handling procedures interactively GUI_MODE = 2 + # This mode is optimized for the handling of multiple queues. It will configure the backend + # to request additional queues or a mode change from the user instead of requesting program + # termination + MULTI_INTERACTIVE_QUEUE_MODE = 3 + # The program will not do anything in this mode. This includes polling TM and sending any TCs IDLE = 5 - # will start a daemon handling tm and return after sending one tc - CONTINUOUS_MODE = 7 - # The user can interactively specify the next queue to send and when to exit or switch - # to listener mode - FEEDBACK_MODE = 8 CoreModeStrings = { - CoreModeList.SEQUENTIAL_CMD_MODE: "seqcmd", + CoreModeList.ONE_QUEUE_MODE: "one-q", + CoreModeList.MULTI_INTERACTIVE_QUEUE_MODE: "multi-q", CoreModeList.LISTENER_MODE: "listener", + CoreModeList.IDLE: "idle", CoreModeList.GUI_MODE: "gui", - CoreModeList.CONTINUOUS_MODE: "continuous", - CoreModeList.FEEDBACK_MODE: "feedback", } diff --git a/src/tmtccmd/config/globals.py b/src/tmtccmd/config/globals.py index b8317a72..95146676 100644 --- a/src/tmtccmd/config/globals.py +++ b/src/tmtccmd/config/globals.py @@ -1,7 +1,6 @@ -import argparse import collections.abc import pprint -from typing import Union, List, Dict, Optional +from typing import Union, List, Dict from tmtccmd.logging import get_console_logger @@ -21,18 +20,13 @@ CoreModeStrings, CoreComInterfacesDict, CoreComInterfaces, - DEBUG_MODE, - ServiceOpCodeDictT, - OpCodeDictKeys, ComIFDictT, - OpCodeEntryT, - OpCodeOptionsT, - OpCodeNameT, ) from tmtccmd.com_if.com_if_utilities import determine_com_if +from .tmtc_defs import TmTcDefWrapper, OpCodeEntry LOGGER = get_console_logger() -SERVICE_OP_CODE_DICT = dict() +DEF_WRAPPER = TmTcDefWrapper() def set_json_cfg_path(json_cfg_path: str): @@ -192,9 +186,9 @@ def check_and_set_core_mode_arg( if mode_arg_invalid: LOGGER.warning( f"Passed mode argument might be invalid, " - f"setting to {CoreModeList.SEQUENTIAL_CMD_MODE}" + f"setting to {CoreModeList.ONE_QUEUE_MODE}" ) - mode_value = CoreModeList.SEQUENTIAL_CMD_MODE + mode_value = CoreModeList.ONE_QUEUE_MODE update_global(CoreGlobalIds.MODE, mode_value) return mode_value @@ -233,50 +227,21 @@ def check_and_set_core_service_arg( update_global(CoreGlobalIds.CURRENT_SERVICE, service_value) -def get_default_service_op_code_dict() -> ServiceOpCodeDictT: - global SERVICE_OP_CODE_DICT - service_op_code_dict = SERVICE_OP_CODE_DICT - if service_op_code_dict == dict(): - op_code_dict_srv_5 = { - "0": ("Event Test", {OpCodeDictKeys.TIMEOUT: 2.0}), - } - service_5_tuple = ("PUS Service 5 Event", op_code_dict_srv_5) - op_code_dict_srv_17 = { - "0": ("Ping Test", {OpCodeDictKeys.TIMEOUT: 2.2}), - } - service_17_tuple = ("PUS Service 17 Test", op_code_dict_srv_17) - - service_op_code_dict[CoreServiceList.SERVICE_5.value] = service_5_tuple - service_op_code_dict[CoreServiceList.SERVICE_17.value] = service_17_tuple - # SERVICE_OP_CODE_DICT = service_op_code_dict - return service_op_code_dict - - -def add_op_code_entry( - op_code_dict: OpCodeEntryT, - keys: OpCodeNameT, - info: str, - options: OpCodeOptionsT = None, -): - if isinstance(keys, str): - keys = [keys] - op_code_dict.update(OpCodeEntryT.fromkeys(keys, (info, options))) - - -def add_service_op_code_entry( - srv_op_code_dict: ServiceOpCodeDictT, - name: str, - info: str, - op_code_entry: OpCodeEntryT, -): - srv_op_code_dict.update({name: (info, op_code_entry)}) - - -def generate_op_code_options( - enter_listener_mode: bool = False, custom_timeout: Optional[float] = None -) -> dict: - op_code_opts = dict() - op_code_opts.update({OpCodeDictKeys.ENTER_LISTENER_MODE: enter_listener_mode}) - if custom_timeout is not None: - op_code_opts.update({OpCodeDictKeys.TIMEOUT: custom_timeout}) - return op_code_opts +def get_default_tmtc_defs() -> TmTcDefWrapper: + global DEF_WRAPPER + if DEF_WRAPPER == dict(): + srv_5 = OpCodeEntry() + srv_5.add("0", "Event Test") + DEF_WRAPPER.add_service( + service_name=CoreServiceList.SERVICE_5.value, + info="PUS Service 5 Event", + op_code_entry=srv_5, + ) + srv_17 = OpCodeEntry() + srv_17.add("0", "Ping Test") + DEF_WRAPPER.add_service( + service_name=CoreServiceList.SERVICE_17.value, + info="PUS Service 17 Test", + op_code_entry=srv_17, + ) + return DEF_WRAPPER diff --git a/src/tmtccmd/config/tmtc_defs.py b/src/tmtccmd/config/tmtc_defs.py new file mode 100644 index 00000000..e62aa481 --- /dev/null +++ b/src/tmtccmd/config/tmtc_defs.py @@ -0,0 +1,71 @@ +from typing import Union, List, Optional, Dict, Tuple + +ServiceNameT = str +ServiceInfoT = str +OpCodeNameT = Union[str, List[str]] +OpCodeInfoT = str + + +class OpCodeOptionBase: + def __init__(self): + pass + + +OpCodeDictT = Dict[str, Tuple[OpCodeInfoT, OpCodeOptionBase]] + + +class OpCodeEntry: + def __init__(self): + self._op_code_dict: OpCodeDictT = dict() + + def add( + self, + keys: OpCodeNameT, + info: str, + options: OpCodeOptionBase = OpCodeOptionBase(), + ): + if isinstance(keys, str): + keys = [keys] + self._op_code_dict.update(OpCodeDictT.fromkeys(keys, (info, options))) + + def sort(self): + self._op_code_dict = { + key: self._op_code_dict[key] for key in sorted(self._op_code_dict.keys()) + } + + def info(self, op_code: str) -> Optional[str]: + entry_tuple = self._op_code_dict.get(op_code) + if entry_tuple is not None: + return entry_tuple[0] + + @property + def op_code_dict(self): + return self._op_code_dict + + +# It is possible to specify a service without any op codes +ServiceDictValueT = Optional[Tuple[ServiceInfoT, OpCodeEntry]] +ServiceOpCodeDictT = Dict[ServiceNameT, ServiceDictValueT] + + +class TmTcDefWrapper: + def __init__(self): + self.defs: ServiceOpCodeDictT = dict() + pass + + def add_service( + self, + service_name: str, + info: str, + op_code_entry: OpCodeEntry, + ): + self.defs.update({service_name: (info, op_code_entry)}) + + def op_code_entry(self, service_name: str) -> Optional[OpCodeEntry]: + srv_entry = self.defs.get(service_name) + if srv_entry is not None: + return srv_entry[1] + return None + + def sort(self): + self.defs = {key: self.defs[key] for key in sorted(self.defs.keys())} diff --git a/src/tmtccmd/core/backend.py b/src/tmtccmd/core/backend.py index 2dc123be..749df595 100644 --- a/src/tmtccmd/core/backend.py +++ b/src/tmtccmd/core/backend.py @@ -2,21 +2,21 @@ import time import sys from threading import Thread -from collections import deque from typing import cast, Optional -from tmtccmd.config.hook import TmTcHookBase +from tmtccmd.config.cfg_hook import TmTcCfgHookBase from tmtccmd.config.definitions import CoreServiceList, CoreModeList from tmtccmd.core.base import BackendBase, BackendResult, Request -from tmtccmd.tc.definitions import TcQueueT, ProcedureInfo +from tmtccmd.tc.definitions import ProcedureInfo from tmtccmd.tc.handler import TcHandlerBase +from tmtccmd.tc.queue import QueueWrapper from tmtccmd.tm.definitions import TmTypes from tmtccmd.tm.handler import TmHandlerBase from tmtccmd.logging import get_console_logger -from tmtccmd.sendreceive.seq_ccsds_sender_receiver import ( +from tmtccmd.tc.ccsds_seq_sender_receiver import ( SequentialCcsdsSenderReceiver, ) -from tmtccmd.sendreceive.tm_listener import TmListener +from tmtccmd.tm.ccsds_tm_listener import CcsdsTmListener from tmtccmd.ccsds.handler import CcsdsTmHandler from tmtccmd.com_if.com_interface_base import CommunicationInterface @@ -29,9 +29,9 @@ class TmTcHandler(BackendBase): def __init__( self, - hook_obj: TmTcHookBase, + hook_obj: TmTcCfgHookBase, com_if: CommunicationInterface, - tm_listener: TmListener, + tm_listener: CcsdsTmListener, tm_handler: TmHandlerBase, tc_handler: TcHandlerBase, ): @@ -56,16 +56,14 @@ def __init__( apid_queue_len_tuple[0], apid_queue_len_tuple[1] ) self.exit_on_com_if_init_failure = True - self.single_command_package = bytearray(), None - - # WIP: optionally having a receiver run in the background - self.daemon_receiver = SequentialCcsdsSenderReceiver( + self._queue_wrapper = QueueWrapper(None) + self._seq_handler = SequentialCcsdsSenderReceiver( com_if=self.__com_if, tm_handler=self.__tm_handler, tm_listener=self.__tm_listener, - tc_queue=deque(), tc_handler=tc_handler, apid=self.__apid, + queue_wrapper=self._queue_wrapper, ) def get_com_if_id(self): @@ -105,7 +103,6 @@ def apid(self) -> int: @apid.setter def apid(self, apid: int): self.__apid = apid - self.daemon_receiver._apid = apid @staticmethod def start_handler(executed_handler): @@ -146,8 +143,6 @@ def start_listener(self, perform_op_immediately: bool = True): except IOError: self.__listener_io_error_handler("started") self.__com_if_active = True - if self.mode == CoreModeList.CONTINUOUS_MODE: - self.daemon_receiver.start_daemon() if perform_op_immediately: self.periodic_op() @@ -202,18 +197,21 @@ def __com_if_closing(self): else: time.sleep(0.2) - def start_daemon_receiver(self): - try: - self.daemon_receiver.start_daemon() - except RuntimeError: - LOGGER.error("Error when starting daemon receiver. Not starting it") - except Exception as e: - LOGGER.exception( - f"Unknown exception {e} when starting daemon receiver. Not starting it" - ) - def __handle_action(self): """Command handling.""" + # TODO: It should be possible to call this function discretely. This avoids having to + # start receiver threads in the backgrounds. The backend should then perform the + # periodic TM polling here, with a configurable polling frequency. + # In total this needs to be done like this: In One Queue Mode, request a queue + # from the user if there is not one available yet. If one is available, consume it + # on every operation call. If the queue was consumed, request program termination + # or mode change. This is done using the one-shot flag, so the ONE SHOT MODE is tied + # to that flag. + # For multi-mode do the same, but instead of requesting program termination, use + # the feed function of the TC handler to request another queue + # TODO: This this that is done for the listener mode: Do it for all modes with a + # configurable polling delay. TM should be polled and handled independently of TC, + # or tying them together in some way should remain a user option if self.mode == CoreModeList.LISTENER_MODE: if self.__tm_listener.reply_event(): LOGGER.info("TmTcHandler: Packets received.") @@ -223,29 +221,24 @@ def __handle_action(self): packet_queue_list=packet_queues ) self.__tm_listener.clear_reply_event() - elif self.mode == CoreModeList.SEQUENTIAL_CMD_MODE: + elif self.mode == CoreModeList.ONE_QUEUE_MODE: service_queue = self.__prepare_tc_queue() if service_queue is None: return LOGGER.info("Performing sequential command operation") - sender_and_receiver = SequentialCcsdsSenderReceiver( - com_if=self.__com_if, - tm_handler=self.__tm_handler, - tm_listener=self.__tm_listener, - tc_queue=service_queue, - apid=self.__apid, - tc_handler=self.__tc_handler, - ) - sender_and_receiver.send_queue_tc_and_receive_tm_sequentially() + # TODO: Some sort of reset mode for sequence handler? In total, we should request + # the queue from the user somehow and then handle it. After finishing the + # handling, request termination from the user. This mode will be optimized + # for handling a single queue, so the default behaviour should be to handle + # the queue and then request program termination. Alternatively, the user should + # be able to switch the mode + self._seq_handler.queue_wrapper = service_queue + self._seq_handler.send_queue_tc_and_receive_tm_sequentially() self.mode = CoreModeList.LISTENER_MODE - elif self.mode == CoreModeList.CONTINUOUS_MODE: - service_queue = self.__prepare_tc_queue() - if service_queue is None: - return - LOGGER.info("Performing service command operation") - self.daemon_receiver.set_tc_queue(service_queue) - self.daemon_receiver.send_queue_tc_and_return() - elif self.mode == CoreModeList.FEEDBACK_MODE: + elif self.mode == CoreModeList.MULTI_INTERACTIVE_QUEUE_MODE: + # TODO: Handle the queue as long as the current one is full. If it is finished, + # request another queue or further instructions from the user, maybe in form + # of a special object, using the TC handler feed function pass else: try: @@ -256,8 +249,8 @@ def __handle_action(self): print(error) LOGGER.error("Custom mode handling module not provided!") - def __prepare_tc_queue(self) -> Optional[TcQueueT]: - service_queue = self.__tc_handler.pass_queue(self.current_proc_info) + def __prepare_tc_queue(self) -> Optional[QueueWrapper]: + service_queue = self.__tc_handler.feed_cb(self.current_proc_info) if not self.__com_if.valid: return None return service_queue diff --git a/src/tmtccmd/core/frontend.py b/src/tmtccmd/core/frontend.py index e4d78fb4..618b86c1 100644 --- a/src/tmtccmd/core/frontend.py +++ b/src/tmtccmd/core/frontend.py @@ -30,9 +30,9 @@ from tmtccmd.core.frontend_base import FrontendBase from tmtccmd.core.backend import TmTcHandler -from tmtccmd.config.hook import TmTcHookBase +from tmtccmd.config.cfg_hook import TmTcCfgHookBase from tmtccmd.config.definitions import CoreGlobalIds, CoreModeList, CoreComInterfaces -from tmtccmd.config.hook import get_global_hook_obj +from tmtccmd.config.cfg_hook import get_global_hook_obj from tmtccmd.logging import get_console_logger from tmtccmd.core.globals_manager import get_global, update_global from tmtccmd.com_if.tcpip_utilities import TcpIpConfigIds @@ -133,7 +133,7 @@ def run(self): class TmTcFrontend(QMainWindow, FrontendBase): def __init__( - self, hook_obj: TmTcHookBase, tmtc_backend: TmTcHandler, app_name: str + self, hook_obj: TmTcCfgHookBase, tmtc_backend: TmTcHandler, app_name: str ): super(TmTcFrontend, self).__init__() super(QMainWindow, self).__init__() @@ -218,7 +218,7 @@ def __start_seq_cmd_op(self): self._tmtc_handler.current_proc_info = ProcedureInfo( self._current_service, self._current_op_code ) - self._tmtc_handler.mode = CoreModeList.SEQUENTIAL_CMD_MODE + self._tmtc_handler.mode = CoreModeList.ONE_QUEUE_MODE self.__worker.set_op_code(WorkerOperationsCodes.SEQUENTIAL_COMMANDING) self.__worker.command_executed.connect(self.__finish_seq_cmd_op) @@ -364,13 +364,13 @@ def __set_up_service_op_code_section(self, grid: QGridLayout, row: int): combo_box_services = QComboBox() default_service = get_global(CoreGlobalIds.CURRENT_SERVICE) - self.service_op_code_dict = self._hook_obj.get_service_op_code_dictionary() + self.service_op_code_dict = self._hook_obj.get_tmtc_definitions() if self.service_op_code_dict is None: LOGGER.warning("Invalid service to operation code dictionary") LOGGER.warning("Setting default dictionary") - from tmtccmd.config.globals import get_default_service_op_code_dict + from tmtccmd.config.globals import get_default_tmtc_defs - self.service_op_code_dict = get_default_service_op_code_dict() + self.service_op_code_dict = get_default_tmtc_defs() index = 0 default_index = 0 for service_key, service_value in self.service_op_code_dict.items(): diff --git a/src/tmtccmd/runner.py b/src/tmtccmd/runner.py index 62dcd06a..ca8a0af0 100644 --- a/src/tmtccmd/runner.py +++ b/src/tmtccmd/runner.py @@ -6,7 +6,7 @@ from spacepackets.ecss.conf import get_default_tc_apid from tmtccmd import __version__ -from tmtccmd.config import SetupArgs, TmTcHookBase, CoreGlobalIds, pass_cli_args +from tmtccmd.config import SetupArgs, TmTcCfgHookBase, CoreGlobalIds, pass_cli_args from tmtccmd.core.backend import BackendBase from tmtccmd.core.frontend_base import FrontendBase from tmtccmd.tm.definitions import TmTypes @@ -109,7 +109,7 @@ def init_and_start_daemons(tmtc_backend: BackendBase): __start_tmtc_commander_cli(tmtc_backend=tmtc_backend, perform_op_immediately=False) -def __assign_tmtc_commander_hooks(hook_object: TmTcHookBase): +def __assign_tmtc_commander_hooks(hook_object: TmTcCfgHookBase): if hook_object is None: raise ValueError # Insert hook object handle into global dictionary so it can be used by the TMTC commander @@ -160,7 +160,7 @@ def __start_tmtc_commander_qt_gui( app = QApplication([app_name]) if tmtc_frontend is None: from tmtccmd.core.frontend import TmTcFrontend - from tmtccmd.config.hook import get_global_hook_obj + from tmtccmd.config.cfg_hook import get_global_hook_obj from tmtccmd.core.backend import TmTcHandler tmtc_frontend = TmTcFrontend( @@ -194,7 +194,7 @@ def create_default_tmtc_backend( """ global __SETUP_WAS_CALLED from tmtccmd.core.backend import TmTcHandler - from tmtccmd.sendreceive.tm_listener import TmListener + from tmtccmd.sendreceive.ccsds_tm_listener import CcsdsTmListener from typing import cast if not __SETUP_WAS_CALLED: @@ -214,7 +214,7 @@ def create_default_tmtc_backend( com_if_key=get_global(CoreGlobalIds.COM_IF) ) tm_timeout = get_global(CoreGlobalIds.TM_TIMEOUT) - tm_listener = TmListener(com_if=com_if, seq_timeout=tm_timeout) + tm_listener = CcsdsTmListener(com_if=com_if, seq_timeout=tm_timeout) # The global variables are set by the argument parser. tmtc_backend = TmTcHandler( hook_obj=setup_args.hook_obj, diff --git a/src/tmtccmd/sendreceive/__init__.py b/src/tmtccmd/sendreceive/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/src/tmtccmd/sendreceive/ccsds_sender_receiver.py b/src/tmtccmd/tc/ccsds_sender_receiver.py similarity index 89% rename from src/tmtccmd/sendreceive/ccsds_sender_receiver.py rename to src/tmtccmd/tc/ccsds_sender_receiver.py index be65055c..56f90b0a 100644 --- a/src/tmtccmd/sendreceive/ccsds_sender_receiver.py +++ b/src/tmtccmd/tc/ccsds_sender_receiver.py @@ -5,11 +5,11 @@ from typing import Optional from tmtccmd.com_if.com_interface_base import CommunicationInterface -from tmtccmd.config.definitions import QueueCommands, CoreGlobalIds +from tmtccmd.config.definitions import CoreGlobalIds from tmtccmd.logging import get_console_logger from tmtccmd.ccsds.handler import CcsdsTmHandler -from tmtccmd.sendreceive.tm_listener import TmListener +from tmtccmd.tm.ccsds_tm_listener import CcsdsTmListener from tmtccmd.tc.definitions import ( TcQueueEntryBase, TcQueueEntryType, @@ -34,7 +34,7 @@ class CcsdsCommandSenderReceiver: def __init__( self, com_if: CommunicationInterface, - tm_listener: TmListener, + tm_listener: CcsdsTmListener, tm_handler: CcsdsTmHandler, tc_handler: TcHandlerBase, apid: int, @@ -56,7 +56,7 @@ def __init__( LOGGER.error("CommandSenderReceiver: Invalid communication interface!") raise TypeError("CommandSenderReceiver: Invalid communication interface!") - if isinstance(tm_listener, TmListener): + if isinstance(tm_listener, CcsdsTmListener): self._tm_listener = tm_listener else: LOGGER.error("CommandSenderReceiver: Invalid TM listener!") @@ -136,20 +136,6 @@ def wait_period_ongoing( else: return False - @staticmethod - def check_queue_entry_static(tc_queue_entry: TcQueueEntryBase) -> bool: - """Static method to check whether a queue entry is a valid telecommand""" - queue_entry_first, queue_entry_second = tc_queue_entry - if isinstance(queue_entry_first, str): - LOGGER.warning("Invalid telecommand. Queue entry is a string!") - return False - if isinstance(queue_entry_first, QueueCommands): - return False - elif isinstance(queue_entry_first, bytearray): - return True - else: - return False - def check_queue_entry(self, queue_entry: TcQueueEntryBase) -> bool: """ Checks whether the entry in the pus_tc queue is a telecommand. diff --git a/src/tmtccmd/sendreceive/seq_ccsds_sender_receiver.py b/src/tmtccmd/tc/ccsds_seq_sender_receiver.py similarity index 89% rename from src/tmtccmd/sendreceive/seq_ccsds_sender_receiver.py rename to src/tmtccmd/tc/ccsds_seq_sender_receiver.py index 1ab039f2..ea79416e 100644 --- a/src/tmtccmd/sendreceive/seq_ccsds_sender_receiver.py +++ b/src/tmtccmd/tc/ccsds_seq_sender_receiver.py @@ -3,13 +3,14 @@ import time import threading -from tmtccmd.sendreceive.ccsds_sender_receiver import CcsdsCommandSenderReceiver +from tmtccmd.tc.ccsds_sender_receiver import CcsdsCommandSenderReceiver +from tmtccmd.tc.handler import TcHandlerBase +from tmtccmd.tc.queue import QueueWrapper from tmtccmd.ccsds.handler import CcsdsTmHandler -from tmtccmd.sendreceive.tm_listener import TmListener +from tmtccmd.tm.ccsds_tm_listener import CcsdsTmListener from tmtccmd.com_if.com_interface_base import CommunicationInterface from tmtccmd.logging import get_console_logger -from tmtccmd.tc.definitions import TcQueueT -from tmtccmd.tc.handler import TcHandlerBase + LOGGER = get_console_logger() @@ -19,9 +20,9 @@ class SequentialCcsdsSenderReceiver(CcsdsCommandSenderReceiver): def __init__( self, - tc_queue: TcQueueT, + queue_wrapper: QueueWrapper, com_if: CommunicationInterface, - tm_listener: TmListener, + tm_listener: CcsdsTmListener, tm_handler: CcsdsTmHandler, tc_handler: TcHandlerBase, apid: int, @@ -39,7 +40,7 @@ def __init__( tc_handler=tc_handler, ) self._tc_handler = tc_handler - self._tc_queue = tc_queue + self._queue_wrapper = queue_wrapper self.__all_replies_received = False # This flag can be used to notify the sender to send the next TC self._next_send_condition = False @@ -52,12 +53,15 @@ def __init__( ) @property - def tc_queue(self): - return self._tc_queue + def queue_wrapper(self): + return self._queue_wrapper + + @queue_wrapper.setter + def queue_wrapper(self, queue_wrapper: QueueWrapper): + self._queue_wrapper = queue_wrapper - @tc_queue.setter - def tc_queue(self, tc_queue: TcQueueT): - self._tc_queue = tc_queue + def operation(self): + pass def send_queue_tc_and_receive_tm_sequentially(self): """Primary function which is called for sequential transfer. @@ -66,7 +70,7 @@ def send_queue_tc_and_receive_tm_sequentially(self): self._tm_listener.sequence_mode() # tiny delay for pus_tm listener time.sleep(0.05) - if self._tc_queue: + if self.queue_wrapper.queue: try: self.__handle_tc_sending_and_tm_reception() except (KeyboardInterrupt, SystemExit): @@ -79,11 +83,11 @@ def send_queue_tc_and_return(self): self._tm_listener.listener_mode() # tiny delay for pus_tm listener time.sleep(0.05) - if self._tc_queue: + if self.queue_wrapper.queue: try: # Set to true for first packet, otherwise nothing will be sent. self._next_send_condition = True - if not self._tc_queue.__len__() == 0: + if not self.queue_wrapper.queue.__len__() == 0: self.__check_next_tc_send() except (KeyboardInterrupt, SystemExit): LOGGER.info("Keyboard Interrupt.") @@ -120,7 +124,7 @@ def __handle_tc_sending_and_tm_reception(self): while not self.__all_replies_received: # Do not use continue anywhere in this while loop for now if not tc_queue_is_empty_and_processed: - if self._tc_queue.__len__() == 0: + if self.queue_wrapper.queue.__len__() == 0: if self._wait_period == 0: # cache this for last wait time self._start_time = time.time() @@ -178,17 +182,17 @@ def __check_next_tc_send(self): def _send_next_telecommand(self) -> bool: """Sends the next telecommand and returns whether an actual telecommand was sent""" # Queue empty. Can happen because a wait period might still be ongoing - if not self._tc_queue: + if not self.queue_wrapper.queue: return False if self.wait_period_ongoing(): return False - next_queue_entry = self._tc_queue.pop() + next_queue_entry = self.queue_wrapper.queue.pop() if self.check_queue_entry(next_queue_entry): self._start_time = time.time() self._tc_handler.pre_send_cb(next_queue_entry, self._com_if) # queue empty. - elif not self._tc_queue: + elif not self.queue_wrapper.queue: # Another special case: Last queue entry is to wait. if self._wait_period > 0: if self.wait_period_ongoing(): diff --git a/src/tmtccmd/tc/definitions.py b/src/tmtccmd/tc/definitions.py index ee70e85c..7f15b0c1 100644 --- a/src/tmtccmd/tc/definitions.py +++ b/src/tmtccmd/tc/definitions.py @@ -19,6 +19,14 @@ class TcQueueEntryBase: def __init__(self, etype: TcQueueEntryType): self.etype = etype + def is_tc(self) -> bool: + if ( + self.etype == TcQueueEntryType.PUS_TC + or self.etype == TcQueueEntryType.RAW_TC + ): + return True + return False + TcQueueT = Deque[TcQueueEntryBase] diff --git a/src/tmtccmd/tc/handler.py b/src/tmtccmd/tc/handler.py index ad6bbd10..98a878fb 100644 --- a/src/tmtccmd/tc/handler.py +++ b/src/tmtccmd/tc/handler.py @@ -1,8 +1,9 @@ from abc import abstractmethod +from typing import Optional from tmtccmd.com_if.com_interface_base import CommunicationInterface from tmtccmd.core.backend import ProcedureInfo -from tmtccmd.tc.definitions import TcQueueT, TcQueueEntryBase +from tmtccmd.tc.definitions import TcQueueEntryBase class TcHandlerBase: @@ -16,12 +17,9 @@ def pre_send_cb( pass @abstractmethod - def pass_queue(self, info: ProcedureInfo) -> TcQueueT: + def queue_finished_cb(self, info: ProcedureInfo): pass @abstractmethod - def queue_finished_cb(self, service: str, op_code: str): - pass - - def feed_cb(self): + def feed_cb(self, info: Optional[ProcedureInfo]): pass diff --git a/src/tmtccmd/tc/helper.py b/src/tmtccmd/tc/helper.py index 9a1d0d56..e69de29b 100644 --- a/src/tmtccmd/tc/helper.py +++ b/src/tmtccmd/tc/helper.py @@ -1,25 +0,0 @@ -from spacepackets.ecss import PusTelecommand -from tmtccmd.tc.definitions import ( - TcQueueT, - LogQueueEntry, - PusTcEntry, - RawTcEntry, - WaitEntry, -) - - -class QueueWrapper: - def __init__(self, queue: TcQueueT): - self.queue = queue - - def add_log_cmd(self, print_str: str): - self.queue.appendleft(LogQueueEntry(print_str)) - - def add_pus_tc(self, pus_tc: PusTelecommand): - self.queue.appendleft(PusTcEntry(pus_tc)) - - def add_raw_tc(self, tc: bytes): - self.queue.appendleft(RawTcEntry(tc)) - - def add_wait(self, wait_secs: float): - self.queue.appendleft(WaitEntry(wait_secs)) diff --git a/src/tmtccmd/tc/queue.py b/src/tmtccmd/tc/queue.py new file mode 100644 index 00000000..8616b519 --- /dev/null +++ b/src/tmtccmd/tc/queue.py @@ -0,0 +1,33 @@ +from typing import Optional + +from spacepackets.ecss import PusTelecommand +from tmtccmd.tc.definitions import ( + TcQueueT, + LogQueueEntry, + PusTcEntry, + RawTcEntry, + WaitEntry, +) + + +class QueueWrapper: + def __init__(self, queue: Optional[TcQueueT], inter_cmd_delay: bool = True): + self.queue = queue + self.inter_cmd_delay = inter_cmd_delay + + +class QueueHelper: + def __init__(self, queue_wrapper: QueueWrapper): + self.queue_wrapper = queue_wrapper + + def add_log_cmd(self, print_str: str): + self.queue_wrapper.queue.appendleft(LogQueueEntry(print_str)) + + def add_pus_tc(self, pus_tc: PusTelecommand): + self.queue_wrapper.queue.appendleft(PusTcEntry(pus_tc)) + + def add_raw_tc(self, tc: bytes): + self.queue_wrapper.queue.appendleft(RawTcEntry(tc)) + + def add_wait(self, wait_secs: float): + self.queue_wrapper.queue.appendleft(WaitEntry(wait_secs)) diff --git a/src/tmtccmd/sendreceive/tm_listener.py b/src/tmtccmd/tm/ccsds_tm_listener.py similarity index 96% rename from src/tmtccmd/sendreceive/tm_listener.py rename to src/tmtccmd/tm/ccsds_tm_listener.py index ef6042f4..7311676c 100644 --- a/src/tmtccmd/sendreceive/tm_listener.py +++ b/src/tmtccmd/tm/ccsds_tm_listener.py @@ -27,7 +27,7 @@ class ListenerModes(Enum): SEQUENCE = 3 -class TmListener: +class CcsdsTmListener: """Performs all TM listening operations. This listener to have a permanent means to receive data. A background thread is used to poll data with the provided communication interface. Dedicated sender and receiver object @@ -54,11 +54,10 @@ def __init__( :param tm_type: Telemetry type. Default to CCSDS space packets for now """ self.__com_if = com_if - self._mode_op_timeout = TmListener.DEFAULT_MODE_OPERATION_TIMEOUT + self._mode_op_timeout = CcsdsTmListener.DEFAULT_MODE_OPERATION_TIMEOUT # TM Listener operations can be suspended by setting this flag self.event_listener_active = threading.Event() self.listener_active = False - self.current_apid = INVALID_APID # Listener is daemon and will exit automatically if all other threads are closed self.listener_thread = threading.Thread( @@ -101,9 +100,6 @@ def subscribe_ccsds_tm_handler(self, apid: int, queue_max_len: int): else: LOGGER.warning("This function only support CCSDS space packet handling") - def set_current_apid(self, new_apid: int): - self.current_apid = new_apid - def set_com_if(self, com_if: CommunicationInterface): self.__com_if = com_if @@ -152,7 +148,7 @@ def ccsds_tm_received(self, apid: int = INVALID_APID): else: return False - def tm_packets_available(self): + def tm_packets_available(self) -> bool: with acquire_timeout( self.lock_listener, timeout=self.DEFAULT_LOCK_TIMEOUT ) as acquired: @@ -177,12 +173,10 @@ def retrieve_tm_packet_queues(self, clear: bool) -> QueueListT: return queues def retrieve_ccsds_tm_packet_queue( - self, apid: int = -1, clear: bool = False + self, apid: int, clear: bool = False ) -> TelemetryQueueT: """Retrieve the packet queue for a given APID. The TM listener will handle routing packets into the correct queue.""" - if apid == -1: - apid = self.current_apid target_queue_list = self.__queue_dict.get(apid) if target_queue_list is None: LOGGER.warning(f"No queue available for APID {apid}") @@ -203,8 +197,6 @@ def retrieve_ccsds_tm_packet_queue( return tm_queue_copy def clear_ccsds_tm_packet_queue(self, apid: int): - if apid == -1: - apid = self.current_apid target_queue = self.__queue_dict.get(apid) if target_queue is None: LOGGER.warning(f"No queue available for APID {apid}") @@ -282,7 +274,7 @@ def __default_operation(self): self.__listener_mode = ListenerModes.LISTENER def __perform_core_operation(self): - """The core operation listens for packets.""" + """The core operation listens for packets and routes them""" packet_list = self.__com_if.receive() if len(packet_list) > 0: with acquire_timeout( @@ -308,7 +300,6 @@ def __perform_mode_operation(self): if self.__listener_mode == ListenerModes.LISTENER: if not self.__event_mode_op_finished.is_set(): self.__event_mode_op_finished.set() - # Single Command Mode elif self.__listener_mode == ListenerModes.SEQUENCE: # This prevents the listener from listening from one more unnecessary cycle if self.__event_mode_op_finished.is_set(): diff --git a/src/tmtccmd/utility/countdown.py b/src/tmtccmd/utility/countdown.py new file mode 100644 index 00000000..19f09b5b --- /dev/null +++ b/src/tmtccmd/utility/countdown.py @@ -0,0 +1,38 @@ +import time +from typing import Optional + + +class Countdown: + def __init__(self, init_timeout_secs: Optional[float]): + if init_timeout_secs is not None: + self.timeout = init_timeout_secs + else: + self._timeout = 0 + self._start_time = 0 + + @property + def timeout(self): + return self._timeout + + @timeout.setter + def timeout(self, timeout: float): + self._timeout = timeout + self._start_time = time.time() + + def timed_out(self) -> bool: + if time.time() - self._start_time > self._timeout: + return True + else: + return False + + def busy(self) -> bool: + return not self.timed_out() + + def reset(self, new_timeout: Optional[float]): + if new_timeout is not None: + self.timeout = new_timeout + else: + self.timeout = self._timeout + + def time_out(self): + self._start_time = time.time() - self._timeout From 49fbe9169234e228cd8ce15e17176d5df1081d10 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Wed, 22 Jun 2022 16:02:25 +0200 Subject: [PATCH 058/221] updates for updates spacepackets mod --- src/tests/test_pus.py | 2 +- src/tmtccmd/com_if/dummy_com_if.py | 8 ++++---- src/tmtccmd/pus/pus_11_tc_sched.py | 2 +- src/tmtccmd/tc/queue.py | 4 ++++ src/tmtccmd/tm/base.py | 12 ++++++------ 5 files changed, 16 insertions(+), 12 deletions(-) diff --git a/src/tests/test_pus.py b/src/tests/test_pus.py index 72e6efbe..f4b8b58b 100755 --- a/src/tests/test_pus.py +++ b/src/tests/test_pus.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 from unittest import TestCase -from spacepackets.ccsds.spacepacket import get_space_packet_sequence_control +from spacepackets.ccsds.spacepacket import get_sp_psc_raw from spacepackets.ccsds.time import CdsShortTimestamp from spacepackets.ecss.conf import get_pus_tm_version, PusVersion, set_default_tm_apid from spacepackets.util import PrintFormats diff --git a/src/tmtccmd/com_if/dummy_com_if.py b/src/tmtccmd/com_if/dummy_com_if.py index 11560248..153c234e 100644 --- a/src/tmtccmd/com_if/dummy_com_if.py +++ b/src/tmtccmd/com_if/dummy_com_if.py @@ -2,7 +2,7 @@ """ from spacepackets.ecss.tc import PusTelecommand from spacepackets.ccsds.spacepacket import ( - get_space_packet_sequence_control, + get_sp_psc_raw, SequenceFlags, ) @@ -76,9 +76,9 @@ def generate_reply_package(self): """ if self.last_service == 17: if self.last_subservice == 1: - tc_psc = get_space_packet_sequence_control( - sequence_flags=SequenceFlags.UNSEGMENTED, - source_sequence_count=self.last_tc_ssc, + tc_psc = get_sp_psc_raw( + seq_flags=SequenceFlags.UNSEGMENTED, + seq_count=self.last_tc_ssc, ) tm_packer = Service1TMExtended( subservice=1, diff --git a/src/tmtccmd/pus/pus_11_tc_sched.py b/src/tmtccmd/pus/pus_11_tc_sched.py index a79736a9..f2c7395f 100644 --- a/src/tmtccmd/pus/pus_11_tc_sched.py +++ b/src/tmtccmd/pus/pus_11_tc_sched.py @@ -66,4 +66,4 @@ def __repr__(self): @classmethod def build_from_tc(cls, tc: PusTelecommand) -> TcSchedReqId: - return TcSchedReqId(tc.data_field_header.source_id, tc.apid, tc.ssc) + return TcSchedReqId(tc.pus_tc_sec_header.source_id, tc.apid, tc.seq_count) diff --git a/src/tmtccmd/tc/queue.py b/src/tmtccmd/tc/queue.py index 8616b519..b0a7bc71 100644 --- a/src/tmtccmd/tc/queue.py +++ b/src/tmtccmd/tc/queue.py @@ -1,5 +1,6 @@ from typing import Optional +from spacepackets.ccsds.spacepacket import SpacePacket from spacepackets.ecss import PusTelecommand from tmtccmd.tc.definitions import ( TcQueueT, @@ -26,6 +27,9 @@ def add_log_cmd(self, print_str: str): def add_pus_tc(self, pus_tc: PusTelecommand): self.queue_wrapper.queue.appendleft(PusTcEntry(pus_tc)) + def add_ccsds_tc(self, space_packet: SpacePacket): + pass + def add_raw_tc(self, tc: bytes): self.queue_wrapper.queue.appendleft(RawTcEntry(tc)) diff --git a/src/tmtccmd/tm/base.py b/src/tmtccmd/tm/base.py index 5417399b..b0332679 100644 --- a/src/tmtccmd/tm/base.py +++ b/src/tmtccmd/tm/base.py @@ -83,7 +83,7 @@ def tm_data(self) -> bytearray: @property def ssc(self) -> int: - return self.pus_tm.ssc + return self.pus_tm.seq_count @property def valid(self): @@ -138,15 +138,15 @@ def append_telemetry_content(self, content_list: list): """ content_list.append(f"{self.pus_tm.service}") content_list.append(f"{self.pus_tm.subservice}") - content_list.append(f"{self.pus_tm.secondary_packet_header.message_counter}") + content_list.append(f"{self.pus_tm.pus_tm_sec_header.message_counter}") content_list.append( - f"{self.pus_tm.secondary_packet_header.time.return_unix_seconds()}" + f"{self.pus_tm.pus_tm_sec_header.time.return_unix_seconds()}" ) content_list.append( - f"{self.pus_tm.secondary_packet_header.time.return_time_string()}" + f"{self.pus_tm.pus_tm_sec_header.time.return_time_string()}" ) - content_list.append(f"0x{self.pus_tm.space_packet_header.apid:02x}") - content_list.append(f"{self.pus_tm.space_packet_header.ssc}") + content_list.append(f"0x{self.pus_tm.sp_header.apid:02x}") + content_list.append(f"{self.pus_tm.sp_header.seq_count}") if self.pus_tm.valid: content_list.append("Yes") else: From 1a72ad459d845097ab9fbbcebe763e55c2fd992f Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Wed, 22 Jun 2022 17:04:23 +0200 Subject: [PATCH 059/221] fixes after refactoring --- examples/config/hook_implementation.py | 4 +-- src/tests/hook_obj_mock.py | 4 +-- src/tmtccmd/config/args.py | 12 +++++---- src/tmtccmd/config/globals.py | 5 ++-- src/tmtccmd/config/tmtc_defs.py | 21 +++++++++++---- src/tmtccmd/pus/pus_17_test.py | 36 +++++++++++++------------- src/tmtccmd/runner.py | 7 ++--- src/tmtccmd/tc/definitions.py | 2 +- src/tmtccmd/tc/packer.py | 4 +-- src/tmtccmd/tc/pus_5_event.py | 34 ++++++++++-------------- src/tmtccmd/tc/queue.py | 4 +-- 11 files changed, 71 insertions(+), 62 deletions(-) diff --git a/examples/config/hook_implementation.py b/examples/config/hook_implementation.py index 7ef3c8df..d212b693 100644 --- a/examples/config/hook_implementation.py +++ b/examples/config/hook_implementation.py @@ -5,7 +5,7 @@ from tmtccmd.config.cfg_hook import TmTcCfgHookBase, ObjectIdDictT from tmtccmd.logging import get_console_logger from tmtccmd.core.backend import TmTcHandler -from tmtccmd.tc.definitions import TcQueueT +from tmtccmd.tc.definitions import QueueHelper from tmtccmd.com_if.com_interface_base import CommunicationInterface from .definitions import APID @@ -33,7 +33,7 @@ def perform_mode_operation(self, tmtc_backend: TmTcHandler, mode: int): pass def pack_service_queue( - self, service: Union[str, int], op_code: str, tc_queue: TcQueueT + self, service: Union[str, int], op_code: str, tc_queue: QueueHelper ): from tmtccmd.tc.packer import default_service_queue_preparation diff --git a/src/tests/hook_obj_mock.py b/src/tests/hook_obj_mock.py index d2ad1577..66661c1b 100644 --- a/src/tests/hook_obj_mock.py +++ b/src/tests/hook_obj_mock.py @@ -9,7 +9,7 @@ from tmtccmd.config.definitions import ServiceOpCodeDictT, CoreModeList from tmtccmd.tm.pus_3_hk_base import Service3Base from tmtccmd.core.backend import TmTcHandler -from tmtccmd.tc.definitions import TcQueueT +from tmtccmd.tc.definitions import QueueHelper from tmtccmd.config.cfg_hook import TmTcCfgHookBase from tmtccmd.logging import get_console_logger @@ -121,7 +121,7 @@ def perform_mode_operation(self, tmtc_backend: TmTcHandler, mode: int): @abstractmethod def pack_service_queue( - self, service: Union[int, str], op_code: str, tc_queue: TcQueueT + self, service: Union[int, str], op_code: str, tc_queue: QueueHelper ): """Overriding this function allows the user to package a telecommand queue for a given service and operation code combination. diff --git a/src/tmtccmd/config/args.py b/src/tmtccmd/config/args.py index 8ac6603e..359f2fb4 100644 --- a/src/tmtccmd/config/args.py +++ b/src/tmtccmd/config/args.py @@ -310,6 +310,7 @@ def prompt_service(tmtc_defs: TmTcDefWrapper) -> str: horiz_line = horiz_line_num * "-" service_string = "Service".ljust(service_adjustment) info_string = "Information".ljust(info_adjustment) + tmtc_defs.sort() while True: print(f" {horiz_line}") print(f"|{service_string} | {info_string}|") @@ -330,7 +331,7 @@ def prompt_service(tmtc_defs: TmTcDefWrapper) -> str: completer=srv_completer, complete_style=CompleteStyle.MULTI_COLUMN, ) - if service_string in tmtc_defs: + if service_string in tmtc_defs.defs: LOGGER.info(f"Selected service: {service_string}") return service_string else: @@ -360,12 +361,13 @@ def prompt_op_code(tmtc_defs: TmTcDefWrapper, service: str) -> str: print(f" {horiz_line}") if service in tmtc_defs.defs: op_code_entry = tmtc_defs.op_code_entry(service) + op_code_entry.sort() completer = build_op_code_word_completer( service=service, op_code_entry=op_code_entry ) - for op_code_entry in op_code_entry.op_code_dict.items(): - adjusted_op_code_entry = op_code_entry[0].ljust(op_code_adjustment) - adjusted_op_code_info = op_code_entry[1][0].ljust(info_adjustment) + for op_code in op_code_entry.op_code_dict.items(): + adjusted_op_code_entry = op_code[0].ljust(op_code_adjustment) + adjusted_op_code_info = op_code[1][0].ljust(info_adjustment) print(f"|{adjusted_op_code_entry} | {adjusted_op_code_info}|") print(f" {horiz_line}") op_code_string = prompt_toolkit.prompt( @@ -373,7 +375,7 @@ def prompt_op_code(tmtc_defs: TmTcDefWrapper, service: str) -> str: completer=completer, complete_style=CompleteStyle.MULTI_COLUMN, ) - if op_code_string in op_code_entry: + if op_code_string in op_code_entry.op_code_dict.keys(): LOGGER.info(f"Selected op code: {op_code_string}") return op_code_string else: diff --git a/src/tmtccmd/config/globals.py b/src/tmtccmd/config/globals.py index 95146676..e1178312 100644 --- a/src/tmtccmd/config/globals.py +++ b/src/tmtccmd/config/globals.py @@ -26,7 +26,7 @@ from .tmtc_defs import TmTcDefWrapper, OpCodeEntry LOGGER = get_console_logger() -DEF_WRAPPER = TmTcDefWrapper() +DEF_WRAPPER = None def set_json_cfg_path(json_cfg_path: str): @@ -229,7 +229,8 @@ def check_and_set_core_service_arg( def get_default_tmtc_defs() -> TmTcDefWrapper: global DEF_WRAPPER - if DEF_WRAPPER == dict(): + if DEF_WRAPPER is None: + DEF_WRAPPER = TmTcDefWrapper() srv_5 = OpCodeEntry() srv_5.add("0", "Event Test") DEF_WRAPPER.add_service( diff --git a/src/tmtccmd/config/tmtc_defs.py b/src/tmtccmd/config/tmtc_defs.py index e62aa481..3a87461a 100644 --- a/src/tmtccmd/config/tmtc_defs.py +++ b/src/tmtccmd/config/tmtc_defs.py @@ -15,8 +15,11 @@ def __init__(self): class OpCodeEntry: - def __init__(self): - self._op_code_dict: OpCodeDictT = dict() + def __init__(self, init_dict: Optional[OpCodeDictT] = None): + if init_dict is not None: + self._op_code_dict = init_dict + else: + self._op_code_dict: OpCodeDictT = dict() def add( self, @@ -38,6 +41,9 @@ def info(self, op_code: str) -> Optional[str]: if entry_tuple is not None: return entry_tuple[0] + def __repr__(self): + return f"{self.__class__.__name__}(init_dict={self._op_code_dict!r}" + @property def op_code_dict(self): return self._op_code_dict @@ -49,9 +55,14 @@ def op_code_dict(self): class TmTcDefWrapper: - def __init__(self): - self.defs: ServiceOpCodeDictT = dict() - pass + def __init__(self, init_defs: Optional[ServiceOpCodeDictT] = None): + if init_defs is None: + self.defs: ServiceOpCodeDictT = dict() + else: + self.defs = init_defs + + def __repr__(self): + return f"{self.__class__.__name__}(init_defs={self.defs!r}" def add_service( self, diff --git a/src/tmtccmd/pus/pus_17_test.py b/src/tmtccmd/pus/pus_17_test.py index 71f9df01..ac5417e1 100644 --- a/src/tmtccmd/pus/pus_17_test.py +++ b/src/tmtccmd/pus/pus_17_test.py @@ -3,8 +3,8 @@ from spacepackets.ecss.conf import get_default_tc_apid from spacepackets.ecss.pus_17_test import Subservices -from tmtccmd.config.definitions import QueueCommands -from tmtccmd.tc.definitions import PusTelecommand, TcQueueT +from tmtccmd.tc.definitions import PusTelecommand +from tmtccmd.tc.queue import QueueHelper class CustomSubservices(enum.IntEnum): @@ -20,32 +20,32 @@ def pack_service_17_ping_command(ssc: int, apid: int = -1) -> PusTelecommand: ) -def pack_generic_service17_test( - init_ssc: int, tc_queue: TcQueueT, apid: int = -1 -) -> int: +def pack_generic_service17_test(init_ssc: int, q: QueueHelper, apid: int = -1) -> int: if apid == -1: apid = get_default_tc_apid() new_ssc = init_ssc - tc_queue.appendleft((QueueCommands.PRINT, "Testing Service 17")) + q.add_log_cmd("Testing Service 17") # ping test - tc_queue.appendleft((QueueCommands.PRINT, "Testing Service 17: Ping Test")) - tc_queue.appendleft(pack_service_17_ping_command(ssc=new_ssc).pack_command_tuple()) + q.add_log_cmd("Testing Service 17: Ping Test") + q.add_pus_tc(pack_service_17_ping_command(ssc=new_ssc)) new_ssc += 1 # enable event - tc_queue.appendleft((QueueCommands.PRINT, "Testing Service 17: Enable Event")) - command = PusTelecommand(service=5, subservice=5, ssc=new_ssc, apid=apid) - tc_queue.appendleft(command.pack_command_tuple()) + q.add_log_cmd("Testing Service 17: Enable Event") + q.add_pus_tc(PusTelecommand(service=5, subservice=5, ssc=new_ssc, apid=apid)) new_ssc += 1 # test event - tc_queue.appendleft((QueueCommands.PRINT, "Testing Service 17: Trigger event")) - command = PusTelecommand( - service=17, subservice=CustomSubservices.TC_GEN_EVENT, ssc=new_ssc, apid=apid + q.add_log_cmd("Testing Service 17: Trigger event") + q.add_pus_tc( + PusTelecommand( + service=17, + subservice=CustomSubservices.TC_GEN_EVENT, + ssc=new_ssc, + apid=apid, + ) ) - tc_queue.appendleft(command.pack_command_tuple()) new_ssc += 1 # invalid subservice - tc_queue.appendleft((QueueCommands.PRINT, "Testing Service 17: Invalid subservice")) - command = PusTelecommand(service=17, subservice=243, ssc=new_ssc, apid=apid) - tc_queue.appendleft(command.pack_command_tuple()) + q.add_log_cmd("Testing Service 17: Invalid subservice") + q.add_pus_tc(PusTelecommand(service=17, subservice=243, ssc=new_ssc, apid=apid)) new_ssc += 1 return new_ssc diff --git a/src/tmtccmd/runner.py b/src/tmtccmd/runner.py index ca8a0af0..8b8b9b33 100644 --- a/src/tmtccmd/runner.py +++ b/src/tmtccmd/runner.py @@ -6,7 +6,7 @@ from spacepackets.ecss.conf import get_default_tc_apid from tmtccmd import __version__ -from tmtccmd.config import SetupArgs, TmTcCfgHookBase, CoreGlobalIds, pass_cli_args +from tmtccmd.config import SetupArgs, TmTcCfgHookBase, CoreGlobalIds from tmtccmd.core.backend import BackendBase from tmtccmd.core.frontend_base import FrontendBase from tmtccmd.tm.definitions import TmTypes @@ -134,7 +134,8 @@ def __handle_cli_args_and_globals(setup_args: SetupArgs): setup_args.use_gui, tc_apid=setup_args.tc_apid, tm_apid=setup_args.tm_apid ) LOGGER.info("Setting up post-globals..") - pass_cli_args(setup_args=setup_args) + # TODO: How to better do this? + # pass_cli_args(setup_args=setup_args) def __start_tmtc_commander_cli( @@ -194,7 +195,7 @@ def create_default_tmtc_backend( """ global __SETUP_WAS_CALLED from tmtccmd.core.backend import TmTcHandler - from tmtccmd.sendreceive.ccsds_tm_listener import CcsdsTmListener + from tmtccmd.tm.ccsds_tm_listener import CcsdsTmListener from typing import cast if not __SETUP_WAS_CALLED: diff --git a/src/tmtccmd/tc/definitions.py b/src/tmtccmd/tc/definitions.py index 7f15b0c1..1864fa96 100644 --- a/src/tmtccmd/tc/definitions.py +++ b/src/tmtccmd/tc/definitions.py @@ -28,7 +28,7 @@ def is_tc(self) -> bool: return False -TcQueueT = Deque[TcQueueEntryBase] +QueueDequeT = Deque[TcQueueEntryBase] class PusTcEntry(TcQueueEntryBase): diff --git a/src/tmtccmd/tc/packer.py b/src/tmtccmd/tc/packer.py index 24a4588e..c11d694a 100644 --- a/src/tmtccmd/tc/packer.py +++ b/src/tmtccmd/tc/packer.py @@ -7,7 +7,7 @@ import sys from typing import Union -from tmtccmd.tc.definitions import TcQueueT +from tmtccmd.tc.definitions import QueueHelper from spacepackets.ecss.tc import PusTelecommand from tmtccmd.logging import get_console_logger from tmtccmd.pus.pus_17_test import pack_service_17_ping_command @@ -38,7 +38,7 @@ def pack_service_queue_core(service: int, op_code: str, service_queue: TcQueueT) """ -def ping_queue(service_queue: TcQueueT): +def ping_queue(service_queue: QueueHelper): from tmtccmd.config.definitions import CoreServiceList, QueueCommands service_queue.appendleft((QueueCommands.PRINT, "Sending ping command PUS TC[17,1]")) diff --git a/src/tmtccmd/tc/pus_5_event.py b/src/tmtccmd/tc/pus_5_event.py index 1650603b..3c0d8753 100644 --- a/src/tmtccmd/tc/pus_5_event.py +++ b/src/tmtccmd/tc/pus_5_event.py @@ -4,7 +4,8 @@ from spacepackets.ecss.pus_5_event import Subservices from tmtccmd.config.definitions import QueueCommands -from tmtccmd.tc.definitions import PusTelecommand, TcQueueT +from tmtccmd.tc.definitions import PusTelecommand, QueueHelper +from tmtccmd.tc.queue import QueueHelper def pack_enable_event_reporting_command(ssc: int, apid: int = -1): @@ -26,29 +27,22 @@ def pack_disable_event_reporting_command(ssc: int, apid: int = -1): ) -def pack_generic_service5_test_into(tc_queue: TcQueueT, apid: int = -1): +def pack_generic_service5_test_into(q: QueueHelper, apid: int = -1): if apid == -1: apid = get_default_tc_apid() - tc_queue.appendleft((QueueCommands.PRINT, "Testing Service 5")) + q.add_log_cmd("Testing Service 5") # invalid subservice - tc_queue.appendleft((QueueCommands.PRINT, "Testing Service 5: Invalid subservice")) - command = PusTelecommand(service=5, subservice=1, apid=apid, ssc=500) - tc_queue.appendleft(command.pack_command_tuple()) + q.add_log_cmd("Testing Service 5: Invalid subservice") + q.add_pus_tc(PusTelecommand(service=5, subservice=1, apid=apid, ssc=500)) # disable events - tc_queue.appendleft((QueueCommands.PRINT, "Testing Service 5: Disable event")) - command = pack_disable_event_reporting_command(ssc=501) - tc_queue.appendleft(command.pack_command_tuple()) + q.add_log_cmd("Testing Service 5: Disable event") + q.add_pus_tc(pack_disable_event_reporting_command(ssc=501)) # trigger event - tc_queue.appendleft((QueueCommands.PRINT, "Testing Service 5: Trigger event")) - command = PusTelecommand(service=17, subservice=128, apid=apid, ssc=510) - tc_queue.appendleft(command.pack_command_tuple()) + q.add_log_cmd("Testing Service 5: Trigger event") + q.add_pus_tc(PusTelecommand(service=17, subservice=128, apid=apid, ssc=510)) # enable event - tc_queue.appendleft((QueueCommands.PRINT, "Testing Service 5: Enable event")) - command = pack_enable_event_reporting_command(ssc=520) - tc_queue.appendleft(command.pack_command_tuple()) + q.add_log_cmd("Testing Service 5: Enable event") + q.add_pus_tc(pack_enable_event_reporting_command(ssc=520)) # trigger event - tc_queue.appendleft( - (QueueCommands.PRINT, "Testing Service 5: Trigger another event") - ) - command = PusTelecommand(service=17, subservice=128, apid=apid, ssc=530) - tc_queue.appendleft(command.pack_command_tuple()) + q.add_log_cmd("Testing Service 5: Trigger another event") + q.add_pus_tc(PusTelecommand(service=17, subservice=128, apid=apid, ssc=530)) diff --git a/src/tmtccmd/tc/queue.py b/src/tmtccmd/tc/queue.py index b0a7bc71..33a685c4 100644 --- a/src/tmtccmd/tc/queue.py +++ b/src/tmtccmd/tc/queue.py @@ -3,7 +3,7 @@ from spacepackets.ccsds.spacepacket import SpacePacket from spacepackets.ecss import PusTelecommand from tmtccmd.tc.definitions import ( - TcQueueT, + QueueDequeT, LogQueueEntry, PusTcEntry, RawTcEntry, @@ -12,7 +12,7 @@ class QueueWrapper: - def __init__(self, queue: Optional[TcQueueT], inter_cmd_delay: bool = True): + def __init__(self, queue: Optional[QueueDequeT], inter_cmd_delay: bool = True): self.queue = queue self.inter_cmd_delay = inter_cmd_delay From a506c3cd27193e07741c8692f967bfdb8817fbe7 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Wed, 22 Jun 2022 17:11:08 +0200 Subject: [PATCH 060/221] improved parser wrapper --- src/tmtccmd/config/args.py | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/tmtccmd/config/args.py b/src/tmtccmd/config/args.py index 359f2fb4..f7c65709 100644 --- a/src/tmtccmd/config/args.py +++ b/src/tmtccmd/config/args.py @@ -47,9 +47,16 @@ class ArgsGroup: interactive: bool = False -class TmtccmdArgsWrapper: - def __init__(self, descript_txt: Optional[str] = None): - self.args_parser = create_default_args_parser(descript_txt) +class ArgParserWrapper: + def __init__( + self, parser: Optional[argparse.ArgumentParser] = None, + descript_txt: Optional[str] = None + ): + if parser is None: + self.args_parser = create_default_args_parser(descript_txt) + add_default_tmtccmd_args(self.args_parser) + else: + self.args_parser = parser self.print_known_args = False self.print_unknown_args = False self.unknown_args = [""] @@ -192,7 +199,7 @@ def add_default_mode_arguments(arg_parser: argparse.ArgumentParser): f"{CoreModeStrings[CoreModeList.GUI_MODE]}: " f"GUI mode\n" ) - help_text += one_q + listener_help + gui_help + help_text += one_q + listener_help + gui_help + multi_q arg_parser.add_argument( "-m", "--mode", @@ -262,7 +269,7 @@ def args_post_processing( handle_empty_args(args, service_op_code_dict) -def handle_unspecified_args(args, tmtc_defs: TmTcDefWrapper) -> None: +def handle_unspecified_args(args: argparse.Namespace, tmtc_defs: TmTcDefWrapper) -> None: """If some arguments are unspecified, they are set here with (variable) default values. :param args: Arguments from calling parse method :param tmtc_defs: From 853832f42cb19f4659b5a0d5608c8e127c69d68d Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Wed, 22 Jun 2022 17:14:09 +0200 Subject: [PATCH 061/221] new prompt module --- src/tmtccmd/config/args.py | 110 +++-------------------------------- src/tmtccmd/config/prompt.py | 101 ++++++++++++++++++++++++++++++++ 2 files changed, 109 insertions(+), 102 deletions(-) create mode 100644 src/tmtccmd/config/prompt.py diff --git a/src/tmtccmd/config/args.py b/src/tmtccmd/config/args.py index f7c65709..6e11082f 100644 --- a/src/tmtccmd/config/args.py +++ b/src/tmtccmd/config/args.py @@ -6,12 +6,9 @@ from typing import Optional, List from dataclasses import dataclass -from prompt_toolkit.completion import WordCompleter -from prompt_toolkit.shortcuts import CompleteStyle -import prompt_toolkit - from tmtccmd.config.definitions import CoreModeList -from tmtccmd.config.tmtc_defs import TmTcDefWrapper, OpCodeEntry +from tmtccmd.config.prompt import prompt_service, prompt_op_code +from tmtccmd.config.tmtc_defs import TmTcDefWrapper from tmtccmd.config.cfg_hook import TmTcCfgHookBase from tmtccmd.utility.conf_util import AnsiColors from tmtccmd.logging import get_console_logger @@ -49,8 +46,9 @@ class ArgsGroup: class ArgParserWrapper: def __init__( - self, parser: Optional[argparse.ArgumentParser] = None, - descript_txt: Optional[str] = None + self, + parser: Optional[argparse.ArgumentParser] = None, + descript_txt: Optional[str] = None, ): if parser is None: self.args_parser = create_default_args_parser(descript_txt) @@ -269,7 +267,9 @@ def args_post_processing( handle_empty_args(args, service_op_code_dict) -def handle_unspecified_args(args: argparse.Namespace, tmtc_defs: TmTcDefWrapper) -> None: +def handle_unspecified_args( + args: argparse.Namespace, tmtc_defs: TmTcDefWrapper +) -> None: """If some arguments are unspecified, they are set here with (variable) default values. :param args: Arguments from calling parse method :param tmtc_defs: @@ -308,97 +308,3 @@ def handle_empty_args(args, service_op_code_dict: TmTcDefWrapper) -> None: """ LOGGER.info("No arguments specified..") handle_unspecified_args(args, service_op_code_dict) - - -def prompt_service(tmtc_defs: TmTcDefWrapper) -> str: - service_adjustment = 20 - info_adjustment = 30 - horiz_line_num = service_adjustment + info_adjustment + 3 - horiz_line = horiz_line_num * "-" - service_string = "Service".ljust(service_adjustment) - info_string = "Information".ljust(info_adjustment) - tmtc_defs.sort() - while True: - print(f" {horiz_line}") - print(f"|{service_string} | {info_string}|") - print(f" {horiz_line}") - srv_completer = build_service_word_completer(tmtc_defs) - for service_entry in tmtc_defs.defs.items(): - try: - adjusted_service_entry = service_entry[0].ljust(service_adjustment) - adjusted_service_info = service_entry[1][0].ljust(info_adjustment) - print(f"|{adjusted_service_entry} | {adjusted_service_info}|") - except AttributeError: - LOGGER.warning( - f"Error handling service entry {service_entry[0]}. Skipping.." - ) - print(f" {horiz_line}") - service_string = prompt_toolkit.prompt( - "Please select a service by specifying the key: ", - completer=srv_completer, - complete_style=CompleteStyle.MULTI_COLUMN, - ) - if service_string in tmtc_defs.defs: - LOGGER.info(f"Selected service: {service_string}") - return service_string - else: - LOGGER.warning("Invalid key, try again") - - -def build_service_word_completer( - tmtc_defs: TmTcDefWrapper, -) -> WordCompleter: - srv_list = [] - for service_entry in tmtc_defs.defs.items(): - srv_list.append(service_entry[0]) - srv_completer = WordCompleter(words=srv_list, ignore_case=True) - return srv_completer - - -def prompt_op_code(tmtc_defs: TmTcDefWrapper, service: str) -> str: - op_code_adjustment = 24 - info_adjustment = 56 - horz_line_num = op_code_adjustment + info_adjustment + 3 - horiz_line = horz_line_num * "-" - op_code_info_str = "Operation Code".ljust(op_code_adjustment) - info_string = "Information".ljust(info_adjustment) - while True: - print(f" {horiz_line}") - print(f"|{op_code_info_str} | {info_string}|") - print(f" {horiz_line}") - if service in tmtc_defs.defs: - op_code_entry = tmtc_defs.op_code_entry(service) - op_code_entry.sort() - completer = build_op_code_word_completer( - service=service, op_code_entry=op_code_entry - ) - for op_code in op_code_entry.op_code_dict.items(): - adjusted_op_code_entry = op_code[0].ljust(op_code_adjustment) - adjusted_op_code_info = op_code[1][0].ljust(info_adjustment) - print(f"|{adjusted_op_code_entry} | {adjusted_op_code_info}|") - print(f" {horiz_line}") - op_code_string = prompt_toolkit.prompt( - "Please select an operation code by specifying the key: ", - completer=completer, - complete_style=CompleteStyle.MULTI_COLUMN, - ) - if op_code_string in op_code_entry.op_code_dict.keys(): - LOGGER.info(f"Selected op code: {op_code_string}") - return op_code_string - else: - LOGGER.warning("Invalid key, try again") - else: - LOGGER.warning( - "Service not in dictionary. Setting default operation code 0" - ) - return "0" - - -def build_op_code_word_completer( - service: str, op_code_entry: OpCodeEntry -) -> WordCompleter: - op_code_list = [] - for op_code_entry in op_code_entry.op_code_dict.items(): - op_code_list.append(op_code_entry[0]) - op_code_completer = WordCompleter(words=op_code_list, ignore_case=True) - return op_code_completer diff --git a/src/tmtccmd/config/prompt.py b/src/tmtccmd/config/prompt.py new file mode 100644 index 00000000..86785f4c --- /dev/null +++ b/src/tmtccmd/config/prompt.py @@ -0,0 +1,101 @@ +from prompt_toolkit.completion import WordCompleter +from prompt_toolkit.shortcuts import CompleteStyle +import prompt_toolkit +from tmtccmd.config.tmtc_defs import OpCodeEntry, TmTcDefWrapper +from tmtccmd.logging import get_console_logger + +LOGGER = get_console_logger() + + +def prompt_service(tmtc_defs: TmTcDefWrapper) -> str: + service_adjustment = 20 + info_adjustment = 30 + horiz_line_num = service_adjustment + info_adjustment + 3 + horiz_line = horiz_line_num * "-" + service_string = "Service".ljust(service_adjustment) + info_string = "Information".ljust(info_adjustment) + tmtc_defs.sort() + while True: + print(f" {horiz_line}") + print(f"|{service_string} | {info_string}|") + print(f" {horiz_line}") + srv_completer = build_service_word_completer(tmtc_defs) + for service_entry in tmtc_defs.defs.items(): + try: + adjusted_service_entry = service_entry[0].ljust(service_adjustment) + adjusted_service_info = service_entry[1][0].ljust(info_adjustment) + print(f"|{adjusted_service_entry} | {adjusted_service_info}|") + except AttributeError: + LOGGER.warning( + f"Error handling service entry {service_entry[0]}. Skipping.." + ) + print(f" {horiz_line}") + service_string = prompt_toolkit.prompt( + "Please select a service by specifying the key: ", + completer=srv_completer, + complete_style=CompleteStyle.MULTI_COLUMN, + ) + if service_string in tmtc_defs.defs: + LOGGER.info(f"Selected service: {service_string}") + return service_string + else: + LOGGER.warning("Invalid key, try again") + + +def build_service_word_completer( + tmtc_defs: TmTcDefWrapper, +) -> WordCompleter: + srv_list = [] + for service_entry in tmtc_defs.defs.items(): + srv_list.append(service_entry[0]) + srv_completer = WordCompleter(words=srv_list, ignore_case=True) + return srv_completer + + +def prompt_op_code(tmtc_defs: TmTcDefWrapper, service: str) -> str: + op_code_adjustment = 24 + info_adjustment = 56 + horz_line_num = op_code_adjustment + info_adjustment + 3 + horiz_line = horz_line_num * "-" + op_code_info_str = "Operation Code".ljust(op_code_adjustment) + info_string = "Information".ljust(info_adjustment) + while True: + print(f" {horiz_line}") + print(f"|{op_code_info_str} | {info_string}|") + print(f" {horiz_line}") + if service in tmtc_defs.defs: + op_code_entry = tmtc_defs.op_code_entry(service) + op_code_entry.sort() + completer = build_op_code_word_completer( + service=service, op_code_entry=op_code_entry + ) + for op_code in op_code_entry.op_code_dict.items(): + adjusted_op_code_entry = op_code[0].ljust(op_code_adjustment) + adjusted_op_code_info = op_code[1][0].ljust(info_adjustment) + print(f"|{adjusted_op_code_entry} | {adjusted_op_code_info}|") + print(f" {horiz_line}") + op_code_string = prompt_toolkit.prompt( + "Please select an operation code by specifying the key: ", + completer=completer, + complete_style=CompleteStyle.MULTI_COLUMN, + ) + if op_code_string in op_code_entry.op_code_dict.keys(): + LOGGER.info(f"Selected op code: {op_code_string}") + return op_code_string + else: + LOGGER.warning("Invalid key, try again") + else: + LOGGER.warning( + "Service not in dictionary. Setting default operation code 0" + ) + return "0" + + +def build_op_code_word_completer( + service: str, op_code_entry: OpCodeEntry +) -> WordCompleter: + op_code_list = [] + for op_code_entry in op_code_entry.op_code_dict.items(): + op_code_list.append(op_code_entry[0]) + op_code_completer = WordCompleter(words=op_code_list, ignore_case=True) + return op_code_completer From e6eefd1ed08523b70024521011a4459a8e93ed67 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Wed, 22 Jun 2022 17:36:45 +0200 Subject: [PATCH 062/221] new backend exchange objects --- examples/config/hook_implementation.py | 4 +- src/tests/backend_mock.py | 6 +- src/tests/hook_obj_mock.py | 4 +- src/tmtccmd/config/cfg_hook.py | 2 +- src/tmtccmd/core/backend.py | 276 ++++--------------------- src/tmtccmd/core/base.py | 29 --- src/tmtccmd/core/ccsds_backend.py | 258 +++++++++++++++++++++++ src/tmtccmd/core/frontend.py | 8 +- src/tmtccmd/runner.py | 10 +- src/tmtccmd/tc/handler.py | 2 +- src/tmtccmd/utility/exit_handler.py | 4 +- 11 files changed, 317 insertions(+), 286 deletions(-) delete mode 100644 src/tmtccmd/core/base.py create mode 100644 src/tmtccmd/core/ccsds_backend.py diff --git a/examples/config/hook_implementation.py b/examples/config/hook_implementation.py index d212b693..089d5122 100644 --- a/examples/config/hook_implementation.py +++ b/examples/config/hook_implementation.py @@ -4,7 +4,7 @@ from tmtccmd.config.definitions import ServiceOpCodeDictT from tmtccmd.config.cfg_hook import TmTcCfgHookBase, ObjectIdDictT from tmtccmd.logging import get_console_logger -from tmtccmd.core.backend import TmTcHandler +from tmtccmd.core.ccsds_backend import CcsdsTmtcBackend from tmtccmd.tc.definitions import QueueHelper from tmtccmd.com_if.com_interface_base import CommunicationInterface @@ -28,7 +28,7 @@ def assign_communication_interface( json_cfg_path=self.json_cfg_path, ) - def perform_mode_operation(self, tmtc_backend: TmTcHandler, mode: int): + def perform_mode_operation(self, tmtc_backend: CcsdsTmtcBackend, mode: int): LOGGER.info("Mode operation hook was called") pass diff --git a/src/tests/backend_mock.py b/src/tests/backend_mock.py index a7d9187b..3d1a3b85 100644 --- a/src/tests/backend_mock.py +++ b/src/tests/backend_mock.py @@ -1,6 +1,6 @@ from unittest.mock import MagicMock -from tmtccmd.core.backend import TmTcHandler +from tmtccmd.core.ccsds_backend import CcsdsTmtcBackend from tmtccmd.ccsds.handler import CcsdsTmHandler from tmtccmd.config.com_if import create_communication_interface_default from tmtccmd.sendreceive.ccsds_tm_listener import CcsdsTmListener @@ -9,7 +9,7 @@ from tmtccmd.core.frontend_base import FrontendBase -def create_backend_mock(tm_handler: CcsdsTmHandler) -> TmTcHandler: +def create_backend_mock(tm_handler: CcsdsTmHandler) -> CcsdsTmtcBackend: tmtc_printer = FsfwTmTcPrinter(display_mode=DisplayMode.LONG, file_logger=None) com_if = create_communication_interface_default( com_if_key=CoreComInterfaces.DUMMY.value, @@ -17,7 +17,7 @@ def create_backend_mock(tm_handler: CcsdsTmHandler) -> TmTcHandler: ) tm_listener = CcsdsTmListener(com_if=com_if, seq_timeout=3.0) # The global variables are set by the argument parser. - tmtc_backend = TmTcHandler( + tmtc_backend = CcsdsTmtcBackend( com_if=com_if, tm_listener=tm_listener, init_mode=CoreModeList.IDLE, diff --git a/src/tests/hook_obj_mock.py b/src/tests/hook_obj_mock.py index 66661c1b..96a6e2d2 100644 --- a/src/tests/hook_obj_mock.py +++ b/src/tests/hook_obj_mock.py @@ -8,7 +8,7 @@ from tmtccmd.config.definitions import DEFAULT_APID from tmtccmd.config.definitions import ServiceOpCodeDictT, CoreModeList from tmtccmd.tm.pus_3_hk_base import Service3Base -from tmtccmd.core.backend import TmTcHandler +from tmtccmd.core.ccsds_backend import CcsdsTmtcBackend from tmtccmd.tc.definitions import QueueHelper from tmtccmd.config.cfg_hook import TmTcCfgHookBase from tmtccmd.logging import get_console_logger @@ -111,7 +111,7 @@ def get_tmtc_definitions(self) -> ServiceOpCodeDictT: return get_default_tmtc_defs() @abstractmethod - def perform_mode_operation(self, tmtc_backend: TmTcHandler, mode: int): + def perform_mode_operation(self, tmtc_backend: CcsdsTmtcBackend, mode: int): """Perform custom mode operations :param tmtc_backend: :param mode: diff --git a/src/tmtccmd/config/cfg_hook.py b/src/tmtccmd/config/cfg_hook.py index 824e5f12..1916362b 100644 --- a/src/tmtccmd/config/cfg_hook.py +++ b/src/tmtccmd/config/cfg_hook.py @@ -6,7 +6,7 @@ from tmtccmd.logging import get_console_logger from tmtccmd.utility.retval import RetvalDictT from tmtccmd.utility.obj_id import ObjectIdDictT -from tmtccmd.core.base import BackendBase +from tmtccmd.core.backend import BackendBase from tmtccmd.com_if.com_interface_base import CommunicationInterface LOGGER = get_console_logger() diff --git a/src/tmtccmd/core/backend.py b/src/tmtccmd/core/backend.py index 749df595..393e395d 100644 --- a/src/tmtccmd/core/backend.py +++ b/src/tmtccmd/core/backend.py @@ -1,256 +1,58 @@ -import atexit -import time -import sys -from threading import Thread -from typing import cast, Optional +import enum +from abc import abstractmethod -from tmtccmd.config.cfg_hook import TmTcCfgHookBase -from tmtccmd.config.definitions import CoreServiceList, CoreModeList -from tmtccmd.core.base import BackendBase, BackendResult, Request -from tmtccmd.tc.definitions import ProcedureInfo -from tmtccmd.tc.handler import TcHandlerBase -from tmtccmd.tc.queue import QueueWrapper -from tmtccmd.tm.definitions import TmTypes -from tmtccmd.tm.handler import TmHandlerBase -from tmtccmd.logging import get_console_logger -from tmtccmd.tc.ccsds_seq_sender_receiver import ( - SequentialCcsdsSenderReceiver, -) -from tmtccmd.tm.ccsds_tm_listener import CcsdsTmListener -from tmtccmd.ccsds.handler import CcsdsTmHandler -from tmtccmd.com_if.com_interface_base import CommunicationInterface +class Request(enum.IntEnum): + NONE = 0 + TERMINATION_NO_ERROR = 1 + DELAY_IDLE = 2 + DELAY_LISTENER = 3 -LOGGER = get_console_logger() +class BackendState: + def __init__(self, req: Request): + self.req = req + self.mode_changed = False -class TmTcHandler(BackendBase): - """This is the primary class which handles TMTC reception and sending""" - def __init__( - self, - hook_obj: TmTcCfgHookBase, - com_if: CommunicationInterface, - tm_listener: CcsdsTmListener, - tm_handler: TmHandlerBase, - tc_handler: TcHandlerBase, - ): - self.mode = CoreModeList.LISTENER_MODE - self.com_if_key = com_if.get_id() - self.__hook_obj = hook_obj - self.__com_if_active = False - self.__apid = 0 - self.__res = BackendResult(Request.NONE) - self.__tc_handler = tc_handler +class TcMode(enum.IntEnum): + IDLE = (0,) + ONE_QUEUE = (1,) + MULTI_QUEUE = 2 - # This flag could be used later to command the TMTC Client with a front-end - self.one_shot_operation = False - self.__com_if = com_if - self.__tm_listener = tm_listener - self._current_proc_info = ProcedureInfo(CoreServiceList.SERVICE_17.value, "0") - if tm_handler.get_type() == TmTypes.CCSDS_SPACE_PACKETS: - self.__tm_handler: CcsdsTmHandler = cast(CcsdsTmHandler, tm_handler) - for apid_queue_len_tuple in self.__tm_handler.get_apid_queue_len_list(): - self.__tm_listener.subscribe_ccsds_tm_handler( - apid_queue_len_tuple[0], apid_queue_len_tuple[1] - ) - self.exit_on_com_if_init_failure = True - self._queue_wrapper = QueueWrapper(None) - self._seq_handler = SequentialCcsdsSenderReceiver( - com_if=self.__com_if, - tm_handler=self.__tm_handler, - tm_listener=self.__tm_listener, - tc_handler=tc_handler, - apid=self.__apid, - queue_wrapper=self._queue_wrapper, - ) +class TmMode(enum.IntEnum): + IDLE = 0 + LISTENER = 1 - def get_com_if_id(self): - return self.com_if_key - def get_com_if(self) -> CommunicationInterface: - return self.__com_if +class BackendModeWrapper: + def __init__(self): + self.tc_mode = TcMode.IDLE + self.tm_mode = TmMode.IDLE - def get_listener(self): - return self.__tm_listener - def set_com_if(self, com_if: CommunicationInterface): - if not self.is_com_if_active(): - self.__com_if = com_if - self.__tm_listener.set_com_if(self.__com_if) - else: - LOGGER.warning( - "Communication Interface is active and must be closed first before " - "reassigning a new one" - ) +class BackendState: + def __init__(self): + self.mode_wrapper = BackendModeWrapper() + self.result = BackendState(Request.NONE) - def is_com_if_active(self): - return self.__com_if_active - @property - def current_proc_info(self) -> ProcedureInfo: - return self._current_proc_info +class BackendController: + def __init__(self): + self.next_tc_mode = TcMode.IDLE + self.next_tm_mode = TmMode.IDLE - @current_proc_info.setter - def current_proc_info(self, proc_info: ProcedureInfo): - self._current_proc_info = proc_info - - @property - def apid(self) -> int: - return self.__apid - - @apid.setter - def apid(self, apid: int): - self.__apid = apid - - @staticmethod - def start_handler(executed_handler): - if not isinstance(executed_handler, TmTcHandler): - LOGGER.error("Unexpected argument, should be TmTcHandler!") - sys.exit(1) - executed_handler.initialize() - executed_handler.start_listener() +class BackendBase: + @abstractmethod def initialize(self): - from tmtccmd.utility.exit_handler import keyboard_interrupt_handler - - """ - Perform initialization steps which might be necessary after class construction. - This has to be called at some point before using the class! - """ - if self.mode == CoreModeList.LISTENER_MODE: - LOGGER.info("Running in listener mode..") - atexit.register( - keyboard_interrupt_handler, tmtc_backend=self, com_interface=self.__com_if - ) - - def __listener_io_error_handler(self, ctx: str): - LOGGER.error(f"Communication Interface could not be {ctx}") - LOGGER.info("TM listener will not be started") - if self.exit_on_com_if_init_failure: - LOGGER.error("Closing TMTC commander..") - self.__com_if.close() - sys.exit(1) - - def start_listener(self, perform_op_immediately: bool = True): - try: - self.__com_if.open() - except IOError: - self.__listener_io_error_handler("opened") - try: - self.__tm_listener.start() - except IOError: - self.__listener_io_error_handler("started") - self.__com_if_active = True - if perform_op_immediately: - self.periodic_op() - - def close_listener(self, join: bool = False, join_timeout_seconds: float = 1.0): - """Closes the TM listener and the communication interface. This is started in a separarate - thread because the communication interface might still be busy. The completion can be - checked with :meth:`tmtccmd.core.backend.is_com_if_active`. Alternatively, waiting on - completion is possible by specifying the join argument and a timeout in - floating point second. - :param join: - :param join_timeout_seconds: - :return: - """ - if self.__com_if_active: - close_thread = Thread(target=self.__com_if_closing) - close_thread.start() - if join: - close_thread.join(timeout=join_timeout_seconds) - - def periodic_op(self) -> BackendResult: - """Periodic operation - :raises KeyboardInterrupt: Yields info output and then propagates the exception - :raises IOError: Yields informative output and propagates exception - :""" - try: - return self.__core_operation(self.one_shot_operation) - except KeyboardInterrupt as e: - LOGGER.info("Keyboard Interrupt.") - raise e - except IOError as e: - LOGGER.exception("IO Error occured") - raise e - - def __core_operation(self, one_shot: bool) -> BackendResult: - self.__handle_action() - if one_shot: - self.__res.req = Request.TERMINATION_NO_ERROR - else: - if self.mode == CoreModeList.IDLE: - self.__res.req = Request.DELAY_IDLE - elif self.mode == CoreModeList.LISTENER_MODE: - self.__res.req = Request.DELAY_LISTENER - return self.__res - - def __com_if_closing(self): - self.__tm_listener.stop() - while True: - if not self.__tm_listener.is_listener_active(): - self.__com_if.close() - self.__com_if_active = False - break - else: - time.sleep(0.2) + """Initialize the backend. Raise RuntimeError or ValueError on failure""" - def __handle_action(self): - """Command handling.""" - # TODO: It should be possible to call this function discretely. This avoids having to - # start receiver threads in the backgrounds. The backend should then perform the - # periodic TM polling here, with a configurable polling frequency. - # In total this needs to be done like this: In One Queue Mode, request a queue - # from the user if there is not one available yet. If one is available, consume it - # on every operation call. If the queue was consumed, request program termination - # or mode change. This is done using the one-shot flag, so the ONE SHOT MODE is tied - # to that flag. - # For multi-mode do the same, but instead of requesting program termination, use - # the feed function of the TC handler to request another queue - # TODO: This this that is done for the listener mode: Do it for all modes with a - # configurable polling delay. TM should be polled and handled independently of TC, - # or tying them together in some way should remain a user option - if self.mode == CoreModeList.LISTENER_MODE: - if self.__tm_listener.reply_event(): - LOGGER.info("TmTcHandler: Packets received.") - packet_queues = self.__tm_listener.retrieve_tm_packet_queues(clear=True) - if len(packet_queues) > 0: - self.__tm_handler.handle_packet_queues( - packet_queue_list=packet_queues - ) - self.__tm_listener.clear_reply_event() - elif self.mode == CoreModeList.ONE_QUEUE_MODE: - service_queue = self.__prepare_tc_queue() - if service_queue is None: - return - LOGGER.info("Performing sequential command operation") - # TODO: Some sort of reset mode for sequence handler? In total, we should request - # the queue from the user somehow and then handle it. After finishing the - # handling, request termination from the user. This mode will be optimized - # for handling a single queue, so the default behaviour should be to handle - # the queue and then request program termination. Alternatively, the user should - # be able to switch the mode - self._seq_handler.queue_wrapper = service_queue - self._seq_handler.send_queue_tc_and_receive_tm_sequentially() - self.mode = CoreModeList.LISTENER_MODE - elif self.mode == CoreModeList.MULTI_INTERACTIVE_QUEUE_MODE: - # TODO: Handle the queue as long as the current one is full. If it is finished, - # request another queue or further instructions from the user, maybe in form - # of a special object, using the TC handler feed function - pass - else: - try: - self.__hook_obj.perform_mode_operation( - mode=self.mode, tmtc_backend=self - ) - except ImportError as error: - print(error) - LOGGER.error("Custom mode handling module not provided!") + @abstractmethod + def start_listener(self, perform_op_immediately: bool): + """Start the backend. Raise RuntimeError on failure""" - def __prepare_tc_queue(self) -> Optional[QueueWrapper]: - service_queue = self.__tc_handler.feed_cb(self.current_proc_info) - if not self.__com_if.valid: - return None - return service_queue + @abstractmethod + def periodic_op(self, ctrl: BackendController) -> BackendState: + pass diff --git a/src/tmtccmd/core/base.py b/src/tmtccmd/core/base.py deleted file mode 100644 index f20c7ed0..00000000 --- a/src/tmtccmd/core/base.py +++ /dev/null @@ -1,29 +0,0 @@ -import enum -from abc import abstractmethod - - -class Request(enum.IntEnum): - NONE = 0 - TERMINATION_NO_ERROR = 1 - DELAY_IDLE = 2 - DELAY_LISTENER = 3 - - -class BackendResult: - def __init__(self, req: Request): - self.req = req - self.mode_changed = False - - -class BackendBase: - @abstractmethod - def initialize(self): - """Initialize the backend. Raise RuntimeError or ValueError on failure""" - - @abstractmethod - def start_listener(self, perform_op_immediately: bool): - """Start the backend. Raise RuntimeError on failure""" - - @abstractmethod - def periodic_op(self) -> BackendResult: - pass diff --git a/src/tmtccmd/core/ccsds_backend.py b/src/tmtccmd/core/ccsds_backend.py new file mode 100644 index 00000000..83fa87b2 --- /dev/null +++ b/src/tmtccmd/core/ccsds_backend.py @@ -0,0 +1,258 @@ +import atexit +import time +import sys +from threading import Thread +from typing import cast, Optional + +from tmtccmd.config.cfg_hook import TmTcCfgHookBase +from tmtccmd.config.definitions import CoreServiceList, CoreModeList +from tmtccmd.core.backend import BackendBase, BackendState, Request, BackendController +from tmtccmd.tc.definitions import ProcedureInfo +from tmtccmd.tc.handler import TcHandlerBase +from tmtccmd.tc.queue import QueueWrapper +from tmtccmd.tm.definitions import TmTypes +from tmtccmd.tm.handler import TmHandlerBase +from tmtccmd.logging import get_console_logger +from tmtccmd.tc.ccsds_seq_sender_receiver import ( + SequentialCcsdsSenderReceiver, +) +from tmtccmd.tm.ccsds_tm_listener import CcsdsTmListener +from tmtccmd.ccsds.handler import CcsdsTmHandler +from tmtccmd.com_if.com_interface_base import CommunicationInterface + + +LOGGER = get_console_logger() + + +class CcsdsTmtcBackend(BackendBase): + """This is the primary class which handles TMTC reception and sending""" + + def __init__( + self, + hook_obj: TmTcCfgHookBase, + com_if: CommunicationInterface, + tm_listener: CcsdsTmListener, + tm_handler: TmHandlerBase, + tc_handler: TcHandlerBase, + ): + self.mode = CoreModeList.LISTENER_MODE + self.com_if_key = com_if.get_id() + self.__hook_obj = hook_obj + self.__com_if_active = False + self.__apid = 0 + self.__res = BackendState(Request.NONE) + self.__tc_handler = tc_handler + + # This flag could be used later to command the TMTC Client with a front-end + self.one_shot_operation = False + + self.__com_if = com_if + self.__tm_listener = tm_listener + self._current_proc_info = ProcedureInfo(CoreServiceList.SERVICE_17.value, "0") + if tm_handler.get_type() == TmTypes.CCSDS_SPACE_PACKETS: + self.__tm_handler: CcsdsTmHandler = cast(CcsdsTmHandler, tm_handler) + for apid_queue_len_tuple in self.__tm_handler.get_apid_queue_len_list(): + self.__tm_listener.subscribe_ccsds_tm_handler( + apid_queue_len_tuple[0], apid_queue_len_tuple[1] + ) + self.exit_on_com_if_init_failure = True + self._queue_wrapper = QueueWrapper(None) + self._seq_handler = SequentialCcsdsSenderReceiver( + com_if=self.__com_if, + tm_handler=self.__tm_handler, + tm_listener=self.__tm_listener, + tc_handler=tc_handler, + apid=self.__apid, + queue_wrapper=self._queue_wrapper, + ) + + @property + def com_if_id(self): + return self.com_if_key + + @property + def com_if(self) -> CommunicationInterface: + return self.__com_if + + @property + def tm_listener(self): + return self.__tm_listener + + def set_com_if(self, com_if: CommunicationInterface): + if not self.is_com_if_active(): + self.__com_if = com_if + self.__tm_listener.set_com_if(self.__com_if) + else: + LOGGER.warning( + "Communication Interface is active and must be closed first before " + "reassigning a new one" + ) + + def is_com_if_active(self): + return self.__com_if_active + + @property + def current_proc_info(self) -> ProcedureInfo: + return self._current_proc_info + + @current_proc_info.setter + def current_proc_info(self, proc_info: ProcedureInfo): + self._current_proc_info = proc_info + + @property + def apid(self) -> int: + return self.__apid + + @apid.setter + def apid(self, apid: int): + self.__apid = apid + + @staticmethod + def start_handler(executed_handler, ctrl: BackendController): + if not isinstance(executed_handler, CcsdsTmtcBackend): + LOGGER.error("Unexpected argument, should be TmTcHandler!") + sys.exit(1) + executed_handler.initialize() + executed_handler.start_listener(ctrl) + + def initialize(self): + from tmtccmd.utility.exit_handler import keyboard_interrupt_handler + + """ + Perform initialization steps which might be necessary after class construction. + This has to be called at some point before using the class! + """ + if self.mode == CoreModeList.LISTENER_MODE: + LOGGER.info("Running in listener mode..") + atexit.register( + keyboard_interrupt_handler, tmtc_backend=self, com_interface=self.__com_if + ) + + def __listener_io_error_handler(self, ctx: str): + LOGGER.error(f"Communication Interface could not be {ctx}") + LOGGER.info("TM listener will not be started") + if self.exit_on_com_if_init_failure: + LOGGER.error("Closing TMTC commander..") + self.__com_if.close() + sys.exit(1) + + def start_listener(self, ctrl: BackendController): + try: + self.__com_if.open() + except IOError: + self.__listener_io_error_handler("opened") + try: + self.__tm_listener.start() + except IOError: + self.__listener_io_error_handler("started") + self.__com_if_active = True + self.periodic_op(ctrl) + + def close_listener(self, join: bool = False, join_timeout_seconds: float = 1.0): + """Closes the TM listener and the communication interface. This is started in a separarate + thread because the communication interface might still be busy. The completion can be + checked with :meth:`tmtccmd.core.backend.is_com_if_active`. Alternatively, waiting on + completion is possible by specifying the join argument and a timeout in + floating point second. + :param join: + :param join_timeout_seconds: + :return: + """ + if self.__com_if_active: + close_thread = Thread(target=self.__com_if_closing) + close_thread.start() + if join: + close_thread.join(timeout=join_timeout_seconds) + + def periodic_op(self, ctrl: BackendController) -> BackendState: + """Periodic operation + :raises KeyboardInterrupt: Yields info output and then propagates the exception + :raises IOError: Yields informative output and propagates exception + :""" + try: + return self.__core_operation(self.one_shot_operation) + except KeyboardInterrupt as e: + LOGGER.info("Keyboard Interrupt.") + raise e + except IOError as e: + LOGGER.exception("IO Error occured") + raise e + + def __core_operation(self, one_shot: bool) -> BackendState: + self.__handle_action() + if one_shot: + self.__res.req = Request.TERMINATION_NO_ERROR + else: + if self.mode == CoreModeList.IDLE: + self.__res.req = Request.DELAY_IDLE + elif self.mode == CoreModeList.LISTENER_MODE: + self.__res.req = Request.DELAY_LISTENER + return self.__res + + def __com_if_closing(self): + self.__tm_listener.stop() + while True: + if not self.__tm_listener.is_listener_active(): + self.__com_if.close() + self.__com_if_active = False + break + else: + time.sleep(0.2) + + def __handle_action(self): + """Command handling.""" + # TODO: It should be possible to call this function discretely. This avoids having to + # start receiver threads in the backgrounds. The backend should then perform the + # periodic TM polling here, with a configurable polling frequency. + # In total this needs to be done like this: In One Queue Mode, request a queue + # from the user if there is not one available yet. If one is available, consume it + # on every operation call. If the queue was consumed, request program termination + # or mode change. This is done using the one-shot flag, so the ONE SHOT MODE is tied + # to that flag. + # For multi-mode do the same, but instead of requesting program termination, use + # the feed function of the TC handler to request another queue + # TODO: This this that is done for the listener mode: Do it for all modes with a + # configurable polling delay. TM should be polled and handled independently of TC, + # or tying them together in some way should remain a user option + if self.mode == CoreModeList.LISTENER_MODE: + if self.__tm_listener.reply_event(): + LOGGER.info("TmTcHandler: Packets received.") + packet_queues = self.__tm_listener.retrieve_tm_packet_queues(clear=True) + if len(packet_queues) > 0: + self.__tm_handler.handle_packet_queues( + packet_queue_list=packet_queues + ) + self.__tm_listener.clear_reply_event() + elif self.mode == CoreModeList.ONE_QUEUE_MODE: + service_queue = self.__prepare_tc_queue() + if service_queue is None: + return + LOGGER.info("Performing sequential command operation") + # TODO: Some sort of reset mode for sequence handler? In total, we should request + # the queue from the user somehow and then handle it. After finishing the + # handling, request termination from the user. This mode will be optimized + # for handling a single queue, so the default behaviour should be to handle + # the queue and then request program termination. Alternatively, the user should + # be able to switch the mode + self._seq_handler.queue_wrapper = service_queue + self._seq_handler.send_queue_tc_and_receive_tm_sequentially() + self.mode = CoreModeList.LISTENER_MODE + elif self.mode == CoreModeList.MULTI_INTERACTIVE_QUEUE_MODE: + # TODO: Handle the queue as long as the current one is full. If it is finished, + # request another queue or further instructions from the user, maybe in form + # of a special object, using the TC handler feed function + pass + else: + try: + self.__hook_obj.perform_mode_operation( + mode=self.mode, tmtc_backend=self + ) + except ImportError as error: + print(error) + LOGGER.error("Custom mode handling module not provided!") + + def __prepare_tc_queue(self) -> Optional[QueueWrapper]: + service_queue = self.__tc_handler.feed_cb(self.current_proc_info) + if not self.__com_if.valid: + return None + return service_queue diff --git a/src/tmtccmd/core/frontend.py b/src/tmtccmd/core/frontend.py index 618b86c1..55c4a4d7 100644 --- a/src/tmtccmd/core/frontend.py +++ b/src/tmtccmd/core/frontend.py @@ -29,7 +29,7 @@ from PyQt5.QtCore import Qt, pyqtSignal, QObject, QThread, QRunnable from tmtccmd.core.frontend_base import FrontendBase -from tmtccmd.core.backend import TmTcHandler +from tmtccmd.core.ccsds_backend import CcsdsTmtcBackend from tmtccmd.config.cfg_hook import TmTcCfgHookBase from tmtccmd.config.definitions import CoreGlobalIds, CoreModeList, CoreComInterfaces from tmtccmd.config.cfg_hook import get_global_hook_obj @@ -83,7 +83,7 @@ class WorkerThread(QObject): disconnected = pyqtSignal() command_executed = pyqtSignal() - def __init__(self, op_code: WorkerOperationsCodes, tmtc_handler: TmTcHandler): + def __init__(self, op_code: WorkerOperationsCodes, tmtc_handler: CcsdsTmtcBackend): super(QObject, self).__init__() self.op_code = op_code self.tmtc_handler = tmtc_handler @@ -133,7 +133,7 @@ def run(self): class TmTcFrontend(QMainWindow, FrontendBase): def __init__( - self, hook_obj: TmTcCfgHookBase, tmtc_backend: TmTcHandler, app_name: str + self, hook_obj: TmTcCfgHookBase, tmtc_backend: CcsdsTmtcBackend, app_name: str ): super(TmTcFrontend, self).__init__() super(QMainWindow, self).__init__() @@ -336,7 +336,7 @@ def __set_up_com_if_section(self, grid: QGridLayout, row: int) -> int: for com_if_key, com_if_value in all_com_ifs.items(): com_if_combo_box.addItem(com_if_value) self._com_if_list.append((com_if_key, com_if_value)) - if self._tmtc_handler.get_com_if_id() == com_if_key: + if self._tmtc_handler.com_if_id() == com_if_key: com_if_combo_box.setCurrentIndex(index) index += 1 com_if_combo_box.currentIndexChanged.connect(self.__com_if_sel_index_changed) diff --git a/src/tmtccmd/runner.py b/src/tmtccmd/runner.py index 8b8b9b33..0c076b20 100644 --- a/src/tmtccmd/runner.py +++ b/src/tmtccmd/runner.py @@ -7,7 +7,7 @@ from tmtccmd import __version__ from tmtccmd.config import SetupArgs, TmTcCfgHookBase, CoreGlobalIds -from tmtccmd.core.backend import BackendBase +from tmtccmd.core.ccsds_backend import BackendBase from tmtccmd.core.frontend_base import FrontendBase from tmtccmd.tm.definitions import TmTypes from tmtccmd.tm.handler import TmHandlerBase @@ -162,11 +162,11 @@ def __start_tmtc_commander_qt_gui( if tmtc_frontend is None: from tmtccmd.core.frontend import TmTcFrontend from tmtccmd.config.cfg_hook import get_global_hook_obj - from tmtccmd.core.backend import TmTcHandler + from tmtccmd.core.ccsds_backend import CcsdsTmtcBackend tmtc_frontend = TmTcFrontend( hook_obj=get_global_hook_obj(), - tmtc_backend=cast(TmTcHandler, tmtc_backend), + tmtc_backend=cast(CcsdsTmtcBackend, tmtc_backend), app_name=app_name, ) tmtc_frontend.start(app) @@ -194,7 +194,7 @@ def create_default_tmtc_backend( :return: """ global __SETUP_WAS_CALLED - from tmtccmd.core.backend import TmTcHandler + from tmtccmd.core.ccsds_backend import CcsdsTmtcBackend from tmtccmd.tm.ccsds_tm_listener import CcsdsTmListener from typing import cast @@ -217,7 +217,7 @@ def create_default_tmtc_backend( tm_timeout = get_global(CoreGlobalIds.TM_TIMEOUT) tm_listener = CcsdsTmListener(com_if=com_if, seq_timeout=tm_timeout) # The global variables are set by the argument parser. - tmtc_backend = TmTcHandler( + tmtc_backend = CcsdsTmtcBackend( hook_obj=setup_args.hook_obj, com_if=com_if, tm_listener=tm_listener, diff --git a/src/tmtccmd/tc/handler.py b/src/tmtccmd/tc/handler.py index 98a878fb..3ec6c499 100644 --- a/src/tmtccmd/tc/handler.py +++ b/src/tmtccmd/tc/handler.py @@ -2,7 +2,7 @@ from typing import Optional from tmtccmd.com_if.com_interface_base import CommunicationInterface -from tmtccmd.core.backend import ProcedureInfo +from tmtccmd.core.ccsds_backend import ProcedureInfo from tmtccmd.tc.definitions import TcQueueEntryBase diff --git a/src/tmtccmd/utility/exit_handler.py b/src/tmtccmd/utility/exit_handler.py index e8ade115..0819512a 100644 --- a/src/tmtccmd/utility/exit_handler.py +++ b/src/tmtccmd/utility/exit_handler.py @@ -1,13 +1,13 @@ import signal from tmtccmd.com_if.com_interface_base import CommunicationInterface -from tmtccmd.core.backend import TmTcHandler +from tmtccmd.core.ccsds_backend import CcsdsTmtcBackend from tmtccmd.logging import get_console_logger LOGGER = get_console_logger() def keyboard_interrupt_handler( - tmtc_backend: TmTcHandler, com_interface: CommunicationInterface + tmtc_backend: CcsdsTmtcBackend, com_interface: CommunicationInterface ): tmtc_backend.close_listener(join=True, join_timeout_seconds=1.0) LOGGER.info("Closing TMTC client") From 9802be60c7c7d9f6b962fe68d6b8d5dd5c7ade1e Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Wed, 22 Jun 2022 17:44:46 +0200 Subject: [PATCH 063/221] continued backend exchange objects --- src/tmtccmd/core/backend.py | 33 +++++++++++++++++++++---------- src/tmtccmd/core/ccsds_backend.py | 22 ++++++++++----------- src/tmtccmd/core/frontend.py | 2 +- 3 files changed, 35 insertions(+), 22 deletions(-) diff --git a/src/tmtccmd/core/backend.py b/src/tmtccmd/core/backend.py index 393e395d..8cc8d5bb 100644 --- a/src/tmtccmd/core/backend.py +++ b/src/tmtccmd/core/backend.py @@ -1,6 +1,8 @@ import enum from abc import abstractmethod +from tmtccmd.config.definitions import CoreModeList + class Request(enum.IntEnum): NONE = 0 @@ -9,15 +11,9 @@ class Request(enum.IntEnum): DELAY_LISTENER = 3 -class BackendState: - def __init__(self, req: Request): - self.req = req - self.mode_changed = False - - class TcMode(enum.IntEnum): - IDLE = (0,) - ONE_QUEUE = (1,) + IDLE = 0 + ONE_QUEUE = 1 MULTI_QUEUE = 2 @@ -28,14 +24,31 @@ class TmMode(enum.IntEnum): class BackendModeWrapper: def __init__(self): + self.mode = CoreModeList.ONE_QUEUE_MODE self.tc_mode = TcMode.IDLE self.tm_mode = TmMode.IDLE class BackendState: def __init__(self): - self.mode_wrapper = BackendModeWrapper() - self.result = BackendState(Request.NONE) + self._mode_wrapper = BackendModeWrapper() + self._req = Request.NONE + + @property + def request(self): + return self._req + + @property + def mode(self): + return self._mode_wrapper.mode + + @property + def tc_mode(self): + return self._mode_wrapper.tc_mode + + @property + def tm_mode(self): + return self._mode_wrapper.tm_mode class BackendController: diff --git a/src/tmtccmd/core/ccsds_backend.py b/src/tmtccmd/core/ccsds_backend.py index 83fa87b2..d2495c1f 100644 --- a/src/tmtccmd/core/ccsds_backend.py +++ b/src/tmtccmd/core/ccsds_backend.py @@ -35,12 +35,11 @@ def __init__( tm_handler: TmHandlerBase, tc_handler: TcHandlerBase, ): - self.mode = CoreModeList.LISTENER_MODE - self.com_if_key = com_if.get_id() + self._state = BackendState() + self._com_if_key = com_if.get_id() self.__hook_obj = hook_obj self.__com_if_active = False self.__apid = 0 - self.__res = BackendState(Request.NONE) self.__tc_handler = tc_handler # This flag could be used later to command the TMTC Client with a front-end @@ -68,7 +67,7 @@ def __init__( @property def com_if_id(self): - return self.com_if_key + return self._com_if_key @property def com_if(self) -> CommunicationInterface: @@ -78,9 +77,10 @@ def com_if(self) -> CommunicationInterface: def tm_listener(self): return self.__tm_listener - def set_com_if(self, com_if: CommunicationInterface): - if not self.is_com_if_active(): + def try_set_com_if(self, com_if: CommunicationInterface): + if not self.com_if_active(): self.__com_if = com_if + self._com_if_key = com_if.get_id() self.__tm_listener.set_com_if(self.__com_if) else: LOGGER.warning( @@ -88,7 +88,7 @@ def set_com_if(self, com_if: CommunicationInterface): "reassigning a new one" ) - def is_com_if_active(self): + def com_if_active(self): return self.__com_if_active @property @@ -181,13 +181,13 @@ def periodic_op(self, ctrl: BackendController) -> BackendState: def __core_operation(self, one_shot: bool) -> BackendState: self.__handle_action() if one_shot: - self.__res.req = Request.TERMINATION_NO_ERROR + self._state.__req = Request.TERMINATION_NO_ERROR else: if self.mode == CoreModeList.IDLE: - self.__res.req = Request.DELAY_IDLE + self._state.__req = Request.DELAY_IDLE elif self.mode == CoreModeList.LISTENER_MODE: - self.__res.req = Request.DELAY_LISTENER - return self.__res + self._state.__req = Request.DELAY_LISTENER + return self._state def __com_if_closing(self): self.__tm_listener.stop() diff --git a/src/tmtccmd/core/frontend.py b/src/tmtccmd/core/frontend.py index 55c4a4d7..f6990171 100644 --- a/src/tmtccmd/core/frontend.py +++ b/src/tmtccmd/core/frontend.py @@ -98,7 +98,7 @@ def run_worker(self): if op_code == WorkerOperationsCodes.DISCONNECT: self.tmtc_handler.close_listener() while True: - if not self.tmtc_handler.is_com_if_active(): + if not self.tmtc_handler.com_if_active(): break else: time.sleep(0.4) From 628028c4f99db8a6c66485fe034466e506463b0d Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Wed, 22 Jun 2022 17:50:53 +0200 Subject: [PATCH 064/221] some more changes --- src/tmtccmd/core/backend.py | 4 ++++ src/tmtccmd/core/ccsds_backend.py | 10 +++++++--- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/tmtccmd/core/backend.py b/src/tmtccmd/core/backend.py index 8cc8d5bb..865f6cc3 100644 --- a/src/tmtccmd/core/backend.py +++ b/src/tmtccmd/core/backend.py @@ -50,6 +50,10 @@ def tc_mode(self): def tm_mode(self): return self._mode_wrapper.tm_mode + @property + def mode_wrapper(self): + return self._mode_wrapper + class BackendController: def __init__(self): diff --git a/src/tmtccmd/core/ccsds_backend.py b/src/tmtccmd/core/ccsds_backend.py index d2495c1f..40733d25 100644 --- a/src/tmtccmd/core/ccsds_backend.py +++ b/src/tmtccmd/core/ccsds_backend.py @@ -19,7 +19,7 @@ from tmtccmd.tm.ccsds_tm_listener import CcsdsTmListener from tmtccmd.ccsds.handler import CcsdsTmHandler from tmtccmd.com_if.com_interface_base import CommunicationInterface - +from tmtccmd.utility.countdown import Countdown LOGGER = get_console_logger() @@ -107,6 +107,10 @@ def apid(self) -> int: def apid(self, apid: int): self.__apid = apid + @property + def mode(self): + return self._state.mode + @staticmethod def start_handler(executed_handler, ctrl: BackendController): if not isinstance(executed_handler, CcsdsTmtcBackend): @@ -214,7 +218,7 @@ def __handle_action(self): # TODO: This this that is done for the listener mode: Do it for all modes with a # configurable polling delay. TM should be polled and handled independently of TC, # or tying them together in some way should remain a user option - if self.mode == CoreModeList.LISTENER_MODE: + if self._state.tm_mode == CoreModeList.LISTENER_MODE: if self.__tm_listener.reply_event(): LOGGER.info("TmTcHandler: Packets received.") packet_queues = self.__tm_listener.retrieve_tm_packet_queues(clear=True) @@ -236,7 +240,7 @@ def __handle_action(self): # be able to switch the mode self._seq_handler.queue_wrapper = service_queue self._seq_handler.send_queue_tc_and_receive_tm_sequentially() - self.mode = CoreModeList.LISTENER_MODE + self._state.mode_wrapper.mode = CoreModeList.LISTENER_MODE elif self.mode == CoreModeList.MULTI_INTERACTIVE_QUEUE_MODE: # TODO: Handle the queue as long as the current one is full. If it is finished, # request another queue or further instructions from the user, maybe in form From b691031e21ad0d360b17a849a9bbb81e8c69bcf0 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 23 Jun 2022 16:42:19 +0200 Subject: [PATCH 065/221] simplified sequential sender significantly --- src/tests/test_obj_id_manager.py | 11 -- src/tests/test_pus.py | 2 +- src/tmtccmd/config/globals.py | 2 +- src/tmtccmd/core/backend.py | 22 +-- src/tmtccmd/core/ccsds_backend.py | 12 +- src/tmtccmd/core/modes.py | 21 ++ src/tmtccmd/tc/ccsds_sender_receiver.py | 185 ----------------- src/tmtccmd/tc/ccsds_seq_sender.py | 138 +++++++++++++ src/tmtccmd/tc/ccsds_seq_sender_receiver.py | 207 -------------------- src/tmtccmd/tc/definitions.py | 4 +- src/tmtccmd/tc/handler.py | 17 +- src/tmtccmd/tc/helper.py | 0 src/tmtccmd/tc/packer.py | 47 ----- src/tmtccmd/utility/countdown.py | 9 +- 14 files changed, 189 insertions(+), 488 deletions(-) delete mode 100644 src/tests/test_obj_id_manager.py create mode 100644 src/tmtccmd/core/modes.py delete mode 100644 src/tmtccmd/tc/ccsds_sender_receiver.py create mode 100644 src/tmtccmd/tc/ccsds_seq_sender.py delete mode 100644 src/tmtccmd/tc/ccsds_seq_sender_receiver.py delete mode 100644 src/tmtccmd/tc/helper.py delete mode 100644 src/tmtccmd/tc/packer.py diff --git a/src/tests/test_obj_id_manager.py b/src/tests/test_obj_id_manager.py deleted file mode 100644 index db1facbf..00000000 --- a/src/tests/test_obj_id_manager.py +++ /dev/null @@ -1,11 +0,0 @@ -from unittest import TestCase -from tmtccmd.core.object_id_manager import insert_object_id, get_object_id_info - -TEST_ID_0 = bytes([0x00, 0x01, 0x02, 0x03]) - - -class TestObjIdManager(TestCase): - def test_obj_id_manager(self): - insert_object_id(object_id=TEST_ID_0, object_id_info=["TEST_ID_0"]) - info_list = get_object_id_info(object_id=TEST_ID_0) - self.assertTrue(info_list[0] == "TEST_ID_0") diff --git a/src/tests/test_pus.py b/src/tests/test_pus.py index f4b8b58b..7b42c4c3 100755 --- a/src/tests/test_pus.py +++ b/src/tests/test_pus.py @@ -46,7 +46,7 @@ def tm_func(raw_telemetry: bytearray): print(full_string) print(pus_17_telemetry) print(repr(pus_17_telemetry)) - self.assertTrue(pus_17_telemetry.pus_tm.packet_id == 0x8 << 8 | 0xEF) + self.assertTrue(pus_17_telemetry.pus_tm.packet_id.raw() == 0x8 << 8 | 0xEF) def test_list_functionality(self): pus_17_telecommand = Service17TMExtended( diff --git a/src/tmtccmd/config/globals.py b/src/tmtccmd/config/globals.py index e1178312..a4363034 100644 --- a/src/tmtccmd/config/globals.py +++ b/src/tmtccmd/config/globals.py @@ -110,7 +110,7 @@ def handle_com_if_arg( if custom_com_if_dict is not None: all_com_ifs = CoreComInterfacesDict.update(custom_com_if_dict) try: - com_if_key = str(args.com_if) + com_if_key = str(args._com_if) except AttributeError: LOGGER.warning("No communication interface specified") LOGGER.warning("Trying to set from existing configuration..") diff --git a/src/tmtccmd/core/backend.py b/src/tmtccmd/core/backend.py index 865f6cc3..d54d1384 100644 --- a/src/tmtccmd/core/backend.py +++ b/src/tmtccmd/core/backend.py @@ -1,7 +1,7 @@ import enum from abc import abstractmethod -from tmtccmd.config.definitions import CoreModeList +from tmtccmd.core.modes import ModeWrapper, TcMode, TmMode class Request(enum.IntEnum): @@ -11,27 +11,9 @@ class Request(enum.IntEnum): DELAY_LISTENER = 3 -class TcMode(enum.IntEnum): - IDLE = 0 - ONE_QUEUE = 1 - MULTI_QUEUE = 2 - - -class TmMode(enum.IntEnum): - IDLE = 0 - LISTENER = 1 - - -class BackendModeWrapper: - def __init__(self): - self.mode = CoreModeList.ONE_QUEUE_MODE - self.tc_mode = TcMode.IDLE - self.tm_mode = TmMode.IDLE - - class BackendState: def __init__(self): - self._mode_wrapper = BackendModeWrapper() + self._mode_wrapper = ModeWrapper() self._req = Request.NONE @property diff --git a/src/tmtccmd/core/ccsds_backend.py b/src/tmtccmd/core/ccsds_backend.py index 40733d25..8aad7e61 100644 --- a/src/tmtccmd/core/ccsds_backend.py +++ b/src/tmtccmd/core/ccsds_backend.py @@ -13,13 +13,12 @@ from tmtccmd.tm.definitions import TmTypes from tmtccmd.tm.handler import TmHandlerBase from tmtccmd.logging import get_console_logger -from tmtccmd.tc.ccsds_seq_sender_receiver import ( - SequentialCcsdsSenderReceiver, +from tmtccmd.tc.ccsds_seq_sender import ( + SequentialCcsdsSender, ) from tmtccmd.tm.ccsds_tm_listener import CcsdsTmListener from tmtccmd.ccsds.handler import CcsdsTmHandler from tmtccmd.com_if.com_interface_base import CommunicationInterface -from tmtccmd.utility.countdown import Countdown LOGGER = get_console_logger() @@ -56,12 +55,9 @@ def __init__( ) self.exit_on_com_if_init_failure = True self._queue_wrapper = QueueWrapper(None) - self._seq_handler = SequentialCcsdsSenderReceiver( + self._seq_handler = SequentialCcsdsSender( com_if=self.__com_if, - tm_handler=self.__tm_handler, - tm_listener=self.__tm_listener, tc_handler=tc_handler, - apid=self.__apid, queue_wrapper=self._queue_wrapper, ) @@ -239,7 +235,7 @@ def __handle_action(self): # the queue and then request program termination. Alternatively, the user should # be able to switch the mode self._seq_handler.queue_wrapper = service_queue - self._seq_handler.send_queue_tc_and_receive_tm_sequentially() + seq_res_wrapper = self._seq_handler.operation() self._state.mode_wrapper.mode = CoreModeList.LISTENER_MODE elif self.mode == CoreModeList.MULTI_INTERACTIVE_QUEUE_MODE: # TODO: Handle the queue as long as the current one is full. If it is finished, diff --git a/src/tmtccmd/core/modes.py b/src/tmtccmd/core/modes.py new file mode 100644 index 00000000..f9e26f9a --- /dev/null +++ b/src/tmtccmd/core/modes.py @@ -0,0 +1,21 @@ +import enum + +from tmtccmd.config.definitions import CoreModeList + + +class TcMode(enum.IntEnum): + IDLE = 0 + ONE_QUEUE = 1 + MULTI_QUEUE = 2 + + +class TmMode(enum.IntEnum): + IDLE = 0 + LISTENER = 1 + + +class ModeWrapper: + def __init__(self): + self.mode = CoreModeList.ONE_QUEUE_MODE + self.tc_mode = TcMode.IDLE + self.tm_mode = TmMode.IDLE diff --git a/src/tmtccmd/tc/ccsds_sender_receiver.py b/src/tmtccmd/tc/ccsds_sender_receiver.py deleted file mode 100644 index 56f90b0a..00000000 --- a/src/tmtccmd/tc/ccsds_sender_receiver.py +++ /dev/null @@ -1,185 +0,0 @@ -"""Base class for sender/receiver objects -@author: R. Mueller -""" -import time -from typing import Optional - -from tmtccmd.com_if.com_interface_base import CommunicationInterface -from tmtccmd.config.definitions import CoreGlobalIds -from tmtccmd.logging import get_console_logger - -from tmtccmd.ccsds.handler import CcsdsTmHandler -from tmtccmd.tm.ccsds_tm_listener import CcsdsTmListener -from tmtccmd.tc.definitions import ( - TcQueueEntryBase, - TcQueueEntryType, - cast_pus_tc_entry_from_base, - cast_raw_tc_entry_from_base, - cast_print_entry_from_base, - cast_wait_entry_from_base, - cast_timeout_entry_from_base, -) -from tmtccmd.core.globals_manager import get_global -from tmtccmd.tc.handler import TcHandlerBase - -LOGGER = get_console_logger() - - -class CcsdsCommandSenderReceiver: - """ - This is the generic CommandSenderReceiver object. All TMTC objects inherit this object, - for example specific implementations (e.g. SingleCommandSenderReceiver) - """ - - def __init__( - self, - com_if: CommunicationInterface, - tm_listener: CcsdsTmListener, - tm_handler: CcsdsTmHandler, - tc_handler: TcHandlerBase, - apid: int, - ): - - """ - :param com_if: CommunicationInterface object. Instantiate the desired one - and pass it here - """ - self._tm_timeout = get_global(CoreGlobalIds.TM_TIMEOUT) - self._tm_handler = tm_handler - self._tc_handler = tc_handler - self._tc_send_timeout_factor = get_global(CoreGlobalIds.TC_SEND_TIMEOUT_FACTOR) - self._apid = apid - - if isinstance(com_if, CommunicationInterface): - self._com_if = com_if - else: - LOGGER.error("CommandSenderReceiver: Invalid communication interface!") - raise TypeError("CommandSenderReceiver: Invalid communication interface!") - - if isinstance(tm_listener, CcsdsTmListener): - self._tm_listener = tm_listener - else: - LOGGER.error("CommandSenderReceiver: Invalid TM listener!") - raise TypeError("Invalid TM Listener!") - - self._start_time = 0 - self._elapsed_time = 0 - self._timeout_counter = 0 - - # needed to store last actual TC packet from queue - self._last_queue_entry: Optional[TcQueueEntryBase] = None - self._last_tc: Optional[TcQueueEntryBase] = None - - # this flag can be used to notify when the operation is finished - self._operation_pending = False - - self._wait_period = 0 - self._wait_start = 0 - self._wait_end = 0 - - def set_tm_timeout(self, tm_timeout: float = -1): - """ - Set the TM timeout. Usually, the global value set by the args parser is set, - but the TM timeout can be reset (e.g. for slower architectures) - :param tm_timeout: New TM timeout value as a float value in seconds - :return: - """ - if tm_timeout == -1: - tm_timeout = get_global(CoreGlobalIds.TM_TIMEOUT) - self._tm_timeout = tm_timeout - - def set_tc_send_timeout_factor(self, new_factor: float = -1): - """ - Set the TC resend timeout factor. After self._tm_timeout * new_factor seconds, - a telecommand will be resent again. - :param new_factor: Factor as a float number - :return: - """ - if new_factor == -1: - new_factor = get_global(CoreGlobalIds.TC_SEND_TIMEOUT_FACTOR) - self._tc_send_timeout_factor = new_factor - - def _check_for_first_reply(self) -> bool: - """ - Checks for replies. If no reply is received, send telecommand again in checkForTimeout() - :return: None - """ - if self._tm_listener.reply_event(): - self._operation_pending = False - self._tm_listener.clear_reply_event() - return True - else: - return self._check_for_tm_timeout() - - def wait_period_ongoing( - self, - sleep_rest_of_wait_period: bool = False, - ) -> bool: - """If the first argument is set to true, this function will reset the internal wait time - variable to 0 - """ - if sleep_rest_of_wait_period: - # wait rest of wait time - sleep_time = self._wait_end - time.time() - if sleep_time > 0: - time.sleep(sleep_time) - LOGGER.info("Wait period over.") - return False - # If wait period was specified, we need to wait before checking the next queue entry. - if self._wait_period > 0: - if time.time() - self._wait_start < self._wait_period: - return True - else: - LOGGER.info("Wait period over.") - self._wait_period = 0 - return False - else: - return False - - def check_queue_entry(self, queue_entry: TcQueueEntryBase) -> bool: - """ - Checks whether the entry in the pus_tc queue is a telecommand. - :param queue_entry: Generic queue entry - :return: True if queue entry is telecommand, False if it is not - """ - if not isinstance(queue_entry, TcQueueEntryBase): - LOGGER.warning("Invalid queue entry detected") - raise ValueError("Invalid queue entry detected") - - if queue_entry.etype == TcQueueEntryType.WAIT: - wait_entry = cast_wait_entry_from_base(queue_entry) - self._wait_period = wait_entry.wait_time - self._wait_start = time.time() - self._wait_end = self._wait_start + self._wait_period - LOGGER.info(f"Waiting for {self._wait_period} seconds.") - elif queue_entry.etype == TcQueueEntryType.SET_TIMEOUT: - timeout_entry = cast_timeout_entry_from_base(queue_entry) - self._tm_timeout = timeout_entry.timeout_secs - self._tm_listener.seq_timeout = timeout_entry.timeout_secs - is_tc = False - if ( - queue_entry.etype == TcQueueEntryType.RAW_TC - or queue_entry.etype == TcQueueEntryType.PUS_TC - ): - self._last_tc = queue_entry - is_tc = True - self._last_queue_entry = queue_entry - return is_tc - - def _check_for_tm_timeout(self) -> bool: - """ - Checks whether a timeout after sending a telecommand has occured and sends telecommand - again. If resending reached certain counter, exit the program. - :return: - """ - if self._start_time == 0: - raise True - if self._timeout_counter == 5: - LOGGER.info("CommandSenderReceiver: No response from command !") - self._operation_pending = False - self._elapsed_time = time.time() - self._start_time - if self._elapsed_time >= self._tm_timeout * self._tc_send_timeout_factor: - # TODO: The user should be able to select via Python code whether TCs should be resent - return True - else: - return False diff --git a/src/tmtccmd/tc/ccsds_seq_sender.py b/src/tmtccmd/tc/ccsds_seq_sender.py new file mode 100644 index 00000000..4c2fd152 --- /dev/null +++ b/src/tmtccmd/tc/ccsds_seq_sender.py @@ -0,0 +1,138 @@ +"""Used to send multiple TCs in sequence""" +import enum +from typing import Optional + +from tmtccmd.tc.definitions import ( + TcQueueEntryBase, + TcQueueEntryType, + cast_wait_entry_from_base, + cast_timeout_entry_from_base, +) +from tmtccmd.tc.handler import TcHandlerBase +from tmtccmd.tc.queue import QueueWrapper +from tmtccmd.com_if.com_interface_base import CommunicationInterface +from tmtccmd.logging import get_console_logger +from tmtccmd.utility.countdown import Countdown + +LOGGER = get_console_logger() + + +class SenderMode(enum.IntEnum): + IDLE = 0 + BUSY = 1 + DONE = 2 + + +class SeqResultWrapper: + def __init__(self, mode: SenderMode): + self.mode = mode + + +class SequentialCcsdsSender: + """Specific implementation of CommandSenderReceiver to send multiple telecommands in sequence""" + + def __init__( + self, + queue_wrapper: QueueWrapper, + com_if: CommunicationInterface, + tc_handler: TcHandlerBase, + ): + """ + :param queue_wrapper: Wrapper object containing the queue and queue handling properties + :param tc_handler: + :param com_if: CommunicationInterface object, passed on to CommandSenderReceiver + """ + self._com_if = com_if + self._tc_handler = tc_handler + self._queue_wrapper = queue_wrapper + # This flag can be used to notify the sender to send the next TC + self._next_send_condition = True + self._mode = SenderMode.IDLE + self._wait_cd = Countdown(0) + self._send_cd = Countdown(queue_wrapper.inter_cmd_delay) + self._current_res = SeqResultWrapper(self._mode) + self._op_divider = 0 + self._last_queue_entry: Optional[TcQueueEntryBase] = None + self._last_tc: Optional[TcQueueEntryBase] = None + + @property + def queue_wrapper(self): + return self._queue_wrapper + + @queue_wrapper.setter + def queue_wrapper(self, queue_wrapper: QueueWrapper): + if self._mode == SenderMode.BUSY: + raise ValueError("Busy with other queue") + self._mode = SenderMode.BUSY + # Set to true for first packet, otherwise nothing will be sent. + self._next_send_condition = True + self._queue_wrapper = queue_wrapper + + def handle_new_queue_forced(self, queue_wrapper: QueueWrapper): + self._mode = SenderMode.IDLE + self.queue_wrapper = queue_wrapper + + def pause(self): + self._mode = SenderMode.IDLE + + def operation(self) -> SeqResultWrapper: + if not self.queue_wrapper.queue and self._mode != SenderMode.DONE: + self._mode = SenderMode.DONE + if self._mode == SenderMode.IDLE or self._mode == SenderMode.DONE: + return SeqResultWrapper(self._mode) + self._handle_current_tc_queue() + + def _handle_current_tc_queue(self): + """Primary function which is called for sequential transfer. + :return: + """ + # Do not use continue anywhere in this while loop for now + if not self.queue_wrapper.queue: + if self._wait_cd.timed_out() and self._send_cd.timed_out(): + # cache this for last wait time + self._mode = SenderMode.DONE + else: + if not self._send_cd.busy() and not self._wait_cd.busy(): + self._send_next_telecommand() + self.__print_rem_timeout(op_divider=self._op_divider) + self._op_divider += 1 + + def __print_rem_timeout(self, op_divider: int, divisor: int = 15): + if self._wait_cd.busy() and op_divider % divisor == 0: + rem_time = self._wait_cd.rem_time() + if self._wait_cd.rem_time() > 0: + LOGGER.info(f"{rem_time:.01f} seconds wait time remaining") + + def _send_next_telecommand(self): + """Sends the next telecommand and returns whether an actual telecommand was sent""" + next_queue_entry = self.queue_wrapper.queue.pop() + if self.check_queue_entry(next_queue_entry): + self._send_cd.reset() + self._tc_handler.send_cb(next_queue_entry, self._com_if) + + def check_queue_entry(self, queue_entry: TcQueueEntryBase) -> bool: + """ + Checks whether the entry in the pus_tc queue is a telecommand. + :param queue_entry: Generic queue entry + :return: True if queue entry is telecommand, False if it is not + """ + if not isinstance(queue_entry, TcQueueEntryBase): + LOGGER.warning("Invalid queue entry detected") + raise ValueError("Invalid queue entry detected") + + if queue_entry.etype == TcQueueEntryType.WAIT: + wait_entry = cast_wait_entry_from_base(queue_entry) + LOGGER.info(f"Waiting for {wait_entry.wait_time} seconds.") + self._wait_cd.reset(new_timeout=wait_entry.wait_time) + elif queue_entry.etype == TcQueueEntryType.SET_INTER_CMD_DELAY: + timeout_entry = cast_timeout_entry_from_base(queue_entry) + self._send_cd.reset(new_timeout=timeout_entry.timeout_secs) + is_tc = False + if ( + queue_entry.etype == TcQueueEntryType.RAW_TC + or queue_entry.etype == TcQueueEntryType.PUS_TC + ): + self._last_tc = queue_entry + is_tc = True + self._last_queue_entry = queue_entry + return is_tc diff --git a/src/tmtccmd/tc/ccsds_seq_sender_receiver.py b/src/tmtccmd/tc/ccsds_seq_sender_receiver.py deleted file mode 100644 index ea79416e..00000000 --- a/src/tmtccmd/tc/ccsds_seq_sender_receiver.py +++ /dev/null @@ -1,207 +0,0 @@ -"""Used to send multiple TCs in sequence and listen for replies after each sent TC""" -import sys -import time -import threading - -from tmtccmd.tc.ccsds_sender_receiver import CcsdsCommandSenderReceiver -from tmtccmd.tc.handler import TcHandlerBase -from tmtccmd.tc.queue import QueueWrapper -from tmtccmd.ccsds.handler import CcsdsTmHandler -from tmtccmd.tm.ccsds_tm_listener import CcsdsTmListener -from tmtccmd.com_if.com_interface_base import CommunicationInterface -from tmtccmd.logging import get_console_logger - - -LOGGER = get_console_logger() - - -class SequentialCcsdsSenderReceiver(CcsdsCommandSenderReceiver): - """Specific implementation of CommandSenderReceiver to send multiple telecommands in sequence""" - - def __init__( - self, - queue_wrapper: QueueWrapper, - com_if: CommunicationInterface, - tm_listener: CcsdsTmListener, - tm_handler: CcsdsTmHandler, - tc_handler: TcHandlerBase, - apid: int, - ): - """ - :param com_if: CommunicationInterface object, passed on to CommandSenderReceiver - :param tm_listener: TmListener object which runs in the background and receives - all Telemetry - """ - super().__init__( - com_if=com_if, - tm_listener=tm_listener, - tm_handler=tm_handler, - apid=apid, - tc_handler=tc_handler, - ) - self._tc_handler = tc_handler - self._queue_wrapper = queue_wrapper - self.__all_replies_received = False - # This flag can be used to notify the sender to send the next TC - self._next_send_condition = False - - # create a daemon (which will exit automatically if all other threads are closed) - # to handle telemetry - # this is an optional functionality which can be used by the TmTcHandler aka backend - self.daemon_thread = threading.Thread( - target=self.__perform_daemon_operation, daemon=True - ) - - @property - def queue_wrapper(self): - return self._queue_wrapper - - @queue_wrapper.setter - def queue_wrapper(self, queue_wrapper: QueueWrapper): - self._queue_wrapper = queue_wrapper - - def operation(self): - pass - - def send_queue_tc_and_receive_tm_sequentially(self): - """Primary function which is called for sequential transfer. - :return: - """ - self._tm_listener.sequence_mode() - # tiny delay for pus_tm listener - time.sleep(0.05) - if self.queue_wrapper.queue: - try: - self.__handle_tc_sending_and_tm_reception() - except (KeyboardInterrupt, SystemExit): - LOGGER.info("Keyboard Interrupt.") - sys.exit() - else: - LOGGER.warning("Supplied TC queue is empty!") - - def send_queue_tc_and_return(self): - self._tm_listener.listener_mode() - # tiny delay for pus_tm listener - time.sleep(0.05) - if self.queue_wrapper.queue: - try: - # Set to true for first packet, otherwise nothing will be sent. - self._next_send_condition = True - if not self.queue_wrapper.queue.__len__() == 0: - self.__check_next_tc_send() - except (KeyboardInterrupt, SystemExit): - LOGGER.info("Keyboard Interrupt.") - sys.exit() - else: - LOGGER.warning("Supplied TC queue is empty!") - - def start_daemon(self): - if not self.daemon_thread.is_alive(): - self.daemon_thread.start() - - def __perform_daemon_operation(self): - while True: - self.__check_for_reply() - time.sleep(0.2) - - def __print_rem_timeout(self, op_divider: int, divisor: int = 15): - if op_divider % divisor == 0: - rem_time = self._wait_end - time.time() - if rem_time > 0: - LOGGER.info(f"{rem_time:.01f} seconds wait time remaining") - - def __handle_tc_sending_and_tm_reception(self): - """Internal function which handles the given TC queue while also simultaneously - polling all TM. - TODO: Make it testable by not delaying here and removing the loop, make - this function runnable in discrete steps - """ - # Set to true for first packet, otherwise nothing will be sent. - self._next_send_condition = True - next_sleep = 0.2 - op_divider = 0 - tc_queue_is_empty_and_processed = False - while not self.__all_replies_received: - # Do not use continue anywhere in this while loop for now - if not tc_queue_is_empty_and_processed: - if self.queue_wrapper.queue.__len__() == 0: - if self._wait_period == 0: - # cache this for last wait time - self._start_time = time.time() - tc_queue_is_empty_and_processed = True - self.__check_for_reply() - if not tc_queue_is_empty_and_processed: - if not self.wait_period_ongoing(): - self._wait_period = 0 - self.__check_next_tc_send() - self.__print_rem_timeout(op_divider=op_divider) - time.sleep(next_sleep) - else: - if not self._check_for_tm_timeout(): - self.__check_for_reply() - self.__print_rem_timeout(op_divider=op_divider) - # Delay for a bit longer in case we are waiting for the TM timeout - next_sleep = 0.5 - else: - self.__all_replies_received = True - break - time.sleep(next_sleep) - op_divider += 1 - self._tm_listener.set_mode_op_finished() - LOGGER.info("SequentialSenderReceiver: All replies received!") - - def __check_for_reply(self): - if self._tm_listener.reply_event(): - self._reply_received = True - self._tm_listener.clear_reply_event() - packet_queue = self._tm_listener.retrieve_ccsds_tm_packet_queue( - apid=self._apid, clear=True - ) - self._tm_handler.handle_ccsds_packet_queue( - apid=self._apid, tm_queue=packet_queue, handler=None - ) - # This makes reply reception more responsive - elif self._tm_listener.tm_packets_available(): - packet_queue = self._tm_listener.retrieve_ccsds_tm_packet_queue( - apid=self._apid, clear=True - ) - self._tm_handler.handle_ccsds_packet_queue( - apid=self._apid, tm_queue=packet_queue, handler=None - ) - - def __check_next_tc_send(self): - # this flag is set in the separate receiver thread too - if self._next_send_condition: - if self._send_next_telecommand(): - self._next_send_condition = False - # just calculate elapsed time if start time has already been set (= command has been sent) - else: - if self._check_for_tm_timeout(): - self._next_send_condition = True - - def _send_next_telecommand(self) -> bool: - """Sends the next telecommand and returns whether an actual telecommand was sent""" - # Queue empty. Can happen because a wait period might still be ongoing - if not self.queue_wrapper.queue: - return False - if self.wait_period_ongoing(): - return False - next_queue_entry = self.queue_wrapper.queue.pop() - if self.check_queue_entry(next_queue_entry): - self._start_time = time.time() - self._tc_handler.pre_send_cb(next_queue_entry, self._com_if) - - # queue empty. - elif not self.queue_wrapper.queue: - # Another special case: Last queue entry is to wait. - if self._wait_period > 0: - if self.wait_period_ongoing(): - return False - self._wait_period = 0 - self.__all_replies_received = True - return False - else: - self._tc_handler.pre_send_cb(next_queue_entry, self._com_if) - # If the queue entry was not a telecommand, send next telecommand - self.__check_next_tc_send() - return True diff --git a/src/tmtccmd/tc/definitions.py b/src/tmtccmd/tc/definitions.py index 1864fa96..0603b269 100644 --- a/src/tmtccmd/tc/definitions.py +++ b/src/tmtccmd/tc/definitions.py @@ -12,7 +12,7 @@ class TcQueueEntryType(Enum): PRINT = "print" WAIT = "wait" RAW_PRINT = "raw-print" - SET_TIMEOUT = "set-timeout" + SET_INTER_CMD_DELAY = "set-delay" class TcQueueEntryBase: @@ -69,7 +69,7 @@ def __repr__(self): class TimeoutEntry(TcQueueEntryBase): def __init__(self, timeout_secs: float): - super().__init__(TcQueueEntryType.SET_TIMEOUT) + super().__init__(TcQueueEntryType.SET_INTER_CMD_DELAY) self.timeout_secs = timeout_secs def __repr__(self): diff --git a/src/tmtccmd/tc/handler.py b/src/tmtccmd/tc/handler.py index 3ec6c499..fa333831 100644 --- a/src/tmtccmd/tc/handler.py +++ b/src/tmtccmd/tc/handler.py @@ -3,7 +3,16 @@ from tmtccmd.com_if.com_interface_base import CommunicationInterface from tmtccmd.core.ccsds_backend import ProcedureInfo -from tmtccmd.tc.definitions import TcQueueEntryBase +from tmtccmd.core.modes import ModeWrapper +from tmtccmd.tc.definitions import TcQueueEntryBase, QueueDequeT + + +class FeedWrapper: + def __init__(self): + self.current_queue: Optional[QueueDequeT] = None + self.dispatch_next_queue = False + self.pause = False + self.modes = ModeWrapper() class TcHandlerBase: @@ -11,9 +20,7 @@ def __init__(self): pass @abstractmethod - def pre_send_cb( - self, tc_queue_entry: TcQueueEntryBase, com_if: CommunicationInterface - ): + def send_cb(self, tc_queue_entry: TcQueueEntryBase, com_if: CommunicationInterface): pass @abstractmethod @@ -21,5 +28,5 @@ def queue_finished_cb(self, info: ProcedureInfo): pass @abstractmethod - def feed_cb(self, info: Optional[ProcedureInfo]): + def feed_cb(self, info: Optional[ProcedureInfo], wrapper: FeedWrapper): pass diff --git a/src/tmtccmd/tc/helper.py b/src/tmtccmd/tc/helper.py deleted file mode 100644 index e69de29b..00000000 diff --git a/src/tmtccmd/tc/packer.py b/src/tmtccmd/tc/packer.py deleted file mode 100644 index c11d694a..00000000 --- a/src/tmtccmd/tc/packer.py +++ /dev/null @@ -1,47 +0,0 @@ -# -*- coding: utf-8 -*- -""" -:file: obsw_tc_packer.py -:author: R. Mueller -:date: 10.05.2021 -""" -import sys -from typing import Union - -from tmtccmd.tc.definitions import QueueHelper -from spacepackets.ecss.tc import PusTelecommand -from tmtccmd.logging import get_console_logger -from tmtccmd.pus.pus_17_test import pack_service_17_ping_command -from tmtccmd.tc.pus_5_event import pack_generic_service5_test_into - -LOGGER = get_console_logger() - - -""" -class ServiceQueuePacker: - def __init__(self): - pass - - @staticmethod - def pack_service_queue_core(service: int, op_code: str, service_queue: TcQueueT): - try: - from tmtccmd.config.hook import get_global_hook_obj - - hook_obj = get_global_hook_obj() - hook_obj.pack_service_queue( - service=service, op_code=op_code, tc_queue=service_queue - ) - except ImportError: - LOGGER.exception( - "Could not import custom telecommand hook! Make sure to implement it." - ) - sys.exit(1) -""" - - -def ping_queue(service_queue: QueueHelper): - from tmtccmd.config.definitions import CoreServiceList, QueueCommands - - service_queue.appendleft((QueueCommands.PRINT, "Sending ping command PUS TC[17,1]")) - service_queue.appendleft( - pack_service_17_ping_command(ssc=1700).pack_command_tuple() - ) diff --git a/src/tmtccmd/utility/countdown.py b/src/tmtccmd/utility/countdown.py index 19f09b5b..6acf72df 100644 --- a/src/tmtccmd/utility/countdown.py +++ b/src/tmtccmd/utility/countdown.py @@ -28,7 +28,7 @@ def timed_out(self) -> bool: def busy(self) -> bool: return not self.timed_out() - def reset(self, new_timeout: Optional[float]): + def reset(self, new_timeout: Optional[float] = None): if new_timeout is not None: self.timeout = new_timeout else: @@ -36,3 +36,10 @@ def reset(self, new_timeout: Optional[float]): def time_out(self): self._start_time = time.time() - self._timeout + + def rem_time(self) -> float: + end_time = self._start_time + self._timeout + current = time.time() + if end_time < current: + return 0 + return end_time - current From 23eae72eab61d47a68bc1ee4428db3f2cad1915b Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 23 Jun 2022 16:51:43 +0200 Subject: [PATCH 066/221] bump required spacepackets version --- setup.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.cfg b/setup.cfg index bfbdd3e2..9181d951 100644 --- a/setup.cfg +++ b/setup.cfg @@ -32,7 +32,7 @@ install_requires = colorama>=0.4.4 colorlog>=6.6.0 dle-encoder>=0.2 - spacepackets>=0.8.1 + spacepackets>=0.10 prompt-toolkit>=3.0.28 package_dir = = src From fcaa6dc092bb28b26ccc91db829b0c6f0aae4a41 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 23 Jun 2022 17:03:53 +0200 Subject: [PATCH 067/221] fix tests --- src/tests/backend_mock.py | 12 ++++-- src/tests/hook_obj_mock.py | 75 +++++------------------------------- src/tests/tc_handler_mock.py | 16 ++++++++ 3 files changed, 33 insertions(+), 70 deletions(-) create mode 100644 src/tests/tc_handler_mock.py diff --git a/src/tests/backend_mock.py b/src/tests/backend_mock.py index 3d1a3b85..92f4cc6e 100644 --- a/src/tests/backend_mock.py +++ b/src/tests/backend_mock.py @@ -1,29 +1,33 @@ from unittest.mock import MagicMock +from tests.hook_obj_mock import TestHookObj +from tests.tc_handler_mock import TcHandler + from tmtccmd.core.ccsds_backend import CcsdsTmtcBackend from tmtccmd.ccsds.handler import CcsdsTmHandler from tmtccmd.config.com_if import create_communication_interface_default -from tmtccmd.sendreceive.ccsds_tm_listener import CcsdsTmListener +from tmtccmd.tm.ccsds_tm_listener import CcsdsTmListener from tmtccmd.utility.tmtc_printer import FsfwTmTcPrinter, DisplayMode from tmtccmd.config.definitions import CoreComInterfaces, CoreModeList from tmtccmd.core.frontend_base import FrontendBase def create_backend_mock(tm_handler: CcsdsTmHandler) -> CcsdsTmtcBackend: + hook_obj = TestHookObj() tmtc_printer = FsfwTmTcPrinter(display_mode=DisplayMode.LONG, file_logger=None) com_if = create_communication_interface_default( com_if_key=CoreComInterfaces.DUMMY.value, json_cfg_path="tmtc_config.json", ) + tc_handler = TcHandler() tm_listener = CcsdsTmListener(com_if=com_if, seq_timeout=3.0) # The global variables are set by the argument parser. tmtc_backend = CcsdsTmtcBackend( + hook_obj=hook_obj, com_if=com_if, tm_listener=tm_listener, - init_mode=CoreModeList.IDLE, - init_service=17, - init_opcode="0", tm_handler=tm_handler, + tc_handler=tc_handler, ) tmtc_backend.start_listener = MagicMock(return_value=0) tmtc_backend.initialize = MagicMock(return_value=0) diff --git a/src/tests/hook_obj_mock.py b/src/tests/hook_obj_mock.py index 96a6e2d2..9c71a3f0 100644 --- a/src/tests/hook_obj_mock.py +++ b/src/tests/hook_obj_mock.py @@ -1,17 +1,15 @@ from abc import abstractmethod -from typing import Dict, Union, Optional, Tuple +from typing import Optional from unittest.mock import MagicMock import argparse -from tmtccmd.utility.tmtc_printer import FsfwTmTcPrinter from tmtccmd.config.com_if import CommunicationInterface -from tmtccmd.config.definitions import DEFAULT_APID -from tmtccmd.config.definitions import ServiceOpCodeDictT, CoreModeList -from tmtccmd.tm.pus_3_hk_base import Service3Base +from tmtccmd.config.definitions import CoreModeList +from tmtccmd.config.tmtc_defs import TmTcDefWrapper from tmtccmd.core.ccsds_backend import CcsdsTmtcBackend -from tmtccmd.tc.definitions import QueueHelper from tmtccmd.config.cfg_hook import TmTcCfgHookBase from tmtccmd.logging import get_console_logger +from tmtccmd.utility.obj_id import ObjectIdDictT LOGGER = get_console_logger() @@ -46,42 +44,19 @@ class TestHookObj(TmTcCfgHookBase): service_3_handler_called = False def __init__(self): - super(self, TmTcCfgHookBase).__init__() + super().__init__() self.get_obj_id_called = False self.add_globals_pre_args_parsing_called = False self.add_globals_post_args_parsing_called = False self.assign_communication_interface_called = False @abstractmethod - def get_object_ids(self) -> Dict[bytes, list]: + def get_object_ids(self) -> ObjectIdDictT: """The user can specify an object ID dictionary here mapping object ID bytearrays to a list. This list could contain containing the string representation or additional information about that object ID. """ - return TmTcCfgHookBase.get_object_ids() - - @abstractmethod - def add_globals_pre_args_parsing(self, gui: bool = False): - """Add all global variables prior to parsing the CLI arguments. - - :param gui: Set to true if the GUI mode is used - :return: - """ - from tmtccmd.config.globals import set_default_globals_pre_args_parsing - - set_default_globals_pre_args_parsing(gui=gui, apid=DEFAULT_APID) - - @abstractmethod - def add_globals_post_args_parsing(self, args: argparse.Namespace): - """Add global variables prior after parsing the CLI arguments. - - :param args: Specify whether a GUI is used - """ - from tmtccmd.config.globals import set_default_globals_post_args_parsing - - set_default_globals_post_args_parsing( - args=args, json_cfg_path=self.get_json_config_file_path() - ) + return super().get_object_ids() @abstractmethod def assign_communication_interface( @@ -95,12 +70,11 @@ def assign_communication_interface( from tmtccmd.config.com_if import create_communication_interface_default return create_communication_interface_default( - com_if_key=com_if_key, - json_cfg_path=self.get_json_config_file_path(), + com_if_key=com_if_key, json_cfg_path=self.json_cfg_path ) @abstractmethod - def get_tmtc_definitions(self) -> ServiceOpCodeDictT: + def get_tmtc_definitions(self) -> TmTcDefWrapper: """This is a dicitonary mapping services represented by strings to an operation code dictionary. @@ -118,34 +92,3 @@ def perform_mode_operation(self, tmtc_backend: CcsdsTmtcBackend, mode: int): :return: """ pass - - @abstractmethod - def pack_service_queue( - self, service: Union[int, str], op_code: str, tc_queue: QueueHelper - ): - """Overriding this function allows the user to package a telecommand queue for a given - service and operation code combination. - - :param service: - :param op_code: - :param tc_queue: - :return: - """ - pass - - @staticmethod - def handle_service_8_telemetry( - object_id: bytes, action_id: int, custom_data: bytearray - ) -> Tuple[list, list]: - """This function is called by the TMTC core to handle Service 8 packets - The user can return a tuple of two lists, where the first list - is a list of header strings to print and the second list is a list of values to print. - The TMTC core will take care of printing both lists and logging them. - - :param object_id: Byte representation of the object ID - :param action_id: - :param custom_data: - :return: - """ - TestHookObj.service_8_handler_called = True - return [], [] diff --git a/src/tests/tc_handler_mock.py b/src/tests/tc_handler_mock.py new file mode 100644 index 00000000..31eca8ae --- /dev/null +++ b/src/tests/tc_handler_mock.py @@ -0,0 +1,16 @@ +from typing import Optional + +from tmtccmd.com_if.com_interface_base import CommunicationInterface +from tmtccmd.tc.definitions import ProcedureInfo, TcQueueEntryBase +from tmtccmd.tc.handler import TcHandlerBase, FeedWrapper + + +class TcHandler(TcHandlerBase): + def send_cb(self, tc_queue_entry: TcQueueEntryBase, com_if: CommunicationInterface): + pass + + def queue_finished_cb(self, info: ProcedureInfo): + pass + + def feed_cb(self, info: Optional[ProcedureInfo], wrapper: FeedWrapper): + pass From 5ba15ce20c6ec237c1300c5ca91225ec97876ed8 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 23 Jun 2022 18:09:23 +0200 Subject: [PATCH 068/221] start unittests --- src/tests/test_cd.py | 23 +++++++++++ src/tests/test_queue.py | 36 +++++++++++++++++ src/tests/test_sendreceive.py | 5 --- src/tests/test_seq_sender.py | 18 +++++++++ src/tmtccmd/tc/ccsds_seq_sender.py | 7 +++- src/tmtccmd/tc/definitions.py | 63 ++++++++++++++++++++---------- src/tmtccmd/tc/handler.py | 3 +- src/tmtccmd/tc/queue.py | 14 ++++++- src/tmtccmd/utility/countdown.py | 4 +- 9 files changed, 140 insertions(+), 33 deletions(-) create mode 100644 src/tests/test_cd.py create mode 100644 src/tests/test_queue.py delete mode 100644 src/tests/test_sendreceive.py create mode 100644 src/tests/test_seq_sender.py diff --git a/src/tests/test_cd.py b/src/tests/test_cd.py new file mode 100644 index 00000000..6e53b682 --- /dev/null +++ b/src/tests/test_cd.py @@ -0,0 +1,23 @@ +import time +from unittest import TestCase +from tmtccmd.utility.countdown import Countdown + + +class CountdownTest(TestCase): + def test_basic(self): + test_cd = Countdown(init_timeout_secs=0.05) + self.assertTrue(test_cd.busy()) + self.assertFalse(test_cd.timed_out()) + self.assertTrue(test_cd.rem_time() > 0) + time.sleep(0.05) + self.assertTrue(test_cd.timed_out()) + self.assertTrue(test_cd.rem_time() == 0) + test_cd.timeout = 0.1 + self.assertTrue(test_cd.busy()) + self.assertFalse(test_cd.timed_out()) + time.sleep(0.1) + self.assertTrue(test_cd.timed_out()) + test_cd.reset(0.05) + self.assertTrue(test_cd.rem_time() > 0.045) + self.assertTrue(test_cd.busy()) + self.assertFalse(test_cd.timed_out()) diff --git a/src/tests/test_queue.py b/src/tests/test_queue.py new file mode 100644 index 00000000..4befd6a3 --- /dev/null +++ b/src/tests/test_queue.py @@ -0,0 +1,36 @@ +import math +from collections import deque +from typing import cast +from unittest import TestCase + +from spacepackets.ecss import PusTelecommand +from tmtccmd.tc.definitions import WaitEntry, CastWrapper +from tmtccmd.tc.queue import QueueWrapper, QueueHelper + + +class TestTcQueue(TestCase): + def test_queue(self): + queue_wrapper = QueueWrapper(queue=deque()) + self.assertEqual(queue_wrapper.queue, deque()) + queue_helper = QueueHelper(queue_wrapper) + queue_helper.add_wait(2.0) + self.assertEqual(len(queue_wrapper.queue), 1) + wait_entry = cast(WaitEntry, queue_wrapper.queue.pop()) + self.assertTrue(wait_entry) + self.assertTrue( + math.isclose(wait_entry.wait_time, eval(f"{wait_entry!r}").wait_time) + ) + self.assertEqual(wait_entry.wait_time, 2.0) + self.assertEqual(len(queue_wrapper.queue), 0) + pus_cmd = PusTelecommand(service=17, subservice=1) + queue_helper.add_pus_tc(pus_cmd) + self.assertEqual(len(queue_wrapper.queue), 1) + queue_helper.add_log_cmd("Test String") + queue_helper.add_raw_tc(bytes([0, 1, 2])) + queue_helper.add_ccsds_tc(pus_cmd.to_space_packet()) + self.assertEqual(len(queue_wrapper.queue), 4) + + pus_entry = queue_wrapper.queue.pop() + cast_wrapper = CastWrapper(pus_entry) + pus_entry = cast_wrapper.to_pus_tc_entry() + print(pus_entry.pus_tc) diff --git a/src/tests/test_sendreceive.py b/src/tests/test_sendreceive.py deleted file mode 100644 index 9093e9b2..00000000 --- a/src/tests/test_sendreceive.py +++ /dev/null @@ -1,5 +0,0 @@ -from unittest import TestCase - - -class TestSendReceive(TestCase): - pass diff --git a/src/tests/test_seq_sender.py b/src/tests/test_seq_sender.py new file mode 100644 index 00000000..439745be --- /dev/null +++ b/src/tests/test_seq_sender.py @@ -0,0 +1,18 @@ +from collections import deque +from unittest import TestCase +from unittest.mock import MagicMock + +from tmtccmd.com_if.com_interface_base import CommunicationInterface +from tmtccmd.tc.ccsds_seq_sender import SequentialCcsdsSender +from tmtccmd.tc.handler import TcHandlerBase +from tmtccmd.tc.queue import QueueWrapper, QueueHelper + + +class TestSendReceive(TestCase): + def basic_test(self): + queue_wrapper = QueueWrapper(queue=deque()) + queue_helper = QueueHelper(queue_wrapper) + tc_handler_mock = MagicMock(spec=TcHandlerBase) + com_if = MagicMock(spec=CommunicationInterface) + seq_sender = SequentialCcsdsSender(queue_wrapper, com_if, tc_handler_mock) + res = seq_sender.operation() diff --git a/src/tmtccmd/tc/ccsds_seq_sender.py b/src/tmtccmd/tc/ccsds_seq_sender.py index 4c2fd152..860b4757 100644 --- a/src/tmtccmd/tc/ccsds_seq_sender.py +++ b/src/tmtccmd/tc/ccsds_seq_sender.py @@ -75,9 +75,11 @@ def handle_new_queue_forced(self, queue_wrapper: QueueWrapper): def pause(self): self._mode = SenderMode.IDLE + def resume(self): + if self._mode == SenderMode.IDLE: + self._mode = SenderMode.BUSY + def operation(self) -> SeqResultWrapper: - if not self.queue_wrapper.queue and self._mode != SenderMode.DONE: - self._mode = SenderMode.DONE if self._mode == SenderMode.IDLE or self._mode == SenderMode.DONE: return SeqResultWrapper(self._mode) self._handle_current_tc_queue() @@ -91,6 +93,7 @@ def _handle_current_tc_queue(self): if self._wait_cd.timed_out() and self._send_cd.timed_out(): # cache this for last wait time self._mode = SenderMode.DONE + return else: if not self._send_cd.busy() and not self._wait_cd.busy(): self._send_next_telecommand() diff --git a/src/tmtccmd/tc/definitions.py b/src/tmtccmd/tc/definitions.py index 0603b269..2f9f2e40 100644 --- a/src/tmtccmd/tc/definitions.py +++ b/src/tmtccmd/tc/definitions.py @@ -1,15 +1,16 @@ from __future__ import annotations from enum import Enum -from typing import Deque -from typing import cast +from typing import Deque, cast, Type, Any +from spacepackets.ccsds.spacepacket import SpacePacket from spacepackets.ecss.tc import PusTelecommand class TcQueueEntryType(Enum): PUS_TC = "pus-tc" + CCSDS_TC = "ccsds-tc" RAW_TC = "raw-tc" CUSTOM = "custom" - PRINT = "print" + LOG = "log" WAIT = "wait" RAW_PRINT = "raw-print" SET_INTER_CMD_DELAY = "set-delay" @@ -37,16 +38,25 @@ def __init__(self, pus_tc: PusTelecommand): self.pus_tc = pus_tc def __repr__(self): - return f"{self.__class__.__name__}(pus_tc={self.pus_tc!r}" + return f"{self.__class__.__name__}({self.pus_tc!r})" + + +class SpacePacketEntry(TcQueueEntryBase): + def __init__(self, space_packet: SpacePacket): + super().__init__(TcQueueEntryType.CCSDS_TC) + self.space_packet = space_packet + + def __repr__(self): + return f"{self.__class__.__name__}({self.space_packet!r})" class LogQueueEntry(TcQueueEntryBase): def __init__(self, log_str: str): - super().__init__(TcQueueEntryType.PRINT) + super().__init__(TcQueueEntryType.LOG) self.print_str = log_str def __repr__(self): - return f"{self.__class__.__name__}(print_str={self.print_str!r}" + return f"{self.__class__.__name__}({self.print_str!r})" class RawTcEntry(TcQueueEntryBase): @@ -55,7 +65,7 @@ def __init__(self, tc: bytes): self.tc = tc def __repr__(self): - return f"{self.__class__.__name__}(tc={self.tc!r}" + return f"{self.__class__.__name__}({self.tc!r})" class WaitEntry(TcQueueEntryBase): @@ -64,7 +74,7 @@ def __init__(self, wait_secs: float): self.wait_time = wait_secs def __repr__(self): - return f"{self.__class__.__name__}(wait_time={self.wait_time!r}" + return f"{self.__class__.__name__}({self.wait_time!r})" class TimeoutEntry(TcQueueEntryBase): @@ -73,27 +83,40 @@ def __init__(self, timeout_secs: float): self.timeout_secs = timeout_secs def __repr__(self): - return f"{self.__class__.__name__}(timeout_secs={self.timeout_secs!r}" - + return f"{self.__class__.__name__}({self.timeout_secs!r})" -def cast_print_entry_from_base(base: TcQueueEntryBase) -> LogQueueEntry: - return cast(LogQueueEntry, base) +class CastWrapper: + def __init__(self, base: TcQueueEntryBase): + self.base = base -def cast_pus_tc_entry_from_base(base: TcQueueEntryBase) -> PusTcEntry: - return cast(PusTcEntry, base) + def __cast_internally( + self, + obj_type: Type[TcQueueEntryBase], + obj: TcQueueEntryBase, + expected_type: TcQueueEntryType, + ) -> Any: + if self.base.etype != expected_type: + raise TypeError(f"Invalid object {obj} for type {self.base.etype}") + return cast(obj_type, obj) + def to_print_entry(self) -> LogQueueEntry: + return self.__cast_internally(LogQueueEntry, self.base, self.base.etype) -def cast_raw_tc_entry_from_base(base: TcQueueEntryBase) -> RawTcEntry: - return cast(RawTcEntry, base) + def to_pus_tc_entry(self) -> PusTcEntry: + return self.__cast_internally(PusTcEntry, self.base, self.base.etype) + def to_raw_tc_entry(self) -> RawTcEntry: + return self.__cast_internally(RawTcEntry, self.base, self.base.etype) -def cast_wait_entry_from_base(base: TcQueueEntryBase) -> WaitEntry: - return cast(WaitEntry, base) + def to_wait_entry(self) -> WaitEntry: + return self.__cast_internally(WaitEntry, self.base, self.base.etype) + def to_timeout_entry(self) -> TimeoutEntry: + return self.__cast_internally(TimeoutEntry, self.base, self.base.etype) -def cast_timeout_entry_from_base(base: TcQueueEntryBase) -> TimeoutEntry: - return cast(TimeoutEntry, base) + def to_space_packet_entry(self) -> SpacePacketEntry: + return self.__cast_internally(SpacePacketEntry, self.base, self.base.etype) class ProcedureInfo: diff --git a/src/tmtccmd/tc/handler.py b/src/tmtccmd/tc/handler.py index fa333831..957a2076 100644 --- a/src/tmtccmd/tc/handler.py +++ b/src/tmtccmd/tc/handler.py @@ -2,9 +2,8 @@ from typing import Optional from tmtccmd.com_if.com_interface_base import CommunicationInterface -from tmtccmd.core.ccsds_backend import ProcedureInfo from tmtccmd.core.modes import ModeWrapper -from tmtccmd.tc.definitions import TcQueueEntryBase, QueueDequeT +from tmtccmd.tc.definitions import TcQueueEntryBase, QueueDequeT, ProcedureInfo class FeedWrapper: diff --git a/src/tmtccmd/tc/queue.py b/src/tmtccmd/tc/queue.py index 33a685c4..6623c7b9 100644 --- a/src/tmtccmd/tc/queue.py +++ b/src/tmtccmd/tc/queue.py @@ -8,19 +8,29 @@ PusTcEntry, RawTcEntry, WaitEntry, + SpacePacketEntry, ) class QueueWrapper: - def __init__(self, queue: Optional[QueueDequeT], inter_cmd_delay: bool = True): + def __init__(self, queue: Optional[QueueDequeT], inter_cmd_delay: float = 0.0): self.queue = queue self.inter_cmd_delay = inter_cmd_delay + def __repr__(self): + return ( + f"{self.__class__.__name__}(queue={self.queue!r}, " + f"inter_cmd_delay={self.inter_cmd_delay!r})" + ) + class QueueHelper: def __init__(self, queue_wrapper: QueueWrapper): self.queue_wrapper = queue_wrapper + def __repr__(self): + return f"{self.__class__.__name__}(queue_wrapper={self.queue_wrapper!r})" + def add_log_cmd(self, print_str: str): self.queue_wrapper.queue.appendleft(LogQueueEntry(print_str)) @@ -28,7 +38,7 @@ def add_pus_tc(self, pus_tc: PusTelecommand): self.queue_wrapper.queue.appendleft(PusTcEntry(pus_tc)) def add_ccsds_tc(self, space_packet: SpacePacket): - pass + self.queue_wrapper.queue.appendleft(SpacePacketEntry(space_packet)) def add_raw_tc(self, tc: bytes): self.queue_wrapper.queue.appendleft(RawTcEntry(tc)) diff --git a/src/tmtccmd/utility/countdown.py b/src/tmtccmd/utility/countdown.py index 6acf72df..dbad67ce 100644 --- a/src/tmtccmd/utility/countdown.py +++ b/src/tmtccmd/utility/countdown.py @@ -5,10 +5,10 @@ class Countdown: def __init__(self, init_timeout_secs: Optional[float]): if init_timeout_secs is not None: - self.timeout = init_timeout_secs + self._timeout = init_timeout_secs else: self._timeout = 0 - self._start_time = 0 + self._start_time = time.time() @property def timeout(self): From 06ef7fc86fd5a432fd466b0a58e35d0a72155832 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 23 Jun 2022 18:15:30 +0200 Subject: [PATCH 069/221] queue wrapper fixes, more tests --- src/tests/test_queue.py | 7 ++++++- src/tmtccmd/tc/definitions.py | 21 ++++++++++++--------- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/src/tests/test_queue.py b/src/tests/test_queue.py index 4befd6a3..2d7dc838 100644 --- a/src/tests/test_queue.py +++ b/src/tests/test_queue.py @@ -17,6 +17,7 @@ def test_queue(self): self.assertEqual(len(queue_wrapper.queue), 1) wait_entry = cast(WaitEntry, queue_wrapper.queue.pop()) self.assertTrue(wait_entry) + self.assertFalse(wait_entry.is_tc()) self.assertTrue( math.isclose(wait_entry.wait_time, eval(f"{wait_entry!r}").wait_time) ) @@ -31,6 +32,10 @@ def test_queue(self): self.assertEqual(len(queue_wrapper.queue), 4) pus_entry = queue_wrapper.queue.pop() + self.assertTrue(pus_entry.is_tc()) cast_wrapper = CastWrapper(pus_entry) pus_entry = cast_wrapper.to_pus_tc_entry() - print(pus_entry.pus_tc) + self.assertEqual(pus_entry.pus_tc, pus_cmd) + self.assertTrue(pus_entry) + with self.assertRaises(TypeError): + cast_wrapper.to_wait_entry() diff --git a/src/tmtccmd/tc/definitions.py b/src/tmtccmd/tc/definitions.py index 2f9f2e40..141ee8cd 100644 --- a/src/tmtccmd/tc/definitions.py +++ b/src/tmtccmd/tc/definitions.py @@ -12,7 +12,6 @@ class TcQueueEntryType(Enum): CUSTOM = "custom" LOG = "log" WAIT = "wait" - RAW_PRINT = "raw-print" SET_INTER_CMD_DELAY = "set-delay" @@ -96,27 +95,31 @@ def __cast_internally( obj: TcQueueEntryBase, expected_type: TcQueueEntryType, ) -> Any: - if self.base.etype != expected_type: + if obj.etype != expected_type: raise TypeError(f"Invalid object {obj} for type {self.base.etype}") return cast(obj_type, obj) - def to_print_entry(self) -> LogQueueEntry: - return self.__cast_internally(LogQueueEntry, self.base, self.base.etype) + def to_log_entry(self) -> LogQueueEntry: + return self.__cast_internally(LogQueueEntry, self.base, TcQueueEntryType.LOG) def to_pus_tc_entry(self) -> PusTcEntry: - return self.__cast_internally(PusTcEntry, self.base, self.base.etype) + return self.__cast_internally(PusTcEntry, self.base, TcQueueEntryType.PUS_TC) def to_raw_tc_entry(self) -> RawTcEntry: - return self.__cast_internally(RawTcEntry, self.base, self.base.etype) + return self.__cast_internally(RawTcEntry, self.base, TcQueueEntryType.RAW_TC) def to_wait_entry(self) -> WaitEntry: - return self.__cast_internally(WaitEntry, self.base, self.base.etype) + return self.__cast_internally(WaitEntry, self.base, TcQueueEntryType.WAIT) def to_timeout_entry(self) -> TimeoutEntry: - return self.__cast_internally(TimeoutEntry, self.base, self.base.etype) + return self.__cast_internally( + TimeoutEntry, self.base, TcQueueEntryType.SET_INTER_CMD_DELAY + ) def to_space_packet_entry(self) -> SpacePacketEntry: - return self.__cast_internally(SpacePacketEntry, self.base, self.base.etype) + return self.__cast_internally( + SpacePacketEntry, self.base, TcQueueEntryType.CCSDS_TC + ) class ProcedureInfo: From 10390733f4341e57cc9389a8afc112a904848aab Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 23 Jun 2022 19:50:05 +0200 Subject: [PATCH 070/221] continue unittests --- src/tests/test_queue.py | 34 +++++++++++++++++++++++++++++- src/tmtccmd/tc/ccsds_seq_sender.py | 2 +- src/tmtccmd/tc/definitions.py | 22 +++++++++++++------ src/tmtccmd/tc/queue.py | 4 ++++ 4 files changed, 53 insertions(+), 9 deletions(-) diff --git a/src/tests/test_queue.py b/src/tests/test_queue.py index 2d7dc838..2a7bcb66 100644 --- a/src/tests/test_queue.py +++ b/src/tests/test_queue.py @@ -5,6 +5,10 @@ from spacepackets.ecss import PusTelecommand from tmtccmd.tc.definitions import WaitEntry, CastWrapper + +# Required for eval calls +# noinspection PyUnresolvedReferences +from tmtccmd.tc.definitions import LogQueueEntry, RawTcEntry from tmtccmd.tc.queue import QueueWrapper, QueueHelper @@ -29,7 +33,9 @@ def test_queue(self): queue_helper.add_log_cmd("Test String") queue_helper.add_raw_tc(bytes([0, 1, 2])) queue_helper.add_ccsds_tc(pus_cmd.to_space_packet()) - self.assertEqual(len(queue_wrapper.queue), 4) + queue_helper.add_packet_delay(3.0) + print(queue_wrapper.queue) + self.assertEqual(len(queue_wrapper.queue), 5) pus_entry = queue_wrapper.queue.pop() self.assertTrue(pus_entry.is_tc()) @@ -39,3 +45,29 @@ def test_queue(self): self.assertTrue(pus_entry) with self.assertRaises(TypeError): cast_wrapper.to_wait_entry() + log_entry = queue_wrapper.queue.pop() + self.assertFalse(log_entry.is_tc()) + cast_wrapper.base = log_entry + log_entry = cast_wrapper.to_log_entry() + self.assertTrue(log_entry) + with self.assertRaises(TypeError): + cast_wrapper.to_raw_tc_entry() + self.assertEqual(log_entry.log_str, "Test String") + test_obj = eval(f"{log_entry!r}") + self.assertEqual(test_obj.log_str, log_entry.log_str) + + raw_entry = queue_wrapper.queue.pop() + self.assertTrue(raw_entry.is_tc()) + cast_wrapper.base = raw_entry + raw_entry = cast_wrapper.to_raw_tc_entry() + self.assertTrue(raw_entry) + self.assertEqual(raw_entry.tc, bytes([0, 1, 2])) + test_obj = eval(f"{raw_entry!r}") + self.assertEqual(raw_entry.tc, test_obj.tc) + + space_packet_entry = queue_wrapper.queue.pop() + self.assertTrue(space_packet_entry.is_tc()) + cast_wrapper.base = space_packet_entry + space_packet_entry = cast_wrapper.to_space_packet_entry() + self.assertTrue(space_packet_entry) + self.assertTrue(space_packet_entry.space_packet, pus_cmd.to_space_packet()) diff --git a/src/tmtccmd/tc/ccsds_seq_sender.py b/src/tmtccmd/tc/ccsds_seq_sender.py index 860b4757..b55111a5 100644 --- a/src/tmtccmd/tc/ccsds_seq_sender.py +++ b/src/tmtccmd/tc/ccsds_seq_sender.py @@ -127,7 +127,7 @@ def check_queue_entry(self, queue_entry: TcQueueEntryBase) -> bool: wait_entry = cast_wait_entry_from_base(queue_entry) LOGGER.info(f"Waiting for {wait_entry.wait_time} seconds.") self._wait_cd.reset(new_timeout=wait_entry.wait_time) - elif queue_entry.etype == TcQueueEntryType.SET_INTER_CMD_DELAY: + elif queue_entry.etype == TcQueueEntryType.PACKET_DELAY: timeout_entry = cast_timeout_entry_from_base(queue_entry) self._send_cd.reset(new_timeout=timeout_entry.timeout_secs) is_tc = False diff --git a/src/tmtccmd/tc/definitions.py b/src/tmtccmd/tc/definitions.py index 141ee8cd..11373911 100644 --- a/src/tmtccmd/tc/definitions.py +++ b/src/tmtccmd/tc/definitions.py @@ -12,17 +12,21 @@ class TcQueueEntryType(Enum): CUSTOM = "custom" LOG = "log" WAIT = "wait" - SET_INTER_CMD_DELAY = "set-delay" + PACKET_DELAY = "set-delay" class TcQueueEntryBase: + """Generic TC queue entry abstraction. This allows filling the TC queue with custom objects""" + def __init__(self, etype: TcQueueEntryType): self.etype = etype def is_tc(self) -> bool: + """Check whether concrete object is an actual telecommand""" if ( self.etype == TcQueueEntryType.PUS_TC or self.etype == TcQueueEntryType.RAW_TC + or self.etype == TcQueueEntryType.CCSDS_TC ): return True return False @@ -52,10 +56,10 @@ def __repr__(self): class LogQueueEntry(TcQueueEntryBase): def __init__(self, log_str: str): super().__init__(TcQueueEntryType.LOG) - self.print_str = log_str + self.log_str = log_str def __repr__(self): - return f"{self.__class__.__name__}({self.print_str!r})" + return f"{self.__class__.__name__}({self.log_str!r})" class RawTcEntry(TcQueueEntryBase): @@ -76,9 +80,9 @@ def __repr__(self): return f"{self.__class__.__name__}({self.wait_time!r})" -class TimeoutEntry(TcQueueEntryBase): +class PacketDelayEntry(TcQueueEntryBase): def __init__(self, timeout_secs: float): - super().__init__(TcQueueEntryType.SET_INTER_CMD_DELAY) + super().__init__(TcQueueEntryType.PACKET_DELAY) self.timeout_secs = timeout_secs def __repr__(self): @@ -111,9 +115,9 @@ def to_raw_tc_entry(self) -> RawTcEntry: def to_wait_entry(self) -> WaitEntry: return self.__cast_internally(WaitEntry, self.base, TcQueueEntryType.WAIT) - def to_timeout_entry(self) -> TimeoutEntry: + def to_packet_delay_entry(self) -> PacketDelayEntry: return self.__cast_internally( - TimeoutEntry, self.base, TcQueueEntryType.SET_INTER_CMD_DELAY + PacketDelayEntry, self.base, TcQueueEntryType.PACKET_DELAY ) def to_space_packet_entry(self) -> SpacePacketEntry: @@ -123,6 +127,10 @@ def to_space_packet_entry(self) -> SpacePacketEntry: class ProcedureInfo: + """Generic abstraction for procedures. A procedure can be a single command or a sequence + of commands. Generally, one procedure is mapped to a specific TC queue which is packed + during run-time""" + def __init__(self, service: str, op_code: str): self.service = service self.op_code = op_code diff --git a/src/tmtccmd/tc/queue.py b/src/tmtccmd/tc/queue.py index 6623c7b9..da6c0982 100644 --- a/src/tmtccmd/tc/queue.py +++ b/src/tmtccmd/tc/queue.py @@ -9,6 +9,7 @@ RawTcEntry, WaitEntry, SpacePacketEntry, + PacketDelayEntry, ) @@ -45,3 +46,6 @@ def add_raw_tc(self, tc: bytes): def add_wait(self, wait_secs: float): self.queue_wrapper.queue.appendleft(WaitEntry(wait_secs)) + + def add_packet_delay(self, delay: float): + self.queue_wrapper.queue.appendleft(PacketDelayEntry(delay)) From bbf330b62e4873ac28d6b3bec42ec3c9b4ae87b8 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 23 Jun 2022 19:53:02 +0200 Subject: [PATCH 071/221] fix unittest --- src/tmtccmd/tc/ccsds_seq_sender.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/tmtccmd/tc/ccsds_seq_sender.py b/src/tmtccmd/tc/ccsds_seq_sender.py index b55111a5..f16c3336 100644 --- a/src/tmtccmd/tc/ccsds_seq_sender.py +++ b/src/tmtccmd/tc/ccsds_seq_sender.py @@ -4,9 +4,7 @@ from tmtccmd.tc.definitions import ( TcQueueEntryBase, - TcQueueEntryType, - cast_wait_entry_from_base, - cast_timeout_entry_from_base, + TcQueueEntryType, CastWrapper ) from tmtccmd.tc.handler import TcHandlerBase from tmtccmd.tc.queue import QueueWrapper @@ -122,13 +120,13 @@ def check_queue_entry(self, queue_entry: TcQueueEntryBase) -> bool: if not isinstance(queue_entry, TcQueueEntryBase): LOGGER.warning("Invalid queue entry detected") raise ValueError("Invalid queue entry detected") - + cast_wrapper = CastWrapper(queue_entry) if queue_entry.etype == TcQueueEntryType.WAIT: - wait_entry = cast_wait_entry_from_base(queue_entry) + wait_entry = cast_wrapper.to_wait_entry() LOGGER.info(f"Waiting for {wait_entry.wait_time} seconds.") self._wait_cd.reset(new_timeout=wait_entry.wait_time) elif queue_entry.etype == TcQueueEntryType.PACKET_DELAY: - timeout_entry = cast_timeout_entry_from_base(queue_entry) + timeout_entry = cast_wrapper.to_packet_delay_entry() self._send_cd.reset(new_timeout=timeout_entry.timeout_secs) is_tc = False if ( From a27c9eb920d7308bb7f1daafa87056b0e49e78f7 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 23 Jun 2022 20:35:36 +0200 Subject: [PATCH 072/221] more tests --- src/tests/test_queue.py | 6 ++++ src/tests/test_seq_sender.py | 35 ++++++++++++++++++-- src/tmtccmd/tc/ccsds_seq_sender.py | 51 +++++++++++++++++------------- 3 files changed, 67 insertions(+), 25 deletions(-) diff --git a/src/tests/test_queue.py b/src/tests/test_queue.py index 2a7bcb66..9548507c 100644 --- a/src/tests/test_queue.py +++ b/src/tests/test_queue.py @@ -71,3 +71,9 @@ def test_queue(self): space_packet_entry = cast_wrapper.to_space_packet_entry() self.assertTrue(space_packet_entry) self.assertTrue(space_packet_entry.space_packet, pus_cmd.to_space_packet()) + + packet_delay = queue_wrapper.queue.pop() + self.assertFalse(packet_delay.is_tc()) + cast_wrapper.base = packet_delay + packet_delay = cast_wrapper.to_packet_delay_entry() + self.assertEqual(packet_delay.timeout_secs, 3.0) diff --git a/src/tests/test_seq_sender.py b/src/tests/test_seq_sender.py index 439745be..15054d3c 100644 --- a/src/tests/test_seq_sender.py +++ b/src/tests/test_seq_sender.py @@ -1,18 +1,47 @@ from collections import deque from unittest import TestCase -from unittest.mock import MagicMock +from unittest.mock import MagicMock, ANY, sentinel from tmtccmd.com_if.com_interface_base import CommunicationInterface -from tmtccmd.tc.ccsds_seq_sender import SequentialCcsdsSender +from tmtccmd.tc.ccsds_seq_sender import SequentialCcsdsSender, SenderMode +from tmtccmd.tc.definitions import RawTcEntry from tmtccmd.tc.handler import TcHandlerBase from tmtccmd.tc.queue import QueueWrapper, QueueHelper class TestSendReceive(TestCase): - def basic_test(self): + def test_basic(self): queue_wrapper = QueueWrapper(queue=deque()) queue_helper = QueueHelper(queue_wrapper) tc_handler_mock = MagicMock(spec=TcHandlerBase) com_if = MagicMock(spec=CommunicationInterface) seq_sender = SequentialCcsdsSender(queue_wrapper, com_if, tc_handler_mock) res = seq_sender.operation() + # Queue is empty initially + self.assertEqual(res.mode, SenderMode.DONE) + self.assertEqual(seq_sender.mode, SenderMode.DONE) + self.assertTrue(seq_sender.no_delay_remaining()) + queue_helper.add_raw_tc(bytes([0, 1, 2])) + # One queue entry which should be handled immediately + seq_sender.queue_wrapper = queue_wrapper + self.assertEqual(seq_sender.mode, SenderMode.BUSY) + # Is busy now, so does not accept new queue unless forced + with self.assertRaises(ValueError): + seq_sender.queue_wrapper = queue_wrapper + seq_sender.operation() + tc_handler_mock.send_cb.assert_called_with(ANY, com_if) + call_args = tc_handler_mock.send_cb.call_args + self.assertEqual(call_args.args[0].tc, bytes([0, 1, 2])) + # Queue should be empty now + self.assertFalse(queue_wrapper.queue) + self.assertEqual(seq_sender.mode, SenderMode.DONE) + queue_helper.add_raw_tc(bytes([3, 2, 1])) + seq_sender.resume() + self.assertEqual(seq_sender.mode, SenderMode.BUSY) + queue_helper.add_wait(0.1) + queue_helper.add_raw_tc(bytes([1, 2, 3])) + res = seq_sender.operation() + self.assertEqual(res.mode, SenderMode.BUSY) + tc_handler_mock.send_cb.assert_called_with(ANY, com_if) + call_args = tc_handler_mock.send_cb.call_args + self.assertEqual(call_args.args[0].tc, bytes([3, 2, 1])) diff --git a/src/tmtccmd/tc/ccsds_seq_sender.py b/src/tmtccmd/tc/ccsds_seq_sender.py index f16c3336..e651eff9 100644 --- a/src/tmtccmd/tc/ccsds_seq_sender.py +++ b/src/tmtccmd/tc/ccsds_seq_sender.py @@ -2,10 +2,7 @@ import enum from typing import Optional -from tmtccmd.tc.definitions import ( - TcQueueEntryBase, - TcQueueEntryType, CastWrapper -) +from tmtccmd.tc.definitions import TcQueueEntryBase, TcQueueEntryType, CastWrapper from tmtccmd.tc.handler import TcHandlerBase from tmtccmd.tc.queue import QueueWrapper from tmtccmd.com_if.com_interface_base import CommunicationInterface @@ -16,9 +13,8 @@ class SenderMode(enum.IntEnum): - IDLE = 0 - BUSY = 1 - DONE = 2 + BUSY = 0 + DONE = 1 class SeqResultWrapper: @@ -43,9 +39,7 @@ def __init__( self._com_if = com_if self._tc_handler = tc_handler self._queue_wrapper = queue_wrapper - # This flag can be used to notify the sender to send the next TC - self._next_send_condition = True - self._mode = SenderMode.IDLE + self._mode = SenderMode.DONE self._wait_cd = Countdown(0) self._send_cd = Countdown(queue_wrapper.inter_cmd_delay) self._current_res = SeqResultWrapper(self._mode) @@ -62,25 +56,25 @@ def queue_wrapper(self, queue_wrapper: QueueWrapper): if self._mode == SenderMode.BUSY: raise ValueError("Busy with other queue") self._mode = SenderMode.BUSY - # Set to true for first packet, otherwise nothing will be sent. - self._next_send_condition = True self._queue_wrapper = queue_wrapper def handle_new_queue_forced(self, queue_wrapper: QueueWrapper): - self._mode = SenderMode.IDLE + self._mode = SenderMode.DONE self.queue_wrapper = queue_wrapper - def pause(self): - self._mode = SenderMode.IDLE - def resume(self): - if self._mode == SenderMode.IDLE: + """Can be used to resume a finished sequential sender it the provided queue is + not empty anymore""" + if self._mode == SenderMode.DONE and self.queue_wrapper.queue: self._mode = SenderMode.BUSY def operation(self) -> SeqResultWrapper: - if self._mode == SenderMode.IDLE or self._mode == SenderMode.DONE: - return SeqResultWrapper(self._mode) self._handle_current_tc_queue() + return SeqResultWrapper(self._mode) + + @property + def mode(self): + return self._mode def _handle_current_tc_queue(self): """Primary function which is called for sequential transfer. @@ -88,18 +82,18 @@ def _handle_current_tc_queue(self): """ # Do not use continue anywhere in this while loop for now if not self.queue_wrapper.queue: - if self._wait_cd.timed_out() and self._send_cd.timed_out(): + if self.no_delay_remaining(): # cache this for last wait time self._mode = SenderMode.DONE return else: - if not self._send_cd.busy() and not self._wait_cd.busy(): + if self.no_delay_remaining(): self._send_next_telecommand() self.__print_rem_timeout(op_divider=self._op_divider) self._op_divider += 1 def __print_rem_timeout(self, op_divider: int, divisor: int = 15): - if self._wait_cd.busy() and op_divider % divisor == 0: + if not self.__wait_cd_timed_out() and op_divider % divisor == 0: rem_time = self._wait_cd.rem_time() if self._wait_cd.rem_time() > 0: LOGGER.info(f"{rem_time:.01f} seconds wait time remaining") @@ -110,6 +104,19 @@ def _send_next_telecommand(self): if self.check_queue_entry(next_queue_entry): self._send_cd.reset() self._tc_handler.send_cb(next_queue_entry, self._com_if) + if not self.queue_wrapper.queue and self.no_delay_remaining(): + self._mode = SenderMode.DONE + + def no_delay_remaining(self) -> bool: + return self.__send_cd_timed_out() and self.__wait_cd_timed_out() + + def __send_cd_timed_out(self): + """Internal wrapper API to allow easier testing""" + return self._send_cd.timed_out() + + def __wait_cd_timed_out(self): + """Internal wrapper API to allow easier testing""" + return self._wait_cd.timed_out() def check_queue_entry(self, queue_entry: TcQueueEntryBase) -> bool: """ From ea83a8c1e2fe1f9a1bedcc5f3de995f7926095f6 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 24 Jun 2022 10:29:30 +0200 Subject: [PATCH 073/221] refactored pus loggers --- src/tests/test_printer.py | 4 +- src/tmtccmd/logging/pus.py | 235 +++++++++++++++++++++---------------- 2 files changed, 136 insertions(+), 103 deletions(-) diff --git a/src/tests/test_printer.py b/src/tests/test_printer.py index a1b9a160..563f5846 100644 --- a/src/tests/test_printer.py +++ b/src/tests/test_printer.py @@ -12,7 +12,7 @@ from tmtccmd.logging.pus import ( log_raw_pus_tc, log_raw_pus_tm, - get_current_raw_file_name, + get_file_name_with_date_suffix, create_tmtc_logger, ) @@ -27,7 +27,7 @@ def setUp(self): def test_pus_loggers(self): pus_tc = pack_service_17_ping_command(ssc=0) - file_name = get_current_raw_file_name() + file_name = get_file_name_with_date_suffix() log_raw_pus_tc(pus_tc.pack()) pus_tm = Service1TMExtended( subservice=1, time=CdsShortTimestamp.init_from_current_time() diff --git a/src/tmtccmd/logging/pus.py b/src/tmtccmd/logging/pus.py index b48e701d..d8b46ab0 100644 --- a/src/tmtccmd/logging/pus.py +++ b/src/tmtccmd/logging/pus.py @@ -1,121 +1,154 @@ +from __future__ import annotations +import enum import logging -import os -from typing import Optional, Tuple +from typing import Optional from datetime import datetime + +from spacepackets.ecss import PusTelecommand, PusTelemetry from tmtccmd.logging import LOG_DIR -from spacepackets.ccsds.spacepacket import PacketTypes -from logging.handlers import RotatingFileHandler +from logging.handlers import RotatingFileHandler, TimedRotatingFileHandler from logging import FileHandler -RAW_PUS_FILE_BASE_NAME = "pus-log" RAW_PUS_LOGGER_NAME = "pus-log" +RAW_PUS_FILE_BASE_NAME = RAW_PUS_LOGGER_NAME -TMTC_FILE_BASE_NAME = "tmtc-log" TMTC_LOGGER_NAME = "tmtc-log" +TMTC_FILE_BASE_NAME = TMTC_LOGGER_NAME __TMTC_LOGGER: Optional[logging.Logger] = None __RAW_PUS_LOGGER: Optional[logging.Logger] = None -def create_raw_pus_file_logger(max_bytes: int = 8192 * 16) -> logging.Logger: - """Create a logger to log raw PUS messages by returning a rotating file handler which has - the current date in its log file name. This function is not thread-safe. - :return: - """ - global __RAW_PUS_LOGGER - file_name = get_current_raw_file_name() - if __RAW_PUS_LOGGER is None: - __RAW_PUS_LOGGER = logging.getLogger(RAW_PUS_LOGGER_NAME) - handler = RotatingFileHandler( - filename=file_name, maxBytes=max_bytes, backupCount=10 +def date_suffix() -> str: + return f"{datetime.now().date()}" + + +class TimedLogWhen(enum.Enum): + PER_HOUR = "H" + PER_MINUTE = "M" + PER_SECOND = "S" + PER_DAY = "D" + + +class RawTmtcLogBase: + def __init__(self, logger: logging.Logger): + self.logger = logger + + def log_tc(self, packet: PusTelecommand): + """Default log function which logs the Python packet representation and raw bytes""" + self.log_pus_tc_repr(packet) + self.log_raw_pus_tc_bytes(packet) + + def log_tm(self, packet: PusTelemetry): + """Default log function which logs the Python packet representation and raw bytes""" + self.log_pus_tm_repr(packet) + self.log_raw_pus_tm_bytes(packet) + + def log_pus_tc_repr(self, packet: PusTelecommand): + self.logger.info(f"repr: {packet!r}") + + def log_pus_tm_repr(self, packet: PusTelemetry): + self.logger.info(f"repr: {packet!r}") + + @staticmethod + def tc_prefix(packet: PusTelecommand): + return f"TC[{packet.service}, {packet.subservice}]" + + @staticmethod + def tm_prefix(packet: PusTelemetry): + return f"TM[{packet.service}, {packet.subservice}]" + + def log_raw_pus_tc_bytes(self, packet: PusTelecommand): + self.log_pus_bytes(self.tc_prefix(packet), packet.pack()) + + def log_raw_pus_tm_bytes(self, packet: PusTelemetry): + self.log_pus_bytes(self.tm_prefix(packet), packet.pack()) + + def log_pus_bytes(self, prefix: str, packet: bytes): + self.logger.info(f"{prefix} hex: [{packet.hex(sep=',')}]") + + +class RawTmtcTimedLogWrapper(RawTmtcLogBase): + def __init__( + self, when: TimedLogWhen, interval: int, file_name: str = RAW_PUS_FILE_BASE_NAME + ): + """Create a raw TMTC timed rotating log wrapper. + See the official Python documentation at + https://docs.python.org/3/library/logging.handlers.html#timedrotatingfilehandler for + more information on the input parameters + + :param when: A new log file will be created at the product of when and interval + :param interval: A new log file will be created at the product of when and interval. + For example, using when="H" and interval=3, a new log file will be created in three + hour intervals + :param file_name: Base filename of the log file + """ + logger = logging.getLogger(file_name) + formatter = logging.Formatter( + fmt="%(asctime)s.%(msecs)03d: %(message)s", datefmt="%Y-%m-%d %H:%M:%S" + ) + handler = TimedRotatingFileHandler( + filename=file_name, when=when.value, interval=interval ) + handler.setFormatter(formatter) + self.logger.addHandler(handler) + self.logger.setLevel(logging.INFO) + super().__init__(logger) + + +class RawTmtcRotatingLogWrapper(RawTmtcLogBase): + def __init__( + self, + max_bytes: int, + backup_count: int, + file_name: str = f"{LOG_DIR}/RAW_PUS_FILE_BASE_NAME", + suffix: str = date_suffix(), + ): + """Create a raw TMTC rotating log wrapper. + See the official Python documentation at + https://docs.python.org/3/library/logging.handlers.html#rotatingfilehandler for + more information on the input parameters + + :param max_bytes: Maximum number of bytes per file. If backup_count is non-zero, the handler + will create a new file up to the number of back_up count files. If the maximum backup + count is reached, the oldest files will be deleted + :param backup_count: If this is zero, Only max_bytes can be stored. Otherwise, a rollover + will occur when a file reaches max_bytes and up to back_count files can be created + this way. + :param file_name: Base filename of the log file + :param suffix: Suffix of the log file. Can be used to change the used log file. The default + argument will use a date suffix, which will lead to a new unique rotating log created + every day + """ + logger = logging.getLogger(f"{file_name}_{suffix}.log") formatter = logging.Formatter( fmt="%(asctime)s.%(msecs)03d: %(message)s", datefmt="%Y-%m-%d %H:%M:%S" ) - handler.setFormatter(fmt=formatter) - __RAW_PUS_LOGGER.addHandler(handler) - __RAW_PUS_LOGGER.setLevel(logging.INFO) - __RAW_PUS_LOGGER.info( - f"tmtccmd started at {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}" - ) - return __RAW_PUS_LOGGER - - -def get_current_raw_file_name() -> str: - return f"{LOG_DIR}/{RAW_PUS_FILE_BASE_NAME}_{datetime.now().date()}.log" - - -def get_current_tmtc_file_name() -> str: - return ( - f"{LOG_DIR}/{TMTC_FILE_BASE_NAME}_{datetime.now().date()}_" - f"{datetime.now().time().strftime('%H%M%S')}.log" - ) - - -def log_raw_pus_tc(packet: bytes, srv_subservice: Optional[Tuple[int, int]] = None): - global __RAW_PUS_LOGGER - if __RAW_PUS_LOGGER is None: - __RAW_PUS_LOGGER = create_raw_pus_file_logger() - type_str = "TC" - if srv_subservice is not None: - type_str += f" [{srv_subservice[0], srv_subservice[1]}" - - logged_msg = f"{type_str} | hex [{packet.hex(sep=',')}]" - __RAW_PUS_LOGGER.info(logged_msg) - - -def log_raw_pus_tm(packet: bytes, srv_subservice: Optional[Tuple[int, int]] = None): - global __RAW_PUS_LOGGER - if __RAW_PUS_LOGGER is None: - __RAW_PUS_LOGGER = create_raw_pus_file_logger() - type_str = "TM" - if srv_subservice is not None: - type_str += f" [{srv_subservice[0], srv_subservice[1]}" - - logged_msg = f"{type_str} | hex [{packet.hex(sep=',')}]" - __RAW_PUS_LOGGER.info(logged_msg) - - -def log_raw_unknown_packet(packet: bytes, packet_type: PacketTypes): - global __RAW_PUS_LOGGER - if __RAW_PUS_LOGGER is None: - __RAW_PUS_LOGGER = create_raw_pus_file_logger() - if packet_type == PacketTypes.TC: - type_str = "Unknown TC Packet" - else: - type_str = "Unknown TM Packet" - logged_msg = f"{type_str} | hex [{packet.hex(sep=',')}]" - __RAW_PUS_LOGGER.info(logged_msg) - - -def create_tmtc_logger(): - """Create a generic TMTC logger which logs both to a unique file for a TMTC session. - This functions is not thread-safe. - :return: - """ - global __TMTC_LOGGER - if not os.path.exists(LOG_DIR): - os.mkdir(LOG_DIR) - # This should create a unique event log file for most cases. If for some reason this is called - # with the same name, the events will appended to an old file which was created in the same - # second. This is okay. - file_name = get_current_tmtc_file_name() - if __TMTC_LOGGER is None: - __TMTC_LOGGER = logging.getLogger(TMTC_LOGGER_NAME) + handler = RotatingFileHandler( + filename=file_name, maxBytes=max_bytes, backupCount=backup_count + ) + handler.setFormatter(formatter) + self.logger.addHandler(handler) + self.logger.setLevel(logging.INFO) + super().__init__(logger) + + +class RegularTmtcLogWrapper: + def __init__(self, file_name: Optional[str] = None): + if file_name is None: + self.file_name = self.get_current_tmtc_file_name() + else: + self.file_name = file_name + self.logger = logging.getLogger(self.file_name) file_handler = FileHandler(filename=file_name) formatter = logging.Formatter() file_handler.setFormatter(fmt=formatter) - __TMTC_LOGGER.addHandler(file_handler) - __TMTC_LOGGER.setLevel(logging.INFO) - return __TMTC_LOGGER - - -def get_tmtc_file_logger() -> logging.Logger: - """Returns a generic TMTC logger which logs both to a unique file for a TMTC session. - This functions is not thread-safe. - :return: - """ - global __TMTC_LOGGER - if __TMTC_LOGGER is None: - __TMTC_LOGGER = create_tmtc_logger() - return __TMTC_LOGGER + self.logger.addHandler(file_handler) + self.logger.setLevel(logging.INFO) + + @classmethod + def get_current_tmtc_file_name(cls) -> str: + return ( + f"{LOG_DIR}/{TMTC_FILE_BASE_NAME}_{datetime.now().date()}_" + f"{datetime.now().time().strftime('%H%M%S')}.log" + ) From 3f26ad37957730cc173674ba9f19acce1a4377ff Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 24 Jun 2022 11:55:13 +0200 Subject: [PATCH 074/221] simplified package structure --- .gitignore | 4 +- docs/conf.py | 2 +- setup.cfg | 5 +- src/tests/test_printer.py | 51 ----------- {src/tests => tests}/__init__.py | 0 {src/tests => tests}/backend_mock.py | 4 +- {src/tests => tests}/hook_obj_mock.py | 0 {src/tests => tests}/tc_handler_mock.py | 0 {src/tests => tests}/test_cd.py | 0 {src/tests => tests}/test_cfdp_filestore.py | 0 {src/tests => tests}/test_global_manager.py | 0 tests/test_printer.py | 57 +++++++++++++ {src/tests => tests}/test_pus.py | 0 {src/tests => tests}/test_queue.py | 0 {src/tests => tests}/test_runner.py | 4 +- {src/tests => tests}/test_seq_sender.py | 0 {src/tmtccmd => tmtccmd}/__init__.py | 0 {src/tmtccmd => tmtccmd}/ccsds/__init__.py | 0 {src/tmtccmd => tmtccmd}/ccsds/handler.py | 0 {src/tmtccmd => tmtccmd}/cfdp/__init__.py | 0 {src/tmtccmd => tmtccmd}/cfdp/filestore.py | 0 {src/tmtccmd => tmtccmd}/cfdp/handler.py | 0 {src/tmtccmd => tmtccmd}/cfdp/mib.py | 0 {src/tmtccmd => tmtccmd}/com_if/__init__.py | 0 .../com_if/com_if_utilities.py | 0 .../com_if/com_interface_base.py | 0 .../com_if/dummy_com_if.py | 0 .../tmtccmd => tmtccmd}/com_if/qemu_com_if.py | 0 .../com_if/serial_com_if.py | 0 .../com_if/serial_utilities.py | 0 .../com_if/tcpip_tcp_com_if.py | 0 .../com_if/tcpip_udp_com_if.py | 0 .../com_if/tcpip_utilities.py | 0 {src/tmtccmd => tmtccmd}/config/__init__.py | 0 {src/tmtccmd => tmtccmd}/config/args.py | 0 {src/tmtccmd => tmtccmd}/config/cfdp.py | 0 {src/tmtccmd => tmtccmd}/config/cfg_hook.py | 0 {src/tmtccmd => tmtccmd}/config/com_if.py | 0 .../tmtccmd => tmtccmd}/config/definitions.py | 0 {src/tmtccmd => tmtccmd}/config/globals.py | 0 {src/tmtccmd => tmtccmd}/config/logo.png | Bin {src/tmtccmd => tmtccmd}/config/objects.py | 0 {src/tmtccmd => tmtccmd}/config/prompt.py | 0 {src/tmtccmd => tmtccmd}/config/tmtc_defs.py | 0 {src/tmtccmd => tmtccmd}/core/__init__.py | 0 {src/tmtccmd => tmtccmd}/core/backend.py | 0 .../tmtccmd => tmtccmd}/core/ccsds_backend.py | 0 {src/tmtccmd => tmtccmd}/core/frontend.py | 0 .../tmtccmd => tmtccmd}/core/frontend_base.py | 0 .../core/globals_manager.py | 0 {src/tmtccmd => tmtccmd}/core/modes.py | 0 {src/tmtccmd => tmtccmd}/fsfw/__init__.py | 0 {src/tmtccmd => tmtccmd}/logging/__init__.py | 0 {src/tmtccmd => tmtccmd}/logging/pus.py | 80 ++++++++++-------- {src/tmtccmd => tmtccmd}/pus/__init__.py | 0 {src/tmtccmd => tmtccmd}/pus/definitions.py | 0 .../pus/pus_11_tc_sched.py | 0 {src/tmtccmd => tmtccmd}/pus/pus_17_test.py | 0 .../pus/pus_200_fsfw_mode.py | 0 .../pus/pus_201_fsfw_health.py | 0 {src/tmtccmd => tmtccmd}/pus/pus_20_params.py | 0 {src/tmtccmd => tmtccmd}/pus/pus_5_event.py | 0 {src/tmtccmd => tmtccmd}/pus/pus_8_funccmd.py | 0 {src/tmtccmd => tmtccmd}/runner.py | 0 {src/tmtccmd => tmtccmd}/tc/__init__.py | 0 .../tc/ccsds_seq_sender.py | 0 {src/tmtccmd => tmtccmd}/tc/definitions.py | 0 {src/tmtccmd => tmtccmd}/tc/handler.py | 0 .../tmtccmd => tmtccmd}/tc/pus_11_tc_sched.py | 0 .../tc/pus_200_fsfw_modes.py | 0 .../tc/pus_201_fsfw_health.py | 0 {src/tmtccmd => tmtccmd}/tc/pus_20_params.py | 0 {src/tmtccmd => tmtccmd}/tc/pus_3_fsfw_hk.py | 0 {src/tmtccmd => tmtccmd}/tc/pus_5_event.py | 0 {src/tmtccmd => tmtccmd}/tc/pus_8_funccmd.py | 0 {src/tmtccmd => tmtccmd}/tc/queue.py | 0 {src/tmtccmd => tmtccmd}/tm/__init__.py | 0 {src/tmtccmd => tmtccmd}/tm/base.py | 0 .../tm/ccsds_tm_listener.py | 0 {src/tmtccmd => tmtccmd}/tm/definitions.py | 0 {src/tmtccmd => tmtccmd}/tm/handler.py | 0 {src/tmtccmd => tmtccmd}/tm/pus_17_test.py | 0 .../tm/pus_1_verification.py | 0 .../tm/pus_200_fsfw_modes.py | 0 .../tm/pus_20_fsfw_parameters.py | 0 .../tmtccmd => tmtccmd}/tm/pus_23_filemgmt.py | 0 {src/tmtccmd => tmtccmd}/tm/pus_2_rawcmd.py | 0 {src/tmtccmd => tmtccmd}/tm/pus_3_fsfw_hk.py | 0 {src/tmtccmd => tmtccmd}/tm/pus_3_hk_base.py | 0 {src/tmtccmd => tmtccmd}/tm/pus_5_event.py | 0 {src/tmtccmd => tmtccmd}/tm/pus_8_funccmd.py | 0 {src/tmtccmd => tmtccmd}/utility/__init__.py | 0 {src/tmtccmd => tmtccmd}/utility/conf_util.py | 0 {src/tmtccmd => tmtccmd}/utility/countdown.py | 0 .../utility/exit_handler.py | 0 .../utility/hammingcode.py | 0 .../utility/json_handler.py | 0 {src/tmtccmd => tmtccmd}/utility/obj_id.py | 0 {src/tmtccmd => tmtccmd}/utility/retval.py | 0 .../utility/tmtc_printer.py | 0 100 files changed, 112 insertions(+), 95 deletions(-) delete mode 100644 src/tests/test_printer.py rename {src/tests => tests}/__init__.py (100%) rename {src/tests => tests}/backend_mock.py (94%) rename {src/tests => tests}/hook_obj_mock.py (100%) rename {src/tests => tests}/tc_handler_mock.py (100%) rename {src/tests => tests}/test_cd.py (100%) rename {src/tests => tests}/test_cfdp_filestore.py (100%) rename {src/tests => tests}/test_global_manager.py (100%) create mode 100644 tests/test_printer.py rename {src/tests => tests}/test_pus.py (100%) rename {src/tests => tests}/test_queue.py (100%) rename {src/tests => tests}/test_runner.py (92%) rename {src/tests => tests}/test_seq_sender.py (100%) rename {src/tmtccmd => tmtccmd}/__init__.py (100%) rename {src/tmtccmd => tmtccmd}/ccsds/__init__.py (100%) rename {src/tmtccmd => tmtccmd}/ccsds/handler.py (100%) rename {src/tmtccmd => tmtccmd}/cfdp/__init__.py (100%) rename {src/tmtccmd => tmtccmd}/cfdp/filestore.py (100%) rename {src/tmtccmd => tmtccmd}/cfdp/handler.py (100%) rename {src/tmtccmd => tmtccmd}/cfdp/mib.py (100%) rename {src/tmtccmd => tmtccmd}/com_if/__init__.py (100%) rename {src/tmtccmd => tmtccmd}/com_if/com_if_utilities.py (100%) rename {src/tmtccmd => tmtccmd}/com_if/com_interface_base.py (100%) rename {src/tmtccmd => tmtccmd}/com_if/dummy_com_if.py (100%) rename {src/tmtccmd => tmtccmd}/com_if/qemu_com_if.py (100%) rename {src/tmtccmd => tmtccmd}/com_if/serial_com_if.py (100%) rename {src/tmtccmd => tmtccmd}/com_if/serial_utilities.py (100%) rename {src/tmtccmd => tmtccmd}/com_if/tcpip_tcp_com_if.py (100%) rename {src/tmtccmd => tmtccmd}/com_if/tcpip_udp_com_if.py (100%) rename {src/tmtccmd => tmtccmd}/com_if/tcpip_utilities.py (100%) rename {src/tmtccmd => tmtccmd}/config/__init__.py (100%) rename {src/tmtccmd => tmtccmd}/config/args.py (100%) rename {src/tmtccmd => tmtccmd}/config/cfdp.py (100%) rename {src/tmtccmd => tmtccmd}/config/cfg_hook.py (100%) rename {src/tmtccmd => tmtccmd}/config/com_if.py (100%) rename {src/tmtccmd => tmtccmd}/config/definitions.py (100%) rename {src/tmtccmd => tmtccmd}/config/globals.py (100%) rename {src/tmtccmd => tmtccmd}/config/logo.png (100%) rename {src/tmtccmd => tmtccmd}/config/objects.py (100%) rename {src/tmtccmd => tmtccmd}/config/prompt.py (100%) rename {src/tmtccmd => tmtccmd}/config/tmtc_defs.py (100%) rename {src/tmtccmd => tmtccmd}/core/__init__.py (100%) rename {src/tmtccmd => tmtccmd}/core/backend.py (100%) rename {src/tmtccmd => tmtccmd}/core/ccsds_backend.py (100%) rename {src/tmtccmd => tmtccmd}/core/frontend.py (100%) rename {src/tmtccmd => tmtccmd}/core/frontend_base.py (100%) rename {src/tmtccmd => tmtccmd}/core/globals_manager.py (100%) rename {src/tmtccmd => tmtccmd}/core/modes.py (100%) rename {src/tmtccmd => tmtccmd}/fsfw/__init__.py (100%) rename {src/tmtccmd => tmtccmd}/logging/__init__.py (100%) rename {src/tmtccmd => tmtccmd}/logging/pus.py (64%) rename {src/tmtccmd => tmtccmd}/pus/__init__.py (100%) rename {src/tmtccmd => tmtccmd}/pus/definitions.py (100%) rename {src/tmtccmd => tmtccmd}/pus/pus_11_tc_sched.py (100%) rename {src/tmtccmd => tmtccmd}/pus/pus_17_test.py (100%) rename {src/tmtccmd => tmtccmd}/pus/pus_200_fsfw_mode.py (100%) rename {src/tmtccmd => tmtccmd}/pus/pus_201_fsfw_health.py (100%) rename {src/tmtccmd => tmtccmd}/pus/pus_20_params.py (100%) rename {src/tmtccmd => tmtccmd}/pus/pus_5_event.py (100%) rename {src/tmtccmd => tmtccmd}/pus/pus_8_funccmd.py (100%) rename {src/tmtccmd => tmtccmd}/runner.py (100%) rename {src/tmtccmd => tmtccmd}/tc/__init__.py (100%) rename {src/tmtccmd => tmtccmd}/tc/ccsds_seq_sender.py (100%) rename {src/tmtccmd => tmtccmd}/tc/definitions.py (100%) rename {src/tmtccmd => tmtccmd}/tc/handler.py (100%) rename {src/tmtccmd => tmtccmd}/tc/pus_11_tc_sched.py (100%) rename {src/tmtccmd => tmtccmd}/tc/pus_200_fsfw_modes.py (100%) rename {src/tmtccmd => tmtccmd}/tc/pus_201_fsfw_health.py (100%) rename {src/tmtccmd => tmtccmd}/tc/pus_20_params.py (100%) rename {src/tmtccmd => tmtccmd}/tc/pus_3_fsfw_hk.py (100%) rename {src/tmtccmd => tmtccmd}/tc/pus_5_event.py (100%) rename {src/tmtccmd => tmtccmd}/tc/pus_8_funccmd.py (100%) rename {src/tmtccmd => tmtccmd}/tc/queue.py (100%) rename {src/tmtccmd => tmtccmd}/tm/__init__.py (100%) rename {src/tmtccmd => tmtccmd}/tm/base.py (100%) rename {src/tmtccmd => tmtccmd}/tm/ccsds_tm_listener.py (100%) rename {src/tmtccmd => tmtccmd}/tm/definitions.py (100%) rename {src/tmtccmd => tmtccmd}/tm/handler.py (100%) rename {src/tmtccmd => tmtccmd}/tm/pus_17_test.py (100%) rename {src/tmtccmd => tmtccmd}/tm/pus_1_verification.py (100%) rename {src/tmtccmd => tmtccmd}/tm/pus_200_fsfw_modes.py (100%) rename {src/tmtccmd => tmtccmd}/tm/pus_20_fsfw_parameters.py (100%) rename {src/tmtccmd => tmtccmd}/tm/pus_23_filemgmt.py (100%) rename {src/tmtccmd => tmtccmd}/tm/pus_2_rawcmd.py (100%) rename {src/tmtccmd => tmtccmd}/tm/pus_3_fsfw_hk.py (100%) rename {src/tmtccmd => tmtccmd}/tm/pus_3_hk_base.py (100%) rename {src/tmtccmd => tmtccmd}/tm/pus_5_event.py (100%) rename {src/tmtccmd => tmtccmd}/tm/pus_8_funccmd.py (100%) rename {src/tmtccmd => tmtccmd}/utility/__init__.py (100%) rename {src/tmtccmd => tmtccmd}/utility/conf_util.py (100%) rename {src/tmtccmd => tmtccmd}/utility/countdown.py (100%) rename {src/tmtccmd => tmtccmd}/utility/exit_handler.py (100%) rename {src/tmtccmd => tmtccmd}/utility/hammingcode.py (100%) rename {src/tmtccmd => tmtccmd}/utility/json_handler.py (100%) rename {src/tmtccmd => tmtccmd}/utility/obj_id.py (100%) rename {src/tmtccmd => tmtccmd}/utility/retval.py (100%) rename {src/tmtccmd => tmtccmd}/utility/tmtc_printer.py (100%) diff --git a/.gitignore b/.gitignore index faf6c81e..ceb57916 100644 --- a/.gitignore +++ b/.gitignore @@ -12,8 +12,8 @@ build *.egg-info /examples/log -/src/log -/src/tests/log +/tmtccmd/log +/tmtccmd/tests/log .idea venv diff --git a/docs/conf.py b/docs/conf.py index 1a90a41f..8765ce3c 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -13,7 +13,7 @@ import os import sys -sys.path.insert(0, os.path.abspath("../src")) +sys.path.insert(0, os.path.abspath("../tmtccmd")) import tmtccmd # -- Project information ----------------------------------------------------- diff --git a/setup.cfg b/setup.cfg index 9181d951..f1d9be3a 100644 --- a/setup.cfg +++ b/setup.cfg @@ -35,13 +35,10 @@ install_requires = spacepackets>=0.10 prompt-toolkit>=3.0.28 package_dir = - = src + = . packages = find: python_requires = >=3.8 -[options.packages.find] -where = src - [options.extras_require] gui = PyQt5>=5.15.6 diff --git a/src/tests/test_printer.py b/src/tests/test_printer.py deleted file mode 100644 index 563f5846..00000000 --- a/src/tests/test_printer.py +++ /dev/null @@ -1,51 +0,0 @@ -import shutil -import os -from unittest import TestCase - -from spacepackets.ccsds.time import CdsShortTimestamp - -from tmtccmd.tm.pus_1_verification import Service1TMExtended -from tmtccmd.pus.pus_17_test import pack_service_17_ping_command -from tmtccmd.utility.tmtc_printer import FsfwTmTcPrinter -from tmtccmd.logging import get_console_logger, LOG_DIR -from tmtccmd.config.globals import update_global, CoreGlobalIds -from tmtccmd.logging.pus import ( - log_raw_pus_tc, - log_raw_pus_tm, - get_file_name_with_date_suffix, - create_tmtc_logger, -) - - -class TestPrintersLoggers(TestCase): - def setUp(self): - if os.path.exists(LOG_DIR): - shutil.rmtree(LOG_DIR) - os.mkdir(LOG_DIR) - self.tmtc_printer = FsfwTmTcPrinter(file_logger=create_tmtc_logger()) - self.logger = get_console_logger() - - def test_pus_loggers(self): - pus_tc = pack_service_17_ping_command(ssc=0) - file_name = get_file_name_with_date_suffix() - log_raw_pus_tc(pus_tc.pack()) - pus_tm = Service1TMExtended( - subservice=1, time=CdsShortTimestamp.init_from_current_time() - ) - log_raw_pus_tm(pus_tm.pack()) - log_raw_pus_tc( - pus_tc.pack(), srv_subservice=(pus_tc.service, pus_tc.subservice) - ) - log_raw_pus_tm( - pus_tm.pack(), srv_subservice=(pus_tm.service, pus_tm.subservice) - ) - self.assertTrue(os.path.exists(file_name)) - - def test_print_functions(self): - pass - - def tearDown(self) -> None: - """Reset the hook object""" - update_global(CoreGlobalIds.TMTC_HOOK, None) - if os.path.exists(LOG_DIR): - shutil.rmtree(LOG_DIR) diff --git a/src/tests/__init__.py b/tests/__init__.py similarity index 100% rename from src/tests/__init__.py rename to tests/__init__.py diff --git a/src/tests/backend_mock.py b/tests/backend_mock.py similarity index 94% rename from src/tests/backend_mock.py rename to tests/backend_mock.py index 92f4cc6e..195b8145 100644 --- a/src/tests/backend_mock.py +++ b/tests/backend_mock.py @@ -1,7 +1,7 @@ from unittest.mock import MagicMock -from tests.hook_obj_mock import TestHookObj -from tests.tc_handler_mock import TcHandler +from .hook_obj_mock import TestHookObj +from .tc_handler_mock import TcHandler from tmtccmd.core.ccsds_backend import CcsdsTmtcBackend from tmtccmd.ccsds.handler import CcsdsTmHandler diff --git a/src/tests/hook_obj_mock.py b/tests/hook_obj_mock.py similarity index 100% rename from src/tests/hook_obj_mock.py rename to tests/hook_obj_mock.py diff --git a/src/tests/tc_handler_mock.py b/tests/tc_handler_mock.py similarity index 100% rename from src/tests/tc_handler_mock.py rename to tests/tc_handler_mock.py diff --git a/src/tests/test_cd.py b/tests/test_cd.py similarity index 100% rename from src/tests/test_cd.py rename to tests/test_cd.py diff --git a/src/tests/test_cfdp_filestore.py b/tests/test_cfdp_filestore.py similarity index 100% rename from src/tests/test_cfdp_filestore.py rename to tests/test_cfdp_filestore.py diff --git a/src/tests/test_global_manager.py b/tests/test_global_manager.py similarity index 100% rename from src/tests/test_global_manager.py rename to tests/test_global_manager.py diff --git a/tests/test_printer.py b/tests/test_printer.py new file mode 100644 index 00000000..6e646d79 --- /dev/null +++ b/tests/test_printer.py @@ -0,0 +1,57 @@ +import shutil +from pathlib import Path +from unittest import TestCase + +from spacepackets.ccsds.time import CdsShortTimestamp + +from tmtccmd.tm.pus_1_verification import Service1TMExtended +from tmtccmd.pus.pus_17_test import pack_service_17_ping_command +from tmtccmd.utility.tmtc_printer import FsfwTmTcPrinter +from tmtccmd.logging import get_console_logger, LOG_DIR +from tmtccmd.config.globals import update_global, CoreGlobalIds +from tmtccmd.logging.pus import ( + RegularTmtcLogWrapper, + RawTmtcTimedLogWrapper, + RawTmtcRotatingLogWrapper, TimedLogWhen +) + + +class TestPrintersLoggers(TestCase): + def setUp(self): + self.log_path = Path(LOG_DIR) + if self.log_path.exists(): + shutil.rmtree(self.log_path) + self.log_path.mkdir() + self.regular_file_name = RegularTmtcLogWrapper.get_current_tmtc_file_name() + self.regular_tmtc_logger = RegularTmtcLogWrapper(self.regular_file_name) + # self.raw_tmtc_timed_log = RawTmtcTimedLogWrapper( + # when=TimedLogWhen.PER_SECOND, + # interval=1 + # ) + self.raw_tmtc_log = RawTmtcRotatingLogWrapper( + max_bytes=1024, + backup_count=10 + ) + # self.tmtc_printer = FsfwTmTcPrinter(file_logger=self.regular_tmtc_logger.logger) + self.logger = get_console_logger() + + def test_pus_loggers(self): + pus_tc = pack_service_17_ping_command(ssc=0) + self.raw_tmtc_log.log_tc(pus_tc) + pus_tm = Service1TMExtended( + subservice=1, time=CdsShortTimestamp.init_from_current_time() + ) + self.raw_tmtc_log.log_tm(pus_tm.pus_tm) + self.assertTrue(Path(self.regular_file_name).exists()) + # There should be 2 files now because 1024 bytes are not enough to accomate all info + self.assertTrue(Path(self.raw_tmtc_log.file_name).exists()) + self.assertTrue(Path(f"{self.raw_tmtc_log.file_name}.1").exists()) + + def test_print_functions(self): + pass + + def tearDown(self) -> None: + """Reset the hook object""" + update_global(CoreGlobalIds.TMTC_HOOK, None) + if self.log_path.exists(): + shutil.rmtree(LOG_DIR) diff --git a/src/tests/test_pus.py b/tests/test_pus.py similarity index 100% rename from src/tests/test_pus.py rename to tests/test_pus.py diff --git a/src/tests/test_queue.py b/tests/test_queue.py similarity index 100% rename from src/tests/test_queue.py rename to tests/test_queue.py diff --git a/src/tests/test_runner.py b/tests/test_runner.py similarity index 92% rename from src/tests/test_runner.py rename to tests/test_runner.py index 89005a60..865c5b36 100644 --- a/src/tests/test_runner.py +++ b/tests/test_runner.py @@ -2,8 +2,8 @@ from tmtccmd.ccsds.handler import CcsdsTmHandler import tmtccmd.runner as tmtccmd -from tests.backend_mock import create_backend_mock, create_frontend_mock -from tests.hook_obj_mock import create_hook_mock +from .backend_mock import create_backend_mock, create_frontend_mock +from .hook_obj_mock import create_hook_mock class TestTmtcRunner(TestCase): diff --git a/src/tests/test_seq_sender.py b/tests/test_seq_sender.py similarity index 100% rename from src/tests/test_seq_sender.py rename to tests/test_seq_sender.py diff --git a/src/tmtccmd/__init__.py b/tmtccmd/__init__.py similarity index 100% rename from src/tmtccmd/__init__.py rename to tmtccmd/__init__.py diff --git a/src/tmtccmd/ccsds/__init__.py b/tmtccmd/ccsds/__init__.py similarity index 100% rename from src/tmtccmd/ccsds/__init__.py rename to tmtccmd/ccsds/__init__.py diff --git a/src/tmtccmd/ccsds/handler.py b/tmtccmd/ccsds/handler.py similarity index 100% rename from src/tmtccmd/ccsds/handler.py rename to tmtccmd/ccsds/handler.py diff --git a/src/tmtccmd/cfdp/__init__.py b/tmtccmd/cfdp/__init__.py similarity index 100% rename from src/tmtccmd/cfdp/__init__.py rename to tmtccmd/cfdp/__init__.py diff --git a/src/tmtccmd/cfdp/filestore.py b/tmtccmd/cfdp/filestore.py similarity index 100% rename from src/tmtccmd/cfdp/filestore.py rename to tmtccmd/cfdp/filestore.py diff --git a/src/tmtccmd/cfdp/handler.py b/tmtccmd/cfdp/handler.py similarity index 100% rename from src/tmtccmd/cfdp/handler.py rename to tmtccmd/cfdp/handler.py diff --git a/src/tmtccmd/cfdp/mib.py b/tmtccmd/cfdp/mib.py similarity index 100% rename from src/tmtccmd/cfdp/mib.py rename to tmtccmd/cfdp/mib.py diff --git a/src/tmtccmd/com_if/__init__.py b/tmtccmd/com_if/__init__.py similarity index 100% rename from src/tmtccmd/com_if/__init__.py rename to tmtccmd/com_if/__init__.py diff --git a/src/tmtccmd/com_if/com_if_utilities.py b/tmtccmd/com_if/com_if_utilities.py similarity index 100% rename from src/tmtccmd/com_if/com_if_utilities.py rename to tmtccmd/com_if/com_if_utilities.py diff --git a/src/tmtccmd/com_if/com_interface_base.py b/tmtccmd/com_if/com_interface_base.py similarity index 100% rename from src/tmtccmd/com_if/com_interface_base.py rename to tmtccmd/com_if/com_interface_base.py diff --git a/src/tmtccmd/com_if/dummy_com_if.py b/tmtccmd/com_if/dummy_com_if.py similarity index 100% rename from src/tmtccmd/com_if/dummy_com_if.py rename to tmtccmd/com_if/dummy_com_if.py diff --git a/src/tmtccmd/com_if/qemu_com_if.py b/tmtccmd/com_if/qemu_com_if.py similarity index 100% rename from src/tmtccmd/com_if/qemu_com_if.py rename to tmtccmd/com_if/qemu_com_if.py diff --git a/src/tmtccmd/com_if/serial_com_if.py b/tmtccmd/com_if/serial_com_if.py similarity index 100% rename from src/tmtccmd/com_if/serial_com_if.py rename to tmtccmd/com_if/serial_com_if.py diff --git a/src/tmtccmd/com_if/serial_utilities.py b/tmtccmd/com_if/serial_utilities.py similarity index 100% rename from src/tmtccmd/com_if/serial_utilities.py rename to tmtccmd/com_if/serial_utilities.py diff --git a/src/tmtccmd/com_if/tcpip_tcp_com_if.py b/tmtccmd/com_if/tcpip_tcp_com_if.py similarity index 100% rename from src/tmtccmd/com_if/tcpip_tcp_com_if.py rename to tmtccmd/com_if/tcpip_tcp_com_if.py diff --git a/src/tmtccmd/com_if/tcpip_udp_com_if.py b/tmtccmd/com_if/tcpip_udp_com_if.py similarity index 100% rename from src/tmtccmd/com_if/tcpip_udp_com_if.py rename to tmtccmd/com_if/tcpip_udp_com_if.py diff --git a/src/tmtccmd/com_if/tcpip_utilities.py b/tmtccmd/com_if/tcpip_utilities.py similarity index 100% rename from src/tmtccmd/com_if/tcpip_utilities.py rename to tmtccmd/com_if/tcpip_utilities.py diff --git a/src/tmtccmd/config/__init__.py b/tmtccmd/config/__init__.py similarity index 100% rename from src/tmtccmd/config/__init__.py rename to tmtccmd/config/__init__.py diff --git a/src/tmtccmd/config/args.py b/tmtccmd/config/args.py similarity index 100% rename from src/tmtccmd/config/args.py rename to tmtccmd/config/args.py diff --git a/src/tmtccmd/config/cfdp.py b/tmtccmd/config/cfdp.py similarity index 100% rename from src/tmtccmd/config/cfdp.py rename to tmtccmd/config/cfdp.py diff --git a/src/tmtccmd/config/cfg_hook.py b/tmtccmd/config/cfg_hook.py similarity index 100% rename from src/tmtccmd/config/cfg_hook.py rename to tmtccmd/config/cfg_hook.py diff --git a/src/tmtccmd/config/com_if.py b/tmtccmd/config/com_if.py similarity index 100% rename from src/tmtccmd/config/com_if.py rename to tmtccmd/config/com_if.py diff --git a/src/tmtccmd/config/definitions.py b/tmtccmd/config/definitions.py similarity index 100% rename from src/tmtccmd/config/definitions.py rename to tmtccmd/config/definitions.py diff --git a/src/tmtccmd/config/globals.py b/tmtccmd/config/globals.py similarity index 100% rename from src/tmtccmd/config/globals.py rename to tmtccmd/config/globals.py diff --git a/src/tmtccmd/config/logo.png b/tmtccmd/config/logo.png similarity index 100% rename from src/tmtccmd/config/logo.png rename to tmtccmd/config/logo.png diff --git a/src/tmtccmd/config/objects.py b/tmtccmd/config/objects.py similarity index 100% rename from src/tmtccmd/config/objects.py rename to tmtccmd/config/objects.py diff --git a/src/tmtccmd/config/prompt.py b/tmtccmd/config/prompt.py similarity index 100% rename from src/tmtccmd/config/prompt.py rename to tmtccmd/config/prompt.py diff --git a/src/tmtccmd/config/tmtc_defs.py b/tmtccmd/config/tmtc_defs.py similarity index 100% rename from src/tmtccmd/config/tmtc_defs.py rename to tmtccmd/config/tmtc_defs.py diff --git a/src/tmtccmd/core/__init__.py b/tmtccmd/core/__init__.py similarity index 100% rename from src/tmtccmd/core/__init__.py rename to tmtccmd/core/__init__.py diff --git a/src/tmtccmd/core/backend.py b/tmtccmd/core/backend.py similarity index 100% rename from src/tmtccmd/core/backend.py rename to tmtccmd/core/backend.py diff --git a/src/tmtccmd/core/ccsds_backend.py b/tmtccmd/core/ccsds_backend.py similarity index 100% rename from src/tmtccmd/core/ccsds_backend.py rename to tmtccmd/core/ccsds_backend.py diff --git a/src/tmtccmd/core/frontend.py b/tmtccmd/core/frontend.py similarity index 100% rename from src/tmtccmd/core/frontend.py rename to tmtccmd/core/frontend.py diff --git a/src/tmtccmd/core/frontend_base.py b/tmtccmd/core/frontend_base.py similarity index 100% rename from src/tmtccmd/core/frontend_base.py rename to tmtccmd/core/frontend_base.py diff --git a/src/tmtccmd/core/globals_manager.py b/tmtccmd/core/globals_manager.py similarity index 100% rename from src/tmtccmd/core/globals_manager.py rename to tmtccmd/core/globals_manager.py diff --git a/src/tmtccmd/core/modes.py b/tmtccmd/core/modes.py similarity index 100% rename from src/tmtccmd/core/modes.py rename to tmtccmd/core/modes.py diff --git a/src/tmtccmd/fsfw/__init__.py b/tmtccmd/fsfw/__init__.py similarity index 100% rename from src/tmtccmd/fsfw/__init__.py rename to tmtccmd/fsfw/__init__.py diff --git a/src/tmtccmd/logging/__init__.py b/tmtccmd/logging/__init__.py similarity index 100% rename from src/tmtccmd/logging/__init__.py rename to tmtccmd/logging/__init__.py diff --git a/src/tmtccmd/logging/pus.py b/tmtccmd/logging/pus.py similarity index 64% rename from src/tmtccmd/logging/pus.py rename to tmtccmd/logging/pus.py index d8b46ab0..5a33c964 100644 --- a/src/tmtccmd/logging/pus.py +++ b/tmtccmd/logging/pus.py @@ -1,7 +1,7 @@ from __future__ import annotations import enum import logging -from typing import Optional +from typing import Optional, Union from datetime import datetime from spacepackets.ecss import PusTelecommand, PusTelemetry @@ -31,46 +31,58 @@ class TimedLogWhen(enum.Enum): class RawTmtcLogBase: - def __init__(self, logger: logging.Logger): + def __init__(self, logger: logging.Logger, log_repr: bool = True, log_raw_repr: bool = True): self.logger = logger + self.do_log_repr = log_repr + self.do_log_raw_repr = log_raw_repr + self.counter = 0 def log_tc(self, packet: PusTelecommand): """Default log function which logs the Python packet representation and raw bytes""" - self.log_pus_tc_repr(packet) - self.log_raw_pus_tc_bytes(packet) + prefix = self.tc_prefix(packet, self.counter) + if self.do_log_repr: + self.log_repr(prefix, packet) + raw_bytes = packet.pack() + self.__log_raw_inc_counter(prefix, raw_bytes) def log_tm(self, packet: PusTelemetry): """Default log function which logs the Python packet representation and raw bytes""" - self.log_pus_tm_repr(packet) - self.log_raw_pus_tm_bytes(packet) + prefix = self.tm_prefix(packet, self.counter) + if self.do_log_repr: + self.log_repr(prefix, packet) + raw_bytes = packet.pack() + self.__log_raw_inc_counter(prefix, raw_bytes) - def log_pus_tc_repr(self, packet: PusTelecommand): - self.logger.info(f"repr: {packet!r}") + def __log_raw_inc_counter(self, prefix: str, raw: bytes): + self.log_bytes_readable(prefix, raw) + if self.do_log_raw_repr: + self.log_bytes_repr(prefix, raw) + self.counter += 1 - def log_pus_tm_repr(self, packet: PusTelemetry): - self.logger.info(f"repr: {packet!r}") + def log_repr(self, prefix: str, packet: Union[PusTelecommand, PusTelemetry]): + self.logger.info(f"{prefix} repr: {packet!r}") @staticmethod - def tc_prefix(packet: PusTelecommand): - return f"TC[{packet.service}, {packet.subservice}]" + def tc_prefix(packet: PusTelecommand, counter: int): + return f"tc {counter} [{packet.service}, {packet.subservice}]" @staticmethod - def tm_prefix(packet: PusTelemetry): - return f"TM[{packet.service}, {packet.subservice}]" + def tm_prefix(packet: PusTelemetry, counter: int): + return f"tm {counter} [{packet.service}, {packet.subservice}]" - def log_raw_pus_tc_bytes(self, packet: PusTelecommand): - self.log_pus_bytes(self.tc_prefix(packet), packet.pack()) + def log_bytes_readable(self, prefix: str, packet: bytes): + self.logger.info(f"{prefix} raw readable hex: [{packet.hex(sep=',')}]") - def log_raw_pus_tm_bytes(self, packet: PusTelemetry): - self.log_pus_bytes(self.tm_prefix(packet), packet.pack()) - - def log_pus_bytes(self, prefix: str, packet: bytes): - self.logger.info(f"{prefix} hex: [{packet.hex(sep=',')}]") + def log_bytes_repr(self, prefix: str, packet: bytes): + self.logger.info(f"{prefix} raw repr: {packet!r}") class RawTmtcTimedLogWrapper(RawTmtcLogBase): def __init__( - self, when: TimedLogWhen, interval: int, file_name: str = RAW_PUS_FILE_BASE_NAME + self, + when: TimedLogWhen, + interval: int, + file_name: str = f"{RAW_PUS_FILE_BASE_NAME}.log" ): """Create a raw TMTC timed rotating log wrapper. See the official Python documentation at @@ -83,7 +95,7 @@ def __init__( hour intervals :param file_name: Base filename of the log file """ - logger = logging.getLogger(file_name) + logger = logging.getLogger(RAW_PUS_LOGGER_NAME) formatter = logging.Formatter( fmt="%(asctime)s.%(msecs)03d: %(message)s", datefmt="%Y-%m-%d %H:%M:%S" ) @@ -91,8 +103,9 @@ def __init__( filename=file_name, when=when.value, interval=interval ) handler.setFormatter(formatter) - self.logger.addHandler(handler) - self.logger.setLevel(logging.INFO) + logger.addHandler(handler) + logger.setLevel(logging.INFO) + self.file_name = handler.baseFilename super().__init__(logger) @@ -101,7 +114,7 @@ def __init__( self, max_bytes: int, backup_count: int, - file_name: str = f"{LOG_DIR}/RAW_PUS_FILE_BASE_NAME", + file_name: str = f"{LOG_DIR}/{RAW_PUS_FILE_BASE_NAME}", suffix: str = date_suffix(), ): """Create a raw TMTC rotating log wrapper. @@ -120,16 +133,17 @@ def __init__( argument will use a date suffix, which will lead to a new unique rotating log created every day """ - logger = logging.getLogger(f"{file_name}_{suffix}.log") + logger = logging.getLogger(RAW_PUS_LOGGER_NAME) formatter = logging.Formatter( fmt="%(asctime)s.%(msecs)03d: %(message)s", datefmt="%Y-%m-%d %H:%M:%S" ) handler = RotatingFileHandler( - filename=file_name, maxBytes=max_bytes, backupCount=backup_count + filename=f"{file_name}_{suffix}.log", maxBytes=max_bytes, backupCount=backup_count ) handler.setFormatter(formatter) - self.logger.addHandler(handler) - self.logger.setLevel(logging.INFO) + logger.addHandler(handler) + logger.setLevel(logging.INFO) + self.file_name = handler.baseFilename super().__init__(logger) @@ -139,10 +153,10 @@ def __init__(self, file_name: Optional[str] = None): self.file_name = self.get_current_tmtc_file_name() else: self.file_name = file_name - self.logger = logging.getLogger(self.file_name) - file_handler = FileHandler(filename=file_name) + self.logger = logging.getLogger(TMTC_LOGGER_NAME) + file_handler = FileHandler(file_name) formatter = logging.Formatter() - file_handler.setFormatter(fmt=formatter) + file_handler.setFormatter(formatter) self.logger.addHandler(file_handler) self.logger.setLevel(logging.INFO) diff --git a/src/tmtccmd/pus/__init__.py b/tmtccmd/pus/__init__.py similarity index 100% rename from src/tmtccmd/pus/__init__.py rename to tmtccmd/pus/__init__.py diff --git a/src/tmtccmd/pus/definitions.py b/tmtccmd/pus/definitions.py similarity index 100% rename from src/tmtccmd/pus/definitions.py rename to tmtccmd/pus/definitions.py diff --git a/src/tmtccmd/pus/pus_11_tc_sched.py b/tmtccmd/pus/pus_11_tc_sched.py similarity index 100% rename from src/tmtccmd/pus/pus_11_tc_sched.py rename to tmtccmd/pus/pus_11_tc_sched.py diff --git a/src/tmtccmd/pus/pus_17_test.py b/tmtccmd/pus/pus_17_test.py similarity index 100% rename from src/tmtccmd/pus/pus_17_test.py rename to tmtccmd/pus/pus_17_test.py diff --git a/src/tmtccmd/pus/pus_200_fsfw_mode.py b/tmtccmd/pus/pus_200_fsfw_mode.py similarity index 100% rename from src/tmtccmd/pus/pus_200_fsfw_mode.py rename to tmtccmd/pus/pus_200_fsfw_mode.py diff --git a/src/tmtccmd/pus/pus_201_fsfw_health.py b/tmtccmd/pus/pus_201_fsfw_health.py similarity index 100% rename from src/tmtccmd/pus/pus_201_fsfw_health.py rename to tmtccmd/pus/pus_201_fsfw_health.py diff --git a/src/tmtccmd/pus/pus_20_params.py b/tmtccmd/pus/pus_20_params.py similarity index 100% rename from src/tmtccmd/pus/pus_20_params.py rename to tmtccmd/pus/pus_20_params.py diff --git a/src/tmtccmd/pus/pus_5_event.py b/tmtccmd/pus/pus_5_event.py similarity index 100% rename from src/tmtccmd/pus/pus_5_event.py rename to tmtccmd/pus/pus_5_event.py diff --git a/src/tmtccmd/pus/pus_8_funccmd.py b/tmtccmd/pus/pus_8_funccmd.py similarity index 100% rename from src/tmtccmd/pus/pus_8_funccmd.py rename to tmtccmd/pus/pus_8_funccmd.py diff --git a/src/tmtccmd/runner.py b/tmtccmd/runner.py similarity index 100% rename from src/tmtccmd/runner.py rename to tmtccmd/runner.py diff --git a/src/tmtccmd/tc/__init__.py b/tmtccmd/tc/__init__.py similarity index 100% rename from src/tmtccmd/tc/__init__.py rename to tmtccmd/tc/__init__.py diff --git a/src/tmtccmd/tc/ccsds_seq_sender.py b/tmtccmd/tc/ccsds_seq_sender.py similarity index 100% rename from src/tmtccmd/tc/ccsds_seq_sender.py rename to tmtccmd/tc/ccsds_seq_sender.py diff --git a/src/tmtccmd/tc/definitions.py b/tmtccmd/tc/definitions.py similarity index 100% rename from src/tmtccmd/tc/definitions.py rename to tmtccmd/tc/definitions.py diff --git a/src/tmtccmd/tc/handler.py b/tmtccmd/tc/handler.py similarity index 100% rename from src/tmtccmd/tc/handler.py rename to tmtccmd/tc/handler.py diff --git a/src/tmtccmd/tc/pus_11_tc_sched.py b/tmtccmd/tc/pus_11_tc_sched.py similarity index 100% rename from src/tmtccmd/tc/pus_11_tc_sched.py rename to tmtccmd/tc/pus_11_tc_sched.py diff --git a/src/tmtccmd/tc/pus_200_fsfw_modes.py b/tmtccmd/tc/pus_200_fsfw_modes.py similarity index 100% rename from src/tmtccmd/tc/pus_200_fsfw_modes.py rename to tmtccmd/tc/pus_200_fsfw_modes.py diff --git a/src/tmtccmd/tc/pus_201_fsfw_health.py b/tmtccmd/tc/pus_201_fsfw_health.py similarity index 100% rename from src/tmtccmd/tc/pus_201_fsfw_health.py rename to tmtccmd/tc/pus_201_fsfw_health.py diff --git a/src/tmtccmd/tc/pus_20_params.py b/tmtccmd/tc/pus_20_params.py similarity index 100% rename from src/tmtccmd/tc/pus_20_params.py rename to tmtccmd/tc/pus_20_params.py diff --git a/src/tmtccmd/tc/pus_3_fsfw_hk.py b/tmtccmd/tc/pus_3_fsfw_hk.py similarity index 100% rename from src/tmtccmd/tc/pus_3_fsfw_hk.py rename to tmtccmd/tc/pus_3_fsfw_hk.py diff --git a/src/tmtccmd/tc/pus_5_event.py b/tmtccmd/tc/pus_5_event.py similarity index 100% rename from src/tmtccmd/tc/pus_5_event.py rename to tmtccmd/tc/pus_5_event.py diff --git a/src/tmtccmd/tc/pus_8_funccmd.py b/tmtccmd/tc/pus_8_funccmd.py similarity index 100% rename from src/tmtccmd/tc/pus_8_funccmd.py rename to tmtccmd/tc/pus_8_funccmd.py diff --git a/src/tmtccmd/tc/queue.py b/tmtccmd/tc/queue.py similarity index 100% rename from src/tmtccmd/tc/queue.py rename to tmtccmd/tc/queue.py diff --git a/src/tmtccmd/tm/__init__.py b/tmtccmd/tm/__init__.py similarity index 100% rename from src/tmtccmd/tm/__init__.py rename to tmtccmd/tm/__init__.py diff --git a/src/tmtccmd/tm/base.py b/tmtccmd/tm/base.py similarity index 100% rename from src/tmtccmd/tm/base.py rename to tmtccmd/tm/base.py diff --git a/src/tmtccmd/tm/ccsds_tm_listener.py b/tmtccmd/tm/ccsds_tm_listener.py similarity index 100% rename from src/tmtccmd/tm/ccsds_tm_listener.py rename to tmtccmd/tm/ccsds_tm_listener.py diff --git a/src/tmtccmd/tm/definitions.py b/tmtccmd/tm/definitions.py similarity index 100% rename from src/tmtccmd/tm/definitions.py rename to tmtccmd/tm/definitions.py diff --git a/src/tmtccmd/tm/handler.py b/tmtccmd/tm/handler.py similarity index 100% rename from src/tmtccmd/tm/handler.py rename to tmtccmd/tm/handler.py diff --git a/src/tmtccmd/tm/pus_17_test.py b/tmtccmd/tm/pus_17_test.py similarity index 100% rename from src/tmtccmd/tm/pus_17_test.py rename to tmtccmd/tm/pus_17_test.py diff --git a/src/tmtccmd/tm/pus_1_verification.py b/tmtccmd/tm/pus_1_verification.py similarity index 100% rename from src/tmtccmd/tm/pus_1_verification.py rename to tmtccmd/tm/pus_1_verification.py diff --git a/src/tmtccmd/tm/pus_200_fsfw_modes.py b/tmtccmd/tm/pus_200_fsfw_modes.py similarity index 100% rename from src/tmtccmd/tm/pus_200_fsfw_modes.py rename to tmtccmd/tm/pus_200_fsfw_modes.py diff --git a/src/tmtccmd/tm/pus_20_fsfw_parameters.py b/tmtccmd/tm/pus_20_fsfw_parameters.py similarity index 100% rename from src/tmtccmd/tm/pus_20_fsfw_parameters.py rename to tmtccmd/tm/pus_20_fsfw_parameters.py diff --git a/src/tmtccmd/tm/pus_23_filemgmt.py b/tmtccmd/tm/pus_23_filemgmt.py similarity index 100% rename from src/tmtccmd/tm/pus_23_filemgmt.py rename to tmtccmd/tm/pus_23_filemgmt.py diff --git a/src/tmtccmd/tm/pus_2_rawcmd.py b/tmtccmd/tm/pus_2_rawcmd.py similarity index 100% rename from src/tmtccmd/tm/pus_2_rawcmd.py rename to tmtccmd/tm/pus_2_rawcmd.py diff --git a/src/tmtccmd/tm/pus_3_fsfw_hk.py b/tmtccmd/tm/pus_3_fsfw_hk.py similarity index 100% rename from src/tmtccmd/tm/pus_3_fsfw_hk.py rename to tmtccmd/tm/pus_3_fsfw_hk.py diff --git a/src/tmtccmd/tm/pus_3_hk_base.py b/tmtccmd/tm/pus_3_hk_base.py similarity index 100% rename from src/tmtccmd/tm/pus_3_hk_base.py rename to tmtccmd/tm/pus_3_hk_base.py diff --git a/src/tmtccmd/tm/pus_5_event.py b/tmtccmd/tm/pus_5_event.py similarity index 100% rename from src/tmtccmd/tm/pus_5_event.py rename to tmtccmd/tm/pus_5_event.py diff --git a/src/tmtccmd/tm/pus_8_funccmd.py b/tmtccmd/tm/pus_8_funccmd.py similarity index 100% rename from src/tmtccmd/tm/pus_8_funccmd.py rename to tmtccmd/tm/pus_8_funccmd.py diff --git a/src/tmtccmd/utility/__init__.py b/tmtccmd/utility/__init__.py similarity index 100% rename from src/tmtccmd/utility/__init__.py rename to tmtccmd/utility/__init__.py diff --git a/src/tmtccmd/utility/conf_util.py b/tmtccmd/utility/conf_util.py similarity index 100% rename from src/tmtccmd/utility/conf_util.py rename to tmtccmd/utility/conf_util.py diff --git a/src/tmtccmd/utility/countdown.py b/tmtccmd/utility/countdown.py similarity index 100% rename from src/tmtccmd/utility/countdown.py rename to tmtccmd/utility/countdown.py diff --git a/src/tmtccmd/utility/exit_handler.py b/tmtccmd/utility/exit_handler.py similarity index 100% rename from src/tmtccmd/utility/exit_handler.py rename to tmtccmd/utility/exit_handler.py diff --git a/src/tmtccmd/utility/hammingcode.py b/tmtccmd/utility/hammingcode.py similarity index 100% rename from src/tmtccmd/utility/hammingcode.py rename to tmtccmd/utility/hammingcode.py diff --git a/src/tmtccmd/utility/json_handler.py b/tmtccmd/utility/json_handler.py similarity index 100% rename from src/tmtccmd/utility/json_handler.py rename to tmtccmd/utility/json_handler.py diff --git a/src/tmtccmd/utility/obj_id.py b/tmtccmd/utility/obj_id.py similarity index 100% rename from src/tmtccmd/utility/obj_id.py rename to tmtccmd/utility/obj_id.py diff --git a/src/tmtccmd/utility/retval.py b/tmtccmd/utility/retval.py similarity index 100% rename from src/tmtccmd/utility/retval.py rename to tmtccmd/utility/retval.py diff --git a/src/tmtccmd/utility/tmtc_printer.py b/tmtccmd/utility/tmtc_printer.py similarity index 100% rename from src/tmtccmd/utility/tmtc_printer.py rename to tmtccmd/utility/tmtc_printer.py From b34b3ae22307ac712fe3aa009bc4ef232b41ae05 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 24 Jun 2022 12:22:34 +0200 Subject: [PATCH 075/221] simplified tm listener significantly --- examples/tmtccli.py | 2 +- examples/tmtcgui.py | 2 +- tests/test_printer.py | 8 +- tests/test_seq_sender.py | 3 +- tests/test_tm_handler.py | 17 ++ tmtccmd/ccsds/handler.py | 37 +--- tmtccmd/logging/pus.py | 10 +- tmtccmd/tm/ccsds_tm_listener.py | 327 ++------------------------------ 8 files changed, 51 insertions(+), 355 deletions(-) create mode 100644 tests/test_tm_handler.py diff --git a/examples/tmtccli.py b/examples/tmtccli.py index f63b019d..40cb4459 100755 --- a/examples/tmtccli.py +++ b/examples/tmtccli.py @@ -28,7 +28,7 @@ def main(): cb=default_ccsds_packet_handler, queue_len=50, user_args=None ) ccsds_handler = CcsdsTmHandler() - ccsds_handler.add_tm_handler(apid=APID, handler=apid_handler) + ccsds_handler.add_apid_handler(apid=APID, handler=apid_handler) tmtccmd.runner.setup(setup_args=setup_args) tmtccmd.runner.add_ccsds_handler(ccsds_handler) tmtc_backend = tmtccmd.runner.create_default_tmtc_backend( diff --git a/examples/tmtcgui.py b/examples/tmtcgui.py index 4f32c2f5..d0f7cb06 100755 --- a/examples/tmtcgui.py +++ b/examples/tmtcgui.py @@ -20,7 +20,7 @@ def main(): cb=default_ccsds_packet_handler, queue_len=50, user_args=None ) ccsds_handler = CcsdsTmHandler() - ccsds_handler.add_tm_handler(apid=APID, handler=apid_handler) + ccsds_handler.add_apid_handler(apid=APID, handler=apid_handler) runner.setup(setup_args=setup_args) runner.add_ccsds_handler(ccsds_handler) tmtc_backend = runner.create_default_tmtc_backend( diff --git a/tests/test_printer.py b/tests/test_printer.py index 6e646d79..fd6ff480 100644 --- a/tests/test_printer.py +++ b/tests/test_printer.py @@ -12,7 +12,8 @@ from tmtccmd.logging.pus import ( RegularTmtcLogWrapper, RawTmtcTimedLogWrapper, - RawTmtcRotatingLogWrapper, TimedLogWhen + RawTmtcRotatingLogWrapper, + TimedLogWhen, ) @@ -28,10 +29,7 @@ def setUp(self): # when=TimedLogWhen.PER_SECOND, # interval=1 # ) - self.raw_tmtc_log = RawTmtcRotatingLogWrapper( - max_bytes=1024, - backup_count=10 - ) + self.raw_tmtc_log = RawTmtcRotatingLogWrapper(max_bytes=1024, backup_count=10) # self.tmtc_printer = FsfwTmTcPrinter(file_logger=self.regular_tmtc_logger.logger) self.logger = get_console_logger() diff --git a/tests/test_seq_sender.py b/tests/test_seq_sender.py index 15054d3c..b82ca1f5 100644 --- a/tests/test_seq_sender.py +++ b/tests/test_seq_sender.py @@ -1,10 +1,9 @@ from collections import deque from unittest import TestCase -from unittest.mock import MagicMock, ANY, sentinel +from unittest.mock import MagicMock, ANY from tmtccmd.com_if.com_interface_base import CommunicationInterface from tmtccmd.tc.ccsds_seq_sender import SequentialCcsdsSender, SenderMode -from tmtccmd.tc.definitions import RawTcEntry from tmtccmd.tc.handler import TcHandlerBase from tmtccmd.tc.queue import QueueWrapper, QueueHelper diff --git a/tests/test_tm_handler.py b/tests/test_tm_handler.py new file mode 100644 index 00000000..bad8f965 --- /dev/null +++ b/tests/test_tm_handler.py @@ -0,0 +1,17 @@ +from unittest import TestCase + +from tmtccmd.ccsds.handler import ApidTmHandlerBase + + +class TmHandler(ApidTmHandlerBase): + def __init__(self): + super().__init__() + self.was_called = False + + def handle_tm_for_apid(self, apid: int, packet: bytes, user_args: any): + self.was_called = True + + +class TestTmHandler(TestCase): + def test_basic(self): + tm_handler = TmHandler() diff --git a/tmtccmd/ccsds/handler.py b/tmtccmd/ccsds/handler.py index 30912ed7..8d9b00c3 100644 --- a/tmtccmd/ccsds/handler.py +++ b/tmtccmd/ccsds/handler.py @@ -1,9 +1,9 @@ import abc -from typing import Dict, Optional, Tuple, List +from collections import deque +from typing import Dict from tmtccmd.tm.handler import TmHandlerBase -from tmtccmd.tm.definitions import TelemetryQueueT, TmTypes -from tmtccmd.tm.ccsds_tm_listener import QueueListT +from tmtccmd.tm.definitions import TmTypes from tmtccmd.logging import get_console_logger LOGGER = get_console_logger() @@ -15,6 +15,7 @@ class ApidTmHandlerBase: def __init__(self, queue_len: int, user_args: any): self.queue_len: int = queue_len + self.queue = deque(maxlen=queue_len) self.user_args: any = user_args @abc.abstractmethod @@ -33,7 +34,7 @@ def __init__(self): super().__init__(tm_type=TmTypes.CCSDS_SPACE_PACKETS) self._handler_dict: HandlerDictT = dict() - def add_tm_handler(self, apid: int, handler: ApidTmHandlerBase): + def add_apid_handler(self, apid: int, handler: ApidTmHandlerBase): """Add a TM handler for a certain APID. The handler is a callback function which will be called if telemetry with that APID arrives :param apid: CCSDS Application Process ID @@ -42,29 +43,9 @@ def add_tm_handler(self, apid: int, handler: ApidTmHandlerBase): """ self._handler_dict[apid] = handler - def get_apid_queue_len_list(self) -> List[Tuple[int, int]]: - apid_queue_len_list = [] - for apid, handler_value in self._handler_dict.items(): - apid_queue_len_list.append((apid, handler_value.queue_len)) - return apid_queue_len_list - - def handle_packet_queues(self, packet_queue_list: QueueListT): - for queue_tuple in packet_queue_list: - apid = queue_tuple[0] - self.handle_ccsds_packet_queue( - tm_queue=queue_tuple[1], apid=apid, handler=self._handler_dict.get(apid) - ) - - def handle_ccsds_packet_queue( - self, - tm_queue: TelemetryQueueT, - apid: int, - handler: Optional[ApidTmHandlerBase], - ): - if handler is None: - handler = self._handler_dict.get(apid) + def handle_packet(self, apid: int, packet: bytes) -> bool: + handler = self._handler_dict.get(apid) if handler is None: - LOGGER.warning(f"No valid handler for TM with APID {apid} found") + return False else: - for tm_packet in tm_queue: - handler.handle_tm_for_apid(apid, tm_packet, handler.user_args) + handler.handle_tm_for_apid(apid, packet, handler.user_args) diff --git a/tmtccmd/logging/pus.py b/tmtccmd/logging/pus.py index 5a33c964..fb858593 100644 --- a/tmtccmd/logging/pus.py +++ b/tmtccmd/logging/pus.py @@ -31,7 +31,9 @@ class TimedLogWhen(enum.Enum): class RawTmtcLogBase: - def __init__(self, logger: logging.Logger, log_repr: bool = True, log_raw_repr: bool = True): + def __init__( + self, logger: logging.Logger, log_repr: bool = True, log_raw_repr: bool = True + ): self.logger = logger self.do_log_repr = log_repr self.do_log_raw_repr = log_raw_repr @@ -82,7 +84,7 @@ def __init__( self, when: TimedLogWhen, interval: int, - file_name: str = f"{RAW_PUS_FILE_BASE_NAME}.log" + file_name: str = f"{RAW_PUS_FILE_BASE_NAME}.log", ): """Create a raw TMTC timed rotating log wrapper. See the official Python documentation at @@ -138,7 +140,9 @@ def __init__( fmt="%(asctime)s.%(msecs)03d: %(message)s", datefmt="%Y-%m-%d %H:%M:%S" ) handler = RotatingFileHandler( - filename=f"{file_name}_{suffix}.log", maxBytes=max_bytes, backupCount=backup_count + filename=f"{file_name}_{suffix}.log", + maxBytes=max_bytes, + backupCount=backup_count, ) handler.setFormatter(formatter) logger.addHandler(handler) diff --git a/tmtccmd/tm/ccsds_tm_listener.py b/tmtccmd/tm/ccsds_tm_listener.py index 7311676c..7793bcc1 100644 --- a/tmtccmd/tm/ccsds_tm_listener.py +++ b/tmtccmd/tm/ccsds_tm_listener.py @@ -7,6 +7,7 @@ from enum import Enum from spacepackets.ccsds.spacepacket import get_apid_from_raw_space_packet +from tmtccmd.ccsds.handler import CcsdsTmHandler from tmtccmd.tm.definitions import TelemetryQueueT, TelemetryListT, TmTypes from tmtccmd.logging import get_console_logger @@ -21,12 +22,6 @@ QueueListT = List[Tuple[int, TelemetryQueueT]] -class ListenerModes(Enum): - MANUAL = 1 - LISTENER = 2 - SEQUENCE = 3 - - class CcsdsTmListener: """Performs all TM listening operations. This listener to have a permanent means to receive data. A background thread is used @@ -45,6 +40,7 @@ class CcsdsTmListener: def __init__( self, com_if: CommunicationInterface, + tm_handler: CcsdsTmHandler, seq_timeout: float = DEFAULT_TM_TIMEOUT, tm_type: TmTypes = TmTypes.CCSDS_SPACE_PACKETS, ): @@ -54,329 +50,30 @@ def __init__( :param tm_type: Telemetry type. Default to CCSDS space packets for now """ self.__com_if = com_if - self._mode_op_timeout = CcsdsTmListener.DEFAULT_MODE_OPERATION_TIMEOUT - # TM Listener operations can be suspended by setting this flag - self.event_listener_active = threading.Event() - self.listener_active = False - - # Listener is daemon and will exit automatically if all other threads are closed - self.listener_thread = threading.Thread( - target=self.__perform_operation, daemon=True - ) - self.lock_listener = threading.Lock() - # This Event is set by sender objects to perform mode operations - self.event_mode_change = threading.Event() - # This Event is set and cleared by the listener to inform the sender objects - # if a reply has been received - self.__event_reply_received = threading.Event() - # This Event is set by sender objects if all necessary operations are done - # to transition back to listener mode - self.__event_mode_op_finished = threading.Event() - - self.__listener_mode = ListenerModes.LISTENER self.seq_timeout = seq_timeout self.__tm_type = tm_type - self.__queue_dict: QueueDictT = dict( - {UNKNOWN_TARGET_ID: (deque(), self.DEFAULT_UNKNOWN_QUEUE_MAX_LEN)} - ) - - def start(self): - if not self.event_listener_active.is_set(): - self.event_listener_active.set() - if not self.listener_thread.is_alive(): - self.listener_thread.start() - else: - LOGGER.warning("TM listener is already active!") - - def stop(self): - self.event_listener_active.clear() + self.__tm_handler = tm_handler - def set_mode_op_timeout(self, timeout: float): - self._mode_op_timeout = timeout + @property + def com_if(self): + return self.__com_if - def subscribe_ccsds_tm_handler(self, apid: int, queue_max_len: int): - if self.__tm_type == TmTypes.CCSDS_SPACE_PACKETS: - self.__queue_dict[apid] = (deque(), queue_max_len) - else: - LOGGER.warning("This function only support CCSDS space packet handling") - - def set_com_if(self, com_if: CommunicationInterface): + @com_if.setter + def com_if(self, com_if: CommunicationInterface): self.__com_if = com_if - def is_listener_active(self) -> bool: - return self.listener_active - - def manual_mode(self) -> bool: - return self.__update_mode(ListenerModes.MANUAL) - - def listener_mode(self) -> bool: - return self.__update_mode(ListenerModes.LISTENER) - - def sequence_mode(self, seq_timeout: Optional[float] = None) -> bool: - if seq_timeout is not None: - self.seq_timeout = seq_timeout - return self.__update_mode(ListenerModes.SEQUENCE) - - def __update_mode(self, new_mode: ListenerModes) -> bool: - if self.__listener_mode != new_mode: - self.event_mode_change.set() - self.__listener_mode = new_mode - return True - return False - - def reply_event(self): - if self.__event_reply_received.is_set(): - return True - else: - return False - - def clear_reply_event(self): - self.__event_reply_received.clear() - - def set_mode_op_finished(self): - if not self.__event_mode_op_finished.is_set(): - self.__event_mode_op_finished.set() - - def ccsds_tm_received(self, apid: int = INVALID_APID): - """This function is used to check whether any data has been received""" - queue_dict_list = self.__queue_dict.get(apid) - if queue_dict_list is None: - LOGGER.warning(f"No queue available for APID {apid}") - queue_dict = queue_dict_list[self.QUEUE_DICT_QUEUE_IDX] - if queue_dict.__len__() > 0: - return True - else: - return False - - def tm_packets_available(self) -> bool: - with acquire_timeout( - self.lock_listener, timeout=self.DEFAULT_LOCK_TIMEOUT - ) as acquired: - if acquired: - for queue_lists in self.__queue_dict.values(): - if queue_lists[self.QUEUE_DICT_QUEUE_IDX]: - return True - return False - - def retrieve_tm_packet_queues(self, clear: bool) -> QueueListT: - queues = [] - with acquire_timeout( - self.lock_listener, timeout=self.DEFAULT_LOCK_TIMEOUT - ) as acquired: - if not acquired: - LOGGER.error("Could not acquire lock!") - # Still continue - for key, queue_list in self.__queue_dict.items(): - queues.append((key, queue_list[self.QUEUE_DICT_QUEUE_IDX].copy())) - if clear: - self.clear_tm_packet_queues(lock=False) - return queues - - def retrieve_ccsds_tm_packet_queue( - self, apid: int, clear: bool = False - ) -> TelemetryQueueT: - """Retrieve the packet queue for a given APID. The TM listener will handle routing - packets into the correct queue.""" - target_queue_list = self.__queue_dict.get(apid) - if target_queue_list is None: - LOGGER.warning(f"No queue available for APID {apid}") - return deque() - target_queue = target_queue_list[self.QUEUE_DICT_QUEUE_IDX] - # We make sure that the queue is not manipulated while it is being copied. - with acquire_timeout( - self.lock_listener, timeout=self.DEFAULT_LOCK_TIMEOUT - ) as acquired: - if not acquired: - LOGGER.warning( - f"TmListener: Blocked on lock acquisition for longer than" - f"{self.DEFAULT_LOCK_TIMEOUT} second!" - ) - tm_queue_copy = target_queue.copy() - if clear: - target_queue.clear() - return tm_queue_copy - - def clear_ccsds_tm_packet_queue(self, apid: int): - target_queue = self.__queue_dict.get(apid) - if target_queue is None: - LOGGER.warning(f"No queue available for APID {apid}") - return - with acquire_timeout( - self.lock_listener, timeout=self.DEFAULT_LOCK_TIMEOUT - ) as acquired: - if not acquired: - LOGGER.warning( - f"TmListener: Blocked on lock acquisition for longer than" - f"{self.DEFAULT_LOCK_TIMEOUT} second!" - ) - target_queue[0].clear() - - def clear_tm_packet_queues(self, lock: bool): - locked = False - if lock: - locked = self.lock_listener.acquire(timeout=self.DEFAULT_LOCK_TIMEOUT) - for queue_list in self.__queue_dict.values(): - queue_list[self.QUEUE_DICT_QUEUE_IDX].clear() - if locked: - self.lock_listener.release() - - def retrieve_unknown_target_queue(self): - target_queue = self.__queue_dict.get(UNKNOWN_TARGET_ID)[ - self.QUEUE_DICT_QUEUE_IDX - ] - with acquire_timeout( - self.lock_listener, timeout=self.DEFAULT_LOCK_TIMEOUT - ) as acquired: - if acquired: - return target_queue.copy() - - def check_for_one_telemetry_sequence(self, seq_timeout: float) -> bool: - """Receive all telemetry for a specified time period. - :return: True if a sequence was received - """ - data_available = self.__com_if.data_available(timeout=0, parameters=None) - if data_available == 0: - return False - elif data_available > 0: - self.__read_telemetry_sequence(tm_timeout=seq_timeout) - return True - else: - LOGGER.error("TmListener: Configuration error in communication interface!") - sys.exit() - - def __perform_operation(self): - while True: - # This is running in a daemon thread so it will stop automatically if all other - # threads have closed - if self.event_listener_active.is_set(): - self.listener_active = True - self.__default_operation() - else: - self.listener_active = False - # Check every 300 ms whether connection is up again. - time.sleep(0.3) - - def __default_operation(self): - """Core function. Normally, polls all packets""" - self.__perform_core_operation() - if self.event_mode_change.is_set(): - self.event_mode_change.clear() - start_time = time.time() - while not self.__event_mode_op_finished.is_set(): - elapsed_time = time.time() - start_time - if elapsed_time < self._mode_op_timeout: - self.__perform_mode_operation() - else: - LOGGER.warning("TmListener: Mode operation timeout occured!") - break - self.__event_mode_op_finished.clear() - LOGGER.info("TmListener: Transitioning to listener mode.") - self.__listener_mode = ListenerModes.LISTENER - - def __perform_core_operation(self): - """The core operation listens for packets and routes them""" + def operation(self): packet_list = self.__com_if.receive() - if len(packet_list) > 0: - with acquire_timeout( - self.lock_listener, timeout=self.DEFAULT_LOCK_TIMEOUT - ) as acquired: - if not acquired: - LOGGER.warning( - f"TmListener: Blocked on lock acquisition for longer than" - f"{self.DEFAULT_LOCK_TIMEOUT} second!" - ) - self.__route_packets(packet_list) - if not self.__event_reply_received.is_set(): - self.__event_reply_received.set() - else: - time.sleep(0.4) - - def __perform_mode_operation(self): - """The TmListener is instructed performs certain operations based on the current - listener mode. - :return: - """ - # Listener Mode - if self.__listener_mode == ListenerModes.LISTENER: - if not self.__event_mode_op_finished.is_set(): - self.__event_mode_op_finished.set() - elif self.__listener_mode == ListenerModes.SEQUENCE: - # This prevents the listener from listening from one more unnecessary cycle - if self.__event_mode_op_finished.is_set(): - return - # Listen for one reply sequence. - if self.check_for_one_telemetry_sequence(self.seq_timeout): - # Set reply event, will be cleared by checkForFirstReply() - if not self.__event_reply_received.is_set(): - self.__event_reply_received.set() - time.sleep(0.2) - elif self.__listener_mode == ListenerModes.MANUAL: - self.__perform_core_operation() - - def __read_telemetry_sequence(self, tm_timeout: float): - """Thread-safe implementation for reading a telemetry sequence.""" - start_time = time.time() - elapsed_time = 0 - while elapsed_time < tm_timeout: - # Fast responsiveness in sequential mode - if self.__event_mode_op_finished.is_set(): - if self.__listener_mode == ListenerModes.SEQUENCE: - return - packets_available = self.__com_if.data_available( - timeout=0.2, parameters=None - ) - if packets_available > 0: - packet_list = self.__com_if.receive() - with acquire_timeout( - self.lock_listener, timeout=self.DEFAULT_LOCK_TIMEOUT - ) as acquired: - if not acquired: - LOGGER.warning( - f"TmListener: Blocked on lock acquisition for longer than" - f"{self.DEFAULT_LOCK_TIMEOUT} second!" - ) - self.__route_packets(packet_list) - elapsed_time = time.time() - start_time - if packets_available == 0: - time.sleep(0.1) - - def __route_packets(self, tm_packet_list: TelemetryListT): - """Route given packets. For CCSDS packets, use APID to do this""" - for tm_packet in tm_packet_list: + for tm_packet in packet_list: if self.__tm_type == TmTypes.CCSDS_SPACE_PACKETS: packet_handled = self.__handle_ccsds_space_packet(tm_packet=tm_packet) if packet_handled: continue - # No queue was found - LOGGER.warning("No target queue found, inserting into unknown target queue") - unknown_target_list = self.__queue_dict[UNKNOWN_TARGET_ID] - unknown_target_queue = unknown_target_list[self.QUEUE_DICT_QUEUE_IDX] - if ( - unknown_target_queue.__len__() - > unknown_target_list[self.QUEUE_DICT_MAX_LEN_IDX] - ): - LOGGER.warning("Unknown target queue full. Removing oldest packet..") - unknown_target_queue.pop() - unknown_target_queue.appendleft(tm_packet) def __handle_ccsds_space_packet(self, tm_packet: bytes) -> bool: if len(tm_packet) < 6: LOGGER.warning("TM packet to small to be a CCSDS space packet") else: - apid = get_apid_from_raw_space_packet(raw_packet=tm_packet) - target_queue_list = self.__queue_dict.get(apid) - if target_queue_list is None: - LOGGER.warning(f"No TM handler assigned for APID {apid}") - else: - target_queue = target_queue_list[self.QUEUE_DICT_QUEUE_IDX] - if ( - target_queue.__len__() - > target_queue_list[self.QUEUE_DICT_MAX_LEN_IDX] - ): - LOGGER.warning( - f"Target queue for APID {apid} full. Removing oldest packet.." - ) - target_queue.pop() - target_queue.appendleft(tm_packet) - return True + apid = get_apid_from_raw_space_packet(tm_packet) + return self.__tm_handler.handle_packet(apid, tm_packet) return False From f6136648994d5158575962713ea0b02bc7009669 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 24 Jun 2022 13:07:25 +0200 Subject: [PATCH 076/221] added listener test --- examples/tmtccli.py | 2 +- examples/tmtcgui.py | 2 +- tests/test_tm_handler.py | 56 ++++++++++++++++++++++++---- tmtccmd/ccsds/handler.py | 43 +++++++++++++++------ tmtccmd/com_if/com_interface_base.py | 1 - tmtccmd/runner.py | 4 +- tmtccmd/tm/ccsds_tm_listener.py | 38 +++++-------------- 7 files changed, 95 insertions(+), 51 deletions(-) diff --git a/examples/tmtccli.py b/examples/tmtccli.py index 40cb4459..0e751848 100755 --- a/examples/tmtccli.py +++ b/examples/tmtccli.py @@ -25,7 +25,7 @@ def main(): args = parse_default_tmtccmd_input_arguments(arg_parser, hook_obj) setup_args = SetupArgs(hook_obj=hook_obj, use_gui=False, apid=APID, cli_args=args) apid_handler = ApidTmHandlerBase( - cb=default_ccsds_packet_handler, queue_len=50, user_args=None + cb=default_ccsds_packet_handler, max_queue_len=50, user_args=None ) ccsds_handler = CcsdsTmHandler() ccsds_handler.add_apid_handler(apid=APID, handler=apid_handler) diff --git a/examples/tmtcgui.py b/examples/tmtcgui.py index d0f7cb06..11b67c21 100755 --- a/examples/tmtcgui.py +++ b/examples/tmtcgui.py @@ -17,7 +17,7 @@ def main(): hook_obj = ExampleHookClass(json_cfg_path=default_json_path()) setup_args = SetupArgs(hook_obj=hook_obj, use_gui=True, apid=APID, cli_args=None) apid_handler = ApidTmHandlerBase( - cb=default_ccsds_packet_handler, queue_len=50, user_args=None + cb=default_ccsds_packet_handler, max_queue_len=50, user_args=None ) ccsds_handler = CcsdsTmHandler() ccsds_handler.add_apid_handler(apid=APID, handler=apid_handler) diff --git a/tests/test_tm_handler.py b/tests/test_tm_handler.py index bad8f965..945319d9 100644 --- a/tests/test_tm_handler.py +++ b/tests/test_tm_handler.py @@ -1,17 +1,59 @@ +from collections import deque from unittest import TestCase +from unittest.mock import MagicMock -from tmtccmd.ccsds.handler import ApidTmHandlerBase +from spacepackets.ecss import PusTelemetry +from tmtccmd.ccsds.handler import ( + ApidTmHandlerBase, + CcsdsTmHandler, + UnknownApidHandlerBase, +) +from tmtccmd.com_if.com_interface_base import CommunicationInterface +from tmtccmd.tm.ccsds_tm_listener import CcsdsTmListener -class TmHandler(ApidTmHandlerBase): - def __init__(self): - super().__init__() +class ApidHandler(ApidTmHandlerBase): + def __init__(self, apid: int): + super().__init__(apid, None) self.was_called = False + self.called_times = 0 + self.packet_queue = deque() - def handle_tm_for_apid(self, apid: int, packet: bytes, user_args: any): - self.was_called = True + def handle_tm(self, packet: bytes, user_args: any): + if not self.was_called: + self.was_called = True + self.called_times += 1 + self.packet_queue.appendleft(packet) class TestTmHandler(TestCase): def test_basic(self): - tm_handler = TmHandler() + tm_handler = ApidHandler(0x01) + com_if = MagicMock(specs=CommunicationInterface) + unknown_handler = MagicMock(specs=UnknownApidHandlerBase) + ccsds_handler = CcsdsTmHandler(unknown_handler=unknown_handler) + ccsds_handler.add_apid_handler(tm_handler) + tm_listener = CcsdsTmListener(tm_handler=ccsds_handler, com_if=com_if) + handled_packets = tm_listener.operation() + self.assertEqual(handled_packets, 0) + self.assertTrue(ccsds_handler.has_apid(0x01)) + tm0_raw = PusTelemetry(service=1, subservice=12, apid=0x01).pack() + tm1_raw = PusTelemetry(service=5, subservice=1, apid=0x01).pack() + com_if.receive.return_value = [tm0_raw] + handled_packets = tm_listener.operation() + self.assertEqual(handled_packets, 1) + self.assertTrue(tm_handler.was_called) + self.assertEqual(tm_handler.called_times, 1) + self.assertEqual(tm_handler.packet_queue.pop(), tm0_raw) + com_if.receive.return_value = [tm0_raw, tm1_raw] + handled_packets = tm_listener.operation() + self.assertEqual(handled_packets, 2) + self.assertEqual(tm_handler.called_times, 3) + self.assertEqual(handled_packets, 2) + self.assertEqual(tm_handler.packet_queue.pop(), tm0_raw) + self.assertEqual(tm_handler.packet_queue.pop(), tm1_raw) + unknown_apid = PusTelemetry(service=1, subservice=12, apid=0x02).pack() + com_if.receive.return_value = [unknown_apid] + handled_packets = tm_listener.operation() + self.assertEqual(handled_packets, 1) + unknown_handler.handle_tm.assert_called_once() diff --git a/tmtccmd/ccsds/handler.py b/tmtccmd/ccsds/handler.py index 8d9b00c3..a95157c6 100644 --- a/tmtccmd/ccsds/handler.py +++ b/tmtccmd/ccsds/handler.py @@ -13,14 +13,23 @@ class ApidTmHandlerBase: """Handler base for space packets with an APID. If a packet is received for a certain APID, the :py:func:`handle_tm_for_apid` function will be called""" - def __init__(self, queue_len: int, user_args: any): - self.queue_len: int = queue_len - self.queue = deque(maxlen=queue_len) + def __init__(self, apid: int, user_args: any): + self.apid = apid self.user_args: any = user_args @abc.abstractmethod - def handle_tm_for_apid(self, apid: int, packet: bytes, user_args: any): - pass + def handle_tm(self, _packet: bytes, _user_args: any): + LOGGER.warning(f"No TM handling implemented for APID {self.apid}") + + +class UnknownApidHandlerBase: + def __init__(self, max_queue_len: int, user_args: any): + self.queue = deque(maxlen=max_queue_len) + self.user_args: any = user_args + + @abc.abstractmethod + def handle_tm(self, apid: int, _packet: bytes, _user_args: any): + LOGGER.warning(f"No TM handling implemented for unknown APID {apid}") HandlerDictT = Dict[int, ApidTmHandlerBase] @@ -30,22 +39,34 @@ class CcsdsTmHandler(TmHandlerBase): """Generic CCSDS handler class. The user can create an instance of this class to handle CCSDS packets with different APIDs""" - def __init__(self): + def __init__(self, unknown_handler: UnknownApidHandlerBase): super().__init__(tm_type=TmTypes.CCSDS_SPACE_PACKETS) self._handler_dict: HandlerDictT = dict() + self.unknown_handler = unknown_handler - def add_apid_handler(self, apid: int, handler: ApidTmHandlerBase): + def add_apid_handler(self, handler: ApidTmHandlerBase): """Add a TM handler for a certain APID. The handler is a callback function which will be called if telemetry with that APID arrives - :param apid: CCSDS Application Process ID :param handler: Handler class instance :return: """ - self._handler_dict[apid] = handler + self._handler_dict[handler.apid] = handler + + def has_apid(self, apid: int) -> bool: + return apid in self._handler_dict def handle_packet(self, apid: int, packet: bytes) -> bool: + """Handle a packet with an APID. If a handler exists for the given APID, + it is used to handle the packet. If not, a dedicated handler for unknown APIDs + is called. + + :param apid: + :param packet: + :return: True if the packet was passed to as dedicated APID handler, False otherwise + """ handler = self._handler_dict.get(apid) if handler is None: + self.unknown_handler.handle_tm(apid, packet, self.unknown_handler.user_args) return False - else: - handler.handle_tm_for_apid(apid, packet, handler.user_args) + handler.handle_tm(packet, handler.user_args) + return True diff --git a/tmtccmd/com_if/com_interface_base.py b/tmtccmd/com_if/com_interface_base.py index 6d268004..35dd1dec 100644 --- a/tmtccmd/com_if/com_interface_base.py +++ b/tmtccmd/com_if/com_interface_base.py @@ -6,7 +6,6 @@ from abc import abstractmethod from tmtccmd.tm.definitions import TelemetryListT -from tmtccmd.utility.tmtc_printer import FsfwTmTcPrinter class CommunicationInterface: diff --git a/tmtccmd/runner.py b/tmtccmd/runner.py index 0c076b20..3811e16c 100644 --- a/tmtccmd/runner.py +++ b/tmtccmd/runner.py @@ -215,7 +215,7 @@ def create_default_tmtc_backend( com_if_key=get_global(CoreGlobalIds.COM_IF) ) tm_timeout = get_global(CoreGlobalIds.TM_TIMEOUT) - tm_listener = CcsdsTmListener(com_if=com_if, seq_timeout=tm_timeout) + tm_listener = CcsdsTmListener(com_if=com_if, tm_handler=tm_handler) # The global variables are set by the argument parser. tmtc_backend = CcsdsTmtcBackend( hook_obj=setup_args.hook_obj, @@ -224,7 +224,7 @@ def create_default_tmtc_backend( tm_handler=tm_handler, tc_handler=tc_handler, ) - tmtc_backend.mode = mode + # tmtc_backend.mode = mode tmtc_backend.current_proc_info = ProcedureInfo(service, op_code) tmtc_backend.apid = apid tmtc_backend.one_shot_operation = not get_global( diff --git a/tmtccmd/tm/ccsds_tm_listener.py b/tmtccmd/tm/ccsds_tm_listener.py index 7793bcc1..a10d6d7c 100644 --- a/tmtccmd/tm/ccsds_tm_listener.py +++ b/tmtccmd/tm/ccsds_tm_listener.py @@ -1,18 +1,12 @@ """Contains the TmListener which can be used to listen to Telemetry in the background""" -import sys -import time -import threading -from collections import deque -from typing import Dict, List, Tuple, Optional -from enum import Enum +from typing import Dict, List, Tuple from spacepackets.ccsds.spacepacket import get_apid_from_raw_space_packet from tmtccmd.ccsds.handler import CcsdsTmHandler -from tmtccmd.tm.definitions import TelemetryQueueT, TelemetryListT, TmTypes +from tmtccmd.tm.definitions import TelemetryQueueT from tmtccmd.logging import get_console_logger from tmtccmd.com_if.com_interface_base import CommunicationInterface -from tmtccmd.utility.conf_util import acquire_timeout LOGGER = get_console_logger() @@ -29,29 +23,18 @@ class CcsdsTmListener: or any other software component can get the received packets from the internal deque container. """ - DEFAULT_MODE_OPERATION_TIMEOUT = 300.0 - DEFAULT_UNKNOWN_QUEUE_MAX_LEN = 50 - QUEUE_DICT_QUEUE_IDX = 0 - QUEUE_DICT_MAX_LEN_IDX = 1 - DEFAULT_TM_TIMEOUT = 5.0 - - DEFAULT_LOCK_TIMEOUT = 0.5 - def __init__( self, com_if: CommunicationInterface, tm_handler: CcsdsTmHandler, - seq_timeout: float = DEFAULT_TM_TIMEOUT, - tm_type: TmTypes = TmTypes.CCSDS_SPACE_PACKETS, ): """Initiate a TM listener. :param com_if: Type of communication interface, e.g. a serial or ethernet interface - :param tm_type: Telemetry type. Default to CCSDS space packets for now + :param tm_handler: If valid CCSDS packets are found, they are dispatched to + the passed handler """ self.__com_if = com_if - self.seq_timeout = seq_timeout - self.__tm_type = tm_type self.__tm_handler = tm_handler @property @@ -62,18 +45,17 @@ def com_if(self): def com_if(self, com_if: CommunicationInterface): self.__com_if = com_if - def operation(self): + def operation(self) -> int: packet_list = self.__com_if.receive() for tm_packet in packet_list: - if self.__tm_type == TmTypes.CCSDS_SPACE_PACKETS: - packet_handled = self.__handle_ccsds_space_packet(tm_packet=tm_packet) - if packet_handled: - continue + self.__handle_ccsds_space_packet(tm_packet) + return len(packet_list) - def __handle_ccsds_space_packet(self, tm_packet: bytes) -> bool: + def __handle_ccsds_space_packet(self, tm_packet: bytes): if len(tm_packet) < 6: LOGGER.warning("TM packet to small to be a CCSDS space packet") else: apid = get_apid_from_raw_space_packet(tm_packet) - return self.__tm_handler.handle_packet(apid, tm_packet) + self.__tm_handler.handle_packet(apid, tm_packet) + return True return False From 83f190fcabf475eb6966e5a95ace83db47a0f647 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 24 Jun 2022 15:15:23 +0200 Subject: [PATCH 077/221] added more tests --- tests/test_com_if.py | 50 ++++++++++++++++ tests/test_printer.py | 5 +- tmtccmd/com_if/com_if_utilities.py | 17 +++--- tmtccmd/com_if/dummy_com_if.py | 28 ++++----- tmtccmd/com_if/serial_com_if.py | 1 - tmtccmd/config/__init__.py | 91 +----------------------------- tmtccmd/config/globals.py | 15 +++-- tmtccmd/config/setup.py | 35 ++++++++++++ tmtccmd/runner.py | 3 +- tmtccmd/tm/pus_1_verification.py | 29 +++++++--- tmtccmd/utility/conf_util.py | 4 ++ tmtccmd/utility/json_handler.py | 3 +- 12 files changed, 150 insertions(+), 131 deletions(-) create mode 100644 tests/test_com_if.py create mode 100644 tmtccmd/config/setup.py diff --git a/tests/test_com_if.py b/tests/test_com_if.py new file mode 100644 index 00000000..7b573efe --- /dev/null +++ b/tests/test_com_if.py @@ -0,0 +1,50 @@ +import os +from unittest import TestCase +from unittest.mock import patch + +from tmtccmd.com_if.com_if_utilities import determine_com_if + + +class TestComIF(TestCase): + def setUp(self) -> None: + self.json_file = "test.json" + + def test_com_if_utils(self): + with patch( + "tmtccmd.com_if.com_if_utilities.wrapped_prompt", side_effect=["0", "yes"] + ): + test_dict = {"test-com-if": ("Some more info", None)} + com_if = determine_com_if(test_dict, self.json_file) + self.assertEqual(com_if, "test-com-if") + with open(self.json_file) as file: + lines = file.readlines() + lines[0] = "{\n" + lines[1] = ' "com_if": "test-com-if"\n' + lines[2] = "}" + os.remove(self.json_file) + with patch( + "tmtccmd.com_if.com_if_utilities.wrapped_prompt", side_effect=["0", "no"] + ): + test_dict = {"test-com-if": ("Some more info", None)} + com_if = determine_com_if(test_dict, self.json_file) + self.assertEqual(com_if, "test-com-if") + with open(self.json_file) as file: + lines = file.readlines() + lines[0] = "{}" + with patch( + "tmtccmd.com_if.com_if_utilities.wrapped_prompt", + side_effect=["1", "0", "no"], + ): + test_dict = {"test-com-if": ("Some more info", None)} + com_if = determine_com_if(test_dict, self.json_file) + self.assertEqual(com_if, "test-com-if") + with patch( + "tmtccmd.com_if.com_if_utilities.wrapped_prompt", + side_effect=["blub", "0", "no"], + ): + test_dict = {"test-com-if": ("Some more info", None)} + com_if = determine_com_if(test_dict, self.json_file) + self.assertEqual(com_if, "test-com-if") + + def tearDown(self) -> None: + os.remove(self.json_file) diff --git a/tests/test_printer.py b/tests/test_printer.py index fd6ff480..4351f8d1 100644 --- a/tests/test_printer.py +++ b/tests/test_printer.py @@ -37,7 +37,10 @@ def test_pus_loggers(self): pus_tc = pack_service_17_ping_command(ssc=0) self.raw_tmtc_log.log_tc(pus_tc) pus_tm = Service1TMExtended( - subservice=1, time=CdsShortTimestamp.init_from_current_time() + subservice=1, + time=CdsShortTimestamp.init_from_current_time(), + tc_packet_id=pus_tc.packet_id, + tc_psc=pus_tc.packet_seq_ctrl, ) self.raw_tmtc_log.log_tm(pus_tm.pus_tm) self.assertTrue(Path(self.regular_file_name).exists()) diff --git a/tmtccmd/com_if/com_if_utilities.py b/tmtccmd/com_if/com_if_utilities.py index 18549555..60983427 100644 --- a/tmtccmd/com_if/com_if_utilities.py +++ b/tmtccmd/com_if/com_if_utilities.py @@ -1,6 +1,7 @@ import json from tmtccmd.logging import get_console_logger +from tmtccmd.utility.conf_util import wrapped_prompt from tmtccmd.utility.json_handler import check_json_file, JsonKeyNames from tmtccmd.config.definitions import ComIFDictT @@ -10,7 +11,7 @@ def determine_com_if(com_if_dict: ComIFDictT, json_cfg_path: str) -> str: do_prompt_com_if = False com_if_string = "" - if not check_json_file(json_cfg_path=json_cfg_path): + if not check_json_file(json_cfg_path): do_prompt_com_if = True if not do_prompt_com_if: with open(json_cfg_path, "r") as read: @@ -22,23 +23,25 @@ def determine_com_if(com_if_dict: ComIFDictT, json_cfg_path: str) -> str: do_prompt_com_if = True com_if_string = str(com_if_string) if do_prompt_com_if: - com_if_string = prompt_com_if(com_if_dict=com_if_dict) - save_to_json = input( - "Do you want to store the communication interface? (y/n): " + com_if_string = prompt_com_if(com_if_dict) + save_to_json = wrapped_prompt( + "Do you want to store the communication interface? ([Y]/n): " ) - if save_to_json.lower() in ["y", "yes", "1"]: + if save_to_json.lower() in ["", "y", "yes", "1"]: store_com_if_json(com_if_string=com_if_string, json_cfg_path=json_cfg_path) return com_if_string -def prompt_com_if(com_if_dict: dict) -> str: +def prompt_com_if(com_if_dict: ComIFDictT) -> str: com_if_string = "" while True: com_if_list = [] for index, com_if_value in enumerate(com_if_dict.items()): print(f"{index}: {com_if_value}") com_if_list.append(com_if_value) - com_if_key = input("Please enter the desired communication interface by key: ") + com_if_key = wrapped_prompt( + "Please enter the desired communication interface by key: " + ) if not com_if_key.isdigit(): print("Key is not a digit, try again") continue diff --git a/tmtccmd/com_if/dummy_com_if.py b/tmtccmd/com_if/dummy_com_if.py index 153c234e..f7fc41ba 100644 --- a/tmtccmd/com_if/dummy_com_if.py +++ b/tmtccmd/com_if/dummy_com_if.py @@ -1,5 +1,7 @@ """Dummy Communication Interface. Currently serves to provide an example without external hardware """ +from typing import Optional + from spacepackets.ecss.tc import PusTelecommand from spacepackets.ccsds.spacepacket import ( get_sp_psc_raw, @@ -44,25 +46,18 @@ def receive(self, parameters: any = 0) -> TelemetryListT: def send(self, data: bytearray): if data is not None: - self.dummy_handler.pass_telecommand(data=data) + self.dummy_handler.pass_telecommand(data) class DummyHandler: def __init__(self): - self.last_telecommand = None + self.last_tc: Optional[PusTelecommand] = None self.next_telemetry_package = [] - self.last_tc_ssc = 0 - self.last_tc_packet_id = 0 self.current_ssc = 0 self.reply_pending = False def pass_telecommand(self, data: bytearray): - # TODO: Need TC deserializer for cleaner implementation - self.last_telecommand = data - self.last_tc_ssc = ((data[2] << 8) | data[3]) & 0x3FFF - self.last_service = data[7] - self.last_subservice = data[8] - self.tc_packet_id = data[0] << 8 | data[1] + self.last_tc = PusTelecommand.unpack(data) self.reply_pending = True self.generate_reply_package() @@ -74,16 +69,13 @@ def generate_reply_package(self): - Generate the object representation which would otherwise be generated from the raw bytearray received from an external source """ - if self.last_service == 17: - if self.last_subservice == 1: - tc_psc = get_sp_psc_raw( - seq_flags=SequenceFlags.UNSEGMENTED, - seq_count=self.last_tc_ssc, - ) + if self.last_tc.service == 17: + if self.last_tc.subservice == 1: + tc_psc = self.last_tc.sp_header.psc.raw() tm_packer = Service1TMExtended( subservice=1, ssc=self.current_ssc, - tc_packet_id=self.last_tc_packet_id, + tc_packet_id=self.last_tc.packet_id, tc_psc=tc_psc, ) @@ -93,7 +85,7 @@ def generate_reply_package(self): tm_packer = Service1TMExtended( subservice=7, ssc=self.current_ssc, - tc_packet_id=self.last_tc_packet_id, + tc_packet_id=self.last_tc.packet_id, tc_psc=tc_psc, ) tm_packet_raw = tm_packer.pack() diff --git a/tmtccmd/com_if/serial_com_if.py b/tmtccmd/com_if/serial_com_if.py index 9f98c53d..846dcbcf 100644 --- a/tmtccmd/com_if/serial_com_if.py +++ b/tmtccmd/com_if/serial_com_if.py @@ -264,7 +264,6 @@ def parse_next_packets( end_index = frame_size return end_index next_packet_size = next_payload_len + 7 - # remaining_size = frame_size - start_index if next_packet_size > SERIAL_FRAME_LENGTH: LOGGER.error( diff --git a/tmtccmd/config/__init__.py b/tmtccmd/config/__init__.py index b254f253..3fff69e5 100644 --- a/tmtccmd/config/__init__.py +++ b/tmtccmd/config/__init__.py @@ -1,94 +1,7 @@ -import argparse -from typing import Optional - -from tmtccmd.config.globals import ( - CoreServiceList, - handle_mode_arg, - check_and_set_other_args, - handle_com_if_arg, -) +from tmtccmd.config.globals import CoreServiceList from .definitions import ( CoreGlobalIds, OpCodeDictKeys, default_json_path, ) -from .cfg_hook import TmTcCfgHookBase - - -class SetupArgs: - def __init__( - self, - hook_obj: TmTcCfgHookBase, - use_gui: bool, - apid: int, - cli_args: Optional[argparse.Namespace], - json_cfg_path: Optional[str] = None, - reduced_printout: bool = False, - use_ansi_colors: bool = True, - ): - """This class encapsulates all required objects for the TMTC commander - :param hook_obj: User hook object. Needs to be implemented by the user - :param cli_args: Command line arguments as returned by the ArgumentParser.parse_args method - :param use_gui: Specify whether a GUI is used - :param reduced_printout: - :param use_ansi_colors: - """ - self.hook_obj = hook_obj - self.use_gui = use_gui - self.json_cfg_path = json_cfg_path - self.reduced_printout = reduced_printout - self.ansi_colors = use_ansi_colors - self.cli_args = cli_args - self.json_cfg_path = json_cfg_path - self.tc_apid = apid - self.tm_apid = apid - if json_cfg_path is None: - self.json_cfg_path = default_json_path() - - -""" -def pass_cli_args( - setup_args: SetupArgs, - custom_modes_list: Optional[List[Union[collections.abc.Iterable, Dict]]] = None, - custom_com_if_dict: Dict[str, any] = None, -): - - logger = get_console_logger() - args = setup_args.cli_args - handle_mode_arg(args=args, custom_modes_list=custom_modes_list) - handle_com_if_arg( - args=args, - json_cfg_path=setup_args.json_cfg_path, - custom_com_if_dict=custom_com_if_dict, - ) - - display_mode_param = "long" - if args.sh_display is not None: - if args.sh_display: - display_mode_param = "short" - else: - display_mode_param = "long" - update_global(CoreGlobalIds.DISPLAY_MODE, display_mode_param) - - try: - service_param = args.service - except AttributeError: - logger.warning( - "Passed namespace does not contain the service (-s) argument. " - "Setting test service ID (17)" - ) - service_param = CoreServiceList.SERVICE_17.value - update_global(CoreGlobalIds.CURRENT_SERVICE, service_param) - - if args.op_code is None: - op_code = 0 - else: - op_code = str(args.op_code).lower() - update_global(CoreGlobalIds.OP_CODE, op_code) - - try: - check_and_set_other_args(args=args) - except AttributeError: - logger.exception("Passed arguments are missing components.") - -""" +from tmtccmd.config.cfg_hook import TmTcCfgHookBase diff --git a/tmtccmd/config/globals.py b/tmtccmd/config/globals.py index a4363034..505a4732 100644 --- a/tmtccmd/config/globals.py +++ b/tmtccmd/config/globals.py @@ -2,9 +2,6 @@ import pprint from typing import Union, List, Dict - -from tmtccmd.logging import get_console_logger -from tmtccmd.utility.conf_util import check_args_in_dict from spacepackets.ecss.conf import ( PusVersion, set_default_tc_apid, @@ -12,8 +9,10 @@ set_pus_tc_version, set_pus_tm_version, ) + +from tmtccmd.logging import get_console_logger from tmtccmd.core.globals_manager import update_global, get_global -from .definitions import ( +from tmtccmd.config.definitions import ( CoreGlobalIds, CoreModeList, CoreServiceList, @@ -22,8 +21,8 @@ CoreComInterfaces, ComIFDictT, ) -from tmtccmd.com_if.com_if_utilities import determine_com_if -from .tmtc_defs import TmTcDefWrapper, OpCodeEntry +from tmtccmd.config.tmtc_defs import TmTcDefWrapper, OpCodeEntry + LOGGER = get_console_logger() DEF_WRAPPER = None @@ -106,6 +105,8 @@ def handle_mode_arg( def handle_com_if_arg( args, json_cfg_path: str, custom_com_if_dict: Dict[str, any] = None ): + from tmtccmd.com_if.com_if_utilities import determine_com_if + all_com_ifs = CoreComInterfacesDict if custom_com_if_dict is not None: all_com_ifs = CoreComInterfacesDict.update(custom_com_if_dict) @@ -150,6 +151,8 @@ def check_and_set_core_mode_arg( mode_arg: any, custom_modes_list: Union[None, List[Union[dict, collections.abc.Iterable]]] = None, ) -> int: + from tmtccmd.utility.conf_util import check_args_in_dict + """Checks whether the mode argument is contained inside the core mode list integer enumeration or a custom mode list integer which can be passed optionally. This function will set the single command mode as the global mode parameter if the passed mode diff --git a/tmtccmd/config/setup.py b/tmtccmd/config/setup.py new file mode 100644 index 00000000..79fd0545 --- /dev/null +++ b/tmtccmd/config/setup.py @@ -0,0 +1,35 @@ +import argparse +from typing import Optional + +from tmtccmd.config import TmTcCfgHookBase, default_json_path + + +class SetupArgs: + def __init__( + self, + hook_obj: TmTcCfgHookBase, + use_gui: bool, + apid: int, + cli_args: Optional[argparse.Namespace], + json_cfg_path: Optional[str] = None, + reduced_printout: bool = False, + use_ansi_colors: bool = True, + ): + """This class encapsulates all required objects for the TMTC commander + :param hook_obj: User hook object. Needs to be implemented by the user + :param cli_args: Command line arguments as returned by the ArgumentParser.parse_args method + :param use_gui: Specify whether a GUI is used + :param reduced_printout: + :param use_ansi_colors: + """ + self.hook_obj = hook_obj + self.use_gui = use_gui + self.json_cfg_path = json_cfg_path + self.reduced_printout = reduced_printout + self.ansi_colors = use_ansi_colors + self.cli_args = cli_args + self.json_cfg_path = json_cfg_path + self.tc_apid = apid + self.tm_apid = apid + if json_cfg_path is None: + self.json_cfg_path = default_json_path() diff --git a/tmtccmd/runner.py b/tmtccmd/runner.py index 3811e16c..2b6e9843 100644 --- a/tmtccmd/runner.py +++ b/tmtccmd/runner.py @@ -6,7 +6,8 @@ from spacepackets.ecss.conf import get_default_tc_apid from tmtccmd import __version__ -from tmtccmd.config import SetupArgs, TmTcCfgHookBase, CoreGlobalIds +from tmtccmd.config import TmTcCfgHookBase, CoreGlobalIds +from tmtccmd.config.setup import SetupArgs from tmtccmd.core.ccsds_backend import BackendBase from tmtccmd.core.frontend_base import FrontendBase from tmtccmd.tm.definitions import TmTypes diff --git a/tmtccmd/tm/pus_1_verification.py b/tmtccmd/tm/pus_1_verification.py index 3369c456..1a82b0dc 100644 --- a/tmtccmd/tm/pus_1_verification.py +++ b/tmtccmd/tm/pus_1_verification.py @@ -1,7 +1,15 @@ from __future__ import annotations + +import struct from abc import abstractmethod from typing import Deque +from spacepackets.ccsds.spacepacket import ( + PacketSeqCtrl, + PacketId, + PacketTypes, + SequenceFlags, +) from spacepackets.ccsds.time import CdsShortTimestamp from spacepackets.ecss.tm import PusVersion, PusTelemetry from spacepackets.ecss.pus_1_verification import Service1TM, Subservices @@ -18,9 +26,9 @@ class Service1TMExtended(PusTmBase, PusTmInfoBase, Service1TM): def __init__( self, subservice: int, + tc_packet_id: PacketId, + tc_psc: PacketSeqCtrl, time: CdsShortTimestamp = None, - tc_packet_id: int = 0, - tc_psc: int = 0, ssc: int = 0, source_data: bytearray = bytearray([]), apid: int = -1, @@ -32,6 +40,8 @@ def __init__( ): Service1TM.__init__( self, + tc_packet_id=tc_packet_id, + tc_psc=tc_psc, subservice=subservice, time=time, ssc=ssc, @@ -48,7 +58,11 @@ def __init__( @classmethod def __empty(cls) -> Service1TMExtended: - return cls(subservice=0) + return cls( + subservice=0, + tc_packet_id=PacketId(apid=0, sec_header_flag=False, ptype=PacketTypes.TM), + tc_psc=PacketSeqCtrl(SequenceFlags.CONTINUATION_SEGMENT, 0), + ) @classmethod def unpack( @@ -71,9 +85,10 @@ def unpack( if len(tm_data) < 4: LOGGER.warning("TM data less than 4 bytes!") raise ValueError - service_1_tm.tc_packet_id = tm_data[0] << 8 | tm_data[1] - service_1_tm.tc_psc = tm_data[2] << 8 | tm_data[3] - service_1_tm.tc_ssc = service_1_tm.tc_psc & 0x3FFF + service_1_tm.tc_packet_id = struct.unpack("!H", tm_data[0:2])[0] + service_1_tm.tc_psc = PacketSeqCtrl.from_raw( + struct.unpack("!H", tm_data[2:4])[0] + ) if service_1_tm.subservice % 2 == 0: service_1_tm._handle_failure_verification() else: @@ -83,7 +98,7 @@ def unpack( @abstractmethod def append_telemetry_content(self, content_list: list): super().append_telemetry_content(content_list=content_list) - content_list.append(str(hex(self.tc_packet_id))) + content_list.append(str(hex(self.tc_packet_id.raw()))) content_list.append(str(self.tc_ssc)) if self.has_tc_error_code: if self.is_step_reply: diff --git a/tmtccmd/utility/conf_util.py b/tmtccmd/utility/conf_util.py index 149b4291..e981870b 100644 --- a/tmtccmd/utility/conf_util.py +++ b/tmtccmd/utility/conf_util.py @@ -10,6 +10,10 @@ LOGGER = get_console_logger() +def wrapped_prompt(text: str): + return input(text) + + class AnsiColors: RED = "\x1b[31m" GREEN = "\x1b[32m" diff --git a/tmtccmd/utility/json_handler.py b/tmtccmd/utility/json_handler.py index 442c209a..906edec8 100644 --- a/tmtccmd/utility/json_handler.py +++ b/tmtccmd/utility/json_handler.py @@ -26,7 +26,8 @@ class JsonKeyNames(enum.Enum): def check_json_file(json_cfg_path: str) -> bool: """The check JSON file and return whether it was valid or not. A JSON file is invalid if it does not exist or the format ins invalid. - :return: True if JSON file is valid, False if not and a new one was created at the specified path + :return: True if JSON file is valid, False if not and a new one was created at the + specified path """ if json_cfg_path == "": json_cfg_path = "tmtc_config.json" From 3c08e0cbc84c4c436ee8eb4763f5b796a4d274bf Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 24 Jun 2022 16:46:21 +0200 Subject: [PATCH 078/221] backend simplifications --- tmtccmd/core/backend.py | 14 +++- tmtccmd/core/ccsds_backend.py | 118 +++++++++++---------------------- tmtccmd/tc/ccsds_seq_sender.py | 15 ++++- 3 files changed, 63 insertions(+), 84 deletions(-) diff --git a/tmtccmd/core/backend.py b/tmtccmd/core/backend.py index d54d1384..23ad648b 100644 --- a/tmtccmd/core/backend.py +++ b/tmtccmd/core/backend.py @@ -2,6 +2,7 @@ from abc import abstractmethod from tmtccmd.core.modes import ModeWrapper, TcMode, TmMode +from tmtccmd.tc.ccsds_seq_sender import SeqResultWrapper, SenderMode class Request(enum.IntEnum): @@ -12,9 +13,12 @@ class Request(enum.IntEnum): class BackendState: - def __init__(self): - self._mode_wrapper = ModeWrapper() - self._req = Request.NONE + def __init__( + self, mode_wrapper: ModeWrapper = ModeWrapper(), req: Request = Request.NONE + ): + self._mode_wrapper = mode_wrapper + self._req = req + self._sender_res = SeqResultWrapper(SenderMode.DONE) @property def request(self): @@ -24,6 +28,10 @@ def request(self): def mode(self): return self._mode_wrapper.mode + @property + def sender_res(self): + return self._sender_res + @property def tc_mode(self): return self._mode_wrapper.tc_mode diff --git a/tmtccmd/core/ccsds_backend.py b/tmtccmd/core/ccsds_backend.py index 8aad7e61..9cfc22e4 100644 --- a/tmtccmd/core/ccsds_backend.py +++ b/tmtccmd/core/ccsds_backend.py @@ -1,23 +1,20 @@ import atexit -import time import sys -from threading import Thread -from typing import cast, Optional +from typing import Optional from tmtccmd.config.cfg_hook import TmTcCfgHookBase from tmtccmd.config.definitions import CoreServiceList, CoreModeList from tmtccmd.core.backend import BackendBase, BackendState, Request, BackendController +from tmtccmd.core.modes import TcMode, TmMode from tmtccmd.tc.definitions import ProcedureInfo -from tmtccmd.tc.handler import TcHandlerBase +from tmtccmd.tc.handler import TcHandlerBase, FeedWrapper from tmtccmd.tc.queue import QueueWrapper -from tmtccmd.tm.definitions import TmTypes -from tmtccmd.tm.handler import TmHandlerBase from tmtccmd.logging import get_console_logger from tmtccmd.tc.ccsds_seq_sender import ( SequentialCcsdsSender, + SenderMode, ) from tmtccmd.tm.ccsds_tm_listener import CcsdsTmListener -from tmtccmd.ccsds.handler import CcsdsTmHandler from tmtccmd.com_if.com_interface_base import CommunicationInterface LOGGER = get_console_logger() @@ -28,14 +25,13 @@ class CcsdsTmtcBackend(BackendBase): def __init__( self, + init_state: BackendState, hook_obj: TmTcCfgHookBase, com_if: CommunicationInterface, tm_listener: CcsdsTmListener, - tm_handler: TmHandlerBase, tc_handler: TcHandlerBase, ): - self._state = BackendState() - self._com_if_key = com_if.get_id() + self._state = init_state self.__hook_obj = hook_obj self.__com_if_active = False self.__apid = 0 @@ -47,12 +43,6 @@ def __init__( self.__com_if = com_if self.__tm_listener = tm_listener self._current_proc_info = ProcedureInfo(CoreServiceList.SERVICE_17.value, "0") - if tm_handler.get_type() == TmTypes.CCSDS_SPACE_PACKETS: - self.__tm_handler: CcsdsTmHandler = cast(CcsdsTmHandler, tm_handler) - for apid_queue_len_tuple in self.__tm_handler.get_apid_queue_len_list(): - self.__tm_listener.subscribe_ccsds_tm_handler( - apid_queue_len_tuple[0], apid_queue_len_tuple[1] - ) self.exit_on_com_if_init_failure = True self._queue_wrapper = QueueWrapper(None) self._seq_handler = SequentialCcsdsSender( @@ -63,7 +53,7 @@ def __init__( @property def com_if_id(self): - return self._com_if_key + return self.__com_if.get_id() @property def com_if(self) -> CommunicationInterface: @@ -76,8 +66,7 @@ def tm_listener(self): def try_set_com_if(self, com_if: CommunicationInterface): if not self.com_if_active(): self.__com_if = com_if - self._com_if_key = com_if.get_id() - self.__tm_listener.set_com_if(self.__com_if) + self.__tm_listener.com_if(self.__com_if) else: LOGGER.warning( "Communication Interface is active and must be closed first before " @@ -141,28 +130,21 @@ def start_listener(self, ctrl: BackendController): self.__com_if.open() except IOError: self.__listener_io_error_handler("opened") - try: - self.__tm_listener.start() - except IOError: - self.__listener_io_error_handler("started") self.__com_if_active = True - self.periodic_op(ctrl) - def close_listener(self, join: bool = False, join_timeout_seconds: float = 1.0): + def close_listener(self): """Closes the TM listener and the communication interface. This is started in a separarate thread because the communication interface might still be busy. The completion can be checked with :meth:`tmtccmd.core.backend.is_com_if_active`. Alternatively, waiting on completion is possible by specifying the join argument and a timeout in floating point second. - :param join: - :param join_timeout_seconds: :return: """ - if self.__com_if_active: - close_thread = Thread(target=self.__com_if_closing) - close_thread.start() - if join: - close_thread.join(timeout=join_timeout_seconds) + try: + self.__com_if.close() + except IOError: + self.__listener_io_error_handler("close") + self.__com_if_active = False def periodic_op(self, ctrl: BackendController) -> BackendState: """Periodic operation @@ -189,54 +171,29 @@ def __core_operation(self, one_shot: bool) -> BackendState: self._state.__req = Request.DELAY_LISTENER return self._state - def __com_if_closing(self): - self.__tm_listener.stop() - while True: - if not self.__tm_listener.is_listener_active(): - self.__com_if.close() - self.__com_if_active = False - break - else: - time.sleep(0.2) + def close_com_if(self): + self.__com_if.close() + + def poll_tm(self): + """Poll TM, irrespective of current TM mode""" + self.__tm_listener.operation() def __handle_action(self): """Command handling.""" - # TODO: It should be possible to call this function discretely. This avoids having to - # start receiver threads in the backgrounds. The backend should then perform the - # periodic TM polling here, with a configurable polling frequency. - # In total this needs to be done like this: In One Queue Mode, request a queue - # from the user if there is not one available yet. If one is available, consume it - # on every operation call. If the queue was consumed, request program termination - # or mode change. This is done using the one-shot flag, so the ONE SHOT MODE is tied - # to that flag. - # For multi-mode do the same, but instead of requesting program termination, use - # the feed function of the TC handler to request another queue - # TODO: This this that is done for the listener mode: Do it for all modes with a - # configurable polling delay. TM should be polled and handled independently of TC, - # or tying them together in some way should remain a user option - if self._state.tm_mode == CoreModeList.LISTENER_MODE: - if self.__tm_listener.reply_event(): - LOGGER.info("TmTcHandler: Packets received.") - packet_queues = self.__tm_listener.retrieve_tm_packet_queues(clear=True) - if len(packet_queues) > 0: - self.__tm_handler.handle_packet_queues( - packet_queue_list=packet_queues - ) - self.__tm_listener.clear_reply_event() - elif self.mode == CoreModeList.ONE_QUEUE_MODE: - service_queue = self.__prepare_tc_queue() - if service_queue is None: - return - LOGGER.info("Performing sequential command operation") - # TODO: Some sort of reset mode for sequence handler? In total, we should request - # the queue from the user somehow and then handle it. After finishing the - # handling, request termination from the user. This mode will be optimized - # for handling a single queue, so the default behaviour should be to handle - # the queue and then request program termination. Alternatively, the user should - # be able to switch the mode - self._seq_handler.queue_wrapper = service_queue - seq_res_wrapper = self._seq_handler.operation() - self._state.mode_wrapper.mode = CoreModeList.LISTENER_MODE + if self._state.tm_mode == TmMode.LISTENER: + self.__tm_listener.operation() + elif self._state.tc_mode == TcMode.ONE_QUEUE: + if not self._seq_handler.mode == SenderMode.DONE: + service_queue = self.__prepare_tc_queue() + if service_queue is None: + return + LOGGER.info("Loading TC queue") + self._seq_handler.queue_wrapper = service_queue + self._seq_handler.resume() + self._state._sender_res = self._seq_handler.operation() + if self._seq_handler.mode == SenderMode.DONE: + self._state.mode_wrapper.mode = CoreModeList.LISTENER_MODE + self._state._request = Request.TERMINATION_NO_ERROR elif self.mode == CoreModeList.MULTI_INTERACTIVE_QUEUE_MODE: # TODO: Handle the queue as long as the current one is full. If it is finished, # request another queue or further instructions from the user, maybe in form @@ -252,7 +209,8 @@ def __handle_action(self): LOGGER.error("Custom mode handling module not provided!") def __prepare_tc_queue(self) -> Optional[QueueWrapper]: - service_queue = self.__tc_handler.feed_cb(self.current_proc_info) - if not self.__com_if.valid: + feed_wrapper = FeedWrapper() + self.__tc_handler.feed_cb(self.current_proc_info, feed_wrapper) + if not self.__com_if.valid or not feed_wrapper.dispatch_next_queue: return None - return service_queue + return feed_wrapper.current_queue diff --git a/tmtccmd/tc/ccsds_seq_sender.py b/tmtccmd/tc/ccsds_seq_sender.py index e651eff9..7240dce7 100644 --- a/tmtccmd/tc/ccsds_seq_sender.py +++ b/tmtccmd/tc/ccsds_seq_sender.py @@ -20,6 +20,8 @@ class SenderMode(enum.IntEnum): class SeqResultWrapper: def __init__(self, mode: SenderMode): self.mode = mode + self.longest_rem_delay: float = 0.0 + self.tc_sent: bool = False class SequentialCcsdsSender: @@ -43,6 +45,7 @@ def __init__( self._wait_cd = Countdown(0) self._send_cd = Countdown(queue_wrapper.inter_cmd_delay) self._current_res = SeqResultWrapper(self._mode) + self._current_res.longest_rem_delay = queue_wrapper.inter_cmd_delay self._op_divider = 0 self._last_queue_entry: Optional[TcQueueEntryBase] = None self._last_tc: Optional[TcQueueEntryBase] = None @@ -70,7 +73,8 @@ def resume(self): def operation(self) -> SeqResultWrapper: self._handle_current_tc_queue() - return SeqResultWrapper(self._mode) + self._current_res.mode = self._mode + return self._current_res @property def mode(self): @@ -102,7 +106,10 @@ def _send_next_telecommand(self): """Sends the next telecommand and returns whether an actual telecommand was sent""" next_queue_entry = self.queue_wrapper.queue.pop() if self.check_queue_entry(next_queue_entry): + self._current_res.tc_sent = True self._send_cd.reset() + else: + self._current_res.tc_sent = False self._tc_handler.send_cb(next_queue_entry, self._com_if) if not self.queue_wrapper.queue and self.no_delay_remaining(): self._mode = SenderMode.DONE @@ -132,9 +139,15 @@ def check_queue_entry(self, queue_entry: TcQueueEntryBase) -> bool: wait_entry = cast_wrapper.to_wait_entry() LOGGER.info(f"Waiting for {wait_entry.wait_time} seconds.") self._wait_cd.reset(new_timeout=wait_entry.wait_time) + self._current_res.longest_rem_delay = max( + self._wait_cd.rem_time(), self._send_cd.rem_time() + ) elif queue_entry.etype == TcQueueEntryType.PACKET_DELAY: timeout_entry = cast_wrapper.to_packet_delay_entry() self._send_cd.reset(new_timeout=timeout_entry.timeout_secs) + self._current_res.longest_rem_delay = max( + self._wait_cd.rem_time(), self._send_cd.rem_time() + ) is_tc = False if ( queue_entry.etype == TcQueueEntryType.RAW_TC From e2a8d29792b7ab46e5605ab4d539f5482cf96b1b Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 24 Jun 2022 21:02:05 +0200 Subject: [PATCH 079/221] stuff --- tmtccmd/core/ccsds_backend.py | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/tmtccmd/core/ccsds_backend.py b/tmtccmd/core/ccsds_backend.py index 9cfc22e4..f4b6560d 100644 --- a/tmtccmd/core/ccsds_backend.py +++ b/tmtccmd/core/ccsds_backend.py @@ -1,6 +1,6 @@ import atexit import sys -from typing import Optional +from typing import Optional, Union from tmtccmd.config.cfg_hook import TmTcCfgHookBase from tmtccmd.config.definitions import CoreServiceList, CoreModeList @@ -25,21 +25,28 @@ class CcsdsTmtcBackend(BackendBase): def __init__( self, - init_state: BackendState, + mode: Union[CoreModeList, int], hook_obj: TmTcCfgHookBase, com_if: CommunicationInterface, tm_listener: CcsdsTmListener, tc_handler: TcHandlerBase, ): - self._state = init_state + self._state = BackendState() + self._state.mode_wrapper.mode = mode + if mode == CoreModeList.LISTENER_MODE: + self._state.mode_wrapper.tm_mode = TmMode.LISTENER + self._state.mode_wrapper.tc_mode = TcMode.IDLE + elif mode == CoreModeList.ONE_QUEUE_MODE: + self._state.mode_wrapper.tm_mode = TmMode.LISTENER + self._state.mode_wrapper.tc_mode = TcMode.ONE_QUEUE + elif mode == CoreModeList.MULTI_INTERACTIVE_QUEUE_MODE: + self._state.mode_wrapper.tc_mode = TcMode.MULTI_QUEUE + self._state.mode_wrapper.tm_mode = TmMode.LISTENER self.__hook_obj = hook_obj self.__com_if_active = False self.__apid = 0 self.__tc_handler = tc_handler - # This flag could be used later to command the TMTC Client with a front-end - self.one_shot_operation = False - self.__com_if = com_if self.__tm_listener = tm_listener self._current_proc_info = ProcedureInfo(CoreServiceList.SERVICE_17.value, "0") @@ -152,7 +159,7 @@ def periodic_op(self, ctrl: BackendController) -> BackendState: :raises IOError: Yields informative output and propagates exception :""" try: - return self.__core_operation(self.one_shot_operation) + return self.__core_operation() except KeyboardInterrupt as e: LOGGER.info("Keyboard Interrupt.") raise e @@ -160,15 +167,12 @@ def periodic_op(self, ctrl: BackendController) -> BackendState: LOGGER.exception("IO Error occured") raise e - def __core_operation(self, one_shot: bool) -> BackendState: + def __core_operation(self) -> BackendState: self.__handle_action() - if one_shot: - self._state.__req = Request.TERMINATION_NO_ERROR - else: - if self.mode == CoreModeList.IDLE: - self._state.__req = Request.DELAY_IDLE - elif self.mode == CoreModeList.LISTENER_MODE: - self._state.__req = Request.DELAY_LISTENER + if self.mode == CoreModeList.IDLE: + self._state.__req = Request.DELAY_IDLE + elif self.mode == CoreModeList.LISTENER_MODE: + self._state.__req = Request.DELAY_LISTENER return self._state def close_com_if(self): From 67afa93f0f3f7c9d77e3babae847288a000cfca4 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 24 Jun 2022 23:46:36 +0200 Subject: [PATCH 080/221] continued backend changes --- tmtccmd/core/backend.py | 1 + tmtccmd/core/ccsds_backend.py | 64 +++++++++++++++++++++++------------ 2 files changed, 44 insertions(+), 21 deletions(-) diff --git a/tmtccmd/core/backend.py b/tmtccmd/core/backend.py index 23ad648b..a99ea565 100644 --- a/tmtccmd/core/backend.py +++ b/tmtccmd/core/backend.py @@ -52,6 +52,7 @@ def __init__(self): class BackendBase: + @abstractmethod def initialize(self): """Initialize the backend. Raise RuntimeError or ValueError on failure""" diff --git a/tmtccmd/core/ccsds_backend.py b/tmtccmd/core/ccsds_backend.py index f4b6560d..79db2d37 100644 --- a/tmtccmd/core/ccsds_backend.py +++ b/tmtccmd/core/ccsds_backend.py @@ -66,6 +66,22 @@ def com_if_id(self): def com_if(self) -> CommunicationInterface: return self.__com_if + @property + def tc_mode(self): + return self._state.mode_wrapper.tc_mode + + @property + def tm_mode(self): + return self._state.mode_wrapper.tm_mode + + @tc_mode.setter + def tc_mode(self, tc_mode: TcMode): + self.mode_wrapper._tc_mode = tc_mode + + @tm_mode.setter + def tm_mode(self, tm_mode: TmMode): + self.mode_wrapper._tm_mode = tm_mode + @property def tm_listener(self): return self.__tm_listener @@ -168,7 +184,7 @@ def periodic_op(self, ctrl: BackendController) -> BackendState: raise e def __core_operation(self) -> BackendState: - self.__handle_action() + self.default_operation() if self.mode == CoreModeList.IDLE: self._state.__req = Request.DELAY_IDLE elif self.mode == CoreModeList.LISTENER_MODE: @@ -182,35 +198,41 @@ def poll_tm(self): """Poll TM, irrespective of current TM mode""" self.__tm_listener.operation() - def __handle_action(self): + def default_operation(self): """Command handling.""" + self.tm_operation() + self.tc_operation() + self.__hook_obj.perform_mode_operation( + mode=self.mode, tmtc_backend=self + ) + + def tm_operation(self): if self._state.tm_mode == TmMode.LISTENER: self.__tm_listener.operation() - elif self._state.tc_mode == TcMode.ONE_QUEUE: - if not self._seq_handler.mode == SenderMode.DONE: - service_queue = self.__prepare_tc_queue() - if service_queue is None: - return - LOGGER.info("Loading TC queue") - self._seq_handler.queue_wrapper = service_queue - self._seq_handler.resume() - self._state._sender_res = self._seq_handler.operation() + + def tc_operation(self): + if self._state.tc_mode == TcMode.ONE_QUEUE: + self.__check_and_execute_seq_send() if self._seq_handler.mode == SenderMode.DONE: - self._state.mode_wrapper.mode = CoreModeList.LISTENER_MODE + self._state.mode_wrapper.tc_mode = TcMode.IDLE self._state._request = Request.TERMINATION_NO_ERROR elif self.mode == CoreModeList.MULTI_INTERACTIVE_QUEUE_MODE: # TODO: Handle the queue as long as the current one is full. If it is finished, # request another queue or further instructions from the user, maybe in form # of a special object, using the TC handler feed function - pass - else: - try: - self.__hook_obj.perform_mode_operation( - mode=self.mode, tmtc_backend=self - ) - except ImportError as error: - print(error) - LOGGER.error("Custom mode handling module not provided!") + self.__check_and_execute_seq_send() + + + + def __check_and_execute_seq_send(self): + if not self._seq_handler.mode == SenderMode.DONE: + service_queue = self.__prepare_tc_queue() + if service_queue is None: + return + LOGGER.info("Loading TC queue") + self._seq_handler.queue_wrapper = service_queue + self._seq_handler.resume() + self._state._sender_res = self._seq_handler.operation() def __prepare_tc_queue(self) -> Optional[QueueWrapper]: feed_wrapper = FeedWrapper() From b210e1eb42aac939a8ba0c1847718e09779ab893 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Sat, 25 Jun 2022 00:48:42 +0200 Subject: [PATCH 081/221] continue refactoring --- tests/test_seq_sender.py | 4 +- tmtccmd/ccsds/handler.py | 3 +- tmtccmd/cfdp/handler.py | 2 +- tmtccmd/config/args.py | 14 ++-- tmtccmd/config/definitions.py | 17 +++++ tmtccmd/config/setup.py | 4 +- tmtccmd/core/backend.py | 16 ++--- tmtccmd/core/ccsds_backend.py | 110 ++++++++++++-------------------- tmtccmd/core/modes.py | 3 - tmtccmd/logging/pus.py | 2 +- tmtccmd/runner.py | 32 +++++----- tmtccmd/utility/exit_handler.py | 7 +- 12 files changed, 96 insertions(+), 118 deletions(-) diff --git a/tests/test_seq_sender.py b/tests/test_seq_sender.py index b82ca1f5..5a656b1f 100644 --- a/tests/test_seq_sender.py +++ b/tests/test_seq_sender.py @@ -30,7 +30,7 @@ def test_basic(self): seq_sender.operation() tc_handler_mock.send_cb.assert_called_with(ANY, com_if) call_args = tc_handler_mock.send_cb.call_args - self.assertEqual(call_args.args[0].tc, bytes([0, 1, 2])) + self.assertEqual(call_args.args_converted[0].tc, bytes([0, 1, 2])) # Queue should be empty now self.assertFalse(queue_wrapper.queue) self.assertEqual(seq_sender.mode, SenderMode.DONE) @@ -43,4 +43,4 @@ def test_basic(self): self.assertEqual(res.mode, SenderMode.BUSY) tc_handler_mock.send_cb.assert_called_with(ANY, com_if) call_args = tc_handler_mock.send_cb.call_args - self.assertEqual(call_args.args[0].tc, bytes([3, 2, 1])) + self.assertEqual(call_args.args_converted[0].tc, bytes([3, 2, 1])) diff --git a/tmtccmd/ccsds/handler.py b/tmtccmd/ccsds/handler.py index a95157c6..c37c3025 100644 --- a/tmtccmd/ccsds/handler.py +++ b/tmtccmd/ccsds/handler.py @@ -23,8 +23,7 @@ def handle_tm(self, _packet: bytes, _user_args: any): class UnknownApidHandlerBase: - def __init__(self, max_queue_len: int, user_args: any): - self.queue = deque(maxlen=max_queue_len) + def __init__(self, user_args: any): self.user_args: any = user_args @abc.abstractmethod diff --git a/tmtccmd/cfdp/handler.py b/tmtccmd/cfdp/handler.py index 21985836..973ae735 100644 --- a/tmtccmd/cfdp/handler.py +++ b/tmtccmd/cfdp/handler.py @@ -185,7 +185,7 @@ def __get_next_seq_num(self) -> bytes: raise SequenceNumberOverflow return struct.pack("!I", self.seq_num) - def pass_packet(self, apid: int, raw_tm_packet: bytes, args: Any): + def pass_packet(self, raw_tm_packet: bytes): pass def put_request(self, put_request: PutRequest): diff --git a/tmtccmd/config/args.py b/tmtccmd/config/args.py index 6e11082f..72ace8de 100644 --- a/tmtccmd/config/args.py +++ b/tmtccmd/config/args.py @@ -58,22 +58,24 @@ def __init__( self.print_known_args = False self.print_unknown_args = False self.unknown_args = [""] - self.args = ArgsGroup("", "", "") + self.args_converted = ArgsGroup("", "", "") + self.args_raw = None def add_default_tmtccmd_args(self): add_default_tmtccmd_args(self.args_parser) def parse(self, hook_obj: TmTcCfgHookBase): - args, self.unknown_args = parse_default_tmtccmd_input_arguments( + self.args_raw, self.unknown_args = parse_default_tmtccmd_input_arguments( self.args_parser, hook_obj, print_known_args=self.print_known_args, print_unknown_args=self.print_unknown_args, ) - self.args.service = args.service - self.args.op_code = args.op_code - self.args.mode = args.mode - self.args.listener = args.listener + self.args_converted.service = self.args_raw.service + self.args_converted.op_code = self.args_raw.op_code + self.args_converted.mode = self.args_raw.mode + self.args_converted.listener = self.args_raw.listener + self.args_converted.interactive = self.args_raw.interactive def add_default_tmtccmd_args(parser: argparse.ArgumentParser): diff --git a/tmtccmd/config/definitions.py b/tmtccmd/config/definitions.py index fa4b93c1..64f44f63 100644 --- a/tmtccmd/config/definitions.py +++ b/tmtccmd/config/definitions.py @@ -3,6 +3,8 @@ import enum from typing import Tuple, Dict +from tmtccmd.core.modes import ModeWrapper, TmMode, TcMode + def default_json_path() -> str: return "tmtc_conf.json" @@ -108,6 +110,21 @@ class CoreModeList(enum.IntEnum): } +def backend_mode_conversion(mode: CoreModeList, mode_wrapper: ModeWrapper): + if mode == CoreModeList.LISTENER_MODE: + mode_wrapper.tm_mode = TmMode.LISTENER + mode_wrapper.tc_mode = TcMode.IDLE + elif mode == CoreModeList.ONE_QUEUE_MODE: + mode_wrapper.tm_mode = TmMode.LISTENER + mode_wrapper.tc_mode = TcMode.ONE_QUEUE + elif mode == CoreModeList.MULTI_INTERACTIVE_QUEUE_MODE: + mode_wrapper.tc_mode = TcMode.MULTI_QUEUE + mode_wrapper.tm_mode = TmMode.LISTENER + elif mode == CoreModeList.GUI_MODE: + mode_wrapper.tc_mode = TcMode.MULTI_QUEUE + mode_wrapper.tm_mode = TmMode.IDLE + + class CoreServiceList(enum.Enum): SERVICE_2 = "2" SERVICE_3 = "3" diff --git a/tmtccmd/config/setup.py b/tmtccmd/config/setup.py index 79fd0545..ad1ffa7b 100644 --- a/tmtccmd/config/setup.py +++ b/tmtccmd/config/setup.py @@ -1,7 +1,7 @@ -import argparse from typing import Optional from tmtccmd.config import TmTcCfgHookBase, default_json_path +from tmtccmd.config.args import ArgParserWrapper class SetupArgs: @@ -10,7 +10,7 @@ def __init__( hook_obj: TmTcCfgHookBase, use_gui: bool, apid: int, - cli_args: Optional[argparse.Namespace], + cli_args: Optional[ArgParserWrapper], json_cfg_path: Optional[str] = None, reduced_printout: bool = False, use_ansi_colors: bool = True, diff --git a/tmtccmd/core/backend.py b/tmtccmd/core/backend.py index a99ea565..3d043f18 100644 --- a/tmtccmd/core/backend.py +++ b/tmtccmd/core/backend.py @@ -10,6 +10,8 @@ class Request(enum.IntEnum): TERMINATION_NO_ERROR = 1 DELAY_IDLE = 2 DELAY_LISTENER = 3 + DELAY_CUSTOM = 4 + CALL_NEXT = 5 class BackendState: @@ -18,15 +20,16 @@ def __init__( ): self._mode_wrapper = mode_wrapper self._req = req + self._recommended_delay = 0 self._sender_res = SeqResultWrapper(SenderMode.DONE) @property - def request(self): - return self._req + def next_delay(self): + return self._recommended_delay @property - def mode(self): - return self._mode_wrapper.mode + def request(self): + return self._req @property def sender_res(self): @@ -52,11 +55,6 @@ def __init__(self): class BackendBase: - - @abstractmethod - def initialize(self): - """Initialize the backend. Raise RuntimeError or ValueError on failure""" - @abstractmethod def start_listener(self, perform_op_immediately: bool): """Start the backend. Raise RuntimeError on failure""" diff --git a/tmtccmd/core/ccsds_backend.py b/tmtccmd/core/ccsds_backend.py index 79db2d37..05ab2c1d 100644 --- a/tmtccmd/core/ccsds_backend.py +++ b/tmtccmd/core/ccsds_backend.py @@ -1,8 +1,7 @@ import atexit import sys -from typing import Optional, Union +from typing import Optional -from tmtccmd.config.cfg_hook import TmTcCfgHookBase from tmtccmd.config.definitions import CoreServiceList, CoreModeList from tmtccmd.core.backend import BackendBase, BackendState, Request, BackendController from tmtccmd.core.modes import TcMode, TmMode @@ -25,26 +24,19 @@ class CcsdsTmtcBackend(BackendBase): def __init__( self, - mode: Union[CoreModeList, int], - hook_obj: TmTcCfgHookBase, + tc_mode: TcMode, + tm_mode: TmMode, com_if: CommunicationInterface, tm_listener: CcsdsTmListener, tc_handler: TcHandlerBase, ): + from tmtccmd.utility.exit_handler import keyboard_interrupt_handler + self._state = BackendState() - self._state.mode_wrapper.mode = mode - if mode == CoreModeList.LISTENER_MODE: - self._state.mode_wrapper.tm_mode = TmMode.LISTENER - self._state.mode_wrapper.tc_mode = TcMode.IDLE - elif mode == CoreModeList.ONE_QUEUE_MODE: - self._state.mode_wrapper.tm_mode = TmMode.LISTENER - self._state.mode_wrapper.tc_mode = TcMode.ONE_QUEUE - elif mode == CoreModeList.MULTI_INTERACTIVE_QUEUE_MODE: - self._state.mode_wrapper.tc_mode = TcMode.MULTI_QUEUE - self._state.mode_wrapper.tm_mode = TmMode.LISTENER - self.__hook_obj = hook_obj + self._state.mode_wrapper.tc_mode = tc_mode + self._state.mode_wrapper.tm_mode = tm_mode + self.__com_if_active = False - self.__apid = 0 self.__tc_handler = tc_handler self.__com_if = com_if @@ -57,6 +49,9 @@ def __init__( tc_handler=tc_handler, queue_wrapper=self._queue_wrapper, ) + atexit.register( + keyboard_interrupt_handler, tmtc_backend=self, com_interface=self.__com_if + ) @property def com_if_id(self): @@ -76,11 +71,11 @@ def tm_mode(self): @tc_mode.setter def tc_mode(self, tc_mode: TcMode): - self.mode_wrapper._tc_mode = tc_mode + self._state.mode_wrapper._tc_mode = tc_mode @tm_mode.setter def tm_mode(self, tm_mode: TmMode): - self.mode_wrapper._tm_mode = tm_mode + self._state.mode_wrapper._tm_mode = tm_mode @property def tm_listener(self): @@ -107,39 +102,13 @@ def current_proc_info(self) -> ProcedureInfo: def current_proc_info(self, proc_info: ProcedureInfo): self._current_proc_info = proc_info - @property - def apid(self) -> int: - return self.__apid - - @apid.setter - def apid(self, apid: int): - self.__apid = apid - - @property - def mode(self): - return self._state.mode - @staticmethod def start_handler(executed_handler, ctrl: BackendController): if not isinstance(executed_handler, CcsdsTmtcBackend): LOGGER.error("Unexpected argument, should be TmTcHandler!") sys.exit(1) - executed_handler.initialize() executed_handler.start_listener(ctrl) - def initialize(self): - from tmtccmd.utility.exit_handler import keyboard_interrupt_handler - - """ - Perform initialization steps which might be necessary after class construction. - This has to be called at some point before using the class! - """ - if self.mode == CoreModeList.LISTENER_MODE: - LOGGER.info("Running in listener mode..") - atexit.register( - keyboard_interrupt_handler, tmtc_backend=self, com_interface=self.__com_if - ) - def __listener_io_error_handler(self, ctx: str): LOGGER.error(f"Communication Interface could not be {ctx}") LOGGER.info("TM listener will not be started") @@ -175,7 +144,7 @@ def periodic_op(self, ctrl: BackendController) -> BackendState: :raises IOError: Yields informative output and propagates exception :""" try: - return self.__core_operation() + return self.default_operation() except KeyboardInterrupt as e: LOGGER.info("Keyboard Interrupt.") raise e @@ -183,13 +152,33 @@ def periodic_op(self, ctrl: BackendController) -> BackendState: LOGGER.exception("IO Error occured") raise e - def __core_operation(self) -> BackendState: - self.default_operation() - if self.mode == CoreModeList.IDLE: + def default_operation(self) -> BackendState: + """Command handling.""" + self.tm_operation() + self.tc_operation() + self.mode_to_req() + return self._state + + def mode_to_req(self): + if self.tc_mode == TcMode.IDLE and self.tm_mode == TmMode.IDLE: self._state.__req = Request.DELAY_IDLE - elif self.mode == CoreModeList.LISTENER_MODE: + elif self.tm_mode == TmMode.LISTENER and self.tc_mode == CoreModeList.IDLE: self._state.__req = Request.DELAY_LISTENER - return self._state + elif self._seq_handler.mode == SenderMode.DONE: + if self._state.tc_mode == TcMode.ONE_QUEUE: + self._state.mode_wrapper.tc_mode = TcMode.IDLE + self._state._request = Request.TERMINATION_NO_ERROR + elif self._state.tc_mode == TcMode.MULTI_QUEUE: + self._state.mode_wrapper.tc_mode = TcMode.IDLE + self._state._request = Request.CALL_NEXT + else: + if self._state.sender_res.longest_rem_delay > 0: + self._state._recommended_delay = ( + self._state.sender_res.longest_rem_delay + ) + self._state._request = Request.DELAY_CUSTOM + else: + self._state._request = Request.CALL_NEXT def close_com_if(self): self.__com_if.close() @@ -198,31 +187,12 @@ def poll_tm(self): """Poll TM, irrespective of current TM mode""" self.__tm_listener.operation() - def default_operation(self): - """Command handling.""" - self.tm_operation() - self.tc_operation() - self.__hook_obj.perform_mode_operation( - mode=self.mode, tmtc_backend=self - ) - def tm_operation(self): if self._state.tm_mode == TmMode.LISTENER: self.__tm_listener.operation() def tc_operation(self): - if self._state.tc_mode == TcMode.ONE_QUEUE: - self.__check_and_execute_seq_send() - if self._seq_handler.mode == SenderMode.DONE: - self._state.mode_wrapper.tc_mode = TcMode.IDLE - self._state._request = Request.TERMINATION_NO_ERROR - elif self.mode == CoreModeList.MULTI_INTERACTIVE_QUEUE_MODE: - # TODO: Handle the queue as long as the current one is full. If it is finished, - # request another queue or further instructions from the user, maybe in form - # of a special object, using the TC handler feed function - self.__check_and_execute_seq_send() - - + self.__check_and_execute_seq_send() def __check_and_execute_seq_send(self): if not self._seq_handler.mode == SenderMode.DONE: diff --git a/tmtccmd/core/modes.py b/tmtccmd/core/modes.py index f9e26f9a..12d77915 100644 --- a/tmtccmd/core/modes.py +++ b/tmtccmd/core/modes.py @@ -1,7 +1,5 @@ import enum -from tmtccmd.config.definitions import CoreModeList - class TcMode(enum.IntEnum): IDLE = 0 @@ -16,6 +14,5 @@ class TmMode(enum.IntEnum): class ModeWrapper: def __init__(self): - self.mode = CoreModeList.ONE_QUEUE_MODE self.tc_mode = TcMode.IDLE self.tm_mode = TmMode.IDLE diff --git a/tmtccmd/logging/pus.py b/tmtccmd/logging/pus.py index fb858593..911edb31 100644 --- a/tmtccmd/logging/pus.py +++ b/tmtccmd/logging/pus.py @@ -158,7 +158,7 @@ def __init__(self, file_name: Optional[str] = None): else: self.file_name = file_name self.logger = logging.getLogger(TMTC_LOGGER_NAME) - file_handler = FileHandler(file_name) + file_handler = FileHandler(self.file_name) formatter = logging.Formatter() file_handler.setFormatter(formatter) self.logger.addHandler(file_handler) diff --git a/tmtccmd/runner.py b/tmtccmd/runner.py index 2b6e9843..0e52d541 100644 --- a/tmtccmd/runner.py +++ b/tmtccmd/runner.py @@ -6,6 +6,8 @@ from spacepackets.ecss.conf import get_default_tc_apid from tmtccmd import __version__ +from tmtccmd.core.ccsds_backend import CcsdsTmtcBackend +from tmtccmd.tm.ccsds_tm_listener import CcsdsTmListener from tmtccmd.config import TmTcCfgHookBase, CoreGlobalIds from tmtccmd.config.setup import SetupArgs from tmtccmd.core.ccsds_backend import BackendBase @@ -117,16 +119,11 @@ def __assign_tmtc_commander_hooks(hook_object: TmTcCfgHookBase): update_global(CoreGlobalIds.TMTC_HOOK, hook_object) -def init_printout(use_gui: bool, ansi_colors: bool = True): - if ansi_colors: - print(f"-- Python TMTC Commander --") +def init_printout(use_gui: bool): if use_gui: - print("-- GUI mode --") + print(f"-- tmtccmd v{version()} GUI Mode --") else: - print("-- Command line mode --") - - print(f"-- tmtccmd version v{version()} --") - LOGGER.info("Starting TMTC Commander..") + print(f"-- tmtccmd v{version()} CLI Mode --") def __handle_cli_args_and_globals(setup_args: SetupArgs): @@ -142,8 +139,7 @@ def __handle_cli_args_and_globals(setup_args: SetupArgs): def __start_tmtc_commander_cli( tmtc_backend: BackendBase, perform_op_immediately: bool = True ): - __get_backend_init_variables() - tmtc_backend.initialize() + # __get_backend_init_variables() tmtc_backend.start_listener(perform_op_immediately) @@ -176,12 +172,14 @@ def __start_tmtc_commander_qt_gui( sys.exit(1) +""" def __get_backend_init_variables(): service = get_global(CoreGlobalIds.CURRENT_SERVICE) op_code = get_global(CoreGlobalIds.OP_CODE) com_if = get_global(CoreGlobalIds.COM_IF) mode = get_global(CoreGlobalIds.MODE) return service, op_code, com_if, mode +""" def create_default_tmtc_backend( @@ -195,14 +193,13 @@ def create_default_tmtc_backend( :return: """ global __SETUP_WAS_CALLED - from tmtccmd.core.ccsds_backend import CcsdsTmtcBackend - from tmtccmd.tm.ccsds_tm_listener import CcsdsTmListener + from typing import cast if not __SETUP_WAS_CALLED: LOGGER.warning("setup_tmtccmd was not called first. Call it first") sys.exit(1) - service, op_code, com_if_id, mode = __get_backend_init_variables() + # service, op_code, com_if_id, mode = __get_backend_init_variables() if tm_handler is None: LOGGER.warning( "No TM Handler specified! Make sure to specify at least one TM handler" @@ -217,16 +214,17 @@ def create_default_tmtc_backend( ) tm_timeout = get_global(CoreGlobalIds.TM_TIMEOUT) tm_listener = CcsdsTmListener(com_if=com_if, tm_handler=tm_handler) + # The global variables are set by the argument parser. tmtc_backend = CcsdsTmtcBackend( - hook_obj=setup_args.hook_obj, com_if=com_if, tm_listener=tm_listener, - tm_handler=tm_handler, tc_handler=tc_handler, ) - # tmtc_backend.mode = mode - tmtc_backend.current_proc_info = ProcedureInfo(service, op_code) + tmtc_backend.current_proc_info = ProcedureInfo( + setup_args.cli_args.args_converted.service, + setup_args.cli_args.args_converted.op_code, + ) tmtc_backend.apid = apid tmtc_backend.one_shot_operation = not get_global( CoreGlobalIds.USE_LISTENER_AFTER_OP diff --git a/tmtccmd/utility/exit_handler.py b/tmtccmd/utility/exit_handler.py index 0819512a..81d625af 100644 --- a/tmtccmd/utility/exit_handler.py +++ b/tmtccmd/utility/exit_handler.py @@ -1,15 +1,12 @@ import signal -from tmtccmd.com_if.com_interface_base import CommunicationInterface from tmtccmd.core.ccsds_backend import CcsdsTmtcBackend from tmtccmd.logging import get_console_logger LOGGER = get_console_logger() -def keyboard_interrupt_handler( - tmtc_backend: CcsdsTmtcBackend, com_interface: CommunicationInterface -): - tmtc_backend.close_listener(join=True, join_timeout_seconds=1.0) +def keyboard_interrupt_handler(tmtc_backend: CcsdsTmtcBackend): + tmtc_backend.close_listener() LOGGER.info("Closing TMTC client") From 03bbd53da2833fa7ca85ffc0b163f9d5739ceb55 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Sat, 25 Jun 2022 01:03:12 +0200 Subject: [PATCH 082/221] have to get rid of those annoying globals.. --- tmtccmd/config/args.py | 19 ++++++++++++++++++- tmtccmd/config/globals.py | 12 +++++------- tmtccmd/config/setup.py | 9 ++++----- tmtccmd/runner.py | 18 ++++++++---------- 4 files changed, 35 insertions(+), 23 deletions(-) diff --git a/tmtccmd/config/args.py b/tmtccmd/config/args.py index 72ace8de..93d36692 100644 --- a/tmtccmd/config/args.py +++ b/tmtccmd/config/args.py @@ -40,6 +40,7 @@ class ArgsGroup: service: str op_code: str mode: str + com_if: str listener: bool = False interactive: bool = False @@ -58,7 +59,7 @@ def __init__( self.print_known_args = False self.print_unknown_args = False self.unknown_args = [""] - self.args_converted = ArgsGroup("", "", "") + self.args_converted = ArgsGroup("", "", "", "") self.args_raw = None def add_default_tmtccmd_args(self): @@ -77,6 +78,22 @@ def parse(self, hook_obj: TmTcCfgHookBase): self.args_converted.listener = self.args_raw.listener self.args_converted.interactive = self.args_raw.interactive + @property + def service(self): + return self.args_converted.service + + @property + def op_code(self): + return self.args_converted.op_code + + @property + def mode(self): + return self.args_converted.mode + + @property + def com_if(self): + return self.args_converted.com_if + def add_default_tmtccmd_args(parser: argparse.ArgumentParser): add_default_mode_arguments(parser) diff --git a/tmtccmd/config/globals.py b/tmtccmd/config/globals.py index 505a4732..2a59c2e9 100644 --- a/tmtccmd/config/globals.py +++ b/tmtccmd/config/globals.py @@ -22,7 +22,7 @@ ComIFDictT, ) from tmtccmd.config.tmtc_defs import TmTcDefWrapper, OpCodeEntry - +from tmtccmd.utility.conf_util import check_args_in_dict LOGGER = get_console_logger() DEF_WRAPPER = None @@ -46,9 +46,7 @@ def get_glob_com_if_dict() -> ComIFDictT: def set_default_globals_pre_args_parsing( - gui: bool, - tc_apid: int, - tm_apid: int, + apid: int, pus_tc_version: PusVersion = PusVersion.PUS_C, pus_tm_version: PusVersion = PusVersion.PUS_C, com_if_id: str = CoreComInterfaces.DUMMY.value, @@ -60,8 +58,8 @@ def set_default_globals_pre_args_parsing( ): if custom_com_if_dict is None: custom_com_if_dict = dict() - set_default_tc_apid(tc_apid=tc_apid) - set_default_tm_apid(tm_apid=tm_apid) + set_default_tc_apid(tc_apid=apid) + set_default_tm_apid(tm_apid=apid) set_pus_tc_version(pus_tc_version) set_pus_tm_version(pus_tm_version) update_global(CoreGlobalIds.COM_IF, com_if_id) @@ -111,7 +109,7 @@ def handle_com_if_arg( if custom_com_if_dict is not None: all_com_ifs = CoreComInterfacesDict.update(custom_com_if_dict) try: - com_if_key = str(args._com_if) + com_if_key = str(args.com_if) except AttributeError: LOGGER.warning("No communication interface specified") LOGGER.warning("Trying to set from existing configuration..") diff --git a/tmtccmd/config/setup.py b/tmtccmd/config/setup.py index ad1ffa7b..0c9c3f75 100644 --- a/tmtccmd/config/setup.py +++ b/tmtccmd/config/setup.py @@ -10,26 +10,25 @@ def __init__( hook_obj: TmTcCfgHookBase, use_gui: bool, apid: int, - cli_args: Optional[ArgParserWrapper], + args_wrapper: Optional[ArgParserWrapper], json_cfg_path: Optional[str] = None, reduced_printout: bool = False, use_ansi_colors: bool = True, ): """This class encapsulates all required objects for the TMTC commander :param hook_obj: User hook object. Needs to be implemented by the user - :param cli_args: Command line arguments as returned by the ArgumentParser.parse_args method + :param args_wrapper: Command line arguments as returned by the ArgumentParser.parse_args method :param use_gui: Specify whether a GUI is used :param reduced_printout: :param use_ansi_colors: """ self.hook_obj = hook_obj self.use_gui = use_gui + self.apid = apid self.json_cfg_path = json_cfg_path self.reduced_printout = reduced_printout self.ansi_colors = use_ansi_colors - self.cli_args = cli_args + self.args_wrapper = args_wrapper self.json_cfg_path = json_cfg_path - self.tc_apid = apid - self.tm_apid = apid if json_cfg_path is None: self.json_cfg_path = default_json_path() diff --git a/tmtccmd/runner.py b/tmtccmd/runner.py index 0e52d541..7f903067 100644 --- a/tmtccmd/runner.py +++ b/tmtccmd/runner.py @@ -22,7 +22,9 @@ unlock_global_pool, ) from tmtccmd.logging import get_console_logger +from .config.definitions import backend_mode_conversion from .config.globals import set_default_globals_pre_args_parsing +from .core.modes import ModeWrapper from .tc.definitions import ProcedureInfo from .tc.handler import TcHandlerBase @@ -128,12 +130,8 @@ def init_printout(use_gui: bool): def __handle_cli_args_and_globals(setup_args: SetupArgs): LOGGER.info("Setting up pre-globals..") - set_default_globals_pre_args_parsing( - setup_args.use_gui, tc_apid=setup_args.tc_apid, tm_apid=setup_args.tm_apid - ) + set_default_globals_pre_args_parsing(setup_args.apid) LOGGER.info("Setting up post-globals..") - # TODO: How to better do this? - # pass_cli_args(setup_args=setup_args) def __start_tmtc_commander_cli( @@ -199,7 +197,6 @@ def create_default_tmtc_backend( if not __SETUP_WAS_CALLED: LOGGER.warning("setup_tmtccmd was not called first. Call it first") sys.exit(1) - # service, op_code, com_if_id, mode = __get_backend_init_variables() if tm_handler is None: LOGGER.warning( "No TM Handler specified! Make sure to specify at least one TM handler" @@ -212,18 +209,19 @@ def create_default_tmtc_backend( com_if = setup_args.hook_obj.assign_communication_interface( com_if_key=get_global(CoreGlobalIds.COM_IF) ) - tm_timeout = get_global(CoreGlobalIds.TM_TIMEOUT) tm_listener = CcsdsTmListener(com_if=com_if, tm_handler=tm_handler) - + mode_wrapper = ModeWrapper() + backend_mode_conversion(setup_args.args_wrapper.mode, mode_wrapper) # The global variables are set by the argument parser. tmtc_backend = CcsdsTmtcBackend( com_if=com_if, tm_listener=tm_listener, tc_handler=tc_handler, + tc_mode=mode_wrapper.tc_mode, + tm_mode=mode_wrapper.tm_mode, ) tmtc_backend.current_proc_info = ProcedureInfo( - setup_args.cli_args.args_converted.service, - setup_args.cli_args.args_converted.op_code, + setup_args.args_wrapper.service, setup_args.args_wrapper.op_code ) tmtc_backend.apid = apid tmtc_backend.one_shot_operation = not get_global( From c39cfecef81952c9f235af44d1f8b60e0c7c7a1c Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Sat, 25 Jun 2022 01:14:37 +0200 Subject: [PATCH 083/221] test fixes --- .gitignore | 2 +- tests/test_global_manager.py | 2 +- tests/test_seq_sender.py | 5 +++-- tmtccmd/config/globals.py | 4 +++- 4 files changed, 8 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index ceb57916..f1cef17e 100644 --- a/.gitignore +++ b/.gitignore @@ -13,7 +13,7 @@ build /examples/log /tmtccmd/log -/tmtccmd/tests/log +/tests/log .idea venv diff --git a/tests/test_global_manager.py b/tests/test_global_manager.py index 67c22d64..7861986e 100644 --- a/tests/test_global_manager.py +++ b/tests/test_global_manager.py @@ -28,7 +28,7 @@ def test_global_module(self): com_if_dict = get_glob_com_if_dict() self.assertTrue(com_if_dict["test"][0] == "Test Interface") - set_default_globals_pre_args_parsing(gui=False, tc_apid=0x02, tm_apid=0x03) + set_default_globals_pre_args_parsing(apid=0x02) result = check_and_set_core_mode_arg(mode_arg="udp") self.assertTrue(result == CoreModeList.ONE_QUEUE_MODE) diff --git a/tests/test_seq_sender.py b/tests/test_seq_sender.py index 5a656b1f..ef4a6f5e 100644 --- a/tests/test_seq_sender.py +++ b/tests/test_seq_sender.py @@ -30,7 +30,8 @@ def test_basic(self): seq_sender.operation() tc_handler_mock.send_cb.assert_called_with(ANY, com_if) call_args = tc_handler_mock.send_cb.call_args - self.assertEqual(call_args.args_converted[0].tc, bytes([0, 1, 2])) + print(call_args) + self.assertEqual(call_args.args[0].tc, bytes([0, 1, 2])) # Queue should be empty now self.assertFalse(queue_wrapper.queue) self.assertEqual(seq_sender.mode, SenderMode.DONE) @@ -43,4 +44,4 @@ def test_basic(self): self.assertEqual(res.mode, SenderMode.BUSY) tc_handler_mock.send_cb.assert_called_with(ANY, com_if) call_args = tc_handler_mock.send_cb.call_args - self.assertEqual(call_args.args_converted[0].tc, bytes([3, 2, 1])) + self.assertEqual(call_args.args[0].tc, bytes([3, 2, 1])) diff --git a/tmtccmd/config/globals.py b/tmtccmd/config/globals.py index 2a59c2e9..75916af9 100644 --- a/tmtccmd/config/globals.py +++ b/tmtccmd/config/globals.py @@ -22,7 +22,7 @@ ComIFDictT, ) from tmtccmd.config.tmtc_defs import TmTcDefWrapper, OpCodeEntry -from tmtccmd.utility.conf_util import check_args_in_dict + LOGGER = get_console_logger() DEF_WRAPPER = None @@ -197,6 +197,8 @@ def check_and_set_core_mode_arg( def check_and_set_core_service_arg( service_arg: any, custom_service_list: collections.abc.Iterable = None ): + from tmtccmd.utility.conf_util import check_args_in_dict + in_enum, service_value = check_args_in_dict( param=service_arg, iterable=CoreServiceList, warning_hint="service" ) From 215010fef5ed3f6986e2bfb631462fafe9b3096e Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Sat, 25 Jun 2022 01:36:49 +0200 Subject: [PATCH 084/221] some fixes and improvements --- tmtccmd/core/ccsds_backend.py | 8 +++----- tmtccmd/runner.py | 4 ---- tmtccmd/tc/pus_5_event.py | 3 +-- 3 files changed, 4 insertions(+), 11 deletions(-) diff --git a/tmtccmd/core/ccsds_backend.py b/tmtccmd/core/ccsds_backend.py index 05ab2c1d..6fad0811 100644 --- a/tmtccmd/core/ccsds_backend.py +++ b/tmtccmd/core/ccsds_backend.py @@ -49,9 +49,7 @@ def __init__( tc_handler=tc_handler, queue_wrapper=self._queue_wrapper, ) - atexit.register( - keyboard_interrupt_handler, tmtc_backend=self, com_interface=self.__com_if - ) + atexit.register(keyboard_interrupt_handler, self) @property def com_if_id(self): @@ -146,7 +144,7 @@ def periodic_op(self, ctrl: BackendController) -> BackendState: try: return self.default_operation() except KeyboardInterrupt as e: - LOGGER.info("Keyboard Interrupt.") + LOGGER.info("Keyboard Interrupt") raise e except IOError as e: LOGGER.exception("IO Error occured") @@ -195,7 +193,7 @@ def tc_operation(self): self.__check_and_execute_seq_send() def __check_and_execute_seq_send(self): - if not self._seq_handler.mode == SenderMode.DONE: + if self._seq_handler.mode == SenderMode.DONE: service_queue = self.__prepare_tc_queue() if service_queue is None: return diff --git a/tmtccmd/runner.py b/tmtccmd/runner.py index 7f903067..f5c9bdf8 100644 --- a/tmtccmd/runner.py +++ b/tmtccmd/runner.py @@ -223,8 +223,4 @@ def create_default_tmtc_backend( tmtc_backend.current_proc_info = ProcedureInfo( setup_args.args_wrapper.service, setup_args.args_wrapper.op_code ) - tmtc_backend.apid = apid - tmtc_backend.one_shot_operation = not get_global( - CoreGlobalIds.USE_LISTENER_AFTER_OP - ) return tmtc_backend diff --git a/tmtccmd/tc/pus_5_event.py b/tmtccmd/tc/pus_5_event.py index 3c0d8753..3db02479 100644 --- a/tmtccmd/tc/pus_5_event.py +++ b/tmtccmd/tc/pus_5_event.py @@ -3,8 +3,7 @@ from spacepackets.ecss.conf import get_default_tc_apid from spacepackets.ecss.pus_5_event import Subservices -from tmtccmd.config.definitions import QueueCommands -from tmtccmd.tc.definitions import PusTelecommand, QueueHelper +from tmtccmd.tc.definitions import PusTelecommand from tmtccmd.tc.queue import QueueHelper From 524aed0a742a5a2c06ca79a6d7010d466d51472a Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Sat, 25 Jun 2022 13:01:28 +0200 Subject: [PATCH 085/221] something is still wrong --- tmtccmd/config/definitions.py | 8 ++++---- tmtccmd/core/ccsds_backend.py | 7 ++++--- tmtccmd/core/modes.py | 3 +++ tmtccmd/logging/pus.py | 2 +- tmtccmd/runner.py | 9 ++------- tmtccmd/tc/handler.py | 9 +++++---- 6 files changed, 19 insertions(+), 19 deletions(-) diff --git a/tmtccmd/config/definitions.py b/tmtccmd/config/definitions.py index 64f44f63..75eecfd7 100644 --- a/tmtccmd/config/definitions.py +++ b/tmtccmd/config/definitions.py @@ -111,16 +111,16 @@ class CoreModeList(enum.IntEnum): def backend_mode_conversion(mode: CoreModeList, mode_wrapper: ModeWrapper): - if mode == CoreModeList.LISTENER_MODE: + if mode == CoreModeStrings[CoreModeList.LISTENER_MODE]: mode_wrapper.tm_mode = TmMode.LISTENER mode_wrapper.tc_mode = TcMode.IDLE - elif mode == CoreModeList.ONE_QUEUE_MODE: + elif mode == CoreModeStrings[CoreModeList.ONE_QUEUE_MODE]: mode_wrapper.tm_mode = TmMode.LISTENER mode_wrapper.tc_mode = TcMode.ONE_QUEUE - elif mode == CoreModeList.MULTI_INTERACTIVE_QUEUE_MODE: + elif mode == CoreModeStrings[CoreModeList.MULTI_INTERACTIVE_QUEUE_MODE]: mode_wrapper.tc_mode = TcMode.MULTI_QUEUE mode_wrapper.tm_mode = TmMode.LISTENER - elif mode == CoreModeList.GUI_MODE: + elif mode == CoreModeStrings[CoreModeList.GUI_MODE]: mode_wrapper.tc_mode = TcMode.MULTI_QUEUE mode_wrapper.tm_mode = TmMode.IDLE diff --git a/tmtccmd/core/ccsds_backend.py b/tmtccmd/core/ccsds_backend.py index 6fad0811..ec4406e5 100644 --- a/tmtccmd/core/ccsds_backend.py +++ b/tmtccmd/core/ccsds_backend.py @@ -1,5 +1,6 @@ import atexit import sys +from collections import deque from typing import Optional from tmtccmd.config.definitions import CoreServiceList, CoreModeList @@ -202,9 +203,9 @@ def __check_and_execute_seq_send(self): self._seq_handler.resume() self._state._sender_res = self._seq_handler.operation() - def __prepare_tc_queue(self) -> Optional[QueueWrapper]: - feed_wrapper = FeedWrapper() + def __prepare_tc_queue(self, auto_dispatch: bool = True) -> Optional[QueueWrapper]: + feed_wrapper = FeedWrapper(QueueWrapper(deque()), auto_dispatch) self.__tc_handler.feed_cb(self.current_proc_info, feed_wrapper) if not self.__com_if.valid or not feed_wrapper.dispatch_next_queue: return None - return feed_wrapper.current_queue + return feed_wrapper.queue_helper.queue_wrapper diff --git a/tmtccmd/core/modes.py b/tmtccmd/core/modes.py index 12d77915..4790a4d5 100644 --- a/tmtccmd/core/modes.py +++ b/tmtccmd/core/modes.py @@ -16,3 +16,6 @@ class ModeWrapper: def __init__(self): self.tc_mode = TcMode.IDLE self.tm_mode = TmMode.IDLE + + def __str__(self): + return f"{self.__class__.__name__}: tc_mode={self.tc_mode!r}, tm_mode={self.tm_mode!r}" diff --git a/tmtccmd/logging/pus.py b/tmtccmd/logging/pus.py index 911edb31..e964188b 100644 --- a/tmtccmd/logging/pus.py +++ b/tmtccmd/logging/pus.py @@ -84,7 +84,7 @@ def __init__( self, when: TimedLogWhen, interval: int, - file_name: str = f"{RAW_PUS_FILE_BASE_NAME}.log", + file_name: str = f"{LOG_DIR}/{RAW_PUS_FILE_BASE_NAME}.log", ): """Create a raw TMTC timed rotating log wrapper. See the official Python documentation at diff --git a/tmtccmd/runner.py b/tmtccmd/runner.py index f5c9bdf8..7a90fdad 100644 --- a/tmtccmd/runner.py +++ b/tmtccmd/runner.py @@ -3,8 +3,6 @@ import os from typing import Union, cast -from spacepackets.ecss.conf import get_default_tc_apid - from tmtccmd import __version__ from tmtccmd.core.ccsds_backend import CcsdsTmtcBackend from tmtccmd.tm.ccsds_tm_listener import CcsdsTmListener @@ -67,9 +65,7 @@ def setup(setup_args: SetupArgs): __assign_tmtc_commander_hooks(hook_object=setup_args.hook_obj) if setup_args.use_gui: - set_default_globals_pre_args_parsing( - setup_args.use_gui, tc_apid=setup_args.tc_apid, tm_apid=setup_args.tm_apid - ) + set_default_globals_pre_args_parsing(setup_args.apid) if not setup_args.use_gui: __handle_cli_args_and_globals(setup_args) __SETUP_FOR_GUI = setup_args.use_gui @@ -205,9 +201,8 @@ def create_default_tmtc_backend( else: if tm_handler.get_type() == TmTypes.CCSDS_SPACE_PACKETS: tm_handler = cast(CcsdsTmHandler, tm_handler) - apid = get_default_tc_apid() com_if = setup_args.hook_obj.assign_communication_interface( - com_if_key=get_global(CoreGlobalIds.COM_IF) + com_if_key=setup_args.args_wrapper.com_if ) tm_listener = CcsdsTmListener(com_if=com_if, tm_handler=tm_handler) mode_wrapper = ModeWrapper() diff --git a/tmtccmd/tc/handler.py b/tmtccmd/tc/handler.py index 957a2076..4fb8bd4a 100644 --- a/tmtccmd/tc/handler.py +++ b/tmtccmd/tc/handler.py @@ -3,13 +3,14 @@ from tmtccmd.com_if.com_interface_base import CommunicationInterface from tmtccmd.core.modes import ModeWrapper -from tmtccmd.tc.definitions import TcQueueEntryBase, QueueDequeT, ProcedureInfo +from tmtccmd.tc.definitions import TcQueueEntryBase, ProcedureInfo +from tmtccmd.tc.queue import QueueHelper, QueueWrapper class FeedWrapper: - def __init__(self): - self.current_queue: Optional[QueueDequeT] = None - self.dispatch_next_queue = False + def __init__(self, queue_wrapper: QueueWrapper, auto_dispatch: bool): + self.queue_helper = QueueHelper(queue_wrapper) + self.dispatch_next_queue = auto_dispatch self.pause = False self.modes = ModeWrapper() From d5f320d719447374613b37fb6d403b94d1b1d52a Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Sat, 25 Jun 2022 13:34:00 +0200 Subject: [PATCH 086/221] started refactor of args handling --- tmtccmd/config/args.py | 154 ++++++++++++++++++++--------------------- 1 file changed, 74 insertions(+), 80 deletions(-) diff --git a/tmtccmd/config/args.py b/tmtccmd/config/args.py index 93d36692..dfb26702 100644 --- a/tmtccmd/config/args.py +++ b/tmtccmd/config/args.py @@ -37,10 +37,11 @@ def create_default_args_parser( @dataclass class ArgsGroup: - service: str - op_code: str - mode: str - com_if: str + service: Optional[str] = None + op_code: Optional[str] = None + mode: str = "" + com_if: str = "" + delay: float = 0.0 listener: bool = False interactive: bool = False @@ -59,24 +60,25 @@ def __init__( self.print_known_args = False self.print_unknown_args = False self.unknown_args = [""] - self.args_converted = ArgsGroup("", "", "", "") + self.args_converted: Optional[ArgsGroup] = None self.args_raw = None def add_default_tmtccmd_args(self): add_default_tmtccmd_args(self.args_parser) - def parse(self, hook_obj: TmTcCfgHookBase): + def parse(self, hook_obj: TmTcCfgHookBase, use_prompts: bool): self.args_raw, self.unknown_args = parse_default_tmtccmd_input_arguments( self.args_parser, - hook_obj, print_known_args=self.print_known_args, print_unknown_args=self.print_unknown_args, ) - self.args_converted.service = self.args_raw.service - self.args_converted.op_code = self.args_raw.op_code - self.args_converted.mode = self.args_raw.mode - self.args_converted.listener = self.args_raw.listener - self.args_converted.interactive = self.args_raw.interactive + self.args_converted = process_tmtccmd_args( + self.args_raw, hook_obj.get_tmtc_definitions(), use_prompts + ) + + @property + def delay(self): + return self.args_converted.delay @property def service(self): @@ -104,9 +106,60 @@ def add_default_tmtccmd_args(parser: argparse.ArgumentParser): add_ethernet_arguments(parser) +def process_tmtccmd_args( + args: argparse.Namespace, tmtc_defs: TmTcDefWrapper, use_prompts: bool +) -> ArgsGroup: + """If some arguments are unspecified, they are set here with (variable) default values. + :param args: Arguments from calling parse method + :param tmtc_defs: + :param use_prompts: Specify whether terminal prompts are allowed to retrieve unspecified + arguments. For something like a GUI, it might make sense to disable this + :return: None + """ + from tmtccmd.config.definitions import CoreModeStrings + + group = ArgsGroup() + if args.mode is None: + group.mode = CoreModeStrings[CoreModeList.ONE_QUEUE_MODE] + if tmtc_defs is None: + LOGGER.warning("Invalid Service to Op-Code dictionary detected") + if args.service is None: + group.service = "0" + if args.op_code is None: + group.op_code = "0" + else: + if args.service is None: + if args.mode == CoreModeStrings[CoreModeList.ONE_QUEUE_MODE]: + if use_prompts: + LOGGER.info( + "No service argument (-s) specified, prompting from user.." + ) + # Try to get the service list from the hook base and prompt service from user + group.service = prompt_service(tmtc_defs) + else: + group.service = args.service + if args.op_code is None: + current_service = group.service + if use_prompts: + group.op_code = prompt_op_code(tmtc_defs, current_service) + else: + group.op_code = args.op_code + if args.delay is None: + if group.mode == CoreModeStrings[CoreModeList.ONE_QUEUE_MODE]: + group.delay = 3.0 + else: + group.delay = 0.0 + else: + group.delay = args.delay + if args.listener is None: + args.listener = False + else: + group.listener = args.listener + return group + + def parse_default_tmtccmd_input_arguments( parser: argparse.ArgumentParser, - hook_obj: TmTcCfgHookBase, print_known_args: bool = False, print_unknown_args: bool = False, ) -> (argparse.Namespace, List[str]): @@ -130,7 +183,8 @@ def parse_default_tmtccmd_input_arguments( for argument in unknown: LOGGER.info(argument) - args_post_processing(args, unknown, hook_obj.get_tmtc_definitions()) + if len(unknown) > 0: + print(f"Unknown arguments detected: {unknown}") return args, unknown @@ -179,17 +233,18 @@ def add_generic_arguments(arg_parser: argparse.ArgumentParser): arg_parser.add_argument( "-i", "--interactive", - help="Enables interactive or multi-queue mode, where the backend will be confiogured " + help="Enables interactive or multi-queue mode, where the backend will be configured " "to handle multiple queues", action="store_true", default=False, ) arg_parser.add_argument( - "-t", - "--tm_timeout", + "-d", + "--delay", type=float, - help="Default inter-packet delay" " Default: 3 seconds", - default=3.0, + help="Default inter-packet delay. Default: 3 seconds for one queue mode, " + "0 for interactive mode", + default=None, ) @@ -266,64 +321,3 @@ def add_ethernet_arguments(arg_parser: argparse.ArgumentParser): arg_parser.add_argument( "--t-ip", help="Target IP. Default: Localhost 127.0.0.1", default="127.0.0.1" ) - - -def args_post_processing( - args, unknown: list, service_op_code_dict: TmTcDefWrapper -) -> None: - """Handles the parsed arguments. - :param service_op_code_dict: - :param args: Namespace objects - (see https://docs.python.org/dev/library/argparse.html#argparse.Namespace) - :param unknown: List of unknown parameters. - :return: None - """ - if len(unknown) > 0: - print("Unknown arguments detected: " + str(unknown)) - if len(sys.argv) > 1: - handle_unspecified_args(args, service_op_code_dict) - if len(sys.argv) == 1: - handle_empty_args(args, service_op_code_dict) - - -def handle_unspecified_args( - args: argparse.Namespace, tmtc_defs: TmTcDefWrapper -) -> None: - """If some arguments are unspecified, they are set here with (variable) default values. - :param args: Arguments from calling parse method - :param tmtc_defs: - :return: None - """ - from tmtccmd.config.definitions import CoreModeStrings - - if args.mode is None: - args.mode = CoreModeStrings[CoreModeList.ONE_QUEUE_MODE] - if tmtc_defs is None: - LOGGER.warning("Invalid Service to Op-Code dictionary detected") - if args.service is None: - args.service = "0" - if args.op_code is None: - args.op_code = "0" - return - if args.service is None: - if args.mode == CoreModeStrings[CoreModeList.ONE_QUEUE_MODE]: - LOGGER.info("No service argument (-s) specified, prompting from user..") - # Try to get the service list from the hook base and prompt service from user - args.service = prompt_service(tmtc_defs) - if args.op_code is None: - current_service = args.service - args.op_code = prompt_op_code(tmtc_defs, current_service) - if args.tm_timeout is None: - args.tm_timeout = 5.0 - if args.listener is None: - args.listener = False - - -def handle_empty_args(args, service_op_code_dict: TmTcDefWrapper) -> None: - """If no args were supplied, request input from user directly. - :param service_op_code_dict: - :param args: - :return: - """ - LOGGER.info("No arguments specified..") - handle_unspecified_args(args, service_op_code_dict) From 25fffebfdec4995d6b932b10682d6adddf8b29ba Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Sat, 25 Jun 2022 13:42:20 +0200 Subject: [PATCH 087/221] some fixes for request setting --- tmtccmd/config/args.py | 2 ++ tmtccmd/core/ccsds_backend.py | 14 +++++++------- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/tmtccmd/config/args.py b/tmtccmd/config/args.py index dfb26702..06ce8ef1 100644 --- a/tmtccmd/config/args.py +++ b/tmtccmd/config/args.py @@ -121,6 +121,8 @@ def process_tmtccmd_args( group = ArgsGroup() if args.mode is None: group.mode = CoreModeStrings[CoreModeList.ONE_QUEUE_MODE] + else: + group.mode = args.mode if tmtc_defs is None: LOGGER.warning("Invalid Service to Op-Code dictionary detected") if args.service is None: diff --git a/tmtccmd/core/ccsds_backend.py b/tmtccmd/core/ccsds_backend.py index ec4406e5..e3e54ad0 100644 --- a/tmtccmd/core/ccsds_backend.py +++ b/tmtccmd/core/ccsds_backend.py @@ -143,7 +143,8 @@ def periodic_op(self, ctrl: BackendController) -> BackendState: :raises IOError: Yields informative output and propagates exception :""" try: - return self.default_operation() + self.default_operation() + return self._state except KeyboardInterrupt as e: LOGGER.info("Keyboard Interrupt") raise e @@ -151,25 +152,24 @@ def periodic_op(self, ctrl: BackendController) -> BackendState: LOGGER.exception("IO Error occured") raise e - def default_operation(self) -> BackendState: + def default_operation(self): """Command handling.""" self.tm_operation() self.tc_operation() self.mode_to_req() - return self._state def mode_to_req(self): if self.tc_mode == TcMode.IDLE and self.tm_mode == TmMode.IDLE: - self._state.__req = Request.DELAY_IDLE + self._state._req = Request.DELAY_IDLE elif self.tm_mode == TmMode.LISTENER and self.tc_mode == CoreModeList.IDLE: - self._state.__req = Request.DELAY_LISTENER + self._state._req = Request.DELAY_LISTENER elif self._seq_handler.mode == SenderMode.DONE: if self._state.tc_mode == TcMode.ONE_QUEUE: self._state.mode_wrapper.tc_mode = TcMode.IDLE - self._state._request = Request.TERMINATION_NO_ERROR + self._state._req = Request.TERMINATION_NO_ERROR elif self._state.tc_mode == TcMode.MULTI_QUEUE: self._state.mode_wrapper.tc_mode = TcMode.IDLE - self._state._request = Request.CALL_NEXT + self._state._req = Request.CALL_NEXT else: if self._state.sender_res.longest_rem_delay > 0: self._state._recommended_delay = ( From 905f0b64a148ccdd97dc0cfcd7a55b543b700955 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Sat, 25 Jun 2022 13:59:30 +0200 Subject: [PATCH 088/221] countdown handling fixes --- tmtccmd/core/ccsds_backend.py | 18 +++++++++++++----- tmtccmd/runner.py | 1 + tmtccmd/tc/ccsds_seq_sender.py | 3 +++ tmtccmd/utility/countdown.py | 5 ++++- 4 files changed, 21 insertions(+), 6 deletions(-) diff --git a/tmtccmd/core/ccsds_backend.py b/tmtccmd/core/ccsds_backend.py index e3e54ad0..e6f6c65d 100644 --- a/tmtccmd/core/ccsds_backend.py +++ b/tmtccmd/core/ccsds_backend.py @@ -44,7 +44,7 @@ def __init__( self.__tm_listener = tm_listener self._current_proc_info = ProcedureInfo(CoreServiceList.SERVICE_17.value, "0") self.exit_on_com_if_init_failure = True - self._queue_wrapper = QueueWrapper(None) + self._queue_wrapper = QueueWrapper(deque()) self._seq_handler = SequentialCcsdsSender( com_if=self.__com_if, tc_handler=tc_handler, @@ -68,6 +68,14 @@ def tc_mode(self): def tm_mode(self): return self._state.mode_wrapper.tm_mode + @property + def inter_cmd_delay(self): + return self._queue_wrapper.inter_cmd_delay + + @inter_cmd_delay.setter + def inter_cmd_delay(self, delay: float): + self._queue_wrapper.inter_cmd_delay = delay + @tc_mode.setter def tc_mode(self, tc_mode: TcMode): self._state.mode_wrapper._tc_mode = tc_mode @@ -195,16 +203,16 @@ def tc_operation(self): def __check_and_execute_seq_send(self): if self._seq_handler.mode == SenderMode.DONE: - service_queue = self.__prepare_tc_queue() - if service_queue is None: + queue = self.__prepare_tc_queue() + if queue is None: return LOGGER.info("Loading TC queue") - self._seq_handler.queue_wrapper = service_queue + self._seq_handler.queue_wrapper = queue self._seq_handler.resume() self._state._sender_res = self._seq_handler.operation() def __prepare_tc_queue(self, auto_dispatch: bool = True) -> Optional[QueueWrapper]: - feed_wrapper = FeedWrapper(QueueWrapper(deque()), auto_dispatch) + feed_wrapper = FeedWrapper(self._queue_wrapper, auto_dispatch) self.__tc_handler.feed_cb(self.current_proc_info, feed_wrapper) if not self.__com_if.valid or not feed_wrapper.dispatch_next_queue: return None diff --git a/tmtccmd/runner.py b/tmtccmd/runner.py index 7a90fdad..5159a4df 100644 --- a/tmtccmd/runner.py +++ b/tmtccmd/runner.py @@ -215,6 +215,7 @@ def create_default_tmtc_backend( tc_mode=mode_wrapper.tc_mode, tm_mode=mode_wrapper.tm_mode, ) + tmtc_backend.inter_cmd_delay = setup_args.args_wrapper.delay tmtc_backend.current_proc_info = ProcedureInfo( setup_args.args_wrapper.service, setup_args.args_wrapper.op_code ) diff --git a/tmtccmd/tc/ccsds_seq_sender.py b/tmtccmd/tc/ccsds_seq_sender.py index 7240dce7..d2e9be21 100644 --- a/tmtccmd/tc/ccsds_seq_sender.py +++ b/tmtccmd/tc/ccsds_seq_sender.py @@ -59,6 +59,8 @@ def queue_wrapper(self, queue_wrapper: QueueWrapper): if self._mode == SenderMode.BUSY: raise ValueError("Busy with other queue") self._mode = SenderMode.BUSY + if queue_wrapper.inter_cmd_delay != self._send_cd.timeout: + self._send_cd.reset(queue_wrapper.inter_cmd_delay) self._queue_wrapper = queue_wrapper def handle_new_queue_forced(self, queue_wrapper: QueueWrapper): @@ -152,6 +154,7 @@ def check_queue_entry(self, queue_entry: TcQueueEntryBase) -> bool: if ( queue_entry.etype == TcQueueEntryType.RAW_TC or queue_entry.etype == TcQueueEntryType.PUS_TC + or queue_entry.etype == TcQueueEntryType.CCSDS_TC ): self._last_tc = queue_entry is_tc = True diff --git a/tmtccmd/utility/countdown.py b/tmtccmd/utility/countdown.py index dbad67ce..9327e5a8 100644 --- a/tmtccmd/utility/countdown.py +++ b/tmtccmd/utility/countdown.py @@ -17,7 +17,6 @@ def timeout(self): @timeout.setter def timeout(self, timeout: float): self._timeout = timeout - self._start_time = time.time() def timed_out(self) -> bool: if time.time() - self._start_time > self._timeout: @@ -33,6 +32,10 @@ def reset(self, new_timeout: Optional[float] = None): self.timeout = new_timeout else: self.timeout = self._timeout + self.start() + + def start(self): + self._start_time = time.time() def time_out(self): self._start_time = time.time() - self._timeout From ab61723f5eaf8719337d872ee685e9e09cbe1f85 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Sat, 25 Jun 2022 14:01:28 +0200 Subject: [PATCH 089/221] some more tweaks --- tmtccmd/tc/ccsds_seq_sender.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tmtccmd/tc/ccsds_seq_sender.py b/tmtccmd/tc/ccsds_seq_sender.py index d2e9be21..ddff4ad9 100644 --- a/tmtccmd/tc/ccsds_seq_sender.py +++ b/tmtccmd/tc/ccsds_seq_sender.py @@ -59,8 +59,8 @@ def queue_wrapper(self, queue_wrapper: QueueWrapper): if self._mode == SenderMode.BUSY: raise ValueError("Busy with other queue") self._mode = SenderMode.BUSY - if queue_wrapper.inter_cmd_delay != self._send_cd.timeout: - self._send_cd.reset(queue_wrapper.inter_cmd_delay) + # There is no need to delay sending of the first entry + self._send_cd.timeout = 0 self._queue_wrapper = queue_wrapper def handle_new_queue_forced(self, queue_wrapper: QueueWrapper): @@ -109,6 +109,8 @@ def _send_next_telecommand(self): next_queue_entry = self.queue_wrapper.queue.pop() if self.check_queue_entry(next_queue_entry): self._current_res.tc_sent = True + if self.queue_wrapper.inter_cmd_delay != self._send_cd.timeout: + self._send_cd.reset(self.queue_wrapper.inter_cmd_delay) self._send_cd.reset() else: self._current_res.tc_sent = False From 0c1df43c7c46c384efd73508f5986be861c8db62 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Sat, 25 Jun 2022 15:01:36 +0200 Subject: [PATCH 090/221] a lot more fixes --- tmtccmd/config/args.py | 37 ++++++++++++++++------------- tmtccmd/config/cfg_hook.py | 5 +++- tmtccmd/config/definitions.py | 2 +- tmtccmd/config/globals.py | 10 ++++---- tmtccmd/tc/ccsds_seq_sender.py | 3 ++- tmtccmd/tm/pus_1_verification.py | 40 +++++++------------------------- 6 files changed, 42 insertions(+), 55 deletions(-) diff --git a/tmtccmd/config/args.py b/tmtccmd/config/args.py index 06ce8ef1..945428a6 100644 --- a/tmtccmd/config/args.py +++ b/tmtccmd/config/args.py @@ -6,9 +6,9 @@ from typing import Optional, List from dataclasses import dataclass -from tmtccmd.config.definitions import CoreModeList +from tmtccmd.com_if.com_if_utilities import determine_com_if +from tmtccmd.config.definitions import CoreModeList, CoreComInterfaces from tmtccmd.config.prompt import prompt_service, prompt_op_code -from tmtccmd.config.tmtc_defs import TmTcDefWrapper from tmtccmd.config.cfg_hook import TmTcCfgHookBase from tmtccmd.utility.conf_util import AnsiColors from tmtccmd.logging import get_console_logger @@ -72,9 +72,7 @@ def parse(self, hook_obj: TmTcCfgHookBase, use_prompts: bool): print_known_args=self.print_known_args, print_unknown_args=self.print_unknown_args, ) - self.args_converted = process_tmtccmd_args( - self.args_raw, hook_obj.get_tmtc_definitions(), use_prompts - ) + self.args_converted = process_tmtccmd_args(self.args_raw, hook_obj, use_prompts) @property def delay(self): @@ -107,11 +105,11 @@ def add_default_tmtccmd_args(parser: argparse.ArgumentParser): def process_tmtccmd_args( - args: argparse.Namespace, tmtc_defs: TmTcDefWrapper, use_prompts: bool + args: argparse.Namespace, hook_obj: TmTcCfgHookBase, use_prompts: bool ) -> ArgsGroup: """If some arguments are unspecified, they are set here with (variable) default values. :param args: Arguments from calling parse method - :param tmtc_defs: + :param hook_obj: :param use_prompts: Specify whether terminal prompts are allowed to retrieve unspecified arguments. For something like a GUI, it might make sense to disable this :return: None @@ -119,10 +117,19 @@ def process_tmtccmd_args( from tmtccmd.config.definitions import CoreModeStrings group = ArgsGroup() + if args.com_if is None or args.com_if == CoreComInterfaces.UNSPECIFIED.value: + if use_prompts: + group.com_if = determine_com_if( + hook_obj.get_com_if_dict(), hook_obj.json_cfg_path + ) + else: + # TODO: Check whether COM IF is valid? + group.com_if = args.com_if if args.mode is None: group.mode = CoreModeStrings[CoreModeList.ONE_QUEUE_MODE] else: group.mode = args.mode + tmtc_defs = hook_obj.get_tmtc_definitions() if tmtc_defs is None: LOGGER.warning("Invalid Service to Op-Code dictionary detected") if args.service is None: @@ -284,28 +291,26 @@ def add_default_mode_arguments(arg_parser: argparse.ArgumentParser): def add_default_com_if_arguments(arg_parser: argparse.ArgumentParser): - from tmtccmd.config.definitions import CoreComInterfacesDict, CoreComInterfaces + from tmtccmd.config.definitions import CORE_COM_IF_DICT, CoreComInterfaces help_text = ( "Core Communication Interface. If this is not specified, the commander core\n" - "will try to extract it from the JSON or prompt it from the user.\n" - ) - dummy_line = ( - f"{CoreComInterfacesDict[CoreComInterfaces.DUMMY.value]}: Dummy Interface\n" + "will try to extract it from the JSON or prompt it from the user\n" ) + dummy_line = f"{CORE_COM_IF_DICT[CoreComInterfaces.DUMMY.value]}: Dummy Interface\n" udp_line = ( - f"{CoreComInterfacesDict[CoreComInterfaces.TCPIP_UDP.value]}: " f"UDP client\n" + f"{CORE_COM_IF_DICT[CoreComInterfaces.TCPIP_UDP.value]}: " f"UDP client\n" ) ser_dle_line = ( - f"{CoreComInterfacesDict[CoreComInterfaces.SERIAL_DLE.value]}: " + f"{CORE_COM_IF_DICT[CoreComInterfaces.SERIAL_DLE.value]}: " f"Serial with DLE transport layer\n" ) ser_fixed_line = ( - f"{CoreComInterfacesDict[CoreComInterfaces.SERIAL_FIXED_FRAME.value]}: " + f"{CORE_COM_IF_DICT[CoreComInterfaces.SERIAL_FIXED_FRAME.value]}: " f"Serial with fixed frames\n" ) ser_qemu_line = ( - f"{CoreComInterfacesDict[CoreComInterfaces.SERIAL_QEMU.value]}: " + f"{CORE_COM_IF_DICT[CoreComInterfaces.SERIAL_QEMU.value]}: " f"QEMU serial interface\n" ) help_text += dummy_line + ser_dle_line + udp_line + ser_fixed_line + ser_qemu_line diff --git a/tmtccmd/config/cfg_hook.py b/tmtccmd/config/cfg_hook.py index 1916362b..cf01945c 100644 --- a/tmtccmd/config/cfg_hook.py +++ b/tmtccmd/config/cfg_hook.py @@ -1,7 +1,7 @@ from abc import abstractmethod from typing import Optional -from tmtccmd.config.definitions import default_json_path +from tmtccmd.config.definitions import default_json_path, ComIFDictT, CORE_COM_IF_DICT from tmtccmd.config.tmtc_defs import TmTcDefWrapper from tmtccmd.logging import get_console_logger from tmtccmd.utility.retval import RetvalDictT @@ -48,6 +48,9 @@ def assign_communication_interface( com_if_key=com_if_key, json_cfg_path=self.json_cfg_path ) + def get_com_if_dict(self) -> ComIFDictT: + return CORE_COM_IF_DICT + @abstractmethod def get_tmtc_definitions(self) -> TmTcDefWrapper: """This is a dicitonary mapping services represented by strings to an operation code diff --git a/tmtccmd/config/definitions.py b/tmtccmd/config/definitions.py index 75eecfd7..cd2a6c30 100644 --- a/tmtccmd/config/definitions.py +++ b/tmtccmd/config/definitions.py @@ -73,7 +73,7 @@ class CoreComInterfaces(enum.Enum): UNSPECIFIED = "unspec" -CoreComInterfacesDict = { +CORE_COM_IF_DICT = { CoreComInterfaces.DUMMY.value: "Dummy Interface", CoreComInterfaces.SERIAL_DLE.value: "Serial Interace with DLE encoding", CoreComInterfaces.TCPIP_UDP.value: "TCP/IP with UDP datagrams", diff --git a/tmtccmd/config/globals.py b/tmtccmd/config/globals.py index 75916af9..9f9041a0 100644 --- a/tmtccmd/config/globals.py +++ b/tmtccmd/config/globals.py @@ -17,7 +17,7 @@ CoreModeList, CoreServiceList, CoreModeStrings, - CoreComInterfacesDict, + CORE_COM_IF_DICT, CoreComInterfaces, ComIFDictT, ) @@ -37,8 +37,8 @@ def get_json_cfg_path() -> str: def set_glob_com_if_dict(custom_com_if_dict: ComIFDictT): - CoreComInterfacesDict.update(custom_com_if_dict) - update_global(CoreGlobalIds.COM_IF_DICT, CoreComInterfacesDict) + CORE_COM_IF_DICT.update(custom_com_if_dict) + update_global(CoreGlobalIds.COM_IF_DICT, CORE_COM_IF_DICT) def get_glob_com_if_dict() -> ComIFDictT: @@ -105,9 +105,9 @@ def handle_com_if_arg( ): from tmtccmd.com_if.com_if_utilities import determine_com_if - all_com_ifs = CoreComInterfacesDict + all_com_ifs = CORE_COM_IF_DICT if custom_com_if_dict is not None: - all_com_ifs = CoreComInterfacesDict.update(custom_com_if_dict) + all_com_ifs = CORE_COM_IF_DICT.update(custom_com_if_dict) try: com_if_key = str(args.com_if) except AttributeError: diff --git a/tmtccmd/tc/ccsds_seq_sender.py b/tmtccmd/tc/ccsds_seq_sender.py index ddff4ad9..2d5e62b1 100644 --- a/tmtccmd/tc/ccsds_seq_sender.py +++ b/tmtccmd/tc/ccsds_seq_sender.py @@ -59,7 +59,8 @@ def queue_wrapper(self, queue_wrapper: QueueWrapper): if self._mode == SenderMode.BUSY: raise ValueError("Busy with other queue") self._mode = SenderMode.BUSY - # There is no need to delay sending of the first entry + # There is no need to delay sending of the first entry, the send delay is inter-packet + # only self._send_cd.timeout = 0 self._queue_wrapper = queue_wrapper diff --git a/tmtccmd/tm/pus_1_verification.py b/tmtccmd/tm/pus_1_verification.py index 1a82b0dc..41965eaf 100644 --- a/tmtccmd/tm/pus_1_verification.py +++ b/tmtccmd/tm/pus_1_verification.py @@ -4,15 +4,10 @@ from abc import abstractmethod from typing import Deque -from spacepackets.ccsds.spacepacket import ( - PacketSeqCtrl, - PacketId, - PacketTypes, - SequenceFlags, -) +from spacepackets.ccsds.spacepacket import PacketSeqCtrl from spacepackets.ccsds.time import CdsShortTimestamp from spacepackets.ecss.tm import PusVersion, PusTelemetry -from spacepackets.ecss.pus_1_verification import Service1TM, Subservices +from spacepackets.ecss.pus_1_verification import Service1TM, Subservices, RequestId from tmtccmd.tm.base import PusTmInfoBase, PusTmBase from tmtccmd.logging import get_console_logger @@ -26,8 +21,7 @@ class Service1TMExtended(PusTmBase, PusTmInfoBase, Service1TM): def __init__( self, subservice: int, - tc_packet_id: PacketId, - tc_psc: PacketSeqCtrl, + tc_request_id: RequestId, time: CdsShortTimestamp = None, ssc: int = 0, source_data: bytearray = bytearray([]), @@ -40,8 +34,7 @@ def __init__( ): Service1TM.__init__( self, - tc_packet_id=tc_packet_id, - tc_psc=tc_psc, + tc_request_id=tc_request_id, subservice=subservice, time=time, ssc=ssc, @@ -58,11 +51,7 @@ def __init__( @classmethod def __empty(cls) -> Service1TMExtended: - return cls( - subservice=0, - tc_packet_id=PacketId(apid=0, sec_header_flag=False, ptype=PacketTypes.TM), - tc_psc=PacketSeqCtrl(SequenceFlags.CONTINUATION_SEGMENT, 0), - ) + return cls(subservice=0, tc_request_id=RequestId.empty()) @classmethod def unpack( @@ -81,25 +70,14 @@ def unpack( service_1_tm.pus_tm = PusTelemetry.unpack( raw_telemetry=raw_telemetry, pus_version=pus_version ) - tm_data = service_1_tm.tm_data - if len(tm_data) < 4: - LOGGER.warning("TM data less than 4 bytes!") - raise ValueError - service_1_tm.tc_packet_id = struct.unpack("!H", tm_data[0:2])[0] - service_1_tm.tc_psc = PacketSeqCtrl.from_raw( - struct.unpack("!H", tm_data[2:4])[0] - ) - if service_1_tm.subservice % 2 == 0: - service_1_tm._handle_failure_verification() - else: - service_1_tm._handle_success_verification() + cls._unpack_raw_tm(service_1_tm) return service_1_tm @abstractmethod def append_telemetry_content(self, content_list: list): super().append_telemetry_content(content_list=content_list) - content_list.append(str(hex(self.tc_packet_id.raw()))) - content_list.append(str(self.tc_ssc)) + content_list.append(self.tc_req_id.tc_packet_id) + content_list.append(self.tc_req_id.tc_psc) if self.has_tc_error_code: if self.is_step_reply: content_list.append(str(self.step_number)) @@ -117,7 +95,7 @@ def append_telemetry_content(self, content_list: list): def append_telemetry_column_headers(self, header_list: list): super().append_telemetry_column_headers(header_list=header_list) header_list.append("TC Packet ID") - header_list.append("TC SSC") + header_list.append("TC PSC") if self.has_tc_error_code: if self.is_step_reply: header_list.append("Step Number") From e3d49c51815451f1a5f15384f0ca22be748bc436 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Sat, 25 Jun 2022 22:48:33 +0200 Subject: [PATCH 091/221] another abstraction for procedures --- tests/tc_handler_mock.py | 8 ++--- tests/test_printer.py | 4 +-- tests/test_queue.py | 4 +-- tmtccmd/core/ccsds_backend.py | 10 ++++--- tmtccmd/core/frontend.py | 4 +-- tmtccmd/runner.py | 4 +-- tmtccmd/tc/ccsds_seq_sender.py | 4 +-- tmtccmd/tc/definitions.py | 54 ++++++++++++++++++++++++++++++++-- tmtccmd/tc/handler.py | 7 ++--- 9 files changed, 74 insertions(+), 25 deletions(-) diff --git a/tests/tc_handler_mock.py b/tests/tc_handler_mock.py index 31eca8ae..4e1a953f 100644 --- a/tests/tc_handler_mock.py +++ b/tests/tc_handler_mock.py @@ -1,7 +1,5 @@ -from typing import Optional - from tmtccmd.com_if.com_interface_base import CommunicationInterface -from tmtccmd.tc.definitions import ProcedureInfo, TcQueueEntryBase +from tmtccmd.tc.definitions import TcQueueEntryBase, TcProcedureBase from tmtccmd.tc.handler import TcHandlerBase, FeedWrapper @@ -9,8 +7,8 @@ class TcHandler(TcHandlerBase): def send_cb(self, tc_queue_entry: TcQueueEntryBase, com_if: CommunicationInterface): pass - def queue_finished_cb(self, info: ProcedureInfo): + def queue_finished_cb(self, info: TcProcedureBase): pass - def feed_cb(self, info: Optional[ProcedureInfo], wrapper: FeedWrapper): + def feed_cb(self, info: TcProcedureBase, wrapper: FeedWrapper): pass diff --git a/tests/test_printer.py b/tests/test_printer.py index 4351f8d1..c12c8c18 100644 --- a/tests/test_printer.py +++ b/tests/test_printer.py @@ -3,6 +3,7 @@ from unittest import TestCase from spacepackets.ccsds.time import CdsShortTimestamp +from spacepackets.ecss.pus_1_verification import RequestId from tmtccmd.tm.pus_1_verification import Service1TMExtended from tmtccmd.pus.pus_17_test import pack_service_17_ping_command @@ -39,8 +40,7 @@ def test_pus_loggers(self): pus_tm = Service1TMExtended( subservice=1, time=CdsShortTimestamp.init_from_current_time(), - tc_packet_id=pus_tc.packet_id, - tc_psc=pus_tc.packet_seq_ctrl, + tc_request_id=RequestId(pus_tc.packet_id, pus_tc.packet_seq_ctrl) ) self.raw_tmtc_log.log_tm(pus_tm.pus_tm) self.assertTrue(Path(self.regular_file_name).exists()) diff --git a/tests/test_queue.py b/tests/test_queue.py index 9548507c..00347300 100644 --- a/tests/test_queue.py +++ b/tests/test_queue.py @@ -4,7 +4,7 @@ from unittest import TestCase from spacepackets.ecss import PusTelecommand -from tmtccmd.tc.definitions import WaitEntry, CastWrapper +from tmtccmd.tc.definitions import WaitEntry, PacketCastWrapper # Required for eval calls # noinspection PyUnresolvedReferences @@ -39,7 +39,7 @@ def test_queue(self): pus_entry = queue_wrapper.queue.pop() self.assertTrue(pus_entry.is_tc()) - cast_wrapper = CastWrapper(pus_entry) + cast_wrapper = PacketCastWrapper(pus_entry) pus_entry = cast_wrapper.to_pus_tc_entry() self.assertEqual(pus_entry.pus_tc, pus_cmd) self.assertTrue(pus_entry) diff --git a/tmtccmd/core/ccsds_backend.py b/tmtccmd/core/ccsds_backend.py index e6f6c65d..818fe212 100644 --- a/tmtccmd/core/ccsds_backend.py +++ b/tmtccmd/core/ccsds_backend.py @@ -6,7 +6,7 @@ from tmtccmd.config.definitions import CoreServiceList, CoreModeList from tmtccmd.core.backend import BackendBase, BackendState, Request, BackendController from tmtccmd.core.modes import TcMode, TmMode -from tmtccmd.tc.definitions import ProcedureInfo +from tmtccmd.tc.definitions import DefaultProcedureInfo from tmtccmd.tc.handler import TcHandlerBase, FeedWrapper from tmtccmd.tc.queue import QueueWrapper from tmtccmd.logging import get_console_logger @@ -42,7 +42,9 @@ def __init__( self.__com_if = com_if self.__tm_listener = tm_listener - self._current_proc_info = ProcedureInfo(CoreServiceList.SERVICE_17.value, "0") + self._current_proc_info = DefaultProcedureInfo( + CoreServiceList.SERVICE_17.value, "0" + ) self.exit_on_com_if_init_failure = True self._queue_wrapper = QueueWrapper(deque()) self._seq_handler = SequentialCcsdsSender( @@ -102,11 +104,11 @@ def com_if_active(self): return self.__com_if_active @property - def current_proc_info(self) -> ProcedureInfo: + def current_proc_info(self) -> DefaultProcedureInfo: return self._current_proc_info @current_proc_info.setter - def current_proc_info(self, proc_info: ProcedureInfo): + def current_proc_info(self, proc_info: DefaultProcedureInfo): self._current_proc_info = proc_info @staticmethod diff --git a/tmtccmd/core/frontend.py b/tmtccmd/core/frontend.py index f6990171..23360e4a 100644 --- a/tmtccmd/core/frontend.py +++ b/tmtccmd/core/frontend.py @@ -37,7 +37,7 @@ from tmtccmd.core.globals_manager import get_global, update_global from tmtccmd.com_if.tcpip_utilities import TcpIpConfigIds import tmtccmd.config as config_module -from tmtccmd.tc.definitions import ProcedureInfo +from tmtccmd.tc.definitions import DefaultProcedureInfo LOGGER = get_console_logger() @@ -215,7 +215,7 @@ def __start_seq_cmd_op(self): if not self.__get_send_button(): return self.__set_send_button(False) - self._tmtc_handler.current_proc_info = ProcedureInfo( + self._tmtc_handler.current_proc_info = DefaultProcedureInfo( self._current_service, self._current_op_code ) self._tmtc_handler.mode = CoreModeList.ONE_QUEUE_MODE diff --git a/tmtccmd/runner.py b/tmtccmd/runner.py index 5159a4df..e4dc46fd 100644 --- a/tmtccmd/runner.py +++ b/tmtccmd/runner.py @@ -23,7 +23,7 @@ from .config.definitions import backend_mode_conversion from .config.globals import set_default_globals_pre_args_parsing from .core.modes import ModeWrapper -from .tc.definitions import ProcedureInfo +from .tc.definitions import DefaultProcedureInfo from .tc.handler import TcHandlerBase LOGGER = get_console_logger() @@ -216,7 +216,7 @@ def create_default_tmtc_backend( tm_mode=mode_wrapper.tm_mode, ) tmtc_backend.inter_cmd_delay = setup_args.args_wrapper.delay - tmtc_backend.current_proc_info = ProcedureInfo( + tmtc_backend.current_proc_info = DefaultProcedureInfo( setup_args.args_wrapper.service, setup_args.args_wrapper.op_code ) return tmtc_backend diff --git a/tmtccmd/tc/ccsds_seq_sender.py b/tmtccmd/tc/ccsds_seq_sender.py index 2d5e62b1..d7e175de 100644 --- a/tmtccmd/tc/ccsds_seq_sender.py +++ b/tmtccmd/tc/ccsds_seq_sender.py @@ -2,7 +2,7 @@ import enum from typing import Optional -from tmtccmd.tc.definitions import TcQueueEntryBase, TcQueueEntryType, CastWrapper +from tmtccmd.tc.definitions import TcQueueEntryBase, TcQueueEntryType, PacketCastWrapper from tmtccmd.tc.handler import TcHandlerBase from tmtccmd.tc.queue import QueueWrapper from tmtccmd.com_if.com_interface_base import CommunicationInterface @@ -139,7 +139,7 @@ def check_queue_entry(self, queue_entry: TcQueueEntryBase) -> bool: if not isinstance(queue_entry, TcQueueEntryBase): LOGGER.warning("Invalid queue entry detected") raise ValueError("Invalid queue entry detected") - cast_wrapper = CastWrapper(queue_entry) + cast_wrapper = PacketCastWrapper(queue_entry) if queue_entry.etype == TcQueueEntryType.WAIT: wait_entry = cast_wrapper.to_wait_entry() LOGGER.info(f"Waiting for {wait_entry.wait_time} seconds.") diff --git a/tmtccmd/tc/definitions.py b/tmtccmd/tc/definitions.py index 11373911..a66b36c5 100644 --- a/tmtccmd/tc/definitions.py +++ b/tmtccmd/tc/definitions.py @@ -1,4 +1,6 @@ from __future__ import annotations + +import enum from enum import Enum from typing import Deque, cast, Type, Any from spacepackets.ccsds.spacepacket import SpacePacket @@ -89,7 +91,7 @@ def __repr__(self): return f"{self.__class__.__name__}({self.timeout_secs!r})" -class CastWrapper: +class PacketCastWrapper: def __init__(self, base: TcQueueEntryBase): self.base = base @@ -126,14 +128,62 @@ def to_space_packet_entry(self) -> SpacePacketEntry: ) -class ProcedureInfo: +class TcProcedureType(enum.Enum): + DEFAULT = 0 + CFDP = 1 + CUSTOM = 2 + + +class TcProcedureBase: + def __init__(self, ptype: TcProcedureType): + self.ptype = ptype + + +class CustomProcedureInfo(TcProcedureBase): + def __init__(self, info: any): + super().__init__(TcProcedureType.CUSTOM) + self.info = info + + def __repr__(self): + return f"{self.__class__.__name__}(info={self.info!r}" + + +class DefaultProcedureInfo(TcProcedureBase): """Generic abstraction for procedures. A procedure can be a single command or a sequence of commands. Generally, one procedure is mapped to a specific TC queue which is packed during run-time""" def __init__(self, service: str, op_code: str): + super().__init__(TcProcedureType.DEFAULT) self.service = service self.op_code = op_code def __repr__(self): return f"CmdInfo(service={self.service!r}, op_code={self.op_code!r}" + + +class ProcedureCastWrapper: + """Cast wrapper to cast the procedure base type back to a concrete type easily""" + + def __init__(self, base: TcProcedureBase): + self.base = base + + def __cast_internally( + self, + obj_type: Type[TcProcedureBase], + obj: TcProcedureBase, + expected_type: TcProcedureType, + ) -> Any: + if obj.ptype != expected_type: + raise TypeError(f"Invalid object {obj} for type {self.base.ptype}") + return cast(obj_type, obj) + + def to_def_procedure(self) -> DefaultProcedureInfo: + return self.__cast_internally( + DefaultProcedureInfo, self.base, TcProcedureType.DEFAULT + ) + + def to_custom_procedure(self) -> CustomProcedureInfo: + return self.__cast_internally( + CustomProcedureInfo, self.base, TcProcedureType.CUSTOM + ) diff --git a/tmtccmd/tc/handler.py b/tmtccmd/tc/handler.py index 4fb8bd4a..f58a205e 100644 --- a/tmtccmd/tc/handler.py +++ b/tmtccmd/tc/handler.py @@ -1,9 +1,8 @@ from abc import abstractmethod -from typing import Optional from tmtccmd.com_if.com_interface_base import CommunicationInterface from tmtccmd.core.modes import ModeWrapper -from tmtccmd.tc.definitions import TcQueueEntryBase, ProcedureInfo +from tmtccmd.tc.definitions import TcQueueEntryBase, TcProcedureBase from tmtccmd.tc.queue import QueueHelper, QueueWrapper @@ -24,9 +23,9 @@ def send_cb(self, tc_queue_entry: TcQueueEntryBase, com_if: CommunicationInterfa pass @abstractmethod - def queue_finished_cb(self, info: ProcedureInfo): + def queue_finished_cb(self, info: TcProcedureBase): pass @abstractmethod - def feed_cb(self, info: Optional[ProcedureInfo], wrapper: FeedWrapper): + def feed_cb(self, info: TcProcedureBase, wrapper: FeedWrapper): pass From 8acd362b0668b38cdbcda88ea2400c1c3b45ad04 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Sat, 25 Jun 2022 23:15:13 +0200 Subject: [PATCH 092/221] documentation --- tmtccmd/tc/handler.py | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/tmtccmd/tc/handler.py b/tmtccmd/tc/handler.py index f58a205e..f027f230 100644 --- a/tmtccmd/tc/handler.py +++ b/tmtccmd/tc/handler.py @@ -15,11 +15,31 @@ def __init__(self, queue_wrapper: QueueWrapper, auto_dispatch: bool): class TcHandlerBase: + """Generic abstraction for a TC handler object. This object then takes care of sending + packets by providing a send callback. It also provides telecommand queues by providing + a queue fedder callback. + """ def __init__(self): pass @abstractmethod def send_cb(self, tc_queue_entry: TcQueueEntryBase, com_if: CommunicationInterface): + """This function callback will be called for each queue entry. This also includes + miscellaneous queue entries, for example the ones used to log additional information. + It is up to the user code implementation to determine the concrete queue entry. + + In general, an implementation will perform the following steps: + + 1. Determine the concrete queue entry. The + :py:class:`tmtccmd.tc.definition.PacketCastWrapper` helper class can be used to do this + 2. If applicable, retrieve the raw data to send from the queue entry and send it using + the generic communication interface + + :param tc_queue_entry: Queue entry base type. The user can cast this back to the concrete + type or just use duck typing if the concrete type is known + :param com_if: Communication interface. Will generally be used to send the packet, + using the py:meth:`tmtccmd.com_if.CommunicationInterface.send` method + """ pass @abstractmethod @@ -28,4 +48,16 @@ def queue_finished_cb(self, info: TcProcedureBase): @abstractmethod def feed_cb(self, info: TcProcedureBase, wrapper: FeedWrapper): + """This function will be called to retrieve a telecommand queue from the user code, based + on a procedure. The passed feed wrapper can be used to set the TC queue or other + parameter like the inter packet delay. + + :param info: Generic base class for a procedure. For example, the + py:class:`tmtccmd.tc.definitions.DefaultProcedureInfo` class uses a service string + and op code string which can be used in the user code to select between different + telecommand queues being packed + :param wrapper: Wrapper type around the queue. It also contains a queue helper class + to simplify adding entries to the telecommand queue + :return: + """ pass From bf084254843e9dc9578ae6e8c50cf0f5b543e08b Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Sat, 25 Jun 2022 23:20:48 +0200 Subject: [PATCH 093/221] doc fixes --- docs/api.rst | 4 ++-- docs/api/tmtccmd.tc.rst | 40 ++++++++++++++++++++++++++++------------ 2 files changed, 30 insertions(+), 14 deletions(-) diff --git a/docs/api.rst b/docs/api.rst index 11acca9a..52487d42 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -17,7 +17,6 @@ tmtccmd.runner module :maxdepth: 4 api/tmtccmd.core - api/tmtccmd.sendreceive Configuration Submodules ========================= @@ -48,4 +47,5 @@ Other Submodules :maxdepth: 4 api/tmtccmd.utility - api/tmtccmd.logging \ No newline at end of file + api/tmtccmd.logging + api/tmtccmd.fsfw diff --git a/docs/api/tmtccmd.tc.rst b/docs/api/tmtccmd.tc.rst index 25d10fbc..1b5fded0 100644 --- a/docs/api/tmtccmd.tc.rst +++ b/docs/api/tmtccmd.tc.rst @@ -12,50 +12,66 @@ tmtccmd.tc.definitions module :undoc-members: :show-inheritance: -tmtccmd.tc.packer module +tmtccmd.tc.handler module ----------------------------- -.. automodule:: tmtccmd.tc.packer +.. automodule:: tmtccmd.tc.handler :members: :undoc-members: :show-inheritance: -tmtccmd.tc.service\_200\_mode module +tmtccmd.tc.queue module +----------------------------- + +.. automodule:: tmtccmd.tc.queue + :members: + :undoc-members: + :show-inheritance: + +tmtccmd.tc.ccsds\_seq\_sender module +----------------------------- + +.. automodule:: tmtccmd.tc.ccsds_seq_sender + :members: + :undoc-members: + :show-inheritance: + +tmtccmd.tc.pus\_200\_fsfw\_modes module ----------------------------------------- -.. automodule:: tmtccmd.tc.service_200_mode +.. automodule:: tmtccmd.tc.pus_200_fsfw_modes :members: :undoc-members: :show-inheritance: -tmtccmd.tc.service\_20\_parameter module +tmtccmd.tc.pus\_20\_params module --------------------------------------------- -.. automodule:: tmtccmd.tc.service_20_parameter +.. automodule:: tmtccmd.tc.pus_20_params :members: :undoc-members: :show-inheritance: -tmtccmd.tc.service\_3\_housekeeping module +tmtccmd.tc.pus\_3\_fsfw\_hk module ----------------------------------------------- -.. automodule:: tmtccmd.tc.service_3_housekeeping +.. automodule:: tmtccmd.tc.pus_3_fsfw_hk :members: :undoc-members: :show-inheritance: -tmtccmd.tc.service\_5\_event module +tmtccmd.tc.pus\_5\_event module ---------------------------------------- -.. automodule:: tmtccmd.tc.service_5_event +.. automodule:: tmtccmd.tc.pus_5_event :members: :undoc-members: :show-inheritance: -tmtccmd.tc.service\_8\_functional\_cmd module +tmtccmd.tc.pus\_8\_funccmd module -------------------------------------------------- -.. automodule:: tmtccmd.tc.service_8_functional_cmd +.. automodule:: tmtccmd.tc.pus_8_funccmd :members: :undoc-members: :show-inheritance: From cb0949e64da2126e1408f7bcb5aaaf2e88ca3268 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Sat, 25 Jun 2022 23:22:55 +0200 Subject: [PATCH 094/221] conf.py fix --- docs/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/conf.py b/docs/conf.py index 8765ce3c..7c2a8233 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -13,7 +13,7 @@ import os import sys -sys.path.insert(0, os.path.abspath("../tmtccmd")) +sys.path.insert(0, os.path.abspath("..")) import tmtccmd # -- Project information ----------------------------------------------------- From 6174d7528c6833b4a9c109e2bffb1cacd4c98022 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Sat, 25 Jun 2022 23:47:22 +0200 Subject: [PATCH 095/221] fix docs, simplify modules --- docs/api.rst | 1 - docs/api/tmtccmd.config.rst | 2 +- docs/api/tmtccmd.core.rst | 8 --- docs/api/tmtccmd.fsfw.rst | 13 +++++ docs/api/tmtccmd.pus.rst | 32 ----------- docs/api/tmtccmd.sendreceive.rst | 53 ------------------ docs/api/tmtccmd.tc.rst | 2 +- docs/api/tmtccmd.tm.rst | 17 ++++++ tmtccmd/ccsds/handler.py | 4 +- tmtccmd/config/args.py | 1 + tmtccmd/config/cfg_hook.py | 2 +- tmtccmd/config/definitions.py | 2 +- tmtccmd/core/__init__.py | 83 ++++++++++++++++++++++++++++ tmtccmd/core/backend.py | 64 --------------------- tmtccmd/core/ccsds_backend.py | 3 +- tmtccmd/core/frontend.py | 4 +- tmtccmd/core/modes.py | 21 ------- tmtccmd/pus/__init__.py | 6 ++ tmtccmd/pus/definitions.py | 6 -- tmtccmd/runner.py | 13 ++--- tmtccmd/tc/handler.py | 4 +- tmtccmd/tc/pus_11_tc_sched.py | 2 +- tmtccmd/tc/pus_20_params.py | 1 + tmtccmd/tm/__init__.py | 15 +++++ tmtccmd/tm/definitions.py | 15 +---- tmtccmd/tm/handler.py | 9 --- tmtccmd/tm/pus_200_fsfw_modes.py | 2 +- tmtccmd/tm/pus_20_fsfw_parameters.py | 2 +- 28 files changed, 157 insertions(+), 230 deletions(-) create mode 100644 docs/api/tmtccmd.fsfw.rst delete mode 100644 docs/api/tmtccmd.sendreceive.rst delete mode 100644 tmtccmd/core/backend.py delete mode 100644 tmtccmd/core/modes.py delete mode 100644 tmtccmd/pus/definitions.py delete mode 100644 tmtccmd/tm/handler.py diff --git a/docs/api.rst b/docs/api.rst index 52487d42..15c74e7a 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -38,7 +38,6 @@ CCSDS & ECSS Submodules api/tmtccmd.pus api/tmtccmd.tc api/tmtccmd.tm - api/tmtccmd.cfdp Other Submodules ========================= diff --git a/docs/api/tmtccmd.config.rst b/docs/api/tmtccmd.config.rst index 1f61869e..920a6a6f 100644 --- a/docs/api/tmtccmd.config.rst +++ b/docs/api/tmtccmd.config.rst @@ -7,7 +7,7 @@ Submodules tmtccmd.config.hook module -------------------------- -.. automodule:: tmtccmd.config.hook +.. automodule:: tmtccmd.config.cfg_hook :members: :undoc-members: :show-inheritance: diff --git a/docs/api/tmtccmd.core.rst b/docs/api/tmtccmd.core.rst index 3a7accbe..ad4229ba 100644 --- a/docs/api/tmtccmd.core.rst +++ b/docs/api/tmtccmd.core.rst @@ -36,14 +36,6 @@ tmtccmd.core.globals\_manager module :undoc-members: :show-inheritance: -tmtccmd.core.object\_id\_manager module ---------------------------------------- - -.. automodule:: tmtccmd.core.object_id_manager - :members: - :undoc-members: - :show-inheritance: - Module contents --------------- diff --git a/docs/api/tmtccmd.fsfw.rst b/docs/api/tmtccmd.fsfw.rst new file mode 100644 index 00000000..884a56c7 --- /dev/null +++ b/docs/api/tmtccmd.fsfw.rst @@ -0,0 +1,13 @@ +tmtccmd.fsfw package +===================== + +Submodules +---------- + +Module contents +--------------- + +.. automodule:: tmtccmd.fsfw + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/api/tmtccmd.pus.rst b/docs/api/tmtccmd.pus.rst index deb55ecf..09dcfde3 100644 --- a/docs/api/tmtccmd.pus.rst +++ b/docs/api/tmtccmd.pus.rst @@ -4,38 +4,6 @@ tmtccmd.pus package Submodules ---------- -tmtccmd.pus.service\_17\_test module ------------------------------------- - -.. automodule:: tmtccmd.pus.service_17_test - :members: - :undoc-members: - :show-inheritance: - -tmtccmd.pus.service\_20\_parameter module ------------------------------------------ - -.. automodule:: tmtccmd.pus.service_20_parameter - :members: - :undoc-members: - :show-inheritance: - -tmtccmd.pus.service\_5\_event module ------------------------------------- - -.. automodule:: tmtccmd.pus.service_5_event - :members: - :undoc-members: - :show-inheritance: - -tmtccmd.pus.service\_list module --------------------------------- - -.. automodule:: tmtccmd.pus.service_list - :members: - :undoc-members: - :show-inheritance: - Module contents --------------- diff --git a/docs/api/tmtccmd.sendreceive.rst b/docs/api/tmtccmd.sendreceive.rst deleted file mode 100644 index 64214da8..00000000 --- a/docs/api/tmtccmd.sendreceive.rst +++ /dev/null @@ -1,53 +0,0 @@ -tmtccmd.sendreceive package -=========================== - -Submodules ----------- - -tmtccmd.sendreceive.cmd\_sender\_receiver module ------------------------------------------------- - -.. automodule:: tmtccmd.sendreceive.cmd_sender_receiver - :members: - :undoc-members: - :show-inheritance: - -tmtccmd.sendreceive.multiple\_cmds\_sender\_receiver module ------------------------------------------------------------ - -.. automodule:: tmtccmd.sendreceive.multiple_cmds_sender_receiver - :members: - :undoc-members: - :show-inheritance: - -tmtccmd.sendreceive.sequential\_sender\_receiver module -------------------------------------------------------- - -.. automodule:: tmtccmd.sendreceive.sequential_sender_receiver - :members: - :undoc-members: - :show-inheritance: - -tmtccmd.sendreceive.single\_command\_sender\_receiver module ------------------------------------------------------------- - -.. automodule:: tmtccmd.sendreceive.single_command_sender_receiver - :members: - :undoc-members: - :show-inheritance: - -tmtccmd.sendreceive.tm\_listener module ---------------------------------------- - -.. automodule:: tmtccmd.sendreceive.tm_listener - :members: - :undoc-members: - :show-inheritance: - -Module contents ---------------- - -.. automodule:: tmtccmd.sendreceive - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/api/tmtccmd.tc.rst b/docs/api/tmtccmd.tc.rst index 1b5fded0..98cce9bc 100644 --- a/docs/api/tmtccmd.tc.rst +++ b/docs/api/tmtccmd.tc.rst @@ -29,7 +29,7 @@ tmtccmd.tc.queue module :show-inheritance: tmtccmd.tc.ccsds\_seq\_sender module ------------------------------ +--------------------------------------- .. automodule:: tmtccmd.tc.ccsds_seq_sender :members: diff --git a/docs/api/tmtccmd.tm.rst b/docs/api/tmtccmd.tm.rst index b61d0b4f..dd972fb1 100644 --- a/docs/api/tmtccmd.tm.rst +++ b/docs/api/tmtccmd.tm.rst @@ -20,6 +20,23 @@ tmtccmd.tm.handler module :undoc-members: :show-inheritance: +tmtccmd.tm.base module +---------------------------------- + +.. automodule:: tmtccmd.tm.base + :members: + :undoc-members: + :show-inheritance: + + +tmtccmd.tm.ccsds_tm_listener module +------------------------------------ + +.. automodule:: tmtccmd.tm.ccsds_tm_listener + :members: + :undoc-members: + :show-inheritance: + tmtccmd.tm.service\_200\_fsfw\_mode module -------------------------------------------- diff --git a/tmtccmd/ccsds/handler.py b/tmtccmd/ccsds/handler.py index c37c3025..396242b5 100644 --- a/tmtccmd/ccsds/handler.py +++ b/tmtccmd/ccsds/handler.py @@ -1,9 +1,7 @@ import abc -from collections import deque from typing import Dict -from tmtccmd.tm.handler import TmHandlerBase -from tmtccmd.tm.definitions import TmTypes +from tmtccmd.tm import TmTypes, TmHandlerBase from tmtccmd.logging import get_console_logger LOGGER = get_console_logger() diff --git a/tmtccmd/config/args.py b/tmtccmd/config/args.py index 945428a6..db969c18 100644 --- a/tmtccmd/config/args.py +++ b/tmtccmd/config/args.py @@ -108,6 +108,7 @@ def process_tmtccmd_args( args: argparse.Namespace, hook_obj: TmTcCfgHookBase, use_prompts: bool ) -> ArgsGroup: """If some arguments are unspecified, they are set here with (variable) default values. + :param args: Arguments from calling parse method :param hook_obj: :param use_prompts: Specify whether terminal prompts are allowed to retrieve unspecified diff --git a/tmtccmd/config/cfg_hook.py b/tmtccmd/config/cfg_hook.py index cf01945c..bc3cd0e5 100644 --- a/tmtccmd/config/cfg_hook.py +++ b/tmtccmd/config/cfg_hook.py @@ -6,7 +6,7 @@ from tmtccmd.logging import get_console_logger from tmtccmd.utility.retval import RetvalDictT from tmtccmd.utility.obj_id import ObjectIdDictT -from tmtccmd.core.backend import BackendBase +from tmtccmd.core import BackendBase from tmtccmd.com_if.com_interface_base import CommunicationInterface LOGGER = get_console_logger() diff --git a/tmtccmd/config/definitions.py b/tmtccmd/config/definitions.py index cd2a6c30..57ae2e23 100644 --- a/tmtccmd/config/definitions.py +++ b/tmtccmd/config/definitions.py @@ -3,7 +3,7 @@ import enum from typing import Tuple, Dict -from tmtccmd.core.modes import ModeWrapper, TmMode, TcMode +from tmtccmd.core import ModeWrapper, TmMode, TcMode def default_json_path() -> str: diff --git a/tmtccmd/core/__init__.py b/tmtccmd/core/__init__.py index e69de29b..9bbdbd48 100644 --- a/tmtccmd/core/__init__.py +++ b/tmtccmd/core/__init__.py @@ -0,0 +1,83 @@ +from abc import abstractmethod +import enum + +from tmtccmd.tc.ccsds_seq_sender import SeqResultWrapper, SenderMode + + +class TcMode(enum.IntEnum): + IDLE = 0 + ONE_QUEUE = 1 + MULTI_QUEUE = 2 + + +class TmMode(enum.IntEnum): + IDLE = 0 + LISTENER = 1 + + +class ModeWrapper: + def __init__(self): + self.tc_mode = TcMode.IDLE + self.tm_mode = TmMode.IDLE + + def __str__(self): + return f"{self.__class__.__name__}: tc_mode={self.tc_mode!r}, tm_mode={self.tm_mode!r}" + + +class Request(enum.IntEnum): + NONE = 0 + TERMINATION_NO_ERROR = 1 + DELAY_IDLE = 2 + DELAY_LISTENER = 3 + DELAY_CUSTOM = 4 + CALL_NEXT = 5 + + +class BackendState: + def __init__( + self, mode_wrapper: ModeWrapper = ModeWrapper(), req: Request = Request.NONE + ): + self._mode_wrapper = mode_wrapper + self._req = req + self._recommended_delay = 0 + self._sender_res = SeqResultWrapper(SenderMode.DONE) + + @property + def next_delay(self): + return self._recommended_delay + + @property + def request(self): + return self._req + + @property + def sender_res(self): + return self._sender_res + + @property + def tc_mode(self): + return self._mode_wrapper.tc_mode + + @property + def tm_mode(self): + return self._mode_wrapper.tm_mode + + @property + def mode_wrapper(self): + return self._mode_wrapper + + +class BackendController: + def __init__(self): + self.next_tc_mode = TcMode.IDLE + self.next_tm_mode = TmMode.IDLE + + +class BackendBase: + @abstractmethod + def start_listener(self, perform_op_immediately: bool): + """Start the backend. Raise RuntimeError on failure""" + + @abstractmethod + def periodic_op(self, ctrl: BackendController) -> BackendState: + pass diff --git a/tmtccmd/core/backend.py b/tmtccmd/core/backend.py deleted file mode 100644 index 3d043f18..00000000 --- a/tmtccmd/core/backend.py +++ /dev/null @@ -1,64 +0,0 @@ -import enum -from abc import abstractmethod - -from tmtccmd.core.modes import ModeWrapper, TcMode, TmMode -from tmtccmd.tc.ccsds_seq_sender import SeqResultWrapper, SenderMode - - -class Request(enum.IntEnum): - NONE = 0 - TERMINATION_NO_ERROR = 1 - DELAY_IDLE = 2 - DELAY_LISTENER = 3 - DELAY_CUSTOM = 4 - CALL_NEXT = 5 - - -class BackendState: - def __init__( - self, mode_wrapper: ModeWrapper = ModeWrapper(), req: Request = Request.NONE - ): - self._mode_wrapper = mode_wrapper - self._req = req - self._recommended_delay = 0 - self._sender_res = SeqResultWrapper(SenderMode.DONE) - - @property - def next_delay(self): - return self._recommended_delay - - @property - def request(self): - return self._req - - @property - def sender_res(self): - return self._sender_res - - @property - def tc_mode(self): - return self._mode_wrapper.tc_mode - - @property - def tm_mode(self): - return self._mode_wrapper.tm_mode - - @property - def mode_wrapper(self): - return self._mode_wrapper - - -class BackendController: - def __init__(self): - self.next_tc_mode = TcMode.IDLE - self.next_tm_mode = TmMode.IDLE - - -class BackendBase: - @abstractmethod - def start_listener(self, perform_op_immediately: bool): - """Start the backend. Raise RuntimeError on failure""" - - @abstractmethod - def periodic_op(self, ctrl: BackendController) -> BackendState: - pass diff --git a/tmtccmd/core/ccsds_backend.py b/tmtccmd/core/ccsds_backend.py index 818fe212..4e3af238 100644 --- a/tmtccmd/core/ccsds_backend.py +++ b/tmtccmd/core/ccsds_backend.py @@ -4,8 +4,7 @@ from typing import Optional from tmtccmd.config.definitions import CoreServiceList, CoreModeList -from tmtccmd.core.backend import BackendBase, BackendState, Request, BackendController -from tmtccmd.core.modes import TcMode, TmMode +from tmtccmd.core import BackendBase, BackendState, Request, BackendController, TcMode, TmMode from tmtccmd.tc.definitions import DefaultProcedureInfo from tmtccmd.tc.handler import TcHandlerBase, FeedWrapper from tmtccmd.tc.queue import QueueWrapper diff --git a/tmtccmd/core/frontend.py b/tmtccmd/core/frontend.py index 23360e4a..2dd78566 100644 --- a/tmtccmd/core/frontend.py +++ b/tmtccmd/core/frontend.py @@ -123,8 +123,8 @@ def run_worker(self): class RunnableThread(QRunnable): - """ - Runnable thread which can be used with QThreadPool. Not used for now, might be needed in the future. + """Runnable thread which can be used with QThreadPool. Not used for now, might be needed + in the future. """ def run(self): diff --git a/tmtccmd/core/modes.py b/tmtccmd/core/modes.py deleted file mode 100644 index 4790a4d5..00000000 --- a/tmtccmd/core/modes.py +++ /dev/null @@ -1,21 +0,0 @@ -import enum - - -class TcMode(enum.IntEnum): - IDLE = 0 - ONE_QUEUE = 1 - MULTI_QUEUE = 2 - - -class TmMode(enum.IntEnum): - IDLE = 0 - LISTENER = 1 - - -class ModeWrapper: - def __init__(self): - self.tc_mode = TcMode.IDLE - self.tm_mode = TmMode.IDLE - - def __str__(self): - return f"{self.__class__.__name__}: tc_mode={self.tc_mode!r}, tm_mode={self.tm_mode!r}" diff --git a/tmtccmd/pus/__init__.py b/tmtccmd/pus/__init__.py index e69de29b..e61e1616 100644 --- a/tmtccmd/pus/__init__.py +++ b/tmtccmd/pus/__init__.py @@ -0,0 +1,6 @@ +from enum import IntEnum +from spacepackets.ecss.definitions import PusServices + + +class CustomPusServices(IntEnum): + SERVICE_200_MODE = 200 diff --git a/tmtccmd/pus/definitions.py b/tmtccmd/pus/definitions.py deleted file mode 100644 index e61e1616..00000000 --- a/tmtccmd/pus/definitions.py +++ /dev/null @@ -1,6 +0,0 @@ -from enum import IntEnum -from spacepackets.ecss.definitions import PusServices - - -class CustomPusServices(IntEnum): - SERVICE_200_MODE = 200 diff --git a/tmtccmd/runner.py b/tmtccmd/runner.py index e4dc46fd..7dab4af5 100644 --- a/tmtccmd/runner.py +++ b/tmtccmd/runner.py @@ -10,8 +10,7 @@ from tmtccmd.config.setup import SetupArgs from tmtccmd.core.ccsds_backend import BackendBase from tmtccmd.core.frontend_base import FrontendBase -from tmtccmd.tm.definitions import TmTypes -from tmtccmd.tm.handler import TmHandlerBase +from tmtccmd.tm import TmTypes, TmHandlerBase from tmtccmd.ccsds.handler import CcsdsTmHandler from tmtccmd.core.globals_manager import ( update_global, @@ -20,11 +19,11 @@ unlock_global_pool, ) from tmtccmd.logging import get_console_logger -from .config.definitions import backend_mode_conversion -from .config.globals import set_default_globals_pre_args_parsing -from .core.modes import ModeWrapper -from .tc.definitions import DefaultProcedureInfo -from .tc.handler import TcHandlerBase +from tmtccmd.config.definitions import backend_mode_conversion +from tmtccmd.config.globals import set_default_globals_pre_args_parsing +from tmtccmd.core import ModeWrapper +from tmtccmd.tc.definitions import DefaultProcedureInfo +from tmtccmd.tc.handler import TcHandlerBase LOGGER = get_console_logger() diff --git a/tmtccmd/tc/handler.py b/tmtccmd/tc/handler.py index f027f230..ab0ebeb6 100644 --- a/tmtccmd/tc/handler.py +++ b/tmtccmd/tc/handler.py @@ -1,13 +1,13 @@ from abc import abstractmethod from tmtccmd.com_if.com_interface_base import CommunicationInterface -from tmtccmd.core.modes import ModeWrapper from tmtccmd.tc.definitions import TcQueueEntryBase, TcProcedureBase from tmtccmd.tc.queue import QueueHelper, QueueWrapper - class FeedWrapper: + def __init__(self, queue_wrapper: QueueWrapper, auto_dispatch: bool): + from tmtccmd.core import ModeWrapper self.queue_helper = QueueHelper(queue_wrapper) self.dispatch_next_queue = auto_dispatch self.pause = False diff --git a/tmtccmd/tc/pus_11_tc_sched.py b/tmtccmd/tc/pus_11_tc_sched.py index efe6d679..3fa654f6 100644 --- a/tmtccmd/tc/pus_11_tc_sched.py +++ b/tmtccmd/tc/pus_11_tc_sched.py @@ -1,6 +1,6 @@ from spacepackets.ecss import PusTelecommand from spacepackets.ecss.conf import FETCH_GLOBAL_APID -from tmtccmd.pus.definitions import PusServices +from tmtccmd.pus import PusServices from tmtccmd.pus.pus_11_tc_sched import Subservices diff --git a/tmtccmd/tc/pus_20_params.py b/tmtccmd/tc/pus_20_params.py index 33c39b3f..f5cf640f 100644 --- a/tmtccmd/tc/pus_20_params.py +++ b/tmtccmd/tc/pus_20_params.py @@ -117,6 +117,7 @@ def pack_type_and_matrix_data(ptc: int, pfc: int, rows: int, columns: int) -> by number of columns and rows in the parameter. See https://ecss.nl/standard/ecss-e-st-70-41c-space-engineering-telemetry-and-telecommand-packet-utilization-15-april-2016/ p.428 for more information. + :param ptc: ECSS PTC number :param pfc: ECSS PFC number :param rows: Number of rows in parameter (for matrix entries, 1 for vector entries, diff --git a/tmtccmd/tm/__init__.py b/tmtccmd/tm/__init__.py index 3cb80158..52f7fd70 100644 --- a/tmtccmd/tm/__init__.py +++ b/tmtccmd/tm/__init__.py @@ -1,6 +1,21 @@ +import enum + from tmtccmd.tm.definitions import TelemetryListT, TelemetryQueueT from tmtccmd.tm.pus_5_event import Service5Tm from tmtccmd.tm.pus_8_funccmd import Service8FsfwTm from tmtccmd.tm.pus_3_fsfw_hk import Service3FsfwTm from tmtccmd.tm.pus_20_fsfw_parameters import Service20FsfwTm from tmtccmd.tm.pus_200_fsfw_modes import Service200FsfwTm + + +class TmTypes(enum.Enum): + NONE = enum.auto + CCSDS_SPACE_PACKETS = enum.auto + + +class TmHandlerBase: + def __init__(self, tm_type: TmTypes): + self._tm_type = tm_type + + def get_type(self): + return self._tm_type diff --git a/tmtccmd/tm/definitions.py b/tmtccmd/tm/definitions.py index 7d3c41ce..1178f928 100644 --- a/tmtccmd/tm/definitions.py +++ b/tmtccmd/tm/definitions.py @@ -1,5 +1,4 @@ -import enum -from typing import Deque, Tuple, List, Union +from typing import Deque, List, Union from spacepackets.ecss.tm import PusTelemetry from tmtccmd.tm.base import PusTmInfoInterface, PusTmInterface @@ -7,18 +6,8 @@ TelemetryQueueT = Deque[bytes] PusTmQueue = Deque[PusTelemetry] -PusTmTupleT = Tuple[bytes, PusTelemetry] - PusTmListT = List[PusTelemetry] + PusTmQueueT = Deque[PusTmListT] PusIFListT = List[Union[PusTmInfoInterface, PusTmInterface]] PusIFQueueT = Deque[PusIFListT] - -PusTmListT = List[PusTelemetry] -PusTmObjQeue = Deque[PusTelemetry] -PusTmTupleQueueT = Deque[PusTmTupleT] - - -class TmTypes(enum.Enum): - NONE = enum.auto - CCSDS_SPACE_PACKETS = enum.auto diff --git a/tmtccmd/tm/handler.py b/tmtccmd/tm/handler.py deleted file mode 100644 index dde37223..00000000 --- a/tmtccmd/tm/handler.py +++ /dev/null @@ -1,9 +0,0 @@ -from tmtccmd.tm.definitions import TmTypes - - -class TmHandlerBase: - def __init__(self, tm_type: TmTypes): - self._tm_type = tm_type - - def get_type(self): - return self._tm_type diff --git a/tmtccmd/tm/pus_200_fsfw_modes.py b/tmtccmd/tm/pus_200_fsfw_modes.py index 2cdfe1ea..f80b8953 100644 --- a/tmtccmd/tm/pus_200_fsfw_modes.py +++ b/tmtccmd/tm/pus_200_fsfw_modes.py @@ -4,7 +4,7 @@ import struct from spacepackets.ecss.tm import CdsShortTimestamp, PusVersion, PusTelemetry -from tmtccmd.pus.definitions import CustomPusServices +from tmtccmd.pus import CustomPusServices from tmtccmd.pus.pus_200_fsfw_mode import Subservices from tmtccmd.tm.base import PusTmInfoBase, PusTmBase diff --git a/tmtccmd/tm/pus_20_fsfw_parameters.py b/tmtccmd/tm/pus_20_fsfw_parameters.py index fb70e4e4..e9faa227 100644 --- a/tmtccmd/tm/pus_20_fsfw_parameters.py +++ b/tmtccmd/tm/pus_20_fsfw_parameters.py @@ -57,7 +57,7 @@ def __init__( destination_id: int = 0, ): pus_tm = PusTelemetry( - service=PusServices.SERVICE_20_PARAMETER, + service=PusServices.S20_PARAMETER, subservice=subservice_id, time=time, ssc=ssc, From 43a41f48b946c697f7764ee7e7feb0040bfaf152 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Sat, 25 Jun 2022 23:54:58 +0200 Subject: [PATCH 096/221] docs compiling again --- docs/api/tmtccmd.core.rst | 8 ----- docs/api/tmtccmd.tm.rst | 61 +++++++++++++++++++-------------------- tmtccmd/runner.py | 30 +------------------ 3 files changed, 31 insertions(+), 68 deletions(-) diff --git a/docs/api/tmtccmd.core.rst b/docs/api/tmtccmd.core.rst index ad4229ba..2e16e68b 100644 --- a/docs/api/tmtccmd.core.rst +++ b/docs/api/tmtccmd.core.rst @@ -4,14 +4,6 @@ tmtccmd.core package Submodules ---------- -tmtccmd.core.backend module ---------------------------- - -.. automodule:: tmtccmd.core.backend - :members: - :undoc-members: - :show-inheritance: - tmtccmd.core.frontend module ---------------------------- diff --git a/docs/api/tmtccmd.tm.rst b/docs/api/tmtccmd.tm.rst index dd972fb1..211b8f7d 100644 --- a/docs/api/tmtccmd.tm.rst +++ b/docs/api/tmtccmd.tm.rst @@ -12,83 +12,82 @@ tmtccmd.tm.definitions module :undoc-members: :show-inheritance: -tmtccmd.tm.handler module ----------------------------------- +tmtccmd.tm.ccsds_tm_listener module +------------------------------------ -.. automodule:: tmtccmd.tm.handler +.. automodule:: tmtccmd.tm.ccsds_tm_listener :members: :undoc-members: :show-inheritance: -tmtccmd.tm.base module ----------------------------------- +tmtccmd.tm.pus\_1\_verification module +--------------------------------------- -.. automodule:: tmtccmd.tm.base +.. automodule:: tmtccmd.tm.pus_1_verification :members: :undoc-members: :show-inheritance: +tmtccmd.tm.pus\_5\_event module +---------------------------------------- -tmtccmd.tm.ccsds_tm_listener module ------------------------------------- - -.. automodule:: tmtccmd.tm.ccsds_tm_listener +.. automodule:: tmtccmd.tm.pus_5_event :members: :undoc-members: :show-inheritance: -tmtccmd.tm.service\_200\_fsfw\_mode module --------------------------------------------- +tmtccmd.tm.pus\_8\_funccmd module +----------------------------------------------------- -.. automodule:: tmtccmd.tm.service_200_fsfw_mode +.. automodule:: tmtccmd.tm.pus_8_funccmd :members: :undoc-members: :show-inheritance: -tmtccmd.tm.service\_20\_fsfw\_parameters module ------------------------------------------------- +tmtccmd.tm.service\_2\_raw\_cmd module +------------------------------------------- -.. automodule:: tmtccmd.tm.service_20_fsfw_parameters +.. automodule:: tmtccmd.tm.pus_2_rawcmd :members: :undoc-members: :show-inheritance: -tmtccmd.tm.service\_2\_raw\_cmd module -------------------------------------------- +tmtccmd.tm.pus\_3\_hk\_base module +--------------------------------------- -.. automodule:: tmtccmd.tm.service_2_raw_cmd +.. automodule:: tmtccmd.tm.pus_3_hk_base :members: :undoc-members: :show-inheritance: -tmtccmd.tm.service\_3\_base module ---------------------------------------- +tmtccmd.tm.pus\_3\_fsfw\_hk module +-------------------------------------------------- -.. automodule:: tmtccmd.tm.service_3_base +.. automodule:: tmtccmd.tm.pus_3_fsfw_hk :members: :undoc-members: :show-inheritance: -tmtccmd.tm.service\_3\_fsfw\_housekeeping module --------------------------------------------------- +tmtccmd.tm.pus\_20\_fsfw\_parameters module +------------------------------------------------ -.. automodule:: tmtccmd.tm.service_3_fsfw_housekeeping +.. automodule:: tmtccmd.tm.pus_20_fsfw_parameters :members: :undoc-members: :show-inheritance: -tmtccmd.tm.service\_5\_event module ----------------------------------------- +tmtccmd.tm.pus\_200\_fsfw\_modes module +-------------------------------------------- -.. automodule:: tmtccmd.tm.service_5_event +.. automodule:: tmtccmd.tm.pus_200_fsfw_modes :members: :undoc-members: :show-inheritance: -tmtccmd.tm.service\_8\_fsfw\_functional\_cmd module ------------------------------------------------------ +tmtccmd.tm.base module +---------------------------------- -.. automodule:: tmtccmd.tm.service_8_fsfw_functional_cmd +.. automodule:: tmtccmd.tm.base :members: :undoc-members: :show-inheritance: diff --git a/tmtccmd/runner.py b/tmtccmd/runner.py index 7dab4af5..bc3d2d7c 100644 --- a/tmtccmd/runner.py +++ b/tmtccmd/runner.py @@ -12,12 +12,7 @@ from tmtccmd.core.frontend_base import FrontendBase from tmtccmd.tm import TmTypes, TmHandlerBase from tmtccmd.ccsds.handler import CcsdsTmHandler -from tmtccmd.core.globals_manager import ( - update_global, - get_global, - lock_global_pool, - unlock_global_pool, -) +from tmtccmd.core.globals_manager import update_global from tmtccmd.logging import get_console_logger from tmtccmd.config.definitions import backend_mode_conversion from tmtccmd.config.globals import set_default_globals_pre_args_parsing @@ -35,19 +30,6 @@ def version() -> str: return __version__ -def add_ccsds_handler(ccsds_handler: CcsdsTmHandler): - """Add a handler for CCSDS space packets, for example PUS packets - - :param ccsds_handler: CCSDS handler for all CCSDS packets, e.g. Space Packets - :return: - """ - lock_global_pool() - tm_handler = get_global(CoreGlobalIds.TM_HANDLER_HANDLE) - if tm_handler is None: - update_global(CoreGlobalIds.TM_HANDLER_HANDLE, ccsds_handler) - unlock_global_pool() - - def setup(setup_args: SetupArgs): """This function needs to be called first before running the TMTC commander core. The setup arguments encapsulate all required arguments for the TMTC commander. @@ -165,16 +147,6 @@ def __start_tmtc_commander_qt_gui( sys.exit(1) -""" -def __get_backend_init_variables(): - service = get_global(CoreGlobalIds.CURRENT_SERVICE) - op_code = get_global(CoreGlobalIds.OP_CODE) - com_if = get_global(CoreGlobalIds.COM_IF) - mode = get_global(CoreGlobalIds.MODE) - return service, op_code, com_if, mode -""" - - def create_default_tmtc_backend( setup_args: SetupArgs, tm_handler: TmHandlerBase, tc_handler: TcHandlerBase ) -> BackendBase: From d5d2a56c3fd625535bc343e78c09654c82a73a05 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Sat, 25 Jun 2022 23:55:16 +0200 Subject: [PATCH 097/221] re-run black --- tests/test_printer.py | 2 +- tmtccmd/core/ccsds_backend.py | 9 ++++++++- tmtccmd/tc/handler.py | 4 +++- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/tests/test_printer.py b/tests/test_printer.py index c12c8c18..45f2e685 100644 --- a/tests/test_printer.py +++ b/tests/test_printer.py @@ -40,7 +40,7 @@ def test_pus_loggers(self): pus_tm = Service1TMExtended( subservice=1, time=CdsShortTimestamp.init_from_current_time(), - tc_request_id=RequestId(pus_tc.packet_id, pus_tc.packet_seq_ctrl) + tc_request_id=RequestId(pus_tc.packet_id, pus_tc.packet_seq_ctrl), ) self.raw_tmtc_log.log_tm(pus_tm.pus_tm) self.assertTrue(Path(self.regular_file_name).exists()) diff --git a/tmtccmd/core/ccsds_backend.py b/tmtccmd/core/ccsds_backend.py index 4e3af238..7bcd3c70 100644 --- a/tmtccmd/core/ccsds_backend.py +++ b/tmtccmd/core/ccsds_backend.py @@ -4,7 +4,14 @@ from typing import Optional from tmtccmd.config.definitions import CoreServiceList, CoreModeList -from tmtccmd.core import BackendBase, BackendState, Request, BackendController, TcMode, TmMode +from tmtccmd.core import ( + BackendBase, + BackendState, + Request, + BackendController, + TcMode, + TmMode, +) from tmtccmd.tc.definitions import DefaultProcedureInfo from tmtccmd.tc.handler import TcHandlerBase, FeedWrapper from tmtccmd.tc.queue import QueueWrapper diff --git a/tmtccmd/tc/handler.py b/tmtccmd/tc/handler.py index ab0ebeb6..5b9cd111 100644 --- a/tmtccmd/tc/handler.py +++ b/tmtccmd/tc/handler.py @@ -4,10 +4,11 @@ from tmtccmd.tc.definitions import TcQueueEntryBase, TcProcedureBase from tmtccmd.tc.queue import QueueHelper, QueueWrapper -class FeedWrapper: +class FeedWrapper: def __init__(self, queue_wrapper: QueueWrapper, auto_dispatch: bool): from tmtccmd.core import ModeWrapper + self.queue_helper = QueueHelper(queue_wrapper) self.dispatch_next_queue = auto_dispatch self.pause = False @@ -19,6 +20,7 @@ class TcHandlerBase: packets by providing a send callback. It also provides telecommand queues by providing a queue fedder callback. """ + def __init__(self): pass From 4449b74bc353f06c4a6ddb3e379eeba9e6526ce5 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Sun, 26 Jun 2022 00:02:33 +0200 Subject: [PATCH 098/221] simplify module arch again --- examples/tmtccli.py | 3 ++- tmtccmd/config/__init__.py | 36 ++++++++++++++++++++++++++++++++++-- tmtccmd/config/args.py | 4 ++-- tmtccmd/config/setup.py | 34 ---------------------------------- tmtccmd/runner.py | 3 +-- 5 files changed, 39 insertions(+), 41 deletions(-) delete mode 100644 tmtccmd/config/setup.py diff --git a/examples/tmtccli.py b/examples/tmtccli.py index 0e751848..4faab208 100755 --- a/examples/tmtccli.py +++ b/examples/tmtccli.py @@ -2,12 +2,13 @@ """Example application for the TMTC Commander""" import tmtccmd.runner from tmtccmd.ccsds.handler import CcsdsTmHandler, ApidTmHandlerBase -from tmtccmd.config import SetupArgs, default_json_path +from tmtccmd.config import default_json_path from tmtccmd.config.args import ( create_default_args_parser, add_default_tmtccmd_args, parse_default_tmtccmd_input_arguments, ) +from tmtccmd.config.setup import SetupArgs from tmtccmd.logging import get_console_logger from config.hook_implementation import ExampleHookClass diff --git a/tmtccmd/config/__init__.py b/tmtccmd/config/__init__.py index 3fff69e5..abc07918 100644 --- a/tmtccmd/config/__init__.py +++ b/tmtccmd/config/__init__.py @@ -1,7 +1,39 @@ +from typing import Optional + from tmtccmd.config.globals import CoreServiceList +from .args import ArgParserWrapper from .definitions import ( CoreGlobalIds, - OpCodeDictKeys, - default_json_path, + OpCodeDictKeys, default_json_path ) from tmtccmd.config.cfg_hook import TmTcCfgHookBase + + +class SetupArgs: + def __init__( + self, + hook_obj: TmTcCfgHookBase, + use_gui: bool, + apid: int, + args_wrapper: Optional[ArgParserWrapper], + json_cfg_path: Optional[str] = None, + reduced_printout: bool = False, + use_ansi_colors: bool = True, + ): + """This class encapsulates all required objects for the TMTC commander + :param hook_obj: User hook object. Needs to be implemented by the user + :param args_wrapper: Command line arguments as returned by the ArgumentParser.parse_args method + :param use_gui: Specify whether a GUI is used + :param reduced_printout: + :param use_ansi_colors: + """ + self.hook_obj = hook_obj + self.use_gui = use_gui + self.apid = apid + self.json_cfg_path = json_cfg_path + self.reduced_printout = reduced_printout + self.ansi_colors = use_ansi_colors + self.args_wrapper = args_wrapper + self.json_cfg_path = json_cfg_path + if json_cfg_path is None: + self.json_cfg_path = default_json_path() diff --git a/tmtccmd/config/args.py b/tmtccmd/config/args.py index db969c18..0a92c9a0 100644 --- a/tmtccmd/config/args.py +++ b/tmtccmd/config/args.py @@ -6,11 +6,9 @@ from typing import Optional, List from dataclasses import dataclass -from tmtccmd.com_if.com_if_utilities import determine_com_if from tmtccmd.config.definitions import CoreModeList, CoreComInterfaces from tmtccmd.config.prompt import prompt_service, prompt_op_code from tmtccmd.config.cfg_hook import TmTcCfgHookBase -from tmtccmd.utility.conf_util import AnsiColors from tmtccmd.logging import get_console_logger @@ -18,6 +16,7 @@ def get_default_descript_txt() -> str: + from tmtccmd.utility.conf_util import AnsiColors return ( f"{AnsiColors.GREEN}TMTC Client Command Line Interface\n" f"{AnsiColors.RESET}This application provides generic components to execute " @@ -116,6 +115,7 @@ def process_tmtccmd_args( :return: None """ from tmtccmd.config.definitions import CoreModeStrings + from tmtccmd.com_if.com_if_utilities import determine_com_if group = ArgsGroup() if args.com_if is None or args.com_if == CoreComInterfaces.UNSPECIFIED.value: diff --git a/tmtccmd/config/setup.py b/tmtccmd/config/setup.py deleted file mode 100644 index 0c9c3f75..00000000 --- a/tmtccmd/config/setup.py +++ /dev/null @@ -1,34 +0,0 @@ -from typing import Optional - -from tmtccmd.config import TmTcCfgHookBase, default_json_path -from tmtccmd.config.args import ArgParserWrapper - - -class SetupArgs: - def __init__( - self, - hook_obj: TmTcCfgHookBase, - use_gui: bool, - apid: int, - args_wrapper: Optional[ArgParserWrapper], - json_cfg_path: Optional[str] = None, - reduced_printout: bool = False, - use_ansi_colors: bool = True, - ): - """This class encapsulates all required objects for the TMTC commander - :param hook_obj: User hook object. Needs to be implemented by the user - :param args_wrapper: Command line arguments as returned by the ArgumentParser.parse_args method - :param use_gui: Specify whether a GUI is used - :param reduced_printout: - :param use_ansi_colors: - """ - self.hook_obj = hook_obj - self.use_gui = use_gui - self.apid = apid - self.json_cfg_path = json_cfg_path - self.reduced_printout = reduced_printout - self.ansi_colors = use_ansi_colors - self.args_wrapper = args_wrapper - self.json_cfg_path = json_cfg_path - if json_cfg_path is None: - self.json_cfg_path = default_json_path() diff --git a/tmtccmd/runner.py b/tmtccmd/runner.py index bc3d2d7c..7ce7ddf8 100644 --- a/tmtccmd/runner.py +++ b/tmtccmd/runner.py @@ -6,8 +6,7 @@ from tmtccmd import __version__ from tmtccmd.core.ccsds_backend import CcsdsTmtcBackend from tmtccmd.tm.ccsds_tm_listener import CcsdsTmListener -from tmtccmd.config import TmTcCfgHookBase, CoreGlobalIds -from tmtccmd.config.setup import SetupArgs +from tmtccmd.config import TmTcCfgHookBase, CoreGlobalIds, SetupArgs from tmtccmd.core.ccsds_backend import BackendBase from tmtccmd.core.frontend_base import FrontendBase from tmtccmd.tm import TmTypes, TmHandlerBase From 961ef8b1ca82782137a80df22aa18227d245d525 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Sun, 26 Jun 2022 00:21:11 +0200 Subject: [PATCH 099/221] simplified example file structure --- examples/common.py | 97 +++++++++++++ examples/config/__init__.py | 0 examples/config/definitions.py | 17 --- examples/config/hook_implementation.py | 59 -------- examples/config/tm_handler.py | 31 ---- examples/tmtccli.py | 22 ++- tests/test_runner.py | 5 - tmtccmd/__init__.py | 193 +++++++++++++++++++++++++ tmtccmd/config/__init__.py | 5 +- tmtccmd/config/args.py | 1 + tmtccmd/runner.py | 192 ------------------------ 11 files changed, 302 insertions(+), 320 deletions(-) create mode 100644 examples/common.py delete mode 100644 examples/config/__init__.py delete mode 100644 examples/config/definitions.py delete mode 100644 examples/config/hook_implementation.py delete mode 100644 examples/config/tm_handler.py delete mode 100644 tmtccmd/runner.py diff --git a/examples/common.py b/examples/common.py new file mode 100644 index 00000000..9edb1dcb --- /dev/null +++ b/examples/common.py @@ -0,0 +1,97 @@ +from typing import Optional + +from spacepackets.ecss import PusTelemetry +from tmtccmd import get_console_logger, TcHandlerBase, TmTcCfgHookBase, CcsdsTmtcBackend +from tmtccmd.ccsds.handler import ApidTmHandlerBase +from tmtccmd.com_if.com_interface_base import CommunicationInterface +from tmtccmd.config.tmtc_defs import TmTcDefWrapper +from tmtccmd.logging.pus import RawTmtcTimedLogWrapper +from tmtccmd.tc.definitions import ( + TcProcedureBase, + TcQueueEntryBase, + PacketCastWrapper, + TcQueueEntryType, +) +from tmtccmd.tc.handler import FeedWrapper +from tmtccmd.tm import Service5Tm +from tmtccmd.tm.pus_17_test import Service17TMExtended +from tmtccmd.utility.obj_id import ObjectIdDictT +from tmtccmd.utility.tmtc_printer import FsfwTmTcPrinter + +APID = 0xEF +LOGGER = get_console_logger() + + +class ExampleHookClass(TmTcCfgHookBase): + def __init__(self, json_cfg_path: str): + super().__init__(json_cfg_path=json_cfg_path) + + def assign_communication_interface( + self, com_if_key: str + ) -> Optional[CommunicationInterface]: + from tmtccmd.config.com_if import create_communication_interface_default + + LOGGER.info("Communication interface assignment function was called") + return create_communication_interface_default( + com_if_key=com_if_key, + json_cfg_path=self.json_cfg_path, + ) + + def get_tmtc_definitions(self) -> TmTcDefWrapper: + from tmtccmd.config.globals import get_default_tmtc_defs + + return get_default_tmtc_defs() + + def perform_mode_operation(self, tmtc_backend: CcsdsTmtcBackend, mode: int): + LOGGER.info("Mode operation hook was called") + pass + + def get_object_ids(self) -> ObjectIdDictT: + from tmtccmd.config.objects import get_core_object_ids + + return get_core_object_ids() + + +class PusHandler(ApidTmHandlerBase): + def __init__(self, printer: FsfwTmTcPrinter, raw_logger: RawTmtcTimedLogWrapper): + super().__init__(APID, None) + self.printer = printer + self.raw_logger = raw_logger + + def handle_tm(self, packet: bytes, _user_args: any): + try: + tm_packet = PusTelemetry.unpack(packet) + except ValueError: + LOGGER.warning("Could not generate PUS TM object from raw data") + LOGGER.warning(f"Raw Packet: [{packet.hex(sep=',')}], REPR: {packet!r}") + return + service = tm_packet.service + if service == 1: + tm_packet = Service17TMExtended.unpack(packet) + if service == 5: + tm_packet = Service5Tm.unpack(packet) + if service == 17: + tm_packet = Service17TMExtended.unpack(packet) + if tm_packet is None: + LOGGER.info( + f"The service {service} is not implemented in Telemetry Factory" + ) + tm_packet = PusTelemetry.unpack(packet) + self.printer.handle_long_tm_print(packet_if=tm_packet, info_if=tm_packet) + + +class TcHandler(TcHandlerBase): + def send_cb(self, tc_queue_entry: TcQueueEntryBase, com_if: CommunicationInterface): + cast_wrapper = PacketCastWrapper(tc_queue_entry) + if tc_queue_entry.is_tc(): + if tc_queue_entry.etype == TcQueueEntryType.PUS_TC: + pus_tc_wrapper = cast_wrapper.to_pus_tc_entry() + raw_tc = pus_tc_wrapper.pus_tc.pack() + LOGGER.info(pus_tc_wrapper.pus_tc) + com_if.send(raw_tc) + + def queue_finished_cb(self, info: TcProcedureBase): + pass + + def feed_cb(self, info: TcProcedureBase, wrapper: FeedWrapper): + pass diff --git a/examples/config/__init__.py b/examples/config/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/examples/config/definitions.py b/examples/config/definitions.py deleted file mode 100644 index a2c891e6..00000000 --- a/examples/config/definitions.py +++ /dev/null @@ -1,17 +0,0 @@ -from spacepackets.ecss import PusTelecommand - -from tmtccmd.com_if.com_interface_base import CommunicationInterface -from tmtccmd.logging import get_console_logger - -APID = 0xEF -LOGGER = get_console_logger() - - -def pre_send_cb( - data: bytes, - com_if: CommunicationInterface, - cmd_info: PusTelecommand, - _user_args: any, -): - LOGGER.info(cmd_info) - com_if.send(data=data) diff --git a/examples/config/hook_implementation.py b/examples/config/hook_implementation.py deleted file mode 100644 index 089d5122..00000000 --- a/examples/config/hook_implementation.py +++ /dev/null @@ -1,59 +0,0 @@ -import argparse -from typing import Union, Tuple - -from tmtccmd.config.definitions import ServiceOpCodeDictT -from tmtccmd.config.cfg_hook import TmTcCfgHookBase, ObjectIdDictT -from tmtccmd.logging import get_console_logger -from tmtccmd.core.ccsds_backend import CcsdsTmtcBackend -from tmtccmd.tc.definitions import QueueHelper -from tmtccmd.com_if.com_interface_base import CommunicationInterface - -from .definitions import APID - -LOGGER = get_console_logger() - - -class ExampleHookClass(TmTcCfgHookBase): - def __init__(self, json_cfg_path: str): - super().__init__(json_cfg_path=json_cfg_path) - - def assign_communication_interface( - self, com_if_key: str - ) -> Union[CommunicationInterface, None]: - from tmtccmd.config.com_if import create_communication_interface_default - - LOGGER.info("Communication interface assignment function was called") - return create_communication_interface_default( - com_if_key=com_if_key, - json_cfg_path=self.json_cfg_path, - ) - - def perform_mode_operation(self, tmtc_backend: CcsdsTmtcBackend, mode: int): - LOGGER.info("Mode operation hook was called") - pass - - def pack_service_queue( - self, service: Union[str, int], op_code: str, tc_queue: QueueHelper - ): - from tmtccmd.tc.packer import default_service_queue_preparation - - LOGGER.info("Service queue packer hook was called") - default_service_queue_preparation( - service=service, op_code=op_code, service_queue=tc_queue - ) - - def get_object_ids(self) -> ObjectIdDictT: - from tmtccmd.config.objects import get_core_object_ids - - return get_core_object_ids() - - def get_tmtc_definitions(self) -> ServiceOpCodeDictT: - from tmtccmd.config.globals import get_default_tmtc_defs - - return get_default_tmtc_defs() - - @staticmethod - def handle_service_8_telemetry( - object_id: int, action_id: int, custom_data: bytearray - ) -> Tuple[list, list]: - pass diff --git a/examples/config/tm_handler.py b/examples/config/tm_handler.py deleted file mode 100644 index f6fe5559..00000000 --- a/examples/config/tm_handler.py +++ /dev/null @@ -1,31 +0,0 @@ -from spacepackets.ecss import PusTelemetry -from tmtccmd.tm.pus_17_test import Service17TMExtended -from tmtccmd.tm import Service5Tm -from tmtccmd.utility.tmtc_printer import FsfwTmTcPrinter -from tmtccmd.logging import get_console_logger - -LOGGER = get_console_logger() -FSFW_PRINTER = FsfwTmTcPrinter(None) - - -def default_ccsds_packet_handler(_apid: int, raw_tm_packet: bytes, _user_args: any): - """Default implementation only prints the packet""" - default_factory_hook(raw_tm_packet=raw_tm_packet) - - -def default_factory_hook(raw_tm_packet: bytes): - printer = FsfwTmTcPrinter(None) - service_type = raw_tm_packet[7] - tm_packet = None - if service_type == 1: - tm_packet = Service17TMExtended.unpack(raw_telemetry=raw_tm_packet) - if service_type == 5: - tm_packet = Service5Tm.unpack(raw_telemetry=raw_tm_packet) - if service_type == 17: - tm_packet = Service17TMExtended.unpack(raw_telemetry=raw_tm_packet) - if tm_packet is None: - LOGGER.info( - f"The service {service_type} is not implemented in Telemetry Factory" - ) - tm_packet = PusTelemetry.unpack(raw_telemetry=raw_tm_packet) - printer.handle_long_tm_print(packet_if=tm_packet, info_if=tm_packet) diff --git a/examples/tmtccli.py b/examples/tmtccli.py index 4faab208..843767f2 100755 --- a/examples/tmtccli.py +++ b/examples/tmtccli.py @@ -1,14 +1,10 @@ #!/usr/bin/env python3 """Example application for the TMTC Commander""" -import tmtccmd.runner +import tmtccmd from tmtccmd.ccsds.handler import CcsdsTmHandler, ApidTmHandlerBase from tmtccmd.config import default_json_path -from tmtccmd.config.args import ( - create_default_args_parser, - add_default_tmtccmd_args, - parse_default_tmtccmd_input_arguments, -) -from tmtccmd.config.setup import SetupArgs +from tmtccmd.config.args import ArgParserWrapper +from tmtccmd.config import SetupArgs from tmtccmd.logging import get_console_logger from config.hook_implementation import ExampleHookClass @@ -19,12 +15,14 @@ def main(): - tmtccmd.runner.init_printout(False) + print(f"-- example tmtc v{tmtccmd.__version__} --") + tmtccmd.init_printout(False) hook_obj = ExampleHookClass(json_cfg_path=default_json_path()) - arg_parser = create_default_args_parser() - add_default_tmtccmd_args(arg_parser) - args = parse_default_tmtccmd_input_arguments(arg_parser, hook_obj) - setup_args = SetupArgs(hook_obj=hook_obj, use_gui=False, apid=APID, cli_args=args) + parser_wrapper = ArgParserWrapper() + parser_wrapper.parse(hook_obj, True) + setup_args = SetupArgs( + hook_obj=hook_obj, use_gui=False, apid=APID, args_wrapper=parser_wrapper + ) apid_handler = ApidTmHandlerBase( cb=default_ccsds_packet_handler, max_queue_len=50, user_args=None ) diff --git a/tests/test_runner.py b/tests/test_runner.py index 865c5b36..09a440a5 100644 --- a/tests/test_runner.py +++ b/tests/test_runner.py @@ -1,9 +1,4 @@ from unittest import TestCase -from tmtccmd.ccsds.handler import CcsdsTmHandler -import tmtccmd.runner as tmtccmd - -from .backend_mock import create_backend_mock, create_frontend_mock -from .hook_obj_mock import create_hook_mock class TestTmtcRunner(TestCase): diff --git a/tmtccmd/__init__.py b/tmtccmd/__init__.py index 2adbf251..b464c759 100644 --- a/tmtccmd/__init__.py +++ b/tmtccmd/__init__.py @@ -1,3 +1,23 @@ +"""Contains core methods called by entry point files to setup and start a tmtccmd application""" +import sys +import os +from typing import Union, cast + +from tmtccmd.core.ccsds_backend import CcsdsTmtcBackend +from tmtccmd.tm.ccsds_tm_listener import CcsdsTmListener +from tmtccmd.config import TmTcCfgHookBase, CoreGlobalIds, SetupArgs +from tmtccmd.core.ccsds_backend import BackendBase +from tmtccmd.core.frontend_base import FrontendBase +from tmtccmd.tm import TmTypes, TmHandlerBase +from tmtccmd.ccsds.handler import CcsdsTmHandler +from tmtccmd.core.globals_manager import update_global +from tmtccmd.logging import get_console_logger +from tmtccmd.config.definitions import backend_mode_conversion +from tmtccmd.config.globals import set_default_globals_pre_args_parsing +from tmtccmd.core import ModeWrapper +from tmtccmd.tc.definitions import DefaultProcedureInfo +from tmtccmd.tc.handler import TcHandlerBase + VERSION_NAME = "tmtccmd" VERSION_MAJOR = 2 VERSION_MINOR = 2 @@ -6,3 +26,176 @@ # I think this needs to be in string representation to be parsed so we can't # use a formatted string here. __version__ = "2.2.2" + + +LOGGER = get_console_logger() + +__SETUP_WAS_CALLED = False +__SETUP_FOR_GUI = False + + +def version() -> str: + return __version__ + + +def setup(setup_args: SetupArgs): + """This function needs to be called first before running the TMTC commander core. The setup + arguments encapsulate all required arguments for the TMTC commander. + + :param setup_args: Setup arguments + """ + global __SETUP_WAS_CALLED, __SETUP_FOR_GUI + + if os.name == "nt": + import colorama + + colorama.init() + + __assign_tmtc_commander_hooks(hook_object=setup_args.hook_obj) + + if setup_args.use_gui: + set_default_globals_pre_args_parsing(setup_args.apid) + if not setup_args.use_gui: + __handle_cli_args_and_globals(setup_args) + __SETUP_FOR_GUI = setup_args.use_gui + __SETUP_WAS_CALLED = True + + +def start( + tmtc_backend: BackendBase, + tmtc_frontend: Union[FrontendBase, None] = None, + app_name: str = "TMTC Commander", +): + """This is the primary function to run the TMTC commander. Users should call this function to + start the TMTC commander. Please note that :py:func:`setup` needs to be + called before this function. You also need to build a TMTC backend + instance and pass it to this call. You can use :py:func:`create_default_tmtc_backend` + to create a generic backend. + + :param tmtc_backend: Custom backend can be passed here. Otherwise, a default backend + will be created + :param tmtc_frontend: Custom frontend can be passed here. Otherwise, a default frontend + will be created + :param app_name: Name of application. Will be displayed in GUI + :raises RunTimeError: if :py:func:`setup` was not called before + :return: + """ + global __SETUP_WAS_CALLED, __SETUP_FOR_GUI + if not __SETUP_WAS_CALLED: + LOGGER.warning("setup_tmtccmd was not called first. Call it first") + sys.exit(1) + if __SETUP_FOR_GUI: + __start_tmtc_commander_qt_gui( + tmtc_frontend=tmtc_frontend, tmtc_backend=tmtc_backend, app_name=app_name + ) + else: + __start_tmtc_commander_cli(tmtc_backend=tmtc_backend) + + +def init_and_start_daemons(tmtc_backend: BackendBase): + if __SETUP_FOR_GUI: + LOGGER.error("daemon mode only supported in cli mode") + sys.exit(1) + __start_tmtc_commander_cli(tmtc_backend=tmtc_backend, perform_op_immediately=False) + + +def __assign_tmtc_commander_hooks(hook_object: TmTcCfgHookBase): + if hook_object is None: + raise ValueError + # Insert hook object handle into global dictionary so it can be used by the TMTC commander + update_global(CoreGlobalIds.TMTC_HOOK, hook_object) + + +def init_printout(use_gui: bool): + if use_gui: + print(f"-- tmtccmd v{version()} GUI Mode --") + else: + print(f"-- tmtccmd v{version()} CLI Mode --") + + +def __handle_cli_args_and_globals(setup_args: SetupArgs): + LOGGER.info("Setting up pre-globals..") + set_default_globals_pre_args_parsing(setup_args.apid) + LOGGER.info("Setting up post-globals..") + + +def __start_tmtc_commander_cli( + tmtc_backend: BackendBase, perform_op_immediately: bool = True +): + # __get_backend_init_variables() + tmtc_backend.start_listener(perform_op_immediately) + + +def __start_tmtc_commander_qt_gui( + tmtc_backend: BackendBase, + tmtc_frontend: Union[None, FrontendBase] = None, + app_name: str = "TMTC Commander", +): + global __SETUP_WAS_CALLED + try: + from PyQt5.QtWidgets import QApplication + + if not __SETUP_WAS_CALLED: + LOGGER.warning("setup_tmtccmd was not called first. Call it first") + sys.exit(1) + app = QApplication([app_name]) + if tmtc_frontend is None: + from tmtccmd.core.frontend import TmTcFrontend + from tmtccmd.config.cfg_hook import get_global_hook_obj + from tmtccmd.core.ccsds_backend import CcsdsTmtcBackend + + tmtc_frontend = TmTcFrontend( + hook_obj=get_global_hook_obj(), + tmtc_backend=cast(CcsdsTmtcBackend, tmtc_backend), + app_name=app_name, + ) + tmtc_frontend.start(app) + except ImportError: + LOGGER.error("PyQt5 module not installed, can't run GUI mode!") + sys.exit(1) + + +def create_default_tmtc_backend( + setup_args: SetupArgs, tm_handler: TmHandlerBase, tc_handler: TcHandlerBase +) -> BackendBase: + """Creates a default TMTC backend instance which can be passed to the tmtccmd runner + + :param tc_handler: + :param setup_args: + :param tm_handler: + :return: + """ + global __SETUP_WAS_CALLED + + from typing import cast + + if not __SETUP_WAS_CALLED: + LOGGER.warning("setup_tmtccmd was not called first. Call it first") + sys.exit(1) + if tm_handler is None: + LOGGER.warning( + "No TM Handler specified! Make sure to specify at least one TM handler" + ) + sys.exit(1) + else: + if tm_handler.get_type() == TmTypes.CCSDS_SPACE_PACKETS: + tm_handler = cast(CcsdsTmHandler, tm_handler) + com_if = setup_args.hook_obj.assign_communication_interface( + com_if_key=setup_args.args_wrapper.com_if + ) + tm_listener = CcsdsTmListener(com_if=com_if, tm_handler=tm_handler) + mode_wrapper = ModeWrapper() + backend_mode_conversion(setup_args.args_wrapper.mode, mode_wrapper) + # The global variables are set by the argument parser. + tmtc_backend = CcsdsTmtcBackend( + com_if=com_if, + tm_listener=tm_listener, + tc_handler=tc_handler, + tc_mode=mode_wrapper.tc_mode, + tm_mode=mode_wrapper.tm_mode, + ) + tmtc_backend.inter_cmd_delay = setup_args.args_wrapper.delay + tmtc_backend.current_proc_info = DefaultProcedureInfo( + setup_args.args_wrapper.service, setup_args.args_wrapper.op_code + ) + return tmtc_backend diff --git a/tmtccmd/config/__init__.py b/tmtccmd/config/__init__.py index abc07918..7940a49a 100644 --- a/tmtccmd/config/__init__.py +++ b/tmtccmd/config/__init__.py @@ -2,10 +2,7 @@ from tmtccmd.config.globals import CoreServiceList from .args import ArgParserWrapper -from .definitions import ( - CoreGlobalIds, - OpCodeDictKeys, default_json_path -) +from .definitions import CoreGlobalIds, OpCodeDictKeys, default_json_path from tmtccmd.config.cfg_hook import TmTcCfgHookBase diff --git a/tmtccmd/config/args.py b/tmtccmd/config/args.py index 0a92c9a0..7046aaf6 100644 --- a/tmtccmd/config/args.py +++ b/tmtccmd/config/args.py @@ -17,6 +17,7 @@ def get_default_descript_txt() -> str: from tmtccmd.utility.conf_util import AnsiColors + return ( f"{AnsiColors.GREEN}TMTC Client Command Line Interface\n" f"{AnsiColors.RESET}This application provides generic components to execute " diff --git a/tmtccmd/runner.py b/tmtccmd/runner.py deleted file mode 100644 index 7ce7ddf8..00000000 --- a/tmtccmd/runner.py +++ /dev/null @@ -1,192 +0,0 @@ -"""Contains core methods called by entry point files to setup and start a tmtccmd application""" -import sys -import os -from typing import Union, cast - -from tmtccmd import __version__ -from tmtccmd.core.ccsds_backend import CcsdsTmtcBackend -from tmtccmd.tm.ccsds_tm_listener import CcsdsTmListener -from tmtccmd.config import TmTcCfgHookBase, CoreGlobalIds, SetupArgs -from tmtccmd.core.ccsds_backend import BackendBase -from tmtccmd.core.frontend_base import FrontendBase -from tmtccmd.tm import TmTypes, TmHandlerBase -from tmtccmd.ccsds.handler import CcsdsTmHandler -from tmtccmd.core.globals_manager import update_global -from tmtccmd.logging import get_console_logger -from tmtccmd.config.definitions import backend_mode_conversion -from tmtccmd.config.globals import set_default_globals_pre_args_parsing -from tmtccmd.core import ModeWrapper -from tmtccmd.tc.definitions import DefaultProcedureInfo -from tmtccmd.tc.handler import TcHandlerBase - -LOGGER = get_console_logger() - -__SETUP_WAS_CALLED = False -__SETUP_FOR_GUI = False - - -def version() -> str: - return __version__ - - -def setup(setup_args: SetupArgs): - """This function needs to be called first before running the TMTC commander core. The setup - arguments encapsulate all required arguments for the TMTC commander. - - :param setup_args: Setup arguments - """ - global __SETUP_WAS_CALLED, __SETUP_FOR_GUI - - if os.name == "nt": - import colorama - - colorama.init() - - __assign_tmtc_commander_hooks(hook_object=setup_args.hook_obj) - - if setup_args.use_gui: - set_default_globals_pre_args_parsing(setup_args.apid) - if not setup_args.use_gui: - __handle_cli_args_and_globals(setup_args) - __SETUP_FOR_GUI = setup_args.use_gui - __SETUP_WAS_CALLED = True - - -def start( - tmtc_backend: BackendBase, - tmtc_frontend: Union[FrontendBase, None] = None, - app_name: str = "TMTC Commander", -): - """This is the primary function to run the TMTC commander. Users should call this function to - start the TMTC commander. Please note that :py:func:`setup` needs to be - called before this function. You also need to build a TMTC backend - instance and pass it to this call. You can use :py:func:`create_default_tmtc_backend` - to create a generic backend. - - :param tmtc_backend: Custom backend can be passed here. Otherwise, a default backend - will be created - :param tmtc_frontend: Custom frontend can be passed here. Otherwise, a default frontend - will be created - :param app_name: Name of application. Will be displayed in GUI - :raises RunTimeError: if :py:func:`setup` was not called before - :return: - """ - global __SETUP_WAS_CALLED, __SETUP_FOR_GUI - if not __SETUP_WAS_CALLED: - LOGGER.warning("setup_tmtccmd was not called first. Call it first") - sys.exit(1) - if __SETUP_FOR_GUI: - __start_tmtc_commander_qt_gui( - tmtc_frontend=tmtc_frontend, tmtc_backend=tmtc_backend, app_name=app_name - ) - else: - __start_tmtc_commander_cli(tmtc_backend=tmtc_backend) - - -def init_and_start_daemons(tmtc_backend: BackendBase): - if __SETUP_FOR_GUI: - LOGGER.error("daemon mode only supported in cli mode") - sys.exit(1) - __start_tmtc_commander_cli(tmtc_backend=tmtc_backend, perform_op_immediately=False) - - -def __assign_tmtc_commander_hooks(hook_object: TmTcCfgHookBase): - if hook_object is None: - raise ValueError - # Insert hook object handle into global dictionary so it can be used by the TMTC commander - update_global(CoreGlobalIds.TMTC_HOOK, hook_object) - - -def init_printout(use_gui: bool): - if use_gui: - print(f"-- tmtccmd v{version()} GUI Mode --") - else: - print(f"-- tmtccmd v{version()} CLI Mode --") - - -def __handle_cli_args_and_globals(setup_args: SetupArgs): - LOGGER.info("Setting up pre-globals..") - set_default_globals_pre_args_parsing(setup_args.apid) - LOGGER.info("Setting up post-globals..") - - -def __start_tmtc_commander_cli( - tmtc_backend: BackendBase, perform_op_immediately: bool = True -): - # __get_backend_init_variables() - tmtc_backend.start_listener(perform_op_immediately) - - -def __start_tmtc_commander_qt_gui( - tmtc_backend: BackendBase, - tmtc_frontend: Union[None, FrontendBase] = None, - app_name: str = "TMTC Commander", -): - global __SETUP_WAS_CALLED - try: - from PyQt5.QtWidgets import QApplication - - if not __SETUP_WAS_CALLED: - LOGGER.warning("setup_tmtccmd was not called first. Call it first") - sys.exit(1) - app = QApplication([app_name]) - if tmtc_frontend is None: - from tmtccmd.core.frontend import TmTcFrontend - from tmtccmd.config.cfg_hook import get_global_hook_obj - from tmtccmd.core.ccsds_backend import CcsdsTmtcBackend - - tmtc_frontend = TmTcFrontend( - hook_obj=get_global_hook_obj(), - tmtc_backend=cast(CcsdsTmtcBackend, tmtc_backend), - app_name=app_name, - ) - tmtc_frontend.start(app) - except ImportError: - LOGGER.error("PyQt5 module not installed, can't run GUI mode!") - sys.exit(1) - - -def create_default_tmtc_backend( - setup_args: SetupArgs, tm_handler: TmHandlerBase, tc_handler: TcHandlerBase -) -> BackendBase: - """Creates a default TMTC backend instance which can be passed to the tmtccmd runner - - :param tc_handler: - :param setup_args: - :param tm_handler: - :return: - """ - global __SETUP_WAS_CALLED - - from typing import cast - - if not __SETUP_WAS_CALLED: - LOGGER.warning("setup_tmtccmd was not called first. Call it first") - sys.exit(1) - if tm_handler is None: - LOGGER.warning( - "No TM Handler specified! Make sure to specify at least one TM handler" - ) - sys.exit(1) - else: - if tm_handler.get_type() == TmTypes.CCSDS_SPACE_PACKETS: - tm_handler = cast(CcsdsTmHandler, tm_handler) - com_if = setup_args.hook_obj.assign_communication_interface( - com_if_key=setup_args.args_wrapper.com_if - ) - tm_listener = CcsdsTmListener(com_if=com_if, tm_handler=tm_handler) - mode_wrapper = ModeWrapper() - backend_mode_conversion(setup_args.args_wrapper.mode, mode_wrapper) - # The global variables are set by the argument parser. - tmtc_backend = CcsdsTmtcBackend( - com_if=com_if, - tm_listener=tm_listener, - tc_handler=tc_handler, - tc_mode=mode_wrapper.tc_mode, - tm_mode=mode_wrapper.tm_mode, - ) - tmtc_backend.inter_cmd_delay = setup_args.args_wrapper.delay - tmtc_backend.current_proc_info = DefaultProcedureInfo( - setup_args.args_wrapper.service, setup_args.args_wrapper.op_code - ) - return tmtc_backend From 4f8b2b4b52ded4daca18f0701a8cfed80fc36413 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Sun, 26 Jun 2022 00:25:18 +0200 Subject: [PATCH 100/221] more module simplifications --- tests/test_queue.py | 4 +- tmtccmd/__init__.py | 2 +- tmtccmd/core/ccsds_backend.py | 2 +- tmtccmd/pus/pus_17_test.py | 2 +- tmtccmd/tc/__init__.py | 189 +++++++++++++++++++++++++++++++++ tmtccmd/tc/ccsds_seq_sender.py | 2 +- tmtccmd/tc/definitions.py | 189 --------------------------------- tmtccmd/tc/handler.py | 2 +- tmtccmd/tc/queue.py | 2 +- 9 files changed, 197 insertions(+), 197 deletions(-) diff --git a/tests/test_queue.py b/tests/test_queue.py index 00347300..1c4f9642 100644 --- a/tests/test_queue.py +++ b/tests/test_queue.py @@ -4,11 +4,11 @@ from unittest import TestCase from spacepackets.ecss import PusTelecommand -from tmtccmd.tc.definitions import WaitEntry, PacketCastWrapper +from tmtccmd.tc import WaitEntry, PacketCastWrapper # Required for eval calls # noinspection PyUnresolvedReferences -from tmtccmd.tc.definitions import LogQueueEntry, RawTcEntry +from tmtccmd.tc import LogQueueEntry, RawTcEntry from tmtccmd.tc.queue import QueueWrapper, QueueHelper diff --git a/tmtccmd/__init__.py b/tmtccmd/__init__.py index b464c759..9b52f508 100644 --- a/tmtccmd/__init__.py +++ b/tmtccmd/__init__.py @@ -15,7 +15,7 @@ from tmtccmd.config.definitions import backend_mode_conversion from tmtccmd.config.globals import set_default_globals_pre_args_parsing from tmtccmd.core import ModeWrapper -from tmtccmd.tc.definitions import DefaultProcedureInfo +from tmtccmd.tc import DefaultProcedureInfo from tmtccmd.tc.handler import TcHandlerBase VERSION_NAME = "tmtccmd" diff --git a/tmtccmd/core/ccsds_backend.py b/tmtccmd/core/ccsds_backend.py index 7bcd3c70..4406cbbd 100644 --- a/tmtccmd/core/ccsds_backend.py +++ b/tmtccmd/core/ccsds_backend.py @@ -12,7 +12,7 @@ TcMode, TmMode, ) -from tmtccmd.tc.definitions import DefaultProcedureInfo +from tmtccmd.tc import DefaultProcedureInfo from tmtccmd.tc.handler import TcHandlerBase, FeedWrapper from tmtccmd.tc.queue import QueueWrapper from tmtccmd.logging import get_console_logger diff --git a/tmtccmd/pus/pus_17_test.py b/tmtccmd/pus/pus_17_test.py index ac5417e1..10ce8705 100644 --- a/tmtccmd/pus/pus_17_test.py +++ b/tmtccmd/pus/pus_17_test.py @@ -1,9 +1,9 @@ from __future__ import annotations import enum +from spacepackets.ecss import PusTelecommand from spacepackets.ecss.conf import get_default_tc_apid from spacepackets.ecss.pus_17_test import Subservices -from tmtccmd.tc.definitions import PusTelecommand from tmtccmd.tc.queue import QueueHelper diff --git a/tmtccmd/tc/__init__.py b/tmtccmd/tc/__init__.py index e69de29b..a66b36c5 100644 --- a/tmtccmd/tc/__init__.py +++ b/tmtccmd/tc/__init__.py @@ -0,0 +1,189 @@ +from __future__ import annotations + +import enum +from enum import Enum +from typing import Deque, cast, Type, Any +from spacepackets.ccsds.spacepacket import SpacePacket +from spacepackets.ecss.tc import PusTelecommand + + +class TcQueueEntryType(Enum): + PUS_TC = "pus-tc" + CCSDS_TC = "ccsds-tc" + RAW_TC = "raw-tc" + CUSTOM = "custom" + LOG = "log" + WAIT = "wait" + PACKET_DELAY = "set-delay" + + +class TcQueueEntryBase: + """Generic TC queue entry abstraction. This allows filling the TC queue with custom objects""" + + def __init__(self, etype: TcQueueEntryType): + self.etype = etype + + def is_tc(self) -> bool: + """Check whether concrete object is an actual telecommand""" + if ( + self.etype == TcQueueEntryType.PUS_TC + or self.etype == TcQueueEntryType.RAW_TC + or self.etype == TcQueueEntryType.CCSDS_TC + ): + return True + return False + + +QueueDequeT = Deque[TcQueueEntryBase] + + +class PusTcEntry(TcQueueEntryBase): + def __init__(self, pus_tc: PusTelecommand): + super().__init__(TcQueueEntryType.PUS_TC) + self.pus_tc = pus_tc + + def __repr__(self): + return f"{self.__class__.__name__}({self.pus_tc!r})" + + +class SpacePacketEntry(TcQueueEntryBase): + def __init__(self, space_packet: SpacePacket): + super().__init__(TcQueueEntryType.CCSDS_TC) + self.space_packet = space_packet + + def __repr__(self): + return f"{self.__class__.__name__}({self.space_packet!r})" + + +class LogQueueEntry(TcQueueEntryBase): + def __init__(self, log_str: str): + super().__init__(TcQueueEntryType.LOG) + self.log_str = log_str + + def __repr__(self): + return f"{self.__class__.__name__}({self.log_str!r})" + + +class RawTcEntry(TcQueueEntryBase): + def __init__(self, tc: bytes): + super().__init__(TcQueueEntryType.RAW_TC) + self.tc = tc + + def __repr__(self): + return f"{self.__class__.__name__}({self.tc!r})" + + +class WaitEntry(TcQueueEntryBase): + def __init__(self, wait_secs: float): + super().__init__(TcQueueEntryType.WAIT) + self.wait_time = wait_secs + + def __repr__(self): + return f"{self.__class__.__name__}({self.wait_time!r})" + + +class PacketDelayEntry(TcQueueEntryBase): + def __init__(self, timeout_secs: float): + super().__init__(TcQueueEntryType.PACKET_DELAY) + self.timeout_secs = timeout_secs + + def __repr__(self): + return f"{self.__class__.__name__}({self.timeout_secs!r})" + + +class PacketCastWrapper: + def __init__(self, base: TcQueueEntryBase): + self.base = base + + def __cast_internally( + self, + obj_type: Type[TcQueueEntryBase], + obj: TcQueueEntryBase, + expected_type: TcQueueEntryType, + ) -> Any: + if obj.etype != expected_type: + raise TypeError(f"Invalid object {obj} for type {self.base.etype}") + return cast(obj_type, obj) + + def to_log_entry(self) -> LogQueueEntry: + return self.__cast_internally(LogQueueEntry, self.base, TcQueueEntryType.LOG) + + def to_pus_tc_entry(self) -> PusTcEntry: + return self.__cast_internally(PusTcEntry, self.base, TcQueueEntryType.PUS_TC) + + def to_raw_tc_entry(self) -> RawTcEntry: + return self.__cast_internally(RawTcEntry, self.base, TcQueueEntryType.RAW_TC) + + def to_wait_entry(self) -> WaitEntry: + return self.__cast_internally(WaitEntry, self.base, TcQueueEntryType.WAIT) + + def to_packet_delay_entry(self) -> PacketDelayEntry: + return self.__cast_internally( + PacketDelayEntry, self.base, TcQueueEntryType.PACKET_DELAY + ) + + def to_space_packet_entry(self) -> SpacePacketEntry: + return self.__cast_internally( + SpacePacketEntry, self.base, TcQueueEntryType.CCSDS_TC + ) + + +class TcProcedureType(enum.Enum): + DEFAULT = 0 + CFDP = 1 + CUSTOM = 2 + + +class TcProcedureBase: + def __init__(self, ptype: TcProcedureType): + self.ptype = ptype + + +class CustomProcedureInfo(TcProcedureBase): + def __init__(self, info: any): + super().__init__(TcProcedureType.CUSTOM) + self.info = info + + def __repr__(self): + return f"{self.__class__.__name__}(info={self.info!r}" + + +class DefaultProcedureInfo(TcProcedureBase): + """Generic abstraction for procedures. A procedure can be a single command or a sequence + of commands. Generally, one procedure is mapped to a specific TC queue which is packed + during run-time""" + + def __init__(self, service: str, op_code: str): + super().__init__(TcProcedureType.DEFAULT) + self.service = service + self.op_code = op_code + + def __repr__(self): + return f"CmdInfo(service={self.service!r}, op_code={self.op_code!r}" + + +class ProcedureCastWrapper: + """Cast wrapper to cast the procedure base type back to a concrete type easily""" + + def __init__(self, base: TcProcedureBase): + self.base = base + + def __cast_internally( + self, + obj_type: Type[TcProcedureBase], + obj: TcProcedureBase, + expected_type: TcProcedureType, + ) -> Any: + if obj.ptype != expected_type: + raise TypeError(f"Invalid object {obj} for type {self.base.ptype}") + return cast(obj_type, obj) + + def to_def_procedure(self) -> DefaultProcedureInfo: + return self.__cast_internally( + DefaultProcedureInfo, self.base, TcProcedureType.DEFAULT + ) + + def to_custom_procedure(self) -> CustomProcedureInfo: + return self.__cast_internally( + CustomProcedureInfo, self.base, TcProcedureType.CUSTOM + ) diff --git a/tmtccmd/tc/ccsds_seq_sender.py b/tmtccmd/tc/ccsds_seq_sender.py index d7e175de..a8b47726 100644 --- a/tmtccmd/tc/ccsds_seq_sender.py +++ b/tmtccmd/tc/ccsds_seq_sender.py @@ -2,7 +2,7 @@ import enum from typing import Optional -from tmtccmd.tc.definitions import TcQueueEntryBase, TcQueueEntryType, PacketCastWrapper +from tmtccmd.tc import TcQueueEntryBase, TcQueueEntryType, PacketCastWrapper from tmtccmd.tc.handler import TcHandlerBase from tmtccmd.tc.queue import QueueWrapper from tmtccmd.com_if.com_interface_base import CommunicationInterface diff --git a/tmtccmd/tc/definitions.py b/tmtccmd/tc/definitions.py index a66b36c5..e69de29b 100644 --- a/tmtccmd/tc/definitions.py +++ b/tmtccmd/tc/definitions.py @@ -1,189 +0,0 @@ -from __future__ import annotations - -import enum -from enum import Enum -from typing import Deque, cast, Type, Any -from spacepackets.ccsds.spacepacket import SpacePacket -from spacepackets.ecss.tc import PusTelecommand - - -class TcQueueEntryType(Enum): - PUS_TC = "pus-tc" - CCSDS_TC = "ccsds-tc" - RAW_TC = "raw-tc" - CUSTOM = "custom" - LOG = "log" - WAIT = "wait" - PACKET_DELAY = "set-delay" - - -class TcQueueEntryBase: - """Generic TC queue entry abstraction. This allows filling the TC queue with custom objects""" - - def __init__(self, etype: TcQueueEntryType): - self.etype = etype - - def is_tc(self) -> bool: - """Check whether concrete object is an actual telecommand""" - if ( - self.etype == TcQueueEntryType.PUS_TC - or self.etype == TcQueueEntryType.RAW_TC - or self.etype == TcQueueEntryType.CCSDS_TC - ): - return True - return False - - -QueueDequeT = Deque[TcQueueEntryBase] - - -class PusTcEntry(TcQueueEntryBase): - def __init__(self, pus_tc: PusTelecommand): - super().__init__(TcQueueEntryType.PUS_TC) - self.pus_tc = pus_tc - - def __repr__(self): - return f"{self.__class__.__name__}({self.pus_tc!r})" - - -class SpacePacketEntry(TcQueueEntryBase): - def __init__(self, space_packet: SpacePacket): - super().__init__(TcQueueEntryType.CCSDS_TC) - self.space_packet = space_packet - - def __repr__(self): - return f"{self.__class__.__name__}({self.space_packet!r})" - - -class LogQueueEntry(TcQueueEntryBase): - def __init__(self, log_str: str): - super().__init__(TcQueueEntryType.LOG) - self.log_str = log_str - - def __repr__(self): - return f"{self.__class__.__name__}({self.log_str!r})" - - -class RawTcEntry(TcQueueEntryBase): - def __init__(self, tc: bytes): - super().__init__(TcQueueEntryType.RAW_TC) - self.tc = tc - - def __repr__(self): - return f"{self.__class__.__name__}({self.tc!r})" - - -class WaitEntry(TcQueueEntryBase): - def __init__(self, wait_secs: float): - super().__init__(TcQueueEntryType.WAIT) - self.wait_time = wait_secs - - def __repr__(self): - return f"{self.__class__.__name__}({self.wait_time!r})" - - -class PacketDelayEntry(TcQueueEntryBase): - def __init__(self, timeout_secs: float): - super().__init__(TcQueueEntryType.PACKET_DELAY) - self.timeout_secs = timeout_secs - - def __repr__(self): - return f"{self.__class__.__name__}({self.timeout_secs!r})" - - -class PacketCastWrapper: - def __init__(self, base: TcQueueEntryBase): - self.base = base - - def __cast_internally( - self, - obj_type: Type[TcQueueEntryBase], - obj: TcQueueEntryBase, - expected_type: TcQueueEntryType, - ) -> Any: - if obj.etype != expected_type: - raise TypeError(f"Invalid object {obj} for type {self.base.etype}") - return cast(obj_type, obj) - - def to_log_entry(self) -> LogQueueEntry: - return self.__cast_internally(LogQueueEntry, self.base, TcQueueEntryType.LOG) - - def to_pus_tc_entry(self) -> PusTcEntry: - return self.__cast_internally(PusTcEntry, self.base, TcQueueEntryType.PUS_TC) - - def to_raw_tc_entry(self) -> RawTcEntry: - return self.__cast_internally(RawTcEntry, self.base, TcQueueEntryType.RAW_TC) - - def to_wait_entry(self) -> WaitEntry: - return self.__cast_internally(WaitEntry, self.base, TcQueueEntryType.WAIT) - - def to_packet_delay_entry(self) -> PacketDelayEntry: - return self.__cast_internally( - PacketDelayEntry, self.base, TcQueueEntryType.PACKET_DELAY - ) - - def to_space_packet_entry(self) -> SpacePacketEntry: - return self.__cast_internally( - SpacePacketEntry, self.base, TcQueueEntryType.CCSDS_TC - ) - - -class TcProcedureType(enum.Enum): - DEFAULT = 0 - CFDP = 1 - CUSTOM = 2 - - -class TcProcedureBase: - def __init__(self, ptype: TcProcedureType): - self.ptype = ptype - - -class CustomProcedureInfo(TcProcedureBase): - def __init__(self, info: any): - super().__init__(TcProcedureType.CUSTOM) - self.info = info - - def __repr__(self): - return f"{self.__class__.__name__}(info={self.info!r}" - - -class DefaultProcedureInfo(TcProcedureBase): - """Generic abstraction for procedures. A procedure can be a single command or a sequence - of commands. Generally, one procedure is mapped to a specific TC queue which is packed - during run-time""" - - def __init__(self, service: str, op_code: str): - super().__init__(TcProcedureType.DEFAULT) - self.service = service - self.op_code = op_code - - def __repr__(self): - return f"CmdInfo(service={self.service!r}, op_code={self.op_code!r}" - - -class ProcedureCastWrapper: - """Cast wrapper to cast the procedure base type back to a concrete type easily""" - - def __init__(self, base: TcProcedureBase): - self.base = base - - def __cast_internally( - self, - obj_type: Type[TcProcedureBase], - obj: TcProcedureBase, - expected_type: TcProcedureType, - ) -> Any: - if obj.ptype != expected_type: - raise TypeError(f"Invalid object {obj} for type {self.base.ptype}") - return cast(obj_type, obj) - - def to_def_procedure(self) -> DefaultProcedureInfo: - return self.__cast_internally( - DefaultProcedureInfo, self.base, TcProcedureType.DEFAULT - ) - - def to_custom_procedure(self) -> CustomProcedureInfo: - return self.__cast_internally( - CustomProcedureInfo, self.base, TcProcedureType.CUSTOM - ) diff --git a/tmtccmd/tc/handler.py b/tmtccmd/tc/handler.py index 5b9cd111..7cfeae62 100644 --- a/tmtccmd/tc/handler.py +++ b/tmtccmd/tc/handler.py @@ -1,7 +1,7 @@ from abc import abstractmethod from tmtccmd.com_if.com_interface_base import CommunicationInterface -from tmtccmd.tc.definitions import TcQueueEntryBase, TcProcedureBase +from tmtccmd.tc import TcQueueEntryBase, TcProcedureBase from tmtccmd.tc.queue import QueueHelper, QueueWrapper diff --git a/tmtccmd/tc/queue.py b/tmtccmd/tc/queue.py index da6c0982..15202982 100644 --- a/tmtccmd/tc/queue.py +++ b/tmtccmd/tc/queue.py @@ -2,7 +2,7 @@ from spacepackets.ccsds.spacepacket import SpacePacket from spacepackets.ecss import PusTelecommand -from tmtccmd.tc.definitions import ( +from tmtccmd.tc import ( QueueDequeT, LogQueueEntry, PusTcEntry, From adddcf12b5928092181927c9783521e39aa81409 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Sun, 26 Jun 2022 01:16:00 +0200 Subject: [PATCH 101/221] fixed example --- docs/api.rst | 4 +-- examples/common.py | 18 ++++++++--- examples/tmtccli.py | 56 +++++++++++++++++++++++++--------- tmtccmd/ccsds/handler.py | 9 ++++-- tmtccmd/com_if/dummy_com_if.py | 8 ++--- tmtccmd/core/frontend.py | 2 +- tmtccmd/tc/pus_5_event.py | 2 +- tmtccmd/tc/pus_8_funccmd.py | 3 +- 8 files changed, 70 insertions(+), 32 deletions(-) diff --git a/docs/api.rst b/docs/api.rst index 15c74e7a..d838bcf6 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -5,10 +5,10 @@ API Core Submodules =============== -tmtccmd.runner module +tmtccmd module --------------------- -.. automodule:: tmtccmd.runner +.. automodule:: tmtccmd :members: :undoc-members: :show-inheritance: diff --git a/examples/common.py b/examples/common.py index 9edb1dcb..13be7818 100644 --- a/examples/common.py +++ b/examples/common.py @@ -1,16 +1,18 @@ from typing import Optional +from pus_tc.service_17_test import pack_service17_test_into from spacepackets.ecss import PusTelemetry from tmtccmd import get_console_logger, TcHandlerBase, TmTcCfgHookBase, CcsdsTmtcBackend from tmtccmd.ccsds.handler import ApidTmHandlerBase from tmtccmd.com_if.com_interface_base import CommunicationInterface +from tmtccmd.config import CoreServiceList from tmtccmd.config.tmtc_defs import TmTcDefWrapper from tmtccmd.logging.pus import RawTmtcTimedLogWrapper -from tmtccmd.tc.definitions import ( +from tmtccmd.tc import ( TcProcedureBase, TcQueueEntryBase, PacketCastWrapper, - TcQueueEntryType, + TcQueueEntryType, ProcedureCastWrapper, TcProcedureType, ) from tmtccmd.tc.handler import FeedWrapper from tmtccmd.tm import Service5Tm @@ -77,6 +79,7 @@ def handle_tm(self, packet: bytes, _user_args: any): f"The service {service} is not implemented in Telemetry Factory" ) tm_packet = PusTelemetry.unpack(packet) + self.raw_logger.log_tm(tm_packet) self.printer.handle_long_tm_print(packet_if=tm_packet, info_if=tm_packet) @@ -87,11 +90,18 @@ def send_cb(self, tc_queue_entry: TcQueueEntryBase, com_if: CommunicationInterfa if tc_queue_entry.etype == TcQueueEntryType.PUS_TC: pus_tc_wrapper = cast_wrapper.to_pus_tc_entry() raw_tc = pus_tc_wrapper.pus_tc.pack() - LOGGER.info(pus_tc_wrapper.pus_tc) + LOGGER.info(f"Sending {pus_tc_wrapper.pus_tc}") com_if.send(raw_tc) def queue_finished_cb(self, info: TcProcedureBase): pass def feed_cb(self, info: TcProcedureBase, wrapper: FeedWrapper): - pass + proc_caster = ProcedureCastWrapper(info) + if info.ptype == TcProcedureType.DEFAULT: + info = proc_caster.to_def_procedure() + queue_helper = wrapper.queue_helper + service = info.service + op_code = info.op_code + if service == CoreServiceList.SERVICE_17.value: + return pack_service17_test_into(queue_helper, op_code=op_code) diff --git a/examples/tmtccli.py b/examples/tmtccli.py index 843767f2..c946d441 100755 --- a/examples/tmtccli.py +++ b/examples/tmtccli.py @@ -1,15 +1,19 @@ #!/usr/bin/env python3 """Example application for the TMTC Commander""" +import sys +import time + import tmtccmd -from tmtccmd.ccsds.handler import CcsdsTmHandler, ApidTmHandlerBase +from tmtccmd.ccsds.handler import CcsdsTmHandler from tmtccmd.config import default_json_path from tmtccmd.config.args import ArgParserWrapper from tmtccmd.config import SetupArgs +from tmtccmd.core import BackendController, Request from tmtccmd.logging import get_console_logger +from tmtccmd.logging.pus import RegularTmtcLogWrapper, RawTmtcTimedLogWrapper, TimedLogWhen -from config.hook_implementation import ExampleHookClass -from config.definitions import APID, pre_send_cb -from config.tm_handler import default_ccsds_packet_handler +from common import TcHandler, PusHandler, ExampleHookClass, APID +from tmtccmd.utility.tmtc_printer import FsfwTmTcPrinter LOGGER = get_console_logger() @@ -23,19 +27,43 @@ def main(): setup_args = SetupArgs( hook_obj=hook_obj, use_gui=False, apid=APID, args_wrapper=parser_wrapper ) - apid_handler = ApidTmHandlerBase( - cb=default_ccsds_packet_handler, max_queue_len=50, user_args=None - ) - ccsds_handler = CcsdsTmHandler() - ccsds_handler.add_apid_handler(apid=APID, handler=apid_handler) - tmtccmd.runner.setup(setup_args=setup_args) - tmtccmd.runner.add_ccsds_handler(ccsds_handler) - tmtc_backend = tmtccmd.runner.create_default_tmtc_backend( + # Create console logger helper and file loggers + tmtc_logger = RegularTmtcLogWrapper() + printer = FsfwTmTcPrinter(tmtc_logger.logger) + raw_logger = RawTmtcTimedLogWrapper(when=TimedLogWhen.PER_HOUR, interval=1) + + # Create primary TM handler and add it to the CCSDS Packet Handler + tm_handler = PusHandler(printer, raw_logger) + ccsds_handler = CcsdsTmHandler(unknown_handler=None) + ccsds_handler.add_apid_handler(tm_handler) + + # Create TC handler + tc_handler = TcHandler() + tmtccmd.setup(setup_args=setup_args) + + tmtc_backend = tmtccmd.create_default_tmtc_backend( setup_args=setup_args, tm_handler=ccsds_handler, + tc_handler=tc_handler ) - tmtc_backend.usr_send_wrapper = (pre_send_cb, None) - tmtccmd.runner.start(tmtc_backend=tmtc_backend) + tmtccmd.start(tmtc_backend=tmtc_backend) + ctrl = BackendController() + try: + while True: + state = tmtc_backend.periodic_op(ctrl) + if state.request == Request.TERMINATION_NO_ERROR: + sys.exit(0) + elif state.request == Request.DELAY_IDLE: + LOGGER.info("TMTC Client in IDLE mode") + time.sleep(3.0) + elif state.request == Request.DELAY_LISTENER: + time.sleep(0.8) + elif state.request == Request.DELAY_CUSTOM: + time.sleep(state.next_delay) + elif state.request == Request.CALL_NEXT: + pass + except KeyboardInterrupt: + sys.exit(0) if __name__ == "__main__": diff --git a/tmtccmd/ccsds/handler.py b/tmtccmd/ccsds/handler.py index 396242b5..fa8afbd5 100644 --- a/tmtccmd/ccsds/handler.py +++ b/tmtccmd/ccsds/handler.py @@ -1,5 +1,5 @@ import abc -from typing import Dict +from typing import Dict, Optional from tmtccmd.tm import TmTypes, TmHandlerBase from tmtccmd.logging import get_console_logger @@ -36,10 +36,13 @@ class CcsdsTmHandler(TmHandlerBase): """Generic CCSDS handler class. The user can create an instance of this class to handle CCSDS packets with different APIDs""" - def __init__(self, unknown_handler: UnknownApidHandlerBase): + def __init__(self, unknown_handler: Optional[UnknownApidHandlerBase]): super().__init__(tm_type=TmTypes.CCSDS_SPACE_PACKETS) self._handler_dict: HandlerDictT = dict() - self.unknown_handler = unknown_handler + if unknown_handler: + self.unknown_handler = UnknownApidHandlerBase(None) + else: + self.unknown_handler = unknown_handler def add_apid_handler(self, handler: ApidTmHandlerBase): """Add a TM handler for a certain APID. The handler is a callback function which diff --git a/tmtccmd/com_if/dummy_com_if.py b/tmtccmd/com_if/dummy_com_if.py index f7fc41ba..b7f24f54 100644 --- a/tmtccmd/com_if/dummy_com_if.py +++ b/tmtccmd/com_if/dummy_com_if.py @@ -2,6 +2,7 @@ """ from typing import Optional +from spacepackets.ecss.pus_1_verification import RequestId from spacepackets.ecss.tc import PusTelecommand from spacepackets.ccsds.spacepacket import ( get_sp_psc_raw, @@ -71,12 +72,10 @@ def generate_reply_package(self): """ if self.last_tc.service == 17: if self.last_tc.subservice == 1: - tc_psc = self.last_tc.sp_header.psc.raw() tm_packer = Service1TMExtended( subservice=1, ssc=self.current_ssc, - tc_packet_id=self.last_tc.packet_id, - tc_psc=tc_psc, + tc_request_id=RequestId(self.last_tc.packet_id, self.last_tc.packet_seq_ctrl) ) self.current_ssc += 1 @@ -85,8 +84,7 @@ def generate_reply_package(self): tm_packer = Service1TMExtended( subservice=7, ssc=self.current_ssc, - tc_packet_id=self.last_tc.packet_id, - tc_psc=tc_psc, + tc_request_id=RequestId(self.last_tc.packet_id, self.last_tc.packet_seq_ctrl) ) tm_packet_raw = tm_packer.pack() self.next_telemetry_package.append(tm_packet_raw) diff --git a/tmtccmd/core/frontend.py b/tmtccmd/core/frontend.py index 2dd78566..b5d3fca7 100644 --- a/tmtccmd/core/frontend.py +++ b/tmtccmd/core/frontend.py @@ -37,7 +37,7 @@ from tmtccmd.core.globals_manager import get_global, update_global from tmtccmd.com_if.tcpip_utilities import TcpIpConfigIds import tmtccmd.config as config_module -from tmtccmd.tc.definitions import DefaultProcedureInfo +from tmtccmd.tc import DefaultProcedureInfo LOGGER = get_console_logger() diff --git a/tmtccmd/tc/pus_5_event.py b/tmtccmd/tc/pus_5_event.py index 3db02479..619cabcf 100644 --- a/tmtccmd/tc/pus_5_event.py +++ b/tmtccmd/tc/pus_5_event.py @@ -1,9 +1,9 @@ """Contains definitions and functions related to PUS Service 5 Telecommands. """ +from spacepackets.ecss import PusTelecommand from spacepackets.ecss.conf import get_default_tc_apid from spacepackets.ecss.pus_5_event import Subservices -from tmtccmd.tc.definitions import PusTelecommand from tmtccmd.tc.queue import QueueHelper diff --git a/tmtccmd/tc/pus_8_funccmd.py b/tmtccmd/tc/pus_8_funccmd.py index 01964b79..1cc9701b 100644 --- a/tmtccmd/tc/pus_8_funccmd.py +++ b/tmtccmd/tc/pus_8_funccmd.py @@ -1,7 +1,6 @@ -import enum import struct -from tmtccmd.tc.definitions import PusTelecommand +from spacepackets.ecss import PusTelecommand from tmtccmd.pus.pus_8_funccmd import Subservices from spacepackets.ecss.conf import get_default_tc_apid From 5f7f7d162c07add37508206bc079fd393b6924fd Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Sun, 26 Jun 2022 02:00:35 +0200 Subject: [PATCH 102/221] more module structure simplifications --- examples/common.py | 4 +- examples/tmtccli.py | 10 +- tests/test_seq_sender.py | 4 +- tests/test_tm_handler.py | 6 +- tmtccmd/__init__.py | 6 +- tmtccmd/ccsds/handler.py | 2 +- tmtccmd/cfdp/handler.py | 8 +- tmtccmd/com_if/__init__.py | 65 ++++++++ tmtccmd/com_if/com_if_utilities.py | 6 +- tmtccmd/com_if/com_interface_base.py | 65 -------- tmtccmd/com_if/dummy_com_if.py | 18 +-- tmtccmd/com_if/qemu_com_if.py | 7 +- tmtccmd/com_if/serial_com_if.py | 12 +- tmtccmd/com_if/tcpip_tcp_com_if.py | 12 +- tmtccmd/com_if/tcpip_udp_com_if.py | 21 +-- tmtccmd/com_if/tcpip_utilities.py | 2 +- tmtccmd/config/__init__.py | 225 +++++++++++++++++++++++---- tmtccmd/config/args.py | 9 +- tmtccmd/config/cfg_hook.py | 99 ------------ tmtccmd/config/com_if.py | 11 +- tmtccmd/config/definitions.py | 142 ----------------- tmtccmd/config/globals.py | 51 +++++- tmtccmd/config/objects.py | 6 +- tmtccmd/config/setup.py | 37 +++++ tmtccmd/core/ccsds_backend.py | 10 +- tmtccmd/tc/ccsds_seq_sender.py | 4 +- tmtccmd/tc/handler.py | 4 +- tmtccmd/tm/__init__.py | 14 +- tmtccmd/tm/ccsds_tm_listener.py | 8 +- tmtccmd/tm/definitions.py | 13 -- tmtccmd/utility/conf_util.py | 3 +- 31 files changed, 435 insertions(+), 449 deletions(-) delete mode 100644 tmtccmd/com_if/com_interface_base.py delete mode 100644 tmtccmd/config/cfg_hook.py create mode 100644 tmtccmd/config/setup.py delete mode 100644 tmtccmd/tm/definitions.py diff --git a/examples/common.py b/examples/common.py index 13be7818..3cd1a3b8 100644 --- a/examples/common.py +++ b/examples/common.py @@ -12,7 +12,9 @@ TcProcedureBase, TcQueueEntryBase, PacketCastWrapper, - TcQueueEntryType, ProcedureCastWrapper, TcProcedureType, + TcQueueEntryType, + ProcedureCastWrapper, + TcProcedureType, ) from tmtccmd.tc.handler import FeedWrapper from tmtccmd.tm import Service5Tm diff --git a/examples/tmtccli.py b/examples/tmtccli.py index c946d441..8dd518cf 100755 --- a/examples/tmtccli.py +++ b/examples/tmtccli.py @@ -10,7 +10,11 @@ from tmtccmd.config import SetupArgs from tmtccmd.core import BackendController, Request from tmtccmd.logging import get_console_logger -from tmtccmd.logging.pus import RegularTmtcLogWrapper, RawTmtcTimedLogWrapper, TimedLogWhen +from tmtccmd.logging.pus import ( + RegularTmtcLogWrapper, + RawTmtcTimedLogWrapper, + TimedLogWhen, +) from common import TcHandler, PusHandler, ExampleHookClass, APID from tmtccmd.utility.tmtc_printer import FsfwTmTcPrinter @@ -42,9 +46,7 @@ def main(): tmtccmd.setup(setup_args=setup_args) tmtc_backend = tmtccmd.create_default_tmtc_backend( - setup_args=setup_args, - tm_handler=ccsds_handler, - tc_handler=tc_handler + setup_args=setup_args, tm_handler=ccsds_handler, tc_handler=tc_handler ) tmtccmd.start(tmtc_backend=tmtc_backend) ctrl = BackendController() diff --git a/tests/test_seq_sender.py b/tests/test_seq_sender.py index ef4a6f5e..4c1e7801 100644 --- a/tests/test_seq_sender.py +++ b/tests/test_seq_sender.py @@ -2,7 +2,7 @@ from unittest import TestCase from unittest.mock import MagicMock, ANY -from tmtccmd.com_if.com_interface_base import CommunicationInterface +from tmtccmd.com_if import ComInterface from tmtccmd.tc.ccsds_seq_sender import SequentialCcsdsSender, SenderMode from tmtccmd.tc.handler import TcHandlerBase from tmtccmd.tc.queue import QueueWrapper, QueueHelper @@ -13,7 +13,7 @@ def test_basic(self): queue_wrapper = QueueWrapper(queue=deque()) queue_helper = QueueHelper(queue_wrapper) tc_handler_mock = MagicMock(spec=TcHandlerBase) - com_if = MagicMock(spec=CommunicationInterface) + com_if = MagicMock(spec=ComInterface) seq_sender = SequentialCcsdsSender(queue_wrapper, com_if, tc_handler_mock) res = seq_sender.operation() # Queue is empty initially diff --git a/tests/test_tm_handler.py b/tests/test_tm_handler.py index 945319d9..e6705c59 100644 --- a/tests/test_tm_handler.py +++ b/tests/test_tm_handler.py @@ -8,7 +8,7 @@ CcsdsTmHandler, UnknownApidHandlerBase, ) -from tmtccmd.com_if.com_interface_base import CommunicationInterface +from tmtccmd.com_if import ComInterface from tmtccmd.tm.ccsds_tm_listener import CcsdsTmListener @@ -29,9 +29,9 @@ def handle_tm(self, packet: bytes, user_args: any): class TestTmHandler(TestCase): def test_basic(self): tm_handler = ApidHandler(0x01) - com_if = MagicMock(specs=CommunicationInterface) + com_if = MagicMock(specs=ComInterface) unknown_handler = MagicMock(specs=UnknownApidHandlerBase) - ccsds_handler = CcsdsTmHandler(unknown_handler=unknown_handler) + ccsds_handler = CcsdsTmHandler(unknown_handler) ccsds_handler.add_apid_handler(tm_handler) tm_listener = CcsdsTmListener(tm_handler=ccsds_handler, com_if=com_if) handled_packets = tm_listener.operation() diff --git a/tmtccmd/__init__.py b/tmtccmd/__init__.py index 9b52f508..91406354 100644 --- a/tmtccmd/__init__.py +++ b/tmtccmd/__init__.py @@ -5,14 +5,14 @@ from tmtccmd.core.ccsds_backend import CcsdsTmtcBackend from tmtccmd.tm.ccsds_tm_listener import CcsdsTmListener -from tmtccmd.config import TmTcCfgHookBase, CoreGlobalIds, SetupArgs +from tmtccmd.config import TmTcCfgHookBase, backend_mode_conversion +from tmtccmd.config.setup import SetupArgs from tmtccmd.core.ccsds_backend import BackendBase from tmtccmd.core.frontend_base import FrontendBase from tmtccmd.tm import TmTypes, TmHandlerBase from tmtccmd.ccsds.handler import CcsdsTmHandler from tmtccmd.core.globals_manager import update_global from tmtccmd.logging import get_console_logger -from tmtccmd.config.definitions import backend_mode_conversion from tmtccmd.config.globals import set_default_globals_pre_args_parsing from tmtccmd.core import ModeWrapper from tmtccmd.tc import DefaultProcedureInfo @@ -100,6 +100,8 @@ def init_and_start_daemons(tmtc_backend: BackendBase): def __assign_tmtc_commander_hooks(hook_object: TmTcCfgHookBase): + from tmtccmd.config.globals import CoreGlobalIds + if hook_object is None: raise ValueError # Insert hook object handle into global dictionary so it can be used by the TMTC commander diff --git a/tmtccmd/ccsds/handler.py b/tmtccmd/ccsds/handler.py index fa8afbd5..4480acf7 100644 --- a/tmtccmd/ccsds/handler.py +++ b/tmtccmd/ccsds/handler.py @@ -39,7 +39,7 @@ class CcsdsTmHandler(TmHandlerBase): def __init__(self, unknown_handler: Optional[UnknownApidHandlerBase]): super().__init__(tm_type=TmTypes.CCSDS_SPACE_PACKETS) self._handler_dict: HandlerDictT = dict() - if unknown_handler: + if unknown_handler is None: self.unknown_handler = UnknownApidHandlerBase(None) else: self.unknown_handler = unknown_handler diff --git a/tmtccmd/cfdp/handler.py b/tmtccmd/cfdp/handler.py index 973ae735..beaa881a 100644 --- a/tmtccmd/cfdp/handler.py +++ b/tmtccmd/cfdp/handler.py @@ -1,12 +1,12 @@ import enum import abc import struct -from typing import Optional, Type, List, Any +from typing import Optional, List from .filestore import VirtualFilestore from .mib import LocalEntityCfg from tmtccmd.logging import get_console_logger -from tmtccmd.com_if.com_interface_base import CommunicationInterface +from tmtccmd.com_if import ComInterface from spacepackets.cfdp.pdu.metadata import MetadataPdu from spacepackets.cfdp.conf import PduConfig from spacepackets.cfdp.definitions import ( @@ -98,7 +98,7 @@ class CfdpHandler: def __init__( self, cfg: LocalEntityCfg, - com_if: Optional[CommunicationInterface], + com_if: Optional[ComInterface], cfdp_user: CfdpUserBase, byte_flow_ctrl: ByteFlowControl, ): @@ -128,7 +128,7 @@ def com_if(self): return self.__com_if @com_if.setter - def com_if(self, com_if: CommunicationInterface): + def com_if(self, com_if: ComInterface): self.__com_if = com_if def state_machine(self): diff --git a/tmtccmd/com_if/__init__.py b/tmtccmd/com_if/__init__.py index e69de29b..5cab805b 100644 --- a/tmtccmd/com_if/__init__.py +++ b/tmtccmd/com_if/__init__.py @@ -0,0 +1,65 @@ +# -*- coding: utf-8 -*- +"""Generic Communication Interface. Defines the syntax of the communication functions. +Abstract methods must be implemented by child class (e.g. Ethernet Com IF) +:author: R. Mueller +""" +from abc import abstractmethod + +from tmtccmd.tm import TelemetryListT + + +class ComInterface: + """Generic form of a communication interface to separate communication logic from + the underlying interface. + """ + + def __init__(self, com_if_key: str): + self.valid = True + self.com_if_key = com_if_key + + def get_id(self) -> str: + return self.com_if_key + + @abstractmethod + def initialize(self, args: any = None) -> any: + """Perform initializations step which can not be done in constructor or which require + returnvalues. + """ + + @abstractmethod + def open(self, args: any = None) -> None: + """Opens the communication interface to allow communication. + + :return: + """ + + @abstractmethod + def close(self, args: any = None) -> None: + """Closes the ComIF and releases any held resources (for example a Communication Port). + + :return: + """ + + @abstractmethod + def send(self, data: bytes): + """Send raw data""" + + @abstractmethod + def receive(self, parameters: any = 0) -> TelemetryListT: + """Returns a list of received packets. The child class can use a separate thread to poll for + the packets or use some other mechanism and container like a deque to store packets + to be returned here. + + :param parameters: + :return: + """ + packet_list = [] + return packet_list + + @abstractmethod + def data_available(self, timeout: float, parameters: any) -> int: + """Check whether TM data is available. + + :param parameters: Can be an arbitrary parameter like a timeout + :return: 0 if no data is available, number of bytes or anything > 0 otherwise. + """ diff --git a/tmtccmd/com_if/com_if_utilities.py b/tmtccmd/com_if/com_if_utilities.py index 60983427..620d6e04 100644 --- a/tmtccmd/com_if/com_if_utilities.py +++ b/tmtccmd/com_if/com_if_utilities.py @@ -3,12 +3,12 @@ from tmtccmd.logging import get_console_logger from tmtccmd.utility.conf_util import wrapped_prompt from tmtccmd.utility.json_handler import check_json_file, JsonKeyNames -from tmtccmd.config.definitions import ComIFDictT +from tmtccmd.config import ComIfDictT LOGGER = get_console_logger() -def determine_com_if(com_if_dict: ComIFDictT, json_cfg_path: str) -> str: +def determine_com_if(com_if_dict: ComIfDictT, json_cfg_path: str) -> str: do_prompt_com_if = False com_if_string = "" if not check_json_file(json_cfg_path): @@ -32,7 +32,7 @@ def determine_com_if(com_if_dict: ComIFDictT, json_cfg_path: str) -> str: return com_if_string -def prompt_com_if(com_if_dict: ComIFDictT) -> str: +def prompt_com_if(com_if_dict: ComIfDictT) -> str: com_if_string = "" while True: com_if_list = [] diff --git a/tmtccmd/com_if/com_interface_base.py b/tmtccmd/com_if/com_interface_base.py deleted file mode 100644 index 35dd1dec..00000000 --- a/tmtccmd/com_if/com_interface_base.py +++ /dev/null @@ -1,65 +0,0 @@ -# -*- coding: utf-8 -*- -"""Generic Communication Interface. Defines the syntax of the communication functions. -Abstract methods must be implemented by child class (e.g. Ethernet Com IF) -:author: R. Mueller -""" -from abc import abstractmethod - -from tmtccmd.tm.definitions import TelemetryListT - - -class CommunicationInterface: - """Generic form of a communication interface to separate communication logic from - the underlying interface. - """ - - def __init__(self, com_if_key: str): - self.valid = True - self.com_if_key = com_if_key - - def get_id(self) -> str: - return self.com_if_key - - @abstractmethod - def initialize(self, args: any = None) -> any: - """Perform initializations step which can not be done in constructor or which require - returnvalues. - """ - - @abstractmethod - def open(self, args: any = None) -> None: - """Opens the communication interface to allow communication. - - :return: - """ - - @abstractmethod - def close(self, args: any = None) -> None: - """Closes the ComIF and releases any held resources (for example a Communication Port). - - :return: - """ - - @abstractmethod - def send(self, data: bytes): - """Send raw data""" - - @abstractmethod - def receive(self, parameters: any = 0) -> TelemetryListT: - """Returns a list of received packets. The child class can use a separate thread to poll for - the packets or use some other mechanism and container like a deque to store packets - to be returned here. - - :param parameters: - :return: - """ - packet_list = [] - return packet_list - - @abstractmethod - def data_available(self, timeout: float, parameters: any) -> int: - """Check whether TM data is available. - - :param parameters: Can be an arbitrary parameter like a timeout - :return: 0 if no data is available, number of bytes or anything > 0 otherwise. - """ diff --git a/tmtccmd/com_if/dummy_com_if.py b/tmtccmd/com_if/dummy_com_if.py index b7f24f54..628b84e1 100644 --- a/tmtccmd/com_if/dummy_com_if.py +++ b/tmtccmd/com_if/dummy_com_if.py @@ -4,22 +4,18 @@ from spacepackets.ecss.pus_1_verification import RequestId from spacepackets.ecss.tc import PusTelecommand -from spacepackets.ccsds.spacepacket import ( - get_sp_psc_raw, - SequenceFlags, -) -from tmtccmd.com_if.com_interface_base import CommunicationInterface +from tmtccmd.com_if import ComInterface from tmtccmd.tm import TelemetryListT from tmtccmd.tm.pus_1_verification import Service1TMExtended from tmtccmd.tm.pus_17_test import Subservices, Service17TMExtended from tmtccmd.logging import get_console_logger -from tmtccmd.utility.tmtc_printer import FsfwTmTcPrinter + LOGGER = get_console_logger() -class DummyComIF(CommunicationInterface): +class DummyComIF(ComInterface): def __init__(self, com_if_key: str): super().__init__(com_if_key=com_if_key) self.dummy_handler = DummyHandler() @@ -75,7 +71,9 @@ def generate_reply_package(self): tm_packer = Service1TMExtended( subservice=1, ssc=self.current_ssc, - tc_request_id=RequestId(self.last_tc.packet_id, self.last_tc.packet_seq_ctrl) + tc_request_id=RequestId( + self.last_tc.packet_id, self.last_tc.packet_seq_ctrl + ), ) self.current_ssc += 1 @@ -84,7 +82,9 @@ def generate_reply_package(self): tm_packer = Service1TMExtended( subservice=7, ssc=self.current_ssc, - tc_request_id=RequestId(self.last_tc.packet_id, self.last_tc.packet_seq_ctrl) + tc_request_id=RequestId( + self.last_tc.packet_id, self.last_tc.packet_seq_ctrl + ), ) tm_packet_raw = tm_packer.pack() self.next_telemetry_package.append(tm_packet_raw) diff --git a/tmtccmd/com_if/qemu_com_if.py b/tmtccmd/com_if/qemu_com_if.py index dc43e9a4..df5fea2f 100644 --- a/tmtccmd/com_if/qemu_com_if.py +++ b/tmtccmd/com_if/qemu_com_if.py @@ -27,9 +27,8 @@ from collections import deque from threading import Thread -from tmtccmd.com_if.com_interface_base import CommunicationInterface -from tmtccmd.tm.definitions import TelemetryListT -from tmtccmd.utility.tmtc_printer import FsfwTmTcPrinter +from tmtccmd.com_if import ComInterface +from tmtccmd.tm import TelemetryListT from tmtccmd.com_if.serial_com_if import SerialComIF, SerialCommunicationType from tmtccmd.logging import get_console_logger from dle_encoder import DleEncoder, STX_CHAR, ETX_CHAR, DleErrorCodes @@ -61,7 +60,7 @@ def start_background_loop(loop: asyncio.AbstractEventLoop) -> None: loop.run_forever() -class QEMUComIF(CommunicationInterface): +class QEMUComIF(ComInterface): """ Specific Communication Interface implementation of the QEMU_SERIAL USART protocol for the TMTC software """ diff --git a/tmtccmd/com_if/serial_com_if.py b/tmtccmd/com_if/serial_com_if.py index 846dcbcf..69b6d68e 100644 --- a/tmtccmd/com_if/serial_com_if.py +++ b/tmtccmd/com_if/serial_com_if.py @@ -1,5 +1,4 @@ -"""Serial Communication Interface Implementation -""" +"""Serial Communication Interface Implementation""" import enum import threading import time @@ -10,9 +9,8 @@ import serial import serial.tools.list_ports -from tmtccmd.com_if.com_interface_base import CommunicationInterface -from tmtccmd.utility.tmtc_printer import FsfwTmTcPrinter -from tmtccmd.tm.definitions import TelemetryListT +from tmtccmd.com_if import ComInterface +from tmtccmd.tm import TelemetryListT from tmtccmd.logging import get_console_logger from dle_encoder import DleEncoder, STX_CHAR, ETX_CHAR, DleErrorCodes @@ -48,7 +46,7 @@ class SerialCommunicationType(enum.Enum): # pylint: disable=arguments-differ -class SerialComIF(CommunicationInterface): +class SerialComIF(ComInterface): """ Communication Interface to use serial communication. This requires the PySerial library. """ @@ -63,8 +61,6 @@ def __init__( ): """ Initiaze a serial communication handler. - :param tmtc_printer: TMTC printer object. Can be used for diagnostic purposes, but main - packet handling should be done by a separate thread. :param com_port: Specify COM port. :param baud_rate: Specify baud rate :param serial_timeout: Specify serial timeout diff --git a/tmtccmd/com_if/tcpip_tcp_com_if.py b/tmtccmd/com_if/tcpip_tcp_com_if.py index 411ca25f..143d811d 100644 --- a/tmtccmd/com_if/tcpip_tcp_com_if.py +++ b/tmtccmd/com_if/tcpip_tcp_com_if.py @@ -10,16 +10,14 @@ import threading import select from collections import deque -from typing import Union, Optional, Tuple +from typing import Optional, Tuple from spacepackets.ccsds.spacepacket import parse_space_packets from tmtccmd.logging import get_console_logger -from tmtccmd.config.definitions import CoreModeList -from tmtccmd.com_if.com_interface_base import CommunicationInterface -from tmtccmd.tm.definitions import TelemetryListT -from tmtccmd.utility.tmtc_printer import FsfwTmTcPrinter -from tmtccmd.config.definitions import EthernetAddressT +from tmtccmd.com_if import ComInterface +from tmtccmd.tm import TelemetryListT +from tmtccmd.config import EthernetAddressT, CoreModeList from tmtccmd.utility.conf_util import acquire_timeout LOGGER = get_console_logger() @@ -34,7 +32,7 @@ class TcpCommunicationType(enum.Enum): SPACE_PACKETS = 0 -class TcpIpTcpComIF(CommunicationInterface): +class TcpIpTcpComIF(ComInterface): """Communication interface for TCP communication.""" DEFAULT_LOCK_TIMEOUT = 0.4 diff --git a/tmtccmd/com_if/tcpip_udp_com_if.py b/tmtccmd/com_if/tcpip_udp_com_if.py index d870398d..92321b8d 100644 --- a/tmtccmd/com_if/tcpip_udp_com_if.py +++ b/tmtccmd/com_if/tcpip_udp_com_if.py @@ -1,18 +1,12 @@ -""" -:file: tcpip_udp_com_if.py -:date: 13.05.2021 -:brief: UDP Communication Interface -:author: R. Mueller -""" +"""UDP Communication Interface""" import select import socket from typing import Union from tmtccmd.logging import get_console_logger -from tmtccmd.com_if.com_interface_base import CommunicationInterface -from tmtccmd.tm.definitions import TelemetryListT -from tmtccmd.utility.tmtc_printer import FsfwTmTcPrinter -from tmtccmd.config.definitions import EthernetAddressT, CoreModeList +from tmtccmd.com_if import ComInterface +from tmtccmd.tm import TelemetryListT +from tmtccmd.config import EthernetAddressT, CoreModeList LOGGER = get_console_logger() @@ -20,10 +14,7 @@ UDP_SEND_WIRETAPPING_ENABLED = False -# pylint: disable=abstract-method -# pylint: disable=arguments-differ -# pylint: disable=too-many-arguments -class TcpIpUdpComIF(CommunicationInterface): +class TcpIpUdpComIF(ComInterface): """Communication interface for UDP communication.""" def __init__( @@ -75,6 +66,8 @@ def open(self, args: any = None): # Set non-blocking because we use select. self.udp_socket.setblocking(False) if self.init_mode == CoreModeList.LISTENER_MODE: + # TODO: This is kind of an ugly hack.. find a better solution, maybe by passing + # a CB which does this.. actually, this looks like a userspace problem from tmtccmd.pus.pus_17_test import pack_service17_ping_command # Send ping command immediately so the reception address is known for UDP diff --git a/tmtccmd/com_if/tcpip_utilities.py b/tmtccmd/com_if/tcpip_utilities.py index 43366cb4..db71608b 100644 --- a/tmtccmd/com_if/tcpip_utilities.py +++ b/tmtccmd/com_if/tcpip_utilities.py @@ -3,7 +3,7 @@ import struct import enum -from tmtccmd.config.definitions import EthernetAddressT +from tmtccmd.config import EthernetAddressT from tmtccmd.utility.json_handler import check_json_file from tmtccmd.logging import get_console_logger from tmtccmd.utility.json_handler import JsonKeyNames diff --git a/tmtccmd/config/__init__.py b/tmtccmd/config/__init__.py index 7940a49a..6e84af32 100644 --- a/tmtccmd/config/__init__.py +++ b/tmtccmd/config/__init__.py @@ -1,36 +1,193 @@ -from typing import Optional - -from tmtccmd.config.globals import CoreServiceList -from .args import ArgParserWrapper -from .definitions import CoreGlobalIds, OpCodeDictKeys, default_json_path -from tmtccmd.config.cfg_hook import TmTcCfgHookBase - - -class SetupArgs: - def __init__( - self, - hook_obj: TmTcCfgHookBase, - use_gui: bool, - apid: int, - args_wrapper: Optional[ArgParserWrapper], - json_cfg_path: Optional[str] = None, - reduced_printout: bool = False, - use_ansi_colors: bool = True, - ): - """This class encapsulates all required objects for the TMTC commander - :param hook_obj: User hook object. Needs to be implemented by the user - :param args_wrapper: Command line arguments as returned by the ArgumentParser.parse_args method - :param use_gui: Specify whether a GUI is used - :param reduced_printout: - :param use_ansi_colors: - """ - self.hook_obj = hook_obj - self.use_gui = use_gui - self.apid = apid - self.json_cfg_path = json_cfg_path - self.reduced_printout = reduced_printout - self.ansi_colors = use_ansi_colors - self.args_wrapper = args_wrapper +"""Definitions for the TMTC commander core +""" +import enum +from abc import abstractmethod +from typing import Tuple, Dict, Optional + + +from tmtccmd.com_if import ComInterface +from tmtccmd.config.tmtc_defs import TmTcDefWrapper +from tmtccmd.core import ModeWrapper, TmMode, TcMode, BackendBase +from tmtccmd.utility.obj_id import ObjectIdDictT +from tmtccmd.utility.retval import RetvalDictT + + +def default_json_path() -> str: + return "tmtc_conf.json" + + +# Com Interface Types +ComIfValueT = Tuple[str, any] +ComIfDictT = Dict[str, ComIfValueT] + +EthernetAddressT = Tuple[str, int] + + +class CoreComInterfaces(enum.Enum): + DUMMY = "dummy" + SERIAL_DLE = "ser_dle" + TCPIP_UDP = "udp" + TCPIP_TCP = "tcp" + SERIAL_FIXED_FRAME = "ser_fixed" + SERIAL_QEMU = "ser_qemu" + UNSPECIFIED = "unspec" + + +CORE_COM_IF_DICT = { + CoreComInterfaces.DUMMY.value: "Dummy Interface", + CoreComInterfaces.SERIAL_DLE.value: "Serial Interace with DLE encoding", + CoreComInterfaces.TCPIP_UDP.value: "TCP/IP with UDP datagrams", + CoreComInterfaces.TCPIP_TCP.value: "TCP/IP with TCP", + CoreComInterfaces.SERIAL_FIXED_FRAME.value: "Serial Interface with fixed size frames", + CoreComInterfaces.SERIAL_QEMU.value: "Serial Interface using QEMU", + CoreComInterfaces.UNSPECIFIED.value: "Unspecified", +} + + +# Mode options, set by args parser +class CoreModeList(enum.IntEnum): + # This mode is optimized to handle one queue. It will configure the backend to request + # program termination upon finishing the queue handling. This is also the appropriate solution + # for single commands where the queue only consists of one telecommand. + ONE_QUEUE_MODE = 0 + LISTENER_MODE = 1 + # Interactive GUI mode which allows sending and handling procedures interactively + GUI_MODE = 2 + # This mode is optimized for the handling of multiple queues. It will configure the backend + # to request additional queues or a mode change from the user instead of requesting program + # termination + MULTI_INTERACTIVE_QUEUE_MODE = 3 + # The program will not do anything in this mode. This includes polling TM and sending any TCs + IDLE = 5 + + +CoreModeStrings = { + CoreModeList.ONE_QUEUE_MODE: "one-q", + CoreModeList.MULTI_INTERACTIVE_QUEUE_MODE: "multi-q", + CoreModeList.LISTENER_MODE: "listener", + CoreModeList.IDLE: "idle", + CoreModeList.GUI_MODE: "gui", +} + + +def backend_mode_conversion(mode: CoreModeList, mode_wrapper: ModeWrapper): + if mode == CoreModeStrings[CoreModeList.LISTENER_MODE]: + mode_wrapper.tm_mode = TmMode.LISTENER + mode_wrapper.tc_mode = TcMode.IDLE + elif mode == CoreModeStrings[CoreModeList.ONE_QUEUE_MODE]: + mode_wrapper.tm_mode = TmMode.LISTENER + mode_wrapper.tc_mode = TcMode.ONE_QUEUE + elif mode == CoreModeStrings[CoreModeList.MULTI_INTERACTIVE_QUEUE_MODE]: + mode_wrapper.tc_mode = TcMode.MULTI_QUEUE + mode_wrapper.tm_mode = TmMode.LISTENER + elif mode == CoreModeStrings[CoreModeList.GUI_MODE]: + mode_wrapper.tc_mode = TcMode.MULTI_QUEUE + mode_wrapper.tm_mode = TmMode.IDLE + + +class CoreServiceList(enum.Enum): + SERVICE_2 = "2" + SERVICE_3 = "3" + SERVICE_5 = "5" + SERVICE_8 = "8" + SERVICE_9 = "9" + SERVICE_11 = "11" + SERVICE_17 = "17" + SERVICE_20 = "20" + SERVICE_23 = "23" + SERVICE_200 = "200" + + +DEFAULT_APID = 0xEF +DEBUG_MODE = False + + +class TmTcCfgHookBase: + """This hook allows users to adapt the TMTC commander core to the unique mission requirements. + It is used by implementing all abstract functions and then passing the instance to the + TMTC commander core. + """ + + def __init__(self, json_cfg_path: Optional[str] = None): self.json_cfg_path = json_cfg_path - if json_cfg_path is None: + if self.json_cfg_path is None: self.json_cfg_path = default_json_path() + + @abstractmethod + def get_object_ids(self) -> ObjectIdDictT: + from tmtccmd.config.objects import get_core_object_ids + + """The user can specify an object ID dictionary here mapping object ID bytearrays to a + list. This list could contain containing the string representation or additional + information about that object ID. + """ + return get_core_object_ids() + + @abstractmethod + def assign_communication_interface(self, com_if_key: str) -> Optional[ComInterface]: + """Assign the communication interface used by the TMTC commander to send and receive + TMTC with. + + :param com_if_key: String key of the communication interface to be created. + """ + from tmtccmd.config.com_if import create_communication_interface_default + + return create_communication_interface_default( + com_if_key=com_if_key, json_cfg_path=self.json_cfg_path + ) + + def get_com_if_dict(self) -> ComIfDictT: + return CORE_COM_IF_DICT + + @abstractmethod + def get_tmtc_definitions(self) -> TmTcDefWrapper: + """This is a dicitonary mapping services represented by strings to an operation code + dictionary. + + :return: + """ + from tmtccmd.config.globals import get_default_tmtc_defs + + return get_default_tmtc_defs() + + @abstractmethod + def perform_mode_operation(self, tmtc_backend: BackendBase, mode: int): + """Perform custom mode operations + :param tmtc_backend: + :param mode: + :return: + """ + pass + + def get_retval_dict(self) -> RetvalDictT: + from tmtccmd import get_console_logger + + logger = get_console_logger() + logger.info("No return value dictionary specified") + return dict() + + +def get_global_hook_obj() -> Optional[TmTcCfgHookBase]: + """This function can be used to get the handle to the global hook object. + :return: + """ + from tmtccmd import get_console_logger + + logger = get_console_logger() + try: + from tmtccmd.core.globals_manager import get_global + from tmtccmd.config.definitions import CoreGlobalIds + + from typing import cast + + hook_obj_raw = get_global(CoreGlobalIds.TMTC_HOOK) + if hook_obj_raw is None: + logger.error("Hook object is invalid!") + return None + return cast(TmTcCfgHookBase, hook_obj_raw) + except ImportError: + logger.exception("Issues importing modules to get global hook handle!") + return None + except AttributeError: + logger.exception("Attribute error when trying to get global hook handle!") + return None diff --git a/tmtccmd/config/args.py b/tmtccmd/config/args.py index 7046aaf6..69ad47df 100644 --- a/tmtccmd/config/args.py +++ b/tmtccmd/config/args.py @@ -6,9 +6,8 @@ from typing import Optional, List from dataclasses import dataclass -from tmtccmd.config.definitions import CoreModeList, CoreComInterfaces +from tmtccmd import TmTcCfgHookBase from tmtccmd.config.prompt import prompt_service, prompt_op_code -from tmtccmd.config.cfg_hook import TmTcCfgHookBase from tmtccmd.logging import get_console_logger @@ -115,7 +114,7 @@ def process_tmtccmd_args( arguments. For something like a GUI, it might make sense to disable this :return: None """ - from tmtccmd.config.definitions import CoreModeStrings + from tmtccmd.config import CoreModeStrings, CoreComInterfaces, CoreModeList from tmtccmd.com_if.com_if_utilities import determine_com_if group = ArgsGroup() @@ -260,7 +259,7 @@ def add_generic_arguments(arg_parser: argparse.ArgumentParser): def add_default_mode_arguments(arg_parser: argparse.ArgumentParser): - from tmtccmd.config.definitions import CoreModeList, CoreModeStrings + from tmtccmd.config import CoreModeList, CoreModeStrings help_text = f"Core Modes. Default: {CoreModeStrings[CoreModeList.ONE_QUEUE_MODE]}\n" one_q = ( @@ -293,7 +292,7 @@ def add_default_mode_arguments(arg_parser: argparse.ArgumentParser): def add_default_com_if_arguments(arg_parser: argparse.ArgumentParser): - from tmtccmd.config.definitions import CORE_COM_IF_DICT, CoreComInterfaces + from tmtccmd.config import CORE_COM_IF_DICT, CoreComInterfaces help_text = ( "Core Communication Interface. If this is not specified, the commander core\n" diff --git a/tmtccmd/config/cfg_hook.py b/tmtccmd/config/cfg_hook.py deleted file mode 100644 index bc3cd0e5..00000000 --- a/tmtccmd/config/cfg_hook.py +++ /dev/null @@ -1,99 +0,0 @@ -from abc import abstractmethod -from typing import Optional - -from tmtccmd.config.definitions import default_json_path, ComIFDictT, CORE_COM_IF_DICT -from tmtccmd.config.tmtc_defs import TmTcDefWrapper -from tmtccmd.logging import get_console_logger -from tmtccmd.utility.retval import RetvalDictT -from tmtccmd.utility.obj_id import ObjectIdDictT -from tmtccmd.core import BackendBase -from tmtccmd.com_if.com_interface_base import CommunicationInterface - -LOGGER = get_console_logger() - - -class TmTcCfgHookBase: - """This hook allows users to adapt the TMTC commander core to the unique mission requirements. - It is used by implementing all abstract functions and then passing the instance to the - TMTC commander core. - """ - - def __init__(self, json_cfg_path: Optional[str] = None): - self.json_cfg_path = json_cfg_path - if self.json_cfg_path is None: - self.json_cfg_path = default_json_path() - - @abstractmethod - def get_object_ids(self) -> ObjectIdDictT: - from tmtccmd.config.objects import get_core_object_ids - - """The user can specify an object ID dictionary here mapping object ID bytearrays to a - list. This list could contain containing the string representation or additional - information about that object ID. - """ - return get_core_object_ids() - - @abstractmethod - def assign_communication_interface( - self, com_if_key: str - ) -> Optional[CommunicationInterface]: - """Assign the communication interface used by the TMTC commander to send and receive - TMTC with. - - :param com_if_key: String key of the communication interface to be created. - """ - from tmtccmd.config.com_if import create_communication_interface_default - - return create_communication_interface_default( - com_if_key=com_if_key, json_cfg_path=self.json_cfg_path - ) - - def get_com_if_dict(self) -> ComIFDictT: - return CORE_COM_IF_DICT - - @abstractmethod - def get_tmtc_definitions(self) -> TmTcDefWrapper: - """This is a dicitonary mapping services represented by strings to an operation code - dictionary. - - :return: - """ - from tmtccmd.config.globals import get_default_tmtc_defs - - return get_default_tmtc_defs() - - @abstractmethod - def perform_mode_operation(self, tmtc_backend: BackendBase, mode: int): - """Perform custom mode operations - :param tmtc_backend: - :param mode: - :return: - """ - pass - - def get_retval_dict(self) -> RetvalDictT: - LOGGER.info("No return value dictionary specified") - return dict() - - -def get_global_hook_obj() -> Optional[TmTcCfgHookBase]: - """This function can be used to get the handle to the global hook object. - :return: - """ - try: - from tmtccmd.core.globals_manager import get_global - from tmtccmd.config.definitions import CoreGlobalIds - - from typing import cast - - hook_obj_raw = get_global(CoreGlobalIds.TMTC_HOOK) - if hook_obj_raw is None: - LOGGER.error("Hook object is invalid!") - return None - return cast(TmTcCfgHookBase, hook_obj_raw) - except ImportError: - LOGGER.exception("Issues importing modules to get global hook handle!") - return None - except AttributeError: - LOGGER.exception("Attribute error when trying to get global hook handle!") - return None diff --git a/tmtccmd/config/com_if.py b/tmtccmd/config/com_if.py index 74b4ebae..dd9758b7 100644 --- a/tmtccmd/config/com_if.py +++ b/tmtccmd/config/com_if.py @@ -1,9 +1,10 @@ import sys from typing import Optional, Tuple -from tmtccmd.config.definitions import CoreGlobalIds, CoreComInterfaces +from tmtccmd.config import CoreComInterfaces +from tmtccmd.config.globals import CoreGlobalIds from tmtccmd.core.globals_manager import get_global, update_global -from tmtccmd.com_if.com_interface_base import CommunicationInterface +from tmtccmd.com_if import ComInterface from tmtccmd.com_if.serial_com_if import ( SerialConfigIds, SerialCommunicationType, @@ -22,7 +23,7 @@ def create_communication_interface_default( com_if_key: str, json_cfg_path: str, space_packet_ids: Tuple[int] = (0,), -) -> Optional[CommunicationInterface]: +) -> Optional[ComInterface]: """Return the desired communication interface object :param com_if_key: @@ -146,7 +147,7 @@ def create_default_tcpip_interface( com_if_key: str, json_cfg_path: str, space_packet_ids: Tuple[int] = (0,), -) -> Optional[CommunicationInterface]: +) -> Optional[ComInterface]: """Create a default serial interface. Requires a certain set of global variables set up. See :func:`default_tcpip_cfg_setup` for more details. @@ -195,7 +196,7 @@ def create_default_tcpip_interface( def create_default_serial_interface( com_if_key: str, json_cfg_path: str -) -> Optional[CommunicationInterface]: +) -> Optional[ComInterface]: """Create a default serial interface. Requires a certain set of global variables set up. See :func:`set_up_serial_cfg` for more details. diff --git a/tmtccmd/config/definitions.py b/tmtccmd/config/definitions.py index 57ae2e23..e69de29b 100644 --- a/tmtccmd/config/definitions.py +++ b/tmtccmd/config/definitions.py @@ -1,142 +0,0 @@ -"""Definitions for the TMTC commander core -""" -import enum -from typing import Tuple, Dict - -from tmtccmd.core import ModeWrapper, TmMode, TcMode - - -def default_json_path() -> str: - return "tmtc_conf.json" - - -class CoreGlobalIds(enum.IntEnum): - """ - Numbers from 128 to 200 are reserved for core globals - """ - - # Object handles - TMTC_HOOK = 128 - COM_INTERFACE_HANDLE = 129 - TM_LISTENER_HANDLE = 130 - TMTC_PRINTER_HANDLE = 131 - TM_HANDLER_HANDLE = 132 - PRETTY_PRINTER = 133 - - # Parameters - JSON_CFG_PATH = 139 - MODE = 141 - CURRENT_SERVICE = 142 - COM_IF = 144 - OP_CODE = 145 - TM_TIMEOUT = 146 - SERVICE_OP_CODE_DICT = 147 - COM_IF_DICT = 148 - - # Miscellaneous - DISPLAY_MODE = 150 - USE_LISTENER_AFTER_OP = 151 - PRINT_HK = 152 - PRINT_TM = 153 - PRINT_RAW_TM = 154 - PRINT_TO_FILE = 155 - RESEND_TC = 156 - TC_SEND_TIMEOUT_FACTOR = 157 - - # Config dictionaries - USE_SERIAL = 160 - SERIAL_CONFIG = 161 - USE_ETHERNET = 162 - ETHERNET_CONFIG = 163 - END = 300 - - -class OpCodeDictKeys(enum.IntEnum): - TIMEOUT = CoreGlobalIds.TM_TIMEOUT - ENTER_LISTENER_MODE = CoreGlobalIds.USE_LISTENER_AFTER_OP - - -# Com Interface Types -ComIFValueT = Tuple[str, any] -ComIFDictT = Dict[str, ComIFValueT] - -EthernetAddressT = Tuple[str, int] - - -class CoreComInterfaces(enum.Enum): - DUMMY = "dummy" - SERIAL_DLE = "ser_dle" - TCPIP_UDP = "udp" - TCPIP_TCP = "tcp" - SERIAL_FIXED_FRAME = "ser_fixed" - SERIAL_QEMU = "ser_qemu" - UNSPECIFIED = "unspec" - - -CORE_COM_IF_DICT = { - CoreComInterfaces.DUMMY.value: "Dummy Interface", - CoreComInterfaces.SERIAL_DLE.value: "Serial Interace with DLE encoding", - CoreComInterfaces.TCPIP_UDP.value: "TCP/IP with UDP datagrams", - CoreComInterfaces.TCPIP_TCP.value: "TCP/IP with TCP", - CoreComInterfaces.SERIAL_FIXED_FRAME.value: "Serial Interface with fixed size frames", - CoreComInterfaces.SERIAL_QEMU.value: "Serial Interface using QEMU", - CoreComInterfaces.UNSPECIFIED.value: "Unspecified", -} - - -# Mode options, set by args parser -class CoreModeList(enum.IntEnum): - # This mode is optimized to handle one queue. It will configure the backend to request - # program termination upon finishing the queue handling. This is also the appropriate solution - # for single commands where the queue only consists of one telecommand. - ONE_QUEUE_MODE = 0 - LISTENER_MODE = 1 - # Interactive GUI mode which allows sending and handling procedures interactively - GUI_MODE = 2 - # This mode is optimized for the handling of multiple queues. It will configure the backend - # to request additional queues or a mode change from the user instead of requesting program - # termination - MULTI_INTERACTIVE_QUEUE_MODE = 3 - # The program will not do anything in this mode. This includes polling TM and sending any TCs - IDLE = 5 - - -CoreModeStrings = { - CoreModeList.ONE_QUEUE_MODE: "one-q", - CoreModeList.MULTI_INTERACTIVE_QUEUE_MODE: "multi-q", - CoreModeList.LISTENER_MODE: "listener", - CoreModeList.IDLE: "idle", - CoreModeList.GUI_MODE: "gui", -} - - -def backend_mode_conversion(mode: CoreModeList, mode_wrapper: ModeWrapper): - if mode == CoreModeStrings[CoreModeList.LISTENER_MODE]: - mode_wrapper.tm_mode = TmMode.LISTENER - mode_wrapper.tc_mode = TcMode.IDLE - elif mode == CoreModeStrings[CoreModeList.ONE_QUEUE_MODE]: - mode_wrapper.tm_mode = TmMode.LISTENER - mode_wrapper.tc_mode = TcMode.ONE_QUEUE - elif mode == CoreModeStrings[CoreModeList.MULTI_INTERACTIVE_QUEUE_MODE]: - mode_wrapper.tc_mode = TcMode.MULTI_QUEUE - mode_wrapper.tm_mode = TmMode.LISTENER - elif mode == CoreModeStrings[CoreModeList.GUI_MODE]: - mode_wrapper.tc_mode = TcMode.MULTI_QUEUE - mode_wrapper.tm_mode = TmMode.IDLE - - -class CoreServiceList(enum.Enum): - SERVICE_2 = "2" - SERVICE_3 = "3" - SERVICE_5 = "5" - SERVICE_8 = "8" - SERVICE_9 = "9" - SERVICE_11 = "11" - SERVICE_17 = "17" - SERVICE_20 = "20" - SERVICE_23 = "23" - SERVICE_200 = "200" - - -DEFAULT_APID = 0xEF -DEBUG_MODE = False diff --git a/tmtccmd/config/globals.py b/tmtccmd/config/globals.py index 9f9041a0..5dfa4caa 100644 --- a/tmtccmd/config/globals.py +++ b/tmtccmd/config/globals.py @@ -1,4 +1,5 @@ import collections.abc +import enum import pprint from typing import Union, List, Dict @@ -12,14 +13,13 @@ from tmtccmd.logging import get_console_logger from tmtccmd.core.globals_manager import update_global, get_global -from tmtccmd.config.definitions import ( - CoreGlobalIds, +from tmtccmd.config import ( CoreModeList, CoreServiceList, CoreModeStrings, CORE_COM_IF_DICT, CoreComInterfaces, - ComIFDictT, + ComIfDictT, ) from tmtccmd.config.tmtc_defs import TmTcDefWrapper, OpCodeEntry @@ -28,6 +28,47 @@ DEF_WRAPPER = None +class CoreGlobalIds(enum.IntEnum): + """ + Numbers from 128 to 200 are reserved for core globals + """ + + # Object handles + TMTC_HOOK = 128 + COM_INTERFACE_HANDLE = 129 + TM_LISTENER_HANDLE = 130 + TMTC_PRINTER_HANDLE = 131 + TM_HANDLER_HANDLE = 132 + PRETTY_PRINTER = 133 + + # Parameters + JSON_CFG_PATH = 139 + MODE = 141 + CURRENT_SERVICE = 142 + COM_IF = 144 + OP_CODE = 145 + TM_TIMEOUT = 146 + SERVICE_OP_CODE_DICT = 147 + COM_IF_DICT = 148 + + # Miscellaneous + DISPLAY_MODE = 150 + USE_LISTENER_AFTER_OP = 151 + PRINT_HK = 152 + PRINT_TM = 153 + PRINT_RAW_TM = 154 + PRINT_TO_FILE = 155 + RESEND_TC = 156 + TC_SEND_TIMEOUT_FACTOR = 157 + + # Config dictionaries + USE_SERIAL = 160 + SERIAL_CONFIG = 161 + USE_ETHERNET = 162 + ETHERNET_CONFIG = 163 + END = 300 + + def set_json_cfg_path(json_cfg_path: str): update_global(CoreGlobalIds.JSON_CFG_PATH, json_cfg_path) @@ -36,12 +77,12 @@ def get_json_cfg_path() -> str: return get_global(CoreGlobalIds.JSON_CFG_PATH) -def set_glob_com_if_dict(custom_com_if_dict: ComIFDictT): +def set_glob_com_if_dict(custom_com_if_dict: ComIfDictT): CORE_COM_IF_DICT.update(custom_com_if_dict) update_global(CoreGlobalIds.COM_IF_DICT, CORE_COM_IF_DICT) -def get_glob_com_if_dict() -> ComIFDictT: +def get_glob_com_if_dict() -> ComIfDictT: return get_global(CoreGlobalIds.COM_IF_DICT) diff --git a/tmtccmd/config/objects.py b/tmtccmd/config/objects.py index 60099875..db65513b 100644 --- a/tmtccmd/config/objects.py +++ b/tmtccmd/config/objects.py @@ -5,10 +5,10 @@ def get_core_object_ids() -> ObjectIdDictT: - """ - These are the object IDs for the tmtccmd core. The core will usually take care of + """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 + + :return Dictionary of the core object IDs """ invalid_id = ObjectId.from_bytes(obj_id_as_bytes=INVALID_ID) invalid_id.name = "Invalid ID" diff --git a/tmtccmd/config/setup.py b/tmtccmd/config/setup.py new file mode 100644 index 00000000..820059cd --- /dev/null +++ b/tmtccmd/config/setup.py @@ -0,0 +1,37 @@ +from typing import Optional + +from tmtccmd import TmTcCfgHookBase +from tmtccmd.config import default_json_path +from tmtccmd.config.args import ArgParserWrapper + + +class SetupArgs: + """This class encapsulates various important setup parameters required by tmtccmd components""" + + def __init__( + self, + hook_obj: TmTcCfgHookBase, + use_gui: bool, + apid: int, + args_wrapper: Optional[ArgParserWrapper], + json_cfg_path: Optional[str] = None, + reduced_printout: bool = False, + use_ansi_colors: bool = True, + ): + """ + :param hook_obj: User hook object. Needs to be implemented by the user + :param args_wrapper: Optional helper wrapper which contains CLI arguments. + :param use_gui: Specify whether a GUI is used. + :param reduced_printout: + :param use_ansi_colors: + """ + self.hook_obj = hook_obj + self.use_gui = use_gui + self.apid = apid + self.json_cfg_path = json_cfg_path + self.reduced_printout = reduced_printout + self.ansi_colors = use_ansi_colors + self.args_wrapper = args_wrapper + self.json_cfg_path = json_cfg_path + if json_cfg_path is None: + self.json_cfg_path = default_json_path() diff --git a/tmtccmd/core/ccsds_backend.py b/tmtccmd/core/ccsds_backend.py index 4406cbbd..abd58776 100644 --- a/tmtccmd/core/ccsds_backend.py +++ b/tmtccmd/core/ccsds_backend.py @@ -3,7 +3,7 @@ from collections import deque from typing import Optional -from tmtccmd.config.definitions import CoreServiceList, CoreModeList +from tmtccmd.config import CoreServiceList, CoreModeList from tmtccmd.core import ( BackendBase, BackendState, @@ -21,7 +21,7 @@ SenderMode, ) from tmtccmd.tm.ccsds_tm_listener import CcsdsTmListener -from tmtccmd.com_if.com_interface_base import CommunicationInterface +from tmtccmd.com_if import ComInterface LOGGER = get_console_logger() @@ -33,7 +33,7 @@ def __init__( self, tc_mode: TcMode, tm_mode: TmMode, - com_if: CommunicationInterface, + com_if: ComInterface, tm_listener: CcsdsTmListener, tc_handler: TcHandlerBase, ): @@ -65,7 +65,7 @@ def com_if_id(self): return self.__com_if.get_id() @property - def com_if(self) -> CommunicationInterface: + def com_if(self) -> ComInterface: return self.__com_if @property @@ -96,7 +96,7 @@ def tm_mode(self, tm_mode: TmMode): def tm_listener(self): return self.__tm_listener - def try_set_com_if(self, com_if: CommunicationInterface): + def try_set_com_if(self, com_if: ComInterface): if not self.com_if_active(): self.__com_if = com_if self.__tm_listener.com_if(self.__com_if) diff --git a/tmtccmd/tc/ccsds_seq_sender.py b/tmtccmd/tc/ccsds_seq_sender.py index a8b47726..c89388bb 100644 --- a/tmtccmd/tc/ccsds_seq_sender.py +++ b/tmtccmd/tc/ccsds_seq_sender.py @@ -5,7 +5,7 @@ from tmtccmd.tc import TcQueueEntryBase, TcQueueEntryType, PacketCastWrapper from tmtccmd.tc.handler import TcHandlerBase from tmtccmd.tc.queue import QueueWrapper -from tmtccmd.com_if.com_interface_base import CommunicationInterface +from tmtccmd.com_if import ComInterface from tmtccmd.logging import get_console_logger from tmtccmd.utility.countdown import Countdown @@ -30,7 +30,7 @@ class SequentialCcsdsSender: def __init__( self, queue_wrapper: QueueWrapper, - com_if: CommunicationInterface, + com_if: ComInterface, tc_handler: TcHandlerBase, ): """ diff --git a/tmtccmd/tc/handler.py b/tmtccmd/tc/handler.py index 7cfeae62..b1a8a503 100644 --- a/tmtccmd/tc/handler.py +++ b/tmtccmd/tc/handler.py @@ -1,6 +1,6 @@ from abc import abstractmethod -from tmtccmd.com_if.com_interface_base import CommunicationInterface +from tmtccmd.com_if import ComInterface from tmtccmd.tc import TcQueueEntryBase, TcProcedureBase from tmtccmd.tc.queue import QueueHelper, QueueWrapper @@ -25,7 +25,7 @@ def __init__(self): pass @abstractmethod - def send_cb(self, tc_queue_entry: TcQueueEntryBase, com_if: CommunicationInterface): + def send_cb(self, tc_queue_entry: TcQueueEntryBase, com_if: ComInterface): """This function callback will be called for each queue entry. This also includes miscellaneous queue entries, for example the ones used to log additional information. It is up to the user code implementation to determine the concrete queue entry. diff --git a/tmtccmd/tm/__init__.py b/tmtccmd/tm/__init__.py index 52f7fd70..d7d56a78 100644 --- a/tmtccmd/tm/__init__.py +++ b/tmtccmd/tm/__init__.py @@ -1,12 +1,24 @@ import enum +from typing import Deque, List, Union -from tmtccmd.tm.definitions import TelemetryListT, TelemetryQueueT +from spacepackets.ecss import PusTelemetry +from tmtccmd.tm.base import PusTmInfoInterface, PusTmInterface from tmtccmd.tm.pus_5_event import Service5Tm from tmtccmd.tm.pus_8_funccmd import Service8FsfwTm from tmtccmd.tm.pus_3_fsfw_hk import Service3FsfwTm from tmtccmd.tm.pus_20_fsfw_parameters import Service20FsfwTm from tmtccmd.tm.pus_200_fsfw_modes import Service200FsfwTm +TelemetryListT = List[bytes] +TelemetryQueueT = Deque[bytes] + +PusTmQueue = Deque[PusTelemetry] +PusTmListT = List[PusTelemetry] + +PusTmQueueT = Deque[PusTmListT] +PusIFListT = List[Union[PusTmInfoInterface, PusTmInterface]] +PusIFQueueT = Deque[PusIFListT] + class TmTypes(enum.Enum): NONE = enum.auto diff --git a/tmtccmd/tm/ccsds_tm_listener.py b/tmtccmd/tm/ccsds_tm_listener.py index a10d6d7c..2d1fb190 100644 --- a/tmtccmd/tm/ccsds_tm_listener.py +++ b/tmtccmd/tm/ccsds_tm_listener.py @@ -4,9 +4,9 @@ from spacepackets.ccsds.spacepacket import get_apid_from_raw_space_packet from tmtccmd.ccsds.handler import CcsdsTmHandler -from tmtccmd.tm.definitions import TelemetryQueueT +from tmtccmd.tm import TelemetryQueueT from tmtccmd.logging import get_console_logger -from tmtccmd.com_if.com_interface_base import CommunicationInterface +from tmtccmd.com_if import ComInterface LOGGER = get_console_logger() @@ -25,7 +25,7 @@ class CcsdsTmListener: def __init__( self, - com_if: CommunicationInterface, + com_if: ComInterface, tm_handler: CcsdsTmHandler, ): """Initiate a TM listener. @@ -42,7 +42,7 @@ def com_if(self): return self.__com_if @com_if.setter - def com_if(self, com_if: CommunicationInterface): + def com_if(self, com_if: ComInterface): self.__com_if = com_if def operation(self) -> int: diff --git a/tmtccmd/tm/definitions.py b/tmtccmd/tm/definitions.py deleted file mode 100644 index 1178f928..00000000 --- a/tmtccmd/tm/definitions.py +++ /dev/null @@ -1,13 +0,0 @@ -from typing import Deque, List, Union -from spacepackets.ecss.tm import PusTelemetry -from tmtccmd.tm.base import PusTmInfoInterface, PusTmInterface - -TelemetryListT = List[bytes] -TelemetryQueueT = Deque[bytes] - -PusTmQueue = Deque[PusTelemetry] -PusTmListT = List[PusTelemetry] - -PusTmQueueT = Deque[PusTmListT] -PusIFListT = List[Union[PusTmInfoInterface, PusTmInterface]] -PusIFQueueT = Deque[PusIFListT] diff --git a/tmtccmd/utility/conf_util.py b/tmtccmd/utility/conf_util.py index e981870b..7bed1503 100644 --- a/tmtccmd/utility/conf_util.py +++ b/tmtccmd/utility/conf_util.py @@ -3,7 +3,6 @@ from contextlib import contextmanager from tmtccmd.core.globals_manager import get_global -from tmtccmd.config.definitions import CoreGlobalIds from tmtccmd.logging import get_console_logger @@ -92,6 +91,8 @@ def print_core_globals(): or as an optional information output :return: """ + from tmtccmd.config.globals import CoreGlobalIds + service_param = get_global(CoreGlobalIds.CURRENT_SERVICE) mode_param = get_global(CoreGlobalIds.MODE) com_if_param = get_global(CoreGlobalIds.COM_IF) From 5c72d772416906418f16485e1082441a52c291b4 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Sun, 26 Jun 2022 02:05:34 +0200 Subject: [PATCH 103/221] renaming + simplifications --- tmtccmd/com_if/{dummy_com_if.py => dummy.py} | 0 tmtccmd/com_if/{qemu_com_if.py => qemu.py} | 2 +- .../com_if/{serial_utilities.py => ser_utils.py} | 0 tmtccmd/com_if/{serial_com_if.py => serial.py} | 0 tmtccmd/com_if/{tcpip_tcp_com_if.py => tcp.py} | 0 .../{tcpip_utilities.py => tcpip_utils.py} | 0 tmtccmd/com_if/{tcpip_udp_com_if.py => udp.py} | 0 tmtccmd/com_if/{com_if_utilities.py => utils.py} | 2 +- tmtccmd/config/args.py | 2 +- tmtccmd/config/com_if.py | 16 ++++++++-------- tmtccmd/tc/definitions.py | 0 tmtccmd/utility/{json_handler.py => json.py} | 0 12 files changed, 11 insertions(+), 11 deletions(-) rename tmtccmd/com_if/{dummy_com_if.py => dummy.py} (100%) rename tmtccmd/com_if/{qemu_com_if.py => qemu.py} (99%) rename tmtccmd/com_if/{serial_utilities.py => ser_utils.py} (100%) rename tmtccmd/com_if/{serial_com_if.py => serial.py} (100%) rename tmtccmd/com_if/{tcpip_tcp_com_if.py => tcp.py} (100%) rename tmtccmd/com_if/{tcpip_utilities.py => tcpip_utils.py} (100%) rename tmtccmd/com_if/{tcpip_udp_com_if.py => udp.py} (100%) rename tmtccmd/com_if/{com_if_utilities.py => utils.py} (97%) delete mode 100644 tmtccmd/tc/definitions.py rename tmtccmd/utility/{json_handler.py => json.py} (100%) diff --git a/tmtccmd/com_if/dummy_com_if.py b/tmtccmd/com_if/dummy.py similarity index 100% rename from tmtccmd/com_if/dummy_com_if.py rename to tmtccmd/com_if/dummy.py diff --git a/tmtccmd/com_if/qemu_com_if.py b/tmtccmd/com_if/qemu.py similarity index 99% rename from tmtccmd/com_if/qemu_com_if.py rename to tmtccmd/com_if/qemu.py index df5fea2f..f388f253 100644 --- a/tmtccmd/com_if/qemu_com_if.py +++ b/tmtccmd/com_if/qemu.py @@ -29,7 +29,7 @@ from tmtccmd.com_if import ComInterface from tmtccmd.tm import TelemetryListT -from tmtccmd.com_if.serial_com_if import SerialComIF, SerialCommunicationType +from tmtccmd.com_if.serial import SerialComIF, SerialCommunicationType from tmtccmd.logging import get_console_logger from dle_encoder import DleEncoder, STX_CHAR, ETX_CHAR, DleErrorCodes diff --git a/tmtccmd/com_if/serial_utilities.py b/tmtccmd/com_if/ser_utils.py similarity index 100% rename from tmtccmd/com_if/serial_utilities.py rename to tmtccmd/com_if/ser_utils.py diff --git a/tmtccmd/com_if/serial_com_if.py b/tmtccmd/com_if/serial.py similarity index 100% rename from tmtccmd/com_if/serial_com_if.py rename to tmtccmd/com_if/serial.py diff --git a/tmtccmd/com_if/tcpip_tcp_com_if.py b/tmtccmd/com_if/tcp.py similarity index 100% rename from tmtccmd/com_if/tcpip_tcp_com_if.py rename to tmtccmd/com_if/tcp.py diff --git a/tmtccmd/com_if/tcpip_utilities.py b/tmtccmd/com_if/tcpip_utils.py similarity index 100% rename from tmtccmd/com_if/tcpip_utilities.py rename to tmtccmd/com_if/tcpip_utils.py diff --git a/tmtccmd/com_if/tcpip_udp_com_if.py b/tmtccmd/com_if/udp.py similarity index 100% rename from tmtccmd/com_if/tcpip_udp_com_if.py rename to tmtccmd/com_if/udp.py diff --git a/tmtccmd/com_if/com_if_utilities.py b/tmtccmd/com_if/utils.py similarity index 97% rename from tmtccmd/com_if/com_if_utilities.py rename to tmtccmd/com_if/utils.py index 620d6e04..93fc69e1 100644 --- a/tmtccmd/com_if/com_if_utilities.py +++ b/tmtccmd/com_if/utils.py @@ -2,7 +2,7 @@ from tmtccmd.logging import get_console_logger from tmtccmd.utility.conf_util import wrapped_prompt -from tmtccmd.utility.json_handler import check_json_file, JsonKeyNames +from tmtccmd.utility.json import check_json_file, JsonKeyNames from tmtccmd.config import ComIfDictT LOGGER = get_console_logger() diff --git a/tmtccmd/config/args.py b/tmtccmd/config/args.py index 69ad47df..6afbc957 100644 --- a/tmtccmd/config/args.py +++ b/tmtccmd/config/args.py @@ -115,7 +115,7 @@ def process_tmtccmd_args( :return: None """ from tmtccmd.config import CoreModeStrings, CoreComInterfaces, CoreModeList - from tmtccmd.com_if.com_if_utilities import determine_com_if + from tmtccmd.com_if.utils import determine_com_if group = ArgsGroup() if args.com_if is None or args.com_if == CoreComInterfaces.UNSPECIFIED.value: diff --git a/tmtccmd/config/com_if.py b/tmtccmd/config/com_if.py index dd9758b7..41ee5161 100644 --- a/tmtccmd/config/com_if.py +++ b/tmtccmd/config/com_if.py @@ -5,16 +5,16 @@ from tmtccmd.config.globals import CoreGlobalIds from tmtccmd.core.globals_manager import get_global, update_global from tmtccmd.com_if import ComInterface -from tmtccmd.com_if.serial_com_if import ( +from tmtccmd.com_if.serial import ( SerialConfigIds, SerialCommunicationType, SerialComIF, ) -from tmtccmd.com_if.serial_utilities import determine_com_port, determine_baud_rate -from tmtccmd.com_if.tcpip_utilities import TcpIpConfigIds, TcpIpType +from tmtccmd.com_if.ser_utils import determine_com_port, determine_baud_rate +from tmtccmd.com_if.tcpip_utils import TcpIpConfigIds, TcpIpType from tmtccmd.logging import get_console_logger -from tmtccmd.com_if.tcpip_udp_com_if import TcpIpUdpComIF -from tmtccmd.com_if.tcpip_tcp_com_if import TcpIpTcpComIF, TcpCommunicationType +from tmtccmd.com_if.udp import TcpIpUdpComIF +from tmtccmd.com_if.tcp import TcpIpTcpComIF, TcpCommunicationType LOGGER = get_console_logger() @@ -31,8 +31,8 @@ def create_communication_interface_default( :param space_packet_ids: Can be used by communication interfaces as a start marker (e.g. TCP) :return: """ - from tmtccmd.com_if.dummy_com_if import DummyComIF - from tmtccmd.com_if.qemu_com_if import QEMUComIF + from tmtccmd.com_if.dummy import DummyComIF + from tmtccmd.com_if.qemu import QEMUComIF try: if ( @@ -97,7 +97,7 @@ def default_tcpip_cfg_setup( :param space_packet_ids: Required if the TCP com interface needs to parse space packets :return: """ - from tmtccmd.com_if.tcpip_utilities import ( + from tmtccmd.com_if.tcpip_utils import ( determine_udp_send_address, determine_tcp_send_address, determine_recv_buffer_len, diff --git a/tmtccmd/tc/definitions.py b/tmtccmd/tc/definitions.py deleted file mode 100644 index e69de29b..00000000 diff --git a/tmtccmd/utility/json_handler.py b/tmtccmd/utility/json.py similarity index 100% rename from tmtccmd/utility/json_handler.py rename to tmtccmd/utility/json.py From 4125c1f3e52580a34483ffffe37ca003502f23b5 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Sun, 26 Jun 2022 02:10:47 +0200 Subject: [PATCH 104/221] example fixes --- examples/common.py | 8 +++----- examples/tmtccli.py | 3 +-- tmtccmd/com_if/ser_utils.py | 2 +- tmtccmd/com_if/tcpip_utils.py | 3 +-- tmtccmd/core/frontend.py | 12 ++++++++---- 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/examples/common.py b/examples/common.py index 3cd1a3b8..9f498f44 100644 --- a/examples/common.py +++ b/examples/common.py @@ -4,7 +4,7 @@ from spacepackets.ecss import PusTelemetry from tmtccmd import get_console_logger, TcHandlerBase, TmTcCfgHookBase, CcsdsTmtcBackend from tmtccmd.ccsds.handler import ApidTmHandlerBase -from tmtccmd.com_if.com_interface_base import CommunicationInterface +from tmtccmd.com_if import ComInterface from tmtccmd.config import CoreServiceList from tmtccmd.config.tmtc_defs import TmTcDefWrapper from tmtccmd.logging.pus import RawTmtcTimedLogWrapper @@ -30,9 +30,7 @@ class ExampleHookClass(TmTcCfgHookBase): def __init__(self, json_cfg_path: str): super().__init__(json_cfg_path=json_cfg_path) - def assign_communication_interface( - self, com_if_key: str - ) -> Optional[CommunicationInterface]: + def assign_communication_interface(self, com_if_key: str) -> Optional[ComInterface]: from tmtccmd.config.com_if import create_communication_interface_default LOGGER.info("Communication interface assignment function was called") @@ -86,7 +84,7 @@ def handle_tm(self, packet: bytes, _user_args: any): class TcHandler(TcHandlerBase): - def send_cb(self, tc_queue_entry: TcQueueEntryBase, com_if: CommunicationInterface): + def send_cb(self, tc_queue_entry: TcQueueEntryBase, com_if: ComInterface): cast_wrapper = PacketCastWrapper(tc_queue_entry) if tc_queue_entry.is_tc(): if tc_queue_entry.etype == TcQueueEntryType.PUS_TC: diff --git a/examples/tmtccli.py b/examples/tmtccli.py index 8dd518cf..96bf4937 100755 --- a/examples/tmtccli.py +++ b/examples/tmtccli.py @@ -7,7 +7,7 @@ from tmtccmd.ccsds.handler import CcsdsTmHandler from tmtccmd.config import default_json_path from tmtccmd.config.args import ArgParserWrapper -from tmtccmd.config import SetupArgs +from tmtccmd.config.setup import SetupArgs from tmtccmd.core import BackendController, Request from tmtccmd.logging import get_console_logger from tmtccmd.logging.pus import ( @@ -23,7 +23,6 @@ def main(): - print(f"-- example tmtc v{tmtccmd.__version__} --") tmtccmd.init_printout(False) hook_obj = ExampleHookClass(json_cfg_path=default_json_path()) parser_wrapper = ArgParserWrapper() diff --git a/tmtccmd/com_if/ser_utils.py b/tmtccmd/com_if/ser_utils.py index 0283d1c6..e4fcae71 100644 --- a/tmtccmd/com_if/ser_utils.py +++ b/tmtccmd/com_if/ser_utils.py @@ -4,7 +4,7 @@ import serial import serial.tools.list_ports from tmtccmd.logging import get_console_logger -from tmtccmd.utility.json_handler import ( +from tmtccmd.utility.json import ( check_json_file, JsonKeyNames, save_to_json_with_prompt, diff --git a/tmtccmd/com_if/tcpip_utils.py b/tmtccmd/com_if/tcpip_utils.py index db71608b..2e1c5858 100644 --- a/tmtccmd/com_if/tcpip_utils.py +++ b/tmtccmd/com_if/tcpip_utils.py @@ -4,9 +4,8 @@ import enum from tmtccmd.config import EthernetAddressT -from tmtccmd.utility.json_handler import check_json_file +from tmtccmd.utility.json import check_json_file, JsonKeyNames from tmtccmd.logging import get_console_logger -from tmtccmd.utility.json_handler import JsonKeyNames LOGGER = get_console_logger() diff --git a/tmtccmd/core/frontend.py b/tmtccmd/core/frontend.py index b5d3fca7..613db4b9 100644 --- a/tmtccmd/core/frontend.py +++ b/tmtccmd/core/frontend.py @@ -28,14 +28,18 @@ from PyQt5.QtGui import QPixmap, QIcon from PyQt5.QtCore import Qt, pyqtSignal, QObject, QThread, QRunnable +from tmtccmd.config.globals import CoreGlobalIds from tmtccmd.core.frontend_base import FrontendBase from tmtccmd.core.ccsds_backend import CcsdsTmtcBackend -from tmtccmd.config.cfg_hook import TmTcCfgHookBase -from tmtccmd.config.definitions import CoreGlobalIds, CoreModeList, CoreComInterfaces -from tmtccmd.config.cfg_hook import get_global_hook_obj +from tmtccmd.config import ( + TmTcCfgHookBase, + get_global_hook_obj, + CoreModeList, + CoreComInterfaces, +) from tmtccmd.logging import get_console_logger from tmtccmd.core.globals_manager import get_global, update_global -from tmtccmd.com_if.tcpip_utilities import TcpIpConfigIds +from tmtccmd.com_if.tcpip_utils import TcpIpConfigIds import tmtccmd.config as config_module from tmtccmd.tc import DefaultProcedureInfo From 3a145417f9920ad4074f5cbf00feb6494d7ae2aa Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Sun, 26 Jun 2022 14:32:26 +0200 Subject: [PATCH 105/221] fix for tests --- tests/test_com_if.py | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/tests/test_com_if.py b/tests/test_com_if.py index 7b573efe..07ce859d 100644 --- a/tests/test_com_if.py +++ b/tests/test_com_if.py @@ -2,7 +2,7 @@ from unittest import TestCase from unittest.mock import patch -from tmtccmd.com_if.com_if_utilities import determine_com_if +from tmtccmd.com_if.utils import determine_com_if class TestComIF(TestCase): @@ -10,9 +10,7 @@ def setUp(self) -> None: self.json_file = "test.json" def test_com_if_utils(self): - with patch( - "tmtccmd.com_if.com_if_utilities.wrapped_prompt", side_effect=["0", "yes"] - ): + with patch("tmtccmd.com_if.utils.wrapped_prompt", side_effect=["0", "yes"]): test_dict = {"test-com-if": ("Some more info", None)} com_if = determine_com_if(test_dict, self.json_file) self.assertEqual(com_if, "test-com-if") @@ -22,9 +20,7 @@ def test_com_if_utils(self): lines[1] = ' "com_if": "test-com-if"\n' lines[2] = "}" os.remove(self.json_file) - with patch( - "tmtccmd.com_if.com_if_utilities.wrapped_prompt", side_effect=["0", "no"] - ): + with patch("tmtccmd.com_if.utils.wrapped_prompt", side_effect=["0", "no"]): test_dict = {"test-com-if": ("Some more info", None)} com_if = determine_com_if(test_dict, self.json_file) self.assertEqual(com_if, "test-com-if") @@ -32,14 +28,14 @@ def test_com_if_utils(self): lines = file.readlines() lines[0] = "{}" with patch( - "tmtccmd.com_if.com_if_utilities.wrapped_prompt", + "tmtccmd.com_if.utils.wrapped_prompt", side_effect=["1", "0", "no"], ): test_dict = {"test-com-if": ("Some more info", None)} com_if = determine_com_if(test_dict, self.json_file) self.assertEqual(com_if, "test-com-if") with patch( - "tmtccmd.com_if.com_if_utilities.wrapped_prompt", + "tmtccmd.com_if.utils.wrapped_prompt", side_effect=["blub", "0", "no"], ): test_dict = {"test-com-if": ("Some more info", None)} From 7c9eed901256cbb7745a842bd41d44a125724831 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Sun, 26 Jun 2022 15:00:58 +0200 Subject: [PATCH 106/221] simplified com interfaces --- tmtccmd/com_if/tcp.py | 9 ++------- tmtccmd/com_if/udp.py | 19 ++++--------------- tmtccmd/config/com_if.py | 9 ++++----- 3 files changed, 10 insertions(+), 27 deletions(-) diff --git a/tmtccmd/com_if/tcp.py b/tmtccmd/com_if/tcp.py index 143d811d..a89a36d7 100644 --- a/tmtccmd/com_if/tcp.py +++ b/tmtccmd/com_if/tcp.py @@ -1,9 +1,4 @@ -""" -:file: tcpip_tcp_com_if.py -:date: 13.05.2021 -:brief: TCP communication interface -:author: R. Mueller -""" +"""TCP communication interface""" import socket import time import enum @@ -32,7 +27,7 @@ class TcpCommunicationType(enum.Enum): SPACE_PACKETS = 0 -class TcpIpTcpComIF(ComInterface): +class TcpComIF(ComInterface): """Communication interface for TCP communication.""" DEFAULT_LOCK_TIMEOUT = 0.4 diff --git a/tmtccmd/com_if/udp.py b/tmtccmd/com_if/udp.py index 92321b8d..24c5b28c 100644 --- a/tmtccmd/com_if/udp.py +++ b/tmtccmd/com_if/udp.py @@ -1,12 +1,12 @@ """UDP Communication Interface""" import select import socket -from typing import Union +from typing import Optional from tmtccmd.logging import get_console_logger from tmtccmd.com_if import ComInterface from tmtccmd.tm import TelemetryListT -from tmtccmd.config import EthernetAddressT, CoreModeList +from tmtccmd.config import EthernetAddressT LOGGER = get_console_logger() @@ -14,7 +14,7 @@ UDP_SEND_WIRETAPPING_ENABLED = False -class TcpIpUdpComIF(ComInterface): +class UdpComIF(ComInterface): """Communication interface for UDP communication.""" def __init__( @@ -24,8 +24,7 @@ def __init__( tc_timeout_factor: float, send_address: EthernetAddressT, max_recv_size: int, - recv_addr: Union[None, EthernetAddressT] = None, - init_mode: int = CoreModeList.LISTENER_MODE, + recv_addr: Optional[EthernetAddressT] = None, ): """Initialize a communication interface to send and receive UDP datagrams. :param tm_timeout: @@ -33,7 +32,6 @@ def __init__( :param send_address: :param max_recv_size: :param recv_addr: - :param tmtc_printer: Printer instance, can be passed optionally to allow packet debugging """ super().__init__(com_if_key=com_if_key) self.tm_timeout = tm_timeout @@ -42,7 +40,6 @@ def __init__( self.send_address = send_address self.recv_addr = recv_addr self.max_recv_size = max_recv_size - self.init_mode = init_mode def __del__(self): try: @@ -65,14 +62,6 @@ def open(self, args: any = None): self.udp_socket.bind(self.recv_addr) # Set non-blocking because we use select. self.udp_socket.setblocking(False) - if self.init_mode == CoreModeList.LISTENER_MODE: - # TODO: This is kind of an ugly hack.. find a better solution, maybe by passing - # a CB which does this.. actually, this looks like a userspace problem - from tmtccmd.pus.pus_17_test import pack_service17_ping_command - - # Send ping command immediately so the reception address is known for UDP - ping_cmd = pack_service17_ping_command(ssc=0) - self.send(ping_cmd.pack()) def close(self, args: any = None) -> None: if self.udp_socket is not None: diff --git a/tmtccmd/config/com_if.py b/tmtccmd/config/com_if.py index 41ee5161..770b47e0 100644 --- a/tmtccmd/config/com_if.py +++ b/tmtccmd/config/com_if.py @@ -13,8 +13,8 @@ from tmtccmd.com_if.ser_utils import determine_com_port, determine_baud_rate from tmtccmd.com_if.tcpip_utils import TcpIpConfigIds, TcpIpType from tmtccmd.logging import get_console_logger -from tmtccmd.com_if.udp import TcpIpUdpComIF -from tmtccmd.com_if.tcp import TcpIpTcpComIF, TcpCommunicationType +from tmtccmd.com_if.udp import UdpComIF +from tmtccmd.com_if.tcp import TcpComIF, TcpCommunicationType LOGGER = get_console_logger() @@ -172,17 +172,16 @@ def create_default_tcpip_interface( init_mode = get_global(CoreGlobalIds.MODE) space_packet_id = ethernet_cfg_dict[TcpIpConfigIds.SPACE_PACKET_ID] if com_if_key == CoreComInterfaces.TCPIP_UDP.value: - communication_interface = TcpIpUdpComIF( + communication_interface = UdpComIF( com_if_key=com_if_key, tm_timeout=get_global(CoreGlobalIds.TM_TIMEOUT), tc_timeout_factor=get_global(CoreGlobalIds.TC_SEND_TIMEOUT_FACTOR), send_address=send_addr, recv_addr=recv_addr, max_recv_size=max_recv_size, - init_mode=init_mode, ) elif com_if_key == CoreComInterfaces.TCPIP_TCP.value: - communication_interface = TcpIpTcpComIF( + communication_interface = TcpComIF( com_if_key=com_if_key, com_type=TcpCommunicationType.SPACE_PACKETS, space_packet_ids=space_packet_ids, From 6e184280f78567715b210833e055599a77025394 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Sun, 26 Jun 2022 15:22:38 +0200 Subject: [PATCH 107/221] another module simplification --- examples/tmtccli.py | 7 +- tmtccmd/__init__.py | 9 +- tmtccmd/com_if/tcp.py | 4 +- tmtccmd/com_if/tcpip_utils.py | 5 +- tmtccmd/com_if/udp.py | 13 ++- tmtccmd/config/__init__.py | 167 +++++++++++++++++++++++++++++++++- tmtccmd/config/args.py | 136 ++++----------------------- tmtccmd/config/com_if.py | 1 - tmtccmd/config/definitions.py | 0 tmtccmd/config/globals.py | 2 +- tmtccmd/config/setup.py | 37 -------- 11 files changed, 199 insertions(+), 182 deletions(-) delete mode 100644 tmtccmd/config/definitions.py delete mode 100644 tmtccmd/config/setup.py diff --git a/examples/tmtccli.py b/examples/tmtccli.py index 96bf4937..aaf1665f 100755 --- a/examples/tmtccli.py +++ b/examples/tmtccli.py @@ -6,8 +6,7 @@ import tmtccmd from tmtccmd.ccsds.handler import CcsdsTmHandler from tmtccmd.config import default_json_path -from tmtccmd.config.args import ArgParserWrapper -from tmtccmd.config.setup import SetupArgs +from tmtccmd.config import ArgParserWrapper, SetupWrapper from tmtccmd.core import BackendController, Request from tmtccmd.logging import get_console_logger from tmtccmd.logging.pus import ( @@ -27,8 +26,8 @@ def main(): hook_obj = ExampleHookClass(json_cfg_path=default_json_path()) parser_wrapper = ArgParserWrapper() parser_wrapper.parse(hook_obj, True) - setup_args = SetupArgs( - hook_obj=hook_obj, use_gui=False, apid=APID, args_wrapper=parser_wrapper + setup_args = SetupWrapper( + hook_obj=hook_obj, use_gui=False, apid=APID, setup_params=parser_wrapper.params ) # Create console logger helper and file loggers tmtc_logger = RegularTmtcLogWrapper() diff --git a/tmtccmd/__init__.py b/tmtccmd/__init__.py index 91406354..076e6a1b 100644 --- a/tmtccmd/__init__.py +++ b/tmtccmd/__init__.py @@ -5,8 +5,7 @@ from tmtccmd.core.ccsds_backend import CcsdsTmtcBackend from tmtccmd.tm.ccsds_tm_listener import CcsdsTmListener -from tmtccmd.config import TmTcCfgHookBase, backend_mode_conversion -from tmtccmd.config.setup import SetupArgs +from tmtccmd.config import TmTcCfgHookBase, backend_mode_conversion, SetupWrapper from tmtccmd.core.ccsds_backend import BackendBase from tmtccmd.core.frontend_base import FrontendBase from tmtccmd.tm import TmTypes, TmHandlerBase @@ -38,7 +37,7 @@ def version() -> str: return __version__ -def setup(setup_args: SetupArgs): +def setup(setup_args: SetupWrapper): """This function needs to be called first before running the TMTC commander core. The setup arguments encapsulate all required arguments for the TMTC commander. @@ -115,7 +114,7 @@ def init_printout(use_gui: bool): print(f"-- tmtccmd v{version()} CLI Mode --") -def __handle_cli_args_and_globals(setup_args: SetupArgs): +def __handle_cli_args_and_globals(setup_args: SetupWrapper): LOGGER.info("Setting up pre-globals..") set_default_globals_pre_args_parsing(setup_args.apid) LOGGER.info("Setting up post-globals..") @@ -158,7 +157,7 @@ def __start_tmtc_commander_qt_gui( def create_default_tmtc_backend( - setup_args: SetupArgs, tm_handler: TmHandlerBase, tc_handler: TcHandlerBase + setup_args: SetupWrapper, tm_handler: TmHandlerBase, tc_handler: TcHandlerBase ) -> BackendBase: """Creates a default TMTC backend instance which can be passed to the tmtccmd runner diff --git a/tmtccmd/com_if/tcp.py b/tmtccmd/com_if/tcp.py index a89a36d7..aa639722 100644 --- a/tmtccmd/com_if/tcp.py +++ b/tmtccmd/com_if/tcp.py @@ -12,7 +12,7 @@ from tmtccmd.logging import get_console_logger from tmtccmd.com_if import ComInterface from tmtccmd.tm import TelemetryListT -from tmtccmd.config import EthernetAddressT, CoreModeList +from tmtccmd.com_if.tcpip_utils import EthernetAddressT from tmtccmd.utility.conf_util import acquire_timeout LOGGER = get_console_logger() @@ -42,7 +42,6 @@ def __init__( target_address: EthernetAddressT, max_recv_size: int, max_packets_stored: int = 50, - init_mode: int = CoreModeList.LISTENER_MODE, ): """Initialize a communication interface to send and receive TMTC via TCP :param com_if_key: @@ -59,7 +58,6 @@ def __init__( self.target_address = target_address self.max_recv_size = max_recv_size self.max_packets_stored = max_packets_stored - self.init_mode = init_mode self.connected = False self.__tcp_socket: Optional[socket.socket] = None diff --git a/tmtccmd/com_if/tcpip_utils.py b/tmtccmd/com_if/tcpip_utils.py index 2e1c5858..db2bf9a1 100644 --- a/tmtccmd/com_if/tcpip_utils.py +++ b/tmtccmd/com_if/tcpip_utils.py @@ -2,8 +2,8 @@ import socket import struct import enum +from typing import Tuple -from tmtccmd.config import EthernetAddressT from tmtccmd.utility.json import check_json_file, JsonKeyNames from tmtccmd.logging import get_console_logger @@ -13,6 +13,9 @@ DEFAULT_MAX_RECV_SIZE = 1500 +EthernetAddressT = Tuple[str, int] + + class TcpIpType(enum.Enum): TCP = enum.auto() UDP = enum.auto() diff --git a/tmtccmd/com_if/udp.py b/tmtccmd/com_if/udp.py index 24c5b28c..ca6b732e 100644 --- a/tmtccmd/com_if/udp.py +++ b/tmtccmd/com_if/udp.py @@ -6,7 +6,7 @@ from tmtccmd.logging import get_console_logger from tmtccmd.com_if import ComInterface from tmtccmd.tm import TelemetryListT -from tmtccmd.config import EthernetAddressT +from tmtccmd.com_if.tcpip_utils import EthernetAddressT LOGGER = get_console_logger() @@ -83,15 +83,14 @@ def data_available(self, timeout: float = 0, parameters: any = 0) -> bool: return False def receive(self, poll_timeout: float = 0) -> TelemetryListT: + packet_list = [] if self.udp_socket is None: - return [] + return packet_list try: - ready = self.data_available(poll_timeout) - if ready: + while self.data_available(poll_timeout): data, sender_addr = self.udp_socket.recvfrom(self.max_recv_size) - packet_list = [bytearray(data)] - return packet_list - return [] + packet_list.append(bytearray(data)) + return packet_list except ConnectionResetError: LOGGER.warning("Connection reset exception occured!") return [] diff --git a/tmtccmd/config/__init__.py b/tmtccmd/config/__init__.py index 6e84af32..3fca0060 100644 --- a/tmtccmd/config/__init__.py +++ b/tmtccmd/config/__init__.py @@ -1,26 +1,34 @@ """Definitions for the TMTC commander core """ +import argparse import enum from abc import abstractmethod from typing import Tuple, Dict, Optional - +from tmtccmd.logging import get_console_logger from tmtccmd.com_if import ComInterface +from tmtccmd.config.args import ( + SetupParams, + create_default_args_parser, + add_default_tmtccmd_args, + parse_default_tmtccmd_input_arguments, +) +from tmtccmd.config.prompt import prompt_op_code, prompt_service from tmtccmd.config.tmtc_defs import TmTcDefWrapper from tmtccmd.core import ModeWrapper, TmMode, TcMode, BackendBase from tmtccmd.utility.obj_id import ObjectIdDictT from tmtccmd.utility.retval import RetvalDictT -def default_json_path() -> str: - return "tmtc_conf.json" - +LOGGER = get_console_logger() # Com Interface Types ComIfValueT = Tuple[str, any] ComIfDictT = Dict[str, ComIfValueT] -EthernetAddressT = Tuple[str, int] + +def default_json_path() -> str: + return "tmtc_conf.json" class CoreComInterfaces(enum.Enum): @@ -191,3 +199,152 @@ def get_global_hook_obj() -> Optional[TmTcCfgHookBase]: except AttributeError: logger.exception("Attribute error when trying to get global hook handle!") return None + + +def args_to_params( + args: argparse.Namespace, hook_obj: TmTcCfgHookBase, use_prompts: bool +) -> SetupParams: + """If some arguments are unspecified, they are set here with (variable) default values. + + :param args: Arguments from calling parse method + :param hook_obj: + :param use_prompts: Specify whether terminal prompts are allowed to retrieve unspecified + arguments. For something like a GUI, it might make sense to disable this + :return: None + """ + from tmtccmd.com_if.utils import determine_com_if + + group = SetupParams() + if args.com_if is None or args.com_if == CoreComInterfaces.UNSPECIFIED.value: + if use_prompts: + group.com_if = determine_com_if( + hook_obj.get_com_if_dict(), hook_obj.json_cfg_path + ) + else: + # TODO: Check whether COM IF is valid? + group.com_if = args.com_if + if args.mode is None: + group.mode = CoreModeStrings[CoreModeList.ONE_QUEUE_MODE] + else: + group.mode = args.mode + tmtc_defs = hook_obj.get_tmtc_definitions() + if tmtc_defs is None: + LOGGER.warning("Invalid Service to Op-Code dictionary detected") + if args.service is None: + group.service = "0" + if args.op_code is None: + group.op_code = "0" + else: + if args.service is None: + if args.mode == CoreModeStrings[CoreModeList.ONE_QUEUE_MODE]: + if use_prompts: + LOGGER.info( + "No service argument (-s) specified, prompting from user.." + ) + # Try to get the service list from the hook base and prompt service from user + group.service = prompt_service(tmtc_defs) + else: + group.service = args.service + if args.op_code is None: + current_service = group.service + if use_prompts: + group.op_code = prompt_op_code(tmtc_defs, current_service) + else: + group.op_code = args.op_code + if args.delay is None: + if group.mode == CoreModeStrings[CoreModeList.ONE_QUEUE_MODE]: + group.delay = 3.0 + else: + group.delay = 0.0 + else: + group.delay = args.delay + if args.listener is None: + args.listener = False + else: + group.listener = args.listener + return group + + +class ArgParserWrapper: + def __init__( + self, + parser: Optional[argparse.ArgumentParser] = None, + descript_txt: Optional[str] = None, + ): + if parser is None: + self.args_parser = create_default_args_parser(descript_txt) + add_default_tmtccmd_args(self.args_parser) + else: + self.args_parser = parser + self.print_known_args = False + self.print_unknown_args = False + self.unknown_args = [""] + self._params: SetupParams = SetupParams() + self.args_raw = None + + def add_default_tmtccmd_args(self): + add_default_tmtccmd_args(self.args_parser) + + def parse(self, hook_obj: TmTcCfgHookBase, use_prompts: bool): + self.args_raw, self.unknown_args = parse_default_tmtccmd_input_arguments( + self.args_parser, + print_known_args=self.print_known_args, + print_unknown_args=self.print_unknown_args, + ) + self._params = args_to_params(self.args_raw, hook_obj, use_prompts) + + @property + def params(self): + return self._params + + @property + def delay(self): + return self.params.tc_properties.delay + + @property + def service(self): + return self.params.def_proc_args.service + + @property + def op_code(self): + return self.params.def_proc_args.op_code + + @property + def mode(self): + return self.params.backend_params.mode + + @property + def com_if(self): + return self.params.backend_params.com_if + + +class SetupWrapper: + """This class encapsulates various important setup parameters required by tmtccmd components""" + + def __init__( + self, + hook_obj: TmTcCfgHookBase, + use_gui: bool, + apid: int, + setup_params: SetupParams, + json_cfg_path: Optional[str] = None, + reduced_printout: bool = False, + use_ansi_colors: bool = True, + ): + """ + :param hook_obj: User hook object. Needs to be implemented by the user + :param setup_params: Optional helper wrapper which contains CLI arguments. + :param use_gui: Specify whether a GUI is used. + :param reduced_printout: + :param use_ansi_colors: + """ + self.hook_obj = hook_obj + self.use_gui = use_gui + self.apid = apid + self.json_cfg_path = json_cfg_path + self.reduced_printout = reduced_printout + self.ansi_colors = use_ansi_colors + self.args_wrapper = setup_params + self.json_cfg_path = json_cfg_path + if json_cfg_path is None: + self.json_cfg_path = default_json_path() diff --git a/tmtccmd/config/args.py b/tmtccmd/config/args.py index 6afbc957..66687465 100644 --- a/tmtccmd/config/args.py +++ b/tmtccmd/config/args.py @@ -5,8 +5,6 @@ import sys from typing import Optional, List from dataclasses import dataclass - -from tmtccmd import TmTcCfgHookBase from tmtccmd.config.prompt import prompt_service, prompt_op_code from tmtccmd.logging import get_console_logger @@ -35,63 +33,30 @@ def create_default_args_parser( @dataclass -class ArgsGroup: - service: Optional[str] = None - op_code: Optional[str] = None - mode: str = "" - com_if: str = "" - delay: float = 0.0 - listener: bool = False - interactive: bool = False - +class DefProcedureParams: + service: str + op_code: str -class ArgParserWrapper: - def __init__( - self, - parser: Optional[argparse.ArgumentParser] = None, - descript_txt: Optional[str] = None, - ): - if parser is None: - self.args_parser = create_default_args_parser(descript_txt) - add_default_tmtccmd_args(self.args_parser) - else: - self.args_parser = parser - self.print_known_args = False - self.print_unknown_args = False - self.unknown_args = [""] - self.args_converted: Optional[ArgsGroup] = None - self.args_raw = None - - def add_default_tmtccmd_args(self): - add_default_tmtccmd_args(self.args_parser) - - def parse(self, hook_obj: TmTcCfgHookBase, use_prompts: bool): - self.args_raw, self.unknown_args = parse_default_tmtccmd_input_arguments( - self.args_parser, - print_known_args=self.print_known_args, - print_unknown_args=self.print_unknown_args, - ) - self.args_converted = process_tmtccmd_args(self.args_raw, hook_obj, use_prompts) - @property - def delay(self): - return self.args_converted.delay +@dataclass +class TcParams: + delay: float = 0.0 + apid: int = 0 - @property - def service(self): - return self.args_converted.service - @property - def op_code(self): - return self.args_converted.op_code +@dataclass +class BackendParams: + mode: str = "" + com_if: str = "" + listener: bool = False + interactive: bool = False - @property - def mode(self): - return self.args_converted.mode - @property - def com_if(self): - return self.args_converted.com_if +@dataclass +class SetupParams: + def_proc_args: Optional[DefProcedureParams] = None + tc_properties: TcParams = TcParams() + backend_params: BackendParams = BackendParams() def add_default_tmtccmd_args(parser: argparse.ArgumentParser): @@ -103,71 +68,6 @@ def add_default_tmtccmd_args(parser: argparse.ArgumentParser): add_ethernet_arguments(parser) -def process_tmtccmd_args( - args: argparse.Namespace, hook_obj: TmTcCfgHookBase, use_prompts: bool -) -> ArgsGroup: - """If some arguments are unspecified, they are set here with (variable) default values. - - :param args: Arguments from calling parse method - :param hook_obj: - :param use_prompts: Specify whether terminal prompts are allowed to retrieve unspecified - arguments. For something like a GUI, it might make sense to disable this - :return: None - """ - from tmtccmd.config import CoreModeStrings, CoreComInterfaces, CoreModeList - from tmtccmd.com_if.utils import determine_com_if - - group = ArgsGroup() - if args.com_if is None or args.com_if == CoreComInterfaces.UNSPECIFIED.value: - if use_prompts: - group.com_if = determine_com_if( - hook_obj.get_com_if_dict(), hook_obj.json_cfg_path - ) - else: - # TODO: Check whether COM IF is valid? - group.com_if = args.com_if - if args.mode is None: - group.mode = CoreModeStrings[CoreModeList.ONE_QUEUE_MODE] - else: - group.mode = args.mode - tmtc_defs = hook_obj.get_tmtc_definitions() - if tmtc_defs is None: - LOGGER.warning("Invalid Service to Op-Code dictionary detected") - if args.service is None: - group.service = "0" - if args.op_code is None: - group.op_code = "0" - else: - if args.service is None: - if args.mode == CoreModeStrings[CoreModeList.ONE_QUEUE_MODE]: - if use_prompts: - LOGGER.info( - "No service argument (-s) specified, prompting from user.." - ) - # Try to get the service list from the hook base and prompt service from user - group.service = prompt_service(tmtc_defs) - else: - group.service = args.service - if args.op_code is None: - current_service = group.service - if use_prompts: - group.op_code = prompt_op_code(tmtc_defs, current_service) - else: - group.op_code = args.op_code - if args.delay is None: - if group.mode == CoreModeStrings[CoreModeList.ONE_QUEUE_MODE]: - group.delay = 3.0 - else: - group.delay = 0.0 - else: - group.delay = args.delay - if args.listener is None: - args.listener = False - else: - group.listener = args.listener - return group - - def parse_default_tmtccmd_input_arguments( parser: argparse.ArgumentParser, print_known_args: bool = False, diff --git a/tmtccmd/config/com_if.py b/tmtccmd/config/com_if.py index 770b47e0..1a06b9af 100644 --- a/tmtccmd/config/com_if.py +++ b/tmtccmd/config/com_if.py @@ -188,7 +188,6 @@ def create_default_tcpip_interface( tm_polling_freqency=0.5, target_address=send_addr, max_recv_size=max_recv_size, - init_mode=init_mode, ) return communication_interface diff --git a/tmtccmd/config/definitions.py b/tmtccmd/config/definitions.py deleted file mode 100644 index e69de29b..00000000 diff --git a/tmtccmd/config/globals.py b/tmtccmd/config/globals.py index 5dfa4caa..cc84dc9a 100644 --- a/tmtccmd/config/globals.py +++ b/tmtccmd/config/globals.py @@ -144,7 +144,7 @@ def handle_mode_arg( def handle_com_if_arg( args, json_cfg_path: str, custom_com_if_dict: Dict[str, any] = None ): - from tmtccmd.com_if.com_if_utilities import determine_com_if + from tmtccmd.com_if.utils import determine_com_if all_com_ifs = CORE_COM_IF_DICT if custom_com_if_dict is not None: diff --git a/tmtccmd/config/setup.py b/tmtccmd/config/setup.py deleted file mode 100644 index 820059cd..00000000 --- a/tmtccmd/config/setup.py +++ /dev/null @@ -1,37 +0,0 @@ -from typing import Optional - -from tmtccmd import TmTcCfgHookBase -from tmtccmd.config import default_json_path -from tmtccmd.config.args import ArgParserWrapper - - -class SetupArgs: - """This class encapsulates various important setup parameters required by tmtccmd components""" - - def __init__( - self, - hook_obj: TmTcCfgHookBase, - use_gui: bool, - apid: int, - args_wrapper: Optional[ArgParserWrapper], - json_cfg_path: Optional[str] = None, - reduced_printout: bool = False, - use_ansi_colors: bool = True, - ): - """ - :param hook_obj: User hook object. Needs to be implemented by the user - :param args_wrapper: Optional helper wrapper which contains CLI arguments. - :param use_gui: Specify whether a GUI is used. - :param reduced_printout: - :param use_ansi_colors: - """ - self.hook_obj = hook_obj - self.use_gui = use_gui - self.apid = apid - self.json_cfg_path = json_cfg_path - self.reduced_printout = reduced_printout - self.ansi_colors = use_ansi_colors - self.args_wrapper = args_wrapper - self.json_cfg_path = json_cfg_path - if json_cfg_path is None: - self.json_cfg_path = default_json_path() From 11c6c9ba9e3fb8bacb09a209dca6689b1d7f5197 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Sun, 26 Jun 2022 15:25:39 +0200 Subject: [PATCH 108/221] some more refactoring --- examples/common.py | 2 +- tests/hook_obj_mock.py | 2 +- tmtccmd/config/__init__.py | 10 +++++----- tmtccmd/config/args.py | 4 +--- tmtccmd/config/com_if.py | 18 ++++++++---------- tmtccmd/config/globals.py | 2 +- tmtccmd/config/prompt.py | 2 +- tmtccmd/config/{tmtc_defs.py => tmtc.py} | 0 8 files changed, 18 insertions(+), 22 deletions(-) rename tmtccmd/config/{tmtc_defs.py => tmtc.py} (100%) diff --git a/examples/common.py b/examples/common.py index 9f498f44..64763c5f 100644 --- a/examples/common.py +++ b/examples/common.py @@ -6,7 +6,7 @@ from tmtccmd.ccsds.handler import ApidTmHandlerBase from tmtccmd.com_if import ComInterface from tmtccmd.config import CoreServiceList -from tmtccmd.config.tmtc_defs import TmTcDefWrapper +from tmtccmd.config.tmtc import TmTcDefWrapper from tmtccmd.logging.pus import RawTmtcTimedLogWrapper from tmtccmd.tc import ( TcProcedureBase, diff --git a/tests/hook_obj_mock.py b/tests/hook_obj_mock.py index 9c71a3f0..ed80df13 100644 --- a/tests/hook_obj_mock.py +++ b/tests/hook_obj_mock.py @@ -5,7 +5,7 @@ from tmtccmd.config.com_if import CommunicationInterface from tmtccmd.config.definitions import CoreModeList -from tmtccmd.config.tmtc_defs import TmTcDefWrapper +from tmtccmd.config.tmtc import TmTcDefWrapper from tmtccmd.core.ccsds_backend import CcsdsTmtcBackend from tmtccmd.config.cfg_hook import TmTcCfgHookBase from tmtccmd.logging import get_console_logger diff --git a/tmtccmd/config/__init__.py b/tmtccmd/config/__init__.py index 3fca0060..cac9c8ea 100644 --- a/tmtccmd/config/__init__.py +++ b/tmtccmd/config/__init__.py @@ -14,7 +14,7 @@ parse_default_tmtccmd_input_arguments, ) from tmtccmd.config.prompt import prompt_op_code, prompt_service -from tmtccmd.config.tmtc_defs import TmTcDefWrapper +from tmtccmd.config.tmtc import TmTcDefWrapper from tmtccmd.core import ModeWrapper, TmMode, TcMode, BackendBase from tmtccmd.utility.obj_id import ObjectIdDictT from tmtccmd.utility.retval import RetvalDictT @@ -34,8 +34,8 @@ def default_json_path() -> str: class CoreComInterfaces(enum.Enum): DUMMY = "dummy" SERIAL_DLE = "ser_dle" - TCPIP_UDP = "udp" - TCPIP_TCP = "tcp" + UDP = "udp" + TCP = "tcp" SERIAL_FIXED_FRAME = "ser_fixed" SERIAL_QEMU = "ser_qemu" UNSPECIFIED = "unspec" @@ -44,8 +44,8 @@ class CoreComInterfaces(enum.Enum): CORE_COM_IF_DICT = { CoreComInterfaces.DUMMY.value: "Dummy Interface", CoreComInterfaces.SERIAL_DLE.value: "Serial Interace with DLE encoding", - CoreComInterfaces.TCPIP_UDP.value: "TCP/IP with UDP datagrams", - CoreComInterfaces.TCPIP_TCP.value: "TCP/IP with TCP", + CoreComInterfaces.UDP.value: "TCP/IP with UDP datagrams", + CoreComInterfaces.TCP.value: "TCP/IP with TCP", CoreComInterfaces.SERIAL_FIXED_FRAME.value: "Serial Interface with fixed size frames", CoreComInterfaces.SERIAL_QEMU.value: "Serial Interface using QEMU", CoreComInterfaces.UNSPECIFIED.value: "Unspecified", diff --git a/tmtccmd/config/args.py b/tmtccmd/config/args.py index 66687465..a843e58d 100644 --- a/tmtccmd/config/args.py +++ b/tmtccmd/config/args.py @@ -199,9 +199,7 @@ def add_default_com_if_arguments(arg_parser: argparse.ArgumentParser): "will try to extract it from the JSON or prompt it from the user\n" ) dummy_line = f"{CORE_COM_IF_DICT[CoreComInterfaces.DUMMY.value]}: Dummy Interface\n" - udp_line = ( - f"{CORE_COM_IF_DICT[CoreComInterfaces.TCPIP_UDP.value]}: " f"UDP client\n" - ) + udp_line = f"{CORE_COM_IF_DICT[CoreComInterfaces.UDP.value]}: " f"UDP client\n" ser_dle_line = ( f"{CORE_COM_IF_DICT[CoreComInterfaces.SERIAL_DLE.value]}: " f"Serial with DLE transport layer\n" diff --git a/tmtccmd/config/com_if.py b/tmtccmd/config/com_if.py index 1a06b9af..8c78fb21 100644 --- a/tmtccmd/config/com_if.py +++ b/tmtccmd/config/com_if.py @@ -36,8 +36,8 @@ def create_communication_interface_default( try: if ( - com_if_key == CoreComInterfaces.TCPIP_UDP.value - or com_if_key == CoreComInterfaces.TCPIP_TCP.value + com_if_key == CoreComInterfaces.UDP.value + or com_if_key == CoreComInterfaces.TCP.value ): communication_interface = create_default_tcpip_interface( com_if_key=com_if_key, @@ -76,9 +76,9 @@ def create_communication_interface_default( return communication_interface except ConnectionRefusedError: LOGGER.exception("TCP/IP connection refused") - if com_if_key == CoreComInterfaces.TCPIP_UDP.value: + if com_if_key == CoreComInterfaces.UDP.value: LOGGER.warning("Make sure that a UDP server is running") - if com_if_key == CoreComInterfaces.TCPIP_TCP.value: + if com_if_key == CoreComInterfaces.TCP.value: LOGGER.warning("Make sure that a TCP server is running") sys.exit(1) except (IOError, OSError): @@ -157,9 +157,9 @@ def create_default_tcpip_interface( :return: """ communication_interface = None - if com_if_key == CoreComInterfaces.TCPIP_UDP.value: + if com_if_key == CoreComInterfaces.UDP.value: default_tcpip_cfg_setup(tcpip_type=TcpIpType.UDP, json_cfg_path=json_cfg_path) - elif com_if_key == CoreComInterfaces.TCPIP_TCP.value: + elif com_if_key == CoreComInterfaces.TCP.value: default_tcpip_cfg_setup( tcpip_type=TcpIpType.TCP, json_cfg_path=json_cfg_path, @@ -169,9 +169,7 @@ def create_default_tcpip_interface( send_addr = ethernet_cfg_dict[TcpIpConfigIds.SEND_ADDRESS] recv_addr = ethernet_cfg_dict[TcpIpConfigIds.RECV_ADDRESS] max_recv_size = ethernet_cfg_dict[TcpIpConfigIds.RECV_MAX_SIZE] - init_mode = get_global(CoreGlobalIds.MODE) - space_packet_id = ethernet_cfg_dict[TcpIpConfigIds.SPACE_PACKET_ID] - if com_if_key == CoreComInterfaces.TCPIP_UDP.value: + if com_if_key == CoreComInterfaces.UDP.value: communication_interface = UdpComIF( com_if_key=com_if_key, tm_timeout=get_global(CoreGlobalIds.TM_TIMEOUT), @@ -180,7 +178,7 @@ def create_default_tcpip_interface( recv_addr=recv_addr, max_recv_size=max_recv_size, ) - elif com_if_key == CoreComInterfaces.TCPIP_TCP.value: + elif com_if_key == CoreComInterfaces.TCP.value: communication_interface = TcpComIF( com_if_key=com_if_key, com_type=TcpCommunicationType.SPACE_PACKETS, diff --git a/tmtccmd/config/globals.py b/tmtccmd/config/globals.py index cc84dc9a..1c9c910e 100644 --- a/tmtccmd/config/globals.py +++ b/tmtccmd/config/globals.py @@ -21,7 +21,7 @@ CoreComInterfaces, ComIfDictT, ) -from tmtccmd.config.tmtc_defs import TmTcDefWrapper, OpCodeEntry +from tmtccmd.config.tmtc import TmTcDefWrapper, OpCodeEntry LOGGER = get_console_logger() diff --git a/tmtccmd/config/prompt.py b/tmtccmd/config/prompt.py index 86785f4c..f8aaa45d 100644 --- a/tmtccmd/config/prompt.py +++ b/tmtccmd/config/prompt.py @@ -1,7 +1,7 @@ from prompt_toolkit.completion import WordCompleter from prompt_toolkit.shortcuts import CompleteStyle import prompt_toolkit -from tmtccmd.config.tmtc_defs import OpCodeEntry, TmTcDefWrapper +from tmtccmd.config.tmtc import OpCodeEntry, TmTcDefWrapper from tmtccmd.logging import get_console_logger LOGGER = get_console_logger() diff --git a/tmtccmd/config/tmtc_defs.py b/tmtccmd/config/tmtc.py similarity index 100% rename from tmtccmd/config/tmtc_defs.py rename to tmtccmd/config/tmtc.py From 703311d7166be6d3286ebc2599b9a53a90d4b656 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Sun, 26 Jun 2022 17:22:31 +0200 Subject: [PATCH 109/221] simplified a few more components --- README.md | 15 ++-- docs/gettingstarted.rst | 3 + examples/{common.py => tmtcc.py} | 98 +++++++++++++++++---- examples/tmtccli.py | 70 --------------- examples/tmtcgui.py | 35 -------- tests/test_printer.py | 4 +- tests/test_pus.py | 12 +-- tmtccmd/__init__.py | 25 +++--- tmtccmd/com_if/dummy.py | 10 +-- tmtccmd/config/__init__.py | 147 ++++++++++++++++--------------- tmtccmd/config/args.py | 48 +++++++++- tmtccmd/core/ccsds_backend.py | 6 ++ tmtccmd/core/frontend.py | 27 +++--- tmtccmd/tm/pus_17_test.py | 10 +-- tmtccmd/tm/pus_1_verification.py | 14 ++- 15 files changed, 270 insertions(+), 254 deletions(-) rename examples/{common.py => tmtcc.py} (54%) mode change 100644 => 100755 delete mode 100755 examples/tmtccli.py delete mode 100755 examples/tmtcgui.py diff --git a/README.md b/README.md index 84a23be4..e8ae12e6 100644 --- a/README.md +++ b/README.md @@ -30,19 +30,20 @@ helpers. Some of those components are tailored towards usage with the ## Examples -The `example` folder contains a simple example using a dummy communication interface. -It can be run like this on Linux +The `examples` folder contains a simple example using a dummy communication interface. +It sends a PUS ping telecommand and then reads the ping reply and the verification +replies back from the dummy interface. It can be run like this on Linux: ```sh -cd example -./tmtccli.py +cd examples +./tmtcc.py ``` -or on Windows +or on Windows: ```sh -cd example -py tmtccli.py +cd examples +py tmtcc.py ``` The [EIVE](https://egit.irs.uni-stuttgart.de/eive/eive-tmtc) and diff --git a/docs/gettingstarted.rst b/docs/gettingstarted.rst index 8d4084aa..1f3eeb62 100644 --- a/docs/gettingstarted.rst +++ b/docs/gettingstarted.rst @@ -2,6 +2,9 @@ Getting Started =============== +Example Project +================ + The example provided in the ``example`` folder of the Python package is a good place to get started. You can run the ``tmtccli.py`` file to test the CLI interface or the ``tmtcgui.py`` file to test the GUI interface. The only working communication interface for the example applications is diff --git a/examples/common.py b/examples/tmtcc.py old mode 100644 new mode 100755 similarity index 54% rename from examples/common.py rename to examples/tmtcc.py index 64763c5f..1ccd17a7 --- a/examples/common.py +++ b/examples/tmtcc.py @@ -1,29 +1,48 @@ +#!/usr/bin/env python3 +"""Example application for the TMTC Commander""" +import sys +import time from typing import Optional -from pus_tc.service_17_test import pack_service17_test_into -from spacepackets.ecss import PusTelemetry -from tmtccmd import get_console_logger, TcHandlerBase, TmTcCfgHookBase, CcsdsTmtcBackend -from tmtccmd.ccsds.handler import ApidTmHandlerBase +import tmtccmd +from spacepackets.ecss import PusTelemetry, PusTelecommand + +from tmtccmd import CcsdsTmtcBackend, TcHandlerBase +from tmtccmd.ccsds.handler import CcsdsTmHandler, ApidTmHandlerBase from tmtccmd.com_if import ComInterface -from tmtccmd.config import CoreServiceList -from tmtccmd.config.tmtc import TmTcDefWrapper -from tmtccmd.logging.pus import RawTmtcTimedLogWrapper +from tmtccmd.config import ( + default_json_path, + SetupParams, + TmTcCfgHookBase, + TmTcDefWrapper, + CoreServiceList, +) +from tmtccmd.config import ArgParserWrapper, SetupWrapper +from tmtccmd.core import BackendController, Request +from tmtccmd.logging import get_console_logger +from tmtccmd.logging.pus import ( + RegularTmtcLogWrapper, + RawTmtcTimedLogWrapper, + TimedLogWhen, +) from tmtccmd.tc import ( - TcProcedureBase, TcQueueEntryBase, PacketCastWrapper, TcQueueEntryType, + TcProcedureBase, ProcedureCastWrapper, TcProcedureType, ) from tmtccmd.tc.handler import FeedWrapper from tmtccmd.tm import Service5Tm -from tmtccmd.tm.pus_17_test import Service17TMExtended +from tmtccmd.tm.pus_17_test import Service17TmExtended +from tmtccmd.tm.pus_1_verification import Service1TmExtended from tmtccmd.utility.obj_id import ObjectIdDictT + from tmtccmd.utility.tmtc_printer import FsfwTmTcPrinter -APID = 0xEF LOGGER = get_console_logger() +EXAMPLE_APID = 0xEF class ExampleHookClass(TmTcCfgHookBase): @@ -56,7 +75,7 @@ def get_object_ids(self) -> ObjectIdDictT: class PusHandler(ApidTmHandlerBase): def __init__(self, printer: FsfwTmTcPrinter, raw_logger: RawTmtcTimedLogWrapper): - super().__init__(APID, None) + super().__init__(EXAMPLE_APID, None) self.printer = printer self.raw_logger = raw_logger @@ -69,11 +88,11 @@ def handle_tm(self, packet: bytes, _user_args: any): return service = tm_packet.service if service == 1: - tm_packet = Service17TMExtended.unpack(packet) + tm_packet = Service1TmExtended.unpack(packet) if service == 5: tm_packet = Service5Tm.unpack(packet) if service == 17: - tm_packet = Service17TMExtended.unpack(packet) + tm_packet = Service17TmExtended.unpack(packet) if tm_packet is None: LOGGER.info( f"The service {service} is not implemented in Telemetry Factory" @@ -102,6 +121,55 @@ def feed_cb(self, info: TcProcedureBase, wrapper: FeedWrapper): info = proc_caster.to_def_procedure() queue_helper = wrapper.queue_helper service = info.service - op_code = info.op_code if service == CoreServiceList.SERVICE_17.value: - return pack_service17_test_into(queue_helper, op_code=op_code) + return queue_helper.add_pus_tc(PusTelecommand(service=17, subservice=1)) + + +def main(): + tmtccmd.init_printout(False) + hook_obj = ExampleHookClass(json_cfg_path=default_json_path()) + parser_wrapper = ArgParserWrapper(hook_obj) + parser_wrapper.parse() + params = SetupParams() + parser_wrapper.set_params(params) + params.apid = EXAMPLE_APID + setup_args = SetupWrapper(hook_obj=hook_obj, setup_params=params) + # Create console logger helper and file loggers + tmtc_logger = RegularTmtcLogWrapper() + printer = FsfwTmTcPrinter(tmtc_logger.logger) + raw_logger = RawTmtcTimedLogWrapper(when=TimedLogWhen.PER_HOUR, interval=1) + + # Create primary TM handler and add it to the CCSDS Packet Handler + tm_handler = PusHandler(printer, raw_logger) + ccsds_handler = CcsdsTmHandler(unknown_handler=None) + ccsds_handler.add_apid_handler(tm_handler) + + # Create TC handler + tc_handler = TcHandler() + tmtccmd.setup(setup_args=setup_args) + + tmtc_backend = tmtccmd.create_default_tmtc_backend( + setup_wrapper=setup_args, tm_handler=ccsds_handler, tc_handler=tc_handler + ) + tmtccmd.start(tmtc_backend=tmtc_backend) + ctrl = BackendController() + try: + while True: + state = tmtc_backend.periodic_op(ctrl) + if state.request == Request.TERMINATION_NO_ERROR: + sys.exit(0) + elif state.request == Request.DELAY_IDLE: + LOGGER.info("TMTC Client in IDLE mode") + time.sleep(3.0) + elif state.request == Request.DELAY_LISTENER: + time.sleep(0.8) + elif state.request == Request.DELAY_CUSTOM: + time.sleep(state.next_delay) + elif state.request == Request.CALL_NEXT: + pass + except KeyboardInterrupt: + sys.exit(0) + + +if __name__ == "__main__": + main() diff --git a/examples/tmtccli.py b/examples/tmtccli.py deleted file mode 100755 index aaf1665f..00000000 --- a/examples/tmtccli.py +++ /dev/null @@ -1,70 +0,0 @@ -#!/usr/bin/env python3 -"""Example application for the TMTC Commander""" -import sys -import time - -import tmtccmd -from tmtccmd.ccsds.handler import CcsdsTmHandler -from tmtccmd.config import default_json_path -from tmtccmd.config import ArgParserWrapper, SetupWrapper -from tmtccmd.core import BackendController, Request -from tmtccmd.logging import get_console_logger -from tmtccmd.logging.pus import ( - RegularTmtcLogWrapper, - RawTmtcTimedLogWrapper, - TimedLogWhen, -) - -from common import TcHandler, PusHandler, ExampleHookClass, APID -from tmtccmd.utility.tmtc_printer import FsfwTmTcPrinter - -LOGGER = get_console_logger() - - -def main(): - tmtccmd.init_printout(False) - hook_obj = ExampleHookClass(json_cfg_path=default_json_path()) - parser_wrapper = ArgParserWrapper() - parser_wrapper.parse(hook_obj, True) - setup_args = SetupWrapper( - hook_obj=hook_obj, use_gui=False, apid=APID, setup_params=parser_wrapper.params - ) - # Create console logger helper and file loggers - tmtc_logger = RegularTmtcLogWrapper() - printer = FsfwTmTcPrinter(tmtc_logger.logger) - raw_logger = RawTmtcTimedLogWrapper(when=TimedLogWhen.PER_HOUR, interval=1) - - # Create primary TM handler and add it to the CCSDS Packet Handler - tm_handler = PusHandler(printer, raw_logger) - ccsds_handler = CcsdsTmHandler(unknown_handler=None) - ccsds_handler.add_apid_handler(tm_handler) - - # Create TC handler - tc_handler = TcHandler() - tmtccmd.setup(setup_args=setup_args) - - tmtc_backend = tmtccmd.create_default_tmtc_backend( - setup_args=setup_args, tm_handler=ccsds_handler, tc_handler=tc_handler - ) - tmtccmd.start(tmtc_backend=tmtc_backend) - ctrl = BackendController() - try: - while True: - state = tmtc_backend.periodic_op(ctrl) - if state.request == Request.TERMINATION_NO_ERROR: - sys.exit(0) - elif state.request == Request.DELAY_IDLE: - LOGGER.info("TMTC Client in IDLE mode") - time.sleep(3.0) - elif state.request == Request.DELAY_LISTENER: - time.sleep(0.8) - elif state.request == Request.DELAY_CUSTOM: - time.sleep(state.next_delay) - elif state.request == Request.CALL_NEXT: - pass - except KeyboardInterrupt: - sys.exit(0) - - -if __name__ == "__main__": - main() diff --git a/examples/tmtcgui.py b/examples/tmtcgui.py deleted file mode 100755 index 11b67c21..00000000 --- a/examples/tmtcgui.py +++ /dev/null @@ -1,35 +0,0 @@ -#!/usr/bin/env python3 -"""Example application for the TMTC Commander""" -import tmtccmd.runner as runner -from tmtccmd.ccsds.handler import CcsdsTmHandler, ApidTmHandlerBase -from tmtccmd.config import SetupArgs, default_json_path -from tmtccmd.logging import get_console_logger - -from config.hook_implementation import ExampleHookClass -from config.definitions import APID, pre_send_cb -from config.tm_handler import default_ccsds_packet_handler - -LOGGER = get_console_logger() - - -def main(): - runner.init_printout(True) - hook_obj = ExampleHookClass(json_cfg_path=default_json_path()) - setup_args = SetupArgs(hook_obj=hook_obj, use_gui=True, apid=APID, cli_args=None) - apid_handler = ApidTmHandlerBase( - cb=default_ccsds_packet_handler, max_queue_len=50, user_args=None - ) - ccsds_handler = CcsdsTmHandler() - ccsds_handler.add_apid_handler(apid=APID, handler=apid_handler) - runner.setup(setup_args=setup_args) - runner.add_ccsds_handler(ccsds_handler) - tmtc_backend = runner.create_default_tmtc_backend( - setup_args=setup_args, - tm_handler=ccsds_handler, - ) - tmtc_backend.usr_send_wrapper = (pre_send_cb, None) - runner.start(tmtc_backend=tmtc_backend) - - -if __name__ == "__main__": - main() diff --git a/tests/test_printer.py b/tests/test_printer.py index 45f2e685..79d16f7d 100644 --- a/tests/test_printer.py +++ b/tests/test_printer.py @@ -5,7 +5,7 @@ from spacepackets.ccsds.time import CdsShortTimestamp from spacepackets.ecss.pus_1_verification import RequestId -from tmtccmd.tm.pus_1_verification import Service1TMExtended +from tmtccmd.tm.pus_1_verification import Service1TmExtended from tmtccmd.pus.pus_17_test import pack_service_17_ping_command from tmtccmd.utility.tmtc_printer import FsfwTmTcPrinter from tmtccmd.logging import get_console_logger, LOG_DIR @@ -37,7 +37,7 @@ def setUp(self): def test_pus_loggers(self): pus_tc = pack_service_17_ping_command(ssc=0) self.raw_tmtc_log.log_tc(pus_tc) - pus_tm = Service1TMExtended( + pus_tm = Service1TmExtended( subservice=1, time=CdsShortTimestamp.init_from_current_time(), tc_request_id=RequestId(pus_tc.packet_id, pus_tc.packet_seq_ctrl), diff --git a/tests/test_pus.py b/tests/test_pus.py index 7b42c4c3..074c0cd6 100755 --- a/tests/test_pus.py +++ b/tests/test_pus.py @@ -6,12 +6,12 @@ from spacepackets.ecss.conf import get_pus_tm_version, PusVersion, set_default_tm_apid from spacepackets.util import PrintFormats -from tmtccmd.tm.pus_17_test import Service17TMExtended +from tmtccmd.tm.pus_17_test import Service17TmExtended class TestTelemetry(TestCase): def test_generic_pus_c(self): - pus_17_telemetry = Service17TMExtended( + pus_17_telemetry = Service17TmExtended( subservice=1, ssc=36, time=CdsShortTimestamp.init_from_current_time(), @@ -22,12 +22,12 @@ def test_generic_pus_c(self): pus_17_telemetry = None def tm_func(raw_telemetry: bytearray): - return Service17TMExtended.unpack(raw_telemetry=raw_telemetry) + return Service17TmExtended.unpack(raw_telemetry=raw_telemetry) self.assertRaises(ValueError, tm_func, bytearray()) self.assertRaises(ValueError, tm_func, None) - pus_17_telemetry = Service17TMExtended.unpack(raw_telemetry=pus_17_raw) + pus_17_telemetry = Service17TmExtended.unpack(raw_telemetry=pus_17_raw) self.assertTrue(get_pus_tm_version() == PusVersion.PUS_C) self.assertTrue(pus_17_telemetry.service == 17) self.assertTrue(pus_17_telemetry.apid == 0xEF) @@ -49,11 +49,11 @@ def tm_func(raw_telemetry: bytearray): self.assertTrue(pus_17_telemetry.pus_tm.packet_id.raw() == 0x8 << 8 | 0xEF) def test_list_functionality(self): - pus_17_telecommand = Service17TMExtended( + pus_17_telecommand = Service17TmExtended( subservice=1, ssc=36, time=CdsShortTimestamp.init_from_current_time() ) pus_17_raw = pus_17_telecommand.pack() - pus_17_telemetry = Service17TMExtended.unpack(raw_telemetry=pus_17_raw) + pus_17_telemetry = Service17TmExtended.unpack(raw_telemetry=pus_17_raw) header_list = [] content_list = [] diff --git a/tmtccmd/__init__.py b/tmtccmd/__init__.py index 076e6a1b..3d676c18 100644 --- a/tmtccmd/__init__.py +++ b/tmtccmd/__init__.py @@ -52,11 +52,11 @@ def setup(setup_args: SetupWrapper): __assign_tmtc_commander_hooks(hook_object=setup_args.hook_obj) - if setup_args.use_gui: - set_default_globals_pre_args_parsing(setup_args.apid) - if not setup_args.use_gui: + if setup_args.params.use_gui: + set_default_globals_pre_args_parsing(setup_args.params.apid) + if not setup_args.params.use_gui: __handle_cli_args_and_globals(setup_args) - __SETUP_FOR_GUI = setup_args.use_gui + __SETUP_FOR_GUI = setup_args.params.use_gui __SETUP_WAS_CALLED = True @@ -116,7 +116,7 @@ def init_printout(use_gui: bool): def __handle_cli_args_and_globals(setup_args: SetupWrapper): LOGGER.info("Setting up pre-globals..") - set_default_globals_pre_args_parsing(setup_args.apid) + set_default_globals_pre_args_parsing(setup_args.params.apid) LOGGER.info("Setting up post-globals..") @@ -157,12 +157,12 @@ def __start_tmtc_commander_qt_gui( def create_default_tmtc_backend( - setup_args: SetupWrapper, tm_handler: TmHandlerBase, tc_handler: TcHandlerBase + setup_wrapper: SetupWrapper, tm_handler: TmHandlerBase, tc_handler: TcHandlerBase ) -> BackendBase: """Creates a default TMTC backend instance which can be passed to the tmtccmd runner :param tc_handler: - :param setup_args: + :param setup_wrapper: :param tm_handler: :return: """ @@ -181,12 +181,12 @@ def create_default_tmtc_backend( else: if tm_handler.get_type() == TmTypes.CCSDS_SPACE_PACKETS: tm_handler = cast(CcsdsTmHandler, tm_handler) - com_if = setup_args.hook_obj.assign_communication_interface( - com_if_key=setup_args.args_wrapper.com_if + com_if = setup_wrapper.hook_obj.assign_communication_interface( + com_if_key=setup_wrapper.params.com_if ) tm_listener = CcsdsTmListener(com_if=com_if, tm_handler=tm_handler) mode_wrapper = ModeWrapper() - backend_mode_conversion(setup_args.args_wrapper.mode, mode_wrapper) + backend_mode_conversion(setup_wrapper.params.mode, mode_wrapper) # The global variables are set by the argument parser. tmtc_backend = CcsdsTmtcBackend( com_if=com_if, @@ -195,8 +195,9 @@ def create_default_tmtc_backend( tc_mode=mode_wrapper.tc_mode, tm_mode=mode_wrapper.tm_mode, ) - tmtc_backend.inter_cmd_delay = setup_args.args_wrapper.delay + tmtc_backend.inter_cmd_delay = setup_wrapper.params.tc_params.delay tmtc_backend.current_proc_info = DefaultProcedureInfo( - setup_args.args_wrapper.service, setup_args.args_wrapper.op_code + setup_wrapper.params.def_proc_args.service, + setup_wrapper.params.def_proc_args.op_code, ) return tmtc_backend diff --git a/tmtccmd/com_if/dummy.py b/tmtccmd/com_if/dummy.py index 628b84e1..4ae5413d 100644 --- a/tmtccmd/com_if/dummy.py +++ b/tmtccmd/com_if/dummy.py @@ -7,8 +7,8 @@ from tmtccmd.com_if import ComInterface from tmtccmd.tm import TelemetryListT -from tmtccmd.tm.pus_1_verification import Service1TMExtended -from tmtccmd.tm.pus_17_test import Subservices, Service17TMExtended +from tmtccmd.tm.pus_1_verification import Service1TmExtended +from tmtccmd.tm.pus_17_test import Subservices, Service17TmExtended from tmtccmd.logging import get_console_logger @@ -68,7 +68,7 @@ def generate_reply_package(self): """ if self.last_tc.service == 17: if self.last_tc.subservice == 1: - tm_packer = Service1TMExtended( + tm_packer = Service1TmExtended( subservice=1, ssc=self.current_ssc, tc_request_id=RequestId( @@ -79,7 +79,7 @@ def generate_reply_package(self): self.current_ssc += 1 tm_packet_raw = tm_packer.pack() self.next_telemetry_package.append(tm_packet_raw) - tm_packer = Service1TMExtended( + tm_packer = Service1TmExtended( subservice=7, ssc=self.current_ssc, tc_request_id=RequestId( @@ -90,7 +90,7 @@ def generate_reply_package(self): self.next_telemetry_package.append(tm_packet_raw) self.current_ssc += 1 - tm_packer = Service17TMExtended(subservice=Subservices.TM_REPLY) + tm_packer = Service17TmExtended(subservice=Subservices.TM_REPLY) tm_packet_raw = tm_packer.pack() self.next_telemetry_package.append(tm_packet_raw) self.current_ssc += 1 diff --git a/tmtccmd/config/__init__.py b/tmtccmd/config/__init__.py index cac9c8ea..6f08218a 100644 --- a/tmtccmd/config/__init__.py +++ b/tmtccmd/config/__init__.py @@ -12,6 +12,7 @@ create_default_args_parser, add_default_tmtccmd_args, parse_default_tmtccmd_input_arguments, + DefProcedureParams, ) from tmtccmd.config.prompt import prompt_op_code, prompt_service from tmtccmd.config.tmtc import TmTcDefWrapper @@ -202,11 +203,15 @@ def get_global_hook_obj() -> Optional[TmTcCfgHookBase]: def args_to_params( - args: argparse.Namespace, hook_obj: TmTcCfgHookBase, use_prompts: bool -) -> SetupParams: + pargs: argparse.Namespace, + params: SetupParams, + hook_obj: TmTcCfgHookBase, + use_prompts: bool, +): """If some arguments are unspecified, they are set here with (variable) default values. - :param args: Arguments from calling parse method + :param pargs: Parsed arguments from calling parse method + :param params: Setup parameter object which will be set by this function :param hook_obj: :param use_prompts: Specify whether terminal prompts are allowed to retrieve unspecified arguments. For something like a GUI, it might make sense to disable this @@ -214,60 +219,58 @@ def args_to_params( """ from tmtccmd.com_if.utils import determine_com_if - group = SetupParams() - if args.com_if is None or args.com_if == CoreComInterfaces.UNSPECIFIED.value: + if pargs.com_if is None or pargs.com_if == CoreComInterfaces.UNSPECIFIED.value: if use_prompts: - group.com_if = determine_com_if( + params.com_if = determine_com_if( hook_obj.get_com_if_dict(), hook_obj.json_cfg_path ) else: # TODO: Check whether COM IF is valid? - group.com_if = args.com_if - if args.mode is None: - group.mode = CoreModeStrings[CoreModeList.ONE_QUEUE_MODE] + params.com_if = pargs.com_if + if pargs.mode is None: + params.mode = CoreModeStrings[CoreModeList.ONE_QUEUE_MODE] else: - group.mode = args.mode + params.mode = pargs.mode tmtc_defs = hook_obj.get_tmtc_definitions() + params.def_proc_args = DefProcedureParams("0", "0") if tmtc_defs is None: LOGGER.warning("Invalid Service to Op-Code dictionary detected") - if args.service is None: - group.service = "0" - if args.op_code is None: - group.op_code = "0" else: - if args.service is None: - if args.mode == CoreModeStrings[CoreModeList.ONE_QUEUE_MODE]: + if pargs.service is None: + if pargs.mode == CoreModeStrings[CoreModeList.ONE_QUEUE_MODE]: if use_prompts: LOGGER.info( "No service argument (-s) specified, prompting from user.." ) # Try to get the service list from the hook base and prompt service from user - group.service = prompt_service(tmtc_defs) + params.def_proc_args.service = prompt_service(tmtc_defs) else: - group.service = args.service - if args.op_code is None: - current_service = group.service + params.def_proc_args.service = pargs.service + if pargs.op_code is None: + current_service = params.def_proc_args.service if use_prompts: - group.op_code = prompt_op_code(tmtc_defs, current_service) + params.def_proc_args.op_code = prompt_op_code( + tmtc_defs, current_service + ) else: - group.op_code = args.op_code - if args.delay is None: - if group.mode == CoreModeStrings[CoreModeList.ONE_QUEUE_MODE]: - group.delay = 3.0 + params.def_proc_args.op_code = pargs.op_code + if pargs.delay is None: + if params.backend_params.mode == CoreModeStrings[CoreModeList.ONE_QUEUE_MODE]: + params.tc_params.delay = 3.0 else: - group.delay = 0.0 + params.tc_params.delay = 0.0 else: - group.delay = args.delay - if args.listener is None: + params.tc_params.delay = pargs.delay + if pargs.listener is None: args.listener = False else: - group.listener = args.listener - return group + params.backend_params.listener = pargs.listener class ArgParserWrapper: def __init__( self, + hook_obj: TmTcCfgHookBase, parser: Optional[argparse.ArgumentParser] = None, descript_txt: Optional[str] = None, ): @@ -278,44 +281,53 @@ def __init__( self.args_parser = parser self.print_known_args = False self.print_unknown_args = False + self.hook_obj = hook_obj self.unknown_args = [""] - self._params: SetupParams = SetupParams() self.args_raw = None + self._parse_was_called = False def add_default_tmtccmd_args(self): add_default_tmtccmd_args(self.args_parser) - def parse(self, hook_obj: TmTcCfgHookBase, use_prompts: bool): - self.args_raw, self.unknown_args = parse_default_tmtccmd_input_arguments( - self.args_parser, - print_known_args=self.print_known_args, - print_unknown_args=self.print_unknown_args, - ) - self._params = args_to_params(self.args_raw, hook_obj, use_prompts) - - @property - def params(self): - return self._params - - @property - def delay(self): - return self.params.tc_properties.delay + def parse(self): + """Parse all CLI arguments with the given argument parser""" + if not self._parse_was_called: + self.args_raw, self.unknown_args = parse_default_tmtccmd_input_arguments( + self.args_parser, + print_known_args=self.print_known_args, + print_unknown_args=self.print_unknown_args, + ) + self._parse_was_called = True - @property - def service(self): - return self.params.def_proc_args.service + def set_params(self, params: SetupParams): + """Set up the parameter object from the parsed arguments. This call auto-determines whether + prompts should be used depending on whether the GUI flag was passed or not. - @property - def op_code(self): - return self.params.def_proc_args.op_code - - @property - def mode(self): - return self.params.backend_params.mode + :raise Value Error: Parse function call missing + """ + if not self._parse_was_called: + raise ValueError("Call the parse function first") + if self.args_raw.gui: + self.set_params_without_prompts(params) + else: + self.set_params_with_prompts(params) + + def set_params_without_prompts(self, params: SetupParams): + if not self._parse_was_called: + raise ValueError("Call the parse function first") + args_to_params( + pargs=self.args_raw, + params=params, + hook_obj=self.hook_obj, + use_prompts=False, + ) - @property - def com_if(self): - return self.params.backend_params.com_if + def set_params_with_prompts(self, params: SetupParams): + if not self._parse_was_called: + raise ValueError("Call the parse function first") + args_to_params( + pargs=self.args_raw, params=params, hook_obj=self.hook_obj, use_prompts=True + ) class SetupWrapper: @@ -324,27 +336,20 @@ class SetupWrapper: def __init__( self, hook_obj: TmTcCfgHookBase, - use_gui: bool, - apid: int, setup_params: SetupParams, json_cfg_path: Optional[str] = None, - reduced_printout: bool = False, - use_ansi_colors: bool = True, ): """ :param hook_obj: User hook object. Needs to be implemented by the user :param setup_params: Optional helper wrapper which contains CLI arguments. - :param use_gui: Specify whether a GUI is used. - :param reduced_printout: - :param use_ansi_colors: """ self.hook_obj = hook_obj - self.use_gui = use_gui - self.apid = apid self.json_cfg_path = json_cfg_path - self.reduced_printout = reduced_printout - self.ansi_colors = use_ansi_colors - self.args_wrapper = setup_params + self._params = setup_params self.json_cfg_path = json_cfg_path if json_cfg_path is None: self.json_cfg_path = default_json_path() + + @property + def params(self): + return self._params diff --git a/tmtccmd/config/args.py b/tmtccmd/config/args.py index a843e58d..ee230d45 100644 --- a/tmtccmd/config/args.py +++ b/tmtccmd/config/args.py @@ -5,7 +5,6 @@ import sys from typing import Optional, List from dataclasses import dataclass -from tmtccmd.config.prompt import prompt_service, prompt_op_code from tmtccmd.logging import get_console_logger @@ -53,10 +52,48 @@ class BackendParams: @dataclass +class AppParams: + use_gui: bool = False + reduced_printout: bool = False + use_ansi_colors: bool = True + + class SetupParams: - def_proc_args: Optional[DefProcedureParams] = None - tc_properties: TcParams = TcParams() - backend_params: BackendParams = BackendParams() + def __init__( + self, + def_proc_args: Optional[DefProcedureParams] = None, + tc_params: TcParams = TcParams(), + backend_params: BackendParams = BackendParams(), + app_params: AppParams = AppParams(), + ): + self.def_proc_args = def_proc_args + self.tc_params = tc_params + self.backend_params = backend_params + self.app_params = app_params + + @property + def apid(self): + return self.tc_params.apid + + @apid.setter + def apid(self, apid): + self.tc_params.apid = apid + + @property + def use_gui(self): + return self.app_params.use_gui + + @use_gui.setter + def use_gui(self, use_gui): + self.app_params.use_gui = use_gui + + @property + def mode(self): + return self.backend_params.mode + + @mode.setter + def mode(self, mode: str): + self.backend_params.mode = mode def add_default_tmtccmd_args(parser: argparse.ArgumentParser): @@ -120,6 +157,9 @@ def add_cfdp_parser(arg_parser: argparse.ArgumentParser): def add_generic_arguments(arg_parser: argparse.ArgumentParser): + arg_parser.add_argument( + "-g", "--gui", help="Use GUI mode", action="store_true", default=False + ) arg_parser.add_argument( "-s", "--service", diff --git a/tmtccmd/core/ccsds_backend.py b/tmtccmd/core/ccsds_backend.py index abd58776..b3fb1d88 100644 --- a/tmtccmd/core/ccsds_backend.py +++ b/tmtccmd/core/ccsds_backend.py @@ -68,6 +68,12 @@ def com_if_id(self): def com_if(self) -> ComInterface: return self.__com_if + @com_if.setter + def com_if(self, com_if: ComInterface): + if self.__com_if_active: + return + self.__com_if = com_if + @property def tc_mode(self): return self._state.mode_wrapper.tc_mode diff --git a/tmtccmd/core/frontend.py b/tmtccmd/core/frontend.py index 613db4b9..c5d64953 100644 --- a/tmtccmd/core/frontend.py +++ b/tmtccmd/core/frontend.py @@ -29,6 +29,7 @@ from PyQt5.QtCore import Qt, pyqtSignal, QObject, QThread, QRunnable from tmtccmd.config.globals import CoreGlobalIds +from tmtccmd.core import BackendController from tmtccmd.core.frontend_base import FrontendBase from tmtccmd.core.ccsds_backend import CcsdsTmtcBackend from tmtccmd.config import ( @@ -90,6 +91,7 @@ class WorkerThread(QObject): def __init__(self, op_code: WorkerOperationsCodes, tmtc_handler: CcsdsTmtcBackend): super(QObject, self).__init__() self.op_code = op_code + self.backend_ctrl = BackendController() self.tmtc_handler = tmtc_handler self.tmtc_handler.one_shot_operation = True @@ -112,13 +114,13 @@ def run_worker(self): self.tmtc_handler.one_shot_operation = True # It is expected that the TMTC handler is in the according state to perform the # operation - self.tmtc_handler.periodic_op() + self.tmtc_handler.periodic_op(self.backend_ctrl) self.op_code = WorkerOperationsCodes.LISTENING self.command_executed.emit() elif op_code == WorkerOperationsCodes.LISTENING: self.tmtc_handler.one_shot_operation = True self.tmtc_handler.mode = CoreModeList.LISTENER_MODE - self.tmtc_handler.periodic_op() + self.tmtc_handler.periodic_op(self.backend_ctrl) elif op_code == WorkerOperationsCodes.IDLE: pass else: @@ -144,12 +146,10 @@ def __init__( self._tmtc_handler = tmtc_backend self._app_name = app_name self._hook_obj = hook_obj - - self._tmtc_handler.initialize() - self.service_op_code_dict = dict() self._service_list = [] self._op_code_list = [] self._com_if_list = [] + self._service_op_code_dict = hook_obj.get_tmtc_definitions() self._last_com_if = CoreComInterfaces.UNSPECIFIED.value self._current_com_if = CoreComInterfaces.UNSPECIFIED.value self._current_service = "" @@ -239,9 +239,8 @@ def __connect_button_action(self): com_if_key=self._current_com_if ) self._last_com_if = self._current_com_if - self._tmtc_handler.set_com_if(new_com_if) + self._tmtc_handler.com_if = new_com_if LOGGER.info("Starting listener") - self._tmtc_handler.start_listener(False) self.__connect_button.setStyleSheet(DISCONNECT_BTTN_STYLE) self.__command_button.setEnabled(True) self.__connect_button.setText("Disconnect") @@ -368,16 +367,16 @@ def __set_up_service_op_code_section(self, grid: QGridLayout, row: int): combo_box_services = QComboBox() default_service = get_global(CoreGlobalIds.CURRENT_SERVICE) - self.service_op_code_dict = self._hook_obj.get_tmtc_definitions() - if self.service_op_code_dict is None: + self._service_op_code_dict = self._hook_obj.get_tmtc_definitions() + if self._service_op_code_dict is None: LOGGER.warning("Invalid service to operation code dictionary") LOGGER.warning("Setting default dictionary") from tmtccmd.config.globals import get_default_tmtc_defs - self.service_op_code_dict = get_default_tmtc_defs() + self._service_op_code_dict = get_default_tmtc_defs() index = 0 default_index = 0 - for service_key, service_value in self.service_op_code_dict.items(): + for service_key, service_value in self._service_op_code_dict.defs.items(): combo_box_services.addItem(service_value[0]) if service_key == default_service: default_index = index @@ -450,9 +449,9 @@ def __op_code_index_changed(self, index: int): def __update_op_code_combo_box(self): self.__combo_box_op_codes.clear() self._op_code_list = [] - op_code_dict = self.service_op_code_dict[self._current_service][1] - if op_code_dict is not None: - for op_code_key, op_code_value in op_code_dict.items(): + op_code_entry = self._service_op_code_dict.op_code_entry(self._current_service) + if op_code_entry is not None: + for op_code_key, op_code_value in op_code_entry.op_code_dict.items(): try: self._op_code_list.append(op_code_key) self.__combo_box_op_codes.addItem(op_code_value[0]) diff --git a/tmtccmd/tm/pus_17_test.py b/tmtccmd/tm/pus_17_test.py index 2cdea53c..802f602d 100644 --- a/tmtccmd/tm/pus_17_test.py +++ b/tmtccmd/tm/pus_17_test.py @@ -1,13 +1,13 @@ from __future__ import annotations from spacepackets.ccsds.time import CdsShortTimestamp from spacepackets.ecss import PusVersion, PusTelemetry -from spacepackets.ecss.pus_17_test import Service17TM +from spacepackets.ecss.pus_17_test import Service17Tm from tmtccmd.tm.base import PusTmInfoBase, PusTmBase from tmtccmd.pus.pus_17_test import Subservices -class Service17TMExtended(PusTmBase, PusTmInfoBase, Service17TM): +class Service17TmExtended(PusTmBase, PusTmInfoBase, Service17Tm): def __init__( self, subservice: int, @@ -21,7 +21,7 @@ def __init__( space_time_ref: int = 0b0000, destination_id: int = 0, ): - Service17TM.__init__( + Service17Tm.__init__( self, subservice=subservice, time=time, @@ -39,7 +39,7 @@ def __init__( self.__set_internal_fields() @classmethod - def __empty(cls) -> Service17TMExtended: + def __empty(cls) -> Service17TmExtended: return cls(subservice=0) def __set_internal_fields(self): @@ -51,7 +51,7 @@ def unpack( cls, raw_telemetry: bytes, pus_version: PusVersion = PusVersion.GLOBAL_CONFIG, - ) -> Service17TMExtended: + ) -> Service17TmExtended: service_17_tm = cls.__empty() service_17_tm.pus_tm = PusTelemetry.unpack( raw_telemetry=raw_telemetry, pus_version=pus_version diff --git a/tmtccmd/tm/pus_1_verification.py b/tmtccmd/tm/pus_1_verification.py index 41965eaf..3663184c 100644 --- a/tmtccmd/tm/pus_1_verification.py +++ b/tmtccmd/tm/pus_1_verification.py @@ -7,7 +7,7 @@ from spacepackets.ccsds.spacepacket import PacketSeqCtrl from spacepackets.ccsds.time import CdsShortTimestamp from spacepackets.ecss.tm import PusVersion, PusTelemetry -from spacepackets.ecss.pus_1_verification import Service1TM, Subservices, RequestId +from spacepackets.ecss.pus_1_verification import Service1Tm, Subservices, RequestId from tmtccmd.tm.base import PusTmInfoBase, PusTmBase from tmtccmd.logging import get_console_logger @@ -15,7 +15,7 @@ LOGGER = get_console_logger() -class Service1TMExtended(PusTmBase, PusTmInfoBase, Service1TM): +class Service1TmExtended(PusTmBase, PusTmInfoBase, Service1Tm): """Service 1 TM class representation. Can be used to deserialize raw service 1 packets.""" def __init__( @@ -24,7 +24,6 @@ def __init__( tc_request_id: RequestId, time: CdsShortTimestamp = None, ssc: int = 0, - source_data: bytearray = bytearray([]), apid: int = -1, packet_version: int = 0b000, pus_version: PusVersion = PusVersion.GLOBAL_CONFIG, @@ -32,13 +31,12 @@ def __init__( space_time_ref: int = 0b0000, destination_id: int = 0, ): - Service1TM.__init__( + Service1Tm.__init__( self, tc_request_id=tc_request_id, subservice=subservice, time=time, ssc=ssc, - source_data=source_data, apid=apid, packet_version=packet_version, pus_version=pus_version, @@ -50,7 +48,7 @@ def __init__( PusTmInfoBase.__init__(self, pus_tm=self.pus_tm) @classmethod - def __empty(cls) -> Service1TMExtended: + def __empty(cls) -> Service1TmExtended: return cls(subservice=0, tc_request_id=RequestId.empty()) @classmethod @@ -58,7 +56,7 @@ def unpack( cls, raw_telemetry: bytes, pus_version: PusVersion = PusVersion.GLOBAL_CONFIG, - ) -> Service1TMExtended: + ) -> Service1TmExtended: """Parse a service 1 telemetry packet :param raw_telemetry: @@ -132,4 +130,4 @@ def _handle_success_verification(self): self.append_packet_info(" : Completion success") -PusVerifQueue = Deque[Service1TM] +PusVerifQueue = Deque[Service1Tm] From 8171229cdcbe6569fbe7e4c1240ca0f2aedf09ba Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Sun, 26 Jun 2022 17:30:34 +0200 Subject: [PATCH 110/221] com_if_id properties --- tmtccmd/__init__.py | 2 +- tmtccmd/config/args.py | 10 +++++++++- tmtccmd/config/globals.py | 2 +- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/tmtccmd/__init__.py b/tmtccmd/__init__.py index 3d676c18..357ef614 100644 --- a/tmtccmd/__init__.py +++ b/tmtccmd/__init__.py @@ -182,7 +182,7 @@ def create_default_tmtc_backend( if tm_handler.get_type() == TmTypes.CCSDS_SPACE_PACKETS: tm_handler = cast(CcsdsTmHandler, tm_handler) com_if = setup_wrapper.hook_obj.assign_communication_interface( - com_if_key=setup_wrapper.params.com_if + com_if_key=setup_wrapper.params.com_if_id ) tm_listener = CcsdsTmListener(com_if=com_if, tm_handler=tm_handler) mode_wrapper = ModeWrapper() diff --git a/tmtccmd/config/args.py b/tmtccmd/config/args.py index ee230d45..1ff6d1a3 100644 --- a/tmtccmd/config/args.py +++ b/tmtccmd/config/args.py @@ -46,7 +46,7 @@ class TcParams: @dataclass class BackendParams: mode: str = "" - com_if: str = "" + com_if_id: str = "" listener: bool = False interactive: bool = False @@ -95,6 +95,14 @@ def mode(self): def mode(self, mode: str): self.backend_params.mode = mode + @property + def com_if_id(self): + return self.backend_params.com_if_id + + @com_if_id.setter + def com_if_id(self, com_if_id): + self.backend_params.com_if_id = com_if_id + def add_default_tmtccmd_args(parser: argparse.ArgumentParser): add_default_mode_arguments(parser) diff --git a/tmtccmd/config/globals.py b/tmtccmd/config/globals.py index 1c9c910e..0efb9c47 100644 --- a/tmtccmd/config/globals.py +++ b/tmtccmd/config/globals.py @@ -150,7 +150,7 @@ def handle_com_if_arg( if custom_com_if_dict is not None: all_com_ifs = CORE_COM_IF_DICT.update(custom_com_if_dict) try: - com_if_key = str(args.com_if) + com_if_key = str(args.com_if_id) except AttributeError: LOGGER.warning("No communication interface specified") LOGGER.warning("Trying to set from existing configuration..") From b8564981069468bb93a9ac330e26945d0bcd5637 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Sun, 26 Jun 2022 17:31:39 +0200 Subject: [PATCH 111/221] renamed com_if_key to com_if_id --- tmtccmd/com_if/__init__.py | 6 +++--- tmtccmd/com_if/dummy.py | 4 ++-- tmtccmd/com_if/qemu.py | 4 ++-- tmtccmd/com_if/serial.py | 4 ++-- tmtccmd/com_if/tcp.py | 6 +++--- tmtccmd/com_if/udp.py | 4 ++-- tmtccmd/config/com_if.py | 10 +++++----- 7 files changed, 19 insertions(+), 19 deletions(-) diff --git a/tmtccmd/com_if/__init__.py b/tmtccmd/com_if/__init__.py index 5cab805b..368800f1 100644 --- a/tmtccmd/com_if/__init__.py +++ b/tmtccmd/com_if/__init__.py @@ -13,12 +13,12 @@ class ComInterface: the underlying interface. """ - def __init__(self, com_if_key: str): + def __init__(self, com_if_id: str): self.valid = True - self.com_if_key = com_if_key + self.com_if_id = com_if_id def get_id(self) -> str: - return self.com_if_key + return self.com_if_id @abstractmethod def initialize(self, args: any = None) -> any: diff --git a/tmtccmd/com_if/dummy.py b/tmtccmd/com_if/dummy.py index 4ae5413d..97331874 100644 --- a/tmtccmd/com_if/dummy.py +++ b/tmtccmd/com_if/dummy.py @@ -16,8 +16,8 @@ class DummyComIF(ComInterface): - def __init__(self, com_if_key: str): - super().__init__(com_if_key=com_if_key) + def __init__(self, com_if_id: str): + super().__init__(com_if_id=com_if_id) self.dummy_handler = DummyHandler() self.last_service = 0 self.last_subservice = 0 diff --git a/tmtccmd/com_if/qemu.py b/tmtccmd/com_if/qemu.py index f388f253..cbcfb6ec 100644 --- a/tmtccmd/com_if/qemu.py +++ b/tmtccmd/com_if/qemu.py @@ -67,11 +67,11 @@ class QEMUComIF(ComInterface): def __init__( self, - com_if_key: str, + com_if_id: str, serial_timeout: float, ser_com_type: SerialCommunicationType = SerialCommunicationType.FIXED_FRAME_BASED, ): - super().__init__(com_if_key=com_if_key) + super().__init__(com_if_id=com_if_id) self.serial_timeout = serial_timeout self.loop = asyncio.get_event_loop() self.number_of_packets = 0 diff --git a/tmtccmd/com_if/serial.py b/tmtccmd/com_if/serial.py index 69b6d68e..a7d3d49e 100644 --- a/tmtccmd/com_if/serial.py +++ b/tmtccmd/com_if/serial.py @@ -53,7 +53,7 @@ class SerialComIF(ComInterface): def __init__( self, - com_if_key: str, + com_if_id: str, com_port: str, baud_rate: int, serial_timeout: float, @@ -66,7 +66,7 @@ def __init__( :param serial_timeout: Specify serial timeout :param ser_com_type: Specify how to handle serial reception """ - super().__init__(com_if_key=com_if_key) + super().__init__(com_if_id=com_if_id) self.com_port = com_port self.baud_rate = baud_rate diff --git a/tmtccmd/com_if/tcp.py b/tmtccmd/com_if/tcp.py index aa639722..da73017e 100644 --- a/tmtccmd/com_if/tcp.py +++ b/tmtccmd/com_if/tcp.py @@ -35,7 +35,7 @@ class TcpComIF(ComInterface): def __init__( self, - com_if_key: str, + com_if_id: str, com_type: TcpCommunicationType, space_packet_ids: Tuple[int], tm_polling_freqency: float, @@ -44,14 +44,14 @@ def __init__( max_packets_stored: int = 50, ): """Initialize a communication interface to send and receive TMTC via TCP - :param com_if_key: + :param com_if_id: :param com_type: Communication Type. By default, it is assumed that space packets are sent via TCP :param space_packet_ids: 16 bit packet header for space packet headers. Used to detect the start of PUS packets :param tm_polling_freqency: Polling frequency in seconds """ - super().__init__(com_if_key=com_if_key) + super().__init__(com_if_id=com_if_id) self.com_type = com_type self.space_packet_ids = space_packet_ids self.tm_polling_frequency = tm_polling_freqency diff --git a/tmtccmd/com_if/udp.py b/tmtccmd/com_if/udp.py index ca6b732e..25f037d2 100644 --- a/tmtccmd/com_if/udp.py +++ b/tmtccmd/com_if/udp.py @@ -19,7 +19,7 @@ class UdpComIF(ComInterface): def __init__( self, - com_if_key: str, + com_if_id: str, tm_timeout: float, tc_timeout_factor: float, send_address: EthernetAddressT, @@ -33,7 +33,7 @@ def __init__( :param max_recv_size: :param recv_addr: """ - super().__init__(com_if_key=com_if_key) + super().__init__(com_if_id=com_if_id) self.tm_timeout = tm_timeout self.tc_timeout_factor = tc_timeout_factor self.udp_socket = None diff --git a/tmtccmd/config/com_if.py b/tmtccmd/config/com_if.py index 8c78fb21..249e6719 100644 --- a/tmtccmd/config/com_if.py +++ b/tmtccmd/config/com_if.py @@ -56,7 +56,7 @@ def create_communication_interface_default( serial_cfg = get_global(CoreGlobalIds.SERIAL_CONFIG) serial_timeout = serial_cfg[SerialConfigIds.SERIAL_TIMEOUT] communication_interface = QEMUComIF( - com_if_key=com_if_key, + com_if_id=com_if_key, serial_timeout=serial_timeout, ser_com_type=SerialCommunicationType.DLE_ENCODING, ) @@ -66,7 +66,7 @@ def create_communication_interface_default( dle_max_queue_len, dle_max_frame_size, serial_timeout ) else: - communication_interface = DummyComIF(com_if_key=com_if_key) + communication_interface = DummyComIF(com_if_id=com_if_key) if communication_interface is None: return communication_interface if not communication_interface.valid: @@ -171,7 +171,7 @@ def create_default_tcpip_interface( max_recv_size = ethernet_cfg_dict[TcpIpConfigIds.RECV_MAX_SIZE] if com_if_key == CoreComInterfaces.UDP.value: communication_interface = UdpComIF( - com_if_key=com_if_key, + com_if_id=com_if_key, tm_timeout=get_global(CoreGlobalIds.TM_TIMEOUT), tc_timeout_factor=get_global(CoreGlobalIds.TC_SEND_TIMEOUT_FACTOR), send_address=send_addr, @@ -180,7 +180,7 @@ def create_default_tcpip_interface( ) elif com_if_key == CoreComInterfaces.TCP.value: communication_interface = TcpComIF( - com_if_key=com_if_key, + com_if_id=com_if_key, com_type=TcpCommunicationType.SPACE_PACKETS, space_packet_ids=space_packet_ids, tm_polling_freqency=0.5, @@ -220,7 +220,7 @@ def create_default_serial_interface( else: ser_com_type = SerialCommunicationType.FIXED_FRAME_BASED communication_interface = SerialComIF( - com_if_key=com_if_key, + com_if_id=com_if_key, com_port=com_port, baud_rate=serial_baudrate, serial_timeout=serial_timeout, From 509637e05febb833084ac5f138aa90cc3f474cd2 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Sun, 26 Jun 2022 17:35:16 +0200 Subject: [PATCH 112/221] args to params GUI arg handling --- tmtccmd/config/__init__.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tmtccmd/config/__init__.py b/tmtccmd/config/__init__.py index 6f08218a..5671591d 100644 --- a/tmtccmd/config/__init__.py +++ b/tmtccmd/config/__init__.py @@ -218,7 +218,10 @@ def args_to_params( :return: None """ from tmtccmd.com_if.utils import determine_com_if - + if pargs.gui is None: + params.app_params.use_gui = False + else: + params.app_params.use_gui = pargs.gui if pargs.com_if is None or pargs.com_if == CoreComInterfaces.UNSPECIFIED.value: if use_prompts: params.com_if = determine_com_if( From 8b6927dc326123edfb4fd705d323f365a553be66 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Sun, 26 Jun 2022 17:56:56 +0200 Subject: [PATCH 113/221] start fixing GUI --- tmtccmd/__init__.py | 15 ++++++++++----- tmtccmd/config/__init__.py | 18 +++++++++++------- tmtccmd/core/frontend.py | 36 +++++++++++++++++++++++------------- 3 files changed, 44 insertions(+), 25 deletions(-) diff --git a/tmtccmd/__init__.py b/tmtccmd/__init__.py index 357ef614..c99f01de 100644 --- a/tmtccmd/__init__.py +++ b/tmtccmd/__init__.py @@ -62,6 +62,7 @@ def setup(setup_args: SetupWrapper): def start( tmtc_backend: BackendBase, + hook_obj: TmTcCfgHookBase, tmtc_frontend: Union[FrontendBase, None] = None, app_name: str = "TMTC Commander", ): @@ -73,6 +74,7 @@ def start( :param tmtc_backend: Custom backend can be passed here. Otherwise, a default backend will be created + :param hook_obj: :param tmtc_frontend: Custom frontend can be passed here. Otherwise, a default frontend will be created :param app_name: Name of application. Will be displayed in GUI @@ -85,7 +87,10 @@ def start( sys.exit(1) if __SETUP_FOR_GUI: __start_tmtc_commander_qt_gui( - tmtc_frontend=tmtc_frontend, tmtc_backend=tmtc_backend, app_name=app_name + tmtc_frontend=tmtc_frontend, + hook_obj=hook_obj, + tmtc_backend=tmtc_backend, + app_name=app_name, ) else: __start_tmtc_commander_cli(tmtc_backend=tmtc_backend) @@ -129,6 +134,7 @@ def __start_tmtc_commander_cli( def __start_tmtc_commander_qt_gui( tmtc_backend: BackendBase, + hook_obj: TmTcCfgHookBase, tmtc_frontend: Union[None, FrontendBase] = None, app_name: str = "TMTC Commander", ): @@ -142,17 +148,16 @@ def __start_tmtc_commander_qt_gui( app = QApplication([app_name]) if tmtc_frontend is None: from tmtccmd.core.frontend import TmTcFrontend - from tmtccmd.config.cfg_hook import get_global_hook_obj from tmtccmd.core.ccsds_backend import CcsdsTmtcBackend tmtc_frontend = TmTcFrontend( - hook_obj=get_global_hook_obj(), + hook_obj=hook_obj, tmtc_backend=cast(CcsdsTmtcBackend, tmtc_backend), app_name=app_name, ) tmtc_frontend.start(app) - except ImportError: - LOGGER.error("PyQt5 module not installed, can't run GUI mode!") + except ImportError as e: + LOGGER.exception(e) sys.exit(1) diff --git a/tmtccmd/config/__init__.py b/tmtccmd/config/__init__.py index 5671591d..a975f5b3 100644 --- a/tmtccmd/config/__init__.py +++ b/tmtccmd/config/__init__.py @@ -43,13 +43,16 @@ class CoreComInterfaces(enum.Enum): CORE_COM_IF_DICT = { - CoreComInterfaces.DUMMY.value: "Dummy Interface", - CoreComInterfaces.SERIAL_DLE.value: "Serial Interace with DLE encoding", - CoreComInterfaces.UDP.value: "TCP/IP with UDP datagrams", - CoreComInterfaces.TCP.value: "TCP/IP with TCP", - CoreComInterfaces.SERIAL_FIXED_FRAME.value: "Serial Interface with fixed size frames", - CoreComInterfaces.SERIAL_QEMU.value: "Serial Interface using QEMU", - CoreComInterfaces.UNSPECIFIED.value: "Unspecified", + CoreComInterfaces.DUMMY.value: ("Dummy Interface", None), + CoreComInterfaces.SERIAL_DLE.value: ("Serial Interace with DLE encoding", None), + CoreComInterfaces.UDP.value: ("TCP/IP with UDP datagrams", None), + CoreComInterfaces.TCP.value: ("TCP/IP with TCP", None), + CoreComInterfaces.SERIAL_FIXED_FRAME.value: ( + "Serial Interface with fixed size frames", + None, + ), + CoreComInterfaces.SERIAL_QEMU.value: ("Serial Interface using QEMU", None), + CoreComInterfaces.UNSPECIFIED.value: ("Unspecified", None), } @@ -218,6 +221,7 @@ def args_to_params( :return: None """ from tmtccmd.com_if.utils import determine_com_if + if pargs.gui is None: params.app_params.use_gui = False else: diff --git a/tmtccmd/core/frontend.py b/tmtccmd/core/frontend.py index c5d64953..39c86d37 100644 --- a/tmtccmd/core/frontend.py +++ b/tmtccmd/core/frontend.py @@ -23,13 +23,12 @@ QTableWidgetItem, QMenu, QAction, - QMenuBar, ) from PyQt5.QtGui import QPixmap, QIcon from PyQt5.QtCore import Qt, pyqtSignal, QObject, QThread, QRunnable from tmtccmd.config.globals import CoreGlobalIds -from tmtccmd.core import BackendController +from tmtccmd.core import BackendController, TmMode, TcMode from tmtccmd.core.frontend_base import FrontendBase from tmtccmd.core.ccsds_backend import CcsdsTmtcBackend from tmtccmd.config import ( @@ -79,7 +78,7 @@ class WorkerOperationsCodes(enum.IntEnum): DISCONNECT = 0 - SEQUENTIAL_COMMANDING = 1 + ONE_QUEUE_MODE = 1 LISTENING = 2 IDLE = 4 @@ -107,11 +106,10 @@ def run_worker(self): if not self.tmtc_handler.com_if_active(): break else: - time.sleep(0.4) + time.sleep(0.2) self.op_code = WorkerOperationsCodes.IDLE self.disconnected.emit() - elif op_code == WorkerOperationsCodes.SEQUENTIAL_COMMANDING: - self.tmtc_handler.one_shot_operation = True + elif op_code == WorkerOperationsCodes.ONE_QUEUE_MODE: # It is expected that the TMTC handler is in the according state to perform the # operation self.tmtc_handler.periodic_op(self.backend_ctrl) @@ -211,6 +209,14 @@ def __start_ui(self): self.__command_button.setEnabled(False) grid.addWidget(self.__command_button, row, 0, 1, 2) row += 1 + + self.__listener_button = QPushButton() + self.__listener_button.setText("Activate TM listener") + self.__listener_button.setStyleSheet(COMMAND_BUTTON_STYLE) + self.__listener_button.clicked.connect(self.__start_listener) + self.__command_button.setEnabled(False) + grid.addWidget(self.__listener_button, row, 0, 1, 2) + row += 1 self.show() def __start_seq_cmd_op(self): @@ -222,10 +228,14 @@ def __start_seq_cmd_op(self): self._tmtc_handler.current_proc_info = DefaultProcedureInfo( self._current_service, self._current_op_code ) - self._tmtc_handler.mode = CoreModeList.ONE_QUEUE_MODE - self.__worker.set_op_code(WorkerOperationsCodes.SEQUENTIAL_COMMANDING) + self._tmtc_handler.tc_mode = TcMode.IDLE + self._tmtc_handler.tm_mode = TmMode.LISTENER + self.__worker.set_op_code(WorkerOperationsCodes.ONE_QUEUE_MODE) self.__worker.command_executed.connect(self.__finish_seq_cmd_op) + def __start_listener(self): + pass + def __finish_seq_cmd_op(self): self.__set_send_button(True) @@ -333,13 +343,13 @@ def __set_up_config_section(self, grid: QGridLayout, row: int) -> int: def __set_up_com_if_section(self, grid: QGridLayout, row: int) -> int: grid.addWidget(QLabel("Communication Interface:"), row, 0, 1, 1) com_if_combo_box = QComboBox() - all_com_ifs = get_global(CoreGlobalIds.COM_IF_DICT) + all_com_ifs = self._hook_obj.get_com_if_dict() index = 0 # add all possible ComIFs to the comboBox - for com_if_key, com_if_value in all_com_ifs.items(): - com_if_combo_box.addItem(com_if_value) - self._com_if_list.append((com_if_key, com_if_value)) - if self._tmtc_handler.com_if_id() == com_if_key: + for id, com_if_value in all_com_ifs.items(): + com_if_combo_box.addItem(com_if_value[0]) + self._com_if_list.append((id, com_if_value[0])) + if self._tmtc_handler.com_if_id == id: com_if_combo_box.setCurrentIndex(index) index += 1 com_if_combo_box.currentIndexChanged.connect(self.__com_if_sel_index_changed) From 935f9b06a5864f3a9c51d861b5363c1545fbbd6a Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Sun, 26 Jun 2022 20:45:11 +0200 Subject: [PATCH 114/221] start fixing and refactoring frontend --- tmtccmd/core/ccsds_backend.py | 13 ++- tmtccmd/core/frontend.py | 164 ++++++++++++++++++++++------------ 2 files changed, 115 insertions(+), 62 deletions(-) diff --git a/tmtccmd/core/ccsds_backend.py b/tmtccmd/core/ccsds_backend.py index b3fb1d88..ab12c254 100644 --- a/tmtccmd/core/ccsds_backend.py +++ b/tmtccmd/core/ccsds_backend.py @@ -1,5 +1,6 @@ import atexit import sys +import threading from collections import deque from typing import Optional @@ -58,6 +59,7 @@ def __init__( tc_handler=tc_handler, queue_wrapper=self._queue_wrapper, ) + self._backend_lock: Optional[threading.Lock] = None atexit.register(keyboard_interrupt_handler, self) @property @@ -74,6 +76,10 @@ def com_if(self, com_if: ComInterface): return self.__com_if = com_if + @property + def state(self): + return self._state + @property def tc_mode(self): return self._state.mode_wrapper.tc_mode @@ -183,7 +189,7 @@ def default_operation(self): def mode_to_req(self): if self.tc_mode == TcMode.IDLE and self.tm_mode == TmMode.IDLE: self._state._req = Request.DELAY_IDLE - elif self.tm_mode == TmMode.LISTENER and self.tc_mode == CoreModeList.IDLE: + elif self.tm_mode == TmMode.LISTENER and self.tc_mode == TcMode.IDLE: self._state._req = Request.DELAY_LISTENER elif self._seq_handler.mode == SenderMode.DONE: if self._state.tc_mode == TcMode.ONE_QUEUE: @@ -213,9 +219,10 @@ def tm_operation(self): self.__tm_listener.operation() def tc_operation(self): - self.__check_and_execute_seq_send() + if self._state.tc_mode != TcMode.IDLE: + self.__check_and_execute_queue() - def __check_and_execute_seq_send(self): + def __check_and_execute_queue(self): if self._seq_handler.mode == SenderMode.DONE: queue = self.__prepare_tc_queue() if queue is None: diff --git a/tmtccmd/core/frontend.py b/tmtccmd/core/frontend.py index 39c86d37..3dc21a0b 100644 --- a/tmtccmd/core/frontend.py +++ b/tmtccmd/core/frontend.py @@ -4,6 +4,7 @@ import enum import os import sys +import threading import time import webbrowser from multiprocessing import Process @@ -28,7 +29,7 @@ from PyQt5.QtCore import Qt, pyqtSignal, QObject, QThread, QRunnable from tmtccmd.config.globals import CoreGlobalIds -from tmtccmd.core import BackendController, TmMode, TcMode +from tmtccmd.core import BackendController, TmMode, TcMode, Request from tmtccmd.core.frontend_base import FrontendBase from tmtccmd.core.ccsds_backend import CcsdsTmtcBackend from tmtccmd.config import ( @@ -79,52 +80,91 @@ class WorkerOperationsCodes(enum.IntEnum): DISCONNECT = 0 ONE_QUEUE_MODE = 1 - LISTENING = 2 + LISTEN_FOR_TM = 2 + UPDATE_BACKEND_MODE = 3 IDLE = 4 +class BackendWrapper: + def __init__(self, backend: CcsdsTmtcBackend): + self.ctrl = BackendController() + self.state_lock = threading.Lock() + self.tc_lock = threading.Lock() + self.backend = backend + + class WorkerThread(QObject): - disconnected = pyqtSignal() - command_executed = pyqtSignal() + finished = pyqtSignal() - def __init__(self, op_code: WorkerOperationsCodes, tmtc_handler: CcsdsTmtcBackend): + def __init__(self, op_code: WorkerOperationsCodes, backend_wrapper: BackendWrapper): super(QObject, self).__init__() - self.op_code = op_code - self.backend_ctrl = BackendController() - self.tmtc_handler = tmtc_handler - self.tmtc_handler.one_shot_operation = True - - def set_op_code(self, op_code: WorkerOperationsCodes): - self.op_code = op_code + self._op_code = op_code + self.finished = pyqtSignal() + self.stop_signal = False + self._backend_wrapper = backend_wrapper + + @property + def op_code(self): + return self._op_code + + @op_code.setter + def op_code(self, op_code): + self._op_code = op_code + + def __setup_worker(self): + self.stop_signal = True + if self.op_code == WorkerOperationsCodes.ONE_QUEUE_MODE: + with self._backend_wrapper.tc_lock: + self._backend_wrapper.backend.tc_mode = TcMode.ONE_QUEUE + elif self.op_code == WorkerOperationsCodes.LISTEN_FOR_TM: + self._backend_wrapper.backend.tm_mode = TmMode.LISTENER def run_worker(self): + self.__setup_worker() while True: op_code = self.op_code if op_code == WorkerOperationsCodes.DISCONNECT: - self.tmtc_handler.close_listener() + self._backend_wrapper.backend.close_listener() while True: - if not self.tmtc_handler.com_if_active(): + if not self._backend_wrapper.backend.com_if_active(): break else: time.sleep(0.2) self.op_code = WorkerOperationsCodes.IDLE - self.disconnected.emit() + self.finished.emit() + break elif op_code == WorkerOperationsCodes.ONE_QUEUE_MODE: - # It is expected that the TMTC handler is in the according state to perform the - # operation - self.tmtc_handler.periodic_op(self.backend_ctrl) - self.op_code = WorkerOperationsCodes.LISTENING - self.command_executed.emit() - elif op_code == WorkerOperationsCodes.LISTENING: - self.tmtc_handler.one_shot_operation = True - self.tmtc_handler.mode = CoreModeList.LISTENER_MODE - self.tmtc_handler.periodic_op(self.backend_ctrl) + self._backend_wrapper.tc_lock.acquire() + self._backend_wrapper.backend.tc_mode = TcMode.ONE_QUEUE + self._backend_wrapper.backend.tc_operation() + state = self._backend_wrapper.backend.state + if state.request == Request.TERMINATION_NO_ERROR: + self._backend_wrapper.tc_lock.release() + self.finished.emit() + break + elif state.request == Request.DELAY_CUSTOM: + self._backend_wrapper.tc_lock.release() + time.sleep(state.next_delay) + elif state.request == Request.CALL_NEXT: + self._backend_wrapper.tc_lock.release() + elif op_code == WorkerOperationsCodes.LISTEN_FOR_TM: + if not self.stop_signal: + # We only should run the TM operation here + self._backend_wrapper.backend.tm_operation() + else: + pass elif op_code == WorkerOperationsCodes.IDLE: - pass + break + elif op_code == WorkerOperationsCodes.UPDATE_BACKEND_MODE: + with self._backend_wrapper.state_lock: + self._backend_wrapper.backend.mode_to_req() else: # This must be a programming error LOGGER.error("Unknown worker operation code {0}!".format(self.op_code)) + def stop_operation(self): + self.stop_signal = True + class RunnableThread(QRunnable): """Runnable thread which can be used with QThreadPool. Not used for now, might be needed @@ -135,34 +175,35 @@ def run(self): pass +class FrontendState: + def __init__(self): + self.current_com_if = CoreComInterfaces.UNSPECIFIED.value + self.current_service = "" + self.current_op_code = "" + self.last_com_if = CoreComInterfaces.UNSPECIFIED.value + self.current_com_if_key = CoreComInterfaces.UNSPECIFIED.value + + class TmTcFrontend(QMainWindow, FrontendBase): def __init__( self, hook_obj: TmTcCfgHookBase, tmtc_backend: CcsdsTmtcBackend, app_name: str ): super(TmTcFrontend, self).__init__() super(QMainWindow, self).__init__() - self._tmtc_handler = tmtc_backend self._app_name = app_name + self._backend_wrapper = BackendWrapper(tmtc_backend) self._hook_obj = hook_obj self._service_list = [] self._op_code_list = [] self._com_if_list = [] self._service_op_code_dict = hook_obj.get_tmtc_definitions() - self._last_com_if = CoreComInterfaces.UNSPECIFIED.value - self._current_com_if = CoreComInterfaces.UNSPECIFIED.value - self._current_service = "" - self._current_op_code = "" - self._current_com_if_key = "unspec" + self._state = FrontendState() self.__connected = False - - self.__worker = None - self.__thread = None self.__debug_mode = True self.__combo_box_op_codes: Union[None, QComboBox] = None module_path = os.path.abspath(config_module.__file__).replace("__init__.py", "") self.logo_path = f"{module_path}/logo.png" - self.__start_qthread_task(WorkerOperationsCodes.LISTENING) def prepare_start(self, args: any) -> Process: return Process(target=self.start) @@ -214,7 +255,7 @@ def __start_ui(self): self.__listener_button.setText("Activate TM listener") self.__listener_button.setStyleSheet(COMMAND_BUTTON_STYLE) self.__listener_button.clicked.connect(self.__start_listener) - self.__command_button.setEnabled(False) + self.__listener_button.setEnabled(False) grid.addWidget(self.__listener_button, row, 0, 1, 2) row += 1 self.show() @@ -224,32 +265,37 @@ def __start_seq_cmd_op(self): LOGGER.info("Send command button pressed.") if not self.__get_send_button(): return - self.__set_send_button(False) - self._tmtc_handler.current_proc_info = DefaultProcedureInfo( + self.__disable_send_button() + self._backend_wrapper.backend.current_proc_info = DefaultProcedureInfo( self._current_service, self._current_op_code ) - self._tmtc_handler.tc_mode = TcMode.IDLE - self._tmtc_handler.tm_mode = TmMode.LISTENER - self.__worker.set_op_code(WorkerOperationsCodes.ONE_QUEUE_MODE) - self.__worker.command_executed.connect(self.__finish_seq_cmd_op) + self._backend_wrapper.backend.tc_mode = TcMode.ONE_QUEUE + worker = self.__get_worker(WorkerOperationsCodes.ONE_QUEUE_MODE) + worker.finished.connect(self.__finish_seq_cmd_op) def __start_listener(self): pass def __finish_seq_cmd_op(self): - self.__set_send_button(True) + self.__enable_send_button() + + def __get_worker(self, op_code: WorkerOperationsCodes) -> QThread: + thread = QThread() + worker = WorkerThread(op_code, self._backend_wrapper) + worker.moveToThread(thread) + thread.started.connect(worker.run_worker) + return thread def __connect_button_action(self): if not self.__connected: LOGGER.info("Starting TM listener..") # Build and assign new communication interface - if self._current_com_if != self._last_com_if: - hook_obj = get_global_hook_obj() - new_com_if = hook_obj.assign_communication_interface( + if self._state.current_com_if != self._state.last_com_if: + new_com_if = self._hook_obj.assign_communication_interface( com_if_key=self._current_com_if ) self._last_com_if = self._current_com_if - self._tmtc_handler.com_if = new_com_if + self._backend_wrapper.backend.com_if = new_com_if LOGGER.info("Starting listener") self.__connect_button.setStyleSheet(DISCONNECT_BTTN_STYLE) self.__command_button.setEnabled(True) @@ -259,7 +305,6 @@ def __connect_button_action(self): LOGGER.info("Closing TM listener..") self.__command_button.setEnabled(False) self.__connect_button.setEnabled(False) - self.__worker.set_op_code(WorkerOperationsCodes.DISCONNECT) def __finish_disconnect_button_op(self): self.__connect_button.setEnabled(True) @@ -349,7 +394,7 @@ def __set_up_com_if_section(self, grid: QGridLayout, row: int) -> int: for id, com_if_value in all_com_ifs.items(): com_if_combo_box.addItem(com_if_value[0]) self._com_if_list.append((id, com_if_value[0])) - if self._tmtc_handler.com_if_id == id: + if self._backend_wrapper.backend.com_if_id == id: com_if_combo_box.setCurrentIndex(index) index += 1 com_if_combo_box.currentIndexChanged.connect(self.__com_if_sel_index_changed) @@ -429,14 +474,6 @@ def __set_up_pixmap(self, grid: QGridLayout, row: int) -> int: row += 1 return row - def __start_qthread_task(self, op_code: WorkerOperationsCodes): - self.__thread = QThread() - self.__worker = WorkerThread(op_code=op_code, tmtc_handler=self._tmtc_handler) - self.__worker.moveToThread(self.__thread) - self.__thread.started.connect(self.__worker.run_worker) - self.__thread.start() - self.__worker.disconnected.connect(self.__finish_disconnect_button_op) - @staticmethod def __add_vertical_separator(grid: QGridLayout, row: int): separator = QFrame() @@ -484,8 +521,17 @@ def __checkbox_print_raw_data_update(self, state: int): if self.__debug_mode: LOGGER.info(["enabled", "disabled"][state == 0] + " printing of raw data") - def __set_send_button(self, state: bool): - self.__command_button.setEnabled(state) + def __enable_send_button(self): + self.__command_button.setEnabled(True) + + def __disable_send_button(self): + self.__command_button.setDisabled(True) + + def __enable_listener_button(self): + self.__listener_button.setEnabled(True) + + def __disable_listener_button(self): + self.__listener_button.setDisabled(True) def __get_send_button(self): return self.__command_button.isEnabled() From ac72f5d27cd80bd0a5d49c632d70f6e743991ecf Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 27 Jun 2022 00:47:02 +0200 Subject: [PATCH 115/221] simplified com if handling --- tmtccmd/__init__.py | 16 ++----- tmtccmd/core/__init__.py | 7 ++- tmtccmd/core/ccsds_backend.py | 30 ++++--------- tmtccmd/core/frontend.py | 75 +++++++++++++++------------------ tmtccmd/tm/ccsds_tm_listener.py | 14 +----- tmtccmd/utility/exit_handler.py | 2 +- 6 files changed, 54 insertions(+), 90 deletions(-) diff --git a/tmtccmd/__init__.py b/tmtccmd/__init__.py index c99f01de..3444dc7c 100644 --- a/tmtccmd/__init__.py +++ b/tmtccmd/__init__.py @@ -96,13 +96,6 @@ def start( __start_tmtc_commander_cli(tmtc_backend=tmtc_backend) -def init_and_start_daemons(tmtc_backend: BackendBase): - if __SETUP_FOR_GUI: - LOGGER.error("daemon mode only supported in cli mode") - sys.exit(1) - __start_tmtc_commander_cli(tmtc_backend=tmtc_backend, perform_op_immediately=False) - - def __assign_tmtc_commander_hooks(hook_object: TmTcCfgHookBase): from tmtccmd.config.globals import CoreGlobalIds @@ -125,11 +118,8 @@ def __handle_cli_args_and_globals(setup_args: SetupWrapper): LOGGER.info("Setting up post-globals..") -def __start_tmtc_commander_cli( - tmtc_backend: BackendBase, perform_op_immediately: bool = True -): - # __get_backend_init_variables() - tmtc_backend.start_listener(perform_op_immediately) +def __start_tmtc_commander_cli(tmtc_backend: BackendBase): + tmtc_backend.open_com_if() def __start_tmtc_commander_qt_gui( @@ -189,7 +179,7 @@ def create_default_tmtc_backend( com_if = setup_wrapper.hook_obj.assign_communication_interface( com_if_key=setup_wrapper.params.com_if_id ) - tm_listener = CcsdsTmListener(com_if=com_if, tm_handler=tm_handler) + tm_listener = CcsdsTmListener(tm_handler) mode_wrapper = ModeWrapper() backend_mode_conversion(setup_wrapper.params.mode, mode_wrapper) # The global variables are set by the argument parser. diff --git a/tmtccmd/core/__init__.py b/tmtccmd/core/__init__.py index 9bbdbd48..e1d6b325 100644 --- a/tmtccmd/core/__init__.py +++ b/tmtccmd/core/__init__.py @@ -75,8 +75,13 @@ def __init__(self): class BackendBase: @abstractmethod - def start_listener(self, perform_op_immediately: bool): + def open_com_if(self): """Start the backend. Raise RuntimeError on failure""" + pass + + @abstractmethod + def close_com_if(self): + pass @abstractmethod def periodic_op(self, ctrl: BackendController) -> BackendState: diff --git a/tmtccmd/core/ccsds_backend.py b/tmtccmd/core/ccsds_backend.py index ab12c254..e88c2f3a 100644 --- a/tmtccmd/core/ccsds_backend.py +++ b/tmtccmd/core/ccsds_backend.py @@ -4,7 +4,7 @@ from collections import deque from typing import Optional -from tmtccmd.config import CoreServiceList, CoreModeList +from tmtccmd.config import CoreServiceList from tmtccmd.core import ( BackendBase, BackendState, @@ -70,12 +70,6 @@ def com_if_id(self): def com_if(self) -> ComInterface: return self.__com_if - @com_if.setter - def com_if(self, com_if: ComInterface): - if self.__com_if_active: - return - self.__com_if = com_if - @property def state(self): return self._state @@ -108,15 +102,12 @@ def tm_mode(self, tm_mode: TmMode): def tm_listener(self): return self.__tm_listener - def try_set_com_if(self, com_if: ComInterface): + def try_set_com_if(self, com_if: ComInterface) -> bool: if not self.com_if_active(): self.__com_if = com_if - self.__tm_listener.com_if(self.__com_if) + return True else: - LOGGER.warning( - "Communication Interface is active and must be closed first before " - "reassigning a new one" - ) + return False def com_if_active(self): return self.__com_if_active @@ -134,7 +125,7 @@ def start_handler(executed_handler, ctrl: BackendController): if not isinstance(executed_handler, CcsdsTmtcBackend): LOGGER.error("Unexpected argument, should be TmTcHandler!") sys.exit(1) - executed_handler.start_listener(ctrl) + executed_handler.open_com_if() def __listener_io_error_handler(self, ctx: str): LOGGER.error(f"Communication Interface could not be {ctx}") @@ -144,14 +135,14 @@ def __listener_io_error_handler(self, ctx: str): self.__com_if.close() sys.exit(1) - def start_listener(self, ctrl: BackendController): + def open_com_if(self): try: self.__com_if.open() except IOError: self.__listener_io_error_handler("opened") self.__com_if_active = True - def close_listener(self): + def close_com_if(self): """Closes the TM listener and the communication interface. This is started in a separarate thread because the communication interface might still be busy. The completion can be checked with :meth:`tmtccmd.core.backend.is_com_if_active`. Alternatively, waiting on @@ -207,16 +198,13 @@ def mode_to_req(self): else: self._state._request = Request.CALL_NEXT - def close_com_if(self): - self.__com_if.close() - def poll_tm(self): """Poll TM, irrespective of current TM mode""" - self.__tm_listener.operation() + self.__tm_listener.operation(self.__com_if) def tm_operation(self): if self._state.tm_mode == TmMode.LISTENER: - self.__tm_listener.operation() + self.__tm_listener.operation(self.__com_if) def tc_operation(self): if self._state.tc_mode != TcMode.IDLE: diff --git a/tmtccmd/core/frontend.py b/tmtccmd/core/frontend.py index 3dc21a0b..cc4b227e 100644 --- a/tmtccmd/core/frontend.py +++ b/tmtccmd/core/frontend.py @@ -26,7 +26,15 @@ QAction, ) from PyQt5.QtGui import QPixmap, QIcon -from PyQt5.QtCore import Qt, pyqtSignal, QObject, QThread, QRunnable +from PyQt5.QtCore import ( + Qt, + pyqtSignal, + QObject, + QThread, + QRunnable, + pyqtSlot, + QThreadPool, +) from tmtccmd.config.globals import CoreGlobalIds from tmtccmd.core import BackendController, TmMode, TcMode, Request @@ -93,36 +101,34 @@ def __init__(self, backend: CcsdsTmtcBackend): self.backend = backend -class WorkerThread(QObject): +class WorkerSignalWrapper(QObject): finished = pyqtSignal() - def __init__(self, op_code: WorkerOperationsCodes, backend_wrapper: BackendWrapper): - super(QObject, self).__init__() - self._op_code = op_code - self.finished = pyqtSignal() - self.stop_signal = False - self._backend_wrapper = backend_wrapper - @property - def op_code(self): - return self._op_code +class FrontendWorker(QRunnable): + """Runnable thread which can be used with QThreadPool. Not used for now, might be needed + in the future. + """ - @op_code.setter - def op_code(self, op_code): + def __init__(self, op_code: WorkerOperationsCodes, backend_wrapper: BackendWrapper): + super(QRunnable, self).__init__() self._op_code = op_code + self._backend_wrapper = backend_wrapper + self.signals = WorkerSignalWrapper() def __setup_worker(self): self.stop_signal = True - if self.op_code == WorkerOperationsCodes.ONE_QUEUE_MODE: + if self._op_code == WorkerOperationsCodes.ONE_QUEUE_MODE: with self._backend_wrapper.tc_lock: self._backend_wrapper.backend.tc_mode = TcMode.ONE_QUEUE - elif self.op_code == WorkerOperationsCodes.LISTEN_FOR_TM: + elif self._op_code == WorkerOperationsCodes.LISTEN_FOR_TM: self._backend_wrapper.backend.tm_mode = TmMode.LISTENER - def run_worker(self): + @pyqtSlot() + def run(self): self.__setup_worker() while True: - op_code = self.op_code + op_code = self._op_code if op_code == WorkerOperationsCodes.DISCONNECT: self._backend_wrapper.backend.close_listener() while True: @@ -130,8 +136,8 @@ def run_worker(self): break else: time.sleep(0.2) - self.op_code = WorkerOperationsCodes.IDLE - self.finished.emit() + self._op_code = WorkerOperationsCodes.IDLE + self.signals.finished.emit() break elif op_code == WorkerOperationsCodes.ONE_QUEUE_MODE: self._backend_wrapper.tc_lock.acquire() @@ -140,7 +146,7 @@ def run_worker(self): state = self._backend_wrapper.backend.state if state.request == Request.TERMINATION_NO_ERROR: self._backend_wrapper.tc_lock.release() - self.finished.emit() + self.signals.finished.emit() break elif state.request == Request.DELAY_CUSTOM: self._backend_wrapper.tc_lock.release() @@ -160,19 +166,7 @@ def run_worker(self): self._backend_wrapper.backend.mode_to_req() else: # This must be a programming error - LOGGER.error("Unknown worker operation code {0}!".format(self.op_code)) - - def stop_operation(self): - self.stop_signal = True - - -class RunnableThread(QRunnable): - """Runnable thread which can be used with QThreadPool. Not used for now, might be needed - in the future. - """ - - def run(self): - pass + LOGGER.error("Unknown worker operation code {0}!".format(self._op_code)) class FrontendState: @@ -198,6 +192,7 @@ def __init__( self._com_if_list = [] self._service_op_code_dict = hook_obj.get_tmtc_definitions() self._state = FrontendState() + self._thread_pool = QThreadPool() self.__connected = False self.__debug_mode = True @@ -270,8 +265,11 @@ def __start_seq_cmd_op(self): self._current_service, self._current_op_code ) self._backend_wrapper.backend.tc_mode = TcMode.ONE_QUEUE - worker = self.__get_worker(WorkerOperationsCodes.ONE_QUEUE_MODE) - worker.finished.connect(self.__finish_seq_cmd_op) + worker = FrontendWorker( + WorkerOperationsCodes.ONE_QUEUE_MODE, self._backend_wrapper + ) + worker.signals.finished.connect(self.__finish_seq_cmd_op) + self._thread_pool.start(worker) def __start_listener(self): pass @@ -279,13 +277,6 @@ def __start_listener(self): def __finish_seq_cmd_op(self): self.__enable_send_button() - def __get_worker(self, op_code: WorkerOperationsCodes) -> QThread: - thread = QThread() - worker = WorkerThread(op_code, self._backend_wrapper) - worker.moveToThread(thread) - thread.started.connect(worker.run_worker) - return thread - def __connect_button_action(self): if not self.__connected: LOGGER.info("Starting TM listener..") diff --git a/tmtccmd/tm/ccsds_tm_listener.py b/tmtccmd/tm/ccsds_tm_listener.py index 2d1fb190..488aa75e 100644 --- a/tmtccmd/tm/ccsds_tm_listener.py +++ b/tmtccmd/tm/ccsds_tm_listener.py @@ -25,7 +25,6 @@ class CcsdsTmListener: def __init__( self, - com_if: ComInterface, tm_handler: CcsdsTmHandler, ): """Initiate a TM listener. @@ -34,19 +33,10 @@ def __init__( :param tm_handler: If valid CCSDS packets are found, they are dispatched to the passed handler """ - self.__com_if = com_if self.__tm_handler = tm_handler - @property - def com_if(self): - return self.__com_if - - @com_if.setter - def com_if(self, com_if: ComInterface): - self.__com_if = com_if - - def operation(self) -> int: - packet_list = self.__com_if.receive() + def operation(self, com_if: ComInterface) -> int: + packet_list = com_if.receive() for tm_packet in packet_list: self.__handle_ccsds_space_packet(tm_packet) return len(packet_list) diff --git a/tmtccmd/utility/exit_handler.py b/tmtccmd/utility/exit_handler.py index 81d625af..bda813ac 100644 --- a/tmtccmd/utility/exit_handler.py +++ b/tmtccmd/utility/exit_handler.py @@ -6,7 +6,7 @@ def keyboard_interrupt_handler(tmtc_backend: CcsdsTmtcBackend): - tmtc_backend.close_listener() + tmtc_backend.open_com_if() LOGGER.info("Closing TMTC client") From 76856a30f774cb7522d05fac8d82a729d1882320 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 27 Jun 2022 11:04:51 +0200 Subject: [PATCH 116/221] threadpool appears to work --- tmtccmd/core/frontend.py | 308 ++++++++++++++++++++++++++++----------- 1 file changed, 225 insertions(+), 83 deletions(-) diff --git a/tmtccmd/core/frontend.py b/tmtccmd/core/frontend.py index cc4b227e..45c818f8 100644 --- a/tmtccmd/core/frontend.py +++ b/tmtccmd/core/frontend.py @@ -8,7 +8,7 @@ import time import webbrowser from multiprocessing import Process -from typing import Union +from typing import Union, Callable from PyQt5.QtWidgets import ( QMainWindow, @@ -30,7 +30,6 @@ Qt, pyqtSignal, QObject, - QThread, QRunnable, pyqtSlot, QThreadPool, @@ -42,8 +41,6 @@ from tmtccmd.core.ccsds_backend import CcsdsTmtcBackend from tmtccmd.config import ( TmTcCfgHookBase, - get_global_hook_obj, - CoreModeList, CoreComInterfaces, ) from tmtccmd.logging import get_console_logger @@ -86,23 +83,55 @@ class WorkerOperationsCodes(enum.IntEnum): - DISCONNECT = 0 - ONE_QUEUE_MODE = 1 - LISTEN_FOR_TM = 2 - UPDATE_BACKEND_MODE = 3 - IDLE = 4 + OPEN_COM_IF = 0 + CLOSE_COM_IF = 1 + ONE_QUEUE_MODE = 2 + LISTEN_FOR_TM = 3 + UPDATE_BACKEND_MODE = 4 + IDLE = 5 -class BackendWrapper: +class ComIfRefCount: + def __init__(self): + self.lock = threading.Lock() + self.com_if_used = False + self.user_cnt = 0 + + def add_user(self): + with self.lock: + self.user_cnt += 1 + + def remove_user(self): + with self.lock: + if self.user_cnt > 0: + self.user_cnt -= 1 + + def is_used(self): + with self.lock: + if self.user_cnt > 0: + return True + return False + + +class LocalArgs: + def __init__(self, op_code: WorkerOperationsCodes, op_code_args: any = None): + self.op_code = op_code + self.op_args = op_code_args + + +class SharedArgs: def __init__(self, backend: CcsdsTmtcBackend): self.ctrl = BackendController() self.state_lock = threading.Lock() + self.com_if_ref_tracker = ComIfRefCount() self.tc_lock = threading.Lock() self.backend = backend class WorkerSignalWrapper(QObject): finished = pyqtSignal() + failure = pyqtSignal(str) + stop = pyqtSignal() class FrontendWorker(QRunnable): @@ -110,63 +139,99 @@ class FrontendWorker(QRunnable): in the future. """ - def __init__(self, op_code: WorkerOperationsCodes, backend_wrapper: BackendWrapper): + def __init__(self, local_args: LocalArgs, shared_args: SharedArgs): super(QRunnable, self).__init__() - self._op_code = op_code - self._backend_wrapper = backend_wrapper + self._locals = local_args + self._shared = shared_args self.signals = WorkerSignalWrapper() - - def __setup_worker(self): - self.stop_signal = True - if self._op_code == WorkerOperationsCodes.ONE_QUEUE_MODE: - with self._backend_wrapper.tc_lock: - self._backend_wrapper.backend.tc_mode = TcMode.ONE_QUEUE - elif self._op_code == WorkerOperationsCodes.LISTEN_FOR_TM: - self._backend_wrapper.backend.tm_mode = TmMode.LISTENER + self._stop_signal = False + self.signals.stop.connect(self._stop_com_if) + + def __sanitize_locals(self): + if self._locals.op_code == WorkerOperationsCodes.LISTEN_FOR_TM: + if self._locals.op_args is None or not isinstance( + float, self._locals.op_args + ): + self._locals.op_args = 0.2 + + def __setup_worker(self) -> bool: + self._stop_signal = True + if self._locals.op_code == WorkerOperationsCodes.CLOSE_COM_IF: + if self._shared.com_if_ref_tracker.is_used(): + self.signals.failure.emit("Can not close COM interface which is used") + return False + if self._locals.op_code == WorkerOperationsCodes.ONE_QUEUE_MODE: + self._shared.com_if_ref_tracker.add_user() + with self._shared.tc_lock: + self._shared.backend.tc_mode = TcMode.ONE_QUEUE + elif self._locals.op_code == WorkerOperationsCodes.LISTEN_FOR_TM: + self._shared.com_if_ref_tracker.add_user() + with self._shared.state_lock: + if not self._shared.com_if_used: + self._shared.com_if_used = True + self._shared.backend.tm_mode = TmMode.LISTENER + return True @pyqtSlot() def run(self): - self.__setup_worker() + if not self.__setup_worker(): + return while True: - op_code = self._op_code - if op_code == WorkerOperationsCodes.DISCONNECT: - self._backend_wrapper.backend.close_listener() + op_code = self._locals.op_code + if op_code == WorkerOperationsCodes.OPEN_COM_IF: + if self._shared.backend.com_if_active(): + break + else: + self._shared.backend.open_com_if() + self.signals.finished.emit() + elif op_code == WorkerOperationsCodes.CLOSE_COM_IF: + self._shared.backend.close_com_if() + # TODO: Maybe there will be cases where closing a COM IF takes time and success + # must be tracked by polling the COM IF / Backend while True: - if not self._backend_wrapper.backend.com_if_active(): + if not self._shared.backend.com_if_active(): break else: + # The sleep duration was sanitized before and should be a valid float now time.sleep(0.2) - self._op_code = WorkerOperationsCodes.IDLE self.signals.finished.emit() break elif op_code == WorkerOperationsCodes.ONE_QUEUE_MODE: - self._backend_wrapper.tc_lock.acquire() - self._backend_wrapper.backend.tc_mode = TcMode.ONE_QUEUE - self._backend_wrapper.backend.tc_operation() - state = self._backend_wrapper.backend.state + self._shared.tc_lock.acquire() + self._shared.backend.tc_mode = TcMode.ONE_QUEUE + self._shared.backend.tc_operation() + state = self._shared.backend.state if state.request == Request.TERMINATION_NO_ERROR: - self._backend_wrapper.tc_lock.release() + self._shared.tc_lock.release() + self._shared.com_if_ref_tracker.remove_user() self.signals.finished.emit() break elif state.request == Request.DELAY_CUSTOM: - self._backend_wrapper.tc_lock.release() + self._shared.tc_lock.release() + self._update_backend_mode() time.sleep(state.next_delay) elif state.request == Request.CALL_NEXT: - self._backend_wrapper.tc_lock.release() + self._shared.tc_lock.release() elif op_code == WorkerOperationsCodes.LISTEN_FOR_TM: - if not self.stop_signal: + if not self._stop_signal: # We only should run the TM operation here - self._backend_wrapper.backend.tm_operation() + self._shared.backend.tm_operation() + # Poll TM every 400 ms for now + time.sleep(self._locals.op_args) else: - pass + self._shared.com_if_ref_tracker.remove_user() elif op_code == WorkerOperationsCodes.IDLE: break - elif op_code == WorkerOperationsCodes.UPDATE_BACKEND_MODE: - with self._backend_wrapper.state_lock: - self._backend_wrapper.backend.mode_to_req() else: # This must be a programming error - LOGGER.error("Unknown worker operation code {0}!".format(self._op_code)) + LOGGER.error(f"Unknown worker operation code {self._locals.op_code}") + + def _update_backend_mode(self): + with self._shared.state_lock: + self._shared.backend.mode_to_req() + + def _stop_com_if(self): + self._stop_signal = True class FrontendState: @@ -178,6 +243,92 @@ def __init__(self): self.current_com_if_key = CoreComInterfaces.UNSPECIFIED.value +class ButtonArgs: + def __init__( + self, + state: FrontendState, + pool: QThreadPool, + shared: SharedArgs, + ): + self.state = state + self.pool = pool + self.shared = shared + + +class ConnectButtonWrapper: + def __init__( + self, + button: QPushButton, + args: ButtonArgs, + hook_obj: TmTcCfgHookBase, + connect_cb: Callable[[], None], + disconnect_cb: Callable[[], None], + ): + self.button = button + self.args = args + self.hook_obj = hook_obj + self._connected = False + self._next_con_state = False + self.button.clicked.connect(self._button_op) + self._connect_cb = connect_cb + self._disconnect_cb = disconnect_cb + + def _button_op(self): + if not self._connected: + self._connect_button_pressed() + else: + self._disconnect_button_pressed() + + def _connect_button_pressed(self): + LOGGER.info("Opening COM Interface") + # Build and assign new communication interface + if self.args.state.current_com_if != self.args.state.last_com_if: + LOGGER.info("Switching COM Interface") + new_com_if = self.hook_obj.assign_communication_interface( + com_if_key=self.args.state.current_com_if + ) + self.args.state.last_com_if = self.args.state.current_com_if + self.args.shared.backend.try_set_com_if(new_com_if) + self.button.setEnabled(False) + worker = FrontendWorker( + LocalArgs(WorkerOperationsCodes.OPEN_COM_IF, None), self.args.shared + ) + self._next_con_state = True + worker.signals.finished.connect(self._button_op_done) + # TODO: Connect failure signal as well + self.args.pool.start(worker) + + def _button_op_done(self): + if self._next_con_state: + self._connect_button_finished() + else: + self._disconnect_button_finished() + self._connected = self._next_con_state + + def _connect_button_finished(self): + self.button.setStyleSheet(DISCONNECT_BTTN_STYLE) + self.button.setText("Disconnect") + self.button.setEnabled(True) + self._connect_cb() + LOGGER.info("Connected") + + def _disconnect_button_pressed(self): + self.button.setEnabled(False) + self._next_con_state = False + worker = FrontendWorker( + LocalArgs(WorkerOperationsCodes.CLOSE_COM_IF, None), self.args.shared + ) + worker.signals.finished.connect(self._button_op_done) + self.args.pool.start(worker) + + def _disconnect_button_finished(self): + self.button.setEnabled(True) + self.button.setStyleSheet(CONNECT_BTTN_STYLE) + self.button.setText("Connect") + self._disconnect_cb() + LOGGER.info("Disconnected") + + class TmTcFrontend(QMainWindow, FrontendBase): def __init__( self, hook_obj: TmTcCfgHookBase, tmtc_backend: CcsdsTmtcBackend, app_name: str @@ -185,7 +336,7 @@ def __init__( super(TmTcFrontend, self).__init__() super(QMainWindow, self).__init__() self._app_name = app_name - self._backend_wrapper = BackendWrapper(tmtc_backend) + self._shared_args = SharedArgs(tmtc_backend) self._hook_obj = hook_obj self._service_list = [] self._op_code_list = [] @@ -233,7 +384,9 @@ def __start_ui(self): row = self.__add_vertical_separator(grid=grid, row=row) # com if configuration - row = self.__set_up_com_if_section(grid=grid, row=row) + row, self.__connect_button_wrapper = self.__set_up_com_if_section( + grid=grid, row=row + ) row = self.__add_vertical_separator(grid=grid, row=row) row = self.__set_up_service_op_code_section(grid=grid, row=row) @@ -261,13 +414,15 @@ def __start_seq_cmd_op(self): if not self.__get_send_button(): return self.__disable_send_button() - self._backend_wrapper.backend.current_proc_info = DefaultProcedureInfo( + self._shared_args.backend.current_proc_info = DefaultProcedureInfo( self._current_service, self._current_op_code ) - self._backend_wrapper.backend.tc_mode = TcMode.ONE_QUEUE + self._shared_args.backend.tc_mode = TcMode.ONE_QUEUE worker = FrontendWorker( - WorkerOperationsCodes.ONE_QUEUE_MODE, self._backend_wrapper + LocalArgs(WorkerOperationsCodes.ONE_QUEUE_MODE, None), self._shared_args ) + # We need to call this stop signal on a button press.. + # worker.signals.stop.emit() worker.signals.finished.connect(self.__finish_seq_cmd_op) self._thread_pool.start(worker) @@ -277,34 +432,6 @@ def __start_listener(self): def __finish_seq_cmd_op(self): self.__enable_send_button() - def __connect_button_action(self): - if not self.__connected: - LOGGER.info("Starting TM listener..") - # Build and assign new communication interface - if self._state.current_com_if != self._state.last_com_if: - new_com_if = self._hook_obj.assign_communication_interface( - com_if_key=self._current_com_if - ) - self._last_com_if = self._current_com_if - self._backend_wrapper.backend.com_if = new_com_if - LOGGER.info("Starting listener") - self.__connect_button.setStyleSheet(DISCONNECT_BTTN_STYLE) - self.__command_button.setEnabled(True) - self.__connect_button.setText("Disconnect") - self.__connected = True - else: - LOGGER.info("Closing TM listener..") - self.__command_button.setEnabled(False) - self.__connect_button.setEnabled(False) - - def __finish_disconnect_button_op(self): - self.__connect_button.setEnabled(True) - # self.__disconnect_button.setEnabled(False) - self.__connect_button.setStyleSheet(CONNECT_BTTN_STYLE) - self.__connect_button.setText("Connect") - LOGGER.info("Disconnect successfull") - self.__connected = False - def __create_menu_bar(self): menu_bar = self.menuBar() # Creating menus using a QMenu object @@ -376,7 +503,9 @@ def __set_up_config_section(self, grid: QGridLayout, row: int) -> int: row += 1 return row - def __set_up_com_if_section(self, grid: QGridLayout, row: int) -> int: + def __set_up_com_if_section( + self, grid: QGridLayout, row: int + ) -> (int, ConnectButtonWrapper): grid.addWidget(QLabel("Communication Interface:"), row, 0, 1, 1) com_if_combo_box = QComboBox() all_com_ifs = self._hook_obj.get_com_if_dict() @@ -385,7 +514,7 @@ def __set_up_com_if_section(self, grid: QGridLayout, row: int) -> int: for id, com_if_value in all_com_ifs.items(): com_if_combo_box.addItem(com_if_value[0]) self._com_if_list.append((id, com_if_value[0])) - if self._backend_wrapper.backend.com_if_id == id: + if self._shared_args.backend.com_if_id == id: com_if_combo_box.setCurrentIndex(index) index += 1 com_if_combo_box.currentIndexChanged.connect(self.__com_if_sel_index_changed) @@ -397,14 +526,27 @@ def __set_up_com_if_section(self, grid: QGridLayout, row: int) -> int: grid.addWidget(self.com_if_cfg_button, row, 0, 1, 2) row += 1 - self.__connect_button = QPushButton() - self.__connect_button.setText("Connect") - self.__connect_button.setStyleSheet(CONNECT_BTTN_STYLE) - self.__connect_button.clicked.connect(self.__connect_button_action) - - grid.addWidget(self.__connect_button, row, 0, 1, 2) + connect_button = QPushButton() + connect_button.setText("Connect") + connect_button.setStyleSheet(CONNECT_BTTN_STYLE) + conn_bttn_wrapper = ConnectButtonWrapper( + hook_obj=self._hook_obj, + button=connect_button, + args=ButtonArgs(self._state, self._thread_pool, self._shared_args), + connect_cb=self.__connected_com_if_cb, + disconnect_cb=self.__disconnect_com_if_cb, + ) + grid.addWidget(connect_button, row, 0, 1, 2) row += 1 - return row + return row, conn_bttn_wrapper + + def __connected_com_if_cb(self): + self.__enable_send_button() + self.__enable_listener_button() + + def __disconnect_com_if_cb(self): + self.__disable_send_button() + self.__disable_listener_button() def __set_up_service_op_code_section(self, grid: QGridLayout, row: int): grid.addWidget(QLabel("Service: "), row, 0, 1, 2) From 32389a338f89789d1a3363db2e1ae381267aaf43 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 27 Jun 2022 11:33:28 +0200 Subject: [PATCH 117/221] continue listen TM button --- tmtccmd/core/ccsds_backend.py | 6 ++-- tmtccmd/core/frontend.py | 64 ++++++++++++++++++++++++----------- 2 files changed, 48 insertions(+), 22 deletions(-) diff --git a/tmtccmd/core/ccsds_backend.py b/tmtccmd/core/ccsds_backend.py index e88c2f3a..7292c79d 100644 --- a/tmtccmd/core/ccsds_backend.py +++ b/tmtccmd/core/ccsds_backend.py @@ -184,7 +184,7 @@ def mode_to_req(self): self._state._req = Request.DELAY_LISTENER elif self._seq_handler.mode == SenderMode.DONE: if self._state.tc_mode == TcMode.ONE_QUEUE: - self._state.mode_wrapper.tc_mode = TcMode.IDLE + self.tc_mode = TcMode.IDLE self._state._req = Request.TERMINATION_NO_ERROR elif self._state.tc_mode == TcMode.MULTI_QUEUE: self._state.mode_wrapper.tc_mode = TcMode.IDLE @@ -194,9 +194,9 @@ def mode_to_req(self): self._state._recommended_delay = ( self._state.sender_res.longest_rem_delay ) - self._state._request = Request.DELAY_CUSTOM + self._state._req = Request.DELAY_CUSTOM else: - self._state._request = Request.CALL_NEXT + self._state._req = Request.CALL_NEXT def poll_tm(self): """Poll TM, irrespective of current TM mode""" diff --git a/tmtccmd/core/frontend.py b/tmtccmd/core/frontend.py index 45c818f8..16d40bec 100644 --- a/tmtccmd/core/frontend.py +++ b/tmtccmd/core/frontend.py @@ -8,7 +8,7 @@ import time import webbrowser from multiprocessing import Process -from typing import Union, Callable +from typing import Union, Callable, Optional from PyQt5.QtWidgets import ( QMainWindow, @@ -166,9 +166,6 @@ def __setup_worker(self) -> bool: self._shared.backend.tc_mode = TcMode.ONE_QUEUE elif self._locals.op_code == WorkerOperationsCodes.LISTEN_FOR_TM: self._shared.com_if_ref_tracker.add_user() - with self._shared.state_lock: - if not self._shared.com_if_used: - self._shared.com_if_used = True self._shared.backend.tm_mode = TmMode.LISTENER return True @@ -198,8 +195,8 @@ def run(self): break elif op_code == WorkerOperationsCodes.ONE_QUEUE_MODE: self._shared.tc_lock.acquire() - self._shared.backend.tc_mode = TcMode.ONE_QUEUE self._shared.backend.tc_operation() + self._update_backend_mode() state = self._shared.backend.state if state.request == Request.TERMINATION_NO_ERROR: self._shared.tc_lock.release() @@ -208,7 +205,7 @@ def run(self): break elif state.request == Request.DELAY_CUSTOM: self._shared.tc_lock.release() - self._update_backend_mode() + time.sleep(state.next_delay) elif state.request == Request.CALL_NEXT: self._shared.tc_lock.release() @@ -329,6 +326,34 @@ def _disconnect_button_finished(self): LOGGER.info("Disconnected") +class TmButtonWrapper: + def __init__(self, button: QPushButton, args: ButtonArgs): + self.button = button + self.args = args + self.worker: Optional[QRunnable] = None + self._listening = False + self._next_listener_state = False + self.button.clicked.connect(self.button_op) + + def button_op(self): + if not self._listening: + self.worker = FrontendWorker( + LocalArgs(WorkerOperationsCodes.LISTEN_FOR_TM, 0.4), self.args.shared + ) + self._next_listener_state = True + + self.args.pool.start(self.worker) + else: + self.worker.signals.stop.emit() + self.worker.signals.finished.connect(self.button_op_done) + + def button_op_done(self): + if self._next_listener_state: + self._listening = True + else: + self._listening = False + + class TmTcFrontend(QMainWindow, FrontendBase): def __init__( self, hook_obj: TmTcCfgHookBase, tmtc_backend: CcsdsTmtcBackend, app_name: str @@ -399,12 +424,18 @@ def __start_ui(self): grid.addWidget(self.__command_button, row, 0, 1, 2) row += 1 - self.__listener_button = QPushButton() - self.__listener_button.setText("Activate TM listener") - self.__listener_button.setStyleSheet(COMMAND_BUTTON_STYLE) - self.__listener_button.clicked.connect(self.__start_listener) - self.__listener_button.setEnabled(False) - grid.addWidget(self.__listener_button, row, 0, 1, 2) + listener_button = QPushButton() + listener_button.setText("Activate TM listener") + listener_button.setStyleSheet(COMMAND_BUTTON_STYLE) + listener_button.setEnabled(False) + self.__tm_button_wrapper = TmButtonWrapper( + button=listener_button, + args=ButtonArgs( + state=self._state, pool=self._thread_pool, shared=self._shared_args + ), + ) + + grid.addWidget(listener_button, row, 0, 1, 2) row += 1 self.show() @@ -417,18 +448,13 @@ def __start_seq_cmd_op(self): self._shared_args.backend.current_proc_info = DefaultProcedureInfo( self._current_service, self._current_op_code ) - self._shared_args.backend.tc_mode = TcMode.ONE_QUEUE worker = FrontendWorker( LocalArgs(WorkerOperationsCodes.ONE_QUEUE_MODE, None), self._shared_args ) - # We need to call this stop signal on a button press.. # worker.signals.stop.emit() worker.signals.finished.connect(self.__finish_seq_cmd_op) self._thread_pool.start(worker) - def __start_listener(self): - pass - def __finish_seq_cmd_op(self): self.__enable_send_button() @@ -661,10 +687,10 @@ def __disable_send_button(self): self.__command_button.setDisabled(True) def __enable_listener_button(self): - self.__listener_button.setEnabled(True) + self.__tm_button_wrapper.button.setEnabled(True) def __disable_listener_button(self): - self.__listener_button.setDisabled(True) + self.__tm_button_wrapper.button.setDisabled(True) def __get_send_button(self): return self.__command_button.isEnabled() From a3f8b7f00763c07d29d6b7dc7eed7c034d5abe77 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 27 Jun 2022 14:28:15 +0200 Subject: [PATCH 118/221] core logic works now --- tmtccmd/core/frontend.py | 199 ++++++++++++++++++++++++--------------- 1 file changed, 125 insertions(+), 74 deletions(-) diff --git a/tmtccmd/core/frontend.py b/tmtccmd/core/frontend.py index 16d40bec..87072e85 100644 --- a/tmtccmd/core/frontend.py +++ b/tmtccmd/core/frontend.py @@ -25,7 +25,7 @@ QMenu, QAction, ) -from PyQt5.QtGui import QPixmap, QIcon +from PyQt5.QtGui import QPixmap, QIcon, QFont from PyQt5.QtCore import ( Qt, pyqtSignal, @@ -129,9 +129,9 @@ def __init__(self, backend: CcsdsTmtcBackend): class WorkerSignalWrapper(QObject): - finished = pyqtSignal() - failure = pyqtSignal(str) - stop = pyqtSignal() + finished = pyqtSignal(object) + failure = pyqtSignal(object) + stop = pyqtSignal(object) class FrontendWorker(QRunnable): @@ -154,80 +154,94 @@ def __sanitize_locals(self): ): self._locals.op_args = 0.2 - def __setup_worker(self) -> bool: - self._stop_signal = True - if self._locals.op_code == WorkerOperationsCodes.CLOSE_COM_IF: - if self._shared.com_if_ref_tracker.is_used(): - self.signals.failure.emit("Can not close COM interface which is used") - return False - if self._locals.op_code == WorkerOperationsCodes.ONE_QUEUE_MODE: + def __setup(self, op_code: WorkerOperationsCodes) -> bool: + if op_code == WorkerOperationsCodes.OPEN_COM_IF: + if self._shared.backend.com_if_active(): + self._finish_with_info("COM Interface is already active") + else: + self._shared.backend.open_com_if() + self._finish_success() + return False + if op_code == WorkerOperationsCodes.CLOSE_COM_IF: + if not self._shared.backend.com_if_active(): + self._finish_with_info("COM Interface is not active") + elif self._shared.com_if_ref_tracker.is_used(): + self._failure_with_info("Can not close COM interface which is used") + else: + self._shared.backend.close_com_if() + self._finish_success() + return False + if op_code == WorkerOperationsCodes.ONE_QUEUE_MODE: self._shared.com_if_ref_tracker.add_user() with self._shared.tc_lock: self._shared.backend.tc_mode = TcMode.ONE_QUEUE - elif self._locals.op_code == WorkerOperationsCodes.LISTEN_FOR_TM: + elif op_code == WorkerOperationsCodes.LISTEN_FOR_TM: self._shared.com_if_ref_tracker.add_user() self._shared.backend.tm_mode = TmMode.LISTENER return True + def __loop(self, op_code: WorkerOperationsCodes) -> bool: + if op_code == WorkerOperationsCodes.ONE_QUEUE_MODE: + self._shared.tc_lock.acquire() + self._shared.backend.tc_operation() + self._update_backend_mode() + state = self._shared.backend.state + if state.request == Request.TERMINATION_NO_ERROR: + self._shared.tc_lock.release() + self._shared.com_if_ref_tracker.remove_user() + with self._shared.state_lock: + if ( + not self._shared.com_if_ref_tracker.is_used() + and self._locals.op_args is not None + ): + self._locals.op_args() + self._finish_success() + return False + elif state.request == Request.DELAY_CUSTOM: + self._shared.tc_lock.release() + time.sleep(state.next_delay) + elif state.request == Request.CALL_NEXT: + self._shared.tc_lock.release() + elif op_code == WorkerOperationsCodes.LISTEN_FOR_TM: + if not self._stop_signal: + # We only should run the TM operation here + self._shared.backend.tm_operation() + # Poll TM every 400 ms for now + time.sleep(self._locals.op_args) + else: + self._shared.com_if_ref_tracker.remove_user() + self._finish_success() + return False + elif op_code == WorkerOperationsCodes.IDLE: + return False + else: + # This must be a programming error + LOGGER.error(f"Unknown worker operation code {self._locals.op_code}") + return True + @pyqtSlot() def run(self): - if not self.__setup_worker(): - return - while True: - op_code = self._locals.op_code - if op_code == WorkerOperationsCodes.OPEN_COM_IF: - if self._shared.backend.com_if_active(): + op_code = self._locals.op_code + loop_required = self.__setup(op_code) + if loop_required: + while True: + if not self.__loop(op_code): break - else: - self._shared.backend.open_com_if() - self.signals.finished.emit() - elif op_code == WorkerOperationsCodes.CLOSE_COM_IF: - self._shared.backend.close_com_if() - # TODO: Maybe there will be cases where closing a COM IF takes time and success - # must be tracked by polling the COM IF / Backend - while True: - if not self._shared.backend.com_if_active(): - break - else: - # The sleep duration was sanitized before and should be a valid float now - time.sleep(0.2) - self.signals.finished.emit() - break - elif op_code == WorkerOperationsCodes.ONE_QUEUE_MODE: - self._shared.tc_lock.acquire() - self._shared.backend.tc_operation() - self._update_backend_mode() - state = self._shared.backend.state - if state.request == Request.TERMINATION_NO_ERROR: - self._shared.tc_lock.release() - self._shared.com_if_ref_tracker.remove_user() - self.signals.finished.emit() - break - elif state.request == Request.DELAY_CUSTOM: - self._shared.tc_lock.release() - - time.sleep(state.next_delay) - elif state.request == Request.CALL_NEXT: - self._shared.tc_lock.release() - elif op_code == WorkerOperationsCodes.LISTEN_FOR_TM: - if not self._stop_signal: - # We only should run the TM operation here - self._shared.backend.tm_operation() - # Poll TM every 400 ms for now - time.sleep(self._locals.op_args) - else: - self._shared.com_if_ref_tracker.remove_user() - elif op_code == WorkerOperationsCodes.IDLE: - break - else: - # This must be a programming error - LOGGER.error(f"Unknown worker operation code {self._locals.op_code}") + + def _finish_success(self): + self.signals.finished.emit(None) + + def _finish_with_info(self, info: str): + self.signals.finished.emit(info) + + def _failure_with_info(self, info: str): + self.signals.failure.emit(info) def _update_backend_mode(self): with self._shared.state_lock: self._shared.backend.mode_to_req() - def _stop_com_if(self): + def _stop_com_if(self, _args: any): self._stop_signal = True @@ -327,31 +341,48 @@ def _disconnect_button_finished(self): class TmButtonWrapper: - def __init__(self, button: QPushButton, args: ButtonArgs): + def __init__(self, button: QPushButton, args: ButtonArgs, conn_button: QPushButton): self.button = button self.args = args self.worker: Optional[QRunnable] = None self._listening = False self._next_listener_state = False + self.button.setStyleSheet(CONNECT_BTTN_STYLE) + self.button.setText("Start TM listener") + self.button.setEnabled(False) self.button.clicked.connect(self.button_op) + self._conn_button = conn_button def button_op(self): if not self._listening: + LOGGER.info("Starting TM listener") self.worker = FrontendWorker( LocalArgs(WorkerOperationsCodes.LISTEN_FOR_TM, 0.4), self.args.shared ) self._next_listener_state = True - + self._conn_button.setDisabled(True) self.args.pool.start(self.worker) + self.button_op_done() else: - self.worker.signals.stop.emit() - self.worker.signals.finished.connect(self.button_op_done) + LOGGER.info("Stopping TM listener") + self._next_listener_state = False + self.worker.signals.finished.connect(self.button_op_done) + self.worker.signals.stop.emit(None) + self.button.setEnabled(False) def button_op_done(self): if self._next_listener_state: + self.button.setStyleSheet(DISCONNECT_BTTN_STYLE) + self.button.setText("Stop TM listener") self._listening = True + self.button.setEnabled(True) else: + self.button.setStyleSheet(CONNECT_BTTN_STYLE) + if not self.args.shared.com_if_ref_tracker.is_used(): + self._conn_button.setEnabled(True) + self.button.setText("Start TM listener") self._listening = False + self.button.setEnabled(True) class TmTcFrontend(QMainWindow, FrontendBase): @@ -414,6 +445,12 @@ def __start_ui(self): ) row = self.__add_vertical_separator(grid=grid, row=row) + tmtc_ctrl_label = QLabel("TMTC Control") + font = QFont() + font.setBold(True) + tmtc_ctrl_label.setFont(font) + grid.addWidget(tmtc_ctrl_label, row, 0, 1, 2) + row += 1 row = self.__set_up_service_op_code_section(grid=grid, row=row) self.__command_button = QPushButton() @@ -425,14 +462,12 @@ def __start_ui(self): row += 1 listener_button = QPushButton() - listener_button.setText("Activate TM listener") - listener_button.setStyleSheet(COMMAND_BUTTON_STYLE) - listener_button.setEnabled(False) self.__tm_button_wrapper = TmButtonWrapper( button=listener_button, args=ButtonArgs( state=self._state, pool=self._thread_pool, shared=self._shared_args ), + conn_button=self.__connect_button_wrapper.button, ) grid.addWidget(listener_button, row, 0, 1, 2) @@ -457,6 +492,8 @@ def __start_seq_cmd_op(self): def __finish_seq_cmd_op(self): self.__enable_send_button() + if not self._shared_args.com_if_ref_tracker.is_used(): + self.__connect_button_wrapper.button.setEnabled(True) def __create_menu_bar(self): menu_bar = self.menuBar() @@ -475,7 +512,11 @@ def __help_url(): webbrowser.open("https://tmtccmd.readthedocs.io/en/latest/") def __set_up_config_section(self, grid: QGridLayout, row: int) -> int: - grid.addWidget(QLabel("Configuration:"), row, 0, 1, 2) + label = QLabel("Configuration") + font = QFont() + font.setBold(True) + label.setFont(font) + grid.addWidget(label, row, 0, 1, 2) row += 1 checkbox_console = QCheckBox("Print output to console") checkbox_console.stateChanged.connect(self.__checkbox_console_update) @@ -532,7 +573,11 @@ def __set_up_config_section(self, grid: QGridLayout, row: int) -> int: def __set_up_com_if_section( self, grid: QGridLayout, row: int ) -> (int, ConnectButtonWrapper): - grid.addWidget(QLabel("Communication Interface:"), row, 0, 1, 1) + font = QFont() + font.setBold(True) + label = QLabel("Communication Interface") + label.setFont(font) + grid.addWidget(label, row, 0, 1, 1) com_if_combo_box = QComboBox() all_com_ifs = self._hook_obj.get_com_if_dict() index = 0 @@ -566,9 +611,15 @@ def __set_up_com_if_section( row += 1 return row, conn_bttn_wrapper + def __disable_conn_bttn(self): + self.__connect_button_wrapper.button.setDisabled(True) + + def __enable_conn_bttn(self): + self.__connect_button_wrapper.button.setEnabled(True) + def __connected_com_if_cb(self): self.__enable_send_button() - self.__enable_listener_button() + self.__enable_listener_button(None) def __disconnect_com_if_cb(self): self.__disable_send_button() @@ -686,7 +737,7 @@ def __enable_send_button(self): def __disable_send_button(self): self.__command_button.setDisabled(True) - def __enable_listener_button(self): + def __enable_listener_button(self, _args: any): self.__tm_button_wrapper.button.setEnabled(True) def __disable_listener_button(self): From 9ebccd64818333950baaf6af6404dbcc34fd771e Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 27 Jun 2022 14:43:06 +0200 Subject: [PATCH 119/221] fixed and simplifications for GUI --- tests/test_seq_sender.py | 4 +- tmtccmd/core/frontend.py | 111 +++++++++++++++++++-------------------- 2 files changed, 55 insertions(+), 60 deletions(-) diff --git a/tests/test_seq_sender.py b/tests/test_seq_sender.py index 4c1e7801..d5e45b46 100644 --- a/tests/test_seq_sender.py +++ b/tests/test_seq_sender.py @@ -31,7 +31,7 @@ def test_basic(self): tc_handler_mock.send_cb.assert_called_with(ANY, com_if) call_args = tc_handler_mock.send_cb.call_args print(call_args) - self.assertEqual(call_args.args[0].tc, bytes([0, 1, 2])) + self.assertEqual(call_args._args[0].tc, bytes([0, 1, 2])) # Queue should be empty now self.assertFalse(queue_wrapper.queue) self.assertEqual(seq_sender.mode, SenderMode.DONE) @@ -44,4 +44,4 @@ def test_basic(self): self.assertEqual(res.mode, SenderMode.BUSY) tc_handler_mock.send_cb.assert_called_with(ANY, com_if) call_args = tc_handler_mock.send_cb.call_args - self.assertEqual(call_args.args[0].tc, bytes([3, 2, 1])) + self.assertEqual(call_args._args[0].tc, bytes([3, 2, 1])) diff --git a/tmtccmd/core/frontend.py b/tmtccmd/core/frontend.py index 87072e85..2d880e2e 100644 --- a/tmtccmd/core/frontend.py +++ b/tmtccmd/core/frontend.py @@ -385,6 +385,36 @@ def button_op_done(self): self.button.setEnabled(True) +class SendButtonWrapper: + def __init__(self, button: QPushButton, args: ButtonArgs, conn_button: QPushButton): + self.button = button + self._args = args + self._conn_button = conn_button + self.debug_mode = False + self.button.setText("Send Command") + self.button.setStyleSheet(COMMAND_BUTTON_STYLE) + self.button.setEnabled(False) + self.button.clicked.connect(self._button_op) + + def _button_op(self): + if self.debug_mode: + LOGGER.info("Send command button pressed.") + self.button.setDisabled(True) + self._args.shared.backend.current_proc_info = DefaultProcedureInfo( + self._args.state.current_service, self._args.state.current_op_code + ) + worker = FrontendWorker( + LocalArgs(WorkerOperationsCodes.ONE_QUEUE_MODE, None), self._args.shared + ) + worker.signals.finished.connect(self._finish_op) + self._args.pool.start(worker) + + def _finish_op(self): + self.button.setEnabled(True) + if not self._args.shared.com_if_ref_tracker.is_used(): + self._conn_button.setEnabled(True) + + class TmTcFrontend(QMainWindow, FrontendBase): def __init__( self, hook_obj: TmTcCfgHookBase, tmtc_backend: CcsdsTmtcBackend, app_name: str @@ -453,48 +483,26 @@ def __start_ui(self): row += 1 row = self.__set_up_service_op_code_section(grid=grid, row=row) - self.__command_button = QPushButton() - self.__command_button.setText("Send Command") - self.__command_button.setStyleSheet(COMMAND_BUTTON_STYLE) - self.__command_button.clicked.connect(self.__start_seq_cmd_op) - self.__command_button.setEnabled(False) - grid.addWidget(self.__command_button, row, 0, 1, 2) + button_args = ButtonArgs( + state=self._state, pool=self._thread_pool, shared=self._shared_args + ) + self.__send_bttn_wrapper = SendButtonWrapper( + button=QPushButton(), + args=button_args, + conn_button=self.__connect_button_wrapper.button, + ) + grid.addWidget(self.__send_bttn_wrapper.button, row, 0, 1, 2) row += 1 - listener_button = QPushButton() self.__tm_button_wrapper = TmButtonWrapper( - button=listener_button, - args=ButtonArgs( - state=self._state, pool=self._thread_pool, shared=self._shared_args - ), + button=QPushButton(), + args=button_args, conn_button=self.__connect_button_wrapper.button, ) - - grid.addWidget(listener_button, row, 0, 1, 2) + grid.addWidget(self.__tm_button_wrapper.button, row, 0, 1, 2) row += 1 self.show() - def __start_seq_cmd_op(self): - if self.__debug_mode: - LOGGER.info("Send command button pressed.") - if not self.__get_send_button(): - return - self.__disable_send_button() - self._shared_args.backend.current_proc_info = DefaultProcedureInfo( - self._current_service, self._current_op_code - ) - worker = FrontendWorker( - LocalArgs(WorkerOperationsCodes.ONE_QUEUE_MODE, None), self._shared_args - ) - # worker.signals.stop.emit() - worker.signals.finished.connect(self.__finish_seq_cmd_op) - self._thread_pool.start(worker) - - def __finish_seq_cmd_op(self): - self.__enable_send_button() - if not self._shared_args.com_if_ref_tracker.is_used(): - self.__connect_button_wrapper.button.setEnabled(True) - def __create_menu_bar(self): menu_bar = self.menuBar() # Creating menus using a QMenu object @@ -618,12 +626,12 @@ def __enable_conn_bttn(self): self.__connect_button_wrapper.button.setEnabled(True) def __connected_com_if_cb(self): - self.__enable_send_button() - self.__enable_listener_button(None) + self.__send_bttn_wrapper.button.setEnabled(True) + self.__tm_button_wrapper.button.setEnabled(True) def __disconnect_com_if_cb(self): - self.__disable_send_button() - self.__disable_listener_button() + self.__send_bttn_wrapper.button.setDisabled(True) + self.__tm_button_wrapper.button.setDisabled(True) def __set_up_service_op_code_section(self, grid: QGridLayout, row: int): grid.addWidget(QLabel("Service: "), row, 0, 1, 2) @@ -648,13 +656,13 @@ def __set_up_service_op_code_section(self, grid: QGridLayout, row: int): self._service_list.append(service_key) index += 1 combo_box_services.setCurrentIndex(default_index) - self._current_service = self._service_list[default_index] + self._state.current_service = self._service_list[default_index] combo_box_services.currentIndexChanged.connect(self.__service_index_changed) grid.addWidget(combo_box_services, row, 0, 1, 1) self.__combo_box_op_codes = QComboBox() - self._current_service = self._service_list[default_index] + self._state.current_service = self._service_list[default_index] self.__update_op_code_combo_box() self.__combo_box_op_codes.currentIndexChanged.connect( self.__op_code_index_changed @@ -699,14 +707,16 @@ def __service_index_changed(self, index: int): LOGGER.info("Service changed") def __op_code_index_changed(self, index: int): - self._current_op_code = self._op_code_list[index] + self._state.current_op_code = self._op_code_list[index] if self.__debug_mode: LOGGER.info("Op Code changed") def __update_op_code_combo_box(self): self.__combo_box_op_codes.clear() self._op_code_list = [] - op_code_entry = self._service_op_code_dict.op_code_entry(self._current_service) + op_code_entry = self._service_op_code_dict.op_code_entry( + self._state.current_service + ) if op_code_entry is not None: for op_code_key, op_code_value in op_code_entry.op_code_dict.items(): try: @@ -714,7 +724,7 @@ def __update_op_code_combo_box(self): self.__combo_box_op_codes.addItem(op_code_value[0]) except TypeError: LOGGER.warning(f"Invalid op code entry {op_code_value}, skipping..") - self._current_op_code = self._op_code_list[0] + self._state.current_op_code = self._op_code_list[0] def __checkbox_log_update(self, state: int): update_global(CoreGlobalIds.PRINT_TO_FILE, state) @@ -731,21 +741,6 @@ def __checkbox_print_raw_data_update(self, state: int): if self.__debug_mode: LOGGER.info(["enabled", "disabled"][state == 0] + " printing of raw data") - def __enable_send_button(self): - self.__command_button.setEnabled(True) - - def __disable_send_button(self): - self.__command_button.setDisabled(True) - - def __enable_listener_button(self, _args: any): - self.__tm_button_wrapper.button.setEnabled(True) - - def __disable_listener_button(self): - self.__tm_button_wrapper.button.setDisabled(True) - - def __get_send_button(self): - return self.__command_button.isEnabled() - def __com_if_sel_index_changed(self, index: int): self._current_com_if = self._com_if_list[index][0] if self.__debug_mode: From 7bf8b660f7dd607b1fe20a7267169962d325c9c1 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 27 Jun 2022 15:26:20 +0200 Subject: [PATCH 120/221] auto-connect for tm listener working --- tmtccmd/__init__.py | 4 +- tmtccmd/core/ccsds_backend.py | 3 +- tmtccmd/core/frontend_base.py | 10 -- tmtccmd/{core/frontend.py => gui/__init__.py} | 130 +++++++++--------- tmtccmd/tc/ccsds_seq_sender.py | 1 + tmtccmd/tc/queue.py | 11 +- 6 files changed, 82 insertions(+), 77 deletions(-) delete mode 100644 tmtccmd/core/frontend_base.py rename tmtccmd/{core/frontend.py => gui/__init__.py} (90%) diff --git a/tmtccmd/__init__.py b/tmtccmd/__init__.py index 3444dc7c..b36f8faf 100644 --- a/tmtccmd/__init__.py +++ b/tmtccmd/__init__.py @@ -7,7 +7,7 @@ from tmtccmd.tm.ccsds_tm_listener import CcsdsTmListener from tmtccmd.config import TmTcCfgHookBase, backend_mode_conversion, SetupWrapper from tmtccmd.core.ccsds_backend import BackendBase -from tmtccmd.core.frontend_base import FrontendBase +from tmtccmd.gui import FrontendBase from tmtccmd.tm import TmTypes, TmHandlerBase from tmtccmd.ccsds.handler import CcsdsTmHandler from tmtccmd.core.globals_manager import update_global @@ -137,7 +137,7 @@ def __start_tmtc_commander_qt_gui( sys.exit(1) app = QApplication([app_name]) if tmtc_frontend is None: - from tmtccmd.core.frontend import TmTcFrontend + from tmtccmd.gui import TmTcFrontend from tmtccmd.core.ccsds_backend import CcsdsTmtcBackend tmtc_frontend = TmTcFrontend( diff --git a/tmtccmd/core/ccsds_backend.py b/tmtccmd/core/ccsds_backend.py index 7292c79d..d5bc2510 100644 --- a/tmtccmd/core/ccsds_backend.py +++ b/tmtccmd/core/ccsds_backend.py @@ -53,7 +53,7 @@ def __init__( CoreServiceList.SERVICE_17.value, "0" ) self.exit_on_com_if_init_failure = True - self._queue_wrapper = QueueWrapper(deque()) + self._queue_wrapper = QueueWrapper(None, deque()) self._seq_handler = SequentialCcsdsSender( com_if=self.__com_if, tc_handler=tc_handler, @@ -223,6 +223,7 @@ def __check_and_execute_queue(self): def __prepare_tc_queue(self, auto_dispatch: bool = True) -> Optional[QueueWrapper]: feed_wrapper = FeedWrapper(self._queue_wrapper, auto_dispatch) self.__tc_handler.feed_cb(self.current_proc_info, feed_wrapper) + self._queue_wrapper.info = self.current_proc_info if not self.__com_if.valid or not feed_wrapper.dispatch_next_queue: return None return feed_wrapper.queue_helper.queue_wrapper diff --git a/tmtccmd/core/frontend_base.py b/tmtccmd/core/frontend_base.py deleted file mode 100644 index ee16796a..00000000 --- a/tmtccmd/core/frontend_base.py +++ /dev/null @@ -1,10 +0,0 @@ -from abc import abstractmethod - - -class FrontendBase: - @abstractmethod - def start(self, args: any): - """ - Start the frontend. - :return: - """ diff --git a/tmtccmd/core/frontend.py b/tmtccmd/gui/__init__.py similarity index 90% rename from tmtccmd/core/frontend.py rename to tmtccmd/gui/__init__.py index 2d880e2e..fa41bfb5 100644 --- a/tmtccmd/core/frontend.py +++ b/tmtccmd/gui/__init__.py @@ -7,6 +7,7 @@ import threading import time import webbrowser +from abc import abstractmethod from multiprocessing import Process from typing import Union, Callable, Optional @@ -37,7 +38,6 @@ from tmtccmd.config.globals import CoreGlobalIds from tmtccmd.core import BackendController, TmMode, TcMode, Request -from tmtccmd.core.frontend_base import FrontendBase from tmtccmd.core.ccsds_backend import CcsdsTmtcBackend from tmtccmd.config import ( TmTcCfgHookBase, @@ -52,6 +52,15 @@ LOGGER = get_console_logger() +class FrontendBase: + @abstractmethod + def start(self, args: any): + """ + Start the frontend. + :return: + """ + + CONNECT_BTTN_STYLE = ( "background-color: #1fc600;" "border-style: inset;" @@ -250,6 +259,7 @@ def __init__(self): self.current_com_if = CoreComInterfaces.UNSPECIFIED.value self.current_service = "" self.current_op_code = "" + self.auto_connect_tm_listener = True self.last_com_if = CoreComInterfaces.UNSPECIFIED.value self.current_com_if_key = CoreComInterfaces.UNSPECIFIED.value @@ -266,23 +276,30 @@ def __init__( self.shared = shared -class ConnectButtonWrapper: +class ConnectButtonParams: def __init__( self, - button: QPushButton, - args: ButtonArgs, hook_obj: TmTcCfgHookBase, connect_cb: Callable[[], None], disconnect_cb: Callable[[], None], + tm_listener_bttn: Optional[QPushButton], ): - self.button = button - self.args = args self.hook_obj = hook_obj + self.connect_cb = connect_cb + self.disconnect_cb = disconnect_cb + self.tm_listener_bttn = tm_listener_bttn + + +class ConnectButtonWrapper: + def __init__( + self, button: QPushButton, args: ButtonArgs, bttn_params: ConnectButtonParams + ): + self.button = button + self._args = args + self._bttn_params = bttn_params self._connected = False self._next_con_state = False self.button.clicked.connect(self._button_op) - self._connect_cb = connect_cb - self._disconnect_cb = disconnect_cb def _button_op(self): if not self._connected: @@ -293,21 +310,21 @@ def _button_op(self): def _connect_button_pressed(self): LOGGER.info("Opening COM Interface") # Build and assign new communication interface - if self.args.state.current_com_if != self.args.state.last_com_if: + if self._args.state.current_com_if != self._args.state.last_com_if: LOGGER.info("Switching COM Interface") - new_com_if = self.hook_obj.assign_communication_interface( - com_if_key=self.args.state.current_com_if + new_com_if = self._bttn_params.hook_obj.assign_communication_interface( + com_if_key=self._args.state.current_com_if ) - self.args.state.last_com_if = self.args.state.current_com_if - self.args.shared.backend.try_set_com_if(new_com_if) + self._args.state.last_com_if = self._args.state.current_com_if + self._args.shared.backend.try_set_com_if(new_com_if) self.button.setEnabled(False) worker = FrontendWorker( - LocalArgs(WorkerOperationsCodes.OPEN_COM_IF, None), self.args.shared + LocalArgs(WorkerOperationsCodes.OPEN_COM_IF, None), self._args.shared ) self._next_con_state = True worker.signals.finished.connect(self._button_op_done) # TODO: Connect failure signal as well - self.args.pool.start(worker) + self._args.pool.start(worker) def _button_op_done(self): if self._next_con_state: @@ -320,23 +337,28 @@ def _connect_button_finished(self): self.button.setStyleSheet(DISCONNECT_BTTN_STYLE) self.button.setText("Disconnect") self.button.setEnabled(True) - self._connect_cb() + self._bttn_params.connect_cb() + if ( + self._args.state.auto_connect_tm_listener + and self._bttn_params.tm_listener_bttn is not None + ): + self._bttn_params.tm_listener_bttn.click() LOGGER.info("Connected") def _disconnect_button_pressed(self): self.button.setEnabled(False) self._next_con_state = False worker = FrontendWorker( - LocalArgs(WorkerOperationsCodes.CLOSE_COM_IF, None), self.args.shared + LocalArgs(WorkerOperationsCodes.CLOSE_COM_IF, None), self._args.shared ) worker.signals.finished.connect(self._button_op_done) - self.args.pool.start(worker) + self._args.pool.start(worker) def _disconnect_button_finished(self): self.button.setEnabled(True) self.button.setStyleSheet(CONNECT_BTTN_STYLE) self.button.setText("Connect") - self._disconnect_cb() + self._bttn_params.disconnect_cb() LOGGER.info("Disconnected") @@ -469,9 +491,16 @@ def __start_ui(self): row = self.__set_up_config_section(grid=grid, row=row) row = self.__add_vertical_separator(grid=grid, row=row) + tm_listener_button = QPushButton() + conn_bttn_params = ConnectButtonParams( + hook_obj=self._hook_obj, + connect_cb=self.__connected_com_if_cb, + disconnect_cb=self.__disconnect_com_if_cb, + tm_listener_bttn=tm_listener_button, + ) # com if configuration row, self.__connect_button_wrapper = self.__set_up_com_if_section( - grid=grid, row=row + conn_bttn_params=conn_bttn_params, grid=grid, row=row ) row = self.__add_vertical_separator(grid=grid, row=row) @@ -495,7 +524,7 @@ def __start_ui(self): row += 1 self.__tm_button_wrapper = TmButtonWrapper( - button=QPushButton(), + button=tm_listener_button, args=button_args, conn_button=self.__connect_button_wrapper.button, ) @@ -526,60 +555,39 @@ def __set_up_config_section(self, grid: QGridLayout, row: int) -> int: label.setFont(font) grid.addWidget(label, row, 0, 1, 2) row += 1 - checkbox_console = QCheckBox("Print output to console") - checkbox_console.stateChanged.connect(self.__checkbox_console_update) - - checkbox_log = QCheckBox("Print output to log file") - checkbox_log.stateChanged.connect(self.__checkbox_log_update) - - checkbox_raw_tm = QCheckBox("Print all raw TM data directly") - checkbox_raw_tm.stateChanged.connect(self.__checkbox_print_raw_data_update) - checkbox_hk = QCheckBox("Print Housekeeping Data") - # checkbox_hk.setChecked(tmtcc_config.G_PRINT_HK_DATA) - checkbox_hk.stateChanged.connect(checkbox_print_hk_data) - - checkbox_short = QCheckBox("Short Display Mode") - # checkbox_short.setChecked(tmtcc_config.G_DISPLAY_MODE == "short") - checkbox_short.stateChanged.connect(checkbox_short_display_mode) - - grid.addWidget(checkbox_log, row, 0, 1, 1) - grid.addWidget(checkbox_console, row, 1, 1, 1) - row += 1 - grid.addWidget(checkbox_raw_tm, row, 0, 1, 1) - grid.addWidget(checkbox_hk, row, 1, 1, 1) - row += 1 - grid.addWidget(checkbox_short, row, 0, 1, 1) + start_listener_on_connect = QCheckBox("Auto-Connect TM listener") + start_listener_on_connect.setChecked(True) + start_listener_on_connect.stateChanged.connect( + lambda: self._tm_auto_connect_changed(start_listener_on_connect) + ) + grid.addWidget(start_listener_on_connect, row, 0, 1, 1) row += 1 - grid.addWidget(QLabel("TM Timeout:"), row, 0, 1, 1) - grid.addWidget(QLabel("TM Timeout Factor:"), row, 1, 1, 1) + grid.addWidget(QLabel("Inter-Packet Delay Seconds [0 - 500]"), row, 0, 1, 2) row += 1 spin_timeout = QDoubleSpinBox() - spin_timeout.setValue(4) + spin_timeout.setValue(0.1) # TODO: set sensible min/max values spin_timeout.setSingleStep(0.1) - spin_timeout.setMinimum(0.25) - spin_timeout.setMaximum(60) + spin_timeout.setMinimum(0.0) + spin_timeout.setMaximum(500.0) # https://youtrack.jetbrains.com/issue/PY-22908 # Ignore those warnings for now. spin_timeout.valueChanged.connect(number_timeout) grid.addWidget(spin_timeout, row, 0, 1, 1) - - spin_timeout_factor = QDoubleSpinBox() - # spin_timeout_factor.setValue(tmtcc_config.G_TC_SEND_TIMEOUT_FACTOR) - # TODO: set sensible min/max values - spin_timeout_factor.setSingleStep(0.1) - spin_timeout_factor.setMinimum(0.25) - spin_timeout_factor.setMaximum(10) - spin_timeout_factor.valueChanged.connect(number_timeout_factor) - grid.addWidget(spin_timeout_factor, row, 1, 1, 1) row += 1 return row + def _tm_auto_connect_changed(self, box: QCheckBox): + if box.isChecked(): + self._state.auto_connect_tm_listener = True + else: + self._state.auto_connect_tm_listener = False + def __set_up_com_if_section( - self, grid: QGridLayout, row: int + self, conn_bttn_params: ConnectButtonParams, grid: QGridLayout, row: int ) -> (int, ConnectButtonWrapper): font = QFont() font.setBold(True) @@ -609,11 +617,9 @@ def __set_up_com_if_section( connect_button.setText("Connect") connect_button.setStyleSheet(CONNECT_BTTN_STYLE) conn_bttn_wrapper = ConnectButtonWrapper( - hook_obj=self._hook_obj, button=connect_button, args=ButtonArgs(self._state, self._thread_pool, self._shared_args), - connect_cb=self.__connected_com_if_cb, - disconnect_cb=self.__disconnect_com_if_cb, + bttn_params=conn_bttn_params, ) grid.addWidget(connect_button, row, 0, 1, 2) row += 1 diff --git a/tmtccmd/tc/ccsds_seq_sender.py b/tmtccmd/tc/ccsds_seq_sender.py index c89388bb..8a6cccec 100644 --- a/tmtccmd/tc/ccsds_seq_sender.py +++ b/tmtccmd/tc/ccsds_seq_sender.py @@ -91,6 +91,7 @@ def _handle_current_tc_queue(self): if not self.queue_wrapper.queue: if self.no_delay_remaining(): # cache this for last wait time + self._tc_handler.queue_finished_cb(self._queue_wrapper.info) self._mode = SenderMode.DONE return else: diff --git a/tmtccmd/tc/queue.py b/tmtccmd/tc/queue.py index 15202982..d78a1bf6 100644 --- a/tmtccmd/tc/queue.py +++ b/tmtccmd/tc/queue.py @@ -10,17 +10,24 @@ WaitEntry, SpacePacketEntry, PacketDelayEntry, + TcProcedureBase, ) class QueueWrapper: - def __init__(self, queue: Optional[QueueDequeT], inter_cmd_delay: float = 0.0): + def __init__( + self, + info: Optional[TcProcedureBase], + queue: Optional[QueueDequeT], + inter_cmd_delay: float = 0.0, + ): + self.info = info self.queue = queue self.inter_cmd_delay = inter_cmd_delay def __repr__(self): return ( - f"{self.__class__.__name__}(queue={self.queue!r}, " + f"{self.__class__.__name__}(info={self.info!r}, queue={self.queue!r}, " f"inter_cmd_delay={self.inter_cmd_delay!r})" ) From d8143e8712132cd29699d70c6a0a93cfaf03b984 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 27 Jun 2022 15:27:48 +0200 Subject: [PATCH 121/221] fix unittests --- tests/test_queue.py | 2 +- tests/test_seq_sender.py | 6 +++--- tests/test_tm_handler.py | 10 +++++----- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/tests/test_queue.py b/tests/test_queue.py index 1c4f9642..010c5754 100644 --- a/tests/test_queue.py +++ b/tests/test_queue.py @@ -14,7 +14,7 @@ class TestTcQueue(TestCase): def test_queue(self): - queue_wrapper = QueueWrapper(queue=deque()) + queue_wrapper = QueueWrapper(info=None, queue=deque()) self.assertEqual(queue_wrapper.queue, deque()) queue_helper = QueueHelper(queue_wrapper) queue_helper.add_wait(2.0) diff --git a/tests/test_seq_sender.py b/tests/test_seq_sender.py index d5e45b46..d46ebb96 100644 --- a/tests/test_seq_sender.py +++ b/tests/test_seq_sender.py @@ -10,7 +10,7 @@ class TestSendReceive(TestCase): def test_basic(self): - queue_wrapper = QueueWrapper(queue=deque()) + queue_wrapper = QueueWrapper(info=None, queue=deque()) queue_helper = QueueHelper(queue_wrapper) tc_handler_mock = MagicMock(spec=TcHandlerBase) com_if = MagicMock(spec=ComInterface) @@ -31,7 +31,7 @@ def test_basic(self): tc_handler_mock.send_cb.assert_called_with(ANY, com_if) call_args = tc_handler_mock.send_cb.call_args print(call_args) - self.assertEqual(call_args._args[0].tc, bytes([0, 1, 2])) + self.assertEqual(call_args.args[0].tc, bytes([0, 1, 2])) # Queue should be empty now self.assertFalse(queue_wrapper.queue) self.assertEqual(seq_sender.mode, SenderMode.DONE) @@ -44,4 +44,4 @@ def test_basic(self): self.assertEqual(res.mode, SenderMode.BUSY) tc_handler_mock.send_cb.assert_called_with(ANY, com_if) call_args = tc_handler_mock.send_cb.call_args - self.assertEqual(call_args._args[0].tc, bytes([3, 2, 1])) + self.assertEqual(call_args.args[0].tc, bytes([3, 2, 1])) diff --git a/tests/test_tm_handler.py b/tests/test_tm_handler.py index e6705c59..b69c7125 100644 --- a/tests/test_tm_handler.py +++ b/tests/test_tm_handler.py @@ -33,20 +33,20 @@ def test_basic(self): unknown_handler = MagicMock(specs=UnknownApidHandlerBase) ccsds_handler = CcsdsTmHandler(unknown_handler) ccsds_handler.add_apid_handler(tm_handler) - tm_listener = CcsdsTmListener(tm_handler=ccsds_handler, com_if=com_if) - handled_packets = tm_listener.operation() + tm_listener = CcsdsTmListener(tm_handler=ccsds_handler) + handled_packets = tm_listener.operation(com_if) self.assertEqual(handled_packets, 0) self.assertTrue(ccsds_handler.has_apid(0x01)) tm0_raw = PusTelemetry(service=1, subservice=12, apid=0x01).pack() tm1_raw = PusTelemetry(service=5, subservice=1, apid=0x01).pack() com_if.receive.return_value = [tm0_raw] - handled_packets = tm_listener.operation() + handled_packets = tm_listener.operation(com_if) self.assertEqual(handled_packets, 1) self.assertTrue(tm_handler.was_called) self.assertEqual(tm_handler.called_times, 1) self.assertEqual(tm_handler.packet_queue.pop(), tm0_raw) com_if.receive.return_value = [tm0_raw, tm1_raw] - handled_packets = tm_listener.operation() + handled_packets = tm_listener.operation(com_if) self.assertEqual(handled_packets, 2) self.assertEqual(tm_handler.called_times, 3) self.assertEqual(handled_packets, 2) @@ -54,6 +54,6 @@ def test_basic(self): self.assertEqual(tm_handler.packet_queue.pop(), tm1_raw) unknown_apid = PusTelemetry(service=1, subservice=12, apid=0x02).pack() com_if.receive.return_value = [unknown_apid] - handled_packets = tm_listener.operation() + handled_packets = tm_listener.operation(com_if) self.assertEqual(handled_packets, 1) unknown_handler.handle_tm.assert_called_once() From 9d09ce8df610dd797f1c9d94540260f66c564ff1 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 27 Jun 2022 15:31:40 +0200 Subject: [PATCH 122/221] basic test for queue cb added --- tests/test_seq_sender.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/test_seq_sender.py b/tests/test_seq_sender.py index d46ebb96..53b0512a 100644 --- a/tests/test_seq_sender.py +++ b/tests/test_seq_sender.py @@ -33,6 +33,7 @@ def test_basic(self): print(call_args) self.assertEqual(call_args.args[0].tc, bytes([0, 1, 2])) # Queue should be empty now + tc_handler_mock.queue_finished_cb.assert_called_once() self.assertFalse(queue_wrapper.queue) self.assertEqual(seq_sender.mode, SenderMode.DONE) queue_helper.add_raw_tc(bytes([3, 2, 1])) From 584b7a8436c57b0046515da99f31d191843120c0 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 27 Jun 2022 15:33:15 +0200 Subject: [PATCH 123/221] doc fix --- tmtccmd/tm/ccsds_tm_listener.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/tmtccmd/tm/ccsds_tm_listener.py b/tmtccmd/tm/ccsds_tm_listener.py index 488aa75e..76ecbba4 100644 --- a/tmtccmd/tm/ccsds_tm_listener.py +++ b/tmtccmd/tm/ccsds_tm_listener.py @@ -28,8 +28,6 @@ def __init__( tm_handler: CcsdsTmHandler, ): """Initiate a TM listener. - :param com_if: Type of communication interface, - e.g. a serial or ethernet interface :param tm_handler: If valid CCSDS packets are found, they are dispatched to the passed handler """ From af73d6a80f8d1f24bc0cb8a7b79dca28815fc56d Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 27 Jun 2022 15:54:59 +0200 Subject: [PATCH 124/221] some more seq sender tests --- tests/test_queue.py | 4 ++-- tests/test_seq_sender.py | 28 ++++++++++++++++++++++++++-- tmtccmd/cfdp/filestore.py | 4 ++-- tmtccmd/tc/__init__.py | 4 ++-- tmtccmd/tc/ccsds_seq_sender.py | 5 +++-- 5 files changed, 35 insertions(+), 10 deletions(-) diff --git a/tests/test_queue.py b/tests/test_queue.py index 010c5754..a2397d4c 100644 --- a/tests/test_queue.py +++ b/tests/test_queue.py @@ -23,9 +23,9 @@ def test_queue(self): self.assertTrue(wait_entry) self.assertFalse(wait_entry.is_tc()) self.assertTrue( - math.isclose(wait_entry.wait_time, eval(f"{wait_entry!r}").wait_time) + math.isclose(wait_entry.wait_secs, eval(f"{wait_entry!r}").wait_secs) ) - self.assertEqual(wait_entry.wait_time, 2.0) + self.assertEqual(wait_entry.wait_secs, 2.0) self.assertEqual(len(queue_wrapper.queue), 0) pus_cmd = PusTelecommand(service=17, subservice=1) queue_helper.add_pus_tc(pus_cmd) diff --git a/tests/test_seq_sender.py b/tests/test_seq_sender.py index 53b0512a..53f61eca 100644 --- a/tests/test_seq_sender.py +++ b/tests/test_seq_sender.py @@ -1,7 +1,9 @@ +import time from collections import deque from unittest import TestCase from unittest.mock import MagicMock, ANY +from spacepackets.ecss import PusTelecommand from tmtccmd.com_if import ComInterface from tmtccmd.tc.ccsds_seq_sender import SequentialCcsdsSender, SenderMode from tmtccmd.tc.handler import TcHandlerBase @@ -30,7 +32,6 @@ def test_basic(self): seq_sender.operation() tc_handler_mock.send_cb.assert_called_with(ANY, com_if) call_args = tc_handler_mock.send_cb.call_args - print(call_args) self.assertEqual(call_args.args[0].tc, bytes([0, 1, 2])) # Queue should be empty now tc_handler_mock.queue_finished_cb.assert_called_once() @@ -39,10 +40,33 @@ def test_basic(self): queue_helper.add_raw_tc(bytes([3, 2, 1])) seq_sender.resume() self.assertEqual(seq_sender.mode, SenderMode.BUSY) - queue_helper.add_wait(0.1) + queue_helper.add_wait(0.01) queue_helper.add_raw_tc(bytes([1, 2, 3])) res = seq_sender.operation() self.assertEqual(res.mode, SenderMode.BUSY) + self.assertTrue(res.tc_sent) tc_handler_mock.send_cb.assert_called_with(ANY, com_if) call_args = tc_handler_mock.send_cb.call_args self.assertEqual(call_args.args[0].tc, bytes([3, 2, 1])) + queue_wrapper.inter_cmd_delay = 0.1 + self.assertTrue(seq_sender.no_delay_remaining()) + # 2 queue entries remaining + self.assertEqual(len(queue_helper.queue_wrapper.queue), 2) + res = seq_sender.operation() + self.assertFalse(res.tc_sent) + tc_handler_mock.send_cb.assert_called_with(ANY, com_if) + call_args = tc_handler_mock.send_cb.call_args + self.assertEqual(call_args.args[0].wait_secs, 0.01) + # Now no TCs should be sent for 0.05 seconds + self.assertEqual(len(queue_helper.queue_wrapper.queue), 1) + self.assertEqual(res.mode, SenderMode.BUSY) + # No TC sent, 10 ms delay + res = seq_sender.operation() + self.assertFalse(res.tc_sent) + self.assertEqual(len(queue_helper.queue_wrapper.queue), 1) + # After a delay, TC should be sent + time.sleep(0.01) + res = seq_sender.operation() + self.assertTrue(res.tc_sent) + self.assertEqual(len(queue_helper.queue_wrapper.queue), 0) + # queue_helper.add_pus_tc(PusTelecommand(service=17, subservice=1)) diff --git a/tmtccmd/cfdp/filestore.py b/tmtccmd/cfdp/filestore.py index 2179af09..506b9cd9 100644 --- a/tmtccmd/cfdp/filestore.py +++ b/tmtccmd/cfdp/filestore.py @@ -118,8 +118,8 @@ def delete_file(self, file_path: str) -> FilestoreResponseStatusCode: try: os.remove(file_path) return FilestoreResponseStatusCode.DELETE_SUCCESS - except IsADirectoryError: - LOGGER.exception(f"{file_path} is a directory") + except IsADirectoryError as e: + LOGGER.exception(e) return FilestoreResponseStatusCode.DELETE_NOT_ALLOWED def rename_file( diff --git a/tmtccmd/tc/__init__.py b/tmtccmd/tc/__init__.py index a66b36c5..15c85baa 100644 --- a/tmtccmd/tc/__init__.py +++ b/tmtccmd/tc/__init__.py @@ -76,10 +76,10 @@ def __repr__(self): class WaitEntry(TcQueueEntryBase): def __init__(self, wait_secs: float): super().__init__(TcQueueEntryType.WAIT) - self.wait_time = wait_secs + self.wait_secs = wait_secs def __repr__(self): - return f"{self.__class__.__name__}({self.wait_time!r})" + return f"{self.__class__.__name__}({self.wait_secs!r})" class PacketDelayEntry(TcQueueEntryBase): diff --git a/tmtccmd/tc/ccsds_seq_sender.py b/tmtccmd/tc/ccsds_seq_sender.py index 8a6cccec..b41184c4 100644 --- a/tmtccmd/tc/ccsds_seq_sender.py +++ b/tmtccmd/tc/ccsds_seq_sender.py @@ -56,6 +56,7 @@ def queue_wrapper(self): @queue_wrapper.setter def queue_wrapper(self, queue_wrapper: QueueWrapper): + """This setter throws a ValueError if the sequential sender is busy with another queue""" if self._mode == SenderMode.BUSY: raise ValueError("Busy with other queue") self._mode = SenderMode.BUSY @@ -143,8 +144,8 @@ def check_queue_entry(self, queue_entry: TcQueueEntryBase) -> bool: cast_wrapper = PacketCastWrapper(queue_entry) if queue_entry.etype == TcQueueEntryType.WAIT: wait_entry = cast_wrapper.to_wait_entry() - LOGGER.info(f"Waiting for {wait_entry.wait_time} seconds.") - self._wait_cd.reset(new_timeout=wait_entry.wait_time) + LOGGER.info(f"Waiting for {wait_entry.wait_secs} seconds.") + self._wait_cd.reset(new_timeout=wait_entry.wait_secs) self._current_res.longest_rem_delay = max( self._wait_cd.rem_time(), self._send_cd.rem_time() ) From 5e8e4ef30cff9002447d90f4d2feec59d5d8ff93 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 27 Jun 2022 16:55:18 +0200 Subject: [PATCH 125/221] queue usage change --- tests/test_queue.py | 10 +-- tests/test_seq_sender.py | 135 +++++++++++++++++++++++---------- tmtccmd/tc/__init__.py | 6 +- tmtccmd/tc/ccsds_seq_sender.py | 42 +++++----- tmtccmd/tc/queue.py | 12 +-- 5 files changed, 130 insertions(+), 75 deletions(-) diff --git a/tests/test_queue.py b/tests/test_queue.py index a2397d4c..ea7f8bdf 100644 --- a/tests/test_queue.py +++ b/tests/test_queue.py @@ -37,7 +37,7 @@ def test_queue(self): print(queue_wrapper.queue) self.assertEqual(len(queue_wrapper.queue), 5) - pus_entry = queue_wrapper.queue.pop() + pus_entry = queue_wrapper.queue.popleft() self.assertTrue(pus_entry.is_tc()) cast_wrapper = PacketCastWrapper(pus_entry) pus_entry = cast_wrapper.to_pus_tc_entry() @@ -45,7 +45,7 @@ def test_queue(self): self.assertTrue(pus_entry) with self.assertRaises(TypeError): cast_wrapper.to_wait_entry() - log_entry = queue_wrapper.queue.pop() + log_entry = queue_wrapper.queue.popleft() self.assertFalse(log_entry.is_tc()) cast_wrapper.base = log_entry log_entry = cast_wrapper.to_log_entry() @@ -56,7 +56,7 @@ def test_queue(self): test_obj = eval(f"{log_entry!r}") self.assertEqual(test_obj.log_str, log_entry.log_str) - raw_entry = queue_wrapper.queue.pop() + raw_entry = queue_wrapper.queue.popleft() self.assertTrue(raw_entry.is_tc()) cast_wrapper.base = raw_entry raw_entry = cast_wrapper.to_raw_tc_entry() @@ -65,7 +65,7 @@ def test_queue(self): test_obj = eval(f"{raw_entry!r}") self.assertEqual(raw_entry.tc, test_obj.tc) - space_packet_entry = queue_wrapper.queue.pop() + space_packet_entry = queue_wrapper.queue.popleft() self.assertTrue(space_packet_entry.is_tc()) cast_wrapper.base = space_packet_entry space_packet_entry = cast_wrapper.to_space_packet_entry() @@ -76,4 +76,4 @@ def test_queue(self): self.assertFalse(packet_delay.is_tc()) cast_wrapper.base = packet_delay packet_delay = cast_wrapper.to_packet_delay_entry() - self.assertEqual(packet_delay.timeout_secs, 3.0) + self.assertEqual(packet_delay.delay_secs, 3.0) diff --git a/tests/test_seq_sender.py b/tests/test_seq_sender.py index 53f61eca..1bb95beb 100644 --- a/tests/test_seq_sender.py +++ b/tests/test_seq_sender.py @@ -11,62 +11,113 @@ class TestSendReceive(TestCase): + def setUp(self) -> None: + self.queue_wrapper = QueueWrapper(info=None, queue=deque()) + self.queue_helper = QueueHelper(self.queue_wrapper) + self.tc_handler_mock = MagicMock(spec=TcHandlerBase) + self.com_if = MagicMock(spec=ComInterface) + self.seq_sender = SequentialCcsdsSender( + self.queue_wrapper, self.com_if, self.tc_handler_mock + ) + def test_basic(self): - queue_wrapper = QueueWrapper(info=None, queue=deque()) - queue_helper = QueueHelper(queue_wrapper) - tc_handler_mock = MagicMock(spec=TcHandlerBase) - com_if = MagicMock(spec=ComInterface) - seq_sender = SequentialCcsdsSender(queue_wrapper, com_if, tc_handler_mock) - res = seq_sender.operation() + res = self.seq_sender.operation() # Queue is empty initially self.assertEqual(res.mode, SenderMode.DONE) - self.assertEqual(seq_sender.mode, SenderMode.DONE) - self.assertTrue(seq_sender.no_delay_remaining()) - queue_helper.add_raw_tc(bytes([0, 1, 2])) + self.assertEqual(self.seq_sender.mode, SenderMode.DONE) + self.assertTrue(self.seq_sender.no_delay_remaining()) + self.queue_helper.add_raw_tc(bytes([0, 1, 2])) # One queue entry which should be handled immediately - seq_sender.queue_wrapper = queue_wrapper - self.assertEqual(seq_sender.mode, SenderMode.BUSY) + self.seq_sender.queue_wrapper = self.queue_wrapper + self.assertEqual(self.seq_sender.mode, SenderMode.BUSY) # Is busy now, so does not accept new queue unless forced with self.assertRaises(ValueError): - seq_sender.queue_wrapper = queue_wrapper - seq_sender.operation() - tc_handler_mock.send_cb.assert_called_with(ANY, com_if) - call_args = tc_handler_mock.send_cb.call_args + self.seq_sender.queue_wrapper = self.queue_wrapper + self.seq_sender.operation() + self.tc_handler_mock.send_cb.assert_called_with(ANY, self.com_if) + call_args = self.tc_handler_mock.send_cb.call_args self.assertEqual(call_args.args[0].tc, bytes([0, 1, 2])) # Queue should be empty now - tc_handler_mock.queue_finished_cb.assert_called_once() - self.assertFalse(queue_wrapper.queue) - self.assertEqual(seq_sender.mode, SenderMode.DONE) - queue_helper.add_raw_tc(bytes([3, 2, 1])) - seq_sender.resume() - self.assertEqual(seq_sender.mode, SenderMode.BUSY) - queue_helper.add_wait(0.01) - queue_helper.add_raw_tc(bytes([1, 2, 3])) - res = seq_sender.operation() + self.tc_handler_mock.queue_finished_cb.assert_called_once() + self.assertFalse(self.queue_wrapper.queue) + self.assertEqual(self.seq_sender.mode, SenderMode.DONE) + self.queue_helper.add_raw_tc(bytes([3, 2, 1])) + self.seq_sender.resume() + self.assertEqual(self.seq_sender.mode, SenderMode.BUSY) + res = self.seq_sender.operation() + self.assertTrue(res.tc_sent) + call_args = self.tc_handler_mock.send_cb.call_args + self.assertEqual(call_args.args[0].tc, bytes([3, 2, 1])) + + def test_with_wait_entry(self): + wait_delay = 0.01 + self.queue_helper.add_raw_tc(bytes([3, 2, 1])) + self.queue_helper.add_wait(wait_delay) + self.queue_helper.add_raw_tc(bytes([1, 2, 3])) + # Resume call necessary + self.assertEqual(self.seq_sender.mode, SenderMode.DONE) + self.seq_sender.resume() + res = self.seq_sender.operation() self.assertEqual(res.mode, SenderMode.BUSY) self.assertTrue(res.tc_sent) - tc_handler_mock.send_cb.assert_called_with(ANY, com_if) - call_args = tc_handler_mock.send_cb.call_args + self.tc_handler_mock.send_cb.assert_called_with(ANY, self.com_if) + call_args = self.tc_handler_mock.send_cb.call_args self.assertEqual(call_args.args[0].tc, bytes([3, 2, 1])) - queue_wrapper.inter_cmd_delay = 0.1 - self.assertTrue(seq_sender.no_delay_remaining()) + self.assertTrue(self.seq_sender.no_delay_remaining()) # 2 queue entries remaining - self.assertEqual(len(queue_helper.queue_wrapper.queue), 2) - res = seq_sender.operation() + self.assertEqual(len(self.queue_helper.queue_wrapper.queue), 2) + # Now the wait entry should be handled + res = self.seq_sender.operation() + self.assertFalse(self.seq_sender.no_delay_remaining()) self.assertFalse(res.tc_sent) - tc_handler_mock.send_cb.assert_called_with(ANY, com_if) - call_args = tc_handler_mock.send_cb.call_args - self.assertEqual(call_args.args[0].wait_secs, 0.01) - # Now no TCs should be sent for 0.05 seconds - self.assertEqual(len(queue_helper.queue_wrapper.queue), 1) + self.tc_handler_mock.send_cb.assert_called_with(ANY, self.com_if) + call_args = self.tc_handler_mock.send_cb.call_args + self.assertEqual(call_args.args[0].wait_secs, wait_delay) + # Now no TCs should be sent for 10 ms + self.assertEqual(len(self.queue_helper.queue_wrapper.queue), 1) self.assertEqual(res.mode, SenderMode.BUSY) - # No TC sent, 10 ms delay - res = seq_sender.operation() + res = self.seq_sender.operation() self.assertFalse(res.tc_sent) - self.assertEqual(len(queue_helper.queue_wrapper.queue), 1) + self.assertEqual(len(self.queue_helper.queue_wrapper.queue), 1) # After a delay, TC should be sent - time.sleep(0.01) - res = seq_sender.operation() + time.sleep(wait_delay) + res = self.seq_sender.operation() + self.assertTrue(res.tc_sent) + self.assertEqual(len(self.queue_helper.queue_wrapper.queue), 0) + self.tc_handler_mock.send_cb.assert_called_with(ANY, self.com_if) + call_args = self.tc_handler_mock.send_cb.call_args + self.assertEqual(call_args.args[0].tc, bytes([1, 2, 3])) + + def test_interpacket_delay(self): + inter_packet_delay = 0.01 + ping_cmd = PusTelecommand(service=17, subservice=1) + self.queue_helper.add_pus_tc(ping_cmd) + self.queue_helper.add_packet_delay(inter_packet_delay) + self.queue_helper.add_ccsds_tc(ping_cmd.to_space_packet()) + self.queue_helper.add_raw_tc(bytes([0, 1, 2])) + # Send first TC, assert delay of 10 ms, then send last packet + res = self.seq_sender.operation() + self.assertEqual(res.longest_rem_delay, 0.0) self.assertTrue(res.tc_sent) - self.assertEqual(len(queue_helper.queue_wrapper.queue), 0) - # queue_helper.add_pus_tc(PusTelecommand(service=17, subservice=1)) + self.tc_handler_mock.send_cb.assert_called_with(ANY, self.com_if) + call_args = self.tc_handler_mock.send_cb.call_args + self.assertEqual(call_args.args[0].pus_tc.pack(), ping_cmd.pack()) + res = self.seq_sender.operation() + self.assertFalse(res.tc_sent) + self.tc_handler_mock.send_cb.assert_called_with(ANY, self.com_if) + call_args = self.tc_handler_mock.send_cb.call_args + self.assertEqual(call_args.args[0].delay_secs, inter_packet_delay) + self.assertFalse(res.longest_rem_delay > 0.08) + res = self.seq_sender.operation() + # No TC sent + self.assertFalse(res.tc_sent) + self.assertEqual(len(self.queue_wrapper.queue), 2) + time.sleep(inter_packet_delay) + res = self.seq_sender.operation() + # TC sent + self.assertTrue(res.tc_sent) + self.assertEqual(len(self.queue_wrapper.queue), 1) + res = self.seq_sender.operation() + # No TC sent, delay after each packet + self.assertFalse(res.tc_sent) + self.assertEqual(len(self.queue_wrapper.queue), 1) diff --git a/tmtccmd/tc/__init__.py b/tmtccmd/tc/__init__.py index 15c85baa..60e1c175 100644 --- a/tmtccmd/tc/__init__.py +++ b/tmtccmd/tc/__init__.py @@ -83,12 +83,12 @@ def __repr__(self): class PacketDelayEntry(TcQueueEntryBase): - def __init__(self, timeout_secs: float): + def __init__(self, delay_secs: float): super().__init__(TcQueueEntryType.PACKET_DELAY) - self.timeout_secs = timeout_secs + self.delay_secs = delay_secs def __repr__(self): - return f"{self.__class__.__name__}({self.timeout_secs!r})" + return f"{self.__class__.__name__}({self.delay_secs!r})" class PacketCastWrapper: diff --git a/tmtccmd/tc/ccsds_seq_sender.py b/tmtccmd/tc/ccsds_seq_sender.py index b41184c4..bbe1a437 100644 --- a/tmtccmd/tc/ccsds_seq_sender.py +++ b/tmtccmd/tc/ccsds_seq_sender.py @@ -96,8 +96,7 @@ def _handle_current_tc_queue(self): self._mode = SenderMode.DONE return else: - if self.no_delay_remaining(): - self._send_next_telecommand() + self._check_next_telecommand() self.__print_rem_timeout(op_divider=self._op_divider) self._op_divider += 1 @@ -107,17 +106,27 @@ def __print_rem_timeout(self, op_divider: int, divisor: int = 15): if self._wait_cd.rem_time() > 0: LOGGER.info(f"{rem_time:.01f} seconds wait time remaining") - def _send_next_telecommand(self): + def _check_next_telecommand(self): """Sends the next telecommand and returns whether an actual telecommand was sent""" - next_queue_entry = self.queue_wrapper.queue.pop() - if self.check_queue_entry(next_queue_entry): - self._current_res.tc_sent = True - if self.queue_wrapper.inter_cmd_delay != self._send_cd.timeout: - self._send_cd.reset(self.queue_wrapper.inter_cmd_delay) - self._send_cd.reset() + next_queue_entry = self.queue_wrapper.queue[0] + is_tc = self.handle_non_tc_entry(next_queue_entry) + call_send_cb = True + if is_tc: + if self.no_delay_remaining(): + self._current_res.tc_sent = True + else: + self._current_res.tc_sent = False + call_send_cb = False else: self._current_res.tc_sent = False - self._tc_handler.send_cb(next_queue_entry, self._com_if) + if call_send_cb: + self._tc_handler.send_cb(next_queue_entry, self._com_if) + if is_tc: + if self.queue_wrapper.inter_cmd_delay != self._send_cd.timeout: + self._send_cd.reset(self.queue_wrapper.inter_cmd_delay) + else: + self._send_cd.reset() + self.queue_wrapper.queue.popleft() if not self.queue_wrapper.queue and self.no_delay_remaining(): self._mode = SenderMode.DONE @@ -132,7 +141,7 @@ def __wait_cd_timed_out(self): """Internal wrapper API to allow easier testing""" return self._wait_cd.timed_out() - def check_queue_entry(self, queue_entry: TcQueueEntryBase) -> bool: + def handle_non_tc_entry(self, queue_entry: TcQueueEntryBase) -> bool: """ Checks whether the entry in the pus_tc queue is a telecommand. :param queue_entry: Generic queue entry @@ -151,17 +160,12 @@ def check_queue_entry(self, queue_entry: TcQueueEntryBase) -> bool: ) elif queue_entry.etype == TcQueueEntryType.PACKET_DELAY: timeout_entry = cast_wrapper.to_packet_delay_entry() - self._send_cd.reset(new_timeout=timeout_entry.timeout_secs) + self._send_cd.reset(new_timeout=timeout_entry.delay_secs) self._current_res.longest_rem_delay = max( self._wait_cd.rem_time(), self._send_cd.rem_time() ) - is_tc = False - if ( - queue_entry.etype == TcQueueEntryType.RAW_TC - or queue_entry.etype == TcQueueEntryType.PUS_TC - or queue_entry.etype == TcQueueEntryType.CCSDS_TC - ): + is_tc = queue_entry.is_tc() + if is_tc: self._last_tc = queue_entry - is_tc = True self._last_queue_entry = queue_entry return is_tc diff --git a/tmtccmd/tc/queue.py b/tmtccmd/tc/queue.py index d78a1bf6..0f627e09 100644 --- a/tmtccmd/tc/queue.py +++ b/tmtccmd/tc/queue.py @@ -40,19 +40,19 @@ def __repr__(self): return f"{self.__class__.__name__}(queue_wrapper={self.queue_wrapper!r})" def add_log_cmd(self, print_str: str): - self.queue_wrapper.queue.appendleft(LogQueueEntry(print_str)) + self.queue_wrapper.queue.append(LogQueueEntry(print_str)) def add_pus_tc(self, pus_tc: PusTelecommand): - self.queue_wrapper.queue.appendleft(PusTcEntry(pus_tc)) + self.queue_wrapper.queue.append(PusTcEntry(pus_tc)) def add_ccsds_tc(self, space_packet: SpacePacket): - self.queue_wrapper.queue.appendleft(SpacePacketEntry(space_packet)) + self.queue_wrapper.queue.append(SpacePacketEntry(space_packet)) def add_raw_tc(self, tc: bytes): - self.queue_wrapper.queue.appendleft(RawTcEntry(tc)) + self.queue_wrapper.queue.append(RawTcEntry(tc)) def add_wait(self, wait_secs: float): - self.queue_wrapper.queue.appendleft(WaitEntry(wait_secs)) + self.queue_wrapper.queue.append(WaitEntry(wait_secs)) def add_packet_delay(self, delay: float): - self.queue_wrapper.queue.appendleft(PacketDelayEntry(delay)) + self.queue_wrapper.queue.append(PacketDelayEntry(delay)) From 31ac2e5c34a2c0d08d09dba0382f9bc416292ee6 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 27 Jun 2022 16:58:55 +0200 Subject: [PATCH 126/221] small fix found with unittest --- tmtccmd/tc/ccsds_seq_sender.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tmtccmd/tc/ccsds_seq_sender.py b/tmtccmd/tc/ccsds_seq_sender.py index bbe1a437..0a3e07db 100644 --- a/tmtccmd/tc/ccsds_seq_sender.py +++ b/tmtccmd/tc/ccsds_seq_sender.py @@ -160,6 +160,7 @@ def handle_non_tc_entry(self, queue_entry: TcQueueEntryBase) -> bool: ) elif queue_entry.etype == TcQueueEntryType.PACKET_DELAY: timeout_entry = cast_wrapper.to_packet_delay_entry() + self.queue_wrapper.inter_cmd_delay = timeout_entry.delay_secs self._send_cd.reset(new_timeout=timeout_entry.delay_secs) self._current_res.longest_rem_delay = max( self._wait_cd.rem_time(), self._send_cd.rem_time() From cfa1281cc27bd938b36cb6dcef324887916aec37 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 27 Jun 2022 17:47:12 +0200 Subject: [PATCH 127/221] seq test done --- tests/test_seq_sender.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/tests/test_seq_sender.py b/tests/test_seq_sender.py index 1bb95beb..63a3445e 100644 --- a/tests/test_seq_sender.py +++ b/tests/test_seq_sender.py @@ -107,7 +107,7 @@ def test_interpacket_delay(self): self.tc_handler_mock.send_cb.assert_called_with(ANY, self.com_if) call_args = self.tc_handler_mock.send_cb.call_args self.assertEqual(call_args.args[0].delay_secs, inter_packet_delay) - self.assertFalse(res.longest_rem_delay > 0.08) + self.assertTrue(0.008 < res.longest_rem_delay < 0.01) res = self.seq_sender.operation() # No TC sent self.assertFalse(res.tc_sent) @@ -121,3 +121,11 @@ def test_interpacket_delay(self): # No TC sent, delay after each packet self.assertFalse(res.tc_sent) self.assertEqual(len(self.queue_wrapper.queue), 1) + self.assertTrue(0.008 < res.longest_rem_delay < 0.01) + # Delay 10 ms + time.sleep(0.01) + res = self.seq_sender.operation() + self.assertTrue(res.tc_sent) + self.tc_handler_mock.send_cb.assert_called_with(ANY, self.com_if) + call_args = self.tc_handler_mock.send_cb.call_args + self.assertEqual(call_args.args[0].tc, bytes([0, 1, 2])) From 6bd410d7f1182a6a558783a7895420ccfcfde03a Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 27 Jun 2022 17:47:49 +0200 Subject: [PATCH 128/221] delete obsolete tests --- tests/test_runner.py | 38 +------------------------------------- 1 file changed, 1 insertion(+), 37 deletions(-) diff --git a/tests/test_runner.py b/tests/test_runner.py index 09a440a5..5e88aa9a 100644 --- a/tests/test_runner.py +++ b/tests/test_runner.py @@ -1,42 +1,6 @@ from unittest import TestCase -class TestTmtcRunner(TestCase): +class TestRunner(TestCase): def test_tmtc_runner(self): - # TODO: Update tests for updated API - """ - hook_base = create_hook_mock() - tm_handler = CcsdsTmHandler() - init_tmtccmd(hook_object=hook_base) - setup_tmtccmd(use_gui=False, reduced_printout=False) - backend_mock = create_backend_mock(tm_handler=tm_handler) - run_tmtccmd(tmtc_backend=backend_mock) - backend_mock.start_listener.assert_called_with() - backend_mock.initialize.assert_called_with() - """ - - # TODO: Maybe we can remove this test altogether.. - """ - frontend_mock = create_frontend_mock() - run_tmtccmd( - use_gui=True, - tmtc_backend=backend_mock, - tmtc_frontend=frontend_mock, - ) - frontend_mock.start.assert_called_once() - qt_app = frontend_mock.start.call_args[0][0] - # TODO: Fix test - # self.assertTrue(qt_app is None) - - default_backend = get_default_tmtc_backend( - hook_obj=hook_base, tm_handler=tm_handler, json_cfg_path="tmtc_config.json" - ) - self.assertTrue(default_backend is not None) - """ - - def test_errors(self): - # TODO: API has changed, update tests - # self.assertRaises(ValueError, init_tmtccmd, None) - # self.assertRaises(TypeError, run_tmtccmd) - # self.assertRaises(RuntimeError, run_tmtccmd, False) pass From 0692f29a2bf49b5c0bde5b7e198d54db7a36404c Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 27 Jun 2022 17:52:40 +0200 Subject: [PATCH 129/221] additional is_open abstract method --- tmtccmd/com_if/__init__.py | 6 ++++++ tmtccmd/com_if/dummy.py | 4 ++++ tmtccmd/com_if/serial.py | 6 ++++-- tmtccmd/com_if/tcp.py | 5 +++++ tmtccmd/com_if/udp.py | 10 ++++++---- 5 files changed, 25 insertions(+), 6 deletions(-) diff --git a/tmtccmd/com_if/__init__.py b/tmtccmd/com_if/__init__.py index 368800f1..2d9ad58f 100644 --- a/tmtccmd/com_if/__init__.py +++ b/tmtccmd/com_if/__init__.py @@ -33,6 +33,12 @@ def open(self, args: any = None) -> None: :return: """ + @abstractmethod + def is_open(self) -> bool: + """Can be used to check whether the communication interface is open. This is useful if + opening a COM interface takes a longer time and is non-blocking + """ + @abstractmethod def close(self, args: any = None) -> None: """Closes the ComIF and releases any held resources (for example a Communication Port). diff --git a/tmtccmd/com_if/dummy.py b/tmtccmd/com_if/dummy.py index 97331874..ab8152e8 100644 --- a/tmtccmd/com_if/dummy.py +++ b/tmtccmd/com_if/dummy.py @@ -16,6 +16,7 @@ class DummyComIF(ComInterface): + def __init__(self, com_if_id: str): super().__init__(com_if_id=com_if_id) self.dummy_handler = DummyHandler() @@ -30,6 +31,9 @@ def initialize(self, args: any = None) -> any: def open(self, args: any = None) -> None: pass + def is_open(self) -> bool: + return True + def close(self, args: any = None) -> None: pass diff --git a/tmtccmd/com_if/serial.py b/tmtccmd/com_if/serial.py index a7d3d49e..cf2a8efd 100644 --- a/tmtccmd/com_if/serial.py +++ b/tmtccmd/com_if/serial.py @@ -47,8 +47,7 @@ class SerialCommunicationType(enum.Enum): # pylint: disable=arguments-differ class SerialComIF(ComInterface): - """ - Communication Interface to use serial communication. This requires the PySerial library. + """Communication Interface to use serial communication. This requires the PySerial library. """ def __init__( @@ -131,6 +130,9 @@ def open(self, args: any = None) -> None: if self.ser_com_type == SerialCommunicationType.DLE_ENCODING: self.reception_thread.start() + def is_open(self) -> bool: + return self.serial is not None + def close(self, args: any = None) -> None: try: if self.ser_com_type == SerialCommunicationType.DLE_ENCODING: diff --git a/tmtccmd/com_if/tcp.py b/tmtccmd/com_if/tcp.py index da73017e..5f7932d2 100644 --- a/tmtccmd/com_if/tcp.py +++ b/tmtccmd/com_if/tcp.py @@ -92,6 +92,9 @@ def open(self, args: any = None): self.set_up_tcp_thread() self.__tcp_conn_thread.start() + def is_open(self) -> bool: + return self.connected + def set_up_socket(self): if self.__tcp_socket is None: self.__tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) @@ -99,6 +102,8 @@ def set_up_socket(self): self.connected = True def set_up_tcp_thread(self): + # TODO: Do we really need a thread here? This could probably be implemented as a polled + # interface like UDP, using the select API if self.__tcp_conn_thread is None: self.__tcp_conn_thread = threading.Thread( target=self.__tcp_tm_client, daemon=True diff --git a/tmtccmd/com_if/udp.py b/tmtccmd/com_if/udp.py index 25f037d2..5ca3483a 100644 --- a/tmtccmd/com_if/udp.py +++ b/tmtccmd/com_if/udp.py @@ -15,8 +15,7 @@ class UdpComIF(ComInterface): - """Communication interface for UDP communication.""" - + """Communication interface for UDP communication""" def __init__( self, com_if_id: str, @@ -52,7 +51,7 @@ def initialize(self, args: any = None) -> any: def open(self, args: any = None): self.udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) - # Bind is possible but should not be necessary, and introduces risk of port alread + # Bind is possible but should not be necessary, and introduces risk of port already # being used. # See: https://docs.microsoft.com/en-us/windows/win32/api/winsock/nf-winsock-bind if self.recv_addr is not None: @@ -60,9 +59,12 @@ def open(self, args: any = None): f"Binding UDP socket to {self.recv_addr[0]} and port {self.recv_addr[1]}" ) self.udp_socket.bind(self.recv_addr) - # Set non-blocking because we use select. + # Set non-blocking because we use select self.udp_socket.setblocking(False) + def is_open(self) -> bool: + return self.udp_socket is not None + def close(self, args: any = None) -> None: if self.udp_socket is not None: self.udp_socket.close() From 2895cf1c17f254143812816b0e1bcae200643929 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 27 Jun 2022 18:04:21 +0200 Subject: [PATCH 130/221] basic dummy com if --- tests/test_com_if.py | 21 ++++++++++- tmtccmd/com_if/dummy.py | 79 ++++++++++++++++++---------------------- tmtccmd/com_if/serial.py | 3 +- tmtccmd/com_if/udp.py | 1 + tmtccmd/config/com_if.py | 2 +- 5 files changed, 59 insertions(+), 47 deletions(-) diff --git a/tests/test_com_if.py b/tests/test_com_if.py index 07ce859d..a374bb68 100644 --- a/tests/test_com_if.py +++ b/tests/test_com_if.py @@ -1,7 +1,10 @@ import os +from pathlib import Path from unittest import TestCase from unittest.mock import patch +from spacepackets.ecss import PusTelecommand +from tmtccmd.com_if.dummy import DummyComIF from tmtccmd.com_if.utils import determine_com_if @@ -42,5 +45,21 @@ def test_com_if_utils(self): com_if = determine_com_if(test_dict, self.json_file) self.assertEqual(com_if, "test-com-if") + def test_dummy_if(self): + dummy_com_if = DummyComIF() + self.assertFalse(dummy_com_if.is_open()) + dummy_com_if.open() + self.assertTrue(dummy_com_if.is_open()) + self.assertFalse(dummy_com_if.initialized) + dummy_com_if.initialize() + self.assertTrue(dummy_com_if.initialized) + self.assertFalse(dummy_com_if.data_available()) + dummy_com_if.send(PusTelecommand(service=17, subservice=1).pack()) + self.assertTrue(dummy_com_if.data_available()) + replies = dummy_com_if.receive() + self.assertEqual(len(replies), 3) + def tearDown(self) -> None: - os.remove(self.json_file) + path = Path(self.json_file) + if path.exists(): + os.remove(path) diff --git a/tmtccmd/com_if/dummy.py b/tmtccmd/com_if/dummy.py index ab8152e8..8701d93e 100644 --- a/tmtccmd/com_if/dummy.py +++ b/tmtccmd/com_if/dummy.py @@ -1,4 +1,5 @@ -"""Dummy Communication Interface. Currently serves to provide an example without external hardware +"""Dummy Virtual Communication Interface. Currently serves to use the TMTC program without needing +external hardware or an extra socket """ from typing import Optional @@ -6,6 +7,7 @@ from spacepackets.ecss.tc import PusTelecommand from tmtccmd.com_if import ComInterface +from tmtccmd.config import CoreComInterfaces from tmtccmd.tm import TelemetryListT from tmtccmd.tm.pus_1_verification import Service1TmExtended from tmtccmd.tm.pus_17_test import Subservices, Service17TmExtended @@ -15,41 +17,6 @@ LOGGER = get_console_logger() -class DummyComIF(ComInterface): - - def __init__(self, com_if_id: str): - super().__init__(com_if_id=com_if_id) - self.dummy_handler = DummyHandler() - self.last_service = 0 - self.last_subservice = 0 - self.tc_ssc = 0 - self.tc_packet_id = 0 - - def initialize(self, args: any = None) -> any: - pass - - def open(self, args: any = None) -> None: - pass - - def is_open(self) -> bool: - return True - - def close(self, args: any = None) -> None: - pass - - def data_available(self, timeout: float = 0, parameters: any = 0): - if self.dummy_handler.reply_pending: - return True - return False - - def receive(self, parameters: any = 0) -> TelemetryListT: - return self.dummy_handler.receive_reply_package() - - def send(self, data: bytearray): - if data is not None: - self.dummy_handler.pass_telecommand(data) - - class DummyHandler: def __init__(self): self.last_tc: Optional[PusTelecommand] = None @@ -63,13 +30,7 @@ def pass_telecommand(self, data: bytearray): self.generate_reply_package() def generate_reply_package(self): - """ - Generate the replies. This function will perform the following steps: - - Generate an object representation of the telemetry to be generated based on service and subservice - - Generate the raw bytearray of the telemetry - - Generate the object representation which would otherwise be generated from the raw bytearray received - from an external source - """ + """Generate a reply package. Currently, this only generates a reply for a ping telecommand.""" if self.last_tc.service == 17: if self.last_tc.subservice == 1: tm_packer = Service1TmExtended( @@ -107,3 +68,35 @@ def receive_reply_package(self) -> TelemetryListT: return return_list else: return [] + + +class DummyComIF(ComInterface): + def __init__(self): + super().__init__(com_if_id=CoreComInterfaces.DUMMY.value) + self.dummy_handler = DummyHandler() + self._open = False + self.initialized = False + + def initialize(self, args: any = None) -> any: + self.initialized = True + + def open(self, args: any = None) -> None: + self._open = True + + def is_open(self) -> bool: + return self._open + + def close(self, args: any = None) -> None: + self._open = False + + def data_available(self, timeout: float = 0, parameters: any = 0): + if self.dummy_handler.reply_pending: + return True + return False + + def receive(self, parameters: any = 0) -> TelemetryListT: + return self.dummy_handler.receive_reply_package() + + def send(self, data: bytearray): + if data is not None: + self.dummy_handler.pass_telecommand(data) diff --git a/tmtccmd/com_if/serial.py b/tmtccmd/com_if/serial.py index cf2a8efd..9eb8c82d 100644 --- a/tmtccmd/com_if/serial.py +++ b/tmtccmd/com_if/serial.py @@ -47,8 +47,7 @@ class SerialCommunicationType(enum.Enum): # pylint: disable=arguments-differ class SerialComIF(ComInterface): - """Communication Interface to use serial communication. This requires the PySerial library. - """ + """Communication Interface to use serial communication. This requires the PySerial library.""" def __init__( self, diff --git a/tmtccmd/com_if/udp.py b/tmtccmd/com_if/udp.py index 5ca3483a..0d76989d 100644 --- a/tmtccmd/com_if/udp.py +++ b/tmtccmd/com_if/udp.py @@ -16,6 +16,7 @@ class UdpComIF(ComInterface): """Communication interface for UDP communication""" + def __init__( self, com_if_id: str, diff --git a/tmtccmd/config/com_if.py b/tmtccmd/config/com_if.py index 249e6719..1b88e1ca 100644 --- a/tmtccmd/config/com_if.py +++ b/tmtccmd/config/com_if.py @@ -66,7 +66,7 @@ def create_communication_interface_default( dle_max_queue_len, dle_max_frame_size, serial_timeout ) else: - communication_interface = DummyComIF(com_if_id=com_if_key) + communication_interface = DummyComIF() if communication_interface is None: return communication_interface if not communication_interface.valid: From beac2cd3651ea4ac801088c7341a8b2cccaaa07b Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 27 Jun 2022 18:23:01 +0200 Subject: [PATCH 131/221] starting backend unittests --- examples/tmtcc.py | 12 ++++----- tests/test_global_manager.py | 8 ++++++ tests/test_runner.py | 31 +++++++++++++++++++++-- tmtccmd/__init__.py | 4 +-- tmtccmd/core/__init__.py | 6 +++-- tmtccmd/core/ccsds_backend.py | 47 +++++++++++++---------------------- tmtccmd/gui/__init__.py | 8 +++--- 7 files changed, 70 insertions(+), 46 deletions(-) diff --git a/examples/tmtcc.py b/examples/tmtcc.py index 1ccd17a7..acded55c 100755 --- a/examples/tmtcc.py +++ b/examples/tmtcc.py @@ -18,7 +18,7 @@ CoreServiceList, ) from tmtccmd.config import ArgParserWrapper, SetupWrapper -from tmtccmd.core import BackendController, Request +from tmtccmd.core import BackendController, BackendRequest from tmtccmd.logging import get_console_logger from tmtccmd.logging.pus import ( RegularTmtcLogWrapper, @@ -156,16 +156,16 @@ def main(): try: while True: state = tmtc_backend.periodic_op(ctrl) - if state.request == Request.TERMINATION_NO_ERROR: + if state.request == BackendRequest.TERMINATION_NO_ERROR: sys.exit(0) - elif state.request == Request.DELAY_IDLE: + elif state.request == BackendRequest.DELAY_IDLE: LOGGER.info("TMTC Client in IDLE mode") time.sleep(3.0) - elif state.request == Request.DELAY_LISTENER: + elif state.request == BackendRequest.DELAY_LISTENER: time.sleep(0.8) - elif state.request == Request.DELAY_CUSTOM: + elif state.request == BackendRequest.DELAY_CUSTOM: time.sleep(state.next_delay) - elif state.request == Request.CALL_NEXT: + elif state.request == BackendRequest.CALL_NEXT: pass except KeyboardInterrupt: sys.exit(0) diff --git a/tests/test_global_manager.py b/tests/test_global_manager.py index 7861986e..3bdd5894 100644 --- a/tests/test_global_manager.py +++ b/tests/test_global_manager.py @@ -11,6 +11,11 @@ CoreModeList, CoreGlobalIds, ) +from tmtccmd.core.globals_manager import ( + lock_global_pool, + unlock_global_pool, + set_lock_timeout, +) class TestGlobalManager(TestCase): @@ -40,3 +45,6 @@ def test_global_module(self): result = check_and_set_core_mode_arg(mode_arg="seqcmd") self.assertTrue(get_global(CoreGlobalIds.MODE) == CoreModeList.ONE_QUEUE_MODE) self.assertTrue(result == CoreModeList.ONE_QUEUE_MODE) + lock_global_pool() + unlock_global_pool() + set_lock_timeout(0.5) diff --git a/tests/test_runner.py b/tests/test_runner.py index 5e88aa9a..8150e093 100644 --- a/tests/test_runner.py +++ b/tests/test_runner.py @@ -1,6 +1,33 @@ from unittest import TestCase +from unittest.mock import MagicMock +from tmtccmd import CcsdsTmtcBackend, CcsdsTmListener, TcHandlerBase +from tmtccmd.com_if.dummy import DummyComIF +from tmtccmd.core import TcMode, TmMode, BackendRequest -class TestRunner(TestCase): - def test_tmtc_runner(self): + +class TestCore(TestCase): + def test_backend(self): + com_if = DummyComIF() + tm_listener = MagicMock(specs=CcsdsTmListener) + tc_handler = MagicMock(specs=TcHandlerBase) + backend = CcsdsTmtcBackend( + tc_mode=TcMode.IDLE, + tm_mode=TmMode.IDLE, + com_if=com_if, + tm_listener=tm_listener, + tc_handler=tc_handler, + ) + self.assertEqual(backend.tm_mode, TmMode.IDLE) + self.assertEqual(backend.tc_mode, TcMode.IDLE) + self.assertEqual(backend.com_if.get_id(), "dummy") + self.assertEqual(backend.com_if_id, "dummy") + self.assertEqual(backend.inter_cmd_delay, 0.0) + state = backend.state + self.assertEqual(state.tc_mode, TcMode.IDLE) + self.assertEqual(state.tm_mode, TmMode.IDLE) + self.assertEqual(state.next_delay, 0.0) + self.assertEqual(state.request, BackendRequest.NONE) + backend.mode_to_req() + self.assertEqual(state.request, BackendRequest.DELAY_IDLE) pass diff --git a/tmtccmd/__init__.py b/tmtccmd/__init__.py index b36f8faf..192b3841 100644 --- a/tmtccmd/__init__.py +++ b/tmtccmd/__init__.py @@ -102,6 +102,7 @@ def __assign_tmtc_commander_hooks(hook_object: TmTcCfgHookBase): if hook_object is None: raise ValueError # Insert hook object handle into global dictionary so it can be used by the TMTC commander + # TODO: Remove globals altogether update_global(CoreGlobalIds.TMTC_HOOK, hook_object) @@ -112,10 +113,9 @@ def init_printout(use_gui: bool): print(f"-- tmtccmd v{version()} CLI Mode --") +# TODO: Remove globals altogether def __handle_cli_args_and_globals(setup_args: SetupWrapper): - LOGGER.info("Setting up pre-globals..") set_default_globals_pre_args_parsing(setup_args.params.apid) - LOGGER.info("Setting up post-globals..") def __start_tmtc_commander_cli(tmtc_backend: BackendBase): diff --git a/tmtccmd/core/__init__.py b/tmtccmd/core/__init__.py index e1d6b325..222c45d4 100644 --- a/tmtccmd/core/__init__.py +++ b/tmtccmd/core/__init__.py @@ -24,7 +24,7 @@ def __str__(self): return f"{self.__class__.__name__}: tc_mode={self.tc_mode!r}, tm_mode={self.tm_mode!r}" -class Request(enum.IntEnum): +class BackendRequest(enum.IntEnum): NONE = 0 TERMINATION_NO_ERROR = 1 DELAY_IDLE = 2 @@ -35,7 +35,9 @@ class Request(enum.IntEnum): class BackendState: def __init__( - self, mode_wrapper: ModeWrapper = ModeWrapper(), req: Request = Request.NONE + self, + mode_wrapper: ModeWrapper = ModeWrapper(), + req: BackendRequest = BackendRequest.NONE, ): self._mode_wrapper = mode_wrapper self._req = req diff --git a/tmtccmd/core/ccsds_backend.py b/tmtccmd/core/ccsds_backend.py index d5bc2510..1af01b73 100644 --- a/tmtccmd/core/ccsds_backend.py +++ b/tmtccmd/core/ccsds_backend.py @@ -8,12 +8,12 @@ from tmtccmd.core import ( BackendBase, BackendState, - Request, + BackendRequest, BackendController, TcMode, TmMode, ) -from tmtccmd.tc import DefaultProcedureInfo +from tmtccmd.tc import DefaultProcedureInfo, TcProcedureBase from tmtccmd.tc.handler import TcHandlerBase, FeedWrapper from tmtccmd.tc.queue import QueueWrapper from tmtccmd.logging import get_console_logger @@ -49,9 +49,7 @@ def __init__( self.__com_if = com_if self.__tm_listener = tm_listener - self._current_proc_info = DefaultProcedureInfo( - CoreServiceList.SERVICE_17.value, "0" - ) + self._current_procedure: Optional[TcProcedureBase] = None self.exit_on_com_if_init_failure = True self._queue_wrapper = QueueWrapper(None, deque()) self._seq_handler = SequentialCcsdsSender( @@ -113,19 +111,15 @@ def com_if_active(self): return self.__com_if_active @property - def current_proc_info(self) -> DefaultProcedureInfo: - return self._current_proc_info + def current_proc_info(self) -> TcProcedureBase: + return self._current_procedure @current_proc_info.setter - def current_proc_info(self, proc_info: DefaultProcedureInfo): - self._current_proc_info = proc_info + def current_proc_info(self, proc_info: TcProcedureBase): + self._current_procedure = proc_info - @staticmethod - def start_handler(executed_handler, ctrl: BackendController): - if not isinstance(executed_handler, CcsdsTmtcBackend): - LOGGER.error("Unexpected argument, should be TmTcHandler!") - sys.exit(1) - executed_handler.open_com_if() + def start(self): + self.open_com_if() def __listener_io_error_handler(self, ctx: str): LOGGER.error(f"Communication Interface could not be {ctx}") @@ -161,15 +155,8 @@ def periodic_op(self, ctrl: BackendController) -> BackendState: :raises KeyboardInterrupt: Yields info output and then propagates the exception :raises IOError: Yields informative output and propagates exception :""" - try: - self.default_operation() - return self._state - except KeyboardInterrupt as e: - LOGGER.info("Keyboard Interrupt") - raise e - except IOError as e: - LOGGER.exception("IO Error occured") - raise e + self.default_operation() + return self._state def default_operation(self): """Command handling.""" @@ -179,24 +166,24 @@ def default_operation(self): def mode_to_req(self): if self.tc_mode == TcMode.IDLE and self.tm_mode == TmMode.IDLE: - self._state._req = Request.DELAY_IDLE + self._state._req = BackendRequest.DELAY_IDLE elif self.tm_mode == TmMode.LISTENER and self.tc_mode == TcMode.IDLE: - self._state._req = Request.DELAY_LISTENER + self._state._req = BackendRequest.DELAY_LISTENER elif self._seq_handler.mode == SenderMode.DONE: if self._state.tc_mode == TcMode.ONE_QUEUE: self.tc_mode = TcMode.IDLE - self._state._req = Request.TERMINATION_NO_ERROR + self._state._req = BackendRequest.TERMINATION_NO_ERROR elif self._state.tc_mode == TcMode.MULTI_QUEUE: self._state.mode_wrapper.tc_mode = TcMode.IDLE - self._state._req = Request.CALL_NEXT + self._state._req = BackendRequest.CALL_NEXT else: if self._state.sender_res.longest_rem_delay > 0: self._state._recommended_delay = ( self._state.sender_res.longest_rem_delay ) - self._state._req = Request.DELAY_CUSTOM + self._state._req = BackendRequest.DELAY_CUSTOM else: - self._state._req = Request.CALL_NEXT + self._state._req = BackendRequest.CALL_NEXT def poll_tm(self): """Poll TM, irrespective of current TM mode""" diff --git a/tmtccmd/gui/__init__.py b/tmtccmd/gui/__init__.py index fa41bfb5..738d8967 100644 --- a/tmtccmd/gui/__init__.py +++ b/tmtccmd/gui/__init__.py @@ -37,7 +37,7 @@ ) from tmtccmd.config.globals import CoreGlobalIds -from tmtccmd.core import BackendController, TmMode, TcMode, Request +from tmtccmd.core import BackendController, TmMode, TcMode, BackendRequest from tmtccmd.core.ccsds_backend import CcsdsTmtcBackend from tmtccmd.config import ( TmTcCfgHookBase, @@ -195,7 +195,7 @@ def __loop(self, op_code: WorkerOperationsCodes) -> bool: self._shared.backend.tc_operation() self._update_backend_mode() state = self._shared.backend.state - if state.request == Request.TERMINATION_NO_ERROR: + if state.request == BackendRequest.TERMINATION_NO_ERROR: self._shared.tc_lock.release() self._shared.com_if_ref_tracker.remove_user() with self._shared.state_lock: @@ -206,10 +206,10 @@ def __loop(self, op_code: WorkerOperationsCodes) -> bool: self._locals.op_args() self._finish_success() return False - elif state.request == Request.DELAY_CUSTOM: + elif state.request == BackendRequest.DELAY_CUSTOM: self._shared.tc_lock.release() time.sleep(state.next_delay) - elif state.request == Request.CALL_NEXT: + elif state.request == BackendRequest.CALL_NEXT: self._shared.tc_lock.release() elif op_code == WorkerOperationsCodes.LISTEN_FOR_TM: if not self._stop_signal: From a1214c3143faab40f44ed3815bc4d567f87fbe9f Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 27 Jun 2022 18:30:11 +0200 Subject: [PATCH 132/221] lint fix --- tmtccmd/config/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tmtccmd/config/__init__.py b/tmtccmd/config/__init__.py index a975f5b3..422c6183 100644 --- a/tmtccmd/config/__init__.py +++ b/tmtccmd/config/__init__.py @@ -269,7 +269,7 @@ def args_to_params( else: params.tc_params.delay = pargs.delay if pargs.listener is None: - args.listener = False + params.backend_params.listener = False else: params.backend_params.listener = pargs.listener From 607d355a057985ac0b1025416378c9f7876214e9 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 27 Jun 2022 23:34:20 +0200 Subject: [PATCH 133/221] removed obsolete function --- tmtccmd/__init__.py | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/tmtccmd/__init__.py b/tmtccmd/__init__.py index 192b3841..488e67f7 100644 --- a/tmtccmd/__init__.py +++ b/tmtccmd/__init__.py @@ -49,9 +49,6 @@ def setup(setup_args: SetupWrapper): import colorama colorama.init() - - __assign_tmtc_commander_hooks(hook_object=setup_args.hook_obj) - if setup_args.params.use_gui: set_default_globals_pre_args_parsing(setup_args.params.apid) if not setup_args.params.use_gui: @@ -96,16 +93,6 @@ def start( __start_tmtc_commander_cli(tmtc_backend=tmtc_backend) -def __assign_tmtc_commander_hooks(hook_object: TmTcCfgHookBase): - from tmtccmd.config.globals import CoreGlobalIds - - if hook_object is None: - raise ValueError - # Insert hook object handle into global dictionary so it can be used by the TMTC commander - # TODO: Remove globals altogether - update_global(CoreGlobalIds.TMTC_HOOK, hook_object) - - def init_printout(use_gui: bool): if use_gui: print(f"-- tmtccmd v{version()} GUI Mode --") From e77cf8f6386155da6cf3bbcfb71a707d32137ed6 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 28 Jun 2022 01:00:52 +0200 Subject: [PATCH 134/221] new logo --- misc/logo.svg | 408 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 408 insertions(+) create mode 100644 misc/logo.svg diff --git a/misc/logo.svg b/misc/logo.svg new file mode 100644 index 00000000..fcd41c81 --- /dev/null +++ b/misc/logo.svg @@ -0,0 +1,408 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CMD + TM + TC + + + From b5d569559b9fd5622e24001e64deca7442ff6e3c Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 28 Jun 2022 01:03:05 +0200 Subject: [PATCH 135/221] try new logo --- README.md | 2 +- misc/logo.png | Bin 0 -> 65674 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 misc/logo.png diff --git a/README.md b/README.md index e8ae12e6..9920a35e 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -

+

TMTC Commander Core [![Documentation Status](https://readthedocs.org/projects/tmtccmd/badge/?version=latest)](https://tmtccmd.readthedocs.io/en/latest/?badge=latest) [![package](https://github.com/spacefisch/tmtccmd/actions/workflows/package.yml/badge.svg)](https://github.com/spacefisch/tmtccmd/actions/workflows/package.yml) diff --git a/misc/logo.png b/misc/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..2663f58c5cfe56be363051a6d3c8332e48315680 GIT binary patch literal 65674 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 Jd%MRk{|7wWM#umF literal 0 HcmV?d00001 From 9cf72dd9373a11a1be4613e099b67e62be066459 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 28 Jun 2022 01:04:28 +0200 Subject: [PATCH 136/221] slightly bigger --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9920a35e..58db14ce 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -

+

TMTC Commander Core [![Documentation Status](https://readthedocs.org/projects/tmtccmd/badge/?version=latest)](https://tmtccmd.readthedocs.io/en/latest/?badge=latest) [![package](https://github.com/spacefisch/tmtccmd/actions/workflows/package.yml/badge.svg)](https://github.com/spacefisch/tmtccmd/actions/workflows/package.yml) From bc0c7dfa7b90ee69b033033bfcf9f791ccf29d95 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 28 Jun 2022 01:09:21 +0200 Subject: [PATCH 137/221] README update --- README.md | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 58db14ce..5d789a37 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@

-TMTC Commander Core [![Documentation Status](https://readthedocs.org/projects/tmtccmd/badge/?version=latest)](https://tmtccmd.readthedocs.io/en/latest/?badge=latest) +TMTC Commander[![Documentation Status](https://readthedocs.org/projects/tmtccmd/badge/?version=latest)](https://tmtccmd.readthedocs.io/en/latest/?badge=latest) [![package](https://github.com/spacefisch/tmtccmd/actions/workflows/package.yml/badge.svg)](https://github.com/spacefisch/tmtccmd/actions/workflows/package.yml) [![codecov](https://codecov.io/gh/robamu-org/tmtccmd/branch/develop/graph/badge.svg?token=BVOE3A4WE4)](https://codecov.io/gh/robamu-org/tmtccmd) [![PyPI version](https://badge.fury.io/py/tmtccmd.svg)](https://badge.fury.io/py/tmtccmd) @@ -11,12 +11,13 @@ TMTC Commander Core [![Documentation Status](https://readthedocs.org/projects/tm - Documentation: https://tmtccmd.readthedocs.io/en/latest/ - Project Homepage: https://github.com/robamu-org/tmtccmd -This commander application was first developed by KSat for the -[SOURCE](https://www.ksat-stuttgart.de/en/our-missions/source/) project to test the on-board -software but has evolved into a more generic tool for satellite developers to perform TMTC -(Telemetry and Telecommand) handling and testing via different communication interfaces. -Currently, only the PUS standard is implemented as a packet standard. This tool can be used either -as a command line tool or as a GUI tool. The GUI features require a PyQt5 installation. +This commander application was first developed for the +[SOURCE](https://www.ksat-stuttgart.de/en/our-missions/source/) project to test the on-board +software but has evolved into a small Python framework for satellite developers to perform TMTC +(Telemetry and Telecommand) handling and testing via different communication interfaces. +This tool can be used either as a command line tool or as a GUI tool. The GUI features require a +PyQt5 installation. This package also has dedicated support to send and receive ECSS PUS packets +or other generic CCSDS packets. This client currently supports the following communication interfaces: From f65c25821d3e8d92ca52d5057852012e57941ed1 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 28 Jun 2022 01:11:51 +0200 Subject: [PATCH 138/221] update PyPI docs --- docs/README_PyPI.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/docs/README_PyPI.md b/docs/README_PyPI.md index 8d9aa68b..6c1e2185 100644 --- a/docs/README_PyPI.md +++ b/docs/README_PyPI.md @@ -1,6 +1,6 @@ -![](https://github.com/rmspacefish/tmtccmd/blob/source/docs/logo_tmtccmd_smaller.png) +![](https://github.com/robamu-org/tmtccmd/blob/master/misc/logo.png) -TMTC Commander Core [![Documentation Status](https://readthedocs.org/projects/tmtccmd/badge/?version=latest)](https://tmtccmd.readthedocs.io/en/latest/?badge=latest) +TMTC Commander[![Documentation Status](https://readthedocs.org/projects/tmtccmd/badge/?version=latest)](https://tmtccmd.readthedocs.io/en/latest/?badge=latest) [![package](https://github.com/spacefisch/tmtccmd/actions/workflows/package.yml/badge.svg)](https://github.com/spacefisch/tmtccmd/actions/workflows/package.yml) [![codecov](https://codecov.io/gh/robamu-org/tmtccmd/branch/develop/graph/badge.svg?token=BVOE3A4WE4)](https://codecov.io/gh/robamu-org/tmtccmd) [![PyPI version](https://badge.fury.io/py/tmtccmd.svg)](https://badge.fury.io/py/tmtccmd) @@ -10,4 +10,3 @@ TMTC Commander Core [![Documentation Status](https://readthedocs.org/projects/tm - Project Homepage: https://github.com/robamu-org/tmtccmd - Documentation: https://tmtccmd.readthedocs.io/en/latest/ - From 18c60ec33b9df1c63ffc5e0146c816e5c765afe6 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 28 Jun 2022 01:19:10 +0200 Subject: [PATCH 139/221] fix tests --- tmtccmd/__init__.py | 6 +++--- tmtccmd/core/base.py | 10 ++++++++++ tmtccmd/core/ccsds_backend.py | 9 ++++++--- tmtccmd/gui/__init__.py | 10 ---------- tmtccmd/utility/exit_handler.py | 7 ++++--- 5 files changed, 23 insertions(+), 19 deletions(-) create mode 100644 tmtccmd/core/base.py diff --git a/tmtccmd/__init__.py b/tmtccmd/__init__.py index 488e67f7..e0173c93 100644 --- a/tmtccmd/__init__.py +++ b/tmtccmd/__init__.py @@ -1,13 +1,13 @@ """Contains core methods called by entry point files to setup and start a tmtccmd application""" import sys import os -from typing import Union, cast +from typing import Union, cast, Optional from tmtccmd.core.ccsds_backend import CcsdsTmtcBackend +from tmtccmd.core.base import FrontendBase from tmtccmd.tm.ccsds_tm_listener import CcsdsTmListener from tmtccmd.config import TmTcCfgHookBase, backend_mode_conversion, SetupWrapper from tmtccmd.core.ccsds_backend import BackendBase -from tmtccmd.gui import FrontendBase from tmtccmd.tm import TmTypes, TmHandlerBase from tmtccmd.ccsds.handler import CcsdsTmHandler from tmtccmd.core.globals_manager import update_global @@ -60,7 +60,7 @@ def setup(setup_args: SetupWrapper): def start( tmtc_backend: BackendBase, hook_obj: TmTcCfgHookBase, - tmtc_frontend: Union[FrontendBase, None] = None, + tmtc_frontend: Optional[FrontendBase] = None, app_name: str = "TMTC Commander", ): """This is the primary function to run the TMTC commander. Users should call this function to diff --git a/tmtccmd/core/base.py b/tmtccmd/core/base.py new file mode 100644 index 00000000..ee16796a --- /dev/null +++ b/tmtccmd/core/base.py @@ -0,0 +1,10 @@ +from abc import abstractmethod + + +class FrontendBase: + @abstractmethod + def start(self, args: any): + """ + Start the frontend. + :return: + """ diff --git a/tmtccmd/core/ccsds_backend.py b/tmtccmd/core/ccsds_backend.py index 1af01b73..873cc2df 100644 --- a/tmtccmd/core/ccsds_backend.py +++ b/tmtccmd/core/ccsds_backend.py @@ -4,7 +4,6 @@ from collections import deque from typing import Optional -from tmtccmd.config import CoreServiceList from tmtccmd.core import ( BackendBase, BackendState, @@ -13,8 +12,9 @@ TcMode, TmMode, ) -from tmtccmd.tc import DefaultProcedureInfo, TcProcedureBase +from tmtccmd.tc import TcProcedureBase from tmtccmd.tc.handler import TcHandlerBase, FeedWrapper +from tmtccmd.utility.exit_handler import keyboard_interrupt_handler from tmtccmd.tc.queue import QueueWrapper from tmtccmd.logging import get_console_logger from tmtccmd.tc.ccsds_seq_sender import ( @@ -38,7 +38,6 @@ def __init__( tm_listener: CcsdsTmListener, tc_handler: TcHandlerBase, ): - from tmtccmd.utility.exit_handler import keyboard_interrupt_handler self._state = BackendState() self._state.mode_wrapper.tc_mode = tc_mode @@ -58,6 +57,10 @@ def __init__( queue_wrapper=self._queue_wrapper, ) self._backend_lock: Optional[threading.Lock] = None + + def register_keyboard_interrupt_handler(self): + """Register a keyboard interrupt handler which closes the COM interface and prints + a small message""" atexit.register(keyboard_interrupt_handler, self) @property diff --git a/tmtccmd/gui/__init__.py b/tmtccmd/gui/__init__.py index 738d8967..331de4b0 100644 --- a/tmtccmd/gui/__init__.py +++ b/tmtccmd/gui/__init__.py @@ -7,7 +7,6 @@ import threading import time import webbrowser -from abc import abstractmethod from multiprocessing import Process from typing import Union, Callable, Optional @@ -52,15 +51,6 @@ LOGGER = get_console_logger() -class FrontendBase: - @abstractmethod - def start(self, args: any): - """ - Start the frontend. - :return: - """ - - CONNECT_BTTN_STYLE = ( "background-color: #1fc600;" "border-style: inset;" diff --git a/tmtccmd/utility/exit_handler.py b/tmtccmd/utility/exit_handler.py index bda813ac..2136f8b5 100644 --- a/tmtccmd/utility/exit_handler.py +++ b/tmtccmd/utility/exit_handler.py @@ -1,12 +1,13 @@ import signal -from tmtccmd.core.ccsds_backend import CcsdsTmtcBackend + +from tmtccmd.core import BackendBase from tmtccmd.logging import get_console_logger LOGGER = get_console_logger() -def keyboard_interrupt_handler(tmtc_backend: CcsdsTmtcBackend): - tmtc_backend.open_com_if() +def keyboard_interrupt_handler(tmtc_backend: BackendBase): + tmtc_backend.close_com_if() LOGGER.info("Closing TMTC client") From 6aab7624a9fd8ca8b977ed24ac6d3312ad5da9b4 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 28 Jun 2022 01:21:50 +0200 Subject: [PATCH 140/221] missing include --- tmtccmd/gui/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tmtccmd/gui/__init__.py b/tmtccmd/gui/__init__.py index 331de4b0..b48e67ec 100644 --- a/tmtccmd/gui/__init__.py +++ b/tmtccmd/gui/__init__.py @@ -35,6 +35,7 @@ QThreadPool, ) +from tmtccmd.core.base import FrontendBase from tmtccmd.config.globals import CoreGlobalIds from tmtccmd.core import BackendController, TmMode, TcMode, BackendRequest from tmtccmd.core.ccsds_backend import CcsdsTmtcBackend From a072e9593b5efdde3d22a8ac25c8a2c8fbf5bc3c Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 28 Jun 2022 01:31:11 +0200 Subject: [PATCH 141/221] bump spacepackets dependency --- setup.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.cfg b/setup.cfg index f1d9be3a..e3e1a8c2 100644 --- a/setup.cfg +++ b/setup.cfg @@ -32,7 +32,7 @@ install_requires = colorama>=0.4.4 colorlog>=6.6.0 dle-encoder>=0.2 - spacepackets>=0.10 + spacepackets>=0.11 prompt-toolkit>=3.0.28 package_dir = = . From 9ab3fee64d1e2ce2384fbd0a8a80621f6f07604a Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 28 Jun 2022 01:36:01 +0200 Subject: [PATCH 142/221] update logo --- logo.svg | 408 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 408 insertions(+) create mode 100644 logo.svg diff --git a/logo.svg b/logo.svg new file mode 100644 index 00000000..b9732654 --- /dev/null +++ b/logo.svg @@ -0,0 +1,408 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CMD + TM + TC + + + From 3c14c3d7da051420ec8b97ff5a1426d417381069 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 28 Jun 2022 01:38:57 +0200 Subject: [PATCH 143/221] remove .svg in root --- logo.svg | 408 -------------------------------------------------- misc/logo.svg | 62 ++++---- 2 files changed, 31 insertions(+), 439 deletions(-) delete mode 100644 logo.svg diff --git a/logo.svg b/logo.svg deleted file mode 100644 index b9732654..00000000 --- a/logo.svg +++ /dev/null @@ -1,408 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - CMD - TM - TC - - - diff --git a/misc/logo.svg b/misc/logo.svg index fcd41c81..6acf6cc5 100644 --- a/misc/logo.svg +++ b/misc/logo.svg @@ -9,9 +9,9 @@ id="svg5" inkscape:version="1.2 (56b05e47e7, 2022-06-09, custom)" sodipodi:docname="logo.svg" - inkscape:export-filename="../../../../../tmp/test.png" - inkscape:export-xdpi="96" - inkscape:export-ydpi="96" + inkscape:export-filename="../4212d59a/logo.png" + inkscape:export-xdpi="300" + inkscape:export-ydpi="300" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:xlink="http://www.w3.org/1999/xlink" @@ -28,9 +28,9 @@ inkscape:deskcolor="#505050" inkscape:document-units="mm" showgrid="false" - inkscape:zoom="2.5877449" - inkscape:cx="193.60486" - inkscape:cy="594.14665" + inkscape:zoom="1.2938725" + inkscape:cx="159.21198" + inkscape:cy="784.08035" inkscape:window-width="2486" inkscape:window-height="1376" inkscape:window-x="0" @@ -337,7 +337,7 @@ id="g1555"> @@ -364,44 +364,44 @@ CMD + style="font-size:29.9072px;stroke-width:1.20758" + x="81.503525" + y="210.10712">CMD TM + style="font-size:29.9072px;stroke-width:1.20758" + x="42.454617" + y="164.31529">TM TCTC From 72bbf6ce66bb938950dc80dce622f98e62b43282 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 28 Jun 2022 11:17:31 +0200 Subject: [PATCH 144/221] better logo --- misc/logo.png | Bin 65674 -> 1012252 bytes misc/logo.svg | 370 +++++++++++++++++++++++++++++++++++++++++--------- 2 files changed, 304 insertions(+), 66 deletions(-) diff --git a/misc/logo.png b/misc/logo.png index 2663f58c5cfe56be363051a6d3c8332e48315680..8df8089b12de217959ce9e97d577e252d0222141 100644 GIT binary patch literal 1012252 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

_qmW*+Uera1L5_ciARUvC;hewD5tIy zeHT0miRHEns|L)f&#v>IYW7@x&x4P=>E^PWoD~Z#LsI@}*O+-P_?u_>b+cRkAg{a} zh^LNHnDi~0o3F%wS(KadyN&C3PLN)Ceqp09?*i@r*1Xs)KMWOcBP?*X2!A_OkI+)j z8FZgP>>C8Tz##A1Z8>R@7XEGQ9tK%hCvY6D|9LUvg~mVstwi{CrEn~sZ#}kpYY(eg zIakcM=PC0#8D%Phs(7>zIC4G6u_W&FAkyowUe)&dFo5{ylsigLbO!lk{6!|zu1ITZ zH3037`1R0d#pFIMXMM{4xo_WVZmR2KdPok@+oa)v0l2!^$YfY98nTZc4qJx%=V#H( zP%dPW!no>?Zyy|~@wE!$mn@lwrTvOxJ(FQT0nOlpvcujN%0*3<^&owuuYt2+EA7qm z$+Hj5^1m_{L8;R*4vvZ}le@dAantNX`;f^?=cQs^M#B%sMn1qb+Q(}C_`TV>cZM1U ziM!kjyI&1CqN@<-vQxm}??>#a!&%MfYEcPrQ{fchuoQ=NXp;2$NGMX&Nq*0L7r>%b zHp4uWl@c|>mK8w4L8n)D`8!XRh0~`2uo>}l@`?X7zAcEDiKg(l2ov}lL8Nrs2_Kw* zG*F*FOfiG|j41a~*@^ z1PeD8sV0Qc+GO0(I2Be4&;uZhf4iqLzQtzjar(ttoj%( z(=TCd42FZV6C7-zVv|5S6d_;J%BBB27>3(oT6|LqYB!36FmX5FZyjM$jY4WgiAvjt zb{mlDA?T-hHLNs_%LSVg9llE+N)y`9>a|(e&AJ*|REN_0uJ-&*&DhTW+*UGFMyp>C z-v+r%c^_{)9zkk41-B=%$>wIA^{_Cb5XvroX+g9}oPyA@-rdE&UN4dRmjOcPbZ-vC z`^~y$aB^ROV770 z+0gImiGMEN$e<+cA8G-um!Vs!h&i-HR~FrVZ3%QpSdUEM@4T1Q<>w<>(KlRu?c#`d zg{_qlJ;-Vy1{vbae-+U~6ZsBiN8agEa^1^I8EY2dooSjEoc*?v*nH#4mTu^g#kAla zxUaK5X1fUP_gh%~lkRX5bNohms@4zsGr_70G-oO{^Q~l@H&m#1vcE%5w~;X%G-PYo zCsMQRUjoX_uottGZJG>cNw3tiQ5*Rmw%#%-%IJL;21IEXQbM}ByGuHimXPl5mXPl5 z28p4&OS&6|l9cYQ^Z5J6IqzEUhxt5f&Dyi~edWC{K-yD22=np9oPe-UFFM`pqmVNg zSa`t8=o~UWwA5(4hb|D_EaSCD?KEP<4xj0N-o!`K34k z8_H(F&&e~zgjl-SusTFC(FO6S=^OKVQkym{jPd#tHnx7mMHM^_(Uz3*K@@aJ%>qXo z#cnPNjP&fl=Uq_zM;emP-d$g~ua0E@?1e7=%V8KPrLY}u5PxQVX%!DlBQ20fbRj+R zi5y?=7z>XQBYr)9h*HXK-^r5p+~r<%Kk=A^SRU6bVz;Z^d=q2(nGi0l)AxI-mTm{O z;1+Ur$X@!=jHM*l09MQaSPZ+zXb4);PZt|)T*>qr6>X;05>xwM)a0#F zoi1gKV{>5r8t%t9zl(Oo39A>s_1C3r>YP>Ed2YuKuNZ-)qiTd@9`92?;lm9d4m3CH zzMQJrOetjV?M96ihjMMtGjuc(j<(ow5l%W;IW6+pejr$G&E}qq2crzH>~WhK4+*KA zdtU|A{3XZUUFX=?m4`Cp6LCDVKoibjK%~g(%32|(4hO{wf|&RTW^e!^vkRN zX)BU+ruJ+~Jpo_JS?DVk)5q79Aua|H}X-fQKuDQEo;QdZ+I_0h&5W`1nJGKN;zJj1NP{6CnGo zdfDZKToW$xp&l2@MQ^&lp=80TA6J&tm2~LKKlGO|&#K}_&x)(II9I|+u0?rN>dXy6 znu(4+4W-|PRF1fTXDD|jB`3T@byLh~-FPonZ1c{LkSMf2i`hLXC9i(Yh^v(G=|56o z26XVb5~7YRLD&;+?`;K0IHV(IF?OEoyajy(*Md-514)cr=Ag-M8{urdVl3#)%jnLm zZpE-{Ho@(*az#*H=}T|AaI~Ml({;l&6DxV&dBUH~`MkHdcKp)5(4#0}*RtQg z=N_+7G0)t%q&VXQ1067A{e1>&r*C1YN0T($IfFY*z0<-W+d94Bomp=qqq-VKG+${d z&&W4UW3U3vOj)RsF3v0)*Ytvka!CpVnWSN|ID=Jyi1m+Zu0&!6c@w!i;V$(PinQ(7 zR}LJk8|=YrLf5Z}ckJSgD@@onb%{H|baN%+v*U-LlnW0bAG(XbZgECEI*nU@JZhUN z7$ihw0!gQwmGhTvOM}Fr$Iv4|!TqHu{$V7t@UZYkdBAcHx_6|kVq~azSZrV5i^N2N z$LK(mKf=*j5{OXI`!6)5rlpVK)V0y({|ged*QW%M8}VITM*#v73;+r2?>rd=-f#?o zmys;IUF+=sCHhs;1w7*lsGB^DjO4jPbn5YLc-C>*(Gm^!cD^mdeE=GM5)F!+n}XPa z$^u}?Fk~4>{YfU`z*Eu_#*{xW$f!uEWR0RSM0Ud1=~*%knB42)tC+qONIEUA#1(GsDfWEe)z!=${gSd^rRU^CO~flA3MuW@Mh-(V zmU0Rld%5!~eY@Y*XwMP$_(#!hJg$yASoNjt!%&YMw&>27d{&U-_^Z=sk<^oJ&p0)y zTmK~MXuS*Djf^JfJi$NhxwGs=6@q3bp>}sqmu zD+gS(&kbsPV6M!EcLwBVtQZ}5+C-P<>`ej1ULjTbn!++8o?4ZXkg7N z{QJabV927tlExMHbYKt^>6I>|7J-km#}{&sv?s#|$E{VPov}8AFTc>FFA`HPo76^Y zadU{UQxJpC5#Y@QgXv+R?$%QL(%d?%xV_KWE=U`1p*78uNYiQv1Q1p(mb%_z})ptc1V-7u1yR+9Tp!% z=}#uTHI4ZB^DL%Jk*np*mx$hr1>F{wlFEefpI?=I25HiHk_+P0GuTtO#8OCu1Qni2 ztbMijt1Uj7_WZVZ(hSI~)Et*?gpD^rS0^CGFI)*O%qm{&SFXe2)ku;;a>uq4s$t^Z zWI(wZh`B+{d49d~8wTK|+1d=T@Z0+*oQ^I_+1$7vIGQqeZFtdp!_lTc(a|@v-gbw5 z6tckq3lw(uuR0~`6->J=i7-k9{>I!#jJa9p=2B zb`tK(qo~nk#-pR=VeuL4R~Tu&@p|*4U8WySw9hm`>Q{u+)v4(5#UnKB_C2<}J(K_1 zS$fQ7=sT-fy*(ZQ-&-05C+y8-o-x7Jo4gXsFe_KR`6sC(eWY6PYC28SH<%3@gkS>^ z+b1mBYZ>U(iS)3cR&A_RJCN~f`Rd6MJC=FSNzu~`DM?T?PztU8l5iDI}_515NFaZeWbDyHR7;fw{v??c>2xn}X| zyb_$?NDNWgbAF737`?bS%DZLuzbjK2flkkhL4{{^2!l}4u2-ApacKb+X z0LeGKJZA3b{nUC9U=zO3Qi5rKR$Hhksbf#QTq^jBjTZ!TqhFZ+JX^?WV? zvMv*5=c(qlUV)UV|JcAe+$ZZP=Dq2z4DZ)x6CpY7tB|T%JOSV#(;$NM%Jn2@pnRx=MVNg75phZgl^tG zd)^C4P07*IBHWBfiYmx_IL*`Frd5hR5<$2hdWbzwIh#rt`azp!>$k(>5g(;yJ7?;f zYyZ$gigybp;5B1QR4&uB(z=%t2!b(eMUCf*W?ehC%Oi}3)v0^u6QG1P3RqRNDN;%7AI~Z45iLPb22<%O5KQmJx}jL}}uzi15-4FRXYMmv%S! zwCtqhxK8eJx=}S^J1|lCc@eHeYBDLdH&>JmFIcBbzO)IvU5<+4c~(Mcf{m%vEb zmai~^PT+;l{@wgSkDDzCoi8JenF};|f)GK7fOE|2yb+XtU-@5dnI^S=*Uy>wdO;OGO{WlO2L<*a9UPq%x*xy&^_8 z?;W1q!WTde&leiZAdfCUrzfJ_i!(I*-7iaTjx8<~Ye8cG149Fgh#?{)vU~=w9omrk zE{zkK%GJGgmW)&r55%=vRt+B)8jBm9G;@{nUEmw^*jzf2!$Lnf~lJZ;A!_pqG$B(j9yK{(^bE0Y9xG}3f9{1RB zVR4E*B$oF}JGmGsT#QL9y?$bf7r)Z_%<8m<78o-g<5DAoiOvch`5XCRo<-wKEZcPb`w1gJ#60j-Z`}h&F-oB zc&I&yVE@@d!kHbLx#jh181FjxR6@VrFsxm0fOMZl%$-0QLS<|PXQw?Sr(G-L@^t+wE)ls%gN9cVX`rAf-^;>^i4}k%LSe$lL`ZpCSrvQX z23f^O5QycmWG}rw$)QEE{Je(3oz#d^PK2f7E$37(G*aLT|EwMJSr+Z5>=CQgKacF6 z&7stZ%$B%5d+8X1z4?`2G;Y&~03912Ycn+%ot5fYMKnbYlJiRiV+s?}R zu@d^u)Ks#Rx|~cwgyjd~&~Z3C6s#<%fizSyRIZ32K;OaCJwXqrRlurJD8m}U*ML~j z;Ykz|-;szJ)_+I~3+fy7U|_ivX-zIj)ilXnulCI{$Xi#Z^RYG5-Y8=*w&C#6>BDEB zM00|*b!FQC>4q5VIxMSWR=>yOj=5yIndhHZ^8F|cmR_KsB*%2+_L&fplZeQ7t`;)`6DWJeIk>a{?bGn@A_JKmwn2I>skK8>w_PT zUS&j08xH20=D!$j+8rbkw97pP=6S4w3)f{KT73(PjnfP9;A|GTs?}zFlTEw8cOkv^ z`fre`R#`%1;jZh5n6roLlB)VM?)N`mxehdazlGHTGyhSuu6DAK^lV10G5E%vGRcqY zGkNX&6TDSviqFB6BP-vuT&1ziv_SC}JZ1f}hKD9F0j)OkvbAj~F$8jbSA2G&t?$a$ z{Fs#`-=TV6epG-x6dz-|UFJnyF-0i(LjO=d#i5#C1&)jO@FnK49)gi2LnkTK$kX&g ztIdftiSo(XR7^s8NS#eM%#=G!+7K6`&Yu*}nd03W5GhH6WCB6|p)|z|gCqbNb|@C4 zvWgiOJB|m=V}U_O;2{H(nJcbp4;q0J5g*bI*@@GY&$e(vn$khNFA3~b3s0w`8Y6A4 z9oqbZOw%i@|Azlh?EHwR#GPU#sK|ex7f_=Tf@hXKEiccP&HBDqdr4{?vP6zy#9G@}(jrfh|H1vz!rsJP zDaXaV;M`iByBa|&88W17x^)W&*@0jbx9l(OWR0+pdzH;xm&obly(j&0z4?xqZ@VJ~ zs{6!EpwDY*;RugaAlAagUcRFuX7pMZj@%1;(eW8)6h)=-{r!lY`@lVa=T-8LZKDR< zC_~RHB_G2x1CWA#rQkz{5Yg0HjD)(FrWRQ{$N*(AFY2;UYkY2^?utUG%^XVYWmb@p zI;Oi<#+2KpYPvX(PwNw=%_y0h!maC7g=8BGs`L6$$H`}8H;yB-T>@q~l3N1m1W3aE zv5BQNUR`bZ1T~?NwF0@~yPkT+6}TO6&KhiS#M-fef`;rVy^RY4%~wWRtiWA+L+;J2JEa%XjJ@wM%T$kvZrV zXS{uilREmEYH&5#XKa_Hsb^4fPFKW>5$VghA(HlcVZ4)nTwxw16;q3Ywm)6)2_6l* z>D$ohMG5IwaxfN)C&%-3=zp}^U{k28r=}&-3TGig5WJ47TMt`EY2VqLcqItv)vK|6 z;fe5maicNoOWe5N&*|u?A{ofIY3sV<^{`V{vdcb_>y)eeO@)@DS9!FUePs;#LD`Wk zTilu~n-yXu>3OC9&zkW)(2lp(%yCEBPgQ##^-?Wg#!A}(iQyA7!N`tnJ@Yz^NYOs@ z(~r?3HH=CWZkw0$x5sCzCLuR=NAC(8B|#5`mtKhQ+NAGZpfzQ_sY;3*ktN+16~X&s zp#=-<&sPrZ3=`GzA3sWN?2@x$3sVk70TD3Fz?kM+bfF_UvgVsH044 zswFO1l9%U2>*~!WmyR9<0P}WHH~osjPkHT$t0s!c{&H+GnW7!+>TZT`*g^>w6k>TY zZ4tn{L-8rro+MW}7E~6?5?w?cz!F|G*gaQ{jfo%`U#Cqzqr$Nu8svI3PM>1jL)_*D27=N)hlgR`#aH*Rno^Xf)@kK|Xr!Sizo4m$z_7tu ziNK)XDygHJ1CpjHtf3+Yc32oa6A2r2LvfTLYje4pQs%5{ChJIJD}yUtd|mA^yp<`A zj(?!{JY`Ezt=?VjSbkCkcA!s$Gm;yA#F-N=QgyxO)!e?%a9iVvi?67j`Mx=G2eABu zjI@-9Aid-?4a>YX%tW%VR>yR=l{QTv@h|~R*uL2B=CJ=s;A%o+zlLVV%5dD_&yh4m#B4vIRH?p^GUMViPp8Li*MecY5j8)p6j`2BH!66vzRE10c zhPrsGY-2ZG`c`BYlR8wVZZ^WzV)BK?i1eGbj{QdRTE_94v16{n&1VG()z|3XG2Enk zhuk8`J14PeVC&*6^sSw;a*dBO?XTc0SqNi8Zlt#KdPG zO{+QcPkPTF5ic=N7;!f|NLb}PQ2o~lVn1`FyVQL9;bz33$$2RI)n?31V`9!Ge zMl825+RZXk=1dtL`-*jSb;o#-0v97SZL>A`5C%2W~TKa1GJTZxG)B<~Urtg~7_H8l&!o1ymb7-06XV z)O?4WD%~{|OS9ac6?36lc=0Y3+o|=cg+@QAL`6hM$nrqFnq#PN{#VBIam4_bFoz0{ zq%MaUgVyk8L8pAy?5&uo5dC_?<3}VZX^}$0q>}0~sV1r|V1b>Waf^Mp6}?IU zjN@X#XUO&0q))q1t`3K2_IM7`;OKAy2Z3Nd-s=N#C&nIFU?p{=6#+rC9+y*4lCVYi zC|Ko#)6et;ql~@;YGDW3=bd3Wf~YIH9&X?5D9EI*>kn=#%Ht>qQdMfXnUW7R)3BA~ zFQUL!&SQq$fvG=Mz6%Q?+7S$YwBz+2FQkaBiMg5q(?$`qAWLN{HNV?ke5sjf9$kyD z-$sh(+j$h)r^i0wdvD?B_rzX1V)v)pN_X@`!=%C|X$=-tf68={E!8*NuRyUsVWlLy zoD|M(+=%how~|8Ia|pc;W>R0*l>8job<}TavGK+~GN)(%u|bHr;f(prg>l9Y{fucR zsmZylof56!u9eYV_fj6Q8;yMo3#RJ)^xiIgpf@drk)+6P?C!;IZ7LbL)(39ip_Osk ziVeIfKZR9icC??OXl&K@ATf<%tDb@M67JBtgnUy?O8F|2T}`79WA!ia#2$ zko5k9?ssrZqGtn48);BmFYq8kj{rJWJ0_1yw|ku})p|w3uzyoNsoj8JG`E;3ekl+B zAy2@GuG@^1d8=?*iiU5 z|87967-m+$A9k75A(#-V2$j*lIwNDQ3y*+!?qI`j27;{TsVobt$YGI~W#CV^9C?RV zX8yJ?C9fmnCsa3x?UHO+vGKg6F4{waX<0* zPfIuiDqkF&I4;i~To$ctJ6E`(OkWy@h9H7_QJ#v`-kXGH=V#+1^7nwO?OumCb<>hv z&VRKmT>Cll*-Pto7dxrjrNHS+Z$p5!&wbt%Fg7 z=D|55M)W!N#(-FaIMR3ty!VNqL@0b#7~EP;EHThKQdm+XF}6ah7#alHF$^(^uZTSo z6p`DZv#dz`XVwLHlC^!g6jvS|HY!Xpp6&VY_Wzi@ZL8(#U4zJg8;__>3=YT- z027|4WA!)zfl+wAkd%sSE#2?2J!^GC>_I>y%f;fLf``I}q9gh4gk!bUBfDJP1IsA0 zWB|`$z{g?W3MjSf6{ZtN1qj8*W%YR2n7~iVG@N^|xn_~|i~09_FieF)T^?yCy~&zn zD{E$$b$N@_Y4mN-XKKORZBb4+Q^+0hsN{IMB79lUU3~SJ@8eei71DD4R7tdy8Q9KqF}P^TYKyv4Mk&BB~@&3V*U-C%2>jYBiw9 zg&=S<*XRpG*Ixx=fY|2=@8mMWh3R;<%|7pT8Jo3iYvYY2HUYVGSe#jpRr%&H4qpWl zRX)S`1cHV>@QXe_FdzT=QsSC;c5K`AqWpbnQ&l=`!cjuQ$RBFZ@9p3f&3ofrh|u{f zdvO1?0caZVpzU-n&G2b@>Rh7g4LDTo)(`r# z^i7gt%Q8XWFzRyU0qnKdazwx#j`>3-NGm7`8#*YuT`MEs;;hk!i62jq`E+Q>cg?(P zrb%y>JC-x9;%6u&W*&b_de(dOP)huwjy!`s4eWS6D}jnkj>=WT?>~-J3zFcD|SoV!!i>8Yz7~;uPVGs}JHz-0{3UR`xkeNU0DPU)dt)JSZ+7)9nbP%^5kr zzxvf&F#2;R!TDv)Obq4f1(ecG;5G-T<2#l!FZ?U`7&Nobx8bLf<}0MXZJR@&|sxv z()YSEJlbRTwrAF1b7@c5$Inc!|0uaKnr_Q5N^uYb(RVO^CiFX#u2WFN#zi&q9L*4_ z;mzjo?u#F+C9b+|j^Wiz@Wyd#AlvXRn*Rzb2bX_(>2{U@bk&U4&5mac&r?JlqS3|T z5w9d$W$dSHOtfZfCsAkSK+=SA-YU|6fjdnl?7~<$cUtcr%Vnl2$JM&37?Yb0s+)=E zAsJY&mXw;WufN$w8fvKeJ>q^FFd<(bCwtVclD){1;#UOX9JaVC%x5|`eakVC#_X%1 z@X5Ci%aDhZoaz1ur! zVAKO_l28BFCdsi0APNtuQgi~l1#`BUj@TsCLTaNicy$xsl4GrkA&hExY2;7j`!B71cPPh<%6FfaBf>3qA=aro<*Pt)&+vC8xU9fQi*SUWAH_1A;^0qBS#Js}5 zPI4O8Ne|V!?k!5+&+zJEu+luk>!@A(OGQFT z)g%hxs7Atr=j*=k<$p+&*$(i+=7o~}eAnZfP&OoW_emELz3sbuA@#~(O3(jIZkbJB zltL#$dc?%8F`YW|+dyY6N9I(p)IofXO}wHOAvY3&sqi#x1@RB! zgEhQ4YOEFkKrb{5+2w8`46QlG~PYU+sIyu2T=MKR6|pN39oMnW=(JU47=QGR zb1Vz|++r*+qScj4Bfe7HEYNQcxBKwpsjGg`Eq$`JNZ5D%>Mkl>P`8nWyPC2Ju}hOY zYP$^6_w7!oY5q5FtKVB&_7`_9D~&>z4A`SyJ0%^tRpaaQ2F}V1ObyY?l+d+_?Xnu9 zS1~eua$UxV6zSIjSzaqH8K$AMPTxv?2*H+YWPF51nXo7>ni1bcnA~@t(l(&BLzt(+ z=F9vcy_?*$b{QA=d2!yQdpJqv&4^f#_<7s!dh^G|>-eOtB9(23M$8~<$IZB3haJbS zTVI!88_3C5pHYUFg)5ig7xTymc*VVs5g$H~AZwj^TxsYd5Kdq={yuwNNO%b$=Cf0n zg5*jMaS`}>ch<|@ukh8&n&&az5BF!o>dYh46>KD2!P``FWrr?v7^l0T(;DUcY_=6r z7=aMHTVRRWvr0Ez=8FRp?g%IK8BGJd*o)DEyE>m)ARw3I;LTfWEkE#N-Ed)^Z+6BG zGs;nqqfl03m1ew^(3`AoynMwzo2Di?HgE7wHoZ)j{O!mkLrw;$hlSuOtBfLIIVtT* zBhja({h>kh)~NfOMk4WeGNRJAOeleXf-H!r%0{pZ$XvIc;#)PL)>ZW*|}?oO9D zWNpUfN&pv=ZU20Kao{`+NS8?6K|o8YrO3auDN=@bx_o2vMuzfPF~V<^7`O^GX4F)R z%pl~S(byc&&=hAi;RhZSpFlKFAbSk1)YyYUig20Kq1bYNTpSuw4N?i(QdwA$;`LJ~ zwz2|im~RFYmMi3o`OpJ@Ckh&%v!*`S?xx`}EDULWLyD#|wfi*ER_4b#H&-t5dLXCRU57x#|as;zc!c%-I<6+Ls)YQQjiw!0y}`(dfg zSx|qup3Bwz@y0w|TfSX`yU}74OjMmExltSujkH}gd*0pi#YaBUe*Fs+?$biQkMm!? z<2`aUbIMmO^Jv>5+e`O)cpr*&B*tNuvxn|er0G43n-UF#rZ+wPCExG+Gxb&+#IN_= zL8x4ESOb6Km-NSaySfynsE4=bw1g+$XMNx6?){uj)7>QPph-a&g}1}1=cpvJ4zPw* zcte0 zi`upGDT$~D_rtYfRanN#gySXt3|b@~Pb%q@Xj6O-A}C;41X~N$@LNh4N66BiOOitAMQbh+^Oi^{auPIH~KTy+!m;xvy%rA2u;?{?ZgG|tA z@|Rg-#0rf_pyF`y{Y9V=-q$EQDq1-rgpjf9H-rZ~j!;^<%JAb0g29p;xx&!%C zb?rM|WVic&r461Tz4obhmgAjQ_!YOE->Pv07H^^xA3lzWeE>M=fSK5y!Dwh59sYWc z?-Kvu%Kuh20Ftg^hgK=KifmkQ4eu%sOaT0{a?dB0r63U13`o3D)-kmfH-El4A1Teg zhlFc7AlTrLzeb5<4G|8;biLxrT>NYO;jj0y%moe|I{ey(dPH=jB4tdCElOn_tB6PC z=jr_X^$|#^3(KwZ8l)AbRQ-UTy8C9|!L`a=sPT9IUH zf5_M9n(;;IQs*UI|LFf6pCc)dYUM?^}a^$B8s9tT(Mb$i~;kMNftBiN%KpJ;uq( z(JrczffQ0xr5fw%q7P|Wi5;b!Oilos5GQx!jMvRSEcVFy$?0WZ9_rOww4`$*iVa}x zC(V^x8R?OvSnU3vLjq-JDPNIRLDnz%&2{Oan?o%p7O$W8LeB0H!%3jQhx#Z4+!hl;IGw9TgkG zp-PUQ5!(}ofM+eOj?H3)Vh^>~{XFK`EGt4HUP+|~Hc<6Xb>HwO`vEiFu4Q7%HewDl zJO5<~f2h`c1#^@@|IVk4CB&Tz+R|%xrU5TjH^@#Ne$M^7>CUz4JGDGJ!pd*)?`u6J zfn~v{D66dBMma+U%26W_Ch*;(7dz8JaLU=3bM#b;w zjDs4V!BL-RDXO^fDM`EGg#QX#pI>En*_~JPy~y0w{l2Y9=M=rNU*h~F4VL*lyG!KH zgYoR=cYdudJ}g`FCW71XFT?K?PY>BxjIPbb`zC*X!qLB}TC1l8`?FOZ3~9xBO;;%0 zaturn(!99tLwlmu?%K1ujqz;!uKCflcYL%`f!F8H760L&?{(Zi-dbtZ{$OSaQm6@g z-;%@Ia<+0?c>6xx_R!JOZc?y{re&GuNRgr*$F37ZIPw$ze%Pz)@o*vewlZh^DSNg< z_+k5t9=Ty6ej&kM$G2Sr44&qmPcw>v~bYBI%;Tcc{ z-@iqE$HY5+3Q8MvVNy7x~5;;g5TO6XPp@aAD$4%n#&Y zLUdw?iSEsaY3DsZA*_D_5q=;Lk9}vDd)Ei51o*)WmR>T^F?b1JQ-*Wl=SOV`ZQ7#G zneJ*6_(V`)YbZuU(LJc5#3ulPsf4DXN$KkRVXSx3?$ zH_?P6504aLIf+$&o^p`aX0=e6O3ms>e@>*Zws-su54e#<#p98tU{qmLU|HZ{L4dOt zmXwq=2gAVj0C$2sBRH-*_}j1ZSB7hAogRrA6+*1Y)O>t31z}$78ZqKEWYw!SHBvW&MkVO0Ex}2RJT?}BDB|e zKgw<`FRb#VUtfQf$IW$#C&(C2&&7<&+FsF*;&FN2Ue(_1=$0gVC_7pd_F)rl;(F3m zS!v@{n5YEG)_E6G0g!&FUL?Fg&0{=?l8_ut=aTd*8jx{-WI9M2VZ2`&_Cs&Vm6rIrblo z^URN-I@*%^m$Ei*VC)`*t0UVCSFH@cc_(_E4C7IIQ;h@<0v))WYww&(r788v>ExQY zlE`X~qr~5hkZ5b&F?vXfah@7~Va`)QvjBv1Gv8r_axF6Y*JXFnH5}=KnNU35G9r$X zI(?{QZfXzN6j@<#uILmDEYy1tA`~L&Ub}ig5Czu1qc{ey`IQA7JDkLT3T!yzAfe4# z9)?ff;MPkns4N?GUq*EK`~Tr^oVop zIcwz}VolhU0?FsCcvSzb9ctFVesjGzNyh0yZqAb*3ndSUrp&hJK)ugwR_-Io~G3Sav7_K9B>C%vfIxwsOa*SemptA5^{wqvb@(WgBXA^cex z3D7NO_HHtw?hEXxh%Spt$Z~1H$U3pIzCRC{aKAHs@6WI2F7OnTxYPOKWdK?P$-d(fX@wd=MST>Q42>8_oHA((mE!1n9F_PQp|H35Q zf~pD290ZPT!c z*gJLC(Lvk50dHa*`9i$XY=uQsb`SdXnAlIl(g$hapI$P(aDDFe81nrp+tYM~p}Eqz zU#iq`Cl^HE5te0vt}hB>Wq7vria6;Z2IxT`5G49Z4k%?xiUk8$=0EfgUHgJr5mmo8 z&4s0)Y}49@XWj{A{Qm%TV%Oy$9O+5Z_oh*owom|2Cxzm1f228SV<{Z{9~*siJ`tL0 zVz?J{Oqv=89^j%^w~TkMH$_lKkglaDhh?P*P3V%$4VDIqCyn@|PRxqy3T4(r&z@*1}ZO z8BUEA6?$Ab71z@O@8Oe7na#-2>oV81HyLD`iYQB6ki9vH));= z0)GrWHU`)9=f!t4z_FRRJ<8fbqY{v*r@p8TEd)R610FRSiBKv6-}u4)Xm{F4uX#xhP)$?d2X?jL-u{$zM?!fyaW zNSuB)KDwrgc>R*@Zt)QJ5Gn#omcAwr6+zLC(rw(Xodk#~9+L~2Vq~zaATf{_Po&WS zD+R2Rqis1*;$#R*2LDx_Pkl;7f-gK*svu6)a!fl0a4_h%H)jDk*{R`#cPp~u@MoS4 zp1%RH4r5tYb1-`C|HBB$c4$>a{#u0O^AKI2p8bl7LSV)CmMKDu3EFPIT(^ioJI*k=#}mzjYFjK#iQXA5&vGa(kqA=yoX>)TYF~yl`(6AzfUv>iX$9AKlK%U8oJE|QXE;S!;_SJxc)OH@R)t9`e z-o#-Wv!JxZX!v%nn*+Jr6^#82RLRB3+NqZ?sj;Im-q&wkhO`>iQR(_5`YjkNSd_cb z&+@H7=0PmPV$JeQB@)n)K*h=ZQN+6VZs)N{$j{PBeW{|GA845eFWm&hJl7$EIqR5% zqeC@s#i7|q#auj5yh{ddR^~PJU)u$)!h(clRv6ihZEfGrqmxovM06r z^#j^gebk5T%Wu>8KGyjl+w7)>XyE+H7T_doz)+v+e|J<5GUt z!DKv`;aS*{2PN>}(2zYJK};%%WwIC~&vX(*Km3k}*t%Vdq-Z>%Pm$-#sf%3PzH zWk!IC;C+%VqM#?evED7!pbrh?A=L>(hnIuTQ|=GKz}bsMfX-mo?km->lIIJTW>@;^ zsa~!s2xumvESpFl8+ibwbf)r$M1 zGftC?ce!r>-Kyq+{<}#VsXtMeq3}TZ;gfsF;;*OzxPq z^zC=qZwy)GC;9M|OEIE+mRsLZ<4X28s|<@a-}m`ytXax(y;R(aMYe=e>2n4wE+a<$ z5O;?#eNyE5R%dvc=LKDjyjppM)d< z5oS$6$vNkNd(IQ658tTzsjKEywsE%jhe4RKWU^G-OV8`c8Vt$?|!zAZ_lO-DK~3*m@QHb?7z0m>&4o@Nt~E z^P-p53;ape3%YBPhj(T)*(X!-UE<|)=!CMO3%341!8WpI_xBu9ELc&2=9DCiSQk)< z4x1)=f|r&`wzq)?Gd($yghVoTcth^-YZDW6Y99Fd(kA?L6G zU|TkP(Dc_xF`FkP!umrK`FV{P1*}YwFDLL>?l_) z^`d7&e_4SCilor9Y$KaiYd8LdDFwZ*W*(Q*?dx6m`yJQ=IVFz@or1Uf>h1MgJr|F+ z3@4xR{|x#*HwRBg9yt<5K2F7Fy|W4W9?Yr#Y2I__#o$LLM~!wwenL)$?b6wc?*a{( z??N3{3Mv&Y7+PSFg1!6gVU?V{>ve{p$@_-Bts_LXF|O-zs>7+x4IIuV_3P|Pxzd_W zcY0obnb?~ML-lJu#(nuGX80=i`O;Bf6S4IMB>`Q_Q)OSzhTq}SW8NtNU2kD_`w~4G zAp&%iR%22XWN%Phx0%j7aGCA~YfG_aVQ3gSrDI6xmd=rGc;@%4^?xz1W_{n?b?)7tv(MRsQ6s3RC-EQBpH{j# z)L=2m3s@XBetWc)EcRV`IjGd{_ve_3P2VivshPhLt;BSA<51V`>shW>Ye{CN|K=*@~4*9zcYTIb{DDWFF4-2Kx@>OCVmTVRWUi8Uv{u)u*muwkT3;z4$4V4g zTABcArH|vzi24Wu0+HcKq$p;fU^$Q^T`|DURe+TM4JZ?iUwD_j$YAuD zx$SrwT4svER3gyxo?j8-fAaI7dKK#6qi^3XqdNh+(RnM9Wa-{zCvqL2@s0Q9poh9l zcEJj>{7i^0!iQW6P-V2-i+k(bHtVY?^*=8_EJ_pCg#R>--y96MZs^w?1OA;W=9d&j)F0o7+H?6U=^ZTZG+zvv8S}#K|{=r4Lo=>oUBY0XJYlu7~JidaV zxai@>rLP=s<~*fxX?+2<^CA2xWR^Ftrj(bD{ew;MX3yLYR>Kz(4;x9|$B5CETU9rW*mUF>KGz@D0iisv>`rU@ z2dxBLQ&PWdZLx{vE34$5>M43b#`qn!lGc0*Y)D(|{ZP6>4n0P#fnZP`TpFi+6ZtZq)3V>*Mo_P8&1+wWlnk zf^Z$5ZHD|U-pqV?%#|TwoAT#moM^37({g~lMiw7F@bNbEK$v4jMa68}mu<2A>>i%U z{-r5O+dH_vI5q@8`^_b$7tq^9B=g()1vr=%%-D@9XbCIEi@*j02mf^g7^Sqfz!?lC z_&m`G=D3QIV5aMO^boL=e56p6wdHHD6qn4WdSzxPUzCLf~Q>+>RA@b1-~K><&pqX*CZST$MXF6}3YPqlku%n2x05mbnsF^?WZ-oZI zKv)OW925%~mL}D5#czTIeXQ$V-U|aKJdI%fS|Rjd2)*-od|Bb=KCWl@C2vm$K= z0(W@4gxJc=UG~UEAYZ(ycsP$gXBES@w^_jzX9$~=$!<)7Z+|8LBO&knxv<`Y1iOO( zTxk7Vaoi{nGVu&995S{ZjL?V7NSSU*SL`2P($UCVT6#KJdG}T-I@yS{G-264JthN? zWeGktDQEwXnY$}KEocF~7zCw4HgWr=4fXosB#*G9 z30yiUdb!aEEVdIsp`wGss1usFJSnE3naS1NY=Dn|P)TIyk93l#R$5Jmo4r#7x|ZF{!o~Hg<3A?*bKw!K=66pb=@mj zzV;T%>ax2%{YI)7qpKu}hNpN|>Wo8AK43Zb5YiF*e1~z8Er8J$aLIyp<(sv3YNBRn zTs;QqYpJBR@0*$r7#hi~^H)<_RT!maHlYO|F_R@Q^hJB9D6wjkZ9HqS5iHu3Ny44j|_~anK za*e@Ad-viae`*H4i%$8RLduwVWPIn@3p)Zc*uHboWzvG9y z&44OXf7Roz5yIq#H?P^oXP|~xELhq2+%Ui>=T9zGT{De;pfOJI0docZ%lpFs(O+!V zN{4u?OgeuDpZf)_{5qlT$WPigb2Wm}EmMWmzp#U#9t0I%}y{*5cb=Ik2`moT)((*F@@7<1(W>g&jYm5D4^=$}U*EA?Mm=kkJc#zZfD-ToX_eC+J};IjNHZHU;ItiX;g1mlS2s1=P+KP5c3m2Q8RKRR9HT6bvXZK?eeQ-!_*I2HRAdSV)@m z6B)3_MOk2JFJ`cOOtF=mE^ZO|DQ{WqZiJzHe6;b=oUn#S0NnGi6Vi=|hO5$75)mmi zSvC4<3+5qo3lk!$@KrgGO9zUgSI_V(HahpX5UslW_bS%iFV1cvWm}7Oo>lsKXF(As(Sa8_ zuSt#4z)r41TZT&fB;CtXsFq&YCkr z+UXYY?A&6N*KRojb8jebfIgdFUnm7_hgUpbEkw-0e0T!%T%OCJqR!9K|4P+XodR`w z%~dnRuGG|Srw%c);sOTFKijl__nxwU-mdbFx(5Fq1t1TiVV%-Q`%Vlwwd6#=&~sKV zm@Sf*R(YFhnf!PUibhyHa5Y0MgVEk|%^t0#+kBNbOAty|H**PA=nG+^*>-uMFP|x{ zMg0%n_T%(jxPym~!r%P@gHBrywlare=3l!kp0}eKNf3z2NGjE#@NG>d=wMCY`?y9+ zGTPZ3rS(?p589p)3&Aow1r_@eNi>)>b z@AJV=1IJcRr`-#PrB|6*6pkz3qp9!7mlX%gJZ;_@?LPqqPIbRKgBagg36MMn#t=rpYsJnG0W5- z?l-=|zip1SDT+XSSZ9^@q<5)Srv;BfVL$auwW!14vcF>1b0OUQ{AwC*v~fzLv!r#sDJZxBG2DoU%MVyzQrpFKAH+0Q8X3$_4`z!e63GhD3&;^Pf0C-%Nv85o`QJPOq6!;$odzfmI#7wA*Ix!NaFNCVW<4 ztyX?w$hR1$9f(5ob1}4*liYsz{qoBw{+pTstv*99@e?t$12>L^4$}999EPag{NGRB zV|-?%>WylHWnq#oMjG&ome_hZ!p994JBpfBY$;X9RS#L3Zz-M-RykS!K@9;f|HBFt z{l6I-yw5l5M@oUWcMbvuopY@?q{Vpu2qioorb?bq{|1Z)ZE&-e94}8i_8AK+N?f!S zU)*COe0Fo(pse99cV1n+Vs6?TfXt(KykHlXUZ2ybz?}bp_7EJ5&w! zLJ1DY;b6yfN06?B6paZKr`o|lE%vse^ySEDymb&p+Z}K0)s*shKcA3B#aO6qj@f7b z%1Of<62o>#%i*O!9I^77v8|5Tu!RpiDbD258Ne3+tORXE^uY`RX67CYH#VS_EC|SL zwi8Kr%PFmZMpp-V@d7x&SeL2@sRCKy8Fevjbz(?TFUE-%V3nM)Nh|w%WigM&$S13Fm z1MG^@L?9g;2K)g6GY6AOD`b|_A|NjS-Gg7u!CeZG3ZqGoT+2EX6rQ?esgICgbGUO= zq6;v!Kv_HbGy{c=IyX`9+tP<_lO2aDoPoXdvD~2PeSsE-W9){wep4Jkf4R`{opk}+ z41l<#kAKn79h{1e06)_#!;~7^K0qp*#{{s zGn29f)Gl*RN8zl(h=v6R^{ud60uu5L9YyGp?0Ym z`PbL6>tx3Xs3#0++FmDR{lsWE$iU|HvwP9-O1zfYzs|3Fz}HJ>=WHV6M+Pr5ua+?DZH0Km3T9@8@+4+;aJu@z*Z z{EU1p#A%|~n@ksmFJlsiENuB8Qu+@kPRG3Rqb{=a$VDvR-T)+_{gyBPa~fYdGV)6i z9aNLCe75z3yjHKO?abAGX({}*o;mDbhc3) z-!LuqOi~8R>a&J^$pI9eLPCT52%T7?lpEevc+c9b+$bFOZ6TW|2Xp#Vdtcl&;~f|D zfNJkarEfaFBu+WfG+6$gK?)|oSn-s1es{FRD}IKv4w&%H_dfqgC;c@3m-g<6a>)C| zMN-RT&aqFaoDGTIS*S7*=A|pVoJUKYEGHfJ2}su*i9x*s{y?+86V_ugvEdFMYtRJ? zOZzCm__6l6x?4@y)bRSxH2*uU^LPAzisN+GQcHmUGD|1CPOLf-u1usM-$E?zFLchd zDhEEnOIoRskVCYV=w{aM#7AEX-Z|xN@dj4gwmi^zH-Z>zze^QxXh*ExLT2-dWbsdx zjIL6?sy)QNyvn%<|%?sAyKNQf;~A1$eIrI4+X_Nd=eMx6Ia&8;C|j zI~KtB(!9ojfXI!z!4G*DT6QcFr_%!!M$VI32)2{Qd#(K{aaV-0`F(tsC-HI8IHQWY zZb(Ji=V*?lMe6})df3OHS(bMXhhggq8E0_WMa$>_dI+PKXgX zZo$pobc3)zm2HjY&&M1)j+~vhm;R-#@2_C1yeRsHS9axhl|JQkdSPG37;Wxys6Pt% zyKWjTRefeJOMn+|_+{69I`TsIYgud@KGqhYDeK@A7Me;fWW$KY*1!r2?u|hKVd~cE z;eP}SLSKi_S%iblBF(xY!99XFG}x3tH(4YS4x^MA95tmhr!~XA3&4(4aF>&J7lzVX z!Z^bIi}j-1)~To_;Y{Zao71TXKQjjQkbbjRC{H)WMS?dkgg6k7+Mut8SD%3Y5bN?@ zU3NrTS>>y2PFxqGJr{jc#z!6<<`=rmXvJHdXSrHz%kU41{*Gv`A{8hL0Hn3LA)m%9 zBF{3gpqv^MMTlB*1;v~#OXs3}GSe%0&d_9Whdp>SYnMLSi}uEuCePB`i#uz%$J6}I zw?aw1IOXNP2-i%YigC&#f43zg%ouowwEpaPOKk_#Es}T5aNDvLa$ez;n@)<9z zV5y%qr&As00M$9E2Zr8eR+5+cpEsaR$BQ-mrQ-6PjE>9Ze4cHi#(;3VFwjSzOd00u znzd~;bjMoU#p&jZ+*A1k4G`W$Q>^$AuHs1H+}=^d)f#%Qt4>ya&qrl|<2u5AUy$B; zbXW0w_AK^p3DGE!qAFo-zH3e+f#^~)@;x)#=a^LvR}*wGe4YzBFRkDrUpudC<);p8 zQvz&1nKUA|b>C@kGeP@gIxoJ0iw=L{=czHbKlC?#@2EcgHF)nb@O<7ZU+i>q*Wq05 zk(-!ET~_`}25;p^~|_X=+RC7CoX#dC3~jpOs0kz(q&3`f*E3YitH z;IV}gd_eiz(5sMFv9Rism*Q8kdK}?dHJeFI%!AsFtgUzaDEc@Zyo1u3!+?CV%&gZC zAQr{#%-=2Up*%5weaDsUY=u)#EFK}YePjm;WGE%MjVl3!i87d}^qz(4uV`qi9-%1c zO9q`q7Z@yqTnkEPu?`|-Fp10Hmj03uLQf_x2sFs-$=EWiaEXzkRk-*<2laRf{{c1} ztMFyKl^Szub^gO6dyF|1FK1g@+|4E# z*%A8OlSx~YYJ#hwY@g7U3{Bs-%PrGIxycd!)CBFIv6H2ov>VnydQ5m7sLPQ zM$V#}Vl%fw3b0!9&0hG)?&uFKOi(j)o8~x#{h+2)&!P->)J@5^<7mwN&X{Wl08-8$ z@lCxF{nBOpyqK%I=G*9ycanQ`Q4phR?1{mxS5Ly?Y>Qp6bHFKjkOL=28|3uf;Ep~s zX8*GpDXAU6EKI>?nyW!8iIQE_=^UGHgRk#(y^b>W#rDG%R{se+ z^}~P282XO4cGjKZRJD4HRLZBf)08V%dIo?ycdk`M9yU6K5nYN*;~pNA4-)roOl&zG z4LHe-Mz}}DMR5qlw1^LeaD?o|=(x>J6q+&JUMEOnCD^9fp{ z9m@m$)Gnps#m&;1x(N7MV z5e@7u#@XzSc$IHCYi@;NpFZn|gV26Rl(Nh#yNhc6fu{hsH20x+<=rqF$-)USCn}qn6Qgj5T!UWK}LbJQkE@5EBqtD^T!K6((-~};SdWL zdN<2gEUiP!bj6=^T?yVzZ{TOLUH;#{{uo8R8o z6S`>;RA z;2l`b4gulQhn%VBv6fGyv;x0!y0g*_zQH6ZFm@Bu12bhEL!$ZO9fUg#Z@7PtU+H;TGec;Zsuqh_5N~y(!0Iw)9dC^_9tQULT=4rk~Mmu0HbKkl!5@__W7N_5SlXSc~&}AN9 zF=71FCw2(1J<#W^>tM0^Ea|z1&CV*86;a%D5!${N+lTIF@;9DrgS^Psn|0B5Dq$f_ zvr&A{7H`g)OFuQJ92JEEuo?zjc!*7Z|Q$NL^fKh0{fVaWAfI5>j``NI`Eb}^79+qS&;RLPsUHL{2 zPLTH9xt=SdOr~iv75Vc-5LN@Dk=j?9)5|i6hFVFLlZ{tu3-LuknsbWm=I$|cVJeIi zWiTQ4q92S6Bm9S<58iDfO4l-vJ0s(YDyHE~ld?nu|K9TaI6p}5Y_kiXxOOw}U6`CL zCm8~13C*+jdEFMC2U(<@u^KP7J6aYY0%D(k(umDsV_$D#-;1*P0J9XWGBgE+?0nPNC`F{NmkEG8o=z0f^c&HQMhtr%i zG^DQuUbsI~A)XRLgYM#JeEiRMN~N@-F11N&-IuOPZ(yCz7d;MJh#s0YKgaP(%}=f| z!e1Qqer}d!=by4t#h|-=>@l*MXW_bRrqMwwWfAX}6M@?e!WYEOXob)>*o6#yxS8BasNPDRvA7Bo2vt)1GLbkj6? zR>o6*&h)Wq0wtN{V5X?6KRNG9Xz+1Z)3QAK|J=T_32Eyr2T1ex@v*XW21gOj$)GqYg_5{?rQq(qe_9DM{m! z(OHCn@nz8C61Xh-e~nY(e*$&kGkirFLTcKesdw%9YY~#*ZrpOm)luUTv^2h1X*0~_KKRDIsdbuO8le)36 zf##HepOO$DW;QVovg`9knUnv+e7Q~h_2hZBNciHsVA1j96wPEo5P{g!=0x^~IG5PP zn4`q)I?ML=qs~;^Ca`!zTM`z?lxoJR>|$k2Jtw1mtYUM74FIhbB_z-l74~vN`lRiT zImPSB$x?t3Ox5x(tt#larg^7vbSsR|N`xs-bgt%6Tx{|HCLv7u{#Q!a#(~3wmi6t_ zOlw=?WPj|Z=eF|(4vL_?k)hNvwSGSBUF$Oj@f{NMU(J5w(v4n)?`L(da^J{iwF#B# zsG(1c2{@=v=+Kz>wVmaIuH2N?3lv-wOS&>O$DlF`dy4)cU+S<3~L-ab77Pr0= z8ynJm+h~*Bgd#O-<`W6ytA=fCmmR4NcViH`z1*r#~8O zu=nLrC+aL4OrY?_nYGgMUy%0#N~1e%U;T5#{UTf3Riq|=K9x21xwmamalk!hz9Za? zl-JVn6_cry3B*YgfZtxTF<^RuP)O0Z&_F{$WT+=X^3fK_yd^Fl zP#j6dIM4E%_C!g`ZsIU1pCK$iQcDY^rb$r7>^@-zO9VKpQ?XNvUau7y1^1mZ^s51OrkQ%2Q11 zc%(mYV}yrIB*x7bT8gzKN)A*DD(NfL^2>x%D~=5MG6k~wuJl!}*#N#BQMikImNYn4 zl4b9jn?3BxJ0_EOYt3@Nz3x8_jn^C8`=?c@dk2un78$HqG=G5UgkR@9>}MSK#^&43eJv6OkjTu;!!Y0k$X;lq+?c zu<{StRy9T*)?fdYfY_<_LTceo9|lTf0`e0GnUv19&eP*5P0aK$!bf|65ue4RZa)Qh zox|_jBV;8uM^$q6$z0J3oSv_`_qI9P1DDqPk5+M@?A4CyLbuF^tu%LoLifh^cR3Mr zaJ1B0O|$IggvX3%o_{R@-vhl58}>U8535&j)Je_f`yZLZ53z#_YblX%;R<+6>$n&? zMX6Ju-@kLg!zsJ!V=n z=-Kpy)y0+ty{~C8FYI9{W;r_BJ)l$SwJc-Su1NY<2IqMZT5As(o`^ZAKvM4Jf0>{*5(~j0vV4R*DBo{?}iV{6dgT45n-ULJWkWq*CaV znwD5+fU#!#2dtGonQyNV;l7!X(G1#*N+`p@+ix4V^PzBjm&LR=ESx2K+6+*JI3ny- z<)}UGQ`cf*KH1|@?NuAM&nE5S1nRanoNFpAxqh5R5~xeJ2`pi-KScvO_a$X zjlods;$m+VJa>--PUFX4Ud4>`U2b`;GU0^|bh~5bOC@i2X$JzeZVp}=d)KE_uGDLkqBU$x8)NO-O-<8^d?ETecmFT6uNf0z4P((N&$ zFnmDO=s7~oI0N~%OMiBI=EtVPHZdOW;4L1NFE-B-EpmC4y@0US-{slTvCi|@d1+sv zk4iQ^gwDef6!L0bSXy7ZQF*eIaQq~+RyY*Rfd5lPXvIRkDDI}`8MJZCp4h$ue+l(v zpyc9YdHZ7)K*EQEDhf$z7~S$9^BYq)4rt4)!xox8WkUL!$^M4)*!-}_7|AZ>L7rM> zdNAIgHz`175StD)EEr5LIXFl+Knir0jijTC;5P5=rQ?o32@M8)5$u<|cs);k(PAd{ zRhH-zSb5T{T6(F`>$EFGj-^fyffS`xNH)iUB*dBu-{39k0Rnc7tqPAP*hThQdW!Sq z3Mlw;luG<|-@|brn7_;<#vxxxr6C|v^n7S=7(MP_FE&ahW|AB3P=4}K!Mo&zlbm`M zUG^)Y@H#9LX3>`5)LB$^prHeYFbr63k(}iLE~EbV97x||=$q=96VR|dw_g{?n>AS2 zs6B~}jGNP}Z$}9Kk{C3>BM_D`z=_tTh^{o3*I&i=1=jLj{w2!Kcj-1v^riZ@_>l!F z-FoeVPAe2odQk3n98Pgn={2IIo9jBfJnS+6w-&mJ_{^>PZlJ-F$6p|6Z7af7-E8ZgtPIzoV@v<<|4OrNQv&MwtQWZ>#==^Y?SD`0!VZ#RCsKH z?Q97n~?!dAt2c)|gnj!>F3Ggz0lz$6?1mPMCHn)}4_9$bJ;HA)I}`-2gc zK#Nu!sSaUvdkgxagLJ~lXh9RoXNz#D#6@MgEF%g*5YW6KE%$Hp$P5Q()aSj5pP-T<}Bo zMy@`=H0q1RsDSGQ{67^wnU^`9MzZR8%>T$K_Be_(7!2;ZRilnKD)fk>G+LrBbqz~; z;QdXMpFMa88lcHLM+V81%fR}kHP^Rm_pAQ(e%G$^55<`V?x&M40m!&gX85Dj+IR_G zQ^QP`3S=Ha-ErFA&WnLt?rYWFzWzew6?*Us?2zP^0Wazg4icuSD@pYy-R}VHQ=E(9 zq!3!zW0siJ$DVGl5jaL$#FF?0$k$toBK#lX%--!fOF) zp3>109KZ;W7?1NlDeKY6K>#Bv_%d=zz1+&8Efh(_oEce6k=vgegGEGdJ zTjrH>-7$H~%zAp4Ess(>fxUS1^f93^R7;L;w)}P1E>H}E)PZ!*=gE`jg+Gfn5)6cy z(8IDbq2kj0&eG(EcZCA8wKh#O*q=%YL^w5{gsvl8$y+W{5Nq51I}GjXv>MF3xWb|+ zv|lV>Ji(HR!xYGdMhwvH3m;t=H`04zO7j+F2g&KoaDPO6irz(_Pu7`6~UE2F)Zf|`Uyt4H5T`D+YFUkrp#x~VA6 zg1g;jH;7G%CR)#yHxIofAhc-_lg7pbYU;-qTJx^FiUHHUB2=B&^3UpC%nG0A{0SfG z*VtC{^RKQHNz|26)+o(-qcX_F3OZE|Tm5xo2vmUyWPsOS$pOzXK`KD2|4$_x*W7^Dnj18OEm=+te;c=yo>8Dpt_ZWKP z;#Nvx*)SwI(+=FhsOx-6I&55VHy6Ry2iSNSKWq+g1RNkZSMR@&P`4&E@*cm(&&ncr zNNW_^{0L6C_Ix(Z^Krgv(8s$I!`>?5a6j_v3oIpIvzC7k!+i)9$XitfZH$YH2Am7v zh85khhlpPO-1VLzELx#Dx1D^)qvS_sBVb9j9Tkf>Ei!$gM_6r#=?ui6jUuhSYywY_lB2YwpPYAC zKFDH`3d)9q6MIM*n?6L+0ptVLBQd2Fe&Y~IO&q(D4j>sxXrL3HjyzCN%T9J;06SZL^H16QV!NryHN?I*jz) zz}G6NSRoU7Q>{7dY#@kw*6^441zYGl8Tjx!%6p%ed_83Cvvf;2k|}39ZXZj`v4NJ1 z-w`7n?)=dkqRDZ7GF_L&6xY6ZiuWn%J6drlQB`(Nzm>;Cf|mX+8(4_xXMCyn?r(XJFhyK>D9=#+&i7Gglg?qDtrh=yk>@I+5=DA|&N}iSVgib!%b@g^h%YCi=dG+?+OjVQ1;efa=qJR7K zvyYzdc>lfc79W(2=IXr!H`4wq}D;=bFa#Np`aKuPV2TAV+QZ1uLJ(Mi<* zm%a!YImsxb&9~mzTnLbE+9@Dp;=t4Bu;l)5uqFgc1^-5RopKJ-iOj9P+YQmrA0&|& zf0gX@*PxK^!_^O-DsfomHBN0p(_jhq9(x>6J_p_D^Lqd6>~}(od&jpQT;budSvTc> z%-QlFF?#ENNni4=!Q$ zWcG`n{IZkCP;WaH*GHVI2g+(+T~jrzH$SLWasIk2+4Q_Ib(LZ)eopE%kv92D`T`8* z0a>KPXmx=B(r8$u+-PanFcgzs06u+K7!iuItSlYjS4t(Gd|K?tkKja|0~uP~3M#BG zW5}u|g{*2ZHx_kf3SZ2~I7N`?Rw@`9$bddbMElwG4#0RU(gW#3dPjg-m<_d2a4f)} z{kN22!pdxLFkT4+RuAKvsxF>|5uy@Bq^qki-Cl^BEE%|y@1?0WL`@$%goHR;v0B-n ztF(m(amOSG*`tG)yS3MjXIDwryVYSKUNhn-HhAkizvAcVX;gR!BrWHimJ~S*=>K5ymf7>!8;-T&O5pE!AmebriAR^QEy-B$KJ_sr{(gvM~~FctCE zJ(Z+=Z$624d7kVi)#v%&@AYPlE$?IJ8z6zG3up1J-~RSA-08f}sItSRH00BBvJVj> z5C0F2D4Bcz8MBSad$|9F;kL4nsuS+4a9v$~~o``&;ewa;Y!m0pA{HbF$lK$qQV-~&^< zar?iY$4|(4PorX1ahKR)`&qMm1tU*QLIX{-sd z&i~O~XQ)awbWM3{z!DcQLacI8gHit?sH_jo8@f<8A6y~6%fwZ;-~aQ6&~p?yxKTsw z&%q1(irY85<5nXRAZiw(MP>QYEK{Lqum1Fah&S6-zeL&!gnyZ2ek@vb4Ls;f%&`Is zlLA6A0pQorR7_GdRM2~HFi#5C`M*jn^q34G=@b(?N^`U>e7f+7T?MW%He?%X6sc0< zLud)4INPBf$ngYvq)krRe!e`TT6Z&00L+c%f-Qw7xJ4TJwC?&h1)lX?&;*nrWb(0E zHw2T{UQ5~F$9Jjs+d>h)=|8omWC|>7wUVD6O^DWhjr(5RXzoz=z?gz3^*xaZd%nyo ziIvsdJoG?;gCwvxyX@Z|qZGgNLZ^X*O6|whpp`WFD(MHo+vRSEtjX1<_$baCXuWiZ zdJuao!@yfizzjd%%NEF)51bDe(ASse0#3WiSWnk;4xq!vB2o>C~BIVCeZ} zAzXlE-)Q8AR^OXTdBxOesIPajuhiO)v^zVFX`VOk-P&^_lB0xQ|A#z8&$r!~ttY}M2!n5VzYDP|X_cm}HXX+`{ErL1f9(5x zbLJ!cDcu1r-g1uL@_X&u|?ao#qKgu#KLa8&-dg-kFvns}X(Ao~ z_j9Ak8crggWGuQBQXw-fb#XJkGvrXdRK9#Zd~GDEHLashio`^XvYa;o;4-J#BUf&& zM=7#7AP*58@;|d&cvKSngCyXs{M(X3S96=@X9_*Bie>BICOI*21QDO#!J%Pqqj2l0?{LnK9IOq#=^&is)(kO1FbDI@RVQV(o*Bm zYCC=4&BV_&KQZ9?vRk7D^~Vf}KSkFaha&Rr`>~CV3+;YF|8hK8>guE(qSk~j|3y3< zEI%^k)OVEl$~XR4+9MpG`t5fa|l;fC>S$hK+{_q_MGQEZG4e8W7Z z#oqv(#ZFoiLL>KcsbRdg^K`g`d=0qD_$c1fx^|kgU=%+y;v{DgRaVlZMHBojcL$Tx ze8dHBV4ciLTGNW)o8u)Gl&nea1MqJS47s*OW7b1u zi8ayyeOnn`$=SCK12T9VReB*6izYU10Wdcv2VD(wSH2#CbUfjdZeg-?_+gTy z1g;>-L}ZYF++gnyFoCmXjb1ud`Rx56a{9B{?>mt$s-9gT5?x4#e5}#M|5Rv?yuLp0 zL(z1YgLP_kKXpU4!{At5j1DZr5oEw=DGaWMPT6Wl3UyA`twq%6*XS`DnWfL+Kq^sEmKQJbi$ECbQn)v)baK0%?F;}ACl z>6MM0W(Qdnd!#sY2DM2qrGInMGD4?d4D;8vtAwWgtNw&>_ein3L9?5Q(CAgEwwD~s z{2;}{TE9OB$rW?PJ~E;ox(<}IC4`sycXqyViZ)CE9TCdx4<6Wu4U29RtBdf_(su{q zr~n+dUp_`h>0lgOY~x3n9~qJ2rYE?`4~QQ4uisFY{@(JYW2g^u4|eMzX|!4R49bHFA*ee;XC z;Oefn*u-F>8#9T8P7|}L7-w8g&nbK+3V_ViM8nG17OMybqkJaimFFID{*6SgZu5u% z{60z^8B!)M*p6-mqi_!KkCy+gu|+mJN!G1}@}P%-V7UD(^TD;qJF196i@K=<_%Jt8 z+mR?EbsUqu*5_K?L_jdo)IryrP0ZYF^%=d@TV=m%eH*c%ash4EIvm7jq1iJTk@|$cYbRIsr#UqVrOnGgAm%U6?G{T*+ zXC)hqpTbSFzQ)WDjRz2QQ{J#Srd3Q=D!KK}eI^yEs$YHQUP%1Cw`2D#+i7u^%6g?E zpe5+{w>ly8{epP5Z*$M975b}}aU%Rw!hakb@SAMTHJ&S+f{?J`=~fpbPTaS+>Kxt# zjGXIq+1;QTIM|+%J!v`rc;gjx-F{$=E&gF6^A>Wqq40f#PqqI@yqljP643eFKTYy; zFi7^7n(=9SCe4$xB7jJ_g(E-FFrqjS?MM=j^9zo+F zkI1eCJgU3f`D;3W!%4)y^Z8ja zlybC5e4VV~LTNv?rCzkw@;~#e1!WK0Cce?QX3qW%9q24maSf_e8!jUzcxEgyjktWQ zxeH7)lc-I^ULVeE)f4(^xE(~sSdEH}VnJ$(&xF>IvW^jqM6i*R^k$I&WVPZpM;paY z1l@NfnqUc~m1`xM!#u;lbfqV@hUPH-ku9HlCfS39@|+L+c1VzLxV=ywMoMcQ3?k!) z7J4$s0QOhPLnp_3yHb!$fh-e0lMKWCtXxhS#tf%W^iYq#Zwjfx73^@eb`)j9jzjTI z#goZ|S)O|jmw4LruP%|xQt6jvrmirS3x3*WaZod9e*GO+M5n;OfjWt_xsqFmO7b`o z2ynVIsl`v;FR`!prJcyO=r65VWzpC9xW(D|W{e%jA*&1O)O?DLbakr zyFt)-E|mp2L^Wgp5@s_T&cJ6&&oWe&F`eQ5GsiruF0Ie^y5mCHt9GM+2?Y1Uxx}N% zl|bNe`0-kcL+5q2KmFCan1QeV zI*acj)WoWv;zX#c>f??2=OTADKa~91_TR;wz*%(_r}h7vJa-+mudRAEW^ZJ8yy=I$ z1hweJZ}hDO$=~55XTKmO1q-TDV`S^s*TubXBQeH!J)oKNx2(IKE&Qd7;dYDLFRv}- z;#^dnVKy;iHIG@t{tCO(0ijAgwWinAGh6p&ON+%7R`Hr^e2+glR0NoV5LU}gJDZ>!u0F;auC?MnrlN6UE z2ms^??;=9!3Z97?r6c%y#-WXsiF65P&_-gEYyJPE9U-+fd#&!;RYN0cuvoSxh?GlD zs5zSt9T%T268M`g8<`h<0b&?yY!%9*p^_Dvbn!_pMIEv3YK zGZn8lfx75_Lnjk}TZXqHLmKVOWEL&+!7PY^s~7Wy+Oh9YQ*G6*ChTm zvV*0OKeK|3pLE3LVrH*!&Nus=AFmuRer|7fTw~|?Jk`A?I@k5}R$*PBi*A3~jS1N)0l#-G=ieDX-{0>Zr>hmI-I z(-)!7vLEasKlz<0IsEuhvYKh1(Se)zW9O@Jzyh<9nvkWcPkME<|Ghp&PtfyGPX(3h zV06%cr-LnDS2$l+S0;j@(r0RNQ-+1%Zho)!rno7+aYPwklJvO%!nxarZtzyzB{tCT zG!YL#83ywNdSiG_2fxl_4HEXO$10kP`>6RU=r0QG-OcKjKH@1MrlD;GdPoyzGaETB zCgn3}Hd&&l=kx*gvy~C#+TonK+c#RhHEXwXD`4SjCyQl*j-8AOJ~3 zK~yzXYrQ<-f!3m2dF7pG%4S9AiS%yPIEH{?9CU182$4kqzyl_0%4P+I01y&3D;LdQ7VnH%SxY@nUjSmmS~fz&wdjr&FN_Ki3Czn?V>iBCV{ zsLo%1BdZgp9a)tf^7yznR@JTyqQuJd`( z1lSaMe2dMZL982mW!hwI95cqNj0stnJqSD(dS`?Y9PnHme_OD4SX;Z_lbpyf&(jvi}ZM)|N>z zzctHn%&^8-X-G1!w?f|lWKI4*d1df{#ER1ECP4s$Kn4LIiG6?=fW(|a29(%T3=trN z$QU9~*ylI`rcmD1D#Dn8gw@)uWwjnSFh^^w)_QqD1Fc0iD^##qr>8qOwK#`WY}Po& z07DWKCrnm?024MV69t&u$I1wUpHns~0GHUT2$)3Yl>b8n0Lcx9;TY4A$-E2Fo3yz! zs?8LiW;6|t&QjRmU4={v7LY>j9sE3HzT+BUz(9)VN9MN+3p{-F^& z`Ta?oeaR;Mapgl_)J_rO{I^lU8l4OlZJo1s<#OM6!(-mrk~?XZq>KmqNq2= z8jL(sJLh2@PV>Zu2NQ0-Y2VDjgB{_XgS=e!++!Ao`6`@h9`nJ8M!?k|f90eVVg5B7 zlv;CxL%o$8Y9qCu_0D2dURt|Gw$>qI&VK&pt^Py#u3sO-uYCCp+y3{J53P^m_L}Kg z&)%~7$xmJU*vo(Osq;agC^On&8YR&M*h+n&$`MyBLLj{PkDl@P%#83}ai9P9M`o`5 z>YjF4jfDeS*E5E)?2R1U4E9B0<&Oi!x{sO(sh4i{SK9r>VnVg+L-mKp zeDo!s_ar+ByMwJ>P&`M!f*#n~{9Q>)%~QS$RH;JG9$A#$32gQ0D>7-jTEDX0d}EcI z;WthFNoOrmEQihhK)*ayeN`_FlQv~VdRl9(+7uLe5P+F6L4YJGB;g@sd0K-QA;)Tk zG+JuPYDG!@1ICCGMk@eEF>^#rArXXq;3&sx6%DM`V2#z#m`ICI%q!DijvS*Ct} zh5G#t#c@PMHfxkHS!05L6E)%iK&&3)2llOq z`|m&Oo$+awn2YetccL)K({;=wy#PQU7l20gEQ)u~Iz?9l4lMsnR(cSqNL zbx-8ep$(8P&N$bEgR~3tsZX%KN>`=LH9j!VESwxl8$7mp0KmBY2kXb=aGYh@sZ8P? zqV2@vZ1Zk=V1U6MH1cDg)bmwc zzx8GJwf7m?0AeDuR35`;P(P4{kF?X{ zt;06SSix2c`&pdC3-zU~aeUiZXqv1m#WByL>s#qu-je#NKI;>Btq`q+wr0vzcNUH9 zT!m%Am3C{4E`UZ`>NV82{W`EVp9YR9ZLv_0pPTeTeqM9!?pDGEU;Lb-%VC2v_kj6N zu_)zrlJnsS-*YfSBjCEa+Q*x}v45TCl;P~Nw=S)p3za1r%lf84lx zZ7alarGq=O);80aY~oW};OTDFw115I3}90`Tz|d)u)%H1MHg>h{`CL6__6=~vnMR2 zzte7Xmo*hj1ttJr);U(zRWCpJQ%_oc&Lu~$Smm`w4j=B)JOA|djmmk=*N83ZQP#T- zaGH)ubsg)E1AW`z+i1yY%-l9j&jkDje|Y)=`Y}m4`QZESo?V#l;lMt5Ds;9_`IsMV z6^vqjHU?WQbQwtwaMc`JgZU3ikEyr;DeZx+?jUfvJ=W){HO>`ZzL*07q=A2$h!LW|%81|-ncpDq&*4c_{9d*0=w~?we zH5VLQ`%iURg*43CMFK+1=_W0~RzZdimaJALMkWN7U@L;)gw@In0RV)+n6O$Q!UC%m z7$YJGfk58X+T~D)ARy|Al+{Yqqi$D-l+}9p@C>D_*698PJnJj~xGZJ0X6k2htkKBj z2@A9qW#>-GX1({`dCaj{cc*ODDamGyd(TTTe@r;;(Tx7@^Smp1^F|I3LxIH9VQi2|@o z{nbO6JxcCSgtxk>DC0PLaN?xW?gu{eY7JT%uwEz7F3S4Nvi;oqy({|c-wsri$jb^KUO-2WiI7Y(GPF9ey?}7X)%Ml@*ixdfPi$IBo$H&i@8I=bX2-`}`N~@P5U> zf&HuWv5(&4{eTjHAJC?){Z<K?C0|=#-(ah?4o4-j57@64O8}te0T-8SSA&41%qZW``(Ed;gxTQ= zHNfTu`f7<~W!rt0uOCxjTh*U@=ds=f)E|y9m4-!cKHbW@lP&ZsMb&TXMPfjh@>$al z5~Q6`La~yx2Y>_&0uxp%VtQXI1Sqh;YNZevLna8BG3@s-;+R7w4&xXCL194D6VyWy zB&^nz469XSSgm*6bu!M~I*$MVS6+EJ{&A*YPgGXx6B206Hg+SMb!radgv~lV9TE|V zFcef`v!?g6#`4sFWV4EZS+ZCGApkIII{%9?wX0*F ztt_Y4`gN}xui=Khh=#)=Bk7&BBhF-_AOeF?_)N`3t*4Ua`sIjfPd%>d%RIV8?089B>U#Ces!03AbfTlYLjq0j-!PPV}|~xEe}!Ecbehciet3 z8h4(WLFd?AZL>*X>-`c$CG#f(H4ws~(=d^Nz;@ z->lZ69@jb1X~>Oi)u~8((9d=D8lDeAA$mLbWuzxLa8`VB%4!f?t+afAt(MZp{?$ha zVE~8nDLx!0Da93RbxOGHPn*D2#|(G{-zr7UU`5bU_X--5101H``s=qQV01Z;rnxXN zX~QxWz+=rcO|qtbR|VGRzcDI4XW!QVb}<25<(e1)Aj4_}VjkYr%E%>FE64I$OGFBQ zAwr}OfTI{BqZODVA_#@Nvo&Dmu*(u~jbjMjRyg9YU!$B?pFp<$PqcrtWEd%IdQAe^?m9=A)S&g(LR4Wz=j`7{uU zjhMGb^8}k+p2rWcR*GYts+D4Lcj0LA+_sdm%hOv9qnk6sOJ3XP_dImqsqLQ~SnjiH`eWi|#CyLS*5P&6?VgQePq9QZ@|;VK)?!Pl zqfKG~rFU49W$~unWz&vG{H@y#MoUZn+2B6qw9__r{`zk(*!!y2oOU>x(sSbJOVUS1 z$hx+%3(r1lOXp{P_DSVX^N!N(#`tG{ddJ4jYGIMjP4(yw5V2{UH@s=nc+Oy}VWK6+ zbb1Jct8F&`z{aB@e)Vgf=Dq!y89w;_yJoos?_W`))m-S$WnRMi-1Cw>lu_-3H$CiR zd|0GTJlZr9bg21IbN%-j{Gj|yh_rG&j_m;jkD17-vR%JAn-jJKTkCzczRmf>eXpxW zdwg1_We!f7CTaz?T7uD~xvV@=OOFXlGZps(Px^K34z}8-ZJthE*C4VfOKd3lxBM^4 zpAmq7LCI=Gga8-klF39B{vZ_FW~BoYb=1DfiI9!XX!Q9yz^v~gn} z7Z)X~Rfw%PV71Q8ql_N>_Jq(V<%!5@o#;(w+frn+?%K41r<35A{5XLcwj1Vwlz$n311P}nR00zNBiZ=oyVPc_> z%WPI)z-l&YOZ~R3W!=Pjvl{AgVwSlzGC1oqbeQWrQ2FTH<#(h@5q!+u%gb#8*yGSO zY)>N)`be`0Y_nk+eSb%m=WFU7_f-5$_mjwMEy~cg85|@iN{gk$#BtItAmvu>Ho^vP z**eud?deB3hXO1!tm~cKzAJd7%=C&>zI^qr^}U{dApH5yKh_!uS2>uC`?nUW)qF$i z4FILbwT`_uRQh8Uw-tw zeNTDHT+h9>GG(v2^Rv({l}S3}CH>Si%EK#u>uC!opS-?npR!sW{Qg4lv5($UGtW6P z?wY;6?SerKFZy49)H|1(owjOu@qash_3U%Ebo}L0%Dwj-4*uoJho(p2l5nYOrv@6r z*$rb`2OzN98?_T@s9Ain$4wMffjQ3WfYe4O|I7L&bmsR#9z4`a4s5N}*W91tN}yg9 zk)!%C4jXR`hBN7C94M*yqqMbVZK_j_^j69AS2$p{CXf+g zfz=9vk@KupkgQe)2mv8Pq>zE--K>luA%*=uN5CXOSdwhkIEFw761^^puIPwvSBU*9 zLTuVJi{arJI(TrNimcWvue=lA_O?tJC*FJLU!HJ4>s41>g;i|U&AU&)J$sgMW@Zca z`;yHXZeE9R98td?QU^N%kpyB-#Ia>C#MFO25eSj2pHmk83I5Q3@8vG zWwIvsvjTz~9LU)?N!Zjx$*Wm-Y=UJ_ur_x#R&}5`xsB@B)kNqX)QRj_4AmzsC*kC! z7iUzx?&7A#WRqhn{*>A+SoO4&V#Nxi+KQ-kX&^MIJ0p**JXJ% zJZwv+G3vX`EA%-zJX`3O^M||i-Mb(6&Xzp?{OyZ6Q6TlhxOxaT=TLv?9h|vwFrtHG z*IeU2Z19#XQ@tPgk*_8)k%Xn@uDQgTmG8|{{;Zd-qnf;tCax) zK+LmR8AAXLW!PYh`pi+k&k+%ZL=ZAj$gyO-#xVwQzZ3NP5ClCE>l0S%l2|389txpg zwO$TTWVJrgh|b--qgqCU>_B%2kH1a>F^S|ytm0R_hrOl5+A z7$xXR@?KVXasUH{xXfmi9iJGGa7bRoWTXJfOOJ6lqNL<|YDK@Ta^|{LnkO9tnFwZU z+1QQD8cZzMS~KxzwwX3dazsEzwfNa+X0$ahgzfZdi&B@T#c`@F6PDNOY50b|<-=SQ z`(S=kF=jESN%?9DxE6s|&-WeW6D^5#7-aAEZ?MMHd24+6tkGu{+FYe`=tyyqYp>hW z3S08x=h%l09!k~;G4A6JL&^33mhWoay=x`7@7}}Sfuc(;J!U}%2rr4o2Htl_VISVN zQTCsbeQZp*1qatqbG;30!RA$}bOl_Mj^cXRy=PfG^x$G>on{NNWy@6mkN)^a_P^(S zXYW5|$4syELaB!8op7~Mdy2|rzA+aS(5Ca<$tTbCUjCa;owrZ9B0mi9f%o3I;qil= zQpaiAP~~yT5k?A8q+|`YdXgqv{G=0S`#=ASPu9CT+&~r=d-%~0-?Pr^l-;n#tNCmG z$=EiVaEuD=1G_(tg_F1W)<8=P;4KP|i4t{LeS&cQgq8ENUYhA)Lmw?`4Yp3qE+7%M z2WHamGym}>ej;N@O;wK?xL2xZeZFZGY^??7_3POR6fe}VD#DMBtu;-1G~hKtTnHZT6n3zE@f&flg ztr!4e0CCD{r4SH81`dfRB*Ktch7bl$Kvsf4P!I@_uv$s7T7?KnP((p6MGIk`)e04? z)~o*Yi4{Kh2?ewkV?$@ztUGt^gt?vx0nBj+W$>RssgVl5NSh6oOpXs0``QX;ESs zHi2Kt2Q0tSbrf6fZW=qTmc_Lk>ju`mF@**_PS(g8bZih0JJMD|X6nsS;Cr*8DQW<= z$QE`@0RTo-Mr&|LB_lh0fshLiZ478lq96m1)Bes&F50|%R-Gc)^z+o|)a2-$g!4en z{nPJQzv22l-r15zZHjtloViJxEm^L2MHyM&c~|?A$DZo5?+=yaH-A_E$0O_82*LCG z7wqtU7oJMA?5$P^VFRfFTZ{Q=bIjNG4}C|fkLFj|zp+goT5BJLV-LVM(>Hv5@5HcK z5dnVm#m6mv>hCY!bJ=Cb4D4ejdIhxNXxFH-NdehX`MIAzY3ZDEw>pQOFUo-ftMuM? z-LWC}%Z#&ogr_l_0R@-5>aR0YV4%Jz6NsDp!ApPbl;z`&Th}*AOhdl>rCn1u-?Tq$ z_k2{=d7I7wW@FkFxXI+idzaQ#sFQXZR!As}ErS-G!Offf0j}jHb}aa!DJ-x#wb2YGHqzPrG%j&mUA7jE_O|k)w0+|mO}YNijzi_yfC%uWw>;y}QJW&~JCGZ$e{A}*|N78$D{Fun zjio<%IHcq1NiW)_Hln^%0s%GsAes{VyRX~nAu2{8FAVU3_uV<$>BJVR2wmW9vIN26 zx-?HCqYbuIon(zg^Zuj04OO;l?4rnnu^qGAlN5Dm-D_AQb*xsCHGUg?+h~vB+Aj*< zYp1ON;MML)JOY4P-z&?d0-9WGtc@;>rvR`O3(_jHRq=sJN2%Wo{-v7V>&jX6zFr>P z!Pc@2%a+fpjnj)uKWM%`%#GsF`L6m8`ClpYra#JxkXLpyA_5~LNRSngka2KdE2JTW z0R$ohfD`~gnBK<DCZMLkT}tW#4VO>vI^ zB%2ix1tsBvDTV+uY}Pb{Ffs%PvAmm=Q${NaWF!C(#nn{r~K}d6;C!RVRARiMW}ybakuM-BL@IwX|d`m3C{fWJ_)hFg)h*-orNZfX(&* zgFgfF7{*{`JTNWIm@(kbY!AlZWxQYpW^AnHppD+Ie$z0HmUX z_;vf!@jQbrDvZx(|G0E%MB|<3$XjH3#uEiZ7JovdedlzMoDTu+|$MR7@w}= zs^0&u2PI?UtO-gbC(1_m-pZtC&8K}o#3v7)Z0gFc1D;3xo*&z__-CJf`@*%?ZR?b+ zRZ`=JOR`l%)~FXb!{b1@&ul%n8UEU@UvnC3SmJ)-PoCcV;)_c%s~?PZn_AHRtqp-g zi4=T>>tP)2AnW_v-oB%I$2-neMpzyjmx7yjsU>Jsl;!V~AFO;fme8Tm3sXcQH;+x6$_( z$@eEI2-*~e9SXxPg`v8iwToSWh*9`p6k(`5T8Y(ttmgR2yJbT}8*!Wt!7Iy#tRbMljH z2`<7-J812gM==*;D&1XDM80D{; zhrCfjwWpEEWG31}->Y&MZ+rXs?SJ+I7p=I~X>~QgkKFV4mTostR;r8xR@Mbm@?z$n zYYlZ;u9H$hV@+YH<Q>odls3>)Q0+G|E4oc(oaI(p+v9tmBJ!Gjh7b#OyOh9;~Q7%>56jc-SIjR(G^AN4FOP z0V^Jk0f||8v({x-BG=0-2D?#NM{X_9Uus%afri^nSxC~}Lb2o-8}$Y>sV*XknnMU{ zm0RyKcuE!OYg1z+TL)23J25~_sl^+o$_TQP^rHg^j!<@)*AEfIFx$6 zaiiolt+Hp(J0<<#1INY^Hh6kkhQIX7SDpH!Ke_GLWtYwPgMT*~KUlw=SXW?;1Y4Q0 ztM^pFJod}~a(3~OOEwLaV^uu&?4tLXPd(QgW0A*vU?Q`2GX2TX=xa%i@O%5bztG1qN4--B(qj6~JP;8LQ>;U>=g zB^$LLigql+g*YdN$0F$N1MTOG47tUS!W4kfgYNF$SE~Z||)yi5goxC)ZS1U$dt%^uu0JU<)UWN!1 z71Z}?RZf5sAmXn8B`|mh=pmxV03INF#N;uO2ONbDj>y(9RG&bgkUj|^d}@mhN!g|) zsk~YnqJwY+z@S%aUw6xbTW9!=AX)+PD|Bw|Vmx`Wjgynxu-Wu62-@U%0mj~}9VCHW z5(vtRl|qmd`VvD$wnE5W0N{lHUQD#wkh~waKE^2Ak`CRmTt!|r=#GCT#A~h*%_?aH{atG9UYnVMQ(va@TU-CNK~_0d zEwkLWD$MzjOjE-3z=30vb$EN-{+@f{bN*fLzGNBg>}Hv$-3z+%SXpea%Cv}UqR|xm zuYcp((^5J=N(}$?FJIX7$iv4{;n`h8i>O3WAu;5JJhe{Jcnw>-H9TjsADoxo^WMu^ zmtQe_V4*7Zf8%K5AOB(A{UyK}Fd1vDio4(?mvii}po}(~xc4u8Cvd%RNw%h7LAKVh z5Y3WlTeq%Wvdiain+Z#ang0GF?{8Z7QL^Q`B`_|Bg0-Nz4ABYzQEceD0RZ5F3;N!y z)6*U7c9*H!og~kj!XRi+7<$xbNbXU3jpQOiU6p*Tca(va`G-{Yy`I9qFhz*NPB{l88v6&vyRACH)Wn^0X^e;F&Sw^ zRE~vg?GvoJa;xM$Gyiq9Czrc?jf`a(e3jOKHxrVu-72I<(BQO%sho)Oa@m4LrI#>G)Wp1 z%bqL_2^#<5t6zQHdHo;)?0(12p|HV~>LqVCXxqNISCVe*{4VMk6Du{1vCAgOwQ|5j zZ~SmOb`>jRH#g1Cx5UdYFFQY|kcacmn+QJgAK!BPKm68PPHf%U40Yyp?aGekA)Pi- ziEJy22Eghe8^g0M^4i{&SDw@T$^ZNE>UT>IfSKW=zjbiS=`-Eb24j$Ht%oQnDa$dB z2Zdy-C5Gf>uCdYtgOCIt{Pk;>dN-3f#2^0t;ptW@aJmT7Ewgd$%NWY%*#5(Si z@?DkaC{KHQccia%vb8GW$VBEuU)6LStraugjX!1H*jfFAhx&$DdDxO?gYTxbE^7aI zecHV4jLBA8lt>s=M@ZMzC?eGqkHc%p=4Y!&2-ycNbn<4pX48K@uYZ`OmHr_+jV#&m zU9HjIP>DgM5F(;dP8rOxN4g3I6bvL8K>~whU=J|5n-$n&0*{!zfU&{RU9G_Eu^)OO zlu{5#LB0?Ig&;}YPFr+VTVh2tiMDl7QU{M8U!=x!OTD{VVGqFG%#5GCIO~blef#!d za#t`rdk7C7UO<4fH|uiKkHQ9bh-g(Hc0{K`y*pVwKoOEJLj;MTx|0>LA3C@fLO3E> z5kM$!Ru%xP$W|328yS!=K60h}yw%;T(T0JNdn!o&9NlMU@PYWlQTQRtk8^^`5}HeP zSIJqUa>uGvVg$J)WQJUm(kiTH&S-be?~^LXTM-;-k(qC($rx%)w&v7mR^4lOL~A8k z`)<)_;gU_f)-|D5lsjDBH5#lf$kve&Qid|K=9kRZ$FYzz@^aN9YK)PSa#7!Y^wHza ziM(sB-nue5DN9?P^#PD7w6^0zC%MK&P3h^i+c5U;cTa@R&Teh(*wGAfb*fN4>Ltgd zOMx-C{vm!~vx{it&2DS?t4yR>f&p^wP0aGF(--PQ--2?_Gmz~6#=^uX!c_@@@Iya* z>EeI>!kzQCzwP{0*GA+llU*Iav!|9#(o;i`SA*;qKb zN}vDqbCa&US}T#Q885pZ$|9q6fk&Xz@oSK#8W9mNRIhAKgd|=yLaqBL1}Lhx@_J3~ zMNG-HJQ;Dm4a&FRNs~TV7ulMWVS9MJD%l&uv^{B)t%mOpO3V9XwTy)Hpp!p0^F9Y$1U1YTa?)0s`C}IX-?z@T_M)(HbMJQ~-e8y8)8ktP>L* zY&K@l_nQ=ZvocFU>r5l3?e1iXt!TPx?*2;O_~>pP1ftP z&z^1`JGScF+w0a_w-0$srjSvVS?#T`$Q_hjDm^24H5ed489tK6kHd%R2^;+OJI*Vv zpI9I5{y%8AaD+jlYyshFBQGCG!$XP08t2FHdh!zt9&%d?p0)r0nPY2?W)DA9|NX3& z?b_7+gFm`$;TL}Csxy-l(u$1IF4)Ym(?!VX9OGNw7~rxclpZ=r>wt*xZ-4Xp(=#)k z^WE21|6y+8@Bi-Ap*Az9L$S(c#RpMhzaHZ2oZtBuh zcJMJ%vemXsw8&P&baf*qx@VII+HmaTlj9MrHK&%WXCh}mgL2a$AF~lBVl%$D>N7TS zOl()EC=9SI8=D70NRI{C{Xl=r%uCm_pO!zHpSGPX2;)0iY|h#l(LPD#uDCi69C)=@TD&u!o7R@+Mn&=gV#25Q4z!5tb6eA;RQT$WD%3ztaEcM z3XZK(5OgS<=up`7NqMr803Z>DAQ4djpa>EBWGjPY#6;NO$eR^W0J1;;!2pEOk1ouXB;+I zQ@{N2Xhdy#P#@^ss%2innQ!P5A~_1xde3#;2TBwMh}GPC6D@V&8iwQyvNidI?}zxr z<0qP~lZ`PsDfs8!|K?Ml`pg~kS6_2ZyRLL}kXJ9R%G@>CYD>t(Kc9F0Wbn)XYW9r1 z2Ko5I-#@(Nwbxce-hrURZ#ka~I3wF5gR~}G5DSB^49x|Fo-zhHYEJfBwlw%>-~Xl+ zO_jCL?S}Y?KYnJ49gnr9WOCVBq-r?N!t{&Ot$7Bj`%rIQ^QuIK^pAg(etMo|HLjVm z$u#qFwW^3L$^*^Dt0I&R4;-gC5{^CvSH!2uduu5yY#FL5n*YALvClm1qV)SDZRYq= zQXsC$R=WemRTU{Jo6#ekrrx}%);oH3T>U{d89fH}0Kh{+j~P9Ryj+>tVYz;|yw1x z1jbA751(JRhpU_v%dtqsap#T)Ug2_MRw~J|hQ>rX_EF&3$^f+y$79cTAA00H0)*~2 z(5}iMYFi_1vd*x>Cu znnADl4G(w4_iv4?Ov>qR3!9bxd}=&ynH-L>Tt8U8o`LKYzm8n1akh@5PZ{GwoXq1- zoM^OKel2_6TW;O4`kBw&IrpCT?pmVg?w7*3(HYSOg=42#y-|>4*-Dg z`Q8gxzvrJ`*mAAP%8HM__3xk95{5l9W$F``@mOs|WArXx3x@t5eAmURZ~Csy6|{{l&S)W7=yvgzT#~ipP-J$X3ng zb%55KS&_GJIdZ*PHQIl=#H)RuHZKo#S8MVa1ORm!4^*cnK){eeFtA{b zyjnqdwkjSAB_c>b^cc|t1`iNCM)ru&VIx!B-ELc~iUxTr zOGf#m4c}z zg<*qMS33f+Bd|jPyS_j~L7{3?6viYg^zLenNmhu$1v7vIV1bMx1Qra+ixnwy-;Vw3 z7267ks$=xrz8y8STrum-s}-PRq^h{Et!ec*I9>55p@Y#u%8KCH8D z*x)|0$++Ays$-7PLxGp;`Z9`^A$OCXTkwNMe9c2`T8AObB6if)He$jxk-&rd-G>c6 z=bT3HuYT>C6Tkhjn~&|>IXQICan*H%3$j(|(XW##2CZSa1M_}`3a!!>VjVvCYgeDS z;KHfg`=)Ji=$oe+pZo0do7ADld>xF0x+2^AmQyWnu{y`&UcaxHNbhycH31^RFMsgr zrQrkX)$#iuJG99U*ddusz`0{^_E@arJ!1qz0;Ve2S_Rr|XVvm?T2qUjnW-lZuMW8|m`#uUOI)X@&AW5_(z-{EC z5Z#_v>*V2Gc-LJ3-$`DrXD!hRkkLqYtAFO^mT-Eyjf;yN^!-U{Gy4jl}DA`DfyV2Z*8r^5$>1VjlK#kvL%A%Gx2buTN&ce6(3RMp5K3TO_)n*&^b z=AXJdN$w=%PIet-?j-zh>RX4QbnAwFn@~nl9wxq=5ny8{n2V6twoC4}wLu-_kRvm{ z9yNO2m?mMXc9-##`l{XoA@!5Q1xTbeiu+Qlpo)HaFWAL{2xHx9AcV^nvER6VVY-fm z?(Mf%3mcq;`Zv~z{Yk1_JLp%IZ-4EpbI!eui4b=0-r1|4Y_C?cwmg!s-G=g1ExJ3% zQ|q8sRrt`jWSR_P<;%|GH9)Z(1lY|GW@r{dEF@?-0$Z8;tS7hdh*GW#fM#LC<9}GRmfIL z?US#Ks~uc-{Z@bXT|1qJ?0)&BWwGzCU!Gt9jj}BxQ2XPr?U*{Yy-=3Qnz~e<)-*)8 zC>K@9iFE7V$E3*Cno=?*TXSA;s@{nAh-K^d%s)6-8;+9rv_+=g2KTj&U@24Ewr_0Z z?WFDNd&CZeiubo zkPxCvVx>VVvPojcW+ZC&?rJ@7U=g#tTF+Lj1Gc6b?zsnW@7}xN@Zkl#;K(AzVS`Ve z+>R3yU2HUb41y*FL4%r2kC=V(JV}Vkn>7rhdsih246)x3F(zH3aKQ-b11tbgATlum zK@<;LP4OyTHZZHRrvMOFLDVx+J<#=rrDufa{%QZLkJB_=3hOO`YoJ73=DNZWyLe$w zgCr~mQ?LjZ#wMl4|BMv>Od3UYrTw3(g zsv&bL!IWUo=?6|D91Q2PNC$gsUP<3?~c9(vGy*x>EkC%RX> zX|tK(b1V@z%sjhv#sJq=fd?O0a2_`Js;kavox8o6;r-?2Fjv}(Zj=~4{ax4kHWL~t z)T=}s&WhX{<*nvS1H!c?96j2imtR_P;t~GFH%@nd_xEpI_;-76IC0K74WkmVAzQT# zEkjpKsb+ZI~|`H|vhjFwR3NrgiF4Q3n08Ekf=P(UY7JhCAb97VW`QhW@9D4DRtM z(RYP+X6F$>@w%BfeLaY-&RKPk4eiReC0omgL9{>LP?co1B?R>*0KNKBgu0%6s-Hy3 zc$r7GYQoJJW73y%(sk8#hoGq!o2C=VLWmvt`c#u@>1qIE)v1AjfTOD}5d`!&Efqo- z03<|rvxXry7^Bd^%<8VzkUd6qt!5a43T_`UTnu# zWD6%JS5scCG48$h>5p%U!-Q!#~^4^7NRWtVnD*ayNU{h&y1Wp z;*e%rO$epZBSZ?--{}<2K4l$D6=Rjlk9V#&p>ry)wZDw4gq!t|BCz;CY znj)CX7XigGv&dJ?McfDotzqQ%6m3s$7pQb7qM-l8W_{PlC<)!d$?fNr$u0fy$#|Tx zta+OqnQmLld?2iUDOI^ID~2(9 zw<7$^`@U=GnrpXqTuXlK)fM^2fArLhmKNjQPnCocHv2=7(Ki3ps%2pM^3DqSw&H3hFfJ$Rj=DJxU8ej1`rHJ&aPFlw4o5{!^ ziY>+v9{NFFUt757u(1r)Hcjd*2|YsBbgfz?e<1*H-2N>I=qh@ajWOBn)NE~4C_fP` zwa2o?-(Vb7l?j0<3UecvQ2;2i6#&#dt-u~Ldcf!bvPTekw4w?f3``yoNFpJb)IF^} zp_rHuMC4PaLt<4lXl12ILTpBl+SrtBe5rA9%B%IBN*kHA4>@iH>V%5@d^Z3bf(tHC z-mJ^ZEj)R$gA)^k-R>lLo0Qsvc3y&0DPkn>GY4D~j@y5*x8)xd>5_0gZ|*100)=39-^ zr#qsmj)ku~&Ohe|BiOlfs;d&rmpQmd&aX%Jq*SUJ za&+u%Y7N^L1E{q|?=6+mqX!nII-P>c=PYr{tvi;jh82yrSSYvfkM#_DJtJA79lMhK z^{*dw?#+q_aOa&nS8@xwhWQ}bud0oW&W8QiIHUv`=2^Q9Vs!k_RPp4H7ls!lY=t5O)xY+{VayAEquegS~f=I3m~#!xUu z)Km~f^*EHIr4BAs@5va04!w6Z*A!X%QvJ01PiE@en^1e?nblNS2EF&PpU8i=#B7wD zpIz=jOk^0ac*AytY$WH1emh1Dg*o+8l?^o`Fj}lTR8l&e1D8Kinobe&hQs0tQ#Ngk z#?#2Bh!Nw_mYE3=Lq;HG5QGpgLKKY^1OrG0@DQo1LIs1z3|<&Qg9LRr3L%UHl9@eb z>@tH4CCG3UWZFBKyM%jU!LENZ`$HRXL1!6Z<=8MfW2@x#GbAD z?%jv)eAhc&oFiB>IO~YkL2rR{`NIGJAOJ~3K~&b+*+Y2v@B&_Nf%0bc{ZqJo`!*yx zjfjZtc0kM_;VO#|8blOOw~GQ%UG7U^SB4-Z5y%ihVwfabLkUQN86-j|kQLd=fDy?G z5$Oupn}*_}Bc#sw_f#bS;Eertvbn8Uv;6=pHv0f+j)CM--3Q`i^a?6fWKl3whn%lay>GzjbHIsq8m4VrS@cQd3-e*4Z%mt4> zeqtsJ$4^*JPRihWzxRR@Kk*Y+EHoN4FivIXt!Gs3vx#o<;dt|jIJ{a+8d1{2c}c

+qNsVZL4D2wylb7 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�(u^ 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

9+nKI!nIu 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 literal 65674 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 Jd%MRk{|7wWM#umF diff --git a/misc/logo.svg b/misc/logo.svg index 6acf6cc5..e26d98dd 100644 --- a/misc/logo.svg +++ b/misc/logo.svg @@ -28,17 +28,180 @@ inkscape:deskcolor="#505050" inkscape:document-units="mm" showgrid="false" - inkscape:zoom="1.2938725" - inkscape:cx="159.21198" - inkscape:cy="784.08035" + inkscape:zoom="1" + inkscape:cx="397" + inkscape:cy="561.5" inkscape:window-width="2486" inkscape:window-height="1376" inkscape:window-x="0" inkscape:window-y="0" inkscape:window-maximized="1" - inkscape:current-layer="g1555" /> + inkscape:current-layer="layer2" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -69,7 +232,7 @@ id="linearGradient5174" inkscape:swatch="solid"> @@ -83,7 +246,7 @@ id="linearGradient3445" inkscape:swatch="solid"> @@ -124,7 +287,7 @@ id="linearGradient1685" inkscape:swatch="solid"> @@ -161,7 +324,7 @@ id="linearGradient1377" inkscape:swatch="solid"> @@ -263,26 +426,6 @@ x2="97.921367" y2="130.20014" gradientTransform="translate(-26.418261,1.266446)" /> - - + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - + id="g1555" + inkscape:label="g1555"> CMD TM TC + + + + + From 90348d285f3581dbe3125df8ed0a5582295ab608 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 28 Jun 2022 11:25:41 +0200 Subject: [PATCH 145/221] update index.rst --- README.md | 2 +- docs/conf.py | 4 ++-- docs/index.rst | 21 +++++++++++++-------- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 5d789a37..e69b46a0 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@

-TMTC Commander[![Documentation Status](https://readthedocs.org/projects/tmtccmd/badge/?version=latest)](https://tmtccmd.readthedocs.io/en/latest/?badge=latest) +TMTC Commander [![Documentation Status](https://readthedocs.org/projects/tmtccmd/badge/?version=latest)](https://tmtccmd.readthedocs.io/en/latest/?badge=latest) [![package](https://github.com/spacefisch/tmtccmd/actions/workflows/package.yml/badge.svg)](https://github.com/spacefisch/tmtccmd/actions/workflows/package.yml) [![codecov](https://codecov.io/gh/robamu-org/tmtccmd/branch/develop/graph/badge.svg?token=BVOE3A4WE4)](https://codecov.io/gh/robamu-org/tmtccmd) [![PyPI version](https://badge.fury.io/py/tmtccmd.svg)](https://badge.fury.io/py/tmtccmd) diff --git a/docs/conf.py b/docs/conf.py index 7c2a8233..1443d8de 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -58,7 +58,7 @@ # The name of an image file (relative to this directory) to place at the top # of the sidebar. -html_logo = "logo_tmtccmd.png" +html_logo = "../misc/logo.png" # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, @@ -69,4 +69,4 @@ # The name of an image file (relative to this directory) to place at the top of # the title page. -latex_logo = "logo_tmtccmd.png" +latex_logo = "../misc/logo.png" diff --git a/docs/index.rst b/docs/index.rst index 0f21217a..b1e476eb 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -3,15 +3,16 @@ You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. -Welcome to the TMTC Commander Core documentation! -================================================= +TMTC Commander Documentation +============================= -This module is a generic tool for satellite developers to perform TMTC (Telemetry and Telecommand) -handling and testing via different communication interfaces. Currently, only the PUS standard is -implemented as a packet standard. This tool can be used either as a command line tool -or as a GUI tool but the GUI capabilities are still in an alpha state. -The generic parts were decoupled from the former TMTC program -to allow for easier adaption to other missions. +This commander application was first developed for the +`SOURCE `_ project to test the on-board +software but has evolved into a small Python framework for satellite developers to perform TMTC +(Telemetry and Telecommand) handling and testing via different communication interfaces. +This tool can be used either as a command line tool or as a GUI tool. The GUI features require a +PyQt5 installation. This package also has dedicated support to send and receive ECSS PUS packets +or other generic CCSDS packets. This client currently supports the following communication interfaces: @@ -19,6 +20,10 @@ This client currently supports the following communication interfaces: 2. Serial Communication using fixed frames or a simple ASCII based transport layer 3. QEMU, using a virtual serial interface +The TMTC commander also includes some telemetry handling components and telecommand packaging +helpers. Some of those components are tailored towards usage with the +`Flight Software Framework (FSFW) `_. + Other pages (online) - `project page on GitHub`_ From 3963f53d337eeee84440713a8f4a0d4f81597f5b Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 28 Jun 2022 11:40:53 +0200 Subject: [PATCH 146/221] remove ccsds module, moved to tm --- docs/api.rst | 1 - docs/api/tmtccmd.ccsds.rst | 21 ---------- docs/api/tmtccmd.com_if.rst | 64 +++++++++++++---------------- docs/api/tmtccmd.config.rst | 28 +++---------- docs/api/tmtccmd.core.rst | 28 ++++++------- docs/api/tmtccmd.tc.rst | 20 +++------ docs/api/tmtccmd.tm.rst | 20 +++------ docs/api/tmtccmd.utility.rst | 4 +- examples/tmtcc.py | 6 +-- tmtccmd/__init__.py | 3 +- tmtccmd/ccsds/__init__.py | 0 tmtccmd/ccsds/handler.py | 72 --------------------------------- tmtccmd/tm/__init__.py | 72 ++++++++++++++++++++++++++++++++- tmtccmd/tm/ccsds_tm_listener.py | 3 +- 14 files changed, 138 insertions(+), 204 deletions(-) delete mode 100644 docs/api/tmtccmd.ccsds.rst delete mode 100644 tmtccmd/ccsds/__init__.py delete mode 100644 tmtccmd/ccsds/handler.py diff --git a/docs/api.rst b/docs/api.rst index d838bcf6..2e5cf3b9 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -33,7 +33,6 @@ CCSDS & ECSS Submodules .. toctree:: :maxdepth: 4 - api/tmtccmd.ccsds api/tmtccmd.cfdp api/tmtccmd.pus api/tmtccmd.tc diff --git a/docs/api/tmtccmd.ccsds.rst b/docs/api/tmtccmd.ccsds.rst deleted file mode 100644 index 0fe7c06c..00000000 --- a/docs/api/tmtccmd.ccsds.rst +++ /dev/null @@ -1,21 +0,0 @@ -tmtccmd.ccsds package -===================== - -Submodules ----------- - -tmtccmd.ccsds.handler module --------------------------------- - -.. automodule:: tmtccmd.ccsds.handler - :members: - :undoc-members: - :show-inheritance: - -Module contents ---------------- - -.. automodule:: tmtccmd.ccsds - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/api/tmtccmd.com_if.rst b/docs/api/tmtccmd.com_if.rst index 9dca814c..19126315 100644 --- a/docs/api/tmtccmd.com_if.rst +++ b/docs/api/tmtccmd.com_if.rst @@ -1,85 +1,77 @@ tmtccmd.com\_if package ======================= +Module contents +--------------- + +.. automodule:: tmtccmd.com_if + :members: + :undoc-members: + :show-inheritance: + Submodules ---------- -tmtccmd.com\_if.com\_if\_utilities module +tmtccmd.com\_if.utils module ----------------------------------------- -.. automodule:: tmtccmd.com_if.com_if_utilities +.. automodule:: tmtccmd.com_if.utils :members: :undoc-members: :show-inheritance: -tmtccmd.com\_if.com\_interface\_base module +tmtccmd.com\_if.tcp module ------------------------------------------- -.. automodule:: tmtccmd.com_if.com_interface_base +.. automodule:: tmtccmd.com_if.tcp :members: :undoc-members: :show-inheritance: -tmtccmd.com\_if.dummy\_com\_if module +tmtccmd.com\_if.udp module ------------------------------------- -.. automodule:: tmtccmd.com_if.dummy_com_if +.. automodule:: tmtccmd.com_if.udp :members: :undoc-members: :show-inheritance: -tmtccmd.com\_if.qemu\_com\_if module ------------------------------------- +tmtccmd.com\_if.tcpip\_utils module +------------------------------------- -.. automodule:: tmtccmd.com_if.qemu_com_if +.. automodule:: tmtccmd.com_if.tcpip_utils :members: :undoc-members: :show-inheritance: -tmtccmd.com\_if.serial\_com\_if module --------------------------------------- +tmtccmd.com\_if.qemu module +------------------------------------ -.. automodule:: tmtccmd.com_if.serial_com_if +.. automodule:: tmtccmd.com_if.qemu :members: :undoc-members: :show-inheritance: -tmtccmd.com\_if.serial\_utilities module ----------------------------------------- +tmtccmd.com\_if.serial module +-------------------------------------- -.. automodule:: tmtccmd.com_if.serial_utilities +.. automodule:: tmtccmd.com_if.serial :members: :undoc-members: :show-inheritance: -tmtccmd.com\_if.tcpip\_tcp\_com\_if module ------------------------------------------- +tmtccmd.com\_if.ser\_utils module +---------------------------------------- -.. automodule:: tmtccmd.com_if.tcpip_tcp_com_if +.. automodule:: tmtccmd.com_if.ser_utils :members: :undoc-members: :show-inheritance: -tmtccmd.com\_if.tcpip\_udp\_com\_if module +tmtccmd.com\_if.dummy module ------------------------------------------ -.. automodule:: tmtccmd.com_if.tcpip_udp_com_if - :members: - :undoc-members: - :show-inheritance: - -tmtccmd.com\_if.tcpip\_utilities module ---------------------------------------- - -.. automodule:: tmtccmd.com_if.tcpip_utilities - :members: - :undoc-members: - :show-inheritance: - -Module contents ---------------- - -.. automodule:: tmtccmd.com_if +.. automodule:: tmtccmd.com_if.dummy :members: :undoc-members: :show-inheritance: diff --git a/docs/api/tmtccmd.config.rst b/docs/api/tmtccmd.config.rst index 920a6a6f..82e9edfe 100644 --- a/docs/api/tmtccmd.config.rst +++ b/docs/api/tmtccmd.config.rst @@ -1,17 +1,17 @@ tmtccmd.config package ====================== -Submodules ----------- - -tmtccmd.config.hook module --------------------------- +Module contents +--------------- -.. automodule:: tmtccmd.config.cfg_hook +.. automodule:: tmtccmd.config :members: :undoc-members: :show-inheritance: +Submodules +---------- + tmtccmd.config.args module -------------------------- @@ -28,14 +28,6 @@ tmtccmd.config.com\_if module :undoc-members: :show-inheritance: -tmtccmd.config.definitions module ---------------------------------- - -.. automodule:: tmtccmd.config.definitions - :members: - :undoc-members: - :show-inheritance: - tmtccmd.config.globals module ----------------------------- @@ -51,11 +43,3 @@ tmtccmd.config.objects module :members: :undoc-members: :show-inheritance: - -Module contents ---------------- - -.. automodule:: tmtccmd.config - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/api/tmtccmd.core.rst b/docs/api/tmtccmd.core.rst index 2e16e68b..92d60547 100644 --- a/docs/api/tmtccmd.core.rst +++ b/docs/api/tmtccmd.core.rst @@ -1,37 +1,37 @@ tmtccmd.core package ==================== -Submodules ----------- - -tmtccmd.core.frontend module ----------------------------- +Module contents +--------------- -.. automodule:: tmtccmd.core.frontend +.. automodule:: tmtccmd.core :members: :undoc-members: :show-inheritance: -tmtccmd.core.frontend\_base module +Submodules +---------- + +tmtccmd.core.ccsds\_backend module ---------------------------------- -.. automodule:: tmtccmd.core.frontend_base +.. automodule:: tmtccmd.core.ccsds_backend :members: :undoc-members: :show-inheritance: -tmtccmd.core.globals\_manager module ------------------------------------- +tmtccmd.core.base module +---------------------------- -.. automodule:: tmtccmd.core.globals_manager +.. automodule:: tmtccmd.core.base :members: :undoc-members: :show-inheritance: -Module contents ---------------- +tmtccmd.core.globals\_manager module +------------------------------------ -.. automodule:: tmtccmd.core +.. automodule:: tmtccmd.core.globals_manager :members: :undoc-members: :show-inheritance: diff --git a/docs/api/tmtccmd.tc.rst b/docs/api/tmtccmd.tc.rst index 98cce9bc..68e3ca30 100644 --- a/docs/api/tmtccmd.tc.rst +++ b/docs/api/tmtccmd.tc.rst @@ -1,17 +1,17 @@ tmtccmd.tc package ======================= -Submodules ----------- - -tmtccmd.tc.definitions module ----------------------------------- +Module contents +--------------- -.. automodule:: tmtccmd.tc.definitions +.. automodule:: tmtccmd.tc :members: :undoc-members: :show-inheritance: +Submodules +---------- + tmtccmd.tc.handler module ----------------------------- @@ -75,11 +75,3 @@ tmtccmd.tc.pus\_8\_funccmd module :members: :undoc-members: :show-inheritance: - -Module contents ---------------- - -.. automodule:: tmtccmd.tc - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/api/tmtccmd.tm.rst b/docs/api/tmtccmd.tm.rst index 211b8f7d..3574ea9b 100644 --- a/docs/api/tmtccmd.tm.rst +++ b/docs/api/tmtccmd.tm.rst @@ -1,17 +1,17 @@ tmtccmd.tm package ======================= -Submodules ----------- - -tmtccmd.tm.definitions module ----------------------------------- +Module contents +--------------- -.. automodule:: tmtccmd.tm.definitions +.. automodule:: tmtccmd.tm :members: :undoc-members: :show-inheritance: +Submodules +---------- + tmtccmd.tm.ccsds_tm_listener module ------------------------------------ @@ -91,11 +91,3 @@ tmtccmd.tm.base module :members: :undoc-members: :show-inheritance: - -Module contents ---------------- - -.. automodule:: tmtccmd.tm - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/api/tmtccmd.utility.rst b/docs/api/tmtccmd.utility.rst index eaab90b8..71aa1294 100644 --- a/docs/api/tmtccmd.utility.rst +++ b/docs/api/tmtccmd.utility.rst @@ -20,10 +20,10 @@ tmtccmd.utility.hammingcode module :undoc-members: :show-inheritance: -tmtccmd.utility.json\_handler module +tmtccmd.utility.json module ------------------------------------ -.. automodule:: tmtccmd.utility.json_handler +.. automodule:: tmtccmd.utility.json :members: :undoc-members: :show-inheritance: diff --git a/examples/tmtcc.py b/examples/tmtcc.py index acded55c..428b97f3 100755 --- a/examples/tmtcc.py +++ b/examples/tmtcc.py @@ -8,7 +8,7 @@ from spacepackets.ecss import PusTelemetry, PusTelecommand from tmtccmd import CcsdsTmtcBackend, TcHandlerBase -from tmtccmd.ccsds.handler import CcsdsTmHandler, ApidTmHandlerBase +from tmtccmd.tm import CcsdsTmHandler, ApidTmHandlerBase from tmtccmd.com_if import ComInterface from tmtccmd.config import ( default_json_path, @@ -34,7 +34,7 @@ TcProcedureType, ) from tmtccmd.tc.handler import FeedWrapper -from tmtccmd.tm import Service5Tm +from tmtccmd.tm.pus_5_event import Service5Tm from tmtccmd.tm.pus_17_test import Service17TmExtended from tmtccmd.tm.pus_1_verification import Service1TmExtended from tmtccmd.utility.obj_id import ObjectIdDictT @@ -151,7 +151,7 @@ def main(): tmtc_backend = tmtccmd.create_default_tmtc_backend( setup_wrapper=setup_args, tm_handler=ccsds_handler, tc_handler=tc_handler ) - tmtccmd.start(tmtc_backend=tmtc_backend) + tmtccmd.start(tmtc_backend=tmtc_backend, hook_obj=hook_obj) ctrl = BackendController() try: while True: diff --git a/tmtccmd/__init__.py b/tmtccmd/__init__.py index e0173c93..0cf8bd7c 100644 --- a/tmtccmd/__init__.py +++ b/tmtccmd/__init__.py @@ -8,8 +8,7 @@ from tmtccmd.tm.ccsds_tm_listener import CcsdsTmListener from tmtccmd.config import TmTcCfgHookBase, backend_mode_conversion, SetupWrapper from tmtccmd.core.ccsds_backend import BackendBase -from tmtccmd.tm import TmTypes, TmHandlerBase -from tmtccmd.ccsds.handler import CcsdsTmHandler +from tmtccmd.tm import TmTypes, TmHandlerBase, CcsdsTmHandler from tmtccmd.core.globals_manager import update_global from tmtccmd.logging import get_console_logger from tmtccmd.config.globals import set_default_globals_pre_args_parsing diff --git a/tmtccmd/ccsds/__init__.py b/tmtccmd/ccsds/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/tmtccmd/ccsds/handler.py b/tmtccmd/ccsds/handler.py deleted file mode 100644 index 4480acf7..00000000 --- a/tmtccmd/ccsds/handler.py +++ /dev/null @@ -1,72 +0,0 @@ -import abc -from typing import Dict, Optional - -from tmtccmd.tm import TmTypes, TmHandlerBase -from tmtccmd.logging import get_console_logger - -LOGGER = get_console_logger() - - -class ApidTmHandlerBase: - """Handler base for space packets with an APID. If a packet is received for a certain APID, - the :py:func:`handle_tm_for_apid` function will be called""" - - def __init__(self, apid: int, user_args: any): - self.apid = apid - self.user_args: any = user_args - - @abc.abstractmethod - def handle_tm(self, _packet: bytes, _user_args: any): - LOGGER.warning(f"No TM handling implemented for APID {self.apid}") - - -class UnknownApidHandlerBase: - def __init__(self, user_args: any): - self.user_args: any = user_args - - @abc.abstractmethod - def handle_tm(self, apid: int, _packet: bytes, _user_args: any): - LOGGER.warning(f"No TM handling implemented for unknown APID {apid}") - - -HandlerDictT = Dict[int, ApidTmHandlerBase] - - -class CcsdsTmHandler(TmHandlerBase): - """Generic CCSDS handler class. The user can create an instance of this class to handle - CCSDS packets with different APIDs""" - - def __init__(self, unknown_handler: Optional[UnknownApidHandlerBase]): - super().__init__(tm_type=TmTypes.CCSDS_SPACE_PACKETS) - self._handler_dict: HandlerDictT = dict() - if unknown_handler is None: - self.unknown_handler = UnknownApidHandlerBase(None) - else: - self.unknown_handler = unknown_handler - - def add_apid_handler(self, handler: ApidTmHandlerBase): - """Add a TM handler for a certain APID. The handler is a callback function which - will be called if telemetry with that APID arrives - :param handler: Handler class instance - :return: - """ - self._handler_dict[handler.apid] = handler - - def has_apid(self, apid: int) -> bool: - return apid in self._handler_dict - - def handle_packet(self, apid: int, packet: bytes) -> bool: - """Handle a packet with an APID. If a handler exists for the given APID, - it is used to handle the packet. If not, a dedicated handler for unknown APIDs - is called. - - :param apid: - :param packet: - :return: True if the packet was passed to as dedicated APID handler, False otherwise - """ - handler = self._handler_dict.get(apid) - if handler is None: - self.unknown_handler.handle_tm(apid, packet, self.unknown_handler.user_args) - return False - handler.handle_tm(packet, handler.user_args) - return True diff --git a/tmtccmd/tm/__init__.py b/tmtccmd/tm/__init__.py index d7d56a78..dc105a1c 100644 --- a/tmtccmd/tm/__init__.py +++ b/tmtccmd/tm/__init__.py @@ -1,7 +1,9 @@ import enum -from typing import Deque, List, Union +from abc import abstractmethod +from typing import Deque, List, Union, Dict, Optional from spacepackets.ecss import PusTelemetry +from tmtccmd.logging import get_console_logger from tmtccmd.tm.base import PusTmInfoInterface, PusTmInterface from tmtccmd.tm.pus_5_event import Service5Tm from tmtccmd.tm.pus_8_funccmd import Service8FsfwTm @@ -20,6 +22,9 @@ PusIFQueueT = Deque[PusIFListT] +LOGGER = get_console_logger() + + class TmTypes(enum.Enum): NONE = enum.auto CCSDS_SPACE_PACKETS = enum.auto @@ -31,3 +36,68 @@ def __init__(self, tm_type: TmTypes): def get_type(self): return self._tm_type + + +class ApidTmHandlerBase: + """Handler base for space packets with an APID. If a packet is received for a certain APID, + the :py:func:`handle_tm` function will be called""" + + def __init__(self, apid: int, user_args: any): + self.apid = apid + self.user_args: any = user_args + + @abstractmethod + def handle_tm(self, _packet: bytes, _user_args: any): + LOGGER.warning(f"No TM handling implemented for APID {self.apid}") + + +class UnknownApidHandlerBase: + def __init__(self, user_args: any): + self.user_args: any = user_args + + @abstractmethod + def handle_tm(self, apid: int, _packet: bytes, _user_args: any): + LOGGER.warning(f"No TM handling implemented for unknown APID {apid}") + + +HandlerDictT = Dict[int, ApidTmHandlerBase] + + +class CcsdsTmHandler(TmHandlerBase): + """Generic CCSDS handler class. The user can create an instance of this class to handle + CCSDS packets with different APIDs""" + + def __init__(self, unknown_handler: Optional[UnknownApidHandlerBase]): + super().__init__(tm_type=TmTypes.CCSDS_SPACE_PACKETS) + self._handler_dict: HandlerDictT = dict() + if unknown_handler is None: + self.unknown_handler = UnknownApidHandlerBase(None) + else: + self.unknown_handler = unknown_handler + + def add_apid_handler(self, handler: ApidTmHandlerBase): + """Add a TM handler for a certain APID. The handler is a callback function which + will be called if telemetry with that APID arrives + :param handler: Handler class instance + :return: + """ + self._handler_dict[handler.apid] = handler + + def has_apid(self, apid: int) -> bool: + return apid in self._handler_dict + + def handle_packet(self, apid: int, packet: bytes) -> bool: + """Handle a packet with an APID. If a handler exists for the given APID, + it is used to handle the packet. If not, a dedicated handler for unknown APIDs + is called. + + :param apid: + :param packet: + :return: True if the packet was passed to as dedicated APID handler, False otherwise + """ + handler = self._handler_dict.get(apid) + if handler is None: + self.unknown_handler.handle_tm(apid, packet, self.unknown_handler.user_args) + return False + handler.handle_tm(packet, handler.user_args) + return True diff --git a/tmtccmd/tm/ccsds_tm_listener.py b/tmtccmd/tm/ccsds_tm_listener.py index 76ecbba4..357f8c0e 100644 --- a/tmtccmd/tm/ccsds_tm_listener.py +++ b/tmtccmd/tm/ccsds_tm_listener.py @@ -2,9 +2,8 @@ from typing import Dict, List, Tuple from spacepackets.ccsds.spacepacket import get_apid_from_raw_space_packet -from tmtccmd.ccsds.handler import CcsdsTmHandler -from tmtccmd.tm import TelemetryQueueT +from tmtccmd.tm import TelemetryQueueT, CcsdsTmHandler from tmtccmd.logging import get_console_logger from tmtccmd.com_if import ComInterface From f81132c5de89284b8b8659183d30a61c6a0251ad Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 28 Jun 2022 11:42:33 +0200 Subject: [PATCH 147/221] fix tests --- tests/test_tm_handler.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_tm_handler.py b/tests/test_tm_handler.py index b69c7125..a70ffae2 100644 --- a/tests/test_tm_handler.py +++ b/tests/test_tm_handler.py @@ -3,7 +3,7 @@ from unittest.mock import MagicMock from spacepackets.ecss import PusTelemetry -from tmtccmd.ccsds.handler import ( +from tmtccmd.tm import ( ApidTmHandlerBase, CcsdsTmHandler, UnknownApidHandlerBase, From a6bdfd7f686c959e1b9a344a91623c0389c309a0 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 28 Jun 2022 12:02:56 +0200 Subject: [PATCH 148/221] bump major version --- tmtccmd/__init__.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/tmtccmd/__init__.py b/tmtccmd/__init__.py index 0cf8bd7c..f9c9c948 100644 --- a/tmtccmd/__init__.py +++ b/tmtccmd/__init__.py @@ -16,14 +16,13 @@ from tmtccmd.tc import DefaultProcedureInfo from tmtccmd.tc.handler import TcHandlerBase -VERSION_NAME = "tmtccmd" -VERSION_MAJOR = 2 -VERSION_MINOR = 2 -VERSION_REVISION = 2 +VERSION_MAJOR = 3 +VERSION_MINOR = 0 +VERSION_REVISION = 0 # I think this needs to be in string representation to be parsed so we can't # use a formatted string here. -__version__ = "2.2.2" +__version__ = "3.0.0" LOGGER = get_console_logger() From a764049a938c85a7c801c6bfd65868637ae9df5c Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 28 Jun 2022 12:05:20 +0200 Subject: [PATCH 149/221] update .svg of logo --- misc/logo.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/logo.svg b/misc/logo.svg index e26d98dd..523803f9 100644 --- a/misc/logo.svg +++ b/misc/logo.svg @@ -30,7 +30,7 @@ showgrid="false" inkscape:zoom="1" inkscape:cx="397" - inkscape:cy="561.5" + inkscape:cy="562.5" inkscape:window-width="2486" inkscape:window-height="1376" inkscape:window-x="0" From ded00098c353f18e7ebb2849920c012ce30e7067 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 28 Jun 2022 14:00:48 +0200 Subject: [PATCH 150/221] fix unittests for windows --- tests/test_cd.py | 4 + tests/test_cfdp_filestore.py | 71 ++++++++------- tests/test_printer.py | 20 ++--- tests/test_seq_sender.py | 3 +- tmtccmd/cfdp/filestore.py | 154 +++++++++++++-------------------- tmtccmd/logging/pus.py | 7 +- tmtccmd/tc/ccsds_seq_sender.py | 10 ++- tmtccmd/utility/countdown.py | 7 +- 8 files changed, 132 insertions(+), 144 deletions(-) diff --git a/tests/test_cd.py b/tests/test_cd.py index 6e53b682..b3552ef7 100644 --- a/tests/test_cd.py +++ b/tests/test_cd.py @@ -21,3 +21,7 @@ def test_basic(self): self.assertTrue(test_cd.rem_time() > 0.045) self.assertTrue(test_cd.busy()) self.assertFalse(test_cd.timed_out()) + test_cd.reset(0.05) + self.assertTrue(test_cd.busy()) + test_cd.time_out() + self.assertTrue(test_cd.timed_out()) diff --git a/tests/test_cfdp_filestore.py b/tests/test_cfdp_filestore.py index 1b1093db..3567d734 100644 --- a/tests/test_cfdp_filestore.py +++ b/tests/test_cfdp_filestore.py @@ -1,23 +1,26 @@ import os.path +from pathlib import Path import shutil +import tempfile + from pyfakefs.fake_filesystem_unittest import TestCase from tmtccmd.cfdp.filestore import HostFilestore, FilestoreResult -TEST_FILE_NAME_0 = "/tmp/cfdp_unittest0.txt" -TEST_FILE_NAME_1 = "/tmp/cfdp_unittest1.txt" -TEST_DIR_NAME_0 = "/tmp/cfdp_test_folder0" -TEST_DIR_NAME_1 = "/tmp/cfdp_test_folder1" -TEST_LIST_DIR_NAME = "/tmp/list-dir-test.txt" - - class TestCfdpHostFilestore(TestCase): def setUp(self): self.setUpPyfakefs() + self.temp_dir = tempfile.gettempdir() + self.test_file_name_0 = Path(f"{self.temp_dir}/cfdp_unittest0.txt") + self.test_file_name_1 = Path(f"{self.temp_dir}/cfdp_unittest1.txt") + self.test_dir_name_0 = Path(f"{self.temp_dir}/cfdp_test_folder0") + self.test_dir_name_1 = Path(f"{self.temp_dir}/cfdp_test_folder1") + self.test_list_dir_name = Path(f"{self.temp_dir}/list-dir-test.txt") def test_filestore(self): filestore = HostFilestore() - if os.path.exists(TEST_FILE_NAME_0): + """ + if os.path.exists(TEST_FILE_NAME_0): if os.path.isdir(TEST_DIR_NAME_0): os.rmdir(TEST_FILE_NAME_0) else: @@ -31,43 +34,49 @@ def test_filestore(self): shutil.rmtree(TEST_DIR_NAME_0) if os.path.exists(TEST_DIR_NAME_1): shutil.rmtree(TEST_DIR_NAME_1) - res = filestore.create_file(TEST_FILE_NAME_0) + """ + + res = filestore.create_file(self.test_file_name_0) self.assertTrue(res == FilestoreResult.CREATE_SUCCESS) - self.assertTrue(os.path.exists(TEST_FILE_NAME_0)) - res = filestore.create_file(TEST_FILE_NAME_0) - self.assertTrue(res == FilestoreResult.CREATE_NOT_ALLOWED) + self.assertTrue(self.test_file_name_0.exists()) + res = filestore.create_file(self.test_file_name_0) + self.assertEqual(res, FilestoreResult.CREATE_NOT_ALLOWED) - res = filestore.delete_file(TEST_FILE_NAME_0) - self.assertTrue(res == FilestoreResult.DELETE_SUCCESS) - self.assertFalse(os.path.exists(TEST_FILE_NAME_0)) - res = filestore.delete_file(TEST_FILE_NAME_0) + res = filestore.delete_file(self.test_file_name_0) + self.assertEqual(res, FilestoreResult.DELETE_SUCCESS) + self.assertFalse(os.path.exists(self.test_file_name_0)) + res = filestore.delete_file(self.test_file_name_0) self.assertTrue(res == FilestoreResult.DELETE_FILE_DOES_NOT_EXIST) - filestore.create_file(TEST_FILE_NAME_0) - res = filestore.rename_file( - old_file_path=TEST_FILE_NAME_0, new_file_path=TEST_FILE_NAME_1 - ) + filestore.create_file(self.test_file_name_0) + res = filestore.rename_file(self.test_file_name_0, self.test_file_name_1) self.assertTrue(res == FilestoreResult.RENAME_SUCCESS) - self.assertTrue(os.path.exists(TEST_FILE_NAME_1)) - self.assertFalse(os.path.exists(TEST_FILE_NAME_0)) - res = filestore.delete_file(TEST_FILE_NAME_1) + self.assertTrue(os.path.exists(self.test_file_name_1)) + self.assertFalse(os.path.exists(self.test_file_name_0)) + res = filestore.delete_file(self.test_file_name_1) self.assertTrue(res == FilestoreResult.DELETE_SUCCESS) - res = filestore.create_directory(TEST_DIR_NAME_0) + res = filestore.create_directory(self.test_file_name_0) self.assertTrue(res == FilestoreResult.CREATE_DIR_SUCCESS) - self.assertTrue(os.path.isdir(TEST_DIR_NAME_0)) - res = filestore.create_directory(TEST_DIR_NAME_0) + self.assertTrue(os.path.isdir(self.test_file_name_0)) + res = filestore.create_directory(self.test_file_name_0) self.assertTrue(res == FilestoreResult.CREATE_DIR_CAN_NOT_BE_CREATED) - res = filestore.delete_file(TEST_DIR_NAME_0) + res = filestore.delete_file(self.test_file_name_0) self.assertTrue(res == FilestoreResult.DELETE_NOT_ALLOWED) - res = filestore.remove_directory(TEST_DIR_NAME_0) + res = filestore.remove_directory(self.test_file_name_0) self.assertTrue(res == FilestoreResult.REMOVE_DIR_SUCCESS) def test_list_dir(self): filestore = HostFilestore() - if os.path.exists(TEST_LIST_DIR_NAME): - os.remove(TEST_LIST_DIR_NAME) + tempdir = Path(tempfile.gettempdir()) + if os.path.exists(self.test_list_dir_name): + os.remove(self.test_list_dir_name) # Do not delete, user can check file content now - res = filestore.list_directory(dir_name="/tmp", file_name=TEST_LIST_DIR_NAME) + res = filestore.list_directory( + dir_name=tempdir, target_file=self.test_list_dir_name + ) self.assertTrue(res == FilestoreResult.SUCCESS) + + def tearDown(self): + pass diff --git a/tests/test_printer.py b/tests/test_printer.py index 79d16f7d..c4e486c0 100644 --- a/tests/test_printer.py +++ b/tests/test_printer.py @@ -1,5 +1,7 @@ +import os import shutil from pathlib import Path +from tempfile import TemporaryFile from unittest import TestCase from spacepackets.ccsds.time import CdsShortTimestamp @@ -7,25 +9,22 @@ from tmtccmd.tm.pus_1_verification import Service1TmExtended from tmtccmd.pus.pus_17_test import pack_service_17_ping_command -from tmtccmd.utility.tmtc_printer import FsfwTmTcPrinter from tmtccmd.logging import get_console_logger, LOG_DIR from tmtccmd.config.globals import update_global, CoreGlobalIds from tmtccmd.logging.pus import ( RegularTmtcLogWrapper, - RawTmtcTimedLogWrapper, RawTmtcRotatingLogWrapper, - TimedLogWhen, ) +# TODO: Use temp files to test loggers class TestPrintersLoggers(TestCase): def setUp(self): self.log_path = Path(LOG_DIR) - if self.log_path.exists(): - shutil.rmtree(self.log_path) - self.log_path.mkdir() - self.regular_file_name = RegularTmtcLogWrapper.get_current_tmtc_file_name() - self.regular_tmtc_logger = RegularTmtcLogWrapper(self.regular_file_name) + if not self.log_path.exists(): + self.log_path.mkdir() + self.temp_file = TemporaryFile() + self.regular_tmtc_logger = RegularTmtcLogWrapper(self.temp_file) # self.raw_tmtc_timed_log = RawTmtcTimedLogWrapper( # when=TimedLogWhen.PER_SECOND, # interval=1 @@ -43,7 +42,7 @@ def test_pus_loggers(self): tc_request_id=RequestId(pus_tc.packet_id, pus_tc.packet_seq_ctrl), ) self.raw_tmtc_log.log_tm(pus_tm.pus_tm) - self.assertTrue(Path(self.regular_file_name).exists()) + self.assertTrue(Path(self.temp_file).exists()) # There should be 2 files now because 1024 bytes are not enough to accomate all info self.assertTrue(Path(self.raw_tmtc_log.file_name).exists()) self.assertTrue(Path(f"{self.raw_tmtc_log.file_name}.1").exists()) @@ -53,6 +52,3 @@ def test_print_functions(self): def tearDown(self) -> None: """Reset the hook object""" - update_global(CoreGlobalIds.TMTC_HOOK, None) - if self.log_path.exists(): - shutil.rmtree(LOG_DIR) diff --git a/tests/test_seq_sender.py b/tests/test_seq_sender.py index 63a3445e..1567f27d 100644 --- a/tests/test_seq_sender.py +++ b/tests/test_seq_sender.py @@ -38,7 +38,8 @@ def test_basic(self): call_args = self.tc_handler_mock.send_cb.call_args self.assertEqual(call_args.args[0].tc, bytes([0, 1, 2])) # Queue should be empty now - self.tc_handler_mock.queue_finished_cb.assert_called_once() + # Called twice for each operation call + self.assertEqual(self.tc_handler_mock.queue_finished_cb.call_count, 2) self.assertFalse(self.queue_wrapper.queue) self.assertEqual(self.seq_sender.mode, SenderMode.DONE) self.queue_helper.add_raw_tc(bytes([3, 2, 1])) diff --git a/tmtccmd/cfdp/filestore.py b/tmtccmd/cfdp/filestore.py index 506b9cd9..d4f9ef38 100644 --- a/tmtccmd/cfdp/filestore.py +++ b/tmtccmd/cfdp/filestore.py @@ -2,6 +2,7 @@ import os import shutil import platform +from pathlib import Path from tmtccmd.logging import get_console_logger from spacepackets.cfdp.tlv import FilestoreResponseStatusCode @@ -14,7 +15,7 @@ class VirtualFilestore: @abc.abstractmethod def append_data_to_file( - self, file_path: str, offset: int, data: bytes + self, file: Path, offset: int, data: bytes ) -> FilestoreResponseStatusCode: """This is not used as part of a filestore request, it is used to build up the received file""" @@ -22,52 +23,44 @@ def append_data_to_file( return FilestoreResponseStatusCode.NOT_PERFORMED @abc.abstractmethod - def create_file(self, file_path: str) -> FilestoreResponseStatusCode: + def create_file(self, file: Path) -> FilestoreResponseStatusCode: LOGGER.warning("Creating file not implemented in virtual filestore") return FilestoreResponseStatusCode.NOT_PERFORMED @abc.abstractmethod - def delete_file(self, file_path: str) -> FilestoreResponseStatusCode: + def delete_file(self, file: Path) -> FilestoreResponseStatusCode: LOGGER.warning("Deleting file not implemented in virtual filestore") return FilestoreResponseStatusCode.NOT_PERFORMED @abc.abstractmethod def rename_file( - self, _old_file_path: str, _new_file_path: str + self, _old_file: Path, _new_file: Path ) -> FilestoreResponseStatusCode: LOGGER.warning("Renaming file not implemented in virtual filestore") return FilestoreResponseStatusCode.NOT_PERFORMED - @abc.abstractmethod - def append_file( - self, source_file: str, appended_on_source: str - ) -> FilestoreResponseStatusCode: - """The source file name will be the name of the resulting file""" - LOGGER.warning("Appending to file not implemented in virtual filestore") - return FilestoreResponseStatusCode.NOT_PERFORMED - @abc.abstractmethod def replace_file( - self, _replaced_file: str, _source_file: str + self, _replaced_file: Path, _source_file: Path ) -> FilestoreResponseStatusCode: LOGGER.warning("Replacing file not implemented in virtual filestore") return FilestoreResponseStatusCode.NOT_PERFORMED @abc.abstractmethod - def create_directory(self, _dir_name: str) -> FilestoreResponseStatusCode: + def create_directory(self, _dir_name: Path) -> FilestoreResponseStatusCode: LOGGER.warning("Creating directory not implemented in virtual filestore") return FilestoreResponseStatusCode.NOT_PERFORMED @abc.abstractmethod def remove_directory( - self, _dir_name: str, recursive: bool + self, _dir_name: Path, recursive: bool ) -> FilestoreResponseStatusCode: LOGGER.warning("Removing directory not implemented in virtual filestore") return FilestoreResponseStatusCode.NOT_PERFORMED @abc.abstractmethod def list_directory( - self, _dir_name: str, _file_name: str, _recursive: bool = False + self, _dir_name: Path, _file_name: Path, _recursive: bool = False ) -> FilestoreResponseStatusCode: LOGGER.warning("Listing directory not implemented in virtual filestore") return FilestoreResponseStatusCode.NOT_PERFORMED @@ -79,7 +72,7 @@ def __init__(self): @abc.abstractmethod def append_data_to_file( - self, file_path: str, offset: int, data: bytes + self, file: Path, offset: int, data: bytes ) -> FilestoreResponseStatusCode: """Primary function used to perform the CFDP Copy Procedure. This will also create a new file as long as no other file with the same name exists @@ -88,94 +81,73 @@ def append_data_to_file( - FilestoreResponseStatusCode.APPEND_FROM_DATA_FILE_NOT_EXISTS: File does not exist yet - FilestoreResponseStatusCode.APPEND_FROM_DATA_INVALID_OFFSET: Invalid offset """ - if not os.path.exists(file_path): + if not file.exists(): return FilestoreResponseStatusCode.APPEND_FROM_DATA_FILE_NOT_EXISTS - file = open(file_path, "r+b") - file_size = os.path.getsize(file_path) - if offset > file_size: - return FilestoreResponseStatusCode.APPEND_FROM_DATA_INVALID_OFFSET - file.seek(offset) - file.write(data) - file.close() + with open(file, "r+b") as of: + file_size = file.stat().st_size + if offset > file_size: + return FilestoreResponseStatusCode.APPEND_FROM_DATA_INVALID_OFFSET + of.seek(offset) + of.write(data) return FilestoreResponseStatusCode.SUCCESS - def create_file(self, file_path: str) -> FilestoreResponseStatusCode: + def create_file(self, file: Path) -> FilestoreResponseStatusCode: """Returns CREATE_NOT_ALLOWED if the file already exists""" - if os.path.exists(file_path): + if file.exists(): LOGGER.warning("File already exists") return FilestoreResponseStatusCode.CREATE_NOT_ALLOWED try: - file = open(file_path, "x") + file = open(file, "x") file.close() return FilestoreResponseStatusCode.CREATE_SUCCESS except OSError: - LOGGER.exception(f"Creating file {file_path} failed") + LOGGER.exception(f"Creating file {file} failed") return FilestoreResponseStatusCode.CREATE_NOT_ALLOWED - def delete_file(self, file_path: str) -> FilestoreResponseStatusCode: - if not os.path.exists(file_path): + def delete_file(self, file: Path) -> FilestoreResponseStatusCode: + if not file.exists(): return FilestoreResponseStatusCode.DELETE_FILE_DOES_NOT_EXIST - try: - os.remove(file_path) - return FilestoreResponseStatusCode.DELETE_SUCCESS - except IsADirectoryError as e: - LOGGER.exception(e) + if file.is_dir(): return FilestoreResponseStatusCode.DELETE_NOT_ALLOWED + os.remove(file) + return FilestoreResponseStatusCode.DELETE_SUCCESS def rename_file( - self, old_file_path: str, new_file_path: str + self, old_file: Path, new_file: Path ) -> FilestoreResponseStatusCode: - if os.path.isdir(old_file_path) or os.path.isdir(new_file_path): - LOGGER.exception(f"{old_file_path} or {new_file_path} is a directory") + if old_file.is_dir() or new_file.is_dir(): + LOGGER.exception(f"{old_file} or {new_file} is a directory") return FilestoreResponseStatusCode.RENAME_NOT_PERFORMED - if not os.path.exists(old_file_path): + if not old_file.exists(): return FilestoreResponseStatusCode.RENAME_OLD_FILE_DOES_NOT_EXIST - if os.path.exists(new_file_path): + if new_file.exists(): return FilestoreResponseStatusCode.RENAME_NEW_FILE_DOES_EXIST - os.rename(old_file_path, new_file_path) + old_file.rename(new_file) return FilestoreResponseStatusCode.RENAME_SUCCESS - def append_file( - self, source_file: str, appended_on_source: str - ) -> FilestoreResponseStatusCode: - if not os.path.exists(source_file): - return FilestoreResponseStatusCode.APPEND_FILE_NAME_ONE_NOT_EXISTS - if not os.path.exists(appended_on_source): - return FilestoreResponseStatusCode.APPEND_FILE_NAME_TWO_NOT_EXISTS - try: - file_one = open(source_file, "ab") - file_two = open(appended_on_source, "rb") - file_one.write(file_two.read()) - file_one.close() - file_two.close() - return FilestoreResponseStatusCode.APPEND_SUCCESS - except IOError: - LOGGER.exception(f"Appending {appended_on_source} on {source_file} failed") - return FilestoreResponseStatusCode.APPEND_NOT_PERFORMED - def replace_file( - self, replaced_file: str, source_file: str + self, replaced_file: Path, source_file: Path ) -> FilestoreResponseStatusCode: - if os.path.isdir(replaced_file) or os.path.isdir(source_file): + if replaced_file.is_dir() or source_file.is_dir(): LOGGER.warning(f"{replaced_file} is a directory") return FilestoreResponseStatusCode.REPLACE_NOT_ALLOWED - if not os.path.exists(replaced_file): + if not replaced_file.exists(): return ( FilestoreResponseStatusCode.REPLACE_FILE_NAME_ONE_TO_BE_REPLACED_DOES_NOT_EXIST ) - if not os.path.exists(source_file): + if not source_file.exists(): return ( FilestoreResponseStatusCode.REPLACE_FILE_NAME_TWO_REPLACE_SOURCE_NOT_EXIST ) - os.replace(replaced_file, source_file) + source_file.replace(replaced_file) def remove_directory( - self, dir_name: str, recursive: bool = False + self, dir_name: Path, recursive: bool = False ) -> FilestoreResponseStatusCode: - if not os.path.exists(dir_name): + if not dir_name.exists(): LOGGER.warning(f"{dir_name} does not exist") return FilestoreResponseStatusCode.REMOVE_DIR_DOES_NOT_EXIST - elif not os.path.isdir(dir_name): + elif not dir_name.is_dir(): LOGGER.warning(f"{dir_name} is not a directory") return FilestoreResponseStatusCode.REMOVE_DIR_NOT_ALLOWED if recursive: @@ -188,42 +160,40 @@ def remove_directory( LOGGER.exception(f"Removing directory {dir_name} failed") return FilestoreResponseStatusCode.RENAME_NOT_PERFORMED - def create_directory(self, dir_name: str) -> FilestoreResponseStatusCode: - if os.path.exists(dir_name): + def create_directory(self, dir_name: Path) -> FilestoreResponseStatusCode: + if dir_name.exists(): # It does not really matter if the existing structure is a file or a directory return FilestoreResponseStatusCode.CREATE_DIR_CAN_NOT_BE_CREATED os.mkdir(dir_name) return FilestoreResponseStatusCode.CREATE_DIR_SUCCESS def list_directory( - self, dir_name: str, file_name: str, recursive: bool = False + self, dir_name: Path, target_file: Path, recursive: bool = False ) -> FilestoreResponseStatusCode: """List a directory :param dir_name: Name of directory to list - :param file_name: The list will be written into this target file + :param target_file: The list will be written into this target file :param recursive: :return: """ - # Create a unique name by using the current time - if os.path.exists(file_name): - # This really should not happen - LOGGER.warning("Duplicate file name for listing directory") - return FilestoreResponseStatusCode.NOT_PERFORMED - file = open(file_name, "w") - if platform.system() == "Linux" or platform.system() == "Darwin": - cmd = "ls -al" - elif platform.system() == "Windows": - cmd = "dir" + if target_file.exists(): + open_flag = "a" else: - LOGGER.warning( - f"Unknown OS {platform.system()}, do not know how to list directory" - ) - return FilestoreResponseStatusCode.NOT_PERFORMED - file.write(f"Contents of directory {dir_name} generated with '{cmd}':\n") - file.close() - curr_path = os.getcwd() - os.chdir(dir_name) - os.system(f"{cmd} >> {file_name}") - os.chdir(curr_path) + open_flag = "w" + with open(target_file, open_flag) as of: + if platform.system() == "Linux" or platform.system() == "Darwin": + cmd = "ls -al" + elif platform.system() == "Windows": + cmd = "dir" + else: + LOGGER.warning( + f"Unknown OS {platform.system()}, do not know how to list directory" + ) + return FilestoreResponseStatusCode.NOT_PERFORMED + of.write(f"Contents of directory {dir_name} generated with '{cmd}':\n") + curr_path = os.getcwd() + os.chdir(dir_name) + os.system(f"{cmd} >> {target_file}") + os.chdir(curr_path) return FilestoreResponseStatusCode.SUCCESS diff --git a/tmtccmd/logging/pus.py b/tmtccmd/logging/pus.py index e964188b..4616bdb0 100644 --- a/tmtccmd/logging/pus.py +++ b/tmtccmd/logging/pus.py @@ -1,6 +1,7 @@ from __future__ import annotations import enum import logging +from pathlib import Path from typing import Optional, Union from datetime import datetime @@ -84,7 +85,7 @@ def __init__( self, when: TimedLogWhen, interval: int, - file_name: str = f"{LOG_DIR}/{RAW_PUS_FILE_BASE_NAME}.log", + file_name: Path = Path(f"{LOG_DIR}/{RAW_PUS_FILE_BASE_NAME}.log"), ): """Create a raw TMTC timed rotating log wrapper. See the official Python documentation at @@ -116,7 +117,7 @@ def __init__( self, max_bytes: int, backup_count: int, - file_name: str = f"{LOG_DIR}/{RAW_PUS_FILE_BASE_NAME}", + file_name: Path = Path(f"{LOG_DIR}/{RAW_PUS_FILE_BASE_NAME}"), suffix: str = date_suffix(), ): """Create a raw TMTC rotating log wrapper. @@ -152,7 +153,7 @@ def __init__( class RegularTmtcLogWrapper: - def __init__(self, file_name: Optional[str] = None): + def __init__(self, file_name: Optional[Path] = None): if file_name is None: self.file_name = self.get_current_tmtc_file_name() else: diff --git a/tmtccmd/tc/ccsds_seq_sender.py b/tmtccmd/tc/ccsds_seq_sender.py index 0a3e07db..ba3a5b24 100644 --- a/tmtccmd/tc/ccsds_seq_sender.py +++ b/tmtccmd/tc/ccsds_seq_sender.py @@ -1,5 +1,6 @@ """Used to send multiple TCs in sequence""" import enum +import math from typing import Optional from tmtccmd.tc import TcQueueEntryBase, TcQueueEntryType, PacketCastWrapper @@ -42,8 +43,10 @@ def __init__( self._tc_handler = tc_handler self._queue_wrapper = queue_wrapper self._mode = SenderMode.DONE - self._wait_cd = Countdown(0) + self._wait_cd = Countdown(None) self._send_cd = Countdown(queue_wrapper.inter_cmd_delay) + if math.isclose(queue_wrapper.inter_cmd_delay, 0.0): + self._send_cd.time_out() self._current_res = SeqResultWrapper(self._mode) self._current_res.longest_rem_delay = queue_wrapper.inter_cmd_delay self._op_divider = 0 @@ -122,12 +125,15 @@ def _check_next_telecommand(self): if call_send_cb: self._tc_handler.send_cb(next_queue_entry, self._com_if) if is_tc: - if self.queue_wrapper.inter_cmd_delay != self._send_cd.timeout: + if not math.isclose( + self.queue_wrapper.inter_cmd_delay, self._send_cd.timeout + ): self._send_cd.reset(self.queue_wrapper.inter_cmd_delay) else: self._send_cd.reset() self.queue_wrapper.queue.popleft() if not self.queue_wrapper.queue and self.no_delay_remaining(): + self._tc_handler.queue_finished_cb(self._queue_wrapper.info) self._mode = SenderMode.DONE def no_delay_remaining(self) -> bool: diff --git a/tmtccmd/utility/countdown.py b/tmtccmd/utility/countdown.py index 9327e5a8..6e28aedf 100644 --- a/tmtccmd/utility/countdown.py +++ b/tmtccmd/utility/countdown.py @@ -6,9 +6,10 @@ class Countdown: def __init__(self, init_timeout_secs: Optional[float]): if init_timeout_secs is not None: self._timeout = init_timeout_secs + self._start_time = time.time() else: self._timeout = 0 - self._start_time = time.time() + self._start_time = 0 @property def timeout(self): @@ -19,7 +20,7 @@ def timeout(self, timeout: float): self._timeout = timeout def timed_out(self) -> bool: - if time.time() - self._start_time > self._timeout: + if time.time() - self._start_time >= self._timeout: return True else: return False @@ -38,7 +39,7 @@ def start(self): self._start_time = time.time() def time_out(self): - self._start_time = time.time() - self._timeout + self._start_time = 0 def rem_time(self) -> float: end_time = self._start_time + self._timeout From 0ee8a169aad982f25c571657634f8f453056bd1c Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 28 Jun 2022 14:24:52 +0200 Subject: [PATCH 151/221] bump ci/cd version and test on windows as well --- .github/workflows/package.yml | 7 ++++--- tests/test_printer.py | 17 +++++++---------- 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/.github/workflows/package.yml b/.github/workflows/package.yml index 02659269..f9801675 100644 --- a/.github/workflows/package.yml +++ b/.github/workflows/package.yml @@ -5,16 +5,17 @@ on: [push] jobs: build: - runs-on: ubuntu-latest + runs-on: ${{ matrix.os }} strategy: matrix: + os: [ubuntu-latest, windows-latest] python-version: ['3.8', '3.9', '3.10'] steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 with: python-version: ${{ matrix.python-version }} diff --git a/tests/test_printer.py b/tests/test_printer.py index c4e486c0..f685fb56 100644 --- a/tests/test_printer.py +++ b/tests/test_printer.py @@ -17,23 +17,18 @@ ) -# TODO: Use temp files to test loggers +# TODO: Use temp files to test loggers?gitas class TestPrintersLoggers(TestCase): def setUp(self): self.log_path = Path(LOG_DIR) if not self.log_path.exists(): self.log_path.mkdir() - self.temp_file = TemporaryFile() - self.regular_tmtc_logger = RegularTmtcLogWrapper(self.temp_file) - # self.raw_tmtc_timed_log = RawTmtcTimedLogWrapper( - # when=TimedLogWhen.PER_SECOND, - # interval=1 - # ) - self.raw_tmtc_log = RawTmtcRotatingLogWrapper(max_bytes=1024, backup_count=10) - # self.tmtc_printer = FsfwTmTcPrinter(file_logger=self.regular_tmtc_logger.logger) + self.regular_file_name = Path(RegularTmtcLogWrapper.get_current_tmtc_file_name()) self.logger = get_console_logger() def test_pus_loggers(self): + self.regular_tmtc_logger = RegularTmtcLogWrapper(self.regular_file_name) + self.raw_tmtc_log = RawTmtcRotatingLogWrapper(max_bytes=2048, backup_count=10) pus_tc = pack_service_17_ping_command(ssc=0) self.raw_tmtc_log.log_tc(pus_tc) pus_tm = Service1TmExtended( @@ -42,7 +37,7 @@ def test_pus_loggers(self): tc_request_id=RequestId(pus_tc.packet_id, pus_tc.packet_seq_ctrl), ) self.raw_tmtc_log.log_tm(pus_tm.pus_tm) - self.assertTrue(Path(self.temp_file).exists()) + self.assertTrue(Path(self.regular_file_name).exists()) # There should be 2 files now because 1024 bytes are not enough to accomate all info self.assertTrue(Path(self.raw_tmtc_log.file_name).exists()) self.assertTrue(Path(f"{self.raw_tmtc_log.file_name}.1").exists()) @@ -52,3 +47,5 @@ def test_print_functions(self): def tearDown(self) -> None: """Reset the hook object""" + if self.regular_file_name.exists(): + os.remove(self.regular_file_name) From 686dfb5cf3ef9b7d866bb64167eea14070b5b1e8 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 28 Jun 2022 14:29:09 +0200 Subject: [PATCH 152/221] quick fix for windows --- tests/test_printer.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_printer.py b/tests/test_printer.py index f685fb56..6fd17e1f 100644 --- a/tests/test_printer.py +++ b/tests/test_printer.py @@ -47,5 +47,5 @@ def test_print_functions(self): def tearDown(self) -> None: """Reset the hook object""" - if self.regular_file_name.exists(): - os.remove(self.regular_file_name) + # if self.regular_file_name.exists(): + # os.remove(self.regular_file_name) From 56a2b939e58de667e884aad7e2bdc5bc29c99c71 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 28 Jun 2022 14:41:35 +0200 Subject: [PATCH 153/221] this fixes the win unittest --- tests/test_printer.py | 24 ++++++++++++++---------- tmtccmd/logging/pus.py | 13 ++++++++----- 2 files changed, 22 insertions(+), 15 deletions(-) diff --git a/tests/test_printer.py b/tests/test_printer.py index 6fd17e1f..16e1c18e 100644 --- a/tests/test_printer.py +++ b/tests/test_printer.py @@ -1,5 +1,6 @@ import os import shutil +import time from pathlib import Path from tempfile import TemporaryFile from unittest import TestCase @@ -23,29 +24,32 @@ def setUp(self): self.log_path = Path(LOG_DIR) if not self.log_path.exists(): self.log_path.mkdir() - self.regular_file_name = Path(RegularTmtcLogWrapper.get_current_tmtc_file_name()) + self.regular_file_name = Path( + RegularTmtcLogWrapper.get_current_tmtc_file_name() + ) self.logger = get_console_logger() def test_pus_loggers(self): - self.regular_tmtc_logger = RegularTmtcLogWrapper(self.regular_file_name) - self.raw_tmtc_log = RawTmtcRotatingLogWrapper(max_bytes=2048, backup_count=10) + regular_tmtc_logger = RegularTmtcLogWrapper(self.regular_file_name) + raw_tmtc_log = RawTmtcRotatingLogWrapper(max_bytes=2048, backup_count=10) pus_tc = pack_service_17_ping_command(ssc=0) - self.raw_tmtc_log.log_tc(pus_tc) + raw_tmtc_log.log_tc(pus_tc) pus_tm = Service1TmExtended( subservice=1, time=CdsShortTimestamp.init_from_current_time(), tc_request_id=RequestId(pus_tc.packet_id, pus_tc.packet_seq_ctrl), ) - self.raw_tmtc_log.log_tm(pus_tm.pus_tm) + raw_tmtc_log.log_tm(pus_tm.pus_tm) self.assertTrue(Path(self.regular_file_name).exists()) + regular_tmtc_logger.logger.info("Test") # There should be 2 files now because 1024 bytes are not enough to accomate all info - self.assertTrue(Path(self.raw_tmtc_log.file_name).exists()) - self.assertTrue(Path(f"{self.raw_tmtc_log.file_name}.1").exists()) + self.assertTrue(Path(raw_tmtc_log.file_name).exists()) + self.assertTrue(Path(f"{raw_tmtc_log.file_name}.1").exists()) def test_print_functions(self): pass - def tearDown(self) -> None: + def tearDown(self): """Reset the hook object""" - # if self.regular_file_name.exists(): - # os.remove(self.regular_file_name) + if self.regular_file_name.exists(): + os.remove(self.regular_file_name) diff --git a/tmtccmd/logging/pus.py b/tmtccmd/logging/pus.py index 4616bdb0..1f144a9c 100644 --- a/tmtccmd/logging/pus.py +++ b/tmtccmd/logging/pus.py @@ -159,15 +159,18 @@ def __init__(self, file_name: Optional[Path] = None): else: self.file_name = file_name self.logger = logging.getLogger(TMTC_LOGGER_NAME) - file_handler = FileHandler(self.file_name) + self.file_handler = FileHandler(self.file_name) formatter = logging.Formatter() - file_handler.setFormatter(formatter) - self.logger.addHandler(file_handler) + self.file_handler.setFormatter(formatter) + self.logger.addHandler(self.file_handler) self.logger.setLevel(logging.INFO) @classmethod - def get_current_tmtc_file_name(cls) -> str: - return ( + def get_current_tmtc_file_name(cls) -> Path: + return Path( f"{LOG_DIR}/{TMTC_FILE_BASE_NAME}_{datetime.now().date()}_" f"{datetime.now().time().strftime('%H%M%S')}.log" ) + + def __del__(self): + self.logger.removeHandler(self.file_handler) From 2784e2abf5214e1927e47a48a4b1491317622819 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 28 Jun 2022 15:26:51 +0200 Subject: [PATCH 154/221] remove a few unused mocks --- tests/backend_mock.py | 42 ---------------------------------------- tests/hook_obj_mock.py | 8 ++++---- tests/tc_handler_mock.py | 14 -------------- 3 files changed, 4 insertions(+), 60 deletions(-) delete mode 100644 tests/backend_mock.py delete mode 100644 tests/tc_handler_mock.py diff --git a/tests/backend_mock.py b/tests/backend_mock.py deleted file mode 100644 index 195b8145..00000000 --- a/tests/backend_mock.py +++ /dev/null @@ -1,42 +0,0 @@ -from unittest.mock import MagicMock - -from .hook_obj_mock import TestHookObj -from .tc_handler_mock import TcHandler - -from tmtccmd.core.ccsds_backend import CcsdsTmtcBackend -from tmtccmd.ccsds.handler import CcsdsTmHandler -from tmtccmd.config.com_if import create_communication_interface_default -from tmtccmd.tm.ccsds_tm_listener import CcsdsTmListener -from tmtccmd.utility.tmtc_printer import FsfwTmTcPrinter, DisplayMode -from tmtccmd.config.definitions import CoreComInterfaces, CoreModeList -from tmtccmd.core.frontend_base import FrontendBase - - -def create_backend_mock(tm_handler: CcsdsTmHandler) -> CcsdsTmtcBackend: - hook_obj = TestHookObj() - tmtc_printer = FsfwTmTcPrinter(display_mode=DisplayMode.LONG, file_logger=None) - com_if = create_communication_interface_default( - com_if_key=CoreComInterfaces.DUMMY.value, - json_cfg_path="tmtc_config.json", - ) - tc_handler = TcHandler() - tm_listener = CcsdsTmListener(com_if=com_if, seq_timeout=3.0) - # The global variables are set by the argument parser. - tmtc_backend = CcsdsTmtcBackend( - hook_obj=hook_obj, - com_if=com_if, - tm_listener=tm_listener, - tm_handler=tm_handler, - tc_handler=tc_handler, - ) - tmtc_backend.start_listener = MagicMock(return_value=0) - tmtc_backend.initialize = MagicMock(return_value=0) - return tmtc_backend - - -def create_frontend_mock() -> FrontendBase: - from tmtccmd.core.frontend_base import FrontendBase - - tmtc_frontend = FrontendBase() - tmtc_frontend.start = MagicMock(return_value=0) - return tmtc_frontend diff --git a/tests/hook_obj_mock.py b/tests/hook_obj_mock.py index ed80df13..c0759ea1 100644 --- a/tests/hook_obj_mock.py +++ b/tests/hook_obj_mock.py @@ -3,11 +3,11 @@ from unittest.mock import MagicMock import argparse -from tmtccmd.config.com_if import CommunicationInterface -from tmtccmd.config.definitions import CoreModeList +from tmtccmd.com_if import ComInterface +from tmtccmd.config import CoreModeList from tmtccmd.config.tmtc import TmTcDefWrapper from tmtccmd.core.ccsds_backend import CcsdsTmtcBackend -from tmtccmd.config.cfg_hook import TmTcCfgHookBase +from tmtccmd.config import TmTcCfgHookBase from tmtccmd.logging import get_console_logger from tmtccmd.utility.obj_id import ObjectIdDictT @@ -61,7 +61,7 @@ def get_object_ids(self) -> ObjectIdDictT: @abstractmethod def assign_communication_interface( self, com_if_key: str - ) -> Optional[CommunicationInterface]: + ) -> Optional[ComInterface]: """Assign the communication interface used by the TMTC commander to send and receive TMTC with. diff --git a/tests/tc_handler_mock.py b/tests/tc_handler_mock.py deleted file mode 100644 index 4e1a953f..00000000 --- a/tests/tc_handler_mock.py +++ /dev/null @@ -1,14 +0,0 @@ -from tmtccmd.com_if.com_interface_base import CommunicationInterface -from tmtccmd.tc.definitions import TcQueueEntryBase, TcProcedureBase -from tmtccmd.tc.handler import TcHandlerBase, FeedWrapper - - -class TcHandler(TcHandlerBase): - def send_cb(self, tc_queue_entry: TcQueueEntryBase, com_if: CommunicationInterface): - pass - - def queue_finished_cb(self, info: TcProcedureBase): - pass - - def feed_cb(self, info: TcProcedureBase, wrapper: FeedWrapper): - pass From 315807de8048c46d134e9b99c81f5de73fc16c6b Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 28 Jun 2022 15:38:08 +0200 Subject: [PATCH 155/221] small unix fix --- tests/test_printer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_printer.py b/tests/test_printer.py index 16e1c18e..6613114e 100644 --- a/tests/test_printer.py +++ b/tests/test_printer.py @@ -31,7 +31,7 @@ def setUp(self): def test_pus_loggers(self): regular_tmtc_logger = RegularTmtcLogWrapper(self.regular_file_name) - raw_tmtc_log = RawTmtcRotatingLogWrapper(max_bytes=2048, backup_count=10) + raw_tmtc_log = RawTmtcRotatingLogWrapper(max_bytes=1024, backup_count=10) pus_tc = pack_service_17_ping_command(ssc=0) raw_tmtc_log.log_tc(pus_tc) pus_tm = Service1TmExtended( From 6f8ef86dd6212eed343a5edf16c09cfd8a2d895f Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 28 Jun 2022 15:47:29 +0200 Subject: [PATCH 156/221] why does this not work now.. --- tests/test_seq_sender.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_seq_sender.py b/tests/test_seq_sender.py index 1567f27d..cb73a470 100644 --- a/tests/test_seq_sender.py +++ b/tests/test_seq_sender.py @@ -113,7 +113,7 @@ def test_interpacket_delay(self): # No TC sent self.assertFalse(res.tc_sent) self.assertEqual(len(self.queue_wrapper.queue), 2) - time.sleep(inter_packet_delay) + time.sleep(inter_packet_delay * 2) res = self.seq_sender.operation() # TC sent self.assertTrue(res.tc_sent) From d174a58d4a8c92eec2377a853670b3e7de6fcb14 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 28 Jun 2022 15:48:54 +0200 Subject: [PATCH 157/221] smaller tweaks --- tests/test_seq_sender.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/test_seq_sender.py b/tests/test_seq_sender.py index cb73a470..fad7a6b7 100644 --- a/tests/test_seq_sender.py +++ b/tests/test_seq_sender.py @@ -90,7 +90,7 @@ def test_with_wait_entry(self): self.assertEqual(call_args.args[0].tc, bytes([1, 2, 3])) def test_interpacket_delay(self): - inter_packet_delay = 0.01 + inter_packet_delay = 0.02 ping_cmd = PusTelecommand(service=17, subservice=1) self.queue_helper.add_pus_tc(ping_cmd) self.queue_helper.add_packet_delay(inter_packet_delay) @@ -108,12 +108,12 @@ def test_interpacket_delay(self): self.tc_handler_mock.send_cb.assert_called_with(ANY, self.com_if) call_args = self.tc_handler_mock.send_cb.call_args self.assertEqual(call_args.args[0].delay_secs, inter_packet_delay) - self.assertTrue(0.008 < res.longest_rem_delay < 0.01) + self.assertTrue(0.8 * inter_packet_delay < res.longest_rem_delay < inter_packet_delay) res = self.seq_sender.operation() # No TC sent self.assertFalse(res.tc_sent) self.assertEqual(len(self.queue_wrapper.queue), 2) - time.sleep(inter_packet_delay * 2) + time.sleep(inter_packet_delay * 1.1) res = self.seq_sender.operation() # TC sent self.assertTrue(res.tc_sent) @@ -122,9 +122,9 @@ def test_interpacket_delay(self): # No TC sent, delay after each packet self.assertFalse(res.tc_sent) self.assertEqual(len(self.queue_wrapper.queue), 1) - self.assertTrue(0.008 < res.longest_rem_delay < 0.01) + self.assertTrue(0.8 * inter_packet_delay < res.longest_rem_delay < inter_packet_delay) # Delay 10 ms - time.sleep(0.01) + time.sleep(inter_packet_delay) res = self.seq_sender.operation() self.assertTrue(res.tc_sent) self.tc_handler_mock.send_cb.assert_called_with(ANY, self.com_if) From cf5bd4c29598fefe45918b47fd6df0910bddea6f Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 28 Jun 2022 16:01:02 +0200 Subject: [PATCH 158/221] this is odd --- tests/test_seq_sender.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_seq_sender.py b/tests/test_seq_sender.py index fad7a6b7..5ca08ee5 100644 --- a/tests/test_seq_sender.py +++ b/tests/test_seq_sender.py @@ -124,7 +124,7 @@ def test_interpacket_delay(self): self.assertEqual(len(self.queue_wrapper.queue), 1) self.assertTrue(0.8 * inter_packet_delay < res.longest_rem_delay < inter_packet_delay) # Delay 10 ms - time.sleep(inter_packet_delay) + time.sleep(inter_packet_delay * 1.1) res = self.seq_sender.operation() self.assertTrue(res.tc_sent) self.tc_handler_mock.send_cb.assert_called_with(ANY, self.com_if) From 09b383d8a2c62a7afc68a5050e285a9c51e3ef8d Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 28 Jun 2022 17:09:55 +0200 Subject: [PATCH 159/221] using timedeltas for time handling now --- tests/hook_obj_mock.py | 4 +-- tests/test_cd.py | 15 ++++++----- tests/test_queue.py | 12 ++++----- tests/test_runner.py | 5 ++-- tests/test_seq_sender.py | 29 +++++++++++++-------- tmtccmd/core/__init__.py | 3 ++- tmtccmd/tc/__init__.py | 21 ++++++++++----- tmtccmd/tc/ccsds_seq_sender.py | 27 +++++++++---------- tmtccmd/tc/queue.py | 15 ++++++++--- tmtccmd/utility/countdown.py | 47 ++++++++++++++++++++-------------- 10 files changed, 106 insertions(+), 72 deletions(-) diff --git a/tests/hook_obj_mock.py b/tests/hook_obj_mock.py index c0759ea1..85f5c67e 100644 --- a/tests/hook_obj_mock.py +++ b/tests/hook_obj_mock.py @@ -59,9 +59,7 @@ def get_object_ids(self) -> ObjectIdDictT: return super().get_object_ids() @abstractmethod - def assign_communication_interface( - self, com_if_key: str - ) -> Optional[ComInterface]: + def assign_communication_interface(self, com_if_key: str) -> Optional[ComInterface]: """Assign the communication interface used by the TMTC commander to send and receive TMTC with. diff --git a/tests/test_cd.py b/tests/test_cd.py index b3552ef7..a4381910 100644 --- a/tests/test_cd.py +++ b/tests/test_cd.py @@ -1,27 +1,28 @@ import time +from datetime import timedelta from unittest import TestCase from tmtccmd.utility.countdown import Countdown class CountdownTest(TestCase): def test_basic(self): - test_cd = Countdown(init_timeout_secs=0.05) + test_cd = Countdown.from_millis(50) self.assertTrue(test_cd.busy()) self.assertFalse(test_cd.timed_out()) - self.assertTrue(test_cd.rem_time() > 0) + self.assertTrue(test_cd.rem_time().total_seconds() * 1000 > 40) time.sleep(0.05) self.assertTrue(test_cd.timed_out()) - self.assertTrue(test_cd.rem_time() == 0) - test_cd.timeout = 0.1 + self.assertTrue(test_cd.rem_time() == timedelta()) + test_cd.timeout = timedelta(seconds=0.1) self.assertTrue(test_cd.busy()) self.assertFalse(test_cd.timed_out()) time.sleep(0.1) self.assertTrue(test_cd.timed_out()) - test_cd.reset(0.05) - self.assertTrue(test_cd.rem_time() > 0.045) + test_cd.reset(timedelta(seconds=0.5)) + self.assertTrue(test_cd.rem_time().total_seconds() * 1000 > 45) self.assertTrue(test_cd.busy()) self.assertFalse(test_cd.timed_out()) - test_cd.reset(0.05) + test_cd.reset(timedelta(milliseconds=50)) self.assertTrue(test_cd.busy()) test_cd.time_out() self.assertTrue(test_cd.timed_out()) diff --git a/tests/test_queue.py b/tests/test_queue.py index ea7f8bdf..7aed476c 100644 --- a/tests/test_queue.py +++ b/tests/test_queue.py @@ -1,5 +1,6 @@ import math from collections import deque +from datetime import timedelta from typing import cast from unittest import TestCase @@ -17,15 +18,12 @@ def test_queue(self): queue_wrapper = QueueWrapper(info=None, queue=deque()) self.assertEqual(queue_wrapper.queue, deque()) queue_helper = QueueHelper(queue_wrapper) - queue_helper.add_wait(2.0) + queue_helper.add_wait(timedelta(seconds=2)) self.assertEqual(len(queue_wrapper.queue), 1) wait_entry = cast(WaitEntry, queue_wrapper.queue.pop()) self.assertTrue(wait_entry) self.assertFalse(wait_entry.is_tc()) - self.assertTrue( - math.isclose(wait_entry.wait_secs, eval(f"{wait_entry!r}").wait_secs) - ) - self.assertEqual(wait_entry.wait_secs, 2.0) + self.assertEqual(wait_entry.wait_time.total_seconds(), 2.0) self.assertEqual(len(queue_wrapper.queue), 0) pus_cmd = PusTelecommand(service=17, subservice=1) queue_helper.add_pus_tc(pus_cmd) @@ -33,7 +31,7 @@ def test_queue(self): queue_helper.add_log_cmd("Test String") queue_helper.add_raw_tc(bytes([0, 1, 2])) queue_helper.add_ccsds_tc(pus_cmd.to_space_packet()) - queue_helper.add_packet_delay(3.0) + queue_helper.add_packet_delay(timedelta(seconds=3.0)) print(queue_wrapper.queue) self.assertEqual(len(queue_wrapper.queue), 5) @@ -76,4 +74,4 @@ def test_queue(self): self.assertFalse(packet_delay.is_tc()) cast_wrapper.base = packet_delay packet_delay = cast_wrapper.to_packet_delay_entry() - self.assertEqual(packet_delay.delay_secs, 3.0) + self.assertEqual(packet_delay.delay_time.total_seconds(), 3.0) diff --git a/tests/test_runner.py b/tests/test_runner.py index 8150e093..e8adf8ed 100644 --- a/tests/test_runner.py +++ b/tests/test_runner.py @@ -1,3 +1,4 @@ +from datetime import timedelta from unittest import TestCase from unittest.mock import MagicMock @@ -22,11 +23,11 @@ def test_backend(self): self.assertEqual(backend.tc_mode, TcMode.IDLE) self.assertEqual(backend.com_if.get_id(), "dummy") self.assertEqual(backend.com_if_id, "dummy") - self.assertEqual(backend.inter_cmd_delay, 0.0) + self.assertEqual(backend.inter_cmd_delay, timedelta()) state = backend.state self.assertEqual(state.tc_mode, TcMode.IDLE) self.assertEqual(state.tm_mode, TmMode.IDLE) - self.assertEqual(state.next_delay, 0.0) + self.assertEqual(state.next_delay, timedelta()) self.assertEqual(state.request, BackendRequest.NONE) backend.mode_to_req() self.assertEqual(state.request, BackendRequest.DELAY_IDLE) diff --git a/tests/test_seq_sender.py b/tests/test_seq_sender.py index 5ca08ee5..ce465278 100644 --- a/tests/test_seq_sender.py +++ b/tests/test_seq_sender.py @@ -1,6 +1,7 @@ import time from collections import deque from unittest import TestCase +from datetime import datetime, timedelta from unittest.mock import MagicMock, ANY from spacepackets.ecss import PusTelecommand @@ -53,7 +54,7 @@ def test_basic(self): def test_with_wait_entry(self): wait_delay = 0.01 self.queue_helper.add_raw_tc(bytes([3, 2, 1])) - self.queue_helper.add_wait(wait_delay) + self.queue_helper.add_wait(timedelta(seconds=wait_delay)) self.queue_helper.add_raw_tc(bytes([1, 2, 3])) # Resume call necessary self.assertEqual(self.seq_sender.mode, SenderMode.DONE) @@ -73,7 +74,7 @@ def test_with_wait_entry(self): self.assertFalse(res.tc_sent) self.tc_handler_mock.send_cb.assert_called_with(ANY, self.com_if) call_args = self.tc_handler_mock.send_cb.call_args - self.assertEqual(call_args.args[0].wait_secs, wait_delay) + self.assertEqual(call_args.args[0].wait_time, timedelta(seconds=wait_delay)) # Now no TCs should be sent for 10 ms self.assertEqual(len(self.queue_helper.queue_wrapper.queue), 1) self.assertEqual(res.mode, SenderMode.BUSY) @@ -90,15 +91,16 @@ def test_with_wait_entry(self): self.assertEqual(call_args.args[0].tc, bytes([1, 2, 3])) def test_interpacket_delay(self): - inter_packet_delay = 0.02 + delay_ms = 20 + inter_packet_delay = timedelta(milliseconds=delay_ms) ping_cmd = PusTelecommand(service=17, subservice=1) self.queue_helper.add_pus_tc(ping_cmd) - self.queue_helper.add_packet_delay(inter_packet_delay) + self.queue_helper.add_packet_delay_ms(delay_ms) self.queue_helper.add_ccsds_tc(ping_cmd.to_space_packet()) self.queue_helper.add_raw_tc(bytes([0, 1, 2])) # Send first TC, assert delay of 10 ms, then send last packet res = self.seq_sender.operation() - self.assertEqual(res.longest_rem_delay, 0.0) + self.assertEqual(res.longest_rem_delay, timedelta()) self.assertTrue(res.tc_sent) self.tc_handler_mock.send_cb.assert_called_with(ANY, self.com_if) call_args = self.tc_handler_mock.send_cb.call_args @@ -107,13 +109,18 @@ def test_interpacket_delay(self): self.assertFalse(res.tc_sent) self.tc_handler_mock.send_cb.assert_called_with(ANY, self.com_if) call_args = self.tc_handler_mock.send_cb.call_args - self.assertEqual(call_args.args[0].delay_secs, inter_packet_delay) - self.assertTrue(0.8 * inter_packet_delay < res.longest_rem_delay < inter_packet_delay) + self.assertEqual( + call_args.args[0].delay_time.total_seconds(), + inter_packet_delay.total_seconds(), + ) + self.assertTrue( + inter_packet_delay <= res.longest_rem_delay <= inter_packet_delay + ) res = self.seq_sender.operation() # No TC sent self.assertFalse(res.tc_sent) self.assertEqual(len(self.queue_wrapper.queue), 2) - time.sleep(inter_packet_delay * 1.1) + time.sleep(inter_packet_delay.total_seconds()) res = self.seq_sender.operation() # TC sent self.assertTrue(res.tc_sent) @@ -122,9 +129,11 @@ def test_interpacket_delay(self): # No TC sent, delay after each packet self.assertFalse(res.tc_sent) self.assertEqual(len(self.queue_wrapper.queue), 1) - self.assertTrue(0.8 * inter_packet_delay < res.longest_rem_delay < inter_packet_delay) + self.assertTrue( + 0.8 * inter_packet_delay < res.longest_rem_delay <= inter_packet_delay + ) # Delay 10 ms - time.sleep(inter_packet_delay * 1.1) + time.sleep(inter_packet_delay.total_seconds()) res = self.seq_sender.operation() self.assertTrue(res.tc_sent) self.tc_handler_mock.send_cb.assert_called_with(ANY, self.com_if) diff --git a/tmtccmd/core/__init__.py b/tmtccmd/core/__init__.py index 222c45d4..2ba17e68 100644 --- a/tmtccmd/core/__init__.py +++ b/tmtccmd/core/__init__.py @@ -1,5 +1,6 @@ from abc import abstractmethod import enum +from datetime import timedelta from tmtccmd.tc.ccsds_seq_sender import SeqResultWrapper, SenderMode @@ -41,7 +42,7 @@ def __init__( ): self._mode_wrapper = mode_wrapper self._req = req - self._recommended_delay = 0 + self._recommended_delay = timedelta() self._sender_res = SeqResultWrapper(SenderMode.DONE) @property diff --git a/tmtccmd/tc/__init__.py b/tmtccmd/tc/__init__.py index 60e1c175..c08d937b 100644 --- a/tmtccmd/tc/__init__.py +++ b/tmtccmd/tc/__init__.py @@ -1,6 +1,7 @@ from __future__ import annotations import enum +from datetime import timedelta from enum import Enum from typing import Deque, cast, Type, Any from spacepackets.ccsds.spacepacket import SpacePacket @@ -74,21 +75,29 @@ def __repr__(self): class WaitEntry(TcQueueEntryBase): - def __init__(self, wait_secs: float): + def __init__(self, wait_time: timedelta): super().__init__(TcQueueEntryType.WAIT) - self.wait_secs = wait_secs + self.wait_time = wait_time + + @classmethod + def from_millis(cls, millis: int) -> WaitEntry: + return cls(timedelta(milliseconds=millis)) def __repr__(self): - return f"{self.__class__.__name__}({self.wait_secs!r})" + return f"{self.__class__.__name__}({self.wait_time!r})" class PacketDelayEntry(TcQueueEntryBase): - def __init__(self, delay_secs: float): + def __init__(self, delay_time: timedelta): super().__init__(TcQueueEntryType.PACKET_DELAY) - self.delay_secs = delay_secs + self.delay_time = delay_time + + @classmethod + def from_millis(cls, millis: int) -> PacketDelayEntry: + return cls(timedelta(milliseconds=millis)) def __repr__(self): - return f"{self.__class__.__name__}({self.delay_secs!r})" + return f"{self.__class__.__name__}({self.delay_time!r})" class PacketCastWrapper: diff --git a/tmtccmd/tc/ccsds_seq_sender.py b/tmtccmd/tc/ccsds_seq_sender.py index ba3a5b24..a12c9585 100644 --- a/tmtccmd/tc/ccsds_seq_sender.py +++ b/tmtccmd/tc/ccsds_seq_sender.py @@ -1,6 +1,7 @@ """Used to send multiple TCs in sequence""" import enum import math +from datetime import timedelta from typing import Optional from tmtccmd.tc import TcQueueEntryBase, TcQueueEntryType, PacketCastWrapper @@ -21,7 +22,7 @@ class SenderMode(enum.IntEnum): class SeqResultWrapper: def __init__(self, mode: SenderMode): self.mode = mode - self.longest_rem_delay: float = 0.0 + self.longest_rem_delay: timedelta = timedelta() self.tc_sent: bool = False @@ -45,8 +46,6 @@ def __init__( self._mode = SenderMode.DONE self._wait_cd = Countdown(None) self._send_cd = Countdown(queue_wrapper.inter_cmd_delay) - if math.isclose(queue_wrapper.inter_cmd_delay, 0.0): - self._send_cd.time_out() self._current_res = SeqResultWrapper(self._mode) self._current_res.longest_rem_delay = queue_wrapper.inter_cmd_delay self._op_divider = 0 @@ -65,7 +64,7 @@ def queue_wrapper(self, queue_wrapper: QueueWrapper): self._mode = SenderMode.BUSY # There is no need to delay sending of the first entry, the send delay is inter-packet # only - self._send_cd.timeout = 0 + self._send_cd.timeout = timedelta() self._queue_wrapper = queue_wrapper def handle_new_queue_forced(self, queue_wrapper: QueueWrapper): @@ -106,8 +105,10 @@ def _handle_current_tc_queue(self): def __print_rem_timeout(self, op_divider: int, divisor: int = 15): if not self.__wait_cd_timed_out() and op_divider % divisor == 0: rem_time = self._wait_cd.rem_time() - if self._wait_cd.rem_time() > 0: - LOGGER.info(f"{rem_time:.01f} seconds wait time remaining") + if self._wait_cd.rem_time() > timedelta(): + LOGGER.info( + f"{rem_time.total_seconds():.01f} seconds wait time remaining" + ) def _check_next_telecommand(self): """Sends the next telecommand and returns whether an actual telecommand was sent""" @@ -125,9 +126,7 @@ def _check_next_telecommand(self): if call_send_cb: self._tc_handler.send_cb(next_queue_entry, self._com_if) if is_tc: - if not math.isclose( - self.queue_wrapper.inter_cmd_delay, self._send_cd.timeout - ): + if self.queue_wrapper.inter_cmd_delay != self._send_cd.timeout: self._send_cd.reset(self.queue_wrapper.inter_cmd_delay) else: self._send_cd.reset() @@ -159,15 +158,17 @@ def handle_non_tc_entry(self, queue_entry: TcQueueEntryBase) -> bool: cast_wrapper = PacketCastWrapper(queue_entry) if queue_entry.etype == TcQueueEntryType.WAIT: wait_entry = cast_wrapper.to_wait_entry() - LOGGER.info(f"Waiting for {wait_entry.wait_secs} seconds.") - self._wait_cd.reset(new_timeout=wait_entry.wait_secs) + LOGGER.info( + f"Waiting for {wait_entry.wait_time.total_seconds() * 1000} milliseconds." + ) + self._wait_cd.reset(new_timeout=wait_entry.wait_time) self._current_res.longest_rem_delay = max( self._wait_cd.rem_time(), self._send_cd.rem_time() ) elif queue_entry.etype == TcQueueEntryType.PACKET_DELAY: timeout_entry = cast_wrapper.to_packet_delay_entry() - self.queue_wrapper.inter_cmd_delay = timeout_entry.delay_secs - self._send_cd.reset(new_timeout=timeout_entry.delay_secs) + self.queue_wrapper.inter_cmd_delay = timeout_entry.delay_time + self._send_cd.reset(new_timeout=timeout_entry.delay_time) self._current_res.longest_rem_delay = max( self._wait_cd.rem_time(), self._send_cd.rem_time() ) diff --git a/tmtccmd/tc/queue.py b/tmtccmd/tc/queue.py index 0f627e09..9fb2d224 100644 --- a/tmtccmd/tc/queue.py +++ b/tmtccmd/tc/queue.py @@ -1,3 +1,4 @@ +from datetime import timedelta from typing import Optional from spacepackets.ccsds.spacepacket import SpacePacket @@ -19,7 +20,7 @@ def __init__( self, info: Optional[TcProcedureBase], queue: Optional[QueueDequeT], - inter_cmd_delay: float = 0.0, + inter_cmd_delay: timedelta = timedelta(milliseconds=0), ): self.info = info self.queue = queue @@ -51,8 +52,14 @@ def add_ccsds_tc(self, space_packet: SpacePacket): def add_raw_tc(self, tc: bytes): self.queue_wrapper.queue.append(RawTcEntry(tc)) - def add_wait(self, wait_secs: float): - self.queue_wrapper.queue.append(WaitEntry(wait_secs)) + def add_wait(self, wait_time: timedelta): + self.queue_wrapper.queue.append(WaitEntry(wait_time)) - def add_packet_delay(self, delay: float): + def add_wait_ms(self, wait_ms: int): + self.queue_wrapper.queue.append(WaitEntry.from_millis(wait_ms)) + + def add_packet_delay(self, delay: timedelta): self.queue_wrapper.queue.append(PacketDelayEntry(delay)) + + def add_packet_delay_ms(self, delay_ms: int): + self.queue_wrapper.queue.append(PacketDelayEntry.from_millis(delay_ms)) diff --git a/tmtccmd/utility/countdown.py b/tmtccmd/utility/countdown.py index 6e28aedf..38821b37 100644 --- a/tmtccmd/utility/countdown.py +++ b/tmtccmd/utility/countdown.py @@ -1,26 +1,37 @@ +from __future__ import annotations + import time from typing import Optional +from datetime import timedelta + + +def time_ms() -> int: + return round(time.time() * 1000) class Countdown: - def __init__(self, init_timeout_secs: Optional[float]): + def __init__(self, init_timeout_secs: Optional[timedelta]): if init_timeout_secs is not None: - self._timeout = init_timeout_secs - self._start_time = time.time() + self._timeout_ms = int(init_timeout_secs / timedelta(milliseconds=1)) + self._start_time_ms = time_ms() else: - self._timeout = 0 - self._start_time = 0 + self._timeout_ms = 0 + self._start_time_ms = 0 + + @classmethod + def from_millis(cls, timeout_ms: int) -> Countdown: + return cls(timedelta(milliseconds=timeout_ms)) @property def timeout(self): - return self._timeout + return self._timeout_ms @timeout.setter - def timeout(self, timeout: float): - self._timeout = timeout + def timeout(self, timeout: timedelta): + self._timeout_ms = round(timeout / timedelta(milliseconds=1)) def timed_out(self) -> bool: - if time.time() - self._start_time >= self._timeout: + if round(time_ms() - self._start_time_ms) >= self._timeout_ms: return True else: return False @@ -28,22 +39,20 @@ def timed_out(self) -> bool: def busy(self) -> bool: return not self.timed_out() - def reset(self, new_timeout: Optional[float] = None): + def reset(self, new_timeout: Optional[timedelta] = None): if new_timeout is not None: self.timeout = new_timeout - else: - self.timeout = self._timeout self.start() def start(self): - self._start_time = time.time() + self._start_time_ms = time_ms() def time_out(self): - self._start_time = 0 + self._start_time_ms = 0 - def rem_time(self) -> float: - end_time = self._start_time + self._timeout - current = time.time() + def rem_time(self) -> timedelta: + end_time = self._start_time_ms + self._timeout_ms + current = time_ms() if end_time < current: - return 0 - return end_time - current + return timedelta() + return timedelta(milliseconds=end_time - current) From 71af3d473dcc9277ef2cc9974894d96cfbce8f69 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 28 Jun 2022 17:19:16 +0200 Subject: [PATCH 160/221] added missing timedelta conversion --- tmtccmd/__init__.py | 5 ++++- tmtccmd/core/ccsds_backend.py | 5 +++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/tmtccmd/__init__.py b/tmtccmd/__init__.py index f9c9c948..cd6ec646 100644 --- a/tmtccmd/__init__.py +++ b/tmtccmd/__init__.py @@ -1,6 +1,7 @@ """Contains core methods called by entry point files to setup and start a tmtccmd application""" import sys import os +from datetime import timedelta from typing import Union, cast, Optional from tmtccmd.core.ccsds_backend import CcsdsTmtcBackend @@ -175,7 +176,9 @@ def create_default_tmtc_backend( tc_mode=mode_wrapper.tc_mode, tm_mode=mode_wrapper.tm_mode, ) - tmtc_backend.inter_cmd_delay = setup_wrapper.params.tc_params.delay + tmtc_backend.inter_cmd_delay = timedelta( + seconds=setup_wrapper.params.tc_params.delay + ) tmtc_backend.current_proc_info = DefaultProcedureInfo( setup_wrapper.params.def_proc_args.service, setup_wrapper.params.def_proc_args.op_code, diff --git a/tmtccmd/core/ccsds_backend.py b/tmtccmd/core/ccsds_backend.py index 873cc2df..ecb69596 100644 --- a/tmtccmd/core/ccsds_backend.py +++ b/tmtccmd/core/ccsds_backend.py @@ -2,6 +2,7 @@ import sys import threading from collections import deque +from datetime import timedelta from typing import Optional from tmtccmd.core import ( @@ -88,7 +89,7 @@ def inter_cmd_delay(self): return self._queue_wrapper.inter_cmd_delay @inter_cmd_delay.setter - def inter_cmd_delay(self, delay: float): + def inter_cmd_delay(self, delay: timedelta): self._queue_wrapper.inter_cmd_delay = delay @tc_mode.setter @@ -180,7 +181,7 @@ def mode_to_req(self): self._state.mode_wrapper.tc_mode = TcMode.IDLE self._state._req = BackendRequest.CALL_NEXT else: - if self._state.sender_res.longest_rem_delay > 0: + if self._state.sender_res.longest_rem_delay.total_seconds() * 1000 > 0: self._state._recommended_delay = ( self._state.sender_res.longest_rem_delay ) From f70905e5ac5e7afcd2dcb4fb199ea12fed466cde Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 28 Jun 2022 17:33:13 +0200 Subject: [PATCH 161/221] some more backend tests --- tests/{test_runner.py => test_backend.py} | 27 +++++++++++++++++++++-- tmtccmd/core/ccsds_backend.py | 4 ++-- 2 files changed, 27 insertions(+), 4 deletions(-) rename tests/{test_runner.py => test_backend.py} (50%) diff --git a/tests/test_runner.py b/tests/test_backend.py similarity index 50% rename from tests/test_runner.py rename to tests/test_backend.py index e8adf8ed..2b279af8 100644 --- a/tests/test_runner.py +++ b/tests/test_backend.py @@ -4,7 +4,8 @@ from tmtccmd import CcsdsTmtcBackend, CcsdsTmListener, TcHandlerBase from tmtccmd.com_if.dummy import DummyComIF -from tmtccmd.core import TcMode, TmMode, BackendRequest +from tmtccmd.core import TcMode, TmMode, BackendRequest, BackendController +from tmtccmd.tc.ccsds_seq_sender import SenderMode class TestCore(TestCase): @@ -19,6 +20,7 @@ def test_backend(self): tm_listener=tm_listener, tc_handler=tc_handler, ) + ctrl = BackendController() self.assertEqual(backend.tm_mode, TmMode.IDLE) self.assertEqual(backend.tc_mode, TcMode.IDLE) self.assertEqual(backend.com_if.get_id(), "dummy") @@ -31,4 +33,25 @@ def test_backend(self): self.assertEqual(state.request, BackendRequest.NONE) backend.mode_to_req() self.assertEqual(state.request, BackendRequest.DELAY_IDLE) - pass + self.assertEqual(backend.inter_cmd_delay, timedelta()) + self.assertFalse(backend.com_if_active()) + self.assertFalse(com_if.is_open()) + backend.start() + self.assertTrue(com_if.is_open()) + self.assertTrue(backend.com_if_active()) + + res = backend.periodic_op(ctrl) + self.assertEqual(res.request, BackendRequest.DELAY_IDLE) + backend.tm_mode = TmMode.LISTENER + self.assertEqual(backend.tm_mode, TmMode.LISTENER) + res = backend.periodic_op(ctrl) + tm_listener.operation.assert_called_once() + backend.poll_tm() + self.assertEqual(tm_listener.operation.call_count, 2) + self.assertEqual(res.request, BackendRequest.DELAY_LISTENER) + backend.tm_mode = TmMode.IDLE + backend.tc_mode = TcMode.ONE_QUEUE + # Our mock does not return a queue, so this operation is done immediately + res = backend.periodic_op(ctrl) + self.assertEqual(res.request, BackendRequest.TERMINATION_NO_ERROR) + self.assertEqual(res.sender_res.mode, SenderMode.DONE) diff --git a/tmtccmd/core/ccsds_backend.py b/tmtccmd/core/ccsds_backend.py index ecb69596..de9f1dd9 100644 --- a/tmtccmd/core/ccsds_backend.py +++ b/tmtccmd/core/ccsds_backend.py @@ -94,11 +94,11 @@ def inter_cmd_delay(self, delay: timedelta): @tc_mode.setter def tc_mode(self, tc_mode: TcMode): - self._state.mode_wrapper._tc_mode = tc_mode + self._state.mode_wrapper.tc_mode = tc_mode @tm_mode.setter def tm_mode(self, tm_mode: TmMode): - self._state.mode_wrapper._tm_mode = tm_mode + self._state.mode_wrapper.tm_mode = tm_mode @property def tm_listener(self): From 6ce241096fa4d631855c1594d701e49cee8b91d6 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 28 Jun 2022 17:58:31 +0200 Subject: [PATCH 162/221] better TC module structure --- tests/test_backend.py | 40 ++++++- tmtccmd/core/ccsds_backend.py | 1 - tmtccmd/tc/__init__.py | 220 ++++------------------------------ tmtccmd/tc/base.py | 0 tmtccmd/tc/procedure.py | 63 ++++++++++ tmtccmd/tc/queue.py | 144 ++++++++++++++++++++-- 6 files changed, 257 insertions(+), 211 deletions(-) create mode 100644 tmtccmd/tc/base.py create mode 100644 tmtccmd/tc/procedure.py diff --git a/tests/test_backend.py b/tests/test_backend.py index 2b279af8..a5f66c20 100644 --- a/tests/test_backend.py +++ b/tests/test_backend.py @@ -1,18 +1,54 @@ from datetime import timedelta +from typing import Optional from unittest import TestCase from unittest.mock import MagicMock +from spacepackets.ecss import PusTelecommand from tmtccmd import CcsdsTmtcBackend, CcsdsTmListener, TcHandlerBase +from tmtccmd.com_if import ComInterface from tmtccmd.com_if.dummy import DummyComIF from tmtccmd.core import TcMode, TmMode, BackendRequest, BackendController +from tmtccmd.tc import ( + TcProcedureBase, + DefaultProcedureInfo, + TcProcedureType, + ProcedureCastWrapper, + TcQueueEntryBase, +) from tmtccmd.tc.ccsds_seq_sender import SenderMode +from tmtccmd.tc.handler import FeedWrapper + + +class TcHandlerMock(TcHandlerBase): + def __init__(self): + super().__init__() + self.is_feed_cb_valid = False + self.feed_cb_call_count = 0 + + def send_cb(self, tc_queue_entry: TcQueueEntryBase, com_if: ComInterface): + pass + + def queue_finished_cb(self, info: TcProcedureBase): + pass + + def feed_cb(self, info: Optional[TcProcedureBase], wrapper: FeedWrapper): + self.feed_cb_call_count += 1 + cast_wrapper = ProcedureCastWrapper(info) + if info is not None: + if info.ptype != TcProcedureType.DEFAULT: + def_info = cast_wrapper.to_def_procedure() + if def_info.service != "17": + self.is_feed_cb_valid = False + elif def_info.op_code != "0": + self.is_feed_cb_valid = False + wrapper.queue_helper.add_pus_tc(PusTelecommand(service=17, subservice=1)) class TestCore(TestCase): def test_backend(self): com_if = DummyComIF() tm_listener = MagicMock(specs=CcsdsTmListener) - tc_handler = MagicMock(specs=TcHandlerBase) + tc_handler = TcHandlerMock() backend = CcsdsTmtcBackend( tc_mode=TcMode.IDLE, tm_mode=TmMode.IDLE, @@ -55,3 +91,5 @@ def test_backend(self): res = backend.periodic_op(ctrl) self.assertEqual(res.request, BackendRequest.TERMINATION_NO_ERROR) self.assertEqual(res.sender_res.mode, SenderMode.DONE) + backend.current_proc_info = DefaultProcedureInfo(service="17", op_code="0") + res = backend.periodic_op(ctrl) diff --git a/tmtccmd/core/ccsds_backend.py b/tmtccmd/core/ccsds_backend.py index de9f1dd9..936afd47 100644 --- a/tmtccmd/core/ccsds_backend.py +++ b/tmtccmd/core/ccsds_backend.py @@ -214,7 +214,6 @@ def __check_and_execute_queue(self): def __prepare_tc_queue(self, auto_dispatch: bool = True) -> Optional[QueueWrapper]: feed_wrapper = FeedWrapper(self._queue_wrapper, auto_dispatch) self.__tc_handler.feed_cb(self.current_proc_info, feed_wrapper) - self._queue_wrapper.info = self.current_proc_info if not self.__com_if.valid or not feed_wrapper.dispatch_next_queue: return None return feed_wrapper.queue_helper.queue_wrapper diff --git a/tmtccmd/tc/__init__.py b/tmtccmd/tc/__init__.py index c08d937b..53867a0a 100644 --- a/tmtccmd/tc/__init__.py +++ b/tmtccmd/tc/__init__.py @@ -1,198 +1,22 @@ -from __future__ import annotations - -import enum -from datetime import timedelta -from enum import Enum -from typing import Deque, cast, Type, Any -from spacepackets.ccsds.spacepacket import SpacePacket -from spacepackets.ecss.tc import PusTelecommand - - -class TcQueueEntryType(Enum): - PUS_TC = "pus-tc" - CCSDS_TC = "ccsds-tc" - RAW_TC = "raw-tc" - CUSTOM = "custom" - LOG = "log" - WAIT = "wait" - PACKET_DELAY = "set-delay" - - -class TcQueueEntryBase: - """Generic TC queue entry abstraction. This allows filling the TC queue with custom objects""" - - def __init__(self, etype: TcQueueEntryType): - self.etype = etype - - def is_tc(self) -> bool: - """Check whether concrete object is an actual telecommand""" - if ( - self.etype == TcQueueEntryType.PUS_TC - or self.etype == TcQueueEntryType.RAW_TC - or self.etype == TcQueueEntryType.CCSDS_TC - ): - return True - return False - - -QueueDequeT = Deque[TcQueueEntryBase] - - -class PusTcEntry(TcQueueEntryBase): - def __init__(self, pus_tc: PusTelecommand): - super().__init__(TcQueueEntryType.PUS_TC) - self.pus_tc = pus_tc - - def __repr__(self): - return f"{self.__class__.__name__}({self.pus_tc!r})" - - -class SpacePacketEntry(TcQueueEntryBase): - def __init__(self, space_packet: SpacePacket): - super().__init__(TcQueueEntryType.CCSDS_TC) - self.space_packet = space_packet - - def __repr__(self): - return f"{self.__class__.__name__}({self.space_packet!r})" - - -class LogQueueEntry(TcQueueEntryBase): - def __init__(self, log_str: str): - super().__init__(TcQueueEntryType.LOG) - self.log_str = log_str - - def __repr__(self): - return f"{self.__class__.__name__}({self.log_str!r})" - - -class RawTcEntry(TcQueueEntryBase): - def __init__(self, tc: bytes): - super().__init__(TcQueueEntryType.RAW_TC) - self.tc = tc - - def __repr__(self): - return f"{self.__class__.__name__}({self.tc!r})" - - -class WaitEntry(TcQueueEntryBase): - def __init__(self, wait_time: timedelta): - super().__init__(TcQueueEntryType.WAIT) - self.wait_time = wait_time - - @classmethod - def from_millis(cls, millis: int) -> WaitEntry: - return cls(timedelta(milliseconds=millis)) - - def __repr__(self): - return f"{self.__class__.__name__}({self.wait_time!r})" - - -class PacketDelayEntry(TcQueueEntryBase): - def __init__(self, delay_time: timedelta): - super().__init__(TcQueueEntryType.PACKET_DELAY) - self.delay_time = delay_time - - @classmethod - def from_millis(cls, millis: int) -> PacketDelayEntry: - return cls(timedelta(milliseconds=millis)) - - def __repr__(self): - return f"{self.__class__.__name__}({self.delay_time!r})" - - -class PacketCastWrapper: - def __init__(self, base: TcQueueEntryBase): - self.base = base - - def __cast_internally( - self, - obj_type: Type[TcQueueEntryBase], - obj: TcQueueEntryBase, - expected_type: TcQueueEntryType, - ) -> Any: - if obj.etype != expected_type: - raise TypeError(f"Invalid object {obj} for type {self.base.etype}") - return cast(obj_type, obj) - - def to_log_entry(self) -> LogQueueEntry: - return self.__cast_internally(LogQueueEntry, self.base, TcQueueEntryType.LOG) - - def to_pus_tc_entry(self) -> PusTcEntry: - return self.__cast_internally(PusTcEntry, self.base, TcQueueEntryType.PUS_TC) - - def to_raw_tc_entry(self) -> RawTcEntry: - return self.__cast_internally(RawTcEntry, self.base, TcQueueEntryType.RAW_TC) - - def to_wait_entry(self) -> WaitEntry: - return self.__cast_internally(WaitEntry, self.base, TcQueueEntryType.WAIT) - - def to_packet_delay_entry(self) -> PacketDelayEntry: - return self.__cast_internally( - PacketDelayEntry, self.base, TcQueueEntryType.PACKET_DELAY - ) - - def to_space_packet_entry(self) -> SpacePacketEntry: - return self.__cast_internally( - SpacePacketEntry, self.base, TcQueueEntryType.CCSDS_TC - ) - - -class TcProcedureType(enum.Enum): - DEFAULT = 0 - CFDP = 1 - CUSTOM = 2 - - -class TcProcedureBase: - def __init__(self, ptype: TcProcedureType): - self.ptype = ptype - - -class CustomProcedureInfo(TcProcedureBase): - def __init__(self, info: any): - super().__init__(TcProcedureType.CUSTOM) - self.info = info - - def __repr__(self): - return f"{self.__class__.__name__}(info={self.info!r}" - - -class DefaultProcedureInfo(TcProcedureBase): - """Generic abstraction for procedures. A procedure can be a single command or a sequence - of commands. Generally, one procedure is mapped to a specific TC queue which is packed - during run-time""" - - def __init__(self, service: str, op_code: str): - super().__init__(TcProcedureType.DEFAULT) - self.service = service - self.op_code = op_code - - def __repr__(self): - return f"CmdInfo(service={self.service!r}, op_code={self.op_code!r}" - - -class ProcedureCastWrapper: - """Cast wrapper to cast the procedure base type back to a concrete type easily""" - - def __init__(self, base: TcProcedureBase): - self.base = base - - def __cast_internally( - self, - obj_type: Type[TcProcedureBase], - obj: TcProcedureBase, - expected_type: TcProcedureType, - ) -> Any: - if obj.ptype != expected_type: - raise TypeError(f"Invalid object {obj} for type {self.base.ptype}") - return cast(obj_type, obj) - - def to_def_procedure(self) -> DefaultProcedureInfo: - return self.__cast_internally( - DefaultProcedureInfo, self.base, TcProcedureType.DEFAULT - ) - - def to_custom_procedure(self) -> CustomProcedureInfo: - return self.__cast_internally( - CustomProcedureInfo, self.base, TcProcedureType.CUSTOM - ) +from .queue import ( + QueueHelper, + QueueWrapper, + TcQueueEntryType, + TcQueueEntryBase, + PacketCastWrapper, + WaitEntry, + SpacePacketEntry, + PusTcEntry, + RawTcEntry, + PacketDelayEntry, + LogQueueEntry, +) +from .procedure import ( + TcProcedureBase, + TcProcedureType, + DefaultProcedureInfo, + CustomProcedureInfo, + ProcedureCastWrapper, +) + +from .handler import FeedWrapper, TcHandlerBase diff --git a/tmtccmd/tc/base.py b/tmtccmd/tc/base.py new file mode 100644 index 00000000..e69de29b diff --git a/tmtccmd/tc/procedure.py b/tmtccmd/tc/procedure.py new file mode 100644 index 00000000..a4ee1426 --- /dev/null +++ b/tmtccmd/tc/procedure.py @@ -0,0 +1,63 @@ +import enum +from typing import Any, cast, Type + + +class TcProcedureType(enum.Enum): + DEFAULT = 0 + CFDP = 1 + CUSTOM = 2 + + +class TcProcedureBase: + def __init__(self, ptype: TcProcedureType): + self.ptype = ptype + + +class CustomProcedureInfo(TcProcedureBase): + def __init__(self, info: any): + super().__init__(TcProcedureType.CUSTOM) + self.info = info + + def __repr__(self): + return f"{self.__class__.__name__}(info={self.info!r}" + + +class DefaultProcedureInfo(TcProcedureBase): + """Generic abstraction for procedures. A procedure can be a single command or a sequence + of commands. Generally, one procedure is mapped to a specific TC queue which is packed + during run-time""" + + def __init__(self, service: str, op_code: str): + super().__init__(TcProcedureType.DEFAULT) + self.service = service + self.op_code = op_code + + def __repr__(self): + return f"CmdInfo(service={self.service!r}, op_code={self.op_code!r}" + + +class ProcedureCastWrapper: + """Cast wrapper to cast the procedure base type back to a concrete type easily""" + + def __init__(self, base: TcProcedureBase): + self.base = base + + def __cast_internally( + self, + obj_type: Type[TcProcedureBase], + obj: TcProcedureBase, + expected_type: TcProcedureType, + ) -> Any: + if obj.ptype != expected_type: + raise TypeError(f"Invalid object {obj} for type {self.base.ptype}") + return cast(obj_type, obj) + + def to_def_procedure(self) -> DefaultProcedureInfo: + return self.__cast_internally( + DefaultProcedureInfo, self.base, TcProcedureType.DEFAULT + ) + + def to_custom_procedure(self) -> CustomProcedureInfo: + return self.__cast_internally( + CustomProcedureInfo, self.base, TcProcedureType.CUSTOM + ) diff --git a/tmtccmd/tc/queue.py b/tmtccmd/tc/queue.py index 9fb2d224..937c6215 100644 --- a/tmtccmd/tc/queue.py +++ b/tmtccmd/tc/queue.py @@ -1,18 +1,140 @@ +from __future__ import annotations from datetime import timedelta -from typing import Optional +from enum import Enum +from typing import Optional, Deque, cast, Any, Type from spacepackets.ccsds.spacepacket import SpacePacket from spacepackets.ecss import PusTelecommand -from tmtccmd.tc import ( - QueueDequeT, - LogQueueEntry, - PusTcEntry, - RawTcEntry, - WaitEntry, - SpacePacketEntry, - PacketDelayEntry, - TcProcedureBase, -) +from tmtccmd.tc.procedure import TcProcedureBase + + +class TcQueueEntryType(Enum): + PUS_TC = "pus-tc" + CCSDS_TC = "ccsds-tc" + RAW_TC = "raw-tc" + CUSTOM = "custom" + LOG = "log" + WAIT = "wait" + PACKET_DELAY = "set-delay" + + +class TcQueueEntryBase: + """Generic TC queue entry abstraction. This allows filling the TC queue with custom objects""" + + def __init__(self, etype: TcQueueEntryType): + self.etype = etype + + def is_tc(self) -> bool: + """Check whether concrete object is an actual telecommand""" + if ( + self.etype == TcQueueEntryType.PUS_TC + or self.etype == TcQueueEntryType.RAW_TC + or self.etype == TcQueueEntryType.CCSDS_TC + ): + return True + return False + + +QueueDequeT = Deque[TcQueueEntryBase] + + +class PusTcEntry(TcQueueEntryBase): + def __init__(self, pus_tc: PusTelecommand): + super().__init__(TcQueueEntryType.PUS_TC) + self.pus_tc = pus_tc + + def __repr__(self): + return f"{self.__class__.__name__}({self.pus_tc!r})" + + +class SpacePacketEntry(TcQueueEntryBase): + def __init__(self, space_packet: SpacePacket): + super().__init__(TcQueueEntryType.CCSDS_TC) + self.space_packet = space_packet + + def __repr__(self): + return f"{self.__class__.__name__}({self.space_packet!r})" + + +class LogQueueEntry(TcQueueEntryBase): + def __init__(self, log_str: str): + super().__init__(TcQueueEntryType.LOG) + self.log_str = log_str + + def __repr__(self): + return f"{self.__class__.__name__}({self.log_str!r})" + + +class RawTcEntry(TcQueueEntryBase): + def __init__(self, tc: bytes): + super().__init__(TcQueueEntryType.RAW_TC) + self.tc = tc + + def __repr__(self): + return f"{self.__class__.__name__}({self.tc!r})" + + +class WaitEntry(TcQueueEntryBase): + def __init__(self, wait_time: timedelta): + super().__init__(TcQueueEntryType.WAIT) + self.wait_time = wait_time + + @classmethod + def from_millis(cls, millis: int) -> WaitEntry: + return cls(timedelta(milliseconds=millis)) + + def __repr__(self): + return f"{self.__class__.__name__}({self.wait_time!r})" + + +class PacketDelayEntry(TcQueueEntryBase): + def __init__(self, delay_time: timedelta): + super().__init__(TcQueueEntryType.PACKET_DELAY) + self.delay_time = delay_time + + @classmethod + def from_millis(cls, millis: int) -> PacketDelayEntry: + return cls(timedelta(milliseconds=millis)) + + def __repr__(self): + return f"{self.__class__.__name__}({self.delay_time!r})" + + +class PacketCastWrapper: + def __init__(self, base: TcQueueEntryBase): + self.base = base + + def __cast_internally( + self, + obj_type: Type[TcQueueEntryBase], + obj: TcQueueEntryBase, + expected_type: TcQueueEntryType, + ) -> Any: + if obj.etype != expected_type: + raise TypeError(f"Invalid object {obj} for type {self.base.etype}") + return cast(obj_type, obj) + + def to_log_entry(self) -> LogQueueEntry: + return self.__cast_internally(LogQueueEntry, self.base, TcQueueEntryType.LOG) + + def to_pus_tc_entry(self) -> PusTcEntry: + return self.__cast_internally(PusTcEntry, self.base, TcQueueEntryType.PUS_TC) + + def to_raw_tc_entry(self) -> RawTcEntry: + return self.__cast_internally(RawTcEntry, self.base, TcQueueEntryType.RAW_TC) + + def to_wait_entry(self) -> WaitEntry: + return self.__cast_internally(WaitEntry, self.base, TcQueueEntryType.WAIT) + + def to_packet_delay_entry(self) -> PacketDelayEntry: + return self.__cast_internally( + PacketDelayEntry, self.base, TcQueueEntryType.PACKET_DELAY + ) + + def to_space_packet_entry(self) -> SpacePacketEntry: + return self.__cast_internally( + SpacePacketEntry, self.base, TcQueueEntryType.CCSDS_TC + ) class QueueWrapper: From 0d976dc215b90114862c0e06eb042bd29f61eada Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Wed, 29 Jun 2022 00:44:27 +0200 Subject: [PATCH 163/221] some bugfixes and optimizations --- tmtccmd/core/ccsds_backend.py | 7 +++---- tmtccmd/tc/procedure.py | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/tmtccmd/core/ccsds_backend.py b/tmtccmd/core/ccsds_backend.py index 936afd47..cde84666 100644 --- a/tmtccmd/core/ccsds_backend.py +++ b/tmtccmd/core/ccsds_backend.py @@ -49,7 +49,6 @@ def __init__( self.__com_if = com_if self.__tm_listener = tm_listener - self._current_procedure: Optional[TcProcedureBase] = None self.exit_on_com_if_init_failure = True self._queue_wrapper = QueueWrapper(None, deque()) self._seq_handler = SequentialCcsdsSender( @@ -116,11 +115,11 @@ def com_if_active(self): @property def current_proc_info(self) -> TcProcedureBase: - return self._current_procedure + return self._queue_wrapper.info @current_proc_info.setter def current_proc_info(self, proc_info: TcProcedureBase): - self._current_procedure = proc_info + self._queue_wrapper.info = proc_info def start(self): self.open_com_if() @@ -213,7 +212,7 @@ def __check_and_execute_queue(self): def __prepare_tc_queue(self, auto_dispatch: bool = True) -> Optional[QueueWrapper]: feed_wrapper = FeedWrapper(self._queue_wrapper, auto_dispatch) - self.__tc_handler.feed_cb(self.current_proc_info, feed_wrapper) + self.__tc_handler.feed_cb(self._queue_wrapper.info, feed_wrapper) if not self.__com_if.valid or not feed_wrapper.dispatch_next_queue: return None return feed_wrapper.queue_helper.queue_wrapper diff --git a/tmtccmd/tc/procedure.py b/tmtccmd/tc/procedure.py index a4ee1426..62cae81e 100644 --- a/tmtccmd/tc/procedure.py +++ b/tmtccmd/tc/procedure.py @@ -33,7 +33,7 @@ def __init__(self, service: str, op_code: str): self.op_code = op_code def __repr__(self): - return f"CmdInfo(service={self.service!r}, op_code={self.op_code!r}" + return f"CmdInfo(service={self.service!r}, op_code={self.op_code!r})" class ProcedureCastWrapper: From eb1234e336facb88bd3fea1baea57de0a4480de4 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Wed, 29 Jun 2022 01:10:47 +0200 Subject: [PATCH 164/221] backend docs --- tests/test_backend.py | 4 +- tmtccmd/core/__init__.py | 12 +++++ tmtccmd/core/ccsds_backend.py | 88 +++++++++++++++++++++++------------ tmtccmd/tc/base.py | 0 tmtccmd/tc/handler.py | 6 +-- 5 files changed, 76 insertions(+), 34 deletions(-) delete mode 100644 tmtccmd/tc/base.py diff --git a/tests/test_backend.py b/tests/test_backend.py index a5f66c20..eb78fcd8 100644 --- a/tests/test_backend.py +++ b/tests/test_backend.py @@ -44,7 +44,7 @@ def feed_cb(self, info: Optional[TcProcedureBase], wrapper: FeedWrapper): wrapper.queue_helper.add_pus_tc(PusTelecommand(service=17, subservice=1)) -class TestCore(TestCase): +class TestBackend(TestCase): def test_backend(self): com_if = DummyComIF() tm_listener = MagicMock(specs=CcsdsTmListener) @@ -91,5 +91,7 @@ def test_backend(self): res = backend.periodic_op(ctrl) self.assertEqual(res.request, BackendRequest.TERMINATION_NO_ERROR) self.assertEqual(res.sender_res.mode, SenderMode.DONE) + backend.tc_mode = TcMode.ONE_QUEUE backend.current_proc_info = DefaultProcedureInfo(service="17", op_code="0") res = backend.periodic_op(ctrl) + self.assertEqual(res.request, BackendRequest.TERMINATION_NO_ERROR) \ No newline at end of file diff --git a/tmtccmd/core/__init__.py b/tmtccmd/core/__init__.py index 2ba17e68..6284a45b 100644 --- a/tmtccmd/core/__init__.py +++ b/tmtccmd/core/__init__.py @@ -26,6 +26,18 @@ def __str__(self): class BackendRequest(enum.IntEnum): + """These requests can be treated like recommendations on what to do after calling the backend + handler functions and the :py:meth:`BackendState.mode_to_req` function. + + Brief explanation of fields + 1. NONE: No special recommendation + 2. TERMINATION_NO_ERROR: Will be returned for the One Queue mode after finishing queue handling. + 3. DELAY_IDLE: TC and TM mode are idle, so there is nothing to do + 4. DELAY_LISTENER: TC handling is not active but TM listening is active. Delay to + wait for new TM packets + 5. CALL_NEXT: It is recommended to call the handler functions immediately, for example to + handle the next entry in the TC queue + """ NONE = 0 TERMINATION_NO_ERROR = 1 DELAY_IDLE = 2 diff --git a/tmtccmd/core/ccsds_backend.py b/tmtccmd/core/ccsds_backend.py index cde84666..ded3c741 100644 --- a/tmtccmd/core/ccsds_backend.py +++ b/tmtccmd/core/ccsds_backend.py @@ -1,6 +1,5 @@ import atexit import sys -import threading from collections import deque from datetime import timedelta from typing import Optional @@ -28,6 +27,10 @@ LOGGER = get_console_logger() +class NoValidProcedureSet(Exception): + pass + + class CcsdsTmtcBackend(BackendBase): """This is the primary class which handles TMTC reception and sending""" @@ -39,24 +42,22 @@ def __init__( tm_listener: CcsdsTmListener, tc_handler: TcHandlerBase, ): - self._state = BackendState() self._state.mode_wrapper.tc_mode = tc_mode self._state.mode_wrapper.tm_mode = tm_mode - self.__com_if_active = False - self.__tc_handler = tc_handler + self._com_if_active = False + self._tc_handler = tc_handler - self.__com_if = com_if - self.__tm_listener = tm_listener + self._com_if = com_if + self._tm_listener = tm_listener self.exit_on_com_if_init_failure = True self._queue_wrapper = QueueWrapper(None, deque()) self._seq_handler = SequentialCcsdsSender( - com_if=self.__com_if, + com_if=self._com_if, tc_handler=tc_handler, queue_wrapper=self._queue_wrapper, ) - self._backend_lock: Optional[threading.Lock] = None def register_keyboard_interrupt_handler(self): """Register a keyboard interrupt handler which closes the COM interface and prints @@ -65,16 +66,20 @@ def register_keyboard_interrupt_handler(self): @property def com_if_id(self): - return self.__com_if.get_id() + return self._com_if.get_id() @property def com_if(self) -> ComInterface: - return self.__com_if + return self._com_if @property def state(self): return self._state + @property + def request(self): + return self._state.request + @property def tc_mode(self): return self._state.mode_wrapper.tc_mode @@ -101,17 +106,17 @@ def tm_mode(self, tm_mode: TmMode): @property def tm_listener(self): - return self.__tm_listener + return self._tm_listener def try_set_com_if(self, com_if: ComInterface) -> bool: if not self.com_if_active(): - self.__com_if = com_if + self._com_if = com_if return True else: return False def com_if_active(self): - return self.__com_if_active + return self._com_if_active @property def current_proc_info(self) -> TcProcedureBase: @@ -129,32 +134,28 @@ def __listener_io_error_handler(self, ctx: str): LOGGER.info("TM listener will not be started") if self.exit_on_com_if_init_failure: LOGGER.error("Closing TMTC commander..") - self.__com_if.close() + self._com_if.close() sys.exit(1) def open_com_if(self): try: - self.__com_if.open() + self._com_if.open() except IOError: self.__listener_io_error_handler("opened") - self.__com_if_active = True + self._com_if_active = True def close_com_if(self): - """Closes the TM listener and the communication interface. This is started in a separarate - thread because the communication interface might still be busy. The completion can be - checked with :meth:`tmtccmd.core.backend.is_com_if_active`. Alternatively, waiting on - completion is possible by specifying the join argument and a timeout in - floating point second. + """Closes the TM listener and the communication interface :return: """ try: - self.__com_if.close() + self._com_if.close() except IOError: self.__listener_io_error_handler("close") - self.__com_if_active = False + self._com_if_active = False - def periodic_op(self, ctrl: BackendController) -> BackendState: - """Periodic operation + def periodic_op(self) -> BackendState: + """Periodic operation. Simply calls the :py:meth:`default_operation` function. :raises KeyboardInterrupt: Yields info output and then propagates the exception :raises IOError: Yields informative output and propagates exception :""" @@ -162,12 +163,23 @@ def periodic_op(self, ctrl: BackendController) -> BackendState: return self._state def default_operation(self): - """Command handling.""" + """Command handling. This is a convenience function to call the TM and the TC operation + and then auto-determine the internal mode with the :py:meth:`mode_to_req` method. + + :raises NoValidProcedureSet: No valid procedure set to be passed to the feed callback of + the TC handler + """ self.tm_operation() self.tc_operation() self.mode_to_req() def mode_to_req(self): + """This function will convert the internal state of the backend to a backend + :py:attr:`request`, which can be used to determine the next operation. These requests can + be treated like recommendations. + For example, for if both the TC and the TM mode are IDLE, the request will be set to + :py:attr:`BackendRequest.DELAY_IDLE` field. + """ if self.tc_mode == TcMode.IDLE and self.tm_mode == TmMode.IDLE: self._state._req = BackendRequest.DELAY_IDLE elif self.tm_mode == TmMode.LISTENER and self.tc_mode == TcMode.IDLE: @@ -190,13 +202,27 @@ def mode_to_req(self): def poll_tm(self): """Poll TM, irrespective of current TM mode""" - self.__tm_listener.operation(self.__com_if) + self._tm_listener.operation(self._com_if) def tm_operation(self): + """This function will fetch and forward TM data from the current communication interface + to the user TM handler. It only does so if the :py:attr:`tm_mode` is set to the LISTENER + mode + """ if self._state.tm_mode == TmMode.LISTENER: - self.__tm_listener.operation(self.__com_if) + self._tm_listener.operation(self._com_if) def tc_operation(self): + """This function will handle consuming the current TC queue + if one is available, or attempting to fetch a new one if it is not. This function will only + do something if the :py:attr:`tc_mode` is set to a non IDLE value. + + It is necessary to set a valid procedure before calling this by using the + :py:attr:`current_proc_info` setter function. + + :raises NoValidProcedureSet: No valid procedure set to be passed to the feed callback of + the TC handler + """ if self._state.tc_mode != TcMode.IDLE: self.__check_and_execute_queue() @@ -212,7 +238,9 @@ def __check_and_execute_queue(self): def __prepare_tc_queue(self, auto_dispatch: bool = True) -> Optional[QueueWrapper]: feed_wrapper = FeedWrapper(self._queue_wrapper, auto_dispatch) - self.__tc_handler.feed_cb(self._queue_wrapper.info, feed_wrapper) - if not self.__com_if.valid or not feed_wrapper.dispatch_next_queue: + if self._queue_wrapper.info is None: + raise NoValidProcedureSet("No procedure was set to pass to the feed callback function") + self._tc_handler.feed_cb(self._queue_wrapper.info, feed_wrapper) + if not self._com_if.valid or not feed_wrapper.dispatch_next_queue: return None return feed_wrapper.queue_helper.queue_wrapper diff --git a/tmtccmd/tc/base.py b/tmtccmd/tc/base.py deleted file mode 100644 index e69de29b..00000000 diff --git a/tmtccmd/tc/handler.py b/tmtccmd/tc/handler.py index b1a8a503..30c3d031 100644 --- a/tmtccmd/tc/handler.py +++ b/tmtccmd/tc/handler.py @@ -33,14 +33,14 @@ def send_cb(self, tc_queue_entry: TcQueueEntryBase, com_if: ComInterface): In general, an implementation will perform the following steps: 1. Determine the concrete queue entry. The - :py:class:`tmtccmd.tc.definition.PacketCastWrapper` helper class can be used to do this + :py:class:`tmtccmd.tc.PacketCastWrapper` helper class can be used to do this 2. If applicable, retrieve the raw data to send from the queue entry and send it using the generic communication interface :param tc_queue_entry: Queue entry base type. The user can cast this back to the concrete type or just use duck typing if the concrete type is known :param com_if: Communication interface. Will generally be used to send the packet, - using the py:meth:`tmtccmd.com_if.CommunicationInterface.send` method + using the py:meth:`tmtccmd.com_if.ComInterface.send` method """ pass @@ -55,7 +55,7 @@ def feed_cb(self, info: TcProcedureBase, wrapper: FeedWrapper): parameter like the inter packet delay. :param info: Generic base class for a procedure. For example, the - py:class:`tmtccmd.tc.definitions.DefaultProcedureInfo` class uses a service string + py:class:`tmtccmd.tc.DefaultProcedureInfo` class uses a service string and op code string which can be used in the user code to select between different telecommand queues being packed :param wrapper: Wrapper type around the queue. It also contains a queue helper class From 8b9df5152d24f616b076869558f9ba28820a97a8 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Wed, 29 Jun 2022 01:19:13 +0200 Subject: [PATCH 165/221] some more tests --- tests/test_backend.py | 16 +++++++--------- tests/test_cfdp_filestore.py | 16 ---------------- tests/test_printer.py | 3 +-- tmtccmd/core/__init__.py | 4 +++- tmtccmd/core/ccsds_backend.py | 6 ++++-- tmtccmd/logging/pus.py | 1 + 6 files changed, 16 insertions(+), 30 deletions(-) diff --git a/tests/test_backend.py b/tests/test_backend.py index eb78fcd8..3d7da6c1 100644 --- a/tests/test_backend.py +++ b/tests/test_backend.py @@ -8,6 +8,7 @@ from tmtccmd.com_if import ComInterface from tmtccmd.com_if.dummy import DummyComIF from tmtccmd.core import TcMode, TmMode, BackendRequest, BackendController +from tmtccmd.core.ccsds_backend import NoValidProcedureSet from tmtccmd.tc import ( TcProcedureBase, DefaultProcedureInfo, @@ -76,22 +77,19 @@ def test_backend(self): self.assertTrue(com_if.is_open()) self.assertTrue(backend.com_if_active()) - res = backend.periodic_op(ctrl) + res = backend.periodic_op() self.assertEqual(res.request, BackendRequest.DELAY_IDLE) backend.tm_mode = TmMode.LISTENER self.assertEqual(backend.tm_mode, TmMode.LISTENER) - res = backend.periodic_op(ctrl) + res = backend.periodic_op() tm_listener.operation.assert_called_once() backend.poll_tm() self.assertEqual(tm_listener.operation.call_count, 2) self.assertEqual(res.request, BackendRequest.DELAY_LISTENER) backend.tm_mode = TmMode.IDLE backend.tc_mode = TcMode.ONE_QUEUE - # Our mock does not return a queue, so this operation is done immediately - res = backend.periodic_op(ctrl) - self.assertEqual(res.request, BackendRequest.TERMINATION_NO_ERROR) - self.assertEqual(res.sender_res.mode, SenderMode.DONE) - backend.tc_mode = TcMode.ONE_QUEUE + with self.assertRaises(NoValidProcedureSet): + backend.periodic_op() backend.current_proc_info = DefaultProcedureInfo(service="17", op_code="0") - res = backend.periodic_op(ctrl) - self.assertEqual(res.request, BackendRequest.TERMINATION_NO_ERROR) \ No newline at end of file + res = backend.periodic_op() + self.assertEqual(res.request, BackendRequest.TERMINATION_NO_ERROR) diff --git a/tests/test_cfdp_filestore.py b/tests/test_cfdp_filestore.py index 3567d734..8206ddaf 100644 --- a/tests/test_cfdp_filestore.py +++ b/tests/test_cfdp_filestore.py @@ -19,22 +19,6 @@ def setUp(self): def test_filestore(self): filestore = HostFilestore() - """ - if os.path.exists(TEST_FILE_NAME_0): - if os.path.isdir(TEST_DIR_NAME_0): - os.rmdir(TEST_FILE_NAME_0) - else: - os.remove(TEST_FILE_NAME_0) - if os.path.exists(TEST_FILE_NAME_1): - if os.path.isdir(TEST_DIR_NAME_1): - os.rmdir(TEST_FILE_NAME_1) - else: - os.remove(TEST_FILE_NAME_1) - if os.path.exists(TEST_DIR_NAME_0): - shutil.rmtree(TEST_DIR_NAME_0) - if os.path.exists(TEST_DIR_NAME_1): - shutil.rmtree(TEST_DIR_NAME_1) - """ res = filestore.create_file(self.test_file_name_0) self.assertTrue(res == FilestoreResult.CREATE_SUCCESS) diff --git a/tests/test_printer.py b/tests/test_printer.py index 6613114e..e3743f8e 100644 --- a/tests/test_printer.py +++ b/tests/test_printer.py @@ -11,14 +11,13 @@ from tmtccmd.tm.pus_1_verification import Service1TmExtended from tmtccmd.pus.pus_17_test import pack_service_17_ping_command from tmtccmd.logging import get_console_logger, LOG_DIR -from tmtccmd.config.globals import update_global, CoreGlobalIds from tmtccmd.logging.pus import ( RegularTmtcLogWrapper, RawTmtcRotatingLogWrapper, ) -# TODO: Use temp files to test loggers?gitas +# TODO: Use temp files to test loggers? class TestPrintersLoggers(TestCase): def setUp(self): self.log_path = Path(LOG_DIR) diff --git a/tmtccmd/core/__init__.py b/tmtccmd/core/__init__.py index 6284a45b..9e67f55b 100644 --- a/tmtccmd/core/__init__.py +++ b/tmtccmd/core/__init__.py @@ -1,6 +1,7 @@ from abc import abstractmethod import enum from datetime import timedelta +from typing import Optional from tmtccmd.tc.ccsds_seq_sender import SeqResultWrapper, SenderMode @@ -38,6 +39,7 @@ class BackendRequest(enum.IntEnum): 5. CALL_NEXT: It is recommended to call the handler functions immediately, for example to handle the next entry in the TC queue """ + NONE = 0 TERMINATION_NO_ERROR = 1 DELAY_IDLE = 2 @@ -99,5 +101,5 @@ def close_com_if(self): pass @abstractmethod - def periodic_op(self, ctrl: BackendController) -> BackendState: + def periodic_op(self, args: Optional[any]) -> BackendState: pass diff --git a/tmtccmd/core/ccsds_backend.py b/tmtccmd/core/ccsds_backend.py index ded3c741..88959e75 100644 --- a/tmtccmd/core/ccsds_backend.py +++ b/tmtccmd/core/ccsds_backend.py @@ -154,7 +154,7 @@ def close_com_if(self): self.__listener_io_error_handler("close") self._com_if_active = False - def periodic_op(self) -> BackendState: + def periodic_op(self, _args: Optional[any] = None) -> BackendState: """Periodic operation. Simply calls the :py:meth:`default_operation` function. :raises KeyboardInterrupt: Yields info output and then propagates the exception :raises IOError: Yields informative output and propagates exception @@ -239,7 +239,9 @@ def __check_and_execute_queue(self): def __prepare_tc_queue(self, auto_dispatch: bool = True) -> Optional[QueueWrapper]: feed_wrapper = FeedWrapper(self._queue_wrapper, auto_dispatch) if self._queue_wrapper.info is None: - raise NoValidProcedureSet("No procedure was set to pass to the feed callback function") + raise NoValidProcedureSet( + "No procedure was set to pass to the feed callback function" + ) self._tc_handler.feed_cb(self._queue_wrapper.info, feed_wrapper) if not self._com_if.valid or not feed_wrapper.dispatch_next_queue: return None diff --git a/tmtccmd/logging/pus.py b/tmtccmd/logging/pus.py index 1f144a9c..a4623038 100644 --- a/tmtccmd/logging/pus.py +++ b/tmtccmd/logging/pus.py @@ -174,3 +174,4 @@ def get_current_tmtc_file_name(cls) -> Path: def __del__(self): self.logger.removeHandler(self.file_handler) + self.file_handler.close() From 6b1086cbdba9506d48bf5902491c45b1bafb6569 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Wed, 29 Jun 2022 01:27:52 +0200 Subject: [PATCH 166/221] some more improvements --- tmtccmd/config/__init__.py | 32 +++++++++++++++++++------------- tmtccmd/config/args.py | 11 ++--------- 2 files changed, 21 insertions(+), 22 deletions(-) diff --git a/tmtccmd/config/__init__.py b/tmtccmd/config/__init__.py index 422c6183..af4ad024 100644 --- a/tmtccmd/config/__init__.py +++ b/tmtccmd/config/__init__.py @@ -58,13 +58,18 @@ class CoreComInterfaces(enum.Enum): # Mode options, set by args parser class CoreModeList(enum.IntEnum): - # This mode is optimized to handle one queue. It will configure the backend to request - # program termination upon finishing the queue handling. This is also the appropriate solution - # for single commands where the queue only consists of one telecommand. + """These are the core modes which will be translated to different TC and TM modes + for the CCSDS backend + + 1. ONE_QUEUE_MODE: This mode is optimized to handle one queue. It will configure the backend + to request program termination upon finishing the queue handling. This is also the + appropriate solution for single commands where the queue only consists of one telecommand. + 2. LISTENER_MODE: Only listen to TM + 3. MULTI_INTERACTIVE_QUEUE_MODE: + """ + # ONE_QUEUE_MODE = 0 LISTENER_MODE = 1 - # Interactive GUI mode which allows sending and handling procedures interactively - GUI_MODE = 2 # This mode is optimized for the handling of multiple queues. It will configure the backend # to request additional queues or a mode change from the user instead of requesting program # termination @@ -77,8 +82,7 @@ class CoreModeList(enum.IntEnum): CoreModeList.ONE_QUEUE_MODE: "one-q", CoreModeList.MULTI_INTERACTIVE_QUEUE_MODE: "multi-q", CoreModeList.LISTENER_MODE: "listener", - CoreModeList.IDLE: "idle", - CoreModeList.GUI_MODE: "gui", + CoreModeList.IDLE: "idle" } @@ -92,9 +96,6 @@ def backend_mode_conversion(mode: CoreModeList, mode_wrapper: ModeWrapper): elif mode == CoreModeStrings[CoreModeList.MULTI_INTERACTIVE_QUEUE_MODE]: mode_wrapper.tc_mode = TcMode.MULTI_QUEUE mode_wrapper.tm_mode = TmMode.LISTENER - elif mode == CoreModeStrings[CoreModeList.GUI_MODE]: - mode_wrapper.tc_mode = TcMode.MULTI_QUEUE - mode_wrapper.tm_mode = TmMode.IDLE class CoreServiceList(enum.Enum): @@ -332,9 +333,14 @@ def set_params_without_prompts(self, params: SetupParams): def set_params_with_prompts(self, params: SetupParams): if not self._parse_was_called: raise ValueError("Call the parse function first") - args_to_params( - pargs=self.args_raw, params=params, hook_obj=self.hook_obj, use_prompts=True - ) + try: + args_to_params( + pargs=self.args_raw, params=params, hook_obj=self.hook_obj, use_prompts=True + ) + except KeyboardInterrupt: + raise KeyboardInterrupt( + "Keyboard interrupt while converting CLI args to application parameters" + ) class SetupWrapper: diff --git a/tmtccmd/config/args.py b/tmtccmd/config/args.py index 1ff6d1a3..98795b27 100644 --- a/tmtccmd/config/args.py +++ b/tmtccmd/config/args.py @@ -1,6 +1,4 @@ -""" -Argument parser modules for the TMTC commander core -""" +"""Argument parser module""" import argparse import sys from typing import Optional, List @@ -224,12 +222,7 @@ def add_default_mode_arguments(arg_parser: argparse.ArgumentParser): f"{CoreModeStrings[CoreModeList.MULTI_INTERACTIVE_QUEUE_MODE]}: " f"Multi Queue and Interactive Command Mode\n" ) - gui_help = ( - f"{CoreModeList.GUI_MODE} or " - f"{CoreModeStrings[CoreModeList.GUI_MODE]}: " - f"GUI mode\n" - ) - help_text += one_q + listener_help + gui_help + multi_q + help_text += one_q + listener_help + multi_q arg_parser.add_argument( "-m", "--mode", From 14fa555e9fe9044cee8050caa6167e093599bd64 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Wed, 29 Jun 2022 01:28:09 +0200 Subject: [PATCH 167/221] black --- tmtccmd/config/__init__.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/tmtccmd/config/__init__.py b/tmtccmd/config/__init__.py index af4ad024..66d00849 100644 --- a/tmtccmd/config/__init__.py +++ b/tmtccmd/config/__init__.py @@ -67,6 +67,7 @@ class CoreModeList(enum.IntEnum): 2. LISTENER_MODE: Only listen to TM 3. MULTI_INTERACTIVE_QUEUE_MODE: """ + # ONE_QUEUE_MODE = 0 LISTENER_MODE = 1 @@ -82,7 +83,7 @@ class CoreModeList(enum.IntEnum): CoreModeList.ONE_QUEUE_MODE: "one-q", CoreModeList.MULTI_INTERACTIVE_QUEUE_MODE: "multi-q", CoreModeList.LISTENER_MODE: "listener", - CoreModeList.IDLE: "idle" + CoreModeList.IDLE: "idle", } @@ -335,7 +336,10 @@ def set_params_with_prompts(self, params: SetupParams): raise ValueError("Call the parse function first") try: args_to_params( - pargs=self.args_raw, params=params, hook_obj=self.hook_obj, use_prompts=True + pargs=self.args_raw, + params=params, + hook_obj=self.hook_obj, + use_prompts=True, ) except KeyboardInterrupt: raise KeyboardInterrupt( From 55c746c9b9c7b1829eaaed974308a827485ead76 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Wed, 29 Jun 2022 01:35:57 +0200 Subject: [PATCH 168/221] better printout --- tmtccmd/config/__init__.py | 11 ++++++++--- tmtccmd/config/args.py | 4 +--- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/tmtccmd/config/__init__.py b/tmtccmd/config/__init__.py index 66d00849..417bc4c3 100644 --- a/tmtccmd/config/__init__.py +++ b/tmtccmd/config/__init__.py @@ -248,9 +248,7 @@ def args_to_params( if pargs.service is None: if pargs.mode == CoreModeStrings[CoreModeList.ONE_QUEUE_MODE]: if use_prompts: - LOGGER.info( - "No service argument (-s) specified, prompting from user.." - ) + print("No service argument (-s) specified, prompting from user") # Try to get the service list from the hook base and prompt service from user params.def_proc_args.service = prompt_service(tmtc_defs) else: @@ -308,6 +306,13 @@ def parse(self): ) self._parse_was_called = True + @property + def use_gui(self): + """This only yields valid values if :py:meth:`parse` was called once""" + if not self._parse_was_called: + return False + return self.args_raw.gui + def set_params(self, params: SetupParams): """Set up the parameter object from the parsed arguments. This call auto-determines whether prompts should be used depending on whether the GUI flag was passed or not. diff --git a/tmtccmd/config/args.py b/tmtccmd/config/args.py index 98795b27..a62a5c17 100644 --- a/tmtccmd/config/args.py +++ b/tmtccmd/config/args.py @@ -121,9 +121,7 @@ def parse_default_tmtccmd_input_arguments( """ if len(sys.argv) == 1: - LOGGER.info( - "No input arguments specified. Run with -h to get list of arguments" - ) + print("No input arguments specified. Run with -h to get list of arguments") args, unknown = parser.parse_known_args() From 89487fd4f22de179e706491cce8f36d95b4eb7b2 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Wed, 29 Jun 2022 01:46:54 +0200 Subject: [PATCH 169/221] better structure --- tmtccmd/config/__init__.py | 322 ++----------------------------------- tmtccmd/config/args.py | 150 +++++++++++++++++ tmtccmd/config/defs.py | 82 ++++++++++ tmtccmd/config/hook.py | 76 +++++++++ 4 files changed, 325 insertions(+), 305 deletions(-) create mode 100644 tmtccmd/config/defs.py create mode 100644 tmtccmd/config/hook.py diff --git a/tmtccmd/config/__init__.py b/tmtccmd/config/__init__.py index 417bc4c3..0340ad95 100644 --- a/tmtccmd/config/__init__.py +++ b/tmtccmd/config/__init__.py @@ -1,90 +1,29 @@ """Definitions for the TMTC commander core """ -import argparse -import enum -from abc import abstractmethod -from typing import Tuple, Dict, Optional +from typing import Optional -from tmtccmd.logging import get_console_logger -from tmtccmd.com_if import ComInterface -from tmtccmd.config.args import ( +from tmtccmd.core import ModeWrapper, TmMode, TcMode + +from .args import ( SetupParams, create_default_args_parser, add_default_tmtccmd_args, parse_default_tmtccmd_input_arguments, DefProcedureParams, + ArgParserWrapper, ) -from tmtccmd.config.prompt import prompt_op_code, prompt_service -from tmtccmd.config.tmtc import TmTcDefWrapper -from tmtccmd.core import ModeWrapper, TmMode, TcMode, BackendBase -from tmtccmd.utility.obj_id import ObjectIdDictT -from tmtccmd.utility.retval import RetvalDictT - - -LOGGER = get_console_logger() - -# Com Interface Types -ComIfValueT = Tuple[str, any] -ComIfDictT = Dict[str, ComIfValueT] - - -def default_json_path() -> str: - return "tmtc_conf.json" - - -class CoreComInterfaces(enum.Enum): - DUMMY = "dummy" - SERIAL_DLE = "ser_dle" - UDP = "udp" - TCP = "tcp" - SERIAL_FIXED_FRAME = "ser_fixed" - SERIAL_QEMU = "ser_qemu" - UNSPECIFIED = "unspec" - - -CORE_COM_IF_DICT = { - CoreComInterfaces.DUMMY.value: ("Dummy Interface", None), - CoreComInterfaces.SERIAL_DLE.value: ("Serial Interace with DLE encoding", None), - CoreComInterfaces.UDP.value: ("TCP/IP with UDP datagrams", None), - CoreComInterfaces.TCP.value: ("TCP/IP with TCP", None), - CoreComInterfaces.SERIAL_FIXED_FRAME.value: ( - "Serial Interface with fixed size frames", - None, - ), - CoreComInterfaces.SERIAL_QEMU.value: ("Serial Interface using QEMU", None), - CoreComInterfaces.UNSPECIFIED.value: ("Unspecified", None), -} - - -# Mode options, set by args parser -class CoreModeList(enum.IntEnum): - """These are the core modes which will be translated to different TC and TM modes - for the CCSDS backend - - 1. ONE_QUEUE_MODE: This mode is optimized to handle one queue. It will configure the backend - to request program termination upon finishing the queue handling. This is also the - appropriate solution for single commands where the queue only consists of one telecommand. - 2. LISTENER_MODE: Only listen to TM - 3. MULTI_INTERACTIVE_QUEUE_MODE: - """ - - # - ONE_QUEUE_MODE = 0 - LISTENER_MODE = 1 - # This mode is optimized for the handling of multiple queues. It will configure the backend - # to request additional queues or a mode change from the user instead of requesting program - # termination - MULTI_INTERACTIVE_QUEUE_MODE = 3 - # The program will not do anything in this mode. This includes polling TM and sending any TCs - IDLE = 5 - - -CoreModeStrings = { - CoreModeList.ONE_QUEUE_MODE: "one-q", - CoreModeList.MULTI_INTERACTIVE_QUEUE_MODE: "multi-q", - CoreModeList.LISTENER_MODE: "listener", - CoreModeList.IDLE: "idle", -} +from .defs import ( + CoreModeList, + CoreModeStrings, + CoreComInterfaces, + CORE_COM_IF_DICT, + default_json_path, + CoreServiceList, + ComIfDictT, +) +from .prompt import prompt_op_code, prompt_service +from .tmtc import TmTcDefWrapper +from .hook import TmTcCfgHookBase def backend_mode_conversion(mode: CoreModeList, mode_wrapper: ModeWrapper): @@ -99,88 +38,6 @@ def backend_mode_conversion(mode: CoreModeList, mode_wrapper: ModeWrapper): mode_wrapper.tm_mode = TmMode.LISTENER -class CoreServiceList(enum.Enum): - SERVICE_2 = "2" - SERVICE_3 = "3" - SERVICE_5 = "5" - SERVICE_8 = "8" - SERVICE_9 = "9" - SERVICE_11 = "11" - SERVICE_17 = "17" - SERVICE_20 = "20" - SERVICE_23 = "23" - SERVICE_200 = "200" - - -DEFAULT_APID = 0xEF -DEBUG_MODE = False - - -class TmTcCfgHookBase: - """This hook allows users to adapt the TMTC commander core to the unique mission requirements. - It is used by implementing all abstract functions and then passing the instance to the - TMTC commander core. - """ - - def __init__(self, json_cfg_path: Optional[str] = None): - self.json_cfg_path = json_cfg_path - if self.json_cfg_path is None: - self.json_cfg_path = default_json_path() - - @abstractmethod - def get_object_ids(self) -> ObjectIdDictT: - from tmtccmd.config.objects import get_core_object_ids - - """The user can specify an object ID dictionary here mapping object ID bytearrays to a - list. This list could contain containing the string representation or additional - information about that object ID. - """ - return get_core_object_ids() - - @abstractmethod - def assign_communication_interface(self, com_if_key: str) -> Optional[ComInterface]: - """Assign the communication interface used by the TMTC commander to send and receive - TMTC with. - - :param com_if_key: String key of the communication interface to be created. - """ - from tmtccmd.config.com_if import create_communication_interface_default - - return create_communication_interface_default( - com_if_key=com_if_key, json_cfg_path=self.json_cfg_path - ) - - def get_com_if_dict(self) -> ComIfDictT: - return CORE_COM_IF_DICT - - @abstractmethod - def get_tmtc_definitions(self) -> TmTcDefWrapper: - """This is a dicitonary mapping services represented by strings to an operation code - dictionary. - - :return: - """ - from tmtccmd.config.globals import get_default_tmtc_defs - - return get_default_tmtc_defs() - - @abstractmethod - def perform_mode_operation(self, tmtc_backend: BackendBase, mode: int): - """Perform custom mode operations - :param tmtc_backend: - :param mode: - :return: - """ - pass - - def get_retval_dict(self) -> RetvalDictT: - from tmtccmd import get_console_logger - - logger = get_console_logger() - logger.info("No return value dictionary specified") - return dict() - - def get_global_hook_obj() -> Optional[TmTcCfgHookBase]: """This function can be used to get the handle to the global hook object. :return: @@ -207,151 +64,6 @@ def get_global_hook_obj() -> Optional[TmTcCfgHookBase]: return None -def args_to_params( - pargs: argparse.Namespace, - params: SetupParams, - hook_obj: TmTcCfgHookBase, - use_prompts: bool, -): - """If some arguments are unspecified, they are set here with (variable) default values. - - :param pargs: Parsed arguments from calling parse method - :param params: Setup parameter object which will be set by this function - :param hook_obj: - :param use_prompts: Specify whether terminal prompts are allowed to retrieve unspecified - arguments. For something like a GUI, it might make sense to disable this - :return: None - """ - from tmtccmd.com_if.utils import determine_com_if - - if pargs.gui is None: - params.app_params.use_gui = False - else: - params.app_params.use_gui = pargs.gui - if pargs.com_if is None or pargs.com_if == CoreComInterfaces.UNSPECIFIED.value: - if use_prompts: - params.com_if = determine_com_if( - hook_obj.get_com_if_dict(), hook_obj.json_cfg_path - ) - else: - # TODO: Check whether COM IF is valid? - params.com_if = pargs.com_if - if pargs.mode is None: - params.mode = CoreModeStrings[CoreModeList.ONE_QUEUE_MODE] - else: - params.mode = pargs.mode - tmtc_defs = hook_obj.get_tmtc_definitions() - params.def_proc_args = DefProcedureParams("0", "0") - if tmtc_defs is None: - LOGGER.warning("Invalid Service to Op-Code dictionary detected") - else: - if pargs.service is None: - if pargs.mode == CoreModeStrings[CoreModeList.ONE_QUEUE_MODE]: - if use_prompts: - print("No service argument (-s) specified, prompting from user") - # Try to get the service list from the hook base and prompt service from user - params.def_proc_args.service = prompt_service(tmtc_defs) - else: - params.def_proc_args.service = pargs.service - if pargs.op_code is None: - current_service = params.def_proc_args.service - if use_prompts: - params.def_proc_args.op_code = prompt_op_code( - tmtc_defs, current_service - ) - else: - params.def_proc_args.op_code = pargs.op_code - if pargs.delay is None: - if params.backend_params.mode == CoreModeStrings[CoreModeList.ONE_QUEUE_MODE]: - params.tc_params.delay = 3.0 - else: - params.tc_params.delay = 0.0 - else: - params.tc_params.delay = pargs.delay - if pargs.listener is None: - params.backend_params.listener = False - else: - params.backend_params.listener = pargs.listener - - -class ArgParserWrapper: - def __init__( - self, - hook_obj: TmTcCfgHookBase, - parser: Optional[argparse.ArgumentParser] = None, - descript_txt: Optional[str] = None, - ): - if parser is None: - self.args_parser = create_default_args_parser(descript_txt) - add_default_tmtccmd_args(self.args_parser) - else: - self.args_parser = parser - self.print_known_args = False - self.print_unknown_args = False - self.hook_obj = hook_obj - self.unknown_args = [""] - self.args_raw = None - self._parse_was_called = False - - def add_default_tmtccmd_args(self): - add_default_tmtccmd_args(self.args_parser) - - def parse(self): - """Parse all CLI arguments with the given argument parser""" - if not self._parse_was_called: - self.args_raw, self.unknown_args = parse_default_tmtccmd_input_arguments( - self.args_parser, - print_known_args=self.print_known_args, - print_unknown_args=self.print_unknown_args, - ) - self._parse_was_called = True - - @property - def use_gui(self): - """This only yields valid values if :py:meth:`parse` was called once""" - if not self._parse_was_called: - return False - return self.args_raw.gui - - def set_params(self, params: SetupParams): - """Set up the parameter object from the parsed arguments. This call auto-determines whether - prompts should be used depending on whether the GUI flag was passed or not. - - :raise Value Error: Parse function call missing - """ - if not self._parse_was_called: - raise ValueError("Call the parse function first") - if self.args_raw.gui: - self.set_params_without_prompts(params) - else: - self.set_params_with_prompts(params) - - def set_params_without_prompts(self, params: SetupParams): - if not self._parse_was_called: - raise ValueError("Call the parse function first") - args_to_params( - pargs=self.args_raw, - params=params, - hook_obj=self.hook_obj, - use_prompts=False, - ) - - def set_params_with_prompts(self, params: SetupParams): - if not self._parse_was_called: - raise ValueError("Call the parse function first") - try: - args_to_params( - pargs=self.args_raw, - params=params, - hook_obj=self.hook_obj, - use_prompts=True, - ) - except KeyboardInterrupt: - raise KeyboardInterrupt( - "Keyboard interrupt while converting CLI args to application parameters" - ) - - class SetupWrapper: """This class encapsulates various important setup parameters required by tmtccmd components""" diff --git a/tmtccmd/config/args.py b/tmtccmd/config/args.py index a62a5c17..57a29ff0 100644 --- a/tmtccmd/config/args.py +++ b/tmtccmd/config/args.py @@ -3,8 +3,13 @@ import sys from typing import Optional, List from dataclasses import dataclass + +from tmtccmd.config.prompt import prompt_op_code, prompt_service from tmtccmd.logging import get_console_logger +from .defs import CoreModeStrings, CoreModeList, CoreComInterfaces +from .hook import TmTcCfgHookBase + LOGGER = get_console_logger() @@ -266,3 +271,148 @@ def add_ethernet_arguments(arg_parser: argparse.ArgumentParser): arg_parser.add_argument( "--t-ip", help="Target IP. Default: Localhost 127.0.0.1", default="127.0.0.1" ) + + +def args_to_params( + pargs: argparse.Namespace, + params: SetupParams, + hook_obj: TmTcCfgHookBase, + use_prompts: bool, +): + """If some arguments are unspecified, they are set here with (variable) default values. + + :param pargs: Parsed arguments from calling parse method + :param params: Setup parameter object which will be set by this function + :param hook_obj: + :param use_prompts: Specify whether terminal prompts are allowed to retrieve unspecified + arguments. For something like a GUI, it might make sense to disable this + :return: None + """ + from tmtccmd.com_if.utils import determine_com_if + + if pargs.gui is None: + params.app_params.use_gui = False + else: + params.app_params.use_gui = pargs.gui + if pargs.com_if is None or pargs.com_if == CoreComInterfaces.UNSPECIFIED.value: + if use_prompts: + params.com_if = determine_com_if( + hook_obj.get_com_if_dict(), hook_obj.json_cfg_path + ) + else: + # TODO: Check whether COM IF is valid? + params.com_if = pargs.com_if + if pargs.mode is None: + params.mode = CoreModeStrings[CoreModeList.ONE_QUEUE_MODE] + else: + params.mode = pargs.mode + tmtc_defs = hook_obj.get_tmtc_definitions() + params.def_proc_args = DefProcedureParams("0", "0") + if tmtc_defs is None: + LOGGER.warning("Invalid Service to Op-Code dictionary detected") + else: + if pargs.service is None: + if pargs.mode == CoreModeStrings[CoreModeList.ONE_QUEUE_MODE]: + if use_prompts: + print("No service argument (-s) specified, prompting from user") + # Try to get the service list from the hook base and prompt service from user + params.def_proc_args.service = prompt_service(tmtc_defs) + else: + params.def_proc_args.service = pargs.service + if pargs.op_code is None: + current_service = params.def_proc_args.service + if use_prompts: + params.def_proc_args.op_code = prompt_op_code( + tmtc_defs, current_service + ) + else: + params.def_proc_args.op_code = pargs.op_code + if pargs.delay is None: + if params.backend_params.mode == CoreModeStrings[CoreModeList.ONE_QUEUE_MODE]: + params.tc_params.delay = 3.0 + else: + params.tc_params.delay = 0.0 + else: + params.tc_params.delay = pargs.delay + if pargs.listener is None: + params.backend_params.listener = False + else: + params.backend_params.listener = pargs.listener + + +class ArgParserWrapper: + def __init__( + self, + hook_obj: TmTcCfgHookBase, + parser: Optional[argparse.ArgumentParser] = None, + descript_txt: Optional[str] = None, + ): + if parser is None: + self.args_parser = create_default_args_parser(descript_txt) + add_default_tmtccmd_args(self.args_parser) + else: + self.args_parser = parser + self.print_known_args = False + self.print_unknown_args = False + self.hook_obj = hook_obj + self.unknown_args = [""] + self.args_raw = None + self._parse_was_called = False + + def add_default_tmtccmd_args(self): + add_default_tmtccmd_args(self.args_parser) + + def parse(self): + """Parse all CLI arguments with the given argument parser""" + if not self._parse_was_called: + self.args_raw, self.unknown_args = parse_default_tmtccmd_input_arguments( + self.args_parser, + print_known_args=self.print_known_args, + print_unknown_args=self.print_unknown_args, + ) + self._parse_was_called = True + + @property + def use_gui(self): + """This only yields valid values if :py:meth:`parse` was called once""" + if not self._parse_was_called: + return False + return self.args_raw.gui + + def set_params(self, params: SetupParams): + """Set up the parameter object from the parsed arguments. This call auto-determines whether + prompts should be used depending on whether the GUI flag was passed or not. + + :raise Value Error: Parse function call missing + """ + if not self._parse_was_called: + raise ValueError("Call the parse function first") + if self.args_raw.gui: + self.set_params_without_prompts(params) + else: + self.set_params_with_prompts(params) + + def set_params_without_prompts(self, params: SetupParams): + if not self._parse_was_called: + raise ValueError("Call the parse function first") + args_to_params( + pargs=self.args_raw, + params=params, + hook_obj=self.hook_obj, + use_prompts=False, + ) + + def set_params_with_prompts(self, params: SetupParams): + if not self._parse_was_called: + raise ValueError("Call the parse function first") + try: + args_to_params( + pargs=self.args_raw, + params=params, + hook_obj=self.hook_obj, + use_prompts=True, + ) + except KeyboardInterrupt: + raise KeyboardInterrupt( + "Keyboard interrupt while converting CLI args to application parameters" + ) diff --git a/tmtccmd/config/defs.py b/tmtccmd/config/defs.py new file mode 100644 index 00000000..2f52996a --- /dev/null +++ b/tmtccmd/config/defs.py @@ -0,0 +1,82 @@ +import enum +from typing import Tuple, Dict + +# Com Interface Types +ComIfValueT = Tuple[str, any] +ComIfDictT = Dict[str, ComIfValueT] + + +def default_json_path() -> str: + return "tmtc_conf.json" + + +class CoreComInterfaces(enum.Enum): + DUMMY = "dummy" + SERIAL_DLE = "ser_dle" + UDP = "udp" + TCP = "tcp" + SERIAL_FIXED_FRAME = "ser_fixed" + SERIAL_QEMU = "ser_qemu" + UNSPECIFIED = "unspec" + + +CORE_COM_IF_DICT = { + CoreComInterfaces.DUMMY.value: ("Dummy Interface", None), + CoreComInterfaces.SERIAL_DLE.value: ("Serial Interace with DLE encoding", None), + CoreComInterfaces.UDP.value: ("TCP/IP with UDP datagrams", None), + CoreComInterfaces.TCP.value: ("TCP/IP with TCP", None), + CoreComInterfaces.SERIAL_FIXED_FRAME.value: ( + "Serial Interface with fixed size frames", + None, + ), + CoreComInterfaces.SERIAL_QEMU.value: ("Serial Interface using QEMU", None), + CoreComInterfaces.UNSPECIFIED.value: ("Unspecified", None), +} + + +# Mode options, set by args parser +class CoreModeList(enum.IntEnum): + """These are the core modes which will be translated to different TC and TM modes + for the CCSDS backend + + 1. ONE_QUEUE_MODE: This mode is optimized to handle one queue. It will configure the backend + to request program termination upon finishing the queue handling. This is also the + appropriate solution for single commands where the queue only consists of one telecommand. + 2. LISTENER_MODE: Only listen to TM + 3. MULTI_INTERACTIVE_QUEUE_MODE: + """ + + # + ONE_QUEUE_MODE = 0 + LISTENER_MODE = 1 + # This mode is optimized for the handling of multiple queues. It will configure the backend + # to request additional queues or a mode change from the user instead of requesting program + # termination + MULTI_INTERACTIVE_QUEUE_MODE = 3 + # The program will not do anything in this mode. This includes polling TM and sending any TCs + IDLE = 5 + + +CoreModeStrings = { + CoreModeList.ONE_QUEUE_MODE: "one-q", + CoreModeList.MULTI_INTERACTIVE_QUEUE_MODE: "multi-q", + CoreModeList.LISTENER_MODE: "listener", + CoreModeList.IDLE: "idle", +} + + +class CoreServiceList(enum.Enum): + SERVICE_2 = "2" + SERVICE_3 = "3" + SERVICE_5 = "5" + SERVICE_8 = "8" + SERVICE_9 = "9" + SERVICE_11 = "11" + SERVICE_17 = "17" + SERVICE_20 = "20" + SERVICE_23 = "23" + SERVICE_200 = "200" + + +DEFAULT_APID = 0xEF +DEBUG_MODE = False diff --git a/tmtccmd/config/hook.py b/tmtccmd/config/hook.py new file mode 100644 index 00000000..55595529 --- /dev/null +++ b/tmtccmd/config/hook.py @@ -0,0 +1,76 @@ +from typing import Optional +from abc import abstractmethod + +from tmtccmd.utility.obj_id import ObjectIdDictT +from tmtccmd.com_if import ComInterface + +from tmtccmd.core import BackendBase +from tmtccmd.utility.retval import RetvalDictT + +from .tmtc import TmTcDefWrapper +from .defs import default_json_path, CORE_COM_IF_DICT, ComIfDictT + + +class TmTcCfgHookBase: + """This hook allows users to adapt the TMTC commander core to the unique mission requirements. + It is used by implementing all abstract functions and then passing the instance to the + TMTC commander core. + """ + + def __init__(self, json_cfg_path: Optional[str] = None): + self.json_cfg_path = json_cfg_path + if self.json_cfg_path is None: + self.json_cfg_path = default_json_path() + + @abstractmethod + def get_object_ids(self) -> ObjectIdDictT: + from tmtccmd.config.objects import get_core_object_ids + + """The user can specify an object ID dictionary here mapping object ID bytearrays to a + list. This list could contain containing the string representation or additional + information about that object ID. + """ + return get_core_object_ids() + + @abstractmethod + def assign_communication_interface(self, com_if_key: str) -> Optional[ComInterface]: + """Assign the communication interface used by the TMTC commander to send and receive + TMTC with. + + :param com_if_key: String key of the communication interface to be created. + """ + from tmtccmd.config.com_if import create_communication_interface_default + + return create_communication_interface_default( + com_if_key=com_if_key, json_cfg_path=self.json_cfg_path + ) + + def get_com_if_dict(self) -> ComIfDictT: + return CORE_COM_IF_DICT + + @abstractmethod + def get_tmtc_definitions(self) -> TmTcDefWrapper: + """This is a dicitonary mapping services represented by strings to an operation code + dictionary. + + :return: + """ + from tmtccmd.config.globals import get_default_tmtc_defs + + return get_default_tmtc_defs() + + @abstractmethod + def perform_mode_operation(self, tmtc_backend: BackendBase, mode: int): + """Perform custom mode operations + :param tmtc_backend: + :param mode: + :return: + """ + pass + + def get_retval_dict(self) -> RetvalDictT: + from tmtccmd import get_console_logger + + logger = get_console_logger() + logger.info("No return value dictionary specified") + return dict() From 647e90ba5ffc8380119c5a7a89f06a5e9eb912d5 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Wed, 29 Jun 2022 04:21:35 +0200 Subject: [PATCH 170/221] first pus verificator impl --- tests/test_pus_verificator.py | 14 ++++ tmtccmd/pus/pus_verificator.py | 130 +++++++++++++++++++++++++++++++++ 2 files changed, 144 insertions(+) create mode 100644 tests/test_pus_verificator.py create mode 100644 tmtccmd/pus/pus_verificator.py diff --git a/tests/test_pus_verificator.py b/tests/test_pus_verificator.py new file mode 100644 index 00000000..8c2e83e5 --- /dev/null +++ b/tests/test_pus_verificator.py @@ -0,0 +1,14 @@ +from unittest import TestCase + +from tmtccmd.utility.conf_util import AnsiColors + + +class TestPusVerificator(TestCase): + def test_basic(self): + # pus_verificator = PusVerificator() + # pus_verificator.add_tc() + # pus_verificator.add_tm() + # verif_dict = wpus_verificator.verif_dict + print( + f"{AnsiColors.GREEN}\u2714{AnsiColors.GREEN}\u27140{AnsiColors.GREEN}\u2714" + ) diff --git a/tmtccmd/pus/pus_verificator.py b/tmtccmd/pus/pus_verificator.py new file mode 100644 index 00000000..3a584de6 --- /dev/null +++ b/tmtccmd/pus/pus_verificator.py @@ -0,0 +1,130 @@ +import enum +from dataclasses import dataclass +from typing import Dict, Optional + +from spacepackets.ecss import PusTelecommand +from spacepackets.ecss.pus_1_verification import RequestId, Service1Tm, Subservices + + +class StatusField(enum.IntEnum): + UNSET = -1 + FAILURE = 0 + SUCCESS = 1 + + +@dataclass +class VerificationStatus: + all_verifs_recvd: bool + accepted: StatusField + started: StatusField + step: int + completed: StatusField + + +VerifDictT = Dict[RequestId, VerificationStatus] + + +@dataclass +class TmCheckResult: + """Result type for a TM check. + + Special note on the completed flag: This flag indicates that + any of the steps have failed or there was a completion success. This does not mean that + all related verification packets have been received for the respective telecommand. If all + packets were received, the :py:attr:`VerificationStatus.all_verifs_recvd` field will bet + set to True + """ + + req_id_in_dict: bool + status: Optional[VerificationStatus] + completed: bool + + +class PusVerificator: + def __init__(self): + self._verif_dict: VerifDictT = dict() + pass + + def add_tc(self, tc: PusTelecommand) -> bool: + req_id = RequestId.from_raw(tc.sp_header) + if req_id in self._verif_dict: + return False + self._verif_dict.update( + { + req_id: VerificationStatus( + all_verifs_recvd=False, + accepted=StatusField.UNSET, + started=StatusField.UNSET, + step=0, + completed=StatusField.UNSET, + ) + } + ) + return True + + def add_tm(self, pus_1_tm: Service1Tm) -> TmCheckResult: + req_id = pus_1_tm.tc_req_id + res = TmCheckResult(False, None, False) + if req_id not in self._verif_dict: + return res + res.req_id_in_dict = True + verif_status = self._verif_dict.get(req_id) + if pus_1_tm.subservice <= 0 or pus_1_tm.subservice > 8: + raise ValueError( + f"PUS 1 TM with invalid subservice {pus_1_tm.subservice} was passed" + ) + res.status = verif_status + if pus_1_tm.subservice % 2 == 0: + # For failures, verification handling is completed + res.completed = True + if pus_1_tm.subservice == Subservices.TM_ACCEPTANCE_SUCCESS: + verif_status.accepted = StatusField.SUCCESS + elif pus_1_tm.subservice == Subservices.TM_ACCEPTANCE_FAILURE: + verif_status.all_verifs_recvd = True + verif_status.accepted = StatusField.FAILURE + res.completed = True + elif pus_1_tm.subservice == Subservices.TM_START_SUCCESS: + verif_status.started = StatusField.SUCCESS + elif pus_1_tm.subservice == Subservices.TM_START_FAILURE: + res.completed = True + if verif_status.accepted != StatusField.UNSET: + verif_status.all_verifs_recvd = True + verif_status.started = StatusField.FAILURE + elif pus_1_tm.subservice == Subservices.TM_STEP_SUCCESS: + verif_status.step = pus_1_tm.step_number + elif pus_1_tm.subservice == Subservices.TM_STEP_FAILURE: + self._check_all_replies_recvd_after_step(verif_status) + verif_status.step = -1 + res.completed = True + elif pus_1_tm.subservice == Subservices.TM_COMPLETION_SUCCESS: + self._check_all_replies_recvd_after_step(verif_status) + verif_status.completed = StatusField.SUCCESS + res.completed = True + elif pus_1_tm.subservice == Subservices.TM_COMPLETION_FAILURE: + self._check_all_replies_recvd_after_step(verif_status) + verif_status.completed = StatusField.FAILURE + res.completed = True + return res + + @property + def verif_dict(self): + return self._verif_dict + + @staticmethod + def _check_all_replies_recvd_after_step(verif_stat: VerificationStatus): + if ( + verif_stat.accepted != StatusField.UNSET + and verif_stat.started != StatusField.UNSET + ): + verif_stat.all_verifs_recvd = True + + def remove_completed_entries(self): + self._verif_dict = { + key: val for key, val in self._verif_dict.items() if val.all_verifs_recvd + } + + def remove_entry(self, req_id: RequestId) -> bool: + if req_id in self._verif_dict: + del self._verif_dict[req_id] + return True + return False From 21074cdf2117aeda96b2b1e6d51c98345db3892e Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Wed, 29 Jun 2022 16:06:06 +0200 Subject: [PATCH 171/221] moved some modules to spacepackets --- tests/test_printer.py | 15 +++--- tests/test_pus_verificator.py | 11 +++-- tmtccmd/com_if/dummy.py | 28 ++++++----- tmtccmd/pus/pus_20_params.py | 66 -------------------------- tmtccmd/pus/pus_verificator.py | 4 +- tmtccmd/tc/pus_20_params.py | 19 ++++---- tmtccmd/tm/pus_1_verification.py | 70 ++++++++++++++++------------ tmtccmd/tm/pus_200_fsfw_modes.py | 2 +- tmtccmd/tm/pus_20_fsfw_parameters.py | 33 ++++++------- tmtccmd/tm/pus_23_filemgmt.py | 2 +- tmtccmd/tm/pus_2_rawcmd.py | 2 +- tmtccmd/tm/pus_3_fsfw_hk.py | 2 +- tmtccmd/tm/pus_5_event.py | 2 +- tmtccmd/tm/pus_8_funccmd.py | 2 +- 14 files changed, 105 insertions(+), 153 deletions(-) diff --git a/tests/test_printer.py b/tests/test_printer.py index e3743f8e..09fa7388 100644 --- a/tests/test_printer.py +++ b/tests/test_printer.py @@ -1,12 +1,13 @@ import os -import shutil -import time from pathlib import Path -from tempfile import TemporaryFile from unittest import TestCase from spacepackets.ccsds.time import CdsShortTimestamp -from spacepackets.ecss.pus_1_verification import RequestId +from spacepackets.ecss.pus_1_verification import ( + RequestId, + VerificationParams, + Subservices, +) from tmtccmd.tm.pus_1_verification import Service1TmExtended from tmtccmd.pus.pus_17_test import pack_service_17_ping_command @@ -34,9 +35,11 @@ def test_pus_loggers(self): pus_tc = pack_service_17_ping_command(ssc=0) raw_tmtc_log.log_tc(pus_tc) pus_tm = Service1TmExtended( - subservice=1, + subservice=Subservices.TM_START_SUCCESS, time=CdsShortTimestamp.init_from_current_time(), - tc_request_id=RequestId(pus_tc.packet_id, pus_tc.packet_seq_ctrl), + verif_params=VerificationParams( + req_id=RequestId(pus_tc.packet_id, pus_tc.packet_seq_ctrl) + ), ) raw_tmtc_log.log_tm(pus_tm.pus_tm) self.assertTrue(Path(self.regular_file_name).exists()) diff --git a/tests/test_pus_verificator.py b/tests/test_pus_verificator.py index 8c2e83e5..21249f61 100644 --- a/tests/test_pus_verificator.py +++ b/tests/test_pus_verificator.py @@ -1,14 +1,19 @@ from unittest import TestCase +from spacepackets.ecss import PusTelecommand +from spacepackets.ecss.pus_1_verification import Service1Tm +from tmtccmd.pus.pus_verificator import PusVerificator from tmtccmd.utility.conf_util import AnsiColors class TestPusVerificator(TestCase): def test_basic(self): - # pus_verificator = PusVerificator() - # pus_verificator.add_tc() + pus_verificator = PusVerificator() + ping_tc = PusTelecommand(service=17, subservice=1) + pus_verificator.add_tc(ping_tc) + # ping_tm = Service1Tm() # pus_verificator.add_tm() - # verif_dict = wpus_verificator.verif_dict + verif_dict = pus_verificator.verif_dict print( f"{AnsiColors.GREEN}\u2714{AnsiColors.GREEN}\u27140{AnsiColors.GREEN}\u2714" ) diff --git a/tmtccmd/com_if/dummy.py b/tmtccmd/com_if/dummy.py index 8701d93e..e8c2e94b 100644 --- a/tmtccmd/com_if/dummy.py +++ b/tmtccmd/com_if/dummy.py @@ -3,14 +3,16 @@ """ from typing import Optional -from spacepackets.ecss.pus_1_verification import RequestId +from spacepackets.ecss.pus_1_verification import RequestId, VerificationParams from spacepackets.ecss.tc import PusTelecommand from tmtccmd.com_if import ComInterface from tmtccmd.config import CoreComInterfaces from tmtccmd.tm import TelemetryListT from tmtccmd.tm.pus_1_verification import Service1TmExtended -from tmtccmd.tm.pus_17_test import Subservices, Service17TmExtended +from tmtccmd.tm.pus_1_verification import Subservices as Pus1Subservices +from tmtccmd.tm.pus_17_test import Service17TmExtended +from tmtccmd.tm.pus_17_test import Subservices as Pus17Subservices from tmtccmd.logging import get_console_logger @@ -34,10 +36,12 @@ def generate_reply_package(self): if self.last_tc.service == 17: if self.last_tc.subservice == 1: tm_packer = Service1TmExtended( - subservice=1, - ssc=self.current_ssc, - tc_request_id=RequestId( - self.last_tc.packet_id, self.last_tc.packet_seq_ctrl + subservice=Pus1Subservices.TM_ACCEPTANCE_SUCCESS, + seq_count=self.current_ssc, + verif_params=VerificationParams( + req_id=RequestId( + self.last_tc.packet_id, self.last_tc.packet_seq_ctrl + ) ), ) @@ -45,17 +49,19 @@ def generate_reply_package(self): tm_packet_raw = tm_packer.pack() self.next_telemetry_package.append(tm_packet_raw) tm_packer = Service1TmExtended( - subservice=7, - ssc=self.current_ssc, - tc_request_id=RequestId( - self.last_tc.packet_id, self.last_tc.packet_seq_ctrl + subservice=Pus1Subservices.TM_START_SUCCESS, + seq_count=self.current_ssc, + verif_params=VerificationParams( + req_id=RequestId( + self.last_tc.packet_id, self.last_tc.packet_seq_ctrl + ) ), ) tm_packet_raw = tm_packer.pack() self.next_telemetry_package.append(tm_packet_raw) self.current_ssc += 1 - tm_packer = Service17TmExtended(subservice=Subservices.TM_REPLY) + tm_packer = Service17TmExtended(subservice=Pus17Subservices.TM_REPLY) tm_packet_raw = tm_packer.pack() self.next_telemetry_package.append(tm_packet_raw) self.current_ssc += 1 diff --git a/tmtccmd/pus/pus_20_params.py b/tmtccmd/pus/pus_20_params.py index 647fd7a9..399be1c9 100644 --- a/tmtccmd/pus/pus_20_params.py +++ b/tmtccmd/pus/pus_20_params.py @@ -1,72 +1,6 @@ import enum -class EcssPtc(enum.IntEnum): - BOOLEAN = 1 - ENUMERATED = 2 - UNSIGNED = 3 - SIGNED = 4 - # Float or double values - REAL = 5 - BIT_STRING = 6 - OCTET_STRING = 7 - CHARACTER_STRING = 8 - ABSOLUTE_TIME = 9 - RELATIVE_TIME = 10 - DEDUCED = 11 - PACKET = 12 - - -class EcssPfcUnsigned(enum.IntEnum): - FOUR_BIT = 0 - FIVE_BIT = 1 - SIX_BIT = 2 - SEVEN_BIT = 3 - ONE_BYTE = 4 - NINE_BIT = 5 - TEN_BIT = 6 - ELEVEN_BIT = 7 - TWELVE_BIT = 8 - THIRTEEN_BIT = 9 - FOURTEEN_BIT = 10 - FIFTEEN_BIT = 11 - TWO_BYTES = 12 - THREE_BYTES = 13 - FOUR_BYTES = 14 - SIX_BYTES = 15 - EIGHT_BYTES = 16 - ONE_BIT = 17 - TWO_BIT = 18 - THREE_BIT = 19 - - -class EcssPfcSigned(enum.IntEnum): - FOUR_BIT = 0 - FIVE_BIT = 1 - SIX_BIT = 2 - SEVEN_BIT = 3 - ONE_BYTE = 4 - NINE_BIT = 5 - TEN_BIT = 6 - ELEVEN_BIT = 7 - TWELVE_BIT = 8 - THIRTEEN_BIT = 9 - FOURTEEN_BIT = 10 - FIFTEEN_BIT = 11 - TWO_BYTES = 12 - THREE_BYTES = 13 - FOUR_BYTES = 14 - SIX_BYTES = 15 - EIGHT_BYTES = 16 - - -class EcssPfcReal(enum.IntEnum): - FLOAT_SIMPLE_PRECISION_IEEE = 1 - DOUBLE_PRECISION_IEEE = 2 - FLOAT_PRECISION_MIL_STD_4_OCTETS = 3 - DOUBLE_PRECISION_MIL_STD_6_OCTETS = 4 - - class CustomSubservices(enum.IntEnum): LOAD = 128 DUMP = 129 diff --git a/tmtccmd/pus/pus_verificator.py b/tmtccmd/pus/pus_verificator.py index 3a584de6..941045c6 100644 --- a/tmtccmd/pus/pus_verificator.py +++ b/tmtccmd/pus/pus_verificator.py @@ -46,7 +46,7 @@ def __init__(self): pass def add_tc(self, tc: PusTelecommand) -> bool: - req_id = RequestId.from_raw(tc.sp_header) + req_id = RequestId.from_sp_header(tc.sp_header) if req_id in self._verif_dict: return False self._verif_dict.update( @@ -91,7 +91,7 @@ def add_tm(self, pus_1_tm: Service1Tm) -> TmCheckResult: verif_status.all_verifs_recvd = True verif_status.started = StatusField.FAILURE elif pus_1_tm.subservice == Subservices.TM_STEP_SUCCESS: - verif_status.step = pus_1_tm.step_number + verif_status.step = pus_1_tm.step_id elif pus_1_tm.subservice == Subservices.TM_STEP_FAILURE: self._check_all_replies_recvd_after_step(verif_status) verif_status.step = -1 diff --git a/tmtccmd/tc/pus_20_params.py b/tmtccmd/tc/pus_20_params.py index f5cf640f..d2dc8697 100644 --- a/tmtccmd/tc/pus_20_params.py +++ b/tmtccmd/tc/pus_20_params.py @@ -2,10 +2,9 @@ """ import struct from typing import Optional + +from spacepackets.ecss.field import Ptc, PfcUnsigned, PfcReal from tmtccmd.pus.pus_20_params import ( - EcssPtc, - EcssPfcUnsigned, - EcssPfcReal, CustomSubservices, ) from spacepackets.ecss.tc import PusTelecommand @@ -41,8 +40,8 @@ def pack_boolean_parameter_app_data( object_id=object_id, domain_id=domain_id, unique_id=unique_id, - ptc=EcssPtc.UNSIGNED, - pfc=EcssPfcUnsigned.ONE_BYTE, + ptc=Ptc.UNSIGNED, + pfc=PfcUnsigned.ONE_BYTE, rows=1, columns=1, ) @@ -58,8 +57,8 @@ def pack_scalar_double_param_app_data( object_id=object_id, domain_id=domain_id, unique_id=unique_id, - ptc=EcssPtc.REAL, - pfc=EcssPfcReal.DOUBLE_PRECISION_IEEE, + ptc=Ptc.REAL, + pfc=PfcReal.DOUBLE_PRECISION_IEEE, rows=1, columns=1, ) @@ -75,8 +74,8 @@ def pack_scalar_float_param_app_data( object_id=object_id, domain_id=domain_id, unique_id=unique_id, - ptc=EcssPtc.REAL, - pfc=EcssPfcReal.FLOAT_SIMPLE_PRECISION_IEEE, + ptc=Ptc.REAL, + pfc=PfcReal.FLOAT_SIMPLE_PRECISION_IEEE, rows=1, columns=1, ) @@ -89,7 +88,7 @@ def prepare_param_packet_header( object_id: bytes, domain_id: int, unique_id: int, - ptc: EcssPtc, + ptc: Ptc, pfc: int, rows: int, columns: int, diff --git a/tmtccmd/tm/pus_1_verification.py b/tmtccmd/tm/pus_1_verification.py index 3663184c..c6891992 100644 --- a/tmtccmd/tm/pus_1_verification.py +++ b/tmtccmd/tm/pus_1_verification.py @@ -2,12 +2,16 @@ import struct from abc import abstractmethod -from typing import Deque +from typing import Deque, Optional -from spacepackets.ccsds.spacepacket import PacketSeqCtrl from spacepackets.ccsds.time import CdsShortTimestamp from spacepackets.ecss.tm import PusVersion, PusTelemetry -from spacepackets.ecss.pus_1_verification import Service1Tm, Subservices, RequestId +from spacepackets.ecss.pus_1_verification import ( + Service1Tm, + Subservices, + VerificationParams, + UnpackParams, +) from tmtccmd.tm.base import PusTmInfoBase, PusTmBase from tmtccmd.logging import get_console_logger @@ -20,10 +24,10 @@ class Service1TmExtended(PusTmBase, PusTmInfoBase, Service1Tm): def __init__( self, - subservice: int, - tc_request_id: RequestId, + subservice: Subservices, + verif_params: Optional[VerificationParams] = None, time: CdsShortTimestamp = None, - ssc: int = 0, + seq_count: int = 0, apid: int = -1, packet_version: int = 0b000, pus_version: PusVersion = PusVersion.GLOBAL_CONFIG, @@ -33,10 +37,10 @@ def __init__( ): Service1Tm.__init__( self, - tc_request_id=tc_request_id, + verif_params=verif_params, subservice=subservice, time=time, - ssc=ssc, + seq_count=seq_count, apid=apid, packet_version=packet_version, pus_version=pus_version, @@ -46,29 +50,33 @@ def __init__( ) PusTmBase.__init__(self, pus_tm=self.pus_tm) PusTmInfoBase.__init__(self, pus_tm=self.pus_tm) + self._error_param_1 = 0 + self._error_param_2 = 0 @classmethod def __empty(cls) -> Service1TmExtended: - return cls(subservice=0, tc_request_id=RequestId.empty()) + return cls(subservice=Subservices.INVALID) @classmethod - def unpack( - cls, - raw_telemetry: bytes, - pus_version: PusVersion = PusVersion.GLOBAL_CONFIG, - ) -> Service1TmExtended: + def unpack(cls, data: bytes, params: UnpackParams) -> Service1TmExtended: """Parse a service 1 telemetry packet - :param raw_telemetry: - :param pus_version: + :param params: + :param data: :raises ValueError: Raw telemetry too short :return: """ service_1_tm = cls.__empty() - service_1_tm.pus_tm = PusTelemetry.unpack( - raw_telemetry=raw_telemetry, pus_version=pus_version - ) - cls._unpack_raw_tm(service_1_tm) + service_1_tm.pus_tm = PusTelemetry.unpack(raw_telemetry=data) + cls._unpack_raw_tm(service_1_tm, params) + # FSFW specific + if service_1_tm.has_failure_notice: + service_1_tm._error_param_1 = struct.unpack( + "!I", service_1_tm.failure_notice.data[0:4] + ) + service_1_tm._error_param_1 = struct.unpack( + "!I", service_1_tm.failure_notice.data[4:8] + ) return service_1_tm @abstractmethod @@ -76,25 +84,25 @@ def append_telemetry_content(self, content_list: list): super().append_telemetry_content(content_list=content_list) content_list.append(self.tc_req_id.tc_packet_id) content_list.append(self.tc_req_id.tc_psc) - if self.has_tc_error_code: + if self.has_failure_notice: if self.is_step_reply: - content_list.append(str(self.step_number)) - content_list.append(str(hex(self.error_code))) + content_list.append(str(self.step_id)) + content_list.append(str(hex(self.error_code.val))) content_list.append( - f"hex {self.error_param_1:04x} dec {self.error_param_1}" + f"hex {self.failure_notice:04x} dec {self.failure_notice}" ) content_list.append( - f"hex {self.error_param_2:04x} dec {self.error_param_2}" + f"hex {self.failure_notice.data[0:4]:04x} dec {self._error_param_2}" ) elif self.is_step_reply: - content_list.append(str(self.step_number)) + content_list.append(str(self.step_id)) @abstractmethod def append_telemetry_column_headers(self, header_list: list): super().append_telemetry_column_headers(header_list=header_list) header_list.append("TC Packet ID") header_list.append("TC PSC") - if self.has_tc_error_code: + if self.has_failure_notice: if self.is_step_reply: header_list.append("Step Number") header_list.append("Return Value") @@ -103,9 +111,9 @@ def append_telemetry_column_headers(self, header_list: list): elif self.is_step_reply: header_list.append("Step Number") - def _handle_failure_verification(self): + def _unpack_failure_verification(self, params: UnpackParams): """Handle parsing a verification failure packet, subservice ID 2, 4, 6 or 8""" - super()._handle_failure_verification() + super()._unpack_failure_verification(params) self.set_packet_info("Failure Verficiation") subservice = self.pus_tm.subservice if subservice == Subservices.TM_ACCEPTANCE_FAILURE: @@ -117,8 +125,8 @@ def _handle_failure_verification(self): elif subservice == Subservices.TM_COMPLETION_FAILURE: self.append_packet_info(" : Completion Failure") - def _handle_success_verification(self): - super()._handle_success_verification() + def _unpack_success_verification(self, params: UnpackParams): + super()._unpack_success_verification(params) self.set_packet_info("Success Verification") if self.subservice == Subservices.TM_ACCEPTANCE_SUCCESS: self.append_packet_info(" : Acceptance success") diff --git a/tmtccmd/tm/pus_200_fsfw_modes.py b/tmtccmd/tm/pus_200_fsfw_modes.py index f80b8953..545ff672 100644 --- a/tmtccmd/tm/pus_200_fsfw_modes.py +++ b/tmtccmd/tm/pus_200_fsfw_modes.py @@ -39,7 +39,7 @@ def __init__( service=CustomPusServices.SERVICE_200_MODE, subservice=subservice_id, time=time, - ssc=ssc, + seq_count=ssc, source_data=source_data, apid=apid, packet_version=packet_version, diff --git a/tmtccmd/tm/pus_20_fsfw_parameters.py b/tmtccmd/tm/pus_20_fsfw_parameters.py index e9faa227..2ac251f9 100644 --- a/tmtccmd/tm/pus_20_fsfw_parameters.py +++ b/tmtccmd/tm/pus_20_fsfw_parameters.py @@ -3,15 +3,12 @@ import struct from typing import Optional +from spacepackets.ecss.field import Ptc, PfcUnsigned, PfcSigned, PfcReal from spacepackets.ecss.tm import CdsShortTimestamp, PusVersion, PusTelemetry from spacepackets.ecss.definitions import PusServices from tmtccmd.utility.obj_id import ObjectId from tmtccmd.pus.pus_20_params import ( - EcssPtc, - EcssPfcUnsigned, - EcssPfcReal, - EcssPfcSigned, CustomSubservices, ) from tmtccmd.tm.base import PusTmInfoBase, PusTmBase @@ -60,7 +57,7 @@ def __init__( service=PusServices.S20_PARAMETER, subservice=subservice_id, time=time, - ssc=ssc, + seq_count=ssc, source_data=source_data, apid=apid, packet_version=packet_version, @@ -193,23 +190,23 @@ def deserialize_scalar_entry(ptc: int, pfc: int, tm_data: bytes) -> Optional[any len_error_str = "Invalid parameter data size, smaller than " if param_len == 0: return None - if ptc == EcssPtc.UNSIGNED: - if pfc == EcssPfcUnsigned.ONE_BYTE: + if ptc == Ptc.UNSIGNED: + if pfc == PfcUnsigned.ONE_BYTE: if param_len < 1: LOGGER.warning(f"{len_error_str} 1") raise None return tm_data[12] - elif pfc == EcssPfcUnsigned.TWO_BYTES: + elif pfc == PfcUnsigned.TWO_BYTES: if param_len < 2: LOGGER.warning(f"{len_error_str} 2") return None return struct.unpack("!H", tm_data[12:14])[0] - if pfc == EcssPfcUnsigned.FOUR_BYTES: + if pfc == PfcUnsigned.FOUR_BYTES: if param_len < 4: LOGGER.warning(f"{len_error_str} 4") return None return struct.unpack("!I", tm_data[12:16])[0] - elif pfc == EcssPfcUnsigned.EIGHT_BYTES: + elif pfc == PfcUnsigned.EIGHT_BYTES: if param_len < 8: LOGGER.warning(f"{len_error_str} 8") return None @@ -219,23 +216,23 @@ def deserialize_scalar_entry(ptc: int, pfc: int, tm_data: bytes) -> Optional[any f"Parsing of unsigned PTC {ptc} not implemented for PFC {pfc}" ) return None - elif ptc == EcssPtc.SIGNED: - if pfc == EcssPfcSigned.ONE_BYTE: + elif ptc == Ptc.SIGNED: + if pfc == PfcSigned.ONE_BYTE: if param_len < 1: LOGGER.warning(f"{len_error_str} 1") return None return struct.unpack("!b", tm_data[12:13])[0] - elif pfc == EcssPfcSigned.TWO_BYTES: + elif pfc == PfcSigned.TWO_BYTES: if param_len < 2: LOGGER.warning(f"{len_error_str} 2") return None return struct.unpack("!h", tm_data[12:14])[0] - elif pfc == EcssPfcSigned.FOUR_BYTES: + elif pfc == PfcSigned.FOUR_BYTES: if param_len < 4: LOGGER.warning(f"{len_error_str} 4") return None return struct.unpack("!i", tm_data[12:16])[0] - elif pfc == EcssPfcSigned.EIGHT_BYTES: + elif pfc == PfcSigned.EIGHT_BYTES: if param_len < 8: LOGGER.warning(f"{len_error_str} 8") return None @@ -243,13 +240,13 @@ def deserialize_scalar_entry(ptc: int, pfc: int, tm_data: bytes) -> Optional[any else: LOGGER.warning(f"Parsing of signed PTC {ptc} not implemented for PFC {pfc}") return None - if ptc == EcssPtc.REAL: - if pfc == EcssPfcReal.FLOAT_SIMPLE_PRECISION_IEEE: + if ptc == Ptc.REAL: + if pfc == PfcReal.FLOAT_SIMPLE_PRECISION_IEEE: if param_len < 4: LOGGER.warning(f"{len_error_str} 4") return None return struct.unpack("!f", tm_data[12:16])[0] - elif pfc == EcssPfcReal.DOUBLE_PRECISION_IEEE: + elif pfc == PfcReal.DOUBLE_PRECISION_IEEE: if param_len < 8: LOGGER.warning(f"{len_error_str} 8") return None diff --git a/tmtccmd/tm/pus_23_filemgmt.py b/tmtccmd/tm/pus_23_filemgmt.py index 38fc9a39..c9a7e32c 100644 --- a/tmtccmd/tm/pus_23_filemgmt.py +++ b/tmtccmd/tm/pus_23_filemgmt.py @@ -53,7 +53,7 @@ def __init__( service=PusServices.SERVICE_23_FILE_MGMT, subservice=subservice_id, time=time, - ssc=ssc, + seq_count=ssc, source_data=source_data, apid=apid, packet_version=packet_version, diff --git a/tmtccmd/tm/pus_2_rawcmd.py b/tmtccmd/tm/pus_2_rawcmd.py index 212668c8..9f02d540 100644 --- a/tmtccmd/tm/pus_2_rawcmd.py +++ b/tmtccmd/tm/pus_2_rawcmd.py @@ -24,7 +24,7 @@ def __init__( service=2, subservice=subservice, time=time, - ssc=ssc, + seq_count=ssc, source_data=source_data, apid=apid, packet_version=packet_version, diff --git a/tmtccmd/tm/pus_3_fsfw_hk.py b/tmtccmd/tm/pus_3_fsfw_hk.py index dcd24497..fc83657b 100644 --- a/tmtccmd/tm/pus_3_fsfw_hk.py +++ b/tmtccmd/tm/pus_3_fsfw_hk.py @@ -64,7 +64,7 @@ def __init__( service=3, subservice=subservice_id, time=time, - ssc=ssc, + seq_count=ssc, source_data=source_data, apid=apid, packet_version=packet_version, diff --git a/tmtccmd/tm/pus_5_event.py b/tmtccmd/tm/pus_5_event.py index c68b2be0..50f899a4 100644 --- a/tmtccmd/tm/pus_5_event.py +++ b/tmtccmd/tm/pus_5_event.py @@ -56,7 +56,7 @@ def __init__( service=PusServices.S5_EVENT, subservice=subservice, time=time, - ssc=ssc, + seq_count=ssc, source_data=source_data, apid=apid, packet_version=packet_version, diff --git a/tmtccmd/tm/pus_8_funccmd.py b/tmtccmd/tm/pus_8_funccmd.py index 4a5175c5..3955d79a 100644 --- a/tmtccmd/tm/pus_8_funccmd.py +++ b/tmtccmd/tm/pus_8_funccmd.py @@ -47,7 +47,7 @@ def __init__( service=5, subservice=subservice_id, time=time, - ssc=ssc, + seq_count=ssc, source_data=source_data, apid=apid, packet_version=packet_version, From ab5a3169009e8e6eab6a1df5a7d1edd1bacf4fa8 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Wed, 29 Jun 2022 16:35:27 +0200 Subject: [PATCH 172/221] FSFW specific fix --- tmtccmd/tm/pus_1_verification.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tmtccmd/tm/pus_1_verification.py b/tmtccmd/tm/pus_1_verification.py index c6891992..b6a47fae 100644 --- a/tmtccmd/tm/pus_1_verification.py +++ b/tmtccmd/tm/pus_1_verification.py @@ -72,10 +72,10 @@ def unpack(cls, data: bytes, params: UnpackParams) -> Service1TmExtended: # FSFW specific if service_1_tm.has_failure_notice: service_1_tm._error_param_1 = struct.unpack( - "!I", service_1_tm.failure_notice.data[0:4] + "!I", service_1_tm.failure_notice.data[1:5] ) service_1_tm._error_param_1 = struct.unpack( - "!I", service_1_tm.failure_notice.data[4:8] + "!I", service_1_tm.failure_notice.data[6:10] ) return service_1_tm From 30e08d492f26fdf52f16087b52aa7f97ed45bbba Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Wed, 29 Jun 2022 16:36:33 +0200 Subject: [PATCH 173/221] this was correct after all --- tmtccmd/tm/pus_1_verification.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tmtccmd/tm/pus_1_verification.py b/tmtccmd/tm/pus_1_verification.py index b6a47fae..c6891992 100644 --- a/tmtccmd/tm/pus_1_verification.py +++ b/tmtccmd/tm/pus_1_verification.py @@ -72,10 +72,10 @@ def unpack(cls, data: bytes, params: UnpackParams) -> Service1TmExtended: # FSFW specific if service_1_tm.has_failure_notice: service_1_tm._error_param_1 = struct.unpack( - "!I", service_1_tm.failure_notice.data[1:5] + "!I", service_1_tm.failure_notice.data[0:4] ) service_1_tm._error_param_1 = struct.unpack( - "!I", service_1_tm.failure_notice.data[6:10] + "!I", service_1_tm.failure_notice.data[4:8] ) return service_1_tm From 45b7fb5777b002de76dbecdee47a1ccf3b2b83cd Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Wed, 29 Jun 2022 16:40:08 +0200 Subject: [PATCH 174/221] update unpack function --- tmtccmd/tm/pus_17_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tmtccmd/tm/pus_17_test.py b/tmtccmd/tm/pus_17_test.py index 802f602d..9dd97164 100644 --- a/tmtccmd/tm/pus_17_test.py +++ b/tmtccmd/tm/pus_17_test.py @@ -54,7 +54,7 @@ def unpack( ) -> Service17TmExtended: service_17_tm = cls.__empty() service_17_tm.pus_tm = PusTelemetry.unpack( - raw_telemetry=raw_telemetry, pus_version=pus_version + raw_telemetry=raw_telemetry ) service_17_tm.__set_internal_fields() return service_17_tm From 15ea6e572bdd4b89f6b93c9ec70a8ce8149e2b8f Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Wed, 29 Jun 2022 17:08:13 +0200 Subject: [PATCH 175/221] run black --- tmtccmd/tm/pus_17_test.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/tmtccmd/tm/pus_17_test.py b/tmtccmd/tm/pus_17_test.py index 9dd97164..0d25c441 100644 --- a/tmtccmd/tm/pus_17_test.py +++ b/tmtccmd/tm/pus_17_test.py @@ -53,8 +53,6 @@ def unpack( pus_version: PusVersion = PusVersion.GLOBAL_CONFIG, ) -> Service17TmExtended: service_17_tm = cls.__empty() - service_17_tm.pus_tm = PusTelemetry.unpack( - raw_telemetry=raw_telemetry - ) + service_17_tm.pus_tm = PusTelemetry.unpack(raw_telemetry=raw_telemetry) service_17_tm.__set_internal_fields() return service_17_tm From 7593598f005cc769713c27834a45fca7a685bbd9 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Wed, 29 Jun 2022 20:05:54 +0200 Subject: [PATCH 176/221] fix tests for bumped spacepackets dependency --- tests/test_pus.py | 3 --- tests/test_pus_verificator.py | 9 ++++++--- tmtccmd/config/globals.py | 7 ------- tmtccmd/tm/pus_1_verification.py | 7 ++++--- 4 files changed, 10 insertions(+), 16 deletions(-) diff --git a/tests/test_pus.py b/tests/test_pus.py index 074c0cd6..9986cf59 100755 --- a/tests/test_pus.py +++ b/tests/test_pus.py @@ -1,9 +1,7 @@ #!/usr/bin/env python3 from unittest import TestCase -from spacepackets.ccsds.spacepacket import get_sp_psc_raw from spacepackets.ccsds.time import CdsShortTimestamp -from spacepackets.ecss.conf import get_pus_tm_version, PusVersion, set_default_tm_apid from spacepackets.util import PrintFormats from tmtccmd.tm.pus_17_test import Service17TmExtended @@ -28,7 +26,6 @@ def tm_func(raw_telemetry: bytearray): self.assertRaises(ValueError, tm_func, None) pus_17_telemetry = Service17TmExtended.unpack(raw_telemetry=pus_17_raw) - self.assertTrue(get_pus_tm_version() == PusVersion.PUS_C) self.assertTrue(pus_17_telemetry.service == 17) self.assertTrue(pus_17_telemetry.apid == 0xEF) self.assertTrue(pus_17_telemetry.subservice == 1) diff --git a/tests/test_pus_verificator.py b/tests/test_pus_verificator.py index 21249f61..f67b4f84 100644 --- a/tests/test_pus_verificator.py +++ b/tests/test_pus_verificator.py @@ -1,7 +1,10 @@ from unittest import TestCase from spacepackets.ecss import PusTelecommand -from spacepackets.ecss.pus_1_verification import Service1Tm +from spacepackets.ecss.pus_1_verification import ( + Service1Tm, + create_acceptance_success_tm, +) from tmtccmd.pus.pus_verificator import PusVerificator from tmtccmd.utility.conf_util import AnsiColors @@ -11,8 +14,8 @@ def test_basic(self): pus_verificator = PusVerificator() ping_tc = PusTelecommand(service=17, subservice=1) pus_verificator.add_tc(ping_tc) - # ping_tm = Service1Tm() - # pus_verificator.add_tm() + ping_tm = create_acceptance_success_tm(ping_tc) + pus_verificator.add_tm(ping_tm) verif_dict = pus_verificator.verif_dict print( f"{AnsiColors.GREEN}\u2714{AnsiColors.GREEN}\u27140{AnsiColors.GREEN}\u2714" diff --git a/tmtccmd/config/globals.py b/tmtccmd/config/globals.py index 0efb9c47..01519338 100644 --- a/tmtccmd/config/globals.py +++ b/tmtccmd/config/globals.py @@ -4,11 +4,8 @@ from typing import Union, List, Dict from spacepackets.ecss.conf import ( - PusVersion, set_default_tc_apid, set_default_tm_apid, - set_pus_tc_version, - set_pus_tm_version, ) from tmtccmd.logging import get_console_logger @@ -88,8 +85,6 @@ def get_glob_com_if_dict() -> ComIfDictT: def set_default_globals_pre_args_parsing( apid: int, - pus_tc_version: PusVersion = PusVersion.PUS_C, - pus_tm_version: PusVersion = PusVersion.PUS_C, com_if_id: str = CoreComInterfaces.DUMMY.value, custom_com_if_dict=None, display_mode="long", @@ -101,8 +96,6 @@ def set_default_globals_pre_args_parsing( custom_com_if_dict = dict() set_default_tc_apid(tc_apid=apid) set_default_tm_apid(tm_apid=apid) - set_pus_tc_version(pus_tc_version) - set_pus_tm_version(pus_tm_version) update_global(CoreGlobalIds.COM_IF, com_if_id) update_global(CoreGlobalIds.TC_SEND_TIMEOUT_FACTOR, tc_send_timeout_factor) update_global(CoreGlobalIds.TM_TIMEOUT, tm_timeout) diff --git a/tmtccmd/tm/pus_1_verification.py b/tmtccmd/tm/pus_1_verification.py index c6891992..0274dfc5 100644 --- a/tmtccmd/tm/pus_1_verification.py +++ b/tmtccmd/tm/pus_1_verification.py @@ -20,7 +20,10 @@ class Service1TmExtended(PusTmBase, PusTmInfoBase, Service1Tm): - """Service 1 TM class representation. Can be used to deserialize raw service 1 packets.""" + """Service 1 TM class representation. Can be used to deserialize raw service 1 packets. + Only PUS C is supported. + TODO: Do not use subclassing here, use a wrapper class.. + """ def __init__( self, @@ -30,7 +33,6 @@ def __init__( seq_count: int = 0, apid: int = -1, packet_version: int = 0b000, - pus_version: PusVersion = PusVersion.GLOBAL_CONFIG, secondary_header_flag: bool = True, space_time_ref: int = 0b0000, destination_id: int = 0, @@ -43,7 +45,6 @@ def __init__( seq_count=seq_count, apid=apid, packet_version=packet_version, - pus_version=pus_version, secondary_header_flag=secondary_header_flag, space_time_ref=space_time_ref, destination_id=destination_id, From 5e3ff724cb96017593f64064a32f082de69fa628 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 30 Jun 2022 11:16:57 +0200 Subject: [PATCH 177/221] first working pus verificator test --- tests/test_pus_verificator.py | 22 ++++++++++++++++++++-- tmtccmd/pus/__init__.py | 2 +- tmtccmd/pus/pus_verificator.py | 28 +++++++++++++++++++--------- tmtccmd/tm/pus_20_fsfw_parameters.py | 2 +- tmtccmd/tm/pus_23_filemgmt.py | 2 +- tmtccmd/tm/pus_5_event.py | 2 +- tmtccmd/utility/tmtc_printer.py | 2 +- 7 files changed, 44 insertions(+), 16 deletions(-) diff --git a/tests/test_pus_verificator.py b/tests/test_pus_verificator.py index f67b4f84..a5d55834 100644 --- a/tests/test_pus_verificator.py +++ b/tests/test_pus_verificator.py @@ -4,8 +4,9 @@ from spacepackets.ecss.pus_1_verification import ( Service1Tm, create_acceptance_success_tm, + RequestId, ) -from tmtccmd.pus.pus_verificator import PusVerificator +from tmtccmd.pus.pus_verificator import PusVerificator, StatusField from tmtccmd.utility.conf_util import AnsiColors @@ -13,10 +14,27 @@ class TestPusVerificator(TestCase): def test_basic(self): pus_verificator = PusVerificator() ping_tc = PusTelecommand(service=17, subservice=1) + req_id = RequestId.from_pus_tc(ping_tc) pus_verificator.add_tc(ping_tc) ping_tm = create_acceptance_success_tm(ping_tc) - pus_verificator.add_tm(ping_tm) + check_res = pus_verificator.add_tm(ping_tm) + self.assertEqual(check_res.completed, False) + status = check_res.status + self.assertNotEqual(status, None) + self.assertEqual(status.accepted, StatusField.SUCCESS) + self.assertEqual(status.all_verifs_recvd, False) + self.assertEqual(status.started, StatusField.UNSET) + self.assertEqual(status.step, 0) + self.assertEqual(status.completed, StatusField.UNSET) verif_dict = pus_verificator.verif_dict + self.assertEqual(len(verif_dict), 1) + for key, val in verif_dict.items(): + self.assertEqual(key, req_id) + self.assertEqual(val.accepted, StatusField.SUCCESS) + self.assertEqual(val.all_verifs_recvd, False) + self.assertEqual(val.started, StatusField.UNSET) + self.assertEqual(val.step, 0) + self.assertEqual(val.completed, StatusField.UNSET) print( f"{AnsiColors.GREEN}\u2714{AnsiColors.GREEN}\u27140{AnsiColors.GREEN}\u2714" ) diff --git a/tmtccmd/pus/__init__.py b/tmtccmd/pus/__init__.py index e61e1616..12eaa20a 100644 --- a/tmtccmd/pus/__init__.py +++ b/tmtccmd/pus/__init__.py @@ -1,5 +1,5 @@ from enum import IntEnum -from spacepackets.ecss.definitions import PusServices +from spacepackets.ecss.defs import PusServices class CustomPusServices(IntEnum): diff --git a/tmtccmd/pus/pus_verificator.py b/tmtccmd/pus/pus_verificator.py index 941045c6..93cd0b56 100644 --- a/tmtccmd/pus/pus_verificator.py +++ b/tmtccmd/pus/pus_verificator.py @@ -74,33 +74,43 @@ def add_tm(self, pus_1_tm: Service1Tm) -> TmCheckResult: f"PUS 1 TM with invalid subservice {pus_1_tm.subservice} was passed" ) res.status = verif_status - if pus_1_tm.subservice % 2 == 0: + + return self._check_subservice(pus_1_tm, res, verif_status) + + def _check_subservice( + self, + pus_1_tm: Service1Tm, + res: TmCheckResult, + verif_status: VerificationStatus, + ) -> TmCheckResult: + subservice = pus_1_tm.subservice + if subservice % 2 == 0: # For failures, verification handling is completed res.completed = True - if pus_1_tm.subservice == Subservices.TM_ACCEPTANCE_SUCCESS: + if subservice == Subservices.TM_ACCEPTANCE_SUCCESS: verif_status.accepted = StatusField.SUCCESS - elif pus_1_tm.subservice == Subservices.TM_ACCEPTANCE_FAILURE: + elif subservice == Subservices.TM_ACCEPTANCE_FAILURE: verif_status.all_verifs_recvd = True verif_status.accepted = StatusField.FAILURE res.completed = True - elif pus_1_tm.subservice == Subservices.TM_START_SUCCESS: + elif subservice == Subservices.TM_START_SUCCESS: verif_status.started = StatusField.SUCCESS - elif pus_1_tm.subservice == Subservices.TM_START_FAILURE: + elif subservice == Subservices.TM_START_FAILURE: res.completed = True if verif_status.accepted != StatusField.UNSET: verif_status.all_verifs_recvd = True verif_status.started = StatusField.FAILURE - elif pus_1_tm.subservice == Subservices.TM_STEP_SUCCESS: + elif subservice == Subservices.TM_STEP_SUCCESS: verif_status.step = pus_1_tm.step_id - elif pus_1_tm.subservice == Subservices.TM_STEP_FAILURE: + elif subservice == Subservices.TM_STEP_FAILURE: self._check_all_replies_recvd_after_step(verif_status) verif_status.step = -1 res.completed = True - elif pus_1_tm.subservice == Subservices.TM_COMPLETION_SUCCESS: + elif subservice == Subservices.TM_COMPLETION_SUCCESS: self._check_all_replies_recvd_after_step(verif_status) verif_status.completed = StatusField.SUCCESS res.completed = True - elif pus_1_tm.subservice == Subservices.TM_COMPLETION_FAILURE: + elif subservice == Subservices.TM_COMPLETION_FAILURE: self._check_all_replies_recvd_after_step(verif_status) verif_status.completed = StatusField.FAILURE res.completed = True diff --git a/tmtccmd/tm/pus_20_fsfw_parameters.py b/tmtccmd/tm/pus_20_fsfw_parameters.py index 2ac251f9..e284a6f9 100644 --- a/tmtccmd/tm/pus_20_fsfw_parameters.py +++ b/tmtccmd/tm/pus_20_fsfw_parameters.py @@ -5,7 +5,7 @@ from spacepackets.ecss.field import Ptc, PfcUnsigned, PfcSigned, PfcReal from spacepackets.ecss.tm import CdsShortTimestamp, PusVersion, PusTelemetry -from spacepackets.ecss.definitions import PusServices +from spacepackets.ecss.defs import PusServices from tmtccmd.utility.obj_id import ObjectId from tmtccmd.pus.pus_20_params import ( diff --git a/tmtccmd/tm/pus_23_filemgmt.py b/tmtccmd/tm/pus_23_filemgmt.py index c9a7e32c..ab38343e 100644 --- a/tmtccmd/tm/pus_23_filemgmt.py +++ b/tmtccmd/tm/pus_23_filemgmt.py @@ -1,7 +1,7 @@ from __future__ import annotations import struct -from spacepackets.ecss.definitions import PusServices +from spacepackets.ecss.defs import PusServices from spacepackets.ecss.tm import CdsShortTimestamp, PusVersion, PusTelemetry from tmtccmd.tm.base import PusTmInfoBase, PusTmBase diff --git a/tmtccmd/tm/pus_5_event.py b/tmtccmd/tm/pus_5_event.py index 50f899a4..57aaad0e 100644 --- a/tmtccmd/tm/pus_5_event.py +++ b/tmtccmd/tm/pus_5_event.py @@ -5,7 +5,7 @@ from abc import abstractmethod import struct -from spacepackets.ecss.definitions import PusServices +from spacepackets.ecss.defs import PusServices from spacepackets.ecss.pus_5_event import Subservices from spacepackets.ecss.tm import CdsShortTimestamp, PusVersion from tmtccmd.tm.base import PusTmInfoBase, PusTmBase, PusTelemetry diff --git a/tmtccmd/utility/tmtc_printer.py b/tmtccmd/utility/tmtc_printer.py index e80186a4..b1214805 100644 --- a/tmtccmd/utility/tmtc_printer.py +++ b/tmtccmd/utility/tmtc_printer.py @@ -5,7 +5,7 @@ from typing import List, Optional from spacepackets.util import get_printable_data_string, PrintFormats -from spacepackets.ecss.definitions import PusServices +from spacepackets.ecss.defs import PusServices from tmtccmd.tm.pus_8_funccmd import Service8FsfwTm from tmtccmd.tm.base import PusTmInfoInterface, PusTmInterface From de902077df4a3e91d1db111bed9571efc8e60111 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 30 Jun 2022 11:36:57 +0200 Subject: [PATCH 178/221] some more verificator unittests --- tests/test_pus_verificator.py | 95 +++++++++++++++++++++++++--------- tmtccmd/pus/pus_verificator.py | 2 +- 2 files changed, 72 insertions(+), 25 deletions(-) diff --git a/tests/test_pus_verificator.py b/tests/test_pus_verificator.py index a5d55834..f128de8a 100644 --- a/tests/test_pus_verificator.py +++ b/tests/test_pus_verificator.py @@ -1,40 +1,87 @@ +from typing import Optional from unittest import TestCase from spacepackets.ecss import PusTelecommand from spacepackets.ecss.pus_1_verification import ( - Service1Tm, create_acceptance_success_tm, RequestId, + create_start_success_tm, + create_step_success_tm, + StepId, + create_completion_success_tm, ) -from tmtccmd.pus.pus_verificator import PusVerificator, StatusField -from tmtccmd.utility.conf_util import AnsiColors +from tmtccmd.pus.pus_verificator import PusVerificator, StatusField, VerificationStatus class TestPusVerificator(TestCase): + def setUp(self) -> None: + self.pus_verificator = PusVerificator() + self.ping_tc = PusTelecommand(service=17, subservice=1) + self.req_id = RequestId.from_pus_tc(self.ping_tc) + self.acc_suc_tm = create_acceptance_success_tm(self.ping_tc) + self.sta_suc_tm = create_start_success_tm(self.ping_tc) + self.ste_suc_tm = create_step_success_tm( + self.ping_tc, step_id=StepId.from_byte_size(1, 1) + ) + self.fin_suc_tm = create_completion_success_tm(self.ping_tc) + def test_basic(self): - pus_verificator = PusVerificator() - ping_tc = PusTelecommand(service=17, subservice=1) - req_id = RequestId.from_pus_tc(ping_tc) - pus_verificator.add_tc(ping_tc) - ping_tm = create_acceptance_success_tm(ping_tc) - check_res = pus_verificator.add_tm(ping_tm) + self.pus_verificator.add_tc(self.ping_tc) + check_res = self.pus_verificator.add_tm(self.acc_suc_tm) self.assertEqual(check_res.completed, False) status = check_res.status - self.assertNotEqual(status, None) - self.assertEqual(status.accepted, StatusField.SUCCESS) - self.assertEqual(status.all_verifs_recvd, False) - self.assertEqual(status.started, StatusField.UNSET) - self.assertEqual(status.step, 0) - self.assertEqual(status.completed, StatusField.UNSET) - verif_dict = pus_verificator.verif_dict + self._check_status( + status, False, StatusField.SUCCESS, StatusField.UNSET, 0, StatusField.UNSET + ) + verif_dict = self.pus_verificator.verif_dict self.assertEqual(len(verif_dict), 1) for key, val in verif_dict.items(): - self.assertEqual(key, req_id) - self.assertEqual(val.accepted, StatusField.SUCCESS) - self.assertEqual(val.all_verifs_recvd, False) - self.assertEqual(val.started, StatusField.UNSET) - self.assertEqual(val.step, 0) - self.assertEqual(val.completed, StatusField.UNSET) - print( - f"{AnsiColors.GREEN}\u2714{AnsiColors.GREEN}\u27140{AnsiColors.GREEN}\u2714" + self.assertEqual(key, self.req_id) + self._check_status( + val, False, StatusField.SUCCESS, StatusField.UNSET, 0, StatusField.UNSET + ) + + def test_complete_verification(self): + self.pus_verificator.add_tc(self.ping_tc) + acc_tm = create_acceptance_success_tm(self.ping_tc) + check_res = self.pus_verificator.add_tm(self.acc_suc_tm) + status = check_res.status + self._check_status( + status, False, StatusField.SUCCESS, StatusField.UNSET, 0, StatusField.UNSET ) + check_res = self.pus_verificator.add_tm(self.sta_suc_tm) + status = check_res.status + self._check_status( + status, + False, + StatusField.SUCCESS, + StatusField.SUCCESS, + 0, + StatusField.UNSET, + ) + check_res = self.pus_verificator.add_tm(self.ste_suc_tm) + status = check_res.status + self._check_status( + status, + False, + StatusField.SUCCESS, + StatusField.SUCCESS, + 1, + StatusField.UNSET, + ) + + def _check_status( + self, + status: Optional[VerificationStatus], + all_verifs: bool, + acc_st: StatusField, + sta_st: StatusField, + steps: int, + fin_st: StatusField, + ): + self.assertIsNotNone(status) + self.assertEqual(status.all_verifs_recvd, all_verifs) + self.assertEqual(status.accepted, acc_st) + self.assertEqual(status.step, steps) + self.assertEqual(status.started, sta_st) + self.assertEqual(status.completed, fin_st) diff --git a/tmtccmd/pus/pus_verificator.py b/tmtccmd/pus/pus_verificator.py index 93cd0b56..87db5e5a 100644 --- a/tmtccmd/pus/pus_verificator.py +++ b/tmtccmd/pus/pus_verificator.py @@ -101,7 +101,7 @@ def _check_subservice( verif_status.all_verifs_recvd = True verif_status.started = StatusField.FAILURE elif subservice == Subservices.TM_STEP_SUCCESS: - verif_status.step = pus_1_tm.step_id + verif_status.step = pus_1_tm.step_id.val elif subservice == Subservices.TM_STEP_FAILURE: self._check_all_replies_recvd_after_step(verif_status) verif_status.step = -1 From 4eb7533232a6ae38cfb52de6bf5b76fa43239de6 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 30 Jun 2022 11:39:02 +0200 Subject: [PATCH 179/221] type adaption for step field --- tmtccmd/pus/pus_verificator.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tmtccmd/pus/pus_verificator.py b/tmtccmd/pus/pus_verificator.py index 87db5e5a..e5328cda 100644 --- a/tmtccmd/pus/pus_verificator.py +++ b/tmtccmd/pus/pus_verificator.py @@ -1,6 +1,6 @@ import enum from dataclasses import dataclass -from typing import Dict, Optional +from typing import Dict, Optional, List from spacepackets.ecss import PusTelecommand from spacepackets.ecss.pus_1_verification import RequestId, Service1Tm, Subservices @@ -17,7 +17,7 @@ class VerificationStatus: all_verifs_recvd: bool accepted: StatusField started: StatusField - step: int + step: (StatusField, List[int]) completed: StatusField @@ -104,7 +104,7 @@ def _check_subservice( verif_status.step = pus_1_tm.step_id.val elif subservice == Subservices.TM_STEP_FAILURE: self._check_all_replies_recvd_after_step(verif_status) - verif_status.step = -1 + verif_status.step = pus_1_tm.step_id.val res.completed = True elif subservice == Subservices.TM_COMPLETION_SUCCESS: self._check_all_replies_recvd_after_step(verif_status) From 1ef7fde479564eee77354d20ad8ce2a09aeac8ec Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 30 Jun 2022 11:43:17 +0200 Subject: [PATCH 180/221] some changes for step handling --- tmtccmd/pus/pus_verificator.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/tmtccmd/pus/pus_verificator.py b/tmtccmd/pus/pus_verificator.py index e5328cda..48319367 100644 --- a/tmtccmd/pus/pus_verificator.py +++ b/tmtccmd/pus/pus_verificator.py @@ -100,11 +100,16 @@ def _check_subservice( if verif_status.accepted != StatusField.UNSET: verif_status.all_verifs_recvd = True verif_status.started = StatusField.FAILURE + # TODO: Extract step handling into separate function elif subservice == Subservices.TM_STEP_SUCCESS: - verif_status.step = pus_1_tm.step_id.val + verif_status.step[1].append(pus_1_tm.step_id.val) + # Do not overwrite a failed step status + if verif_status.step[0] == StatusField.UNSET: + verif_status.step[0] = StatusField.SUCCESS elif subservice == Subservices.TM_STEP_FAILURE: self._check_all_replies_recvd_after_step(verif_status) - verif_status.step = pus_1_tm.step_id.val + verif_status.step[0] = StatusField.FAILURE + verif_status.step[1].append(pus_1_tm.step_id.val) res.completed = True elif subservice == Subservices.TM_COMPLETION_SUCCESS: self._check_all_replies_recvd_after_step(verif_status) From 76351b5ae97b0f9405d1ba3eb0643abe15ab72c5 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 30 Jun 2022 13:55:12 +0200 Subject: [PATCH 181/221] separate step list now --- tests/test_pus_verificator.py | 39 ++++++++++++++++++++++++++-------- tmtccmd/pus/pus_verificator.py | 36 ++++++++++++------------------- 2 files changed, 43 insertions(+), 32 deletions(-) diff --git a/tests/test_pus_verificator.py b/tests/test_pus_verificator.py index f128de8a..055d4b4c 100644 --- a/tests/test_pus_verificator.py +++ b/tests/test_pus_verificator.py @@ -1,4 +1,4 @@ -from typing import Optional +from typing import Optional, List from unittest import TestCase from spacepackets.ecss import PusTelecommand @@ -31,23 +31,40 @@ def test_basic(self): self.assertEqual(check_res.completed, False) status = check_res.status self._check_status( - status, False, StatusField.SUCCESS, StatusField.UNSET, 0, StatusField.UNSET + status, + False, + StatusField.SUCCESS, + StatusField.UNSET, + StatusField.UNSET, + [], + StatusField.UNSET, ) verif_dict = self.pus_verificator.verif_dict self.assertEqual(len(verif_dict), 1) for key, val in verif_dict.items(): self.assertEqual(key, self.req_id) self._check_status( - val, False, StatusField.SUCCESS, StatusField.UNSET, 0, StatusField.UNSET + val, + False, + StatusField.SUCCESS, + StatusField.UNSET, + StatusField.UNSET, + [], + StatusField.UNSET, ) def test_complete_verification(self): self.pus_verificator.add_tc(self.ping_tc) - acc_tm = create_acceptance_success_tm(self.ping_tc) check_res = self.pus_verificator.add_tm(self.acc_suc_tm) status = check_res.status self._check_status( - status, False, StatusField.SUCCESS, StatusField.UNSET, 0, StatusField.UNSET + status, + False, + StatusField.SUCCESS, + StatusField.UNSET, + StatusField.UNSET, + [], + StatusField.UNSET, ) check_res = self.pus_verificator.add_tm(self.sta_suc_tm) status = check_res.status @@ -56,7 +73,8 @@ def test_complete_verification(self): False, StatusField.SUCCESS, StatusField.SUCCESS, - 0, + StatusField.UNSET, + [], StatusField.UNSET, ) check_res = self.pus_verificator.add_tm(self.ste_suc_tm) @@ -66,7 +84,8 @@ def test_complete_verification(self): False, StatusField.SUCCESS, StatusField.SUCCESS, - 1, + StatusField.SUCCESS, + [1], StatusField.UNSET, ) @@ -76,12 +95,14 @@ def _check_status( all_verifs: bool, acc_st: StatusField, sta_st: StatusField, - steps: int, + step_st: StatusField, + step_list: List[int], fin_st: StatusField, ): self.assertIsNotNone(status) self.assertEqual(status.all_verifs_recvd, all_verifs) self.assertEqual(status.accepted, acc_st) - self.assertEqual(status.step, steps) + self.assertEqual(status.step, step_st) + self.assertEqual(status.step_list, step_list) self.assertEqual(status.started, sta_st) self.assertEqual(status.completed, fin_st) diff --git a/tmtccmd/pus/pus_verificator.py b/tmtccmd/pus/pus_verificator.py index 48319367..4b205d02 100644 --- a/tmtccmd/pus/pus_verificator.py +++ b/tmtccmd/pus/pus_verificator.py @@ -1,5 +1,5 @@ import enum -from dataclasses import dataclass +from dataclasses import dataclass, field from typing import Dict, Optional, List from spacepackets.ecss import PusTelecommand @@ -14,11 +14,12 @@ class StatusField(enum.IntEnum): @dataclass class VerificationStatus: - all_verifs_recvd: bool - accepted: StatusField - started: StatusField - step: (StatusField, List[int]) - completed: StatusField + all_verifs_recvd: bool = False + accepted: StatusField = StatusField.UNSET + started: StatusField = StatusField.UNSET + step: StatusField = StatusField.UNSET + step_list: List[int] = field(default_factory=lambda: []) + completed: StatusField = StatusField.UNSET VerifDictT = Dict[RequestId, VerificationStatus] @@ -49,17 +50,7 @@ def add_tc(self, tc: PusTelecommand) -> bool: req_id = RequestId.from_sp_header(tc.sp_header) if req_id in self._verif_dict: return False - self._verif_dict.update( - { - req_id: VerificationStatus( - all_verifs_recvd=False, - accepted=StatusField.UNSET, - started=StatusField.UNSET, - step=0, - completed=StatusField.UNSET, - ) - } - ) + self._verif_dict.update({req_id: VerificationStatus()}) return True def add_tm(self, pus_1_tm: Service1Tm) -> TmCheckResult: @@ -100,16 +91,15 @@ def _check_subservice( if verif_status.accepted != StatusField.UNSET: verif_status.all_verifs_recvd = True verif_status.started = StatusField.FAILURE - # TODO: Extract step handling into separate function elif subservice == Subservices.TM_STEP_SUCCESS: - verif_status.step[1].append(pus_1_tm.step_id.val) # Do not overwrite a failed step status - if verif_status.step[0] == StatusField.UNSET: - verif_status.step[0] = StatusField.SUCCESS + if verif_status.step == StatusField.UNSET: + verif_status.step = StatusField.SUCCESS + verif_status.step_list.append(pus_1_tm.step_id.val) elif subservice == Subservices.TM_STEP_FAILURE: self._check_all_replies_recvd_after_step(verif_status) - verif_status.step[0] = StatusField.FAILURE - verif_status.step[1].append(pus_1_tm.step_id.val) + verif_status.step = StatusField.FAILURE + verif_status.step_list.append(pus_1_tm.step_id.val) res.completed = True elif subservice == Subservices.TM_COMPLETION_SUCCESS: self._check_all_replies_recvd_after_step(verif_status) From 2ca62bc7adb95556071e7c323ea707a590264714 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 30 Jun 2022 14:02:08 +0200 Subject: [PATCH 182/221] basic test done --- tests/test_pus_verificator.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/tests/test_pus_verificator.py b/tests/test_pus_verificator.py index 055d4b4c..742e5569 100644 --- a/tests/test_pus_verificator.py +++ b/tests/test_pus_verificator.py @@ -88,6 +88,17 @@ def test_complete_verification(self): [1], StatusField.UNSET, ) + check_res = self.pus_verificator.add_tm(self.fin_suc_tm) + status = check_res.status + self._check_status( + status, + True, + StatusField.SUCCESS, + StatusField.SUCCESS, + StatusField.SUCCESS, + [1], + StatusField.SUCCESS, + ) def _check_status( self, From 040aa87cb009f02b68532f95fe9d63d08a147c9a Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 30 Jun 2022 14:21:28 +0200 Subject: [PATCH 183/221] additional ctor --- tests/test_pus_verificator.py | 62 ++++++++++++++++++++++++---------- tmtccmd/pus/pus_17_test.py | 10 +++--- tmtccmd/pus/pus_verificator.py | 4 ++- tmtccmd/tc/pus_11_tc_sched.py | 7 ++-- tmtccmd/tc/pus_20_params.py | 2 +- tmtccmd/tc/pus_3_fsfw_hk.py | 12 ++++--- tmtccmd/tc/pus_5_event.py | 13 ++++--- tmtccmd/tc/pus_8_funccmd.py | 2 +- 8 files changed, 77 insertions(+), 35 deletions(-) diff --git a/tests/test_pus_verificator.py b/tests/test_pus_verificator.py index 742e5569..45972cf8 100644 --- a/tests/test_pus_verificator.py +++ b/tests/test_pus_verificator.py @@ -13,21 +13,26 @@ from tmtccmd.pus.pus_verificator import PusVerificator, StatusField, VerificationStatus +class TestSuccessSet: + def __init__(self, pus_tc: PusTelecommand): + self.pus_tc = pus_tc + self.req_id = RequestId.from_pus_tc(pus_tc) + self.acc_suc_tm = create_acceptance_success_tm(pus_tc) + self.sta_suc_tm = create_start_success_tm(pus_tc) + self.ste_suc_tm = create_step_success_tm( + pus_tc, step_id=StepId.from_byte_size(1, 1) + ) + self.fin_suc_tm = create_completion_success_tm(pus_tc) + + class TestPusVerificator(TestCase): def setUp(self) -> None: self.pus_verificator = PusVerificator() - self.ping_tc = PusTelecommand(service=17, subservice=1) - self.req_id = RequestId.from_pus_tc(self.ping_tc) - self.acc_suc_tm = create_acceptance_success_tm(self.ping_tc) - self.sta_suc_tm = create_start_success_tm(self.ping_tc) - self.ste_suc_tm = create_step_success_tm( - self.ping_tc, step_id=StepId.from_byte_size(1, 1) - ) - self.fin_suc_tm = create_completion_success_tm(self.ping_tc) def test_basic(self): - self.pus_verificator.add_tc(self.ping_tc) - check_res = self.pus_verificator.add_tm(self.acc_suc_tm) + suc_set = TestSuccessSet(PusTelecommand(service=17, subservice=1)) + self.pus_verificator.add_tc(suc_set.pus_tc) + check_res = self.pus_verificator.add_tm(suc_set.acc_suc_tm) self.assertEqual(check_res.completed, False) status = check_res.status self._check_status( @@ -42,7 +47,7 @@ def test_basic(self): verif_dict = self.pus_verificator.verif_dict self.assertEqual(len(verif_dict), 1) for key, val in verif_dict.items(): - self.assertEqual(key, self.req_id) + self.assertEqual(key, suc_set.req_id) self._check_status( val, False, @@ -53,9 +58,32 @@ def test_basic(self): StatusField.UNSET, ) - def test_complete_verification(self): - self.pus_verificator.add_tc(self.ping_tc) - check_res = self.pus_verificator.add_tm(self.acc_suc_tm) + def test_complete_verification_clear_completed(self): + self._regular_success_seq( + TestSuccessSet(PusTelecommand(service=17, subservice=1)) + ) + self.pus_verificator.remove_completed_entries() + self.assertEqual(len(self.pus_verificator.verif_dict), 0) + + def test_complete_verification_clear_completed_multi(self): + self._regular_success_seq( + TestSuccessSet(PusTelecommand(service=17, subservice=1, seq_count=0)) + ) + self._regular_success_seq( + TestSuccessSet(PusTelecommand(service=5, subservice=4, seq_count=1)) + ) + self.pus_verificator.remove_completed_entries() + self.assertEqual(len(self.pus_verificator.verif_dict), 0) + + def test_complete_verification_remove_manually(self): + suc_set = TestSuccessSet(PusTelecommand(service=17, subservice=1)) + self._regular_success_seq(suc_set) + self.pus_verificator.remove_entry(suc_set.req_id) + self.assertEqual(len(self.pus_verificator.verif_dict), 0) + + def _regular_success_seq(self, suc_set: TestSuccessSet): + self.pus_verificator.add_tc(suc_set.pus_tc) + check_res = self.pus_verificator.add_tm(suc_set.acc_suc_tm) status = check_res.status self._check_status( status, @@ -66,7 +94,7 @@ def test_complete_verification(self): [], StatusField.UNSET, ) - check_res = self.pus_verificator.add_tm(self.sta_suc_tm) + check_res = self.pus_verificator.add_tm(suc_set.sta_suc_tm) status = check_res.status self._check_status( status, @@ -77,7 +105,7 @@ def test_complete_verification(self): [], StatusField.UNSET, ) - check_res = self.pus_verificator.add_tm(self.ste_suc_tm) + check_res = self.pus_verificator.add_tm(suc_set.ste_suc_tm) status = check_res.status self._check_status( status, @@ -88,7 +116,7 @@ def test_complete_verification(self): [1], StatusField.UNSET, ) - check_res = self.pus_verificator.add_tm(self.fin_suc_tm) + check_res = self.pus_verificator.add_tm(suc_set.fin_suc_tm) status = check_res.status self._check_status( status, diff --git a/tmtccmd/pus/pus_17_test.py b/tmtccmd/pus/pus_17_test.py index 10ce8705..aaf665ca 100644 --- a/tmtccmd/pus/pus_17_test.py +++ b/tmtccmd/pus/pus_17_test.py @@ -16,7 +16,7 @@ def pack_service_17_ping_command(ssc: int, apid: int = -1) -> PusTelecommand: if apid == -1: apid = get_default_tc_apid() return PusTelecommand( - service=17, subservice=Subservices.TC_PING.value, ssc=ssc, apid=apid + service=17, subservice=Subservices.TC_PING.value, seq_count=ssc, apid=apid ) @@ -31,7 +31,7 @@ def pack_generic_service17_test(init_ssc: int, q: QueueHelper, apid: int = -1) - new_ssc += 1 # enable event q.add_log_cmd("Testing Service 17: Enable Event") - q.add_pus_tc(PusTelecommand(service=5, subservice=5, ssc=new_ssc, apid=apid)) + q.add_pus_tc(PusTelecommand(service=5, subservice=5, seq_count=new_ssc, apid=apid)) new_ssc += 1 # test event q.add_log_cmd("Testing Service 17: Trigger event") @@ -39,13 +39,15 @@ def pack_generic_service17_test(init_ssc: int, q: QueueHelper, apid: int = -1) - PusTelecommand( service=17, subservice=CustomSubservices.TC_GEN_EVENT, - ssc=new_ssc, + seq_count=new_ssc, apid=apid, ) ) new_ssc += 1 # invalid subservice q.add_log_cmd("Testing Service 17: Invalid subservice") - q.add_pus_tc(PusTelecommand(service=17, subservice=243, ssc=new_ssc, apid=apid)) + q.add_pus_tc( + PusTelecommand(service=17, subservice=243, seq_count=new_ssc, apid=apid) + ) new_ssc += 1 return new_ssc diff --git a/tmtccmd/pus/pus_verificator.py b/tmtccmd/pus/pus_verificator.py index 4b205d02..e7d3f9a0 100644 --- a/tmtccmd/pus/pus_verificator.py +++ b/tmtccmd/pus/pus_verificator.py @@ -125,7 +125,9 @@ def _check_all_replies_recvd_after_step(verif_stat: VerificationStatus): def remove_completed_entries(self): self._verif_dict = { - key: val for key, val in self._verif_dict.items() if val.all_verifs_recvd + key: val + for key, val in self._verif_dict.items() + if not val.all_verifs_recvd } def remove_entry(self, req_id: RequestId) -> bool: diff --git a/tmtccmd/tc/pus_11_tc_sched.py b/tmtccmd/tc/pus_11_tc_sched.py index 3fa654f6..4cac6659 100644 --- a/tmtccmd/tc/pus_11_tc_sched.py +++ b/tmtccmd/tc/pus_11_tc_sched.py @@ -8,7 +8,10 @@ def __generic_param_less_tc_sched_cmd( subservice: int, ssc: int, apid: int = -1 ) -> PusTelecommand: return PusTelecommand( - service=PusServices.S11_TC_SCHED, subservice=subservice, ssc=ssc, apid=apid + service=PusServices.S11_TC_SCHED, + subservice=subservice, + seq_count=ssc, + apid=apid, ) @@ -46,7 +49,7 @@ def generate_time_tagged_cmd( service=PusServices.S11_TC_SCHED, subservice=Subservices.TC_INSERT, app_data=pack_time_tagged_tc_app_data(release_time, tc_to_insert), - ssc=ssc, + seq_count=ssc, apid=apid, ) diff --git a/tmtccmd/tc/pus_20_params.py b/tmtccmd/tc/pus_20_params.py index d2dc8697..081b940e 100644 --- a/tmtccmd/tc/pus_20_params.py +++ b/tmtccmd/tc/pus_20_params.py @@ -21,7 +21,7 @@ def pack_fsfw_load_param_cmd( subservice=CustomSubservices.LOAD, app_data=app_data, apid=apid, - ssc=ssc, + seq_count=ssc, ) diff --git a/tmtccmd/tc/pus_3_fsfw_hk.py b/tmtccmd/tc/pus_3_fsfw_hk.py index fce12efa..e28013a9 100644 --- a/tmtccmd/tc/pus_3_fsfw_hk.py +++ b/tmtccmd/tc/pus_3_fsfw_hk.py @@ -46,7 +46,9 @@ def __generate_periodic_hk_command( subservice = Subservices.TC_DISABLE_PERIODIC_DIAGNOSTICS_GEN else: subservice = Subservices.TC_DISABLE_PERIODIC_HK_GEN - return PusTelecommand(service=3, subservice=subservice, ssc=ssc, app_data=app_data) + return PusTelecommand( + service=3, subservice=subservice, seq_count=ssc, app_data=app_data + ) def modify_collection_interval( @@ -58,14 +60,16 @@ def modify_collection_interval( subservice = Subservices.TC_MODIFY_DIAGNOSTICS_REPORT_COLLECTION_INTERVAL else: subservice = Subservices.TC_MODIFY_PARAMETER_REPORT_COLLECTION_INTERVAL - return PusTelecommand(service=3, subservice=subservice, ssc=ssc, app_data=app_data) + return PusTelecommand( + service=3, subservice=subservice, seq_count=ssc, app_data=app_data + ) def generate_one_hk_command(sid: bytes, ssc: int) -> PusTelecommand: return PusTelecommand( service=3, subservice=Subservices.TC_GENERATE_ONE_PARAMETER_REPORT, - ssc=ssc, + seq_count=ssc, app_data=sid, ) @@ -74,6 +78,6 @@ def generate_one_diag_command(sid: bytes, ssc: int) -> PusTelecommand: return PusTelecommand( service=3, subservice=Subservices.TC_GENERATE_ONE_DIAGNOSTICS_REPORT, - ssc=ssc, + seq_count=ssc, app_data=sid, ) diff --git a/tmtccmd/tc/pus_5_event.py b/tmtccmd/tc/pus_5_event.py index 619cabcf..7ffc46c8 100644 --- a/tmtccmd/tc/pus_5_event.py +++ b/tmtccmd/tc/pus_5_event.py @@ -11,7 +11,10 @@ def pack_enable_event_reporting_command(ssc: int, apid: int = -1): if apid == -1: apid = get_default_tc_apid() return PusTelecommand( - service=5, subservice=Subservices.TC_ENABLE_EVENT_REPORTING, ssc=ssc, apid=apid + service=5, + subservice=Subservices.TC_ENABLE_EVENT_REPORTING, + seq_count=ssc, + apid=apid, ) @@ -21,7 +24,7 @@ def pack_disable_event_reporting_command(ssc: int, apid: int = -1): return PusTelecommand( service=5, subservice=Subservices.TC_DISABLE_EVENT_REPORTING, - ssc=ssc, + seq_count=ssc, apid=apid, ) @@ -32,16 +35,16 @@ def pack_generic_service5_test_into(q: QueueHelper, apid: int = -1): q.add_log_cmd("Testing Service 5") # invalid subservice q.add_log_cmd("Testing Service 5: Invalid subservice") - q.add_pus_tc(PusTelecommand(service=5, subservice=1, apid=apid, ssc=500)) + q.add_pus_tc(PusTelecommand(service=5, subservice=1, apid=apid, seq_count=500)) # disable events q.add_log_cmd("Testing Service 5: Disable event") q.add_pus_tc(pack_disable_event_reporting_command(ssc=501)) # trigger event q.add_log_cmd("Testing Service 5: Trigger event") - q.add_pus_tc(PusTelecommand(service=17, subservice=128, apid=apid, ssc=510)) + q.add_pus_tc(PusTelecommand(service=17, subservice=128, apid=apid, seq_count=510)) # enable event q.add_log_cmd("Testing Service 5: Enable event") q.add_pus_tc(pack_enable_event_reporting_command(ssc=520)) # trigger event q.add_log_cmd("Testing Service 5: Trigger another event") - q.add_pus_tc(PusTelecommand(service=17, subservice=128, apid=apid, ssc=530)) + q.add_pus_tc(PusTelecommand(service=17, subservice=128, apid=apid, seq_count=530)) diff --git a/tmtccmd/tc/pus_8_funccmd.py b/tmtccmd/tc/pus_8_funccmd.py index 1cc9701b..85b88dfe 100644 --- a/tmtccmd/tc/pus_8_funccmd.py +++ b/tmtccmd/tc/pus_8_funccmd.py @@ -19,7 +19,7 @@ def generate_action_command( return PusTelecommand( service=8, subservice=Subservices.FUNCTIONAL_CMD, - ssc=ssc, + seq_count=ssc, app_data=data_to_pack, apid=apid, ) From 84bc02d87613343aed46a2b13b5ee717d121f313 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 30 Jun 2022 14:27:18 +0200 Subject: [PATCH 184/221] some more checks --- tests/test_pus_verificator.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/tests/test_pus_verificator.py b/tests/test_pus_verificator.py index 45972cf8..7c7865d0 100644 --- a/tests/test_pus_verificator.py +++ b/tests/test_pus_verificator.py @@ -78,7 +78,17 @@ def test_complete_verification_clear_completed_multi(self): def test_complete_verification_remove_manually(self): suc_set = TestSuccessSet(PusTelecommand(service=17, subservice=1)) self._regular_success_seq(suc_set) - self.pus_verificator.remove_entry(suc_set.req_id) + self.assertTrue(self.pus_verificator.remove_entry(suc_set.req_id)) + self.assertEqual(len(self.pus_verificator.verif_dict), 0) + + def test_complete_verification_multi_remove_manually(self): + set_0 = TestSuccessSet(PusTelecommand(service=17, subservice=1, seq_count=0)) + self._regular_success_seq(set_0) + set_1 = TestSuccessSet(PusTelecommand(service=5, subservice=4, seq_count=1)) + self._regular_success_seq(set_1) + self.assertTrue(self.pus_verificator.remove_entry(set_0.req_id)) + self.assertEqual(len(self.pus_verificator.verif_dict), 1) + self.assertTrue(self.pus_verificator.remove_entry(set_1.req_id)) self.assertEqual(len(self.pus_verificator.verif_dict), 0) def _regular_success_seq(self, suc_set: TestSuccessSet): From 7c0b45f3c5e648a9dcc68e53ce08d6b02b0217b9 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 30 Jun 2022 14:53:37 +0200 Subject: [PATCH 185/221] add failure step test --- tests/test_pus_verificator.py | 100 ++++++++++++++++++++++++++++++++- tmtccmd/pus/pus_verificator.py | 13 +++-- 2 files changed, 107 insertions(+), 6 deletions(-) diff --git a/tests/test_pus_verificator.py b/tests/test_pus_verificator.py index 7c7865d0..7123ca4d 100644 --- a/tests/test_pus_verificator.py +++ b/tests/test_pus_verificator.py @@ -9,6 +9,12 @@ create_step_success_tm, StepId, create_completion_success_tm, + FailureNotice, + create_acceptance_failure_tm, + create_start_failure_tm, + create_step_failure_tm, + create_completion_failure_tm, + ErrorCode, ) from tmtccmd.pus.pus_verificator import PusVerificator, StatusField, VerificationStatus @@ -20,11 +26,35 @@ def __init__(self, pus_tc: PusTelecommand): self.acc_suc_tm = create_acceptance_success_tm(pus_tc) self.sta_suc_tm = create_start_success_tm(pus_tc) self.ste_suc_tm = create_step_success_tm( - pus_tc, step_id=StepId.from_byte_size(1, 1) + pus_tc, step_id=StepId.with_byte_size(1, 1) ) self.fin_suc_tm = create_completion_success_tm(pus_tc) +class TestFailureSet: + def __init__(self, pus_tc: PusTelecommand, failure_notice: FailureNotice): + self.suc_set = TestSuccessSet(pus_tc) + self.failure_notice = failure_notice + self.acc_fail_tm = create_acceptance_failure_tm(pus_tc, self.failure_notice) + self.sta_fail_tm = create_start_failure_tm(pus_tc, self.failure_notice) + self.ste_fail_tm = create_step_failure_tm( + pus_tc, + failure_notice=self.failure_notice, + step_id=StepId.with_byte_size(1, 1), + ) + self.fin_fail_tm = create_completion_failure_tm( + failure_notice=self.failure_notice, pus_tc=self.suc_set.pus_tc + ) + + @property + def pus_tc(self): + return self.suc_set.pus_tc + + @property + def req_id(self): + return self.suc_set.req_id + + class TestPusVerificator(TestCase): def setUp(self) -> None: self.pus_verificator = PusVerificator() @@ -91,9 +121,72 @@ def test_complete_verification_multi_remove_manually(self): self.assertTrue(self.pus_verificator.remove_entry(set_1.req_id)) self.assertEqual(len(self.pus_verificator.verif_dict), 0) + def test_acceptance_failure(self): + notice = FailureNotice(ErrorCode.with_byte_size(1, 8), data=bytes([0, 1])) + fail_set = TestFailureSet( + PusTelecommand(service=17, subservice=1, seq_count=0), notice + ) + self.assertTrue(self.pus_verificator.add_tc(fail_set.pus_tc)) + status = self.pus_verificator.add_tm(fail_set.acc_fail_tm) + self.assertTrue(status.completed) + self.assertTrue(status.req_id_in_dict) + self._check_status( + status.status, + True, + StatusField.FAILURE, + StatusField.UNSET, + StatusField.UNSET, + [], + StatusField.UNSET, + ) + + def test_step_failure(self): + notice = FailureNotice(ErrorCode.with_byte_size(1, 8), data=bytes([0, 1])) + fail_set = TestFailureSet( + PusTelecommand(service=17, subservice=1, seq_count=0), notice + ) + self.assertTrue(self.pus_verificator.add_tc(fail_set.pus_tc)) + status = self.pus_verificator.add_tm(fail_set.suc_set.acc_suc_tm) + self.assertFalse(status.completed) + self.assertTrue(status.req_id_in_dict) + self._check_status( + status.status, + False, + StatusField.SUCCESS, + StatusField.UNSET, + StatusField.UNSET, + [], + StatusField.UNSET, + ) + status = self.pus_verificator.add_tm(fail_set.suc_set.sta_suc_tm) + self.assertFalse(status.completed) + self.assertTrue(status.req_id_in_dict) + self._check_status( + status.status, + False, + StatusField.SUCCESS, + StatusField.SUCCESS, + StatusField.UNSET, + [], + StatusField.UNSET, + ) + status = self.pus_verificator.add_tm(fail_set.ste_fail_tm) + self.assertTrue(status.completed) + self.assertTrue(status.req_id_in_dict) + self._check_status( + status.status, + True, + StatusField.SUCCESS, + StatusField.SUCCESS, + StatusField.FAILURE, + [1], + StatusField.UNSET, + ) + def _regular_success_seq(self, suc_set: TestSuccessSet): - self.pus_verificator.add_tc(suc_set.pus_tc) + self.assertTrue(self.pus_verificator.add_tc(suc_set.pus_tc)) check_res = self.pus_verificator.add_tm(suc_set.acc_suc_tm) + self.assertTrue(check_res.req_id_in_dict) status = check_res.status self._check_status( status, @@ -105,6 +198,7 @@ def _regular_success_seq(self, suc_set: TestSuccessSet): StatusField.UNSET, ) check_res = self.pus_verificator.add_tm(suc_set.sta_suc_tm) + self.assertTrue(check_res.req_id_in_dict) status = check_res.status self._check_status( status, @@ -116,6 +210,7 @@ def _regular_success_seq(self, suc_set: TestSuccessSet): StatusField.UNSET, ) check_res = self.pus_verificator.add_tm(suc_set.ste_suc_tm) + self.assertTrue(check_res.req_id_in_dict) status = check_res.status self._check_status( status, @@ -127,6 +222,7 @@ def _regular_success_seq(self, suc_set: TestSuccessSet): StatusField.UNSET, ) check_res = self.pus_verificator.add_tm(suc_set.fin_suc_tm) + self.assertTrue(check_res.req_id_in_dict) status = check_res.status self._check_status( status, diff --git a/tmtccmd/pus/pus_verificator.py b/tmtccmd/pus/pus_verificator.py index e7d3f9a0..224b4b2a 100644 --- a/tmtccmd/pus/pus_verificator.py +++ b/tmtccmd/pus/pus_verificator.py @@ -97,10 +97,7 @@ def _check_subservice( verif_status.step = StatusField.SUCCESS verif_status.step_list.append(pus_1_tm.step_id.val) elif subservice == Subservices.TM_STEP_FAILURE: - self._check_all_replies_recvd_after_step(verif_status) - verif_status.step = StatusField.FAILURE - verif_status.step_list.append(pus_1_tm.step_id.val) - res.completed = True + self._handle_step_failure(verif_status, res, pus_1_tm) elif subservice == Subservices.TM_COMPLETION_SUCCESS: self._check_all_replies_recvd_after_step(verif_status) verif_status.completed = StatusField.SUCCESS @@ -115,6 +112,14 @@ def _check_subservice( def verif_dict(self): return self._verif_dict + def _handle_step_failure( + self, verif_status: VerificationStatus, res: TmCheckResult, pus_1_tm: Service1Tm + ): + self._check_all_replies_recvd_after_step(verif_status) + verif_status.step = StatusField.FAILURE + verif_status.step_list.append(pus_1_tm.step_id.val) + res.completed = True + @staticmethod def _check_all_replies_recvd_after_step(verif_stat: VerificationStatus): if ( From 42c5fe2b66b28117786390b2bb6613b150c7b6ac Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 30 Jun 2022 14:55:33 +0200 Subject: [PATCH 186/221] move pus verificator to space packets --- tests/test_pus_verificator.py | 253 --------------------------------- tmtccmd/pus/pus_verificator.py | 142 ------------------ 2 files changed, 395 deletions(-) delete mode 100644 tests/test_pus_verificator.py delete mode 100644 tmtccmd/pus/pus_verificator.py diff --git a/tests/test_pus_verificator.py b/tests/test_pus_verificator.py deleted file mode 100644 index 7123ca4d..00000000 --- a/tests/test_pus_verificator.py +++ /dev/null @@ -1,253 +0,0 @@ -from typing import Optional, List -from unittest import TestCase - -from spacepackets.ecss import PusTelecommand -from spacepackets.ecss.pus_1_verification import ( - create_acceptance_success_tm, - RequestId, - create_start_success_tm, - create_step_success_tm, - StepId, - create_completion_success_tm, - FailureNotice, - create_acceptance_failure_tm, - create_start_failure_tm, - create_step_failure_tm, - create_completion_failure_tm, - ErrorCode, -) -from tmtccmd.pus.pus_verificator import PusVerificator, StatusField, VerificationStatus - - -class TestSuccessSet: - def __init__(self, pus_tc: PusTelecommand): - self.pus_tc = pus_tc - self.req_id = RequestId.from_pus_tc(pus_tc) - self.acc_suc_tm = create_acceptance_success_tm(pus_tc) - self.sta_suc_tm = create_start_success_tm(pus_tc) - self.ste_suc_tm = create_step_success_tm( - pus_tc, step_id=StepId.with_byte_size(1, 1) - ) - self.fin_suc_tm = create_completion_success_tm(pus_tc) - - -class TestFailureSet: - def __init__(self, pus_tc: PusTelecommand, failure_notice: FailureNotice): - self.suc_set = TestSuccessSet(pus_tc) - self.failure_notice = failure_notice - self.acc_fail_tm = create_acceptance_failure_tm(pus_tc, self.failure_notice) - self.sta_fail_tm = create_start_failure_tm(pus_tc, self.failure_notice) - self.ste_fail_tm = create_step_failure_tm( - pus_tc, - failure_notice=self.failure_notice, - step_id=StepId.with_byte_size(1, 1), - ) - self.fin_fail_tm = create_completion_failure_tm( - failure_notice=self.failure_notice, pus_tc=self.suc_set.pus_tc - ) - - @property - def pus_tc(self): - return self.suc_set.pus_tc - - @property - def req_id(self): - return self.suc_set.req_id - - -class TestPusVerificator(TestCase): - def setUp(self) -> None: - self.pus_verificator = PusVerificator() - - def test_basic(self): - suc_set = TestSuccessSet(PusTelecommand(service=17, subservice=1)) - self.pus_verificator.add_tc(suc_set.pus_tc) - check_res = self.pus_verificator.add_tm(suc_set.acc_suc_tm) - self.assertEqual(check_res.completed, False) - status = check_res.status - self._check_status( - status, - False, - StatusField.SUCCESS, - StatusField.UNSET, - StatusField.UNSET, - [], - StatusField.UNSET, - ) - verif_dict = self.pus_verificator.verif_dict - self.assertEqual(len(verif_dict), 1) - for key, val in verif_dict.items(): - self.assertEqual(key, suc_set.req_id) - self._check_status( - val, - False, - StatusField.SUCCESS, - StatusField.UNSET, - StatusField.UNSET, - [], - StatusField.UNSET, - ) - - def test_complete_verification_clear_completed(self): - self._regular_success_seq( - TestSuccessSet(PusTelecommand(service=17, subservice=1)) - ) - self.pus_verificator.remove_completed_entries() - self.assertEqual(len(self.pus_verificator.verif_dict), 0) - - def test_complete_verification_clear_completed_multi(self): - self._regular_success_seq( - TestSuccessSet(PusTelecommand(service=17, subservice=1, seq_count=0)) - ) - self._regular_success_seq( - TestSuccessSet(PusTelecommand(service=5, subservice=4, seq_count=1)) - ) - self.pus_verificator.remove_completed_entries() - self.assertEqual(len(self.pus_verificator.verif_dict), 0) - - def test_complete_verification_remove_manually(self): - suc_set = TestSuccessSet(PusTelecommand(service=17, subservice=1)) - self._regular_success_seq(suc_set) - self.assertTrue(self.pus_verificator.remove_entry(suc_set.req_id)) - self.assertEqual(len(self.pus_verificator.verif_dict), 0) - - def test_complete_verification_multi_remove_manually(self): - set_0 = TestSuccessSet(PusTelecommand(service=17, subservice=1, seq_count=0)) - self._regular_success_seq(set_0) - set_1 = TestSuccessSet(PusTelecommand(service=5, subservice=4, seq_count=1)) - self._regular_success_seq(set_1) - self.assertTrue(self.pus_verificator.remove_entry(set_0.req_id)) - self.assertEqual(len(self.pus_verificator.verif_dict), 1) - self.assertTrue(self.pus_verificator.remove_entry(set_1.req_id)) - self.assertEqual(len(self.pus_verificator.verif_dict), 0) - - def test_acceptance_failure(self): - notice = FailureNotice(ErrorCode.with_byte_size(1, 8), data=bytes([0, 1])) - fail_set = TestFailureSet( - PusTelecommand(service=17, subservice=1, seq_count=0), notice - ) - self.assertTrue(self.pus_verificator.add_tc(fail_set.pus_tc)) - status = self.pus_verificator.add_tm(fail_set.acc_fail_tm) - self.assertTrue(status.completed) - self.assertTrue(status.req_id_in_dict) - self._check_status( - status.status, - True, - StatusField.FAILURE, - StatusField.UNSET, - StatusField.UNSET, - [], - StatusField.UNSET, - ) - - def test_step_failure(self): - notice = FailureNotice(ErrorCode.with_byte_size(1, 8), data=bytes([0, 1])) - fail_set = TestFailureSet( - PusTelecommand(service=17, subservice=1, seq_count=0), notice - ) - self.assertTrue(self.pus_verificator.add_tc(fail_set.pus_tc)) - status = self.pus_verificator.add_tm(fail_set.suc_set.acc_suc_tm) - self.assertFalse(status.completed) - self.assertTrue(status.req_id_in_dict) - self._check_status( - status.status, - False, - StatusField.SUCCESS, - StatusField.UNSET, - StatusField.UNSET, - [], - StatusField.UNSET, - ) - status = self.pus_verificator.add_tm(fail_set.suc_set.sta_suc_tm) - self.assertFalse(status.completed) - self.assertTrue(status.req_id_in_dict) - self._check_status( - status.status, - False, - StatusField.SUCCESS, - StatusField.SUCCESS, - StatusField.UNSET, - [], - StatusField.UNSET, - ) - status = self.pus_verificator.add_tm(fail_set.ste_fail_tm) - self.assertTrue(status.completed) - self.assertTrue(status.req_id_in_dict) - self._check_status( - status.status, - True, - StatusField.SUCCESS, - StatusField.SUCCESS, - StatusField.FAILURE, - [1], - StatusField.UNSET, - ) - - def _regular_success_seq(self, suc_set: TestSuccessSet): - self.assertTrue(self.pus_verificator.add_tc(suc_set.pus_tc)) - check_res = self.pus_verificator.add_tm(suc_set.acc_suc_tm) - self.assertTrue(check_res.req_id_in_dict) - status = check_res.status - self._check_status( - status, - False, - StatusField.SUCCESS, - StatusField.UNSET, - StatusField.UNSET, - [], - StatusField.UNSET, - ) - check_res = self.pus_verificator.add_tm(suc_set.sta_suc_tm) - self.assertTrue(check_res.req_id_in_dict) - status = check_res.status - self._check_status( - status, - False, - StatusField.SUCCESS, - StatusField.SUCCESS, - StatusField.UNSET, - [], - StatusField.UNSET, - ) - check_res = self.pus_verificator.add_tm(suc_set.ste_suc_tm) - self.assertTrue(check_res.req_id_in_dict) - status = check_res.status - self._check_status( - status, - False, - StatusField.SUCCESS, - StatusField.SUCCESS, - StatusField.SUCCESS, - [1], - StatusField.UNSET, - ) - check_res = self.pus_verificator.add_tm(suc_set.fin_suc_tm) - self.assertTrue(check_res.req_id_in_dict) - status = check_res.status - self._check_status( - status, - True, - StatusField.SUCCESS, - StatusField.SUCCESS, - StatusField.SUCCESS, - [1], - StatusField.SUCCESS, - ) - - def _check_status( - self, - status: Optional[VerificationStatus], - all_verifs: bool, - acc_st: StatusField, - sta_st: StatusField, - step_st: StatusField, - step_list: List[int], - fin_st: StatusField, - ): - self.assertIsNotNone(status) - self.assertEqual(status.all_verifs_recvd, all_verifs) - self.assertEqual(status.accepted, acc_st) - self.assertEqual(status.step, step_st) - self.assertEqual(status.step_list, step_list) - self.assertEqual(status.started, sta_st) - self.assertEqual(status.completed, fin_st) diff --git a/tmtccmd/pus/pus_verificator.py b/tmtccmd/pus/pus_verificator.py deleted file mode 100644 index 224b4b2a..00000000 --- a/tmtccmd/pus/pus_verificator.py +++ /dev/null @@ -1,142 +0,0 @@ -import enum -from dataclasses import dataclass, field -from typing import Dict, Optional, List - -from spacepackets.ecss import PusTelecommand -from spacepackets.ecss.pus_1_verification import RequestId, Service1Tm, Subservices - - -class StatusField(enum.IntEnum): - UNSET = -1 - FAILURE = 0 - SUCCESS = 1 - - -@dataclass -class VerificationStatus: - all_verifs_recvd: bool = False - accepted: StatusField = StatusField.UNSET - started: StatusField = StatusField.UNSET - step: StatusField = StatusField.UNSET - step_list: List[int] = field(default_factory=lambda: []) - completed: StatusField = StatusField.UNSET - - -VerifDictT = Dict[RequestId, VerificationStatus] - - -@dataclass -class TmCheckResult: - """Result type for a TM check. - - Special note on the completed flag: This flag indicates that - any of the steps have failed or there was a completion success. This does not mean that - all related verification packets have been received for the respective telecommand. If all - packets were received, the :py:attr:`VerificationStatus.all_verifs_recvd` field will bet - set to True - """ - - req_id_in_dict: bool - status: Optional[VerificationStatus] - completed: bool - - -class PusVerificator: - def __init__(self): - self._verif_dict: VerifDictT = dict() - pass - - def add_tc(self, tc: PusTelecommand) -> bool: - req_id = RequestId.from_sp_header(tc.sp_header) - if req_id in self._verif_dict: - return False - self._verif_dict.update({req_id: VerificationStatus()}) - return True - - def add_tm(self, pus_1_tm: Service1Tm) -> TmCheckResult: - req_id = pus_1_tm.tc_req_id - res = TmCheckResult(False, None, False) - if req_id not in self._verif_dict: - return res - res.req_id_in_dict = True - verif_status = self._verif_dict.get(req_id) - if pus_1_tm.subservice <= 0 or pus_1_tm.subservice > 8: - raise ValueError( - f"PUS 1 TM with invalid subservice {pus_1_tm.subservice} was passed" - ) - res.status = verif_status - - return self._check_subservice(pus_1_tm, res, verif_status) - - def _check_subservice( - self, - pus_1_tm: Service1Tm, - res: TmCheckResult, - verif_status: VerificationStatus, - ) -> TmCheckResult: - subservice = pus_1_tm.subservice - if subservice % 2 == 0: - # For failures, verification handling is completed - res.completed = True - if subservice == Subservices.TM_ACCEPTANCE_SUCCESS: - verif_status.accepted = StatusField.SUCCESS - elif subservice == Subservices.TM_ACCEPTANCE_FAILURE: - verif_status.all_verifs_recvd = True - verif_status.accepted = StatusField.FAILURE - res.completed = True - elif subservice == Subservices.TM_START_SUCCESS: - verif_status.started = StatusField.SUCCESS - elif subservice == Subservices.TM_START_FAILURE: - res.completed = True - if verif_status.accepted != StatusField.UNSET: - verif_status.all_verifs_recvd = True - verif_status.started = StatusField.FAILURE - elif subservice == Subservices.TM_STEP_SUCCESS: - # Do not overwrite a failed step status - if verif_status.step == StatusField.UNSET: - verif_status.step = StatusField.SUCCESS - verif_status.step_list.append(pus_1_tm.step_id.val) - elif subservice == Subservices.TM_STEP_FAILURE: - self._handle_step_failure(verif_status, res, pus_1_tm) - elif subservice == Subservices.TM_COMPLETION_SUCCESS: - self._check_all_replies_recvd_after_step(verif_status) - verif_status.completed = StatusField.SUCCESS - res.completed = True - elif subservice == Subservices.TM_COMPLETION_FAILURE: - self._check_all_replies_recvd_after_step(verif_status) - verif_status.completed = StatusField.FAILURE - res.completed = True - return res - - @property - def verif_dict(self): - return self._verif_dict - - def _handle_step_failure( - self, verif_status: VerificationStatus, res: TmCheckResult, pus_1_tm: Service1Tm - ): - self._check_all_replies_recvd_after_step(verif_status) - verif_status.step = StatusField.FAILURE - verif_status.step_list.append(pus_1_tm.step_id.val) - res.completed = True - - @staticmethod - def _check_all_replies_recvd_after_step(verif_stat: VerificationStatus): - if ( - verif_stat.accepted != StatusField.UNSET - and verif_stat.started != StatusField.UNSET - ): - verif_stat.all_verifs_recvd = True - - def remove_completed_entries(self): - self._verif_dict = { - key: val - for key, val in self._verif_dict.items() - if not val.all_verifs_recvd - } - - def remove_entry(self, req_id: RequestId) -> bool: - if req_id in self._verif_dict: - del self._verif_dict[req_id] - return True - return False From 94249f87a4040e3340254af165a2dd8ad8c8876d Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 30 Jun 2022 15:19:45 +0200 Subject: [PATCH 187/221] added ABC derivations and seqcnt disk handler --- tmtccmd/config/hook.py | 4 ++-- tmtccmd/pus/seqcnt.py | 36 ++++++++++++++++++++++++++++++++++++ tmtccmd/tc/handler.py | 4 ++-- tmtccmd/tm/__init__.py | 11 ++++++++--- 4 files changed, 48 insertions(+), 7 deletions(-) create mode 100644 tmtccmd/pus/seqcnt.py diff --git a/tmtccmd/config/hook.py b/tmtccmd/config/hook.py index 55595529..e26674fc 100644 --- a/tmtccmd/config/hook.py +++ b/tmtccmd/config/hook.py @@ -1,5 +1,5 @@ from typing import Optional -from abc import abstractmethod +from abc import abstractmethod, ABC from tmtccmd.utility.obj_id import ObjectIdDictT from tmtccmd.com_if import ComInterface @@ -11,7 +11,7 @@ from .defs import default_json_path, CORE_COM_IF_DICT, ComIfDictT -class TmTcCfgHookBase: +class TmTcCfgHookBase(ABC): """This hook allows users to adapt the TMTC commander core to the unique mission requirements. It is used by implementing all abstract functions and then passing the instance to the TMTC commander core. diff --git a/tmtccmd/pus/seqcnt.py b/tmtccmd/pus/seqcnt.py new file mode 100644 index 00000000..dd60598b --- /dev/null +++ b/tmtccmd/pus/seqcnt.py @@ -0,0 +1,36 @@ +from abc import abstractmethod, ABC +from pathlib import Path + + +class ProvidesSeqCount(ABC): + @abstractmethod + def next_seq_count(self) -> int: + pass + + +class FileSeqCountProvider(ProvidesSeqCount): + def __init__(self, file_name: Path = "seqcnt.txt"): + self.file_name = file_name + if not self.file_name.exists(): + self.create_new() + + def create_new(self): + with open(self.file_name, "w") as file: + file.write("0\n") + + def __next__(self): + if not self.file_name.exists(): + raise FileNotFoundError(f"{self.file_name} file does not exist") + with open(self.file_name, "r+") as file: + line = file.readline() + if not line.isdigit(): + raise ValueError("Sequence count file content is invalid") + curr_seq_cnt = int(line) + curr_seq_cnt += 1 + file.seek(0) + file.write(f"{curr_seq_cnt}\n") + return curr_seq_cnt + return -1 + + def next_seq_count(self) -> int: + return self.__next__() diff --git a/tmtccmd/tc/handler.py b/tmtccmd/tc/handler.py index 30c3d031..8d28ff1e 100644 --- a/tmtccmd/tc/handler.py +++ b/tmtccmd/tc/handler.py @@ -1,4 +1,4 @@ -from abc import abstractmethod +from abc import abstractmethod, ABC from tmtccmd.com_if import ComInterface from tmtccmd.tc import TcQueueEntryBase, TcProcedureBase @@ -15,7 +15,7 @@ def __init__(self, queue_wrapper: QueueWrapper, auto_dispatch: bool): self.modes = ModeWrapper() -class TcHandlerBase: +class TcHandlerBase(ABC): """Generic abstraction for a TC handler object. This object then takes care of sending packets by providing a send callback. It also provides telecommand queues by providing a queue fedder callback. diff --git a/tmtccmd/tm/__init__.py b/tmtccmd/tm/__init__.py index dc105a1c..bfb9df4a 100644 --- a/tmtccmd/tm/__init__.py +++ b/tmtccmd/tm/__init__.py @@ -1,5 +1,5 @@ import enum -from abc import abstractmethod +from abc import abstractmethod, ABC from typing import Deque, List, Union, Dict, Optional from spacepackets.ecss import PusTelemetry @@ -38,7 +38,7 @@ def get_type(self): return self._tm_type -class ApidTmHandlerBase: +class ApidTmHandlerBase(ABC): """Handler base for space packets with an APID. If a packet is received for a certain APID, the :py:func:`handle_tm` function will be called""" @@ -51,11 +51,16 @@ def handle_tm(self, _packet: bytes, _user_args: any): LOGGER.warning(f"No TM handling implemented for APID {self.apid}") -class UnknownApidHandlerBase: +class UnknownApidHandlerBase(ABC): def __init__(self, user_args: any): self.user_args: any = user_args @abstractmethod + def handle_tm(self, apid: int, _packet: bytes, _user_args: any): + pass + + +class DefaultUnknownHandler(UnknownApidHandlerBase): def handle_tm(self, apid: int, _packet: bytes, _user_args: any): LOGGER.warning(f"No TM handling implemented for unknown APID {apid}") From 1aeeb4c9ae68598b558e8b723b30f31bac159a2d Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 30 Jun 2022 15:55:00 +0200 Subject: [PATCH 188/221] add sequence count provider and its test --- tests/test_seq_cnt_provider.py | 60 ++++++++++++++++++++++++++++++++++ tmtccmd/pus/__init__.py | 1 + tmtccmd/pus/seqcnt.py | 37 +++++++++++++++++---- 3 files changed, 91 insertions(+), 7 deletions(-) create mode 100644 tests/test_seq_cnt_provider.py diff --git a/tests/test_seq_cnt_provider.py b/tests/test_seq_cnt_provider.py new file mode 100644 index 00000000..120e1835 --- /dev/null +++ b/tests/test_seq_cnt_provider.py @@ -0,0 +1,60 @@ +import os +from pathlib import Path +from unittest import TestCase + +from tmtccmd.pus.seqcnt import FileSeqCountProvider +from tempfile import NamedTemporaryFile + + +class TestSeqCount(TestCase): + def setUp(self) -> None: + self.file_name = Path("seq_cnt.txt") + + def test_basic(self): + with NamedTemporaryFile("w+t") as file: + file.write("0\n") + file.seek(0) + seq_cnt_provider = FileSeqCountProvider(Path(file.name)) + seq_cnt = seq_cnt_provider.current() + self.assertEqual(seq_cnt, 0) + self.assertEqual(next(seq_cnt_provider), 1) + self.assertEqual(seq_cnt_provider.next_seq_count(), 2) + file.seek(0) + file.write(f"{pow(2, 14) - 1}\n") + file.flush() + # Assert rollover + self.assertEqual(next(seq_cnt_provider), 0) + + def test_with_real_file(self): + seq_cnt_provider = FileSeqCountProvider(self.file_name) + self.assertTrue(self.file_name.exists()) + self.assertEqual(seq_cnt_provider.current(), 0) + self.assertEqual(next(seq_cnt_provider), 1) + pass + + def test_file_deleted_runtime(self): + seq_cnt_provider = FileSeqCountProvider(self.file_name) + self.assertTrue(self.file_name.exists()) + os.remove(self.file_name) + with self.assertRaises(FileNotFoundError): + next(seq_cnt_provider) + with self.assertRaises(FileNotFoundError): + seq_cnt_provider.current() + + def test_faulty_file_entry(self): + with NamedTemporaryFile("w+t") as file: + file.write("-1\n") + file.seek(0) + seq_cnt_provider = FileSeqCountProvider(Path(file.name)) + with self.assertRaises(ValueError): + next(seq_cnt_provider) + file.write(f"{pow(2, 15)}\n") + file.seek(0) + file.flush() + seq_cnt_provider = FileSeqCountProvider(Path(file.name)) + with self.assertRaises(ValueError): + next(seq_cnt_provider) + + def tearDown(self) -> None: + if self.file_name.exists(): + os.remove(self.file_name) diff --git a/tmtccmd/pus/__init__.py b/tmtccmd/pus/__init__.py index 12eaa20a..c739235a 100644 --- a/tmtccmd/pus/__init__.py +++ b/tmtccmd/pus/__init__.py @@ -1,5 +1,6 @@ from enum import IntEnum from spacepackets.ecss.defs import PusServices +from .seqcnt import FileSeqCountProvider, ProvidesSeqCount class CustomPusServices(IntEnum): diff --git a/tmtccmd/pus/seqcnt.py b/tmtccmd/pus/seqcnt.py index dd60598b..646cfd7f 100644 --- a/tmtccmd/pus/seqcnt.py +++ b/tmtccmd/pus/seqcnt.py @@ -5,7 +5,9 @@ class ProvidesSeqCount(ABC): @abstractmethod def next_seq_count(self) -> int: - pass + raise NotImplementedError( + "Please use a concrete class implementing this method" + ) class FileSeqCountProvider(ProvidesSeqCount): @@ -18,19 +20,40 @@ def create_new(self): with open(self.file_name, "w") as file: file.write("0\n") + def current(self) -> int: + if not self.file_name.exists(): + raise FileNotFoundError(f"{self.file_name} file does not exist") + with open(self.file_name) as file: + return self.check_count(file.readline()) + def __next__(self): if not self.file_name.exists(): raise FileNotFoundError(f"{self.file_name} file does not exist") with open(self.file_name, "r+") as file: - line = file.readline() - if not line.isdigit(): - raise ValueError("Sequence count file content is invalid") - curr_seq_cnt = int(line) - curr_seq_cnt += 1 + curr_seq_cnt = self.increment_with_rollover( + self.check_count(file.readline()) + ) file.seek(0) file.write(f"{curr_seq_cnt}\n") return curr_seq_cnt - return -1 + + @staticmethod + def check_count(line: str) -> int: + line = line.rstrip() + if not line.isdigit(): + raise ValueError("Sequence count file content is invalid") + curr_seq_cnt = int(line) + if curr_seq_cnt < 0 or curr_seq_cnt > pow(2, 14) - 1: + raise ValueError("Sequence count in file has invalid value") + return curr_seq_cnt def next_seq_count(self) -> int: return self.__next__() + + @staticmethod + def increment_with_rollover(seq_cnt: int) -> int: + """CCSDS Sequence count has maximum size of 14 bit. Rollover after that size by default""" + if seq_cnt >= pow(2, 14) - 1: + return 0 + else: + return seq_cnt + 1 From 406bb0c8b861de7e045738d1f958db95b460693a Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 30 Jun 2022 15:56:45 +0200 Subject: [PATCH 189/221] bump code cov uploader --- .github/workflows/package.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/package.yml b/.github/workflows/package.yml index f9801675..15350519 100644 --- a/.github/workflows/package.yml +++ b/.github/workflows/package.yml @@ -37,7 +37,7 @@ jobs: coverage run -m pytest - name: Upload coverage to Codecov - uses: codecov/codecov-action@v1 + uses: codecov/codecov-action@v3 with: flags: unittests name: codecov-umbrella From da0b6f3fd99f1e6d40721fab7a3f25bbc028ecbb Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 30 Jun 2022 16:29:45 +0200 Subject: [PATCH 190/221] import change --- tmtccmd/tc/pus_20_params.py | 2 +- tmtccmd/tm/pus_20_fsfw_parameters.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tmtccmd/tc/pus_20_params.py b/tmtccmd/tc/pus_20_params.py index 081b940e..1df828ae 100644 --- a/tmtccmd/tc/pus_20_params.py +++ b/tmtccmd/tc/pus_20_params.py @@ -3,7 +3,7 @@ import struct from typing import Optional -from spacepackets.ecss.field import Ptc, PfcUnsigned, PfcReal +from spacepackets.ecss.fields import Ptc, PfcUnsigned, PfcReal from tmtccmd.pus.pus_20_params import ( CustomSubservices, ) diff --git a/tmtccmd/tm/pus_20_fsfw_parameters.py b/tmtccmd/tm/pus_20_fsfw_parameters.py index e284a6f9..88eaee08 100644 --- a/tmtccmd/tm/pus_20_fsfw_parameters.py +++ b/tmtccmd/tm/pus_20_fsfw_parameters.py @@ -3,7 +3,7 @@ import struct from typing import Optional -from spacepackets.ecss.field import Ptc, PfcUnsigned, PfcSigned, PfcReal +from spacepackets.ecss.fields import Ptc, PfcUnsigned, PfcSigned, PfcReal from spacepackets.ecss.tm import CdsShortTimestamp, PusVersion, PusTelemetry from spacepackets.ecss.defs import PusServices From 2e59412f24bb7452e60ef4d40d9a4ec91844678a Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 30 Jun 2022 16:31:35 +0200 Subject: [PATCH 191/221] bump required spacepackets version --- setup.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.cfg b/setup.cfg index e3e1a8c2..33c0e9af 100644 --- a/setup.cfg +++ b/setup.cfg @@ -32,7 +32,7 @@ install_requires = colorama>=0.4.4 colorlog>=6.6.0 dle-encoder>=0.2 - spacepackets>=0.11 + spacepackets>=0.12.1 prompt-toolkit>=3.0.28 package_dir = = . From ad23d29824aaa852164f471d674163096bb30596 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 30 Jun 2022 16:41:38 +0200 Subject: [PATCH 192/221] some tests do not work on windows --- tests/test_seq_cnt_provider.py | 53 ++++++++++++++++++---------------- 1 file changed, 28 insertions(+), 25 deletions(-) diff --git a/tests/test_seq_cnt_provider.py b/tests/test_seq_cnt_provider.py index 120e1835..f9750f64 100644 --- a/tests/test_seq_cnt_provider.py +++ b/tests/test_seq_cnt_provider.py @@ -1,5 +1,6 @@ import os from pathlib import Path +import platform from unittest import TestCase from tmtccmd.pus.seqcnt import FileSeqCountProvider @@ -11,19 +12,20 @@ def setUp(self) -> None: self.file_name = Path("seq_cnt.txt") def test_basic(self): - with NamedTemporaryFile("w+t") as file: - file.write("0\n") - file.seek(0) - seq_cnt_provider = FileSeqCountProvider(Path(file.name)) - seq_cnt = seq_cnt_provider.current() - self.assertEqual(seq_cnt, 0) - self.assertEqual(next(seq_cnt_provider), 1) - self.assertEqual(seq_cnt_provider.next_seq_count(), 2) - file.seek(0) - file.write(f"{pow(2, 14) - 1}\n") - file.flush() - # Assert rollover - self.assertEqual(next(seq_cnt_provider), 0) + if platform.system() != "Windows": + with NamedTemporaryFile("w+t") as file: + file.write("0\n") + file.seek(0) + seq_cnt_provider = FileSeqCountProvider(Path(file.name)) + seq_cnt = seq_cnt_provider.current() + self.assertEqual(seq_cnt, 0) + self.assertEqual(next(seq_cnt_provider), 1) + self.assertEqual(seq_cnt_provider.next_seq_count(), 2) + file.seek(0) + file.write(f"{pow(2, 14) - 1}\n") + file.flush() + # Assert rollover + self.assertEqual(next(seq_cnt_provider), 0) def test_with_real_file(self): seq_cnt_provider = FileSeqCountProvider(self.file_name) @@ -42,18 +44,19 @@ def test_file_deleted_runtime(self): seq_cnt_provider.current() def test_faulty_file_entry(self): - with NamedTemporaryFile("w+t") as file: - file.write("-1\n") - file.seek(0) - seq_cnt_provider = FileSeqCountProvider(Path(file.name)) - with self.assertRaises(ValueError): - next(seq_cnt_provider) - file.write(f"{pow(2, 15)}\n") - file.seek(0) - file.flush() - seq_cnt_provider = FileSeqCountProvider(Path(file.name)) - with self.assertRaises(ValueError): - next(seq_cnt_provider) + if platform.system() != "Windows": + with NamedTemporaryFile("w+t") as file: + file.write("-1\n") + file.seek(0) + seq_cnt_provider = FileSeqCountProvider(Path(file.name)) + with self.assertRaises(ValueError): + next(seq_cnt_provider) + file.write(f"{pow(2, 15)}\n") + file.seek(0) + file.flush() + seq_cnt_provider = FileSeqCountProvider(Path(file.name)) + with self.assertRaises(ValueError): + next(seq_cnt_provider) def tearDown(self) -> None: if self.file_name.exists(): From c8f19c63ac03490f6180299b8923b6fae87102d4 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 30 Jun 2022 18:05:50 +0200 Subject: [PATCH 193/221] finished verification logger --- tests/test_pus_verif_log.py | 67 +++++++++++++++++++++ tmtccmd/pus/__init__.py | 112 ++++++++++++++++++++++++++++++++++++ 2 files changed, 179 insertions(+) create mode 100644 tests/test_pus_verif_log.py diff --git a/tests/test_pus_verif_log.py b/tests/test_pus_verif_log.py new file mode 100644 index 00000000..9bae1ca3 --- /dev/null +++ b/tests/test_pus_verif_log.py @@ -0,0 +1,67 @@ +from unittest import TestCase + +from spacepackets.ecss import PusTelecommand +from spacepackets.ecss.pus_1_verification import ( + create_acceptance_success_tm, + create_start_success_tm, + create_step_success_tm, + StepId, + create_completion_success_tm, + create_acceptance_failure_tm, + FailureNotice, + ErrorCode, + create_start_failure_tm, +) +from spacepackets.ecss.pus_verificator import PusVerificator +from tmtccmd import get_console_logger +from tmtccmd.pus import VerificationWrapper + + +class TestPusVerifLog(TestCase): + def test_console_log_success(self): + logger = get_console_logger() + wrapper = VerificationWrapper(logger) + verificator = wrapper.verificator + tc = PusTelecommand(service=17, subservice=1, seq_count=0) + verificator.add_tc(tc) + srv_1_tm = create_acceptance_success_tm(tc) + res = verificator.add_tm(srv_1_tm) + wrapper.log_to_console(srv_1_tm, res) + srv_1_tm = create_start_success_tm(tc) + res = verificator.add_tm(srv_1_tm) + wrapper.log_to_console(srv_1_tm, res) + srv_1_tm = create_step_success_tm(tc, StepId.with_byte_size(1, 1)) + res = verificator.add_tm(srv_1_tm) + wrapper.log_to_console(srv_1_tm, res) + srv_1_tm = create_completion_success_tm(tc) + res = verificator.add_tm(srv_1_tm) + wrapper.log_to_console(srv_1_tm, res) + + def test_console_log_acc_failure(self): + logger = get_console_logger() + wrapper = VerificationWrapper(logger) + verificator = wrapper.verificator + tc = PusTelecommand(service=17, subservice=1, seq_count=1) + verificator.add_tc(tc) + srv_1_tm = create_acceptance_failure_tm( + tc, failure_notice=FailureNotice(code=ErrorCode(pfc=8, val=1), data=bytes()) + ) + res = verificator.add_tm(srv_1_tm) + wrapper.log_to_console(srv_1_tm, res) + + def test_console_log_start_failure(self): + logger = get_console_logger() + wrapper = VerificationWrapper(logger) + verificator = wrapper.verificator + tc = PusTelecommand(service=17, subservice=1, seq_count=2) + verificator.add_tc(tc) + srv_1_tm = create_acceptance_failure_tm( + tc, failure_notice=FailureNotice(code=ErrorCode(pfc=8, val=1), data=bytes()) + ) + res = verificator.add_tm(srv_1_tm) + wrapper.log_to_console(srv_1_tm, res) + srv_1_tm = create_start_failure_tm( + tc, failure_notice=FailureNotice(code=ErrorCode(pfc=8, val=1), data=bytes()) + ) + res = verificator.add_tm(srv_1_tm) + wrapper.log_to_console(srv_1_tm, res) diff --git a/tmtccmd/pus/__init__.py b/tmtccmd/pus/__init__.py index c739235a..f945b8c7 100644 --- a/tmtccmd/pus/__init__.py +++ b/tmtccmd/pus/__init__.py @@ -1,7 +1,119 @@ from enum import IntEnum +from typing import Optional + +from spacepackets.ecss import PusTelecommand from spacepackets.ecss.defs import PusServices +from spacepackets.ecss.pus_1_verification import RequestId +import spacepackets.ecss.pus_1_verification as pus_1 +from spacepackets.ecss.pus_verificator import ( + VerificationStatus, + StatusField, + PusVerificator, + TmCheckResult, +) from .seqcnt import FileSeqCountProvider, ProvidesSeqCount +import logging + +from tmtccmd.utility.conf_util import AnsiColors class CustomPusServices(IntEnum): SERVICE_200_MODE = 200 + + +class VerificationWrapper: + def __init__(self, logger: logging.Logger): + self.pus_verificator = PusVerificator() + self.logger = logger + self.with_colors = True + + @property + def verificator(self) -> PusVerificator: + return self.pus_verificator + + def add_tc(self, pus_tc: PusTelecommand) -> bool: + return self.pus_verificator.add_tc(pus_tc) + + def log_to_console(self, srv_1_tm: pus_1.Service1Tm, res: TmCheckResult): + self.log_to_console_from_req_id(srv_1_tm.tc_req_id, res, srv_1_tm.subservice) + + def log_to_console_from_req_id( + self, + req_id: RequestId, + res: TmCheckResult, + subservice: Optional[pus_1.Subservices] = None, + ): + return self.log_progress_to_console_from_status(res.status, req_id, subservice) + + def log_progress_to_console_from_status( + self, + status: VerificationStatus, + req_id: RequestId, + subservice: Optional[pus_1.Subservices] = None, + ): + acc_char = gen_char_from_status(status.accepted, self.with_colors) + start_char = gen_char_from_status(status.started, self.with_colors) + step_char = gen_char_from_status(status.step, self.with_colors) + fin_char = gen_char_from_status(status.completed, self.with_colors) + if not status.step_list: + step_num = 0 + else: + step_num = max(status.step_list) + status_str = "Status" + if subservice is not None: + if subservice == pus_1.Subservices.TM_ACCEPTANCE_SUCCESS: + status_str = "Acceptance success" + elif subservice == pus_1.Subservices.TM_ACCEPTANCE_FAILURE: + status_str = "Acceptance failure" + elif subservice == pus_1.Subservices.TM_START_SUCCESS: + status_str = "Start success" + elif subservice == pus_1.Subservices.TM_START_FAILURE: + status_str = "Start failure" + elif subservice == pus_1.Subservices.TM_STEP_SUCCESS: + status_str = "Step success" + elif subservice == pus_1.Subservices.TM_STEP_FAILURE: + status_str = "Step failure" + elif subservice == pus_1.Subservices.TM_COMPLETION_SUCCESS: + status_str = "Completion success" + elif subservice == pus_1.Subservices.TM_COMPLETION_FAILURE: + status_str = "Completion failure" + first_str = f"{status_str} of TC".ljust(25) + second_str = f"Request ID {req_id.as_u32():#04x}" + completion_str = "" + if status.completed == StatusField.SUCCESS: + completion_str = f" \U0001F31F" + third_str = ( + f"acc ({acc_char}) sta ({start_char}) ste ({step_char}, {step_num}) " + f"fin ({fin_char}){completion_str}" + ) + self.logger.info(f"{first_str} | {second_str} | {third_str}") + + +def gen_char_from_status(status: StatusField, with_color: bool): + if status == StatusField.UNSET: + return dash_unicode(with_color) + elif status == StatusField.SUCCESS: + return tick_mark_unicode(with_color) + elif status == StatusField.FAILURE: + return cross_mark_unicode(with_color) + + +def dash_unicode(with_color: bool) -> str: + if with_color: + return f"{AnsiColors.YELLOW}-{AnsiColors.RESET}" + else: + return "-" + + +def tick_mark_unicode(with_color: bool) -> str: + if with_color: + return f"{AnsiColors.GREEN}\u2713{AnsiColors.RESET}" + else: + return "\u2713" + + +def cross_mark_unicode(with_color: bool) -> str: + if with_color: + return f"{AnsiColors.RED}\u274c{AnsiColors.RESET}" + else: + return "\u274c" From 404e5841a43d0a5b6be2f72d500a587386dc5cad Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 30 Jun 2022 18:21:16 +0200 Subject: [PATCH 194/221] add file logger as well --- tests/test_pus_verif_log.py | 18 +++++++++ tmtccmd/pus/__init__.py | 77 ++++++++++++++++++++++++++++--------- 2 files changed, 76 insertions(+), 19 deletions(-) diff --git a/tests/test_pus_verif_log.py b/tests/test_pus_verif_log.py index 9bae1ca3..d850ceb4 100644 --- a/tests/test_pus_verif_log.py +++ b/tests/test_pus_verif_log.py @@ -21,6 +21,15 @@ class TestPusVerifLog(TestCase): def test_console_log_success(self): logger = get_console_logger() wrapper = VerificationWrapper(logger) + self._test_success(wrapper) + + def test_console_log_success_without_colors(self): + logger = get_console_logger() + wrapper = VerificationWrapper(logger) + wrapper.with_colors = False + self._test_success(wrapper) + + def _test_success(self, wrapper: VerificationWrapper): verificator = wrapper.verificator tc = PusTelecommand(service=17, subservice=1, seq_count=0) verificator.add_tc(tc) @@ -40,6 +49,15 @@ def test_console_log_success(self): def test_console_log_acc_failure(self): logger = get_console_logger() wrapper = VerificationWrapper(logger) + self._test_acc_failure(wrapper) + + def test_console_log_acc_failure_without_colors(self): + logger = get_console_logger() + wrapper = VerificationWrapper(logger) + wrapper.with_colors = False + self._test_acc_failure(wrapper) + + def _test_acc_failure(self, wrapper: VerificationWrapper): verificator = wrapper.verificator tc = PusTelecommand(service=17, subservice=1, seq_count=1) verificator.add_tc(tc) diff --git a/tmtccmd/pus/__init__.py b/tmtccmd/pus/__init__.py index f945b8c7..d8396951 100644 --- a/tmtccmd/pus/__init__.py +++ b/tmtccmd/pus/__init__.py @@ -22,9 +22,10 @@ class CustomPusServices(IntEnum): class VerificationWrapper: - def __init__(self, logger: logging.Logger): + def __init__(self, console_logger: logging.Logger): self.pus_verificator = PusVerificator() - self.logger = logger + self.console_logger = console_logger + self.file_logger: Optional[logging.Logger] = None self.with_colors = True @property @@ -45,20 +46,58 @@ def log_to_console_from_req_id( ): return self.log_progress_to_console_from_status(res.status, req_id, subservice) + def log_progress_to_file_from_status( + self, + status: VerificationStatus, + req_id: RequestId, + subservice: Optional[pus_1.Subservices] = None, + ): + if self.file_logger is None: + raise ValueError("No valid file logger was set") + acc_char = gen_file_char_from_status(status.accepted) + start_char = gen_file_char_from_status(status.started) + step_char = gen_file_char_from_status(status.step) + fin_char = gen_file_char_from_status(status.completed) + step_num = self.step_num(status) + first_str = self._get_info_string(subservice) + second_str = f"Request ID {req_id.as_u32():#04x}" + third_str = ( + f"acc ({acc_char}) sta ({start_char}) ste ({step_char}, {step_num}) " + f"fin ({fin_char})" + ) + self.file_logger.info(f"{first_str} | {second_str} | {third_str}") + def log_progress_to_console_from_status( self, status: VerificationStatus, req_id: RequestId, subservice: Optional[pus_1.Subservices] = None, ): - acc_char = gen_char_from_status(status.accepted, self.with_colors) - start_char = gen_char_from_status(status.started, self.with_colors) - step_char = gen_char_from_status(status.step, self.with_colors) - fin_char = gen_char_from_status(status.completed, self.with_colors) + acc_char = gen_console_char_from_status(status.accepted, self.with_colors) + start_char = gen_console_char_from_status(status.started, self.with_colors) + step_char = gen_console_char_from_status(status.step, self.with_colors) + fin_char = gen_console_char_from_status(status.completed, self.with_colors) + step_num = self.step_num(status) + first_str = self._get_info_string(subservice) + second_str = f"Request ID {req_id.as_u32():#04x}" + completion_str = "" + if status.completed == StatusField.SUCCESS: + completion_str = f" \U0001F31F" + third_str = ( + f"acc ({acc_char}) sta ({start_char}) ste ({step_char}, {step_num}) " + f"fin ({fin_char}){completion_str}" + ) + self.console_logger.info(f"{first_str} | {second_str} | {third_str}") + + @staticmethod + def step_num(status: VerificationStatus): if not status.step_list: - step_num = 0 + return "0" else: - step_num = max(status.step_list) + return f"{max(status.step_list)}" + + @staticmethod + def _get_info_string(subservice: pus_1.Subservices): status_str = "Status" if subservice is not None: if subservice == pus_1.Subservices.TM_ACCEPTANCE_SUCCESS: @@ -77,19 +116,19 @@ def log_progress_to_console_from_status( status_str = "Completion success" elif subservice == pus_1.Subservices.TM_COMPLETION_FAILURE: status_str = "Completion failure" - first_str = f"{status_str} of TC".ljust(25) - second_str = f"Request ID {req_id.as_u32():#04x}" - completion_str = "" - if status.completed == StatusField.SUCCESS: - completion_str = f" \U0001F31F" - third_str = ( - f"acc ({acc_char}) sta ({start_char}) ste ({step_char}, {step_num}) " - f"fin ({fin_char}){completion_str}" - ) - self.logger.info(f"{first_str} | {second_str} | {third_str}") + return f"{status_str} of TC".ljust(25) + + +def gen_file_char_from_status(status: StatusField): + if status == StatusField.UNSET: + return "-" + elif status == StatusField.FAILURE: + return "F" + elif status == StatusField.SUCCESS: + return "S" -def gen_char_from_status(status: StatusField, with_color: bool): +def gen_console_char_from_status(status: StatusField, with_color: bool): if status == StatusField.UNSET: return dash_unicode(with_color) elif status == StatusField.SUCCESS: From 6a54c280b8cd4f2ff11bc88e894df1835f4887a3 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 30 Jun 2022 18:34:12 +0200 Subject: [PATCH 195/221] tested file logger --- tests/test_pus_verif_log.py | 44 ++++++++++++++++++++++++++++++++----- tmtccmd/pus/__init__.py | 29 ++++++++++++++++++++---- 2 files changed, 64 insertions(+), 9 deletions(-) diff --git a/tests/test_pus_verif_log.py b/tests/test_pus_verif_log.py index d850ceb4..e68a1bc8 100644 --- a/tests/test_pus_verif_log.py +++ b/tests/test_pus_verif_log.py @@ -1,3 +1,5 @@ +import os +from pathlib import Path from unittest import TestCase from spacepackets.ecss import PusTelecommand @@ -14,18 +16,22 @@ ) from spacepackets.ecss.pus_verificator import PusVerificator from tmtccmd import get_console_logger +from tmtccmd.logging.pus import RegularTmtcLogWrapper from tmtccmd.pus import VerificationWrapper class TestPusVerifLog(TestCase): + def setUp(self) -> None: + self.log_file_name = RegularTmtcLogWrapper.get_current_tmtc_file_name() + def test_console_log_success(self): logger = get_console_logger() - wrapper = VerificationWrapper(logger) + wrapper = VerificationWrapper(logger, None) self._test_success(wrapper) def test_console_log_success_without_colors(self): logger = get_console_logger() - wrapper = VerificationWrapper(logger) + wrapper = VerificationWrapper(logger, None) wrapper.with_colors = False self._test_success(wrapper) @@ -48,12 +54,12 @@ def _test_success(self, wrapper: VerificationWrapper): def test_console_log_acc_failure(self): logger = get_console_logger() - wrapper = VerificationWrapper(logger) + wrapper = VerificationWrapper(logger, None) self._test_acc_failure(wrapper) def test_console_log_acc_failure_without_colors(self): logger = get_console_logger() - wrapper = VerificationWrapper(logger) + wrapper = VerificationWrapper(logger, None) wrapper.with_colors = False self._test_acc_failure(wrapper) @@ -69,7 +75,7 @@ def _test_acc_failure(self, wrapper: VerificationWrapper): def test_console_log_start_failure(self): logger = get_console_logger() - wrapper = VerificationWrapper(logger) + wrapper = VerificationWrapper(logger, None) verificator = wrapper.verificator tc = PusTelecommand(service=17, subservice=1, seq_count=2) verificator.add_tc(tc) @@ -83,3 +89,31 @@ def test_console_log_start_failure(self): ) res = verificator.add_tm(srv_1_tm) wrapper.log_to_console(srv_1_tm, res) + + def test_file_logger(self): + tmtc_logger = RegularTmtcLogWrapper(self.log_file_name) + wrapper = VerificationWrapper(None, tmtc_logger.logger) + verificator = wrapper.verificator + tc = PusTelecommand(service=17, subservice=1, seq_count=0) + verificator.add_tc(tc) + srv_1_tm = create_acceptance_success_tm(tc) + res = verificator.add_tm(srv_1_tm) + wrapper.log_to_file(srv_1_tm, res) + srv_1_tm = create_start_success_tm(tc) + res = verificator.add_tm(srv_1_tm) + wrapper.log_to_file(srv_1_tm, res) + srv_1_tm = create_step_success_tm(tc, StepId.with_byte_size(1, 1)) + res = verificator.add_tm(srv_1_tm) + wrapper.log_to_file(srv_1_tm, res) + srv_1_tm = create_completion_success_tm(tc) + res = verificator.add_tm(srv_1_tm) + wrapper.log_to_file(srv_1_tm, res) + # Assert that 4 lines have been written + with open(self.log_file_name) as file: + all_lines = file.readlines() + self.assertEqual(len(all_lines), 4) + + def tearDown(self) -> None: + log_file = Path(self.log_file_name) + if log_file.exists(): + os.remove(log_file) diff --git a/tmtccmd/pus/__init__.py b/tmtccmd/pus/__init__.py index d8396951..0497b130 100644 --- a/tmtccmd/pus/__init__.py +++ b/tmtccmd/pus/__init__.py @@ -22,10 +22,14 @@ class CustomPusServices(IntEnum): class VerificationWrapper: - def __init__(self, console_logger: logging.Logger): + def __init__( + self, + console_logger: Optional[logging.Logger], + file_logger: Optional[logging.Logger], + ): self.pus_verificator = PusVerificator() self.console_logger = console_logger - self.file_logger: Optional[logging.Logger] = None + self.file_logger = file_logger self.with_colors = True @property @@ -46,7 +50,18 @@ def log_to_console_from_req_id( ): return self.log_progress_to_console_from_status(res.status, req_id, subservice) - def log_progress_to_file_from_status( + def log_to_file(self, srv_1_tm: pus_1.Service1Tm, res: TmCheckResult): + self.log_to_file_from_req_id(srv_1_tm.tc_req_id, res, srv_1_tm.subservice) + + def log_to_file_from_req_id( + self, + req_id: RequestId, + res: TmCheckResult, + subservice: Optional[pus_1.Subservices] = None, + ): + self.log_to_file_from_status(res.status, req_id, subservice) + + def log_to_file_from_status( self, status: VerificationStatus, req_id: RequestId, @@ -61,10 +76,14 @@ def log_progress_to_file_from_status( step_num = self.step_num(status) first_str = self._get_info_string(subservice) second_str = f"Request ID {req_id.as_u32():#04x}" + completion_str = "" + if status.completed == StatusField.SUCCESS: + completion_str = " S" third_str = ( f"acc ({acc_char}) sta ({start_char}) ste ({step_char}, {step_num}) " - f"fin ({fin_char})" + f"fin ({fin_char}){completion_str}" ) + self.file_logger.info(f"{first_str} | {second_str} | {third_str}") def log_progress_to_console_from_status( @@ -73,6 +92,8 @@ def log_progress_to_console_from_status( req_id: RequestId, subservice: Optional[pus_1.Subservices] = None, ): + if self.console_logger is None: + raise ValueError("Invalid console logger") acc_char = gen_console_char_from_status(status.accepted, self.with_colors) start_char = gen_console_char_from_status(status.started, self.with_colors) step_char = gen_console_char_from_status(status.step, self.with_colors) From d436508bcb8a7d17364d7a6416a74fe9188ba015 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 30 Jun 2022 18:51:31 +0200 Subject: [PATCH 196/221] small API change for verificator --- tests/test_pus_verif_log.py | 12 ++++++------ tmtccmd/pus/__init__.py | 3 ++- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/tests/test_pus_verif_log.py b/tests/test_pus_verif_log.py index e68a1bc8..e712ae02 100644 --- a/tests/test_pus_verif_log.py +++ b/tests/test_pus_verif_log.py @@ -26,12 +26,12 @@ def setUp(self) -> None: def test_console_log_success(self): logger = get_console_logger() - wrapper = VerificationWrapper(logger, None) + wrapper = VerificationWrapper(PusVerificator(), logger, None) self._test_success(wrapper) def test_console_log_success_without_colors(self): logger = get_console_logger() - wrapper = VerificationWrapper(logger, None) + wrapper = VerificationWrapper(PusVerificator(), logger, None) wrapper.with_colors = False self._test_success(wrapper) @@ -54,12 +54,12 @@ def _test_success(self, wrapper: VerificationWrapper): def test_console_log_acc_failure(self): logger = get_console_logger() - wrapper = VerificationWrapper(logger, None) + wrapper = VerificationWrapper(PusVerificator(), logger, None) self._test_acc_failure(wrapper) def test_console_log_acc_failure_without_colors(self): logger = get_console_logger() - wrapper = VerificationWrapper(logger, None) + wrapper = VerificationWrapper(PusVerificator(), logger, None) wrapper.with_colors = False self._test_acc_failure(wrapper) @@ -75,7 +75,7 @@ def _test_acc_failure(self, wrapper: VerificationWrapper): def test_console_log_start_failure(self): logger = get_console_logger() - wrapper = VerificationWrapper(logger, None) + wrapper = VerificationWrapper(PusVerificator(), logger, None) verificator = wrapper.verificator tc = PusTelecommand(service=17, subservice=1, seq_count=2) verificator.add_tc(tc) @@ -92,7 +92,7 @@ def test_console_log_start_failure(self): def test_file_logger(self): tmtc_logger = RegularTmtcLogWrapper(self.log_file_name) - wrapper = VerificationWrapper(None, tmtc_logger.logger) + wrapper = VerificationWrapper(PusVerificator(), None, tmtc_logger.logger) verificator = wrapper.verificator tc = PusTelecommand(service=17, subservice=1, seq_count=0) verificator.add_tc(tc) diff --git a/tmtccmd/pus/__init__.py b/tmtccmd/pus/__init__.py index 0497b130..cd1f0bb0 100644 --- a/tmtccmd/pus/__init__.py +++ b/tmtccmd/pus/__init__.py @@ -24,10 +24,11 @@ class CustomPusServices(IntEnum): class VerificationWrapper: def __init__( self, + pus_verificator: PusVerificator, console_logger: Optional[logging.Logger], file_logger: Optional[logging.Logger], ): - self.pus_verificator = PusVerificator() + self.pus_verificator = pus_verificator self.console_logger = console_logger self.file_logger = file_logger self.with_colors = True From ff01dc36e926da564b281947a4533cc9921e43e7 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 30 Jun 2022 19:15:42 +0200 Subject: [PATCH 197/221] this seems to work in all consoles --- tests/test_com_if.py | 3 ++- tmtccmd/com_if/dummy.py | 13 +++++++++++++ tmtccmd/pus/__init__.py | 2 +- tmtccmd/utility/conf_util.py | 1 + 4 files changed, 17 insertions(+), 2 deletions(-) diff --git a/tests/test_com_if.py b/tests/test_com_if.py index a374bb68..a744fae3 100644 --- a/tests/test_com_if.py +++ b/tests/test_com_if.py @@ -57,7 +57,8 @@ def test_dummy_if(self): dummy_com_if.send(PusTelecommand(service=17, subservice=1).pack()) self.assertTrue(dummy_com_if.data_available()) replies = dummy_com_if.receive() - self.assertEqual(len(replies), 3) + # Full verification set (acceptance, start and completion) and ping reply + self.assertEqual(len(replies), 4) def tearDown(self) -> None: path = Path(self.json_file) diff --git a/tmtccmd/com_if/dummy.py b/tmtccmd/com_if/dummy.py index e8c2e94b..60bbc667 100644 --- a/tmtccmd/com_if/dummy.py +++ b/tmtccmd/com_if/dummy.py @@ -66,6 +66,19 @@ def generate_reply_package(self): self.next_telemetry_package.append(tm_packet_raw) self.current_ssc += 1 + tm_packer = Service1TmExtended( + subservice=Pus1Subservices.TM_COMPLETION_SUCCESS, + seq_count=self.current_ssc, + verif_params=VerificationParams( + req_id=RequestId( + self.last_tc.packet_id, self.last_tc.packet_seq_ctrl + ) + ), + ) + tm_packet_raw = tm_packer.pack() + self.next_telemetry_package.append(tm_packet_raw) + self.current_ssc += 1 + def receive_reply_package(self) -> TelemetryListT: if self.reply_pending: return_list = self.next_telemetry_package.copy() diff --git a/tmtccmd/pus/__init__.py b/tmtccmd/pus/__init__.py index cd1f0bb0..25932466 100644 --- a/tmtccmd/pus/__init__.py +++ b/tmtccmd/pus/__init__.py @@ -104,7 +104,7 @@ def log_progress_to_console_from_status( second_str = f"Request ID {req_id.as_u32():#04x}" completion_str = "" if status.completed == StatusField.SUCCESS: - completion_str = f" \U0001F31F" + completion_str = f" {AnsiColors.BOLD}{AnsiColors.YELLOW}\u2728" third_str = ( f"acc ({acc_char}) sta ({start_char}) ste ({step_char}, {step_num}) " f"fin ({fin_char}){completion_str}" diff --git a/tmtccmd/utility/conf_util.py b/tmtccmd/utility/conf_util.py index 7bed1503..9881e8dd 100644 --- a/tmtccmd/utility/conf_util.py +++ b/tmtccmd/utility/conf_util.py @@ -21,6 +21,7 @@ class AnsiColors: MAGNETA = "\x1b[35m" CYAN = "\x1b[36m" RESET = "\x1b[0m" + BOLD = "\033[1m" def check_args_in_dict( From 0a4118ce1da390af7600b9e13befa6521865497e Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 30 Jun 2022 19:23:19 +0200 Subject: [PATCH 198/221] fixed COM if args translation --- tmtccmd/config/args.py | 4 ++-- tmtccmd/config/com_if.py | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/tmtccmd/config/args.py b/tmtccmd/config/args.py index 57a29ff0..439816c0 100644 --- a/tmtccmd/config/args.py +++ b/tmtccmd/config/args.py @@ -296,12 +296,12 @@ def args_to_params( params.app_params.use_gui = pargs.gui if pargs.com_if is None or pargs.com_if == CoreComInterfaces.UNSPECIFIED.value: if use_prompts: - params.com_if = determine_com_if( + params.com_if_id = determine_com_if( hook_obj.get_com_if_dict(), hook_obj.json_cfg_path ) else: # TODO: Check whether COM IF is valid? - params.com_if = pargs.com_if + params.com_if_id = pargs.com_if if pargs.mode is None: params.mode = CoreModeStrings[CoreModeList.ONE_QUEUE_MODE] else: diff --git a/tmtccmd/config/com_if.py b/tmtccmd/config/com_if.py index 1b88e1ca..2b42a960 100644 --- a/tmtccmd/config/com_if.py +++ b/tmtccmd/config/com_if.py @@ -34,6 +34,8 @@ def create_communication_interface_default( from tmtccmd.com_if.dummy import DummyComIF from tmtccmd.com_if.qemu import QEMUComIF + if com_if_key == "": + LOGGER.warning("COM Interface key string is empty. Using dummy COM interface") try: if ( com_if_key == CoreComInterfaces.UDP.value From d08f24e4d8be3fb4594bf68d7d3f7594c5e96137 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 30 Jun 2022 19:31:30 +0200 Subject: [PATCH 199/221] ctor fix for seq count provider --- tmtccmd/pus/seqcnt.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tmtccmd/pus/seqcnt.py b/tmtccmd/pus/seqcnt.py index 646cfd7f..8f8f7c6c 100644 --- a/tmtccmd/pus/seqcnt.py +++ b/tmtccmd/pus/seqcnt.py @@ -11,7 +11,7 @@ def next_seq_count(self) -> int: class FileSeqCountProvider(ProvidesSeqCount): - def __init__(self, file_name: Path = "seqcnt.txt"): + def __init__(self, file_name: Path = Path("seqcnt.txt")): self.file_name = file_name if not self.file_name.exists(): self.create_new() From 0338825b4aa5aa118b8ef3ea261c1cacbbefecce Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 1 Jul 2022 10:58:01 +0200 Subject: [PATCH 200/221] use new logo for GUI and make font bigger --- .gitignore | 2 ++ misc/logo.png | Bin 1012252 -> 802399 bytes misc/logo.svg | 28 ++++++++++++++-------------- tmtccmd/config/logo.png | Bin 175979 -> 0 bytes tmtccmd/gui/__init__.py | 9 +++++---- 5 files changed, 21 insertions(+), 18 deletions(-) delete mode 100644 tmtccmd/config/logo.png diff --git a/.gitignore b/.gitignore index f1cef17e..18966419 100644 --- a/.gitignore +++ b/.gitignore @@ -18,5 +18,7 @@ build .idea venv +/misc/.xdp-logo.png* + # CodeCov .coverage diff --git a/misc/logo.png b/misc/logo.png index 8df8089b12de217959ce9e97d577e252d0222141..529b9d660d24269c3a824d1a9c43fe578c8d43f9 100644 GIT binary patch literal 802399 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 z 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

;r#c&Ztk_EB>%LN}GsxOf@M5sjW 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ùL_m;-Db-AX4fovB8~4eIW{Qy~J_pwZK_)y~iXpTqxd z(fn+a4%rqN{tE(}MI{y)OId35!H4o!1|HRXL9UFn;4SC&@@H z#%c9#CgBJB81S=TBDFv9wtNuWjSd5-KZBSk{ZNqtwu)nsz9@G!KJYr1i5*5B^ls+D6U8h zy(7nz2_)brjSTW}2#`Je@tooCig!!0F4xR)T1ET%B7fQL((u6XEhe;|@e)WNx13gf z-E_|M#FBWr(HFxsT>Z}a^xyKJ+FdInk}nNTF&pOiT6$3~FD+8jh$6iI%H1237bNObIEA|xv z&Es*)f#B7le`Oe=VA+qkot<9J-E}thO(f;jiwe#is9~-xrcQ|XAld;|ia5TEE#t1d z+}jVlax|pBo;UPh%>_j%h{#mF9#W90#2YqvJxtm4UFjG7wB4`W{~R)(en^>oI^S&@ zpM7{C<-3_7^*H#%m^^+d1eC#{2x@ea~>`uWgH_SNCHMB7A-STowa$P1z>> z_f$IUSSF`3b8bGIC8=q13=hgdBN+iX&KMdM17lr!o=mE<{>V(o@;Ai@|34Vv#YHb0 zy_5VBPlDP>UM85^ zNB)`=Ea|Ke*YMk>`=pJxD*Vh`9JuRVLag!Y71eR79Ja}`%u|?y2!}fr`LNi4K_Lrj z7PfD7kgtuz&y=);4)z_I&-_k5lF|@QsZVV@<2n;wko0JCG%@$!0thzutniCxDeA#V zMjkNTMl&;Z%Ph$08yhN<*~hRz5lC4Q-NV03nGe^s=qGN0d$F}`6ulE(B!Ao7C&NQ| zU-;fL=z4TNPuYiI`-Bghzqpf7a=dCJ<4VsQ-8fTdcf{E*`4zuj1d*ke0}mx=&)mfH z2H=c5x%)WFHfz=SQrqzbE=j;q{|Z0Cihs4(zdyLvn=_ds6KBo!VfW82QnzBG;JiVP|oFaoMktz3IDlI$iIHE3ATh_9taL2b3uS4YU_aae|CWUZ$-mi6$!106>8PqIu;oS9nKxvTzs*EoC3_41R zRA$#uh+VwOR`F0lK`w6VF`=4%8yyE2P(>~}&zv(r_9LXZJd_of?K911-ot zn7T@|d0h>BJtf*8QyfyuB`s=-kb zq&$?|qh2fVJFF&nwWr4~PBs2L&o}I53V9GqzHi){@vf|QPJlEVwp@tum zvu)}L;mJzx--=_w6|W^_4xUH3`PUlqK*83SLj}^}Bd-&~dCC1+1^hSJ=LnbJ=yg)X zOh36XTuG{|56crt+gm{=B0WTx@1MugIlDkiBZV`ukXdvX_%TENxdj&jTT*EY{f+A@ zJOBk}U-=YDE*~4%X)mhU{sL^zWI5u)x`0s0Z7FWYg2Z4$-D!Zwix}q;1DZY1{vnJj z^596s1z{G;jL-=gl730&o(HAXXQTR z&23m;LENQz#{s3j+M5pA_7kCzib?fv^0y>&-kOOfT_iJ1y)^-jC9wp<}OIS^dgPXSk9XSbBkblg>ZPEBrTmY4gV^eF90eh^98W8M^S1!Ks z7$cT?k!X9FP3zf9<-%)Vk7WZEgr2jfewAVT<|)e~|6;$?bVC_UByXI#zv1gDNI#Jp z>>aWVFw*?WQfL3=6y^>_6O`C^&33{QoDE2k^}JBZz5zO_5;tHGej;j!iR8IA!h|!K z8_+P&%8h*K44e@jz*GjJsJ)Cp$g+}95wNCQm|~ERpb90>tEp6}i*}+XJN+RyAoDf{ zw1xGqQSR*`-`=(I4K5HX(S{e7ftQh&n>;4LDq|7&2?T!__*TRU`4a9G`)qaNZ@VpE zI?>9^d#(NR7S`~P-d8V#9+ziyJ;r5TyMV#&_sumx$1kH2v-z1#ORO9B>+!qMY4~mA zTrA{1T1tHAaDNho3cF%_zb5#QTu?wVy2}$rpRVPf~qZ{d`@ObR-q>3;9Nu< zZ8{&StNhjMJp3CZx16Oqxm6Q0iH+TsJ(a3lOUiDhpJ4(f8OY;=leM?ozgN5rD!ae@zf{Nz|jgm(t*_UDHz2c1z(Bdv;!^$bw7qowcu}X_|heSdHt}PyYtl zLQz_*q>q;4udE>S`!Vb51_j6ZV;|vODE$`7<2s~9+9E0-iSMORdSSXOjWjof5Sk;J z1C$Um%ybM-Sc}7bLTx%nYf?z1rC2mO!RjZZX!QE4RNw`NiPK_X`qj}&>ihq-CmMnw zN?ym_-%NDsHP3L?!+@=Ze?V|_sz~zVScOvc*j2gqv@qLG>#y+&`ehyZFXk!a0qLY2 zH&e;=H&C!vG?$_p948nOijNV(+8_6B@=G5{5KKOf;DUX?!Ipjm*lDl= zamL=g>QHf#S-=GgqZWmb(pj9rFab^=*_B%M7dv=c1WeTD;gy1eYy(3T4_nF253l7Y zd$ueDv|N1s1?Xo;ObzKJQ#q82!MkkOUoU_{;Iz=+W{CnCD<2HL7Ekq)#vCxowh0om zG*dL0?^FZ3Fu4mi)F5gM=-T5=Q+uR_eN+g;xOji{I?T6{cim;j5vW!Xs{}#|Iu{}N zYX>&m2KWawQsW7~Lp%E|Uf1zFo@=g%8Y~^>KHSrgd_N-I&B;EXEu)U?Q%{wsQVtHO zw>`)2pL-vB`ZP!srqRcSzKbZW{UmdZ;(o$HBSq~szFu4xS?NDYE;F>pQ(14~k}b9A z1uVa%8E5Zxg@}r;eu;Oe*}$ST?OeAPIFiGa=ipr@E`P)02>h4$$x04-XVa`iD=wKN zInlftDk*J{vvP#pl{28#lp&5FrTD-q% zZT}@czt=w4XY;8}th{^~%lH}u?n?@Fp7vr5o}-OLi@4un8Pd_1p}yb~oAd6xGs$f` znbz&_S$@#7wx%_xSkwKEv*rFYMrma6{m|{WvfpQtR8Bu~NB(gxKyEH+*PEx!A z!&nBzOn%K%(@JUkX;Y&Ak|mVfRi_%XC;pP}mN_RV3();Xl5{-QF0u}bI{;99FK?OX zY?vPZaP^DkB-Ad?8QsXn`@oki(-qZ9?r(1+m)ph|Zf|Z4cd+3X151Na&Fwbv~8co6$>t-Px4(kBYcj zQKRV&$EZ(!L4wf5g#(HPBA<^NU`d{(339_%a9W-0pcS7}l4dl2PUSgu(dw zhF#?);hR@OB;sfQYdyk8jx#Fms9HRWHTE>|x@PFM|JQ*?ii-n>FbDccmc`%(Q>xS$ zVkKUB7oWaET7`+6hB)u#OE2+J-+zXGzlN2`d5GNfYoJ5v5KG$05TDch=$UoqrJ%`+*--Sut4;4fbKS~82U$RBl z{Xj;N+A?d24!EuMFV;6!hMD__uf&d?^7;I0euM3cpoVG>yJS` zPC2n0lVBgc2tJle^1i3|ghW`c#(Pe>(HXQ3@F}t%g50PeB)J6!YXzD^S!~ASPe!&< zdb(VKm4g+hBJ;xXFn&Cd0nWd)iB@L4f2lyg1(?*7$q#J}&P^h=W*?36P|5I>0LBQU z{nB7Iy{(m%kMjXNfG5(`{HL~$SgxY)TVwQ%Ky9O@R8eahx_6fdRqVctg zyrMn9t8AydJM2Y*3k88J@L*9KOX@^osf<+Ci!?Gjvrt!^Bt9w;k-nN4kgG7|{8T-< zaw)^1f(%Z=Gdy}H54&w#gd?-I6+JD^0AYzmkwwJKQMx=dHAut?FDVZ|J~C18;8|Rz z#m({Axk^4=KJcfYf-w`eT10+W9)~l^JIlp+_+M>w|KehAva=iOE@cyQiBzPSNi=39=i&?nf zBd9u16w=v2eMh|6Vo6gA+E`!GS+A*PyY3-bmRXQ&4A7<1IbWY~fXK(Sr z08Mn{k~D0oLvF~|u{4SIiN3?zl?BM}Ip2IWx34T`5(G7>9WQ5Y+*tML+!5vtoqB-- z9mKg0D{l;egc&jh2BugudKhc)Q$Pj$v^Dlq zK6cVUlo(!V*tP#0-qeqd#N(9T&e*6|auR-r4QF|9nT!pMh3DPgwOT|O#C;;|{D2NB z5tiX!20gfp*1efNaW?|@3xA>3>NOw-OghbH-Pv=7z&}mWVJKL%$wS5?Q5zVz#|! z^vsd=O`pBhz4A~Q*hyqOw6V=pGEZi^`Tug0s4Xf!FmpPJ4v;Q*X*k(EZuh4&VGrC~ z+~D3=zWZ`lSUYrA^Qm)>Sxuz2tP?jq@-DpXHra$IApug@WOM z34++Wlu*=Vo21HUC1}SnDNlQ5qf4ZjbSHDi9i(OL*>5kU-9p%mFcq^HD)<8yWCCGy zzpx;)!j}W6BLJbtc+dIPLWH!EPcDpr5Ui_i&e$6+1kh1F@N@+?_~(DFKW+ zl6$<@XTy#Yf6W_#s|==<2^nn^og^mh%3Wof0N@6UZk9+*<*m9tRjY5vXrAV3w~|mQ zs2Dq+kWqE+@~PKS5CX2fxGfA5(goe7XW#J%a2?!E>MC?1hKpQgNUWoR=EG(I?$62N zjN*r*{P02ohatM_wP_7Dbo8PT3rUTR44OBVDqe`CjRBo>1Nyq{8+qs~nk!!4+~0s} zgoHv*Wqh~DD(pB$j4^&d)iekrJ(|2_k>8m_5N7db0bg{a7aKf7yWL*v_|nE2cJek;04KTE zS61!!d3J-_WY;Z4oWWfQrAHEUG^!g~NQ8SD^GYEBv)6bNA+TM9{Te59kz9Yye zN=vjw$*KBU4GVpv+xIyQ#AtS*D9ClbFS*~hyjw+c&w2fzS?|Fs6{0y|Zd6d;k$cg_ z^M1+mVyI)?yyeYbQ|3fUwpa7_?s?foJ(U`oF(Tb2IHLbY5Z%Ytgx=1a?@K#T;*^l_xdB1wE@}7XCp=NZ0uP6qOc_8z?35*KvsNge4ZxIR(Lj`x`4l z(2)YnSjaIkB6uyAEVWaB-bDbtlN76{^di4-@OBLsDEb+?tJlw#QyQU6;B6UwKM{;| zP{Kywu!4$6a!?SI6~~8Hp5jT%1z662agCDOK-W-Di!Do-FQj3q3!U8kf}Ce>)z0`RgB~Z)iQ>s|>l1;-sok@!};+{7AOB{=+nGtXv1?f5rP-=%chliGe2!- z=obX#s2HbTa?|WpnY>=i&M`WlGGR-!>Ns0|dvlEn5VqX{^iCNB>GBVM(SzBi;8B*z zjZ4|{-<*Gei(Gwbn&I%`|5*2uwsIQI0aF*uS;K=@E~7s*1C!enC}w<*9YNy8LFs^Y z?NXb5(QAF22|@;OJV$d?tz#yJTi4hcs=f7}!pH&QlVg~qje_O6zg0xgtE{RtM@cWX z5V$bGn?X=S07)?HgkxG-oH&YKS{ww~M%^ZY_*Ms!r5CXu4<+k{gOu=sL{@{#<|G@r z@!;HnqC~Fg{lbfyYnZ=n&eUlqzvFVBmqg%P#-`#Bsz|Ni@(9obn0lMhfj{iPU z{I`A|M<}Iw6Luu4xAE#f7xQ1H|FBI2BE*)7`)E6w5l=dEQXAVb)AyvWowhHlNY`2` zRsKD;fiWD{T(xi2i(Dzpd!4RAUz43DL$Xc&2dx z$QFN!1m6WF&MVzj05DnCsAy#!`y(hcdehfal?1fEPJ|M!w$iewfR<-1}cf%i)m-lYZ8^)~BaULiGV0BB@yb)Y^REcF4wI=?P-H&bOu<7f<; zT=&f9pSNxaoH_Ww0*SV8^n-5$?nxjZ;( zyZCo{+S8%VpK?PZDTkm@;*G+W%819~F7c*I`PC?>Z*M`Klug~#?_)wv-fwXeT~k%P zOrqaDa_eONB$?dp{@~U}N~59ZyP4>I6=E(k^q*u@RA5+4SIaA%Q=@5m52LK9J<@3)QN6 z$ChtJHR^h_b9?eej`2B*7A^*+@cT8{G4MI~oEb>NAuS^cBEoa*QlR~2qn0&a(Ovgm zy&n5N$y~``NtLbTpjlDVui!KAak&ai+VKuJU{L=o{ZOImc4h&##CLav?k^Kg~=`-nIE#?l%rplXaAnQmLq=}T{fL8Ji z_jY))(U>-J{1fdr(>x5w5Abm!)^^s-;bA|@A=XF31^kLe`LIbPh*Nbk{$mj~vk`SIi%IfVlRVP+iYW{Owb-`s(RB73>{fj)UTf6E*?{t9_A0%U=I6 z9c*O3`w;A$;&y&?S=6U2=@B*g=ylxHF{9F@94986WXQhMbH4K%O3XXo*1i*6j-~Fa zT%GNPpoJu zQ~C=d2?wRB@bm~{;zS`<|2xv2=0-0AFZT<=U$3iKM+1}dzHD^QZ=?_9-T35xOJH%I zf8|=-so8UhMT(b{G1{Rc(mcz_`CI{;QgWyOoDOx7P8_3;Wn4O*1x-XKamv}VI_R0^ zcR#6|juRn=Q@sLmP3*X{?Q}j(W_c_Y%$9ijWmTW+2RbHL{m)sS4R}OiD+|-RiC4|Ji?4a!mlZ`7a&$&XWwtw_<1Lm+=R} zJ^(nJkRXU;fBO1Q5m+yYaMtB1G(Dc2F_<41AVJ#Cj7h%Y>1e5Q`YfU&&14Grdfq_u za%Oz<=FyQx=C{L$GfQdhw1}fdH4bq|wxe+;^?gE8Fjdv8>%Mw4x^baWz+HZd3F-99E`*Ot?1{ zY}xHMSayPYO_KJ=0h$)s|sX)3EtA?RyCXV4Hb%Rx0 zy!_{7XfdFl)#MYAHd+6)y)zaQ{eklLEK%&7u+h9oyzEiQxVcOcBnMy+McaO#rqd#! zH|bkG@oAe{D2F)JX0jzovVi52lE;$|K7c7BhgV0Xz6bnd*-oeO=~pL>s1Fe~6ZJ+B zUK?7Wq4IcdiGL2<0v0EM3>)-AM=;M^v*wu=aK*QV3^_bjwMr+}B! ziVW(G26uE1hIvOO`LN7s3Jy+6*&3#NnEdtp!_YKQun#lePb|25^j4l{G)3e#kFgY= z7dklh7D}BdBZVZFkdabI?71CR|4asVsut8K&i&|m=b7?+vK9iYCgN*YzcP-2s6gAZ zXqWb7Z&@kvechr?gJTm?8mEQfWP;DB>jkj9Ww(#9L?S#p`vU{v{zqR-q~dQG87S6MtWM|K?LWnKHVv52T9O7T$<+K&cy_Vr%|%!27W5 zA?FhvONBW!cgY>nBBa{U`%qW8q5{s*Gxjc9rVTx+)=-~+_&-d&RaDgP8}&`MFm%Jv zAdPem-5{WVG}0j59TG!#r!(Hwt@l-(3lTO;>MTn*za2wGRw~KAsqB7%Jx3a`kfs`2r%N!i@_&f=BiEr+e zoyZvL6oZ=x82GsFtP|wFVZX1&0#h(L?}n$qZ}9AgvGUrH7WOK-Dg(_8--%v}m;e_Z z%buP8cYX1rSwH97D9$yX+_K_K9LHo!ss=y|PuFO`qe_>~!#MS%V$^DVAOEa1k)21~ z^8fkt)B#D*L4-tz0}u-GMxH}GLQ67%*r3ip^;O(sB8E6$T!#rW;gu`(BI% z`}%Bv2`dv%qc&H5*kGjn_F2@ns1H+Jrk_52)A77BsW>fe&F1wK5xO+DkRxHWS&h9P z(ZA-z6p)rrSAR4t1$Gj^LarXi~cd0Khag{ z3BHX*R~+B?%6(s7vnU(yVFj)LtWcdz*JS3x?&^DQo_Qh6BB(z5x^;=gOuVNm2(JJW zwIlT=7`bFNnS}G9ISd^S9uEQF5-0_4B&##`V3`Pd%3qs;1oT{&w5EXfW_FTq)W&nM zNWN?KyRnVCcj1_^|4@2%|I_xCw#wv4gv;y8|DA@sAj~6EZ<@PLx9z`kvSQn6%EylGJDuC ziRJ!g$qvGygZ)CiI*=Qgyj6pkc#WH)Y$BR8GjNi8oo*%O%R|~!Gw`67GAO0b=LdO0 z&>Fn&pv%i`kmV(D9B4GgBXG+RV7C3) zol#>z7!97#=zpzA($mC>05#Vf*QhQOl8l`{6S`AD_0%t1r}{&xbl|igML+ zY6{eaGxFARVl~rDIexfQftz~|v=u28CSi?oGtM8gK1+xv)31|P@9Mf7aZ(p5S$ABM z*Q$&YUW%WR zhB5^Q?E0>+-j*!86R=>8)QKJTU%?|3I*Flltc+bKzNuH}!0C-}>Id+98DJ1?9ncjg zNKzq-5xCRtD;6V;V~is-!q){4pa2za9Z^_QqQW;-Y1^rsaRSo6V%I>a!g@I4T~zz{ zMq*;_$y;EcsN)^uC=56?bS=ai4(G}?gXUQ{syw6duY}$I*Z4aXXWV(Jn|}=$_dW^l zate=DDdZO%=#2Zj7C!8TKBCC+{7zS%V8cR*CINIHCh*Zz+nQgV&n?GsI1!z*f&{tJ zQ3c^P7kw6$5uK^XD-bt}9AgrHy)ytHdsF;gGUKQKra}r2oeQ2E+Q6qm144zXfQsh- zVg6=DHD#_QTdanTiSJ|+BS-z8=m!qND&nOr3+*B$;BMJ!Scd^LChJ!UkeqjTI@9H# zz7Wv`W+{?migrK;oiXj?XB8yKq97!-j4=8`KAmz$v(Q3RqG$WVw|tgLgiXTn)Z#|t zI3(8T8=iMXiP^{HY4i&;Qp;yD)u+wgSHblUFUeyn?K2R+w>nU4YHr8sfS+?74yC&p zCamu{pI!F;X1*MCz0~H5f8}7WuYLV}6#u%(+2xbViZ5{!Moto{4)=IADfVF3Vif}0{yz@z+iFtwD&s;YOflVQ z=C9Ar1NTuaUsWeUN8MnMOv)+p;EThg+;1Z z%Y{W%+9yRBo`wHmgAKYL5f7orpee(IHDSWog8*%_Ea=C-c4f$N1SL24R9ck~e$xXc z9HcauA_$7mr+-5QXbbZONvf`=i?SvYa@({6ryK|il)&{bW!f1*Gi-K`%^ zRxv@GpD;?16DPykj&VpXAqE(A0tO6P&us6_IpQKPBk|jtz$Y3}9ULJdJgpWkD+3Hf zxsRk0#D3Hj`%Y7H7}iFJFwc~FA(G^}BFn&86^<|79DjA5I|wnBndvLt^Vs&px>Fbj znt#YFHC&x*UyKKPIe*D<&S}|Uk`NR9pTcle+GM#@nAv6gu|FavGSamYMti$sFR?A3 zk0;2U{>~zC{_={q6pt0D$}Um~!GV|)I7d!sXcoo_n#!p_~$*YkZ6 z*cC33f7owLCxJP+QngDzLyWRv3x-b;D7o+KH3TgeM3YKx3JGmZ+C@ArPW0h6iBmPw zU<&iZH&#B!jyJ+QomFiWxu)VGkAG}kp#zBnZO?vcRn&3!xS=?9$cRY9(1dZpbaS`f zPrRy=%tQ1e^fqB!GGC{%*lY-9%K0=Jh<1Ssr6FVy{ zXxw>Ews!wO{?jKs z*X58}4xbSEpE9JGj{~Y$`tzCeas5wI{hpP>*okq0j(yD~UMxt*l%Ng&qvHYr4dBPU zM{^G3W`Vxhv)>TNOOyWf_VwyN%KwjMdYgc`*Jy)B?Y-j~@fE`v zu`RiG9P#88**`>i(Maf+P491lJ}@|&D}%}J34Os&$1X3?4QT=+ax={Pn?tqQR zXfm2$PTTQrxA>Kq{*%^^*Ey#(6$^XQdYPmb{-QEQn|XjX%K~Fx;|JIN8VL zlx&`g$2LC9RzJn{vC;S|^%wDGZ12N^ZfV@T?$~6pn$6|!4evqzx!`j*_>vCy{(5Y- z+IWumv9cXeZ+*-ToiDYs_+txM;>w0ynseSt(??FAQwQ>Rb;3Ji-R^hQWw9{xZp{^! z0@4Aw&?(K%j=&Ziq*Lig&(#tu&eE+dsxDBk$m7=9A$(|Zf`z&$y(tX|?IhS5cY=O8 z+KCg$1qIkD({TkJJV8zf9$1U;%Lvo9eUvGODM>~Gla5BM$F;tbLtn5A1$LX3Vh;kY z<}4m7yJ#IvSdH7;@jGtwfQyea%lpzJe1pkB*@b20s-I`D1Q`7+<=rbaV7ahNl6QVE z{~57hQk0FkHCQsw?9B6~C#dHQpBx!alnMB&TNEDVZ&WS^xcM;NTewZkBo>rTgGdZW z9jaIZBunPTKvYv6GEw=ci-N?(^sV5jVty_$~_+PEgIg1yMxP$#j52oj{o^_rW! z5NBL&Q73yUh$jO`$4u`I&IcXZem;{bGKk>39sE;O3lX-ZKSw~J3jYyV)?R|JMsxg@@3IPIAH;EoWA(^24jHpNSUVSA?MmXWYk5eRNE&RpHRw- zNHfLb*eJ$?x&iWmP2fieML_lzzUZ%e$xj}7CX^X$nQujlALb$ugS=c2N~vl9S#NQ$ z;G@4MG{8%EB>-HVa$t%$hn)OxYPjo`_ys2MGMP?A%-1G?-tN7l35fI$j9+J*9u;rz ztv?cPl_-n}8ZLbBpUAJ@S!%DTwg{xk9v~o1CpIR>b0@2voH4nvc&8_*p3bp&wC->y z=cW3R_1xdOf80>MJ=xh>9?rp2fy?l*dbXouQ?=NOmwsdA6kBagQEavAM9$5w0{F#vrW znGq0bm4ehcl>#8an)|9x!o`tKKNnJ4Vsm*LfJAsvMFc3EHdPo(up#aw952)dk~F>Mx(aELylLR3OjC-X^frvZFLbWFEq%)_u>PV_Fvig_iwF2M$`u z0|`V_-{$Y0F(TPCm(34hT0pg9WCr{pRw(xeT)LKr-_4&fp|vq{%Mk~AjY0<1T#)=z z`UHJB%3H_0+>W$aGm{#=k4!YdX@+RJw#k^AO?)`s4V5bwK}q{Ab~9Qeue00rRQvLe z)6m%1&lV^ryq$nY=*`+UX7JvWm=vQoVhzoALdje zZWM)IH5)I*(|4{l>6IUqAMv^vP#<%iPxbSkheX4x!xkU6KP|;QL+&mP6E2k9Csh>3 z4ML_;=Cw~ma?Hy!xS;#3dY|HvK4AM-4-u>J#3TSeh6A?%Dw-DWcLZfDIZI<@cu73X zIq0GCm&{S7lK6;RGUGDiw7^z^c0UXtCNPws#5&c3{1W7G>8eA3qryMktAM)b7TdP} zspa7i;UUZc>pFe+d)G!b)7bsRDPO?zp3z>d|CL(j3!4G&6m>RTcLK9!pecST~&d!-mJj zpsA$lXVafR21^r|9!hZ>?Y zVE-^jGDCsJlg>wehU`qWa+Or zqQvYLifaK24PG$q;4J>%ZOMxGcYL2vHk+Oji{dq-K%8(F6Xl!tRX=qZ5>jFCAuSm7 z>uxv-xnyI6wHKT{z86D7)Ngdsn?9^c*PBT`ZPWfhU-IR#4{V(SDdU)lx^@G zB**NE7aT`?dF)6%k9a*FTYjE<9qqc#)iL(B;ENHTc5vXhZdrX6c*&Qz=?{2ey3*dE zoSqWrch}qaR>B0iDk!1<<+3=j!OROz$d^3LO4x6i@z0JHjHQ(D({~oH5FR}mD5f0^ z_P2-@bki71dhLVU9hdR1nS%YgqPJcAKX=&`^E5j&A^@bFJ(L!sU?eZ_VRPgIEtaQ;9&5028_q^zs*VVCy)wQuME|ASzbAgF|Ec3>TV(AXJI^#l-dkY7-bzGOr0+a^ zpyTQy*K_+|$`NhVbz4)IHT^OmKV2DDmN7;7K)yBQjh#jKfK!4EStT6@?U!zTHPLY# zV%e#XEPN0u5H^i>E+}QdI8G@K$nWm3bdn)Cssz`h2p9hl(m6oX!$a`SOvZT7;Z?|T zy2{4E8o{(X9Z}!SpY<%@n>lFCf7tkvlO0Iu9_fN|69q5UOYPu0tUT$6g6?`(oCral zjJis=GdAGUJ8?Lu`mR^T9)~tyb!&GNisF-y>;~lHO{8DHsP@Q>yxYU1N(IJ5e*?n| zl-_`Fn8xrvvd68-Di@0|Y!a%e6jOnqITr~crKq+MzFUrC`{y|`w&YA}jA*nT%8MJP zebUvI-m};wGIq3;>OH&s?|=3`*Y32ovB|Bej%N!*=<@@IAWi) z|8v}=x%U?#2u){%eDFyUAMnItNfLH_lCz*%RA(8!7bQZ=ucm5F|Dx(2@2Xm!yc66#QKDM4BDE2p&pLkemd8KFVcn@ z74{)Je>+xkD*`PeW>2OG@dyC~u~?FymO=*bwFc`!Q)Rz#lTplPO1_oFZ$X#|DQEbd zt1)?|QpU-5aP*QGzDnYjzU$qxbHurPsqMJaccQ)8^_Z2jqhX}B^aEW z#W}Bw`DOlqa3y;{6>{ZP8ss6S%(f&*vRt%Cb-cwHVFWVZAvN*0mRu~FQoU@Ua!4x0 zkX{fO4OatA`5!qbq6uB7CETV;F&9L;8RH`ggpOY2=8;W=2FW5=5C@Yt2I4njH}%Gw zqWT9*EZGx2dUR|cb)e@TUJR_d5cXj;eQXEQr9Z1Ft@cF;E@xZeN^vh`oe6b$AWPPa zotLLDn*|2~vPC$~>JywL;>;diB1k}2%%g&2=!yq+XYSVeEyK_bJmL(+!&e1*4UXyM zGgE5%D>(4yL}yUjwaY_H=C_<7)qXmSmvQ)B+KI(Ag;>rz|CCB5uK0^OdsF|FP9?pe zU_0e|L~5S6k{DStzN!#7>4qzDxDBalXt-I@z8fjk&$0kjFXu7Uy_D-=1l>vJXry$6V9+bzpa>?)koYw%(1pT=^ix0-B~(poKNsIq?q$P%m@C@X90mu5S3 zNUMwc)Q}iEysGwJiQ^n|vqib6H-78wybF_mHh$rJ`6qFA5r6tJ@%m5V^)mfsL&ER% zrVq#1;O3XM?uJ#B+?{)a&7Es)=j3aT#NES{#Dn~6CiUw-ov!ge{S0Cull@M2S(*QQ z(bA4yTg7&aa^rVg&h+!|*K#8qnrk)TQe|i-9(SBIC2rEcRfu7i*gZ$8LK5`u>^;|U zG{qX1ts>4ior&ec%}J;?d=Vbg^W%@zV#gSYzCV_0`X2SqwmD~3YIgjh2s1t_>+sL# zQF{DvPX^gYuX|0_aX8aI&H9)v(Ph8NF+ntUSr@3-=Xa2&5PCT={Rwjl>AI+-O~cu^ zlj8P{VG=j#kzOqby<54LdZJD&QCxxb{g!G*AM5UOrznPuT&@!hZcwBNma)W1#&EvSwM;FL9b0)qA_i|TVs>;_g|Z1P~Nn~SnR}7bnb!3X1~}EAD7`# z^Y8x4$iB$)5RBdOhsg zg*d+Qw(YH@=0Aqja^?BM0kWZbi$Ws>cd3wYODm>P!)E$z*vDE-HGXkl1iR5udqO$%+Q)z*G=<#IJH> z)G+K$_F|8oGV(B1B$6O@KhK`uSTIr)j5k8wwBR_>S;k;5u6S~IXB3tuI2d~mfC&E~ z0Yg2*cZ&w5Z%4g(UP&hNK>HBjz13OXvGH^C+qU$xoDdr7B?dQhXm;>fYmJ(zXd{3? ziHO)cpO`pVD_8}xRO%RjP%x%-b(qW}?One~x#?=*`cx(;>u__qeI(#3$}HT4&GKCE zU{WkZ)b}VK39cuAbTbOS;y9ZYV*{49*C%$`%4=$jx+A+KTt^CJvOP!L>#S5JtwsXB^x`x?y z8zwh<&a1x!z3Zr-{N}gZ3}+N1pPc@ zcv5s7-R!i;)Mm6w2(cSF}AzU5c0-NmU&Tcm@b4U z6j2TiF_^KCiWczp$Owa)K(=AU$P?HhlJ6))-W-pQt4W^7jPuj7vm9{L3Q#_%){+-} zYM#&^|uA@L}IC8AyRcI-@eIW zTQh)bsN{>Q3rlXQ%7i&TajZju8)Av1d1#CVc}YJqUr#U4_L_9J0t*7vAI!3aGDxCB zSqYHXdNR>q8)VkGo*>ozp>Qv<%{cR@G8zYvqPt2G)A4X9Qaw2lv(i`FEXp(}5aw?%q*XK+JNW@d%-hA{A%Zg}3$E&R%mJGs6~Q5nsvQ zG9A*qfJ;sO66#y&hqmdle&mgYHL+(lHQ`FJw!-z{AFZp`LB4}lLT6;4fDYlNc*)2ww|8$!NKE#wtZv>oD(o!jZ1ml;X_PRRTVYhSqwfX`g`97ka8id> zavQ0JZ!y5dZtx(G_r8s0mtj4FmoP#O3gY!$X+gT{w8od?;q45oOF(JP&nCk@9Pjn#RFo#%Fu9^bRym&|+R=jnfplG;-nT6ft? z(GgaW&;OBM?l#PAXM0Mp&x_;!`bBtUM~&g>`PqT@D%JD=%Qzm=LDNT>89gi)%}A$2 zuCeGQwHva*8&o zM}aOWEPu{=3pP5h29L%gWSsXJeO>7M&Ahg^L)HL0J=E{X!c&`HYhAqKrGk&1=m z)h*hR-$u?mM%6cG`X0`ODev`2u3R%8<53e~%44igzpx%Q9@$Di@koBd*(y618&dzp zkNY4xYA3^|kaT|3CZAqDre4=F^wH=v{yR61=x+K~_UHEUe~X-)OGOswb-TBmJ1rj8 z#uZh7G_EWZwQw7m>BEeDMSvR8e%}4;NjqoPf&V>vixN~Hp)9(SVldl(7{_m>WDP%* zNv5x~jj57Q4nmBVPCKdW&GIoHqrAG;9<}>w=&Ym#bI6fO@LZ^gb3%=r&-iMte#zU2JN7GF>!;BFx&j zc5O>BTrmE23RvVEpoahcO$f**&OtDoy^Mpwjv3)8kn%DRLr4rC}<56iaMz52>vOq7Q69*8WHSEal9kg8#vgg9No&1eo%D+ zqIi4@?&N~k`i|iQ2O1Nr*O8iZYoh=Q($r;iPNsW`Xp{T1u})&=H3U3e&Z&IJVFamv zQq@mN25Hnx`F+k^+peq#{B5?3*4n2UnG|nZCTN2{!@b7j@v+zf)H!|XQU-f*#T=j0 zGi(%eLi18ndthKrf}x+5h&z93vfx;H`PznUq;svIy)ZBn@b4LxJ}f5b_04E_uRkeX z@7w^jD*ch?jHycvIToFf=OncO#BKD_xh8($G5f%LueMXReswp2yz$cff#BYYolX$b zQVI!-5{wL^9SU&@MkyyQAl@(nQ^K=D*q6(lEXhf+7Zs&NnruAYR5SWKh(_^@3U-l(|I?NztV(U zSkQJf1D@qZR0Re~G88#>T!2=1@CyeyySasyOdlHQ6lB3(2A_l&J{nJ(z6xy_`WY=U zcls(=Fy;bIpf6EHgN4KpWwT~m5f3T?$IqF`gLuI#ML|#JHHzrWg6M3?ndCntAUD+B zQh^THof%{mK-$bf-t06+g`zfE)$FN+3_<+jK%Tc2G~;+6YL^+{c#MWrsHsso`vV=$ zt|GJq?V_aIj!6~mSPQpOi1=;NPv@HnQAPZRSUQs_!nl?{W>!M#9Yts`4Tr1kt)PL2 zES@yLXMk1i!G>;ucdZ*WA6P*LNQ(Ii81>T7u1)-D4DF3i32E}KDMSqbSQoQTveXo%ILppo4L0K#lIda z2_}4OJ3bZeKkH_tJp-g@8UtbieBxyHxKltOjQ*zuz z3MV19Al~I(AciJ!p_`lrIsI6Z0fXu_HqyfNtDVrWz$j9BNMyW9MdfJj-LlRR3i z3AsU@NQ*3mxuBMBq8JsWQ+htF*4Ni1lbjFLHdKaLdzQo0*PKz|g~EF^A$}ZQ zg0^&A9<=ykaBZj{RKy?Qf=Oh%MqT&c2v{4 zcSZvdeYRNWXghtk;exPB^_3RHDHEY?L-f!h$MO3CgDINl1+V@iOJ#^=t6gX|eGK*( z+{NPl`9QHakFXWzSA!vI4kGgSd$Fkm;b8~LbvP;2pdTfWO*1|BfNY~r$^^4;{e=$7@Mm5~X)pNOT zV(frBLNU*1GJRL0N*(N^lr9$H1Z9m!fDcxLqW2;maKqUoAaBr4;{#qacx|HJwqen! zvZVidN#|L{)%davwW)psAUG$cF+lf_PwIPrs`PjFlQzfB0(1JMV3IPoPFBg3UxP+C z;jvVfjHT<${+kpcSvdj~#{pjQSuQScJtPMOq*fFl_z5J=R?dRNZPE>gfXA!`=j;Wc zFoSvELDe_rfGK;hJB48z5{!~JBkGF>^rFx_3KfO&eGVckI{Wr}9t$>g1{1a7rkwIu zq%@wyz1A@Dm5~TpsEB{KE5&?`8If~ z!x)v{B_SJ6<5f%i_Dy6KQ=3fV6Yx*;`s}gPVpy`JB=X?!%*jBR9--03hWbg$k(1_r zzZxOSHab+$z4)mthjK$S59)+nm5()}diKS2UPkavtAfmHLnrL%niOYz6Ye;py8(Kq z_{5CtopyC?j3xW$*Eu&SagtxIPpbXR2PK!ZB-f9Kc-dNp&!Ruhbs#>nrry)X1;?rx zD46$uei8olDx~;vC;g$GDy6oC=Xe!omD*+vBQm?AYCtcW&gE!`qvuGpTkZD9zxTe* zG5DeU+$-B~fX85jC$#CvPj0CY`Ry|=p5#i-*}3oGe5eJJ2$t*g$Ih5?qm+eoQ9q#| z@%Z6HF5)Q*-X7(A2Hea%HGPzgt-1vG@Ms8%J=&m>&oP5r#W+bN!=+TQ=VMO`!ueX#~8;P#4N(KW{x?9Rt_q`U|6NLpG z2{c&H7eWCi3Z}Aw_5;$GZ_V7?p)w$L;7Igkvmqy%hyF~iz=8=O+$Klj9KpYa`>t*k zUj#W(;AaAY2j@>L;F=WJwaQ)Y5rDs@ledxB`dolF0K{A3H+150#oeNA<_V$GGqWz| zr@rV$fm-5jUukN-MWUazD&pL3;dL7tRPiiu{KdZDTG&JkkgY9gy!s`~A%hm*@1N?X z%yH<6bN6baN4Q>IywLhv<5#_Hypda#pD5F_rZ!^1_qR1KeY87*mt)ID%1-Uri*v_V>PmSCP zgRIsP`MGTQX~X<94W#u0!ocW8mq8*r?r! zk;W6kbHI}JbufkLs#KCGCln2f1_c_K5*)T34yRfGco0LeWhf!laMcM7?-{L8XTBge z;ulid*V)B1hL_OIxcyP6ZTwfLXndTLfqBkY(9X8zs^3kP z-__}3p23h^i~9Vsb-?jJNynYo?r?YvvxRQ*f&rPBUBpxYr9;djb2Zu@E)t|7n^~L| zSATj?6w!2J@FofsNS+L;PR&XSvu^`>7WW)!5`GRfp?l>4IT?t-CYp1Lcyo@R6o6Th zMmyjL0$`)qIy_-}jWu0>021lRZ2y8J`1p1Ziwg)@E=3ozKb}PV!Rfy4UXR1UI4(+k zB?|I9ZAagv6^9CZ_T!@=j>OVSus;}h-v>@ZlCa1rD zI}d}rR5O*g*e{!`GPyyX-P#}B?hf?Gim6aeF8e)3*;|Yw%#D?EPIsEz)~b=i%Kpho zzxb)DQWXD{Wiq^Jxp`6FOzu#q5{%gTeW2`7{`ZdN@!8)w^;V2Y>AbT>+#S-~EIe#c zigQYqpb~aMC@xwaC|c(~aPuVd_XT(3=#f_pdv{>-!z$kn(Pa4~l9G~9@#!PMwe#_+4emnrM32RA@rY9PNK=iaJ^hOc>AH!T+CQ#Cg5?I>96De%e{Ti z8k$D1@S7(%w+?x8D?dn|WCo)=41HUJ!{gz%d#vbCdnSMW$$ur|YmBZD$4=8Hj-3k~ zl9hqGX&VZk^ zTq#JHwv&woyX6<7B;P&&RISgL-k4;YsE8Mldw*J@#Gi7D+9Te2i&J2*zy0~CIVd$6 zl9O3P?xM+C(=6Kk7ks&dcyWGsP=ZO;B*()*Op|x{i%}}aG}vJhXY?elM-_#Hl7(Yk zWcUAR0RZxB3b3vRyLQSL0~&$|d}97u^P^;{%mZ{}954~DlV58}7*qRt5D!SX)G4C| zoVhv6{c(2kt0m3%Rm4ph%|jg%WDw{4+xcf6nTU8Vo5)I}xh#J&!Pvd1!C3dWbjOJ0 zBQHY0Qy^n=Q~hKb%OQ4ra&SRFn~1F2wo+{aqjhq7nzn5#qZ?FCuwGEx%qYNCIb*-j zQZvl|H&wqlYtAX-+syqy6GHEQ?^$}YM(DzhGljs_I_K>sk&Nm6{viF=?5=+AB=<7v zJV$PFii%mSXFuXg#F_q7S^xRQwql-#oqu)2L?2@e$FH4G^^QmcgXOrvg&`aKcTTBE8 zE)5N12z)5A`G9Sx9sD(%4;*E*8=M}Oo@FD#F~pX&NL%nqjjvH_{y6j}LsFcAaJgz3 zr8mKTtoLNejs_b=_KpVHf92%Le~*dzDIX_8`sF)qjxZ5m+jgIwXT0FIy6hfao61u) zpdcSkID*WtS1yoC1-T0&qt}Xo??LMsfa{Tb!>aiOLi@R-;5Z~J0fmRXd;x2`4F!s* z0OySAA`8g@)^V>?2+oAve{I31=23;qxNsNF`t$<0oFV9;U}m^YBePAN_CB-~uJXlU zwH|~*vrnYVyt4l7?*))y@a0G;=HLs^{x(G*|5pMbFcmvg*iRQ_GqQ#a`VQ!8y{5D( zY4T7uZM>>5Tqs)69;+k-&ZI(ZY$QkZ^iu#?0O^9Xr6s$+;baa+uq{q_Ditz*e;pc3 z9V|=%ur_p2p8JtZDg+oOI}hdLwRf$l0|_T0nv!X+0lsjwLEydzHQ4>t`tIq(L-oE- zYaz-f4|qj_MVjzQ2^<8yqvOrq`tS^WJo0}?x%D)mZ>XvmlWuwFRJgS=m0Sh~R?l=E zBqaY>m`khSy!FHoM*;;@UHFZ-;Dp^&94WE?>!e<%ivO0yU!$I!XHt%|fds=;A(|Ai z_-i7X^JNj$Ha;NicvtBz7YL0GR10>Ju{I`4^ zm;QtNt|AQBJU!6J|{6w|WU|~h_LRt?f1oM5CFMyZhPX0mZ?$0?Zxka95cx^U3l+{AUU5+<% zRJMqmnVqbZ>77Dpg3Z7@^F=J;?@uI!07e*P#fb)O8Zh}F^TDh5EG3HHDe$;J3|t_~ z1VMrT!~O>xED>chDVPfvbW6aS6wL-mfRKvl4!?YB*Y^;P(oc$R4m&wN{1la>0(aq* zue5v?gS*L+{xON=TP@am6@-fqhLlx2zADYFy*el3~&lbBy*c z1-nTGLp&W@B+!WXM@+po)SeHDU-t{5A|ne5u(tiD5u95(z6g~8fuz$(E)$_~u_r@( zHS~NxJdD8YPWHN%D-#%;W!@s^^YKKT;a#0$y>7tcr21!jwJr1bg9AuJ=vV>_!I?OVxzN;fjGN47925`46Vtqbi9O^dsBG|n ztbi8Nb=N-#Ag0i7EMb5h7_@SbHT&DX!_jjB(4>Dua3uZYP;2Ay8#HLd0ls^^iHJWA z1)}qw$0#ZF#_Du$WU{&yTPf{DgTOX0r$B(KiUS!h0yHtWPV*szxg!X`sm6Qrs%uOu=p!nTt4N1uM8R7#hX=6&7JyDaE-)4p&8FQZ4fQTLHDF z&dR)?!E}O05!1@p4C6glb;mFRR|$Cnu)QG1l|Mdn7|a3&R+UEp=LF= zzhlh5&%&cwjjbIsMWRFU`SCj%d7BkLl_{PLNPO~TU29cITM1UglQ`D`BJ;03dj-T? z%kE1x!hyHKLymy-V6g5mrrVlZTiyUmRg;CwoS<)CLBik%h{UA5oKXf2&x`~``hy)I zNC4pCEq473XIxzfna~cjxutT5XkpQi4xTFB`TVJZTpEZ<=@i5d?l==Y zZh|0jyRfhSxx$Ad7G9uB;0Dh^gSiBdHU4@c4PricR(7vpq06+CT+4#OV&^6Jzx zuCgytBFPh*$_t&K=bz&~UQ+W@Ry1=HjP@?>B1C9opRh;v{Ho#a@9n8b)aAnF94b*a zE~Fh1$l|B@qKrH`t=6AN!r1L3y)?7^Hhe1r24s8FC2y=>;*r=LZy~>~CTQkqz+-cx z_xa2UXWAAWOwAe_^hBXwQ-TdW|4KO(Fcrpy3e(o(ZoC)4wE=c4{A3*(w#o&$w2P66 zX=IBwX70V5gF{8U*_EqbQo>hB|E~%o6sS1i41fw^ckk#+v`3a_xRuDje;egJJOz)Q zWeCTPm2qH?wFH6xV`x{Mf2#Lw#?H{Ws&qIx84%rPP%t57&Y;!Z)@s6zB4?jM_03C~ zYjFyP*dgWf@2DA|_;hkkF{M#WFwrHLLf%ZyyCabmN4Vgwo=4M1SsJ4=Cz%q27_cOf z0o?<1=^t2X)CDiiC*AmrB@`W2&2AzvB>l$h0f{97Xup{d&L>kZo#f<3ib_WDp{H5RpegjwKVtp%+sGLF(#d7#*(;+-qwFE^PTVK7ax#u zq}OoIzjOE+bN%wG)|)8Bh%72;@m#*rn~&90n>G`^Rj$+RNma%>t0iDJs_EL3&+&?3blp;lmwk(T^jNAmjgC(8 z3$8XfT7@Hk^Q(^|I5cr}0aFRP(MmkIJs`NtzwBfa6rxZ8T7Uir)Ez zIxa3iQM#sO8nqqEDnYlG9|naaf*z3g+~DRt#?E z(uqQ~0&Qv@DAz<4hXKo3k58|@V;4KH{2PnQot+w4h_iGQde}GvB=cSmZ%B7E>-=fE z+I|sE`7=u#pTd@P0T1i{7Jmo->y|EWP;a93l$Z+w7|r*w{LCVnlZFP8U8-KxXQHYTZBATwzT3 zi3jz~#C*Zz(3$&zQp+)CM)^Jv%_D(Aa%b>&Q@=~cU%@#gE29x*9b{OgUMbO(Dh|lN zS=nP7w~o>Ff%nsAH2k=wul+~qKHa>Aw`sM+k2-s+)w>sTsLpTWH+r|{zqVvTKhW3w z^4Q*3Oi@WQlGYQdQQOvG)gR@X8~CVw+Fvi>GRZDIZ4tQoSY4t=_;iB0HvD+$K1f~b z|CGA!jsAV^VWIzZ@x=FT9zXP~%U;4J<==L{I9Sw~;zK!ZC(0M5PMj^yB!W)|tVZTj zs+*4l#RYz(3F#Jkn)xi>EU50XniI2^;5V8T*=XT@z$L5wL~DdJCj66{#4l$kK(0e9 zA{>uXun&tEaN48{21e`^Z%&Yw9XLK|&f5_X`c9Wro2G{ysN1`i_HZgf+$+m<3*6Aq{mt(*E8LMGw&MvId9Vaq{-_w5-ajCS z43;h0pKdh;R`^5^1cR-(Ko<#6lz~Dt;C|4Q%bA3JknSBRE?~=G{ALjgWKQT^rdBb*^@OVlSHNFc2kq>%th1l zNsBdGc-TpN>gG&ILNW3QZE!?}E0D=XrK{bts+Eym`MB;V`d6BqNkWFFiwE^5B_Qrz zS7B+t!C>M&u=cuA3nz>+UlmWW;tSC{0oZR!Zb|xM<($3#na(MPk5y|I84)L*N7)oh zagK!4(dOKJKRB9)oyD1INmV7O%BozJP}lPhT+I(DPMh%sb_gF76hi5%RuwZ$y00f1 zBnut;`clb_PlXidU3AM=3=Ev?)fUi5l`PaIHfXo`_ln{@vZ-JGo*9OXNw;1RWwg_| zt9m_Ok2U4LKCv#&4xdFV3s#UiO3zejfBG|)5_bqJx%r#Xff86pEHcmn{ zk2BGyfMc?J6xd?0euC$hi%4+IMbezha+4UH+cQ%oDmSfq+{s5UJ?~#Xk4!vhD{)Rg za#W~dFgWwQ7hR||n!QP-Z;khVoVG9y>>Tx1QHWoD9!uROiLPoCBYkl#ID2kE$8$_! zi11`UQ{R0Ph;4VMebxT{FaE2MR>GGG6{P?+n+)~G9G**i&cL`~7C)*kOShgaKQmH? z-SXG)K1Es?ZRDVC{!j>s)K}3cYdDVyl|(9lp$fpNAgmzF&M=RlW4J~5I*pBy>H?dv z56V7MiIcgr-^(y38(U}gCHVKrTo+cjJDrA?R?dbZma01fJ(<*3eR0mjpI3|VUuKsa z^Lxjp7vjGB*A@!gT3s8$oryk&um3um6zIAEQfTG?_vBN7KfO+iI*BKF!mLa@mSVq~ zf3?bEh=QRf4C4@k{IH@(ExE1Zy*aN&g9a=d9gK%Y8pMzBhYJG2v+e#2m62ij%~lnP zCKD3Q4sz@^DFFez#F)1+iH+ewmf>$XKvou06v)tME)94n&Q1(SHIamH^6jJbqTfa62DYyKxBPTCvrK zWp&t*A7ylexxsI(JA`v6Lnt)J4=ou^aiHoGJIK1aIY{rfZ=E-Pws~veq%gcnhtPsr z9D6l!^ElGrb0|RZjER5**cx+d_(2g-mPiFJ?W2XMw~KWw3+=t}%bcBjZ~S$HAHkFrnfKfr-L&z#L4!KmTR+|i3oktMRc>{a1TY18Um)ur zBOaEDC&vP<^r@B-weM?PFK+*br?>En>Tmjomrh{`=~zlY5G16#5dl#IX^`$N>0XfT z?vw`UhLw=+uBE%Xp7Xtaujl?7&YYRg%)3PY9C}^+7WP3K6uD40L_3k5trh_5t~T@` zAG{V=kDnJwF27lDnAGM$j0SXF<#Ws7RtdInS28Z>bGTqxLKvsoYR`d@mvt7DhgkYRr zkkMC%KN6Vrh~Z+`f!v{&h~L2#WB%h3`LA;+70;Re1borrs38cVOxBt%&hT>*nQkJpYYuPtuexUZb(mEz7SgEaimaqsvUWu`K*mU zy1;yqm_H=P#DV|rcWCy18JV%n7;Ux%khj%qc@b}JwzwsjF-<`6GZ$2g-N`SCb*9|% zat%_k%-37L=atRqz){Pxm5xe=h1sS@`=FnTTmYWB&E`vT$I3MSmSKMOw9N%YwiQT~ zEzIm-ZTr~5Gk`pJ&DC`F08$op;~LLR=cNA(zxFG*GW z?HxUtPAQ!G1E&oC1@6~gdzyqPjx=~ zB4T`?*4xIGM-QKuS?^V!OX`;!pUu_BTAwZAmjThc@j9)B0Mu_0QdsX>r_%)2!ENe&cU%j}x`Zw6;A={Bz&hp4C2$V7xp7__@cKqnl7% z^m2w-cGY@SUwAKXmh6;Jg<%im2Uuf%2_aB2JE#~<1x*4?9IX>+J%38gH=~L!YQoAT zxWH1bF25k};Fpc1TpHFyzLw%I5#6p^L*_8|GX?d0kDz~^}MW!mQ| z$$O92X8DNu%jZ`XAt<&<_|#gi5A9{#C)I_oyt{|29aZNL!KHvl^?}@*YP{*K8s)zZ z@5gIP%AJoWh&hCde=z@UhOTK7$*tTerALiyF#6{?#-j>pO~`_6jgp-QzXg*RFVeNSPkh6#ULONPPiJm@y5)fGX= z>;6@jM`y#CwdYd=qkk6gJ{=Q@y=fum;HC6=F5FS)$>QaW;4F*3YxL>L?Uz$FaWwv8 zMxtWGlm9202XTfdn4Fwpr2Ew?EP#e4-5udO3?>CAk3HB-u`)4CA7H;KBEYU|E@aSJ zZl$RTAQJ97z<2~g{+NJ^Kg9|;SUI2zFwJ*{o(vMkeBZ*j{mc{&R!$H;>_R9E{f=3awUgoB%gTK;a76>Hu(t~ViYm?aw zMq2PBH9~(&?fCh;8qwH2kQHridBpNLvwe)Ae%buX;#?izL zHWv7MI>^>l$7;%wyRA&c7Pc7N9WWNAMny!~-q8_PlUk2E`?4jUl8Vto;r25*ks>bi z-)vMwYRF@E9p@I~Pr6sd9_d0TYgOF3*CF$-k$epFyg%jB79PCAlh^*xZl>JW9u*YR z8tNrm8bYk2mEn?gG!kG|m-UFOJ|99~|1P1 z+eMz@%zs^zx`w=fHyP=>jNV<612ByiK2uw7JNLCL~B=F?0PV2)ZQHKVW$9$w+C4P4akS!xaET17@_eFn%l;<8E5CarKq* zl72fgrrmw#WJl?X}V^0#OK1)g{I=NY=JoMK-n)=)UF6ySE$5fTW zuAd$T0Q*wU1JRd7pZ;Z+-R~tp1P~Pun0o#5{&4(2e#NUm0|y%nzB6>Qi#_B#sy#jp zwO~uGQ^nPaUuh%mgX>1+*C7&bsrAz7&Z7Gcyc562Pyh>k`n#wk$r;wn!FrKDGq?`E zHax%KOC^h0Cnx+b_KYwKBiic$a?oww-4dhTyxx?2kfliz)tSq|14$#j`gS$#NYdoL z{l^3A$Vpv{?xcEmNAa!ztb*RR{9yid-Y^@zGhvkSJSN*DcSg@G-?}8#yNC2q?9PgJ zsz}pEvwZlO+xM>_UPAI9WmoM${|Dw81>eO`>tHYzz)AziD}G`G`60QHG{VS0xQmn~ zR=crmIHhm7m`lDHOMnpO_d1E+%i6_6^cgd| zXA!36B`61$YzN$m-?+Zet%{uSoXL z?K9hvXu#Ch<;ZYD_a3xW(O&ekKnKp4yg7rsnY{kct~W(t&qkdbj^&po;tN@%fIwBLJ|-%oBSLae+c2Xy4VKC{qdIK~3f0B4Q0L z?CVwfq~yHz$e6>qF+FqdlL8qW1=3ERl#4mOUT<@DEB|JcYVsUu4<9UwO!84WwYv4| zFK`=gQ+$3_W1w03H~)~$G}aW1XuaoS+vVqzm%f)9u7v4U^@j(a7qpI(ljmih%ik^U zEKa%azL2)13s+Lp4~8keW!x}YzN<^Fa#*9nt!i|k?JG26dta6jUqW75*ityn@oO(zgv(cM9`Av)ix@Zsyem zI&g1z7rnaovsX6U6B4Yyf9+fNN#Co7zqZm>-*b-PuyF|*)49(?d9v))!sO|RVJEfz zPT~$;Q`+`>poMHhQnl+!Op$U2jc)>QV?UEReMA~RqPsgk zO8R~;xDG@Xeynv$wdMIYH%LILmeJHmA=XG+i(tvYBR~;gbBo^n+L{$&I=5?QDy}FU z)<@ba6WaORrA!R)P;N5F^5xs{<1>5>rq0Xk^TGpDzfFh&Q}1U)fTR4}9J)TD!SBVE z@LmDa&;4M@cHN7|<7xjs-Qi8%q-oz*Rqq-cZ@2)2%0>^5Mi&%5hzAcn!Wf7*|B^>o zUCyb}fda8%{Fvz5_|%FGGgVOZCmc?R>i4g;F9QV1wBf%I;C_=vZA89qI7@8)HDT&k zwPO-*C#GgL#8ZBUnd!wUU@$)XX8b_UG4givOHB*D*kk3>RmVlJlx9L!=2Jw+-HrFl z^LX$`x&D#SC|`-I#CZK)kM&}^o3~;dMql`DnWB27dmA_Z9hg-RPuuz|Z?KxdLPW7N z!JAp*y1}RVaF?=VKyRT-z&+k&Q8d}I(2|%qE$CUL3t7zUX1c6q_1r&S!C8R*M6=X4 zXn_7%gn> z{SKlMZv>GczYEk2^gtKrqIfMLZmZ9zMrEwfD-($2h(%W(Z4p`~6gD%#OTMRAd3nWP z4nP`BOC%*Co-{aXn2TM20$H7HE6sJ4xb;lR`}&GF{91AxU{+b_ z8LtR$M=hw|R&aTi$0sQ4m3i~Aa3bc(KAmR%F-LtbvLC{07~cp@P#`6mq7Vn(#BT~w zKD_!bFPp`WuM!b{;o4hfD3XTt4ltSGABe{&EX=KoYhLAth%f?Dw{R;tGO4ePiAKm2 z3LrORxPr>Q;h8aHWL#C8NQfQLUayydJ*ATfTG^^K?Eljah$#HexV`Sz!#S?g3Lh42 zzvKIHv{6d|6X}H@Hsv~VyeW@6AdZByuTr1pOaETT>{3{{kHAl`8j}7;^Vs1Pu74do zisjn>T%RlTUOp-|EB|Z1@Og==1bLI=whdM$D7g36|8Ws-Ya0LVyq9QoxFk*b3k6K= zHyVcmw_lx>37Ne`RH6}h{0??lWg0R})9dY9Tn_L&9_q4dIRlf%7CeP|O$S^?S3GVK z{iZO^n;2ebC|kPo5`}1UF3#RED@ma3Z7ilsUAoN3NQwo>vw}|ss`dUZB=pU2i>t-Z&eUW{69Uh*wii2 z7lG>66Yks5=?~!LF!I`RQ1u=&H`s8k%TxN<%!2 z!kMRnc3R?uuo0keEAgK=&358gcRFIb6Ffd@@KxG&W7V`4%*E)dn+;V)L_IMLk#5G# zE=hNsclVcc7hxf`c3PY`zDK)TN{N*xwa%j6`phD{W$8XXNFjx?bkK)gu;g^N(Xw5h z-~cN>IEjn*T-a$HMjo#KEym8{#77#BylCzvsMa8&EBhMHA~S2?i0be-{QO&gxhXYV zPj;GxHhm?cK$Jh~dqo;v`me?jOopE0>|H&4dHuao2Vt|nyz#Rj+Wgl=vlX6?wT%av z=;-7ADFD*IS>@CNnv%>$*%hC{D@G}PEiDK>0#%4-E_ufqQVlr{_R@8zx)z$`3L(G|&|Mi){x&O_mBHI;bc!sOV(M<30n=pG3xTut)xyE9|1j6i+QnK`T@!pu*tk=2 zx8p#`wN=avCk_;lOg{?@GeFQ&jSjGb%R|; zhP5J0Uo7VcaBs=dGSHGOJYRO!Cb}yam`L2h>K}JQIy|av+m0tID%n5%9DTpii$s91 zV<@@!bbgQYlli1sfPGZ)Xc6sM#PqB!;IW*)>0m`y>t47VZGUE8j8A#dqVsg&XFi)h z^K~1(N##hIgwUH>(n%>Oq1*lRUN(m8No0NylixVPK0?d*C!8==_`|Lywt$2Obu#ndap@H83H zc_znleJPD6yS)LY)bL~=&Z@t24&5F&CWZWcogFA%^+Jv>T@?ejK!yLNmGBJg2J~aH z2ynGkml=?H7%X9ji8VVJ@$li@Ie-8Xq71ZTOM*OdomJp0%qp| z0Uv(Hbfy5hYxIY4CtDf^>c{}zDcJ?Wj1F)p5TIxxjxh%|?W)oaU@3&yUtmW6%}b5Y ze*bxiK)3H9Ryushqjx(oKjKYZfz<(c)Mam~6i00bU;4e^Jg+!lw>O^vcq})+n<`fl zZKVK0i`MgHzB#$|I@ne(Eg$i){Jsp;SUlMBXwKf6ht@AB`Sfq#%i%PCNtm3?(tKZs z_V`vWW~Rua#M<3$R{8Ce^aoMaLFt0#4taaz-Sp$kH+64+I%bVZQz}dY8i}VC5Fe>r6TyxUZ7@{LW)i=*G zx^cwoSFc-Ww%($dB7(RVBguZm&4Z|a#4bg8KkR!t)Scq&tF5Tlhkmi?pSH4t_gnUl zXo@%LIyhWq9fSl!G(aasAdOLBO#g{@3Emf*itPqm<3LAHGc0`;RzZ{nOgBbJ)kef4 zsP}ajcaMK6b}Yhe7`E^H$G}Ns7=jeAv76#T=@4K?nP6zt7#jvG z!yA(h_N|Jk5LZn@qB9q0GXn896<^|I_!fH%(|zA)JQRFchI)Mq z1xJqWS_iehljkF(oBcItz5V9f4;JZXwts&QtFukMuP_5aNtY!pRhA-(R8XXiKtulS z)eEjUfFX|I-LTkRGISQYFg#7MEH~0!AxkR92sUpuQXsI;dp)Wb#YWUz@3wqx+h$ow zUfa=qwUeW)gsj$*y#2heZtl?^z%NV{iBe_xSR7Qni`{w1AI-MoDsnquER7;!|1e=$ zxj*p?qa5=_!T79u=`i5RZ|kmog4=zOl<*L=P;zuOCuBl7W37C1!{NCDdDf)y~IDbK;SRa`+@FD1enYDc316-P9W2k=&O8$&p$mhU6+n3 zr8=7W-ha>#ziaisb9KM9C&I%+cokK^(;tIOCZ&li>?a^5fKW$274{jcKQev+vx;C$ ziMj4|E<)f14!yOcqJoTo;XT#tQuQ%6u$(7MOxZ^K^fa`&O!T?@E9kxAe7=4i0W=;R zS*k5A0zSL?5C2sXODcQP`8!#*zxyGsqtsaS4L_Q3w?YEE`SeJiivi{H1nx<>x0`~| z+&FFnmN^a?eB(!|5NkfaR45jfq~GgBln=&ZxV-P_P=H+4SX4NOVt{ZEQyWsj320CX zBxxaRH9&}3Hl++yE16h|0+pH`gqvgZaRM`zd4M(jk%S@gAeo65&8Zehg5Q^hQ0-(h zeepoPbs-FFcbH%SLR=>!TnIntO;9Lb3hO^~p#-hK`Vqm(lR`?O`TuquA65Gt3hzzV z>GAUP6#V0+%5*5(t`f-Iva&v>aI`O>C+YInD0XsVaShRlHrJu3D z)GHN@X?(_vo*K~w>@*Z0b@dx4 zcmiS+5#B!buAm_=;93wLw?=A)xY_p<2;Ch$SYEKtJESF@c;N(XvkZ~@W8tkwZr{R< zzSL;aK(B|{qEjx?CZ?$NW3`Mw9I)Kz@TYZO^F4v95B`~*FvVzLoPHk@5aG$xYg}UKepZ3ERhIv#5$)}% zSUpdNsKC^e220?jWup&`dD4RJi12~k@1Z9FUdcVLW0@(scA4)<3{{);=5I|Rl7RFq z(l{{+rB$>o7{J_#GP*P;!4vh?)>N$}0+{SdGWjMH6JkP{)%{3kmqhDk(j&CmVGr#~l@O3*99zxG!@pbD01PicoPZTjALYnzk)Nt$GzD3;lho{T3 z6ZdcNmv)odO2A3`M&t8Ev__yEXN~n$KsdI~<-e_4k?}uA*=B~7lbE>UjF)a4dXC@h zKM^u8z!XC~o1I?8KFcK4sq7sLdKDL{?WM_Lw7sflpHUVP(iTiid^{~Bv6(B9ss8oa zmZR-OOSE~RVe_G8xG-k4?Y=+S(OPbPX~kjcF}=*jpD&>yy+Ye2;%=ir^_Z1$Q;+=y zVf`=JQT0i(`-FHS+Fi+lcX5=knA@1hOQwziKbhcHnJ=ge_HD(#FGS4WwwoGw&-MPP zLzSCH~QgWvi|Ac9mc^o-@QpsKQ2hRfE1QBsx@g;URw-fHLHp4`>%l{ ziNz%NW_V^bSf_7Xt<>i4{G72@x^T8Ux?dqZ$AHl|HTnq#Td$=gg{+izk^{JX$;x{E1g zcpV-wkA5cAzBH0<6n540XqWmi8VUYYbZeo3M`EeEpxJ~PvFWfO%$qHr=A$C}-NRS! z8M|Pzh_mYS!NDb3y{t@gt{%H?)?xeNpz)`5Bw2Hz$Oazg@%1}iZij1q<1aRBaT^<4 z>`65?RMs{7)!Na3)?(E!QAc$>XKw#KB3e*5rDa6vth#8MroCO~&b}D#6gq%9i$4jQ zchK;qe$1m@nVLF_`_q@@QNR=f*JLaHGqU}xBN{yGr>8OJGuM9QewZxyW{PdzvyCLH z(yiLY^54kS%@e}8Q~U!Jq_s-XVc@q_mk;95$k+$8%vvr&+2_pPaV>&FX+X`PTOniN zY)v$kdC&~sy5IlKeNv&8>7zkvV_w<`IK}fm`?jU0{ZY`P>dr3hWbLUxCO?lam0_DY~%NCO?UXBIa|M?cKo<+285jQ97 z=rFoA#+ljzo0p^W-haKR#wE-($n=45Xc|{GpZa++)B6^XKO|ozoQ_m!leU}ppPI}7 z?sETWY?XTc6Wj-XLYk3y58;Fu7JNmQL0<7s{YV%Kx%dzvI0X0d3mKeB zNEQ?N6%l%Y2$n?#k}Sw%_UlnjngtR!>#2Hr)$Em**q z9)~WEbVjnGEGATRmVpAVj&vo1K0KGw!H7Fu)_P0SJz1ALQ^wL!qEm}Mf})A#bCMDc z{BC1s&4h+<-!Y>#Z2$|tkY_wDK`iY+oAGB$1t6eJK*&nZA=h83qLOzS_b4mg+@uuxO>v8jMz%LtQUv=Fk?gxK8h)4)RzTgp|U!!4I z>Jr0;DrLslVi)_qFWjf{)Y)xAqH64tPHxC^=U@N5UJ(hc)@IwFe%ZIxvu-#FNRxZ) zCKjC?UB!u)o%ficBuA&-=WSzuA#a{KM|NAT#rf+szdLHUm)TdweJ-AIlvkpi5`SjP zTXj?S+0=n9S;3fr1r?Oizp1@a!_K>WzNey|$sU7$NDZ>H2-o0CXQEroKmlj+EA4G; zOd+sjH$L!_@gDDh0@b@NIjk`=ciwm&J_(xL)_zVu%Bn(lLtY1&cNY^x;{5RA!_q88 zV-qBO&aRR+Bp#+8Q^Gq6Z2Ui@BEq}2X-~c(_+H^c0rsJ^u9bhcwBc81hjdy z?(tmcqFP=5A!5_p2O%9ByCFWalejO#$C4cEKY4gl-M@djcriU$4tOVjd_Qu+ey}v_ zbaQz*blECP79m5&K}SR5CnfnoF>p`I2uzXS#u{aU|hP-w<@fJ%0snXYhNX6B;sPWtbmRoj>TpGL;UCdL_# zEhlYlJH+E&qa{O+#%gLA0^hP8GftF$1JXX#g87Bay@EGfNR}$a1m<6`y6eyb^f4K8 z3KQh<$b+M8;AR|YvvE=rYXmEhQYVgWF_@LvPoC>{7@bGt4 zrwdLD*rN4UUpL{3H|L8XWv{@l;&oWTNaO3)8R%nIOILA5Kw_y}U}Gb0n@A@vT7L<8 zD+LllTZPvdVA%lCUKXwgT;>=ygvlEaZE?0mpiqlDe@Fw zCs^FY+?*ievD0~TxFnw|xg!JiOodXe#lz>LQia`COCK_Dy7R7b!9FN@$MqyrsEEJF zNl)T_;eB0EK6~v!8D*E1&d2p9!$Q=L1Dl9jTZ}4jMTDZrMXUC`!snjA6jjEdKgz+V zYINF2s-aUV>;Cwi__RE4DQdvIh}rzU{PuD0*|A8E;OZ6UGM`dW*vE@#uu|2-m)RbwA-85SxMQ zw!oGe2DaV9o_Rj7Iu&vRAhHrdgq0h86ov4W(X5!}{fo215I%jtgWEiH4&p&Z3{r@w zcwGE$Ap*-MrXZO6_YU(3B)HetF1_#_A;*x0TP?%)k#vr@mwt^WT(4=Ue)WD52Fd!3 znn^jMf}`pR$hJ^(ywRbqX+N+?GENLStp7+@`H(o*{BsUqn8bZh)svMltlc8W`IddX zGBOkM3!50B{q*+YDXU%K4VXHGK(wZ#`k7YW)Ba6E7Bdk1m6X}ywCTOCELBrWo+xjB z02(P_NWsNW2in??KXgT-Mm~l_k5*;K>jd=^N;=|$RC*))0;sf>g1V-xYN*NqP0o4v zjFFHFAqu^Dde28(QAdX#H|j8(mZ#n=xAG~9NXnwYgm5nBmC6m?cWSq^b0g;8Quqip;Y1TP}ee!EU;T!(uLHHXOC`PPhuuDm%q}-gL)C+`^^QWL<82 zh#u?&T1^`6=%O{wnzbJvfR?#|xtUVFuvi3T=i>TJiY<-P<09JEWAkIen#k2b-C?w6 zbrs9aht?+=Z_w+X)BBikp*Livve27%$gtPqsvupZ2prtVT4p7o!y^3P0&W-{A63^G zMtWfC2HtcIrUB5?Ufv>vETfT~Ju*7CfgAL^0c3Xts>!%{Y=!7E%3am~D zW!X3>KtKx59fX3)tLn8>Rw#SaP7NW~piaSyvMT%;>yl?3eR*z`rPR|V8ME>gQJ$hJv^y&M1XzVb( zdy4%2=vcL{bvq$Sn^)xCBTGmazWe#`I%(;a(SuedySXS7S+U z4orcd>Ice6?nCV)P--TakTo#}zr;s86LtQ}tD1^gH*)SaaPCf-`a%vo!zT)BFu3+$ z-G@T8Yr?`i3is7Yj1-a?cHO9fwydL(C(G--IK%f2%qO9{Az8n#dOmDSncH0U6mYk; zI9>LzaMn`hkssO3zvbR9wxgMP=_kRP!A4~vVj}^(urR`*38*K&e5#mGM`UP^x2T|R zZO~2y;8+r*__U(<+ng_(=Gfm{u{}?5Ja4B-@PqJ6x7CVu=a&;4m)xBJM% z2Q`3_3*+JXXOgOv6)U1JIxJ5l-N9D*+9gUCQ4!>JUVNlA6%tL$@*)uJqV^%yf$XZN6B!#4S0-w+QcRAhIZ!guvEy-nmQ ztUJ_nS+y*-(V4IPI4f+aAGeR_Vs>6t&IjyWc%O;W#$WYr(X`SmH(ee$GYIseRJ8pT z3BN(8S*~|DA3~U`=$j!vSGdJ`z_c`;auNrrvg|lN)SO8^A;jq= zwa$*L#ynk!^ZCB%`;zwlD+IfQzy#AAY)+$U=F}~&fTtOoi!u$?o}OR=ZA(r3%PS_O z8Posr|8oJ}!A>1yq>BhdB#rBdQZFa8YrQhsFArncwOzxM*=*McTs1OIafPwJyT`XH z-5R%W+aCU|eTBU`XLK-F0Li6(RxPD|zT9}2*bTY(l=7<}kGi5?4h2ck#B$J#V*#C6 z2QR!Lhi{H#i(!h;Kj9P2-wN->DU1({NN0)I_hRWD*^}+Z`?!8?vT7c9a0mjLubW`7 zcXJ;Vm^U2+rwXS8Ot9R3ZtU}t`_7SoUHc4ocu-&uG6CNFBpEAduP;L&B{UI)|_t;=z|iZWH9hV`G-sSjo~f ze5ho&VJ-a(D~DpM*6g#|>&ua&K8D*bm)?fiFhw*J|a z3DI0}UERKwI;I^N_aq~nBHr!4(Xy4a5_kUM)X1gR2e+c6YFMwDRZcY@O+gC7tbBKk z^=tLHvoF#}6<`G)W-k8ZWNyNn=K8uLsiVy2__9*`PG8uh+5>ac(CERy z_jKf(2vTUJXR2kzo+q1_0Kw_KNmJVw=u z8#@DrDzzTpp(9xCIKPb*oKUv)S!x&P7QUPmd|qi11D;2Log$<>>mD*VZ&ceR6pu%><6kRxmAeLxcWG; z-5j3`dhL+8$D?ITx)8i>ulD?J%9R_Pq~=q58zP2L3*UkuX?_jOU*8< zOBF(F;>$K= zk(;PQ>rqQRP%mVcab7$k&1W#DvVZ|TG%*S!h{$Oj4;Xi_ZVE-5PZ$JOOqb)H5W@3uB3=u8*6j6f?36&}O!#<%gI)c?D=8ofohM1&OdK_u2y zWI*l#Z?(M?8&mL&d+aM%hJfpm_x9hj%*xiMy`4-;aapq>M?beeLK_sw=ea$G)?UA^ zZmOfao-Y?tMA-wD-8Smj5lJ1F7x>(SkH-f~Wl?q{Hc#Ie`m&&lvaY5nYb zgO~*4J)Hi5mLNx9R>CAZbu0dC?d`18lf-AankRDfB z2Y|$XAAb4xRA4Um%uWWxP?9d(S}%zsTtyGcE$i2GjKSyPy>P{s?fK(an+PF;>MQlk zcA`aX#N{HGRfcx+K3Q6ch?|s98<8}8O$-wHcg_oU<4Z_#Cz2P*Svd7t3(KeH0=Jbx zYxF-}IIX1kkbXe3gR*H<#Z@qJ@#zb|iJvXRJN;oYzLF*U+1p|qjET~8QMq#OFqd}& z733{iSWQ|IO5%AIi>|aqd-&>1MIPK37>P~qez>b#uU4_|thgvqx#|D+8oIJV>fx=g zX%Z7Er}l22#@*2r)&98MmcrQ@7!y0hW1{&df-uXk&W!VK;sjAx50u96?Ye(|wo-8k zI%=XS7bKSgq61x}KB({VjN&vla6+)R%50!~}sO?HwzFNt3NAex>M$5i}P1`-Q?-c`bY(DBljk3V~*OLwLedzXzK^VvWP!qb0Z|#d)Q>e zZuPxvFxN6rvygB#3GOuubc|T@bYNccG8v~2guq0b_GpT%#0FD=#_=caWVC6GTRRMp zT`9aDoJ-;y?dxCVZ5_-`P?CH2$kBqaxMpkY>yaMZ9?u6Zft91zL zpIf|1*apQ*h~M#rw&=QjEyb$rUs^JGfr_^ zODICCm<;GxySuTg$F$_)5s7~gSfrBCHoR{c$G`Fa(CpE)~WJ!5o?uG&t4a zA%cAz2o4OdrJJ2U4U4VC7YN`T1hD$%kj8Q&3cSnA*roSyxyYUZRXGYgiUP;u>kK7# z!)Xt$&GfHc{b_WHGh$fzSfj6wB<|oKW@Iv;Azs- zjS{(=YZmrDSXT*w_3x0dIh(SB0vom{3S*ws!sxxJ8VZ=PV4VU&})&3U}^qZ?W z!>fCrwDuN@VToGGM6tj?l5!!;@aPGUIfA+0GzMcXgO~#1JGpU0ZP`F1NA&HFBN4B;pl#dg1AXTl}`cd@QhN9MhvsFv58Tf1rEMNO@hKWGAfqs_z>a8YTCaayJSLG z@KtznOpstXa`AQ`C>;o9d4OPF{dwUQ%!&%r2y4#tV@yFLeKR1W4-r}G#{ruL`ZA%d zXX5^l6l=};T)S8Ka+>1bMVahyZD2hRe?KEsoDiv5|3_~VfCG>D8#~wTZTf`CXh!Tm z_ffXK;)nwtK}J@`w-SF1^+jI6kfc+5!ddmJ)|2XOAQ`J9~|C*5Sh*YJde)Og|Ezar_4(B#{qIy*hp~W|dLD(jdwc9-4-e zdlFE;Xd^foAixi>YjvN-;so>hL95Df10s8t zzcsu%2pk=b1{6w_-!m@HhR@Q-)L+^z!{B&J=A9YA6FTrA4mV1Kg)6>-o94yd2@E$R z^v~Hj3oCKqCw~;{sELu<{zF&u57f&6;MEV;G{idW=gtmGk|1R#qPbpIxWP z1)T;ba69I9L)dS76u^Cg8+TIMaM*4R%=kHRD=na-c}1%JSrOgNk} z$lBoW+!PL0R_tK(JXE;Mcg%wC`M5A^r-q>J-ze}2#4{emC21r}kUbw6lO#k5?!P=p zn*wJM6;8$|H2y5%B&zI$$x01DKolg3eOT88Nl$q2KHkQxheIgz|eSE50x=-0! zmfatmk&0`*xvgA(xh>`OIQFe-%_;urSCU8#Z>4BB_9O0ZGgg-MpmH8WsN=9+#~V$- zl9HXpp*qHrm<_c9s8`QBGP= z`Y2; zMeKC&;Vs{x7TZ2?w*xeh&6^hN_*b;e2eVyA?R8^5e7pfB$LS&a*AK+E&S_`Yegf|U zH{0Z#9*oy~Pw%s!=ui}WyehGK3@$%>F$`%1@H?8SnDx(&Uy|c;`Te$wbKG)F9Dj@R z<$d?h4~(rDGd6baPWtZ(wDKG9{ZO5~7!WK|x^0`=4YWO6JL+G_wmNj1Z%P04`LpQb zv5e?rppeG#K$C@@Tjh_Han>y=g#p$e#WLoPq~k{Q`hbXSA{y_94l{esn>Y?yR>WX@ zB1H0@AAwTxqW?9Z1a1dLp7Ly5n8*8{oPa}LJu%G+-x08W$)Wi+%7f1C6~WM(yDc#E z0v)^qoDOXiPf)V^L*4WkB!oczJ@WMYWO&O+aDK6`uTm-K^-YSw;>sQnSBEh@7VR*wGsofY!FPM&lcn-Sd)!96!tnKUcSFgT0#dJWlXF9&>HmzBa1* z*Dk$K{4M)uru@X{KBSfFwHwUWzN0t3LUyXnRlRzSR3kcNf;g92kh?f25qN_{Bbf7NK^) zupuzX#m`18iG?Q8*AONa_*z8RX`l}x{t)MT&21`)HC%&iq~V*y^)@j-Up4jZ%*Ql~ zk{cH#OM&Y57Un?J?DcKJ^D>ogCCM{RBPi3Y^>2G|hJMaIL%nZxcy-`f%86yl8S4i- zMR%7ouYyg3g4VcZv5O0 z#-pQ0!O)V@mNh7~hpZ%h3PrHT1lb?UmtFetX$-^A<2^h?yBnzEY8RT#yPf+l4WJBxYrBW0%%e(K; zHS0?{ohM{`dV_C)NT)xC@X!TU(+xqJ_Q!+!)mM+i$xD4r1T}v3<-;3z$E)XIU)Iu7 zC3-j1ls1y(V~^DzP^dA!o~N=MdfvR*>C5N4dOyafC$N3+{_uKnM0;)}1tla4%a@!v zv+Q3}sZ)qq>8tS-7U-`U+(sowz+U#PSBhbCk3aPbviJc-3 z@Fj3-c6yncR=EaS_LR$IhQ8$a|em-wPSIO*e0;XI@#Rh0rt!%Fr@M{l-B3 zT}ev6JO$3fkwA_K79;rV_t~!)IUm_a#*BE z_OmV(0(?nY3Kx~&rO5*fMa%6ekCF;>^Nokm!UFEsnIXD@**~8p`?Aphbq;ROG?kS5p?J9WO4NF01`Wv6!kMdF;%>Fw{QqMQcF8M6hmYnx+mN&Vb zuzOuH412g5(A1w-*JywAcM4WswKo&tIiY?&&Ct_r3=#JGB6X6@>C`dj{*QoH+hI7=-hqYR*rKdbtYdSfw)s$C zf(`MiRxgAITeaAx%&T~*WL9qGvbeehRFn?Nc8O8UkAs-{y=RSi51wGnM=>HW@lOOL zf;I4sXy~z+KFGfNg{U9t5A5fr{StmeKU80J7fdymnE)L}!Am}AJ9mX+e=~Dn2BS}g z%GmH=5jEKMP|W(1D8)m=Kpt@xzFFGmN$uaapUSC6xQy8ngI%$(U=6Mji5U`DugRJ@ zYmX#|wSsI2EXYVWis^a`2>Zn_e&M6C03tFJHRtmX9B3^XYyb)VhX>q857Awf0A>>H zaqpTWkMcqRdrG%BWF?}Mh|uo%<=(ED8bdg+Xu^^=d<~8V5uu{=vcrR?W59Ygc6}Qe zSMdW!0Q?kbAby1}#0x2>$+?dxawsyQybc6DnZ_b4Jm&e5x~Q^ePo+wE9|1bM){fxL zC!CZ0p_FmmhPe_ehY3YG)5FE?CFYb*^0_)Vxt~yx20nwI^3qW|_2iGJ8T+Bk4Q3|r zi*xte%lFqnDRtaEwa`h2*xamm3|@5hA8$j#be(Sd)2Rb?Pe+zQI$CRKUAx|S*mvqZ zQq|T$JhMj)EeP*ysHZHizc~~g7wbw(CZd(jFzewKelV#dRTe&5nh|{%@Og-h`4?g# z)v4aGHJ#E?qxm`(sq4VZ!#{Wt6NI;g&=o*7DqgQ;{QuE(mVZ%xZ?vAFdj>%|hLBKF zl#Zc0qy(fCq$CCDW`Lo)q@}yNLqMcOQBsC(kdA@#e1GShKY%yG{_N-8_qx_vbhv-m zD2_Xda|_kWXy14W8$g%sX`i~>PQ7gWD+~5;$rE>A)Gs5OLz8?+DEU&xaugEoY|s)x z1Gz|u++;vJi|dMYa5eQHn3gM*D-6yf zPtZoB$}~c?o<(4olgI7PW6ydk0!;enIBGlYKlbqopo+y6N?`^M&vDCw-wT zLLt%47xfZ9RMm^0&yOkXyi>JR9||17%K(z@1X}a@Ij}3Jd02@^<@=$D%y@$_xIl3B z;I}RaRf1aIAl?ZdH2en}o=9dp7)Bxof5jowNg~A{_u=+-+x{|1FD#KURvyWI-jD$_ zfzz5h*Y#E$NvT4%!bq`EsI@68v**l%=#$d>lL>5;bO6(C?3r(6l9s??%a)KuqAt9%f=m>w$}k#rIEwJej{pw$x-gi8hJ5Zp!`JS_*%kdp#xqY^LLSJgYjm zU&ncyYlO^N4;-+(uTTsp%klizKQYjAT9y`b?qYB;Key=RUr9pxB}x(P{fwc;!cr&5 z^Wk57BKNk#cx75rVIzbEwI-zzI5+>IEjddu^+W`wZI~Nc@b(0)9Kxwaq^Hjk#eNv9 zeJ9S7_82|hb3bWzk1CSqFS>l@!0Y#?>XddO=aAumE zlYP5*@%>YCxTp83Ro6k?q^>xp<=Cb4c3gP*Mzh%`u*2iLE{%?E;zSR@g=zWdt!tJ^ zGaNYxPjPD$(LL(>)bO!*zSZ5p0eQTxtwttzktA9KYYFqO81~XFj1GetCn^v)82apV zQ-L;i%>5}w7>%s*gcua8jWBbbywKXS`+SZ~q9)KcZ6$8(ua6Mgnf2vXrOnnVfVa@0 zL5I8bCqA$0pJ7_oO0rmDyp`WUfBw6D>J6&>udLIyHoi?BMf?#P?|jXl_PNM%Ig^u2 zrBp;VU$tJV^CyXrWv``NFLobZ2r(gHL8`_pA_%gAA9ffxO@cgyB3np*0cE&gxW~)E zAbe6(KAsb0utK2lT;b22w}-4ci`z$9h*kjx55|Q^Kxl7UI^u&~-YGin%f9MlTH5!N zbEC}Oe^~Dl5~5Fug`Yc%eT5E(lTC!rX) zT#y$f!$YVm$}bmUFG03NlriFG+|0A!H$90ebcuLlu|e-1m(tRxHdgkKq3)wVN2|g= zYAoha(%&ex;AG;BjN~V)*D@eP2-Z7Do!<*q7FHZAZuqkp3>nT~ZM;wYYA|=K^XewlZozm)wYygQ>!hgY>K3R@bQR(y zx>{juE!bRFOMg(39z*{oYA5^+Yciky=9{2gb|NBkZZ=-IM@S-mTd6gu}#*$vjRbi*C&NPGb;IS&*Tf{XVe z{gjL|@cSM;X_j8l)CNXQpn^- zGCRTC+({{a|4TIBKuwEl65;CD*xb9&G;Xl?C~a=^p}8!HlHT9=Y=9km#QWC>f6R3{ zS6X62{FKBEv5=X3s_S8*Hua1+6W{tm<9bQ>2Wn@#4Lq&6_EYC<3*jkoi4^kcJd7?^iN&dV`VqfB|UsQ_b}1E0bUNQuTtkGThF&_3*+jl?Ru$l z){H$Xp;=Cfxb3F_wJ`C3H;&nQ3su^RUK{-Jbgi4%0HA(UP&*%R)N^6}oS2ep~j;Q#juXm`Tw=L@66Y^R2v2IQsxIn3Tz3)Sn+?K7tvWrqW^7qt41!xB^}30^EA< zz4FO|LoTu^JwO5#CR=0THMbyghU9y;mGNyaPy zqolVxfJb>tXrORA@u8&Xf?w~f^c&n}TsNzf-6=OZq=)1hywgmgIAiHXBVW&2O7?4Y ztdA2HDU25Lzw{wl>NsI5EMxh=D`$IjYK+2h?O;ZQv+#{GxbJ+&dsha!TMU%GzlBMH z1_qGV(|9LXN*Mqs*^QaHE|?(WRE}})Ffh01v5*kDI#hdeD|H>vGqEBGs=O$tsU&MK zj$i5|kq>7d?^>!xi=VALFq+jF=)cKesBT^IIU2t(#xq_ENqtGVd!@($8JJT5G=!Vf zw#I~9z6RUv)J}Dau-`zcz!=?Ff!&ELQ?cZM+Eo4m*?g_JW3OlnOUiKB6}ZXG@T$I zx&)etg)>p#yzb!|i==gp`sET>Tckc=&;~`MPH8OUnruxg=%2SSTIn1bn2XaNsCvH zNnLSmw;agJ{NLhjiA2~_Te4xmBC;24q`GP{W* zNtV{D3c;u^bjR8FgDDHe{K{Y#LT?|qu{J4c2G>9DF9KS7_1}u*Mtg3a9eE#e6x2Wh&Kf+>yARiO3wH-1q{AU?@xQmeG$)XWV-30{ zvE0u;oS(e$e_#plw$@l0sIR%5e=WHod0hEom?`Nb6b9N0H8GPWBo=u6^ofut9lV-i zbROawgGtyP`|qdu*uNlxve|tSDa_$N3ITo7TpjDa3JIT+>V|ty)=nY!6TFKjrw{); z1D!#h--S94z0B=nOZNQCOrxa#`Wu!nrGN5Yb0`iuAG^1`VhdP?*!ft8wBbcN*<35V zhc1bO(k%Sw<*)?B@%Ec^mVIg_u4FVPsQixUj!6+?$mlK?jz^zS(hNf z5k1fSS?>HB}K2jN#(a{?#eg0F;tUNWW+#y8AXJ{9}iz~YNzg-}~ z@Ba-vZ;tjxRZFkK(3*q*HJV!m?2nsxJ71ri0)qLN-O_Q!?vq&rTSJrHHgz3^EY5$V zy?U~zG@tp~w{KbcBMC6|iJnwqErL#Df{Jkd5??#K^}s@625LXTL4gexN8S9TL zv=V$#w|Nb0l*RPwefk%;uY4<|%E+$5Neye-Bg5J@^sgUL3r-z}BMRY|y_)y4xGSFb zcTpk8-DUqFhKjjpsF^BH(elmJn%O-1B=_pPhUU~Y{l5j_?ZT1RoTE*^TYm0f|1s2K z+s;v@jHMoz?F7Oki-`0Av{fwc`G*v%JA5ZapeAGF=C+B!bN{yeGlLfi$5V0h>C@3? zt*t$}NB0#EXNP9jUst-{7sZnFAp@Pz)ishwm~$lN;QY4nho8ew6Im5YxVSq6=tZr4 zJt~__*q)SUHA`p)+oaqV!;jQ*8K_7Eev)rzKPMs3J-v;(I&?UUQ|y0+b;5sU8s1xX z=}+EV;Y~MVOcy5k4*xms!hx)VvDxB6F~)+-l-TYt=4z~^3hxO=f)aO>%=rh5x}W%z zI3su?a3#Wsu-;t+=6lS3uo0dOQ@lJ&giM|YK?dOu4D500dab-rC~s4licPYL&dbcQ zQQgomQ<^{7w4Y{zkFC>$jw2`mO_WxQuH*9|k&wF_cNOEZW@*HR*EHp1ZAMxb;`2Z8 z24E>TkN6BQhR=WsyS+aYADF1rhsXtrfaOj2D}m?wZnXMh#+>>uvBKj)%*?D>_KX^# zg$YO7m@WoWi!z%aXbH(Rr+mML35=X+SrI`Gg^cL7&ae;-z8qX?*YJ9TR3%3?2q4$f zr*PG92?xWcr$wfRWZ|P-H-c!6r{G64i)#F!^;$)5=BfE%b;+Sgv4HGmw6OW+-a z9rRBZ(fS3HH5r}S{C9s;IFXzo4D@FamouypClZw(1T?k zN3V;sG70);lc7ehRJkPSaakhF0=&=bFB0LgT}yl}1O57)=8 zUAz}}LguIE%l2&liMV+TMb}61_FPW9 zuk`JTd*#{v`&lN1Ekj6ev%UAn5l_P#-%NruFptjQsSMOX&fQ;R^`gxS;Di~!^^=yXi7`gD4dqwz8Z|-g7 zUK9P`fMQ^)E5TQ$2A^2ZoFAm947e|x3(q${v31i#z{Ryhn=(s?_WlN!8K+!*cM$b4Pp9!~|(L@#8 z@88z&Bp@iS*}~&6mgEZdrT=vO)m?tFs=CxUSv+M2v=LgCj=R+l4im-jLhr2mq z|5rbyF13xsU)-$rB#MwHt{E3_IXC1mDAfx8+Juq)X28;ej1XzqG-lx8GP*F(?4}a*FOR0L?3Bzi8mt z6ntx?_q|}Go;g`eMa5+HAICyy7*C97n|1Sdkt2No4f~YIciJ7J0f-lUv8N_yL$Mjx z@XoH;E{Gxi%c2)!DoqKignH~Vg))=9Mvcv+Yokl*PSf>#dvTR$j?Z`dSXYgY4l1@EpZQNs_^mfeTh>T%)F*_ukx+>*41Q&6J!{ zihcLzy!ZEe57ScDz0c4G_&;E;;NF7~#H^KHAo;(U03pG*A0O_bPM^Dctk*rv=~ zcI=k7uhTF{e>^YE1W(BxalT}jROI?dJMRAa!S{C$!tymd_6SbflJLwA6?Am}+t1JW zwma37tZt;w4nf9m4tRVU@oa<3l>pg7g*%S9HyB13^b?QLoFu=kmP>2)^Qr;`f!*6I zM8=O@*G5gtUU5%n7{t0j`K1n@ zFqBCW3uPMcBH4tAH^Ei|ab+$BdkVD~?ETAr=Rk}5^mclc-;+av_{4wU*cg%IAo`fi z0JMqA_2dnID!I$wS^Op?iADBdvJ};_@2=+hyRUvej1_aeViy(+wtpPzd+pca$3JkJ z{~7PNLF%%@?A$`?p7!$gee?;QlNkoH*J1SCb0!MXu^|SAw;XdgwKMnOpvF-v(V1&U&$b|QABa7nI)7uJ~Ri)l;YBZSxmrfmkmCYkE0C-Gn<-EFLtHQ@Z z@z;O6&+A2RGaYLDmrmk(C!gMo9@oc`@Fpk70IY_UkB6$$5xI9J0XK)6?TD^iF|z~9 zKw0b~YYP}fplnbSb+i^brxz5FqRGVh4!#%-cA){e2>olrMA3m!I4B7!N*I5)cmyNU z^5{EZI2}Wal5(**0FcqB6q{3#rUAJz!;6g;Br-#eImWe-zgil;OCSH7n{cGSXNE6^ zUUZ=e!6(iL&&jN7#$OQuan|4ycy7ok>}Sx*5Usv$u$4Ue_?ULMrl3uNU{LnpdCbDY zKd@h|_!AGlC-oxE_obqSP8YuidBZ!eKbX3&7iohC2OrLF{U4s)|ARbKv~(W#`wCXZ zJ2GORLiVPVZfEQKS3|G&as9W={105ftDxhd8t*@3(=xoG;zmv=i=nz?RcfxQ=FHd4 zA+aQkT_p0~^{l!q-X%dsUpTwbu>;!f_8%-NQ9B7Ugr?-bwyuD?%lq*Ii0{IR|9G6l zl`HSVkKr8gy3cC`Z{_pXdGCr^*b_D42DXejbH(3~A;j1s>h=7pnNFARy#+^ASw9RM=eYx)=qy}w7rsi#DIRy< zcYh_R`sn=~3i`XyG-q>8bA$hs3Ku``VxBV~<68Ev$$yLMfd(T(3FYMAYB087=}bN{ z8fK$F6~wcABbKaMSij8YQfEM2xnq%cWj5rS#n9yr^(-rUD$U_BtMRRU#srAUEzmfm z{&cX!mc>T~Q1`aZbinrUyY+v-;WI}aGCRrZYYCCp2ZTp@V`85*CkQNpgsC~x0Qe`W z{KeF~y~AT~g-Sy5CU;?KTKeUCqLKTmzE)=Ed{G#Wz*~+)8O~RjFbxJMI|O-}7yZ^d z!ECgG5W%X`574H4xG41YhUu$E$je(?451rwtcdcVbX(XmqYlTe5IIxzJ5m%Tj3E|_ z_(>8G#)*3m@JA~Yk;eycs{m(drGB)MM}Rm55_f1u>63FX=@scLi}!5TxFI|%gh&4; z1os9mz9R%JXS`^|+5ZSP9P=VT4l~E-SP;fN^Nq)~IK8=iv3F@@{%^ z`P{na(z^QqlkrBkVt71IqWMGOQ=h}q^`MeXN|=UO&w0M)(v@}3R>0k+)Xf#8qnQ)d z>tFYa9o_$2lc|sGnA~sNk6`)NuNuGerag)np#z<)x=^uY5MR+y|2z?uI|*N$x(gSy zln*CVC}gYFP(9+q-a7naos)|ms`0xTTM5{vJoNp$aNjX^_t)cLX|D5fOVV>eKvSZ} z^$(6W_Cb|X0Qy?Y^rH?n4{>gsOJI7lqkl>ER>gd4%}==JSq{e*F{3kEp@+Ri+7sRs! zf;<2P0dZs3W7#mtPy`chYNZQ!^2B2YZQ9#Rj}$=NDP$UeU6e|J_p3B-!H(kHM^@c7 zWLC@V>wai_5vdl@Rp1rS)1-5jb;CT3{_PT({1BkwJ-jn~_+_nfRT7|8o%A*2kQ zW`T-<;Rn3CjG0Fx66}}MB@>`q0rQ&PP;FUTwm&*J=1`g#Jm&4lz+gN%f#-$R1fjL) z`l&E0dGLUY%Fl`!W@t{n7LIu^e<9qyM<+S>9ga@d@du)O4lD(w$E;&&1S(WA6fX$# z%{ht?h9e3zgkT&Mg16;8#~7bzVH5Uv955Mea!`YVMUW@@r7|nmJ9)gvT)tM!lU1fx$aW(`SFC-#=zQ$huQ?_@AHnVXYemSk{!DDl5ZC2Ek z11p(9Ys*YEIf8oDnFl+J`TbU&gUwzfGt=SFN+xehu6s|Iha{H+OmVL>n^Np-y&#ks zkFbo%- zYd*(GCyCtUsqDJhwaaHv<)dO;;KB!X*L5f4-1Gzes-wP z>mbpk-(f8~Lb(!6cad|8Cv9!fr^lqrbO!ukdGLHek1S9ZwNF4O{SD`OWY0C&SSex zx>p(d^D`|s>b19e8l7^-vx4SN1&@P@?=v@lcf2&qO0#R@+UY;#ofwrbn#f(r^*bS) zJQTkkbQRN-^77vz%#~{K$lA~xQhTi8|2MqHHQlU_|CzeD_{*6s)m=3elSG{Z{U6+v z(JR60w{PD2uEBiKlgpkfXvu$Yx2*+hr?!JR%+;jbuI(q~s_R~s;P4|wuM<+RBlvK>Wzhoimz^kknR~v$V}da8n!>?p5`^(| zx>rz3PtNj%G&w0UGNWE=5lW3j8*z{aVfABE$v`PyMJg)={RX4#UcyX6cmPv3N!T@f zkt&ZvR7)Q|7+Bg1HEo7hg-%isaPrNcG^Lop4lfzOIMT3Krm;$)vw1ZzYMjnf$X6D2 zI4%uEdMt$03W07`uK=@fiP(Zao?|$iuE6=}Q2PAZk1LYsmqdf4*p&xXTis6u6&-62 zK*lX_-`~n&E%{_vBv8m=`<$}+z#1dy#F0@3-f4nHs{3Olw<+X_2C`s06u>+@4-xL1 z&3r#Djxbz~BK`$=bR8xQ!S(PKc;oL?64v47HdL%CR=S`! zval1Uzou=@C%X84tdy$0N>e_(iUY)2y3=7PEL$eejZ6np%xuN!<%d1Swrh0HeL^P0 zhwgQf-@%)nyX&+i*M;ZCqQo{HE7BId!oH5hX$!A0SN*0^_XLjCrXCin@cK;*7P@0% zyy(gyd)8OVhmIpH!{%QX1nquEw_-ID@5O*`uex8%&92se6aMQ|lgnSqE#u{ZHPF4b zq8D-6-knlL8Mx+0G_;bOVfr-KGK5f3Lvr(pF+y#-i6O4YcOTxGr}EWj zIZUQjwsNIECD$Gwm7)Diot!rIm3|gqfYP^)>pkT5;GImycLcIM~7;<0(p=XRzh?A>uMf$G}EVRE1w zME7i{fTQ$B_VdWt@0qyxX>ATV^DRtXnahjOBl?K5fdY$&ls2hq)saNGm+jf7{wW=` zG+ykP?OU-@JYs@MwY?6EwMSRK=ES`&!jdTKaeWY#~2}e&#{vYXG`1FzeHoUa~yJ;BjAXW%79Ngdn6dzE`r&L$u=DTVT+EoSaNt#)Dn@xmP>tGu9HkqtlAmrC z^08~t6Hib?KKq;$LvDsFOO>g|QpV?gpI^4iK4zTm$NP5k&+VZFFfWH7GG5CfzYfLb z(ti){i!m|z_2$;^SRy!lS=RH|-)rHP0eo!x_s}QkALsT4e%snC_0W9-2vnV3y~OEE zN;Iv;XNmR1!O02p%PZS2c9}>yGHQ7&SwTw*)<^(wu8T)@J&<8PRq9m%n-}3V&3}7J zic;es*HRpICq-?4S2eIv4gAO4*cNL*qFn4riu!cMEmqI&XleP38zqNqNmu~TRR2PI z%JZ?OGtKc{F8*NVxgjBxeftl3F`OS1uZ&jKGroS+dw%6y zP>H4GmLxLtVFwd?yWj6LES80}=^ti1a3uaPaH4e12pbm=|skN&X!J z7@}3WDxQ*;Mt-aYkZM~$ll+ur0ilCM`y3OV>%k}=Uw_G#50pnfj11m?gQWY%{Yxq6+c%Aq0F(dr^??&G(3u-V4hN58(@zb{}0M+7rzLoL4PVGe%7FxCeV;bDuw z>9RFiF#)rOJ?0=Wf21Uovi@5(J!~0lbW6{ltj5G2{|c5f19e)Z7tN0>eo)Z+axEgh zi}MzyQ3cBQH>4BCK`^K%77vBiTz>pEl2FLLsZVq;kpA|$BRt4cv!h!o zo*(TDl6E+ggerozz2XNY*zj$#5zn4$PuzDa+;!widjy!6T=(u+fz!HHJ#05G1CHkI zzWD^~Kul|hDeL^>q9X7l&H-bZri9<>S@`{0?&1&omHDS<8G9O?tqnTcOWE8K3!gKp zs9g**P+uv(AE?kaJ@mi3L=|o5Rrsl50fi7Jpg_dqEm8vviwRRrwar zy+vnCpZJn+vDPF(`f+dOBRK0%$v~?iOUy^_?ftP#<+r%KI#O`6!wH4j2o>%p7mN+W z_n(QYkLw2zF$qgxbS*iIF0tYD`#}(wPk_MP5I=grNiy7`0K$w9f@6LOQlKe{#iKL~ zw#kRPk}A@6{=#PuZ8I0N&JV?)2sGkAZ6s<H-m@#f|w3ICJyllu# zA#)NP-;%N;v&vau9b5cO`aipVLan9D_@x9!FWcR1nO4?KbL1P2eZLR%}Y55-~yGxje1;6q`}O1_yjck37GE7j>@R7tP&g`&O#}R3R18U>b))!o401w4%!BM;7e(35xfTIjVh)JR3=UH4 zjhz>Sv|?jPp)3x#)CcTtqvVh*ju%(wWa$@NSTRWe=&(d~v#Oi>J>Oq;_$krgEyXVg zV_Xv*7ByQARs*w;PZV4Oq3ql_@Z~Qrw#-4O90$?hFfP}@gF0@@insU4+Q6oukF`_;O$(Pvr zxFCN;ksPrTN+3rL&#W`x1THYiw;-?Ssbo$sS1fL4dPgn_dJ@<%*?IS;t+UOR-wy$` zQV)JBXJ_Lr#%9E-#f<)!onjp7_vd$KnH!sABj-^dql4Vnlj?3X7%LKHK^NyMP&`~%yr^Xul8G;nig^YocEv6yd;bWSLgj18 zr-HEvnGB(`i-8{^$Ul>LPT&x7)&}ycW=zlM>XkJ|eaviDEvL}aOYsgTtg^M5{pR4> z{0PXi8DyW#*~oO3zPJL4(cDuT`g$8zkDsVh~aX3nsEv4U0@*HUtzmkbYr*h zS84Y2jsfmUZqe{|YgzuX@ti3;!Ox2GYH4{j%{F1L?k_?%7 zHxf9q8wO+pe2pejq9U+IVE1F_)#9mEF!8A58IUXG{kC&zp+PZApv@I2=_H65KP3PKDdtuoDg6zI;C8LlN+onps5-7s7{kFw+j0@C?~xhv z+{3p~vTbkpNBp6!tB~LM&`?vDCwz`pR^8F8rSoLwW*xrNo?FaS`s~0i9ydDs!J>Uu zkk5IFqmpStDL6V^@{@|S*zWhAE@`V5@yaT);zj4#Q$HtWAQ1B68`^Emj$x^G2%Y`H z{0Nb&WtI+?n?~!e*zvM+^vdnaxXQV`q1blxmekdG?r{rt60KTo9pMm_R@c*9^LEC= z;6xv9oJMU@XKWmMA4Rzn`gqD3xt}&(VvbR28 zUT+PRn>$?XW$MjuTvA?Au1uFXdp&*wHV>C&{dK{Z8@>Y*pEb=2sDK~MrUSmqGg3#E z>3@sFwMPrqtM5;!_ZjsIoO!CnfhX<|RH!?6O!ZQc7W|hkDgqkRo1v>Z4gJpf(PPPfOn8W%zNY~2yd+YGhyM7W>0)i* zjRP*~8?qtANkBg{ccxc-)(=hnf;(7-gPH}q01J8A-WeN&A zETq^kwzM_L^hS8+!`1%4!LsZQ2$@L=J3JErp`QO02`T&x$3VJ5;E3J2Js={06c^6rYK8+T9+hW~Zz6*I6A$ zDJ|j*PIYx__BGxcRg<0PduHc!@%W@D@eigorVzx|qAK z=sCVRJaqrdr4q7p)s|rNIE$pw%Z+Q|r3GKH-rrCDnbkeeJoW3{x`FAhfoz6b&ZZ?n z$DT8jTIl$D6g=;cQ#m=f3mwGR^V# zH5<#Z+NVyXAJC?;DgxS)GGd}wH~`en7jN)3m7d9T z0fPSf=H8}rE{0x+1;hU;yqllqI#>RJdCS7ot$OaOi(wp!)%wmKHu%#QvTdJ!LMpsYp$77HAV+gyr8KLsr# zm_J}*x&F`Cou82w=B2M%G)57o`uvMZgO;V-%U7s*B$E#H^OT?IM)M51V$pH85T1K+wr3=+RNqT#g9IpkGOK930{4q~(C#lq^}{qU++|hC+gM z@uL})6r$bnpOLMd4{=s@Ls=86ZvMqn``a`;yW@TU17-SE%PTCExzce7FX%y#kZ%u z6aiY3>;ozk1BWS?_4kI~tW&L9r$3)CkZXNd_Q}ScA2#)f!ad-}lRoV`*2(iN96MP_ zQ=|@d#!$xXFT?G}?zhkNk9k45nn#eQjpV|^l_dz>?=n%Rm2rjBZH~@WQp#8vpyYLF|jF&b+$w<l%_{&al!+QE3$ zPb_3wk$EXGb#KT7r45J%O=x0*226obagFf1>P#N~)c^UJ0F(b~&l;4D5C@Au zrjm}zdxHehqA~3RQh9~s7!t|?_4gxqNt{+HAtU4fDR-;+?CtCW4a~F^?rRm)%8%nf z?g>FQV0ImZWEo*18z8oC{$u}nPVijhxpaVogR91ZGq|MSLVUsm-D>|93D_qw2Rm|P zZvIF>fza4^>Gvl#JtDwBBgcUkPu)i|>#XHpOtXz??|m?7&2d6oP`z#WCONzUnM_h+oLn_&#$qJ!2m$ivn-l_ZWe6Y76o zOzml5i5S`}iFtIE9^}`Y)MpiDjQjpp2SXhP-pT=VBsiLnI`Bo54X6mMs0vPHuGfv+ z#4vJ8#tCinHzuGUdp zD{hnOzDKkd8;c7Q-wOVBByj#W&CYDH&-&tl7%-NBF5|txD~nT|k9*$|&pF4f{6E)K zrmK##TZgt4Ygx6xST<&q@7pt}`?IknIJlP*P#|KI~?4K7}Iav+Bc4-&==66T98rN?k_M4t~CI-TW<#nUn! z*3umAp5ulKLlpx)&>_DAsStg1tqRNo_c|Xr6L2qsI)};uHvx}}-3asT^Jr+xtOU+r z2hzvMqVYRcS49jwF8 zO032h((oObP$E2yFBBNTFLsf9Ay?9MuY96k3QAmXtQBSN9PZS;8J_&Tl|wQu>vZT0ttoTiKU zmLuo(dxZ&CTyfL=blH^Rwsy|G@M0~Phz4pQe9Edf?@^B=q8xs$Sl>YY}qs~`c} z>g?{iJD`!(i=JA8tzPUi6&>D9cl;oi^rO3j0N>?rzgI25ccGjTwH%(&7|W{`h?2SN zD8p+1<&8g@e(OtS#2a5FVuPl<=$2-G^1MtJvRYGJN)pn1qvvDMH8#0&#&KmL?AHnv;fZdQ@jc4 zrjx$CNj2(6qb~-dmBtcj5FxGc_$kUyRSem*s|z2=7f*<5Z~xfv?~)WNog~M0dY4o| zED-mcFX&i#A|NA&gk9w5D;COQ>0E#aq!_n6CLBwFq_k#uYf0<7VU-VYREn{$S?+Ly zXY({Jb2V;?#$NrKuU|*ZR&tTE>OCausuijvJ~estNQIMwgTm-r;-|;5otP*UJAIf2 z$F%vlnhYi;oQ?-N2ZjM6B`KSMF<{XAMC9bgh_v8=nKn7~6e&myE?~)qW8OLdHonJT zb6ao57KWBzgyFHkEA6+_Ck64rsu#GUMkjwwvT>A1;vy6c2WrLnH1tkDnA@jt641#n zvCd&yQKICvyb?^*s;D&Nguze!n>=0J&@XDPtq#5k$Y6{G**SFX{`;voymPc>SL$}O ztKrCJSm;jK><{omcs=--U2dfvEa{Q(&>ZA>Ty+YX+Ru3Qbo7|leUGLqAk|vdXvB8;|_l(EVbd_uD|H z$-e=@+U5tIWs+ z=RMMXYHNWknAg&Q6TYj;6Cr&JrF;c5?TLR$t3(1m5oK!)+hGDo-X&{L9~FuUdr&X) zm+vvkPmDM95GNxLaApGMhM})K_(zqHuMY64<0$HGvSG-SyBgSi)h$~~kE@^M# za8UeCdj@yT=5$aYN}PFXSs(7aa&nTAN7$%@t5vuJi64BC_1l?gc zcR!DAV$-CsW?kQLL05_!SGBzxP4M#gE&u-Yk_h*NaXn|wH`^7~KXZ0>GJz}QIP#*dY3Al2AEFK4MP2AC~ta&aDrL9?Z+qQ7bR;!ME8gDw6=qee$2%5XQ zn7~YGS>5S!XgwTjgMkERqPYV4CPjuMqylOO5`K&Bdq*u=GQ+Z%546uzHT$}Q@W8t{ zH?OXiJ)LnuBK`csRdoe$qrJx(6X2Kk3Y+kXFj}a_HeA>RZ786GsRh#>`x%x2N`aNb zgbP5z*2Q)WYBED(4MT)kSj{guSe%Cj1**=}ppym}{Qb}3j=vOYr<94`T2_~4m8I0r zet7=l`!(2aQ?9S1K3WqadTrQ+=oo(0_;!H<3_r>^2lU7?&kJ(&Ff!<0RS{ z=dwxKee?G*%~wu+Yt^b>g+oSN`BwQa(u^9Q1VvgLswt}4T&gL|38k_ng~>{#Pm6_1 zW7#zd9|gZ7&W4h=;-FLnU1gi#CDFpH;plev5B?NPn z#qZe^TS1=AZ6hx-1Pr zJl@bg?$KXh3=8svZ=OSsz^GJZE3z&Il!Dmi6*rZXFDb10)~z3?EuLV~oOb|aNFF(V zua39fXOtbTy#SxFNTD|$TI;h?*SIs+edE7hRKE|nw2t#1Qlll7e zOiL=&nR0r5Zbj>!(X$_sOjY%vq`wF&<+sPm?gOED{<}^jDIrDGWo~Z6|KaK@oTB`r zeixR`r9o;50g>)*=?;-rQt1WhTyp6a5hO%FT2#7WDM?A`?(T;B_V0gU2;!8)r)UgHKDt%Y~2+s3jUmR8xykY)0_q0_bwV{nlrI`I6HcEm=zdNA58Su zqCWKmw^n zSGE#KztF=*w|sj#?|`)lFKA6)yk7%kG*Pd=TudbXYhpF*#wz%HK5sg*;y(LfG)>6crd3Yj~HT!b*k) zda$C`C^HxOATu!>E{Xg+1R{VON�_7#y3CoJZpJb5mk-HX5+N2l>M57P2F~3AYZx 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 LZI$vnR)PNqv3eig literal 1012252 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

_qmW*+Uera1L5_ciARUvC;hewD5tIy zeHT0miRHEns|L)f&#v>IYW7@x&x4P=>E^PWoD~Z#LsI@}*O+-P_?u_>b+cRkAg{a} zh^LNHnDi~0o3F%wS(KadyN&C3PLN)Ceqp09?*i@r*1Xs)KMWOcBP?*X2!A_OkI+)j z8FZgP>>C8Tz##A1Z8>R@7XEGQ9tK%hCvY6D|9LUvg~mVstwi{CrEn~sZ#}kpYY(eg zIakcM=PC0#8D%Phs(7>zIC4G6u_W&FAkyowUe)&dFo5{ylsigLbO!lk{6!|zu1ITZ zH3037`1R0d#pFIMXMM{4xo_WVZmR2KdPok@+oa)v0l2!^$YfY98nTZc4qJx%=V#H( zP%dPW!no>?Zyy|~@wE!$mn@lwrTvOxJ(FQT0nOlpvcujN%0*3<^&owuuYt2+EA7qm z$+Hj5^1m_{L8;R*4vvZ}le@dAantNX`;f^?=cQs^M#B%sMn1qb+Q(}C_`TV>cZM1U ziM!kjyI&1CqN@<-vQxm}??>#a!&%MfYEcPrQ{fchuoQ=NXp;2$NGMX&Nq*0L7r>%b zHp4uWl@c|>mK8w4L8n)D`8!XRh0~`2uo>}l@`?X7zAcEDiKg(l2ov}lL8Nrs2_Kw* zG*F*FOfiG|j41a~*@^ z1PeD8sV0Qc+GO0(I2Be4&;uZhf4iqLzQtzjar(ttoj%( z(=TCd42FZV6C7-zVv|5S6d_;J%BBB27>3(oT6|LqYB!36FmX5FZyjM$jY4WgiAvjt zb{mlDA?T-hHLNs_%LSVg9llE+N)y`9>a|(e&AJ*|REN_0uJ-&*&DhTW+*UGFMyp>C z-v+r%c^_{)9zkk41-B=%$>wIA^{_Cb5XvroX+g9}oPyA@-rdE&UN4dRmjOcPbZ-vC z`^~y$aB^ROV770 z+0gImiGMEN$e<+cA8G-um!Vs!h&i-HR~FrVZ3%QpSdUEM@4T1Q<>w<>(KlRu?c#`d zg{_qlJ;-Vy1{vbae-+U~6ZsBiN8agEa^1^I8EY2dooSjEoc*?v*nH#4mTu^g#kAla zxUaK5X1fUP_gh%~lkRX5bNohms@4zsGr_70G-oO{^Q~l@H&m#1vcE%5w~;X%G-PYo zCsMQRUjoX_uottGZJG>cNw3tiQ5*Rmw%#%-%IJL;21IEXQbM}ByGuHimXPl5mXPl5 z28p4&OS&6|l9cYQ^Z5J6IqzEUhxt5f&Dyi~edWC{K-yD22=np9oPe-UFFM`pqmVNg zSa`t8=o~UWwA5(4hb|D_EaSCD?KEP<4xj0N-o!`K34k z8_H(F&&e~zgjl-SusTFC(FO6S=^OKVQkym{jPd#tHnx7mMHM^_(Uz3*K@@aJ%>qXo z#cnPNjP&fl=Uq_zM;emP-d$g~ua0E@?1e7=%V8KPrLY}u5PxQVX%!DlBQ20fbRj+R zi5y?=7z>XQBYr)9h*HXK-^r5p+~r<%Kk=A^SRU6bVz;Z^d=q2(nGi0l)AxI-mTm{O z;1+Ur$X@!=jHM*l09MQaSPZ+zXb4);PZt|)T*>qr6>X;05>xwM)a0#F zoi1gKV{>5r8t%t9zl(Oo39A>s_1C3r>YP>Ed2YuKuNZ-)qiTd@9`92?;lm9d4m3CH zzMQJrOetjV?M96ihjMMtGjuc(j<(ow5l%W;IW6+pejr$G&E}qq2crzH>~WhK4+*KA zdtU|A{3XZUUFX=?m4`Cp6LCDVKoibjK%~g(%32|(4hO{wf|&RTW^e!^vkRN zX)BU+ruJ+~Jpo_JS?DVk)5q79Aua|H}X-fQKuDQEo;QdZ+I_0h&5W`1nJGKN;zJj1NP{6CnGo zdfDZKToW$xp&l2@MQ^&lp=80TA6J&tm2~LKKlGO|&#K}_&x)(II9I|+u0?rN>dXy6 znu(4+4W-|PRF1fTXDD|jB`3T@byLh~-FPonZ1c{LkSMf2i`hLXC9i(Yh^v(G=|56o z26XVb5~7YRLD&;+?`;K0IHV(IF?OEoyajy(*Md-514)cr=Ag-M8{urdVl3#)%jnLm zZpE-{Ho@(*az#*H=}T|AaI~Ml({;l&6DxV&dBUH~`MkHdcKp)5(4#0}*RtQg z=N_+7G0)t%q&VXQ1067A{e1>&r*C1YN0T($IfFY*z0<-W+d94Bomp=qqq-VKG+${d z&&W4UW3U3vOj)RsF3v0)*Ytvka!CpVnWSN|ID=Jyi1m+Zu0&!6c@w!i;V$(PinQ(7 zR}LJk8|=YrLf5Z}ckJSgD@@onb%{H|baN%+v*U-LlnW0bAG(XbZgECEI*nU@JZhUN z7$ihw0!gQwmGhTvOM}Fr$Iv4|!TqHu{$V7t@UZYkdBAcHx_6|kVq~azSZrV5i^N2N z$LK(mKf=*j5{OXI`!6)5rlpVK)V0y({|ged*QW%M8}VITM*#v73;+r2?>rd=-f#?o zmys;IUF+=sCHhs;1w7*lsGB^DjO4jPbn5YLc-C>*(Gm^!cD^mdeE=GM5)F!+n}XPa z$^u}?Fk~4>{YfU`z*Eu_#*{xW$f!uEWR0RSM0Ud1=~*%knB42)tC+qONIEUA#1(GsDfWEe)z!=${gSd^rRU^CO~flA3MuW@Mh-(V zmU0Rld%5!~eY@Y*XwMP$_(#!hJg$yASoNjt!%&YMw&>27d{&U-_^Z=sk<^oJ&p0)y zTmK~MXuS*Djf^JfJi$NhxwGs=6@q3bp>}sqmu zD+gS(&kbsPV6M!EcLwBVtQZ}5+C-P<>`ej1ULjTbn!++8o?4ZXkg7N z{QJabV927tlExMHbYKt^>6I>|7J-km#}{&sv?s#|$E{VPov}8AFTc>FFA`HPo76^Y zadU{UQxJpC5#Y@QgXv+R?$%QL(%d?%xV_KWE=U`1p*78uNYiQv1Q1p(mb%_z})ptc1V-7u1yR+9Tp!% z=}#uTHI4ZB^DL%Jk*np*mx$hr1>F{wlFEefpI?=I25HiHk_+P0GuTtO#8OCu1Qni2 ztbMijt1Uj7_WZVZ(hSI~)Et*?gpD^rS0^CGFI)*O%qm{&SFXe2)ku;;a>uq4s$t^Z zWI(wZh`B+{d49d~8wTK|+1d=T@Z0+*oQ^I_+1$7vIGQqeZFtdp!_lTc(a|@v-gbw5 z6tckq3lw(uuR0~`6->J=i7-k9{>I!#jJa9p=2B zb`tK(qo~nk#-pR=VeuL4R~Tu&@p|*4U8WySw9hm`>Q{u+)v4(5#UnKB_C2<}J(K_1 zS$fQ7=sT-fy*(ZQ-&-05C+y8-o-x7Jo4gXsFe_KR`6sC(eWY6PYC28SH<%3@gkS>^ z+b1mBYZ>U(iS)3cR&A_RJCN~f`Rd6MJC=FSNzu~`DM?T?PztU8l5iDI}_515NFaZeWbDyHR7;fw{v??c>2xn}X| zyb_$?NDNWgbAF737`?bS%DZLuzbjK2flkkhL4{{^2!l}4u2-ApacKb+X z0LeGKJZA3b{nUC9U=zO3Qi5rKR$Hhksbf#QTq^jBjTZ!TqhFZ+JX^?WV? zvMv*5=c(qlUV)UV|JcAe+$ZZP=Dq2z4DZ)x6CpY7tB|T%JOSV#(;$NM%Jn2@pnRx=MVNg75phZgl^tG zd)^C4P07*IBHWBfiYmx_IL*`Frd5hR5<$2hdWbzwIh#rt`azp!>$k(>5g(;yJ7?;f zYyZ$gigybp;5B1QR4&uB(z=%t2!b(eMUCf*W?ehC%Oi}3)v0^u6QG1P3RqRNDN;%7AI~Z45iLPb22<%O5KQmJx}jL}}uzi15-4FRXYMmv%S! zwCtqhxK8eJx=}S^J1|lCc@eHeYBDLdH&>JmFIcBbzO)IvU5<+4c~(Mcf{m%vEb zmai~^PT+;l{@wgSkDDzCoi8JenF};|f)GK7fOE|2yb+XtU-@5dnI^S=*Uy>wdO;OGO{WlO2L<*a9UPq%x*xy&^_8 z?;W1q!WTde&leiZAdfCUrzfJ_i!(I*-7iaTjx8<~Ye8cG149Fgh#?{)vU~=w9omrk zE{zkK%GJGgmW)&r55%=vRt+B)8jBm9G;@{nUEmw^*jzf2!$Lnf~lJZ;A!_pqG$B(j9yK{(^bE0Y9xG}3f9{1RB zVR4E*B$oF}JGmGsT#QL9y?$bf7r)Z_%<8m<78o-g<5DAoiOvch`5XCRo<-wKEZcPb`w1gJ#60j-Z`}h&F-oB zc&I&yVE@@d!kHbLx#jh181FjxR6@VrFsxm0fOMZl%$-0QLS<|PXQw?Sr(G-L@^t+wE)ls%gN9cVX`rAf-^;>^i4}k%LSe$lL`ZpCSrvQX z23f^O5QycmWG}rw$)QEE{Je(3oz#d^PK2f7E$37(G*aLT|EwMJSr+Z5>=CQgKacF6 z&7stZ%$B%5d+8X1z4?`2G;Y&~03912Ycn+%ot5fYMKnbYlJiRiV+s?}R zu@d^u)Ks#Rx|~cwgyjd~&~Z3C6s#<%fizSyRIZ32K;OaCJwXqrRlurJD8m}U*ML~j z;Ykz|-;szJ)_+I~3+fy7U|_ivX-zIj)ilXnulCI{$Xi#Z^RYG5-Y8=*w&C#6>BDEB zM00|*b!FQC>4q5VIxMSWR=>yOj=5yIndhHZ^8F|cmR_KsB*%2+_L&fplZeQ7t`;)`6DWJeIk>a{?bGn@A_JKmwn2I>skK8>w_PT zUS&j08xH20=D!$j+8rbkw97pP=6S4w3)f{KT73(PjnfP9;A|GTs?}zFlTEw8cOkv^ z`fre`R#`%1;jZh5n6roLlB)VM?)N`mxehdazlGHTGyhSuu6DAK^lV10G5E%vGRcqY zGkNX&6TDSviqFB6BP-vuT&1ziv_SC}JZ1f}hKD9F0j)OkvbAj~F$8jbSA2G&t?$a$ z{Fs#`-=TV6epG-x6dz-|UFJnyF-0i(LjO=d#i5#C1&)jO@FnK49)gi2LnkTK$kX&g ztIdftiSo(XR7^s8NS#eM%#=G!+7K6`&Yu*}nd03W5GhH6WCB6|p)|z|gCqbNb|@C4 zvWgiOJB|m=V}U_O;2{H(nJcbp4;q0J5g*bI*@@GY&$e(vn$khNFA3~b3s0w`8Y6A4 z9oqbZOw%i@|Azlh?EHwR#GPU#sK|ex7f_=Tf@hXKEiccP&HBDqdr4{?vP6zy#9G@}(jrfh|H1vz!rsJP zDaXaV;M`iByBa|&88W17x^)W&*@0jbx9l(OWR0+pdzH;xm&obly(j&0z4?xqZ@VJ~ zs{6!EpwDY*;RugaAlAagUcRFuX7pMZj@%1;(eW8)6h)=-{r!lY`@lVa=T-8LZKDR< zC_~RHB_G2x1CWA#rQkz{5Yg0HjD)(FrWRQ{$N*(AFY2;UYkY2^?utUG%^XVYWmb@p zI;Oi<#+2KpYPvX(PwNw=%_y0h!maC7g=8BGs`L6$$H`}8H;yB-T>@q~l3N1m1W3aE zv5BQNUR`bZ1T~?NwF0@~yPkT+6}TO6&KhiS#M-fef`;rVy^RY4%~wWRtiWA+L+;J2JEa%XjJ@wM%T$kvZrV zXS{uilREmEYH&5#XKa_Hsb^4fPFKW>5$VghA(HlcVZ4)nTwxw16;q3Ywm)6)2_6l* z>D$ohMG5IwaxfN)C&%-3=zp}^U{k28r=}&-3TGig5WJ47TMt`EY2VqLcqItv)vK|6 z;fe5maicNoOWe5N&*|u?A{ofIY3sV<^{`V{vdcb_>y)eeO@)@DS9!FUePs;#LD`Wk zTilu~n-yXu>3OC9&zkW)(2lp(%yCEBPgQ##^-?Wg#!A}(iQyA7!N`tnJ@Yz^NYOs@ z(~r?3HH=CWZkw0$x5sCzCLuR=NAC(8B|#5`mtKhQ+NAGZpfzQ_sY;3*ktN+16~X&s zp#=-<&sPrZ3=`GzA3sWN?2@x$3sVk70TD3Fz?kM+bfF_UvgVsH044 zswFO1l9%U2>*~!WmyR9<0P}WHH~osjPkHT$t0s!c{&H+GnW7!+>TZT`*g^>w6k>TY zZ4tn{L-8rro+MW}7E~6?5?w?cz!F|G*gaQ{jfo%`U#Cqzqr$Nu8svI3PM>1jL)_*D27=N)hlgR`#aH*Rno^Xf)@kK|Xr!Sizo4m$z_7tu ziNK)XDygHJ1CpjHtf3+Yc32oa6A2r2LvfTLYje4pQs%5{ChJIJD}yUtd|mA^yp<`A zj(?!{JY`Ezt=?VjSbkCkcA!s$Gm;yA#F-N=QgyxO)!e?%a9iVvi?67j`Mx=G2eABu zjI@-9Aid-?4a>YX%tW%VR>yR=l{QTv@h|~R*uL2B=CJ=s;A%o+zlLVV%5dD_&yh4m#B4vIRH?p^GUMViPp8Li*MecY5j8)p6j`2BH!66vzRE10c zhPrsGY-2ZG`c`BYlR8wVZZ^WzV)BK?i1eGbj{QdRTE_94v16{n&1VG()z|3XG2Enk zhuk8`J14PeVC&*6^sSw;a*dBO?XTc0SqNi8Zlt#KdPG zO{+QcPkPTF5ic=N7;!f|NLb}PQ2o~lVn1`FyVQL9;bz33$$2RI)n?31V`9!Ge zMl825+RZXk=1dtL`-*jSb;o#-0v97SZL>A`5C%2W~TKa1GJTZxG)B<~Urtg~7_H8l&!o1ymb7-06XV z)O?4WD%~{|OS9ac6?36lc=0Y3+o|=cg+@QAL`6hM$nrqFnq#PN{#VBIam4_bFoz0{ zq%MaUgVyk8L8pAy?5&uo5dC_?<3}VZX^}$0q>}0~sV1r|V1b>Waf^Mp6}?IU zjN@X#XUO&0q))q1t`3K2_IM7`;OKAy2Z3Nd-s=N#C&nIFU?p{=6#+rC9+y*4lCVYi zC|Ko#)6et;ql~@;YGDW3=bd3Wf~YIH9&X?5D9EI*>kn=#%Ht>qQdMfXnUW7R)3BA~ zFQUL!&SQq$fvG=Mz6%Q?+7S$YwBz+2FQkaBiMg5q(?$`qAWLN{HNV?ke5sjf9$kyD z-$sh(+j$h)r^i0wdvD?B_rzX1V)v)pN_X@`!=%C|X$=-tf68={E!8*NuRyUsVWlLy zoD|M(+=%how~|8Ia|pc;W>R0*l>8job<}TavGK+~GN)(%u|bHr;f(prg>l9Y{fucR zsmZylof56!u9eYV_fj6Q8;yMo3#RJ)^xiIgpf@drk)+6P?C!;IZ7LbL)(39ip_Osk ziVeIfKZR9icC??OXl&K@ATf<%tDb@M67JBtgnUy?O8F|2T}`79WA!ia#2$ zko5k9?ssrZqGtn48);BmFYq8kj{rJWJ0_1yw|ku})p|w3uzyoNsoj8JG`E;3ekl+B zAy2@GuG@^1d8=?*iiU5 z|87967-m+$A9k75A(#-V2$j*lIwNDQ3y*+!?qI`j27;{TsVobt$YGI~W#CV^9C?RV zX8yJ?C9fmnCsa3x?UHO+vGKg6F4{waX<0* zPfIuiDqkF&I4;i~To$ctJ6E`(OkWy@h9H7_QJ#v`-kXGH=V#+1^7nwO?OumCb<>hv z&VRKmT>Cll*-Pto7dxrjrNHS+Z$p5!&wbt%Fg7 z=D|55M)W!N#(-FaIMR3ty!VNqL@0b#7~EP;EHThKQdm+XF}6ah7#alHF$^(^uZTSo z6p`DZv#dz`XVwLHlC^!g6jvS|HY!Xpp6&VY_Wzi@ZL8(#U4zJg8;__>3=YT- z027|4WA!)zfl+wAkd%sSE#2?2J!^GC>_I>y%f;fLf``I}q9gh4gk!bUBfDJP1IsA0 zWB|`$z{g?W3MjSf6{ZtN1qj8*W%YR2n7~iVG@N^|xn_~|i~09_FieF)T^?yCy~&zn zD{E$$b$N@_Y4mN-XKKORZBb4+Q^+0hsN{IMB79lUU3~SJ@8eei71DD4R7tdy8Q9KqF}P^TYKyv4Mk&BB~@&3V*U-C%2>jYBiw9 zg&=S<*XRpG*Ixx=fY|2=@8mMWh3R;<%|7pT8Jo3iYvYY2HUYVGSe#jpRr%&H4qpWl zRX)S`1cHV>@QXe_FdzT=QsSC;c5K`AqWpbnQ&l=`!cjuQ$RBFZ@9p3f&3ofrh|u{f zdvO1?0caZVpzU-n&G2b@>Rh7g4LDTo)(`r# z^i7gt%Q8XWFzRyU0qnKdazwx#j`>3-NGm7`8#*YuT`MEs;;hk!i62jq`E+Q>cg?(P zrb%y>JC-x9;%6u&W*&b_de(dOP)huwjy!`s4eWS6D}jnkj>=WT?>~-J3zFcD|SoV!!i>8Yz7~;uPVGs}JHz-0{3UR`xkeNU0DPU)dt)JSZ+7)9nbP%^5kr zzxvf&F#2;R!TDv)Obq4f1(ecG;5G-T<2#l!FZ?U`7&Nobx8bLf<}0MXZJR@&|sxv z()YSEJlbRTwrAF1b7@c5$Inc!|0uaKnr_Q5N^uYb(RVO^CiFX#u2WFN#zi&q9L*4_ z;mzjo?u#F+C9b+|j^Wiz@Wyd#AlvXRn*Rzb2bX_(>2{U@bk&U4&5mac&r?JlqS3|T z5w9d$W$dSHOtfZfCsAkSK+=SA-YU|6fjdnl?7~<$cUtcr%Vnl2$JM&37?Yb0s+)=E zAsJY&mXw;WufN$w8fvKeJ>q^FFd<(bCwtVclD){1;#UOX9JaVC%x5|`eakVC#_X%1 z@X5Ci%aDhZoaz1ur! zVAKO_l28BFCdsi0APNtuQgi~l1#`BUj@TsCLTaNicy$xsl4GrkA&hExY2;7j`!B71cPPh<%6FfaBf>3qA=aro<*Pt)&+vC8xU9fQi*SUWAH_1A;^0qBS#Js}5 zPI4O8Ne|V!?k!5+&+zJEu+luk>!@A(OGQFT z)g%hxs7Atr=j*=k<$p+&*$(i+=7o~}eAnZfP&OoW_emELz3sbuA@#~(O3(jIZkbJB zltL#$dc?%8F`YW|+dyY6N9I(p)IofXO}wHOAvY3&sqi#x1@RB! zgEhQ4YOEFkKrb{5+2w8`46QlG~PYU+sIyu2T=MKR6|pN39oMnW=(JU47=QGR zb1Vz|++r*+qScj4Bfe7HEYNQcxBKwpsjGg`Eq$`JNZ5D%>Mkl>P`8nWyPC2Ju}hOY zYP$^6_w7!oY5q5FtKVB&_7`_9D~&>z4A`SyJ0%^tRpaaQ2F}V1ObyY?l+d+_?Xnu9 zS1~eua$UxV6zSIjSzaqH8K$AMPTxv?2*H+YWPF51nXo7>ni1bcnA~@t(l(&BLzt(+ z=F9vcy_?*$b{QA=d2!yQdpJqv&4^f#_<7s!dh^G|>-eOtB9(23M$8~<$IZB3haJbS zTVI!88_3C5pHYUFg)5ig7xTymc*VVs5g$H~AZwj^TxsYd5Kdq={yuwNNO%b$=Cf0n zg5*jMaS`}>ch<|@ukh8&n&&az5BF!o>dYh46>KD2!P``FWrr?v7^l0T(;DUcY_=6r z7=aMHTVRRWvr0Ez=8FRp?g%IK8BGJd*o)DEyE>m)ARw3I;LTfWEkE#N-Ed)^Z+6BG zGs;nqqfl03m1ew^(3`AoynMwzo2Di?HgE7wHoZ)j{O!mkLrw;$hlSuOtBfLIIVtT* zBhja({h>kh)~NfOMk4WeGNRJAOeleXf-H!r%0{pZ$XvIc;#)PL)>ZW*|}?oO9D zWNpUfN&pv=ZU20Kao{`+NS8?6K|o8YrO3auDN=@bx_o2vMuzfPF~V<^7`O^GX4F)R z%pl~S(byc&&=hAi;RhZSpFlKFAbSk1)YyYUig20Kq1bYNTpSuw4N?i(QdwA$;`LJ~ zwz2|im~RFYmMi3o`OpJ@Ckh&%v!*`S?xx`}EDULWLyD#|wfi*ER_4b#H&-t5dLXCRU57x#|as;zc!c%-I<6+Ls)YQQjiw!0y}`(dfg zSx|qup3Bwz@y0w|TfSX`yU}74OjMmExltSujkH}gd*0pi#YaBUe*Fs+?$biQkMm!? z<2`aUbIMmO^Jv>5+e`O)cpr*&B*tNuvxn|er0G43n-UF#rZ+wPCExG+Gxb&+#IN_= zL8x4ESOb6Km-NSaySfynsE4=bw1g+$XMNx6?){uj)7>QPph-a&g}1}1=cpvJ4zPw* zcte0 zi`upGDT$~D_rtYfRanN#gySXt3|b@~Pb%q@Xj6O-A}C;41X~N$@LNh4N66BiOOitAMQbh+^Oi^{auPIH~KTy+!m;xvy%rA2u;?{?ZgG|tA z@|Rg-#0rf_pyF`y{Y9V=-q$EQDq1-rgpjf9H-rZ~j!;^<%JAb0g29p;xx&!%C zb?rM|WVic&r461Tz4obhmgAjQ_!YOE->Pv07H^^xA3lzWeE>M=fSK5y!Dwh59sYWc z?-Kvu%Kuh20Ftg^hgK=KifmkQ4eu%sOaT0{a?dB0r63U13`o3D)-kmfH-El4A1Teg zhlFc7AlTrLzeb5<4G|8;biLxrT>NYO;jj0y%moe|I{ey(dPH=jB4tdCElOn_tB6PC z=jr_X^$|#^3(KwZ8l)AbRQ-UTy8C9|!L`a=sPT9IUH zf5_M9n(;;IQs*UI|LFf6pCc)dYUM?^}a^$B8s9tT(Mb$i~;kMNftBiN%KpJ;uq( z(JrczffQ0xr5fw%q7P|Wi5;b!Oilos5GQx!jMvRSEcVFy$?0WZ9_rOww4`$*iVa}x zC(V^x8R?OvSnU3vLjq-JDPNIRLDnz%&2{Oan?o%p7O$W8LeB0H!%3jQhx#Z4+!hl;IGw9TgkG zp-PUQ5!(}ofM+eOj?H3)Vh^>~{XFK`EGt4HUP+|~Hc<6Xb>HwO`vEiFu4Q7%HewDl zJO5<~f2h`c1#^@@|IVk4CB&Tz+R|%xrU5TjH^@#Ne$M^7>CUz4JGDGJ!pd*)?`u6J zfn~v{D66dBMma+U%26W_Ch*;(7dz8JaLU=3bM#b;w zjDs4V!BL-RDXO^fDM`EGg#QX#pI>En*_~JPy~y0w{l2Y9=M=rNU*h~F4VL*lyG!KH zgYoR=cYdudJ}g`FCW71XFT?K?PY>BxjIPbb`zC*X!qLB}TC1l8`?FOZ3~9xBO;;%0 zaturn(!99tLwlmu?%K1ujqz;!uKCflcYL%`f!F8H760L&?{(Zi-dbtZ{$OSaQm6@g z-;%@Ia<+0?c>6xx_R!JOZc?y{re&GuNRgr*$F37ZIPw$ze%Pz)@o*vewlZh^DSNg< z_+k5t9=Ty6ej&kM$G2Sr44&qmPcw>v~bYBI%;Tcc{ z-@iqE$HY5+3Q8MvVNy7x~5;;g5TO6XPp@aAD$4%n#&Y zLUdw?iSEsaY3DsZA*_D_5q=;Lk9}vDd)Ei51o*)WmR>T^F?b1JQ-*Wl=SOV`ZQ7#G zneJ*6_(V`)YbZuU(LJc5#3ulPsf4DXN$KkRVXSx3?$ zH_?P6504aLIf+$&o^p`aX0=e6O3ms>e@>*Zws-su54e#<#p98tU{qmLU|HZ{L4dOt zmXwq=2gAVj0C$2sBRH-*_}j1ZSB7hAogRrA6+*1Y)O>t31z}$78ZqKEWYw!SHBvW&MkVO0Ex}2RJT?}BDB|e zKgw<`FRb#VUtfQf$IW$#C&(C2&&7<&+FsF*;&FN2Ue(_1=$0gVC_7pd_F)rl;(F3m zS!v@{n5YEG)_E6G0g!&FUL?Fg&0{=?l8_ut=aTd*8jx{-WI9M2VZ2`&_Cs&Vm6rIrblo z^URN-I@*%^m$Ei*VC)`*t0UVCSFH@cc_(_E4C7IIQ;h@<0v))WYww&(r788v>ExQY zlE`X~qr~5hkZ5b&F?vXfah@7~Va`)QvjBv1Gv8r_axF6Y*JXFnH5}=KnNU35G9r$X zI(?{QZfXzN6j@<#uILmDEYy1tA`~L&Ub}ig5Czu1qc{ey`IQA7JDkLT3T!yzAfe4# z9)?ff;MPkns4N?GUq*EK`~Tr^oVop zIcwz}VolhU0?FsCcvSzb9ctFVesjGzNyh0yZqAb*3ndSUrp&hJK)ugwR_-Io~G3Sav7_K9B>C%vfIxwsOa*SemptA5^{wqvb@(WgBXA^cex z3D7NO_HHtw?hEXxh%Spt$Z~1H$U3pIzCRC{aKAHs@6WI2F7OnTxYPOKWdK?P$-d(fX@wd=MST>Q42>8_oHA((mE!1n9F_PQp|H35Q zf~pD290ZPT!c z*gJLC(Lvk50dHa*`9i$XY=uQsb`SdXnAlIl(g$hapI$P(aDDFe81nrp+tYM~p}Eqz zU#iq`Cl^HE5te0vt}hB>Wq7vria6;Z2IxT`5G49Z4k%?xiUk8$=0EfgUHgJr5mmo8 z&4s0)Y}49@XWj{A{Qm%TV%Oy$9O+5Z_oh*owom|2Cxzm1f228SV<{Z{9~*siJ`tL0 zVz?J{Oqv=89^j%^w~TkMH$_lKkglaDhh?P*P3V%$4VDIqCyn@|PRxqy3T4(r&z@*1}ZO z8BUEA6?$Ab71z@O@8Oe7na#-2>oV81HyLD`iYQB6ki9vH));= z0)GrWHU`)9=f!t4z_FRRJ<8fbqY{v*r@p8TEd)R610FRSiBKv6-}u4)Xm{F4uX#xhP)$?d2X?jL-u{$zM?!fyaW zNSuB)KDwrgc>R*@Zt)QJ5Gn#omcAwr6+zLC(rw(Xodk#~9+L~2Vq~zaATf{_Po&WS zD+R2Rqis1*;$#R*2LDx_Pkl;7f-gK*svu6)a!fl0a4_h%H)jDk*{R`#cPp~u@MoS4 zp1%RH4r5tYb1-`C|HBB$c4$>a{#u0O^AKI2p8bl7LSV)CmMKDu3EFPIT(^ioJI*k=#}mzjYFjK#iQXA5&vGa(kqA=yoX>)TYF~yl`(6AzfUv>iX$9AKlK%U8oJE|QXE;S!;_SJxc)OH@R)t9`e z-o#-Wv!JxZX!v%nn*+Jr6^#82RLRB3+NqZ?sj;Im-q&wkhO`>iQR(_5`YjkNSd_cb z&+@H7=0PmPV$JeQB@)n)K*h=ZQN+6VZs)N{$j{PBeW{|GA845eFWm&hJl7$EIqR5% zqeC@s#i7|q#auj5yh{ddR^~PJU)u$)!h(clRv6ihZEfGrqmxovM06r z^#j^gebk5T%Wu>8KGyjl+w7)>XyE+H7T_doz)+v+e|J<5GUt z!DKv`;aS*{2PN>}(2zYJK};%%WwIC~&vX(*Km3k}*t%Vdq-Z>%Pm$-#sf%3PzH zWk!IC;C+%VqM#?evED7!pbrh?A=L>(hnIuTQ|=GKz}bsMfX-mo?km->lIIJTW>@;^ zsa~!s2xumvESpFl8+ibwbf)r$M1 zGftC?ce!r>-Kyq+{<}#VsXtMeq3}TZ;gfsF;;*OzxPq z^zC=qZwy)GC;9M|OEIE+mRsLZ<4X28s|<@a-}m`ytXax(y;R(aMYe=e>2n4wE+a<$ z5O;?#eNyE5R%dvc=LKDjyjppM)d< z5oS$6$vNkNd(IQ658tTzsjKEywsE%jhe4RKWU^G-OV8`c8Vt$?|!zAZ_lO-DK~3*m@QHb?7z0m>&4o@Nt~E z^P-p53;ape3%YBPhj(T)*(X!-UE<|)=!CMO3%341!8WpI_xBu9ELc&2=9DCiSQk)< z4x1)=f|r&`wzq)?Gd($yghVoTcth^-YZDW6Y99Fd(kA?L6G zU|TkP(Dc_xF`FkP!umrK`FV{P1*}YwFDLL>?l_) z^`d7&e_4SCilor9Y$KaiYd8LdDFwZ*W*(Q*?dx6m`yJQ=IVFz@or1Uf>h1MgJr|F+ z3@4xR{|x#*HwRBg9yt<5K2F7Fy|W4W9?Yr#Y2I__#o$LLM~!wwenL)$?b6wc?*a{( z??N3{3Mv&Y7+PSFg1!6gVU?V{>ve{p$@_-Bts_LXF|O-zs>7+x4IIuV_3P|Pxzd_W zcY0obnb?~ML-lJu#(nuGX80=i`O;Bf6S4IMB>`Q_Q)OSzhTq}SW8NtNU2kD_`w~4G zAp&%iR%22XWN%Phx0%j7aGCA~YfG_aVQ3gSrDI6xmd=rGc;@%4^?xz1W_{n?b?)7tv(MRsQ6s3RC-EQBpH{j# z)L=2m3s@XBetWc)EcRV`IjGd{_ve_3P2VivshPhLt;BSA<51V`>shW>Ye{CN|K=*@~4*9zcYTIb{DDWFF4-2Kx@>OCVmTVRWUi8Uv{u)u*muwkT3;z4$4V4g zTABcArH|vzi24Wu0+HcKq$p;fU^$Q^T`|DURe+TM4JZ?iUwD_j$YAuD zx$SrwT4svER3gyxo?j8-fAaI7dKK#6qi^3XqdNh+(RnM9Wa-{zCvqL2@s0Q9poh9l zcEJj>{7i^0!iQW6P-V2-i+k(bHtVY?^*=8_EJ_pCg#R>--y96MZs^w?1OA;W=9d&j)F0o7+H?6U=^ZTZG+zvv8S}#K|{=r4Lo=>oUBY0XJYlu7~JidaV zxai@>rLP=s<~*fxX?+2<^CA2xWR^Ftrj(bD{ew;MX3yLYR>Kz(4;x9|$B5CETU9rW*mUF>KGz@D0iisv>`rU@ z2dxBLQ&PWdZLx{vE34$5>M43b#`qn!lGc0*Y)D(|{ZP6>4n0P#fnZP`TpFi+6ZtZq)3V>*Mo_P8&1+wWlnk zf^Z$5ZHD|U-pqV?%#|TwoAT#moM^37({g~lMiw7F@bNbEK$v4jMa68}mu<2A>>i%U z{-r5O+dH_vI5q@8`^_b$7tq^9B=g()1vr=%%-D@9XbCIEi@*j02mf^g7^Sqfz!?lC z_&m`G=D3QIV5aMO^boL=e56p6wdHHD6qn4WdSzxPUzCLf~Q>+>RA@b1-~K><&pqX*CZST$MXF6}3YPqlku%n2x05mbnsF^?WZ-oZI zKv)OW925%~mL}D5#czTIeXQ$V-U|aKJdI%fS|Rjd2)*-od|Bb=KCWl@C2vm$K= z0(W@4gxJc=UG~UEAYZ(ycsP$gXBES@w^_jzX9$~=$!<)7Z+|8LBO&knxv<`Y1iOO( zTxk7Vaoi{nGVu&995S{ZjL?V7NSSU*SL`2P($UCVT6#KJdG}T-I@yS{G-264JthN? zWeGktDQEwXnY$}KEocF~7zCw4HgWr=4fXosB#*G9 z30yiUdb!aEEVdIsp`wGss1usFJSnE3naS1NY=Dn|P)TIyk93l#R$5Jmo4r#7x|ZF{!o~Hg<3A?*bKw!K=66pb=@mj zzV;T%>ax2%{YI)7qpKu}hNpN|>Wo8AK43Zb5YiF*e1~z8Er8J$aLIyp<(sv3YNBRn zTs;QqYpJBR@0*$r7#hi~^H)<_RT!maHlYO|F_R@Q^hJB9D6wjkZ9HqS5iHu3Ny44j|_~anK za*e@Ad-viae`*H4i%$8RLduwVWPIn@3p)Zc*uHboWzvG9y z&44OXf7Roz5yIq#H?P^oXP|~xELhq2+%Ui>=T9zGT{De;pfOJI0docZ%lpFs(O+!V zN{4u?OgeuDpZf)_{5qlT$WPigb2Wm}EmMWmzp#U#9t0I%}y{*5cb=Ik2`moT)((*F@@7<1(W>g&jYm5D4^=$}U*EA?Mm=kkJc#zZfD-ToX_eC+J};IjNHZHU;ItiX;g1mlS2s1=P+KP5c3m2Q8RKRR9HT6bvXZK?eeQ-!_*I2HRAdSV)@m z6B)3_MOk2JFJ`cOOtF=mE^ZO|DQ{WqZiJzHe6;b=oUn#S0NnGi6Vi=|hO5$75)mmi zSvC4<3+5qo3lk!$@KrgGO9zUgSI_V(HahpX5UslW_bS%iFV1cvWm}7Oo>lsKXF(As(Sa8_ zuSt#4z)r41TZT&fB;CtXsFq&YCkr z+UXYY?A&6N*KRojb8jebfIgdFUnm7_hgUpbEkw-0e0T!%T%OCJqR!9K|4P+XodR`w z%~dnRuGG|Srw%c);sOTFKijl__nxwU-mdbFx(5Fq1t1TiVV%-Q`%Vlwwd6#=&~sKV zm@Sf*R(YFhnf!PUibhyHa5Y0MgVEk|%^t0#+kBNbOAty|H**PA=nG+^*>-uMFP|x{ zMg0%n_T%(jxPym~!r%P@gHBrywlare=3l!kp0}eKNf3z2NGjE#@NG>d=wMCY`?y9+ zGTPZ3rS(?p589p)3&Aow1r_@eNi>)>b z@AJV=1IJcRr`-#PrB|6*6pkz3qp9!7mlX%gJZ;_@?LPqqPIbRKgBagg36MMn#t=rpYsJnG0W5- z?l-=|zip1SDT+XSSZ9^@q<5)Srv;BfVL$auwW!14vcF>1b0OUQ{AwC*v~fzLv!r#sDJZxBG2DoU%MVyzQrpFKAH+0Q8X3$_4`z!e63GhD3&;^Pf0C-%Nv85o`QJPOq6!;$odzfmI#7wA*Ix!NaFNCVW<4 ztyX?w$hR1$9f(5ob1}4*liYsz{qoBw{+pTstv*99@e?t$12>L^4$}999EPag{NGRB zV|-?%>WylHWnq#oMjG&ome_hZ!p994JBpfBY$;X9RS#L3Zz-M-RykS!K@9;f|HBFt z{l6I-yw5l5M@oUWcMbvuopY@?q{Vpu2qioorb?bq{|1Z)ZE&-e94}8i_8AK+N?f!S zU)*COe0Fo(pse99cV1n+Vs6?TfXt(KykHlXUZ2ybz?}bp_7EJ5&w! zLJ1DY;b6yfN06?B6paZKr`o|lE%vse^ySEDymb&p+Z}K0)s*shKcA3B#aO6qj@f7b z%1Of<62o>#%i*O!9I^77v8|5Tu!RpiDbD258Ne3+tORXE^uY`RX67CYH#VS_EC|SL zwi8Kr%PFmZMpp-V@d7x&SeL2@sRCKy8Fevjbz(?TFUE-%V3nM)Nh|w%WigM&$S13Fm z1MG^@L?9g;2K)g6GY6AOD`b|_A|NjS-Gg7u!CeZG3ZqGoT+2EX6rQ?esgICgbGUO= zq6;v!Kv_HbGy{c=IyX`9+tP<_lO2aDoPoXdvD~2PeSsE-W9){wep4Jkf4R`{opk}+ z41l<#kAKn79h{1e06)_#!;~7^K0qp*#{{s zGn29f)Gl*RN8zl(h=v6R^{ud60uu5L9YyGp?0Ym z`PbL6>tx3Xs3#0++FmDR{lsWE$iU|HvwP9-O1zfYzs|3Fz}HJ>=WHV6M+Pr5ua+?DZH0Km3T9@8@+4+;aJu@z*Z z{EU1p#A%|~n@ksmFJlsiENuB8Qu+@kPRG3Rqb{=a$VDvR-T)+_{gyBPa~fYdGV)6i z9aNLCe75z3yjHKO?abAGX({}*o;mDbhc3) z-!LuqOi~8R>a&J^$pI9eLPCT52%T7?lpEevc+c9b+$bFOZ6TW|2Xp#Vdtcl&;~f|D zfNJkarEfaFBu+WfG+6$gK?)|oSn-s1es{FRD}IKv4w&%H_dfqgC;c@3m-g<6a>)C| zMN-RT&aqFaoDGTIS*S7*=A|pVoJUKYEGHfJ2}su*i9x*s{y?+86V_ugvEdFMYtRJ? zOZzCm__6l6x?4@y)bRSxH2*uU^LPAzisN+GQcHmUGD|1CPOLf-u1usM-$E?zFLchd zDhEEnOIoRskVCYV=w{aM#7AEX-Z|xN@dj4gwmi^zH-Z>zze^QxXh*ExLT2-dWbsdx zjIL6?sy)QNyvn%<|%?sAyKNQf;~A1$eIrI4+X_Nd=eMx6Ia&8;C|j zI~KtB(!9ojfXI!z!4G*DT6QcFr_%!!M$VI32)2{Qd#(K{aaV-0`F(tsC-HI8IHQWY zZb(Ji=V*?lMe6})df3OHS(bMXhhggq8E0_WMa$>_dI+PKXgX zZo$pobc3)zm2HjY&&M1)j+~vhm;R-#@2_C1yeRsHS9axhl|JQkdSPG37;Wxys6Pt% zyKWjTRefeJOMn+|_+{69I`TsIYgud@KGqhYDeK@A7Me;fWW$KY*1!r2?u|hKVd~cE z;eP}SLSKi_S%iblBF(xY!99XFG}x3tH(4YS4x^MA95tmhr!~XA3&4(4aF>&J7lzVX z!Z^bIi}j-1)~To_;Y{Zao71TXKQjjQkbbjRC{H)WMS?dkgg6k7+Mut8SD%3Y5bN?@ zU3NrTS>>y2PFxqGJr{jc#z!6<<`=rmXvJHdXSrHz%kU41{*Gv`A{8hL0Hn3LA)m%9 zBF{3gpqv^MMTlB*1;v~#OXs3}GSe%0&d_9Whdp>SYnMLSi}uEuCePB`i#uz%$J6}I zw?aw1IOXNP2-i%YigC&#f43zg%ouowwEpaPOKk_#Es}T5aNDvLa$ez;n@)<9z zV5y%qr&As00M$9E2Zr8eR+5+cpEsaR$BQ-mrQ-6PjE>9Ze4cHi#(;3VFwjSzOd00u znzd~;bjMoU#p&jZ+*A1k4G`W$Q>^$AuHs1H+}=^d)f#%Qt4>ya&qrl|<2u5AUy$B; zbXW0w_AK^p3DGE!qAFo-zH3e+f#^~)@;x)#=a^LvR}*wGe4YzBFRkDrUpudC<);p8 zQvz&1nKUA|b>C@kGeP@gIxoJ0iw=L{=czHbKlC?#@2EcgHF)nb@O<7ZU+i>q*Wq05 zk(-!ET~_`}25;p^~|_X=+RC7CoX#dC3~jpOs0kz(q&3`f*E3YitH z;IV}gd_eiz(5sMFv9Rism*Q8kdK}?dHJeFI%!AsFtgUzaDEc@Zyo1u3!+?CV%&gZC zAQr{#%-=2Up*%5weaDsUY=u)#EFK}YePjm;WGE%MjVl3!i87d}^qz(4uV`qi9-%1c zO9q`q7Z@yqTnkEPu?`|-Fp10Hmj03uLQf_x2sFs-$=EWiaEXzkRk-*<2laRf{{c1} ztMFyKl^Szub^gO6dyF|1FK1g@+|4E# z*%A8OlSx~YYJ#hwY@g7U3{Bs-%PrGIxycd!)CBFIv6H2ov>VnydQ5m7sLPQ zM$V#}Vl%fw3b0!9&0hG)?&uFKOi(j)o8~x#{h+2)&!P->)J@5^<7mwN&X{Wl08-8$ z@lCxF{nBOpyqK%I=G*9ycanQ`Q4phR?1{mxS5Ly?Y>Qp6bHFKjkOL=28|3uf;Ep~s zX8*GpDXAU6EKI>?nyW!8iIQE_=^UGHgRk#(y^b>W#rDG%R{se+ z^}~P282XO4cGjKZRJD4HRLZBf)08V%dIo?ycdk`M9yU6K5nYN*;~pNA4-)roOl&zG z4LHe-Mz}}DMR5qlw1^LeaD?o|=(x>J6q+&JUMEOnCD^9fp{ z9m@m$)Gnps#m&;1x(N7MV z5e@7u#@XzSc$IHCYi@;NpFZn|gV26Rl(Nh#yNhc6fu{hsH20x+<=rqF$-)USCn}qn6Qgj5T!UWK}LbJQkE@5EBqtD^T!K6((-~};SdWL zdN<2gEUiP!bj6=^T?yVzZ{TOLUH;#{{uo8R8o z6S`>;RA z;2l`b4gulQhn%VBv6fGyv;x0!y0g*_zQH6ZFm@Bu12bhEL!$ZO9fUg#Z@7PtU+H;TGec;Zsuqh_5N~y(!0Iw)9dC^_9tQULT=4rk~Mmu0HbKkl!5@__W7N_5SlXSc~&}AN9 zF=71FCw2(1J<#W^>tM0^Ea|z1&CV*86;a%D5!${N+lTIF@;9DrgS^Psn|0B5Dq$f_ zvr&A{7H`g)OFuQJ92JEEuo?zjc!*7Z|Q$NL^fKh0{fVaWAfI5>j``NI`Eb}^79+qS&;RLPsUHL{2 zPLTH9xt=SdOr~iv75Vc-5LN@Dk=j?9)5|i6hFVFLlZ{tu3-LuknsbWm=I$|cVJeIi zWiTQ4q92S6Bm9S<58iDfO4l-vJ0s(YDyHE~ld?nu|K9TaI6p}5Y_kiXxOOw}U6`CL zCm8~13C*+jdEFMC2U(<@u^KP7J6aYY0%D(k(umDsV_$D#-;1*P0J9XWGBgE+?0nPNC`F{NmkEG8o=z0f^c&HQMhtr%i zG^DQuUbsI~A)XRLgYM#JeEiRMN~N@-F11N&-IuOPZ(yCz7d;MJh#s0YKgaP(%}=f| z!e1Qqer}d!=by4t#h|-=>@l*MXW_bRrqMwwWfAX}6M@?e!WYEOXob)>*o6#yxS8BasNPDRvA7Bo2vt)1GLbkj6? zR>o6*&h)Wq0wtN{V5X?6KRNG9Xz+1Z)3QAK|J=T_32Eyr2T1ex@v*XW21gOj$)GqYg_5{?rQq(qe_9DM{m! z(OHCn@nz8C61Xh-e~nY(e*$&kGkirFLTcKesdw%9YY~#*ZrpOm)luUTv^2h1X*0~_KKRDIsdbuO8le)36 zf##HepOO$DW;QVovg`9knUnv+e7Q~h_2hZBNciHsVA1j96wPEo5P{g!=0x^~IG5PP zn4`q)I?ML=qs~;^Ca`!zTM`z?lxoJR>|$k2Jtw1mtYUM74FIhbB_z-l74~vN`lRiT zImPSB$x?t3Ox5x(tt#larg^7vbSsR|N`xs-bgt%6Tx{|HCLv7u{#Q!a#(~3wmi6t_ zOlw=?WPj|Z=eF|(4vL_?k)hNvwSGSBUF$Oj@f{NMU(J5w(v4n)?`L(da^J{iwF#B# zsG(1c2{@=v=+Kz>wVmaIuH2N?3lv-wOS&>O$DlF`dy4)cU+S<3~L-ab77Pr0= z8ynJm+h~*Bgd#O-<`W6ytA=fCmmR4NcViH`z1*r#~8O zu=nLrC+aL4OrY?_nYGgMUy%0#N~1e%U;T5#{UTf3Riq|=K9x21xwmamalk!hz9Za? zl-JVn6_cry3B*YgfZtxTF<^RuP)O0Z&_F{$WT+=X^3fK_yd^Fl zP#j6dIM4E%_C!g`ZsIU1pCK$iQcDY^rb$r7>^@-zO9VKpQ?XNvUau7y1^1mZ^s51OrkQ%2Q11 zc%(mYV}yrIB*x7bT8gzKN)A*DD(NfL^2>x%D~=5MG6k~wuJl!}*#N#BQMikImNYn4 zl4b9jn?3BxJ0_EOYt3@Nz3x8_jn^C8`=?c@dk2un78$HqG=G5UgkR@9>}MSK#^&43eJv6OkjTu;!!Y0k$X;lq+?c zu<{StRy9T*)?fdYfY_<_LTceo9|lTf0`e0GnUv19&eP*5P0aK$!bf|65ue4RZa)Qh zox|_jBV;8uM^$q6$z0J3oSv_`_qI9P1DDqPk5+M@?A4CyLbuF^tu%LoLifh^cR3Mr zaJ1B0O|$IggvX3%o_{R@-vhl58}>U8535&j)Je_f`yZLZ53z#_YblX%;R<+6>$n&? zMX6Ju-@kLg!zsJ!V=n z=-Kpy)y0+ty{~C8FYI9{W;r_BJ)l$SwJc-Su1NY<2IqMZT5As(o`^ZAKvM4Jf0>{*5(~j0vV4R*DBo{?}iV{6dgT45n-ULJWkWq*CaV znwD5+fU#!#2dtGonQyNV;l7!X(G1#*N+`p@+ix4V^PzBjm&LR=ESx2K+6+*JI3ny- z<)}UGQ`cf*KH1|@?NuAM&nE5S1nRanoNFpAxqh5R5~xeJ2`pi-KScvO_a$X zjlods;$m+VJa>--PUFX4Ud4>`U2b`;GU0^|bh~5bOC@i2X$JzeZVp}=d)KE_uGDLkqBU$x8)NO-O-<8^d?ETecmFT6uNf0z4P((N&$ zFnmDO=s7~oI0N~%OMiBI=EtVPHZdOW;4L1NFE-B-EpmC4y@0US-{slTvCi|@d1+sv zk4iQ^gwDef6!L0bSXy7ZQF*eIaQq~+RyY*Rfd5lPXvIRkDDI}`8MJZCp4h$ue+l(v zpyc9YdHZ7)K*EQEDhf$z7~S$9^BYq)4rt4)!xox8WkUL!$^M4)*!-}_7|AZ>L7rM> zdNAIgHz`175StD)EEr5LIXFl+Knir0jijTC;5P5=rQ?o32@M8)5$u<|cs);k(PAd{ zRhH-zSb5T{T6(F`>$EFGj-^fyffS`xNH)iUB*dBu-{39k0Rnc7tqPAP*hThQdW!Sq z3Mlw;luG<|-@|brn7_;<#vxxxr6C|v^n7S=7(MP_FE&ahW|AB3P=4}K!Mo&zlbm`M zUG^)Y@H#9LX3>`5)LB$^prHeYFbr63k(}iLE~EbV97x||=$q=96VR|dw_g{?n>AS2 zs6B~}jGNP}Z$}9Kk{C3>BM_D`z=_tTh^{o3*I&i=1=jLj{w2!Kcj-1v^riZ@_>l!F z-FoeVPAe2odQk3n98Pgn={2IIo9jBfJnS+6w-&mJ_{^>PZlJ-F$6p|6Z7af7-E8ZgtPIzoV@v<<|4OrNQv&MwtQWZ>#==^Y?SD`0!VZ#RCsKH z?Q97n~?!dAt2c)|gnj!>F3Ggz0lz$6?1mPMCHn)}4_9$bJ;HA)I}`-2gc zK#Nu!sSaUvdkgxagLJ~lXh9RoXNz#D#6@MgEF%g*5YW6KE%$Hp$P5Q()aSj5pP-T<}Bo zMy@`=H0q1RsDSGQ{67^wnU^`9MzZR8%>T$K_Be_(7!2;ZRilnKD)fk>G+LrBbqz~; z;QdXMpFMa88lcHLM+V81%fR}kHP^Rm_pAQ(e%G$^55<`V?x&M40m!&gX85Dj+IR_G zQ^QP`3S=Ha-ErFA&WnLt?rYWFzWzew6?*Us?2zP^0Wazg4icuSD@pYy-R}VHQ=E(9 zq!3!zW0siJ$DVGl5jaL$#FF?0$k$toBK#lX%--!fOF) zp3>109KZ;W7?1NlDeKY6K>#Bv_%d=zz1+&8Efh(_oEce6k=vgegGEGdJ zTjrH>-7$H~%zAp4Ess(>fxUS1^f93^R7;L;w)}P1E>H}E)PZ!*=gE`jg+Gfn5)6cy z(8IDbq2kj0&eG(EcZCA8wKh#O*q=%YL^w5{gsvl8$y+W{5Nq51I}GjXv>MF3xWb|+ zv|lV>Ji(HR!xYGdMhwvH3m;t=H`04zO7j+F2g&KoaDPO6irz(_Pu7`6~UE2F)Zf|`Uyt4H5T`D+YFUkrp#x~VA6 zg1g;jH;7G%CR)#yHxIofAhc-_lg7pbYU;-qTJx^FiUHHUB2=B&^3UpC%nG0A{0SfG z*VtC{^RKQHNz|26)+o(-qcX_F3OZE|Tm5xo2vmUyWPsOS$pOzXK`KD2|4$_x*W7^Dnj18OEm=+te;c=yo>8Dpt_ZWKP z;#Nvx*)SwI(+=FhsOx-6I&55VHy6Ry2iSNSKWq+g1RNkZSMR@&P`4&E@*cm(&&ncr zNNW_^{0L6C_Ix(Z^Krgv(8s$I!`>?5a6j_v3oIpIvzC7k!+i)9$XitfZH$YH2Am7v zh85khhlpPO-1VLzELx#Dx1D^)qvS_sBVb9j9Tkf>Ei!$gM_6r#=?ui6jUuhSYywY_lB2YwpPYAC zKFDH`3d)9q6MIM*n?6L+0ptVLBQd2Fe&Y~IO&q(D4j>sxXrL3HjyzCN%T9J;06SZL^H16QV!NryHN?I*jz) zz}G6NSRoU7Q>{7dY#@kw*6^441zYGl8Tjx!%6p%ed_83Cvvf;2k|}39ZXZj`v4NJ1 z-w`7n?)=dkqRDZ7GF_L&6xY6ZiuWn%J6drlQB`(Nzm>;Cf|mX+8(4_xXMCyn?r(XJFhyK>D9=#+&i7Gglg?qDtrh=yk>@I+5=DA|&N}iSVgib!%b@g^h%YCi=dG+?+OjVQ1;efa=qJR7K zvyYzdc>lfc79W(2=IXr!H`4wq}D;=bFa#Np`aKuPV2TAV+QZ1uLJ(Mi<* zm%a!YImsxb&9~mzTnLbE+9@Dp;=t4Bu;l)5uqFgc1^-5RopKJ-iOj9P+YQmrA0&|& zf0gX@*PxK^!_^O-DsfomHBN0p(_jhq9(x>6J_p_D^Lqd6>~}(od&jpQT;budSvTc> z%-QlFF?#ENNni4=!Q$ zWcG`n{IZkCP;WaH*GHVI2g+(+T~jrzH$SLWasIk2+4Q_Ib(LZ)eopE%kv92D`T`8* z0a>KPXmx=B(r8$u+-PanFcgzs06u+K7!iuItSlYjS4t(Gd|K?tkKja|0~uP~3M#BG zW5}u|g{*2ZHx_kf3SZ2~I7N`?Rw@`9$bddbMElwG4#0RU(gW#3dPjg-m<_d2a4f)} z{kN22!pdxLFkT4+RuAKvsxF>|5uy@Bq^qki-Cl^BEE%|y@1?0WL`@$%goHR;v0B-n ztF(m(amOSG*`tG)yS3MjXIDwryVYSKUNhn-HhAkizvAcVX;gR!BrWHimJ~S*=>K5ymf7>!8;-T&O5pE!AmebriAR^QEy-B$KJ_sr{(gvM~~FctCE zJ(Z+=Z$624d7kVi)#v%&@AYPlE$?IJ8z6zG3up1J-~RSA-08f}sItSRH00BBvJVj> z5C0F2D4Bcz8MBSad$|9F;kL4nsuS+4a9v$~~o``&;ewa;Y!m0pA{HbF$lK$qQV-~&^< zar?iY$4|(4PorX1ahKR)`&qMm1tU*QLIX{-sd z&i~O~XQ)awbWM3{z!DcQLacI8gHit?sH_jo8@f<8A6y~6%fwZ;-~aQ6&~p?yxKTsw z&%q1(irY85<5nXRAZiw(MP>QYEK{Lqum1Fah&S6-zeL&!gnyZ2ek@vb4Ls;f%&`Is zlLA6A0pQorR7_GdRM2~HFi#5C`M*jn^q34G=@b(?N^`U>e7f+7T?MW%He?%X6sc0< zLud)4INPBf$ngYvq)krRe!e`TT6Z&00L+c%f-Qw7xJ4TJwC?&h1)lX?&;*nrWb(0E zHw2T{UQ5~F$9Jjs+d>h)=|8omWC|>7wUVD6O^DWhjr(5RXzoz=z?gz3^*xaZd%nyo ziIvsdJoG?;gCwvxyX@Z|qZGgNLZ^X*O6|whpp`WFD(MHo+vRSEtjX1<_$baCXuWiZ zdJuao!@yfizzjd%%NEF)51bDe(ASse0#3WiSWnk;4xq!vB2o>C~BIVCeZ} zAzXlE-)Q8AR^OXTdBxOesIPajuhiO)v^zVFX`VOk-P&^_lB0xQ|A#z8&$r!~ttY}M2!n5VzYDP|X_cm}HXX+`{ErL1f9(5x zbLJ!cDcu1r-g1uL@_X&u|?ao#qKgu#KLa8&-dg-kFvns}X(Ao~ z_j9Ak8crggWGuQBQXw-fb#XJkGvrXdRK9#Zd~GDEHLashio`^XvYa;o;4-J#BUf&& zM=7#7AP*58@;|d&cvKSngCyXs{M(X3S96=@X9_*Bie>BICOI*21QDO#!J%Pqqj2l0?{LnK9IOq#=^&is)(kO1FbDI@RVQV(o*Bm zYCC=4&BV_&KQZ9?vRk7D^~Vf}KSkFaha&Rr`>~CV3+;YF|8hK8>guE(qSk~j|3y3< zEI%^k)OVEl$~XR4+9MpG`t5fa|l;fC>S$hK+{_q_MGQEZG4e8W7Z z#oqv(#ZFoiLL>KcsbRdg^K`g`d=0qD_$c1fx^|kgU=%+y;v{DgRaVlZMHBojcL$Tx ze8dHBV4ciLTGNW)o8u)Gl&nea1MqJS47s*OW7b1u zi8ayyeOnn`$=SCK12T9VReB*6izYU10Wdcv2VD(wSH2#CbUfjdZeg-?_+gTy z1g;>-L}ZYF++gnyFoCmXjb1ud`Rx56a{9B{?>mt$s-9gT5?x4#e5}#M|5Rv?yuLp0 zL(z1YgLP_kKXpU4!{At5j1DZr5oEw=DGaWMPT6Wl3UyA`twq%6*XS`DnWfL+Kq^sEmKQJbi$ECbQn)v)baK0%?F;}ACl z>6MM0W(Qdnd!#sY2DM2qrGInMGD4?d4D;8vtAwWgtNw&>_ein3L9?5Q(CAgEwwD~s z{2;}{TE9OB$rW?PJ~E;ox(<}IC4`sycXqyViZ)CE9TCdx4<6Wu4U29RtBdf_(su{q zr~n+dUp_`h>0lgOY~x3n9~qJ2rYE?`4~QQ4uisFY{@(JYW2g^u4|eMzX|!4R49bHFA*ee;XC z;Oefn*u-F>8#9T8P7|}L7-w8g&nbK+3V_ViM8nG17OMybqkJaimFFID{*6SgZu5u% z{60z^8B!)M*p6-mqi_!KkCy+gu|+mJN!G1}@}P%-V7UD(^TD;qJF196i@K=<_%Jt8 z+mR?EbsUqu*5_K?L_jdo)IryrP0ZYF^%=d@TV=m%eH*c%ash4EIvm7jq1iJTk@|$cYbRIsr#UqVrOnGgAm%U6?G{T*+ zXC)hqpTbSFzQ)WDjRz2QQ{J#Srd3Q=D!KK}eI^yEs$YHQUP%1Cw`2D#+i7u^%6g?E zpe5+{w>ly8{epP5Z*$M975b}}aU%Rw!hakb@SAMTHJ&S+f{?J`=~fpbPTaS+>Kxt# zjGXIq+1;QTIM|+%J!v`rc;gjx-F{$=E&gF6^A>Wqq40f#PqqI@yqljP643eFKTYy; zFi7^7n(=9SCe4$xB7jJ_g(E-FFrqjS?MM=j^9zo+F zkI1eCJgU3f`D;3W!%4)y^Z8ja zlybC5e4VV~LTNv?rCzkw@;~#e1!WK0Cce?QX3qW%9q24maSf_e8!jUzcxEgyjktWQ zxeH7)lc-I^ULVeE)f4(^xE(~sSdEH}VnJ$(&xF>IvW^jqM6i*R^k$I&WVPZpM;paY z1l@NfnqUc~m1`xM!#u;lbfqV@hUPH-ku9HlCfS39@|+L+c1VzLxV=ywMoMcQ3?k!) z7J4$s0QOhPLnp_3yHb!$fh-e0lMKWCtXxhS#tf%W^iYq#Zwjfx73^@eb`)j9jzjTI z#goZ|S)O|jmw4LruP%|xQt6jvrmirS3x3*WaZod9e*GO+M5n;OfjWt_xsqFmO7b`o z2ynVIsl`v;FR`!prJcyO=r65VWzpC9xW(D|W{e%jA*&1O)O?DLbakr zyFt)-E|mp2L^Wgp5@s_T&cJ6&&oWe&F`eQ5GsiruF0Ie^y5mCHt9GM+2?Y1Uxx}N% zl|bNe`0-kcL+5q2KmFCan1QeV zI*acj)WoWv;zX#c>f??2=OTADKa~91_TR;wz*%(_r}h7vJa-+mudRAEW^ZJ8yy=I$ z1hweJZ}hDO$=~55XTKmO1q-TDV`S^s*TubXBQeH!J)oKNx2(IKE&Qd7;dYDLFRv}- z;#^dnVKy;iHIG@t{tCO(0ijAgwWinAGh6p&ON+%7R`Hr^e2+glR0NoV5LU}gJDZ>!u0F;auC?MnrlN6UE z2ms^??;=9!3Z97?r6c%y#-WXsiF65P&_-gEYyJPE9U-+fd#&!;RYN0cuvoSxh?GlD zs5zSt9T%T268M`g8<`h<0b&?yY!%9*p^_Dvbn!_pMIEv3YK zGZn8lfx75_Lnjk}TZXqHLmKVOWEL&+!7PY^s~7Wy+Oh9YQ*G6*ChTm zvV*0OKeK|3pLE3LVrH*!&Nus=AFmuRer|7fTw~|?Jk`A?I@k5}R$*PBi*A3~jS1N)0l#-G=ieDX-{0>Zr>hmI-I z(-)!7vLEasKlz<0IsEuhvYKh1(Se)zW9O@Jzyh<9nvkWcPkME<|Ghp&PtfyGPX(3h zV06%cr-LnDS2$l+S0;j@(r0RNQ-+1%Zho)!rno7+aYPwklJvO%!nxarZtzyzB{tCT zG!YL#83ywNdSiG_2fxl_4HEXO$10kP`>6RU=r0QG-OcKjKH@1MrlD;GdPoyzGaETB zCgn3}Hd&&l=kx*gvy~C#+TonK+c#RhHEXwXD`4SjCyQl*j-8AOJ~3 zK~yzXYrQ<-f!3m2dF7pG%4S9AiS%yPIEH{?9CU182$4kqzyl_0%4P+I01y&3D;LdQ7VnH%SxY@nUjSmmS~fz&wdjr&FN_Ki3Czn?V>iBCV{ zsLo%1BdZgp9a)tf^7yznR@JTyqQuJd`( z1lSaMe2dMZL982mW!hwI95cqNj0stnJqSD(dS`?Y9PnHme_OD4SX;Z_lbpyf&(jvi}ZM)|N>z zzctHn%&^8-X-G1!w?f|lWKI4*d1df{#ER1ECP4s$Kn4LIiG6?=fW(|a29(%T3=trN z$QU9~*ylI`rcmD1D#Dn8gw@)uWwjnSFh^^w)_QqD1Fc0iD^##qr>8qOwK#`WY}Po& z07DWKCrnm?024MV69t&u$I1wUpHns~0GHUT2$)3Yl>b8n0Lcx9;TY4A$-E2Fo3yz! zs?8LiW;6|t&QjRmU4={v7LY>j9sE3HzT+BUz(9)VN9MN+3p{-F^& z`Ta?oeaR;Mapgl_)J_rO{I^lU8l4OlZJo1s<#OM6!(-mrk~?XZq>KmqNq2= z8jL(sJLh2@PV>Zu2NQ0-Y2VDjgB{_XgS=e!++!Ao`6`@h9`nJ8M!?k|f90eVVg5B7 zlv;CxL%o$8Y9qCu_0D2dURt|Gw$>qI&VK&pt^Py#u3sO-uYCCp+y3{J53P^m_L}Kg z&)%~7$xmJU*vo(Osq;agC^On&8YR&M*h+n&$`MyBLLj{PkDl@P%#83}ai9P9M`o`5 z>YjF4jfDeS*E5E)?2R1U4E9B0<&Oi!x{sO(sh4i{SK9r>VnVg+L-mKp zeDo!s_ar+ByMwJ>P&`M!f*#n~{9Q>)%~QS$RH;JG9$A#$32gQ0D>7-jTEDX0d}EcI z;WthFNoOrmEQihhK)*ayeN`_FlQv~VdRl9(+7uLe5P+F6L4YJGB;g@sd0K-QA;)Tk zG+JuPYDG!@1ICCGMk@eEF>^#rArXXq;3&sx6%DM`V2#z#m`ICI%q!DijvS*Ct} zh5G#t#c@PMHfxkHS!05L6E)%iK&&3)2llOq z`|m&Oo$+awn2YetccL)K({;=wy#PQU7l20gEQ)u~Iz?9l4lMsnR(cSqNL zbx-8ep$(8P&N$bEgR~3tsZX%KN>`=LH9j!VESwxl8$7mp0KmBY2kXb=aGYh@sZ8P? zqV2@vZ1Zk=V1U6MH1cDg)bmwc zzx8GJwf7m?0AeDuR35`;P(P4{kF?X{ zt;06SSix2c`&pdC3-zU~aeUiZXqv1m#WByL>s#qu-je#NKI;>Btq`q+wr0vzcNUH9 zT!m%Am3C{4E`UZ`>NV82{W`EVp9YR9ZLv_0pPTeTeqM9!?pDGEU;Lb-%VC2v_kj6N zu_)zrlJnsS-*YfSBjCEa+Q*x}v45TCl;P~Nw=S)p3za1r%lf84lx zZ7alarGq=O);80aY~oW};OTDFw115I3}90`Tz|d)u)%H1MHg>h{`CL6__6=~vnMR2 zzte7Xmo*hj1ttJr);U(zRWCpJQ%_oc&Lu~$Smm`w4j=B)JOA|djmmk=*N83ZQP#T- zaGH)ubsg)E1AW`z+i1yY%-l9j&jkDje|Y)=`Y}m4`QZESo?V#l;lMt5Ds;9_`IsMV z6^vqjHU?WQbQwtwaMc`JgZU3ikEyr;DeZx+?jUfvJ=W){HO>`ZzL*07q=A2$h!LW|%81|-ncpDq&*4c_{9d*0=w~?we zH5VLQ`%iURg*43CMFK+1=_W0~RzZdimaJALMkWN7U@L;)gw@In0RV)+n6O$Q!UC%m z7$YJGfk58X+T~D)ARy|Al+{Yqqi$D-l+}9p@C>D_*698PJnJj~xGZJ0X6k2htkKBj z2@A9qW#>-GX1({`dCaj{cc*ODDamGyd(TTTe@r;;(Tx7@^Smp1^F|I3LxIH9VQi2|@o z{nbO6JxcCSgtxk>DC0PLaN?xW?gu{eY7JT%uwEz7F3S4Nvi;oqy({|c-wsri$jb^KUO-2WiI7Y(GPF9ey?}7X)%Ml@*ixdfPi$IBo$H&i@8I=bX2-`}`N~@P5U> zf&HuWv5(&4{eTjHAJC?){Z<K?C0|=#-(ah?4o4-j57@64O8}te0T-8SSA&41%qZW``(Ed;gxTQ= zHNfTu`f7<~W!rt0uOCxjTh*U@=ds=f)E|y9m4-!cKHbW@lP&ZsMb&TXMPfjh@>$al z5~Q6`La~yx2Y>_&0uxp%VtQXI1Sqh;YNZevLna8BG3@s-;+R7w4&xXCL194D6VyWy zB&^nz469XSSgm*6bu!M~I*$MVS6+EJ{&A*YPgGXx6B206Hg+SMb!radgv~lV9TE|V zFcef`v!?g6#`4sFWV4EZS+ZCGApkIII{%9?wX0*F ztt_Y4`gN}xui=Khh=#)=Bk7&BBhF-_AOeF?_)N`3t*4Ua`sIjfPd%>d%RIV8?089B>U#Ces!03AbfTlYLjq0j-!PPV}|~xEe}!Ecbehciet3 z8h4(WLFd?AZL>*X>-`c$CG#f(H4ws~(=d^Nz;@ z->lZ69@jb1X~>Oi)u~8((9d=D8lDeAA$mLbWuzxLa8`VB%4!f?t+afAt(MZp{?$ha zVE~8nDLx!0Da93RbxOGHPn*D2#|(G{-zr7UU`5bU_X--5101H``s=qQV01Z;rnxXN zX~QxWz+=rcO|qtbR|VGRzcDI4XW!QVb}<25<(e1)Aj4_}VjkYr%E%>FE64I$OGFBQ zAwr}OfTI{BqZODVA_#@Nvo&Dmu*(u~jbjMjRyg9YU!$B?pFp<$PqcrtWEd%IdQAe^?m9=A)S&g(LR4Wz=j`7{uU zjhMGb^8}k+p2rWcR*GYts+D4Lcj0LA+_sdm%hOv9qnk6sOJ3XP_dImqsqLQ~SnjiH`eWi|#CyLS*5P&6?VgQePq9QZ@|;VK)?!Pl zqfKG~rFU49W$~unWz&vG{H@y#MoUZn+2B6qw9__r{`zk(*!!y2oOU>x(sSbJOVUS1 z$hx+%3(r1lOXp{P_DSVX^N!N(#`tG{ddJ4jYGIMjP4(yw5V2{UH@s=nc+Oy}VWK6+ zbb1Jct8F&`z{aB@e)Vgf=Dq!y89w;_yJoos?_W`))m-S$WnRMi-1Cw>lu_-3H$CiR zd|0GTJlZr9bg21IbN%-j{Gj|yh_rG&j_m;jkD17-vR%JAn-jJKTkCzczRmf>eXpxW zdwg1_We!f7CTaz?T7uD~xvV@=OOFXlGZps(Px^K34z}8-ZJthE*C4VfOKd3lxBM^4 zpAmq7LCI=Gga8-klF39B{vZ_FW~BoYb=1DfiI9!XX!Q9yz^v~gn} z7Z)X~Rfw%PV71Q8ql_N>_Jq(V<%!5@o#;(w+frn+?%K41r<35A{5XLcwj1Vwlz$n311P}nR00zNBiZ=oyVPc_> z%WPI)z-l&YOZ~R3W!=Pjvl{AgVwSlzGC1oqbeQWrQ2FTH<#(h@5q!+u%gb#8*yGSO zY)>N)`be`0Y_nk+eSb%m=WFU7_f-5$_mjwMEy~cg85|@iN{gk$#BtItAmvu>Ho^vP z**eud?deB3hXO1!tm~cKzAJd7%=C&>zI^qr^}U{dApH5yKh_!uS2>uC`?nUW)qF$i z4FILbwT`_uRQh8Uw-tw zeNTDHT+h9>GG(v2^Rv({l}S3}CH>Si%EK#u>uC!opS-?npR!sW{Qg4lv5($UGtW6P z?wY;6?SerKFZy49)H|1(owjOu@qash_3U%Ebo}L0%Dwj-4*uoJho(p2l5nYOrv@6r z*$rb`2OzN98?_T@s9Ain$4wMffjQ3WfYe4O|I7L&bmsR#9z4`a4s5N}*W91tN}yg9 zk)!%C4jXR`hBN7C94M*yqqMbVZK_j_^j69AS2$p{CXf+g zfz=9vk@KupkgQe)2mv8Pq>zE--K>luA%*=uN5CXOSdwhkIEFw761^^puIPwvSBU*9 zLTuVJi{arJI(TrNimcWvue=lA_O?tJC*FJLU!HJ4>s41>g;i|U&AU&)J$sgMW@Zca z`;yHXZeE9R98td?QU^N%kpyB-#Ia>C#MFO25eSj2pHmk83I5Q3@8vG zWwIvsvjTz~9LU)?N!Zjx$*Wm-Y=UJ_ur_x#R&}5`xsB@B)kNqX)QRj_4AmzsC*kC! z7iUzx?&7A#WRqhn{*>A+SoO4&V#Nxi+KQ-kX&^MIJ0p**JXJ% zJZwv+G3vX`EA%-zJX`3O^M||i-Mb(6&Xzp?{OyZ6Q6TlhxOxaT=TLv?9h|vwFrtHG z*IeU2Z19#XQ@tPgk*_8)k%Xn@uDQgTmG8|{{;Zd-qnf;tCax) zK+LmR8AAXLW!PYh`pi+k&k+%ZL=ZAj$gyO-#xVwQzZ3NP5ClCE>l0S%l2|389txpg zwO$TTWVJrgh|b--qgqCU>_B%2kH1a>F^S|ytm0R_hrOl5+A z7$xXR@?KVXasUH{xXfmi9iJGGa7bRoWTXJfOOJ6lqNL<|YDK@Ta^|{LnkO9tnFwZU z+1QQD8cZzMS~KxzwwX3dazsEzwfNa+X0$ahgzfZdi&B@T#c`@F6PDNOY50b|<-=SQ z`(S=kF=jESN%?9DxE6s|&-WeW6D^5#7-aAEZ?MMHd24+6tkGu{+FYe`=tyyqYp>hW z3S08x=h%l09!k~;G4A6JL&^33mhWoay=x`7@7}}Sfuc(;J!U}%2rr4o2Htl_VISVN zQTCsbeQZp*1qatqbG;30!RA$}bOl_Mj^cXRy=PfG^x$G>on{NNWy@6mkN)^a_P^(S zXYW5|$4syELaB!8op7~Mdy2|rzA+aS(5Ca<$tTbCUjCa;owrZ9B0mi9f%o3I;qil= zQpaiAP~~yT5k?A8q+|`YdXgqv{G=0S`#=ASPu9CT+&~r=d-%~0-?Pr^l-;n#tNCmG z$=EiVaEuD=1G_(tg_F1W)<8=P;4KP|i4t{LeS&cQgq8ENUYhA)Lmw?`4Yp3qE+7%M z2WHamGym}>ej;N@O;wK?xL2xZeZFZGY^??7_3POR6fe}VD#DMBtu;-1G~hKtTnHZT6n3zE@f&flg ztr!4e0CCD{r4SH81`dfRB*Ktch7bl$Kvsf4P!I@_uv$s7T7?KnP((p6MGIk`)e04? z)~o*Yi4{Kh2?ewkV?$@ztUGt^gt?vx0nBj+W$>RssgVl5NSh6oOpXs0``QX;ESs zHi2Kt2Q0tSbrf6fZW=qTmc_Lk>ju`mF@**_PS(g8bZih0JJMD|X6nsS;Cr*8DQW<= z$QE`@0RTo-Mr&|LB_lh0fshLiZ478lq96m1)Bes&F50|%R-Gc)^z+o|)a2-$g!4en z{nPJQzv22l-r15zZHjtloViJxEm^L2MHyM&c~|?A$DZo5?+=yaH-A_E$0O_82*LCG z7wqtU7oJMA?5$P^VFRfFTZ{Q=bIjNG4}C|fkLFj|zp+goT5BJLV-LVM(>Hv5@5HcK z5dnVm#m6mv>hCY!bJ=Cb4D4ejdIhxNXxFH-NdehX`MIAzY3ZDEw>pQOFUo-ftMuM? z-LWC}%Z#&ogr_l_0R@-5>aR0YV4%Jz6NsDp!ApPbl;z`&Th}*AOhdl>rCn1u-?Tq$ z_k2{=d7I7wW@FkFxXI+idzaQ#sFQXZR!As}ErS-G!Offf0j}jHb}aa!DJ-x#wb2YGHqzPrG%j&mUA7jE_O|k)w0+|mO}YNijzi_yfC%uWw>;y}QJW&~JCGZ$e{A}*|N78$D{Fun zjio<%IHcq1NiW)_Hln^%0s%GsAes{VyRX~nAu2{8FAVU3_uV<$>BJVR2wmW9vIN26 zx-?HCqYbuIon(zg^Zuj04OO;l?4rnnu^qGAlN5Dm-D_AQb*xsCHGUg?+h~vB+Aj*< zYp1ON;MML)JOY4P-z&?d0-9WGtc@;>rvR`O3(_jHRq=sJN2%Wo{-v7V>&jX6zFr>P z!Pc@2%a+fpjnj)uKWM%`%#GsF`L6m8`ClpYra#JxkXLpyA_5~LNRSngka2KdE2JTW z0R$ohfD`~gnBK<DCZMLkT}tW#4VO>vI^ zB%2ix1tsBvDTV+uY}Pb{Ffs%PvAmm=Q${NaWF!C(#nn{r~K}d6;C!RVRARiMW}ybakuM-BL@IwX|d`m3C{fWJ_)hFg)h*-orNZfX(&* zgFgfF7{*{`JTNWIm@(kbY!AlZWxQYpW^AnHppD+Ie$z0HmUX z_;vf!@jQbrDvZx(|G0E%MB|<3$XjH3#uEiZ7JovdedlzMoDTu+|$MR7@w}= zs^0&u2PI?UtO-gbC(1_m-pZtC&8K}o#3v7)Z0gFc1D;3xo*&z__-CJf`@*%?ZR?b+ zRZ`=JOR`l%)~FXb!{b1@&ul%n8UEU@UvnC3SmJ)-PoCcV;)_c%s~?PZn_AHRtqp-g zi4=T>>tP)2AnW_v-oB%I$2-neMpzyjmx7yjsU>Jsl;!V~AFO;fme8Tm3sXcQH;+x6$_( z$@eEI2-*~e9SXxPg`v8iwToSWh*9`p6k(`5T8Y(ttmgR2yJbT}8*!Wt!7Iy#tRbMljH z2`<7-J812gM==*;D&1XDM80D{; zhrCfjwWpEEWG31}->Y&MZ+rXs?SJ+I7p=I~X>~QgkKFV4mTostR;r8xR@Mbm@?z$n zYYlZ;u9H$hV@+YH<Q>odls3>)Q0+G|E4oc(oaI(p+v9tmBJ!Gjh7b#OyOh9;~Q7%>56jc-SIjR(G^AN4FOP z0V^Jk0f||8v({x-BG=0-2D?#NM{X_9Uus%afri^nSxC~}Lb2o-8}$Y>sV*XknnMU{ zm0RyKcuE!OYg1z+TL)23J25~_sl^+o$_TQP^rHg^j!<@)*AEfIFx$6 zaiiolt+Hp(J0<<#1INY^Hh6kkhQIX7SDpH!Ke_GLWtYwPgMT*~KUlw=SXW?;1Y4Q0 ztM^pFJod}~a(3~OOEwLaV^uu&?4tLXPd(QgW0A*vU?Q`2GX2TX=xa%i@O%5bztG1qN4--B(qj6~JP;8LQ>;U>=g zB^$LLigql+g*YdN$0F$N1MTOG47tUS!W4kfgYNF$SE~Z||)yi5goxC)ZS1U$dt%^uu0JU<)UWN!1 z71Z}?RZf5sAmXn8B`|mh=pmxV03INF#N;uO2ONbDj>y(9RG&bgkUj|^d}@mhN!g|) zsk~YnqJwY+z@S%aUw6xbTW9!=AX)+PD|Bw|Vmx`Wjgynxu-Wu62-@U%0mj~}9VCHW z5(vtRl|qmd`VvD$wnE5W0N{lHUQD#wkh~waKE^2Ak`CRmTt!|r=#GCT#A~h*%_?aH{atG9UYnVMQ(va@TU-CNK~_0d zEwkLWD$MzjOjE-3z=30vb$EN-{+@f{bN*fLzGNBg>}Hv$-3z+%SXpea%Cv}UqR|xm zuYcp((^5J=N(}$?FJIX7$iv4{;n`h8i>O3WAu;5JJhe{Jcnw>-H9TjsADoxo^WMu^ zmtQe_V4*7Zf8%K5AOB(A{UyK}Fd1vDio4(?mvii}po}(~xc4u8Cvd%RNw%h7LAKVh z5Y3WlTeq%Wvdiain+Z#ang0GF?{8Z7QL^Q`B`_|Bg0-Nz4ABYzQEceD0RZ5F3;N!y z)6*U7c9*H!og~kj!XRi+7<$xbNbXU3jpQOiU6p*Tca(va`G-{Yy`I9qFhz*NPB{l88v6&vyRACH)Wn^0X^e;F&Sw^ zRE~vg?GvoJa;xM$Gyiq9Czrc?jf`a(e3jOKHxrVu-72I<(BQO%sho)Oa@m4LrI#>G)Wp1 z%bqL_2^#<5t6zQHdHo;)?0(12p|HV~>LqVCXxqNISCVe*{4VMk6Du{1vCAgOwQ|5j zZ~SmOb`>jRH#g1Cx5UdYFFQY|kcacmn+QJgAK!BPKm68PPHf%U40Yyp?aGekA)Pi- ziEJy22Eghe8^g0M^4i{&SDw@T$^ZNE>UT>IfSKW=zjbiS=`-Eb24j$Ht%oQnDa$dB z2Zdy-C5Gf>uCdYtgOCIt{Pk;>dN-3f#2^0t;ptW@aJmT7Ewgd$%NWY%*#5(Si z@?DkaC{KHQccia%vb8GW$VBEuU)6LStraugjX!1H*jfFAhx&$DdDxO?gYTxbE^7aI zecHV4jLBA8lt>s=M@ZMzC?eGqkHc%p=4Y!&2-ycNbn<4pX48K@uYZ`OmHr_+jV#&m zU9HjIP>DgM5F(;dP8rOxN4g3I6bvL8K>~whU=J|5n-$n&0*{!zfU&{RU9G_Eu^)OO zlu{5#LB0?Ig&;}YPFr+VTVh2tiMDl7QU{M8U!=x!OTD{VVGqFG%#5GCIO~blef#!d za#t`rdk7C7UO<4fH|uiKkHQ9bh-g(Hc0{K`y*pVwKoOEJLj;MTx|0>LA3C@fLO3E> z5kM$!Ru%xP$W|328yS!=K60h}yw%;T(T0JNdn!o&9NlMU@PYWlQTQRtk8^^`5}HeP zSIJqUa>uGvVg$J)WQJUm(kiTH&S-be?~^LXTM-;-k(qC($rx%)w&v7mR^4lOL~A8k z`)<)_;gU_f)-|D5lsjDBH5#lf$kve&Qid|K=9kRZ$FYzz@^aN9YK)PSa#7!Y^wHza ziM(sB-nue5DN9?P^#PD7w6^0zC%MK&P3h^i+c5U;cTa@R&Teh(*wGAfb*fN4>Ltgd zOMx-C{vm!~vx{it&2DS?t4yR>f&p^wP0aGF(--PQ--2?_Gmz~6#=^uX!c_@@@Iya* z>EeI>!kzQCzwP{0*GA+llU*Iav!|9#(o;i`SA*;qKb zN}vDqbCa&US}T#Q885pZ$|9q6fk&Xz@oSK#8W9mNRIhAKgd|=yLaqBL1}Lhx@_J3~ zMNG-HJQ;Dm4a&FRNs~TV7ulMWVS9MJD%l&uv^{B)t%mOpO3V9XwTy)Hpp!p0^F9Y$1U1YTa?)0s`C}IX-?z@T_M)(HbMJQ~-e8y8)8ktP>L* zY&K@l_nQ=ZvocFU>r5l3?e1iXt!TPx?*2;O_~>pP1ftP z&z^1`JGScF+w0a_w-0$srjSvVS?#T`$Q_hjDm^24H5ed489tK6kHd%R2^;+OJI*Vv zpI9I5{y%8AaD+jlYyshFBQGCG!$XP08t2FHdh!zt9&%d?p0)r0nPY2?W)DA9|NX3& z?b_7+gFm`$;TL}Csxy-l(u$1IF4)Ym(?!VX9OGNw7~rxclpZ=r>wt*xZ-4Xp(=#)k z^WE21|6y+8@Bi-Ap*Az9L$S(c#RpMhzaHZ2oZtBuh zcJMJ%vemXsw8&P&baf*qx@VII+HmaTlj9MrHK&%WXCh}mgL2a$AF~lBVl%$D>N7TS zOl()EC=9SI8=D70NRI{C{Xl=r%uCm_pO!zHpSGPX2;)0iY|h#l(LPD#uDCi69C)=@TD&u!o7R@+Mn&=gV#25Q4z!5tb6eA;RQT$WD%3ztaEcM z3XZK(5OgS<=up`7NqMr803Z>DAQ4djpa>EBWGjPY#6;NO$eR^W0J1;;!2pEOk1ouXB;+I zQ@{N2Xhdy#P#@^ss%2innQ!P5A~_1xde3#;2TBwMh}GPC6D@V&8iwQyvNidI?}zxr z<0qP~lZ`PsDfs8!|K?Ml`pg~kS6_2ZyRLL}kXJ9R%G@>CYD>t(Kc9F0Wbn)XYW9r1 z2Ko5I-#@(Nwbxce-hrURZ#ka~I3wF5gR~}G5DSB^49x|Fo-zhHYEJfBwlw%>-~Xl+ zO_jCL?S}Y?KYnJ49gnr9WOCVBq-r?N!t{&Ot$7Bj`%rIQ^QuIK^pAg(etMo|HLjVm z$u#qFwW^3L$^*^Dt0I&R4;-gC5{^CvSH!2uduu5yY#FL5n*YALvClm1qV)SDZRYq= zQXsC$R=WemRTU{Jo6#ekrrx}%);oH3T>U{d89fH}0Kh{+j~P9Ryj+>tVYz;|yw1x z1jbA751(JRhpU_v%dtqsap#T)Ug2_MRw~J|hQ>rX_EF&3$^f+y$79cTAA00H0)*~2 z(5}iMYFi_1vd*x>Cu znnADl4G(w4_iv4?Ov>qR3!9bxd}=&ynH-L>Tt8U8o`LKYzm8n1akh@5PZ{GwoXq1- zoM^OKel2_6TW;O4`kBw&IrpCT?pmVg?w7*3(HYSOg=42#y-|>4*-Dg z`Q8gxzvrJ`*mAAP%8HM__3xk95{5l9W$F``@mOs|WArXx3x@t5eAmURZ~Csy6|{{l&S)W7=yvgzT#~ipP-J$X3ng zb%55KS&_GJIdZ*PHQIl=#H)RuHZKo#S8MVa1ORm!4^*cnK){eeFtA{b zyjnqdwkjSAB_c>b^cc|t1`iNCM)ru&VIx!B-ELc~iUxTr zOGf#m4c}z zg<*qMS33f+Bd|jPyS_j~L7{3?6viYg^zLenNmhu$1v7vIV1bMx1Qra+ixnwy-;Vw3 z7267ks$=xrz8y8STrum-s}-PRq^h{Et!ec*I9>55p@Y#u%8KCH8D z*x)|0$++Ays$-7PLxGp;`Z9`^A$OCXTkwNMe9c2`T8AObB6if)He$jxk-&rd-G>c6 z=bT3HuYT>C6Tkhjn~&|>IXQICan*H%3$j(|(XW##2CZSa1M_}`3a!!>VjVvCYgeDS z;KHfg`=)Ji=$oe+pZo0do7ADld>xF0x+2^AmQyWnu{y`&UcaxHNbhycH31^RFMsgr zrQrkX)$#iuJG99U*ddusz`0{^_E@arJ!1qz0;Ve2S_Rr|XVvm?T2qUjnW-lZuMW8|m`#uUOI)X@&AW5_(z-{EC z5Z#_v>*V2Gc-LJ3-$`DrXD!hRkkLqYtAFO^mT-Eyjf;yN^!-U{Gy4jl}DA`DfyV2Z*8r^5$>1VjlK#kvL%A%Gx2buTN&ce6(3RMp5K3TO_)n*&^b z=AXJdN$w=%PIet-?j-zh>RX4QbnAwFn@~nl9wxq=5ny8{n2V6twoC4}wLu-_kRvm{ z9yNO2m?mMXc9-##`l{XoA@!5Q1xTbeiu+Qlpo)HaFWAL{2xHx9AcV^nvER6VVY-fm z?(Mf%3mcq;`Zv~z{Yk1_JLp%IZ-4EpbI!eui4b=0-r1|4Y_C?cwmg!s-G=g1ExJ3% zQ|q8sRrt`jWSR_P<;%|GH9)Z(1lY|GW@r{dEF@?-0$Z8;tS7hdh*GW#fM#LC<9}GRmfIL z?US#Ks~uc-{Z@bXT|1qJ?0)&BWwGzCU!Gt9jj}BxQ2XPr?U*{Yy-=3Qnz~e<)-*)8 zC>K@9iFE7V$E3*Cno=?*TXSA;s@{nAh-K^d%s)6-8;+9rv_+=g2KTj&U@24Ewr_0Z z?WFDNd&CZeiubo zkPxCvVx>VVvPojcW+ZC&?rJ@7U=g#tTF+Lj1Gc6b?zsnW@7}xN@Zkl#;K(AzVS`Ve z+>R3yU2HUb41y*FL4%r2kC=V(JV}Vkn>7rhdsih246)x3F(zH3aKQ-b11tbgATlum zK@<;LP4OyTHZZHRrvMOFLDVx+J<#=rrDufa{%QZLkJB_=3hOO`YoJ73=DNZWyLe$w zgCr~mQ?LjZ#wMl4|BMv>Od3UYrTw3(g zsv&bL!IWUo=?6|D91Q2PNC$gsUP<3?~c9(vGy*x>EkC%RX> zX|tK(b1V@z%sjhv#sJq=fd?O0a2_`Js;kavox8o6;r-?2Fjv}(Zj=~4{ax4kHWL~t z)T=}s&WhX{<*nvS1H!c?96j2imtR_P;t~GFH%@nd_xEpI_;-76IC0K74WkmVAzQT# zEkjpKsb+ZI~|`H|vhjFwR3NrgiF4Q3n08Ekf=P(UY7JhCAb97VW`QhW@9D4DRtM z(RYP+X6F$>@w%BfeLaY-&RKPk4eiReC0omgL9{>LP?co1B?R>*0KNKBgu0%6s-Hy3 zc$r7GYQoJJW73y%(sk8#hoGq!o2C=VLWmvt`c#u@>1qIE)v1AjfTOD}5d`!&Efqo- z03<|rvxXry7^Bd^%<8VzkUd6qt!5a43T_`UTnu# zWD6%JS5scCG48$h>5p%U!-Q!#~^4^7NRWtVnD*ayNU{h&y1Wp z;*e%rO$epZBSZ?--{}<2K4l$D6=Rjlk9V#&p>ry)wZDw4gq!t|BCz;CY znj)CX7XigGv&dJ?McfDotzqQ%6m3s$7pQb7qM-l8W_{PlC<)!d$?fNr$u0fy$#|Tx zta+OqnQmLld?2iUDOI^ID~2(9 zw<7$^`@U=GnrpXqTuXlK)fM^2fArLhmKNjQPnCocHv2=7(Ki3ps%2pM^3DqSw&H3hFfJ$Rj=DJxU8ej1`rHJ&aPFlw4o5{!^ ziY>+v9{NFFUt757u(1r)Hcjd*2|YsBbgfz?e<1*H-2N>I=qh@ajWOBn)NE~4C_fP` zwa2o?-(Vb7l?j0<3UecvQ2;2i6#&#dt-u~Ldcf!bvPTekw4w?f3``yoNFpJb)IF^} zp_rHuMC4PaLt<4lXl12ILTpBl+SrtBe5rA9%B%IBN*kHA4>@iH>V%5@d^Z3bf(tHC z-mJ^ZEj)R$gA)^k-R>lLo0Qsvc3y&0DPkn>GY4D~j@y5*x8)xd>5_0gZ|*100)=39-^ zr#qsmj)ku~&Ohe|BiOlfs;d&rmpQmd&aX%Jq*SUJ za&+u%Y7N^L1E{q|?=6+mqX!nII-P>c=PYr{tvi;jh82yrSSYvfkM#_DJtJA79lMhK z^{*dw?#+q_aOa&nS8@xwhWQ}bud0oW&W8QiIHUv`=2^Q9Vs!k_RPp4H7ls!lY=t5O)xY+{VayAEquegS~f=I3m~#!xUu z)Km~f^*EHIr4BAs@5va04!w6Z*A!X%QvJ01PiE@en^1e?nblNS2EF&PpU8i=#B7wD zpIz=jOk^0ac*AytY$WH1emh1Dg*o+8l?^o`Fj}lTR8l&e1D8Kinobe&hQs0tQ#Ngk z#?#2Bh!Nw_mYE3=Lq;HG5QGpgLKKY^1OrG0@DQo1LIs1z3|<&Qg9LRr3L%UHl9@eb z>@tH4CCG3UWZFBKyM%jU!LENZ`$HRXL1!6Z<=8MfW2@x#GbAD z?%jv)eAhc&oFiB>IO~YkL2rR{`NIGJAOJ~3K~&b+*+Y2v@B&_Nf%0bc{ZqJo`!*yx zjfjZtc0kM_;VO#|8blOOw~GQ%UG7U^SB4-Z5y%ihVwfabLkUQN86-j|kQLd=fDy?G z5$Oupn}*_}Bc#sw_f#bS;Eertvbn8Uv;6=pHv0f+j)CM--3Q`i^a?6fWKl3whn%lay>GzjbHIsq8m4VrS@cQd3-e*4Z%mt4> zeqtsJ$4^*JPRihWzxRR@Kk*Y+EHoN4FivIXt!Gs3vx#o<;dt|jIJ{a+8d1{2c}c

+qNsVZL4D2wylb7 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�(u^ z{%l!QdJwXh$u`FsBO=B;p5gDXy=W#c)|vD7;H{5+hXnHM;=O=)h=v*sgHW9x=(+0) zOeTzIwPW(l)uX`w1RSR71Af&8Da@K>+*f7QDoVB~6J_PN1~OLqLfFp|2gLmw7?;{+ z)v=Uxrnab0MAw->NZ=&5xq^>T$ivvAT2If@sDJ69_ldF>)bYM-7WsuVLG1LGHqAJuG$pdmhfH@YY`>1D%W!C+zI1EY=~rl4a!5wJshw+}f}0uMP=Al9EA|L4LAnLw{as6orHkSWYrkNX9;3Y~#t zk9X1k7-u@Lv_xlcdeS(pw08Ci(Se_8GCQnm;*IRA%;j(_n_ZY4FDu3Q4<{U(L2rnz z)w$YBDp-aHAO{o}Z%(Ff|K_f_uM@p8W>hbf7E}UR$|(bJ=Uq48fz-UgK4T|b1kcN; z%AGvb6wC0ZBWco8epfGfTrE~}8}=eZt}0w0HuV|27z2k2%B_6IF9Hs&KK3I1Y^L%E zlL!d~%(zHF?!OPW07CO5-!^_A=ed8oyC~qM4`{T8dEeN*)s3+R^H_d_fDbn6d{~pK zbnnqJA!O~>yfn17O-WioW>5$hM1{rkdPy1}y;WWxgZ88pgBN2lC2!_hLHe%mId@sO z=%X4=z!mdGVz|bl+L6D@Vb`q}u*yZz$KF;=)S^FSOL`tK?q_Q!1Z7Y*CpGw~9Za=J!LGAvF z|5JMC99;;v%8fJx<8z)@nNh$7Lt$I#%&%ch?Ai+Y{f~g<?%6lc(4k49Ik-YKR@HX7(0 zR}9@q?ZGOvw|GWI3GEhQ+s1DGAF#^H`b!qw%2}>h5YFMId8T=~puO_)T1*cUMbGAN z73M@+B$@AHZj&FoLIU@`g>04H#uaRc26stRuC7G@liuu)E|Td%&+$SPdYLy5>$Uz~ ze=|Qviw0z&6^NK;hY|Oxzi&imCMZnL4)5^u?a@YgGj_DY7=14R&|;DmbVDZ$IaJkQ z-9T0KWCm%E*q!N_t6uET&DXEhOUR;k*J&Dd^3q>pUj!&e@so+!RwTshXy-vk5ooR8 z)fJyn8<&1YxkcsMRi17jxx_%+b1opqn`+z3R7|UBK0q2!_)d}`w*$+ zkw|V6VHV{)Db;6LFLZOa?R$WsLf$_7Q<;t{9iKX?l>Qsgt4l(;tv;LQ>2fD~em??h zG>GgQMa&prAQw=u@PK~4IiJ06_qz};4!fy{YYc)`4E5T9MN#WlhEp$5a@_FE?ZALG zu9O5uI57F-KwR!p93)(JpzRV}_cUMA7qLO&^X6drLiLks$+P4%CZHWtI9l)Acb5&SOj2CZANWLw#0%%J7c4LABfToZj?o-UbwT&BEToGH8gz zaJe4=TzncfhD)NHUm!df0pAsjq*iVVW(CyuYjsVYs&22RPzNOD*`>Q#i5gNtd_Dw* zyQs6cZe8z(21OeU^vX{CZ6iR*4~C4Z9h(qgUKtjufShmausvqi?UlDAe)E_hXJ^n@ zk4Y?(^@2k_vnXLh99PKDRzfa9KR8AG6z1B5vDcUxo|8enL>L;mIg>#4`IVP( zARw3A9e0BkVD~zU#?oq!z*M`IwHIPqKt=A7C|g?;H=>d3VD&=^Z5+yT#eUpF%Lm>v zcij$8tv?7pUJgC`^Y=a4K5*Woa4v~95S%UAH6pbh>~76_1JFWZJ!lsieVMyapDVbH z*v}p|U)FjpMqzr9RH_yVrEb2Y#-5^~tiotE>i|(gPYIbA(%K>$K^Uggmkw49Sh56g1UhPHiE>$Zl~*45(-4$Tf)2Rw02VQy zOP)58h%5bI!LG^_#`vzRsqdFr?3kW9_eyT5Lg%ATiR#)ImHU^nw65dvsL{t01%t(z z33HS&%zFfhnSr?Kh}5<Pd4F z(AreTNbnH?EzJZrxXV@?EAUDCYrgI65*0Lo+SB2gIMcvHfg z5m?0d??g6PV?^d)>=iD+zgWdh_-BQFynpmULCRYMf>-Ci5bpv;@MDJFP)QEr4k+CU z+K+zj{6|9`x0Ty;>@QBgqZ!2@hC7T+SCi;!aQah0Wq!yW%IqmC&+Ew6rxpZ^ldzwB28GG-F4lZ9b$a^?5zJAYmVoOvDJ^8!4!J_!4Fk|P%;#c{z zN4@X1#ZRq=$okS^|9ottG^L{#!xiGIVmo(1(nNkvm$QR&-8-TvgEduT4B=D)}*xzmmZml1xW;P;stY&P9O zqcmHeYkRSui;Tz1#=RKt{VY8Gf#wC+HY)o+^}&dFpYDzK?=0*vRB(H-DOfyUgJ;xm zXCaGa$aaj4+6y?}2)vlLoPD)3aEjS`tu%lC-lY=ss{?V;d6T=+=(|u}p<5b! zg~W-C*2X9Vd{*-p;N{MUW8vhY5Xedm)8k;T)X(yGlS@60(|}=Q+dJ?{gjXo0#Cw*g zV@xK-zTMC3<=3yy2=KF|s-j(hLsAA%K?;kg^6FE%C*G;A*sY0)?1fbDKJ4rVZ#U7y&azSxkP3i(q6T8 zY&{5h+DRP4{^*@}9FRum1sJ2&f|up}?O<>j-V}rc0G2Ot=UK{WJ;)|>D}T2UGZPq1 zZh->q!~x32GTSyXDq-wm~N#tf+S`>1HPWL=OXF8({_r>SJe!bvj_0KaO-%rO(<_( zmvrBt;ftIY+O8uh#UhnDVtjH>Qa9O3@r@YUN!ym(V(^8NU))eAH26Zne(`IRc~eGj z$l|>wGgfTFz^B2s=Sf#V+4Vu&1NB18k4J{HaL)Y=zb}{##fK%4VNJ{LkL-c>aN!>_ zS1wyn$i1ZeUr5Z0F4F+&4`q^5j9u>?jN~LMy|22fR<8|ZHk*RjO;8OGLGrM^yLO$? zT64!6!H#*y?MtnKQa(J=l>)~P`IWdv+Y+u~-t_h|*FmRW5b==o4%pw5pGn-ip759>QrBCSftthy_tgj zp`6|`2c8FGEgUmB|7VJ;E>d^a!sPF9s(&oo@V~Yoe~ys_c=4Hlp4cJQ0f6(4kToNL z21docM5xWd+M>5#U$^s`r|7xO#2Z3!gBJDTEUji14pX;DRRk$2(Y_rx?#ExVRD~4( z=1uX zw&z&hT$_|b;p1|u>la6cN~;ezpfs8UYC30A+;@bEsgqH^Ga{fE9m99#RAgI(X$)BK zl7@_mniPyE>mIclmoH^@iR~5=pw_%mEyG+e#s_(h6r_)_BXV%78-cx7pxer#9MHy@ zXn6(-ilyQeg8kyG8~N{q!ozUN`o#^NL0d?GlTY@5i7Pz;F_7)X=r2TYIehC_0vNr= zilK7zRXexyq1u2t+^J*I9r=A7NyY#PgmF*U%2Y#fhuDTz_vmM4rhxNy|13~hZmo)V zOYcT4WkZb?4gN5IbNR0^L)02B*}ZYQ{lbU8jKy#RyjT88F;x-Eq?6Vq<8DQqu;Qq% zxo*fsUD1A9f3<-yU#<;(sK8iT@~R|UZ8HvZSKl-Y6yBeZ04%sM3h2Qv0A;UHLt*W; zH*P%5$o}hnt|H>o(Pa1p&;jvJ*s_Q)Eg`o>Pl?`Im(f4 zy$UKv1pG`qeTx}NvcaSNnhujhF+w|3yAabb&O^~dn?i)6#pTkf`IcX$NoHK!*4?DgfzH)u9KVq2ygPXjRH37zU#owA-;0fz%jkbh{zoiafmW;mt_pn(LA=q|@`&XC_& zv6@-w1`0r0dgC$6dQ|9_2wyEhq2@^-muT0l)lnsmeAX{7>l;&D-r4krjQc7k;KLUB zjt=bU@0C`}S>W6Qbp(ADysCoXKZQWseWYK%NA~Sur0>RIgTUS58*xblCkRPA^{X2oWVm@^QPZGqn!0Xeg-`bnn=}7j`h6sWYndbk0dK=El^{^nnhQ#iFO!&J z{D881OExvV*=7Jkr15pMms4^rRc{iQOeqO9A_ZJw)|3GCGf>dz!smb>t?AppjB|L zgfu3l^)BrmnZwt(cD=fczsX}Q_)+Ffp(dTT__1JLF8bf#J}DQ-?4;8k0V2i3&n`e)p2I%igYX?>YfX#?51bnrTtOG6`$=+KESx;zl}*!>I- z^gkZ$DYu4M4*>ol>1$eMXp-1lUyCVG;wFK?TdDDtYX;0B{4A^d9wEUv(0iI#)WbgQ zGzK800GY3FJAe9TgwxmF_?zsD1m%-cyR^QT#rS1sRsgJ4er_nahMH50VKjxwbdgp0 zkXign)k}LWqtHLF^jmd)*KcDt844#~VB=Ac)k)f8r%4?2VR`Ta@~7Lk(w>k__gYS< zujji(xwQ-kn-5=YamC=$pRlS9q32|~IfHNifTo~5vgOd{o4}C8R(9Sdkn@F{C8TA$ zt{yGMd zLNTPWA@&Lher$$AxCy-cu??ObNW>@j@h+9^q@9pQ+583bEy)8>y0ne{#GC0zMXl_DrgSc#e zv7?UptzInTMBLs*T7NHruQN)@rB&Q1AADOVcfOocI5Pf+tyn9#1?;-$WITRmu@v2F z-41n`XUVfCJ_Y|ApUAa!z9QQ9JFC$Zog8XF!71RA;G33*M{j#1e@v;cl<1*sftz(r z;u|5kiJ;#N5y`=UpZ-XUS%L^84@TpHje;K2Y)Kv5;dvdN&hUFgb=s+rW#Dpae%dyp z?Es&%p^69Su*P}9#V7&fZdGQ|!c zu`|UPIO_@`$JgP956jZW?rO{vLceGKC9tZNP}-)&jZWIPzG?tcemZz3Ji>Wb{*PO} z&Ns5g?~tlJihsGkM^qwZxMg^fYO7vEf*2;3&* z{xaFC@6WtIOR6%hvI216-4PtEDw`}aZLIjyXg>s7D#m;9wW-BK^*Ygxsy^a<)f|`p z3RD!DixctPc)#NMs8D^;iji~_{3toqPq_4huK+(I{bSn`7w3PO0iup95!5htg}xt+ ze`iLUtfyExK)NL?T%eduarY|IIQplUa-Ky>CFyQ8&hqyQ*FkRdeIj?G%OhO@Z{@k^ zZ5EdAnvC}*&TR43k`2dQ@&pewR;Bei9H$5ocDll#j?hYR*Oy??W4YEZwI>tbmaFJv zR!r74yBLv2P5j@5e~cDc=@9mXWfLRqfA)3QZ~x{lugXYv`bS3^PRfYP(tdx7d$9iJ z=#O)DJv-Vb6x8NhnHX{x2L6I`tAeGcLRkf%IStb;;m>C{BE1{ zz?6>iwaJwHap@J?@QSAF1ViY4hh3_V*@(B%VOa6g$E#sB(52v~i&{4G$64zb=DVY` z80J7{`-clo_+r5)C*PC9(i?=2Pn}T(V|U_Q4C%zBwdx}El>g*r$C!XjgYVINYDcBH zpU3@AL8-=|RY|kjpufX8K8L!uS9|rF0g`E--(kkCPQogX)AgS3kLnNGtMP(FHk4c+ z=UhWNThu^0LyYcApg{xG+1-DPPKegER`*FqeXneY5e;(tM)z9){Sgrv*Jo8$`c^Ld zE6ErR-!D$87$$vX9SVylwl)jGEIg2#H;}YYVK$|vq!g!$@M$aXYYruMd6gl~gd3~! z_hJVDFLF1(*&sHwZlsIz7wn3%~*aviRFT)rXyP>NwX5@ zwCz+vqJ-(oTlTY6m+V%@)f1aW`9v+EbY%3`$@Nu^+O-nwyTx;DiURy^{nlem91e=m%07DBFM03(~92 zUl5a13!fL_-`C0%Xuj7fMa`89I1IkAq=ClU{kT#mpLji!m~E#VP*PZ;EXFpR&O#BE z^Tk5BI}$%WjDV<;fKs@Y^&>WZ*l@ozH+62hjvQ=C-e@PDu{^rwy?d`j_I_}5YJX?pn*g)}voT^w2#opqBn!V@amChCd=L2>Fq;P3< z9JH0wrQrLalaUH+p+(5oY&I>~X(^wQHdhJ;AVrRW1{6 zNY|2!OkAa4#i>wSKv3XhiA~4G^<0Ql{_;wqeys)A*R$e-9aZo}=Y&eZzss8ZzrAuP z3|(h}Ofrudc$19GM8yKUue)u(GOl#&p^x~WRc`~?TmJP=3%Vh@(Uk?#!Jmo_IEb5Q zQ8Aw${;2}0cR|Yiog@5%sa)4qizY>5sSitE`Uf*Fw4zs9$b+mF z(TzBrB&)dmf0^BO^F5%}BK6@t^*T&`n$597KdJ$X8$a0jaV;jxXZ@M+NWL|>CncA}~ z*_Ql@uDmFuGV?T{gz>(N!1>=YV@?f#G5=TVHGKqrWURybWZP-25PV@MD8?_}fX{lw zqYZQ#yQpOE@)?HF_d8>&($gG2RY`{66A+h&dfjO z;@oBO&Yrv%*?X_`tVe=P;c8h^gna8RoT*s*vX)D;JuZ>~vY=#6PX42gRb<9}_KkDP zw)_;%%7G5dj%f`6=v`_z0a(9lIH9^kR;X3#zOzLJ(-?mu0`Zm=!o({+`{{X@6rMmk zuD7^%BM3#Q)Z5IOUeua%P+%)Hle&|Sp<7u{g9(_Izl<=18nYat!NbgOl~yJiOI4u7 z^P)_Wui(rh#F^@VsAWYy0)x%S94%4q3O~Wzt)0TR^~n>-FVaeRMGtiJPGPWbpfx*q zZEF!BO#-Hu6pvYROLv9NV;OjQ?nE(q+jr@vaWgd)TChZ2#2N(7xPF3KO4G%YC8ax8s+ zG__Uprf+Q*{OOP}J_N9TS)O+yBx8+o0tfiAYQLLkauSK8~s8TLD1o@sJ;!G+{>mG#1v$~ zH0D7lC$U21Yah%(O3fOYWWC|P##v(ly}o!ReNr#w>->fTjmFMNc#_&si}-^MvIJUP|}p0z7R@A!Yt zttxz?_D&~@i^co(OD79_Yir5;vHVU#zlM|_ z{?h6&(NSl7FD>LZk<6~DtaHyiRaCgPN_@l&R3<0ZXs>b+*vXj0`cM&8+mc29w8dZL zzjY!~vru@b@ByE|b?MQM`PIby;dmRAv}xEgyXTiRchV?}|Jd7R5UpmoPzA$q`nU^w zzEexYWy#E;=DI5mHEo9N9NY7Qh|kMiRlSd7Z=qb1g>Wcfi$>UFST@;rufj`q_{qlifa&I}5tyS?!_#;}e{d=k1_8iZeMk>0!gLNLaA;4Fk{1Ya>`oz}^9^}WY-Vb9* z6mvw&*TyHp3V(vo4?kYQn zLdf9o#a#II+<>Fd(&z$6!GBDZ=AGlGiS&}}6!T`TSz+^>s@NQ%3w1di7QqC7NH(6; zkML))9Hi-ZoYsH4In!$aHojAi*dQ}*0sFpJ<81zS?chh@k4J|va_^58t)kDswj$qJ zqYq(q==c#o55oJ5jUC1FC6S*IluJP;|LFU>YG`t&jOQOH1fzKulLm_-&&Hd&$<Q;f+^dnf+}{sPIyy@UoqU9o$P5BR84 zc8+yHpAy|abu0N_@~?i$^3ABL`VN=(!obeXjAbZlXB1m9-V6j31njUgw4I0HPSa=p z^m>f{uzgV#eA_DHa-my~jEa7`Mwqnv9m1pd=TA3U;q84|pAi9Xlv@$=I)~aWf#e60 zv&>)oev{@WFm7U;5MfLO{|ze*xo1ZhLp@}2`7jHV;|G3J>AY|1y_H_Syos-G51a-c z`1_PY44qKEb4%VGRRKvmt&Y9BbUqKlYhg#p>$h8_jCW1^^y^Co>P9)^@dJoP)rz#( zu1nfF`0ZNn74MEH@ucr}dEV7BUaLfn0AYo=_4M;P2gk1$#%O4_B}Itd6A$*|+aHT0 zd*OP&LkzDdfWNUwO420uk4}GifnSUU%4D=$(J+d4)D?Q{>$}}iRe|$>$1It@FSRQxv)PUts)n6d+J}bT!HWT&2tF$p3m{ z>=63{o6yZoY;PVv%Ky{t z@NSv*$Zv~QMf`wEct03Hmb=(F0ooWPDu9`Y&jx5zn z1ue)VMVK;rNygF?t@v-2;Q1DOYiu@szxK_iNLENrDVK=Y8XQc&vW>B6wHmsz1r_9> zKe^|lZBN@2=%#INZm0AuTrP~f3lf+ZyAFcgFL426k@9^Zrk=_Hw9s}?z_(Ygb?VKV zas>Lr&y4^qc4RL?Unp@sPo+~LKqHX5RXy+3*%Ai82)i~pqN;PLMlRN1?)uy$S=I@?;w3e{kQ80azK${nb* zKU}ZW6fM8?!0{w-9&}nn*9}^IX5)w@kaLC$WZnSlH&xf8U2$jQFvjcd0|yy zt*s>^&6V{p>*Lj{+>e6!4$4jTH1G6LMf6+(#dP|R`in_C2Sb7B7gnmOA0wbVZsiZ=}wSOv%5%P#ayr`#iIH^v}V1!&u&9d8sRLBQ2?in;ir=k|80XEBi7*zTI zBXRRL?A;;>bop=vT~8A3uuwl)#Y8=i!x}&_-{jJ|s%%cn3*->j-;aK zGAFlB;k&-;zx`v^{sQ%ixoW+Hf^szQ1Ot{OyDGLP;L}q$ITEwVSgjQbWTJ*zW8cK7U4itbs zz8)SI_lI8foexOar;BL5zoQB{B`SP4RAjHcE<_i1`>S=W8G<|s-0SS!L9(O! z6eeK;c|()7f_Aw} zqhU22^2a)Ur+2q;aA8r(_Uvz_QM>P%ng*{;ll{{0L-HU|vwuY-{e!n;JeC3X>Kcp9 z#81|2X?V8bC#Jmek1lUTGSvwvLGVvE9YBkNS5Ek5AC}B8mNJR_#XNX1mWm$Gpo|g;#fL<<9F0v}VhHSx5+# z%G5aV2#34^h$noiwfF(1cYYYU=_Ki{HKbwkap>k`0%Z7Ps9~g>IGGUHe{dM35}YDc zn)Ha2Fl#KF9(&2AKS}%ZV?9*)z*xOPQu~zQ3!*}}1vfHsjC0PfU?k5|hYi>VfPvB?gt#DQh!^GIc z(KzM^iX;G-CnD_MJNu!DsLcAuR^gD9vPI{@TRCgY<&hx=;Ug17*v*Rn?QFt6l2$RkNCa z@0ysv+_Ld7F#3X>+3WIv|sx_(?KebUP^)vm`kIM)@W1!L2T{=s5G%AGZnPXg*Oxkg{hO%u`P4;nL=%ARAhd^Xlz7{pxgH&)cPGlNN^1 zjjOKC0+iRKp|fuo;7K@6Qfwwxe4)3N(vCi9&zSz{!gY%Z!*KHTu%s(m^Sd{L{&}%9 z+#Me5!b4d2c24+H+xlt&QE#@pfCt;QE+_jfsp+wT%T8}DZu>tvF-Gf zywR7KOPtWX(?>)xB}?W-W2r@Jek9qgv6|`Gq)ESM)QW2yRkD^Ccc1d=zfg>t>=^J5 zK8!@hIg0ur4#k(2C3tglbKMb>xFDGI){H<>KO zGPlawC~lhB638~VM#)WNm|NF0g)$DO@hJETt2Ov&SC@@1VxPZKji(xuPWmFAgW1Bv z?p!G|KTkz2j*yS#M_hywnNJwGhbmDji@A-qs@Ie-x8_YcAH4cg7`R$$z1b_mR)=cA zK!3r!N^3H^^r#;qr7p*b=i!yaSvraMtYCo&q_G(e3R(k^fQ||mVumtcOWX_NP@d0rO+NSb(r`wMT=pD&ebol@F(@5Gb!l#^+ zJBfjnGWx`!ko@jBS$1>R$1*jRDZ)3uAP@Ev;z{bKy5VlM0mq|7feQw$#7{u%7MZ8u zitg(fS+OaH9(7YTBF%s8dpdykK#QoDW4)e(gk+5ZvYlj9xHg4r|Gy&%&4vJV*S#jZ z4fB@>;&&*I!!=Rj%N4KhE?&)Tfx(<+3Dkj5i`J;>hPh*leLCube0t0{;FSAy(0N&2 z5QS8$OUjxDO#7q@rW(EjH5>+S6FR*ocg#)X3b;dkroXNnzp-Vs&PlrrEr?9_i8)Y^kK?p)oXIw5@p`dBSo-PRe242+yEE) zjjpUcwo~<5YB$p9b=-|0pIBAbys_zE#$@72YKMPKIM8 zOY-y4c=wLAcACTH)XOW>kf&t?Yy!$snixMWQ~Q1)7ePMEQ^{>2@r{Yp9K zN|@!V6!-k})8R_JIGVw*+9$h?lY(fHRiEjB=ry;yr5&`sv**!qE)UR}*2jHQ+3qXT zhs1+I8Na1J5``}1w5WiB{mNSF>2TzIFp(xCs& ztH-G;U(jpg7Q|@J>WLG$OTR(c=~E*vJfGid{G*V3;PWq2muanzODU(I6`rCT1GSgW zg99bhzNd@?DwOI>e3h>SXZ?%yOVrrxJTd-guvX`@zhcS(m%S70SiR6S2Ct^+)jqvQ z)tl|sHA+_F-V#}-rXy$^T5^$&-6#04f0BQ$4rtotLrV*NR;FAO`<+RJxd?+Ll5`8} zAI7Ns2-=wbEB5aR&uExvilr)b4+6tK6mVx~x*Lxu;g^4~RX_?9`S^}G9z5iY&8QZyw z?Cr%L+CBE*zxYNMXHLJ}Zk)BJgV5(asGrkSTy*Z(xu<{N-7ae`F%qs4DYhuyn*l|w zvgl=f{LWGIqM7SW6^0fTU_xu|8QC*36_t#`&&o^|%<2{Sq_562H{(%MN;8&yO!R_6h~wbYPn5 z_C40+eeEPxw#rJ8=8yTVQ_!Jx_1@nFp)t+={W?}|;5>VgiYTxIkh8qgpKGvx_XTM6 zi(mNr*h~;CUSK6uC9 zyzGdugHr@!dw!u1}VN)_*_w~4|zLuyl7ezWEG;WTn>-(bM_CmG^t-Co?UlXm%z~n z5~r~xLT@KULmCk8x0<#fP7l-dDiIE3uS_~z`u;J?APtDTBs}y^A_g)$S$UFmSI?k~ zb|k}7&}66!uu{Jlv(!}l&y<8#5f<*33k;uwCjad{pD)#n>V%zDEbkMBxcULE0sAnc zpSO>Px4U@;5!K(2A^Nl47jD2r8p7Y>uUF$S1HPq7%$HjZ8PrT~nL7BU9)|dl!^j7= zy*&L-PR*!HfsPCLEx(ht0go1op4pDN@A96G+t#P#=N2eCf~s<3!3kdiG5Fih74F)X zGdmA&iI0knzX{OhzQll-$A_AsP%;d371cLU@;?P^n<+!l4baCTU$K`Y$Pthk;Mo);1qEMrHHAmkk6b`qQwi%A88tGFvQZ-5H~l z0@BNfB4tHxIVzq!+NoGReSLjFef@NS1`Fjl3bOc=tcSu^Xt5XsWU<=Y5@@dN?=ucU zUgGF`jgr2rTBv%nToMsMdu8~2_RqG)AjoT>*gW@~i5~(?<_3zg8(z18XBzbcjhtxW zhxPg(!A_6O2F3Zb(pBD%Kxd+>U%ZNlZ1_1Fvmj;%zj=I+8O6nf(hFuSO7g~ey>)cG z4)30_F>i-XgDuvAK%_+fWXP-U=kCp=Y*mBK2mE&zC)Rc~vI|E(nD$qiri|5TfIZ`* zP8U-%7sr-2tp`%lSDziR3qR?BtUaX3U4ZWY=>G_%w>%I9Ioy#QC_0tu77NPgK8UB+ z*$mvDx8-Kd{KTRn9gGE{zF+?HeSqp9(ZtkI%{E~_zEv~elFp|~f}vQh(|!Ny zaL{VjPe!JJFzr+D_5K^E>@vC1Rk2B2Pm;^;S|zd%P>%Wf$L05?_Yd`tA&=X+Pn$~z z(}kwB*iKKcpObAIRx)&*Gd`BC2W@FSZmyU-4&E_H&wn5luRwWNSQt$kXykYLDUJ8R zAq+APd(laU$Jcwq6 z{o~R4&4{in@=Nb|qU=55Y1+m2qW5WJYp38X3R}t58_c?%F=b84mQ8H2G;n3C(p&dR z3b72NyWpc=!PU7Mg5_^jBl1)K>S6Wi#8*1wuJK6LwKr-^iuFj78cZ1=9N%v5LC49^ zDh#3%phr*&`_}G?=c+4TegEEZ&4C@%X)9L&^U z==D69u3p!ilXG(V1Y{Bd93Dak1B(T)2!%iZGMEB~oHi*3ZVEw4sZ6V`JDJtbk(d;+ zlrX~F47(i8ZMrlU>~M0`CMdD#}^rlN08PBUBJUJzPb!Bt;YCv zVy^qeq!_^zJU*Do9!0yXQ!petB@E4V3C>3Aqi@5sMYq~XR&m>h>>lRj>B~;#O_%FS zPWboq9}rCDIc_TmJ8pB*q-2aUD$i&?%7)$cBFWIXQ$&9S6J1v0)y7aWk(r03pz&z) z!Dt20F`OuMX+YS(FdUFmUovJDOBHLkP2-O;`RerVz@t9 z3u8fZx=``TP+SyUo<^WJBIw6zAc&7M+!sAd!%$XWjgk?*4DgW&!A1Q(o%c*p`%4GC zJ4~qP-_^32=T$3MD>eoLT~3={-X9WFA9v-4sxziP3j>4QcquNi#~Mm|$zCyeLt1LO z3E}wg1L407%KvhSp-}~3B9PZL0!0bU`H2bjr^2K&lOz4+j~M)0a@*3TkiThj=we*qIVtq(qj)CPM_&N4wCnq_T@5nXr3I|;ui znui(p*J4tf={pq#hW09#kIP^5LD3%GGxi|P+vo}n{Qkxs8Qh(?iYW0Bxc-B$W>)Ja z=y%n>DDdq9R$wlL+|C9i(;-_-gV!%iA6nNuA2c6sT#O(35y98`zPOvApM_r@fcIYPk}QoC!El0`4L?TdXjX|;`d7Fa?I zF^!GeHq4jdllGiWkzGzD=w?xyKlNRG5|T6c$9GzLLv2)F?!2R_89NUi4$Et>_kSe( zDv6XQddp`i7P!6&V7c%K&n-Y+y|eZSTd$MSsmDA%y>7mgv!b(E{98k zm;Zzn-#5OXJbN>kl@QMqOZUJY;OA zvJv<;CSMB3_dduQs=Df$h3c7`W80-b)Qdhbl<>T&?bj};DN&(j3KNp-no!G(5TRu% zHnNIC2Zo8ZEuywi)ao)-li3P35PS$DUYW;$eiJpS71L%B>0GE-!4csxtD$&%j={;h z!42X5_^Hrq1(#vf%yGph_m*_Sut8R_w3GydU4{d6WMb{RKeUsign`peynFK9mx!YJ z07X`$I9z=xddQ=3;}Lxb#i?wse2)pF<<2%{)v!{hf7k`2h8SRL4lb#VB1>@)lpczf zIAMVA3#Z{jSvuD4gB&64uP9t82o7YJ?j}LlW5{OxhOlQ1wJ-@MTGvDa=Xi5h#6N{F zu#4zgGPO z@jqCR@i?k+dGrZ+AaQ=0$Uy7L1#4d=f3zW zs1W@~WNOKb=T2ep+0FEQ(|YGN?$e6t{m|2;WQe;#4@WIQ*_S%5V!{5eiM~(G2UxEO zdEohFSxUkA)I=;xBy5iA*)bM9M*uA!=!-AVKQj%1Rk*|TQ>!K;zsQ(+jIRmsbnmhd zaocL8L69)|@yiR{FAaC}vdM`5&jm1F9B~g_jl}U}4a9$Ek~Cp^`Cxr4F3=MiOw@*L zP|X@x+85-~Q%42n=g++vDsT%%hXykc|{q$^9tyNaQQrPdLRB0)|8Z6msvv)w4Xz$6`6218$Y7 zq-;5@SpE}GSxNA#q?znuPZJ-VFE@yo$Tm!M`s;be8@FF09k(utDz`+@fpB_HNe5~r(a9re?Z1bPIT6M+u9Ri`nCtPl{q`ngneT< z+0Sx5MUk-C!J>X~DY1D9$j9Twher0Pz98U?N(mjg=YL((LZy)9)s1iT1w4zvbvGe& zETB1u5r$ar|8GlQL0bD7XNO96d9vUbiP%B3} zNvH#8d?$twXd9~A|LFN4^X9E=VPMdtI1b3`8`yJ%2nsbQa^so6cWn{tsUr*(u{|)8 zBoLti(VMt60PmcnqR@>wQ7gExL03(cxPB+k;rr?*zT1yIBJ=H}W{xB87zHj8;{mk9 zke0&M4?v92)LS1)ZI*t3sch4SL$-(>(|otL^8D#TIM5_)p)^9>YXuo7em)k|AFVZA zbQyNBtj57ea2oQoU1)TnSRZt;elua)8(c27j`?h?-J|os(?G>7MIx7ylgsXXKjcO@-;x z7Q*=KvfZK9uE6#_&wIN7E!W=WNuFJoyL01tM{vA6p6V>T252(|Q`Q>S(GQ2FT84HP9LYDj z1>c6f)qMPLJrG(h-TPT!0k<*flH0KIcjU=9JDzXa07yb*A5pWf_u%^TQB>|bvGXf* zt{>4^uKie1)S(mtWfI}2vtEnTY)UV3OzBm$%9J`ym=KN-`51M2SOpE4b=+IqzbKAE z{5OjVTjim$*bh7Y{ll>2y;X~$TN^$aTlZ>s-BN8XJU!Q~>2j$Sw=wU(qy1|xPc7`f z^5}P)pQ`g)Cw(w~H`08-VNz7-oL3y0dQsdGPBKX#Q>Ee|Xj|Y=K;}vD4jw_uCe1vn zUPe(wk$T%-_Ka2iM_goagtAgZ-*-8f37)x!iK94KedavPEHLGyaAg@A7+q49;qpF; z$?mE~HXUO9XJxQUdC>W_TlBp>IxS^XRmSSFJ5zJk4kplXMbXeHTTDr6r^2v*OJ4xY z1DY7lqz4_zl;}fR#`|94LWQdRuY}b(vGm;(I9Bn~q0Hysny(l&APXw^aEGjIX}7Sj zR1`l7BI23knr3Shv&|Lb#RWIaQ@&2y3$+N!}chk1(TikY3dk)*qX`EDru6Mc88Sq*TE zvyz7Z+QI%rB6af*N%FLtYkGUoduF@d(W+;3X=`qxdfp&;(z}lvyxZDyaCCBWNKyBu z-=kmZWb|#t_whPx{U+)L#GspE4lO9iJJ65v~cXHTXv`7#GN4sbY@ zfP)N;5xKF$9}DT1F&H%oUAtk-x8*h`KUg|jdz)elDDZc;MKT6&4or97_TK6(K5W+q zqtcB2EElrz40z(s!sjdv=B$ygMadF^aH)azUjNQCjY2xSzKL6Uzui7&*Rq=()>K4% zq3FnwI+7a@CTLWBP)uESx|SMljfHE>)YPOBZXFAX)!<~Tl9O-%k8wjK1C(p4L4vtB z@4j&(AA`f1in}aD$&aI5?3rvALhfwKkt@IP^=tpNt!d0ye2@Li57b1y+Gr+meZODx zr)4UT6%7ep2^qBEed4gKw|F#9fAPv9w3#|C`58Uo3#JzeBiK>p_^EmO9{Q}2C8Y=7uC zWUMuWgTW!Rv)mEr@dd1CV|C@|8hl3R%y2=sMC>1R3b2o0d0~rD7+UMA< z+n+cAEOErbD`z3fDAOf0Vpj5hJLv#+#qXada zd&XWn7{D|tKRrSyaifp3Lc?M;38c&^L+kM86oVn2VT;HBl|+}=MsYZs=!-48nJ#)X~M-*+)G zTZXAXM0kQxJ_=qYs>`lB zBq&__3Ez^pV~F8^Cy)?=Q#rN&<4@9JY;|W+CYM{+@%G80F)x!tPdR|#w}gDpM%$sY zm-%xqY+WW@=N&o?0DONckO|NSbqAIZ~&i65aHzbDxlEX5Kb#fP4 z*RTQdTF=MI8Z zO-A$09H?=7b#T$S$r_6|XECxYpy;2W4i~K3fdHZL8bUmR^k-CrFVJY%YP9%@jF`4T z00lNVoDxDU0#a+Hv541HUr`4+xAhMk0uN>#PL(t^qC^alkq)6vXVdoicGX0Glz&^wTarG(m*PWq(c;U5~9#}8R4qvq!wt<>k}Z2 z??-ev^|RoK8+`^M72;2SagA2I7Va%I#RO)n5!c&jdL7i>H3~)?=G3OIDJeZs8de-j zG*CuxHvL|{c}x2`lvUvwNgwQOta&T!HVFeb&_fvN5>0Pke)9X2`ZOF&YJRh<#fk8GpNT6kbg!9lJ$D}nejC7#C zXh21YAWr;>#qP&d{(yn$-V=(Im8HOE$;7V|ltO*F@9G>)E=V5NPj1Ha3iMr$-xS)c zJ(^|bznP3FL25TDwan=T8YYzuo0OerYsz{q!EOg%C1x)N8cM7;ne6cw-GL)1gNH%0 z4f_~3@WP-y_?+g+)U12Euk|g|VZU8?SaWu@@-dicI!o$$ckV*0`|+CUVPyTO+~wxy z@Z;YU$t~YLekVBo3EBL%iT}&GMlIQ~$8p!>mLqPKhep6pV-a2QR8ANog!( zHM$JzwLnf!;DDdrI)RevU$H^L3*)H0E>Oo-|LU958Pg99euJ3)&H)X#ZOSaO`WNoi zKS3|`v5OqBuMb11#h+AK_dbf!sdY^AS*_s4AkoHsyV;tZr~{9X3}y|gA>&^LY~vtK z*p;+rtp-5at1=>Zb$u1H?{XElZF>}^CFVqqEa8UX(;!+yC^Z&QI9mw@i=iBg#Hy&Qi~o_w`8Nfnn^rK zrx}A8?nlSs{q$(gm{ZO0+6YY1gX({1cE%0Oog2KZzgga**pzUo*J2=PO~RThvR|DC z?&rH7P_T<)Q@B`T_|E(E?JAoBfoWKAIWe=kA-)h3w<;tflA@^phr$n13$lw&?d=d2 zff{o>^RN3|fH!82(tx&pfZndL?T9fId>^lAg@kIk+|h8G1%#Q^F$0i-JG7sm1JOf4 z?+c-QFq9D!q3P>mVbSuS3hT;>3C%)#Q0X+X4>sn<-2S_;>E$ak<9T`!{9K{Aq(~JyGAA&6p$-?uK~CoKnu!u`O%SQ ze{t65f*-(70rJ9lB$oY3nQb}ODoUlaLzHE|h9?U8EWyG&&Gxlte&XhZDc#j`hv$}4 z&PSnOvSnTP(Nwq+A%qq#_cy0H^$I&82=(f1V(UuI%^yT?gfU$_~8 zAo*vJ!v8eLO8fMW@nKtS`u_5ycVpB;GR^whil%{gD9WmxwCBv53uuX^7$AF&i2a-* zLJ8VmVX&-Beb}q3VmhwApvP^DS`S$jUA*N?&O8r9l9V?E|AYI!I339JGR*A=-7Aq7 z3+Xu9IBt8R7*NwhaU5;mcluZn+kVosb8IpWzf3+N-}K;drN<`xp;JIwv_c`=lkkk9 ztINs9e-WdYJNcWhekJTY9?asjN0>Ep51-Bim-LgF;n^x#z%F&0Vl>S#?8z+fn(-Wq zteVN)S;mw(*cEVi#h(k2TWK{j{YB9X$G)SUd~AAFWmNTn?>VQH5chWU4)*p;bFfm) zm8Cxz{wEPM_5Q+Zjn`XE^uQh^rn}w#l6@sJiayg}Vc%qk{)2`Zz>W4hOcD}s^kH<0 zG1cPk|3H?s*)~%m9>q&}bNI#&>KtN(0F*mHanyq0BP2(T7P1gQY9pt@!yG|`X_EdG z2eieff+7oq9gA1~wk#kH{SbvcZbcvVZPqDsXnFA zuKIrE5!nYQJ+aVl{F1R^CGXU?@FxJ9as{mg|Aj*+Gs8WV6zkVNR&TrtveOR%$yxLn zTjJCVkd_PP8A~X1-1?#=AD1jP1un1P3jym@ES`7x-go!%ctFgWwLR$x_)LWtgf z0ef@VrK~Q`E|EYeIM`XAX$yWwQ5Mbde%EcIyd$VF7820?d^h5+qPD83u|v9>*Vc}% zoyTiDQeWoFzvDBXx5XtfW~9t{MQl`aC(MLzZ@T~ps-;a@GyPWGd&`19&yc}#)bY_E z-1&sz1U-u{Wf(AAyrUB>j)1KSBvYf!V?&d~=Vqa4GB@@Trw#KQ^?{EC@00Fl97FDO zeO4bJs6Y|SCDZ?Eo~P-jOA?c_yQjT0y`^IkQHIZd?T9A3#v1MWt5#a~lHdL{#;5KV zs0YaaWvh;FHmLSb`^WPFmQ!N}xBKa*yMBn&RV;a{=^iIPESVae?=%s=rck%vyWEaZ z^ZRpff$RPuE@tE5lYK}dy+?TS=u_vw-dXfdAP$2AZZL97Ns$Y z*f@@xee;pirb)k#viQPSA6;*NF`)NjgZ1|0z(>j;$-h`LT(t56^DXZ1U*JWp{j<<& z>bfcK1HR4xI>Egv=pK(S2&!0Qwcvx~V-L-qe;kBWe12FJ;_>AVdT{#JV7&HKe%C}y zPJ&QS3iMuJdipCLhVPXLZOsW*?|4eT&`;~hS+OrM$}wT6%~cW}gDUHM{=F@1@=&}apzqNO#UVk> zRn}7A53>V->CccB*atVlZV8QK=yEIVI*-Iu$0hnV=uXbpHKV5RzArp> z`VF6-EJs^kkGaTJ@Oq1eevtNlW7~}H=9m3!=6f(ouo52Q&O8>GqBubkCWIjrD#Se2 zHdQaWmQ#$!FQVIWwj(l9eq_JRL0+}1zSCmDR!VY2f-CM9)70S_(i$f&tS zzs)NY<;{mSubOA&qZoZ?ZB066(G|uB&2Rj^2+|(RzNIEP@5h)Io$r-RgEig)Gc9S~ zXUDfomD`q79@N@SXbX6lE8xc46r`IudfC+2txA+qygsc~fBQ!$0ulq^Qp8hi;LuJ$ zRa>r2z6N|eOIct-Ih6hyT29dB-4CD@Sb_jMvv2zVJ3l&Yi(5&c?%av_BJ&);$3q_B@U%}XrQA;;1a%m zR6lGR^fv|G4_hl&f@GxYuORxMR3N8I%do74aB$+!aPSarfV2TaD#B=^=X2;I%8*3D zDdQH;#xb3r%)&S?Nq`ayID9jA@T5z7$<>Vklzz4Ge@;LgHHSRB>+id~ zSJ?X-dZ8PZ!nPXO($1wN%*Hs~^eQ07GvwYcVmL2_no#fM89w(-tVpC}C&HJkI2fh#f)35j#|8jQG$|3&5Mo zBK;xeT=11vgBEb0Rv+AkQfzZ3Zv)*ytUHPU*o-+;6R2WpTS~92d`3#Qj4H=Zn>wWh z14toH#lxf2AwUQqLMI5z$U5yu>8UBT2_f^$5#w&-38uf%sXHeCtpChfF`Po{hnqbi zawraVOPdJVY|KwB+dDD3P(H2{7>4V@q59%KXe|L_s5Lf_7FOuu=7Ifv-$l0wD|$^Nwj@A` z2E^q#5j1nuynYT!#5SsNU8unT;@Y#8PuE^Yk~*KC`2E$VU!#I7xZ9d8ff+)$8j@}~ ze+&q6zSHi5seZ!%0#U#sdnv5+-YgtwOLr$a6z3#ggAHZ79Bu8s@X&jlpj~^&kFU*& z5+VMlFn;86H_`I+HzZ)?s!rbT?eSpH67O?uPxTm3pHNRCTxDbYN&BlTD3at@#kj3` zdepiP1{a3t8J~n8fAO0%?liGQ(>L!}^wRm_B>u4mxDf+F3wY1x(ANXB@&vMsJ zVKt4lMI1O@+O}(^DJ|qQL2QmW5XBjb?Y=8g>b4(0Ixrw8?0XQC9H1E^5Ck}trb#KxUseThM+|p2REt* z@nEh+4Sj!rtYD%7)DCT9mM_wfU*hO0{vHk=5I)gG-8j9b{(TnKf89LgJxihoYO!vw zzzF5S9>c=;p0uSOc~cJwWMhdM4L9%8B|2b8@N!j z9ege(rZs8+VjI7!;hJ{VEo)AJKu}sj48=_5h$=$nT0+vQ&zMlaP78(|y0x**E=qON ziDGJ{^*a4AP9>D%@P_Z+EsP4|fL=ct1j|4uAc1C=eE<{)$qQK+dRJ?p`@N4t3|>6~ zNn3qPYnfU`jbjg81y=l9_X!kJCJU?y;i`NU?pq!xZ2xtt*u4`!SS;O@`{XS|7o~P3 zMf=lB18pi19jNxfqE-7PeBThdXR3}}@C^s(q|wY5ImJM? z&4>V%c!6@M6wDk0y6~DaCG4|Ve1n@`fB9tQSe7^ymDw=yE0_^~@3SQcfxld=ONb!VM&z$rfpl+4rUmN z326Fu5Llwk{{kJ`n^D3#kTS3%`0pmd)a1o)W44-uH$9Tj8Vhxf$#<=$HD~dM*A2f+ zqwad|;YdtVzk8LgXsRaP{f-AEKwCq9y9UL+!G~fll7HG{WEa$-@da=$oJhDg73nX98BZCC_iajbJEIm6r1VD zwQtG)*_x{u6GqdRJ-bA2d#_;Mb*qH_;o+?Aezb188lKJG%HV_rV+GOPbd5I?#-lr6&+7x z&iBBI@{u?8vjH!$9a6kDZ*Xi$tQ(C{mQjaYp#Q*05WKdagmDD_pIL(g<5mR&N{Idv zaDZaqbS@U8AMUei=SlEn(ywklKN!xwaN>j!H%*BW)`%=l4CWaKYubOzeJU>JK-Wce zw7+m77Ia6Ow83*t@t{l4k7_3W28S6MBvNf^%T^h;H}sEa0kpAqaEnAL1hLC zV&cx)Mgy*{>mA|%0|+jHq;W_oRNJt%ucmM3|@S4fd{ zm@z;M^(G+4ghus^{MUA(Y~UmHC54-EXP=QvtklWwRcC`k6P<=(z3;w&dzw>0%I~C# zDpk5{$q-L5I6!eC5cV>oxN$=mSTS_M$(|7YvZ-j#r0BZS3RBGbbX;qAFJ@2!0@fFm z#7ct#-hEYkRv8YKA_sYOp-fM3P^1DOV>HMDZj@}A*+IaX&oo7S$mX5Nrx&GQIPk}=c6+rioA>WLn;ht;nxL3q&2BWM}vo~jO_@eC!`Q_1h759 z(5wDH>{PuY{xHLN<>WNw{1Fjy{MEV%Ahd1J(wycbzC-`PUEsHD?$&t7*~rk-O^&JG zUZu=gx#Fs1RUgHSGj}QafD)5ONZ4q+uI+@!(y*|>s#R&fO&(Wm{ZYPv$#v7C_S|*o zZA^2`sr>(A>#L%oj@o|dZUh9Rk&u)WknR$xA%^Z4K)M^0kZzEakQjP~Zjf#nhDMPt z=^Qxoe&_wxIu~cHxtrU)|ND7<$vi)_W3S-9VPv+sTGjH3UmRnb`Qn_d%P?%3EuqJp z`%oR|e$o2BT7cVb>C0;idBu|BVuIyb;U%~LPpBI|AOUYnLTNaL-~gWap845KN*<-@ zQZT!=lirpK-%+yE@ zYes8Ea=CIDe9EbG9en1oY>ju8mIF5Wxffr{7^ff__Lz=yPFTSp)BU!Bi=Pd2Q{4rl zDdS21xN7||%{u}=APN2zWO5&s8d0~!wUODHQ)|nrN3|Z({2{6}N(j6eyXs&sg9i^H z=i(swL^qp>A?O|?!r!dEz_Ea9k6QMWVgiYG&S|t2kSq`w{Ei^3&S++K$dN-L?KOrf zhWLxckrbR*BT*!jWOlWvr~}Q-k>I%2CO^%8(PWfd$OO{@^a#hfS4{~X0a*6%MX!+w9ng*TwjB1Ol3d74*K{}{vf4QjVQrIRNg9x5f;=eg5 zE$dJF&Y}BRQeNQ0C$%Y%Cdi!&pJjCw7an*W24;91;CpZHm!Z^OT6Rsw6qOM2eruK( zdcXZW)NA9lzm&7N#=EJoW*vpaI^XYERU22}5g1^(wQhhdF=;2&h4DhiQ=_P#lb~knI7`?8D2>EMqZ|FVj;(BmEG}K|3_;JIW z#}NL3c0&Y!-uP20FFk0ju;6dKqq^wC;?sL;cJVVtXA`pq6e|sJ>3aM@w8D(Z`mXHv zndnjm8Fu;>uANVx1Qo<%mRE_wJI+G9`IK*8;I9Vs_0339p&X-RMc>ERaUle~CC`ly zji8i7K@{Tmxhh;Qn#zJBe&AA=)Pd4eaNE%ax0xj)ixhi{Qb*tDpm0QSP?daBu_YPB zwH>jLWn=w3tH!SZ_{hdBmNpj6-d6wO&?!~jQU)+l?1+dl+oL{xA@K-Nrt-LK{Qe(( zq^a*lG*Tc*D{?q#`d>-QjXHAFz-Iz?`(u4xz(Wqm|D%l@5k{_e_PbF{-eOSq^tNpL z!<;=({?%6_ydBPz0y4+h33BF1MNdF=@1x%DC?uF3C;M76KMIwS#4sLdvPzCYetEP7 z)*!re`a&qc$!%V^F?wyLB8MWgNZ7Qm>!C&Q3O;mspt^BD=}LXF{g|r{`fgg&2p#`S z4Khumi4IgB?zE`pN&l4ZJJ^;PDRARKjgr>&LZ0Dso4-8n4T|dNWeUPFFr1QP#z|hp zJ$&R?y@5cMDqF~5tJoj7wm#t*j|vQSsav7^gVIL?r$PA*-rX?Hb$SCoaGpoE;KdrO z)ZV>SOiss4dx110FONTkgI`Kfxjj+VFSLC9jepgFR==<_&sbTu=I3&Glw7Pm+>lTG zF$JGHUrJQq>pzYz?Oxv0>2%=$4N1ZKFMO5ecDC3kKDv@6 z;Z`hVo>MDHrG+!$hGI!y!{?g{n8LOO!4U78jUR({;*+EeCa} z6EI&iq$ZvzyWcFt_co7z_$@E0t3z^(K!jm3W`b@cVdAG@=RGj!-x+2=4cH$B86nfe*$P=pwb!_Z{k)6~Z0Iviay{}D32*;=#8`mc~N z-im3r>B7VH=G$f>G4WE(x+V^G<9`H~%qWG!h7q(J)S)oN=i-D!;$Qfh zM;7)_w-B5z28$sM`@q}UFBB;O+V#ZI-vuPZ9yiLD$m37^m^Vf(8u&DzXx(k>zrCunhIi4FX0|D6oD)KOtvGF z?+s@i@v2ID5@I3@Cx{XXk}Az*~f`uzfK+!gdS5}f|N zt%$b`1%BUFp;h~6E`2*3y7jkm$ti#kYReUa^AFz*u}KxYw}%e_252P#UT$5@a59+Htx(yvi^rzVX*Y zujf$k_`M6URwrBm`J9LLJn@4kf~7Ap}M zZ=RM#LWWoI`)5Pe?l0?tr+qa~VeRkyu;98QyuBxxGn%TSouuA|&Fdvewr9!0HRR~h z^TC9DyFYIo-H6bq;O!Gl8}J+S$1|UYIn1zak;~zTpAl;_-No7W%?EOCuT*ZfFcKwk z?620eW19r4coSWItD=U;(5=HL@IO(a%#EFMDh&RxsJ7&#LDN*gl)-8w!($%9O(#ze zua-lCDI}9IugOaY2B}Hy71IAlLc^A!<&Y|mL{#wRN~dd+%Y`qR+U+wIdCj&e3&xtW z$HEVZM*0qk$IfVL)8xOL)P6T=(ZzD>1ci=*Qk(e}Shk;C<){||CKMo)^A!qOS|e#o zxv%&Dwl@d7u%?Jb13WW*wK|Tufc#4V*?7C!IV`OzufAL%bYsUf9Ye#HcC)qs?ymyT z_007-4zg&;DiAwow=O`Kwrm>{2!hh10Czfq%5Xeba#_%FyInrag1uSou%SNc9glk5 zAc;3{8rn6d2mbRu0QD{Xf!N|QNKvi*!0y{Ei>_%sgxDn5Tj;93myq}!{f`Dd7dPve zQtBGQ0YJyEAl^T%Cf7B=t2c>o$fg6QaO$(oeWd z!7ok9)V})gQ$pDY81>_<>#+0cUb0|8%Lxzkuek8a86Jy$JD+aPbURWBK;xNdB^FoY z%1^t8CtatN`IE4dU1haUXg`cp?r#CXreJPvzl6iT_o+8s&#vnCo9+UkX_w6Oj zvV${{XFGYPJ&bc$Ew4}79nmYJR9(9ogL{5|i4AtJlBl{GVmkGE80JHa4v3nPeg<2I z{r;KWU?9A(m>nyTB6UD^=1qo$QT13E^rg0M=#?i)jlvr4pMyVWYSxywJ9|Iz-2`k1 zBZ>3AYEis@T2_xQ$Tzo_GI!tf43T!p@8wYJ)i@0z^pa18;oZ@Y(5PU)cPbR7X*B(! z(D8R^5zu%-kE>w~O0f={>8>VRb*>aY6oaRuNds37IF?(tNSJ8Mm?b3}>zIJ1kqT8= z0)}I3{M;s`i4L|hhA4z-;)duPF?t{5*itFBiJ8b5(UVD8t>wxY1+B(nG{!6}M~&R2 zw9`!3Oh)EB8U&0u9ilI%(C%xb#;ZFF{7vgTf98DS{V-m6l>Ti{RV;DKs>DcJxyg0> z=eUT&8f#kv!vbEK-0kPBhwb~woAJwDv$pF4Q=Ov?&Ig~u?RekaM~x6;AMlAyJ~;0O z%tVliYa-V_wy2t+*aTmnwAQ8sXvu7XR6nvAs~Bc*MtSog5AslnVUfy9@Rc#w$Z`bu z$9!t;s{vlP_^TL!`UOhOr7sR3RbuG8+D%5j}>*Kt_7pnc;u!&A!hS^Ip2-IKS^_keiJIoDqM@6RO+ zqTv?bv2;b%r23;EBFcym;!6|$5}kjQ4bp>XwK0P%)!z5Lj@t0^_u+&K7Wm|jy|JC%Xe9M4nvP9BT`J-CYEP6I2 z5~&WWM$@dl`oJ_0ej@HPOSW_n_st93VIK)zy_w~k*D79)v=yn>rE}(Qr&#lLdH53v z-g|)b0v5vK<>3dIwce~h9)vrIf!MpX!H*&(1csZf&xTk|_)*}WiL{I@#C>@?ZMN0K z={1PPv^Xz*;$jx}`US!;aZ>3REk_!BU^u-EQ7`O85fwIYlA(cwod%joMhu)U&QLS4 z7EE8R?{Vhdj4umn;Pl8-<-HgH(2mrw;sEJxzQ6pqakZuO`X~a-nIfaPlFJcMr1E(8 zG80GuN_dk6-+f+Tc)p?ty|?$Jd$r{Zgx0=48}#f5xg1_Ub6R{#?*`?yW`6qOmeJHh z4)}uvD9INBP)E+TDqxAhf6kEIg#L{x6LgSlfi&Fk2@({ke@}roJ2@fRL0rDr)x&D7 zHG(U+VKeoEK6;1o%Ig>Qg{!`Qm7g{*KG!U)5C5^K2Cw>kdiSkA8IO2=3A1>UOl>SAoJyiYt|he{WR=O@L3CI&!o6lfFCdz~_HWu0mC`?# z5I%%h2mS0_%O1sld)R;lUzD?Oo$yaQ6Xe_b=Jwor=+J;7a$-8#ScjFxa$psE3%a*J z@p0|-xoMy0{P%9?GgvY&;mK16?N5LUAZgtKiBm48$>QoM)n{@>#%AMa6bYnKa5G{N zIJ|b8!;0i!m*r&^Lq#glBW%KQakc4Y)fA}v6q*FwdDRGP7IcuHcgCn%IE8~T3mBGe z#xwQrUa{icgBP2wMxFzVHgUXI{tI*?e>%LALyEp7uKBw$DtUMC-b^(HO5z`ma_nn0 zAEzu6&u!P)CEVX2&Fh-e9rB^LdNay=aKlv2^ot1-em>Iu*R~~wITmv`&U0yRav_Nh z!aeGkKqJFL0G_4dHi)277l%uLGYUe~3xI(&2lfEHQjBHXNO5ET%r#!cZ@vC54*lt{ zdey`651Y$I^VTG)qK|*8S;ElkArVo$@B^Ab%FE>${nMvfA`YLPJQYIrc?)NQypG{h ze&MjK0_*+ih2vE*N{QdqSfDj!y;{ftDhdEThUfwZ+*no*w2{LI?w9`{`SSZo&sw^a zU1%c{e3_C9D-cD<~~Dt+~{talxrPVz6bZC%K&O5FMn6i3S(m z|7tpver9kBF@2bzunnTjmzH!eii{(Yf1w2WmhL8mWzJK1L;vp~ebgmaFac zK+W}=f{xYw$ZE^WsJ`RwKkrExg9R||wh|YU zz8H~0(R?A~V7GHl&;?NX3wHz7>Ho&zQZAb%cYYs)uVzHdDCw2;@2m0k3j{y#}wtd+n_1vY*G&`&d!3aR?mC@Y&wT zaLA0Hjxwdo=coWkk!FiX9YGucyD1qbB@ODA)cCvV&FP$gHXEJn<~}TFRYp#%-S$_5 zczvlR`wT6L!_LE0(;&Qxzk`)QPJB$P6Q*j0+{@&EE`VvH9v29c%+eWuE{0Y_s2(D0cp467Gxop%K3q9E zbJ%_X|NKD=HI}i!0AY$I&+G&4Q!;mw@Sw2nuKES~5E^u(m6Ltpn#V%m<(gB9tXDPW z+&f*|7K>`pb_fL%CCyE2G}yWXxEl`s`q9RDe%o}`M+8oTkY%9m+KB`soNK#y9cE4# zjaN?4>&??5lk8E99u9;F2~BR-#2dn@!skx3THKn#mbaap z6Vv+^h~*E``*gNK$+>NM4X2(+<8cRtUK8bLPq>~AfFag5239S zk1=t|Y3u{kOJ;o9vL*mQY6|0cL6Atf#7J$0mW6a6DE5BKBUu z_I{QRd>NcJkL+Ubp;Ii2bZJu$2P3XqL_F3u{tSCfTtOS^h0|%~0c>S*$nSO61}_Oz zoRtD9fL0_$3iUvc@~?`%iSQyvHXF6;^VcBG-U?ZmE6?ipnBQ(EnFMYi3gaW*t#~}C z6*zm}PM$vg0RdWjWCu~LnQgu^1Hq{unRgHeLCNfeL9WA+H}Bh6lzeN2`e6^}KQF^Y z9BU39Q;4NM&E^O$>BQyp@T~)u9%rd^^N)*TT+YVp9v=(M&z^kOPBe{(E>A_fWX)RF zbw8g9I{Na=hpOr@>r&w?-;alWZDja2OHRE#us7Y5=&Q2Ww6esvJaJ${W zBGmD=x90Afk&q4KA@Ppw(@InB*Bc}A_;?NNPMqXd=ydWSR+(9`=s&upw~9S_mH)l} zd3Sm+IsbWgKx*+V!F22|JGA?^{7b1NaQk5*x8K=)E)Byll?)2wAO}Z0~{dRW#~)9Kqkd8g{SzZbaNtV&t}( zXt&0_^wchfJ=a~Krw#s6^#k_*S?(4+LfFhxti0I|GrV^+1b1@{d}I%KldO860)yHb8{(Mz#15Ln-8aLpXRWzUkha~&nIF~h0wCv_4)y!Lwv@9UE9NM z?FUmU(h&N&<4!^Gk*cogobbiw2mjjw8wL>6k0EEwcaQ5S02Cx1^lsxyXN7Z{{`Y6r z?*)gnwR!X|G>e~TNr#qm321~M4l->HT`!F$0&18F!KkydB7ba~iW-7L(HrFv)@DVo zdiX+8W2bjp@3WOPq9$c?EeoX$IugShD}8p>T(SF@p)*dvuD}%zo#`gcs2?k(Z@0%J zg>7D=8y$xGp_?EJnPUubkiLO%evI50Jf=4o>G&M%#U>bHVHy}Y|B>9GOz~?AV%f8T z7`d6qGlLxcId#=?AVx-U|J~;P;g1Ia3bz-mkQke*Vw0J#3{k;*4wO%OGfb5_Sm^K% z)SaV^gvQh11a@Svq`2Q%l^DAR^_Ya7SWt0nag;gUR&awheU2Z)dI6GM}YFQw26i2Cj zMZOj%-oDUBm2ljiK%0OH@{TFlF(EuWLG#_~E&2FsgP+XHk5vkeXOZ14hz3QI_Y>o7 zhb-Pph8^+iuEd2Kgus_UUy%SaL#inBs4~jA($d+_Mf>8jY?n814VxYxnD8uSQN7!b z+Xs7^I;&qW-B0%hVp86|BC)q=ualbHYku>B80dVaQS-y*Q-Y$2@-eh#VYnZlyk^B* zVvXS6tl2PxAMjYyhTvVYuS~tI7lxcd$Mt)j^Fp837kAnUN|)i87Y6HRQxa0oby8=y z^c8abtS?r0Y*?6qYd4EjRG_Y_OzgG8=Ig=c-569QdS9*DF`A7nW}sqNQs~ideDY?c z<`{wy_t@=DC9Q)JeCGZ@pop?vlL=yw81bY(E$z$pN0Mo^B}iiHgtijpMZFo{6W?8O z-yBFGIG<)~4s%$V)g>+Mo7=EE8~Xjlo|=#!IwiHsGNetrG9ux`f_uRDOPFxU$Zh~b zuEO5XvZu;pROC?KMk~&||Dm8sq1c+z#90(unTv_>-v<6)0c)ujNeN&riITD1>8d$r zAkCu{gd%rlOKW9ig+3)yl>Ufj?e{nK#vjVdUq6JuY64d(`+|*j+rUe2QGN@Q=%Y|F zVHK&WM1Dl!VAMg;AyFlg`w&H-KrKTZC5Sm8(V%SMUcF*4^JRp$FbVdth= z4FFz^%sh=Fr2NvUVXT7Jc=u>N=cwI-s&MSXsOmQ%&PaEa#AXky`RvnrmmGDd?4eky zsJ9MIno-r&e|NgXzEYBIyLRBBe1_})Y5}}_k&Mb54#W3pyEcekF=gs3~uv>tpR~QQH=s!N@#xjdABl zunc}`^JWZcdY25HAp0QEd!BlTO9wA;n5EV!5NRuj`gRA76N21*5teJZ8=zcs0&k%l zVU_^V>oZ>HFKuG$lvQ~50j#b4I{OLDV^v=ty)}mo5Wm(OEGL+<-uTJb4v{)Jf4qaa zdiTSM%{ba2WN%oy<;lpG@VF_VG=U`Jb}T&jXQbKgk(pBPWfd`PCQ@kC%pKQIj+!58 zJ!I`^fEr~@K-+~2>@4nMkv(t86}D*{HGt+`4?)jlsl(m4@8)H|JHBl z-Pl+vQC2s9l+hl0=>6JagWb&{@{$;5I*ciWSU}lw34O&u1VN^^=X>9$k3w#LS1f+R zV*&Py-^u5U4BxR@hRKHYJl+m;6b7D5TpQ2Q$7)qmXZqE5@bKCBAB^q-h@StQn(u3! zk%odrW!St?=7Oa?q_O*@+HHqXW)e)3e5|iT=b&+svjC3wZlw);WUe)n#V*ee!}UZ3 z`*SHFoN~eL|Ad~z6S{~@NI}Ow8r6$INpN=#{jh%IWXe_It5~94M6}^|^DjEnUPbqAHwr0(>AkKqFHxN&KfxtaqPY*7jEjC; zeQUi^_^8y>enfbv{R~KO#Q9i8a8gQ)g&S^&!j|?XTeeiOm?Rtvi6^6NGpD0t)u*bk zu~Mh!zGY&`B(Pn!xDd7Nf5Tp)!I@FLpqlu)N#sz2i+pm7x{k6s$Zne2jPJu)t-8+{ zrwI>xITDx)7q|UHH+gWlyV9ubVF{M>EWj;pa_8W){@Md#g|ab%;DUE-yywWzut=&@O*>Y*G$l!^Arym%CNa#7d*H=4^VU^XYK3v{|)UAOGJlUseGd2_sy0>sa7;Uow+xf4`R zdVhYDsLT*(H(bFG8Zul_=;yj?osHB_>1w0(%68*o&HOG~ zYx=VKAKl1RP;3B{a12s6UEX?{xz!Eh&DI5scdUC4Kb<1h>w@1aiQXg7x~_%!)~Y$t<(u9R(j{R9znb#Tm$opLfaqOq0SM; zSNISA+z#`K`WgrrotGM7ER^18;-JYh+VJB=7BS5*&SAVr#%pB89_$6k{gf$}5yY|O z{x+*HsgfN24qZ!t*@j>=D`V_}nJ+3c9+c^*s5U=lq&YqwaDSA}&X@Dgxcley;jXQY z#$S|jkMsL9k5{%rhbb(*zYqMlsr6fI2awxwfqdK9Pg=}N_N(S<78D|efQ(hIdDCWw z-V^KIdov5$McqcBwbw&qxv!=Rv$pA~JFT(A#~F<`RGo4!&fi>ODA?lx(neG5A|kLf zapHtu@P(_b%93a^+u~Vb@~EkdMoq}gXzcLX&0)pkL{<7n;K%BqIj{+9e}Io!aFh*V z0a3}#lPIIS`T%8WYndEFXdHTs%>r(bU=;auvgq}qHcTiDaMIa`1geH9(oyGu%qL@b z?&Zk6Y#~x{pvTmd5a!$a*9#*HQtAct5}ZThAC#WM+uSKf2@L1_hx-!`p7t*z#I9Ht zb~XxK@-0cCdP4!p;!mg5+e8m$@MSJ*w-vKW?Rv;jXxGDshjoiI zFg8&317;TTB3AYI$v6~+G~kIaK<+8Sz%nS`mQAAXi^-usufQ!&bCcNS@BCqO)V>AC z6#lw*es}YA!IQg^h|i1WR}-||m$|#hN~8%c1yG)Wg^Db1w}bLo`{Ie;Z|}OU^XTi* z_Yz#ckT&bt_~&!D^@G&isFr!a213i!Dv!WRYV`DJeYj_HW&N_9ov+QNf=;GI`jak} z;o)H~QR=t30-U{nVy%PXX_x=?be*Az!jQ^TxLS-O91ybU*966 zAZ9GVBnPVX@#saUbyKk|oKhTTA%7!Z1ygr^n=;yH^-Lp*)GbJfbvaC#idjTETDn}V z5E%kY+$G+9RjYe85jXRDX>CnJ>4f6>M zZTVFOIF|uba~TA-)*|_HIuVH{>!!jRVWY8xfx%1+-uf{a0 zZqH=|I7PIoHpIGNqL<3fU^s+3;NXQJgU7T}(b;k{!U!S=ioW*cFz0e2p;7J;Hu5n; zDlsh%^Uq`F)Obw107gYABvq^GY$I`HglV?kFmV`=uXV<`WPX&jwdC&q2;YJSBBV)I zy~q<^iAM~4(G=nehcY3DNPM@rD}T1*hul~vVa_PGcirY6=sV4k{JagYy_i26Y zU~f%+4cyVL_Fs84@z8by8dK>tR&Io~C3ImvRiw@RsFR6o)Ize8rm9&N7x=YfG0$bO z>li40oe(;`qPI{Eh6K3?sEDn-?X#8a-?x|8ohsSYc)dDD!Cd^*R=-E2lW$z5MAiZ* zZY*GlFL=%4^E{oP!tyFZJe@UwP^aw3nWCvo zM%Vw$m4{-s$Li3%hqn0e0Qg(1r) z1F3)Bf2_+6tO8GDzv!ubV!e6}d#bjqCpJEKslmeCTOoCIbYJ*%w`RTx=^EO;sB8N> z=o>towQ(oydVg~Bc;faru=2D(9JGdRj>uS)a%QYf(LP*+-CUh0Z!RB@g-#lnJsc5- zJTFS#O7xu3F$52B-PxZyRttMGVCD{d5j zuzRKOp>Ez~q@72p+3x;E`DrC%UeHMR_0P(@cKRQ{KVK$HI1gE*YLvLw_@BLhyM6x^ zs9+NOvu170GWj>(u}Zb8VVX@{Q=mJ)*LQER_UX28g_@0@)6C)aHS0S|sT>k4H@>~b zRJDX3lwRy+X5W_A@E{NBHQe0gm|v*!g}aG4i%lwhOy&EKC!qXPj+|HDS^ptO8zoT4VH=CdL^2hg znN}t53Treyj8Y@K%Jqvc8>jpf{|9{#oU*B^5a22I*lb7l`1e;9)wLfwe!iwVq1bFo+l^Uy04BF$H0w6lF{C_HJj}aFqZ)j1*i^NM+zx%Ebtf z@PYr~$!p=HBYEx@sH~X36l8Obj7qbcbv`OEGUKS`$Qf!DS;Dqi6?eM(KmOFAHo{}( zSEu%P&59?NIRa=d`AAJ*J2yg9BEO5G z0poWs<;U`&W7r19b;i|!;*q{w*WQHXm^Eo844KVnlF{cA%-P4wxsX%rR)Csd?*0qc zw(ECHrqFg^3OaZMpu0-GW~{s$$DbzJ2w5}0`VzB#=b@AWnW7U+f6Z4X+z#0gWo8+_ z-;bKCt$i!^t{sA^jweFIu7YwA(@OIK-Sv?U;z_5o2Fuswi+h$9rY&-1viihX0 z_>oI|+wJga?%){#h)DwR)G4~!5fiw+h*Vt&7pZn_>TZWey=@KsnGu^LRC0ijlq>wv znWUg-&{7MI`2kxFp;&suZ*+n#5F>tk+eoY8sv950?54{C43M8tpdh| zx_P_(b@201HT_+8=(T>*<5j-aQOHW&M!@l~)YAyXE-?MDW5aV=f8*@f{0Tl@w-##G zniW9$z2GLP`%-)(`vQf-UcqL#bAB;etU_O5&-Ao=YcBLLspmkDbK7cz8g!Fz`2(gT ze7)MUE9qYax5|r_s-YA*mG?__u(j8>ICt1?^v?s ziaJg%$i`{W=hm!y4`(v{qHqq&^E5r4E~DpbzmxE zs)7yds6N(?_eR=W&gVzxjV3-mv0BcWgM2dw_f=DN zVv{lcvDsM$#S}3@DOR4ljI$q0ilSt56*zHpbL3u<^kbCT$PpC3iRPCnQE9;8LX(BS zoW1*CZ`Pc+L6`(T^iZmVIwQl6@pOz~VlIkMA6OA+rS?d~VvGn#<1qZo$o5z7=3GJa z_m`h=*&cN3@?oOX&|DXoEP>8i*0dBzc%}V#L9Yt4&V_%Z5$ne#&61b}U;ws$2ib!> zsBQFa2Klc)90<(_x1Jso_XEPu%N}t1VYP!52c;p`%a&^ol~Fv%MjI?n4?4!K2+jOS zO0}1t!Q0~94d@$`@Pi*#`_foYfIlWM4O_0#o^Epj3mCpG<^|V^c7Gc=nSUteh=99F z{|fI%1MPC;FBDwyOFpM)DW#2EFa$w znFkGxn%_tF+!)-f-~2-K+&j0J1dfA=%`1hIsCm}BW^)(#I7=`6B+&MedO7j7EA*HW<1$H@JXKS z+Z#w-+%|C)-c1NrYe}B1j-_cywcNuikhSk^-4>_Pr;l4bt(Uaxx68Z8c*I4e_eoq0 zqRRJ0ej{HHbDo`?Ntd%5f7KE?P*!*+&kJ&)KOLO%uGh;btt6n`oWmJK&TaawZZKNy zFUaKH4!y5k^&j4&n0%Xt7Cfi9Xg|pn2FABiVE62FAbxbRmo8YNCPUJHJka@Hd;8oy zw%4(T_5e4fXil7!U0{yw$1Fp#KzDE2>pm|D7H{Q+Hh%ytc*v*VJ8TA$$h!P|awP_& ztR)+dxl82~3?zGt!OXTAWm!~BS%M~mT8u1mjQ<;_hqd!6*F#&coG|k%Mh=HC`Oa6y z9F8#+&!6ODxNme7Q?xR(&PzTjmJ4XM&p6o{*-zV>)V%1-j;2_RyQ zq}v(Z5xo-gDm963^llY3&b0-KC?X+F%9LxaHdUrayZ+w>qlBVsn6Ek+;K3w@&)oEg z)en6Kj5KoqMO2kSB=TVL+adL_w8LX{gH(9D7XV z_$^Xdo8oU-eKsFLH1$^FnB!FxnBKh~;2t{7iwAu=uUk7udOJI*Aw363+6VzB4&Gwl z_;+7jPzN1aJ>2Q~9R3f{>7$$Z&~IQ8axeXO)Ux&ztM&eAqz5tT+q0vaBpH~pxIvkc zgc$nH*S32yEpb{3rp?&J&q)-gTJPNM|c80aHQR}3m&aLZVA7qn@y-z`qWkBCo zL<~;I!HA~8({<=`ANJy+0laLnGqU`;>}_z8T4BTKd?r0nK`SAWV%lX_ORo6n+ zuTk}eE2E%aj*oALRtWYJzIbMsY5beBI%qe{_bh8M62CYpoK||}#Vs6kQ>Xwpx+|AK z1Z}6?K(H66P+bF^woWGTR_~k*?fm$>mJVJO8T42kL2rm!T%Muj1(s`lK8+yf75dAM z$#NPi_>NsQ*#tod{{NPXC!2Tk+DcA%^?3$r7#YS&JzbGh91fYg*F>=8;O8o zHm*8WG(oAI#YBu4`UuF{Mj@St)K>1Bye3ll=%*S-m$o3M1u4%jRZTIQ1o(TLMHM2k z6V?j!#%3UllL1GDZ5*A_rCLU1)IW;+M(MllX=Mr$?}IBbrXNJ{2cP>3ostJBXo zguEf+r5db(Ex#B-OPI<9TU^4B>#~i_FYO;LZ?%hG_wq0(!@Pl9Yg3tXpToiEjxgQr z54el%V0~&OH;U17;+6J7VRcgX+MXpTdgx2~8tbLtHxi4qE_K@up_d}Ny#TkB+_trV zmQ1_9mMjvB_@Ea1CD9t*Dj&$VMIUM%*2xBVnehV*YUiv=^=`RM%zH{$Jz)5k8PH=h zl?(XWyQVax{-Lb9JYed+TOxR6mNJfUuWoj!AY>6r)s|@U%a~8+?xxvvMYMmnO9W_& zFBO@wc8w@2bL;vXv{*jmI+mBv6gpDRtLXc{xuC{%+yR6ib?0EVO zr0-sKvvwXi7}Gh+fBr}4+l}z;IouJk!DK%5=23lKb|h56y3apWx_@nc-bnSd*As$V z(SEmtE=h86k>?+Uq(vL;xjf&oVC#%yE^c}r)6FKCZXbP~qLL9Z%Z^@0)OIK-hTYc{ zdTfpwtV5)Nt2i5KfR+0z3_AkUh$QFtj!DkllXj^)pHRp`gFV~ z*%f#bK)UPZJWgIH)^J}Ky1(`?kn7IaSyy=dEeYF?^B%xZYkYN|@<5z)Jb2IDehPJ2 zQAoZ8&%Ldr43VM&XRS-?OyzZG&byTF-_nN6{`)0$%08L7_CYPb^OS#~Rq3yB)!S1I zCRzacuOs4&!s%x?qWeLq^~3(@uJ!fO%5Y)8`a=2BaYRVD=$DXc^Q8ipHFHTR@E4GE ze=sAE0*X2&d1#Ch@CnR8u#&}ZqFxm`u@(Tq9y{mO)b&(y(R1yDxjX-4o*FNf$v1~ow_oJSfa?LLU zQmkxMek;$dRQ*bSI4!QfWW>;W*W~yhG8RJ*r7~si`~fZl7YdS|Zy3X1F`S z6?fUl+@&!yt{1To(M+;Gn))WHh`khIwI>$^!NJGpN~WZwd|ji`kp0gOVDt1jnS)6? zf{Ztop9Ws_BI`M|2%8V9p27!iybndvYN$egPzPNyM75g$$tzfT6uq>)tMs5_mn!^r z3ujE;j8LlWApl$)?(&FXSq%;j z6#oEUM(ZF&S%TACpLW-Vl2q}yGb9ao3SS$Rf6QV7D&V9hsYpK@-y<80tghqSvi&?*_ku!hykd(}vAZ)-T~;pQa{ zoJR16>l*3oa45o8>iYbGDfg-o(V^9Kob}W<`Fvg&Iw`NNe%;rmH$o*T;}F=*CLa=A z_WHH-Kfa#pV)F;B=V4{u4v>~t>0VnZ&@FH;4x9dVm8c?uJQwSP%i6N~FnGjw(!`>O zmsNBl$eh??a3l0+QOm9V=hg~RNxhv3q;E~0!&;o{h21HcS3hNiMA!+r?_kb;l-)?M^AZ zz1hP9d;eJ=YKrJ_$3*! zwdlG1XPMq=2PA-$n+gJ#&e2WzoWvgODoc$2183Gs`}dgmTGVYGOslhk=)~=$~ISYh$LtibBo${Q!wi zJjISEP@SBJ9N_Cb>&8WPN+_BS{D8Iw{2eH1S@E{s`=7^3JX&-$5yhbE6~&hv6wr1% zp?p1LK9dJ+?kocXh~$WZO>e?*l=m)!loX(7V9%Xsuw?5F^~?!WxrHlEcbZuknv~4{W5ClZ?8HR%{tqL}tJm(~9&%zc%p{tr!O6%h6JMf;(VMnJj+X^@nXZd7tahVB?ZrMp8!M7j}>W?%pry1PMO zh#@7VyW@U;|9kJlJj~O)oY`lez1RAzB4VGpul!GKzGJ3@j-Z)J7q3Ue$g#TaWDeb5 zobLL(JBX&&>b-I+xS%I)X1yTP>oh}1gY8%(C(Ru)op&yh_g@Rt6^J1e(};k6|BB{U zX=P>Fg;4!8U)JAb4y1ZVgHaFsi)4ZZfjPy`VQOfE+;D-Ts6Z4|o*TsoUQ{6-JmfR( z21`6fA{v`f0XAGv16$KZGcot(LtzZX);Nb^J_&Enpd#Q#wB;Z6`oMphSR{43KvwO$ z?412fS3D^zK4B&&aZN0dGt_sYT&&few%Qr%zk5b=$x4mc??1-?RUrv-lI+9^!QOY8 zpi{od)1&u_+hEIaSSdl?3+O0yegPqryn%b1VcJC`V0}DubVp`V=9hD(w6oEI?hbfR zk4u zBVo#=B4`$`eH5JZZV5sZ8PGxBFH@%mO{BkmC!eKBP!~Gq&0kbrm5X~NfDZ!XQz9!; zheWgKG(T$1;nN&0RM0o!iSp~J;Js(2ify~;>fZ#*Uj%_B=-rs%BAqGjKSj|Ig=asO zZ@VntXNf1kx_5H$z1PHAPI65j-vJto3t$Z$Sg=ysZq^tB1>_+IPF+o&0sp#q4Vekmi|in(bcq{Y1As(T2Fl7aY0t zD8a%v99IN5K^XjPcYCWjcR1f4S0x{&7ng6^0_L_xRaS0RiI=>OUp$=Tnuvz=C~A+U zRJ+!klRom94BhQdQM+z?Ef=dIwYa7~iBgt{nbi41FG8i>_x;AbdapFYJ7`*NGK|^W zLzi=C+2R?n{(!~l{?(~DmNvezsA_-T$Je&^=B}K^ z7GsJvsR_)P69nsr&z|5aXpYk;QlOKAHWU*>hkeTA`yFrCv>&&k^e|utc$(&ap5l9 zX-=;puFYx`VsFYAIaCZj)5SGy(TKj6v|c`_@jISZYPR(kqb!q5JFhO^XJ7n9V&WpF z|0hospTbZ$X%}&!i(AGX4hNL2V3zX!UnCKUaBb?NK^o96AaOPX_PiL3Sp&)zg~HI^ zJHh{yqqs1%kdZL=uyR5KI#RE*cxSGdXde|6Wjl_-hU~6=jesqN?t@hDfyMB?+c+^~ zG45vwtTk$(afvr4U>5Hd1>&7==8GN-gQ)s(dr`I8RS#8W>3u$+PAl{I04qNe~Q|lc~8;f??eWs$g=n<&M+tI zA=k%T;zeKk#BZlMy>gA8{zPC|nw9x~JA`?PUt`;@-Q?f+SM;K*OX_>@k<| z5%D76l(-F$EC$Zijzt3VY*Msv95^{M((97R;lSruvP+L@@lSS`^%p92qLsjx)km>1;Vd3D<#YWhbJ5;UUrCq)LDKcOr_~`gTB#G5Lcvz@nNK(@MSqkla#{8?=x{}j;!kiSr~G2dvac;a z)3h~$jWl{3)4V&^E9}uDGP2ddW^7xnKhwn~vy-$wdKM439kDig<@9zlCf+dng&T=2 za`&8-IODC_kKRB#BqoP7(#2=|3e9YcA4r6^*wfwJ)hPa|F_%XPt5$LJ%qv<6%I0CJ;YcQ+!rJjU}>>5tw-ivBmMZ%mo{mdlC`Vs--GmZ7t>!%_e_`&#??AyA!+jgXDdFLE)_b+GhQ|+bqzO<^f)8sfH zJh|D6tN(L0cQ`@G=hJe3(RY!RwdpW?kBGl!VG8~oyi=iBM16n0pR**H^9bWohnKgJKz@l**~yKRvDl5@qAyt zdF|)a5|N*mrE}(vgFTm9QE5Jb6}P%==elFocp#CR(`7PBUd}_&FJlwG&UJ5FGn0*p zRI-PZc6)Z!VNJpA^rQ`o#=Z91OdhV#PhoGP+q~I1Rm}o*0~q?n7i7xelIPB|53i_b zT1{ilsh4bJkXqs>cFH}s#40FdpGRPp-}&*?uhuqI)LYQJiAOP|{=9ZkcI*hTendKc zv{Xrmf(MY#N~N|;bDZ?dj6$fVS(93m-C963^uM&?ybxKeLAMT)b(W3!a#?nkv^Xmr z^!G{*g@aLG5^K!CRPpyd@$Y^o{wUY!|Kkvho{sm&7n%54xBR38n&r9GbnW(O{ue>7 z$KcB8|3=J79(b!=kt5PSfnJBaFBWaC#8^kuvrY%M5((JP!Eh6kH3}@?-K@#(e-zIm z%}EE?9o3k5f`H6e7%0nC(~80HsNXucT^}V2G@m;XLLis@qw|@`c0Hm|fZ!F? zjv_&P7Q_1;{}eHg6mwE>F*J7!!~uC>bKksnDC|5)tgro`cODfAo6b=`KJwZvO-J+L zhMp^i6}BVsgzHlm?%?jYA8rVw@Z!{fhZJW5T_<+!e-?K8y;%=mb4O3x+h09}PZ=~V z;Ho@S(f8w?SaieqkQROD<#DlFy1hKpvB0J>KOmM>jY3r!t8EL7y0;pci7^X0uZF%p zZ%zu+6~;!e(97TY@d#GylRo+GG_7iy&*WD*y!|l`O#gWG?%`(V2UyeyVD5%~Z{Fx% zZq08Qc>>XWp{n;3>pG~Ttf4RGzI7&jV~s?F`FbGm6y_Ol{@(bu9IR;Llv2JE#E#Os?u9@3j$-I%4X>oyR^`Q;n_(XoYD8vloLVu@ zH($?khipmaQQB6K9=qMC{N8&Io2jg(c%yYO(hq4tPN^gf3VU)SQeRoyf>wM?&Z2X9V9jm!9Pt$2!$OE$6DyjeRybiax%x0o$YHE+!eyI-=IP%n;Xgy2< z22?tL9AScl9Q_nSp6|IhsUVs)rU+|zTF5o2sAJ9NEWT7BmO*lj(dbiZjh7#C*0~Mw z{-%Ms)!!l6eGJP_90DR{F0=oBc$pw(bc+4@rS!NO^?#P0WY`P-^zVbG+7fk9CU~p6 z#7q1$^t0SECiin-ywyzc|9N>TE6Y#kyMb0m|5pmd2VLBEKcgkW1?2GM-r*XW=Y@xt zi9iZ8nF&ZqU&c) ze@yHMnf@E1)#ADn86OdK~6eB8_ZRclY z0s8KlnIMy!zaV!yx=@S*?@6eHS=p(un^{?t$9}IWb$2w*$T57{sOsqTMA)KHD;r^S}0-&cUA)1=0>L|M+1NWy=@7tV~zZ{rh|*B+|L_7TSYMh%)J_; zdV@4DpfC zZZL*ht!>idfHoJxM|-30In_Lq_)UlJ1xBIMq`Bj%IE_F3>=N%&-Lv;6xx`DJXhnnw z4I?YZ0+fVnHa}&h*K*6>2-eZ2FL=SVk=&nTDk(Eg<`%sU1aJA9im$#uZsbUx?Ju8; zywf2O&Ghx&4t_BsbG6jAL~m-5pKJe0&>go{6c4HYGIr#d!`}S^UPX)SB={G4sjFh$Qy=ZdXT~(nTL+_Z{;(fyp&XN~huI^BMe4`972ku$7F(I^ zSah0DAZ;hhDSMf%pnQ;B0fBN79~ID#ckx8@{^YV2_#K3oT8zw8{7kwIvIbcfvwWaV zi%UmK&AofiYmP0tTP^51+I_9~=5w0rk2h+zhW7d#Z?NnW1ij|fsHK1=$0V>?jhX-$ z3^{-L?@enE@xM1}FX1iLi%OC+9b8iY;E?SOJY%;?feS!lhNp$RQ$u`E#8B-kJB+=Q zMD`t(A*NBP`-fTq1M|Ej9iCqXQB>+5W*oz1$3tN11j1$JWzO`O7>J8}$bQ@)A*4($ z*==^dG#v}!u~%d5!uU{|FTlH7jO^R`;#?r;9_+}}jRoP($@49!F}69^ zrN<8bQu!SIoV;Z@<@s#1+pGk8wUCWYZ~ItOM?g)in;~_z6vlitaOMj~G#d`2k1%B0vwsPR#seYU85!`R;zRsQDYsf$T$CDra9fJILYN4VJ9qp7qybfzVIgv^C@9i%Z z#vI-}xvr9PXIaS!d=!&8Uvs&>{ay}h$Vq}I1)Mq^HVxN~)!8_h-Z&*a@CgHow6Uvr zXH!w8_}a1@mTwQmzspXgj3`OY#Z6rNGHzaI@Kjg$o4rKZLR)CEu4Ajpgx+<#Qr+;O zUqy^o68fEAjuET%X?8w2yu6Mz{$87-yI?EipW}5QvZ1~x*9f5udk4#L@qHX4r^>{R zeY0&7Sci|NQqf0Kdr>+PxwG%VXzFesyP9%M0nGB!`)&E=S)yG*_vtWTo9sVEx z0en5Bw43>f9aueB_QkHgiq)VP@u8xyau*&$WV-%$_KlXN49BmIR>knO3Q1ZA0QWH` z@VO=fx|l@`=HX~zpy~O_mv5X4xG}M4XYsJW0zY8t?a|>QBLn3#r90<_YI;}@?Ep^% zE95qmQUA<>pRS5*aXy-8AEEgKB0T}~pPk3a-MG@k7pP^*7T(>O3o0W-2>OHuw}kM` zMh7&swo%PGah4pYuYAoTcAQ;A{wx?igozG&3%H7L=mDaJZ{0-vO%~BIG_sMOyRYQDp z^kFgQzDmCNwTqFv%tU&?z9VQBq#Ki4RxvMjfBd+WA@d{tkDrj0#7N5H-q>L|&M<7o z$5x}W(GSKOnzq1dot@Y~8ImcUz)LUfb7;b3!62`g(QSmYFPBvHc_@;xe*3Is?j+NO z4|II_c&+OO_PE&+5g`9$Vk+Y>bYjD zq{Z+QYs%`|b;~jSy2FYO&y`O&-Sj8o!96j2(}T7!<&RNMk8uyeA9qcxp^K~ye4#Kh z-l``{ga5XvvBTZG1crKBvjE+?=?j|SGxI1oVUvtH_~-6!Chmf%8fXbZauGMvpD~u! zbfS%0U_qtKM3U0&G(Cgy5I&ay{}pQeR)$H~`o%-HhkV!K}Zp4ZtVh*Ggg zF`Fj>>uGci0GSqr7Q%iq9Q0oK$p-nCiU1e6D4OEw^-_EYnsAASF{c3lF=;`TP=xvD zG&O?s6IeWPAvh&rkUy7X#1OUam$>uq*oI+`p7X;DjW02O(3^>bF*pfvwP)P{`>#2p zTsG08NypRQ!ky0mHP)Z+SP>0*=9!X?kQVl;PVlj9Q}H>}{m>12O$ZaxlgZDhvDXgX z#kHMjBt$e?v6_|P*T;s#lAL*<-*DKW`=)PEPvGu9m+Rf8x+%38>`{3EtzF>vZqB%f z*r*^X97tcH8f;E=mJ6Nkw%hXkFK?9B_432g?t%XZrRlYNc`F5?H&H`EX3&_u^JR&7 zqOxYdxXV@Jd#U>o7r$v%^O2FHd`6$2HA^N`hClnWDf=%Ez%tkAsDI_&IUlR#&#$$}uQE@NIAOqe*@6cwO>|VM6MV z|1p#BV07)bPQ;tQMFX!!Z^w>^^Ck+lW5!%sihn3a+Ffb!XNryHmO{fMrvbI92B;A2 z{Jm~j)i%QS!cLUGMldA&<2)HqFI($+U)!U#9KeF4W*33 zDkLbRlLbFUS+T_DVwMm0lbaW^vm3(=(}$xH)u_u~c=vu_&ZKC59?nzw%#l(}&heN1 zzD0|nruUo5r0md zfs@~Ciii;&Yb`gxu%2*OuHMX1AK@>RW$E07T(!$1AnL||NV;#nnpFoEfa%oC1k7PI7?;pTrW`4EBF)f*mXbt+9$C?|FlUo6?pS0V}?3o54N`R+xh;-mf-&utKx}^1u&^rmdcK zpaVtuAkTlg&Anc6%;gG$&0QR(`?Xsoed#Y`z&$ho^cz&6bFG^(UJW8nF|H zF74E$+&+cm!{Bh*LxPunzxSutahINVe(T&n_wDC?S#qEk>t|j>lC2CON&(Xj3vD_` zp9wt}_p54}V5%$)(;IX`!QE;+Gk~^c#nP|FK_-_bXfVB76=K(`NiAeMocV)q##%qY zh_gnNn^LEoTt}8$T2g$iW-M!C`Y%uA3}>kA{|9Vwvuq2t&b z^XA<8yMKt@8jh);+Wx*JcanMKK?>kfhQ6*g!m>*L2qb+ZM)>GHkz}^cw?t;{x4|#W z%B&M>=JkpUU%6>{9bHG6c zcgGmNHM+MQeA+=Fwy+iLTpRq&F5^i%Ck3Jqbj;4uV=xCq-H47cx#i%_(Wz>%TECec z34^V*53zS5^<>z7exsMY9amxSQ7iraEpb5c_}yJU?W2Ren)^&ZYUJ zv;R@v&LI=@TinZ%QA_jP7c$2s#$!^hKGQ`tyx)e2{frQNpeJ(c#g0Ge;s{E3i#P5L zzuqq{p57}}HrU*_w%r*MJ5P%Me*U`02bD}m{=UV8-m_zaEB$}YbY8+r7Bej8QKtk= zpvUHk9L`1xDdM-NDku&9zNoxQzS~x0`AbAP5N;XBWl@c|pQpk(*pfteWyR$PM~Tx3 zeML*N47RQb+!iZrj{H97G0OyrAJdEa@a2%MVdjkPS2N+w37QTBGJE6Gd3>E`laCNb z5dXOX`;6EGV=YL;a?zRX7ZswvBuGX!3rkX zfO;5s&};zLL0M5Kfv?^upCZ*<9zbHUYb2!U?N&RCDruPOU{?aDwlRlVgv#W+iNDR5 zgp5fMK{k>zw6f{{j?obS$<_V8di`Z#_NxO-2X`5B<$oy51Q>Z|P1eaj!SEv?pkxmn zkas4q8LK{lG&DDm8wnTy8i<;=+^PmY;2Z*uCAOg;mVE$sIcxZ*>_&Md6n4H6@El5C z?mPG_=<8>A0S*M^!M!ydV9I6g*d6+`s^INQIYHP|>%t=HUF0w?y`-?6Ss8y49Duqb zot0#c+(_uRLtq0A3UdEn3$So?p{m2Rnk~H5OV7JkuCVgz#s}$fcw5yDwtYTq2S6nN zm8o(iR=zaF@9DZKNBMX8GnPFh-H`KA;<707v<9F7!EQ9$1s!=;{J0QUTTz&p_$0oN zd_Vb`>qf|CmP7DqL#eK3h(hDOQYY9m@D1GMQ_>&ylGmW;#v0NuGB6-2h1`W57+rih z&1+wVIt?>knBIz*9&M*I9}I4lwM|E%JrY4-fod_OXA3i#))Eistv;7cR1$Zvz%7w? z|9NkHxkkG-`zHWS>+nUhdLuR@{_~^bV0|?Q2tj ztcAU_L;kkui?}V2`H)5FA-r3RAp95k0;Xi3#`n^+VI;9ifxAoY!sq)Xb<#L{Ed`A; z4YTQ4x?|!02Iu54ee@i+fKX_Oei? z0)}0t(e})Nrz5FsINF7Y>*eg%R@I58@#I3%lfUKDk*e>`W8Ms|OajdZKhuAQ`Nymd zE~CU57j+@Y(*9fKOu#3YLII!w|KMcU0Z9zM-Y4t51PBruS@Kkd1_rrz#^j+C+$>YtsO|$qEB%Oak4ExAVfpGPQXl`>XdqKeCB@L3+t<8|`|p&P z*?zRMQ!E;C@%6`TXycyn*ks{%G=XvW=C<)R+ab6ksSC zkk2WAOdG9orBjq#P6p&4^ho>4MYmY5Y-)4->73Zwy3FB$qzgU?&|=9 zIz}(<@NH8Vyw9j@^#*K){`^r4T$Z^XyuC%~@BK35j`ZG#&A2hnPk+rkh*;(98mHY@w?NMK97|0oXZ{>86A$+B&A}yu+chTZPI@Y{wot@ZcGrh z9(BvSIyHeApl10w0N8t2{|hRNoh&253b4oANr3J7|&r#M4V z6XlehyGLK;0QUgkYTX?KdWV|NZ@9w+9v}Bw7Hh0k+*caF*{*G+2fX@fTmw`eaM7@y z_1E)aAUY7eW_FW{3}h20LyDT+nr-!4<~B?07I#09-BNG6n=c;QcNOcd;k;0&CT%cb ze7n5g6Xp`Vc=dut{jG!VMve@h1J^GB;^KmD=?>qkQs0YFBW}-wh1!*^V;}WL-wZ}Tj(1Ea-)WEF|c)_)=^O7cn7^1g{G#^Q=vF{ftToLEZQlR`W!R2 zXowJ?`_Ah^G62*E^>J@PpLUMmjeGky?7e2(cmT|4TFwp+!DaoRhK#f24kku8FwI>+ zYv;FwnSfy8o7YS&^^RkKBolGb9vrJ3@|f~ef8-iwQF=sB3jd{P5Y)X>+SUhg)Ab6c z&}bk`EBDJ>d5YEInwQqPw^dcJBM9MhowMtaA#$BIh??K!3x_3ByEG*B*$_jr2EOae z?##YzM-D$!p{n_2@y4ZTe0xLd$|(^Ms6=4@WF98Hp)P;F<1>Q=sgc{(o0U+)tKc-2 zhl}{Y-n7$iw+zIb)VBE_n{e7&W{b$&UlruEZgn(Cd#e_Syi6~X)_Y+YbA6~X`ApKR zmxaMNV9iweYP3@N=HT10ga3Z5<1K&7*`~AIBl&l$pjMfoCGdndpZc5rcSh|W@rO|F zT@L(q83RARUAE~&ewmpcPYJ%6n+cP!mGL`1S>moVk`^j?>G```L3E2}v!4FB)ISq0 z?{;2_K`{sOdJhY-o!mzIqjScGHCxli;kJi!u^L*pn3ICX!!-O{|AK3VdwT5~+UgLk zR(tM?nf_Z8xoW1i1AOkyL8X=_jb_p|cleTcwR*i|0W?OiILK*9n^=QxmkM-;1iAo~20sCZFaqZ*&tuU<(Jy?{*K z>&RkX%BTR3nFsV7LmiDNI4vl+erRUUuoXNog$6cL1L<4@k$MG{x7c!X%%+6FLgt7j zcTSzpH>7J@tZ$_On$PY&H}|WZh)ep!E?ob8`dqEj9{6;OL!P_w{^skRI9+o`0sqJ}%I;UYXfQTn@6gv)W$j}|^tsbju%8XaJL z_B~P<#Ytqz!I`qVw_ASy=cC~WSj0XqRDVOz>DG+90sAjAYnF2FvRG~K>IIwkLkJoo z8Es&?3u(gM1ty{#dvfWtJCdcF^VGx*hzH8?h(J z{^s?kx>h9NaVV!@sl25-?``+<{cUCmXq*#Lw6lZUe_+=;w80q%D3l~5t__1hyOt;=qE=!)2@Tv2?1b*d-Wgv_GNDe#S~mdWRS~%)h2Z`?|PO6qY7*r%hvp204_N zwf3%^&&vE4?jM#e>LVj734SgV_|DFISA{4lJ^{s3l-L2H7ri)&rnnAtMJ!wjyyBpG z<-Ha|+a1%q^sQ4o?J4-Qca4uc_WSC>@N(5=NdJ42!0^gNf7x4=+jT-}0#>W6vnx-o z7c50T&z~jo8O2SDZGqM68ce$*0n&`2gV~Hn`@!;L*)I zYn>za2#2J|)DnTtc1yxGVZAIM2+!=!r0wvJXF<%}q_1tekU{XuOpO*5fAramzHzZpg@oWGqIY!a0A*8& zfOas4k=cHvsm4HsmmH1_xtfC3*q zWfoF>Ck@#qazJdCc`>Ir%r?#sq8me-CbsMZ+^IU8A^1a`()vYG@$%FFMr8i)UVFUG^()VuZKJs@!FsB@dVr}l zw~sHwcNJvHf1Mj*c{^LT2pR;NDoJb9?ho7T949HP@Hqz_EwBbX8nCWR&#iNoZE4V# zUb{J<(C_oIan`IOoQOy~FNMO|_YF*Q^rp66Of^eY)4WvemkpAQ;-J>*0JlG*u-bpU z0CL3$s=fJ0I4mMG6QuRhoL37CEL;8suB;|PDx$c6D{Xb;M?g)`B;>uirz!fLW~m9T zLWzndUVda~ZS;CYCrGt2m2v(oUU%H*YxDzjGLi&aI_zi~--z*mmN~4_XlXT+RVWO; zCy!f0GT5Xq3?LK))@`jp15d5GH1kfq^jE`zQ!!uSKYgwWADkJKEkCKP2I{(AD|n|k z7j9mrCzA`6)1*ak9qOF<)P-R2W@&Yr%$A0AWWgEPH=9It+jpm~&M!N_T4Lv^p1a$h z91wXp71BH&sI5&MwxExxYAk^VI`{QbZbg7pmq?PhxVs}G;RIBLbk+}A%MBBff+)0m z!CgSFhWOb**iN(Q2@su2=s9o{>nXs~St(a84s-~QT{Qm-U^HT4`deFCljjK=!AuSa3$Q9!_a0>JVvaad@AI9D?*V5%*nSOJ1?0-9Ta^S0Jx<}P*LW2ZB44hD zOVuu0ihYkEfzbCXfJ`wbah?0gSBL{sBjCeDJTMPm1GrhaTd0*}?g6Qfk%N?$uY_gW< zp}ma@2%g`?MRIMDuTfQ1?OWXRqp1rtAr((*JG%Ye%SykTsOhitDj!~h6>>bqd@2e! z8}ZtUQl=w1squ-e5NQ7tZ@Fg++g&{aJKJAX=T^M;4E+987HP70#E4Pt5mb9=fdx*@ z8yYHIT4Jk-UVjqB3&*1+D3`~^upC(kC%_i65+I!c8K7B+WGM8I<5K%s5>PjL?M68d zO3%YQ?3pQ>?I`aAc&`4O@2bnlUl`zW~s1 zr9Q5enOU_tH|Wge`Q8&YDEdsmo8~Pvcn;luaK%QjdTi^bK}Kn~zKF{dbvW#vuWM)! z-4PAwdBZOW(K?r!rfZhB7U#Q=aYgoc2)s4#&UFsXsG#}lOmxUg48%OYbLnm0o0qet ziFR8YlL{&QA)4XvX;h}O%4;a0q24~yJQ@RX{+W8|x1C8!s8u_7t&<}dhROB&GmsX8 zmshQim|>j$urjxkMa~lryRZlk>ia!GK!|vTHp4PYW4q{4M-F6=C}jF-{%tHBPK1lsLr!EltP`856yUoE>l>tD$stPYdpt;pH;$9)x3)LdHK#xpQ~3cso3?Pf+K z(%`e{Ns(9WCf{IHpXP)G!*Gm!AnicP!{51}_hs>)E0M>3{A<&Apreg8uZ!%f$<2LM ze>Z%`vg2={UL~l>6HQ7hH**u*cgx~g*q*VvHeZmBTfM}}D_*Nl%$mc0fT;5K zHlDwwr!r}rdh)q>`mm%mpap|4enxI4LmAV;EWay6^!?hW8yxwc&caYfWq-n{H=#qX zkCIEbvOWEKMR|fhnW5Q{X>Qh;8?}>^B{ccdTus?Xq6w@I>@06Gc!F?IINOB5F@>+) zoNDUwwRTmunaW@o-%b>6Cn!7TB92AR58zLCsM9iU0cjd0dL5(L-B5D+Z1|H0z-d`aL%3qp<8saFNvRc%p zcfa9L-vv<%)?eD}D`0=WcjW^91tCa?!5K;CyVoVo-0!50%^z6S!%3F1au=j!)xPOn z8*Fhq~!Y*~}1F)LubJIO129xJ{UhNQ> zRyXa)LyP!~{M8sJ!v6sf`#8>$OSNjwmKwuLjh;{qW+q;QZytPm8xCt|AaFHzbo;xE z0ZA~^K<#Gd^gG5G&_f9i)Z4*}zWntdG%zlN^(lt^Ygg__81;;Hso{l40ml5(S(*~E z8laUwlzwy=|GHkkK^$=SM?*d_{D$m{-~4OlZ4=$Em>2?9i5$=@CUIG>z(5F)QcT<; zq4Zc9PQ8-m(y|`&;!z0F%%226V*l2vANqP$-`y{_6bB=Z-GyioG=H-ztCg5+?%Qr} z@I94hSCUjY&t9s7g2tNgLh$FJ(>?zF%>a#*TV5LL$Z@VrLg%WhO+3zBMr`le9vL6+ zhsvtqc;+@&LytG_7>F!Q2v@2@(U*wNPhfY{7?5-t$kD)&naQ&#)X zfNb0`jh(?1Ffwlf%9!F#EFsq}O+q1Lw~>%p4=x3Up61#zx-DL{Jf)z)N7nB0v@hN@ zBB35li}rGOPhfE>)rI)Bwx5gUa$E2txvT_InL~2||9S&2Ox6|q{uPMUTe)3czFw9D zzOW;*Y?99Xzd;+F1kA(xAtlcCDtj6ZY)&~!4ZN~Cq461fVFG!BlhGX11y))n6*0w9 zhG@T@Z%p9vMEJqb)1Jo-&TysbTVa5Y+=F1OJoGJQK-gqRK87FOhC!{A^jYaT!AzMp|7aWsvbfuW+v23LX=O>JzS)J) znN9Z*7wff-uq|Vj+Bq6fH*@@J=KAdEwjdS)FKi{`*`s@+od^sEQ8+J#g=oFX=cXk~ zKmGo2&e|p`aHuP;aDHXB>((D6#ruMR$g}K7vAgZIt_|^$Y;)QFf|ACL9tD6N!sGGQ zn#&Wn&YEgBHd2=7A6JR_4+{q081wwx*?g?HIJrQHZ7v5sP|}k9xqH=Z)US=s_h%Bb zAv@OkGdIuTdnYM|S9|E;1+IR!^G{|7bMn96BXOLiE{-qTgmS$d6I}dH!~I>qZmK3w z57ue^4eE5M5oX+Ws7$DmD`>RrYltbjIl1JTyb|tru%jAGv zR_Fx#Px7I=xrX9Zqbm>_CP8?D2m939Ind-v1FNve2|=Rmvq4(oAE@EVXcTU%A>jbL z!C-`hTfTy{q<0kKnf8>B9N~~*I6<;=|BB;(lM-KXELdIrdIU+pqp!)@MINpE)!ry| zo|BrSe1FEbUm1iG&+;NL#@y)ES}15II?{y-*TjA zr;mG1WzO9IpFV+F5ADiF=1V{+S_f?K4R6dGD<>cR#dd*b#3n!$R!NuZI#@>vMI8wO zPbbSGVeHM%XE1*B2FjaXZy5 z+wt;j0~(Z#(WE>}^D`Y&&dk2{)lfFQ@~jHgsktLV93Em(;<5oQBIfdz530}QYQ|0I zWEF(ViLY7x0g}1fBa%|!$zik4iN^}%CsIoqOI4(!%wCVtn5@ySbkPupp0}@lfs0r< z46fTef$EDQF(Is?pZR|Nd9sny>gLWWWjMB6+jO;^Pwe%=zs79$DO0hYMUV&mH!AZo zQ-;Sy;%4`YJ&zXb$)1yh93yeu{jdDbhEh&QI){QgQO5rbM4GmJr-ygCGzC&y`P0tZ zZZ@_KoFR=As!LTGQhpz0Gf!64hUup3PC_tG*(P6%uCG3CPq|z(mgp90S3)a)ta&^? zt;`c!Um56kUH1P6om5@k`xH?wl;|=aaVcG>3IbVeaXQQ zIpwW4C6w}0jl^UZICAnltSuur+)c*6ymVl8Tv+mfUhh|Qf|nk=mXm`ub^ltj98fb< z(T90S@bEzEi03z^Xc3OLiXZ}yyrw?Q8j5)-`qrHp1byl3L;@QB+}tX9VC>Xo*O+Ps zxO&8vb*rgu_~YXg!^!mhROJ`#60%D5zoam7r>Y>eygK!Py7!pOGgJl4Mv#&HQ0&C zblhw=;T^gRmL;ya*BwjOxv7nTk=cu|qrBX@WkYy5n>Me#ZNz8Do|^NQSi?MT{Lf3G z@!_9KY@fulsds_}gUFfK6c|Ol*yT88@j}#?;$)x8%Dq~5RHBfl!j%mPvD*%YS%kqr zpmGdN{8*xb{=>zcP?!Rh$#~X_A;97zPk*RP4AtL1Y6lb6&o_a{-H6^CMYKR*YUcQe z9dW&L!3nL-DL|Ye=6Ug3t22AhgTtH=dhWfx6NrsAx^j=Z^qLN;xctwH1zHOYi|smr zQn1ifd&4PT9ZJ{@T|oB-`=CAYyB9-vz~E5uea4$`n7A4BUO4`|boWfJyD!2pJ`5IW zHwF%ei%{Z{f~<-tSo=?$>F0lxhRAXQO$@M%ZZi7kfNbpJQ@qGyNP z;V{gjlc5YWLz$CR(*Xa}L+jhSFPZL?J#hEZ_uS8S!adeE>-eU*Z9)Ri6%Kt|OPBNq zHTaDQL%=~#XVcL=O9I^b2sV9Qrz~JPV_e_N1a7a}@3RpbY>fzb9crvsKGs&=uPpHt z)TRA&IpE{E*2QGI%=VJgE_Wg8&Z%Z?I$5{O+Ih2wgxog-tWTJJ@Y^|7sj%TTsaa_L zFw%Ov&v*!XTKzUs&3J&IerraC(AmQ@e~TZ}1(`%E3ii;??w!kx-dAEU+0EzcQlMzR z(f*qAVr|iDBu>B1KKX;pRi+-h;aUB>>z`Xo%T7$cibiYbR>x|vmGy??h`p{FJti*S z->UhXY5popK=NUNdU@Xvr}s(;l=!03_OImfThTM&I!-DV)3OcgyW5FH;z0_LBB%7V zo_Z4H#hf%W>ZXq!xEykeRcsgB=B*6R_$w4mZ2RoK1hX^v=GXzmRLI4;N!J-A7V zFJM3g$q>{%rotDRz`9vdlCHmj+BO@vx!&?WR znZOj&izYk5HXChR0oPQjUiN)Dy|X9H{IdNQ1SHS!>4<(S(g`hI3k~Uw@!9k1Jat|s zbAOuR#z-_*%n^b9C^(o2E6>Wx!YV$VI+Y6aK``yw(Dz6gqy(?!2T2>4v7R{*L9yV? z5HffYM#4;pH!j=Ww3F}02>Fc={4AgPr1TXL^D^v24EXeK>xtotCGy$Qod`fQK6CKQ zB?FBhW$`(b%|EYej6h+jK_QDn;39~C<*=&zWQ@of6X(`DtncBAt8a4=s2v2IJ)D+E z*62X`rKXT6Q!!x>{fm>>3eQ+@HF^Z-psc_5o6w6~_$SMts0F#eX2W$hh zyb~LW1=W|12J%hPk)Vj>O5tC*S)KjQ25=VAt|rw@LUbEA)G_aE$3N8CMRhu-$+;o$?-HHf`0ST=r${ZucYBa7CnBMl`YnJ!>6lhf5H;X9V;1u$78Ey zR9D`fC!l|l07;1AAmP~}_JT@R$;L}xTX(l}en z{+RBiOX+^vz7-B5U7>N#;xod8XmsKhbvIC2;i8w0^QFO5jdOe?2hANhy|P!7>eXk} zSFs3`-pH#mMiReNz5(=0-lqgV?mv49o?IQaJ*vNL*oF%}vq~EHMHe7dWl|NxV8v|N zc3E=if@#NQarba(DxJZzH79CCp+|{Q5qq!33|LSZEgDX-Z9(D70nR4_2TT5 zGB!4SPLH;(BGLQ*P<7USQATaIAG$lGyGsy|PDMZ@q=y(9VF2mwR4G9^1f^kMsG%DL zX+?&iLFw*}bNjr{d(P+l1@Ob3eP4U6?^@SLF-;uiw$_yv;hVPT4pX_n*J<2J@(Kcc zS2J2#+jBlcA-{x!4;R$Bu0P_CeBguW-fuBm5=Iyr9iwd)J;MgU330V7nJ2wtDU;rI zdc~(Tu&Vh6%&+IBlC@^91pnRB1YpszwjVI;x^+#V_>rxpzY$gTfhB@ICd9q#O1o3x zW15Y+dAvqW)9;hTx^dYUZ;0R(zh1ntic}hX{1`+Iq7Wm+c%cX-Yr%@4Mx%qc(iT`P z$2@Wh6B2gb=o#t3`7V2EpucR|e2oqpr^A+q>A`;Ig(SrGVMUd77}B-=}~-3D8UB zd_XL5fjD0u{J^iX4 zj$%bbmd79sH6aGAS$K*LDt?^p^q>_@e%^!Z48FE!M10vR zuF&R+g;*81sRefT_Hfy}yQjtL_Ibhty^-~}QFyj28@0UJ3aOOVE~@Xobbp%gNIDQ5 z+SpFl0z&laqco8I2#7Ogvpwa9KGxt}>TW}D>9o9(4@!+P%L0zqEs6C)Iv`Lke3qYx z9UA{_M5Na&0Qyvw`-QhVFLV^I&}9?(&75yJ&NG;cKUV}w)EgAP#EcKwNeVf)Cy!%{ z%~j}X@|(W%H5f|_X%%UFI>62eZ|r(rsywOFfg(Y1pn6E7V9dA6car-pHzQwOEM>1c zCL@n_WSdFrOaa}JgrM) z`^QuFWXkGtcV^q$NwS6%8Iv7%8^O5irukl^tO>4jFS)I|p zl(4`IOGB&eHmMUUFHD|eqCZy-8+$~EOV&DHB>)T+z(WqLRw*p|kuzo)TH$y3mm=2D z$_$U)iNc23(#o*O#dRl>cRlKdTJzq)V(jN5D9L>tjyLzReP-E3m9eLR=iLG3zvo@n zW>Y~fAXM~Vr3Cu^1n&_cRdC(@W}zX*uwIaVRpVC&aE@c^XUXUV!!z&oKraf(H3Lr? z>sa)HW**Afq5MN<@d1!8K4F2imYph2 zFl=6Xkt~q1yzfI6>R@wB4aeik<0_~Ggw+AAN}>1Hb5Tg8k*=i>wZ>B^p}V!<>vjmA zud*;b!U_JB67ij->mZK}9UQqh6&?tgfE&m^ky@R9(17r(R+}VQ^tdlO5od{_oEieP z;EhiO4!OFKFa5WQoA71TklZBlZ&yrTwFsb`1oru&V9PS0@6>ZB{J!D$ATK&E{>%+5 z(k8Xv9?u1W{4bmppm~2j1_gE_Z$h_j6ZG|yy$4Ai)*9P{EISd5vj=U9%7t7R9}%3l zNQL{$e1jdWA4sHt!`=6HAH)*t4;1%<1vcnt30D0|7P3?F=*blWtMf#}#eRIPV*u@N zvxQgyqvg%tfkk=W=_~{aMOWm)(Rp~6;roZZt^FZ#L&|SW?Rs%eLg5p^hL%?Doa%Ng zMC|?d_{MH_Q4462-p%X$VIQfd>W}Ogv}U?YI42}<REY7LG-}N!`%i3RgZ~9J7O3K?2h|4Uk8T{9ba2iqeLkJ5;BwDwJgI z`jrE21u?YuCZE>EAN6fT!aIE3@O3ITK8HA^W)*5$4m;6{VUU+4VJf~06AT*~ejf)Y z5g z%rh|}a2hQ4Chztlm_t^9ks*%-u)ifzb$}P%pT1oJR)L+$muKGcz_j4ipk3$mZadxY zgCjVs$dH_XwFz^mr5iZakW(itRVkHE%fr(ee3twoI-hH(KB`BPKDYO=a(<|ri3LeO zDj7%;xSW+X54gqU{;2Kb{8xGj;e^Zs0p!zl7ZfTU<50;gTr(jvC6^j%PN zSt6&_;f0Abi03Ry=!oYXU@;{-LIibSlWBgz9l<*i1o~wM*qb;_9$SLNXU3gY?84R7 zlpyYzTw24sRlq<;7d=i~??KM%^uGE?3N)AT`ag^e(`YgUhuf$7McDNkhFz{k5P^xB zGs0kU4Ub}86irFJwW2-1dMktnZY#ahLse{ezETH%{SDf9P)09stF<0J_>pXIrXx6H zf2{fz6HXot>wF_Oei?8#v|>@d;5~S=80bbzYHDF@vOL#}^R6m)3IyuMk`Tc2|5(c9 z`#}yIE79t`cr(#4U4K@kYvI2(n|#s4&|PMf&xUe3RsYVPio94)^eC%!${NSAyj~V& zlo8>!zWrqxB)P4=9Shsq!2kS|VlnU7E#&Vv&*>Uwmo;Zo3k1UcbV7wjlFQ3Um{qZ! zk_@31^!+Z@t?v!)TxIJnS6a@>Vy$%XuOdf+;?cRq?2}T3iyb#ALvW7l!>;B>hg9A> zly=0%ef1~QV3cFzns=|y?tPADt`*4{Z?ev)d`8%aK^nNY+OLH{q=~p~K(A!3zgE=w zjrP!_r?*c~uZeeQ^e)lND6?8+cw23-E4U8%*2UUKOv{ z-NDW8m0tze6It~3j-Y0%bvi};FBp}eGWj?vGQa^JCFRQ;=VPIgF#c8b5qSG8+iQBX zEqL(HYFNvpHp^tl>_zyj5t$BV)9gi@CHH7|Qv?B%$9dY^0nvtjJ8Kl0ekW1~cV*hL zWz0=NvKio(JOY!-fQ&9rlA+VPvgbdv1UKS<=bupuiwS};$c0mkf?cB!kl}!d!`7A+ z6YVh?OVX9;$Kv10m|%EgtUm_yEQ*{7RDxv%P3IKwQvof`mm(aTYsPt2qvP43dwVjA z=Gah1XQ?ZF!R3mknWrVnfcfSQ0c!7Hq?=$GL}GWZ%Ot7BQ+z&guFVx!z!S{=>=bGp z?1?S1-#7G~t3r9g55+t@S23qzd$Q~OWh!2qt1@Q27x}oMdZ1)HpT;~#cxIkv7|{1B zj^+mvCj%K1$Q?^0EdE65sd6)XZ$-uWoP6@Rc}#-f>$pl5;&y|Fd`x- zEbzgerx)TZtLoERZLJ==+*r&+Qe*l z{})d<9lV7O)e$f#-HBM;9vi;Oab6P231J$I{&nOL*X@N4udk{x!t+fc>96K;a3(Gw z0d>(X^SWwE;W7%7L|r!OfqY?Ka-l}p^F)SCg~qnbj&NbM&$v)YiP$7TSwxAlh2_WO zYVx~bmy?aev$WSTwBJvbUp*_FaYq~6K1gC1bUILTR%pFp#WpFNTN?eWDA^VBo_Bfq z8$MweW?WP^m+dp1{Hib_bcwhLkn$*|I1ADmR0V(+SbCuZnMNt9ME&AyNY(j~Y8xumNthLX0eKwBm162ck_jI+yZvcG*3-nKGw){7Yly5e1S>jqX-w#(Q<65r! z?oE4H9iT5X8cqIVnRGQB#=ic?1mqy+bEs7P^gANADZw@zc=II-=mvwNNet6!(qKWb zmx{``}5?TAWm`Ze&KlvLhuTV(ZPDzzOwjmmO&}{NEX8 zJ%(uAt;d~tTROebaD!yuB@kFpWHZXO5mNbPn8N}%(%0;Xe81r0yEEJMB(_Ys`53u|cBJg^bLoZIeh)4$6LnfEd}bXH0bgwBsN1C9{B*UTkH&VjraZtYy~j}A!PQj3 zrFm!L{JyD{K;FYp+IH@j=9`U^zOL))ghR)UfU}av)gCObE>t(6!UXKO`B6==(W%a- zQFgVC>z^NP)hrd>nZf>fCL2qg0X9thlXA}<&84GxIm$WTHM!kyqLg+H_Xh#{xNc)EMd-@?tI8in)49N#>JxvEyX z*Q?)XERMpEypqp8dul^-tC^x+O$&nR7R`V6Up&=S=vLfU_?mLd`>k%`a2V~I-51TG zgXrPDS0`D2IF?<%5VCE|^xb!bd(y|4uh;9LK?HdIN;sKh=1jk$f!ZMxs7*@Dhu3WK z8c6nT)P^j2&cpvC-sQoZf3#PY2wBcBJe5K^gktUOq)Z@#%s`=W4hjs6%R-5ByP_I3 zIWowbyuC5z%9iA*hJik$tI|{Si-XE|MyP>j`rU4qs{R{dv|2ku*2qUKR$;cVPCkE5^{C>$W7Dd+3;FC^XF#vUkc5>_sM>2 zdpN+{np7=cx2!p>t%AM8>w$0T_8J&Ou>I($Ni3JI-+s1o?>^24CK@5jmi9gz86xwx zR!9YSmh2|Q6bsyh^l+Qmyn=}Mu=Bq0pf{--8T`y_Ks}mhlr*t zmf*wyNbOcKP_ierOL39?VvAts=eMy+hUpw}qc__Lv?P|=rf3cVT;G$h!S!L4*aLD} zgvcK)2ru3k7*+}aI5q>DUl?i{`Ur}J8y}3XfFI-GQ&PRxRO1q(wiDUq5%RHJo*gdE zgOnQWcyQDv&x6GWs(m*ee3Y3AaW*=@IOy{8bZ`jyQ3KQ~+^3ChRqsSh&9xLRU{*06h%yFKZV<2(eB zt<)xUxv^94w4eT+_64i2;Oz;Ra6cL4SCE%XSJWK-OZhQY`xQNU`jB#%Fi!HF*3%Hh z7NMN2)Rt=-o=ykKjK>#h<5pY{LWS7keG@DZNn_|E+IHxI?1JkCF32oc9?5(2hpB1U zZDX+W@|@Q@D3}hT*XQOIGC5xq{t~HVPrK^zdIFN{u>Yi}Ia z)_dpXCOE7rxZdwlL5z(RgjUgBMfeiL6RwNS?`DV%P5$=?C3CW_$|`&whCgv^k5v{| zhTZQJV_evu%^|7$mVMS=EN7HH+q12{aZYGf!|>p@7e|s~srkhI74R!Srw+oa<{u0I zCY;3Nf7*(sbkrfi?O-1b?cxbt)09c)!*bl%!T%E44!&cgE}FAs%C4WWc*$0&zi|8v zCgo`2c?6c)Ic^a3@;4>ZUqlL7@{5sDq(ZoQ6wv`;Qmj@{NtuNJM9m1r0s++_2|B&h z3}=0YF0UaeA-J5-tx2U9qzI<~6}UkdPL%0&f_c8rg#;TZClLERKmv&Xf>K!~BM?HF zg#YfascE<;4Y7LKp{-Y_Z38!$y68i?=l0)`>#|&spoNS})*l3`JKY3GS(!z`r_igF zu;?6L&HfRIL%Ot_&)e*BD@8^Y3uhdDpR9aF!)Pph)7A0PIEP0&;N|16&@a7I{qE4B z{(tAcvIi;uRzssk2(aFhC9!WLP$xkvN0!)NO^*cXJ|ub=AN<1$(g{0FJg6P%dZR2A zf~(@y5tNAjNZ~mX6H{KZ+RpiTRmVoe@fY_2)!PJnC!TK%Wjl#o9;o*`zgC{gZFp%o zI)lPyf}Z;>1^ejg`7(O=eVvuy{*ksCh-lSYpP8K-_TXTeHLM6_{DsidSA$*tJ_uPp zR!4~m;+~JAAR9r@=4`+6zf7aU>PSC8I zSSZ5#@I~*>wkPw4{VqIxV*V)>lY@G8cN=z|EIVEYGko(s8ZPJ@~3t)dhp*a=Unre|YqWHWR0Nb|qZMR)oC) zcb-M14|nKmS}irB4kHUc1gje#;S**+K1E)OT|}q*n!wb`jQ`XtZ?*NdkdKG6^Ezs%{vYM zLEO(&^wm=uIVw2aHTz*hGp*4q27b%?>`K9;MVTMc(PV&af$PrCl;R^eL^Qe1tS4eg zsRsopq0vkQ=ZoP0#@c`WoKYF*HOqD%HzfM%r& zK6Q=uV+O7I3*plT(A!OAcA3-lD|QxBiSSYt0%ky50EwP@D7Dzi88<%g8WQ#pb0<39Q}uWIV2^VmdKkhFQsjkx zTa{wy@T}kY=(z8vI(A1BI z>`%Yq(BAQVxGD~GT`aSH7mmh)fe7G~&+j_A5M~NQEogF*2m4@X)_j zOdha4a)X)pict$*eq)T>dE-{}AZ1%mc@8U+%Lcql63fq{8tuZ<+zJmfRA=;hvgwm+ zp31y8&j<<1j;U>~6<3@6rh?8)6$rH?{iFsfh8_8R%{Jm?6m*UR$j0hgUbf^$ldl90 zKgl%iRAj-zp0sOzp{;T3^+`y2XjTDKB+~yO*3p7_zBo6iihqfwo(5GdF1DHQCQ{L@ zw3-x!-4uK6CCy_eoN(6j2aiRvVKhf}dQZXUdIqcL+$}tZ1Zkx9K!*YUIsluUYYBpo z82=m`eh)IYF#Od05*LN8Oi(2skAe@4n_{RWbc?f2m-)ld`*6+PIpr%wD~fAinMCXO zo0LcU1QH9nC=tMt;WDWod}4jFa~gbC!p;x2l(B`G)-|VvkJy6;mrGv(vku;PL#kGC>ePKW`rTe=6kSf6dHa68RtJ@+5c6!ix6A=CT{3fG4d7m+pJ1#wx(s z!DW0q)o!X@76j|ZENC|cd{1HoJ_DqZ^hr08>1o{KRXDjQw@tQjdW-a`NUPfhg81bAMBfYJ90CKcet;!jVnG(la|;_9yT93_~|a?#wo4q{}>( z4d?5{Ne~_gwecc&>tf<|m}qwL4XOQq^GY zqmIJQm#~W^$M&wCzX@04>O)uKKkP?4`l73<*&=u93>S7pZE!7gd21u#}w`ERW znb?8zKYk#^lvzyLV7sD>$m>1-QP^gl^M@-O1;2+;9H!=*!)6!B1WL=RA{27 zk4-m;y`p{h4dV0FHswrU{$db4u+B>$G zA;x;qL(zBm*8pPM!w^Pso-f#}?Pw<}+fS-n;GA`rWB5HrVt9wAvQ4P1{Ei;(hN66L ztBdbR!D28czUXE%{XD-~H|n*(BC=oN<)``;j~F7H_<#96{zyk@tMuL52uD|U>g1OQjTq|N7T1q&x__Jhj< zRe*|<4_x*Xw(J)FE_*2(kl7~k-=i=X zm$AnjNCcg(>FW1PLVFpRA|YaXk2sSVO}E=lgb)n7_8}97p2cCiTLW_bWK0OMr$(hZ zZBuxoZza7O*<<)8lSlUFZZz!YSEGmpW!xI_4zq9v=U1=v%pHIq03_}r8~26ZTI<}P zDC+$rkX2an6)g6^*>M@fA}kLK6RM1YAt=#44t98%+ZpgEuKW9E zVW+4M-g$u`f19#}gSTdEF6@I3djd(8PA0y6rI)NU(d7vf|1kHdIiu{35OC{%HHvQ^ zeSUaD@iRxT^FBdaM6Ho(CfB-jm*Ik9aamaEuD z>x6zF;Pjz^&vLB`15D%0ljLu1 zaXKWvN{}CV+j)zg)XtK6KIKvvv@Nyq3@=?Ukb*q%%?Yk%Zza-kR?>&X@25GB3mVu$W%h-OENUPGD+j+54-k)Q)L3Mi!qw_1DoLseZbBq zdqxEQlCSQXS-^=W=;q!gv*hgV%SBViRvTI~UwyGzAXRXOBc#VHdWkPP#%Bx9$~Xgb z{5?T#c`_fq0ru;NM{-ebKi3$Lu+ICiMp?R5pX7`ZEiQfZT5nGd6#EpLfY01+{*^;j ziiW5BnH0v1o(%dlfVYgQR^DSv^|fGHquXzvG>&Da(eP7fKBrb*bD6T@x9v4#B-}2H zI%|g^2FetGmRq3|HXrVEJncC}7dBONaX9 zNuS~C+#if2Q1AAS;(46#sf(1&NLXhyrp1paSgmZY#9J-${#V>#2j7y0AeB~r0m>KWap5egT|O@E zf2<MG&^0_o7Y$siu>MP%u;h#3C*UjgoyEX$S4_u_kguXDwXecp!HxaD zK3APb$y)9@JZ{9bb_t0x@wgoO$pBjR{CqR`E({6e+Z-`JMNi!HBD7^09A7YJq}w z@m*8yg^eGSrz1oDw0pD{8}`g1_-fPzTO6Fz_v!`<>fcrGA6!lO?0U|*d^N~ESJS1{ z=uT|!Ql$N*Agme=y_YiPEEo}PYJL1CB4(=c@Gy2qDz;w)^oy6d-_Q1*>12pLm#_nfIKiCIvXzcP!kJeKfz7&aC% zOb0`G6c-KrG;_V8=>{Um3RkHLk3;OPNqcQNk)vBaKB17@vN>XqDogr5=j(u8gcaftd`~UA)}`{+&U?;b}e)TG}oUiW1i0rqjoc-B{WO=*x_SFn2)Eny0*R}{NI&E$4@7;nGH$_Jw8u&RI04ZSUjSj^y8 zX@^gdJbc9tY^ywkif7ZrvR?m*i>jz4QOTc7$CViHHhsWSHQhiCR1Zw%~`=Pi8gNe;tS3;ioQL9B+f@{lB;5y>> zN1 zV+_v(6=FjwwoEjBE~a~~FLY$i92IEgTs;Z7qx9($bx}SJ1hdchZG&N4^LamVJd&I$ z{EsHFglDl7{#jIs83~z$GHHLwWGwk*uZlj_oYiUyAO2YZlA4|054)9Ul>IXP#Wj6O zS!dq>?yOIL=X`#lSp(o%ViHP$AL*t5=^hiGm8inl>av0zh9Xc}0bMf*WBkbA6N-q; zHW3hLNKBvnDV$0+ANIbQy3Y{wwjgmoIvWEVd^j2nW6~+@F?`*`ki-h?GurtneF+4{ zeD()>=*4iseHH~FD2-|uE_BK?g^2&%t>O^Wmli>Hjv+D`M0Nx+Uy}M+P=)@zb2;j( z-$~!L#01Ht*SSo5=_bcDt`8my2t1QIIej@G_IzGwC=%Ar0X?Jq;D^}O`(uR->mC$80e$ago^v(sMP!XmZ3_iB;VBK_=$o3 zU3dCIQbUNs*!)CCA+1i(DtlL5=4d*eLI<7yPJ*wf=U@$gS9wZqBG1Lk@6{HG*Hg;K zUv*A}T2lIi%wWRXmt?PvE}I-XlBYu9m6$2R%HM*LW|9wexHyMr9u0Gxt9=l_QMn_K z=GxSXXbmx9$~|ju*=YKfOlwO7B<^j$`L*Sq7O2w~>hxqOQq>aB?+Vj!yS{F+L)rxD zL@h(NWxjV^*vE`bXYobg+esnM%;|9lZy1`bFl@NU)_0|_fM^#sp}CAE3G4beA4*kV-3}55bVr(-q7LdK9XI! zYi^>Y1EY1;^<*YbOm!}$nRS+$!E9WL*Y%rdpQ<8}M zQzdiy?|Sa2ZLHDj6+cMj%so1a&d-FIYmKP6n6Y%R)JH}Dr2*Jk(ZmUUa3Iqrb*CYw#)STfo9J2E`>d>OMycl} z#x&hp;Z^ZS8&iHiv;LG?Z&eX#=Upax#HrgN z(o`ilGyM#CPbm^VlV2fO>bfp(_RP^{kKrs{Fx}U{_A~?IQ>o%iigaOZiISd-s$056 z6TVd5OryB}$Ro&af_%^Liv2fqWs$XqKWBYo-va$LH~XDF{5iPhndu+uVy5h+j-;Lkj`U8td~?{{bZ;9rf7W0#uydJJ-}L2 zXo>usU_-+rC`ylWN~`o<+;Dy-X36gricvAq zgRb~q>P0vzn%rIw(s=RK0Pa0Fy$!_FkE<)7(~)Xr#9;5uFKBp;^LB*e&R)b7X`&KP zMy_#jl=LfPk|HH}VH9WbQrpyVtA~Zx;9sK39g=RK1!~GFk{I04orW7GxA$vzlj5Xk z1)1sV9Qv}5w5VLCw{t!{CPdKE4VM&;fRcVdT#-MKn8R5t!jg(foU`&(wBC|Z)=Kf+ricm=V#eXhKFktH*PNyxoD z!SbaKJbyPm!<<7u9LRms?Rv#VK*Vro>KS)uurUADS~d!^=oy3IeRe|93)~z zAbQhSlivJAjj$E|C7&Ir25;|G?Z&N`Jqn=s`=@#JdxAZ7{0Qb@4s#%oJUWoSZ*Pl@ zokA|%juLF_?Ohu;9T@#BE>@l=W7AP!p2`E?VSwJ=y?q?GKa(Mh@<9rIzS{ljc1qON z;`oZ8LHZ8k{z}sFfqo-w6l@ks5|12i4~X}iHeV$CF*pBC!=!V~_1DDqBxZ~RH+#Jt z%%nzb(qK)Fw$n&YTpx#mC}I9A#0H2OL0C)H_t{K~9D5 zHy4d{Gp)Uo&!vanrQw=9x1+uxBz-JXAs2f*Ky8i72YCsYF7nEp>aMpOH25-HZ(oTG zK2x&qCed_u;IVQfiq*faJk0>kKcJl@u~`*4Od#4_XND(LmNA&tes;FUR@JMIC`0Or zQLykXgkFNud+Y`MtCzp4$J80Eog}{(M z8Uzc*wb}$#+NL#_lBVKwj_@UU|~n(tC6LUKEI$GX?h=mT-WnI0GD z%+Cq@C6=7Ha6(6ZQUFyUK9oOy?!#Q%<6_zLkq9{|2K5-LVFo9xf02zAvv7d@}jIF%y zTy<+9-2WYuj=~53ixdmx?#7z!%6&PSEQbLp(@Yzd@~JE770Ye$x&_L*7- z=7G}3fO6SgZq8UqYR@pV&h7#E`@?rpB=_4!`EA1HL)13WvY@C~QMN;)uH*RyE%u}{ zxr^!(hwY@h^}cB|P#9Vw^%-`jgYRAQm-76>rDyw4poJ3k9 zOC-+k)YnIRURGr|hO(kJU;HuW-v0@71t4>#F4Rfrycy+wb4`Gu$Wud zVk2`OpXCtRxWRXko=5P^v&Yf&SoY3n(<(r~=cT*STm{RHs5INg&nBlIrPG158Z~HV zItP*OTr?8fF6AHmleXf+?~Lg+ft5}&ZOQ>9(53;-fa8>ySsK*3OU>Psw(4X&XS9@v53k7A#jqelQXCiLm#}3$BXK9p-ia$okWd`xPi7=iN9M?+l z6tJz+K?rF^qNwnnMgT~|>0(t}+Ad3F@;t8k=*OskqW>bPUPIbH$un7v%!F+MFlm(4qFC}+w4h4Oba@$+OL*b$+KYpu@=VObvgI&}o)1h!LL{NaE$ zc7I^hpdCDOW%N#%%r9(*S%-bmVE?$(=X@&fZB;4h<_JVTmh(xzpOMGFvZqV2CwmuR z=51^s4(jVCfVbsp#tb#^4u%^jRh9WxV$Z0gqF6~9fTAf{%5Yex&Sd%dj<%YL&}cGd zShfov7C0dwJVh!@aG0KIB;(Ewke2)|&>1kGL}?##yLjP^O?e_a0vzh)uVM?tdjfeZ z;etJZS)AC1I4^pU^MBC+!)l@t3<9G83k|5DQ{&!v(CC+!&NIAD3ff^X`lrJ3^O2%p ziP4-|*{XUQwaPsc2`t2PzB%{2kX4M5a10DrMg~mZLwv)~y|^R$vsYBOLAPYp#T+}n zMw2={cFjTFQxuqnu1JI}isH@2Y?#xvQSx`w4UXNO^#XZS zQ=SK|`p{t0NAJDJFa8@|HBjiu03KF;Vt!n}#Mm~fyL8m8&DebDQ?r<8nTS!B2=_d@ zF5Q29Q`-1O{H=uZ3L&U}{3qogU7aPd8jg8KsjJB9hIe=sXDKn znZuCJwV5A(3C!hPAlux&ab2}1+My4xMz2D!gE0D*7b@0axW=UD$%>yq%IJz4qwh^E z4568|z#~@tVzH_U!bhPWrjMosAn~>R@8g^}u#Cx`3BIFW8*QD+&2o{P-$%3oo4$Yx z+lapv9$Hgn;dc3N$XBCDXs-f*%c_n4oLh$>UdN8eZ#gw*_%WPN>_<+;?)7XsWOiybTK@8a-J8sO7Snd2d#x1 zL6ve)EFB6ICLqBi#+CxD6sqZTgM@v^T5A$=Xy*D$Bn2k-OrWFHzzRW+A;!d;qKO@K zbxK0<;r!f+KKC~kISAh!+@8TF=~1vEH#+a<+@@gqy+3x zKf!26LF0{n6|=AYV3|j~R5)~hB0)ad+85BNx$W3wE~s5-rherW5QN5Q#vk(#VO(iL z1Ium5QB)K_B&xS?p=SXub%BhOfm<=7(l)YOe>u&T7qaodXy_NBNvi;hEX&ggY&J5v zA|-KmomNMa@ww*#y`YAUR_Nn`B@JRodtdXBs2zkti5Di3yqs`@w5BnCpwypxW_-3`)QebMOzbsu=nC)n*ioRH(a@vT@91w@{<_U`T$Y)ICw#$-P1 zxrLmlZFmfocof{k9O+KI54|4K^woA*()Yh5k-v?(zuR=2lr^Oq9AW;{cWc`)tc0|f2R>&8j_l9Rx1wd+W{k!!>5i;N!?W4oa`vI9N1`H( z``L4U4pYC{QOsGB{+{z~Vfp?0AfPp7J8Nl%qvT%nCqrZH!TAx^m<)ypdQvhK?e!B_ z_efZOfk!=?^)MkhuxSO`F|1GtO`PR7t}!dm;81}_-Ip+SmbDK2s42o)>;Cr}#%OxL ziJ#A(66+z-bo3_{Y)ETwkxBiMH%tIr*4#9JJ)5j=fy}NEVq!Y3lgH8y&(CN))ZNo} zrI>*O@}!ij`*EXkM$Op=kapiBXgW0Ob0~3vxtaao;B+hPaifICVnwI}_{(00$ql?m zOqKWDJ2Xy;*BdJuVJ`(TZRh;qb@&}Zw2v_BA*&``9Vbwt9>XwV!ptYX(d^`)j2@){ z5PpwVk2!N>96o1Axaqt7P=8DfI}TvVWCVI-HqM zBd~|5f!mc6*wa!i8V}bFMT3qy#d&tvHas*#Dx2i)C1bVnNO3l=<4$@M-*MXn94TLZ zl-ZkV&2DM{J_Z@S9Xr*0G8cz*Yn>l(((V^p#>CK$Dd+f4pmMBIb+Q6Y00)m6U(&!G&l-dVa-&&^i`;tdc>H8l*l*JsUbNdzG! zd;P+L42+ZKNj_~hM2iT*0 zT6JTSwY68xi>Qne4&_i4kSjBwRpwR+^pk-MwSUrEm-#+>9MfC6+UKkPlS zsg$wLE=ko>4UYV+{;o+O_fDfXQ}PQ-LYFJi)S{Q~xM}kvCX;(g0pLLUTf61Waib7Z zXZP8Pyb6mYze|&9BM0z6C4{7bKZzv^Y9@<8i}AS$Q}9*^mC&s>Rw~-f!ZQ`UmJM*N zu}tu!QA4O6L$Vl{a<_=PLd*lB#M45-K*fqaBxKQ0OBrs!@`#0tLBqJmh8fy;5|hG~ zQSDo4!88*4pu=Mo;m2duv0&eZ4yUQ*`2@ESMi&5Rv#G|CB0*Gk!_Jx8?m56#62E_) zN?fv0PXfVKEJOpdC*owmsh*CvrBP5=1GS%hU^lZn<`eYcaF{BYqsu$t+(w#)8X|;G z^oU!vIhYMDZXhq#2(2CX63k3^#tFhaVVbzO%8+t$yNN``cJ# zSE*emolUuW6jqf-;7?hmsLx=@Tj?~jr{3{(Po3<~{VqqCgD#KN8`kI_4*NdX6$r2C z$_`oHO?eJ5NnA>XoUBMTA=a^JWlf*t+~nsmr0$xg4for51VxAQ$IF|;~-{PQUn5(lDKhL${U>~t#(lAGr%%YB1VNb?kJ~}5rMYF zcUNX84c8^_ZXw*KBp1o||H}fvqM6Ij*Mykhb9B=#3GZH_vgxPZ%E8mxTe6o^b&8_!U8=4zxEUe7Ik5(D4>$E`Fo9g${F2`JCRDed{;IUcJQU4|ri? zWg(}VlG0>TA#z1;L764HMVN7kIWzf-oKYq(}^r*ky4M+**V ze34BdF!?!p9!I<*S7BLg5)HtVl^-f^8%xoaKY;8l47I0ohZs5OkJ0`3xCMc6{69DW z6|kR-WWhHQDAvN^vvh9rOy3QHNrL}F*jy*~;3MilEn+k<0H-7?0ws4`R4OK?WQHmF z*L`78RO%n;?nlS+w{phWRK1%0QkjF8H+-rWn=GXR$rd5?YYy2iKi zv6Lhu;+hL57Jv=da51>kG*jEpSur6%p{*`GiDt!yi?>fpey2&nGmJFW{XaOLUPGMw z10{|_7GhDO;jr3?@!%{!%}Myw#MiSz;=5a$`82a}B<c#QD2!jza9(9p!svvecDZDzw>Sgxt{qbKqK&{L!JX#tuw*zw>6~ z&-labk}M6sjhPV^x39)S!p0WTKh245>xqxALr%z@B$MpN!=8V%7#Yj<=fW5MY9S{% z3evuNv!i>(^hPXTu;=xuL&)e+gKM@A2DVx|-nWbJ6-gFG@BZq)O-*R#z&aI>R~la_ zN`z7?YYR*>f`M9?9;dwR(+j)M`I)eT1m}Tc=f=KDtQ_$4n54r1-?$;u7)K4$&&r8G0I>&x? zX^gBE{{&V*N_;v}GMnqv?aC=KI`JYLjC(QCjjMa`vIB}9b&3r`w-Pwx49^bZ-HT%!(dlS=cB3%S`*!QHts{p^pexaKUU zb7gAze#3czng>sJZ0@;UMh!662!MZ(uM$d=7^zBOBnzUIANH_d6=2$1mxC%vBRDRS zsU8{oC-b2+Myj}8s-dKNNf;66%}nJgJXRR(yt@-XNq_UX0p;fEh)ypTX#3&{s5Vj! zc2DbHPAF|+B?QO98>R6g4>?>35%~IddkyNBd#}5RNuRO?|AkLEX<{NO5KfB-fb@-_ zr;LGt?sa~dijjVNoayERl>t3n$s9#Ef04U8RRK!q((;dFrAz(~U2oYI<^M+g4&5mw z4GKtul+q#6-Hen-4l7?KXUq~`C+UbGxIqUCKS^x+ka4?J3@Z@Q_M57k=6EV>6Fwj zHX$JI=ISoY4?Xg0ao9@5%lS^NzS=?-%1`kMe z`qB+GT!w_OV7p#EW4gV*Ty71%hn#Gi&)neM=LCs;ba_A*^f03jBJ|w8%w#c@_os8Z z_uP5lwdaUgRh zulk>!hNQ9t`_SJ0N69RPmE#JQ7Grw92BY{HEh)U_ zyfrp^|6|tDh4G?gHPqUBlLa*e*HXew8bxMBjda`}@6(}0&G3ND6nyh*fg zC~+xcR2@!hzvI%F9gB z1(!%}HB^0AtlXgL^E2T9T0WA_E!ry?eQ*-pU%i*dea!7mIh;1a@;M+izb{<~-bZ!C zyZ-z9hdQh?grG}HR_6A{${98W_g!hTTE*!T!_TB~l!(k|{NHEaSGuY zO2;$OC@4u;S?sCwl)~_BByVEyR5=BNl#RnEn0bab`*dDV!O)YF@Yeod76BGEq8C`J zqMM)Oaljfuc~}u~k$z2KT<@)P3eh~d^}HFPO)~U;7XJM^jRvx1DT>aBV_uNvt(_IF zi3LI%&rKs2C~G=8b}KQMW6--MrS~fwg0L0jyvzi(C;YAi6{mt<2~%Q#f$mpR&Z3)| zhJ7EH7vvL~;bwuHB5OfSJp>Pr!g4NA4X2cCJ>ad#+Hj3y4s9{RqN4`*<_ zoAlo8Y2wUBLh*aE1DX6TnsV=@nlwUY%|{94feUaHC_2oCzkt-$g|On;MN_Nwy!4>& zR#z$Q*B7At>y^1<&w|CR)xaaCRq1}hcy*xy_YbIpPU_U?CcW@!oY!^cl|>Nkr#{D0ogJvTWNC}huCTzEBVu1CKZ%ld|ul_G)f z!{ETh!d2s`PWY+d&(=fw@WaUN)4yLee}9z9$PR-B3-Rd`y}oxF_C7C=5J-O(JIG6- zQ`qWKau|V*SHgYwGK}49>VsrDee34t z=1-H?;6m=>E#onoCGn8i8bVxn@$8hQk9}c#*7DNhS-ZL9LY3^>nY^plZ}7%;)_xv& z9QbltwZ;dPI9=$~4*uAAC{94V%ibTt<7&!TpO!n?^B)q_*e-Flb?4EuEZL$nL)XX8 zIx8Q;Xf@Im73wrQE|$h34Y9y8x0jR^&59Q}zj?JzuCf0I?iI9Ed~W`)EtTjnvO^65 z=D_xzcRm)cI%p!MTTi~9|JyimxT^2Qr8TcP%C4XX?wVtD)D7oT7w8HV_|;`dW)C7F zbHsIInId)Ys8hu%)iuq-m*-S3GSubLr9)Gl(3RI2EaYA({H{9VSj4q9G9*%#++yMu z(K2qIx07{d;?)z?v2wB)SM3`7i=-UKJ&d3^em;E0yf@pZ5BP8QGx>r}FNe~hziuB3 zHhlQP2q!;S@$fw-4mFbD^4&-IK6OQJG{@vy>bcbn3Gei{=H zMkyQ&ND(RQUaJ0B+JB+k5$ckm7h(c;;5t&yq9W4L0}p00axBu!4Ul4-NsX?mpjagc z!;awhPjXAtk$_}$;WOkM1~-+g96>2eQpXv&ySr0ZK^+d2!lVx?h5PVM2_=kFHfP?TvNf zzV?AxB*PQE$DUJ6xMpU?rrXu{*k^4&5QVq*O;(&sHXcNz8vPnJ9X()mwKR*ylT?1k zpH<*S(DoIZx`hGhxQErp0m!`q>Vxt46MH5M9B0pa+zz+KWfYeANf3EeAI8K z$ADUaDBXz;8rb2Ill8ZkUxF^{7gCx;C&N9yB>tg*v*Sh`matrx<@z5?JYF!#oRb7g zKz&k63Uj%;AFip?`^Kn_qoxeie9Ue3^g>2d1T6UIG=p3zW>|MxE#FozTYe%PFFSfR*2~_zq+!@ zy*F7J`{~H}ubMIYwN_iUpkEtbd(Ryi4z12|Xqsbu_SsXJ&`57Fe_f7}gRKwd<=$F7 ze5(#HEQ%C;&k|dAiZM80TI8E4p&&j>UY%PY(Qr_e+c-(=m-sqrykG`tSUzgzms>ms zHh1-REHQs*M9DO7xrOtcX3=CQ0fk)qL#aEYC6US_Sp?CqOAeN62$Z8 z9Qr>H?E6{X@QN<)*6_xGpk@tNW}Z?H<)@bQSt?ZKa^lu+9>vt^fQ}m6?So|;j15dN zKCfkqc{owkAQuVKQ)cG@OGnvKtVzJ*s-I8vv=X-n zgk3AIiY_YuF1#%ApRTZK`1fD>W#OvWM)Hb9UV6#pwC0qbxk~ek$EPHxUUg1=DgTsE zLf2t`Fx0!*l6Moj0IuHHL|ulpR>j6x=rQSB?rMZ$9_n3f*Mo6TV0b{L&jv{Y8HI zCCKx&&TP2?P0uwP=1i}e)_$!>QP0=kgZqhh{(Pi*){L^SjCKFk>Am1fQ9H|d{)rs! zsMym;+`lY_zp3OaSDKA8#FW^aJW(UeM1KZtwO#tCJzBG$Uk9$fPhw#kW5eqAg>b)O zG|RSpXj{c0Q&HVU0-Hjxv+k0i;2O;c^*l;#CzUczlC{9v&fz=}oa!TPh{tQJOqiLT zvh3;bVp&$HcWX~yod1|-p0TcOD+C*B$I?@Mb96-WhI(_{jex;vOfc5VL4{^@R@Lxx zuNkP3?O`DENiFTiDm%2Nxk@?P>YUyy%}Qefs zzmHK1dQfhZax2fW`6rW(?Lhej>h-F7bmVJ-gT9T2t>&mCFT@ki8Ds>K3PtQK}2|`_bL$XFX{56AT@D|R8+e_P3vT@fF(doT&ya4x9%pKKSQm<+k4)Bt?yYH`C!k;lSmV{B$fbw{aTQ|~308|k2qkK=V@V3hCPhXrPhXJ1q>CA*TzZ&p4fA-7=j$m zk!^lpoKjo4K?>yD`3wd)%mvLGzcCOty{+{LDhZ5+g5D{dHkNP=%+`>(YXv1Nnh0zr zNOl){g$p^vhGf8NPm^nSeaMq~jsrH0vF!Xb;z~BV>%Be~1PfCRIX8c_;mp9a_yM^q zd!ds3rb#4>F{ecixl7+K07;q1eU9YH@tFGiTOYYQrnOarI#7V@k$Zf7+a2m5O8)f? z^$hFGlicg6cd4Q21ZAPDp8Eulp;5Q_fJXFyP-wG&FbIrc`jcROseABnEFW#=I%^8* znHp|s7P4>zSQ({zW*On^Dz*gOcT#^i{#r{jRxm?Ge)B{Qiijxw{+0!GxIZ0^jmWsy zD|@zb=o5Tt?Gryey|K6tKz!~a{&e29Hu8tsY+-|vV#6Z%Lv}Kaa&pg;b8lvuBE=Ua z@fe{$)-5{!db>)Ny$s{zxA(9iCvl*C5$l-Mn)8;H4|C)1$}1t>Iq$NI=m#H|NH5a* z+mY{;MDDBLSr0!8FF>?0e;2Ht+;mW%o%|wdyL1Etr=_#9gZl4A)txo_nW2ZRgVr~` zEKaHYejV*NyKI+MjT>tl(NRevIMJpuY~I6dA4dx8b=eB}MP+VeV@_M9Ja1Q0Dr;|q z2Tx~b&ZAgIv1$*-NQc!IZGTB<72GV2s5e}XL@TKc}{|B$`Q$i%Vx9?Pe~ zb#opsiIhx@F8*6WD_KOI+!V-Ob}H1gt6ZB*8%;l~H1a2T-nXZ0O(P@tX$zGJx-qI) zT=6~YwhSk=s*?ODA(Gp+%G|5*)4)#P?k>iU0^zDLM$CCzh-;DzI z+XD^1>)&EFL8xebk|pv=enpu8t&Bf(mHauj9i=9@B6s?78CoK_l-RIZ)*$)uN@X>L z8+1jzF7&E5wEN5Q3SxvVZv@}a5Juw?;6+eGbj3wBB)wo;=tU5p0bG#-QG1eCUY6XJ z2Sol?ufq!#{J7t?fr0S-sRYEF9~m2zg5M?EYe#PAH0ZP2lFBfSS!ym7)s_3)CLz-fqSFD<;?Z_JRH8m?)B4pxZfakHv$9S*(kMy&X4 z%(e(2x%^-vSZ5^g-kf0_WJV0l1seEM#|K0R&|t`8jl$EV}zAt?)4ZV6cdN1Ew`C*RCY;Z-%Z(I$C4Ofm(z@B zJNtUM)H?Lwd4kjVIE{E>z}r!L*V}lQ^SCB+x8m;8o1PuEuW<8;us#0g;&IQ8NxKoOT$Gx0 zHUIU^Cc8{2;{cs&8(MNIWm5zTzmu4u((5>0t??&EI#s59u#}HDpaW1fTGwLc$;rLg zMiE#HlSzOj(#uP$sfB+bYjC63R@y18qR$tO7%t(3NI@lFrgWwFixk=;PxTA(GUT1= zvhxUN#tg}m>eKQ||WF!+3Af{DBeT5F;1 zF`Owh^63ez<>m>4E?L)N!u{zAv&FnaYR{O`KB#A!|AVEVUq%kEtz_}5+$SuwD%74` z{hq_3PDlmK#a8d!$?_dLVu4J?I~AAujh<^1q}UQyVF&K&@k{?W>JGWE3z`3PHm&V$6LOy=b1?X@9wBpncYpbqX{VM)VE5`ri{>E4byE~obXacmLgKW!yP2~Hze}?g z*@x&n(D>n>VN2vHEP#%)Z{cVxmf^X?oo%1y?=Q_Eu{)OhiJ&>fl@xqfRwuN0i19U}GNs)1tQW8oISSb3dCkCxHpdsCstyPI7r^UI4#a_q^Xk9|qlh zY-}Hqo%PK1aps3h2`_tilJz8sG|F^1yIFE}d~D2Vu|jS`JWzhpzS|v0Qf82R&_^MV zdc^5G!{3<1@k5>Eg^RVIWUFQWBuTVNXRNoEd$P_hh>oYpG+mDJSdDG6$^>QD;nAVA zvH$}flQNPEJ!L9PUs)ycvn>~%BgQ8AFE(7Z7**D)7-S?NLYF#fs&ZlgPo$7QW5l!* z6Ocb|7r;;mOtK->(0OqfR(CceD7Hit2?kvYQilQ7}27AKrROx zBT}5;omJmN`nM-K@;YOK6Mk(VcyxyP1q&WrJo|Ka5eLHXW$ah|udU2^(fPXRCm>W$VQ`} z0~nvtFr#|fM_F{+pOO|?rSmaQk6&D4OeD3dK@XS8sg32z`FJ z!1QTh@yqZhKc?rCk2{$MwFi=hgHqCKH>a0Kv#>fg@i1tjiY5^M_{M-xtFF7hvN@9w zpx29OSIE=}X#G@~aD3}r8APC0>pc8JN!CspnS)xMgbP;dD!Fns5q&4Rg)9nvQ`qVo zdY49BrnUGeZ#n4`{OioOu)r_pK|L{Gymegc;A@M=t;?ktzV-b_?~6H7jGDS619TkN zv>;b*Sb29aIkRx++EdVi9OB_m6>$?fYq+SRfM6tzz)~f%FsU%}l)Sz|DOJ5y1Z4_H z6;vck_zo+@Y`{|YH+EhvC}mt%#MGcLF0Ql`-%B_CZ7flV=Ex+>lN{cY6QR&)rkU$Hb7ibLqAneSt%BF_o${P^{8@2Ct-j! z(iYL#8y#@rb5@!}5a$s4gcEq8Wrd>4O&jzHQd}~ImS!zLB|UtQ6mlMAnj&kiL47gX z<&_Jg-0t&hVSPC?zniA}{3Tiy)YH7U18et1R(h8q$&?EY2O-!GJ!B1dtpMC4`vCY^ zPZ#LHJ?oBw3ZuELvBwECtl1O!GmP~ZqUgyU1LO;W$4$dTK+xyhf24#qAPXqe0-MyrJ27=_x)E%*wU$cJJ}ZHTJ;(=N0)N@e z%i`V5({D)+I&=XciH*`yC*U&yV9|^K@XRYH=Enm z$%V~!iH{^9M=R?5qdku4|g*n9KUMz)ex-;lwa z2nW-@=6>e~W^aP5+au+i2u`c^$Cqqdg>eyC3#4#`R+!JOzWYf@@deA;tJYzh{A+-b z>MsI!_uO}Xgh!=vdi~qzyG8r@c(MHHm2Z|)=jVL~lbd_`Bp1j3>jfCWdG-YIRz5i{ zNV+(Do@T1;=YCzjQ^9=yR@m9&$c)CMT8?v_xWfF6^tX!T_JfPl_w0MsA(^}1-!MDf z9IhPiY>t*LaMs2Ds(j{^G>titC(4q6D@zy}JJ4ky8-G17Tgvi{Hjh@8O%_Xz&7Or@ zhf|&nlTG2jt%|;*JYF#{O^@jAjAk0BnY~yW5ns3A^*Y!59b}G}9Q+e^>rU;1!4lzi zW-AqE^dKTh#AKtE4s-&w5d)v%7Rw+`8Nc@T5*Da04}QEYlfx;t4ryZ)4myR+tRv;3 z*Wfb5WYV$Y^!QJSL<GxtNc=J^16SaVambxiP?sZ(1awJ)3`M$Oz!IvJ)>7VBu#1 z^`D@7U51wHi*pfrB&6iw_VKJwKMErS1p3w%@quEK_|O~6is=6N@Ma=5`Xd(xzwqH+ zLy3}dB5*-|XZ$j?K$NO0H2tPjw^!xt|kuNIJHSAjI1H!|-B!l9ZWKVc2o{Xlo(Q_^S4bt0}- zEuWyV&`qiiC0O@4#0(v5{ioz9%**>SCv+y^xvT?!fUSQ6x?9&~D-(^xA1QFMT*%4m zza6wZ`SH*w?!oo}0$CW3J;q=5fLA{fmMI4clnlru#2*iqrE-9wAb<($^aDmIs`toV1Hb(tvCm2)vc`3*@yLboUakxM3jeoREQn_eoG#6>Q z#7~Xn2ub^@lXIyfOECG9X?Zwocu@fv)R+Q2Dd6K&aOFRY2!9>$r%}!F_T~NS&?yMD zpvBevibxRTC42n7iSog&{rRc# zjpf=P{@c{l6hID=j)Oi(n#hU#iX_6$Czr>P=VWCwCbTrD7i5I$a#_})J4ZH6@fgVI zhsUWpm8JafFQ_PvsN5=<$xtyz_}re>2Cto^QsyX;JpF%%v24!gf?Bk6YQoHg7l&T%)gBMLm2tv*jfLK2MZ*jhs7aY6LEbjar8;qg$;TiJV%52;_BrP>-f~-F|BpWDD$wsSs!tff_P`7&K z5lsKYl6wna<%TTA_aF$h-``}_>pGv|oY>)@Tmjtua2MiCpeFnv(AS;X(4$Rmd|2E_cP|~)omwes`^NJ3J#TFAz4}ij$?R2MMD8_>OtlIkWb9f2nYce1_D6BP ze+I?a=FjAgK`P8f=+T25_@y|FRtkDW!}!{EnL7D3P_4vV-oC6k``oAE{%Ju(X&oT-r(hy0|bX>!j>Bt~Nn>TP40edFjZYDlkaPIj1#as+2t~s<$aD z;*u?5H~9K*_pGwC{#(lnO{drSn|I%7C+UbJ_)$KRekRAXKruFDceX@<)Z^YE0}D#0 z=j6FG8Pf*n*XYa*t-#Ps+%8nwg4^g)(c;}pS9KuyOKa<8mP=JQLnOrg($CcCB_ot* z2fc+ek9NZO$`aZ@>Okt*OQc38PeW*k$@`p8mr$1{L-Ff-EUF^q@4$jipoc-55b)w@ z10yXF8-QcY7R}M_dHV&Y2hQR$8>TXtAGu}8-3ktS1<9W5`=2iKvY7tSjX3_o?7P>` zvLZM4`Se#IX8U|gi%ZPLU{ll$1kK2`L>%u2$y!lXf|ndno$OQxn_m7R06C|rwRG|w zNl3QjPJ)xB0gpQ8`+<8tQ2MN5kAJ3*yXEb*KTAMN@9@*Mdr>=Ut!9USY5!6=R`#1d zlIyR(pa~{e%HIbI{8!<^Yr408xa0*j{35=1@IHM>CXn1LMh0e-7)(uGZP)(FsP?%s zS<}Uqa+RGCAUuFV+;eFW$EgOqPZ^`p;S^E$!A{}4HPe3 zmucD_@5h{_uevj3I_AvLhSfu^uB#<+jQh3TpLQo~_2SqZPgg&zwN~fFKfC_Ce1jy3 zZaz4)*0X@7I_DJ1;(_4&iG?}Z<#*S zr2LXJQ7PP1fw7h66O*Fz=h8k){+qN5VW4b|c1Z9wSOz4d63?I=Q@THc-k32W-%SqY? zTKOxFa0zVq+_h;<2g}Hf^R+jSk7@psajw`ql5YDtAnsbfZfdv$|K`67PLYXRUHO@+ zoEmD!RGV5Fc~>%*1qCK;svpGgxU@%HY&d>A)ytWE(MZ?TNHWo1B24fM=Tn$hR-@O^ z8-_4V*KHFShymu)pBn&Rig9P-L2IDZ9k*=fzxB4etnC)sKv&=u5*LCsclcgu4-x+9 z$(P?Xya7DkSm67QO3_EzjM~jK@VQ%xlXBtBWRND4Dsp!Q`L=PJL1!cU4NjDj)F%nb zr#Vm^evN7Lbr`Mnm*Uf@67DGr@Vq;67fH~C)tFh9$#FXQ`Si(Ny4k`^*ef1$b&j2U$G|~R(Rl$zFuvt zuGfR!9iu`{16?xtgO8mKJ9bIi#a!NThwLl|+hZ04d6ZQ#g(Mn+qn*?&!|YGml2?B3 zr_XZwsoc+Oa0IM6;!{-hXv((Dz^`}g$JWl`4JE}ct%in=2hTuS2#Ig|T{c$_lryN- z&G}lwao)1lili0?QuigpcVm1#Pxv$WIlVSFC*dHW>1c~dX^JNNfmZzxa}&}P-l^9Y zM`!C5&ldJ$?VY1SGd-u;10q4dvSxtxG`I#O zsptB!+F06n`MQN8{X_PrweDqc@BePtV3mC{HYkkW{oXVg=j2k#IpxsqXY3%%Z6?gE zvBl1hk_kGLs6~XxtlI?50#P+!3K{$!;g2Rcw5o;+_XgZ@{V3lxqCEePW*MRusLNe~ zuQwfSPG&->8D2%#Kbc4V&*ddt+F%HT$f%#G~Gt zfu_w();!<~+$+S7^PnjS_Q3^5oRer%bsJWEXhIApSYqFemhMuMK(eRPPjwQe*@@t$ zB%dx`9)x3EnfW$|FT$R4oLR}bUPw=LcOi<&F6*ubeILJc-X8aVD>-+vxF2m@_S>4k zr(ybO{AzCIahuKvNC+4OpDV~{FVcB_q{q|f#ktJM4v;qAIKNkEO2t%s8`4JJ*%(c| znC!lHLpSFW>$~`FarXQNB4ptuNgky1TQ-4IGf7z^6zj;l#E#*0=RY#MO|O0I+JoZJ zs(qX7IKz>_=C(KQ{gfo!#J6K@Y4-^H=Ein9Cr@x&<9aqQvzNGXKHnF!|`5p**@Pt_bDrJ=`vhijxG6FT}?(eVJ(6q@yWSBa8H)U%RfbL8O{*h z)BUk);=(1pB)b6$w(wx7SnZEvA(a&bv9lUtSHaCI?ca>!>SzG65Gy~9LKSUjG}$2Z z8-*xoGC+$^#ezgOe;55A5W`JsR9T4lUCx)0Y-(t)Y;+Uo1=ZPdYM-F|a$0MiyKd8t zq0aKZa|`+UiaF?u`_;=RXtgSk)w=j^Gac_bbb}ze9*=0mbV{ynXm0Di`R4$%dY_y0 z>N;$yo|?#I7|^|K0<h6J?sfqh=e&XsEgdKQ&1{w2*g!zN&~2z1 z4z)bUA01Hpil$)1nbA1yvK*U`hoFI9tcN4V%$&R7jVGzS(bwbevJ?2 z;Lqsg@;d4(^!M#r3m)k*Jnq_50k`e1wZB!eL|J;^hXgEM9Q%k<5p{Ag zxPI>Z#jPIple-KQyyB9gtZFmke`Sq*A z_Ul)cPLIqBeoh=OvO~vc+>iJ55J+WHDV|6up1-q0=d$`t=P$539z>(i3*3uH50)Y$ zSPx_D8|z%P;sAbb;3}ab?cRLH8GBYvHwE`+S%as(ajNK$Y)C>^C&h6?x?b&bo|j2z z;70b{)|B#c3>?2S6#v7pmbCw2fU9KFPrma>Vbh>hlFl2*<$QEFlOzQ)|v z9zJxC^nIob^~l)V`PXYw1)Qx&E|G5`Qa=k%hpzQu4I+;VzT4y$mX|7T?-{o@8&wX7 zh@S3yWQ>M<_YN&l(09MdG)_fZe%+L5SGpK=!QfMDVZS_ae2zw3(l;tuxaG{de>o|> zv*n`N?gtWg<*$*U$SA?VSGhgJ-3+y3{a~j3LuUECjUTX;o8NNYce(X^v}X2XT$$Og{3Qx%!l1+gelk{12!%8XSRpLZ3A-KQaexG|`sSqb>W{wC?P~vu|iiuMd z)1}68G}rN%(=ITYl9XJwFE=tZlbIml0>)>Y=(fu0_GnjnV1;Kx@H!k(uqQk4ssZ>k zA1-}QJ?!Lc@=`cLORhFBx{R#2?QzZhe-A8LbepO|GZ|WxJAXw#9O3qZPP_!g zfb55uECrb{MawwArV%?mhD=xSKpy0crBi1UT@*x;1U!2owEDH*%9R6?6+$xo0XdWo z^GecrVP(|lBm@F0w1f>1G^Ty}A((V-zj`E?(;!&BE-zv?x=#bgo*B=&$14?FV?FJf zmNt5y<5F;c+HM-{PRb5atm~`=!Bx+iH1~?bn*at7)ltf@-=5);4$UeAIX5QtYUY!& z$DrBWU=-AWiQw!UFnK*aw-zO)gO3K3_>fCJW)3?$uFUxpRetXN<|9_Kiu?~L0_AFsZ2kP$NNT^wsY zUUe?|o|V4a?=*^d*XnH;vO5#9sg&>D`o)w9WY3U&h*y1o!8*IgdRDJ-^7HUfR&JumduCv?FT9|vQ+RW6puNh)~Ej_1sm`=_a-$0idl^D^VGvhQdLrn82!)q=< zRepJEq*vn@B2+B+cPx-uA}X?DQBPA!Yx(Vc{MjJ%@2-#MMAL$`D>}bae?!m?$>*)J z`0#OGoH@M#X(AiB0daE@R@SwPH>9C&hWmGUCJ(|@mdnv5LsL>I^)d7b3bFH9OUbp_ z!c;+k_G5mbIDtLP7ABfeN>NPy;o%*j;H<&^Xh#R z{~gi(eZ1ibayQr51C}zu3&)93ueM`+QQV8@c9O({w?v~ao{em2&+EI62Ub&c79ul8 zo-znXMnT>D=wTvF%HPrz;4+M{&>T->MjbA2BPt-j?qWBd{%bqvTl@wu4XJV`%W`Yn zs@&~yFzl?%7=a662!3^HIS3h18phd(H8NOj%fDy}+7x06;K@7he3%Id^lq&S%#wZ=1s(KZj#!Hjn1JUagfo%L2=>bI==n~EVC z_G(>Yekn@j^n%0WQr+wXLZ|Wq6Hda{Dpu>QULYEH6Qn&!!lgh;#T=7Bl3^z)#9R)R z9>#NZL99rV+`cqbqm?tP&#BB-;`R#0CQMQpurpkx1Ee8QXof6hsA?!aI&jR^MQ7)C z!U0D$Q*4s2=nAKrs$q>#a+bx!m22x#t2(+2ZJtHa3e$Z)O)(c^%blhR9)EXoej;6+ z*|5-KYA(5HBQ-?4fouAu*7*Ik=`rn*xH-;2C-d@^_;@8h)`rOHu6#~wrHO@b;JtcX zmcyprh^~-Y!8ITN%O@-In(w)xB~ED5z&=lhd)l)ZEH`dxMP?PVn#dj~K;VR7n1TT| z5t4^_fh??%_{gN{f{Ig^2%rF)*rHD1#O9^+N85VnXssPk=S4gSr7N*cwGW%eIDsoZ z7%U|UX`q%gL(c6#=^>cMPvZN2^kF&Xjo&Ks7X`ckODA01K2XkU_C@1$;6}c^HhN({ zK#$xFnk7FA{`?^T07^=)0jQli^So!s4AAqhtFw;#ZHF`(yR0J;5GrQtJ1cp}C9q3L z+MJ~rA#m(Qd|1iARcax@mfzTcO;6145RS`PHvVLwu4*a&8B3W zUfyq51fquIQ2Sb)!cRnf)0A*lC-CdHT=<6RsT}{>3?4`~tC6iaJ=MVG_8o&)XPR6d ztfq7S)(kGXI{t&9ueQq=$8$=Y&GfHn=|03VDP&<&qMnWhRnhoL%+)WqFf$e?&8z4eridVYiUd=^}=M z8LIA*-4Uc#Pra9kzxSR#GJ1>P^-`DgJ!Y5z2aIG@yB%>j(U#kzN!Ow|#_QgewRrKi zEvbRpCQvu~rQKkog$0eINg0Yhqwz!M)*+5kpr^tQxvD4nj9uUbb#$M@Ve^W*;` z5|3JJ`9x5vr;2hJDZm5Q!n@JuRzku_^RsH9I z)Kf9-$0RE!OFg9d8^8e(a0&rB@WZ2EA`pL5nIklH^$^WZ_M5cW^x_bW!<@?n54dM9 zDIt@Kk^8ybCb_7$?tB6h>a;^5&yQq>A#7!KZPmGs1Gx)%_pgjD8j8ShKTu*0_!g_= z^x-jN!${@~m_IBY3p$^o>0kDevVP;g-*T0{AC>r`SzT*UQo?<|vwXKL<(dz&R+eRT zXU-F0Zf2tTH8!uEIdJ{lmg`3IGaHkXByoD{kNt~|v{uO9YACy>wRlzY7%wP%X;CZj zl{I}k6R@~*QMjEOhrGmTms%pD_mSa4<`-(f&5-H?IN5NE z6*MiHJNX@PZmhqhZh5BK1j9Pi0#RFteUoNf#hEt|a;{Q$6sqUCi zrCHNp*Y&rqfE_P1yZRh(Ev+m3A0M94<@)9Z5rSGv$YQE;jP^(QIm9{54QFjYYB@sadr7&)#DZi1TCGT@|D%@DEKv;?rjMDzm*{|4J z!1}0Em{K7>Qp4Cn!S&stp@YKXoKM+TyMm3?MiEHE*;7XPXsGnzP@Y&8>r?sXb$V}l z=uaHi^YKV{9EstY(0Z5%2qK>YHG6z}4zvv5J=^1FA5-!ZJp zc?V`lRorLln0U|Z)Hi=fVYkyR(`bc$_@&oak-R;dL9dGRAlA5@Qnkku_-%*_j|1~F zz>Cp;r)dJ_Jn5H21MiW$f7eU}nh*q<-if@(fi!$h9IqBdQCRN=O3@9p{&&e5+P zgifQ+_{7yTX9sev)tl(j?6JU)-q;uN{4K6AYwN4ged;k2al7hj9nwl~yZ&cdadxPw zKa&{7bN7$KcG4FYDV{@LJMStwTL(2|78QTW+}#;fEo7drbsmLS&IS$mgnw|d+85~Z#^~QidvCH3wC9)eucxeG1STMb?AZCvQ5o>(J@rAN`rQ0Bx!4WV?XNV(E2#Ad{Hz+b9(BYdCYdE()BJyPXzRlW6j0+ zXqRm(S8!n0|7SFcWE^?H&JG)^09vvW8@a)^a)pJLAENM@>~w43OO@I@0-W#4d^Ez@ z^Bfeg#6XT%<+%D``YO&H24tMwy7+4U(}@&Q(G<>@@6h$hJ=h9WSq*BcoEDWwT3q7( z)&Gd5ZEry&i2`7Fz_FwaZT@Gb%LXXQRN!C3=YP{R-T##0+e)YL|Ex*}3xdEZ z4+98yH@e_TAN>&C5V_X;pCRw=BK@6<<7QoSvtt_f$QIU)647ZH?Fn2}AtO^1m0qj+ zf4u;%714NXZU5fJc*+&#&mZ-?p?xopM~&r>j|QhIG`8%)+3GQzkEjYLd6_h3>KYqO z-uH`OEb?>%4*(b&!=^_s2c4Pj{lFzl&JS%+N%Kge^X`Ly7vDc(!Y}R{K45~Owrz;%u zHj;>OnHP1V-DX1VFL$7Qx3w48nUnAis`f+Iz5mt7+c|)BY;kfb?S0vck^V4PD?uZk zQ-2#;DJ^mR?{ZXqM?rdhQLEIwGZ9AE&kC_iP4XI*nA%pk^<}}5A4Tg<%Qo|^?fYdR zy^>uKR(b7AQnXio=A8SbVOd&dqYM=mGf7<-Zn`XLC#_fM!u6q{ijFmh!SnJNLug_M z$vmOt5_&B;J!n6%!p2Eg6vyNfs)fj8;u9eiS`3;Mx?Af_SyXA5Hi2=`PP=g|7ke4V z!K3ykrgoezUHF`U2k^QxiYP>xseToORlbu`i~9RhH)=}JP1nO(9$Qb(ak}#C^R9mG zG4UBB|OO7ay@3{J@k76a;t*cxpJ{ z`FGF?dE*9{0mh5(IB@u&Mg%NH*Ro=RZ7U4=FAVw&DO$?d%Y8-V=*6V#gZ^9!*078- zgLr{?A}jBM2Udbv5xdvp%fl!^@~{+efLs$m4e85aN~>Y<>5lTE)@%;`CI~E+KVKXA zdl2LMQ}4V+iq|<%sTcPc-Wmf8bTQ5Zm@=d?AV4Al%8Gw{7Y$H`0jqWyF!|p5D~_z& zLQr2-4l&nD6w%?5&D-f0H4$U*E|@=gEx~8O-r`FYB;aPhf9Zj zTk}doU+7Qd`Ud2eo>lOt)7CYM)*o}xavFIJy@ z?dR1fNH*KSFIrCx*(hOByIKM6E2tm+yS`shK(uE&Bl<2Pi5z* zIgEM|^GZI6(uI_|`4yEa?d^Uiv_VAY{%1G(E256e!nA)9s z55JT6-8(0zdVOvHmL<2|fKP1neDC1gU@XPTNvFVWdk|CAY);1hAoyzTn5B?Oi z?dgBJ(q(Ajt05+NGQI`pPmaQjCICxly>cDsU5XF{0Ir#%y$JXLJ*44tza$t4z*r0Y zyP-aXh!jh~ZHgCm2at8sT9#|D6gw+!0g}o##^BeCdUD7i7q^!Xtl>a&Z18LbW0~wk z-EAE#B|^qw24+xv`kEc^-)XFV$Ldo_J9vj2!odfVrCkaI4TVWxhuX`HA{01O(cHGY zfB5c>^&ryS=3GY+i0Cc9yj0S(gl+`9A+ON(G-Ajs1E%er42>JJAhpft* z6L9DCL_fOeRk-CkV(D@MkAl7m%RUAHWG((~+Z-z3XKo z95@2s%?H76@wW2jp@mE(^&RUWZwhkqNNO)O-26qn)*|j+jb(0(ySHeyhE@j0e3w!2 z0hvho-`y)u3vH{O>oVH+1hedt>=+DL}3l^Xbi=HI zMwk6P#y_`X9LNZcJ}DFT3TVx_KN@w*9i>Q8>%t7YJ^RJtG~}ADYf!@E(u`p+h;_&k zaM8)oV#Lyi>mvo18BOs+T3=B1N zD_w#!42^WBAkF#t{`Wb1pXZz#FT4ryCXVhhj< zLkiH#C<`K$i3>st$P2=i@e3>qSWV>%h!s>r=g4A+qg4&Ex_;oND<~E>{))(GUJ^H|8DbL;QQD7Nl%)r0D(Zlb} z;xU6t1k{VFpUJl1xgE^YP@EK;dpzou#V6^g%aMYci1w7S^0k=9GspPFlP_7@e|g`N ze&k%ow@Kx5F0-v%S}@1|>CZdybAf<&7qG^d;zQ2MRtKA3eYKXvd^5loEPK|ACvor^ zCM>*V&iOrd=S%Mg)_7X}FW&@IMrLdb4&e9Wh2dl(uh z_DAr|kMt#x$xFfz&!Zc=uU~anFFP-nUz|yT=S3v`K%V4>P)MZK?sayL1Gd|smR!!1 z+@O=)BBurn$=J9MhKK8e#M`s;y)8uN&Bm~Im*3G`PS8z9=|am8&E;u+&>5hfez=~v zM^i@IaV(cgn(Ub-9MSvA@U6$44>7`R$;GWP&STXcp5hxn*k&A=X?J@-o-pv$VylMM z5GIYP%;&lZtJ(}}O-ojulz3lTCB=$hVYBnp3EeVVfHPu@&yO_N)F5}ihBW5CHJ zZHz8O9)2RdlC&@;6qhcHbYYP%787ZjoZ1U<6 z$L$Aliuw0xEo8Zv>nEFkX3qPLC+`Q&YH zD8hIjTEKO_m!mG&Fl$T2y`$6O6})u)eS1dCBALpFMhSs(`&Lt0;U zm_M(k??yp8B3UPpXiOIkZzH7Z&BEmwT`nvC1gJ!O0-o>ON);IIlfy#-z;N&p1JdZp z9_)Y9O%#wdb2#0hhRPOPUc6u5ktPBt%&ga+{p0w9MEGc^+{b7bMz%C!u`Tjl?!E}& z^H2`Vh407ZJEhFM6(u>ykX^)s#20QC1=NW!ZnqTX^h^sDhgHfA@!d^nEG}APhMoom z{C1dVng7@LabC@Mf82AWa}kDj37xq0XOgZAGOMr14)YnvlNe7sF_Y01D2=z`=)&Lr z)H3n@kG@O$;A_754P^ZMAg-6)%$C*h)p0~hzPvZOygT!C!|B>>|1-n|9Tpb+uh-k3 z$($CGum#X?;MTcK&MB;8ahr4m&g4P6y@NKu+SV3PH8LVOAJ#p-#DI~y)|qosaM8tc zP0^5LBI@h!t4tGIh0pKJkYM0xz%Pc~El(>OLuI!xetfQ0#&{-Da%J?oyOC;sEeLgZ zX6|@nBMaJP=E8d`2k5EOl=j?Mao{3Y6~$vC_HIB9M6s&9JWg0KMMjFgDhoux>{*f~ z0M3YD@DhHlW74TMb*tZ1vM(;Oem7<(A8%~rz&lW2~!te5+ zg26RpkVdoLtZ6VJm!tu4G--%pWz-vDdbE{~FTCd7<`3p3X*PW{9lO3LDK%tYw) zL0ulqGJ@Nayc3*Ts&tIchV3MYPo7UOO*%f6VYB)5J!@bKd1KPlbK;oS%!0Es8!H|& zFh6((t)tr;-;TVf76!z(t6W@VDnDm--@0+eQX}+5iq{+$@Q%iP+ON;$K&9D=;w<(} z=*{j)f*9ms)>JYe2kDZ68T(8u{H{;~4iO4{wcFK;Tm z#~TL{R_|z>;pk;a%T5HJ8*eDkO4ofW#9NhG^o>wX!+PO{gQ`X0%1;qfN{(os{`lwV zVF9IC^5L?Rzaj}JWigd83$p>rMm3r;3ZW(+gSIa0of5rrYsFSlM#F}rM%%(l7F+(fOs-Eui>figdK4UR zGcF-A;%5t*k{%D*@=Kt##aH7k;!X}s>w{{5d3&ue{0->}csQ9Bp? zn?98#WVK)6WM#}C+Tn+-xbLQwv?4y+Gb@X`hwgZAH=B_eJnEj!R}fFmQSR&hcCbYr z)UotA+Cqk69`u{5$7Zn>9~R`)wDOPp58OI*Qo4psKNI#x3@zQu6ONB5kIDD3J2ZJD zC_eWIyq@nx23AM0(!#T)?S5x6J2AB|CB<-~Y4jHGg+LjG@SiQ5V}1^ULJuh>kPDr9 zjCkuG;nr$SOOx1SC#sf|+H%(s4_UACh!+n8GIQ00J&qCv0iVqmdLZ`o>o@Bjr0q;^ zo))u}tAyF);cmV|CR}<=w^Ck0xOK8e>@=tAe2R2pLL)oi5Bu}w>&?G;_dTSC`Kb9$ zpk38i%=QkU(Rqp4-H|^~*k2eT^{M7uIx}d?8GBinjnjfz91~59 zsjoi29m;9d_Fgzl@v3bv5kNIJaF>o@7=`$EKp4~Tn1olHI{7fMzU<^b?)SbXe!ClZ z<2Ina_in`!t1dE7?TsF0lJGlRF@i6h{Y<;-P19Z&`cU6*b+rkHt&0zd3V5uW7E{O^ z9VWD=%`v=sEPy;!?ibkyo&uTz0wAU<{lqfj#QMqO=csiH;oqS>hHf{y(Ie)?s+xwv z2Ap5NPO0uH{eNyqfRQZqA9OGpYSkY(WAx37YOm_1N2}=#sp|6nZ?yj*Cl}APP~z(j zKODOEKGFjwUef^i?DJy(w)W?SMuYC84oE8Evmc(Fp#LcMp_w^fIN&x{HBv_!)Tqbw ze{7J8b#jN3+c856RYW1}`i0>L0vaq3OO-OU0g)x3@)v;V6!#&^z4uTr5fM-{3lccS z=Z_m>J)oSMEI19YT03)1%Kj999C&I-V&ApM8=;0xUwouYkQfSvinyFpcB9RZLE;J&2kw<^&LgrY@h!V2VNeU&zJ59sK~WFC$^DXg ztK#1xx-#YoQ01YAfUW(c!^ESrM?KAsH2zO#PJ2NbIV~;L5B`QgYZR-)%)MD<&|5jv zRFI4moQq2PEv7uiOhew#^+qn*8c}Eo>RgwBu+v5uIk&^hZ8QKJ{4W z_~`A@)F@pufm|B&OxjBj_eaLIB-ZRZlT3BJmox6yFuJ-;j6XX8f{po4gN0tX*mVmA z#;Zi-oz;N{=Z3siL`_ s-&7n)z;icC-m5zHT&J7VM^5$yW39X(B#0`RZvQetHlg zW7SS7bx&O`N+?fn%0W5X=n-{85!?cnLHUpx5^Q~?zw=^tD4USq#feqUri1>%07avH z$JhlSsIhpMh~Hy+Fo(^zSFt_`Ccw0G?8BgKR_#`za8&*o3H*9fW#%OOs#zaWRmx+j z^Fw8<6>=G#?Wtw&*@@K7-;Dx%<n`2Rg3TY)1o*8idK7?4#@kCr-iB9+eU6b-ZiQFYCGp()=+FJNb; zF-i)lmcK_{gz^E2II^Zt{WzP-Xl@_{{p%@OXRst-t8G#@b10RU$MoIZ0VE*eGP3zp z)_8EB6Bx`;2BHGcw=FXKy+ECss{7s7t z{XK0Ilq@FlHAz@kAcLYQm#4*g2-Jwa%lGgv4?SGnku35qCuX(^4?{^v(wYeFl|3a1 zezr0-S6WuhjS^piQ*bAEaHGW@PG~1(u6AS+g11%`=+t&2$bWRegfG-*1OodYU}FS|Mjnd2<~&L zaI%Y$sTooYJb5**jCx=aU(Y54b&(K|HEL|Mz|N=h19uKO&N*0uPKuo`3eE{lE_Yee zjypFZ{&wE{p12()Ol(~)&lLOgqpef!1S4ve^juCbcR5yaH{k9xI0v)6xF{BFmdm@H ziO-=|Z)@VaOP7T^tG3JgnJ!1xX2z2>N#p2cwzPdqMwnkyUX_|vrn`5wKLcw^9phkY z)%e1KD#tQ1@NGuuWWa7h&%ygPJL73K_|&lZ0QXw^w;^eAkE^}N5SO;sJ83AKLAb?~ zQ-a?>iSy$DKM@l7(s?YbLu0!3U*q1~rCkFiGas4u@V<&OeLS77MO>&sOeLqSG4zR@ z4jG)^B&9RG#Uf@VPQsZ4;ykodm3d^|B@q-51P_gHYGP=*-DJwpqB|;-{TgMHDdtbd zZvJIZv8wP74IwO#RkHu7<33j)R-@zY>NWemW6I{;P$?pNxt#GoUJ+M^?Ju$ks|K^% z;p0ZSt1jQ)+WjBi=`Xi3BLER9a1ZYJO&Knk z27C~xaoE(XuNE?)u#^Np5uz$823;%2y5kyY#Fo7J5I=-aZPhDRQr?qG<(-@CA>hI^ zQ*`}M)j&O&jRVg80*xaH{x{T*xDR>?h+<2Kh+IIV??)msL?DQS1mo6rDAG*<56(Ff zTgP|Y3wk>HsRv0Sl<0v0*kfFQ-wjE*yp`Y0xJt0`dXVVKeiywcnjTPMlo{I8rK!W; z34XMfPk<1%-Y)9Voy`wrbTCR$cretM_A$TMpM~Nqcfzv(YO~7$N?4E93K|nJwSrlt zZf5>|Ne|K`aOD#{3F0%x1O&Ca6BZJar(?SOdCUiC-3<~=Yo_|>Tk|qm>c>Qq(2?PM zpk?RHb#g12B(2;lD!9_0BMNwL#N^A~a>}3OC1_uY)Y*v)4?ky#_zXO}KW&^t?UB?IApo6~08cP?47)+9+pGieMTp%o)qn{Q-bJwqNT^W9` z4$%Hw%4*+B+AvIYaeT^?l)EjJa1$m4A zxk#G`{n5P0|8}8frV90-=#0~1>NRws-6qy5pEQRZV@n#!_*Q-3hbXSK47(59$Fq1h z644~nr8wy9O_Uh6;U2*HvG1OwtM9tq8VV(gyXOfV>KoX zjSLs4Vx=dAR2BVFQg)2Cm1j!LY&>_;X_$L2n}cCUP)^R8zN8GL*!?OymQAw=XjEsi zqqb-}kWZxTMQ#fW&VIzJ1p<)?XzBkl&3@ec26&o5-?V_CM-2>CN2mJi;m7|62l+oh z2;ZRE|J;o2M^r(fKsJbzF);ckLT8F&GX%xOfL(X91O(_)j)MP^m<-tttw| zb@-;3%}*<9~&bL;?|Zl4O8&Yt82xn=t&8IehQDgjD`KzNCgq211x@ zmq5+k!nE+#o5#j5Mjxhk{XJ{+wthtsrmSs_9k!}+EiUN6wwH&a*B0p$n5sv-xRSfi zMaa!6Q-ZynZ7eGJdyy@VfR>s0`3RfJt>)1_WNSZogA5E};(kp3YhBV>1wY>*J-o!CfaVBDhQHxG6_)4QUtkGH zt$T4K+z0PlepQ}Td>1|Pn(a9Dq3=p4`9hjidf1~p-Z45PY=^AvgoZD?r7v)#K*;Wv*@iVFZ zmDTA3zq%%?+RIhu@PaPCz9jBh9?wApl&RphkcW&oMtt-k8oapD&AmI810DH=T=8I_ zH<~_?W5P*xqH=Eh%(ez(lbN^c%a)nRVe7J%p;7aJ-Veo*$7$N)(Gz8m8>pgZVry|& zw(F@>#*Bl~k(xEa*@(va>wPR@;o?Bu`l+)2@q_`>-)X$`UsjnJ4`1iL3e`G8@_OKvHA?0vcZlkOQZ2@ZR zVuW;yG;|OcI@_T!*4PN;F!WXc;NF(UPZfbZF^o1>j3H#>ets%X4L2|gm)I6V2X2%Y zAC$O(_CZgP9b*`@n?n6h3zj@^NUnupkEQ}ej{($P9t%f>q>BOBZ(s;qFg4ny=^j?f zG3y&B&*OiR*vR&Cyjm$%HQ0#-_;S3k1ZC@}wTEkK(v33&d; zE*>Oz^O48qI*~uiK$trNTpht7O96X2A&zAxgDY)gmQS1Eewv6hCZGo6fo-Vl0$MYC z;l3+&Ky>AH9F!~Kugxoter6=5_$yFf^1{G6V5MOKSpQd2`(mPi@DCG^ahJf(haR5> zu&xiLDBhj42n1Fo^djkKUv9-}Xcp!*X$nHlm;Edv-G8qa#XnnQ(YC*X#ownUf2r0# zwQSeCx^So~BS&4CbloK%9TjW6JS`2n6`csYCk5*3J_elfHbjo-;AW^z9nV01Ty@E@-$lUxqZ z)_mb_znN-N3sBn9bdk=joL`c-yU9E=OAR266D2rK3%@rE$h9hPN1LZ8hZAqV<@-x| zD$+VVk}-aCFuXc{*5B8+(R%Rd*malrY3^zR#mvBjxTS5A<3svr2bi_I?CR)6 zW`jF{bilkm6W@aPhHO(5UC-mJ>?z}(%Vf`Czox3gVC`V%Vq*P{A&^%kuPOOXf%p+Z zPCK?CDZLD%h+GaogwWtk{&XA-o}cO)i#l9=kGc=KSc2-OtT&(C_*v%CUek>W1v3~5 z2?k@jbkn=wyA>8w8YbDhWl}UR2=Do9PfUNFcxhs8`@BQBpK2&txCbOilWG0^ZP=IG z*Na-|nJzQ(>ufB7PFXsoZR+(4`yRSK5YGe!xn2hD93CB0WIp*U4_X{% z;nVG5`kk7B-Ef1&7gJw}OrZthKjjxdQ#z!Eh)53|S=we!?y6?Z;SeYp5DXh(uF?at z3X#REK)JF>zU_OjJA1z%3A1Xur#Ew$tkX_`dG1T2f%{y+v$ZlgJ)r#eidEw5y1o0b zRP6=i`#Q!ZL=+T0ZwcN6d=flPzp2BZ@*OBC9b1xBnCJDYW=kR$fl8<589E5|HSQ3g z&pyNS)hDntt;}Hzg|Z=`wI`%d;B)yl6Av~|2#?XS6@Z+#ae6wpV!<~JbDoGP#4*Rb4z!WH`~T`@YIhf_CRr!{lz+3l4_ftkXbYrbW{VHrOrJ0VeztbOglP{wGE zoCw_4sZ7+nDQtmRWaFG#DZ3!cMBi|b5qxyj>hNcA4*m`Q{%Kj9Pa<|~H($%WJ7$OL zX)^&{G)e}4EL}Q4pH6TZ?AWq(ZWv@{7C>f_W>zOB# z4~*2MKSK!bU32;CEN%nf&6VlwToR={klQo$bh}j+;i&8_S0t)nAnVCw%M6vEL{7Dl zmN39M&CFa)D>Y*RPzLy)h+uqZU|du2-kINoL@RMUpw!LRQ9htAB!G15^ME69A4s~t zOp|+fiJ!52gbqIU{(A^?+*%;WoC4!YP)H^9^XsD$}}=OpaB3IxXoBiK_ziGI7`@-w=I|^r^AGOz7U%2bvo^kV1sQwmGhKg!#v9^7elIp zq2q2{>@ZJ8{nirI@sof#TysA5{Rh~#@o;ZfAxGh$bKp9`(M7!}rRJUx7Tyf{;&*2~ zvs{Y|b2Mt|pYzVr+xI`5gKo|+E7Q^+u1y|JHXrW0?hhSmT9>7-rkAsR*u2w+wlQEQ zIIE<|j0x90D4$&~kfK^WjJG!aW{q5VzQ7^1wpVUBMCP5zG5JGghCH|W+y<|&=Q=C~ zV}AMaIKC9kp!>B*wHxsRn0H28lh{p51m@qmu zq`C!8FyKdi_T7PF6jb&a(cG)^#UN646{c5*netdV*>20+rPcv6E#RJ2hU?kb{ zhr)CQL(4W`2rv9Wd8170@m);n0HJV0eECmIu${d=(6lk2a3O+6uEEt|!t_l5MyZtO zlRruqp?cN~rTnGZ4T@W{ikjLqbI|L}fB^f{UOfd|5Dm`_$fR7`Cq9&f5L3K>LE>Ba zb9<1m7qS#D5|8rV%)y-D^()j?8PIyTp-v>mj({REx$6UXb=9LmdxB->m$(J{4zKAR zv*icKbm+Yn@~G!Nvw7q-1tfm^5rVDOSWRNE7etD-tcDu4a$hpB&g?^mx-Vqx81i+| z>+0FRHtP2eg?Xw--!!KiYrTALgE-Q!R$up?s!Rs0elA+^O`AjAev`gF&^?sW!`c?V zQ_a_Blx(&Qx*m|ebgqy4PN>!`6oq~Cwu6${fCk(Gnah;_q>@0~O&=B>lt_v@xH#i` zwE3%*5my*ZYgI#oaPD2(9IvA{G-uJnf5c_^it3OAmu{??QU)n8B8^qX<7o3bIz3d- z>W;fDGVL#+%)!gdoz|<5(5OREoN%o(FjB(@FT9xzilvTh&RPEK_%nSJKQ#MkFZ91XK;%so@x|)$yX1% zzn~Ml`>P?vigup#gh(Js2S~L9u$#hX0_IS6mARz?`8Y31h5C`@gu&Q*vzD~i(RfAIE^(yxs(*^#P*M5Wg=1D)jVk2CT6P0(;3-PM6_A2R9IG5;<3O zyKK*IOwA&#z2T$_35r)XKq{Gkh$O`2hGh04g+Wj?GY4DRzrAm~PJKMHW}bn`FB5hgdmP-=9j~EtRs(?BDP{ zOn2Qc)l^m(V2hzC7zuS5pHvOKT$P!vqv0~N^K;K`VUsk*XFR+#9LOBdq^3G_{(Z`2 z@Hh(7ae&z#;ru?Zn!GEq+^b&GX~;mNnk`^p#8)HJugRP4sw9pOa%iAxx+b-S6qk_* z(}|tu-H|ZyUi5S&9kd@p8z!08;B;0ooMsLnp}`4y``d@ z0Mk&kHHKGV%9y=g zk1-BB+l-Z42xwLKE70;b?^9@HB~*T}wef-7>cgf%Q)@2pD#NlLHwjlcpiW;Bfwu%l zjrL^)vB3kv^gqYSotq}KTDZ$T^@2n>X4K1dwCLbUb9IQUK_@zH-#gT5O|B-YB6^(+ za3yDLSlV~W!G!US1uewLAUwMxI~Pu-dsA(f6p-_m83rT_bZ}op0zJIHh)yJ}wM3-p zmjjdbhc64k+>uZxRoDU%oHuRqnmZIq=u0z@(##bN>=siQ2|)+0{^`Bqq-dW8_s6i5 z&c>YE7yXa?mTy;iJtUs{+_E!DYP5K3u<`i(-a=UoWgDN-N}jvt{|;D9OPNGv^rl#C zWa{%AZAHTWcyC;;^C!9TUR}L~xUh5bNUQHCx-_5gMcw#y3$V0+x2gE*@3Euh(>R7q z2yad^e%P(FldNp+Wi-&Msh;PI#FnZZJM)aj@0gJ2Pm@WeNX3fL@Jh?|hPN5(ChAGf zqe<{Yb`eeq23&%=6R=(I>XZtPl5*W5AVJ)iZI6Qwx*oT`YRJ>!o;~mNfyA2`Rwi5U z9%>;>A~3J1KVbMP1y5Mp_{r>2-5YVoQa4W@YOD|8x#N( z2xPbXKrdn$dd@srg{}86fN%8Gg~S&@Jy@L8ShR=rC!I03~*3U*<3H*%^ux8Hm%9JeOBMGUwmnQQ(?LD z>|wE2=9xEix-v;(@)Ir}y+bw2#&xvx16P&vyT%h;!O4NUWJNNLSGwMhQyb~N9CcC7 zgt`X;X!pc2Dbo?|>r$|s&PT&`c8j z@?>6@QW8Lt>K}s3D~iD;>F512%xa5Lq}4#`U%dpSw|dpG>!UNd*zWH(2h3d5MM6c1 zOzc2Bw(O+rU^5}5z22luAsegny*PKZ}<1$ueoW{H;0Hz06T1*|i5 zT5{N|l`GY?Y9x4*2(>oRingC>4FshNEDu!OchLS7m?_(T&f@ z_=EG>l5Kl8PT~Vjvw8HqDnBI@vf9X5Ayl?2O_~9X8EccZata3upE0#?-x7EKaub7q zOCn9Vg1I4$)BT{2bDuqPRJ)Pot>-SLKk*X!K*bA2CDaglPdsHnIr3HVBN`d7HFqC& ze>B5X<*FoYPsgIaH@vcl=>`ScOb%qESylcNB>}$+q_Iv>4f{+7@kAN|de>1UQXFvV zx-5(V?i;YNfLF?j0S-XnixfN~W%(Em6+2$-fAKC;iWS0BM>5<4;*AolG~GkJ^M_rD zWs#5djpV_EHF>T>l>UZXcdt2YyDk2 z6Zg|;!9jz-02HZdHKuz_$%0#1o89E6wn;6;aP(hGMCwH4!w0{eiu zM@+y>57z<2Pt-;a&lFM?GBvM@QO1?y3I}~}CIY<|MiIjFIrIXq1CZbZl0rI;e&T|x%|vFGjC<9)O4ov^6`eQ^QG_KXp{eqM-WJ5 zuhwZwFSBR%u=^nX8{UJ}d#@=Xcwndoe>d_!Ac7QpK9X^+Gtk~unBg9 zu*r!8wEb)iFu*$Ga267Lp|p_rBu;Z_a}d>X$n z^d5op@A(0Xx`5Mu5_K?CY-H?;Mh|Y`$kj#-&v265s)F5}{(z-#4P;Ftp1+Rq9s@oa zHd~0~9wcJm1xw!soEq+iYE6eqOS?WQN)24(MGw(L4!r&SVVHqFqm>ND{49H(F5Vf* zKmbqhwEX>i>q9QF(r_TtC>{BSN&Yj@ptIZq@6NOHhd{ltgf|QiL%8`?gltGs3y(f8 z)|B9E*-u~GPXLYSLCtL7E8Zj9vqa+QlE7moXmD?(c`n1J@Q%X; zVoNqpsuf8?UOJK0!xg*D#?r=GSs3Dql^6_2CqTRI#v_C)G#R+6re>DdZ;Y;#FY( z#M8s&0x_2}mqip&mPzq){RLIIEZ{sAkwBlBoC+SzKP=M8ZKx_=d$|i=RH___U)qf{ z@e(%KrM>?eFf?-{wMzBwS-$gfYS%Ruo-ER=QzPk|wMJgO0Ql1=Ptu3wusHvD>O-k? z+Q0#KVD$*CmY5w{@ zFmlez!y;PqMtdHGR+gzJ4vXim2FyU+k_aRsSWy`jGh2c6^(i%w23$+G!H`!12=%&z zu)#i6v(B-)9hcH8KkzDtL*gf}6`%BDkBj_swr< zkM4Td6J=?K^9`VIy#m-jlgj4G+>SLL_lK;mbu6@SwE=RJt!uUqwLcc zXIc@KH#G*Bto1H(=sSDFRB(o7N+_6vw$hye>Uz|+vM^sdelO#Gu=d`cYF7_xps!}Q z6Z}2lhVg#>@3QjWo}Bnq>6^3VyEmfglnfdeYEqPkuBt?H3MK={Th}?>$%_BmEud)57PA)q7$GTwL3EwwwD(+xPky`zTBJ8rK=5=zDWI$io%lCxZ&OMwKhM+M`LU&?i zp6{NDnhqICsP?bqaq zCSWhV07-qkHO!L=;0z|z$N$HP%&@ah`lftKV%NxfMM9GI`ljXb|3TN%HhlYcrA?>J@dLJDZFx3*K3b)Qc3;Qe?}3wgIA z_UAYI1ox7gV~YVj1snq@KG9=$BbiW@vi^#Mx~8$HYTonq%ax8(`5dm))^z)s=HF4;+>$r4cBBcWh;{mvg9k8oj?vVDb&yh~jL zv!++)s1j!Xu0iUUj{C z#h}%Hb>Pl4pk19=^HJ@LV)mCe%qWdi|x{kK>ru1?zfsT!b?0%zW{*aju^{$_{J8xFgBSz|1Uc@OX`B z4y?unpYQ0z++S}HhQBp#P8`Y>CQ=Q9p^yW}i3zpd+0F-3h@LKK^6wvf7~E5mA<(v&ho+d8Gt*m&k2Zgb4E z_aD#qzh*j_-MAeIplwpdbpLO#Z8_)!=)+O^bK$<@#Bd7MB|d{&RTD!x9ED6A(>kk^ zO#td+!2SsfPXz*CKFV5&pEmVS(ISXpI)6-m6Yz*YtoYN+nV&>JS;&BtT?rmcNIJUl zQ)N+iw*7451R!xzW9l(y#4jQmf_JQ=_C#EJQYI>ubD1*9mtC}nfMQexGAEM-VZC(N?QRuq%pKi0+ zXu`xlI;xV|m_%x>^Df*wiUGoKwkBDpdx~%!vr*eNbPU-~^bY)BA4!uDQN8jv10f}= zp3#;&-zEbRXE?dIdGOENw{WE|k(tZa7kyN?ntQhEr9pq@C$z2%BB$bI}EqI7RudkQ{W;-ntamIdnR6=nqE7@JcyUsz6Uj~4or?|oTi*q`7oPx zc^#>>+|`t}+y)q~XTSv-QyE4px4Cc@BjN7IDu+{5)2(ax^i>C;N8OQ*`?=;d_dApM ziR+J5EgqjRG`RvYI_RQFUWioS-s+WyxP?{Mx`8Ta-Gz|OMRy8WS99lLWy{ti`z5Bf zt9}B?^fFbi@0bV0dlpaHE;FiJ7O~}(2006s>Yv#aB#x+VmjUng3T3#`cNq|nrCR<8 zhpI;q9n_oPx5AlZP_P@LZIoMXa5TAUm|Y<^(z-J)vFlMOzH1*plB?uiZL%F%(@NV} z?R-VM2wLg`Ej`qRR9#X7i^sFBjaNg`nE$vux^(~T9+2cs%gVErooUA50kq@Goo8G=fB$w3wF2sC6XE|s-Rgz1P2i&@UfC^zlu#Qg9d>9fMA#K9(ZP&pG;koZ zV~(pe7-)tP;rw+9e`?6#YRbipA`t1)eEF{}6)jTA0OmphZnUDbMLdO?v!m_yfj+{X zeCB?;*bJS{(#3^LUrP?zb0RRSS{KjKzurVjZNAo@}lQX;Jks1x@rzGuH_ zojRB&{Lyn48eX>tTG$eU)hDaUfCCjuf?Ps%?}W7e&QU0og(DcM=uD|pOf?Sh zFH@ZDo;w@z)d5T~YN%6v!xJg9a>H~Y5RuTwc)#9sTKo1WnJoEspD%C%1Da*wuTkwM zz|7gjkbOE{X)$|x!|gkNdgfGBe?bKvv^Q}te+4wF z`#Sa~)O$m|xr*ni_WU_kVT>(prK_VvD7=1K%m6pPt&aARGbH>#tl21oC@N-7QL?jZG7(v{cK>;*PpUs3-yh~4@bmDp zV*b?gPI$=+?6Y-qbj;(lA;v%`rNo$t$Pw-xvN~2VZu=s$r;?z)2|J&~1D^;44+L45 z?p+iXT&1_)40eN@csDBNn?BbV1it6siQlY@`BSW!{X|GNUdmY|pJRJ0;;^VbxH7c5 zo4(=7*bd4S3VIFEp`BtfEA}1d;Kqa?*kC&EV4l(Q1S4{uE^LzB$Xdx2Ih@z%)U^t_m4myu#{TfB%xt4_<>LoeH2J_sW*%>L9NSu!WoVMLn9o*nEO2hhQXkg%II)6@< zV5u$xJaQG@>bq{_SB~w%_JB0N--I=JgL34*=)T7=7>8x2c9j&ki+s zd{_GN`3dQzQ4dIymF>96j@&H#Bfg(&I5kl}?rn+iD zfzH=U#VBsb`GP)gz)%l>pH0Q`#WKT0YsAbu2NlmIS2$sAM6_32{e)NpxApmVhqN0~ zmww9+{Xq}NCPtAKx2R8;&pILvY97JpJ$xo)1SVPAJwB3 zS%^#AK^WA{3C;}J@D=W%(1X`^^Yi;;kXHp4uRCiywK7_?I`&;(46E&YNXkRsxM@u1 zJxY+q(cfah$hLvv*8Kd~i^&w%^TT#d%0=XSG5?!YlJMPPe%Mr9x$lLT2Bkt?6OW*N z9f=E~nK+B7k{@_xvzWL(yph3`!x5w|G*O($s`LI&S-(i?Ohkfzq3d~Hf=Zr^rJ)dC8=Zx!!Snp%?`|K@Kfp2<16as{2^ z2PaA&GVf7jB4m(ShQQMs_1`FKE@Z~phC=}i894YvAP2j+r|~)TL30bkx=qd}^SV4| ziUU)&fj@0C60S65ziAqz{Xc9+(H@bDPJaqO*~NKQBC{hRB7Vy2j`e;GXBO-MxtTdM zqU$mZ#Pf516qi#Rk$Vyx0?EK0CW4Qz!eiD1kxTCpKoE!y#ixWG(Dy1Z5cdUcN_ZmB z1KQ|88;Ceb`V6Fl#2?bZIa#v$K(4=Cm?3OW;D53T2<97~?;){)XWRKA)DK(Uv~QOm zn@tOr-jft}4uH_|Orm9(nBcW}R_4rZlt6T!zR-dMPD;{LJTYV zZCNGsO+lj|%D$ymJq>_5LjT-~-Qmo|_93wkhR_TbRe|W>Cnsy#Q50ZuMhFjtCk6Z1 zyFB(g0w(-T>sT?O7#Q(VizGJQaQ9VReS5?;r=?vc+g5+)Kr^5}{N&TIpy#8;1Gey0 zRLy44>JmMp8NiGgMaKNZCtO1VTU_1+oiEP6NpymH7j1B52Hi~eIJ(%&H}L)Jvw!J* zbvnQ!)RMy2=w{^MgyYMNu07xir-(fYgtx1kO7yq79ElQdw5AQ5_`4h8&jhDnIu9JiHA5a(uPMV0q}qX``)He@jM)NDf*zgsLj^6)@TtNU-z_uM(=aWLqnA z4X(m?&hq%r*k>I5jH+K~Q)ssQdi9(edesC!0e{ADhZPqv+SOd|jgl*5b-sDdPi>U! zP#7F$9~xF3e$`pr5cB+%=iqtAa~IM1d!%OR`26rumu=@iJmaxHhX3(x%Vm-$^}|1Y zMDHIp?Ur`BKJ<9vZx|t%Q96hfm~43d@Uj8yd}cA?_%Qow6&-++r!t@HWYV8y9;i_& z;=nnlw$b-CzeoUg-}l@<)nW0TTybh<0xmj_>|n6DBnHz;B=GM%VaC+sL5b_ZIDdTQ z*RM|K{^@o@1DLuXKxye2tnu{F`4<`(Dzbk|0Xb-^opUprwk@O$wh{p5`v4uU-;sVU zmv&MBpxKBPQM2K>`uHqF;3#Jfl=%LljoBWWRWh9AoF~)fj%_6o6Z{Mbwb1RY{}=|C zW<3-~&Z4ZB>pb0_&{MJ`&zjetg&}*V+m!}Z8U)52BWJ@9%l$dB<_a8UJ8lZmzxVb3W%BB2(*WwR8&-pWerLc1{mIBkJgldAw%}X`)v6?9|V$JK8Sb zqCKT2Bf+Qn8-v*0n{OKp9-kkWsvn4*vLGnQC@AY6VS@P2I?f2IclAWXDhFqHGgmzm zg-^(;k;69w^M%Z_Q1NGA?5TJvw_$;4L`j=?$7gj_~HJBPseMlJOh)A&p|fB%55 zu%vW>n{ugOo+1IfH*N?|u~zv%Oc8LFUH76g$$Ab9N@cvo4Y)wJle>k2prI@C=;4G0 zYo+BM{%Zkfrf)H?5Op4;aJJXq5iiVsr4_FNhN67hakJV)wXoFh!W4Mf<62=_&qs4@ zKY=&R2gm6%uIiOQA!IC1)zR-gTVfXoEnCgL9FOZGsivoE0+TK78)B+bIbL}%Y8WpM zo8N_%Ak0K;!{0F_x_hLVxlE)!|H%f%pg4E7$)KQ+|8$O!%hg||OfeCV+eEtp_wV+1 zr%apg!kvQ~hG=G_l-Q1hT|P1Us*feF&k}Bm6FG0Ua`C0@$g>Q=oe{Z*^sp$Ty61Zl z!6Z>T%wMd;ljP)MX0tr!>fvoSP^mxWg&pD;G~?9|HWbo}elrMne(Sk=ySZyy=G|5fi$ug>l5=AmfWBNg3+9?Vd!PnL$cPr|iCj`q{lk+?V&v8(h-aAA-4p&lON8D& ztU{q+Bu{cPwDcJqm{cS;`Gm4Zz@Gdqt#^UPt$~2@F*;yx?nBjMy~h$n5XO&IWmfX` zJW$>yMM)IMuS}O&&Ooc3p%U16LFY}?kg+z;T_QZ)e5LB0Sb0d5RRA-r<*_*^Eu1bq z9|V={a^eK0n&ZBMpi1|jcSAwSP|WBQn&i#hn(_Qo6JlUnz=ce^!ld{IT&mH-^XLWp zJIX;YyHkVI7t?JebjGn8ntKynC=Jtaj7V-rx$=ygI5o!==ko&G&K`+d2z*+@io!6; zh6i$Qxt=yGr6COt5d2TpfMO>zdhBEzpw@Jh506y@Hmt|8a*uxKw>Da0>z$~}>(660 z*t&*HQ*I@gmbpRBqth2_8;?DxCwMlyWU1#53o~niy!;;Vm+M@*7EQziZ{?33sy}ZN zK2t(rDdOOr_rGbq>xMW77Pda>Hch`?Vr#vd3ns2qiIPwbxE@E;nT;$As>uzgaRc`^ z`n<5w1~5tRM|D(5dMI7`;#gPbj-_&7_VN@-@$Fv!fx2pgx|KOwA5(6r9bc@mlMT}s zxy6nYwPu@$OA}rUb{-2}^@G--%eA%uzLcDd!512)*NsV0U!i@Xwf^;qo?2qCNrN#{ zZfP^+hnrQ%mjS&&f@$J5FjbH>W+NxRktaQzigP&i#g_yn>9NZKi(;Id6Q1G0Azqga z$LG_s4IBvO-%wO8>F-z91E$l7g@PJ^zt}++fepEYX^y556b+6O#m5?jnMllN z3>YBZqAMoOUn}HUW691Dex< z$glu=B*8hDi>>)gYkyfkY$rYd)3_9TE{O|aGxZDz{A$Q2q~3M?4H`5p7(6W)3(RHw zo;yL6Pi)1MQn3DmFWw6E!1QM1Q1%|2#*F9zI@qh3>bk8CYuXU_BY_$bAA-RF*GD66 zBmIigzsUufusXwWaAELf@>JhBuy>c#Up0eh>|AXsD@SPx=F=eKx46DmI29msjDYM= z4O1)>g!L1Ond@2wZkZ4Yj&|7DJs3Y71|B`dRbRp-+9{5VZlQ<7I}SJo44&?RSc%1fd)-7wBh=(?&_2zM?(sTbX7&! zru670`=U6Eyf*2J0#)OE7S#2O3-7JY7Ow ztoj5CJ*Ux?B7C@R)$1II1&6iL$?>PBvU)+M)Fp~m1qY4yn!?K+P^yi_n-|8HE8xo} z+P$e8#)S=U7vA@SlYx^~Zdz5f@rVKrzluFP$_$gr>$=RSub4{0=o-u6Hgkak9{M4; z?}rfU$-~~Kzrl|k2`nES(Z-TXHfj9AHW99+HBzrSp*7N9awCgtPa>>u{l#$O8^1|? zp?Skjv*t??nUp8g0;UOk6}s7+a1dNAlMo0AX&uQlO?fo*uG%k=wm>N2a(;CoLvNIL zG$s$f@26!UfM$LtKq#_BC#xv^;1<{oi!3Y}wkG_{RIs)6da|H^!|Gi%n0Chg5!^|y zm|r(~F#ERJ;XKmmytHWvbD84Y1aFRpH{Y#5d~eTPDGdd~%k4lHNm;8W{Wrdc04(nS z%(%dPPTf0{+s6S_7iSHx#XZ@Y&$JU~*s<|l!0Q9zRM8KRL- z^BQDf**y{?Z(oMJ_kW{pdS{G-Uu?lVlV5M5bcG8Fhu?cA%>aux@cROM?X7#NUxaYo z9iWw!g$UuI{aQvkCq7Duf7uVoXn1QYwiW#LEE;aw_6nhw>Wu(jUG9% z8z_~T`28H+2unyRr{{H}1>VVQHZ;B}^&%ULNCwv{4yWq;pP?oGYFD>@cIP{)jOB&C z$b9`Z$=r_Z6{^$0yv!u%^ts0EQu9PzRbcC!!ywA^=#@LDz3u9(&AoD-F!%-|+O&9g zv)EiWeh5&V^BW6qTnRlw9K)%0Sx0KFnxRN`0e{OZLf1kTtm11wz0cv z#J7no>audZXVw_kP)9&qSd`!Xz&P)O zv#rdAm68^7Xn9f-P}BF-47*v1vbr<8U2|OI@#z+YUz9NpL_iM!Q*%Dvvt;$e7l?dF zbu=7a{y(}{+vuf%icp>em7hA;9^V$*j{Tlx;ev($uCUUN8Qduu&9YKIbg70hN>g3Y zZ#+aqW9los^a$)d;pmxPQYPF;8ozFARx8=Mg$ytWj<25w-|qiEeeL!KCENKY$=R1Z z?3l-#;tKzS;W_5?E|kqZ*bRd;>;_2gF9IU)U2yJT{y&m<;a%$%)WPDmLPX8%lrQ3y zu+hvyyvvmR=FrA4;~Nybpw|G-N=oW2)qw&=w=?3D$)Hudkl$S>`w;kYC)k3^&K!h$ zul>**^rwTXH(4NoDh%G31cHvM0rM4hT{falWuBN9JvpA;1e!G({)9+vU`N)N?hGNk zuEs!Jrb&w($Bk2?jSwbC|Lii1-Qgr#@bmXqJdzpaeW-NT5duIm4sn?Kw(k>#lMo_% zVC+XJKq<#7#N-Zp1Mx2>Xj8ltEIT&zqGZE3z3x*qd}%%EXvqap7wy7GTv_GY`y}(% zK-jOZm*RhoX>4BLyGk8?t_>rvGb4k1T4cG088_(!W4&^{LUo~5o@+CmsIq)_Ew{gA zPImOBa-BUKtN;LL*|x3_&PJzRUEv@TCWvU0*Hk+y?mpb&p{mTlOVc7%wLh28Kv1dI zHe!9`F|#)Mv7l|{K@D}PfY*WEduDD6FQ@b34@m~?XUqVU))=dN#i zQpVey+HJ?ZXTW2q#K^a}j!9?pyV1IjM+izdSO;Wg z6FrS|IQqET|MI2bg+Bp7(RtR1TUcZ40FKFC``A|AR&L^b9*0G@5$@BcAaPeiJIhpc-VjW zBw(Gk&F4~g|F^Qw>5xH94m(D5H~gQZwwwF|k<5aQNx+u6WyXcn6Chi!t`=9@oMlp# zMOiUBco5(G+W&kE?N2H6J@JUzf{|Zkn!078-z9z*Fi+ZfjDCw3E(?WQ@)#NZn34Ne zOPai+1b|~nRt`_-V3F8yz-X;8n#7y{qEVhD4$I!sI4a~p+h;JDmt7p05Q8Qmf1UzB z*&8h6ucc|0xnU^i&B429WOFOIZkCGWP$O;5uBK$l+TVg$QVBv12pfMJ8PabyjT$X+ zObg>D!uMr)GqKzs3g5P|TCx3@sMQ(3Uo?(}5FoWXW8QM$IoL=B8=}>~#4M;(d1h2)KN9cJ&S1Z~MAh^MULyd#wUkJ}*85yOO-} zg}mj90Bn~Ww!b)rB#cO7i7fWHYqdmu_ih zUUAg|?1_y8bo^CF;Wd-86vI!r<#O8hPrs#<>exC${IV8=rgf9A%h>MLTRdB?ii1!2 zb8-E7Dj(-b@udeX4*tUa7NVXSCZR6(d;hSv)9E944A+ooRLodrPT6PXy}cHqnA~6gN!IEx(et2+U1j8~ z$L96jNCmT3rU{l|c(f1ivGKE48Vy=JBog_5%7tzc9V1(xvSWBaS}E^(lW_EK*1qgL z6)n=i@ms&lyLgx3zdnpTsdXoF&Jt3n)klKdOOLu$ba+bU!%ONvvg~m>&4xyQS!_*R z;3SHAI%GEY*>m+u+LD%zBg&Pw9Q$|Tf(b%}u!;v5Tqa2Ec;0P^Kammw*G6-{g5d1j z|E-zkz)>Nu?L8q<;P2h>pJeP-+_>YIZ{`Ky@tWgn4dAK8F|+2tu2i#@CCvPzpx;7= z7pKw}Wp6^LELoqf0(lR&Z8x@EuQzTq%5#foV&p?SNTykTQ^Hg9z%0na|-Ao0l<)5JM1?QBIoDK!?}Ga|Q&U6c03$&yGd+3OU@pik|o7-X|jg@J*}& zbBuvK8`^%75(kfM`F!68E1MWCv8hJ_@x^(S<{(J0oqOnC?1oQWZ@>i z9R!p9P%34bcLysoigsdIyKkK(XXv-Zi@}n=>oKT*@N}T$FXvN;REL7L-5(O10z@5w zFDWmi=0J@e5RVIpve-;Js{tPza4&!ol@qHJo}1~d-g!C=$CeS1#$1i z_sPZKp%=}VKh1JJHG6OFj)NL0TU#4oL5E3f0fGT%!K3SKyuH3ssr_T|yFb&yImZr9 z_txITVwF@?d^l@ZJzHpr;!k(q^HK6I@bJpp&g8>P+4%&SYP>dxIbIut@*3`(Zf~3! zNDi*QTRb@}m4jiY8qM@zV>H`O^tLP?2V~YE=dA?BqlYSf{t7Q__t40GvKir~j`CM$!2u$NgLeK4ld0O#x>r^@!~Y(hYWvRBk;vl|T?D3-Lw9SVL~tv4?t zi#)<^d~Ii)ILQo`^pokO|VJu;ViNrh(74mPa+iB&AtX~rb2a@za zdbN+fv(}b^v`?b=>=T86UW=_!w<(Xy*Piq?rA<=BfCd4ts5~yLxTp@alSjd?yLR9K z`{xZ2?4Z#7)vkM%()|a6nftXqpM$OciN65Y^=6+Km_wVS#2el?v~vfUwfM#^w%Vuj zH&P=_xeNILXKuit&Qv$Mwm{VK9nz^i+ZGoBncuX}m$+A!?9pvRDjyzcrN}f82G5Fy zOUDbQd>=ql%^>tt@BBBrS@h^&bxRZF55S$^R}YtWUtJ<53mOofqm$ycRRuF2{x1tq zZsSCytfE5%Aq361viuVsh=_5nzJCSuGp~H|nr01TdL8=+Z*!0RHl*I@CbbjnHK`Ih zY&(Z~+v^iBZOk&-N=9n;R?Bm|c2eJ#R zA2*Jhkg_bVvr8T3i1?wwgrS+Bk4G>aj^Z~3lug&=DnvJM7yax=xcXIE5V^9r7ij;p zuwHEn-uYSZt>m4LuP1LgYyH4d-yp8=TBC*c6P55TD zr$Ltf&qY&p@fK%I!a^kRz=R;0hpN;bP3~6n5if(6E zyu}a8}IhS52PThn<2FYtLbXEju zsn9XQ5(?VYd0Rx<(eF;@{By%E$F(#DcnmpS7T}xrVHuX-e!nNr89^5YX6IF5!eIoV z7CzJFXPUn@uOqB9uOO}s2Mf2?!AhAXn#jPmlAgc8Ti@nk6*I9%rT)|ZPx`%nb@jP& zF`FF&9N~d6#W-32ZVr|I-5d(z5T5t9!Yy%qE){*RuRoy?b%4|x4EaAv{jJCVshq_(|aIyROrnNlR2x1_~6kk)B$EPcj!(ggw)|e>>}W5 ze(IxGK-C7WhHte2kUf%`s9DbGbo=U{_=5q4A3_CV_2}yWvuQ;w$67-%LygI--|fb_ z{yZa)sYXoNGs_7%Vah+wE8{T(ID7P;Kh13Pu%bDlUJnm*hw_I{RTzlxF=f}dl0Pl4 z8h|>iwoDZ;LzCX(KrGsQwu_%p*an1mH>)pEcZVdVQis7C#OknsO0HJQ;U?!SMB z&vl+2DCt1Yn6-;{VCFmdp616qZmijUVh(|+axz)hj34S`Y+5<k)JT$ zZV#CeRO6teLvRh19l*P?M?{8p?|Wl3*;%Pi1Px0<)6&WT5m;C**^3HS=antzkYwmK zL-oD=k9l4S+N7%FDFjALV`H`&@T~&4i0wuBF481FxdI?Zoa%&ZE}N$h>38%m{u6s& zC!Y9H8p?Jm`$YXaXm675*-H1fBm=@&Uo;B;Y`P{_oeU|$U%`vM{9gcHbg0Q;J(ln~ zxn5O$w%18-0O(b&tsTuIomZV|qIx>Utj#LKScalT+FQ(TwS%Dt<_>G^U`A+JloG(< z*xDa52%zB7>@Qp)zO@F~O*C}4ZiH2#Wf$BrFNLt?yHJTBXs~-A1%#JWiEWqSL%Gc* zBWvGZTj|ITA{2k%I=+=J*c>5x*q4>w59w$Z-}B(;a(+ zFKoGr731tTJ+bF)>Q%lnBKRrf%ZK9m1n+fI@VgyuMiIkqJ|?a`yAKD@IC#VEU1!pQ z?BfAlnJtRhOC5o!Z&ySn>TsjbwG?>%+*0{{H?ud(^;f<>s8fW&1?pDfS%87P;NTa_ z3rQ^}9-pe}K*8d6sNDD&&Q@eE{+KpUwl+(RC)^#I-RcOu5EDE*u4*{Oul6n3)UhXr zK%kmC!WC+J!_I1qe-rVo_OufeYwcLA4RKnDJ@}=eWM}bT{U3d}>Gv4H*Z!QHAM{|j z#jJu7pIUgH{`36QkA8|FkrTKeb^KZSx~Wcg?{fp=PfUAu*#U=F?pN8}1^ReB`_b)e z@+#?plo>4}jIdmud;!8!pWyYzZEZHOE#a2)s#l4c7i{=`J0#V~7)>yizp=$}Ne<695I_7Cn`mkuTH(IGnU(u+ z_4;#8LmN6H-|`6-ThRH} z|Bn02xpB^(q%2FCE7TJ_Na!0x;NB7uJ&)(&oR1!u*tOcO*{?GzQ0EGhpP%G9Nnk!UjsbMCwJON zLIj1%NFj_F*s7i2oH48^CSj}@1#ntVWAe_sdoGijq|c(@>%`B_SEQohNe}W1;b(Y& z83>ZyQZnd<$zvx{Dy<+qMcz;&8VHcjsSsiw5XN~T<*3iqF!GpW;CN>(+f2mku<((w z2wV#}82vc@NuQ6tX7V^G8XJnP3IqY7lEd@l!%F$$b4X0iBE$Wu<)1i9#xf=W+X257|5!fe6QfO?Li*&if zr!+f_VIzGxHJ8{t5$R$#wDDa=lWj?vW>%tUH4pCjh-HXj13k&>8}u^xRf0Oe+LaLP z*R-AgKB}qNN{im+AdpZ5eu0vS$L{F{a zgwH_j&Z)Sv@~enq^=|JipZw9+0^Q#0M$bIGQ}oCcIa}}Nqr%nRN{=j8EyggXxza1b~!fGjlQaqzqe`8o&8IfJH?QwPF zE6Z+al5VZ2e?(s+b<)ccS~xAv6)xBYVg@cSi}3Z|wHOw%yg1kt(=ayopS4Micjg^+H&~y%cH{UqP^U zbSWWvgl_Yq zG`D~p=j5xHtNe4S$pM%c2u|XZwvK9;K4va`cXPM|TrLJ6l zoTjEyR<;F>v>9X{1Q?Nogsukg>T%0{wClPrCQ^n9>upO%eqlWtK1se^+PhA;`(awC z4+_3MkCw0R$QR=$pKBY=nU41;5uhTFo7UmivPswTGviA1zgu7IqiNZ*hgc6^mnKd)1!lL*McF~$e{fNMLW}Lwb3pVV9}8xP3_h-3JamFVLWWC%S&1nt02!1ef2K=Z)l24H`8)X)Ze4|mnj zF|#Dcjz&#L-1p-aD@Z^;fZ)2={9TNKw}PN?c6_kxPKaq#HELmOgE_YZ`^}~wkC0dLya*%L&rB=nt15qp?cR@&h zu4FL_=hx`pizAfHoc>s7iOg#(n1-`o1aI6;kO`UzB2y9{_Xz=+djI2#flW_GaVAS7 zyhp^cgGkHG9Zklp)Mt;)9STqn5xTbV^jpEG+GPJYgm6P@uB)|J zIJ{%U$o|PHTg>}NORt^pKQhlF#4!1Pwt4F!$dQyxy;Vd=>noxbAF4$;h&|A?!O?8_ zjZnPt1qY8qxsf}n`EKy;kbgJw>d$b|^4*DzEO!hSCX2Zn4DZDz;IyKo*LiMmt5<&E z?`Ep83@fs(?5LUPU!1rQbi?`^)?oDD>|k`ww0LgV;MAmaT#zfg+{$X1{|(DG_?ln0 z$HTLrZ>fFvHnGijITpe)*#Ca^Ico^`wVK-h{Lf}*?d$o!hjH%Z69&FtD=wOKvvDES z5Ap(ud(?Qb)6@r3iiSFj_w_|$vc!821zY^NZ-nLSCHT6y z+7<{)t8Kj6aP8TSQaw3II1o~P41k&--IJ(NfYdBioYkX;?|vV5oCjD6ih0d^@hSS9 zkClzQ{{sHAPN3lP8}D zo_q)l*CS{NkoE*D=u(wDVSxUjL~0I=&5&8syZNBVlB?5R>_r?=H#ljSB~%4r7gV!E~A4T!FJkuE1%_pdB?!F-fV?p;+&n%oGL}clqM} z2&PLsROR_4>Ba!ziJprO#riBImi4Qp_PkvS=jK@)>6XjCKv(2z(I{Q$PSIStak)v18 zrNTodSElZfi4*AI`cg1xw4?JPUGYXG+@QnHomy| z)->v4&R%vIuikPqtAv~nPH`6Dw+tyiKeu4$vuB>j{U>3x{gW^jp8fOf9>Kc**Gd7Q zL?ZPMn_FnNC2r#@^^N$1%=FaSY}0@chc@FN*og@!v1Js=_JCJ;JsJD0yA07= znEM{ia~qPb3er`)g85*;0@-@3?BP+ZOhp@Pt^e1Axc88_Mywu+mYAB2f}fJ&o*I4F zOqOWXWXp-}c_O4rQPy|i87g(Z}}RF?$kWGe)+ zsqqOVZF0D$#>p@OU@L+wZ?t;y3t6tHFPcgGjFi_U)nJP+^czq_RP}?Xc1lj|V$R4l zh>)%vJ74iK@*^yoczUq3u3V`q6JySXie)-DTnJc4B5)l*b!E*Wre)q1U!rPA%`vXn zQ>x#l!f0&{r&_(nZ~xS{-MsNH_1HKBO3e4C_r-n59ue~HK$p(j^W2YeznGrAo<4r+ zpqAn!&9Z2W^JL@3*qLqlHBD}kn=_$iA#VGA;F?&%?EJu2_En5+S##XpK(H?ab5fO) zv0F~r9#vr>VAFlH@+=VBo(}_*iwB*4Z+f#3(9Ct7j-B6q#2TG3En}_CG~%&v z`{UQQ-K4MB`~%~=3S`wJ5wE^Smrr1q0+O5-sa6>gIUaeaJ(lqO9hKi7 zi6n8nI%{>*9I>aVN1I5%lF$Ft(GAxnPAHTvXzAsC5~5EX)BS(`UTN2wX09i>SpX97 z_m~&9lq%Sym+6N|eUCeI9B{ z<%O?5*WK~7`jXKR7Nqja82?=pK17caG9qd+UgxK%XA{EhEdon^fb_!2=>jtV%sDmC zYy}Ka1!kd2qv2TAz=nM>E)B5B7sP}EIKfFE^D^v;d$5xgBu+?}%0TtxW1|lC=_%&{ zt>vCG77?DaNO;^nL4IiW@@A-=47dw?Y7TARN}_fNmi#~oaeSN=2H!1`8u2*Z_+xKe@5Z!kf0tJC;0TiGU86 z8CDYHr2`Zjc5)T#LnfJgd^pz4%5U_R3m)QN3G<1cg={B8WU9}fSD^-Q- zCBL{00pRG}G`!wP<)7E3Y#4siuT9_iQPW?gHT1Ce6FW>Jg|cnp%eIB{Ah0P5zdY=!C)MEe>oCru!*p^|D`HCqs@t>l>|O z{Q3jcoT%N^KDRcZ75~;0{d#bqZPQ)_G;tPGaJ)O-Hm+U=d=@ya@;Np@%*Y%x2azGxmuiHbP* zwn)9M+n6$oePAi;d$nuHBFo`{f?S}&B_o(*(gGmJ>MLDz+z~ul* ztO_LsUeuV?r((QHwI#onMx_u${IjBkXLeF2T#F@kb&E&HEern@WrA+HXGH@pCQ}1i z{D1OiD9J3gat5FDb26}lWG?&Cv;SQkG9Uf}*F?2}$}n%Xz@)p@3*!g#9{-^e_P!zT zYcEQOq&2vpa1-iaQ*H?D09Tni)V<9<-i-jY*QnPzOK(zPlm&D#1nA&9#%Qs1cg%xVT+5q z2lUENG1N~%D3BTMzn(jhf5|pv24bXI`jsuvc%TLov0T{xjD`6(NM}o}irvWp_yyT{ z;f%kn9y9tyq2URirG+B_6f9r%@rnGm0Aj?0&lK2@9f$7U@4a^hO1$;i#n~!7Wu*^O z;Je}e{Y5sl?VZ9I{;C$w%y2?B0@2Rx8v|_Z)xv}}drPrI$d@KWy{AOfY)8SD33prL z7C8xfK>Von9QZqfwkrg~y}s`6nR3}zfzuS?xFDE_ZoJuJ~)3TFZNy4XoA#-S9 zYA(q9EW`V%xw7dGt>XyK--kO&&Tv%D)L^f6W6nC&5!L?l6PmXq2x}h0v(e(__`osU zKMvn2+{^C0D`)JJi1m$W|EV0}dcTvVLG_lDm|CukCXjF>(>G_R9NID>pJor~_$*u; z@yt?~Eh?~m;j`y^wO33b1TW7z)+DgtL`Dzou_hB$9?9W;o-rsp6*QEW#Glb-i%m}V zdfAhqSNoxto5vHsqA;PKq|OddzY4!k+5lFEFw^`6o}uS35UXen@(wA7Ttv@8F8*A& zGqPi9Y@YG~^U7=wma>mjHLErMl}|XA16hQ4LP$Lw%u#5tVZAK=UoL|f`B^4kL$n?I zo1oc=0IgO~M(+LXVM!s_5*ft<~0Ksg<<4nK2)Ne%ES<9)f_5D*9v`g6C%O^AP-V5cb#IwMZ?F? zH4!9B`{AvaT!~NMci#(zmecry48qNY9-C0pf>K(EWZXX%Ns8SDx9g&8B8yiGqHSU? zA>JH!r^RhIhR<3&vNxcZ12yAmtIWS$7rHV&B)KaW_s)Wb_P$&BJ(#BtUWjvKIMdEx zzB|a`w|k|{pC;xVA9=$CfEkUzfE_BO_~&kGW5Sc*H|2Bg^r zy-vD(YtM5ky@ho#c3|LccVr<0y|%%eE(O zDU2$|nKc2H?6J4rf2aMViN_lPj(||xMQGidppfIW!~)4*qRX4ZN0Ft7C*NffylTI) zs!V35M18ry)PCrn(Icoft=04Py#*`pXtr(Jx7KoC_{l5-|ErJ)05TUB8ywC(thcI~ zG@n>tH+Z=~;QbItiVDTzLYR+&flu>a9-J8-iUqG6cxT$dRGTz|;AczXKnV#%*bk%g z>RW+#6UGqv+*rRU?!hhaD$~q)XzoB{NdN`GfGTXcCI;9E-03r7(l3k~s94p}*Dr3R zyf0nft#}%c|0y3qyAKcLoJ$9$_vq@(9ni@F^c~=O@3Km<3uA1E$zSn%r_eIUYwDN2 z&-!JMKw{`v+G?1zz`Sfz_FjFmiOa^w23o1J?#QP#QV;LX2nT-+tWIW|6!Kdi+}B%! zzuZ2`WdS*PN(vMM-*`fOY%?y0AkLRg5jNFSNQ$Xn+6dFe&^A0|Ma(plINw{eksoYq zxJ{<20%AI5`~&9hoLH#Ey&lPK6clNN`HYKTg3+OjwwAp$Shrr8L(UBb)xP*tX3|eJG%>OAX0*vf1C76ynwvG%rL+_YUF3 zlb-o9BZ-zFyn4L@`NJcl>X_MNFH+8j;=R(q&sJp)7+C>Rc9Hne7I*c>VsGAjXaII$ z|6bSScGm>9pZ_KwnK#_vs+Qd{vSIZkQBSI`R01oTNP?;k%SetX#GcWZK+zuCE9Ao< z$@jb5mio=~C;huux17ETUGx8!1*p#1Sdg4gU2Q%lQ~t)~C-e~evj{Z)*@xv$+}Zo& z{RF#MPW;V>11TxDc*CY>w)PO&kd_zL&_KL_kUz9bv|OR=WEpuwsf8ksZIrBeLCN9Y$(SO{JICR^9v~;>sJ711~voJ>NYS;RGEJ4d-(_prq`2 ze<8pXUz4#3vlf=M7jE-mS+C!C%XUIJJnJjO)*MtA9B>=sE19sZh++#kBfRF2v1E@Z zKa9m~+CFTyB7`>u>^=zsN^0SYHywm5T`1pxggcK*>dei1d>ttIm}AnqcGUE(J0h8F zVkkz);qMXv;Z<~khkt@#uePTfJHVudyi#AxFJG9%$uBjC102Hn`58<`;ykwAoAiWJPmucRH!9*Gx-@cjKdu{h;f z%hSi6V~q(wV5Q+>f8=N@HHv4}&bR&OZAr?#x~L311m4hUdL2$87G*~qQ>-?Jr??j=xtX^3 zeQG<~t`gNdFOA-^o<%*Fhs-YzT8U??uF)X~kyL*#R3(6KtNE*SQLg&sPG!Ig9NIH+}<`sk}6SGkC7N+ON6@+*y7lRF)3xH(&porS>6fe!koY| z*kU*ykM~s>Eu;;eATb+mUkA$U z{1WmaVedfHG&e3?W~uTgG=kG{At!#RBZ?~M>(iU_W%G_wLI|aR2|^DrCCtBQD}}*l z&@6ClSe;V=NNZMsxET1K*~6d(uobk_!cFxV6!+Y5ycy0EuD{rUG9UkyChT0sA7gjo zL@tFhkL^7q$*G^}sW0eupH2q_&biNDulu`_#Oi z(G*W$steo@Lk39|zIutMlWK#uICi}~bTIMIWmj<;zMzpCC4(g^7!gXOIOJQtCVrk? z=saa6A3sUkfueEQ34<5f11zskGgFJIQTtqDjuSaV@@Qj$1Sw%h!4=rc{HKhF&N`mL zRI_i;t+@Jb@dbgx@Ya(t>7Jbveqg$A%ae72|8K0Q#*CC>U>a2`;^A4<&72+nt~~SI ztx=Xh{hMR5irBF4R^wB_C3#N|#Dg)5cb5kn!M6^=6b;#kQhVx@? zl{&vqEs&DRZc;30E`IijRl{J1$!eJY@#T~wmT{Hm_>t!5dio+T9iN@;jLbb`kxUGf zRIOa{Ama-!FWg%gTr=@WH$@TZ4*)&C$KD!e;|gHTr8(0v8w&1}leMEl)MexF!4RKP zkuTm#pNCy`aS(u!sX!J z-OFGJ*5R@h40-kK0*>K<33WA%S6}1chQ8Nm;~>4l0v<<1XoAco>qjU^3N68Q7k1|p z3JBj_+XkQ~}866Zfj$=ZPmSD+C4#l1p=rp$` zMpA%a!puNt1kBUC_pJ383ZlXtAFiRr%GxN!{w&Z!pyD<@Y3{(JCWZ@{((3dJ@5Ctp zJYrfH9uFB!uoP#*_G<>@l-ORc)T-K1FJI~OCKgqaXo}jsrqL55FbVm5ptoW)Y9#utGjo!BMKGmCJ zp^%;+G&l1DGqWiGi5q%lPuhQaf6YePjRaAr5DMl;XDvvc;jGM|VJdpwoxjsZ&h941PSkUgtM!ikZHA zT{xo7du@2Z+;$QBj&EW_I|x%ByyKP`(P4Xe+W=7&l^EPeBouOc zaE1&yv}?_Gn3{~|a8SJP8ie8H@FqG-XVv$fmXQ=skUpmmG<1FNq5f|fp?TDaxchZu zkTWE;#bV94Xt2t1$#38FB5NJ#h~4v!XztL4P>oAJx;k<4)^Ln%#MLiHb=r^h%Yd7g z*1C_uBDVe>E|I;)UQa|BP{4Zc#hVZbL4kMu{R4lJw8h@_4@+PvZ%l6i^&t|12V$cF z3T#hDy9%tc;&ZI?C(B2or{%#Xx1gJnAV<@{i@J*?eObZ1o6f1>1cW>|;O^?2L4^Zz z_Wye-m0CI5!B`+zHx49t?<{0<{Ole&X5|fYv!A1BuxB_tKqQJ2_)(u9LKn<2hA%$l z+~34q1s*~X8Cdu7TB%qR94I^~&w*?GGyonQYI{1{Mp%Xz<>aJ=@F5HzI#0w4w5~_O zQT-F0DE2P`mT0DE@i-{P4<>9anG(?#Z(e3aq(s*89S?1vF!;y0W*+a3T9KGpUp4|R zMs{^~xO!oyVwvitni@Zrazjv7Z98f?&H4;97xwDbYvfW`;hn7qh0=HbM-P19gE)vh0qqkub9c4<>e$dQT zsoayjnyZ|})1yEf2FQ+hW83?auG>|ITjWyM;8`-fa?n}k2J1O*@EO(d{ARFdPB}EV zp}zQqg^7vgg7_RBfzE#Jw~B9$f^lV=C315-a>taSa$ssKr^wAY6|CwLbYWw;7z8Il z3rLUnsbck-%Cb-z6Nw#-iboCOkkKkWxC*47iT#=w*mCQN|IM)`ZpqYIg9G&bn81)) z9z4^D|Kcf?k_ZEK9F`_o7E!>%8imPx!Ja6J2T}Qy1~y&ygx=IF6Gx~Hi;duBM|Ta@ z$go)t-bfuxHq%(Lk+V0wkFe4gGH%U^pjGATc@7)CW9Rop;%qkeuu4h8gaLY7S0mNNp{SD1Sw}F= zMYoO!(%rf`&}viG&RKuU^k;(v;vZsaO=RSbyu94{v+)8@=zb!EUp&oKM|00rR`+Be zOdaTl5qjVC))^1G@Qd@YmaRrUS=7G?3PxzVP_uV93cXmIHM8Dy)br1J5e6Om2VO5yW<3d-sVLaxhM zdMn@k!w>Q>o8R)_=cmrk$rzB5s??T+_|*?1%G*_9!0n}S$^_YY6QBM+n!Y<2?!RkW z@2eBNB}j-CL86xwok*;*+KO%wz4tBz(L0GqVOfhsbQ?sAL|Lm7-HN_?dB4B=ooB`{ z;~z8T?D?E?ovVO~Xf~c~y}9!{v4JNq!0xZ-Zx=4fWWM4|<&p^-{>tJ$_CvGRJTg|r zM+R&Ci+Is17v=nuzM6cGp_}}hKaCyk$_#wC=e%YfVDny2I`-DVb<6)f?0T#OZaMRt%gTP?JkayN=c^ zPEpl$f?q=`t-2{hk&6?+7Q`lIGcm2E(xz5IfI1-4i#F^|kN*ZVHo!U8oxUp$nNk*I zdrSKf9pv?wTxvAV=aD8$v1@O@QNI#hOq1q&+f;xrKJB6~&40k)~+ zeP%j4>k$d>?yv6zFT8H#Mg?_RBjdYV*<2~gQaSln$GX8j-QZ^Mwc>Wy#GqGTYxS?W zAb6ZWTr(^d&LbtZO6vZHW!#x2b_P)9&^^A1;5`q_qJn{*GzEEN*EJA81Qn)bP3Ck2 z|Jh&~1z!t906S6NY}smf z8!w@J)*I)q(qzKMri^A*4IqEGFpceusV>p}r>hd`wW+i`r;Wp3n~hU@zqPK6PgfQ` z+0??7`!$3tpopKH<*l=I;#UQ8*--z8v5nDHVkcj%itv7)$QS*It*5R_$p2Kw zRw>E9B9UGF4%r!rYM=OsB;cy+o5qpwlr`_QQ)a^cH4;3@89O}uEZc~70b`*gW~-Mi z45oUEwKt7;Tc9;Y5FpJ{!7YMMiiJf3(^wenR@2pPPo;Iqo`|#*R>|s0GIRImGIbTw zj3@pKtjka5jbn&O97mJjCAn#R!V3G&_DdbE)Q1BCM{{`^=*&_NJJxE#FK}y2A&&7? zE!$E5?K`Ad05r9Swq9aJT|d70voG`d@(&dRUpZBU!1s_rQlhefG!p=vawdmlNOrqK z!l}r}987IQRk=FBJ#SBh_YGs=rW!=VAcU{jtWBks;&TA>96(G=>?=JKd#G0iccmvt zrVuABeYxjuN$4os4PQt~uZr#^sLnvbiNP1$7p05U7P z`C(#R!-F=WNr(v~mJBNbIvVxhgn`yac+nhpzIJ1x-r0e2&cDV$T`6zR{+*a&e8wi} z#wWi=lVyM)gUlVFIx$T*h2;pD*99v}cjv^YidWhnHz=ap+a(v^Hr5gkaTF!9)ktpC ze8Z2KsH`)e(Z8ft6Zf!x=tO6pmjFjq(kml195r*n^$}^}H>DyRyd(8o2{1flS3eC5 zL{$_x;ey;1sc%BUFL-a_{Rz#jZ^kP(<-!hguD|&Un75fnUc|%Ue>fvfxy)OaF3;Wg z>{=#|A~GPV*$}N(I!OM>>|3_UsPee)H1!^5^~XgclfilIBkBUGe@ttPt@U+>j?Fpt zvx?#iziB_>ntHZbyO>WsO&ywGRs24zpSI)fL`IRcRO=47J+RJUKrTOT>lYR&-eG$^ z#g#l9X|@|6$R!m)fH+U{ZN7P+$sUk45l4+m%Tgn@G;qW?7GzAQVa{R+%pB>E0(54z8W_v=N62X4JHksE zD<25l%WW!M;^EN(|7=8=j#@jxU|`nbV~a3jD2U8t&wP+(BMNNI&?!wHo>JA!MwwW+ z3rG+qtGOEZZaRq?HoW3C+=UU#e4{HYpyYxM2=tH|BY-r90XxnFKN`~s1%&GN7A2`w zGrOh$7Y#b9j4|_4Bll$qaxzG%%^Q6^#02OSp(-iDI0DTQ@bpP*+}c1Vro4@^(xLAU zVGkqB(m;ynz^ayb>ah)1LX!x!Uq#j^o=r^)Ht!=i?OYJQ746ei zW%2QxaDm;x@KtUdz^-5|Hg_;`^=V+wf>}(utYio`fm`}#vgXx;kbtS|<4J;fe>yXX zV5uefpFx%dT!TlY#S)YOu(1qq4VE!vNEKs#(OoMm$=&87Aa3_npVBL+r2pj0iQ9Vu ze^BAMP2=wp5+fb?w#S-Yb92U~Q2PO2dD#E;Lx1 zxLjpHhRI(oSVUFrv@V2r0KF{4)9ybYvFsBI>KaJ^=@9C~81Oa(2JYG5n&;|RI7DHw zQ0e;!Ux0~ZligUDJ2f~()iXqk>Xyt_{HzSaFTFErCG6t!sEmb&@tFKT7}E&Cq$(Cz z5uC%@u>?HKQ?p2FH2hz&yfMOZawW+l05QRm<+w&D+ctRg; zl=u}8Dy~7#)m^Q~>~rPz`ZqDeRkEuaqdrGfe!mOMceIne)ewMs&)Awr;p#i1Wf zH^pZmaX$x)%_}XW!M5o80DTWq$W@S_?>;rxQza!t1A?FiB+TjmqR?^Vo%!7r_X~O1 z^9viCEk^pZIg?v-*NI_^`n3_)O)>82mjx2Ytc7|C!OJV>zm#Vyt21fU4!61 zZIIysYl}(qY-NL`e`Q$drBVEEjnu~mLV}3>Y8z9CvRLs?558H40FQdyd^e~Gn-+g?2w(jBm%HJ7sR)QiW-J)c%;BeZ*JD17PWQAC`* zfE(hAOR;gv?RwHgfsB$8=}vD;>!RAyEX^R4D6ZD|x!4s{NBd)0SJ63CnU44uT6KL% z)iIREG5`5L4KV)Y!szp>J{Ujl2k+%U{F?Rk&aMEtne%^DNccZEdr2@*mfi+HW|Bxz z*HcGH9mmu0@ZCHKZq37~ZcI)QG$yb9R~Kfy&X~Opun!=tjD{z%Jwtba@1m2q15!%O z$WYyU`|iF7mbbLzkU7VAsZWO8LqCE*9EF239Dx;DR+T)kEG2Qh4dbn;^^y{WEcJwP z5g;dIs2ih-{>#9Q2Ajlt@iaV1)-^@*WxgSSph4GgNnA=^Bz))PaGme)vQR{{U13{S z%RpTN(fcig3~V>v7PUs%sYsUj82f!It;i9>??jpyYu*)d%f{7}ZRQ7t8d}MgG}(Wk zvz(1+5WIO!2NT=YB*VXtCi>a_F!_zZtf|MpToQ>3i-j}eO@{ZGevh&(L0;YMoou7sh4P}L zq?q(GibwGoLhhu&Zb{M*C+%YYEKcju{RS7YRBW6pnhxl=DC!cYA72N$jg!%vsuX|~gR zb1Wl((GE#H-x`P(#8UA^zyU}_ZlPqT?svQtp6b^QXDanEs>h=7@Ne55}`X;u@U7%gN*^w`n{RBcaa2?ve>O} z@X&${ClZJpXPfjxL7Q|Q$RR5KOL#}yKCX}6JsNI14>pzPANtkK<|0cDVQLY;iV$^2 z-Ev?@<(GDhFAL6dVPR%?hj9^YjprAP>P_{}*ijs{yANP`zAQ=*{>WX!lqhR)kD5nV z5s%K8<&v4Qsa|>WP9tm2nGG5U(9Df&%>EfDx3FSGzMc-*xISxZ!o+Hc5#7zkv4EUn z;f3V>X4rF@@~Mla*G$sX5K_?7HaWH)mtvLUw)^5IMu&pal6&pe;wOr5*_D~85_tHF zh=q0XrH!Z@LGf7lZpVqy&B)DQ_yrIzww42!6J1^0Ebd|%3+Xv4a-f-*!>luz-!@~uzOn`GQaNAW&4>Kz!Qb*&Ot6~S<>?k0d9L*Rt5G{^ z7Qt}~u>YEX<=qEq>g1*#=jJPvXm@By2Nq`+TK#Eo!MUG3)d}rY{nPKe6ouBZP@iFayl}p80)%vaYGidS9 z+YZG7-qf1m!J1YXWxJ~$1LY;4H`1MIg#6@PejP%>i?sc(M?zQk%s2rw=7i5EFgw}xyaRoD>QBLYMYVjDom}uF6G*$yR|%_(K(v zh}#51r=!b+As9(IVyjrYi(Xab_wk|c0~2gzy- zM+fhiL`ju6V~LX=Q1J=LmQ#=!Qc2P{5ZzPl>NK4zCqwt%HPVG8^sl+uvq`Gmla14I zRs~VtmyTm*W=;TYN5{rC#DStqGf5M56lkbTAI1?h0NoqaIM2-FN(35o1hlcxQ7SeY zxr5~3wAvVZLbQHrq-~EwV2EX9Q~Tw*!X(i2`Rn@$4Brw7{5=9GIV@2!YDcCJsx@DO z#*tdKxy~|FJf{1-U0E0F-({uVEKz*2{(Kzr!4W%A{Hg85%xibaVzuYgd=I%=ZzZt2 zm)2!I?uq~4u6O5k-H~HJaK+qEYVRWs;c$4&ac6Ziq960Q@tGi0pu)*2>NsrSo!Yb4 z6!*PxnNPm|s7)S`DyHtpUG=iY?B5RLic)^SGRt+2d-_e-l5W2cvyG2UKQn7#{yAxF z=kHhCn1SsUaL1RoYf07J`*Ft$&)SkSa2XbhZzII7b~HB>Z$h>)3Wl5tXUgWd8Ha@Q zSA^FMwH5^u^xPsOo98=&{CSV+X#j?*{lR zqHpjWS2Z{53zsH0TMHq}3s)@$R!Av>2X^uC$BAM}b}- zE2N|9iSQ$lXqdQS^x)Nty|Qy=tx^Qw$|@kYZ6KGpDvN#%=tu_ zXTuGi_y~Lve6=U}EB`Zbb79q3V6LZfr89=kC9Dgbe5j>DllrXfM*HTp<~alMx|G7K zqw&904)NbA=V!JO>@mN0^CB8J+lThc)buZstuLYjbkUccUN{gjY9zIl0Yd*^Qly3jJ^v4vSKrG z2`n(5iRYDp{eBh6MkVRstikDI(N*AJ6n&wKss`>Bol&;vWWpyisaQ1z55$D}AS;$C z_#4gv_$$QUvj`9b6dwU+Fr$R71QG~g7P)2R75|q(G=_%a!)ge4PN(DTt#mW1noOuG z6{R*>$41I%L$JDu%G4#3w(MqfP3% zF_$&{Gu@aCjzPR}8sIoSnM=<9)IJ5lQaeXlTW49lt_U#;2;~3roZ2sO+l|p<2j`o9 z-3|~MblX1cuwuW@(|H#-Ca+@1ZO)XNCX4no%?T~JQE~I8?fMt$j6WF6x_si{*QPnR z^|i{Xo9XkeuVf2iDF~TS>$X<;om=n2{_McBO*(uP=dQJVN&BBd5QqN1S4j0Zd!jDJ7aRyuXt6L_Sm-fP%KwEeatPBf%SKq2Ln&J9*b>6kvL}k&k zL@WBDIBnKDmjrk4;m0j?^E(Sd;a!?;-y}*N&e1gnL$4KgC>qx`4G#`1k{+4&H9F({ zCu$20M^ERGHKW(3Zs%V+KAN;i%Ve!jqRcVA?r^J_j_%dv)2CvU@U~YgzT?aNTkq^u z9WrQxEv}XC9peSnJAbnMKd&sz<;)?|8U%`4?JE8}=&{1L`_;!q(X*b0(+8P?d+vy)(vfsa86M`E|?#QCNed$7d zd&re-DML1zs+;041amvR_@Q%!8Lv}rUTIl_!)OqnQj_$+{uWguDr!(ljph>ZIyMpvkQFLRI8!T->KMAgAHnl!@cepyfoxoP8p zo1sipf`n-+B*m>7y3(5AS*#H)6S8VXjlyeTUpffzgF{mGvF9^_&TUWP#?=)$p18_O3wfGa zJ1cvarDxP8YV4nPLyB65DRwku_;-0;&TidZ;hh)x!@Bv|RE$?yyotyAF@#hBS!Vp$ z+JJdi*}Q6f!fklw8^W^SM7;kIsc1-sPIoz3&;xkg@~ak;q@o{qQSVNu+}G<3N3~^+ zL0@y)+pRF|(}ky%&w~mq08WfoMpdd~)i!&aD(RaSg^;J;a!V|-m7N^cUClC5ib%a@ zL##sOYF60S*tH+q`8yQ<@Xo@m)eMK?_%qJ~B;A*|O>!<}-iSt=Ts{e_a7{@KziP_k z+;sl>dUC2Izi&o$d~ncpa?b6@+D~r|p&MhM{t4#!s`S8qCiL4l?$J zFEpGSMT8h(R92-rKyg&@jj8^e$&ZJlUPWYMTlYiMg}WNrP`&F7Q}@xB)A)u=e?Oeg zhDsyDE!>xG%#Z`iR3P)eL>pYMi2xsl1afFYpRiOxb8&!>soI5Q^-V?hvtYkb1@mnK zx|7G>V}suX`&|usZ^ST539r+?-!&4SH9DK_%O8>J7%3n+tFH;ex~$g)dQ8R0%y^-| z-*Sn*==#JK^at_*_UKE)I-k~OpM@Z^&C5KcVQ#ZG!9>{e!gApncO9s#wd=E>(uXhB zR#RYC-*+Cs#9q07Et#eBAYE)Lxv$4D6ZUs}_j%~C%19CE1TDPC;?0Lwf$Z9_F;LBg zT9;txQT5vqtDwbAkYGUbM@A>Py!ds(-BJGX35^DmNw?|o-B6SsZ=q=QS;cN*@PeNU zdn(4eG|sis?Gl%>;igs<>Ug)2*5i)}fpN9Vf;rFe%RICT^SW}v%(;NhRX$AAHOzCZ zD93WTLa#(=caYC@5tQHA*TDC&`a_G$^DfSMOllKYx-WZf_)b`Eb^@xfs+1{H{=pwg20ME?WK;l=k}g`675R(WuE-$&7lYkZ zGdFSvsZ%q1!L%#h5+Wpk#-vW$;HIMCpZ!L_qZ*GL!mQ?3bi%Og9TGQxUMDTzK| z#ip`PN$T!j=pXAScmly6J!mDlMWcBytsV>NTvhT=W8$y^KQc&O#tD<*YfzK1=DJUp zS+!2WO53tihmawR>FwGEc+!ltatzeDo~&tTQ;TH(;5wm4<}o)zojL1;h& z0nD(!;{G}~ZGK8szY@X@gc9u6WoLu_@zj7{SnoQmpk#qDq6NIg`4^yqAwE}zfl%iQ z8oSs^Ur|Qc;vjxzASQi8HE7+Jl5_ss+;#Z!px|}I=2*3XL=6_>Su%UYDeU`*(Vdox zj0hd=*DtzpCBOOu3S1X{kS!)*Up}sC z4BRj><*5>*>e}@R!P_>Jod6uD7XHCXVNp%usxII;HTyY`EKR{Atw%#`26ZCY_#yjb zFR@G5AtxhCp8$A>jdY(26r{4OsDWA3F=(~KH2fzzvm4c@Dl9)vyoLEc40ro|Iy1_M z6L$3@8eXG~@MVOGN+4MBkM>H}h{qN0BeHJ&{N|R_N{SL8c0iMSoRZ80!V+qu;nacV zqb2Nd#Bm%END3IKUy^C$WQT^+0Inh*&*fuiczeIvVnz({Fbd9TfpB|$S0*Ccup2lz zUF>P*Qi~OIV>E$dY~acHKPJA$R7oD z|67+J<`35$!KI+IJLHf^AL-sknQ``FO@=MDaj2;E@{~xj7Qi!2LcSh2^RoUz&>XF7 z4t2F>suH~aS`@~@DW_OGh-iQ{wSK*QT6WZpNve-wAghjnj~@FkS6Eg)cdPrQa2_~; zENOY?*tL_LBN7to<>bLP|7s(4G!%iiRGx1Eks63k>5g<_w)p}{8zbO?{WVv#oo{x% z%6bgWyq+FM-WHt+skfL>)8XASY4>fEJ@M(o<-E1Z4X`ylzF$-Hw7jf2C4OtH^V6k{ z@L5>!WXSc!-ec|awtU)WRE+k`tT6d2H`k9agKxL}t+K3&t6JUWRtXAO;?&QkzPMWl zavgr>c5ANM^?%uGTdid{^`BP3Yh)Y-ZU9GgPEqdQt5BE;z3p_XD1}Q zBr_djo-Eh;?)vpl4or9d&=4Yt>~6EDI}_xqabOkA@;u2-he{KfQ*_xVx1J>FC-8}K z*%@=%*&7LC4!_tyaa3mOAY}fTVgUXvaGV?#~l6d5HDFByI9oQj! zU!8waXGQTim3AeOZk!TBy6ZdMDAoEJdT_k0{8-k?rIX-#KQNs z_+#LbJgWa<;Mb0-#PXye0MD~hKO(!`f5U4Q*kp(v2zO3&jk2HyWQhPCM<9_%L>5s2 zLE}Ivwn>Ugk7BFO@E#6iL~*;Sb+{HzJw^_htkr8{9mA)QhdqGF%&<}G4HC$$PYt*s zd}Gtt3q*_Im^dD+x$|!2CXk(Qs4X8?H|!m{8A z=dSxOH#~(~M5-vvZR)(g>fZ-=$%(8W?+21fD|W17?-6~6B$EHw;wCN-}= zk?=RVIV&8Q)6IOL>re;YsOtk?-!rmMh9=hS&9Byz3zQSZAW5olDpbnHnTK^Zo8MRT zW|aKqX19?z`AvKU%58@mh0^%mewoZ25g%!_JG_2R$&Y%OzxvLAiB{O>+0lZA2K_dk z^uMP;?GnyPn4HnTyn1EWsw5#xfIba)kkZ}iprLcZR{5<}4+}jfcLx8L-$Lvq z2?oN5(JmvQI}#e1+cWz2XzsNZRu9yh^^k8|=W0t%bUb(CHIe`msSeG&m6SEExl(fZ zsZ7Y3Hu|J|YNyGG-hs%0zGx{B88xoi`BR)ubckXv@zzhOMK)D1lNu&k-pl}_7E=|E z&iTb@r$m~D|EK6h^}nO1pL6DaFs#ng>L_^l`$%}|Jy>WtdfP@cA=?68r;IbxFl!pf zf2fJ$kApwqfI%yZ^SEK$6cr>87AL%^F%Qi05Csr0mR~BvNS_y{Bw;N;kd)n!{Qen^ zp!kZi7(Jo~U{mubIPII>f)G+5mAst;W|{030k2>{twofPKybxyA#tC>V_F+moAsby z&Si9>UI-a-3lkuA;O>!Fr^`)i47xzj^K|{oI~s%@0i?3C0eUE(GdU^uRqn(YC9#z6 zj9G@a+Ok2zxn~(svZ~)9ofy;izE)%LIH)Vu<5>_CSCqi^M>UOSw^64R0?N)|eBj^9 zgB=)^86#M&JO6O5G{5!~D`L6J%^xFpC4+34khpB!pZ;N`)(|`QZz41v(cqNEnIa70 zZ$0|6q{pj?`sfpl2(w(+bKFy!CwTptR}GajOf{)G{cS8w`RB1>n>k>kT8r9|a_Z+S zbgvpb+1q=XG>%eO{lu+4Ggl4ws|4R+TNy@?S1WR_G)T^Z%Y*l~Lbo?6j2 z$zA1J#I4usB*(qJhXisU74Dp~K4(0}-n3?%rM+5jf@+2PzWu>9nGI{sD;@2*!}QXT zd-eo-)_g#C!Hd_3fZ7M?S6V+MTh+n&YCaBY>;T&DB+&cg$?eYD5rTG-MG0bd_KPH6 zJ{ke6_E#cNRnux1V5gO6eAD$`U3si`jNY@m`cFi0Id9PJ{=d$ZGe~RhKlMpXJPy7K zh_Ql+oux&tynGPGi3t3j58+H!IMC9eAs4Ivq9jIh{PI2mvf zwYMdQSXu#OHg|C)R&5t*SxatS6cNX>c-7~W2;+Ny8DV;dsDt3j;-UR96zlw z47!D4&r~{i*I7(!i z=e%#*lMcEMlL;Z(__@fGABrOr7kc2>|Y2*f;T*<;!vxj=y{zQ zMrHcH`D<47KUSJ}ikB<)yr0@_o>PDcV)RqADn-*O; zeyGk9k(KfQGnkbU4S$0$1~~vsjcB;+^U4_;Auvo)ViFkBB#zway(anM;C^-U4&W51 zXfE6IA(4emW#Y6gVT1EL_=4tT9B{GIJVaF>CW=fJWvS^XfXOoGf~dAStp4+UNLIBa6~vw|s~e;ERU0Zw zj@L#^92YeP{!@_-L)|>MQyGX7l8?A^1<= zkAK;rU-nqvmOS_vDw;cjX)6zVmJ|Ue{F~YDM2!7v3Tf)c^2i^JoqzIDQE6`VxPlew zlvaf3SrD0v_zAj}m(eY4R$=4E%Y{ykE3`h+f3?vaTo0X-7st&jIu(C5akVfB)RCFCf?XTe#;K7tuMpeVEZ38uCyUmNeX%;fN+4p}A`Bnkurn zps)Psv#+A}8>~bQf2Fa;V6li>T2>;v9h=>WQ{KZWl|+XMc3Ie79=oGZey&uc)18am z6+TflvrZ~%@T6hafI1k!q#vg8+x5icD1z!hw=QjCtKtEk$KH9?{Qrs*yt8g{Bi^D& z+$;tw0xHtz-Y_v7!IE@D%)J)hhfY4LGBd*l1xVI`?zP5H`z`wR&r!*6$^tYsHrZ$+ zG8jNGkFZ79uA;$DY2XZKz??L{VcttIDjhg@Z_+_UBkpGIsVf4Pb|M(Q>{BEI|I=-^ zGQNlxs|Tjf_NvGrOcxrSp^5W}f5Za`6c`gUAv-3i3H^u(W?d_c;W=FS_x?gDf@8GPRJd3%qSn3E{8zR(-BwvEfAFdZ%)HN}>MFQZABmHQ z`XM(~@D+=jpt2x1mf#LQzJRMmE0AdE$!6K8-uIg+y_y!hshKtzuVV}je>F?IoREDt zCM(Fu8ty9rHyKd-{x&OrJt&O8gV<~VUaVu4wwX2Ew*LNdY4XHcg4mqj)#G$y@FJ7X z3f}Q~FS+fqh+Ocoy$q^sRm?wyYR!6$twMxRo$VYyYO zPxxfo%FYIc54L}-ipzOn_gsgQ;Ld7T$`R2Ew$*yY-)dIMU;!&X`E7)hbScfu&nPk* z;xsZ-rm-PiX*Ox8?82&tgt-(Cqnz!2_e-YI$P|}{e`qkLY=D(I zRb^h{ky=I^zY-gKDvgH%Aa!VWZA|Tz21LVuI7GvHyTRGeN@`+Qv(*ZSqYM0qz`hs= zDWO19>j2RX*|aE*)c1*j5NgB(xxC*;dt%LZp%rQB|cXkgk1 za{bV>>2@IhH-}N%g}_6)j3Dhj{e*fCeS#RvJRwX>n;2$Ub0w-MT#0Bl(QX=lVC8Nk%sWE{>6@H{jDF^1 znQJ(v9=eA${wMv_3naOdrE@;*WpP~Jza;|PI5&Q#?7v(MVmbe~XG-+p-Z>ZUkXE?a zn2;G-o1}cpr%(3$Oy{xqt$$9Zg-Rxn?5#QFB>U?#IDr{7x@xdtx6zW&(@uwS?fqX# zlKdGNWN{TN_n(lcv?^IdFOeDhL+L-drP5vc!Qzfp%pE6=jyLeNmn~I78LY zg#i?T7|5xOpH&|4WGO3{vY;_G%T^2pq5uIx^2-Al9uHWBOYFwN+f#6Wa!NA>{;Vc6 z3tBk^``Hbq)j+dCUD?Gg$RKEorm&)!PK+Ud!kWK)isit^1N^lx^@jl{GOKyd$E)Zi z`H>Y_?00w~R=})7%f{8uV0xuZ@5+yApPH~6{2}^2DK;N#5et8-CxymF^`F zG)OHF+j+kmLuJ||lKjR_1N3|Syxre97OrFk#}lc^{a(RLP{)bpIGH`VsqL$iF)2xz zDNJd7l>~sn5|+_RgQSy$DO>V8>|?4-&7pI_Y2UfqvW0xgh!2jcUrzQYG_Auzk6_>h z6`KJqcB=j*&6cB=KF#ieUc|e>jrfa`xqgSkf7=5!MW2=Yn-}WQ1E?2A2Lp#$V75SN zC(5HJg|qCldcbXE-;&O3@M#r1j5R67DIu|5MaY*%(aq-_9%5V5%20M4bjNBBp45kQvg*${JLXL-Ig1#byI*Fv~V$K;6fRA`67%VYog6Ls{imga2)Z zLzLIv)T$d^<+bx5rKxn9BBY2M9&KjQ1?IjkPjT~UxEJ+Y0M_FMb$!!G?7Gz3U*}1UG0}V@)Ft^iDS_oiAEI^@g zd=9!8R$Z2$f(>sbDEkNQKmG1H)-gT(8x2QKtwCKw*Aaah)xybd^!=-&ZJT}#DSbNs z`}D1t*T0sQXXft4I`dzZd)g*r1l-Te@~iv(TFl!NbV9)wP3Q|7gN>=}w=}jm`Y7;7 zQ6nzh$uo_=sv!FTb6Wju2W&E{Re3Dfh~U z^YV|&r)nj)Jh;mKS_UBp;=qqEu~#)G#kPkt>ez}LJ>)l+1t45cJe~Guez->k(2?H_ zHk&LurTgNAPJy1TZM+AH;K|dU z>{c?9Rsy$gA8Za z`0_y}yD(GlUlKbI_dNS!Q!m@v4Q8`CM0M}c1KJg?VX9Z5SgJ=qS4#P6Y#t2HxcGiI z{L!WA)%1B&wZiS&5*nPsRtQ7L5LCPJ0@@S}%6P=YSCl;g6=Xrwwo@LrAx-Zs~DcBPl%G2SX50y zWJyH8&-8E(SaV-ti*JC;#b7e~wOma-$?{~FVU5NUU7+w^rb%$ox>*06a{0YE^_|TS z0M#x7m*SM#4OZ{)>dS8L^(#Scw{^8?CEVSsf{JoLT?vO05Dg578f2JG)+ch*gVo*G z+JrOn*P%uDx3=<7*RE?H;->p@Gb?hN2A>5^SNE2c5@K!Tj*s1%R9>K`_8jRt(rBq~oz`MFfbN-GU4Nsty=Cd2xnVY`U-15Q=X#J;Tv0eWD${zHIk#zX%1j~XVhH}D;w z=vrO1I{1IgM)!NxF`w5g{Q`}e$xwgslgZI=m8(7DtMf|j!}8(J8M3YawZup`(`Njw z|FE_Zzz>e*FaoN~H8i9R!G3c~pdyEmf9NUj1>B^eqS6JCQ#7(#04N}KWUk7?iL2e} z0^hev;fHo+2d}T2RRwnz*O*z)I+}Y=#^0!aU)wTK zyhY5>I9ru~xz(Md^Jl8ObH{p*L#a@{6V-ez<0=c%%NU&^QXpz-p-I~d; z)rh;3(KmMmgI+xQ_gC__*gAbEtHw<)@ZW8~64>vZPEJ_UmOry^mKBNn@NG2i!Rys` z@qID-{tN6w)OMscXfla376bzs;V6LvJ*Kc~D1;0u@cU;cg^{q4-IB=T&ZOJK!gs6A zOesSi=i;gOea15-uDX9*lqx0zEp*#=afFC+6PB6SO z<;)dY=}_?5INCG@Zb;*RdgBxL#jwn=lC-8ZsH6I~VeD_9SkSHTdobfSk}u;quLxmt zKOv7jDz~}6Wv4u|&RXfpiiXq6{)Ip*6~xit4u6Aq0-Sgx{IP^4x%ae9JH zC2TlOu#L~La*TZ=kvYev(yip2mmS9Q-WQvHLPKU(W51C6@W^{w`H^7^9LcN%p$;;_ znx|H4u^23r))2u!UUy}p7_=+_;p=zvFyl;2Gz2&0%Y*y-=C%sCP$p4j@jt8xOiZI$ z00viW4Q4(0pw0vvw#fN=X;;@m6_kjXZYbN{cX9i3YdZ2To`v^A9PUNc%x^o+^;KbQ z7G`RM3`DNlXewn0o|3F*R)bPl_>gAB^%Y+70HL#MxQeT~#afPUb{fO0`0s{LNu&+s zzGW&o)QysqWT`>*Muxmwp5wH-isBiql^HdS4TML3aDM|Ibzq+{_fbmS>w3Hy{c%!l z52A*HRG~l5ix1&OG^DIWBqccy8a{>Ux$q%rMP8;6&yHrugfTe%6OGhn5B+d2&+ksF z4|9Vv`4l^k*>5o(oum&1hEg|G(Ux3AX!^0D$>!@d@xh@$@;nN zMVr=tc(#CSGJE!xyGX6=0>zpQw)Xdu70Tno8kmh)@J}j%oa}vyQ34vBv)2`bdJK_qcG~Dli;Kk2NYmGwD_W2{5XZfshLLvBxJZh^jN=*z zJCoct7D-u8i{X|2qU4Xw2nmujN>>QVYJm&Y+ZXfTyM7}MGyE*w;Kv@W?5OX19kf<= zM|dE8k|B#sfgh(dfSc=@!j!lK8cZ@_kL5rXV^xJav}AC8(@gb z!$9{b@T*=k@{puOiFK_p63Al(KQ-RM>YSCAaTLOj-#}#RZ(EvSIa(ur6G3K_h#Irr zYqO)Oi5KV~pU!sohL}Zrzf_Pxg3F2IgR@Rzl7M_AZ&Jw8Jnl=dFmZPq^TDR|*3>i& z|&M6LR+Ge0fY9V=5Uj> zO7k1`%S`=WWg~B|Hp>Y}m;$NZoV`L$nTJEme8t^EuLDCPbIKeofBn8NGsqcegTwtI z%&n}&BKBG751iE;0zFqFta1MFvth)o&dnQ%^J1S+q=tEJ7~&gskACIQPY;%2x%#DR zwI)|3Uq)pr{ge16+8wfK%Ae}Ou%>Nj^|a>&rzcm;2f`Wv8smZ{9xsqI#K-e&!b_!)?BA#;`lPFjS%LW?vX64jUzo)M)y z@rgn{Hl11|iDn8QtXf?4kXQecp8ck)D)0`ruu4}kN)p<8q^_i2Zl%9f^(%;H{Z{I7 z@|kCBl?vvg79UPn!4B9*K4&`a0a?42#i+A6gInm~ixl4`d_?u#=+-*a+aT3O$CkSAM zG>?Nz=_Wxdag%|^=M&z5sLQ@J;G&oHi(s;qT`$t}A2+~MLONDHBy&SdaF&U{p0cB! zm6ZuD=1&W#I{QCD^eMf5J~mDS(E}u8nr+!vVPLxN$x$xi6K?^b>((3xD!cq?s!J67 z4>c7WVQl)OhdwXm@A)p}g=ikDPNi~yRYu#@+DdaLW-I?d8?xlY1d}O37`G~~JolM+ zRHDkP-qb_u=v~1=?mN?F&L2Y#pZ@T-z@u#E)A|%2*T%_Ox&QFOjNjAfD__lV@_Y7e znWBhK{h{I=gj~O}GR_U=zy?2p3%XgGuQ7!keq+%}i)G3Z1=qpE&_ITcjymdfzZuED zYZn5IA!i@IZEzRj+&=lb#Y&LYudVoIO>3;oZ+(hpO$%$ztR7Y#+0g+W=esradIy$P zHNjJ_n)BL`rv%%qp;?%QHV^IX>vhH|kAyqe-q#o#dz*|BK^iY?LTL%v zQQCOp_;n2({nx_4Fxh*y8JT9{hRxT1V+^>fRJu%<&3t<|QfFvQ79cn`uDE+5)U!9h zXud&GAa=4Vp1!!v6wG2$)?YM7E$HpO^>waZyn18V%I3gNG4HR8 zpp=h0$6s|0Lu+RA#8AX;$BnI}o|S1`FW%0lo$C3@@}-9hozkeSD{Lrq+%4W}4eELg z9~Q%B4V?1<6HMxEgQT>)es}FtwoEC@zo}X6E~?qt^xMX73Lb>Bt*c(Boy&1OqX6vDv@7^z;9dpl*A?XK@+-m742jEIfQ~v*eJs2Z8?r zvML(3PWgW{y;WRPUHd;gG)N;Q9U@A1m$V?E!Vp7u3?bbeBCXP`AUQD9&@Iv-F$^uz z-Cgg#f6xCt;RKHOthM%aeRJ;ayf9w;<;YilsaGRFcORo`I=yRTrW4AHMOv!lnICd| zF6!xv3Bi_ZSm7)jjTrlv@~c}BWIl@E7eK1<7#*PlU=5Hg9SH!0aUfuC{e_9(`Sqa* z-a`f@JV6Y?DNtrsga~x`m*#-YV8sXUMy1Akpdl*d#J*8KnQI0dRZ`-fbB_|(;x4aG z3J~66gO)csaN*75Sz2Y3esk)Gy8*^~fQWsmy1@kHbroT3UJK&&bA=H>);G4rqB8I3 z8pW$(ilbrI64fMw;&wT?tut5H5J&hcq8#AFo8W};BoF?Yhh)^7p|v$EB0&)24vNVe zDM(fsfM6m?hA)}89cu$wTU}V&W^4c3xZ~YOeFp135mze0FqK zpw}jb75<4|s+Wo5Q5Os5?b@mg9^$XuO zqREE_hF$a|{;Eiii>;^iSG>VGFwWhbtkcc*>E|d@w3RP)u+^cRbT!{#Stp6Xp)JZl zDA~pN6p6@;3(N`68Bw<%Sp57)m5(1;jH0O8Cbo zp3X|u(R`uQ5Y@Z&q5x}LJ|+Q70jPV8gIp8HFEhi2WE5n;3qE@G_Ng4}Gnx!v%&cTe zVlcL*w*FrZ`uLTnw6vP(pR}-TuKU>}5;`f|ibo>vGxHfXGPk3F6(4cC&WvbBFg;uBi*Qolu;su~E6VO6ltj-|! zajK}Mxko=rDSy#uvV6z`Iz!9~PLXfrjr{p$!dvWp0hLUZ>(`}4>v(jdR=nAe>^H)I<=+SJV5*X#f@hi|w{WB&(YGfBfE zVV@~cgHUV+f~0P6MUz5Wzz-;wqHe5c=8{=CmM0~ma$S=J)f_b%FD<6Ab6rdlHG2*y z-7A58oD3Q-#hF873u4-ka*Bk31>m0cwz@m5-ul>x8#BLp`d{zm2kC(RN;>FBXcO?) z^O$hq?ciN}{Z?>bNm{5WV5X%8tf=q_85GCX0gy7m%GCoNMQ6Z>Fl((b=3pI=*fUQ# z7Kt}=lo(^?CY?#lufju!pm)5t52jv`@BInyz2@s)xi4dmgZq!QuFy%KwU75C1+S+F(&;g0KffKT(q_H$fY~}GlGE_tj7~PJH@)#X z@Gr3Z88qarIH96&78zA3C{I65U-A&qK4g$sSw8lBVfTB3Wx#>k%cu6?d`q#kp z1k;L)Y63;h+Unk6=UKaq``vc({DFh>%i#&6y$B_zz|n@N+L6m=a(!HDu&xD~g_NC{ zvmX3{?66TG(ehmti9_ldzdj}2UGkbriKqE*8O(}2SDunv4ph}I1g8a5Fk4|6$$%%` z3JFdT)D(neILUyqM~Bm?g#;|0|E*iM?8S4yBdyr_M1hza6Jg}cLmidyp_00U;-Xb( z1+LynYZBG$obpWuAWvg^xLzZ*9?dN9YJxD~|BD{+YHE_&Wd92whLjT+kVFRP{pztw z+_nlAQ0M!?ayb8N=(Rm~up243{Vthd+CZz8kbXGx49(_0*f2Ee8qggBfwM1Q=5;nv z&u|?_k+Wt4!e-{2PiZ@kx^>@Cu3Pk4fXSsRl2Q4?z9{fm1{#_7%bAStx1J|4frgnQGS>-uNP`ebuvM>T;3JkA zIp0$Mlgk-eed{yhKF?HhU$!byo0ZbEyJyp6czR1o4UP%9WK>_=-{C+59_B7(b+a2j7%e#^}{1U6@+<&?GxW_9~Bd0!hS z)OW#N$~)shX$x{QAKwP@bZ`FWuJ#uu+sACRUbKMAm({-vVzRNRNJ`0YN;fm~(%56* z1QEUO~90SMZm5g zMI;nAp3Z0K7jP{$BA8Q*RkK4ye0ukfuOo;3hcb@AGML#>%4%QFVXG%~8A}IWMq#l5nvt?I3k;ls- z%%(KkO>NMPf}vr)IYC_XAPI%iJN-pKsZ0sx<(L?OCU;-&{! z*7tu!w89REUlp$H-&|U zbX$P6shW9%d^$`k`N=gt7VbHnhxe2owe$pnHP8(%%`2e~@d5${MEwyP4eS(6yTZIq zaN!dHZqW4_O1cy5908+utz=)@b5Hu-CwzO^ju1z)LUBwV;xQATs$J-BQm>6nQCk;- zdl9e^znLZU@ZEWYnI!6ekz5OKS+tu zkkd-m9>Gh-+4@kS-5tM2D#mB z_eYl1tD>9g)9n6r2PG~z4(8F2n9g0`t=NJt-ADv~sE6pcH(1a1oPDV-%Ol<#wM~hV zD(+o9x6Bq_@~)u3ZU`~jcBefX&Qn)n*ZK2vYG_6>k>Cuo_XsKLouwiSpMm7{w!%Vf ztAZJpn!`>_jL*=z)L-!oCK4OG1_Hvm_>$3*(OyIPpJ*rwhGgK{qL0EEDr|cIxoOPo zTTr5YoBsAMc$3~!RN3&(qJx=c1^;NKih|UaT=sEabn{GG&sxu} zE4wZuj6h;?o~G%NhqKF=?%OK><-U`{q}7fE%beHe`L1-EZaS+d|H`8 zXBA^Yjv|ExZ-{Y(!}AT2bJMb67_ZB*nu($aefT~@Rn6NX#^5eKe|8q1SetWFie-eu zc;3P>ius|&yDISM3WjXpp^V~NIzd!M%CvgmoY|=VEv4uJ4+sk3uC{2a@z1N7& z;RHSHLH^3e6sPW2z?^tXZ4~-70 zLN2I746^*%Hp@kNmk6(^`2QtdN|x@E<+=nqnw2kOFRJCHIf*RRu5~FmR-Q8C*faWS zJ^qX3BfM+`AL|+m%v`b^PFz4hoe-3NY*1xr%FI?fq1A~0)y?<@*sDI}lSlg0@<|=UUjK>dWJlLzl0YAl{mz=62)(ir%F{oM5z6~C z6~mYP36M+hWvBCHM)%81JIPBr4CjrFR zA0HA=mnk~vpAiXr0l1O2`k9eH>ou16ub&;W0k5F(ZEouKp?CZ)kuZ}y1}H@vBpyJ} zA4<7hjUymtjR*g~767*5V}uU*!1rr?yd)OwZp*w+FnqVFZ4!sZmI zJ647G2;^nGD2gL*DzkWEtqH47Nu%rCT4AL>`=w~* z6Ix+b|0_8h+Y-A}P|ns+${-YIYq-2lc`kl(*S2jk0bJ&3D9xV*OU%8mjnpH_K@x~3v#&Njo#+6z)&(Xgyy;k2#u$eV-6%)ja z?s3-qs9zDJoAQkGz(&I7&h^su@~D4UFJ<~IhKa6CL`zdsw2IZw;DzCFvJ%q&YIahU zG2=rJAdyZIj>g9ib+6fIbsWOWmiPuznIXDE;1K1@f-v)O`FG_UJ7qWVmCaQWlj2GB zlCP0pv)An3yilEwvKSdy|73qi(kUnV=*ujJ6cIRW*+<%RMA*B^0p5LPG4Lfxno zLVBnIt|O}T^yrC4!xAukA<}y(b}k|t;q*ZHSeW}q!0TR-1(2W{+O|aBeTX0` zf3rY?1WDR-J_(3T>9T+^WdB&_-gn_XD(o-t=`0TXBo#1_f{!x^_go;Z{%Y%3WzqCD z-(3$SfwRSSbV>pjW{FANKkPGm8EejIBZ*aW^h5Ro`dN^RnWN%G6zp}Mx&kh5J^f&2 zZ!cLDGRH$bphqs)q0+mnMaou%6ng$!rejNdEy0)&LZ$e{+LRXs?}&(9NiMiZ81CD& zUUQ5Wg6`fHiPq-uxfmjpXDP1W%X$y93>Q36;j1q#*3fHn zn(nv$RmI;%|M)V_L=6~^7H3ZEs`>h?E{>(u3F7GN&h>9Et2D?9?Yw=r$fnwEb;@)3 z+P-p~%s0dABFR(!xKEL#N%(R)qw3I4ZDWvUH*WsGG|?l2%|HB-qt%73pC+=ej5jR| zUTM&TPyo>$TVW~VO6>ABS(36%T%7wjm&nx9R#A=mk3qng_hT4THQn;yZW12-->zNq zh0FqeHRyIq<4;OLwORAI(IDtf&_=U3=5VwOv-0t%xHIc%FaZs}?uTTdbKga|0^QHe zY9I8bx8BY;NI4PkK*GH&om;dF7CT)2C7mDR)#R={uhRdo+KJs4OQ0Kk8LN(oKxbsd zf_$9hM`T_P@-+-M#8lP=}s>T<>UNxn&1m?Bn4B;m@L{YOwz!047D2ebQ*Vj>9!$C9D zAl&Y4pxoCIOoo`_O?z-7ensX6D#UjlGUsH!VeCZyvM`}TjNW$9nf&-9wgjo(Kt_^| z_JB8hlZ%vw>5TB1wMyFQ5H_PKP&eX~F7Re9-DgF!U9LkHCV}C$xR*PkjX&RVL`0v8 z^H%zUUmBejCme z#<#2$iEs_YYkyc9n84KWg)G=1+K zW}@DVBOJYin{xZF8k6C}=IJWjIefhPcx(Gi{}99Ap0DoyIP3zrj^|@B;Tyj3K0o}f zWxoEcmZg-?iCF*KYOJ8IPCg?|p&B|a^pdFWIg#d9l5~sxGSZq2GlxGPlPoPo;gS z2zKe>>p!bu8;@e5wU`wcprmjj9{^8JBUtPuCY*}@IQ)<-D%}Gsbh42!c-!LwXjLEbY0Wfj_{?95umZ!dp{YvvUptZlg3h+cYVaV;siG6MS=> z`ouG6jTbT%6}Ugk26QaUITaOE`3cmODD=v-V)y`N-nPIsE#utxv zlUehS2H*B>Fd!1vsk?~FgrG|3h&lO$1Zt=fBh75eEQ=!^v{&xvJ3PgLIqoT37fZz7 zdc{X@zna zy|%J6{&S!?3;nbSK36MT066p4$4Yep7#I0Y^;KNfNFVt_+@fuAf~~oucF>=%F5FOK z=5o)0!92oN0ATUwH=-W=W-8u;!#nTU(Ce0$NKwQ6<}OI<(i?W^eCKYz&LV2N_eQb0 ze_$@Q?nUtSt`M#_)zrCJ^IMsh)X%Q^4ZK6 zrr+t%^Haa!Nu7B)+s-Dek6jdvkhN@T#G^N3dG3n%&oagxcP#EBvfe*IbBlUPK>!{3DK_(7{6?2RHO z$xhEPDZV1e+}t804y2r4M6@MJNSEx6qL22>yD34PGa6rytN`IY zFe^~6{okyh$Mp&@F!-DqUk70#EZkX5Tb!;ZP4!U@m0Zv^U-gV#!wg%Pd1(r%v`+)V zX5Q0gzFwL9*&p%<(gOv8uOb$4rJXcTZ`V*Wf^ek>;ZSCQyO<<+=(#?OTtC@DsoU!~ zfeTuXUn~#~Q?v3QqBjTd#F@zKR0hpXCxYF1g%8AXeoGK*xaY>mmV5^;l>W?*N&tQ3 z1U}6MjcJ8-E5TDpeSYj?K{o$IkzHhX&>%F&$G6#w%{fs)Z3%P2r_lILBnVr@+|l&K zZFnw!2O{BZF6`Jk&dOxb#A|SNM;k(Q=Cf0Ti5P^+TyH9j_4(?lzP4k|b|!zqNRD8U zV0iV_gc7<)6|(pYO7Fq#S5M?b*^TT!{YPzHP97Dk89!DTn7QHX@W-xczhtSXW~J8W zb<}Qnu3=6V7lxz7E^i={l+!SGjt=f2w+t#j$JcGBgCs|l4;wm5l& z6!_IF>a^xJlUGN?X|Q*azKPAUh@JW5fXq#_KgYe1s_Bq%C~H#m+I4eFqC!QCvDwb| ziKY^Y{XOVBI?4H9Z=(^q{wR^89Dl|Sp$W~2(RDWr4`ZZtqOX}Z_OLGI9kzfYS4bQ> zO*_|^C~L%h%#=pT`Dl}`$w2AMOo8hCOZfg!N&a1uPyB}UCPTwPJ^WgKAPVz9)ILeS z`7Hr@xZTyR0@h?w;xuR+b4Rh{X);j+_!G^$DcpiCY7Tvbt32ihMg|nR-mTtw@LSY- zHb~iYDl_4$#jtUQNzdl@#?zZtZDO*MH{X$Y-toQ#jDUNVw%wU#$&MSt>V7J`f-x89 zl-6{^bVG-+iw}_Y(;*)Ch#?)bJxE7jt2;2~%%uIDva)OVY}*F@Y?frY3n?^s^O4kxYuMC;aRapHA=Rh=Pa_5--am z=swymrj8T!UlK&KxDgIZMg(j$Y!26&6+TVOwxI9_UYXQ+^vjQaY@`cujE)6QF>b3Q zh>ajJ@LV~@6;RG!zmj?ZvU`Gva!n6?4$TR*xJdM8`G^80U8##+!R{2GUN8CsoI;MH z%G913=nISodba});hn!D=m|D&*ucMA`Mq)4(hBx7{*``=;h}hL?)V5!EeJ=i$%TP~ zTU`$J-?4<}H2JBo=wF7yE=2Yic{$A-H8=b=(*9r|1vmw0Om--my{XNMFYpi>MZZ{m z?Zf4g6-8fK{g%r1%)CSYyx(zYeD#-E z3sy02<*M506F1Xn#wxc$&9!_Q4Jxd{v0BuXon0Qs`6JyyeLLI{cvAdx&X`feSG2!5 zIA_~-n0fwHc!d#x;)kPJAtTo(YszyOx{0BGQP>Gd$3JgY)XZcfJ+m*F)8lps6w;nz zW+V*_Xm@;U`!V`*{GiV&;yaqY((g&#mu^zyq8NyFs$ITBtfWx!A)ilsHKE4$e2U{B zAyQ9F59*U@vU-xU;Hi*5@O;v7u%bbK*-givEL~;PU=p{&xwt_QsXVKW=(ydxcm4%D z^JPCq)74BpU_s6jtj3lMMy45fHSN8$u=O18<@M;pw!XZjr9uBhe1*dq2`h57PZvm$mTi$5M^NypnGL!HxbTHg zpdMuXlK5@lDS~ie+(p_*Sb7h#%YBOe^p#8b=~CGa@vwP0F%t`L&~PEfi#%Klz&a*D zp9GASA8z+3FK_qMun|NB5elfCO+L@~xTF$zf?oVr{1X{yPNGxcGu||pI;{-tY@ldL z6=MM2o~0lHl{EGpkQ82-{ah6JzM7#p_U1J3R0<;fWv5)XKy^iS{A4~;iNcOU6*TgSiN9~N8Z3-QRa&~jZiqh~6=;0qh_qV8aVmgzFER2}w$cp1EPpWxh!ngRlajrb+>@43fzPHFe zWtI4m+x)6O^Hsw?eSr@9id=6os;GvuKw@com`t&A*`CknPz>FS3bR#C+9gx@=WXWV z0EU{m&4fjepd1(o&AFc|jI6-4c*eX-!jVn@B22OgrIcr9p(i!m?!o%{9R`XgaiaL6 ztccJ)LM#7H_-amDiI!#7?eLtV(7%&|@a>Fz0oI#xKxsCfBVt_cIkU5AY+2|SSEsiz zYs+oAP5AiJH}pjH5s*IpcoMnoDGt2HDjQBDSmC}!Uf*@0@Bg{tMtl;~h<&vs^)u>R~qYcVD zjQp~0jiNOy&`Y){Gz;o|gVwqLdro;2?<_-LM^mpa&CkE+H{molLn+moPCBvVs< zLRamtQ7>g;QT(i{^!c@X)SDO!65?x>bSAZYkd1fQRPO$LLvGX z1x6cDgDii|{2N5Qs5cYzbobCRf2~r+`*jZq)#gMsr3j%FGLbF2?QK%XR*HG~O zyei25+F}yCBJTE3uYC5nnX9guQ}+I(zDn9|$!9f=$~lihMC*s}x3OIYf9Ch9_&15{ zq!JIeT@?ORX-`QdgY*Ls8tc_%QhT<6P12t!Wn%-*FK!M4k|}RK#&JTb{jC;%@GY%O zZ1&RReDpQGh_2fHu(2%|$GJYFv7T~Y(e%SS({%GY?X3Td$l^OGs`BQ9rSFx+Gd177 z`9907VDmE>fotW}I&^)`4pc|*h7K)EighKw_lw>tDSXl{Taoe&R!aH4&%dg7OVBs% zWA0yy_YBd0B+N}uE;c?N9U0Ky|4PXChTgy?Vm_K-2E@)}BgAjb8t zHTnAREW3TBm7w=I*WsD4*QjaWM@=OUa)v|&d01Kgftx{qrClOZnU57O+m5Gql32P$64!;Z8-bW(uGX$mC zk=BnH=PN7?!8SD1UZjCZ8oe*)oG1e?QhWx#+~bvcG1 zPgJC>0txzoo4oo}B@vUo|G#fbPPW{CgOC*&fOpGW6@btIBiD%8ZUfp~FD9fzpc8pY zyHQSr0_~tTI)Nng8Y@$vb@w0{cD8XNJZ~{cst`x!Pad``W~nswpT2xv_3BorNuB@y0i;Em*WnB9elqgP$TaFlX}hES~UCJydDfI z6oc09`viJHa|gq^dmr@uhwsH~%pGNy!nt2*=Q9oN(3!udK@bIwga|WNe;s=~CJA%1 zRjkQ(FqF&WmE`IAiKqHv)F0px-P!RWo8!_%5G;mE&Jfs>tzct75FoDYQLv2*QBgWA z!XbWwztMpgE?_R(*HGPi7V(zvMpL3u@!u$dRma4&|h9Z<+Pf`YOY2! zZj@MMmoa|&<|(_0r;I1@?EV*KUVE1Yfh-Moa;@IlQ!zVfnS!uQ%?nF<)nE|Wn@J&GQ&k8Ls759+#H|O_o7shQEz;lcZtZU6*iX1UaJg6=wQ81a z_ogrTW2?WZ4x1>m< z)_Pa&Qq)Ro{ZL$_&5Fptc4GNVb-CVt^aMRHRaHBGQcN;V5bF>Vdyk_@?C0~;k=AwNt&h?5e)Q_M3DF4BjU!C0 z8NZ;Z#E>eslA_S~bxjR5Dy)bXm%#wKo8gQQw(SCH2ZIo<=FMcL2 zB0l%Nk{LZmr6xM#c{>bU!DED!GdGGco7 z&xP^M_VHTw!TVwLaV_|&L8I&Mp#+XP2e+*Mf@k4s2UUQ<<5xb$pKg`G;tM-r6>ZmF z*6-T~_mm1+ZS+u7!NL7|6_*4Ya(`Bh@+nr`bQV0kk8k|bW%lpHYen*o)N^}BeoB9? zFRneUT_Z`0#N%xmjXtuGj-XdRwKtXY1{L*gy4S1?d{&kE9(biAVFz3Jh z`6RRd|J@ORG+{tP58MhwG)&ed7kAD-jCRE4lLSP^kUkHw$SSU`BU4I835{++TKu3s~0gH^$Vm6@q zVm|G|vN365*pL*o{{Gl}7}s7};P=D7AYzEF87uV`#+GtHzP}I-r0>|Hg(^G-AS^+d zc&^luFjA6(xs)(i^+)>oJYx*aTz4n9xS%!B%#A>40DNISFRVkMr6)kG3;EnGHgpLS zN?88%bxl)a#jPUtOEoft-#&Ra@((gXsWzY-=(;D$vn`(K1OuXg{NPls6lU2Dk4kCK z>WfgFd4QD1U$*p8O2NE5XMuVi6hNC;lis5w1_OqMUe?-LD%(1*s=j=KqDh9fBeh+e zm)x)Rj?N!u^8&pN86S!tua;XJJ88ZK-;6z+Gd_qu?#teKA;v@e)cO>VV>7z6(g|lK z{Vog!OZux%2v_cAzL~Nrt>@GaQe37xYS|Yltn&u0pOE=i2Y=|pvGU%3I*XEix&Oh} z`R`))P-<6fDZI^8t(o@o-%n?$Ac~?red^GrvgUkiHUm$CHkZq zeyKLu-4$STPd+E-MQb98Q~aEGur)yA7pgoIZAok5P4m*~mrO%2X54Ezqa649V}!t8 zou% zvU!_;^(Lb>|jo9Hx^%G z5m~a!d3v-lD77yUR2lr@vi&?P&y4l|CZ|>tH*!-ifD--ss|Xh%1E{1=_i;`RBng9e zb2jfzH)8H;0$GS%gk%qRtV3X05S!A0h4Ox>!`$j~2d81IIOXEFxFr~}r(V#i5U1jM z-L`7hlZxIXv>u&>9^}#wU1}rJXK+4p)K6{lYvMieUy5uYQo<GICWX5C@YC-)FYZ} zF%a;zYG+=~d+K`a=rESckAIVv=W=^5buL5uB=^m?rZLOY&RedOfZ5e=O*z}<9ETr> zo{VahM1D-%mX+z>A6uWO=HL`n_Ul+RVGJ^wyga@Wa&Cju77G~br_T{E8%|k%V#DI#hDgFoISNyn*Q(ij@4CaZoByIz_ zjs5?Y(U=|gP$WpNYUjIqv*MKOO?&z1Mtg>hO*Y?Sg<6axd&`tb%=)&*mL*3>(V-T} zpf}wAL_bFX`3J)b+W^CuzhvG;lb!Yns$PR{%?kJ-$EA3`nm{1;(^PJ%uq0eAeEijS zN<|p1A)2uK)TjK=d^C9E4s*FSu^x}QcP`nzp5&#?!ne(fraVX${ z=)SY{C?0E3%Ze2Y^nK^J;27WBE}*5+qtznn-+x0Sd;LebJ$xRkU(M$cM>grH6)+Jc zs3iOw0=O!-FLhkqV35z9<@M6O*18G^kOVCIZHfo4uITxOz#4tOR{xKwTAj!5d7te2 zV~M7;|DhC_zdJ1M5Ex~cm!sE=y(?&8oTuBYT;y0LME)#^U;cMU|0fF!N(OnnSpEJd zlu;oRx&&~Y!o82oq{3am|3kN$k2at9(b3!ySDL*_7rPT5t~)@YcI9m5h|7zEk|6(Z zWX>?pLkGBGKsA@(Y;idYqQ!szA!tvA=Pj|BKBi-WdYrp6xWh#Y-7T;ov%FQ^k@Fuz zCDCpurQSrx3WS>sU|ElL*MGC!^#M|rE|!Mz3gU3=N5As>IemubhJ`59%s82e zzrtW7lxOAK>PA{;ad7Jka3^<@vGfrNfs2jL2y|WLA+d&o=$XmgB z(_=mM*QTb$S9#?TM>ea|R2yq{RCB&NA+(Kiz_@Rmj)lxJ{b8B$zE|`BRZ$`3k7&DE ze!OOP!N{0*+TWu~^;DOp1q#s1@3syydNr_T37K*9nM?#(aOgXXG&^|P*O)Hv+Vy(J z>N4n{e2G*hyw1a7A^NxoXG?UYj^GWZKW-Uh(rgpZ`5%q>o13#UfsERcmki0cC6`bNG}4}KU9?a8Wf7hv%waD=u~lO~MSTZHNZ4$H>X;nl z>~I02)l;W@J60|Tfk}lt?I*ELU4Wr7@BdG}a%ocWTqDp#RNF3Pr@73zrL3}f=fTsK zXH>|;aoi*`wqyIM)c&f*|7%qPr2X=Hbj5N@O5fE3x|KBAf0PyKf0WgX98hnn0y?@X z2speb7IE3#2+hBL+kSjh9@k)~eA)E(r=>ga{*GK{Z8U>73>@_xtScR?3t8Mh>N=Jh zVocNg5earww=(>pF|+AVzf_^Xpl9h$`x4=6gon+=Wx>p;ilRO+R_8W?kvG2oY&-`3 zk24sy8LoFgW5RLOx@(2m9BI}yM$MWs(Rs|z1Z{zpq_#CW!J;m^Tik=B#0tb)ncFyy zzcAh>D*|CWE{{5u1PG!|Pf^sM$!(5a4&!bBw)7qg_8_ZDz^AhrOKsA-9G{Pu!+Jp z(9GtRUP9wv#`@ikib!$!Uvv8*)RtQQM8i0xAmRv;jV(ho2#(|rKX4CHPY!oRHPp8b zzKy28S>60|-{)Ph`C4VGVH&}c^1Jh5Egq9ryD>cniN?EYV0aO1y`VDMsFC108sw{a zy??dB+O9-oZ@5z{Yarw6L?)~8^}2j@wOtR_+!l}1Smw+@`bm%uQ$h|Ft4bqz_iO`&$}et zr~B_}(DIes7F|}bX<`46BJI+OYWl|ayUG=R3VTV+JiH`vzuMnpLko6SmK2VT+HFaK z!am%%U48^VSwO|3yB}XpdvKu}+|xCH`#dym11j#Dzn?qoqjC0Es(&Y@AP``&h)~6t zLfcX-WR+L{Oans3Qq)-|M}4{ps6c`0RvsStt>9$%1_dH-QDjr84)xaD8cKE!Wwds{ z^F62eq3`GPPefwD#heGSt97*%G}|EHSK z07A+crEe<#0_$udnOsHx2@*{2aQX-*NjE+qL(pBK-+MV8R!2OVZ8?Roc?nQD`JZ2!PT-=wEcu6t#uAkflKk zh^W7A8?#SxL&Ze%D&|G9KP&j(i*-piU?Vt`YKRa5-5;XEV2JoDmjmHk7^sG!!Tg}< zIh0V7r>j2OdzUQVU@%&=3mkkGxRo$#mgbB2?OR{(Xg&+aMQFM+vpWnMAhd0kI(_UY z4JDpH?7esw*q|E5w>jp!VGFOI`)vMWbOqngCu%g%0yFZT<5+t+3%V~7p+hYFsBZQ% z&svt-#Xe)5IL+&>Nb^JFPIEo6R!LvI6X2_A(JN1>m&I~F;=h>9!<#iay2Gc@$I-GK z`&HAPD&iJb097v>F83U1)yE(@P&+LD8h{$_QN0r^d+y=an9o3Z{4iut?HY7F_i!_# zWpZsp54t+Z67}y7D~q z{Oe2cMFITiz1H&uy+sQ&P|oXJP(^oW6SI{D+C1jp`enRZ+1JDdIRO=zFFHfMc@m)6 z)4tI6B=L|3R!sE4s3%c`6mJ7H!AcGo%vp)L{X>90mrz%P*Ac6}x**J&6FWZXK3ut6 zV`jT-x2$Zx%+T{^`T4XGY*{Q={YRTnV-x=&uwL>k2aL|lM*~H1?U5CX=&sD=^nd<0 zY#99S%*IqUkgJJWwA42n-USI5# zoc>BcS(q8>sleLeR}8Ot3iV`Wle8W(b9^3gtR1XNZH{w6Xc^3ea_BOr`$@R;X$YR8 zGVcbTjvVuK70S`@L-=_r41Xe3{rTIz#9x05DPEYUtHnc>_;if~s0H9(j3OOXp*0DE zfhgTi_X#1G)N-p@OoYo=iy=6bW0#( z7~bq+%gH$?tjG;MmflTB&~(zrdohsRVncQF^DhLaW{X@uWyZ|*7U-HM!XECKwjT1dcISC9zIqcFd{y$AqKynwKYtJB z!Ny}{NRiw&m1tOqdY-_$+t92O5y00#R+CDXMW3MIK_wy~u4F4>>sH!)V@x7hoA&}G z4jen795nUKwkJ!HEVbCiUKt?xJL+8YrUyq}f{)}iH#c9CgkSDD%i+y4FqIpRY|juo z%{Q?4j>06JIp$^-L7VeRBqJ(V(`q@>3#&6 za1=gexN^=kgc=aNyq+>C8A9xo2>zU)+O#z^ow_-#xmA>o7)pE zBZiI6%_C9-(g3h9^FOd~E^IoJBTzYolI26Vr&5J^1r_Hf0`j<|b2p{DT3uX%cOow3 z=&?z12DpxXD2IsO+TGMAh%j!WqZ33kT(@wizyKGrsNE`#l87X`Fy9@ol)S)z(ktMx zg3OZXO8Cc+B!0i;045ja$B580iC2fGJTNbYoqk5pB33zGPwyl1gE- zpTIrQ8!C+jwUql1*_W~Y`|?}szSt7w5XI+$F8sOV&!r)?+H+M|(J<1aEIaQhT0qpL z_JV2%*hs@7#5iT1L%A=Y@u&~YL>c&rlBw@}6HW6w-CYZKOEsupy#i`z1-WM`ZEw|3 z5-oW>n^w)+X&ifErvQjO)cN&uw_@cnG{=9b$OD_3-4LGGu^@F>_5Mve^5=HKzlmI3 z3XE;rv|$r{gW6AfJ0^70ph8NygB-@G8$*8OS<&<4sA-gkyuhxqQ zDHB%Jt;+k<9u3imK+VmXfa6vJ90P{m6Ya&f`^1km?KOliN*7}BvILgP(jt$pTyhzd ztRi@28~KYwh`%rllaVwsVj5qR#OImf{Mz>^WK8kKP`EtBU7r3~MlDw*Yj-IwJi0cRRA_tAe=!3U#fk;^=+@T10U`pnM+C`K*C`@eH=sNVoadY4sP?W)_g$V2=7VCxIU?{;V=PJu} z^=8T@jmz^MD+MQnH@ePKd~FQdCy1|_?XPZDFb!ne+EV(KgZEy8U97hMH$A*gu=ukE z@V^5RzK{2p)|6^j;f#aPjOYqW-~db?`1vfr7`dH_tSX;oNkiL$O)|2Y1!g?0b3KQR zTnG)V3+v(McQr^`suUS^Am5-)jaIv;g#rF~;-{b$$4e*o#%`UmOXz-^5k+!nna`1z zt`2|ads6Br1m>jc8&3P?fV{6%jHX*?|GgL5uw}$qxv>pRzK)jA8nRHp76B=;Q=|zl-o5 zwHTLT49Gp!>_8_qH0MSjI{G6pPtz6{uf-J?b3Ic_FV1eM&5f2@kmbyv->N+ZGPAnD zn9Ri(%q+|?TVDH~orfi&jUv#?zyz8o`tw>DUrZYLXIIpxfYcLNq~s|ag*KS-x-L&4 z%f1TPABb6~QzQ)m;J~%YCRx2SplvtSM%)>W2?=#WNz8|!dk;@dnef`$p1(6Isucc; z^OFNdS+~H}k@`YhB#}J%WoQYykospu@))K(K`^P+6-H8=pcv?Uwk>B|T1vq}y!_dd zF;S+5PXHJ)Fb5nV0u{&vkv$QpY;e6x#vnSoGd$j;?YI>Ta=eb3(uCrbU4JcQJ@pa6n#iz)>~=i! zFoNy)T?A$$E4cXS%E3#t%$MhjRPFJfNe)QHE#}Zsvz`xJ92B=6FOB1Huf5ILrw9=< z6QRTM38vYe`!z7$Pdq`%9D_w)pr9+9XPAe#tu_%-8j(mw_xu}N!>Y~T4GA8J&U;Ca zBq^i3A(?&H2T72N)?{QXw5$sG+yoH1OJqxE*(1OJCsiUl!?66u-4ru?Y-HBvURBg4 zIP1gbIimG=zvb$%?d;FgBE;w5mz7WWlcUurw)jNEZD7b*&>;?R8UIa6 zrUWt}e|K4lG)iRPVHbrBDK~TX?Ef-VOmdLLf1tb-J!G^|G&b$LxoV_MFmr2JEKQT) z4HK8sqfKWgYGAfEs+W{>aV&B~UBR^af@4qYxkU>EtYOrok<2h`d?MBG2!8O;<{KC_ z3UFcgA{k@zbTv{2=uN$hskMGYP_gd#n11FO*(MpnMc{AuwLRJq_+5CpTmb17$Ja^akXLTOew}phF6KYekf-lBT|s9FQ3crTO6NP%H;omb8SY zQgQg#<@<@TO7oic5(ZjFxdP>>FHdo4<{6H|znE9dIfqY=D0x`E=B>A*#QJ6-dY3)3 z%?X=+OGP)Tn&(p0l9)?QC@l(B6;EowIz%0=mpYBW?Gt$!kr0n{(}+lJoV&H@1hdmu zmRuwy&wFR^`_1M|*lf(Od*E8! zaOj)tFbA;qnuNUmSwt!KoSPZTvpJ!bfH$lDFVA!va8;_Nn3&&#Mh2?C%=i{=(XOD6 zno|3L=JBxfl}e5Bmmv=@mbaVZ>X#+h^cZjXhYM+-%*Xwrva06H3#ugOhCA$hPbnXL z&Xw5BO;~uOrs zl^zqe6JJrK9e=rC{zADCpq0Z!j*l^FEvmd;Bs(`4=L?veWo#CkHu(g|7_JUC`+!~c zkJKo{zXEYJ*>Z3s$ew`p_colbzosx;27VW%|KT_%9}5k{0cFz5+LjSHh;l~PY`-Gy z(v7a<_dxc8_9S!4bldPZGv?Q{Ysc^Q(OKgzv87Zo>75-jjGxYh;WPZnaW27@~#<-Gd@? zV4cjyk-+o?wB*YD*_@XQMah5=J&EIsve4_84QSl_F00q~gdS>0;y@SJE0)DXQ#r-0 zjc&eLOp%nmc4ZJiKkxtf90`+qB(qC@N-iw~tQC8zBVWX!h$mL?nXt{WF?RYEjp}ru zmjG8VI06rCHcWDJF46Tdv9eAM3D8emGD3E9Ljurj`Mcjly}$UJaA`YSYBS`KBC$Kq zGi8Y<7MfXM@zh;l-f-CGK=QFglMr7{CaCrgpgzNT5AXfsrzq#H!<6n}tsY5Uze8EuX!q zHk#TV3w8+bG<}1a9|Ba` z&5%XI#3nZDMSu)(qNmh5Lvn7z%t&=}OKIDr({FGO^yYMKlYZ5rIx`agf*JJ*TQCML z!2!7Us_CL&Nwh#Ci{``d?*d*f-hmds9#KGK+Vhxy4`<^r^EMDdS6xD*(-^u5?Y;uv zmEX-Tarufe)R>9pQ=hl|mT&Gz?&-Tn6W-0Tbw~x~35MC(**(EFLQvp8la#^jr67mI z)V3J$MoE^-vF#F9&%$55QVjYvB%cIYxsW9{n)1=R>-eth@hR#P+L1WWGj)5~wQu9l z2l58$4b#U|A+7gNkK=!oH57U?J^S$t=Xf8+z@JJX)}k_1Gwd8-D0Of;>_{pgc#ArU z3a>;iJqSA5a-jw{>YVS)eRnwG*3M3610>{oD`)C1u=~=d+QF1w-9!1%6%`{N2$HxlxO7c=~o45-Qu!dP3JAMqV z{LwoSw{7Ym6dv>IICS9TlTSDPc%ET*7~a56>uIaDyRbz4RNec~HH*cn{=?Sz;~)y{ zWtnebdVdmW*jv&FML`T9^uYq=5j(ikL=#D+;NY}qMr=mTh0sY5irAk2n<|)ronMl4 zo+pBCtwz%+18y^rrsZV#j4Ql&%07RBZ`ng{*;CKNqq(ZSNqQ=s4$*!w)C8W>-~5Zi zWBxSVWG?yr`X7GjKu`tz8CWfR1pl*{3Pt~0oU08Kpx1Ogm14=_AGIf4+lj3Hr-E*M4b;5=@pmsXNdU}8*YS0B$gH|}COG+Lilk+IM5XS} zi^^}?J%p-Vk<^lKbTwxs5frQP#YPb!DYxWRlr}W{ai4#ASu5-=H2di71zgX@yn-=! zi4^I^j1)ERB($hVZ=g{~S)Qo1!euI_G*Y>Euj<6Y#OBoL=nCxI?V?G^6M)T2Ux<~)y}WcbdT zB8;u?h3N5dtG|XxV#_b9KFfjC%|4?W<=RuXxtJj}X9Mbqv_97%K*(?1{`4M#owHe& zJ_$YP+%HPDSTh{W9fM9&eUY3U^OpA+M#FL>a=4vyS#L-8W*Bw$HTS=F>}ZE&g~JF8 z$~EF4U(?o3q0HfOiwC0Nhem@v;H{W_qsFFLOJ)4pCxI%*zf3NnV_lil4@nL`ZAJ4j zp1Hn0_c(FLUU%gPQw@k=qCJZEU_H8$?i+ct-mj=gJaK`jR%BMjIHRuua%ml^GJ6L7 zbDv4>`UmE^c5!ccRb-vHEzv}7MjYVQvX+l^|I)kU&`y@85|zrA+mrbuYCX>{P8O`g zE{gxyD>w%$__O(%oR-l%_-x>x z1({;be!0$Fgh&K2a_Uv-c(3L*ixd=Pj?%&i<4)OhcyXihcHQI zNV30`Gb|b(E|(lZVLSBDgDRl&d3V0WQ8H2*@%)3;U!PqW!d}en#Oyy;ZNT3vYWkBE zpL&hwc(x<;sB)0E=kV_YcZB>dgESASc@_%5UV1rzf>E>e1+}A~TmCASD z!Sd?qMa?rbPs~%HH{d%Kr60Pw``|p~^yVSax|(l`!u4Q)H;Mx3>jT+)3yj$m5ElD8 zVX)IS90-eR5%n1Wyq}Rzh^N6{9!5Smm<>7V`19v~wE)|XkCC$ZK31$TnuC>NBN%FA zF1iK~w)6~8Dc`$-(I|xy0r~IMJ8h&~aEWrR&6;^3^&zP8$HKiab4Siwd%(SFVZn?% z<&@`n<red29-h11?}>ea*$;lpSltqlQQL6y?m9#2_^Qy8ExLsy z-1uA5JufVmv#`n=SdwMBKepe|#$9&UYtjoc8>7 zY;%ZlUjRcG{0{vG)MglSrwM_1h`~$4Ef0E0Xrf)zuiWk>>N*dKCKET3wy^x+kWUr_!oOJwWv} z&!@Y1T<1#ytf~2BZCcad?9oAA(}w^2e7TPG>6=K50bsWN50V#Dy!?`Sr#A5R@`x}I ztG2oDKZFw_^v|2(kJU@TE!PDG(VJuXxu5~;e>UwxN8|E*IRBITL%RBe&6b6wB3;ns zBOWH1b}V9ZL&k^z=~eJwLsbkXj#C>1QbeYkTTLVRML1=2j<3zDg6A@*$h`A9UK~qb zf>h0*(X!}k{OB&H9>!JSbs5LEmQNDNh;q6>UCqE@b*b;v01XC<$9-Z*Q#j5uP)eJq@?#<#! zB9ZzO4l9cTt(MWiJw&GABU@iCJxAt0g*?m2e(zQ{N|8ivXwN_Z)am|AoOd+m|9tAU z3%w&i?n@l_qiLL}p&i>b(6r61diFtw-)mfaFXEQ0Z+hD^4vQvO5E3Wd$8%%j*@j>A zm2>2LJPnO*9&U7n`7LW_e)MzUgOEeEzTL)ZDu3rXb~gT4ukYwDf}G};s}iejkq$qs z_hZ*qI1-b(9yFOY)~>GjSz6`C@tc2Fv6_b|e(EF3D*1cw^EsS>v=_mur$uV|4A#p< z&)?f^n_cZzCv+E{Fnzz$#IFB_)v9~2p!4qf+cJlwnm_>U^IFA5IeUdUm4TgWumNdy zwoJO5NAy*RjJ(WytlkyxF^F5let35y3)V`^!bU_rnI7+xS6W^~)=!kHj^5}KOZt^) zzI&AS7W@ET5$JV)I#Bgw0^SgGA@FkHV{nNWQ`p>VtsI93r?TL*(77p*E`jiRlQk|y zUAPJ89{zw5wA37=uEeOq_(k@PJqKV6EX1n)P|q%o%h-cU0>}G0+_mFdU+{OhCa7H4 zjx1dOz)=&(l;QtEo_1q=uof|xki)gl9KFXf;}UfA(b+*(+zo9J(vn*763 z92_53kJZ=1luKgsX5C(6#B~2@T$Xu7Sq!&{@9X?qA!(9DSfGs*oP`b~Ci!1)$eN5F zi~I&bmRn(`F&R5R7a{2DrW=_>1(p^-J=v&eS}A}5RhEdHD+q!G9Pye~m<+1?UZ)Wb zh;daj5hDSRlR1G832g})&@|AEXr?j(h?`VH*l8h>+0EV|vfIqw_5xv<7y<$4lqLZ@I1H^y5yY zheK)IVBU_e+`<8gzhqKrE+79GOcr$wm^<=nKQ({UK8R8fNJ}F<#3dr8rPmLqR4{#e z!4L@Er`7}>|Ikr()AQ7GqdDWyAH7%kx@9f5gnv)uzXt|V`?PnQpS9Cs!CJ6v&A`(AON8)pu24h3CS9jy5cC8Uoj+%I5;_KC>9{WQC+`oV{vl*j=#t$S2lf zE&^`?y+{te`&5Z3$i+i!J|SY&_rmGK)^2Z1X_jZ5HSgC7f{``BWE;H(#_Old^oyr+ ztbWN(+39Ah%oa{!&Jhdv?DIGZh^AE1~)fQ4s@<9b9V@6ekdIe&i4<C_W{32Q!GqXBvjD?Y$a zD8gl6gZg^<1y~L5(DL-^#8vejHvks<*$aBq)?W*#WNx<=7`-l48h)2j+#ZPR#DAqL!h?? zfBI&8?u&mPPFh^tESGqG**(jUG4lQrtL7fR1?HQFN723K?`}Gc1J8b+^Ao_*)9seq z{I+bHz6go>iKOdMS{_h#_Y3YDj1>3%P)}MZ*;qi^ZCM6d82OwH9KBis7!Z1ug6cHR z#geyzO%zMx#r5bvay+LFEPHQp=sz!WQnd)Q2DAQqOz5)QSLrF_HjT2`vWQzdeohn~E++(L;-gn<;}T*Bt!*-RFHZD^($@vN1ITOx z9)cf}1>;-F8w%R@f^j7uIF7{7IOr%l@jYe=g=Sjwt4k3Bkr?6=)5vgIH9_hHB-li6 z8S`+#$PBP5H9zCpOOOwG{>j==68OWvUQ%hc$h_{T?Hk>V{3ME zxFrvq6OILVRs+!Bq?_xEl2n`EcxN>Dw~WaQA@u`Pd3eMnH$>5e|CJUOHe`9J{26=( zd+z_S-LUS-k1AL_Nx;`xb_i%s%Mn`N z$A^?i@&sEcK;wq5KDT^s0YUDH*tdzqcg{{rpWtnpHwx9Q&o={I;IA9;I+KZz7oVc| zR{unHJ|c$TD5XYN#rAZ~VjFIhf{7tqf)BRLc%d)qSyCf%D0-fgbUN3^tb|~)F4MC< z`g-vSs05wpceGjVQnV~xh7fAk3S$&iDOTqBFiPW88D3kPAJP2@F5|fh%dKt`zPFnW z&&o9w>2M5_t0e?F4Bqfgw?KYN0E5=V4>8vl@zC!T5;eg<5i+%Lv$@#Z4>7;uw`6L( ze}1;^sIKjAxF#PYvKo-cnhig?FDjK5Y~boCZ(vHm@h#Wnjl8y&?bGqwA&+t+Y zjBm!+TI<@H<@3nBM+?%vLaDCtY z^qzwB^)Tg!3r|I00 zYfp&HIq2{F)oS^^0zVcs$0{W>!Z)%I=d{P~l9|AHcuJY1=w1u4o!BS;*f^yh|OYl6p=vD8u`<{q8=>2tJj%yMA%pCLXA&ojc zXsDa;(r5~wP%FF3W--*xnMJXyY$mR|J8Fmjl~C-sh5d7&p-l-_ zz`B({M^%-Nt*nN}&XHXV)eNF~a@gv6ZJEW^?bXsbi}L3Wfj!QFiDa-PnV4hJ4?2Dg zDf5G_&duc7$7rKRhQHWhpvrP#*i_^Ds=(E%leJTQo%H-X==?#4^oPesLIFSH1mWby zW9FEJjaUR+!o=IAN9Z-@oI-XrO{U1xtICn?FWOnOeJ-Qw$p|FwhFL$2h;n)L@moRQ z5g!)vmUzG&_+l-N?eb%9U;z3B8;u;vncqHhcg*E^4D4bs_hw_X-Itsr=ufty_bQvr z*H&K%AH!j+KdWQoQUc}jn`ZkruVUYHXTdAm^w}Pwz`Vg9*Pf+LAYxuPN>cAtTRj-q zK_2)-W7oXRi0WM~Sq^7G=HG+Ym*{NK<-rN$dXB}zGT$u!Z1=V(cu#raUF3S#u+oHX zU7g*rU~HOI#twEj{JGiC-U18neNOxf#hRST?c*91b0y&a2k;joLRn6S$6vU$RKo>% zp@W+i%f!QA_Qk<4JxR40l8;?kdQMt{_?%2DP}M}i*KIUm>f4oA`4I)QI|X~<9st;< z=dqj_BSr>H*8h)=JU-V^@PC{W4S#av@NwA!!e6n zJ0Q70oWxVS>@r|;; zZ>D%fCH|_(BMej-a5!~lQmY1kxfKnzAPN?gi1ay0%K%pq5j`#RG(XI5pahWPrgVaP zf=M8gs+m}y05$tamn|!D2pjss=fg`)m2vPH%D@H>deU=)51-+X>jlyeh>;i9FT9;( z;d)f8S#Op4Bj7XX)KId;n&obKb?>7Lq7`nH70LOhYAR*M4Ja05Ice+&pqhP8r_DM& zN$KqKM5yYEo#T7*eW5=prgQIZrplm18pfe8C3px&%{E&U43AQd-O|00iH-zv9J#gG zW$(p-Vl-b36JjB-zy8&6jv)x%i?ZI-<|$(J^#aD6#eE=8#(Tdg=c&k`VCn7pgP;Iv z3%2h*-a*Fq%y8(3woy@or@S&5xbe&21W z_j=iMUMEmF~s|D|J0#rJ4loA`05dAxKp*t!0X;!Q)4M+fHj>m|zX z=a)fqSg_=$KV_PjaPjUZzGg)F!ESmqpoI~R2Uq^*PC@qG=Wb(fH;psLPL!m`CFdfE z$Fd<-7$X+`&dpud=Bl76X3+=yKK%lff|Ybtg+4B8?9;x!#k;N)E)kj&KrFU?{1NlqO)eB84tg_7p{OQ&a=U;?e7jK~)m5eV0$^g=dhj~g>AO-A zQk7V+SVD~Myu+?vQU&8PT8QH!@S1!KYOw58OHH45>N(NZmZ?e3#vm5>%!fS?HgUz+ zjHOi(#iuH-As*#_jc`>n`gE{}N&x-42GGAxkwPs}=NC+Xe*6dC|M((gtgkyGD&PG( z$aDtrKb{@@wMC?J$)GN_|B7qd`Ms~Sf)o5u7fKU>_W_9(x^)y~-v@vq9{#tjqEa3< zRhXfr3jUrr(QnRi^+OsJ7p~pb>%eFNXNAFPI%(9@0l(;^a9_KvD9u?8EbKu==inlr zaoLABxKbyL9#C2M3QjXyM+5Z8!7hZmRR@-_kbImXq`Fo-7C6%EP@Z89XsW3lpqljz zhV}V6MG8N}f`m{aUxG^&%wW~P?A_mt1&!+(7w&+vBKr~&oN5j%7#u0+X%jx<$hpkf z7!AWc+T|#tV8f=_gNNZ=9@*rJ-)!Ir5Pj{j88ivTmLV*#ZG>u0!H8_m%U-$SY_7Gi z@&R?Lr~YR5H;befQ#%MDJ}l4|SuHwav(vUAP}OtQn~0$l)&-zZ0ow<&mqje*_84{QeR64>BhP!cP?4JVDUYz1y+LDljJ2ZeYsCqD)jM|g zWN>g}bmQ8iWwFen2pTK5@SgOfkN%ySLwzk~iKalS`CT)w%ooFbU!=;frfxTG11nIC zkJ5rLY*%fg7D}rkgf?;%d*|1iQ`)x&#dhpv~N@$qtGf-21YS&5W>L=fYXy$~7Lw89&hAT-o_pq5Q2 zo9KXN|9*lrF;xkIjpY2XVZ~i!s#H10cM?pKNXC#Alga_%oELqn!ytYl^XcVllK+u^ z*)_k!9RG)fc)gi$CUr(`W?!C-+MIm`EE0jIPx)U-GM$g@!Q}eR=-4rr)pK*7|31q6^hzq)RjI=yfIvfds?a6n=ZAwX*Swbb&h7PCF&XHDW<)SXr zLmCJPZ3%T<$MvJ1dC#0uXl#$BylIh*_=T#B$Bg1hz|Wl6w3t_D$c4 z@~U6<%or2dQLY2mbyK&|^EW{}au?fT53uXeftQ(%`)6en{=`agP3qZ0XgZ53e!M=p z-vwj$e9W}zo1}W%-`y=Wqv>UiFLhVN?`WRo^u1Eky{c7_`>N=B*!ba7I!f-c^+-dX z;QRIWp(rnM@LV5X%gM;pcu~i>BgJ=d)8p;OYThSyXb%v`pGW3ZzZ2|!C=qhLM-(^wi|_f_8iaCc-!4W$Hpk!Z`$EYV9pzL?VhhD0 zKiuGT+Tk$r_o{+_-kIP4LD254YxJRY9P}7;544GN-4>5f#p#t^6%X$Py5a>Jc*e6p z^r!yM-UVVBsJ{1*R+lC2m&bV#d02emTG1L&DOQ`sw7ZwV5^(px zmf_&x_%Fm#NTrKU%o2$PT`kq__k4!hu}>%Os~PHnkEf-64^2Micsb%h4xS`8AVOhY z=z9sqewqrcsN^Rss1I#ou|>9~jOfKB;g+8vO=(PNx(rWK=ZneWIHf+W<1ebaK#LfS z7$&XVUf^qHr5KcGyi<7}$$?`fZ_-uT26-XmQsH)lEC-{(OqwWPBp6_f$kX!5fVR@JF z_>5s$eWE_&tEAw5b7rWM)sQgspT}GX{ILcv%5^6eBbV_oy5LL1Fb& z&=ak&yavlH6oIOT=h)U^^fSmE_jg;vtuKC43zf4eP1 z-4tyUafh{1_j^awYUHEhoh$$SrpFhP{fdE{v_nFzyT;>%shm|3xt3H;tT}d=L2Q?b zb#9nKRLT7Qnt1hWp_bU(zQNU5J8yr{^?<+lYGi`xaypMMRfBUAxm@0{gDYc_Or=X4Iv^<7QtC2Lt^#?j~(4}2I2 zTF6+w$b4718GT(7V6c@~i7y{zR&}V1?3v)Ra%w#StV%~3(9x0aIcJ86SOx#-!(>@*kDm3P@D-w;5!7*UA@nO;`Fb-7GLq>Igl6#p23 zQ55?QvsCLf49t=#n@BOg4H&29Z8IR6IrA(vubF}pYKG-0f8i*VH+;_%#r{C!zDg!u zW$l-5eh6|h<4tqD6lURJY)ux|ja6d91=lX^P0Po9*7AlHJW<+BvyYQX$~8Xf^n!DC z_C|GeUegbHjcn@3m`#!d-XHePN9ZP=JSC__Q>-W`84nOsJ~a8nfvGgiCHIOJa0hB9f0o7F6(CMl!;1N4>8-@z8->3 z6{o2%YFB5c!6Od;GJCMgj;+sXQTsn-D#F3MF%*U`~IF zS`aWH@0kr8Z@=oO`eDIO;3cqKvskxU3Sjd`pM_ZD%;+9>ff>SJyYi=cK_@aR@!V8M z{C;X83Vk3Qd-^a48gF|3Aw7q1qIu-Q==YlyD=E+6Ft~(vvI?PJr?ZA*`ZN){VgMf%7H_VVkyO6~)>`c0wMgf$_e zud2~&hYoS5X~t)j<&@oXz2%0EiCl>`L*z5bvUp4N3Ab8-BMMOIrv>&ak_tCBS1<5} zM-SG&&8`r!(Fjd5Jlm!xTj!x!u?xDI8+-EZoxsJ&xX;G%zIV&i-Jt7g5|MsnHA!fK zn_r#NkCqpX_8tb!3rKZR>8Le(4vdzMwA%0Kqo0!HF`V@KQuaOlcL;V6k{-d_6Ii}E z3J#Z8^o*dKn*-#?mc($^9xFZLu6yOJ0v!6G40lo?t7oDf&+yS6WTNRtLQbIZUspgr8@l8{DIW2dVg6IWxke!6I2t0=e5Oq2>{i!dcdH z!io=t$!UhcXQVxt-#<3_zjFav+U0U;;4@?%yC0v=U?qD71(47LCbZnQb0mdsutS|1 zeuhhuchAD@Dli-y`$w8Nux)I(MT=8{N}>IY@}@ zL#CCfDrtO3n~WpD1;&ZEdlnf2+>$fuvo{W7V86lVCO>|F%^X8M5~6&Eo7$juc4Ar5 z16-3r3V-|>B9JGi9GiH-IQ%6}Z+T6bJK5Sy)^)MSBiE zBj5O3z8Zf#7f`y7+f#VffYC$y*b8yR@rO_0Z#4!%yU%iNq}B6X>@bs&YjO;q7*+h} zBR$PnLv?RkQ`h`V+kV#AU%W+PMlhevL<0JziMDj&UPBAbZiE0l$?8?0zhkOGyh`@I+pIX1z^cW!DAZw< zuPWPE6>bgN(9Jf(@hI%`XSRuhqE<8pWF>FN*I`F##O0mz0RxQWPI9<O0&`AvjkD-eI-SKM#9lu_afuJ?sYl(nZQC+xFEFr@kQ7v6~G`x}q=qCwc2pcGPcnjB?5_nFR1{a&X#DaEz1$1>E);+?@ML!=g{gkmR zE~0VwxLeP5Fx@swvVMIiPs{dh8Ct14e_-8+No3(m$~N`;H1WxT*bv?jekL5fP<_s1 z%GeYi$X!kxsz^;)A4o)8Vl)mU6$f(H28$<45~`>64M0$skU$0nBqyvmv~={F-{NKU zFZOI=2m|f*@9yN7Q6jO&RGbOyBP{r<@gS-srkY8lJ|89B*K?fO6&Ax7iSgz~+B)=aYjy=1NI~ng zBjolhzBOZOlMug+m9VHN$)OXDZ6y^UZ>JzaB5!QN$0g6MBPp)Np1i`fZ@Z2c)9-&c zU{F1)SyRC(GG|xqtV5-kXEiH3VFyc>0M|E_UvY$&FwymC(G|Rk|AaST;q4$H zXzYeDY0bNGf7cdi$qL>*7hY{;$Xw}ZiM+6KOGvsFZjJpNaJ&B?R7i%U;hT7pRO`7| z71`V;d=3i5l#>gNI0DG4XmMeiM`bm_(^2(Klxa;_1>@-n$T`JXLm6;4I zATfJ$B-;IXWkJlV7wzr-PR#)ojPQ?Zy?okiDgfPNQ)>Q31y6MVK+}l{#g%DzdT?Xd z>DccU$KqvbWhNkq>7Lhv;Owc)Ktw<{7CQ;>o_B6qyeRjty!Y(>;8*r%L=02v_>Y@r z%Xz42`lx*mew*euXb1Fc7OS^AoyLS#+cLP&*?FIxa_7oQukcd{t~>7z+bA7&;*=iO zj3s)^RvKpf9Z~8u$+~9!4gwG>Xnm50xyiCFm>>7M5ctUUcL%n8Ih$fJObpLPQ6l~l zc4(mtZo>>FZJR_}^^YUaJ$k|SqFPONG*9r0d~x27rAkJ8Qzy-&o*kwcqNilwu-dh= zB6Y-!4vkVsz<(bh?`ulG?*7o}fd<#0t4>E{d5;^xuHB*Eh>?~cBseEB0JY=W3CtB= z4XMG-Ir66h-F0>~%fMZzJ#5^c!htNq+h(6X5_fZ|xO=KUkQ*cMFxHhGi9HKJZMFS8 zUJyT2T6Yd;kS2uOA%YOF3&RWS9D`z2N#fqZ5l#&rfz1&`t#Cx0Q2wvqP`~wKsE1&z za?-4EUpKg_xTjOx|E6*A0=Y0TPY~3Cys-F!N9+o!khTbY zA06>otBVK7xgcd%{~AerUkfXQHXmDwT$%ha13QC;s5Ve|2n^6h!M)vjX?VP{?4@{W zg7mgT1EH}3^8?zk*2II_;-de@0_u~mt+&lNCnTp&&nsH!=^oZrBolN|Kd*3%eef{d zfA3CK!pZ)1KvQf(J%=N3p>k^eZJ|#q{%)ZX6=^_K`>-z(onVRvFZm?Px$W_uA6mX* z9jzif(g~FxMLp^RqiczRwMMZ}$cr%&Nk0v<(|WKNVr@3z|Iu{VgvQ3FHL@ zvKuQ4SUuikv(t)@ifLD%I zG7re1dlAV_UEp71&u-<8Dq0MtAnOT{u$us;BXwguB=RL@=XdlV(KgO*HWtMO6sGVZ z5*E@FGdRa+Y@U7!0!P4dJy$pRZzfr)YoEKw{Xu_!L?=7$z(aXwmNA+jN2iDI?9VK4 z&`qdV7_Bhv@^XD_7n5fugiBcQCb>655X>0h?vRz)*8n<6S-?H>$pG_*e6 z$GeAXD75UJF!J|xe`PwF_xF((oPp0=n|OY2`I6p%2#3)fv_9RJ&HWW|Oh>;Zu9#z% z^dRQHMbzmSxxf4CxM}t8CVJ0i3|ur)Ftpg5y+bC-XoH?LPM$|Sf44BSsCj=`qnZQ14o@tSlXhL&xOC+2lBdWjxWWP=?mXRCs@}9k}X?a{s0EAl7LF!Z$Dh9z^8B0 zav?>6*UCCx2E#gqp?e#(pNS#M%1r^XRxZ=PVU+viKLAJQ7g%%P=D!63 zJsp?;1d=XXf|b2z^$Pq83cDbkue^Zmh*56MGlrgK%UX=jeoHX_U{~R?YchU+i}}v? zQzbSunLLWI*yD8$>~QWatgmPGXz4_3d(sNMgQ1+xUW=)2-ct((gZ>QWUU%YwRHG=A zt~fo;nklk#ScJo)fC;0mkYgy zjndxv&gkhcmD!)GTbGLuu6{wR{NyN2=4_*ESwD>a@(h@_yLS{k#{r2lQy^yYGmYMl ztZn^Fo9p%CP|H68ClPUp9aOzQ=zXHpH+wE@`yEGP@mwdsBNFrg#6f(<1lJ29pWb5; zOUQOcZ8XPa-9@&H(%sLbEQg$lxsu-*LJ(`KXq^myFcAV@W@hX<1S|g>B@PYgBvkI{ zo>3vhQ<5Q+i53kOB?SKXI4YtA9>Y^ap9^D=fJk^`%?DI;eLIV!_|1Fp#6A|$XA}K= zZqJ27BO|_{l|uLbT|^f*@nGjm=$t0EsnFcPu_FRRnxoIdt%s)T56;duEQt&cqDK3T zlxKIgO`ErJlCL4Iz&U?X_20W*@)unMWQ5+J&W$L%OEx}LB1MjY+>eXn%iRt8TR>3r zW|kQbJxR|1sk<$GmZTj95t^xEbI;`_UrT+c6~>fR=?;704Agl6$NWn{FTmCkQDqAw zj*+6Vlyl#^03{<$xLze;<+t$3p+!DyZtak1Wt78HD>74GI1NY+K7*&N$%v99hRjny zAS998zdaIA^iZcA>4X?^s0SNo3-S_aRnDj&HwTlw13z4Id>W{=fq0dx8=Z0rlE&JU)0rKN4=7=z8-oJ6 zyWq27m6+|jJrxp`rUh+9B~cgL;|GU&yWWo8eS5V2SD6(*y@D276eSAktfrhAav^~i zjt9nn8YC}wJ9+&uJ09F8p?s$Y72w#uu&ZaXU8>tLQ>L6(@Y$+P0Z zLu$eo>Q5V%#vfYm%@?CRm46m!VF3kM+;pi$voU(n1|Zt}9Tq$;m{wOgNQ>|_M`$SF zi7h(XG5}z)0;umYY4nm`d#=+kw)g>`oH%LvCm2Y{Qeq<~ z>zREBb>}c-L&`3Lgt_2|GQ+J8PE6Z4p>7Hn!Chl^5+#BwOalRQKtM(a>;;Z3JF|M@ zFJ|)iVW~!T=!P(KLk~y@P<_*zwSNDD1QCVOT zv&T+^$syONtpSg_!E-qndH+prDQZB`^7HQMj4ynkA@H~SK}R7Gkzyr1O7^$5>hNsm zFs*!64xlCpz}aT0GpGhHdbOM+v~At``Fz!ie=OADdSf_KdAC={Qf;O_K_y)4^Y8W_ z78teh1uI=|t*N6Xgj+zu?$60q@7E7q9xrVb$61-{`Inv$$)oeH4Q=2xtJ#=z{epZ; z^RZXku@^KHx&2-hO|<$HZx)ej2;pC!S(*uMk6o_N=_UdD3w_jnPhe6(T^Q^R)hl-| z-LqY3r5VP-Pm537a4JcKdW_mSl5q`Hx0JS7Wob~6LnYzoEEuUVb?EZLCFuRF#BMx- z;Vbrf`AE+euss?)lAYy-#+)oL;^d<6RVD?y&*koCZcTp=hPY&=2SJi zww&xjNO#(_(k5`0xR$DuvIbqLCTW$Hm=7*BpQNP51@_QT=2AI>J;mU(ZUYqytO1of zGv+g!Ry3Hd^6AiF<4O%lI#NUJPXZB%MfVuqB^BmE>?AAsY_Bl;$@LE`D%y-lYG6&54Zrqc_7U>euthM9Krt$$6>mp%}( zA*tV5U0|M?!)aZQU`8ZT?lBhqly~KVgKH0APhM&R4agW(&WADzt+PN4aluplY$OtO z?rF+kMu3rf)SAhqKR*2n8`5*O_8IC?MgzjBo5ZU^xLYB5+t*6H3*3+p??Ate1@Xu_ zP1cxq1$NJ6f!39}ay!S0dyGigt+7r{$8ptWoe~PjqDP^HW8O=@nl_WNP?#0Tkuqv$ zk1LNi@!bSz9Cr4^Fab=K>vDwfvttq*fnhfpoh)g)y4pA_jn`K^ac65J0Rd3{WuVH) zTh`yUUehE*3V2BTojw(Q2BIhE{l)#>eg#htO#1iBORv6q8S=Kx887jzJ5nUqB9A0^ znfG;3vIXVc?}<4C&#ULn-2?HvccG-ZCo6HfsMKx>FiSL6HstrMpx> zx*MsXM7kT15&?roksKIehVBMw7zRd41cad*hWKCJ&-1MHzMp`#X074Fd7anZ`}iHl zo(sFgar)LQt#)%MblLiszFn$AL*2C+M=O=J)@b{RvLBXO7s})JAp1qj<4SVVo7YP2 zKe{G+;M4i{O2R$^>%USe_;h#oLh^oCv2SI3z~oBV?`5OuG#WH*Dk11Xrp<(1c8A^A zRd={#lkMV~{vI<7eTMSe^=n~_s%e+7Uyq^GJF^9bp zKIFJnfxM_y!@%}!VX|QT(%|XY#y^SERZ7&>U;crOE!%@~4rA zl}G~JO?y>oHogSmO?%*)&ibDw)6F0Zc_oOR50VFLYu=kLj|O2SxSK);-{xrpW#qXx z&z{)tlV%rhFiYyy`TO2?zES<-Dh!1E< zEag(<=DADrVq>+h=n;Xo75O$nbjc$%s+qJPCc{O_439Y1)fdcgshgA- zD)Nn-lWv6eay*f_J^coOjavsfg>qwm@*~n*EQOF8FHhSiba10NWoKJoehOzw_}Nur zG+^;wc;6r^`+C3eBy#!kqqN+?fw~UPVcMG=i=BBUx!;p!ByjD(84Bdh*#2#7%dtht zJ${z5+nLRdT7Op69-}XW<^*WHbJP>$6;XMXFhlx~dt;>M2|#xbkyg7P;z{S9H$6xIn06E)iioo5ZL z7YjP(_tloB;Rw89^)fFLYiSDfPOwc!uEqTAy>~gc58Q+LIUz?b6H{_?y+L#F11snf z_qV(bxeNQY8R|1+QHli%=Z80WQ|AFKe}9z=ygYWu%u+9@-Zse(Rd}4a=nRs^4pm2G z+!*M74q0FHHfWO`xxJ}2=d5Hi}?%Bu%S{cZ!M>0 zDbJCCr{|BaiQO9Q_EoZ($0=3^9$ANbNB6Bq1RO%&gj)-Kx-@Yc3|b}yhTmVs|EH?v z(-H^!h7T;B3pTMGbR+t5C5h;C27w;(;>_o(x5VZnwqPrdB|e5=AXwDr%j%|259XOq zW`nPj(h?#niOTVXR*@}lsu78mqJx64l7oRODevF%l^ALxZ0;POQ#9;GOwTIm_He(T zWxh4;8bS>#w6Q1{mPA1SkG&i~;dphvrT{FQuI}_6=F=nb3-KYLz;4H(D<~})zel-g zFza|O9aumZDYU0AazUauO9n4o=A&4L6>{6{*=!w*z#OCJtc-xrQ}kAedRuKUUtj-o_}1OykBh+(|)>q``gK2S(&3d@;2;66oim1 z>hYz}9Pxu4fFm3))P7`KEjX2b2{x=-R+0b_4cS$nwu*_RinXral0S+YsFCA(W*XnTp1hU`V%I`2`|Y#$0bk6w zu|J_XGi=jx<0jjEcH%P=P6i>CWm-2?Tt1Mzt2W+|5BIXO8Y?@&^St@xgemU9^r#b> zI*y)sqbLUa?kwcm589O#8nNXU!_~$52|qudZN%RuXfaBL6r2~C{}S3im3EDnnWn*> z6Ippvz@|R^ro!*N?C!6LCPxmAfgK;0CLac)*q^J_a;0;B8>D7mdkF}cbDFPsR8_6GRMU6pUb`uK zdb)2_^i7p6{>(w4#Ej_xkzRU)ZN_YD*_Ylp?G)%8cg>t|Oe^X(rex0t|2yLA)Bou^ zw2*&|Bj9TeJ#Tyd>wo*l{}VO4H{54~-=ICl0#;w&BG)85`Sxi-g2Y6EUF`g(dvmnz zMFX_S`Z%iGeF>34oy$2H3*aa(uo1uqzr-YKCcG?4Qp{`+hpookdj(ce;YBWtpv=0B zIH(e0s~oivVM_>n_*W@UH=<~x7zjY%n0_4NyyJz!NDlbH?%~xP7p>2eaa<~*%H@T? zyFKG{PrPj0D0EMNrMvd-NV8cAzW{01iGn=XZnyDffQmmY&|Q8o zYR}&3A2v7MVOKLK`6y{eFVv*xHer2BvU1q;i87lhN4cL_F~PGfL)FpQdRQT z>Hhl@Bx-JQ9`IXoSXK0Cq%&X4!C>o&a!=Lroj1>3YkpR?rR{nT0~p2)O^*m^)8{E}rn9oplL=8(<0BATfud*!T(nPXWX+ES<>Xqs%U7&MBO6Sr@n>WRcksbZY8S?vS`0;SI zXl1m{>2f9(XQ>&@yN?4bd;z4(jI`7LWlWL1U97VY<1e%L8f{V@I;3Y(NMyKzC$*s64T?g=z(Iiis z8Ci6fZOC#T!r-g%vNiEOHyWfjDE9_J#hwu&tYTyhj`H$< zHm4|3;}rTSK_qar(uO8fe8PAfr>d@l70~}@3Zb=a!rhBu1l@$^1#M0NdvYuiV6s5C zANuXUAKu}$w>C*pjd)wifC;*NC+VSAp8r+ykR<&P*!T3S&NjRF{{Q6ybnNQ%Z{Pn! zT6ZZvQ?Q|8-!0w{=sUvIW#B zagwdw`?M^d8(jFI?Y(`P z?|;~2?$Odz+O9*C&DRxZ#pX~&zSa+?NOgbexVefmxq6$@Ee%KADKG;wr}A$E`j`xJP%2>OM>{F4??zl9wIEu<#Y9n{BNX^(^k>F?H zwyC7^6Aq=P37VopDqCYoV@C(d6I*r5c;9|N)93O1Jnn-lwhJRsV%sM!b(T4+i|gq+ zEcXvGZ{Cb|n8#g$LH)J>(E&2O=f; zB;xv}RBd@|AKO-tiM+6D(;o3PCV-1BKw-HJ;-uzS0Y~sN+lm|K=PiIKj#eMFyP>?> zg|OnWB{5fCN?wD)G6>*VV{MAag(N_@WT|d+fx;+$6#OZlNUni1{3TEVg18m$(OUzzIFVkPrg^Gb>t52orxXG51K#W#XZS+G;8bL7W^EyF}I#iSyv2~ zX@J9xEvSEiF|x94bQhaZRK&$j%1_l9+6M$(s5Z`5y?`0J7p-j;!U-nG2Y z9Geybryf+flL1ws_Qld0o?OZWgHZUUk^BoEwo0u{A0iVxUAiAvAh)e9*A`l=1jS(! zPa|7wQmXol!l-$m%+AQGEO?P13S7>8LG^+$?u|BBbVYw7Oz9|1DeVh0q#{goj3izY zy&_SorTHc%B6UwG%VQy=a=U;BAXf~zhRWZ9M-6{w z+BDW@)`g&xp-ulzO7bffqGe)p4Ta(V+ubWQE&+wrF2+Mje+J8#YYNlCzm~HNa3gTu zpl@XXPf$1@yZ0k)gkB_(Klp{6n^rYvomnSd|MWib1B-JpVsqIMDJ!Hank?{#ICR#2 zI=e12`&P}C@3#$KOBN1bHqvklhLbBefR-$>Ly=5IJRP3Zsa3;)z-}U6`B3#{fG?4^ zL3bmziz9)@#>L`G>xpXqWx!XSY0uN&38pjhm-O9dhxe#+vSfySe#YsQ7X>2^WJ-qTcL8qkH@ypgPA@njH5Nz&Ma~V zo2%uJh%m*XPiwQM2Y9-p4?cMrl`f{> z{mE+bYq2l8;&6RaOU%yRhYJl&&PxK35=Qq@X3(Y4ags&i>+(D@5C$M{x~gGn*dsmx z_Ih?zg2cZOgaj+pffrk?|5$_UJVQ|roE@n`@Sd<`l7S6m10y&FL# z-k@??Ax?N5Esq-ZQa9b(fOfALX8$&`!H{QmVpwBq6;RZtlT~ou(JAA9f085;3lM>% zq@Oxxk-FW*C49Ycav}>G?uNXpQl1rio9>3d0jK+S#q)B;0fNjnFd#3<)(roK!pxQlbq~UI7Q{}U~ zQQPIQ)!_wKy^5aI82G5O+tk(CK6ue2Dr1XRM`t zJAO*%|Dai-z*`HsI?G;Dk1yQUA0u*-DBaN#q$@fzA;uPM>k|)_v>L^>&J}MzSK_C@ zLhhYUI2E+rSq>(CaNpxNoA*|LNcKWWT(XZg94nyoe1*VyiYGQ=ioh?3Ez~Tf3{b+; zr{y&fQ0-MR8dTCv9*^FR7kVPPF~Ln0=Ut-AQ+E7=cLD|%GS+tBZg`ZyUhcM0=%1m zY7U)!jEWxo{MhNS$;iw35;beZnDizRGws=oo*Xn9_`w#k5}JRr9Jcwb1dYuKh(wqxR=smGiqRXIgNd`B z6n8PHWJA0T`yJt%`*#D9a+n>G61xHK`<&QIe&d^AGhwXA{IOp0_R7iI=i;{fRLAp2 zuCg`Ph1|TSQeW!?eg-YN);7IpP+ztX3rp3 zDf6DC_Z2-vj62wnZ%;G(ePCw;_of=ck8v7qTEdU*>9tEA@PTahPafZ7?uS&|lR)C- zwg+Dxh?wp7r9j=~NfSMn%f+!)BsdN!7(I9suTXPr&MMYRyx#U13W2RgBSQhkunuiKI^_1Vi=$Db$7$^;&|ww+4+2A zr6|o(qj=u!t$D46lB1PTIf(DE+EyPgHXSo%7fATuz#4CYauS<2fk_DQ&;aVd>D-N1 z$IoHVZO9KYgHA*#{wJqLv6CnWFaVpbTul=v8PS~giuk!5h}>VBp|M@1jmxuBVF2Z4 z1u!ClV+VV?j&epaTo{FqskG;aG?=)XkKBKka_PtGlYc!S`UU!rduTl%m}CT+e<0ca zG3-@N`sn47k!HsH!u*6r29+TL2ZGr~!0gMfG%RkZMM{CPj3tPKKVKs;hs8~F4JDje z%f#fd?E_BT#KIU_?n;`*GY>;L_`}5BSP0!$aj5v?p5tz;*qc^BS)XP=y4u*f{RY!> zVx`c*;lr*@M$@b%Ywim(&O6^8keD~YzEVZKhzHCBm-a1r5P<_^JY?2;FPXp(t0l_j z7mL0D!)iPEV%;o>IgW%3pdl63RPN53^&~|)%C)3RCp323#x%|Ec@h^y{$5<0K=+89 z{is%+Acl(1V7QP>+ag|xpYvPoi+Y5@2^Ks z8CnjO6~_LO$iG1(7-aZM3Wo{#)84}>s5DJkyOJ8yUpdfRsQLJ8{DXIQNs>j}*ZS&~ z%r}pMw|lMBF~$_>9q00)$Ch{J=hr7JA6{BL37t0%>l*NQ>f6I{vjjNNvT__?K5s7u z`n?48QDMG;3-}xcC3;?3MtBYJ?$sR-yt{{rs9AP2mvr01LVK~PlDcOMOs#zqI9_5% zG>TaPb+xPJ5i@iZwZWSAqup0rPs;D2{5IpXG7+{bfRj-N3>t_A-K6 z@;_mxyUO%Xqj()HPaqYR_B*M9S`2CLhJ9?>!vab@JVhoUqxCrAAKX*|?4@lcSf)_m zN{%DLXGwcv8--;mJR%xt#$z+&Qft7xrAG(|h?`&E@C-N1_<5YPYf}?%*te|#eO`;j z5lnp;SPJxMMBx!z1wrkYRb}1lQL|V7qj?wd;+hW}!L3S<;CrZ6h@}4!T+1Us@+Ik1 zuNNYqL8~fhB2Mj99JOF1Uxq|1$49*){RBFD(j*bh;e|NrhY!HEZbgG!FVx<9r7!4q zzl$iOh8M;FpMUM$W^PDiUQA5H&#$>f^taonAf^OhIb4yh9Zk?#CawF8Wm-b2IG~*v zmbh3*Vxx!orYL0PktRvZi)cu4-8v6=7p{s6_HAWDznKe;l@4v$?lKza2VUBzj5y}# z!x+Re3*kmIL@sqQOLiG)28GF5$K#kYw%PAnR=Kw70Lo&dhx_n$H)5$K2iIJ^^_QKD zxpey2S)p!EsIdHuy3?izwHng2_@JxV!~Z+G{Ut{Qx^u3*YPxPREWBHPr(v4$c(IgZEU~P5d2_ z{(6SIPJ*l<%Q*F1YklpVfP^ z32ramW4l~Y_iH~}!dM+M@87JsEDLjLOei7K~(grUA&_7W`g zyPpSMoTAk31k6{LcF^OQz`U-{>L>g_`#y_9ra~Zc%pd~IXFca5arU{=)e~4B+kGpT zkwQ>2I?#D$)8RUSk|3>6hSs(0?_FT0!R#yc>hL?qPWQHqac43lQI?&qrsXfuyzGF1 zxbq;OhS~-sQp(O(NLj$nPG7k2o;E2-H`6M46`dYBWF55UYEs_H8hkrYX`$jpmER;|Cer z87A~UaI2W#WswzU>vjW~^_mG}gAA0}F@pw$G0C-eI=J8`BwVX8oxr+iAWN1PU^__e zXSYH)Il07T1OVHvI`GGju}tDd=xp~BoF~wq1m@CBuPl+oPbq7!b!foiyJzC2DqLX4 z1_3ieWhgC{j{e-k=$kZh!I+h>rU&~ta`?2eM*@T6TG_Xu@cH@=t}^_Vm#x1ETl(5is#z5pQ1o+g!wM)v+86WCrJkc(l|tK9Tg z8E|_{9#rkenDfGOM0tuTPCW}9v{bqt8e}3}D>q?gxnAM3D~c6%fC)Rh29`U@hmU>? zKl*w0UZkq*D!t+EONmatoZ)S+HAU^&hP@ufS8=P{ePHGsP#MNK3L3WIjWrkWmn61f z32XZCSTZG9Yyd*ku23_~@O|v%0$!F!E;)GTpc~#$>a_KYCaA$N98`c%y_K>pl|KvZ z{0PGf#ko1_he)|A2}}I;A*sy@h1s~WRZ0mPMG!+JmW!|Br`~7cVN>dF^$~M23o?9< z)xa?zETmM#(&Yds49AG!7_R6d?rq&JXC*u_I(8|_T8^l$+K3N$Ds=d@5v6#FLLazD zq5yJ(J0>ZTl<67G`ga~7J;Tp8N}jZ_OY_6xdG4F`ZDuq(BLhK!V*>zWRB1o)pBCcl zAXVQAk$$;^_(wly|JX1nC#`*$ad0;FgU*nF2f^$B5YQ0@B^sywKk%v^zoX-l$bfQu zWS{JIe7ee;A&k=PPRt2`5LarLsCa8$GH5Xv^4O}{+6I=j)3%8zPk03a6tmwu8S+4Ob7GB=L4i=y7ynkS%L^pRv35J}DU<2js&dKc0 zkM_OnAoF>pG{td*VEt*AQA!NtCgmEM$=pZ>tZM~%wOOT)wFc1VHc=cm`>ETaJMG_5 z+@}bF`+;%t@J0#8jjVG~%8Alf?3 zu}`fsd2J?Jet%EC{jgtuArwV6?jlbrPF?S?X)U#VBl&dQ#)LKcogZm@PKdA8?>G}X4B08IX5 zJ$F9E?OD9%1)p`;a-S#Wll;*UKVQ}R(;{YV_iX>$WTBhSH^9b=coN$Zn7fV>2KQN> z_obDJ*=}*yR!Rl?a9U_xnD=OIalb0$nPB<6VcQWp5!4yx-lr7$L~S;Z8yew zu7`d~Hu?(D>~Jy;S=1^{)2u~`;?mwGWrVx3x#A;(nueDhzxLiA&5>oi+Jb2n<0$Z{ zgkIi%L>nT|X2Q{%m_dbp)d|qgcp5kpxV#Dmpo~v+5Z!YE*LL4e9vn z*>!JN)aWdNYo<6gXQCpxIZP8Kzc4sdejsvp(9KXTvp^SV=ovCt{ypjcE}Wfxb;&8# z(g1ed*=6*-s&`qp59JYM&RM!%4V14`nJACb7>J!G?UlbY$uQMq9fiO%5}SCmA9dnRG=`8D4sEK${jj$PRO) zME-*K^4O*?e1qXu4g;uMEVbadX(M3OQvDqb0p_$s-)XfNX4R0CjdDoh&s0caA+Vt! z%~1p|8+bRU;cCT{5PpVLyo?dW#g1NeYAK9)$+icVF(S2=q?1p!hh)#YYaq&&>RJCn)4R!^?=FZrd4Ri$tYn_BB0jE;hiK+wUf-o z4ca_OUJa>v?|wWbho{8%Fh{WpAh#E%k{Xzf$)vM4Mm;a;~(y zV#v4CWue)OzEj$d>M(t^+3;rJC*4LAaaUI)pvgTc{gP2(8wy24Wb>atDlD+Alu7;S zU~+>zsN7(poCB;dvIUOHFP0|Y4uM%!&PvlI)4SoBC<;eRfs#N>oJ=aQ8tX%e_i>p8 zO(vgX8EWGM{rJgK44ZbkoPIu8X9PxzbNwm(V@*2enB+uJ$NTtTUW;Y3LjOr zgwztR7geg%w`)^;SEWp(>;fHK1dc7f_tv}?e$hO=R^!ndSYb@|K^N&8B_e64q2WK1 z?J${wczK`t8$YB|U?3z_>?suP zwuk<67k2tA1@1Hu%tf~0Kz)H!kG}#cRoINbecRy zt(!`~#P;<~h4t}eYL3JBcY>vx+qs+Fe^sv_3FHTMP8rmfW~q0h#~|&{BJ+&l`egj} zOdxz0eS2emUM=8X1nwYg#?Us%-89cF28uIzG}+zRzoZ0)+N4jCM(2Vo17Q6@z0!&8 zDbhlmC#e-q-oC$+F30a~o1jxQ&Wp+N-mKXr0r}cr>K8n?Ci03tUN_ils7vfAW0+L~ zu7*-Quk-INF#8ur9S3Cjr(*KA6%9GPX-CRITM(zZ>RUJKtCOp&AcsnV4&yoGjXiLu z(o>fx0;b_Yk!ox|>%HM<={ z^pJDleI_suu4S#nE#|OODUGQtk0=1m%T#g=VmYYPJ7oO>nV$Ho)$)# zRzBimMhbVSWs#cl4(b(er4yNI4eIJv!FUrn8}ceut6tU=HZHq%3?u>i512U$M7{=-r-`NAdyD!|S<)_Cz5_Qim zj*IKNWO@#*M1!it=VIY>N)l=q$5)j>jdULF?sVkxC%wSu36$@Orb;q1EU}y-sq`X* zH3lDw$8y@0KB0o9an_>S`zg~^XmE6~`>+$DIDqbunwpyk)T5;JL6})jqtcX4lqjte zaGR^>f@tO?)Ck{Mc1rSRfIy$vKgIHcUvg1J3$6A?*|_z`^}VhpBi# zASa$xS{uNYTJQ<`&)#vlbeh7P^`r5z>Rw)8fi&^Hm{S;%@^JrD8V)pi^=HN&pU<)6 z+kKt$Uv;{TcjcAl%bjDMmWaTxy3nW{k+<#&pR-Gt1RGk8=S2;=jcj!XGGGMMYAr7f zbv}fHXXQloLwBNh`3TFsPX>(VaSUW{5hnAwEw@$%pr{F1I=DyZb%Bw-)UQ1{_I`FGq=+@Rs~r2qEB)8^D{Z+_6@zWSr+xS!fEyK82k4$Dvd1( z6CS$rMB0TXn4{gMP_du@TO+C=r?!o=3VLf_^cuz8-aUWP*-(+wV+y&WEzj_QhWr~u z_~~p15MkmW2R$|j0!ddqfjr|&)!A>vGgy`u3E56hBTPoUpX|6yxeGb(xN9e{_Iwec zmPZ-d*XCL2bD0$`I=3z+JNr-;Zl79c?*En%>2XSl_v)m*f)NzgN+bm)15S&izO_ z;LFedV*#$tXbL~m6X0*Wxbp38P++bKya-#r4BeQyJJ^?Rzrg`q#GaUS>wv!-MH6$o zf9_82E|*e0JUmnaGODnr7f?M76iOH6%z0*8%Z|I}yau74$x{}{hw?}&7G&{xg1F9h zM82NY{q|ya>llCRr<@pFd6wh5_n0cYqCcF#SJ8Pn4|7~f)Xf}M*d=lr=4fa&smu<) z&jxFd9QR#B!*EoU(>^)d-2U3OG!B_;;7&}h9(*1%0!Q}OkQ;Z z{YJu!C;3CYpmtG^=aP}fo7y*9i=~yG1$q+v-kJEbr(j5%5*ermfKk^;8}lIee`CjB zB)6k(hvMvic=@4g^*tc7-KKTCg>ymimxie&MQ$xj)#Gau3+N;i8Q#clJ98tNyqry~ zF}ES}K{w%Z;UurM#o^tR?C{|7RltVZDE5azvqcT zz!YA~v$bkr$-&)o&F1rR`GPKkZP`Y}ZskT8hv9lNQ3VjS;yhSaZiV|drDnRDUaKWI zEIkUhZKfP8JX|L(v$Rkr-fjK@(CNca=y0dXrS}l|pp&D^>X1$U+hYH_neaCEQY*Ky z;WoBYtKVJKd}Xb70pm@n^1<$F==NLr*29+eO?vtB@5%_2N7L4Jn`ijin#cT#FHK`d z{|t+i#%?o2RoK(A8nPF9@f}cW17LCZVHvD(AC(C|F`dTjvBa;!{tR)%=$yS$V=iDF zbvCXI{=Eqi;H*!9wUq8wTj#2;QT9oOSG-KU^SisS*YOM+Z)n>@_%9t(SRcbY@8a`M zkL5A#$8%y1Z5NFB@H>Q1@Uai=PvVN>qfVy8qn~U{nk$}30e7#K#UKbNt6H2icSD}? znLmLn4sEi8#{N%!JuI@ohpT>~2(myJKFqn#;jtw~Mf_!lp!2Xpyv64^Yqp4Ry>&@= z<%6BG;ULfDxLw@M@pj^07RD@tOt>95`6D-;@fR$v)0az8Wvqi*xXWi%kk|R8#7=^G z*hVhPW(-O%X4f8cDGVwM5-Pq=ql=5 zv?j5rSpMbs^NutZM!j<=(=&aj&|m+d7?sUPvu;itm`>pE4?Xs>J#Vz zZFsV&lP`gCvRYYm1Zuz4p@D58+N5U&2mjujMsvHV+rXRCvLkT_bwwxXi3ZgF2XlGp zB%4CQV=n#kIr;o~^gFq>JB(_tFPeTHESWNEF}T>JeX@9(*d_K1~Qd z867zg*+EfI2tuvfk6SB{>eU|%Nzjq^m$Y#(bDfAWXBm5DsgAGhap$fK@HdV5k#fpG znBuwclQW&BtuKuWLU~nfX}i~+`&Z#hS7RNwvf&#KQe}N`bi4A;o?Q4zzowFuvUUR# z+Ro%fz``!nm;EuH!Y(Dlx2mtVb zHKyX$dw+NBl8GEi)o=4i+i*HGst6zw$xEtlm)-DtUT+UERc&4yvcjEShEiL&ij0UI zPIxs9&R~`>U2Xf)dY#-q#{eIc~I1N~J zvR>QhZ-(^i7mDtvU3%X#+)5rSzGt>k?v#{vkB@7jY%~T5dm{=szGF>N^2!?>}cy8&C7* z6n7v++W-eQ?ypAx^m0BO3fk7~K9>V_*ND;?@8Qz{^&!~>&I%$ov_Fdj?AnbTFa+7e zo6FNTJ{HYzB%j!z9?Xo$j9~26N{}4Z?FK6o@qHjGS0XCWpvlqg2HJVGds?3t3S-EK zs5wRW6Juy2fXFOPTO$<*77Hu@G9c|E)`$RJEo4SH$ca{A6@&O2hz%bfhLDTvg_1Zp zme*P_2JZ_$ZjV9{z}NgDe*jKnf4pl@SDho=y>5a&sH*&``{@*`Qfa7(cg@An7FJF< zSo)i_#s2N~xza@zsG4Yg6MwttD6sGY3*WurzF9xQ1wS4;!&uI}oYZ#VZVu*%TFgF) z$W9z})y7!vI3h%(AR`viE)t1LY_oCoxG4|SCEV?3qUY9LY=mr_`V3kX?#>e)+`DfK z&BWnwb=R2RUbG!Ik;RCFkltYQjh)E^Tdku9@OWg+cTWvRKP{%h-Fa+yxSV0(gY0<=Nbnbl#_%6AvpVcU>G zsYjX}mlNuHAt>We%x?JQlH~PV^<8%O-Z{KMZzGK)ZW9?W+jQvuC8Phzc?=E`Qh&OYx zyj34emdC@&ykxuFRwSv~^(@6&*D2sGMm#IW$7ToglDtmVZxYt8*q!j+NauTzvJP9v zRZs0J%0)cX8vSLMjuioC?W)_bCso6T&z1(oyM@7F$T9u!qr=ewxuY4x8e3cIX$wWT z!}&Se?cmhm#Wrnt!io5HN^wz+q^?xA*&!2j=gSukJ*_4t3k@9nW&OPtHdrOGGH^ z_?cxqQOmo}){`RbFs`Yuc*P7=Ey^FAB!g+xYF8Urbcc)hq&>)K2YO z@gcyxEohSFW5a1A0qc)oZ*4iu9t9T06YBu?pq8(bZ5exoI3hcujsD{3&^{$0FHXrcFqDw=k&=0>BBv^mg(S_pB}$H0L_2os z>FLy?>ECfh%CV}56u~Pd_AIiRuauO2R#J15QqC`LtJpkV)^gy&W+=9?%}ubwy#K7p z^FfrtO|QF^8ZOGG_qWqXn3_j~c91C&0QP1^ZDKcQPv&Mo>H^AOkXQp*WO7 z+U!aWlvK!p-S;(K-1Y~Fgeb@giyJi6QCK3I_l_2ka&2qCgLQa*-B}%W{q9k|bjxew zfg(pE@NN9v#a;XAK-l$7_08{&i!Z6ykd8B_@O^HfXT=q}kV`?G^jA-%@Zd(9^Mgt# z&zm#0Yj>=8y{jsRA?cktk`(zkDJd+u*V1qld(8_Yd#t&i5v>Ec`<^&l~)6efHfKQLeJh?nAZQ zBce>tQv!fZOQcyi$}d>IOHU|+nC+BJ6q1w)ae7F_iU=4OqMYzWThkR7Y~qHfv4k|R z@4ZfVO{U5It~0u(m7jS{q?XG()u?0anIY_aUow0rXs3LkrF^WZVYZLxxb-S3c}c|bX{M>-d?R@ z7N^wZ2y<@P5B}bOA_j!yqA`1|*23X=c_C+&&G!2b`*&U|)v{ZFtX>GD?2h5#IjjCq zAq730U($4NtQ_OFfBs0R-+7XYsD?p{%eZI=yT~L#m6?t!Q3b8iStR}eX#rYiCE${X z;B-ziiLA|{8%ZA{TBuNHl~g!jZ!l1f?y1 z+aQG`<^`Ehfbl@Dfk98!K31b}H*v&Ffo7zGKGF7o^&suy+=v09kmqRj{)rULrwH{VK@{&s9{~ZLDeiXb|a=&zL-_1>a;ohGf z=q#i8<9cuB{GhXn!YeiLZ9u&ekn>-aQGAq2zCFB(JwIw=0niVUyuU zy+a*WEBWo0FRMdY38O!8%1;&Cvz3RQPI1n4+>W!g+*n_4VD`iA2;>fjd(c1LqpMo9 zW$tG4vS*Fg>Y8*mU0wiJp!knAs4pZ29RJ+j;(!W*qkB`U3~Cb|+;`KkcW+D}vA?QJ zg#OBYnplXmNPcZxw!?z01R9(+0P2y?s&FcX`QbHWld?dV}448gvjN; z50~AuioY7e$OSO)EtjK$=>w9yz_W#jBDb@1@kY5`@KZ`@Rf*_Im2&T0$hphMt1CET z+_%xgx9)E{Mi7yeShptp`>ZWTmLMj-ZNkOtCm2f7zzU|=$+ox(ZS%FWa4z9uk1yM- z4=!f+ZeIT=3NQ4FvYB$z=W5L>760X)@Hp3({DYn*pR~2XEyR>escqA%RdfcwL@}N} zurLyJ;|A9^j{g0+@wy8CtDw<#qscoPqFzoYyC`K1yCaAJ`wf){`yU<);Qu3h@RKn? zPnFkkH7U|SQIAmX;rH)6+(k2@PFin?-NkAL6Vk8-D+^^_rEl_%8&(}bRG7yyhdwYu zHW41{bU~=GH=}mc?H4clr6n1cUg{(IHGl$mRJY6NAwBxL=11~(4=1EtroJl|0>V)N zt=2^t|GpaVBW2A-CNL7}xTQ}oSo&%7{3#QVp;r4dgHmk6jEK~25|ymmt-}B8-B0JL zB&ahr)`uuZca^k@!k8vTEe5U$P0lQLu?%4v+8=W3!@PREHio)S$s+IorOIfoFg()^ z>q)1QmPP?f48+Ebr~+`YpEDaIsL*?u737?#KltTB)NS%?SrMn)dvXZ`#$y1}UP28E zBj5r9TVXbQ1;oM@{KwlWi>t2D!eC$fd+`t}mRHE_&Vb8yEOlnd8Y@t(34^UFHetwI zsWsamfwgaFD5#_h*9sds+!v@sbq?sCq&I1ZolA@UXXa~SMA;!gePsFVcoANK#tuJp%@-F_CcQW0bwe)VP;S^x*pU z`%kY^Z};vEgrn~+zO~%;u!ZaxjyOszpKDtxhGJTl&%(s*S`p+mGE=j}8L3jfTCr%B z$@sC@D_xgdm#aMotB_@UzxtZP3%QdxanHvaw;lK6R~LL?{j^^lQp(8mgS4=perLI>e+v%+l-#^Qp+l-L!_)uvmS9`UWCpgj&_~#Fb5o;kg{s)m&3i z4|-)&;k2Y&CT(HC$;ExyyZdT{*&c~kv3Rv25T70I6`rBPEp_hN+n3ngN1R668P$s| ztRl=Q3`ne8@k-iC&mxjE9F@`)(}>DwI2k{F=gOcq;AJYa`wo6)53IkA9cFkKt%_en zIuWVcHT}pdcb5RRyDcuH?#fVcY*9CQ4zob_8@T|`qrYJHvqBQ{_q597 z6TdGEIr5d)o^;>LOQIGi%$tb6Aij4l-Kv4!2!WFuxs^I?0W;_09`^ym*;l7+E+_MZ zaC{Wi2fs$A4lf*doZA*2J1OPWF*59Y`LZ_rJbC{zwj)fuS@^l^`E~5Kj$5I-gGlSU zPvIAxA$fnQ+m8{OdoAZ@I`S9u{$W?`bBken;{F{WBKh2;F&5Z_orn!8OMcOt)l|7Q z%tgFh;F^8-#o;}+px;~f!q5I3H(0nAM%oAUMEl>((|4TSI$?&Nj5*QMaF(AIIFrDO zoTTb3JxdN|qZ5J#O4nRj$lc}2m-1@cBHS%8bo3PIq*Akp_`mC(UyXd?F@q#ZI+Q9; zEUJh<$ePTM=!m?DD3u)D68CP(ehX^eTr#!{8b5En`Di~(ZYfukf7gXe9QtXz(C2hJ zy3$s!X2|J?y>Ry-hB@k+6|?>Q7A)w~U$28FGYM*`W%Mzt&TW}AX1auNSpid{&WsDI^)53B9=_wR*X)xwsrKkIP z82vx8-tsHTuEGB@B8`iuHPRpYt4uAI?rS8V@L73pIr{{R4$EobEMKl^jztwYKuhR3e*T+yVK@? z1(@&eo7|JX4|+Z}Ub78?D(8m}O-Ki9|NQS4WAyBQ zU(AmIV9ufrox{wH%!57?aU}vG8$o$oKm+Ek>%aUM=`RLr!79qMcqR^5#oTySBJBbp zsTp;jHaNwG-q9Cse&WnmC9R4DKi7;KHse{bQ|A~q-BIOFi00Cu{!Y{GAi&5OM}_1e z!q${VZU-CQrvvdXi+&}QmgO({Y&MKnjK|NZtZb)|K%@0coO-tl>cCAh6^fw2e{*UD z(QUA5WJTfFOD(;oDu_l1yxNMVMb@=F0OXV;#Xh(w8t@bA@||x$?ukE>>&&((Nz@cV z$$ZF*HVnZ92jV`@5`BnJnHP>b&4cR3s~|RN$inB-4m7lK0e#7UlDMMrADZ&`VcC>i zQ%6}Uxjeq(lZKh`W6M+Ez5+dX_5kQz+-+uREEh?;d7!+})bv#GD7(@(XoT#-Ja!X) zn)~8>3U{A2m;MC!D;&88-|6gQKKsXLn>aWC9DrDT z&|kpndFFC=O^$`7Ny*xL6y1ZUU+_3W!_Ea=T}OuRJ=wT8Lk|x-#9=U)Q6US{kspS+ zc8wFXf?rPfB`+uQMol;0&4xLNnfZaDPr` zFV#=S;j4q2e^^%4M-G1Gtw~9|KXAWbn9577KXsEJPC~|rJI`L-R+545@85~S7Bd9i zEV1;}jK2J8CyAjvy3f;ebeWVzeW)j%gZ1Am#ci(i{PTZMihgT;BrAbO6EF+;cav~k zKVBV3MA{En42Crp+t%+92@0C#M~bHi*biv>QE`=L`wk|$wh9PW zBq9MFf`&{Xv4#~Zxtw@(1#zm0Jlx@aI*feQVchH}&9D#o)VxGt)cJocMIth&J4SA_ z1yzWFgz}HAEr?78B$)G=IDj@1aH#mGT=Y7hE2JX@yC~r&sHXF*PV~D5UaqigS5D0f!9i}gYYZg;mY-ttd>ftIjoyft(mUkh9|{b?L{h`X?Urc{izXhgp~MP`+c=oWsfIO z=;WD+A8qiOl^7pTG9`=6tEm$Ull(EeZRPSNngbOCBw{=(B=1D4H~d1&|BN~VvUGdb zuG-Ik9^6fRyCn3tFfE#2X>Dlg;opv`q4l?v3iLdWdmFs1>A$JF<ACh>@jSSr0Jy~KteuHpn)WOZe+=y(6KP)5c%JBaQyce5NFrB@a zuu8%txm#7+lV$XFusthUXQJr6zG~!w%*nlw*L~$~Lj;;M(|=~f%kK$ZyR0~9LoN6H z?S5Z+<1f1%Nb0iA%p+Tqme;iEMwFaXn-?+ePpRZdrk&h(MOA}&rf$k`S^jkN5*?Cs zFS5`&p9aT>TNchWAg0Qd?Cw%uDgN1QEoE%};k{p8JYqF!TpB&0v4 z+3A7Vz~kCaKsOq%>~HkQk(jGMiTEi^uu0>tSaBXGYDb#kNwWzW2=mygtHCN9(;v58YnnA|q)p}?n9k;?ns5$kegSea2m;*j;os>< zY{ar2a@P!w#y(fJ!4k1S;J?Jxf~qhIo7}Tkw9D@g@8{znp^5Hjr8WjY1YH+Siek~< zJp6)%rFeWA59w!WOwF8C$Z<_#_?`hijF5|~m$hce$@Oh_B7ACVk5h;%a2mL6_z zXIGAX>j>Sgd5HIaT7VA5Z%^@m*1K0$E}j;Zw7hh4-8j#08A+aA4bheog)-L-s+~{4 z=58NLlx@?e8MR!`Y%{jsj@-G~jd7blXgV?M%ezCl-z2bNzaIS-8a|yBt2|w+qye}+ zWrF0g17x!9`*(6oy_%|ziX1@Y{_}-X)3q)yd|i)@hzl1Z5B5_WoTW9Q06f9>vKg zRD3y~P_;coYEsBHZn=;4WfgSxL&-O|bPU%ecgigL$o0=H)c2o-IkwOB`TWMN%l}P2 zb*cSg4dH?wa%v;5gS8$+Aj2e{Aa+{ZZ!rTGnu?AgxbsH)b0CM9erMVRs#FSIPwVlg zcm|Ee2{4#{2oEO*g`gmzvXx{$9?kii2K-K<{&fp3!w!Q%`gA2d&{IuCK1EOg_`eGz z9Am0~Efs896atY>`P2efChz+7OYN}x-w8lTO+@U}QZkH-NHyr+aYs_eR}0kT*z=9l zp&Li2YUFfAE*{r43*`ZQL$lsG#VtAS^TTPczXa~Dte#`~bSxX##^nF#g86_3#x(Bd zGP|D?|AVjVv~wQwf<5rDC|H93Ug41|@N>a~@H~*G`8W-N?o?)P)IEL)-oAPb%^h~5 zsBxqVlstJ}|B$A1o%Y2_Ya_r`8ht@Hty{=?KQJ|cKUAldp3#Jhy1?BAxQp(6PBON& z=O!4O%dP-(muoOqk=2IxgHplO(7Gt{m7e}xX%pBfdw!pg zhJuW6*KTK{C*D+5fB_29_X*f}kMq^tgR<*bUmh_4L7c z+u6E~Mdjr~X2B7Mx!dKB-!5A@^-fg>nvmj`JOd5|G;bO1!3bXmDN-L*zZBq^Yf?8O zW5Zmc57L>NxFvUz{HrELvCU`6w%A!b`Fo!c`fQ@RGyHZ6&fHs`2DOpx7;86)UM@(s z-R?HGU+w9fzMmr>#ygV~KuOzi>C5Gf^`jPljrZ=0wZF`>;Csc0+fPXBfJ<7T-@fXT zt!!^twC`Y9@cHrgCs|c?Pde69UbDHnH;!MORf}k&+hmAH!&R}10+$k#$8o*pcLK5D z&4SyOWS_xj538S7z45u(lgSx8P%cx(k?jD5k&x_qO$f*G#|bN{35$7Jhb6R>EABz@ zQ&N>dsidk9Y$!)*D7|hR?><#SNbVB;jEDYW;Y>b zw`Y6qlo`$=roJvScKmq23*qnGoWWRAXV0^Qdbc-|FlN_cOWJ-MR_Nzn_luF{;on_b zt;WzNL%N;EQrmATxa@o%Jd+C8PJfp2pCLx$zYxGMpBtDWl!;+Fd2N<_{w~-s*5)hj z&ST!jo$uyv`aHYq&HL%z^M`B?kc1bn+t!Z=hz@OvZjeZy^dy>4xpHYC>`F1*67M!? z;*;p?qo~AGZ18LpZK!M>h>0NW@aH&-lGstoXk`<~Fp#804Kv3wqL5xL>rn3E=n~ef zC33-s;z2bV@9vM3MIw~LaZuIx=}7N-lr=%3s#uMm6mcKPF6)~A+{&fi zX=ZA>+`9`7YH@*1H<{6T{8Xv9Smak~vFZKMomLby(ZGKl2(v_mi%LMjl3 z4_Yr~y(C<^t>T=hZXc_eECIoPy5%e-evE8RG3qZASRRd@J^z#h2|mBTWfk|T0!Yrc zkHhAA7wt zfegh}C#cT4exe^p2iwqUH+Z1FM8h4@b5bRgZLAPrB+z8Vvw~A8^AKVZizJ#s3V*Nm zYZL{90(k0>bm0WA_8hRZFo+VrYylw;S0jc6_0QnK1ZJ?OfDC4mORMsOTwixg6L$+7 z=<0z1nH31jIPZO7{aX%sTCx z7|SzN_>Bw_yqHmU@WxF+>c>}K;15zaT{?tUE(rWukIFFrN)(zzmcrnZ#7w1eP_Mj- zX(HQnSQ$|vkfgrud9?NVXWaXxcWvja!PEC;C3i`)$yD;XZ%7`R>s))zKL~@W@M*TtS}K=K)TO9}ZZtQjCoJD`4m6=mJ)!@yEphL98H=$Hd<`rjG|K|Pf4goJ6 z9r6ck3wbrK?*pb7@KoAvt`dvf`Bd0VjGyWP{$v|pyBckHl~IaMjjuw1YW@HyDnIS69$ zyV$A)H`6z5z{c+rz=E_cTQ*=jJk6*S<&<|`D`EK6RH@+5t^qzR?93t%ZMjwcXBrAq ztU+ueL}sYzJG2%76t9&^`P16dR7ZMh`y!t1)V*g9`RW54;PNCfAo)2`@HKsda1iEFh#J=!WWaOYX+157^e)p)G!>YoayAHvxU^N*+_RG4O?`-&*ka5c0(oilUSSLd2nFm z^kag53>HGYfXqMxrfg347`c5c7D4Nm{>h#}K5a|CFSIZ2ekj=KiYY*=h?|*ANH!Qz>x1)mA-~Zlf z7GNSYh6!A-70&ck~u!2nj!Cn|qtIx$aTjTbrCFPNo^NQ?xjh2oBFH6SYuz(B< z|DxLoAe|-&@i6qii?A-f3u<+v+Z8xGh9F&%(&G1v9CH*pj-ve_v@x8`1Nj)}Iu65T|Sy_mo;Fx)lt#b<2TJeD3W zPz!1mJNxvNalOunaYedE2a9YwD!Lat@vH$?-?Ve-~K&TMrVdkd*>oB1W>p z`8jz%{>T#ZuaBVhke4z~vaXg0qvpwGpbBzMbA%>9ii}AATv&C|Z9K`;dKZ>#hiSHp zsv?j)Fv=;1_TNQ@XvYK+^r1k<^NViPR|>9Q^rC#JtB9?}pkz zY9t({!gi(90;*0*x>})-eoa#WS8S806j8H=W&W`m0X6ywzc1c7mi=OdjxtNR4;>uk zC50S5_ACyT6+YSX3l=+AtO9_{o^IzDG(Vj6%&g*c<&!eL4sZuE^%?61Ov-$&l&=iUz*QM%q@ zh2M*!`BUh^J`6KtQ7|gmSPg)_ha&L56PaWUe0kEy0B`Tz7@7%ek8Ew<1gq3TyI!C1xmhTMkF1gO~?${QK%IW3YBj^J-b~q20YfE zaVY=;oY||jCa9ZYH>$T2jaA~>fo4cYS)1dc-H2cx!&1tpGu*q;uN^O~AQyccAQ(*A zMaQ3|veS_M**W~mFp(`NW^~zZowQu`w<(uP5z3Z~Vu+bBQ*{Ww zVYf%F(UM%_d+$92J9L};NS69m66;9Itr=pt0aFuShXagoHvhC#X8&NzVC{GTB-Wtsyo18B#NvDaBFVHKItH zcNrWeyqs$CP>p<^2>n^q-01P+p)}5c`-l_78+$8Jm*nB3x#xRFt#Zw_nJrmgTAEFd zdiqFcT^<-5zLburOz{0Lvs$kAKUn=O?V-+KQ-0*p@*W_NfAc$_aZkB-rY5o2y16!S zN<_Zd_Ww9k4gRl?Ar0qLJ81PUHTZ^A8iTE4I-QbDB$XJ%tAU$S{qsFz6Y6AW4$lLF z29sHA=mV>6K}Q#`{)fl@E|fZe`;pIP2#{tl!|h#|*)jmlG2)~enhe10o>z|Lf~cBY z6*S|?FZZzvfCp-WJtBqSl1-j{H!Ejp-?yG&7%iM5E#B^INwRkF4p2$txY9JzRMPZE z8_&#bV!5K0#3U?I0bmWeuDau1h`BWT9fQEo3~_b7hMYT+BUcWqDlcI`FcRzu@XG)3 zQz1%7zkgaqw#$gJ;e<1fJI$ENtqYI8?Wf#|e08sO>+OJ1&Si^2;O2b$@)GH3$d46t zUh`ds&du+TyR*9)3wfZl@17L;g~sONgh)@;$zZt6g>z_$Ytr^1xWKG6Wn|}XNsI^` zo%hfXqG@^}KZK{~H%9k+lzvwBSWF-mH?!X!=9S9rV#r?%Yw(RDrUol|^y`f>`tr4| z+@prx2s+zs0r3s0?Kye6ei^cHgwf{hHmqK73TE_|&79z`DG!-{%!)nXF@E;vkr5Ta zMR9hQuduLS0`srWpU&RPSy+sbf8t~nL}73~wROn}gw?qTk$K{3qqP-UZoWVpy{<-& zbuZ{jT$NWxKfH@5U&Dq{RGl%04u)0?liPpk5;qBK<^hR<&(z51J(Kd0beynqB<}&D-NiUn1 z^(L3jZvL$6tGE2Q!Qkd`cAl0yJtd#ivQ5r^FG;@tLE({-aKt@-7pZh%7W^{ZE`Rw4 ztmgXzeUmlEc772|LdwMR8P-Lamd~QjH%OYZoB~w}1Vml^-99i*3@W=o9!Yv@K6Cbx zeJJr!6w0Q~BhtvVW95?Co$V6Ce;Gw9S{NfO6VwfIbF-A&-BDsg zC!}Gx_~B{kw(bdp4s7i^a_)iGLLpnY2dpOZMJiv67Clc$6i)6h9X8i|B+F$42q65J zXlk#zULWZWr}l(5a+{;}8F+UUwYlYWCTefGW3!I1lDlM5yq%V=PmoJfrZP4XJAD~b zALj3>HeHTBcUp~Flo9yncvPm9pI(l;`ZHPH{1ggWT0K`d{1gTI5puhCaM^0ozr5nB z(!^9bdFXf5OyT-Vw6#SW9r4Yj^^%$M#B!&$k#+hdye7h@8fE@{i5Hu`j93)p8M^73Sr9Ohs@WOt@}vYtF=?ryQFF5aJpXNN* z44MG_V0Dgc%@SZIG*W^p5`<#+Q}D#-lIgD4WF#u`@>XOgfTy%NAe&}AKuUU;g`!!5 zm0~8`UV~qY(8Ty40!-P%L?4ApfHBg!GjBp6Xl-Kc_P663sFQFh( zYGfUVYxu|Tyfd>RVz=0Orc5i;cs)!Y9X5cpu!iC{qSy$o;Wf#UbCbpVM%(Fm^L6dAC#exTvI z#ZWAMH6?Tm@ztKBnl9YG^8O}$_x5%x_3~Ry+5u%Lzdy-L9AM zGO%yUf!OhDUwnBi&h?quSfW=cjUXk_6^M0LB*S&H?=65ZHNblPPdoJYq8papE35XH zyHoOg=wvfiJp(=e0!~t+-aa`v5x_vto8rYW6VHG%`)N{_XC=A$v};el5mw`f$2xbv$Z_31 zFtf@ino8o$Dt}er$w#?75zALAk87Zr_wBh}{2M)oMIqevY!WpB5^RFXL=SWQ3c zgo($AWLBuJ!0oFU21EM`h*&FPE5Jzm?oa(75|?5Uf5;3d4xi*|B?6WodDDV0jZ;j0 z1du~WLxuoYad_0K6+lS9kYGd#5(run0My3x4t@fTE?9HefKY6|h=~v;4T1%QV#r~$ zVOz$FXmz@kjy61?Vwu9lr<4|j4izQfosK|^pwPZwcgayU={4f$QgyO9#k_R#p+GB_ z!%~NDNuyo85k%diKsA@E->VtVHQB!D-(RPbDE{o#Qod^VeDFpWEBNeT+wBCQ!quq4 zR=NL=l?j3RUGwWcg`4N?-dB5l&W+OG()jfJvpk_{J3-j2P%`%MO`Gf;^) zLgsMP%|@Xj00uY8;~WnVYBXY>_F>R zv@|&K#5-Z1!)|s^^uL`gLu5QcItCbAhxXo+Th78*AO}L<7OJX_a|b0#`dc-XIm~W9 zL}9IAK`8GxQgpg?Mbhcg;E;rK>8pPx#fyHrj<-g^YgRERZKA}>Tc5CXX{EkUj~6Z2d$uW4zbRUiQS1@{Om4$@4uR?|3artKcNXIm8-qsb)HkRn)ic8lJ8td#3gOg z!J5OQa8cXc#P38^l;!-Nlek4b#7)G}vAf*!Uh%4*>6cj&ga4>Rt__r;-?-wI5^G-zBdt{o619 z;&eDYSvLN=h*udF*9S<@=zZ#s8L*7D$ENF~NT}z&-g>@F4h$h$fzIAjzDYJt)Y$w# zEkGOxMNBqk9&>u>vB!LT>-~{o9qs#4YiBCOpKYkA@YK?~P`)%BZMt|N5OQ-LkYoY7 zo{Kjd%vZ_bsiCH_os09=EOU+4)13#d@G8adnXrYkF2xbRB^-kbXt7?Oy#i~#3h-yvq}u?1RyYY)qWzW|`2Pi2TtmAOCJ#&;qGs5} z5EQZGTW)o|pqFVW5;7CLJk_6SDTh!#^_rC0#`hclRN&B1MTZZ~f+!(t zEV0y7>RWEU`H`Jik;OUnV4&pL9IHkI2}V)~*|}TNt*j11RX2kHrYc0Exjb6w3w zrn=y&LGw9+WPurm-TIwNEI7hiAe0F1Iz{gl=jGBa>)M-xuxD9-`nHau)mavJ;I5RT zsiWxLCcwRsd)w3WgOF>e>4D*S4CO``@;&a=i&kO-Wjx*-#NI75I3AmVAqsK(sCfGA zsOmYxzg z3>ivqV4dUWvF6fHvRzXgDlN~ITE6|=TPMChUG665$$!IocjO=Po3VWllB@R<=$Y~! z79ia`IIVxXqq%O6n7T2Yqh3sI=awX4;k4VEybaxJK*6+!lID!-^RBSVaED%-e{q{_ z2r_4_P7YK+-ppwmty}1Qbzuyx?{oleU3kLl_b2_wzHVrbi%Z$j`7f{Zu#NBy)~(gB zjf*|1(bnPC_()EVl#K60JhWv%H8>AfhZ3|O6ba_7i`=w{YIpqtqxwf=x)#CEe(I`1pZENb1SFE^0S zo=MIb09-5NbPs@T6%s(6#S(z`Hcwu_anwfzUzYZN+Vttn{~9n{EOw%)f|1Oc4IcIK zA2Dow=cKl8XDdk`)Lq-~wMbgdV2b=uf>f^cFWpl9VJ_jpQ67=f0f7#6Hf{)3x$eK+ zWbDA~y6Z?BTy#?X1OJEY<~pp(CXWVXXMngzLakC9c&uk|s%e%1l`X)d#**A86-pOw zSdQSp0YH^$Mrfw0(Q>!)K&h${540;u5r(k-1yrAmj5$93 zE;jA^2MZyR7FL+=mcMtA7_#zp@l@9Gczoyfl~c2Z5W>Rq>bcPEud(1A_a*PKAwg_r z^1wIUqx9qa^P6zyNui}FndJ85ogE%2@m{6iC{+WC_bxp$T46B(;p@~zUMRB1wfa-@ zy03PpL5!{HPsfJvQ_We)6sX}+nsH@^XJFGgg zve;bEDcp%~2TlQ}u)mL)!iMIXQHtV-a%hHeke9RJBdNwg91!cD+E9Ix5)M{K{B`+f zAh=lrP`)Z=jyr1<08q?+pwZ;MG9TwlH{PLm-OhkYubh&FjgM6q!yga=Di^2>c%MyO z^}}SAx_L=UU>bm(XP^ATV8D9GgU#S@&F0_cT)gDJ`=us5sdSG?%q7wCF^Xm%Et-C4 z{&4@7Y%(LjtcnSmpx(PV@C&eJ{Z9yjF|+~Hkb#`$CY+@hd7Gr)!=UU!Uor`0vG?D= zao%-Q%?k)l?l6f_3?Fwrdb^19KRS?D1W)x3ulh1P8k}e%7^I+tl&ivo7n!~fP2oW* z&NMzw(Cr%ew|PP+@`-8AIJ@py0imO^?&Wo6oxKw9Q|$Lttl4M}0a932pC|#Wya}MT zo#EP~`uIiGi2MAWkDt<$8<0zBrg7TS>X@2yd*ULX zaCE+O>)w9+t#w6#B{?a08kj*m%=QpoHPczNKPrusBa z%iyh((Kew)w7a+YmGet*+8{5ccl&ni@ZQL7ymUyT57-2%1pl`O|~gzYo)m~*j5 zFOBDAVP{!)`$j?6A%CCT^*nKFlFofwr*rheef9i6XQYSIdkZh0q<^y^vM>X|lQ=Ui1MxGlZ> zHWnoFr%jw@581u;?PO7}DA}g*ih1S02(Lo_s{YxsRQgJo8r#17H>`@X%K>G!Xo~y& zI5rxo*u1zM6jqTuv`S=bggp0kd&8gM(Jw3VC|YPk%gig(1fdSV`anso-wIge7uh)AVHz6nSL*pR|NCYfIw(K0#?GLj}X$-|ojCJu(5=2im(&vv~A#)^3l zDwDm}ZG!$N1EvVi>`XDK`$Rw))PGm`lm8ojAvp{l^|^w|#H*B_BN6A!?Rh!Pr!<{0 zxwQYqaC!}}JQ#hOXXXqb(mR<=NK}P!&T&loJsC-Ivd`D@cLBx>kCdq>YBX5`%|4XY z)Ho}9pvgC?CL_onVt4^?U}_zobR((J@XjvfF8ek#PFX?!ylD)TAiLFl6pjZQxCC%F zbf5=Qon^6J&^Btw=10<7ZE%;=93G>ht;>hz2dD7dw|wB;Pz5u1UX9`0N|fBpAlGlW ztk*{f+l*B*&rm=^!-52bdIQVYhF3cv@b=4BX=MG4^WE993HFq}SLhcLetgh@cO;-Z z`BVmUYQ{27y3&npG5Dg6pYjako0E4y55DjCqBI>jv5F%Yl#Tj)+`=}h*aHq&#J zohLx1*Ty$zJa`8Q!sF*xLjFxw#7>a+D{f|FH`WY%42 z1IKGFb591R4gaq0bO!1pmY&G>32Yc*kt3Vz)%Fc}bNy)9ZBl=9f=D=q_-Sxd)|UB* z*D2QU>^$7i)VjRDL_!bYpuRACNelqJ4jg=A!|xBkLTgWS}DXPYLu5Ba8FOV-00J7*X6hd0&j|8F7o{|9!j0AL4rOYyLFN{NyG zXtcTi(P-w|0FCCgolb5>0_21O8v@P0dXM9QTYQx^k21R<;os@L{T@&ST;sbY8_Yvb zHs^AOJ_xmR{D(~Qd*aGCpbwF$sa`!sjf#l9q|`U&Gb+DQs0XxsYr`n7`ge3yXbB9$ ztP!SU2Vgs3`k+BlSr=17a3ICmltp;o0PCoJB)*{4d#W&9NIH@bHZeRuNAN)~9r;ws z9pbN;^NuPPeKTi?fmSU)qxIceVMn`+85F7wy&-509j{77a`R)cj4IAfp)*16S|(!X#?(o z;N9Mwgs@*}f`#cE7nlAm>s5KzNB%d9fR$*-US)o-Zx&>wVpQIY*;>0yc0#_Lij#A@ zy%dh2IGf62oe=t}F7w*ZV~HHl)^5vw*-;DxT@%o~INKh-tiP7C{OK}v->0s3kf85$ zJ8F8m#_v4&L;HDa$cawyHZAMzA+vwmV-i5C`sxo#p+l$euA_5ZcXy7;XK30b(0Mne z!WLC%v0S%tTqX#rVAM16nBsPurCgtiZDIr>$;WRdTZ zvoX{1`y(I}Kn(C<^v)<~-^%1Sy*+K5$#NHe6?_RbId9W$Rn%W(Z>H#E@xhN|{$}r` zjplnMj7@_>Xq+*q_B}R*QkhH{upNYHVi#cn`BkA6SQSt8@Qve;p~|W5V6D%7RbJ~h z#rVri6>z(Z{x@4}B=mU(6Z6dg-!fH3)*A;ulxPI4sLO_Tq2G)0^RwM# zlVi6}z+QJu9+gg_xNakNub=+&s*P`>@xzXPmgOCl|8CNJ5nr0?{<7~!QT1+Jt>-(w zH3F0`{!5%0%~Ows>h~P3tL27_8Bkh7#>}gXj&Yb~dxtT{VOk5Rv8Vqb-XQmqo32DpD1gzBIEio zon34vlvr_W0$H~XzgIU)R=N=S4tvuHK!>PR2=tTV(&Q+_&zdDd5R8y*1W5WnrH9u}Ztu_rb-LtT zWmsO$x4*vIal8AjNc)gEB^mR|?nvRLU-ov&Kd8_0Lf5^s-;*>K66XEj&!N^+TNR>n zbRFud)<-#+RO?M$2O2x(vUi(#30<@u%aTZ}Wx+Nx}PS_tCp7CG@2#gN&u5f96>Tk+OF8tJa@b zZ?pb5cKZsvLN9#v?Oc~iYJRnQe~nDgD7CGk#(hW1q_0^oVx55fcdP`+ch>Fqjqb;d z;LH4os~y*~!h$5C2Dc&an#la54P4|S^e&GvBhMuLq+jLq{*wJCY`$gZo4NxmNI+=a z^8T|>Z)7+>mR3Az<8?U!9&U%C)n^{u6l_6NVG@9wh%Le~rL@NH1a(mTTByJ=0X3&| z;+Tda*$kTjPNFu23sz&3VEC@2IK0A36kyqKiu!B#XFq*Sm!&NqoqRkgvoxsx|JVcG z2##Ge{-L=I7156ZwJj^-uckgZ{JS;jwUI~y-hI1F&Hc}qJe~DLHv6A;=6sukYr(Hx z{?&>fF9y+{oBCGpd~J2hBtW!T=^3RaU0|l=QvueTF@cA37X2UXixHf2nqQdVBNpD^~$vr7G;GGUMmK{qp0wdhDBEi87?Bx_2b8i?4VF{(@ddRu} znbza8ENJ_&R>)O-+kW}dANTtRxK)}4VbS!`-Js6xpiszF``=$e!8bMer}-_D?5@Ay zh%yjdx~VOfP*bAx;PppokcHUm%E=_Jy&bP2c`LkzWGAucIb1acqwd4KK{K3-Y(dt9DQP>Xo;ZriDnsLX# z-H!%ROK7+A!*6N1zODLIt~M0AUfn-~`%P(%^4~Nhdt!M%w!^sR2w2hMq~h-Roki8myDtUa8B1R2Hbdu!iZKC3IvxQ;cGK)>VU-bJ z)gA%1s@T9VCII@`Q^KBA(P1@)dQpfHt*iF4^~aU~J!?*YVFe39A%M+a{EE_vU6mx1 zCZ5R(Xdt6$F_1A)1k3^ZJt-NVw!oY3j?I2Nv;XK_wb7_;kju%Z^T(pCCWHRJ)S4#B zR!BbWC|TrskT7}fM^BUQJ`-#EfqdImC*j3xSI;GIa*sWRdNkLR@%;(BfRme6>B(i( zgbS=ZKKao3Y_Dl_@-9y=p3C#8bT3;sIMR$|vp;^*ewF{XpD=6^i=~wn%VR9g0O?I@ zefxOjpBa+aTg8vqiu*exfziKyt%WOp?OlqYavarQdZ@ZtG)VOkP~`EeACLvSLOGqiqZ$A zkx$sdD!l8iFY2|~C~3l--KOY<&~pBTH#Rj?D5&iVwBfaes{Y~vs0B8Sg91I_#x5dS zQeQbW%*uaiA$Ka#N0B5*c#hj6hRug`oidV)+l&FZu#yn+1#&+oqI%OLTdRYyPCgeX z*fxIU+bHp?#zSp!_V;U?MpCtV;!g@>SYN*`BkJlzx>&#vN4lWDfJtBI?g-YlES7ug ze%pNBx}K)f`pRYLEDb%0M)QYEPq(gDx!-&dx+&5Box7aNFnyw&|Le96TX6?xW$FpS zC7|eS&Ls!vbj(-3Ze#!T_Q{p$o3Ka~d@`R)3O>J^M5f%NDVU{)y|&6Xvr{W{`2kOw=3}- zdOg&gk&|Q4-zyuj{-(w1=O{=A+!t|ht?bfhf?F@&+CEuY_ndZIvpa%uJMU+RB($99 z(di{qL`BlNi1B>7;}|v3LL5v%iZ6MuDZ8qtd!xAAkjP^k+@)%#gygWpuEG<=A`MH# zBB1C_%zo;{K8U^PW6!G$A`$(;hwt6XNiQNg!3WMvWTU71$SH$AZ^mEEsYlul9IEWc^vsk0SvY3;1}(?}oA086T**QLpUwVc3;grTC5RfYri6l)wDsHKwvrp#(wO%BB z3%aepo%L@yaDTJDd3R+}F!JH~!_yt#^R{1GcQ>?4H;hX_TKmxh({Gzh_~Sd;i>jm* z{>QyZa}gxu!?Uk-WkY7yFjQw|@8?g-Y|RlnPA`lg!ZshCFvU0++e|fUn4cZ0blxQH zte1)H!`n<3x~9Kvz{GCf2?efx4LM6axC;rn-n<=pNCv8wKocswxw@!85Hegbr@n`! zN|ZWcVlUC&+m%bnY)rH3gFJp=ri4~NJ>A5GQN&>-k?X>%W#J!rVKGSyg)`=gyd(8t zm-7eBDZa)kzRB|_pGJvhO03!pQ|sUeTe=Hb0ux&bhKv)mv@w3@`#dn7;D$2Zeo9j# zO*j|FP7E=(nzW)co;0x+j=gffD(8K+sGnre6hURYNqt4YT$Ue6Q{>bM&D5<89ap9n zu(B^rH|5FUPuHdqBri8D@Tq!d@$%`Xlp^8uPF;ei#7Fj{J!K~sW}6NW5rYQfs=2Cd zK+BP1>D6d_V0suAn4NICMMAqa8{!2kE*u} zYeVarhJ#CScPRymTXADXmLw%cc(Z7f=h9C*Ei>!=l-ti`pk7E7EC>V6GvNp9jW93mXgY|LUz?X2$6({pJ ztqId|Gp2TtYooXSXiV?i>8JT`IOTt@fb7 z(Gfo@Oiu%KaCLD?Ew5%_Ph4$1Nw0$OfnV8e^WRK|+mC>?LjzS1e~j$NEIL5Fm`e$4 zYYvp1JVms-DsTLnc$(<|iMVzboAcfA>3DiJKHtu{tmYAag7xp4gW_Ly!%`UP-Hztt zl>-j50{&vZ>f;)*O*!@0auS&^|~0n&H`DJH(@Azy#br z@ha|fN@lwdpY`3(cDA|Lk^ixqO4T(qlbE-cG+LoQVNBuo5T1&l+?GO|1oJ`PaO_if z5Dh#9iW2|@71R5owgpinWs8FkbevI>^L4CRnI&jKjot03(q`Hb?@m^0QBkI(RE-LhE+jd%LdJ=+e)(@X{c5+2sv0TFf{pg^iP;H!o^zn zRFi7#-^DS@=`dF|!6lnPQ!S09Iy-DWb44u3g23+LK>Ugj#R&=#OJk}mJkcS_5$1%c zpGC3!#22DN9?z3?-sKtnrf;cd2^)o}13wsg$Rgd7wSc-7NP6137Rg!>7d>w{_96lP zDZ%+);jo)lTV%b^y2ilQ_o>E64zNIMf1-(HFO6!SkU++ul?*@(0KorCr#mQ4xTb4h zYRM-=o`d=@o+knyXs26ED=QrltzKu^kP)3d4>jN{V3TQ-S^gu}i0BaRo}Y()R)k=z zKWN!2m-QJT^amyjVg<&xI5L-mCv21xAP1Tn_e+;FJbpO+r>4)rYAABd__YJ_Xtg~- zEyh$z!&DfQT|j`GtO-Wu6-YHeq!LB{XCNK64Lh8^=pQ@^{KX)x3ki^|XN3cN12X~v z1vU917IAD7i>Dixh@Lx;n8LcYbTSgJN`89Mb zFl!*h><3nu>N`ZO54x5=5bu(b7IHe1R?&6FWt}cHLAK^|b0%)*ZCy}7fDPBYUYL^k z|EC4uG`fIPX{5oe!OUQHl-KT^b!u)-@OGHQ^3S(S62ykD(tIy@HJS&TpF|)3diw7K z+=Uz8eHVW%r+%n>8Gk)b=Lpz7zMZ|$vq%a-*z`Z+@ZYr!fCYFCIU2TlGnpcRBbOq( zptwm{z+HjFD~Fcz!aVIGpTcuv1pSE!yaL9*^e*@Dy| zRcUcMcZ%+QrW(5G3G$r-cRU}y9$*KY&UL(U_|6%+f|w)sr-(XxoX^{==teb|;H|(3 zwLyhzBDbccAx_xRrZ{*c{<5IoxV_+3f2tNRima@%0rV1Cclv>4&s;d&G>hBng@)!J z3>;IjMuBt8Gw~GeZSmt%P>>S-4U2#BF{01m<29xVpn|eoOO&Eq1*a1~OLLYQw}NKE z?ic`67r@cI0KjDMf8l0K|0vZgZK*g7_-xz;bk7dB%@M*APEeduc+_* zGfMM>Ez*R}G=&Ai2@3iu4q!G=K<0bWT~O2%-aI;IRKgC(c5u;LLk{Ik5HK*U79W_G zO}a-zSVb7P#z)2ZX}1gbDenj{Ay(<&S+3Uh-WX8=Myih7j)H6fb`0(x?$+meB0((3 zxlS^IMcvSgh+cq!cHr=t-p~`}0WZ>di|mm}HKU24Z%~<=E%~{rDtcf4 zxD3n#rYs-#o(V)TTwSGN081EXk*BnyeBbq^3n=5qaggz*3+e*pVcD+lFuHICu$X52 zWO4S%vAhll3dnle!xq0C6n_d?yXOhG?QDMjo#TI>^SWQz{>AOMoBRH?$d2zQ`?Uk? ze_Htrn<4JbMPTvrfIz9o^a^lunx}9j^KE7gcO}Gm+TRv&HnjSDt(aQ$FAl+j}!p8+qKO znFB#);#Aj53~=Q8;}TxJdwWGb_G#|h8$P9#BIJmH_KLf=#>>SdZ8g~PZ{{R` zh_gBk^aa=F@|q1o9^JSP*YbtrH z7_+hOvwOSqegcUt;n*f+Bq2iNHA8MApbfEt75YyhN+$hD49#Nv=SDF{Zh^%g7q-^L z`@0-q9kDU}GVI&vzTWt6WA^kjq8WQ9I-Q3({S`9t$#HT@?(n#B_kZ2N_4WbZO%2|- z)tMEE^4OO@@+SgoasXk&u`sMAITm&*gDLCgNxX6)()e(>r zaY7~+Xc%0M5HT1+1H;oO1o=SlxZ$Wiaaw45ukZkT1;wvJByNGWx61L}X9-VJtx-W^ zHt?1#0Iw?dr|RhtNIQm#0&y7u>x0?>fk>-^@bkENxBB-y#?YRy_VuGE6NF?H`HM zLe@`BCPrN>({Mn0H0jnr^@^et)|n~cT9j%hbK;tj6pIO7T1e1Tl!>pix0tF&RgERq z+ub{TY0U9?2=Kp8?Yw01Tx~Y`aPi6`D8PC1_;OSn@G5>6PJIU{&hg*y5AY+~A`8bW zyT*hw8g?}=mG6tRaNi$i&7)(u-4b^&R?G=>C~sW-KAz@AaZ>UAKWlJ?Q8kH20Ps7_qf_n0ooB_2@v+c@S#*MwJV zF)b$b`xH3>St_UU)fgitC0nug`Y4^~fYBpPxv|+s^L(!iuZ1r7nfE$ll-B=^P`G$r zc&0cr2^P(qES<~Vd^viJT793D))bz4c?40eoT7f1I2Orzr~(<%DcpwwE5HPZ(ygSG zVa5S9nzMd%W;ncdCr;0KAfnd8c0OBRSGR(=!QnLqpMt6d!FIc&zNQ^IB)*UXj^fZgjmo4$Z!DtQA&Lk-l`@q@DFycpt7V`K}neJqn9$7_DP03Nb4h z2>Ip1xZ@bUGFIqzya-)e0e1v2PoDw> z(Y`Q2BSymyN$NBd{UF@08)DFHX*hi|nX3<=!y&tm7uXjOzC%Q~-hNvEYdE{>)b^=M zczwEn#7A1x1mG~iyq>UJ)7%@gT%vBMRMw3}2`tGl*ZoP_BA^B-oEteU1QHIFM%HhS z?e39-3madgE0LBf6fKKn|9xCCR!pqzF4ilX$|j zP?-t`*^J_a=o?F@5?&In1>8*d-#&bLO3rz>9RF<|EsAk}PW|dy`63_iZ2Y?7YvR|F zoL;R+zhZ;YDPU4c#WLGuWtS3|%{(cz1Rk7WO4C^4PJma)d2Q!se_ncpu05a zd}kFulU{rN{<^>RFw*(Cyb0GXt8(#=NL(?xL>dn~WOD_+1lQnY;$IUP%$@1D0bW%JAaFKPk|jRpxJU zbsG}UzttfWz!C8wG)J>ao=nI?nk>;cl>BT{g7PVuOo9xD4EKYbP***Iu51B4ceL4D zO@2z6p7RX1I?I3uE6~isjI~d29vZ*Wg1@_U@b{;11CYHALLv50@}aWxS1PrSiU;&T zr=m5>|DbvI3M;p3q$xbZ`%MWoVcS0!twu>5nEUVD+fKSznDFPr*qKtyT6q{w=HC+p zjLbv6yVVIZ*XZA>j`qi_EQY1MQCSWn!Q<^i!I+BQ7OK*p#c}kK?gRF39RaKG2SKK| zRr`TJv*9D)J}fli5I6~aczuK! zZY1R0ZYZLf2=Dx`*81hoAV@ohtmPqIRXv90zG)$1GWff_uPU>duRo*Dc4V+kl6y zf-iGD*S>R}0T1P`+iUmboz?+&^v7xx_L92za&~opgLWi=xqk*3B9Z^X zh(>V<7FBj)e0dafkOSzRzDXMj(0~kvN#TGcZd|&;8kH!(pJEIw@m=yq`)L)FA%rh! zp!XC>6?m*nx}181^)gn3*<-_fm?Y6c_JkieHPgMY75a?mr4YU&*ICOLD3gD9H-r9p zBu3BD;dXrSBT7w#Nn}iai>E56(ZQnn7pxC0Z)>fAhy2@;f|HnAVN&d%u$2goHd)jK zNJi_`?3|FtVK=Nwo!ReXnQ(uXLGoa+Py3r$TCFdiQVwp^({hz~sRY+E907w+^ue$@ zlTY{#(FA@5p|V@O2ccCf2{a6{eI$&LySS@(U)^6F zf*?`c<&5HTY55lg{$5qQ@`5f^_4)!CI?H0lRqlw=B~Gtypu-ZLF}p%$PJ$3f^}SGS za%f$8w~4)p0WGX}y%`tfgqhgz?2}OK40~*lHe{Q~Sn6yS6m#ocJL=E>gVC<&YQ!4yQ$XGBdYYv?F`8<1@V`eXyLU-(Y1%d&MUK= z`;b__qXDd>t4np^R&J!a&>Xj-0Ql?tiO(6AAX~B3;lpz@KoXeDaI_1G4$?G7OSU{2 zPP?mLd)k=Ic_=l$gK8T;|3NufU7-}ikh|`WBwlp9Pr+`xHWPS!rqz?!=)W=>;(XZLQn-T8!_WD-E7XUmteGUsyUX zeE3)W4`2TF3f$bBIoXQe%%H^h-+ep1&(8?hp9uIiHhLzR4wtFi6ld6iV4mydTbc%6 zQmr?_o=l<)Tj;pv{}gbaJ|TMF&*6JN?9do67kG55(XfQDKtW<++3vMJ3D@=aFVwKb zZSR+uceCHx<1fCsRnG+@pQ|$1Z&JTQNB!LOf}is+e{zuj#dj80BHC62@`{3>H!^+V z_Vjz+|WCeC8y7idv4 zy~MSDN5Ceu($d=ayzoz;yh>yFHunqB> zZ%_icxdn@$AEX`E=GO8|aW7_?wRe15( zqh&8mptoV(2KtC<8pknc476R=E-F=JLY5A)v+z}b`hx7==(+0OVt+3NmD4!19A^J6 zdv^a|H1T1EOINbU!~^2`QUY?f>(?D2#@0_TV}$D1VZ$iNC70{7f#zx*?f-g0i}e5T zCI~|l{x`MX8t=YOI25w`v*39gri4RC@N4wDLB%$FGDk_6VI)W%jNb1f!DGyj7X z{*F77(hhS(2(tl7gjPHvjM;!3wL6SwNFdy}E_JT3Yxi05_i2w5(94IDA9L?&qZ{gS zJMNnWr~h48vK%$g_-Wa34W`|Fbo4)(3)obqe#wVr8K#9nYaT)qBZ(WwVB3ZJv|kEO zU;3y!&*;{!<*6Ts9&71n2emrWzZoVG9lw7Bg6ju}F9lf|@702!%Y}PVS1Rd%sGV-8 zKRk=Q+7L$)KX-v8BhgV}TXEp;S^z}iS(lTqM=Fo*X}6<9@3W-EOfs-Jjk|U-~GQHMmPCvhcTiBI%$rILoVanz0pg@4& zyMH?6o*c%Xh&(%H&A={>5JgyK@GLvhju78E{hO&}K?)iXd-t*}_9bhJ*L7Ug8Ry+Z zW^goT=Q8E6dxT#tA2HE&SuH&r>C%T01jUs?ArXWj@VOR3mPwuxOXAx$7cpd8A*}*( z2dUdXSfn1+b&%fF>@%w1#+UOJnTb}M(U@x-14h$t@*1sl!KKFiqyVS`lrX2SR!8z3 zIx0cTP_52Sr(tug^|1BLDmGQ*!k`&omP3|=;fKc@FPDgs;&c`QfY($oiLUIW2CD+K3Em8 z$ph4fm=zXVqexo)h#s$V)z@}4fUn{h02Nq5t^_w1T?r*Im7XQ4lyLS>Mp<5 z^RKluJ~O`VI{KaEysjC0ZCvKO9z=^jZSt>mt}TTqQm@H=xtdbG?c6qt4LDx-6tFjb z>pxN4aUq&>Ka-L1(Ku#bc9&klwnM=1boIW+D?5PHj*Zm|Xoya{Skwh|JFnaUa(jN) zW`;S1bL+h*%xFVwa;Tw{j2B}UIdCG0NF!gWcy-P);q|}db&OzXy4QY3oVD9of%HXj zz~x&2ZNIc_b&VkAcR0Dhq&{$&MRi(-bcY#=lv|;D z@zXgW0es4VGr2Cx;(A(1g8F$KsOszr%wG2`tS5+bH=*bh3Nw??(95DUm3edg9yHR@ z!V!cImqMaJ@j@<_qU=gR1!}Q{J>hm|*Do^v)GCCL1zN3M6(k$g-Z#vi@<__k>saQ6 zVsf@4?;!YfD%t(RDv*e3(+YbJC?$#6U%l@k2=X3>PV+4g+wFNV?h(`H{-wtA(MwOa z|7)uw;J;?f4AuIrr+ySF>UioKNAF<< zJ|q{MsrWx1YU^7ksre~_@)-0vjo}+SQuB0vDZ|DnXVKBgB*nF$!*x9qlh8L`=#V(f zIEGY84Q`Bo)!i~Eu$7+XrMu}Z&R!D=7BJ^_l2LQ z_)YxaiT^?3r?%&n3BRX9QZwH7Qkc64IJx;ek^NZ?yuY-q4lpFj=U}-a-N^C=VHjtR3u@s3HaGU@m$^E-XR{yIs&>Angw-C*QOPJ62} zmL8SHwkH_Ya`B7#SlBKIVNfPgsfN=5S%lG$-Zm7u&YSngFEhKL*snQ1I<05pZUXK4ZGx=D#Ke&z$8RCofc^Ej^eYumtq zP_bE&NwPYN>Ivd(!tS&T-*t=4CR3h2n>E1OA|b(v>&vNS5&UJ$-Hj_hUTAseWvC00 zQ{9oo&k7{re2CD{kB5mw4<*Bvi%gcAa+=PPA4<<9<}_Za;}nk>YiZOzi~S%9PQn%!fem0p%R< zh=_1QgC>MwH|IK9lwqtvtO^ijT>wzh9Tn#O^hjbs zUp31q-vvu!gWpv50VC=ANPLhaf=zh>(QE6M7CHhK$R0%A{c}-nRS_BnzGP9)3q9p1 zM;@8AYQpgRmJsj!kG+|$FcP~l;_BgCgIk0Ec)M%#>qmrjJsPysZfIL3{V3yMap`z^ z7gYV!w+m`TENMy85yy^~;#%b7?1E>vZ55@$x7Nos)gA@1HB`@cPU7e&d*ANrR&)O> zem6{4*?A5vtn|G;DfEo-SjzWdT=KcSS<25(WCPe#Y+E{hZwe;nu-EUc=&R6XH=Z~4 z-!k<%9yW1(exQ5A7V)>gor)Fnc-0s4*t|R22m-m$fG@vuv!0EseMjB}19wUrwUOoC zelGmT77pu)n!{n3D${c@r#Bj@x_#I{=K|aM^BhsI@`-bq4lE=dX_I-LOk0{#!VtY~ zr?*pt;nKRKVV{9AOgY_*ccnt!JaQ-;GL>v0!LsuS_5H4)uN^~6aQ4!^h@luwxAeJckt_e zTat}!yxotO-o^R6BWY)@HEr=k!9Fb;!JBI)nxXLZp+6QR!u48^iX~GN1as#p8CkpV9 zGt325=JknAqT`U}BfiBu)UA}Fvb#R)`9Q@qN}0PD1QBhmr)cCw#^Zqj@LX}Wd05md zVnYmQ&$vI?t( zRK3h`rb+n(R5OdJ`Zh1A1ql4Skm)oSMV}FfQW#5Lk7I{9OND5MB%uE_)~$%>M9qk1 z%(py6DC}}*dpMkAApDK`(`Ueak22{zDTR=Bl{>qG@%klRuKQ30M#F&6-xaPLg~Cae z@<62oNB3nUKdS}jT1{kxH!YuOG}dquBZss4GSnDIf)y!#m9-a$@797GD?5JE)ui^@ zvax2eBk8rfn5^ny)rIa*lUT_%i0Pu};q%){9OjCmHKcSxNsN>BfD5pN6EFw7>gTB^ zu69GZ(ayU&MK|z(;ktGUDNCaulF0T=Aou%p@vIaCNV9|3t!ztVmzZNQAOGjSpZ%zE zShTE-<1DevKXw)mfrc!#;u65M9`eZLc=07S zgNWq`4b@6-e+yMc3**hgVQWu_twBv!OG-7^xUNI#K8l(n=(!kAy0)@ff3x~zC9 zd$si5PUEyTfNRK#fSI)iLrN3oymr5J<(CjpmW0HXTe503z||*LKG`pGK%)PI2Cb|- zoeclVc7TGB|A-DAHX=E!p6EgXQ;js157<|Hf#=+T!j%WE@}HPvvNexZC+AN5WY6zD z2a^NO<`aV-RhRwZg@qXf)Z-(KQ(2Y}7&D?@!K%x$MCBhh>#Qjjp-iPn<)SpzN~VP5 zJ`&{R1)H#p!J+w&x0D49?i*<{KQJqT^j531-h#s@!YJ?si&dj&Q9>njGe0Ah2GXkF zSP}*jl%XHLNX;7Ke~aL*W!Aw=BqMUi;yn6f9E#fXiqZAH^pYRYwTAyXcIf_&V~!s6 zkCcJAvQYbb!yJY?bksCop?yK~c*6koUR#pu0w?=Aj#bZtk&HdskCc1J8pFbMwAK4k z{s@BX@3qS~Hn&fxEbbo$KwH~XS{uU8jXza;F@$K*RX0^Jz+&e9#4?*crIksqs@QgU zMh(H#{jlyW?Be)Qw|m^cXtw62LEWl+rV;H8!Bu(!SvAq)ILK#Qe0a<H`6is{YXV=Sa zXIs_%fi!>lkV3!ycmM0|PLpg6#?0tvQLj~OTMOutsD865$26aBjxl_V>6CytdR3R0`)ewa>GX*$}(gaBdJq)hE%IvI4D&gYl7$ zX<8Cbs3iu~gpjAJnJIbp(vo8^r@5Gp0V}v(@}VAxqPS`JVlcD)3d_FHJ}AKHZ%;PK zSikc3G0WcLpubRFpTh?7N7YtOE0364;+1HY!IKT@ldTJXj?_=8Tk)HN+dV6T+o+R= z6QYcs*`4|PaDK--ANwKjLrQhQ75}ofyYE=?|Ldw~VF*y)xYH?1Y`I#$TCk{+n$&-7 z2XAGiy|>Mx!xRe*rSJAOdsYcbW+R+ZPV10KZrbQTx*XvV5M7yh-yY>>?G7$u`_nKes=33;%54g2URV;sJMPKywb#2Lj{)Dn|S z$|Z*>)L=7icfHnXT#DUgXHjsJkhvhVMQLsnv!K-bMK z{=%#&hw3_GOT)4O*{_`;TY{}{*~%A^10X!vbyG7IbYWRN+EAMobMQjhdAYs-t- zc;49cPCDf1Ict*aFn_>9F&$!ICRkg){OU^lrm%uLhq%f-$SdA41x|PZ`bM=hy6lax>4b8K)8_sREZHJ8^(s(s3_)zS9AqJfiuM3vsI^*peA&I&<=4l5FGWC$0CgSMJaqL^{8{#CV93 zKQ7FwVC4O0qI|G(pi@WHlhp}S$+=|S(DJ4FsjYM&e95Fu^OC6%e_VsE+}WuFRQ%yR z`n9gFe{Azuzp-IgLgiKIl-=TK-lwD)eQ2uEM7Cx-jx?`EzPW=^WM)xuiKa7kOr-F_ z&T~7WIpxlW2)u!ti0ALzPVVzJ3yx{;N|bJgPR@1mOz4`{6jk6mL4RACDqNi}eDoBYTxS%EO==dVG; z%6|qPnZ*@R|H*N_v(_F#_0udG{RKdc{@2&a2e4sBJ+?#U5>=BYS$uwFxk!zm^Wsrf zjgFrT>mt;8sfDc^+>oH7_WH$4(uRL4y&}+KE{d1a2)ha@2$rSzN}-b(0d9~QlFWJ^ zA0pL-gY%WtRG}Y6X=#~+_8kF%PJ<2>8p!4NT~+Th8H>mmzM+0F*B78MFAp7s%|Rp3 zYiHL^-Ayf7r0Ty~B=hKhZ+je72c-%H3O5+{IjE%7!UN!JIU90LjbhXJ;p5RPS>zf_ z2C7taA%^ft?4M1Ghwb{+CU~JZw&~q`bnImTeMeYX3sp^VBYDc8QL`CqDlBFx3+To%E;pOA z^hcS3l*~~JD!WOn^*>7UIKDa8eBG}}O0Sc#v}Y?^wG!eRR!ps78|)ZObYO)<7TWb@ z&gyAloMdkl>jcgIP+nPe0WP`(n?hoXL(U{04F%6J&RlHTQ4*(bYZ0g4&uqJ7C=buu ztNy6-ylL@9#f);}q7;xd*30FEo{9ttPAztp&72P{6l?5lDJ z__ebYEfW_m1vkc>w;rwPE>txC7+n;$7vt6EeZFi`-MmJmVY`hcJ9LAe&uj<&z@Mm8ZN6!c2BDUmke!bDm`naS|WL18|I5_jylMQdnyx z$hqRH8DLP2!UtIHF{(9TbiHqm(kl$7O5)oypZR`2o0ZIIx=TYks>nX0!M=$%RNr;1 z&Y`pV)Ytx$-FQ)N)!5Btd;af%)@}W>5qr*ZoO}#*YNOG@K5nijz;M9SQ1ZXSe3_Cw z^&eJXAGThAcu{q+II2xJJa6>VEgCebTKeQ%sd2HHEEy;k}W7yC5IVE!)HE(XMxDY#$#Dd>hCGXS{UfJI8vGp zG0e+c7UL?8ftCi8nN4Eg{wi#tUcwnwC!PM<<=KIqcdsgb5GHlt8MhEEmpY2Z$qpu#MMvloqK zRW(qlw#(=OLv!~*S~)j{v?9?X!{Z~*K)}JJk!9s%sI1RQ zn}Bp6q>qCIOfkMDOE_gEGV`Fv_Y3@}_Jv|#%-G-=5;Z6Vhd#YDvtcdcU&`6JQNP7q z`{A}0XPO)-wl#=<%;qEUm@VI?hfbfw_QjLYmO0q0Y{SK3oTKo}btU*`|Mo+aeT*)< zDbTV5$flZ7x;1H@Bdy(8>pJ7sO6*6Qlx`+V4JKI&aY*kb5n-d#wj|A0f34_Xz(lAt zO5NP<=L$f}r9U2WwI|Uw97e5hpRvx!ocWlkZNR~EG{0`>?n0$-LST>l=|jvFUg2-g z@?~HqIJc|Wdqvgvi#Z*%OfafDojhtp+h6;HW1w0~IpRZG>i}MAR#D7J7I|^sH_xIb zp^@izT)Ms|8r((7_bBdgG>&aQYj-SAPv%HR{GUE=8zu2YmkK>KU{<>Rc~Sfk%puxD zM%0QB=-$NGUap3&Q*oeM0l&uEFCX%k9jjdEz2KewVoF#AjHP9p;n5|u@>2oYC{6`W zmUx`&q?5z`nzBFW_aqP+>I^~&I;CS|E141t4+x!&?qr$S2yuxP7pyqc)v88S?`>4U z@|v@j-D|3Wzo@BNHp?MLuYJ}NrtMFE$z8CcfBl~<(~&}#^uH1KX`V{8zT=A2fJ3_< zIcx&{$^8h*7y~1tS_k`&GkuR`wimkx+MgMjwHr`QE-ZKJz>N-3(?!nui+UE-JvNQ+ zfJ^K^TNWS$+*mgIKBm0WvLc~6G>TWvHVm>r@`kq9a2d$RjI+PdDCH}nO?0dSp=~8p zBP1fRcH4PVt!i<~vqdA0B;WW_rtVZFQ&cpRFJOk)s*FYtCjB8r0K8Rhw;BsU&- z`35S96YpGOkQ<$Wo=qLtv!>Y;#X2wHGkDewz+hFWhOGh>&Bgm)%fMmx@sZwL9{!|5 zegSzCZg=9(XDVL+biIdvee(KVJ(O?j|>G zeO~mIU^sl&^kwmoz%U1#@hLDb@?E3;6XE1q#xe#MLJhETTPPwfrJ41kzddcD`<(#7 ziyS#qOX}6zA+kmjnAS326HINKO(+xb4%((c5Tb?l4yVLhsxEGghn~jcEwh?CKoCbH zl5jbA@(<4UWHOv%VL*M57ehI>sze>aG?t7oK-hvJ@(-5GAdL|6o=&cC&`FmV77Ghy z;xuJlWN%pu{vZ6HY=Ja<=^dG%cBxxPVQ7xR~!>8M5+2MHm z80zpVv#Hhbh~B(<)d!*uJKV>*6`udY(LQYdLkFS>C?<{mFUpR8ih3Lh$LKd!gnh?g zqX<4wBcJeu(+X!V&S`8GY$g{?L1M}oPLh^3<=uq>6BC9&ymrb7dC8ISdi z%fRcLXmuBKKEqL9FifYCEJ2y56(-V}jP};QvARke4K+L793b$AJ+vH5^=b%rQ!*Z;PcyU->p zd_m8WB(G0uD`||lL|X>}z=PF>CRlAKb^Tc-CE4z?$$p;pF@k--m=+hHX*P*u&-dF7 zay%nHYWHzi*Sx_an(Hd(hgv!p(6WJuC|_tP38)zm5Z0Ih9?P9?v{^8F9gzI7rGEHM za*f&5Q&?DQz$PtSwa@mLIGwZCuJE@v+(va<)T|y@dVuwzX4PPH{KYK&TkY5C-D_|8 z6wZMIXXZ_o%WAxKBb!QtYfZb(glq+o(>e3KPFJJQXWxX`AN-GdS~+0uSJf>;FnuB4 z8-kqC2?q@G%XbO;YzA>`3Kwo=1M;lwXTW#niCQ{o%S#ckWbVbtK?Qp|87<8j$S2_i zAL$$Gry5odi$coJ9L&{V9+Xz`=?bWqcXp;U9=He)UA0f#k720CAlLN^wiS6RqoDE~ z`6pmn)`Mkw<6qDZixCFAqTZd$Q}cy#9w>?O7+63kI4tuSwNZ-!g8SlT1rcv@e>)zQ~wQywr(m z5cfWIPxH6V6@EmK4-mZ<)wk%B`<3!*stP56U~$k)OXJu-?h7AFHK0r_3=b_x<|p2u z$v1>`0&}guC6T>KeGmyYcV`_*tDja={bt+j$mLx;K-p6I{f(-dIYc%-E1eQTN#!j) z6PpEf78NLoO+V?I-As>aoko-azHzh#=wGM9hF{5Mk6{K@`hvb!>egHCE6s8ou*S;g zV?K4jK&?)|`Hj5@evOXfN{=!J)wY@Hg7b5Q80==+;Yb`t0*== zd-d#elsM;|-P*f0f0-tytg3c7fhKulVN?HCOL@mr4Dp9~TFT>?w42d7i=qK)#wbj# z`WMH|%w|y75|-5pcM~Bma1>BQ#W`O__Lg&o#Iy>Z7jz~UM(Ivd9vB`@8$%g{$rT>> z6GTEEs5ny%mxxb`9;B@vd=7?}P7~26O`@hh3P?@|NnU7zSSEw~39IUPsMtNYhr2#w zH4H@VaLq3=5y4`#T>tKEFjet#3IaTWY_J-T*Dd$on`tp;hc9qs7yD=8*^P~eU^k=$ zCKw@C)vvqmqb^+{=})^yJ(y+@bk#SlhInx3kah#d%jz*2VkY$n?I`EOnXhBayF1%( z$~5J}sVMBmVii~`-bfW<(Da$n!BNoVzmW`Nt|DgtunjWQ84}EOziPZ}NHA;g@|Vly zZ6Nf?s8_@^2qU^HI*e!NhB{-`&NwQ&4vNe#MtAGNc<8V!B>h&wf+Z1k?T^HG#mAU$ zaFo4YzHN<)b8s_v^fnU$WLvpb z{=&n1^AbETt1Hoj{Icy|#NnBEEn~KLFc1n5VG0&O%7~1SI-wYoqEE6TepG93RwJ>r!md-DXX!v>lBN5laj`973$cAPNC80f{3;=%Oa1JN_Uc1{ zPz`@23-WFru-7M!Yd*47M&=l8sc^(imzs&`r>5Mkc3SK2FQj_DF^GPQqC&#$u^;@d zSd}BGAJVC>m0kClX<%zaBm5AUD>hy}&|NcT}jQ>FQh8!rF6ee{l z0%p~k4p9l16(Z=sh}#wQZr>(%VeobrpUaw2%5lA%YKPtRncr#RBlG~JVitCj9FIL7 zN_S(futd7NFLyq+BjqC2bewHOvUL3qr2OAN!xv$wbO92GVj%2sIGuxN)LCm%+y3ck zN9*B#0(q))_u67lkG?u^hl{XEJK`3Ul8~(65+q%rKdLglZb@0xDm&D*bOWwMHLa=5-lp`04}s`X&GA@7$xG=d)j zA)JnH5C83ZlJ!~C*cjI;%Nr587&6kY8j_;j(KqpJQP?mpmov!X6pk>k?g^u8bYb>H z7p5a=DN6&lYaAO^m!Gabv-1F#QRAaVY;riFPiOr1(^Eah2=-LJORqU5sAfYA)5P{! zt{XlseW3VgU9sY{{SG^ERXEqc>rfv<}D?oDs08W5ljMRL+ z%8bos1)a@ooJG-17ilZ;ZbRsCxGUCDbV&Wl1q^-&un5l$2ib2)`RHO%uPD<&j8?@N zTCqUScRa$PJ+A+l#MF>FEAP>7F+HPdmaNH(IT4?0>J-f(GDsgl{y?*Z$Qe zIRS^{ap>36t<|%`?f1O*@&Cv2?yth#(|zObo9POvAm5Od#z1h$gpJTAT-^KKnO3L= zBsn?NaekdI{efvug24bU42z&b7G$6gr47alnWW^X_=;skPra86_x3G)7d8DT;A@(< zNBPyn8PqY8y1FZ zfHyD^&W4$SiRic+9L~1gK(>EAG0XE$1VJ{Xw!VZwu95DlS{0*t(KF*`g^aQh^dsLC zkpCt6{1$wl-Kr8hHMR)i6#iOb*W{@>Ad7iH-e$2oUNP zS}|kRb|J96X+$5`4S>&=DHgW)ZL8V-T;|{JMmgH;h zmH6-fK<@(%B>nF@N>?_yf6N2Wk4E>jf?|eA*ej42C&Il`+29=AbKUbskYflwv7#Pd z$Oy}Q;Q;(%gezg)Ma!+9Jm$`IC(AVG`E%@fmq|Xk=m(pe!+#rNmu)}y+YkwYs(b!g z0C(*v=5h{k4q2nYxaZ`rwcMY^emhhDu)WYrcWra1`Gh>I<i@O&M!QETjEjW}?G`JRjbI$WS z|C#sOJ(JAb`H+2Gd#|21wC^@E*j-!v6_F|(B94~V%p9LB15}pGYT@zh?_i9X|^nzm;h|GGh z;a&Yd<2Ol-dz%M}SKe_=8dQ~{1Ki^+*E&hq{`I-zICuW>_R7b?>!E+oJb%!~z0_;K zJOr*Q?CWk+U4!1g#NVc3meJlni~BnIyBlf5reFIx@=(MBOneTVU_kaK7mPOVEB(Pq zYeJ4*Op(_rF|X^=-v^%tPqF+@bg4B(UQ&NW5Q^NE{_4R$rg7XygxOSL^G`Y8tP97F z?55<+Pe#vMow?7qVZ8NJ{E{}9uLo_ytp+^={&^*}H*D??tnGEI`DT!0!18-S7PQhw z#;t>8Na#xAN~KAN5>7&gqM;rUq=or0lV;+LP81`P7J(U(be3LUDWP|QOD|zqg>7PR@Rdk#6<522bc7WCj}kw0nRAnJ)VYDd@WaU%+Gtw!!FVT zv-0^PdyFrK{--iRk76qol&jRwYL@78USjGx$bsP2FoWj9t?2 z=5wsN(GK^DlHTf!2v3P;69Jm4VboyCx#8ixK$e*3%2PxpMXQrpQ4$dJlb37sgwbSZzrv%R0|SSGa>$&OQpC> zWw9xLZPeQ>h=~^*3hKTKEi(9IJ%Emu|I-3M$V$3-P-?0Jt|ra_1by{GWyC$tR7XwI>GHfQQ}eIZ8U@Y}{Ri0+dzY6QrnrWJ7?BJS$n$%!hhFY^hbqw4LfV?-(@Wpvm`9U5iWqGJ4 zQHPnM6!`AL(!&$(HA*kS^ISX$Xbt9#f}XOTh?{8F(s}tL2cLjz&*7nyqi}~*#C7FF zSX^WsVOEXXo^ECaOZj?Ti$a|ntK-z`tMT2x|BT5*R_ku;{(}nVj?fP$j)!+9j>lW) zCv#9!9_Heckuy#+}BM;4yd|HpkesbvYPe6?tWZ+o_%aD1N2xgLy_Yif7S zo46Gdb#YFs`-eZw3f@rIOR^cyU-6Mpnw;V>5}2@wzMG?bXOG?PG1Z4+#P`!IitI}r zp*g?OipzkC=vuR9E+?AM_v$*+FYn(+iSxIaHx~=Lez5#!tG_$}@6@(*C$TS|X)M#a z1-?Hy$Lfiy1=(%t8k$v38^{_z`-v%MJ~gw<+kP&2CA;n|#snk^cj;Y17U;t95tbf8 z8@}W0|6D{e?P2DKxX@m?98y8am3vH)_)TeWtcGGk=z&w`nYS_R_a(s-xSkP>sj+#+ zgf#iR*`_iD-zoY->OAY6n$zs;v{B|TODLODZ$o||fhlLNhE+4sQb0Lz7}ucPuDq}{ zq4u%%3OLtz?9rg?gx$3sCL`F-|<|-&Of^D)vscqw0U!O}a&zqWH3gq-q$6 z_UeB(n%j2E`S9FdA<~Opa7=fKJm26?Ce5r zI5%0%FFI`N{b}(T{V1gI#dJfB%bxL+zxJW1QtjsMX+Q$z1f!kwmp-KEfV2j&oaQrK zc~wA4YZXHMyAVQLIVCpOK9oU)0i(e+rp{gj%o@XMLOal&6Ez;)15-DUa)=tA_4n#z zu&sehdbGiwL-iMsP|KGZLUY!Wnl%%CBFCL&$BoTy`VZ^>6Z6s$*S0jg;+GSH&n))I z{tqe+fN_Z|;I0rsBB1Hxe=|%x?SJ4Jxt59FHj@9vAn~^X?XcjD2ZL!xBz1^E2S*ZJ1g4^$t+v)dd#;f8lPL> zH^5V$te|=~w2gcM#V+1>uU#-Hh-UDobm^=z0#2{Wp=dG7dKeg^aWuCri4OQ# zjs{pv>^O#+HT7&=`4sE=mMmcYk-E~@V;)e*Jc3YljsXY>>W^WcVwQBkDa4zpszOmA z#FFq0Kb5ItD8|PVQilrv0Bnn?^;xUJ20f-`@60Ez**7==JVXX|7R-CmWbs)Oj#iH|6L;RS>~M4(wF3nyRAV9KH9*S2?hVp44CW^F($6V*E=d7tS}Gg~VP4tCHj#E~Nr4G`hd`v5WRH4wA5| z@O!64st-nBpkaQ&bFtU(tgf)``ZmYf*=#QQjd9n-a7XPcJ#an_a~ZF(S$8xOd?t?w zNFQ5%Bsd-@ux^>NsQGyIv5TpD%AT^9Xob;u#g0|scO~U{`zw}jiRq^9`y0;BKUj*+d6oQz2oSn++-w{J zGKG+d{p&GQ&)N_c>~VT@3OsDL*p+vXs7om3U9#FzdSYdtg^$TcAKibNsf^>TemYB& zJPp8??k(M}?opIG;LrZ{5YNiXskhy)^O_;Ft}_}64w%2~Gt*9@4?!A%udA|)ZV!*q zE=xxR!Lt#t;R>MJYF8rJA{5ec$450uuSTgUh7FN8N|zBvre_(@!nj9n_3Ga>oQ6Ma z$X!lhFu;~xtLWFC{CB5lFs85pw&D)7^r}olSQ`nyZJ-eA$dEPY?h1r0xF2ocQ@6*w~|^ ze-h27vKpG)y;^VR3xQfSI>0qseFRx|43KF60o4{Ygf4Gf-*__rrui-Lo7b#GYL@bG zo)T%{HPpwdI%c3=VcOA>`iIQQS&WAY0Pz^Y?g*SVu&m&|l87SL&%r)0uO`X_%~e}W z=#197v?>aG`9h@MxG_B*#3wxDkj9J<>w(s&Eo&O0_C!+Ls2&-_pt(RzmA* z=2;sSoY3%8x#4A=i$Cq&62$Ucf~Eu~e}A(IMGx=M;na>d>`dBTBh7+{l>_qq^OUj- z@xXkkb;=A5aO3(37)R^{X77ha*GWWT3GkMV^CA|7Rx4kdvcKrFxiU622g#7sKdUqn zc#$C=r*0y~3Uyta!wAur3qf`@&++^-=4y{DDwX8BN@k0r`xhEd-yD5m9e&QQyQl3u z(RU#>#gnR|Eq6YHR38q1~};cs}4yvk?b$w)57UBd?LCDQ(3L7ii%B))GU zlklt}zF_2rbbE`fP^X^?VFTjgs*heNR1)DD!$#p!(ehCEMbz1DYg^$j?8%wHr5!vM8Y5(0JWBCZpO5~63-P(cy~(G6@J zOJT0wNYs}QlMxqJFfhCJ6)hrjgL&X5a?l&JCi7NL)}_-==1@r6J9pN> z&6(??f{5Urq<|xLHJe0f*MHvHDmy%<V~;Oy8p2!gHYHu5u!5opz-hK2Pqt)jfr%25oLoP@u+((J+nM zpY<_4&nRD>HlNt;>Sug1jjp74VoErSJ25y~C0JMWE0tvW!Z&P3us(ezW6nD!7FVLU z3tj2{+1q0uTD8Snv2ER3Ip|b({e#iEPD-2b1@&_X^p;WxUhqvWBL#j9qhO)1LS`GG zw&E*??^y%usEbi-?XJFdC;2h5{4ZYH(!ZnGSh7CNfQo_MWl#{g@R4`S+HkSsfVkFn_ z?|tTLhNJZ5As3PdORMHh9R_JGReyPN6Ur?;5aY~Q1|5;q&h^;L6L#qq!Z{Op9-YUc z%4p1BAP&4?m#*uue%SEs7JHgqNx9ovBA!~|gVzhZ*^a!uGxZD3p!T;c_=W$7DS;0| zwgGxLf`5`ezOanLHBq^a&_+ImE5xh(ZJZX{DF@gEK{KXb`*7fX9dbkkzGU|XKE#xF z7Swh6sS5Uv7v!BrpOW_8vlrv{M2Tcz^iCgyIhhFOGxFrs*+rhJ=oR6MjqB&y4)+N_ z2Hgi}!s(aM!_|m#2DL0cUxEzBWgK8gd z8y4KY{uX}`{FGz{jFeVwP;M+%k^keRUUPi6)*N3nqqjTP;c3jysgSw%9N z0Xym!R)<$mTGAh>ke10#Tw57|(cNZ1BqikAU=UWR4VHbL1K3gP`|aCyDg&Cq2ChZB zCcZtz^|%=h2Lc8pLJaPqLd}Wtu~;;#-L9Af-hK#afeDJ#e5dU1SdBiS3+34Vv{IS|ZQ=e5fo0Xil1AqpPmodC zMhEiMKIcgQ6RJ<(4A#UFs%DKHA1zZ3^4E+|-mMIS=gRqeYC}8-%?i03tagV1AWP8h zo2HVUF)-JR!Sd$XezgS9_r)For1{!p!YE%Ltiz$R*8_qB-T2(WfhLhGEpxLl&E1}E zmt&s5Jx1?$ixg#%CtUY^>oA#jUCNeJ+=}Y62Zllk1LQC-a8QhlS z-1PLG27hL-EeOJJF`N3s^Z~kSfNI1bZA=s5!o`)px}T|#<&pt4c%hQWeYs4?hs!w; z>!9PA>Mu027^MR9v@=ML7ZfPW$oU~A0Nrl<{794T&K=9TDHx0*ULYiQ)|DUl=OC}w z8$6wF^c3plbMsF5{N}D()b~QF_tDZRFtXbJ{@r=CE||3l4f&f$jV74N`~Ql7+hV8u zf;N%@RtK-zWwH!UhvlyYlkNi&QVdT=iyZdF_(SpxPXZjdFHegc*VbFUgNsa#qJ$$%?b(lvx&8PXV9weaMSAU ztd0cd&>{uQ2<-+Wcvw-dyYsRnZ76NtTUj-QD=gE0$0I61$~J--u@>TD*Z&mC%dd!# zn6i826vYN(jD9*!%^o%sv|HG*uOH#{W$=Ol?LBx0bmS z1I?idgi#DvNYXN;)yInywcs249Mfa@Ca3{&$GNc$eGr7ntOnf6dcHMufYz%z1w9Qa z__3B4-{U_l$OaO8`Lw9L@-dHD!}5ad_-zZB&Yc?8lHcm$uQaHWvd$w-NrWk1sqnF= z#_gJ&Ia_1IaS17whvV8BM>1#;YOG^xnF9R9c6-qxZFnPWlNtQ%hErjD#zWGm^TX$v z9D0&VWJb&;r2Du=7YG5DiMlbvAGG+be>PWqZ#S0S#MIxqdij0-?!f-$-r)X5%%I$O zV}GfpI|cb!*(S+j9?aJXz3SB7ySNnce`py`{W8gIA5xQ8*_z+~H@T-bIKJIK{J|v0 zHvtqH<*;J=I4g92*95YhO2wm@>~#vM5w?GuHYJ{A18@ka%`4XVSaGC;Zy!YZQH4f| zD8{UBegc7ByUr|VZkCgT3vdi~jePyqF=zu-EXj{^839SRLbUHG^vxYzn}Aa=ww|+7 zgfHCL;8!O*UDUJgL&5>yAl(q%aHB?bub=a6v09icEDrb zV|=48zJWam{sBwa&4K{@hhZ1j#81Qjoa;{oeddQ@-o-|$1f&D|47hpcc{I}P3GM^u z1WUGFw{Mp8nG`p&yAL!UKwP|v2seZ@(590E zcu(W)v4+zH?)HUv)YIY8$zgwMn>8_KxlCnJ!fap+V(^I&KoBa^4 zjo)i+Lpx7=(A`e@N%k4Gaf0%NsC$nNH-12f^1`57y_Xmlw1(T@k&`A?Bg6dO)Nq=~ zemNRlcfICTZqKXIu)qXkIZd`ng&ObfyI{u`2IFbNX#{&`HjC#?oB2}1O$1;E+im3F zlifm-#mN{ns}t;U@qQo3JkF&^LRQYATrDhP5Hg1j5)$Q{qg zZ54mcF9~wtt&ZpI-+q_zX3&loUt`jSGcy^zVzy$tF?>mgi3%AfJ93tM!1N7vDUYVy z2%ry+Vu5!C2_ZD8n-nD!yY!lu5^xy5%|TkMJNY!@VeB*}If!#jB0crvS2zB4p_G@# zSq*-<3dN##Zf@W?!>fukzTd41m`k}%$d|j6w?ELUd$k%zoY(IH=^G=2Oqnx5q~_l< zJ}}x90Q%pPOoI%=)BXNypDN&2ifRx?z@6tom@m4l!FJA40>YnKmcy`*rw}wfQ4Cq3 z&rXm$S+dVgtCCD_@q|8$htzJ!(_+G^ps*eRVFdjhqm}`{#M);&X{kB1Z+>qb6cnWC zsKZC(ZAj`6ZI$!WiO@bC(8Rw?mX_l$ANUoe0BQ!rcKt2^)##C>7ZJ=S0R@40eyuGV zt78Q91ya_f**=p31Rry&jn~;1Cer zGHhYtK~obD;`?i~0(H`Fux)fjbNMSt;+ zE13RWZ~b7D-nE?c+7b;N?PPI!5s4^^D`c(%)MVO(;2s43*ujwvB1ES_(5s~Bt~^An z)A&g`f$#i%Pf{oeVImg}foYouS3+z4^Mn0&1X|Hbgyrz3YRn)O!eIWd6a6toUitfy zh@sJ5dxLpGLRWdAKH$6$Cb{L}47~ls;s?)4_)q31H>Sr&u$)rPS;XEZj@~EkBD9x3 zDM_(6g=k{`p8U{n2sZz_16WeFUT#~P$Ud1>jd0dR6!#YbX9@&d(C04j%M8xMiRGH zja*Nj1N7iJoWO4VkzHm6LEJeUh@@YXr?$Koo)6_!>o@o$J7)ZuqeTo-iNy~c+KY^N z06Q%`qK%Fq5N$^@Ib7$P4Klfwsb8iD_H04Zd1gTLpl3BRAeyTfk-hQ}^>kTI1g`w* zvfv7$p<8Jkx}M4p-C)-}F|ZcLNHI2%ApozA4#mL0tUx8XG>!6pb?A8^7)ZW8Y13Uf zl~ys#-N3h49SlM%%=)Xbnt(BMQzO$H(ZE;du`=Q9R;T?eD6kE4)<)JdUWN;BZWu19yx7XNK8DO86%2kr!B>yLD^iD)xPTR%xmZ`U&z zz?U9ldAfMFpYcErFxr+vNMdHVRd76(*^du~*iZ=!mjMuEyD250T0Ww8mJem1PB9MV ziZ=$cL+y!N2Wq4-r87S6=dM+0`#oZTw-b$ooID5<-zr*1m+iV&g5C*vk0%}0#v88G zG;QumKZxM>G(Gw_us1!_wh=l0rv*?O%LwB(^rbUz4Te;TL!dEbh(D@KxeJ?H{Khoy zV)8tQ;%r1x_A)vg3i*!aL4zqZafn`f(mkQ;1)t1fRtp(u^PW zAFdh1XJILk-EOyyTroE}(8Yk8ZI(xLYSME-F-d@4wR+84v6sJ5U;bAxis}EabkgMJ z(E<^FjStVEX?}fFIp3u8#!v_0fQ=Z;!&rpIQn2St5oUZy>5cO|=|RpPuyYPVr++JV z;?ur~p>{_!5roBp{Ui^+hEJl^e}g6^51c_mIrk`jgAHJmqao@;9rDDlsDyLTi+79< zs*yN}4Y$?Hp#JGmr(MV@uzfd+3bT#F{i7RH=uyYV%YY;ps0XuKoMa9#s}&FxL|Fes zNZ}8b;7o)!yiyJ$TgD4cB20l(t2`UYNCsh4)DbE##KokzClC%!t`^bQ1cPkzV(Xji zd-NB+zfmdw$vhLo{}(@W+0YF5dyRS7pl~AksnD!inmj+N^s&GR-+qwYPG4JxuGkGG zFP_Qt9a(K5E#r$R{kWF!Fls_k0n>qXcLy0#+AD)kw4Lp01KFzhHZ(UHS}7Mh7CLKN zSwB0}@j+X^n{-e>f*}tST$3JG%9noFgD`N4r7vI+;{N?6UjiGCKRu>f0$9=8eLc8Y z8)~UoBq~vDhV*OIXnfAwsFyv~Fu<>b)y@IBxmh)0%m`ZE z+zEm_3?G)oj4jBgwn}s^ybi;IKumfF28tUu#Er$?{C9Td#+&&~$tsh`<&n`hNa@WU zDQVlrroyWnybF7Vwb>>ZSNH*zj(>VM_F1k>F0bx?>oZZ`|8y?q<|q~$KPG^>9Gf4B zSQ-4fw+9%?ae7c>CuO7!?eY{6QLz#5@~NR!$N*U6f)+71sHJl?(q1vK{a^FPNhh(Ezmdcezvfl33gG@?_A&IfOpBwOFN%|#&z&C; z-|pVv+>RG)5x(yox%6)vdb)LxoBNXL4uP4_QC{9Y4SO+5cwB12#K{3Rnm643JI;YKuQ3 zEauF`Mxh*jHlf{{ER^!m`#Wnj$7FLfi3v}LODF|LW`@iIW%VP<%$ofL7nQ9mL4yoH zmr%-}mXHc%_h*yRqnz|Nn<75qv1NjB2ux*#!(H@08cHV*@ z)b)4aPFZjHn}oCuyQWz5s;#Hx9pV&g8oiENEsn05tEe?I_-n@pbbb^gl})Y~{NC5lb<5k>o!+r*yrSYskKP!*@7xrh)F2Os z_|v@erpmMw>j?DQ#~buZT{;<%TcR|@NIZF6x-BFLY4(Bc50$6LW$a8rn{w%eAHMfZ zS}fh<)XD*GnpQip!%kbTzPA`ILCha&;Tlc_b&%5JI7zsRj! zls}Nklix^w_62Q@wVz869|WWXq6SxfM$c3hviKWL*thT|&rS;=H4J5Y@__551x3oe zDj1;;&I&;Zh2EFvT6Pn#Zu6Dq7>-UiR8;NjJMVX2`OfW3z+uL;ZIKsLcrVcxRDIpq z#$FOB^VQ^aXIrxOVa@mXkRz~i%LsgX6svnnXlCkvljaXwRF36? z*GCHyk%0U&UMKaw7o;=zAFN6)Pr89#D9a!s(+Z#X9pB1}o&z_pF8BVIiHG|cYG=;* zwRFBT@4$J@AEy%`bb-rOPg*%>YOlxGuH74VsW@Cv6>T|7p;jnOF+PNARa;0h%3Zm{ z@W*Ssgn%4aMQb35Jz6Wq)~J=vFvC2hMy4gA#MtCJ`FLeoa+$XURLlC^7a8?RuLOnF z7<<16h%T4EgcND_CUd0iLZ^se+Cf?U z#?Y|QtyFpZi<0QdOy%y|aqan*R)=m+f=e6zdhI_zP$VBeJ*<6KMBjE@g;|{F6dR0J zG+H(3(h46J5iJ@Jg`q7?Y{7L(- ztU{sdP^RD-yg@E?d1pa^qUf8*5@j zcO9iuP20Y*z~U$I3ts==-}u95_pRF7A}thDNqPAS}_P(cb(yON9*=#3yXeiLV7I*C~X> zIXJBIEN7Z~zw%3}O)O~x9bJweLG2pG^Tqe|Vz=>6wWDPj;vD;n+J32B(>vIv?WPv$ z4c`{D55W-lpxaoIt8sV!=jMA~RHL$Zj>d#vP-$FDq#|j6$)u9x1%QBG12Ogk4~AC1 z-6kq*%Fad*%*^^BjVm&TK+fq-!4!gfSqncG>!S7$eBeWfU5vVwhLEZOYJ<(wsjf&_REwRKE z2>rW+GnY(&iWpX*ADOK1b#&_}oW9vvVAtv7!yFn0+B^4&4WU^yw^EXPfF_wRK&%-5 zmiZXK_?~&2eLS=S$371bNAU&}0-EL66N-06_Ixklh;&e6f85*;sS!~d1?hstml+Q& z75m&M?U7J5wE)v3Z5mHE9Spvm$)Yx2 zdyxGiGGGS-!J+RXc~GRqO$$HaJ`D4#68b~BY_JyOYh2gdAh_~#?=}QPs_j|NWwa6& zD|syk4|7_O1Aul4V57f75A3&%leHkVIKqQU=Ey#fX%)lVtA;S%RD5y5naN%qBhcxC z5X~5@vPe!Zi&y4F_0+C@vnde~ueYt%VBq}Tw}uv1JnOWQY#9Lhc!M$1A!ZJ2->}q$HFKG0Z!sMZT&oscSD{$#8Lc!4$nRXC2 zD6kqRm@Gu*eWH<=M7=3!R8)Enex#+5apy@lZt)F7r_RUV|R@aivtt=Q)DlI zn=Ng_WrY-g>X7ah-sT6en4=qc)m;Mf_sp+ptCBYzY{z_%xSv+$UDk3{9DsC=Iz&SU z;de6zS>|cjW5Ye(1$j7pm-*?~0_=sm=Q#+VG?c{ydGaVrcd_a~6J>HU2hT-kT3e@XhG7 z{r|#8k@nB%|Bl))Y*iuP>SFk_ugHD!us{j^i^)xO^%8Xfhl#IdVEcpkP1UXQt*6g9 zWUK3@`?crn`FZ9sT2{~Y)K5SIl{|9I%<%#2<;>t5#ACfl(bZmy(Shtnxs4cX)kdG2 z`>XIs(ue1Q@=)?d%13+-&8rm0eL!u7fc92O4#W2~gsmLhyh55=dbx*aRc~oFs-fSOociFKteeT?%va~%G*>)6; zXM9UbAy>ZNNI(h-^On%KUXIDUgrt<5;QZey2Nh)%-hoCIvg5awuDz%qH~30<2MAqz z(PtgF(}iuq@Q)@Vp1&Szq>zh%0Taxg^vQ9^!nF)pJcdo6ta$$Jcl=B=hP(s5Ck*^# z1OpQMRPg}>bltM(%)1X=RS@-AeTVXs8C%`w)k{X9-+a@a2X7t7S^V-g%Ad%h*`GcA zfw!e!&af=UhpL=>naZhWy`9`LoJ@xKAvvFx^}Nu#Hwd~N^o`Ad9ty1=omPLEG?Gd- zD2ozpoPVfV?3l7}ZCeC-sy@mYE}RDNKb%Y_=l@l;>7_ybqgX4A3KxbQA;!|$Li!#$o| zkRhVIjwP_Dn2dOU?n$qT|BdHSmCBD(l_WkSPx2N)4N~2y$xoX7Oi#Rq81_0m%kCUm z^xDIQx`imnghU6ypTf3QWmRXAVQ2AVKj*F)!I=!_@rCg82sz?!Vjp-8}2LoyO~pUhIy=XaNts;DkHCDGE36T?XKMhS$CAC}jUk(c zs6Z>O40S9Mi&k1Jn;F|BOJg&hrSUSnj!`N%UUvig#9fh<7F4H+eh=$%{V9J$n#SaH zj8>_{z)(WgXrIjZ_}XK&bc+L6XE<&IewCs zPhX6Gn#W+?ZcKQf^;ty4;3$nq1<@=@X;r(%eZj)5xklDZqC$2mjLc%#o;Z;Fz~e?h zYUUgiE)Pque8)*5IO859??gnWQ}*MpKFYfY{7#c-$<)wqp_N{ABon?2uB0?ml`)Mf z6x~-ocqoCFuwW_ITLDqaky^e`$Ddnxk=v)m!Q+!IlfmVYn*kg8o5}4@3cnxTs=~LV=SW&U z4o^n3BDV0ueUd~+x7-gB-?fmS`Dg>b8BTcAf0c^$Fm1HjeH*@_kS^f zDJss%dXM1^V{0e)<*NmO^LQ|3fNff*szc^ew$oqBNB_`P95FJtv zOM)P5ZEmYmrk|>^1>1=l3;@2$$}0=iAz?BpCEgoGtz%`yrTV6D%3lW4nDo@X)P{g= z-Z{e=u2t6WggW>v?DlcLa@(>d4CdO-R-Pg<2BV+Y^yszty-lKj)V7=58z+dxIkBpN z3pxy@n?4g+(5F5{GzfLPw@=nRH;@2Y_CO>oznfZj`Z6U|bLjDz(p0P%HmOuDeIsG|}AHjUH*_7e`*3$j0`1L5_)$fxE63zaAww_Nt`&_Iji70xe*4b10aHJGNW0pS zB5(dhOJjT8#OGd1OjpVRYjN0T5ChM0pY2Q0umRBj6A+;&pa1)}rp>Z{D*mtUF{V;x zc$$@Bh=WpNKBL?wE`hN)a(^QnP`}<4Oay|Dz$ULJ{ny=B_^;Hjc2yaTt@A5uKSBd9 zjW+T!J5z+cL|bF%{fo-8`vm!>1`y_f&T7PJi}C74H1{H5r_T@N2-OEnyGw z_n(FKguIkmx9``K9^VNfvV5+X87|QB>PF=mSZS$qk+3EuFOWL0`dU7`Qf8o-GE zC8fb2HJ^Jb;D>o#L)vVUC;N3aONotlfGgunkN@}7Bok-3&>X!vWjF`_yztO<77wM} zPh!Iv)Wl5%Sxo^#*k$uh&NMcLtDKhAHq1>JBi`9B;JaC^&fIrz%Q9-~KyvY-{T8hX zRA5uHa?JRF;fi?nlkIq${#;U-s=`O4cxRaPt6;dZU8hdltS?Jbd$#||NBS-q#qlAL zF-4na=Z#CMo)yBp_22KyTzQ8z8+TK^F)1(7?N=Ip|A>em(t9UlxMcMHohWpz>`kqD z8vL?2+e>51Hs*=PS@UkPIER-e>dy44s`BcYdbZ!sPBWv#dM$)td}&&B1K>tv0&)so>UzvcI`c~8c^0S#1) zyk1GEkCr)&Br9Zin&@{Ip^$7P8DUUF92u?DqI7QjY$Xl689L^lRK+yWk<56g z0D>cOXRuF+`I(V;+crNYLPXCFXKn%3YC&$NaC>>i)Th^lf_(9>{x1vS-6l7$-gm~Y z$J>&D?$kE0WG%nSUNYMdQ(4~r0(j5=dL8&*|JUol>|O=F+x) zuR2rbd3yftyyBuqY*eE+Vi(+4hLDI$>1lJf%y8wK==; zEXObkU>aVs5L<`6Alyxhg-^PlE~z3$APu{eTe|&$Yb@;-#YUBij5L6Z&^#5&oaamd zC;W+ELr4zT0z-9L?-a>CXO)Zxi8M5$?&ms8TkecNm@Yv?qi@yk4~!`4h2;n=v_@0J zZ7qNT5N+8O2xHhzM|#QVdv!Z&5paCe&vy-JyX|yeKFu9W8oiB|c93gHcWP>-E4OQE zo)6~hSV)!qK-t?|p@S;R+}L4bskB3u?pZ7CCNJm-gNWcO@4VehiP~vaB6E+LkG9r_ z;}4RLL=>v?OYkrfVXB4{A4ziKg|q};qMvW_oCv6J(g+4v-91;NSgM-w2wR$iyXm?+XKHz>+f)4l4d?Rjt5c!jUc8Tald{ZLGDYzJA^G1P&oVzjJj>Z=xOHa7>d;c+dF>hupiG?s&d zb)Q)|8(o~>{lP0yAVbR&FMV~u$-u)YG0u~S50lj^2{Ecs7w*vVW!)(1(FBaqBI_vG++dv5B);bNH@F|7HY!%fSL=vn51VbzU@d@> z6H~mi;D>j=Iwn9Kbve@+dU~==VgOo$fJmmU@q78t7W?*db zXg}gl`PPpq2v9TVWtr@c{H1oRmWE`YAY={M;G?AznhjF=tr5F zCh`W^uy;AkPG#H$9|sb?0)tkIO-*$To;g@pXOg?q?(r$Xxg)D@f=d@!Iy$WOX^fGc z;vAfJkk}(utFLIiyai?qs@Xy2JxtP7H~UaOm4&@Peu(zDe-9jo*n5bpnizYoC<4JR zP7KrZt1M#k)SJJ@X-G@#aUyS(tUJu&7Wz36*!~z|ZG$oT(6M^s4nHrX(tUX1$z+hr zHk+Z9?v4&IW6`@v*ZnJKrua|f6UqCh zwfFhtuN}~D;e5rq;6f9?^y>lbeDEwP5#X1#>m=$g@l>DJn|8J}0z)8gl3j}VdpN2V3tdafJvQ#@^=Q^k|7Lcm?y&%MlXh%zz{$`A6Y{kwPrHmNe1JOve zlv$>b=a_6!W*&}{ur=4G|YS^*Fy5xBh`eln@^Ko;48 z1*CUvjKKaKE!+;K{~u9j9oBT;zW>okihxKXCEG_({XEb2KgO~BvEz8}{kg95dY$J*4Y9;y8OD<67JbYgXToP9wEJ%H zBm6kweHM=AG`j^{ohd+nxxr8(LrenY>AXYx^TVioUOS4HIJNNk!%A<0;{svaxtE^&sUMSj$&~c-s?bP^o$r zDv+aw+(x-Xo*ok8-Gqte|AO4^KijhhKxZ4Bvtc{;*l=VrbK%gHgq7B5r|S<=iZu)7c|!BN91C#{6ty66AKs%>-$f9PIymq1%jC+jl(8H0@7}>ijDS_R=$c zZ#~b0IrD~?X;d#cDF*GY7C5cJX1?DRBADg0jQm)0o+`ec65IJ{CZh1oIKZa4V>PI_Ni9CLvrM+Ot#N=Tp)99{62VY_1lt{ zm>v2)@B+qctI*IoOc)T*j-~Owy>WA5eE+1_w`w~&i`Q`iu%m@xXf%)2yfwXr+{n0$ zN>}OmHl4zV`aeB%ZhZ9Aqe3!_@Dh~tcopk0PT!d8n2Q3h-VmPfj)S&Iq2;5zuhXt$ z0?!{g%k8H+YV^(c#_Ovf(3#Mvxsw!jA%c?3*dzm8SSGX?`pg=f&8D4yB2TyYJSA^H zoNvE;s}fHp;;A|e&S)~WXs5ZqG&A2c!x`Z4ieO>amDiekrdAxkB7sqy!)NlA0=q<6IuB? zZ0$mKHxC+qerkV1^g-}M=@1@L6ARtq!~>YE=viTYFhac9R zkw&l~Ck!B4mv{>(3dfQn&nK9ouO#ro@#O7~F&XM6^2r@S;E=y3>3uovp-6Xote0N@CebfUF)!>&PUQ0>b0u(g+(wYLvLv@8mqvVVMIQhDU_48h z3K*13F_$ z_y2;l~N!^yn&U&Pf* z{IDOJv|9@Et$eyf9XeInEA>=qhzddUF*h!*9Bg z=o06PP+itS9ho|nrv|_ZOuyiU9&SGi|;F;BqFSmJLt;h)vbBeh9^lL@Q;GKn4N(XFEn&PqtG;_(wK}s z<8*J-MZ8;$T^g@t?&b(TpmMeIXX(fi0xtNjQ9%%7t0JQC_Ey7ilJ39+Qm^)PzSE`~ zvRZLkI@lLvc#&}iv`35a255k!bNF}MN8^`HR?GwLdXr*(%e?5F z`H{?Y*AX9g`I~td~AIer3 z^M)bzs3R@r&G7g-n9!^!JhSpC0XG0|W4ya_9gTr2bCw}>! zbD+6YU*G-CGLns4-{5wXXF`6VxmtO{?WK1t1mx>xxV|6i{r3SNr%aanFZ3TLJG?xy zcJ;<%t**6gFo)(6 zCga^?2tG|_9v=y_vCn&i*&9r;e)%Z`I(_(A!x1<5rL0J*U69F;fo@9h2c88kMPiJi z7{z`H0C69TjOhd+k5P1(sur`|OUvdr)@!OBw=h?Slt78;9b1%6myY~_pfoGpMrC?g zY`Y0+M8-QN-*v{IcLhP?h|x8O2_VHZeIO<=*snV)!;$?Y7n1@eV#6+a|`AwF>(N zWb;U2ZVrheAs-tAs^!4liQtu!nInu8`kbwmM$lKqHGPs~QLNRhqG?c@!yc{$gbtdc zN#h!h>Di{Y281UTrEc%ke?-~sS<|qExyWBCY(2_(BZ>S|f^EYNuZQLS^l?5I`|{31 z$N3G%P9046xb>ajh{wa@tkY>aukpn^_9T*@!?zmO(69j z7O^qW2aYn$k>W`$)6B*%^`O+QDQo&i zW2_4JbN9n7)`blDe|={n{h6>R;`Ez$JAL-vc=eX)?bO{})SLg3`Cr;)q_65rqc?>;jLGsbe2@+P?>-D}mO8`W%a^u7P-{u`S68|NMLM)yA?+K?vAU0G{^u&NvTekD0o55}-K>=aDW z&g&6OLK*Wm6HnMQogTnZBJqlZ+?vQb^t60+ARyPYb`)g?mPk=M`&Up;@f$e-faq+=|KV6{H zganAk2W9NSX2kZ;SSGc?+)PBRzlF+kz8<1o&kp%%p=sFm7s}+8BJVOaI@OLzf6PZv zCnfT1Bz(4^c?WRZ{S{1Zi8&MZb3Q*(;hDuRT$Zjv@7)x7t{6rqJ6?x5*(!~GYThhN z$>8g8RG9>--3Uls*ho)|e|Mm#>S=BpK8&?EZKy2&sM-EgVpe%$`+GesO>D%63AQ}x4iVzFjnPWpr`%Zg~?p$zv6E|3}m6Y3if@Y z$tjF9D`~(T2lbckMQ0_KHzzuqZcDXffgOyC`mNxL)snm1oU&e#W5I<{A}51wDu zuj$ZRNW1%sHe;`U`E*&!us$wve{6gkmMSnrSDyd$E@grA{%Pf55YvJUrPy0}*xs?~ zI;k3Qr@3{c31HTkUbmUfPq~-4(1i{0lfDMxeNg00Z znLhERonXWd5Nh^#&2e#a^5I8)jxhsMwl_w0{N}NSo^-&Nv@q9n!FA5QYUi!a{}f1n zbkZ$Z&Vuz{k{s-0*;@Sc_5T$zhW~eYk5=74CDJ=F&1JRzolcumB%u>pxB9O8Y|YUa z)tVADk6J{ngv`&5qYgIFmzoz+*-au|KVP@Gc;p}6Na3Rc9w*0 zVjd2`U!F$paoVvUr{GzWU4{iA^BvrG!Ij&Rr)p@crykq`3{?W#F0cnqFbXH?7Y_lt zVW|)89y>SUce&v%zVBd;1_Vc@b{9_)FA(L8=We7nYUTS4J%S*(h8ox&>jblxBlp%1bh@7ylX%|FKAZ1Yv|Av;*1Z81pLsnsy;Iyy7wM3UP5HfhU_4 zLhXZ*BkU&NPey{qD80Yvz?m$2nWnC#OSKYVy1-k5LHr?fv55ns6WcXhyBiLpc|hmg z>I^?zdTYE!GG4v-^JYT%Qr2;`I)}K z4k}Z8^8Q$2;CAk|u@jw}C2k*NpS`~A{Go51J-v_eZ@icsmssVU7$j%o6qjUU77 z*Athc!+Tqs*=w&=u6*vtPYLc1m>uW<$czC@mx)ozzm4~LtKt2N1Jucq?XUm;Yx&cv zo)JgD|2f3}e!IWnS5-AWcD+c9>qMhGI8%I1Zldphosr%Dx?=7j&sM9Va`hWp@h&#- ziOghirE;grX8Hc7U3YCo+RNb69WtuvxE=))A?_=4qayTtq@vYJbj$|(BgH1FNnDX~ zC{?b}qf;2(`Al0|B7q89K`B7Hl%dSbZ44#6&AX+; zq43k{L``*?v;rSzXi6`dCsX{pYrpo!yUC@o@6b%AUwgG?;3=?bU9>V4Z3^ml?pM;g zSfWZ-4~J@gQ*$56te5*>xtgS~QZ0j*&TBfZ<=)M}pLmoD;PW-| zDK72wBIgiw)#BGnv1)I4E4Smbf2TnWn)Js}sIHHfpc3*bk@_SLfxL%Cc{~KgLe1hH z`cuhBDY}c)zL^`_Y;Nv`Rsh#ow><}hE>-(O8rr!1F7+ISD5V?s8Le*i{d_U()_5h{ zZtXapQpBjJT$EDTP~_m!A|r5(TNx?IhqsR!FwHUl;BP(C>qh$c;%<%?3 zqr-RDU2z*|cuV$uvO?Q$0OhozqSr^~+CH75t#H4GkIbi0fy|Xh4mLU0|2oO@O)g9Q zF%$%Bkbcw;S+xqOmAr0MUZc;dG^|E=C0st=JM~2zP2b%(8#>G6mj;BykO+~maQ85$ zrzyXoNHvXi2&0u_jN*K?Y0B^9ZTh}Ou#8ih!PF?mh_J+psgQmzknt;)41uO~To9Xd zO}dcXP;GhNl;o8J^H?_(j#Ad6kZ2)L*31K;)Tyr~Zz%>dE|$Lje=0z2XHO-2r@J?+ z&0ykgJ1hG(SNB3|^61QaCwp)9!u#NUw~`s(=e(Q1+ijxb|J%@0&bLyGf9h5nE$TA+ zS^T|m@jV%i|MH(=y^;Gr+@$jmC~MY4zE4sPnJ@I7*%(vb@bjNbS zQ1@A)K1Z(ut2jnJk#BtMF~u@C5*}IiBj^NF(FlFJ1aYchmaPZQJK!2THb7ecJLKbKdupOt}DKtMl~4K5Jdk#PYav}I=|Y;U;ql#e zPm-4aYEFQxU{+Ji2T=dpGE@g^S?ZX*hJS?xdimkVzB&j+G1U@ozi34^U@10y9>psH z9pBp8y<+zm*Xfrl*IUz@yr`N7oYHA~};*Q4IkxNg?;q=kaQ zS9-bBL$gySpG|fbLYwk8?{pR>ax%E*`}QxF4AMnPYX$oJw@@y^1X$7QHsDnyX0u4Q zB~Mv~#l(+*-*UZ7?^Aoe&*nz(v>>Q*-@SdW9Ieb0%CU|ZBQ65ynQqI`n(PzOzQos) zE#HVsbh}X`qx?hH;enYl#mA+%sR?Ty3Fn2B%wiCk3*@w$@Gn>*=*Stz!|EO;bNh;|(?(@xlN72$&WASN}9} zVU&BvG!0NVd5+&X?FYO#?5Z4q@y+X-1m8P?yML!p_!?bkv5`xWyWeNgyN8$K9#rmv zBmcIzx%5_DNo?y^Q|j5mLpg0n+0pUP-50$fN3Yc_zyK9kh(wzmfskT^DwE(rDc0p~+Kcy%BA8C0YPn}2mketbM*co^BrxAbn9 ztxJamyF8L~Nul-KeWbgkbXw!9S@}_ge0>7YY|I++@i_?qEE+h<;<7yiU_u$3$ft+^<N|=EZ`H320vd| z((Bz$>4(48`5O3T>5?S(h3k?8m>6ycoh~w>tY8Gk1SO>#+1-DZKrLM*p@;F;8!OWe zit2H*M}W%`V4$nmy``O?pHSIe*CWJ|Z)n26dyKh+9t#TfH$JxA(&xMrMu4gXfSo}1 z?Q176qiXfVekkLPoS&h}^)s*97u+8Z>hEb%UgWzdx=4c_7mAe^oL3H!*o^OVVK7Xg zB)*P!vUTn>U`24O)Ir*Zmmg|zY==$+@%0C7&7TzL%2MgbmzLAg&a6KyetV3s9mtg1 z2&farUX`;ZBJWB|GanQRPUp5EfWY9e8PiMDG*%YEKXj$D!H4xnn5#| z=qctFD-Nh^7w*6Ot-7y`2_jh}2y|0(^yuaFJNX3y==nLWwPxIo86LFW-NOJi{x$*k z{WP9JGPQSyiK--WoWUilcYg&tg#iCLN4pEPygqAeJ3bHeyTs(pWA|em zSgm(By{dTur#*X<#*zU7+m8LpXb#mJ?{+VAO4LP)NHsb6D$~TO3WwwEFv`V+Yx__t zYx>7&tHac4CfPRRt%vyNRK16Ha$X3@_89H^RAMiX$X`>Z?U!wNsAAEoM_aD^q?o5( zIZcn-@67mBIdXpTkVp)KW|a3*1N^gmwY7*RQ^p6Gy_#$?vMIvg@@so+fO`%u1^cLTUjYCy+|p zr{kGWacJkzqOiaHHiUna3{OPfCxytW6MShve<>ez7kz4=;M+f){?;CI`K+} zGiwvFl349BBGejh?(|A_YpHqV@*(V|C26$I*2iN4*|M26I>KMCVaZzmEv?5Q4&()n zhtHZIKCdMj^BhHar~mM~MPx3WTDD}Dc=D>+Z!MKlFQBU9;D}GqS}us?W!l;^$NV_B zj=%0TQ#`2tO0y=O{?LASwXO6OqoOO^5Y%Z@aPA^T<6>5yTJ89Y0}YQk@GXpoG;B?u zo_$&HH*#aek&ilEW;sBOX2e+ksFa1uE0*z(Cwb40*ymJ;v>+zI8p$j3%+<5^jz4!; z;lO(Vmh&fzIm|8m;@^(zN&l+6!wQ03G%(GdH+n(7Oqfd`H&F_P751^J(4fl7g*eCx zC_^M@*<+-UC?w|M0`NWjh{(zJ?8#|$cuvSFA$cTb;JOjW`6%h>&$+jNnT*B1G-84D zRDw?&@I?WhET6;H6}poKxRtAOe|*|xs;Tg59ZB_}c6qI{`pJ`g@6dEbELxYpy_}he z(1`jfx0u{}p9z0{4bV=jD)`5>KyQtFcg2Z59ILnam(#w*pWcwuMxVie*2@oQ-8YRT zOysKVZP!`%?td{H*ttTESlbly%Dq;=)qyIye>CN)0yD`P&GORI#sBrM=<~^am}2^0 z5p#%~%V#(A!~G5O-v@!5J^YhvSEKh2*3Ynx2OYnT`t)IL{AF$mA;aNW5p!2mOk0H7 zYYWxpY?j~EJ(SYn4-X<^KVl{poW6U92@F+d4@=#tB6;`ZhU8zYHsE}!(m8_MiOM!T z`bq7aKQ-xPDF1d7q8$bph<)}#3j$7h;bywnSKVxMvZ7XV zmXt{*f=r`(fjFO>FO$8MbVZpJAs*%{&>`e&PLK@TJ#iYN->2HbspDT<;>)swgBK7mRO(0fKL5Q@JjZV#DKhb5yf;jVj{;Oe(VLj5@@GB%qwEUS!&ZcgR zs`l~|`%vlA_ksp$<}?Te;V)5gU*0KHGcE$FH_-(cY~Y=Y3Jfj@o=zCnJIuY0E}#bm zi7tB`&U}6(r(KB#vnK~?8`c0KA?De>DOtMP(D|ABUw{fFLGQk~P z+UJG^539A+M{`!{m=3F#yVlQtFmeWDobt5lYNItI@=3VtrBC{$bu)iRwiBBa{x#Md z1?0L4ar(Zvc7QUDFUy83@us{|Sa*#$|BK(J4h1K&08_YhWz>%b%*>KkCDOrm+If$7 zGItRv$!NmGeh1p=CA&{e9s5`_Y0xAgQR$?4uxX(tQ?>STG)oM!$>GdVUYD`-RCI*CYs)SV z^bFy|XiTR7j6nM0^-WmFbdZx3+k5UH_V-eiBPLd4bkfza>J{p^6&bt1VNWurhrOcB z(5w0!hnss!ed-*MCP!ZTqV1<`uKs@~xL;cboQH^uGM@d+*>6Xo4_BpWk8?G&{wPT`wd~N>zBxd+eeihl}WZZx3>Oz~7tgWYw*nfZaS6@;DGB}Be z`So|+E_e3hHuqY>j+<^+242Ai*A;)xVu$u5O$i?v|Ca@L9~}rLpsgy2 z#cp<0!kUj)NWFVG(ZKeU5A}A-X&mzp8Bc5j`Dh8QP>x3}fGWmlmNFU1@15HG1O_;G zpTAJ3F$#`p$*#Litc;{Zx-mjX>2cj^+zMGSfUc6n;5%y+TepsdH?JOOO*9)YCJ^&B zrM-iTMQ=vGIAiTNzD#9w*Pc7qA~K^`0_@%a0A<+Iswxz`s&D^*X=bnpUGC})9@W6e zAdk(duSe2X>~kdqFdQ*12<$mz-i@SMm9$K3Xn<{kUUS=Ed7gIIhRAp&WXizdg2v-X za3c7~$-QZ_e4UL9#{88nYrxP|;(iAMQ*f+g|f`1=r{?<*_g_eYw?H zz#;Jc*DO0rMMG4o1m4sO*IC1}mQmVu4aUK(1cREOBvgrzwcWhwYTXF?rHm1x*@9o^rk4wa0^UsRrN;$rkQYiUS~KC4TuI~;Xx@*>Z16p7&$ zr5i2poX#wT&Syy2^0DKx=E9KtUICjS6C*bxx05MBOQMt4?*i1hK1{yFALp+V3xK&Z z)2VCDSp7`kTq}=(Ve!@TTyWX2@cY7rMi7AKLNd)W=9sFV!h%1xtK2K~y%V2Msi>T0b2mG7m^X0~RxybXl@;R|A9hs)KsN_ar64y*VWBNY@U&F9 zi<%H%4fs=h1Fe&aie^y)7!*Xz(dLc_{N6eUg65?^A@rfFfn|)(Ns^ZVa(LeM`C8Zh zXsQOh=Ui9Ke*D!W4V<4l-ih)So^8Pp&}7^`;{_m=w6;(*5#5K=)*Yx>Y@eKE~(>e zqrp&V;$$|^B_C4E%D1IV-T0Y(xA*({OnBPI^=B3E?wFV5FtM1*&-X7XtSILu{cI%2zmREiYI1R<#UHN8FMI#U5xK>_64sn39yFZuGGZsKu zy%4FP6h$pPMWCWk#Tz`>d}H{h%1Sh#+;Pc%LGHl9Un>w3H7T4d&9`5v*P1fNbjt;B zz5Ds;ZY*IXD#1%fv}AL-a%^HJ1U`1=&Q}4+%pq{L^e-ADLb_%I&DBOe99Ec_gA}F} zQ`7`j$HrF@e(!nqkx8c@JaGPgbanZ+o&$r|+C5>mCIYdaTsi$DJjTnUx5he8e;?oV z!LP6?*Ba`)RZoNN*2`?)U2)9()rUT2o{K{u^&)W{s#2D&~c{fD*w_Gih4 zD|tYLOc&9)%5!X;74}X zpFc=0D@F&I0~k(Nsk_jN_10%k0~wmaU3&n5B>~UY#n!ipdl0&3UnVKnz5Nsaq5uZ> z=(E&2-)rmQSvGHf>6>lWr!8z9Vw9cT*7=k?uT6x5j@Zq{DBvn4T!9soX;n{1#OuGs zS6O3Ud*M{&i<-(m_a$t4Bp>aZ)wPM>rJ$7Hw!r)Tc!&t@JUI!yLrwR=-h&L(f!^PMMRs!c*rr|90%h(ag2W6c4<;@yj+$AW0HT<7b z>ARj~N!dTCT}Wvnp|3CcX)fdQ+!a2+)nNJKjb*2@HDpP~L8(Q~H7IqXOMpYt&Hnc} z28s@!y$3Ya6#(f0c{sF~*YMMJph;8*k+GX5d6LmyDcqz2iyv6lODyx}Ax1WmCXnD( zh*<0>gJYn(v*D|QZLb)ygCL}te`-s=+iqK7o!pA`%5UtP%AL%jMiF+3RhT5oy{#R- z!hB|xTd3%{T-HCUkHCix{LRbGD0?~nd--v!V+fMT_wZ~vCf@&r%?j2cTpol&&~1<0 zp77+zfDBk{|t74U^ePkN} z(FPP!_2_`pI2t_lYZ}Wj-#y! z5wFwfq<}r^w0;zk;+IXKx zFMi%6##{{W-$OnGfMO0i?Ym9cL<}S6>ElP!buu|l)s&0|VF6U{<#KK>-t4a21Dw~d z9v@!{9nY&qOuWH%YQN*1J&X98{Dh)uCM}g{J@RX+)t~YKy(FP0HhQZc7dBeaJ9tCAQY z=$kB@U2QxR8s1yv>c9_}z)noBA;p~Ts9VMFX3TJQ&v5m|l-)B^a2CEJ%r7VdpQX$c z92*7c`t;DYsRZc)(d#9&EIBD~_93ypAsWe$D94AQkk|@~{4Rp+FP$6a@)-5{HW+|v zefXY=ALRE@u?0d=e<1Jot|{Uq$A&f|?+-$dZ#$Pd_MutOkeRir7$37syIy3=2qvMiar-Vw_8&;U3$C@`!k#C^>MAm zw5&2^#$D>iE$INg$Z?@$`oTHiC>Ru5%rS0?T3uSS`Nd*G+Olib+8?_mUaNfyMK`Z9 zH#mSm6kjuRh+l@ck4}~|<1{!7!u@d;{TfwMj@72p--rp>tOOmefTn^q%3wMfsDheh zBY&pHR-{+0Z+NCA6zMrr`TPYdWwdf(FgQ$uM3cwBO=L0O2&QgKaJo32k#PA@@%TF| zhvKmfY`a_B!f@N7140cBe*jGMXqWIOYX7f;G<6Zt*tH^CyD`F?bcpqEu_`#p8Yhx~PZ1L-L92ge($y7YM z=fBrD%pwr^&n-@SQlQA40C_JWYpn7smufWqtS|B#;f9ZOikJ3jcpFyD6hsf;J|Nt zNbz0jll?s2_S{}*VtO|B6F)-Cf*&jl|F;|0# zZg{EUS+SUYUs-Tsdxb5E%|JzlIdX9RAwXs89%5s1=F)` zr6e|rleEHraaSe!*$Qi!O2g>jY5og@QLQyF_XKeU`1VvY&jBV{)H#awG66pA#K4RT z^`aj=hE-n@+TbmLRq#OM#YxJ>p0!sMreK@~ofRslJb`Ar3P!}$+bN(dYzajeXC!;= z{OIaJMa+7s*Q|K>^%#l3fovYW0_+R*5f*S7{|d=YsX>z;lM<-0cm>I5DwH@hM@|h) zfB!M+XQostbANdZH@f#$qiJAA6_&-X#qvY!7yMafJep;0YnR>I#itak214t`nHJUt z%=N3UY8L#z7OvJ*Jw;dde5}RFmqAnrf#mCL^0YV+t6E)8; zZ)_nf(U44;CL&e>>Jo*g-bv5C8flkArUmMo^P#Zy^TeW@KRBlWxTcUmRh?7bR|h~JbL?=ip_u-+u*C@qaf~7 z%y+<^#~7PfJ!1|VNSd5WY14%~6xZoEBO^43;mC;%#)U}EpjbSoEl*#{Cg8*o9lVe; z%4Iz=zk1VPHb!iH7f81hTo3NN4fY@Lvx0AHtycO)yQ4HyTp0I?Tc|08 z182sP+O=N2I3hFUGTidzZiFd4gGhuEw17eeuGUcN4Tz+a|! z>b=g3^IS~9a_+F6uHx`M{8+0}vsp4chEy)A9D3S`6Z@;pR(AHaH^oanw6kVxTbEid z(tUOu#%o_aEwOm#kTq^oj#od51FG0lUq(*U)Lb)8(MZR3S;Gss6s0VBkyq@HqEVGb z8{P|t8Dlg9oO~L60apBpuKeBjrRKwzo-)Mg^4(HfiN@PSPg+(2DAW!5 zr<2j$0TCS%0vf zx0!?qj?D~DuVBi32onwyt}NdNWV=Dz(~F78rnI#f<^LW^GfZ3H=$t!5=J0lTXN!96 zECMQb1_hl_kGuBK)2fF=U004*H_m$i9W6J#UL0${e=f~m!~ZP{993cgy1r+&e`)M- zt2zU&WWC9|tOYxBEAB5N{ZB!FoX$^8cgarZ$G2tJRf1=UdqocnE^#}&ekplO-b$4K z^oJL_5W`g9Cj52pp8&P?ecT6K{JtrBXuv#P75-l?b|+G_R&PiDaf8qe4S`X*I6T&2 zMU)K;syH)2eYdYPMSb5*et0+-2Cd+35MC?1oyP_Vp_ap;(#*%A8Dv*IwgzM$Kh*Ij z&!T#Cs;W>+hb=ruUExrz1~8$^;G&~QZiScLMO!2(2;5~OkR6zv%-npCYk2rY{C&gB z!=2bezmikub`g%5Kxp$s`biU(#R1`vS#PWgxb2-aT7_|CJh^Yt{;ZkU<>%{qBm2Dh z;74VJE-(aUq^eM1)Y*x?X&G~;{j(%*)Tn*E0&aa&z(ffA1R|9H8Vs?Y89?pF#w#7` z4o1$Ljr}NJT3y_U_YKbVNhbRr3y+#pIkTF(g^lZ`eAY4n=rj`2b5)r&r(o- zRKns>onR2>1wJ(Ed8F|Q+!eBG0^HTbf^L-F@R*6|D)4%Pmz)KEOOw2*OVJQYt!;Nj zwjO^AL6YGbRk;$&Ss9DG0pH~2qO;Faa}n=2t31A7_IjJmqgIg7T9=TEq zoMX1RXU){Q3oq3q#k^SB6eR_E1}rEPb6Y908Q`Qd{461k3H} z7}ks2T{vt?`DIYaUw1rVt;-G^&!T&qPFfOAYFR*#*)Te{i@=@8`pIvD7b{dt!+34= zo(wn-C2jZDLe>2~!|ZctdlZgPMyCr!X55JI7p>?(9BCQ`VywJwthX zF}j3+bpPht!W4Wy`^pJc2pr)TwDH~sk4}P{*3xdT^0v69P|}_#b_y?QINQnG!1fmG)znItUp&4nKZo#8m!onRa;nSDm#jl{%pFp1zjtz;?i()-U-I)h|N*y5k!@@{(zhBZGc68Z+y6QMnfd9s)&l?D46*WM|Av!Q94Sa(<0 zplf;*WQ(+w$4E*W-oiXySo2*;Ho=EdO%7e!QnqI6gigwuLsipIl2ENq+jayq6CC?T z#EeZBG7^g^6k6O%BB!~x^fu1i0{jYO0mgwlH^T@(2j9yLIsEWI#7)RDiY7$9eWorB zTu0?sehd-ZiZdMaHdG{D`*^|X`AkzMPPOxUhH9_Hj#8d48YPw+c$1TL56E?|-ShcI zcSq~0tA2Ua@?iE`3n6P@Vq`kyTjh+SYR{%mi&cEuN^3?9Xd=VM&n6aA*vc$XR6h|z z47gAh_-ql)jLL9YBfKP6VawiepU-z(U)QHBuNRYo8*m{Briptz0CzjN-g@$KFR zMz(|ATD9i#+jbBGgU|!NW%36eL#BW^vMb4WPGnuJZm;TVWsBvYs3Zn`bjFcti9B8s z-3olb1N7P*8Px}8%cY*f@(Ww72t-!ye9DDUzRK=_3uKL1RQp4&-c~9y&o$}`hDf{v zWvFlUi`lWiR6)jBi6D+-t`laBL=frIbUGDTEu?lxDb;}b)H7%8)sRAcfzS~Zuzi&( zn7mF$cpxNl=9tSr1@eYK-{mH#DbEzf6ke=#ST#=UFX6c zz*;AIA=%yF`t{esh^&D=TKP)T-O)yRo>D8e9bNRVw z$&eVDK?_XKV71*~+Pw`rIBPsKLdJzp0aCb;B?;!m~cq{Lv*QC)|D`APi|2Xwc5*4!}Hpes^L-L zC9CYJGBnq4Q!l&RvzWKvzxp5$U!{gEMAXqyo@Zg&rg6zZ6#GxYHf`99e z-t491Hr`YH9Dh+QdYB$bLhbl<#PXQiE6KS5L&HV=8>Z6v^DBk9T-dwNz>^X~?;PN$ zV_IIG*1AIj7D+S-j*QLQ@HRQ$T?mww8bu3LD#g@QR(@1baVwK|$5#{}%oUa(z zMQpt(BY2NAj0uEn|z_8oo1L_$DHYMwF zV=cC%@8iviXba@Ts>;Xe5r5L;OlMfqAXRJC1q+38pD6{F$zknz*YJPygqd(pIgJV0 z84wlO|G->h6hx-x%~-eh;@v`DGNu=} zPNi9B0oD_PyxblNuJrzRl2ds3INDGu5mieLLKWL#4qe<=)3%9eCJ3~kY~+n$Ddn;T zCqv80My1mnXFc;jB-JSGQu#XY&; z1%Uy2w;%05lmF-son*yp(}r^!XpS?1>#AAqG;m+ppNWX6?FR8Hs+|66SMUtrRO@t2b`#N6#xgNG`9s z81zWf@By5NV+_H8wOY3AMlo1&EuL;u3SS045J1~CciTf}u%Q{=?RxN~Uq4sDV^N!F zTAgw=zpr>Cz`xqkJK2`(wJMCK_bWn>KTBdi%j$N@My_EaZq>8A(&Y2_ScQUv_N70b zZsip^x=?c&6|)3J@ZWkAKZ*?Sz)la=2CyKg>-MiKmB|@`_4A&-`h%~F_2?mPK9O0q z+Ee9xU1{kEQO=LR^;9ms2eFb4VU<#3Tx1Hd?Ah&+=6@HKUJ)kpSI^l~^+DO=@$s{4?>`ps(75IRG3^DuxMTgNw){2>;1_QofY zuKzq-@BSy;cyRJNkupQpudu`~H+d>19T$d?vlBoXf zQ#CRB=@MaQ`6sRW@DU4l>H_zdNh%G(kZx9C)X555Fp68fr=pPy*noH5XCB^FgOWIwqe%p$FCU@NJX#DWve?+`eGw4_ut| zz#rdn8ce{2(QvVtt7uH~?C8+dREX--U$A2c_^{9-8S1XZEm)1ou=3 zba`6IF zZ%L+rFqi}1Qf+Q>x2}@hbSU(|@-w)C9Js9Z0ugl)KzU9BC^&sLvgAsh(ErUWChhYO zenHD@ZSWh|SAG*7W-Dn-cTRc@tZ~E%ZU;SILgGND`>vM}O_z@=jM*?j4lXuIMHBUf zzmJBz!mmv@pr7l-s>I=twa260WR|4QK+I%7a_nWQ8>S|X#x;C&`+``tS=8l6?K;m4 z^<7LJj{prS%{HrrC&27}v0ex^+w`mcx`3{oafk?l!AH-wPTNF}@{h{L2OQIWERv0gC7!dNqwT*NPV0t5%~~NPV9vE^XKvN1T|;=IU_ul_2+g;?bz5DMO}WFxXjv& zqdc2UPg|Qj|4Fj~8P!v;5^-fM8Mw4ncw8J?mrzLD)P0|E)>bD7Cra~a33iFp;dgAE zNwN~W8e!FvVL)Yl=50(9H`HnQzbt@b2a?9|heaTo@d!PEU3uhJV*HcP1P^m}{@>8Z z@P8`$5fF$5T?BGx-^KrtSYN8xxY|Ab+Ht+A%txV#TcwNVWT^2VM{Hpa-{7mN^c?tx zn?4k+gf-wE$Q^<0svKBRI9)}D1;ID?G-C4gtw8K^#%~TQZ9S|XGphHrO}J@dn>PP; z3P9{XrVw7ysi&~IwfAjR@O9}hF18SW=;PHF7c6aTR&u_9O^Nw4BcfgnJiv_BT$Fl0 zXAn&MbTeD5&-@}ZkfA~!5vJN&lLUETw1|wrtXJ&Z;qh#m2xEV*l&jB*PRXKzQ#9xd zChtsJ*UD>w>4(l|PoWB5c@a$n<;Uea)mh;JYZf2(eS&pzlRl=-yt$qReXb@2xuiGJ zi_K?__BS5{B6GhCXbTR^JPG?))^tH1yU$hbRs!v38a*-!eib6kfCcS-U6AOkj|($~ z$aVE_hv=vwJudoFx9M!Vvl=GF-#QfQjh~&{G3~ItILgmm0CzG*D3qzREh7uvlW-;p&%n>9^`x%G2u%A&eCH|kJaD*N~{N@U}S4NT5eOklCTOs^WXV~6tc`t!H&erwjq5Aj=? z`j@Vzf(f9Is{`dWSc)#(1kH4MQaUOND)TDIA_~Wh&GWwkxP))0rsX^Yw zGF&ho^Ey&^V7UUJ5d|Y0sq{l5UMG$zpE6PxnXjfqOskN~8D)@H`E%Tttb}_`b0)6DNE?;9@H2}1!8$rYDA@4-&AYt_Tj!op7B`O1RS#L z+0fQ>dT0e43H{*`L|+8R6D;`sQSX0>w!P(>D~Oif`sX_?@$Yy1@n^pv0lD-0zuYf{ zT}Z|^8`+n=IoB9|hL3o7MI|5~zB%>Jr_gxd(Driw{*$3s)7<(71NWl5L0? zG+qWM_5_eo{B?>c2G%}h;O)vWL>>1CxbSdkJ}0jZ944)z*CW+_&(#V!n{hyx`qVU3 zU4B#?GNfE?2;y)U*6aQ)TmvESI}1gc4r75~N%%v&2H$H~XRdw2p&@hEalM{tx>fQV zB~rZHJRD*u%Ixlt80Yy)Kmw5XHsoL=tm#ELRXm{AZ66<%pGZFPwV6tn++}-ReYM)) zqgjNw2CXaXcPhX#HqL0S-V5DHIh0CLh_mUEvJm{_%BBBl1H%5(dqYYzpcE?j`dV%%0b$2BOGnRyV_Gf}ac z4BBM=^tmh%m4l<$jlFs&Z#xHd7z?vr`MAudomMs~he?lzgI+%5Vml>wVUELDS3XCq zFh^M~1|LuV>cX7~+P$nJej1ocBGyqyx)Pq@6OVxRrgLEZoXS$@$|fUM&cYAieX(kq z9`6^2O%|VIsGhO3MHmm2y51wJz@F>XalDp%V_h=)ZHCEUSW<0;{ejj+{4gmSaje6Y5< z`~7XCv5nHBfi{roJ>|LwqZJyluMV%T+m#at0D8?A8L4Z=0q&!g*8k9lBX@{U|HYL7 zd{TsF@)sL=7a%k(i5VcP+%-erb1Ax~gd;c8YgUshWU^=ynTpi1CGE{2d}Dt4w0R3B z)=L2BEZW@MgxPoRR=fTQ3B)tza+Bmz-WP@t8c~7_LMd)Sn3o3iD)Ydv)OmjCOtnfa z3qHN+W$(cOT&OvI*K-b4mP%hL3KXS==>>OAb}vNGd>tp3u!6rljw3aVc`S*rzj5hP zgK(6Pog$_Plf6rB={b$dWi%*Xvvp+oxXu`ha};HhZCH8%24Ve;^&fX&9=UPYswLk#^xlnHX-WbK$sQxasqa{cjrm**!#JE`7-1HFZ>t(@2F+uN|=bmuAt zWU9)2OnQLe-VLp9!g~dBv_sfoQvBIdKQ;^j+haB!m}BO<6ZMjFH!jCB+asLjsJ8VV z`WA4$!DIg=1X)<=BuMWW5j+MBDGa|pd406?N!!-Fak}ZqRt#ecSD88cV4+y_?o<`(d)o!xocv z-h(0P4!f_f=O4Fb>bhedC82n>Bs?{&6ZHKYWdgwV=iZ2wti0(Aa2 z1l6dTzfafiS8rYt;>Mdo<)`n31&DSO?m0zvbrH$G#RH9jo$C@mH9WXFI|9#%i>0tm zF`J?5rt(GT$w&>O-(I z91Gt$X5h~%al}w^YdQDQwsd3jY44o8UdSHRC8WFmc#M2Ot#nx@l-e{E)+OhldHa+D zCMdU7(}1mg{;2v#y&k|hwb;iDr2lTFGIhkXZd;m4ymt#j6X&MTddE0DCqT@$a#WKAJ0*qO|};|LJP7@v(|LO)*%1}AX*qIFvaotFe3)! zOmF$b-;Xevl^Gwx?YDmV)w$EjifNYMC#pM@PQ=tyW2aq?=w@Tz3$oY2d85S7_2Q7S zB(1n|irYY_jP@5Ca%M~ zLcOotA&QegIDxbo{2cTt4m|sukkG2A=(L)CSTlKvNg?u2sM(FzyU+;V!QbgTVqJWmO>m#OyK9m9pdijl1r(kXtrPI^A9JGF}e zaXXnAFX(nLWwR)@wUVG&tJWVb-`YTJ%3usdV<(xgp~&}wMXrLHQ>{<7UUPgN3?DoH z_T@M8^~!PbS>PDh9To0Xd##y0csNqwyLTM&=4gSeatN6tcQt-FjH(||`O0^huQ zg<6Xu0psh7UUTnpwKB>$9)FNB1g0HL{(UkRy4Wcf`lh`C`#OD>s$Dt|amSkpKTPYw zB6}9r7&!KIVm4D*7@QNXjwLP}P6b8TT`6E@6p$cxP@(Gq4BR&LSZ3$GcZE-TL4n#; zMW;Bn<7wb`o|NJTOfYutuOaRux6ZG~cm$ryLnj+Y>SFlWFWuTXFso}Sdx${n zvB;qd20AiN-PkA;z=k??s7}Fqn)df%+ZU3DDMH0(?7po7IW+%*shy+|`ymc0vE2~t zOR81v6n^mJ?XTxx=pvcViBZC-u6dDLOqGzeh4o~b=;YptHt0C7Tui7XfiYWUBA?{dW$rSZq5 zr0e6viF(0z_S*|70Xe3khoWe-a{Ss!Y_VN63`JhUni&AJCNx;`~R*F(?h5#`cQxxRG+JVp^6 zm}ix)q+CIs7Gla(2-XU!P-e{l8FAiK;A=PN1mQq>Dhxjd?WC6}f*%Q1lOq=`fr2#1 zogL}aOyxM99jGo6-SGkrtJnuSats5@abPEP>`V=l!h46+!IIQo?3^pC7pnzaPa;6h zN#^vYP;zxiJCH=x3Z7=vGz2f5#{zTlW}@bln(3vcWS{Xkzqr|oU?40QJ3~JHG4oqb zhez|OtUk3HOXCCUz^qbiofA|r-&J;F1NI?dy6#*t7gC-&pFXOx=4Y!hM9J5nC=g%b zf)u;wSRx|%<@;zG<#~exEvo9l?zeu0eMv8-6n~Ug9C7c2@zJp7hiV(P3Uf_aD$=BP zygQFrQ8TIb@(`GPhTp7H<4HbI(*PcYvdej)&Cn=r;eriE)yj=~}s9L=m z-^aS!ns9$TaPFMLupN;FV(*;2tkv3J%Mx)mx7K$u z)Tb7KB%l}Fru@s zrq|D1AxJLzT~7b@b|D36cUXGmO5pXDaF`Ehc~gB7eviXh=Snem9MqaLO(` z!ZhD1xvvbJB^ihX8CBnmJgYy;4wcpVmKdj7`8~8s>-S35+&Nt8DcT$VK-4zy#Bkw2 z9$+R{^Sk_URo&A6h<~<8|A>F`$-gjYrg5r^H7QpLGs`*IbzWx+y7?fZCFzhoEtE>r zlO;6~Z^(qp2}2qoEC$1L?KEEx{KcDVU&SW44~AoGjU;X~g= zKMa_bUe~^_|F!o#ter1vEot6^KET^_<2sDw`=jk3EPz%U9PX6To~V#-Kv zJfHPcfKOW3FpEk$ZaHH5!o6nyIz*8fvKV`@jE+zRWJNtu8~x7qZVjQin-0p#j=n1j#msUqHu9T`-eY68Jdw$B1BozZUB!#duw zeK|EEM1C35*Z3(7ZgBDxa@-Ta*qdt&8CE@b3~?U3#Wq#t-dSOmGo)^I?2KwdN@V$z z*LQ?gn08EJ1RH77eT_)&-D9jQR|DVCN5ohds4i7--zH}yC{-fqvrr*c&L-42Dd&u0 z3MBeW+j-sn{*1p8O@@O||b1 zjG*FsI|H4xW_Fd5AQoh7D|HE%YKxwe>rB8)Ibw$Og1zi`0P;VyscpCP*W zFX@x>+=9jBYS=k|Dzmegr1|&eugssvq5e=1ZoR3``7Zk8ltzQ)CEx&ly+8cppyKxo7$X#sdRN_619?X93p52>y&_2w z>p6Re%s6r*BM0vnhkG2f1EkOA@Px>a$|bkw(&{m_fN_iZ>F@Hnxa`?)0&K+?TZB_2 zLkopz47k1QsDVk!xZCi7*A2jAriF{=l(3;~%x4&#CX5)uQ7%cmfDc8^x};>pp3}z^ zNdM6s6oGYP`zYozb=$k6W3>eMrB8mPoV{+!$`A4=pimWrvrudpL5S>=7ft zb?S#K4Wg`b5u5eW6))8p79iM!Ybf!P_XK=*y`)N-R7yi7E>Cv|x)FYM^G}{;`(z@F zW!r}2+}pg>`EHD)*%<9Xr%T#Xp{?aP*(W&g%o1sYL>6(>D zkBy8kF_xp17U>DSD}?)w2r;Y*Z{F&CrB^PF`09UgAuB}i;; zU&);DSO)!p!}wXULTid`3|(bV$%CA{+vME9{7i_53Qw=(*4U>^zCJq0!JkhKF;?8q zTi};@esbG0A3R1Z5Oz_)m~Uv%|3Z_clCJZxvYdwS6Yp0*GX(xCr&y|x^%S5oL(3VY z$bE#RR3j{kzFbDv1b9flJ?o*$;+6LiayHAlT78`&5OBvb;4&s$tXuolX~39_Jbrjq zdlhSWT=I?p|8VKXzbYf@U$=Wn${jQlXn(ZCgR$A)^@Q1#xC(Ga24r!J=j4Rgc|Q}A zgc&fpdIpJh(-$wcFGfoWYLO;Fr zkX-$~$P5AsZwOBH=wXOZ&``>zlV=F+3#rAr0jM=JLbVOe6wv^^k;i>Mp1?@a;;{jJ z{3kv|X6F-a0V~$HGSIB&{i*VtR^`TYMtFUb2l%5^4G{?~uuGBVQJYEuo!>r0J0%f4Ddo3uox67L>NzN?h} zIDgk+=jrk8)30JT*GL_Z)y&|UhTr_J%|G{zE)a})D3H}C_|ZUvUdh7d`T%x{d@Ke=bt^qk%mn!m0$u^WW+I^<|-PYPsDxLRI%c!%6gyz%*2t#>%N3bd9&eNcxQAKO>K_S>%_P9Vp z>&ii&aWK)i6CCQESHE+AF;94wZ})M1Rpq&_)BH-BrFS;u8Q~)Vy(6$rYWqSoIYAn ze!Upjk01($T-t%-5KZBC$7mheFd|)5s%sQwLA=>{5jDv-8D29<7TJ-WgKWYw>*7v~ zzLdq^q0j~7@05!Q?u8r<^EQ*0#Q3*|yZuyoM=QLpJ?n|`UmDDQ-8YhuI2;?{lyxDl zjPpO#e;|qnRsP4I{_6A9Kd4odSO$I4`^ufbEa1;^-0_0q(qMqU#^3CP7YChY+{UHp zzFubm3(HHnpj$^w9qoae9z$a9U^uFfFS;p)tiJtPzdRb0+b*cvNip8v6yc$j3;m8F z^TIEsmn$0u($H4H@htnw8u?N#Dtzl|0v=2}-5f44*&i93-O{zv>Y-Ik4#S!I5C@V& z)mRP(b1qv;rp88KkFs(gYM0tBe?jeh3BE^pS%Z*~+u8B2X;}A&jqwa#uz-{^IlLTw z;82vs*Y~4ll68u*am{@C1nOSmw9GQ>0Ub@pchoYJwXjUKZllqQH!Q`z)x^k9qpsBziMHwNq?NM^7bNy+x!| zo)1Q%Gs=}4VUJW4z<}P!z*SuZxTR@{kT0~Up|OG3vBvySgx^M2C5CNwpkP@c>F_Z= z&y6L@NFH7%)B)}lhc#sE#MoWrg(I;DG3k5Et&Q^l?K+Ug(sfaOB=l{%tDFIm!rwZb#@DVtjp}Bnx z*NUQU<)qOMFNKe{^F`bsu!w;XV$H2;C8ZxL1aI>9jqU{+7`)+fE8mJ-%H4kTjIDA7 zHpUtQ?tILHHjG??U@Z;8j+C6BRssonLE}0u1DbSI+2@19bahHo<13Gzm3D3QQ2{7* zJ8KU3+Z*w4NIigo0H5`Bfhq7r%Xz-bAn-)Jy&Ca`|qRVPPlvm*wnt*9?RWd zqFg%i+Bm{H+d%{I|A|aQXvalrHT5<1iOJ^gRd@a<@l_Fe(C56*G@p(3ecSE9byse* z|8g^3OUy^!@x<)jlO~J)3#42jeXLdT>yHY3eY~e!FBZWqQ2@bK%(2j@$xB05MMz3P zqRQ5ka6Lu8m((Q&L1nZ=nSDL~RccZ%+VHnfaL2V~(Z&(Qv6*s7ARW5c!i1a(M>fPo zBuGlK1-j{qbsLZA8p6e=jb_q_)}M=$x0;TlC`<)DOot*jJLj&67lateSSh*tM$RT2pMl$l&AANC1ZUV4wN45Mx9rB^g*=4sXgN`T`TIXGP`p*p)OYV>!Mk>WN4b+c z)Gj6=$&5ODs=c$kg*ve3sSxFAwO{J|pvZ6ug^pl=CgrDVj|z`44CakzF`(rdp{wFg zC;*uq9iu}5f7|DvKDvXOpmNE(G-W|=pOIYqiCp>RFHKXQM&By-R->p(MiZkF39fg0IHBBcC>=w zVEZw2Inbh7$$nX;tC;yTfBeJqv=zqO@mb)`LqiDbNL@5v2;3ooJ{z9IQJ89aS*L$%+DTe{8Nfi9@++Un6o^X0JxcRQ zq+6ouzP^AfT16k_+VJ8o51n>tO&39=-EnTu7p%04PyMSNY) ztA%X`8rn|{Po@cpvyD4lx!puHI^_%?;GM8k^TtlWCptb5ai6m!DX;B_iS09N-8hP& z{~*SvL1dqx5Ik}?;SYbABz*vnc!G59UR|`w`?^J`mj~9m!%?GT$n{+J_CAiW>O*)1 z!#J^eX|Eb*VpqIU(sg{*z=i=AZ5Y{YOgx7qNdJw3ELtlsJK`p&BqEo|rE(?oI-394 z`XR4GlH3^@p)}Lr4-KF0p5|l*Xc{oHu@yp`<^jJj-$O~GIJ!JyC+ggk zd6tHpmRJWz(Cqg9Wr!g<5INA^P>^w`Nu~NF^LJzvb?xCLDoZIX3O@xC5UGf@zY0>s zw>CDF7=vXeKQI-d_SQ;O`)}4dNRvVD#_?@?7HM^fx-ELq>D zx|=4l7D^G!(9;StOgZKvG7{MKr~a+~B#v2=I4dL9+XD+LxhJY zjN!vHp|nlbR2R-WvcxDbe^#pR2Ulqjly0ZdS@6e=W|ZEv_2aeU7K331_gK{0)7}(P z?wu^{g;+tZX@JVs(^Sf5oQ%>^83g4#WQzcR3j7k>kF%T^T4VS)iC?8ENqvi*9a8D~bDs74>-^TykkAQk zZ(+;pjrPG8-hY9^+q8cS#o;&OjiOz4K)C8`2FpqG$@xyxFYIxIusK6kcV8;&s+tCi z@WIEi&xYyfh#XrAx~hmJMA;&x+!6hGE7rsOxK6r?H(ZjLP`l)z;v@CYYHlkH4b1g{ zt^S8}dRAKW_-6V@+9iah;59DYqI;59a`09w77ckaUWA4a#9w=m`(rKbeu3$14TLui z;t;a~c_HvIR4`21?ijONitW$t0y`k}uBEO&f8sN3r{rZN@G0r*$r|P^6OKFKQP{rg z6lE^Mw0)tch36twqxjEjO!v~Mbx~xCTAb}M3Ni?{q1udAeztE%`PKX}9(naFli(!j zB!LWVP3|-_mPTjRVx?5W7!k$tuv|Qf@7d5+$3%1>iK&d07exF|D;acH{2Dos-tp!e z2C{@I)h)*Q@W+?wUb7|_-kQ0PshB6ji~1$1A2AyzupLX8@&;l(=A}B&S6RghJ5!qd zna6O2M;X5-Y8tHnWIHNW(;Nv%w9{Z(Z+a4=2uZA}J;W6ZvRXtqnBI$3bprxF>x~Dk zxecoC1FF_2%)n}IOvg7>elUO^!fs<2`(gD@U@U z_;CujQjNcm(Y{*AdeG{${CaMLMVL4BiOGD*1J+n3EwLv}^il>Cxj<&3``*FLKs

9+nKI!nIu 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 diff --git a/misc/logo.svg b/misc/logo.svg index 523803f9..d80c8ed7 100644 --- a/misc/logo.svg +++ b/misc/logo.svg @@ -28,15 +28,15 @@ inkscape:deskcolor="#505050" inkscape:document-units="mm" showgrid="false" - inkscape:zoom="1" - inkscape:cx="397" - inkscape:cy="562.5" + inkscape:zoom="1.4142136" + inkscape:cx="284.96403" + inkscape:cy="621.19331" inkscape:window-width="2486" inkscape:window-height="1376" inkscape:window-x="0" inkscape:window-y="0" inkscape:window-maximized="1" - inkscape:current-layer="layer2" /> + inkscape:current-layer="g1555" /> + transform="matrix(-0.94015462,0,0,1.1536426,4.665075,-30.074672)" /> CMD TM TC @@ -626,12 +626,12 @@ transform="matrix(1.7104628,0,0,-0.7510209,-49.879139,243.64475)" style="stroke-width:1.05876218;stroke-dasharray:none"> diff --git a/tmtccmd/config/logo.png b/tmtccmd/config/logo.png deleted file mode 100644 index 9441f58067073a5d18f6047d5f91fe0c84b93509..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 175979 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

s0;BTGe4w}d_?YEH>zIX&Yr?;pLs>4Z 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

tluAj@c8&^0b~OihUF#Bp9|G6 zfadtv2na)+b?|GGx$@SH&o_%+-cCIh7~jS03m`RAOEPONDpObdilQfGeQ-qaF;JJUXl{Id zeSam|@MDo%qrvhb2?59D001(CHdbcoZ>tFw96<0Y8o%-(%ID}00`~VjNwKDPaUWr4 zGdlOZ?4}1TE6BSS^SV%7|4&pb7Y2zXXa!Otf10;0hEa;U9ih+GX$fV@k23zxv`@2^ zn3k~D_miXv7l)<)+#U;{x3r{1g^MD436eX!mlBru~B0U%B7>RD=4vxQ6g5x_XcOKQ6OK z(e+zNtwKDG3m6R!wQU;07)<3enP*uY>N&F9*;FT$WV<&6jsv+9MAL@)e2wv{J&y5D zjPLKRLH{^xM3JpASILDUKuz(ii*{|o(A-%+@sA%O&*jJ zD!KA1Mh8&6)_u~Knv6>d83 z5QBgr69ekb*NlLUf8*g&41VGISFEeN)1}WBZUBqRP}2k7<6lT(aESxl1Ii}!(yq}L zXwo#9ec4y93ArG)zg% z?Voe89AEdR&rl7zk+P+{I#k