/****************************************************************************************************
* created by sunpeng 2017 all rights reserved!
****************************************************************************************************/
#ifndef __TIMER_H__
#define __TIMER_H__

#include "stdint.h"
#include "include.h"
#include "rotation.h"

#define APP_TIMER_PRESCALER             0                                           /**< Value of the RTC1 PRESCALER register. */

extern u16 rotation_detectFlag;// = 0;

typedef struct
{
	u32 cnt;			//定时计数值
	u32 cntMax;			//定时计数最大值
	s8 flag;			//定时到时标志 true=定时到时
	s8 cycleFlag;		//是否重复定时 true=重复
	s8 startFlag;		//开始计时标志 true=开始
}TIMER_FOR_TIMEOUT_STRUCT;		//定时器定时控制数据结构

#define DEFINE_TIMER_N_SECOND_VAR(name, CntMax, CycleFlag) \
								TIMER_FOR_TIMEOUT_STRUCT name = {\
								.cnt = 0, \
								.cntMax = CntMax, \
								.flag = false, \
								.cycleFlag = CycleFlag, \
								.startFlag = false }

#define EXTERN_TIMER_N_SECOND_VAR(name) \
								extern TIMER_FOR_TIMEOUT_STRUCT name


#if ARCH_MODE == NRF51802_Peripheral_Mode
extern TIMER_FOR_TIMEOUT_STRUCT rRecordGam_timeout_timer;
#endif

/***********************************************************************************************/
typedef enum
{
	CB_TIMER_ID_MIN = -1,
	CB_TIMER_ID_eledGam,		//定时器ID
	CB_TIMER_ID_eledGamScoreDisplay,		//定时器ID
	CB_TIMER_ID_rledGam,		//定时器ID
	CB_TIMER_ID_tledGam,		//定时器ID
	CB_TIMER_ID_trackGam,		//定时器ID
	CB_TIMER_ID_DisplayAllWhiteLeds,
	CB_TIMER_ID_BLEADVTIMEOUT,	//指定ID
	CB_TIMER_ID_Test,		//测试回调定时器ID
	CB_TIMER_ID_Specific,		//指定ID与不指定ID定时器分界线
	CB_TIMER_ID_Misc,		//默认不指定timer_id，采用自动分配
	CB_TIMER_ID_MAX
}CB_TIMER_ID_ENUM;  	//通用回调定时器ID

typedef enum
{
	CB_TIMER_TYPE_MIN = -1,
	CB_TIMER_TYPE_Once,		//单次回调
	CB_TIMER_TYPE_Many,		//多次回调
	CB_TIMER_TYPE_Forever,	//长期回调
	CB_TIMER_TYPE_MAX
}CB_TIMER_TYPE_ENUM;	//回调定时器类型

typedef struct
{
	s8 flag;						//定时器有效标志  true=有效
	u16 timer_id;					//定时器id
	CB_TIMER_TYPE_ENUM type;	//定时类型
	u16 timeout;					//定时时间 单位50ms
	u16 timeout_count;				//定时计时时间
	u16 times;						//定时次数
	u16 times_count;				//定时次数已完成的次数
	void (*cb_func)(u16 id, u16 times_count);	//定时回调函数
}CB_TIMER_STRUCT;		//回调定时器定义

#define CB_TIMER_MAX	20		/*回调定时器最大管理数量*/
#if CB_TIMER_MAX < CB_TIMER_ID_MAX  
/*如果小于CB_TIMER_ID_MAX， 则使用CB_TIMER_ID_MAX作为最大定时器数量*/
#undef CB_TIMER_MAX
#define CB_TIMER_MAX CB_TIMER_ID_MAX
#endif

typedef struct
{
	u16 count;			//当前定时器数量
	CB_TIMER_STRUCT cb_s[CB_TIMER_MAX];	//所有定时器管理数据结构
}CB_TIMERS_STRUCT;	//所有回调定时器管理

//初始化所有回调定时器
void init_callback_timers(void);

