原创 【原创】ZigBee学习之36——simpleapp分析-续

2010-2-17 23:57 3369 3 3 分类: MCU/ 嵌入式

根据【sapi.c】中任务队列中有两个任务是接收按键事件的,如果有按键发生就会分别调用这个两个事件处理函数。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


const pTaskEventHandlerFn tasksArr[] = {


…………


  Hal_ProcessEvent,


…………


  SAPI_ProcessEvent


};


Hal_ProcessEvent调用HalKeyPoll读取按键值到keys变量中,然后调用回调函数OnBoard_KeyCallback ,在回调函数中调用OnBoard_SendKeys 给应用发送键值,在此函数中会构造消息数据包,并且将硬件的按键事件打包成KEY_CHANGE 系统消息来发送,osal_msg_send发送消息,将消息放到系统消息队列中,然后调用osal_set_event为指定的任务设置系统事件SYS_EVENT_MSG,所以在系统事件队列tasksEvents中为此任务增加了一个SYS_EVENT_MSG系统事件。任务循环就可以检测到事件队列非空,就可以调用相应的任务处理函数了。这也是整个Zstack协议栈的执行流程。 SAPI_ProcessEvent是这个简单例子的事件处理任务,约line760处,检测按键改变事件并调用按键处理函数


        case KEY_CHANGE:


          zb_HandleKeys( ((keyChange_t *)pMsg)->state, ((keyChange_t *)pMsg)->keys );


          break;


如果是第一次运行应用,并且按下HAL_KEY_SW_1则将此器件配置成协调器并且使用自动启动:


………………


logicalType = ZG_DEVICETYPE_COORDINATOR;


zb_WriteConfiguration(ZCD_NV_LOGICAL_TYPE, sizeof(uint8), &logicalType);


……………………


        startOptions = ZCD_STARTOPT_AUTO_START;


        zb_WriteConfiguration( ZCD_NV_STARTUP_OPTION, sizeof(uint8), &startOptions );


        zb_SystemReset();//使用看门狗强制复位系统


如果应用不是初始化阶段就允许绑定,并且闪烁LED1,这个判断通过标志myAppState来指定。


        zb_AllowBind( 0xFF );


        HalLedSet( HAL_LED_1, HAL_LED_MODE_ON );


void zb_AllowBind ( uint8 timeout )


{


  osal_stop_timerEx(sapi_TaskID, ZB_ALLOW_BIND_TIMER);


 


  if ( timeout == 0 )


  {//超时时间设为0好像是停止了绑定允许,不响应ZDO匹配描述请求


    afSetMatch(sapi_epDesc.simpleDesc->EndPoint, FALSE);


  }


  else


  {


afSetMatch(sapi_epDesc.simpleDesc->EndPoint, TRUE);


//允许响应ZDO匹配描述请求


    if ( timeout != 0xFF )


    {


      if ( timeout > 64 )


      {


        timeout = 64;


      }//最大的超时时间是64


      osal_start_timerEx(sapi_TaskID, ZB_ALLOW_BIND_TIMER, timeout*1000);


//为此任务启动系统时钟,相当于启动任务了,等待64S,如果一直没有绑定请求的话会发送ZB_ALLOW_BIND_TIMER事件,指示绑定失败


    }


  }


  return;


}

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
3
关闭 站长推荐上一条 /3 下一条