/**
 * @file        hal_adc.h
 * @copyright   Nehemis SARL reserves all rights even in the event of industrial
 *              property rights. We reserve all rights of disposal such as
 *              copying and passing on to third parties.
 *
 * @brief       STM HAL ADC wrapper class.
 */

#ifndef HAL_ADC_H
#define HAL_ADC_H

/******************************************************************************
 * Include Header Files
 ******************************************************************************/
#include "nms_types.h"
#include "map_hal.h"

/* CubeMX */
#include "adc.h"

/******************************************************************************
 * Typedef
 ******************************************************************************/
typedef enum
{
    HAL_ADC_SUCCESS = 0U,
    HAL_ADC_ERROR,
    HAL_ADC_TIMEOUT
} HalAdcStatus_ten;

/******************************************************************************
 * Function Declarations
 ******************************************************************************/
/**
 * @brief  Initializes the ADC hardware interface.
 *         This function sets up the necessary resources and configurations for the ADC.
 *
 * @return  Error code: 0 if successful, nonzero otherwise.
 */
void HalAdcCalibrate(MapHalAdcModule_en module_en);

/**
 * @brief  Starts the ADC conversion on the specified ADC module.
 *         This function initiates the conversion process for the given ADC module.
 *
 * @param  module_en	The ADC module to be used (based on the system configuration).
 *
 * @return  Error code: 0 if successful, nonzero otherwise.
 */
uint32 HalAdcStart(MapHalAdcModule_en module_en);

/**
 * @brief   Reads the ADC value from the specified ADC module.
 *
 * @param   module_en		The ADC module to read from.
 * 			adcValue_pu32	Pointer to store the ADC value.
 *
 * @return  Error code: 0 if successful, nonzero otherwise.
 */
uint32 HalAdcRead(MapHalAdcModule_en module_en, uint32 *adcValue_pu32);

/**
 * @brief  Stops the ADC conversion for the specified ADC module.
 *
 * @param  module_en	The ADC module to stop.
 *
 * @return uint32_t: Status of the ADC stop operation.
 */
uint32 HalAdcStop(MapHalAdcModule_en module_en);

/**
 * @brief   Reads the ADC value in DMA mode
 *
 * @param   module_en		The ADC module to read from.
 * 			pData_u32	    Pointer to store the ADC value.
 * 			length_u32		Length of data.
 *
 * @return  Error code: 0 if successful, nonzero otherwise.
 */
uint32 HalAdcStartDMA(MapHalAdcModule_en module_en, uint32 * pData_u32, uint32 length_u32);

/**
 * @brief  Deinitializes the specified ADC module.
 *         This function frees up the resources associated with the ADC module
 *         and prepares it for shutdown or reconfiguration.
 *
 * @param  adcModule_en		The ADC module to deinitialize.
 *
 * @return None
 */
void HalAdcDeinit(MapHalAdcModule_en adcModule_en);

/**
 * @brief  Configures a callback function for ADC conversion completion.
 *         This function registers a callback function that will be called
 *         once the ADC conversion is completed.
 *
 * @param  adcModule_en		The ADC module to configure the callback for.
 *         callback_pfn     Pointer to the callback function that will be called
 *                          after the ADC conversion is complete.
 *                          The callback should return a `uint32` value.
 *
 * @return  Error code: 0 if successful, nonzero otherwise.
 */
uint32 HalAdcConfigureCallback(MapHalAdcModule_en adcModule_en, uint32 (*callback_pfn)(void));

#endif /* HAL_ADC_H */
