#ifndef __HAL_KEY_HANDLE_H__
#define __HAL_KEY_HANDLE_H__



typedef struct _key_event_msg_t {
    uint32_t key_code;
    uint8_t  key_type;
}key_event_msg_t;


//key state
#define HOME_KEY_BIT   	0x08
#define ENTER_KEY_BIT  	0x10
#define UP_KEY_BIT  	0x20
#define DOWN_KEY_BIT  	0x40
#define END_KEY_BIT  	0x80

#define HOME_ENTER_BIT  HOME_KEY_BIT|ENTER_KEY_BIT
#define HOME_UP_BIT  	HOME_KEY_BIT|UP_KEY_BIT
#define HOME_DOWN_BIT 	HOME_KEY_BIT|DOWN_KEY_BIT
#define HOME_END_BIT  	HOME_KEY_BIT|END_KEY_BIT

#define ENTER_UP_BIT  	ENTER_KEY_BIT|UP_KEY_BIT
#define ENTER_DOWN_BIT 	ENTER_KEY_BIT|DOWN_KEY_BIT
#define ENTER_END_BIT  	ENTER_KEY_BIT|END_KEY_BIT

#define UP_DOWN_BIT 	UP_KEY_BIT|DOWN_KEY_BIT
#define UP_END_BIT  	UP_KEY_BIT|END_KEY_BIT

#define DOWN_END_BIT  	DOWN_KEY_BIT|END_KEY_BIT



#define SHORT_KEY_BIT  	0x01
#define MULTI_KEY_BIT  	0x02
#define LONG_KEY_BIT  	0x04


  

//keycode
#define KEY_CODE_HOME 		HOME_KEY_BIT|SHORT_KEY_BIT    //0000 1001   0x09
#define KEY_CODE_ENTER 		ENTER_KEY_BIT|SHORT_KEY_BIT	  //0001 0001	  0x11
#define KEY_CODE_UP 		UP_KEY_BIT|SHORT_KEY_BIT	  //0010 0001	  0x21
#define KEY_CODE_DOWN 		DOWN_KEY_BIT|SHORT_KEY_BIT	  //0100 0001   0x41
#define KEY_CODE_END 		END_KEY_BIT|SHORT_KEY_BIT	  //1000 0001	  0x81

#define KEY_CODE_2HOME 		HOME_KEY_BIT|MULTI_KEY_BIT
#define KEY_CODE_2ENTER 	ENTER_KEY_BIT|MULTI_KEY_BIT
#define KEY_CODE_2UP 		UP_KEY_BIT|MULTI_KEY_BIT
#define KEY_CODE_2DOWN 		DOWN_KEY_BIT|MULTI_KEY_BIT
#define KEY_CODE_2END 		END_KEY_BIT|MULTI_KEY_BIT

#define KEY_CODE_LONG_HOME 		HOME_KEY_BIT|LONG_KEY_BIT
#define KEY_CODE_LONG_ENTER 	ENTER_KEY_BIT|LONG_KEY_BIT
#define KEY_CODE_LONG_UP 		UP_KEY_BIT|LONG_KEY_BIT
#define KEY_CODE_LONG_DOWN 		DOWN_KEY_BIT|LONG_KEY_BIT
#define KEY_CODE_LONG_END 		END_KEY_BIT|LONG_KEY_BIT




#define KEY_CODE_COMB_HOME_ENTER 		((LV_KEY_HOME|LV_KEY_ENTER)|SHORT_KEY_BIT)
#define KEY_CODE_COMB_HOME_UP 			((LV_KEY_HOME|LV_KEY_PREV)|SHORT_KEY_BIT)
#define KEY_CODE_COMB_HOME_DOWN 		((LV_KEY_HOME|LV_KEY_NEXT)|SHORT_KEY_BIT)
#define KEY_CODE_COMB_HOME_END 			((LV_KEY_HOME|LV_KEY_END)|SHORT_KEY_BIT)



#define KEY_CODE_COMB_ENTER_UP 			((LV_KEY_ENTER|LV_KEY_PREV)|SHORT_KEY_BIT)
#define KEY_CODE_COMB_ENTER_DOWN 		((LV_KEY_ENTER|LV_KEY_NEXT)|SHORT_KEY_BIT)
#define KEY_CODE_COMB_ENTER_END 		((LV_KEY_ENTER|LV_KEY_END)|SHORT_KEY_BIT)


#define KEY_CODE_COMB_UP_DOWN 			((LV_KEY_PREV|LV_KEY_NEXT)|SHORT_KEY_BIT)
#define KEY_CODE_COMB_UP_END 			((LV_KEY_PREV|LV_KEY_END)|SHORT_KEY_BIT)


#define KEY_CODE_COMB_DOWN_END 			((LV_KEY_NEXT|LV_KEY_END)|SHORT_KEY_BIT)

#define KEY_CODE_LONG_COMB_HOME_ENTER	((LV_KEY_HOME|LV_KEY_ENTER)|LONG_KEY_BIT)
#define KEY_CODE_LONG_COMB_HOME_UP		((LV_KEY_HOME|LV_KEY_PREV)|LONG_KEY_BIT)
#define KEY_CODE_LONG_COMB_HOME_DOWN	((LV_KEY_HOME|LV_KEY_NEXT)|LONG_KEY_BIT)
#define KEY_CODE_LONG_COMB_HOME_END		((LV_KEY_HOME|LV_KEY_END)|LONG_KEY_BIT)	
#define KEY_CODE_LONG_COMB_ENTER_UP		((LV_KEY_ENTER|LV_KEY_PREV)|LONG_KEY_BIT)	
#define KEY_CODE_LONG_COMB_ENTER_DOWN	((LV_KEY_ENTER|LV_KEY_NEXT)|LONG_KEY_BIT)	
#define KEY_CODE_LONG_COMB_ENTER_END	((LV_KEY_ENTER|LV_KEY_END)|LONG_KEY_BIT)
#define KEY_CODE_LONG_COMB_UP_DOWN 		((LV_KEY_PREV|LV_KEY_NEXT)|LONG_KEY_BIT)
#define KEY_CODE_LONG_COMB_UP_END 		((LV_KEY_PREV|LV_KEY_END)|LONG_KEY_BIT)
#define KEY_CODE_LONG_COMB_DOWN_END 	((LV_KEY_NEXT|LV_KEY_END)|LONG_KEY_BIT)	
#define KEY_CODE_NONE         0



//keyevent

typedef enum {
	KEY_EVENT_NONE,
    KEY_EVENT_PRESSED,
    KEY_EVENT_DOUBLE_PRESSED,
    KEY_EVENT_LONG_PRESSED,	
    KEY_EVENT_COMB_PRESSED,
    KEY_EVENT_MAX 
}e_key_event_type;


extern uint16_t get_lv_key_task_id(void);
extern uint8_t get_keycode_type_bit();
extern uint8_t get_keycode();
extern void reset_keycode();


#endif

