#ifndef LINUX_OBC_PDECCONFIG_H_
#define LINUX_OBC_PDECCONFIG_H_

#include "fsfw/returnvalues/HasReturnvaluesIF.h"
#include <cstring>

/**
 * @brief   This class generates the configuration words for the configuration memory of the PDEC
 *          IP Cores.
 *
 * @details Fields are initialized according to pecification in PDEC datasheet section 6.11.3.1
 *          PROM usage.
 *
 * @author  J. Meier
 */
class PdecConfig {

public:
    PdecConfig();
    virtual ~PdecConfig();

    /**
     * @brief   Returns the configuration word by specifying the position.
     */
    uint32_t getConfigWord(uint8_t wordNo);

private:
    // TC transfer frame configuration parameters
    static const uint8_t VERSION_ID = 0;
    // BD Frames
    static const uint8_t BYPASS_FLAG = 1;
    static const uint8_t CONTROL_COMMAND_FLAG = 0;

    static const uint8_t VIRTUAL_CHANNEL = 0;
    static const uint8_t RESERVED_FIELD_A = 0;
    static const uint16_t SPACECRAFT_ID = 0x274;
    static const uint16_t DUMMY_BITS = 0;
    // Parameters to control the FARM for AD frames
    // Set here for future use
    static const uint8_t POSITIVE_WINDOW = 10;
    static const uint8_t NEGATIVE_WINDOW = 151;
    static const uint8_t HIGH_AU_MAP_ID = 0xF;
    static const uint8_t ENABLE_DERANDOMIZER = 1;

    static const uint8_t CONFIG_WORDS_NUM = 2;

    uint32_t configWords[CONFIG_WORDS_NUM];

    void initialize();
};

#endif /* LINUX_OBC_PDECCONFIG_H_ */