#ifndef _SR_TIMER_H_
#define _SR_TIMER_H_

#include "sr_config.h"

#include "sr_device.h"


typedef struct SR_TIM_CFG SR_TIM_CFG_T;
typedef enum SR_TIMING_MODE  SR_TIMING_MODE_E;
typedef struct SR_TIM_DEV SR_TIM_DEV_T;


#include "sr_bsp_timer.h"

/**
 * @brief 定时器定时功能配置结构体
 * @note 定时时间由reload/prescaler、us/sec这两组参数决定（二选一，根据芯片平台适配）
 */
struct SR_TIM_CFG
{
    void     (*cb)(void *args); /*!<定时器超时回调函数*/
    void     *cbArgs;           /*!<定时器超时回调函数的参数*/
    uint32_t reload;            /*!<定时器计数重装载值*/
    uint32_t prescaler;         /*!<定时器计数频率预分频值*/
    uint32_t us;                /*!< [预留]定时时间的微秒数，单位微秒*/
    uint8_t  sec;               /*!< [预留]定时时间的秒数，单位秒，最大值60*/
    uint8_t  mode;              /*!<定时模式，可选值@SR_TIMING_MODE_E*/ 
};

//定时模式
enum SR_TIMING_MODE
{
    TIMING_ONECE = BSP_TIMING_ONECE,    /*!<只执行一次*/ 
    TIMING_PERIOD = BSP_TIMING_PERIOD,  /*!<周期执行*/
};

/**
 * @brief SPI设备结构体
 */
struct SR_TIM_DEV
{
    SR_DEVICE_T parent; /*!< 继承设备公共父类 */
    void     (*cb)(void *args); /*!<定时器超时回调函数*/
    void     *cbArgs;     /*!<定时器超时回调函数的参数*/
};




/**
 * @brief 打开定时器设备，获取控制句柄
 *
 * @param[in] timId  定时器ID，可选值@SR_TIM_ID_E
 * 
 * @return 成功:返回SR_DEVICE_T *指针    失败：SR_NULL
 */
#define SR_HalTimOpen(timId)    BspTimOpen(timId)



/**
 * @brief 关闭定时器设备，去初始化
 *
 * @param[in] dev  定时器设备指针，SR_DEVICE_T *类型
 * 
 * @return 0：成功    负值：失败
 */
#define SR_HalTimClose(dev)     BspTimClose(dev)



/**
 * @brief 配置定时器设备
 *
 * @param[in] dev  定时器设备指针，SR_DEVICE_T *类型
 * @param[in] cfg  定时器配置结构体，SR_TIM_CFG_T *类型
 * 
 * @return 0：成功    负值：失败
 */
#define SR_HalTimConfig(dev, cfg)  BspTimConfig(dev, cfg)



/**
 * @brief 启动定时器设备
 *
 * @param[in] dev  定时器设备指针，SR_DEVICE_T *类型
 * 
 * @return 0：成功    负值：失败
 */
#define SR_HalTimStart(dev)    BspTimStart(dev)


/**
 * @brief 停止定时器设备
 *
 * @param[in] dev  定时器设备指针，SR_DEVICE_T *类型
 * 
 * @return 0：成功    负值：失败
 */
#define SR_HalTimStop(dev)     BspTimStop(dev)



/**
 * @brief 获取当前计数定时器设备的计数值
 *
 * @param[in] dev  定时器设备指针，SR_DEVICE_T *类型
 * 
 * @return >=0：当前计数值    负值：失败
 */
#define SR_HalTimGetCnt(dev)   BspTimGetCnt(dev)




#endif /* _SR_TIMER_H_ */