#ifndef SAM9G20_COMIF_COOKIES_UART_COOKIE_H_
#define SAM9G20_COMIF_COOKIES_UART_COOKIE_H_

#include <fsfw/devicehandlers/CookieIF.h>
#include <string>

enum class Parity {
    NONE,
    EVEN,
    ODD
};

enum class StopBits {
    ONE_STOP_BIT,
    TWO_STOP_BITS
};

/**
 * @brief   Cookie for the UartComIF. There are many options available to configure the uart driver.
 *          The constructor only requests for common options like the baudrate. Other options can
 *          be set by member functions.
 *
 * @author 	J. Meier
 */
class UartCookie: public CookieIF {
public:

	/**
	 * @brief	Constructor for the uart cookie.
	 * @param deviceFile    The device file specifying the uart to use. E.g. "/dev/ttyPS1".
     * @param baudrate      The baudrate to use for input and output. Possible Baudrates are: 50,
     *                      75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800, 9600, B19200,
     *                      38400, 57600, 115200, 230400, 460800
     * @param maxReplyLen   The maximum size an object using this cookie expects.
     *
     * @details Default configuration: No parity
     *                                 8 databits (number of bits transfered with one uart frame)
     *                                 One stop bit
     *
     *
	 */
    UartCookie(std::string deviceFile, uint32_t baudrate, size_t maxReplyLen);

	virtual ~UartCookie();

	uint32_t getBaudrate() const;
	size_t getMaxReplyLen() const;
	std::string getDeviceFile() const;
	Parity getParity() const;
	uint8_t getBitsPerWord() const;
	StopBits getStopBits() const;

	/**
	 * Functions two enable parity checking.
	 */
	void setParityOdd();
    void setParityEven();

    /**
     * Function two set number of bits per UART frame.
     */
	void setBitsPerWord(uint8_t bitsPerWord_);

	/**
	 * Function to specify the number of stopbits.
	 */
	void setTwoStopBits();
	void setOneStopBit();


private:

	std::string deviceFile;
	uint32_t baudrate;
	size_t maxReplyLen = 0;
	Parity parity = Parity::NONE;
	uint8_t bitsPerWord = 8;
	StopBits stopBits = StopBits::ONE_STOP_BIT;
};

#endif