根据【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;
}
文章评论(0条评论)
登录后参与讨论