2021-04-11 11:08:52 +02:00
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
"""
|
2021-07-11 14:29:11 +02:00
|
|
|
@file ploc_mpsoc.py
|
|
|
|
@brief Tests for commanding the MPSoC of the PLOC.
|
|
|
|
The MPSoC is programmed by the ILH.
|
2021-04-11 11:08:52 +02:00
|
|
|
@author J. Meier
|
2021-07-11 14:29:11 +02:00
|
|
|
@date 06.03.2021
|
2021-04-11 11:08:52 +02:00
|
|
|
"""
|
|
|
|
import struct
|
|
|
|
|
2021-06-12 13:49:25 +02:00
|
|
|
from tmtccmd.config.definitions import QueueCommands
|
2022-03-17 19:42:27 +01:00
|
|
|
from tmtccmd.utility.logger import get_console_logger
|
2021-07-24 14:58:47 +02:00
|
|
|
from tmtccmd.tc.packer import TcQueueT
|
2021-10-01 10:55:56 +02:00
|
|
|
from spacepackets.ecss.tc import PusTelecommand
|
2021-04-11 11:08:52 +02:00
|
|
|
|
2022-03-17 19:42:27 +01:00
|
|
|
LOGGER = get_console_logger()
|
2021-04-11 11:08:52 +02:00
|
|
|
|
2022-03-17 19:42:27 +01:00
|
|
|
MANUAL_INPUT = "3"
|
2022-01-18 14:03:56 +01:00
|
|
|
|
2022-03-17 19:42:27 +01:00
|
|
|
flash_write_dict = {
|
|
|
|
"1": ["q7s test file", "/mnt/sd0/ploc-mpsoc/flashwrite.bin"],
|
|
|
|
"2": ["te0720-1cfa test file", "/mnt/sd0/ploc-mpsoc/flashwrite.bin"],
|
|
|
|
MANUAL_INPUT: ["manual input", ""],
|
|
|
|
}
|
2021-04-11 11:08:52 +02:00
|
|
|
|
|
|
|
|
2022-03-17 19:42:27 +01:00
|
|
|
class CommandIds:
|
|
|
|
tc_mem_write = 1
|
|
|
|
tc_mem_read = 2
|
|
|
|
flash_write = 3
|
2021-04-24 13:27:57 +02:00
|
|
|
|
|
|
|
|
|
|
|
class PlocReplyIds:
|
|
|
|
tm_mem_read_report = 6
|
2021-04-11 11:08:52 +02:00
|
|
|
|
|
|
|
|
2022-03-17 19:42:27 +01:00
|
|
|
def pack_ploc_mpsoc_commands(
|
|
|
|
object_id: bytearray, tc_queue: TcQueueT, op_code: str
|
|
|
|
) -> TcQueueT:
|
2021-04-11 11:08:52 +02:00
|
|
|
tc_queue.appendleft(
|
2022-03-17 19:42:27 +01:00
|
|
|
(
|
|
|
|
QueueCommands.PRINT,
|
|
|
|
"Generate command for PLOC MPSoC with object id: 0x" + object_id.hex(),
|
|
|
|
)
|
2021-04-11 11:08:52 +02:00
|
|
|
)
|
|
|
|
|
2022-03-17 19:42:27 +01:00
|
|
|
if op_code == "0":
|
|
|
|
tc_queue.appendleft((QueueCommands.PRINT, "PLOC MPSoC: TC mem write test"))
|
|
|
|
memory_address = int(input("PLOC MPSoC: Tc Mem Write: Type memory address: 0x"), 16)
|
|
|
|
memory_data = int(input("PLOC MPSoC: Tc Mem Write: Type memory data: 0x"), 16)
|
|
|
|
# TODO: implement variable length mem write command
|
|
|
|
mem_len = 1 # 1 32-bit word
|
2022-01-18 14:03:56 +01:00
|
|
|
command = generate_write_mem_command(
|
2022-03-17 19:42:27 +01:00
|
|
|
object_id, memory_address, memory_data, mem_len
|
2022-01-18 14:03:56 +01:00
|
|
|
)
|
2022-03-17 19:42:27 +01:00
|
|
|
command = PusTelecommand(service=8, subservice=128, ssc=20, app_data=command)
|
2021-04-11 11:08:52 +02:00
|
|
|
tc_queue.appendleft(command.pack_command_tuple())
|
2022-03-17 19:42:27 +01:00
|
|
|
elif op_code == "1":
|
|
|
|
tc_queue.appendleft((QueueCommands.PRINT, "PLOC MPSoC: TC mem read test"))
|
|
|
|
command = prepare_mem_read_command(object_id)
|
|
|
|
command = PusTelecommand(service=8, subservice=128, ssc=21, app_data=command)
|
|
|
|
tc_queue.appendleft(command.pack_command_tuple())
|
|
|
|
elif op_code == "2":
|
|
|
|
tc_queue.appendleft((QueueCommands.PRINT, "PLOC MPSoC: Flash write"))
|
|
|
|
command = prepare_flash_write_cmd(object_id)
|
|
|
|
command = PusTelecommand(service=8, subservice=128, ssc=22, app_data=command)
|
2021-04-11 11:08:52 +02:00
|
|
|
tc_queue.appendleft(command.pack_command_tuple())
|
|
|
|
|
|
|
|
return tc_queue
|
|
|
|
|
|
|
|
|
2022-01-18 14:03:56 +01:00
|
|
|
def generate_write_mem_command(
|
2022-03-17 19:42:27 +01:00
|
|
|
object_id: bytearray, memory_address: int, memory_data: int, mem_len: int
|
2022-01-18 14:03:56 +01:00
|
|
|
) -> bytearray:
|
|
|
|
"""This function generates the command to write to a memory address within the PLOC
|
2021-04-11 11:08:52 +02:00
|
|
|
@param object_id The object id of the PlocHandler
|
|
|
|
@param memory_address The PLOC memory address where to write to.
|
|
|
|
@param memory_data The data to write to the memory address specified by the bytearray memory_address.
|
|
|
|
"""
|
2022-01-18 14:03:56 +01:00
|
|
|
command = (
|
2022-03-17 19:42:27 +01:00
|
|
|
object_id
|
|
|
|
+ struct.pack('!I', CommandIds.tc_mem_write)
|
|
|
|
+ struct.pack('!I', memory_address)
|
|
|
|
+ struct.pack('!H', mem_len)
|
|
|
|
+ struct.pack("!I", memory_data)
|
2022-01-18 14:03:56 +01:00
|
|
|
)
|
2021-04-24 13:27:57 +02:00
|
|
|
return command
|
2022-03-17 19:42:27 +01:00
|
|
|
|
|
|
|
|
|
|
|
def prepare_mem_read_command(object_id: bytearray) -> bytearray:
|
|
|
|
memory_address = int(input("PLOC MPSoC Tc Mem Read: Type memory address: 0x"), 16)
|
|
|
|
num_words = int(input("PLOC MPSoC specify number of words (32-bit) to read: "))
|
|
|
|
command = (
|
|
|
|
object_id + struct.pack('!I', CommandIds.tc_mem_read) + struct.pack("!I", memory_address) + struct.pack(
|
|
|
|
'!H', num_words)
|
|
|
|
)
|
|
|
|
return command
|
|
|
|
|
|
|
|
|
|
|
|
def prepare_flash_write_cmd(object_id: bytearray) -> bytearray:
|
|
|
|
file = get_flash_write_file()
|
|
|
|
command = object_id + struct.pack('I', CommandIds.flash_write) + bytearray(file, 'utf-8')
|
|
|
|
return command
|
|
|
|
|
|
|
|
|
|
|
|
def get_flash_write_file() -> str:
|
|
|
|
LOGGER.info("Specify json file")
|
|
|
|
input_helper = InputHelper(json_dict)
|
|
|
|
key = input_helper.get_key()
|
|
|
|
if key == MANUAL_INPUT:
|
|
|
|
file = input("Ploc MPSoC: Specify absolute name of flash write file: ")
|
|
|
|
else:
|
|
|
|
file = json_dict[key][1]
|
|
|
|
return file
|