Source code for fprime_gds.common.decoders.decoder

"""
@brief Base class for all decoders. Defines the Decoder interface.

Decoders are responsible for taking in serialized data and parsing it into
objects. Decoders receive serialized data (that had a specific descriptor) from
a distributer that it has been registered to. The distributer will send the
binary data after removing any length and descriptor headers.

Example data that would be sent to a decoder that parses events or channels:
    +-------------------+---------------------+------------ - - -
    | ID (4 bytes) | Time Tag (11 bytes) | Data....
    +-------------------+---------------------+------------ - - -

This base class does not do any parsing, but instead acts as a pass through to
allow consumers to receive raw data.

@date Created June 29, 2018
@author R. Joseph Paetz

@bug No known bugs
"""

import abc
import logging

import fprime_gds.common.handlers

[docs]LOGGER = logging.getLogger("decoder")
[docs]class Decoder( fprime_gds.common.handlers.DataHandler, fprime_gds.common.handlers.HandlerRegistrar, abc.ABC, ): """ Base class for all decoder classes. This defines the "decode_api" function to allow for decoding of raw bytes. In addition it has a "data_callback" function implementation that decodes and sends out all results. """
[docs] def data_callback(self, data, sender=None): """ Data callback which calls the decode_api function exactly once. Then it passes the results to all registered consumer. This should only need to be overridden in extraordinary circumstances. :param data: data bytes to be decoded :param sender: (optional) sender id, otherwise None """ decoded = self.decode_api(data) if decoded is not None: self.send_to_all(decoded) return LOGGER.warning("Decoder of type %s produced 'None' decoded object", type(self))
@abc.abstractmethod
[docs] def decode_api(self, data):
""" Decodes the given data and returns the result. This function allows for non-registered code to call the same decoding code as is used to parse data passed to the data_callback function. :param data: binary data to decode :return: decoded data object """