/**
 * @file		hal_system.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      	Header file for HAL layer for the SYSTEM module.
 *
 */

#ifndef INCLUDED_HAL_SYSTEM_H
#define INCLUDED_HAL_SYSTEM_H

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

/******************************************************************************
 * Macros Constant Declarations
 ******************************************************************************/
#define SERIAL_ID_BUFFER_SIZE       12

/******************************************************************************
 * Types Declarations
 ******************************************************************************/
typedef enum
{
	HAL_SYSTEM_RESET_CAUSE_OPTION_BYTE_LOADER,
	HAL_SYSTEM_RESET_CAUSE_EXTERNAL_PIN_RESET,
	HAL_SYSTEM_RESET_CAUSE_BROWNOUT_RESET,
	HAL_SYSTEM_RESET_CAUSE_SOFTWARE_RESET,
	HAL_SYSTEM_RESET_CAUSE_WATCH_DOG_TIMER,
	HAL_SYSTEM_RESET_CAUSE_WINDOW_WATCH_DOG,
	HAL_SYSTEM_RESET_CAUSE_LOW_POWER,
    HAL_SYSTEM_RESET_CAUSE_ALL_CAUSES
} HalSystemResetCauseEn; /**< Enumeration used to analyze the reset cause location. */

/******************************************************************************
 * Global Variables Declarations
 ******************************************************************************/

/******************************************************************************
 * Extern Functions Declarations
 ******************************************************************************/

/**
 * @brief   Initializes the system HAL.
 *
 * @note    CAUTION: This function must be called immediately after
 *          SystemClock_Config() in the main function to ensure correct
 *          operation and prevent potential software issues.
 *
 * @return  Error code: 0 if successful, nonzero otherwise.
 */
uint32 HalSystemInit(void);

/**
 * @brief   Retrieves the system runtime in microseconds.
 *
 * @param   resultUs_pu64  Pointer to store the system runtime in microseconds.
 *
 * @note    The tick resolution depends on the system tick frequency.
 *
 * @return  Error code: 0 if successful, nonzero otherwise.
 */
uint32 HalSystemGetRunTimeUs(uint64 *resultUs_pu64);

/**
 * @brief   Retrieves the system runtime in milliseconds.
 *
 * @param   resultMs_pu64  Pointer to store the system runtime in milliseconds.
 *
 * @note    The tick resolution depends on the system tick frequency.
 *
 * @return  Error code: 0 if successful, nonzero otherwise.
 */
uint32 HalSystemGetRunTimeMs(uint64 *resultMs_pu64);

/**
 * @brief   Disables all system interrupts.
 */
void HalSystemDisableInterrupts(void);

/**
 * @brief   Enables all system interrupts.
 */
void HalSystemEnableInterrupts(void);

/**
 * @brief   Retrieves the cause of the last system reset from the MCU registers.
 *
 * @param   resetCauseSelector_en  Enum specifying the reset cause type.
 *			causes_pu32            Pointer to store the corresponding bitmask value.
 *
 * @return  Error code: 0 if successful, nonzero otherwise.
 */
uint32 HalSystemGetResetCause(HalSystemResetCauseEn resetCauseSelector_en, uint32 *causes_pu32);

/**
 * @brief   Retrieves the system's unique serial ID.
 *
 * @param   serialIdBuffer_pu8  Pointer to the buffer where the serial ID will be stored.
 */
void HalSystemGetSerialId(uint8 *serialIdBuffer_pu8);

/**
 * @brief   Performs a software reset of the system.
 */
void HalSystemReset(void);


#endif /* INCLUDED_HAL_SYSTEM_H */
