#ifndef KEY_H_
#define KEY_H_

#include "stdint.h"



#define KEY_TEST1_Status	GPIOB_ReadPortPin(GPIO_Pin_20)
#define KEY_TEST2_Status	GPIOB_ReadPortPin(GPIO_Pin_19)
#define KEY_TEST3_Status	GPIOB_ReadPortPin(GPIO_Pin_18)


#define KEY_PRESS               0x00	
#define KEY_LOOSEN              0x01
#define KEY_DELAY_COUNT         2
#define KEY_DELAY_COUNT_LONG    100 

typedef enum
{
    KEY_CH1,
    KEY_CHN_MAX,
}KEY_CHN_e;

typedef enum
{
    KEY_STA_S0 = 0,
    KEY_STA_S1 = 1,
    KEY_STA_S2 = 2,
}KEY_STA_e;

typedef enum
{
    KEY_VAL_NOT,                    //没按下
    KEY_VAL_SHORT_PRESS,            //单击
    KEY_VAL_CONT_LONG_PRESS,        //连续长按
    KEY_VAL_SINGLE_LONG_PRESS,      //长按单击
    KEY_VAL_LONG_PRESS_LOOSEN,      //长按松开
}KEY_VAL_e;

typedef struct
{
    uint8_t KEY_STA[KEY_CHN_MAX];
    uint8_t key_val[KEY_CHN_MAX];            //0:没动作,    1:短按松开, 2:长按连击,  3:长按松开
    uint8_t key_longPress[KEY_CHN_MAX];      //0:没动作,    1:长按单击
    uint8_t key_time[KEY_CHN_MAX];
    uint8_t delayCnt[KEY_CHN_MAX];
}KEY_t;


/****************复用IO定义*****************/
#define MultIO_OUTPUT		1
#define MultIO_INPUT		2

#define MultIO_Pin1			GPIO_Pin_11		//PB11
#define MultIO_Pin1_ModeCfg(x)		{ if(x == MultIO_OUTPUT){GPIOB_ModeCfg(MultIO_Pin1, GPIO_ModeOut_PP_20mA);}else if(x == MultIO_INPUT){GPIOB_ModeCfg(MultIO_Pin1, GPIO_ModeIN_PU);} }
#define MultIO_Pin1_H		GPIOB_SetBits(MultIO_Pin1)
#define MultIO_Pin1_L		GPIOB_ResetBits(MultIO_Pin1)
#define MultIO_Pin1_Read	GPIOB_ReadPortPin(MultIO_Pin1)		/* GPIOB端口引脚状态，0-引脚低电平，(!0)-引脚高电平 */

/*******************************************/

#define MultIO_OutPut_Time					5
#define MultIO_InPut_Time					12
#define MultIO_InPut_ScanTime				5
#define MultIO_Pin_High						0x01
#define MultIO_Pin_Low						0x00
#define MultIO_Input_PRESS					MultIO_Pin_Low
#define MultIO_Input_LOOSEN					MultIO_Pin_High
#define MultIO_Input_DELAY_COUNT			20
#define MultIO_Input_DELAY_COUNT_LONG		600

typedef enum
{
	MultIO_CH1,
	MultIO_CHN_Max,
}MultIO_Pin_CH_e;

/*按键相关定义*/
typedef enum
{
    INPUT_NOT,                    //没按下
    INPUT_SHORT_PRESS,            //单击
    INPUT_CONT_LONG_PRESS,        //长按
    INPUT_SINGLE_LONG_PRESS,      //长按单击
    INPUT_LONG_PRESS_LOOSEN,      //长按松开
}MULTIO_INPUT_VAL_e;

typedef enum
{
    INPUT_STA_S0 = 0,
    INPUT_STA_S1 = 1,
    INPUT_STA_S2 = 2,
}MULTIO_INPUT_STATE_e;

typedef enum
{
	MultIO_IDLE,
	MultIO_Input_Mode,
	MultIO_Output_Mode,
}MultIO_State_e;


typedef struct
{
	uint8_t State;		//状态机状态
	
	uint8_t reset_flag;		//复位标志
	
	uint8_t output_state[MultIO_CHN_Max];
	
	uint8_t input_state[MultIO_CHN_Max];
	uint8_t input_val[MultIO_CHN_Max];            //0:没动作,    1:短按松开, 2:长按连击,  3:长按松开
	uint8_t last_input_val[MultIO_CHN_Max];
	uint8_t delayCnt[MultIO_CHN_Max];
	uint8_t delayOffCnt[MultIO_CHN_Max];

	uint16_t input_time[MultIO_CHN_Max];
	
	uint32_t wait_tick;
	
}MultIO_State_t;


void Key_Init(void);


void Multipexing_IO_Init(void);
void Multipexing_IO_Task(void);





#endif
