#define D_CHECK_FLIP_COVER_TIMES 5 // 由于hs_poll_gpio函数是以100ms的周期被调用,这里的5表示5次polling的结果都是高电平,即滑盖open
#define D_FLIP_COVER_IS_OPEN TRUE
#define D_FLIP_COVER_IS_CLOSED FALSE
//这个宏定义很重要,用来指示前面几次polling 的结果是否都相同,比如检测5次,则D_CHECK_FLIP_COVER_MASK= 1<<5 -1 =0x1f=0x11111
#define D_CHECK_FLIP_COVER_MASK ((1<<D_CHECK_FLIP_COVER_TIMES)-1)
#define D_FLIP_COVER_OPEN D_CHECK_FLIP_COVER_MASK
#define D_FLIP_COVER_CLOSED 0
static uint32 stFlipcoverCheckTimes = 0;
static boolean hs_cover_on = D_FLIP_COVER_IS_CLOSED;
// code:
cover_on = HS_COVER_ON(); //读取GPIO,判断高低电平
if (cover_on == D_FLIP_COVER_IS_OPEN)
stFlipcoverCheckTimes = (stFlipcoverCheckTimes << 1) | 0x00000001; //如果是高电平,表示向上滑(open),并记录次数
else // cover_on == D_FLIP_COVER_IS_CLOSED
stFlipcoverCheckTimes = (stFlipcoverCheckTimes << 1) | 0x00000000; //如果是低电平,表示向下滑(close),
cover_on = hs_cover_on;
if ((stFlipcoverCheckTimes & D_CHECK_FLIP_COVER_MASK) == D_FLIP_COVER_OPEN) //如果前面几次都是高电平,则可以判断滑盖open
cover_on = D_FLIP_COVER_IS_OPEN;
else if ((stFlipcoverCheckTimes & D_CHECK_FLIP_COVER_MASK) == D_FLIP_COVER_CLOSED)
cover_on = D_FLIP_COVER_IS_CLOSED;
if ( cover_on != hs_cover_on )
{
hs_cover_on = cover_on; /* Invert the state */
if (cover_on==D_FLIP_COVER_IS_OPEN)
{
cover_key = (byte)HS_FLIP_OPEN_K;
}
else // cover_on == D_FLIP_COVER_IS_CLOSED
{
cover_key = (byte)HS_FLIP_CLOSE_K;
}
/* Pass key to show that the state changed, open/close
*/
KEYPAD_PASS_KEY_CODE( cover_key, HS_NONE_K );
KEYPAD_PASS_KEY_CODE( HS_RELEASE_K, cover_key );