Source code for fprime_gds.common.encoders.cmd_encoder

"""
@brief Encoder for cmd data

This encoder takes in cmd_data objects, serializes them, and sends the results
to all registered senders.

Serialized command format:
    +--------------------------------+          -
    | Header = "A5A5 "               |          |
    | (5 byte string)                |          |
    +--------------------------------+      Added by
    | Destination = "GUI " or "FSW " |       Sender
    | (4 byte string)                |          |
    +--------------------------------+          -
    | Command descriptor             |
    | (0x5A5A5A5A)                   |
    | (4 byte number)                |
    +--------------------------------+
    | Length of descriptor, opcode,  |
    | and argument data              |
    | (4 bytes)                      |
    +--------------------------------+
    | Descriptor type = 0            |
    | (4 bytes)                      |
    +--------------------------------+
    | Op code                        |
    | (4 bytes)                      |
    +--------------------------------+
    | Argument 1 value               |
    +--------------------------------+
    | Argument 2 value               |
    +--------------------------------+
    | ...                            |
    +--------------------------------+
    | Argument n value               |
    +--------------------------------+

@date Created July 9, 2018
@author R. Joseph Paetz

@bug No known bugs
"""


from . import encoder
from fprime.common.models.serialize.numerical_types import U32Type
from fprime_gds.common.data_types.cmd_data import CmdData
from fprime_gds.common.utils.data_desc_type import DataDescType


[docs]class CmdEncoder(encoder.Encoder): """Encoder class for command data""" def __init__(self, config=None): """ CmdEncoder class constructor Args: config (ConfigManager, default=None): Object with configuration data for the sizes of fields in the binary data. If None passed, defaults are used. Returns: An initialized CmdEncoder object """ super().__init__(config) self.len_obj = self.config.get_type("msg_len")
[docs] def encode_api(self, data): """ Encodes the given CmdData object as binary data and returns the result. Args: data: CmdData object to encode Returns: Encoded version of the data argument as binary data """ assert isinstance(data, CmdData), "Encoder handling incorrect type" cmd_temp = data.get_template() desc = U32Type(0x5A5A5A5A).serialize() descriptor = U32Type(DataDescType["FW_PACKET_COMMAND"].value).serialize() op_code = U32Type(cmd_temp.get_op_code()).serialize() arg_data = b"" for arg in data.get_args(): arg_data += arg.serialize() length_val = len(descriptor) + len(op_code) + len(arg_data) self.len_obj.val = length_val length = self.len_obj.serialize() binary_data = desc + length + descriptor + op_code + arg_data return binary_data