// 定时器业务驱动
// 杭州秒寻科技有限公司
// 周涛
// 2023-10-11
#ifndef TIMER_H
#define TIMER_H
#include "sysdef.h"

#define SYS_MAX_TIMER_NUM 8 // 定时器最大数目，最大值根据项目定义即可

// 定时器类型
typedef enum
{
	ETIMER_ONCE = 1, // 单次触发定时器
	ETIMER_LOOP,	 // 自动循环定时器
} TIMER_TYPE_E;

// 定时器状态
typedef enum
{
	ETIMER_IDLE = 0, // 定时器空闲状态
	ETIMER_START,	 // 定时器启动状态
	ETIMER_STOP,	 // 定时器停止状态
} TIMER_STATE_E;

// 定时器接口调用返回值
typedef enum
{
	ETIMER_OK = 0,			// 处理正常
	ETIMER_PARA_ERR,		// 参数错误
	ETIMER_NO_EXIST,		// 定时器不存在
	ETIMER_EMPTY,			// 定时器资源空
	ETIMER_TYPE_ERR,		// 定时类型错误
	ETIMER_PROC_ERR = 0xFF, // 定时器处理错误
} TIMER_RESULT_E;

typedef void (*TIMER_CALLBACK_FUNC)(void); // 定时器回调函数类型

// 定时器节点信息
typedef struct tSysTimerNode
{
	uint8 byTimerId;				// 定时器ID号
	uint8 byModuleId;				// 定时器使用模块ID号
	uint8 byType;					// 定时器类型
	uint8 byState;					// 定时器状态
	uint32 dwTickOffset;			// 定时器定时时间，单位1秒
	uint32 dwTimerLimit;			// 定时器触发预设值，单位Tick，系统100ms Tick值++
	TIMER_CALLBACK_FUNC pvTimeFunc; // 定时触发处理函数
	struct tSysTimerNode *ptPre;	// 定时器前向指针
	struct tSysTimerNode *ptNext;	// 定时器后向指针
} TSYS_TIMER_NODE;

// 定时器管理体
typedef struct
{
	uint8 byIdleNum;			  // 定时器空闲个数
	uint8 byUseNum;				  // 定时器使用个数
	uint8 abyReserved[2];		  // 保留
	TSYS_TIMER_NODE *ptTimerIdle; // 定时器空闲表头指针
	TSYS_TIMER_NODE *ptTimerUse;  // 定时器非空闲表头指针
} TSYS_TIMER_MA;

// 供外部使用接口
void timer_init();
uint8 timer_create_timer(uint8 *pbyTimerId, TIMER_TYPE_E byTimerType);
uint8 timer_delete_timer(uint8 byTimerId);
uint8 timer_start_timer(uint8 byTimerId, uint32 dwMilliseconds, TIMER_CALLBACK_FUNC pvFunc);
uint8 timer_stop_timer(uint8 byTimerId);
void timer_process_func(void *pvPara);

#endif