//触发单个定时回调任务
//  timeout		:	回调时间 (timeout * 1s )
//  timer_id	:   回调定时器id， 如果timer_id=CB_TIMER_ID_Misc,则自动分配timer_id
//	type		:	回调类型（单次回调、多次回调、长期回调）
//	times		:	回调次数，type=CB_TIMER_TYPE_Many时有效
//  cb_func		:	回调函数, 带参数 id: 定时器id  times_count: 当前回调次数计数
//  rtn		    :   true=创建成功  false=创建失败
s8 start_callback_timer(u16 timeout, 
						u16 timer_id,
						CB_TIMER_TYPE_ENUM type, 
						u16 times,
						void (*cb_func)(u16 id, u16 times_count)
						);

//获取指定ID的已经经过的时间
//timer_id	:定时器ID
//timeout_count	：已经计时过的时间
s8 get_callback_timer_time_passed(u16 timer_id, u16 *timeout_cout);

//手动触发指定回调定时器超时（触发后延迟一秒内执行）
// timer_id : 定时器id
// rtn 		: true=停止成功  false=停止失败
s8 trig_callback_timer(u16 timer_id);

//停止指定回调定时器（停止后不执行超时回调）
// timer_id : 定时器id
// rtn 		: true=停止成功  false=停止失败
s8 stop_callback_timer(u16 timer_id);

//测试回调函数
void test_callback_timer(void);


/**********************************************************************************************
 * 描  述 : init_beep_timer函数
 * 参  数 : 无
 * 返回值 : 无
 ***********************************************************************************************/ 
uint32_t init_beep_timer(void);

void uninit_beep_timer(void);

/**********************************************************************************************
 * 描  述 : enable_beep_timer函数
 * 参  数 : 无
 * 返回值 : 无
 ***********************************************************************************************/ 
void enable_beep_timer(void);

/**********************************************************************************************
 * 描  述 : disable_beep_timer函数
 * 参  数 : 无
 * 返回值 : 无
 ***********************************************************************************************/ 
void disable_beep_timer(void);

/**********************************************************************************************
 * 描  述 : set_beep_timer_period函数
 * 参  数 : uint32_t period 蜂鸣器周期 单位：us
 * 返回值 : 无
 ***********************************************************************************************/ 
void set_beep_timer_period(uint32_t period);


/**********************************************************************************************
 * 描  述 : init_public_timer函数
 * 参  数 : 无
 * 返回值 : 无
 ***********************************************************************************************/ 
uint32_t init_public_timer(void);

void uninit_public_timer(void);

/**********************************************************************************************
 * 描  述 : enable_public_timer函数
 * 参  数 : 无
 * 返回值 : 无
 ***********************************************************************************************/ 
void enable_public_timer(void);

/**********************************************************************************************
 * 描  述 : disable_public_timer函数
 * 参  数 : 无
 * 返回值 : 无
 ***********************************************************************************************/ 
void disable_public_timer(void);


void timers_init(void);
void application_timers_start(void);
void application_timers_resume_from_power_saving(void);
void application_timers_stop_for_power_saving(void);

//初始化超时结构体
u8 init_TIMER_FOR_TIMEOUT_STRUCT(TIMER_FOR_TIMEOUT_STRUCT *timeout, u32 cntMax, s8 cycleFlag);
//轮询计数处理
u8 add_TIMER_FOR_TIMEOUT_STRUCT(TIMER_FOR_TIMEOUT_STRUCT *timeout);
//主动触发超时
u8 trig_timeout_TIMER_FOR_TIMEOUT_STRUCT(TIMER_FOR_TIMEOUT_STRUCT *timeout);


void enable_auto_add_per_10ms_timer(void);		//开启每10ms定时计数器
void disable_auto_add_per_10ms_timer(void);		//关闭每10ms定时计数器
void add_auto_add_per_10ms_timer_cnt(void);		//自增每10ms定时计数器计数值
s8 get_auto_add_per_10ms_timer_cnt(u32 *time);		//获取每10ms定时计数器计数值

#endif

/*********************************************end of file*********************************************/
