#ifndef BSP_Q7S_RW_SPI_CALLBACK_H_
#define BSP_Q7S_RW_SPI_CALLBACK_H_

#include <fsfw/returnvalues/HasReturnvaluesIF.h>
#include <fsfw/hal/linux/spi/SpiComIF.h>
#include <fsfw/hal/common/gpio/GpioCookie.h>


namespace rwSpiCallback {

/**
 * @brief   This is the callback function to send commands to the nano avionics reaction wheels and
 *          receive the replies.
 *
 * @details The data to sent are additionally encoded according to the HDLC framing defined in the
 *          datasheet of the reaction wheels:
 *          https://eive-cloud.irs.uni-stuttgart.de/index.php/apps/files/?dir=/EIVE_IRS/
 *          Arbeitsdaten/08_Used%20Components/Nanoavionics_Reactionwheels&fileid=181622
 *          Each command entails exactly one reply which will also be read in and decoded by this
 *          function.
 *          Because the reaction wheels require a spi clock frequency of maximum 300 kHZ and minimum
 *          150 kHz which is not supported by the processing system SPI peripheral an AXI SPI core
 *          has been implemented in the programmable logic. This AXI SPI core works with a fixed
 *          frequency of 250 kHz.
 *          To allow the parallel usage of the same physical SPI bus, a VHDL module has been
 *          implemented which is able to disconnect the hard-wired SPI peripheral of the PS and
 *          route the AXI SPI to the SPI lines.
 *          To switch between the to SPI peripherals, an EMIO is used which will also be controlled
 *          by this function.
 */
ReturnValue_t spiCallback(SpiComIF* comIf, SpiCookie *cookie, const uint8_t *sendData,
        size_t sendLen, void* args);

/**
 * @brief   This function closes a spi session. Pulls the chip select to high an releases the
 *          mutex.
 * @param gpioId    Gpio ID of chip select
 * @param gpioIF    Pointer to gpio interface to drive the chip select
 * @param mutex     The spi mutex
 */
void closeSpi(gpioId_t gpioId, GpioIF* gpioIF, MutexIF* mutex);

}
#endif /* BSP_Q7S_RW_SPI_CALLBACK_H_ */