/*****************************************************************************
**	Filename  : keyboard_drive.h
**	Project   :
**	Module	  :
**	Processor :
**	Date/Time :
**	Abstract  :
**	Contents  :
**	Author	  : mingyea
**	http	  :
**	mail	  :
**	--------------------------------------------------------------------------
**
**	--------------------------------------------------------------------------
******************************************************************************/

#ifndef _KEY_DIGITAL_DRIVER_H_
#define _KEY_DIGITAL_DRIVER_H_
/*****************************************************************************
* Include Files
*****************************************************************************/

#include "common_types.h"
#include "common_cfg.h"
#include "key_digital_driver_cfg.h"

/*****************************************************************************
* Defines
*****************************************************************************/
//typedef  u8 key_digital_key_state_t;
typedef  u16 key_digital_key_tim_t;

typedef enum
{
	KEY_DIGITAL_DRIVER_LOGIC_INIT =0u,
	KEY_DIGITAL_DRIVER_LOGIC_VALID =1u,
}key_digital_driver_logic_level_e;

typedef enum
{
	KEY_DIGITAL_DRIVER_DIFF_NULL =0u,	//鍵盤無變化
	KEY_DIGITAL_DRIVER_DIFF_SURE =1u,	//鍵盤有變化
}key_digital_driver_diff_e;

typedef enum
{
	KEY_DIGITAL_DRIVER_STATE_UP =0u,	//默認是彈起
	KEY_DIGITAL_DRIVER_STATE_SHORT_DOWN=1u ,	//短按
	KEY_DIGITAL_DRIVER_STATE_LONG_DOWN=2u ,	//長按
	KEY_DIGITAL_DRIVER_STATE_STICK =3u,	//卡住
	KEY_DIGITAL_DRIVER_STATE_ERRO =4u,	//電汽錯誤
}key_digital_driver_state_e;

typedef enum
{
	KEY_DIGITAL_DRIVER_SUBSTATE_INIT =0u,	//初始
	KEY_DIGITAL_DRIVER_SUBSTATE_UP=1u,	//默認是彈起
	KEY_DIGITAL_DRIVER_SUBSTATE_ERROR=2u ,	//異常状態
}key_digital_driver_substate_e;


#define KEY_DIGITAL_EVENT_RELEASE	1u
#define KEY_DIGITAL_EVENT_PRESSED	2u
#define KEY_DIGITAL_EVENT_SHORT_DOWN_RELEASE	4u
#define KEY_DIGITAL_EVENT_LONG_DOWN				8u
#define KEY_DIGITAL_EVENT_NULL 0u

typedef struct
{
	u8 event;
	#ifndef RAM_OPTIMIZE_EN
	u8 phy_cur_level;  //當前物理電平
	u8 phy_pre_level;  //上次物理電平
	u8 logic_cur_level;  //當前邏輯電平
	u8 logic_pre_level;  //上次邏輯電平
	u8 change;	//一般用於，state的收化。要結合state使用
	u8 state_change;	//一般用於，state的收化。要結合state使用
	key_digital_driver_substate_e sub_state; //用於輔助的
	key_digital_driver_state_e state;  //狀態，一般指邏輯，且消抖後的。
	key_digital_driver_state_e pre_state;  //上一次
	key_digital_key_tim_t timecount;	//計時
	#else
	u8 phy_cur_level:1;  //當前物理電平
	u8 phy_pre_level:1;  //上次物理電平
	u8 logic_cur_level:1;  //當前邏輯電平
	u8 logic_pre_level:1;  //上次邏輯電平
	u8 change:1;	//一般用於，state的收化。要結合state使用
	u8 state_change:1;	//一般用於，state的收化。要結合state使用
	//u8 res:2; //湊成8bit
	key_digital_driver_substate_e sub_state:2; //用於輔助的
	key_digital_driver_state_e state:4;  //狀態，一般指邏輯，且消抖後的。
	key_digital_driver_state_e pre_state:4;  //上一次
	key_digital_key_tim_t timecount;	//計時
	#endif
}key_digital_driver_alone_s;


typedef struct
{
	key_digital_driver_alone_s digital_key[KEY_DIGITAL_DRIVER_KEY_TOTAL];
}key_digital_driver_s;

/*****************************************************************************
* Macros
*****************************************************************************/

/*****************************************************************************
* Type Defines
*****************************************************************************/

/*****************************************************************************
*Static Variable
*****************************************************************************/

/*****************************************************************************
*Global Variable
*****************************************************************************/

/*****************************************************************************
*Constant
*****************************************************************************/

/*****************************************************************************
*Function Prototype
*****************************************************************************/
void key_digital_driver_init(void);
void key_digital_driver_normal_task(void);
key_digital_driver_state_e key_digital_driver_get_state(u8 id);
u8 key_digital_driver_get_phy_level(u8 id);
u8 key_digital_driver_get_logic_level(u8 id);
u8 key_digital_driver_get_change(u8 id);
key_digital_key_tim_t key_digital_driver_get_timecount(u8 id);
u8 key_digital_driver_get_phy_pre_quick(u8 id);
void key_digital_driver_quick_scan(void);
key_digital_driver_diff_e key_digital_driver_judge_diff_wakeup(void);
key_digital_driver_diff_e key_digital_driver_judge_state_wakeup(void);
void key_digital_driver_goto_sleep(void);
u8 key_digital_driver_get_phy_pre_level(u8 id);
u8 key_digital_driver_get_state_change(u8 id);
void key_digital_driver_goto_wakeup(void);

key_digital_driver_state_e key_digital_driver_get_event(u8 id);

#endif /* end __KEY_H */
/*****************************************************************************
**                            End Of File
******************************************************************************/
