#ifndef LINUX_GPIO_GPIOCALLBACKS_H_
#define LINUX_GPIO_GPIOCALLBACKS_H_

#include <fsfw_hal/common/gpio/gpioDefinitions.h>
#include <fsfw_hal/common/gpio/GpioIF.h>


namespace gpioCallbacks {

    /**
     * @brief   This function initializes the GPIOs used to control the SN74LVC138APWR decoders on
     *          the TCS Board and the interface board.
     */
    void initSpiCsDecoder(GpioIF* gpioComIF);

    /**
     * @brief   This function implements the decoding to multiply gpios by using the decoder
     *          chips SN74LVC138APWR on the TCS board and the interface board.
     */
    void spiCsDecoderCallback(gpioId_t gpioId, gpio::GpioOperation gpioOp, int value, void* args);

    /**
     * @brief   This function sets mux bits 1-3 to a state which will only enable the decoder
     *          on the TCS board which is named to IC1 in the schematic.
     */
    void enableDecoderTcsIc1();

    /**
     * @brief   This function sets mux bits 1-3 to a state which will only enable the decoder
     *          on the TCS board which is named to IC2 in the schematic.
     */
    void enableDecoderTcsIc2();

    /**
     * @brief   This function sets mux bits 1-3 to a state which will only enable the decoder
     *          on the inteface board board which is named to IC21 in the schematic.
     */
    void enableDecoderInterfaceBoardIc1();

    /**
     * @brief   This function sets mux bits 1-3 to a state which will only enable the decoder
     *          on the inteface board board which is named to IC22 in the schematic.
     */
    void enableDecoderInterfaceBoardIc2();

    /**
     * @brief   Enables the reaction wheel chip select decoder (IC3).
     */
    void enableRwDecoder();

    /**
     * @brief   This function disables all decoder.
     */
    void disableAllDecoder();

    /** The following functions enable the appropriate channel of the currently enabled decoder */
    void selectY0();
    void selectY1();
    void selectY2();
    void selectY3();
    void selectY4();
    void selectY5();
    void selectY6();
    void selectY7();
}

#endif /* LINUX_GPIO_GPIOCALLBACKS_H_ */