Skip to content
Snippets Groups Projects
Forked from an inaccessible project.
obsw_tc_service20.py 4.84 KiB
# -*- coding: utf-8 -*-
"""
@file   obsw_tc_service20.py
@brief  PUS Service 20:  Parameter management.
@author J. Gerhards
@date   30.06.2020
"""
import struct
from typing import Deque

import config.tmtcc_config as g
from tmtc_core.tc.obsw_pus_tc_base import PusTelecommand, TcQueueT
from tmtc_core.utility.obsw_logger import get_logger
from tc.obsw_tc_service200 import pack_mode_data

LOGGER = get_logger()


def pack_boolean_parameter_setting(object_id: bytearray, domain_id: int,
                                   unique_id: int, parameter: bool, ssc: int):
    """
    Generic function to pack a telecommand to tweak a boolean parameter
    @param object_id:
    @param domain_id:
    @param unique_id:
    @param parameter:
    @param ssc:
    @return:
    """
    parameter_id = bytearray(4)
    parameter_id[0] = domain_id
    if unique_id > 255:
        LOGGER.warning("Invalid unique ID, should be smaller than 255!")
        return
    parameter_id[1] = unique_id
    parameter_id[2] = 0
    parameter_id[3] = 0
    data_to_pack = bytearray(object_id)
    data_to_pack.extend(parameter_id)
    # PTC and PFC for uint8_t according to CCSDS
    ptc = 3
    pfc = 4
    rows = 1
    columns = 1
    data_to_pack.append(ptc)
    data_to_pack.append(pfc)
    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)


def pack_service20_test_into(tc_queue: Deque, called_externally: bool = False) -> Deque:
    # parameter IDs
    parameterID0 = 0
    parameterID1 = 256
    parameterID2 = 512

    if called_externally is False:
        tc_queue.appendleft(("print", "Testing Service 20"))
    object_id = g.DUMMY_DEVICE_ID

    # set mode normal
    tc_queue.appendleft(("print", "Testing Service 20: Set Normal Mode"))
    mode_data = pack_mode_data(object_id, 2, 0)
    command = PusTelecommand(service=200, subservice=1, ssc=2000, app_data=mode_data)
    tc_queue.appendleft(command.pack_command_tuple())

    # test checking Load for uint32_t
    tc_queue.appendleft(("print", "Testing Service 20: Load uint32_t"))
    parameter_id = struct.pack(">I", parameterID0)
    type_and_matrix_data = pack_type_and_matrix_data(3, 14, 1, 1)
    parameter_data = struct.pack(">I", 42)
    payload = object_id + parameter_id + type_and_matrix_data + parameter_data
    command = PusTelecommand(service=20, subservice=128, ssc=2010, app_data=payload)
    tc_queue.appendleft(command.pack_command_tuple())

    # test checking Dump for uint32_t
    tc_queue.appendleft(("print", "Testing Service 20: Dump uint32_t"))
    parameter_id = struct.pack(">I", parameterID0)
    payload = object_id + parameter_id
    command = PusTelecommand(service=20, subservice=129, ssc=2020, app_data=payload)
    tc_queue.appendleft(command.pack_command_tuple())

    # test checking Load for int32_t
    tc_queue.appendleft(("print", "Testing Service 20: Load int32_t"))
    parameter_id = struct.pack(">I", parameterID1)
    type_and_matrix_data = pack_type_and_matrix_data(4, 14, 1, 1)
    parameter_data = struct.pack(">i", -42)
    payload = object_id + parameter_id + type_and_matrix_data + parameter_data
    command = PusTelecommand(service=20, subservice=128, ssc=2030, app_data=payload)
    tc_queue.appendleft(command.pack_command_tuple())

    # test checking Dump for int32_t
    tc_queue.appendleft(("print", "Testing Service 20: Dump int32_t"))
    parameter_id = struct.pack(">I", parameterID1)
    payload = object_id + parameter_id
    command = PusTelecommand(service=20, subservice=129, ssc=2040, app_data=payload)
    tc_queue.appendleft(command.pack_command_tuple())

    # test checking Load for float
    tc_queue.appendleft(("print", "Testing Service 20: Load float"))
    parameter_id = struct.pack(">I", parameterID2)
    type_and_matrix_data = pack_type_and_matrix_data(5, 1, 1, 1)
    parameter_data = struct.pack(">f", 4.2)
    payload = object_id + parameter_id + type_and_matrix_data + parameter_data
    command = PusTelecommand(service=20, subservice=128, ssc=2050, app_data=payload)
    tc_queue.appendleft(command.pack_command_tuple())

    # test checking Dump for float
    tc_queue.appendleft(("print", "Testing Service 20: Dump float"))
    parameter_id = struct.pack(">I", parameterID2)
    payload = object_id + parameter_id
    command = PusTelecommand(service=20, subservice=129, ssc=2060, app_data=payload)
    tc_queue.appendleft(command.pack_command_tuple())

    if called_externally is False:
        tc_queue.appendleft(("export", "log/tmtc_log_service20.txt"))
    return tc_queue


def pack_type_and_matrix_data(ptc, pfc, column, row):
    data = bytearray(4)
    data[0] = ptc
    data[1] = pfc
    data[2] = column
    data[3] = row
    return data


def pack_service23_commands_into(tc_queue: TcQueueT, op_code: int):
    if op_code == 0:
        pack_service20_test_into(tc_queue=tc_queue)