zigbee 是怎样注册,产生,处理 按键事件的?

本文介绍了一个按键事件处理机制,详细解析了如何通过注册任务来接收按键事件,并在应用层处理这些事件。具体包括按键事件的注册、消息发送及事件处理等关键步骤。

当硬件有按键按下时调用

uint8 OnBoard_SendKeys( uint8 keys, uint8 state )
{
  keyChange_t *msgPtr;


  if ( registeredKeysTaskID != NO_TASK_ID )
  {
    // Send the address to the task
    msgPtr = (keyChange_t *)osal_msg_allocate( sizeof(keyChange_t) );
    if ( msgPtr )
    {
      msgPtr->hdr.event = KEY_CHANGE;
      msgPtr->state = state;
      msgPtr->keys = keys;


      osal_msg_send( registeredKeysTaskID, (uint8 *)msgPtr );
    }
    return ( ZSuccess );
  }
  else
    return ( ZFailure );
}

调用osal_msg_send( registeredKeysTaskID, (uint8 *)msgPtr );  将消息发送个任务registeredKeysTaskID;

按键事件能且只能在一个任务中注册;我们看看registeredKeysTaskID他是在被注册到哪个任务中去了;

uint8 RegisterForKeys( uint8 task_id )
{
  // Allow only the first task
  if ( registeredKeysTaskID == NO_TASK_ID )
  {
    registeredKeysTaskID = task_id;
    return ( true );
  }
  else
    return ( false );
}

GenericApp.c中我们看到 按键事件被注册到APP任务中;

RegisterForKeys( GenericApp_TaskID );


总结下按键事件:

在应用程序中,用户将按键事件注册到应用层任务中, 当硬件检测到有按键事件发生时,将消息发送个应用层的任务ID交由应用程序处理;

UINT16 GenericApp_ProcessEvent( byte task_id, UINT16 events )
{if ( events & SYS_EVENT_MSG )
  {
    MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( GenericApp_TaskID );
    while ( MSGpkt )
    {
      switch ( MSGpkt->hdr.event )
      {

case KEY_CHANGE:
          GenericApp_HandleKeys( ((keyChange_t *)MSGpkt)->state, ((keyChange_t *)MSGpkt)->keys );
          break;

  osal_msg_deallocate( (uint8 *)MSGpkt );


      // Next
      MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( GenericApp_TaskID );
    }


    // return unprocessed events
    return (events ^ SYS_EVENT_MSG);
  }



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值