HengFeng

--博观而约取,厚积而薄发
  博客园  :: 首页  :: 新随笔  :: 联系 :: 管理

【原创】滑盖检测代码中的延时操作

Posted on 2009-07-13 15:20  hengfeng  阅读(355)  评论(0编辑  收藏  举报

 

#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 );