#ifndef __OSP_SW_TIMER__
#define __OSP_SW_TIMER__

#define OSP_SW_TIMER_NAME_LEN   (24)
#define OSP_SW_TIMER_NUM        (4)

#define OSP_GET_MIN(a, b)  (((a) < (b)) ? (a) : (b))

/* 定时器回调函数 */
typedef void    (*OSP_CALLBACK)(void* pArg);

/* 定时器类型 */
typedef enum _OspTmrType
{
    OSP_TMR_ONESHOT = 0,    /* 一次性定时器 */
    OSP_TMR_PERIODIC        /* 周期性定时器 */
}OspTmrType;

/* 定时器状态 */
typedef enum _OspTmrStatus
{
    OSP_TMR_STOPED = 0,     /* 停止 */
    OSP_TMR_RUNING          /* 运行 */
}OspTmrStatus;

typedef enum _OspTmrUsing
{
    OSP_TMR_FREE = 0,       /* 定时点结点空闲 */
    OSP_TMR_BUSY            /* 定时点结点忙 */
}OspTmrUsing;

/* 定时器结构体 */
typedef struct _OspSwTimer
{
    uint8_t  u8Using;                           /* 定时器是否占用：0-未占用；1-已占用 */
    uint8_t  u8Padding[3];
    uint8_t  u8TmrName[OSP_SW_TIMER_NAME_LEN];  /* 定时器名称 */
    uint32_t u32TimeOut;                        /* 定时器超时时间 */
    uint32_t u32RealTime;                       /* 当前剩余时间 */
    OspTmrType      emTmrType;                  /* 定时器类型 */
    OSP_CALLBACK    pfnTmrCallBack;             /* 定时器回调函数 */
    void*           pArg;                       /* 定时器回调函数参数 */
    OspTmrStatus    emTmrStatus;                /* 定时器状态 */
}OspSwTimer_t;

/* 定时器初始化函数 */
int8_t OspTmrInit();

/* 创建定时器 */
int8_t OspTmrCreate(const char*      pu8Name,
                        uint32_t     u32TimeOut,
                        OspTmrType   emTmrType,
                        OSP_CALLBACK pfnTmrCallBack,
                        void*        pArg);

/* 删除定时器 */
int8_t OspTmrDelete(uint8_t u8TmrIndex);

/* 启动定时器 */
int8_t OspTmrStart(uint8_t u8TmrIndex);

/* 停止定时器 */
int8_t OspTmrStop(uint8_t u8TmrIndex);

#endif /* __OSP_SW_TIMER__ */

