SAMPLEAPP 程序主要说明

 

SAMPLEAPP程序主要说明

2012-05-0310:12:54|分类:zigbee | 标签: |字号大中小订阅

SAMPLEAPP 程序主要说明 
2012-05-03 10:12:54| 分类: zigbee | 标签: |字号大中小 订阅 

程序执行流程如下:
(ZMain.c的)main()--->
1)---->(osal.c的)osal_init_system()---->(OSAL_SampleApp.c的)osalInitTasks()之后执行(SampleApp.c的)SampleApp_Init()
2)---->(osal.c的)osal_start_system()---->osal_run_system();---->events = (tasksArr[idx])( idx, events );进入
tasksArr中---->SampleApp_ProcessEvent
SampleApp_ProcessEvent(),进行应用层事件检测
两个关键函数
1.SampleApp_Init
2.SampleApp_ProcessEvent
分析如下
SampleApp_init
void SampleApp_Init( uint8 task_id )
{
//osal应用层的任务ID赋值
SampleApp_TaskID = task_id;
//设备状态设定为ZDO层中定义的初始化状态
SampleApp_NwkState = DEV_INIT;
//定义消息ID
SampleApp_TransID = 0;
//后面的demo例子中用到这个编译选项
#if defined ( SOFT_START )
//如果选择了SOFT编译选项,则作为协调器启动
zgDeviceLogicalType = ZG_DEVICETYPE_COORDINATOR;
#endif // SOFT_START
//如果定义了HOLD_AUTO_START选项,则调用层的ZDOInitDevice,按照默认顺 
//序网络中的第一个设备作为协调器,其他的设备作为子设备
#if defined ( HOLD_AUTO_START )
ZDOInitDevice(0);
#endif
//定义广播地址
//地址模式
SampleApp_Periodic_DstAddr.addrMode = (afAddrMode_t)AddrBroadcast;
//指定端点号
SampleApp_Periodic_DstAddr.endPoint = SAMPLEAPP_ENDPOINT



//指定目的网络地址为广播地址
SampleApp_Periodic_DstAddr.addr. shortAddr = 0xFFFF;
// 设定flash中命令即按键命令要发送的目的地址
SampleApp_Flash_DstAddr.addrMode = (afAddrMode_t)afAddrGroup;
SampleApp_Flash_DstAddr.endPoint = SAMPLEAPP_ENDPOINT;
SampleApp_Flash_DstAddr.addr.shortAddr = SAMPLEAPP_FLASH_GROUP;
// 定义本设备用来通信的APS层端点描述符
//端点号
SampleApp_epDesc.endPoint = SAMPLEAPP_ENDPOINT;
//任务ID
SampleApp_epDesc.task_id = &SampleApp_TaskID;
//简单描述符
SampleApp_epDesc.simpleDesc
= (SimpleDescriptionFormat_t *)&SampleApp_SimpleDesc;
//延时策略
SampleApp_epDesc.latencyReq = noLatencyReqs;
// 向AF层注册端点描述符
afRegister( &SampleApp_epDesc );
// 向osal层注册按键消息
RegisterForKeys( SampleApp_TaskID );
// 设定一个新的组
//组号
SampleApp_Group.ID = 0x0003;
//设定组名
osal_memcpy( SampleApp_Group.name, "Group 3", 7 );
//把该组添加到网络中
aps_AddGroup( SAMPLEAPP_ENDPOINT, &SampleApp_Group );
#if defined ( LCD_SUPPORTED )
//如果选择了LCD_SUPPORTED编译选项,会打印一串字符
Print8(HAL_LCD_LINE_2,20,"SampleApp",1);
#endif
}
uint16 SampleApp_ProcessEvent( uint8 task_id, uint16 events )
{
//定义应用层数据包
afIncomingMSGPacket_t *MSGpkt;
//判断osal层的消息类型
//如果系统消息到来
if ( events & SYS_EVENT_MSG )
{
//接收数据包
MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive(
SampleApp_TaskID );
//如果数据包不为空
while ( MSGpkt )
{
//判断消息类型
switch ( MSGpkt->hdr.event )
{
// 如果是按键消息
case KEY_CHANGE:
//调用按键处理函数
SampleApp_HandleKeys( ((keyChange_t *)MSGpkt)->state,
((keyChange_t *)MSGpkt)->keys );
break;
// 如果是别的组设备周期发送的消息
case AF_INCOMING_MSG_CMD:
//调用对周期消息的处理函数
SampleApp_MessageMSGCB( MSGpkt );
break;
// 如果是设备状态变换的命令
case ZDO_STATE_CHANGE:
//获取设备状态
SampleApp_NwkState = (devStates_t)(MSGpkt->hdr.status);
//如果是三种状态之一 
if ( (SampleApp_NwkState == DEV_ZB_COORD)
|| (SampleApp_NwkState == DEV_ROUTER)
|| (SampleApp_NwkState == DEV_END_DEVICE) )
{
// 按正常间隔启动一个定时器
osal_start_timerEx( SampleApp_TaskID,
SAMPLEAPP_SEND_PERIODIC_MSG_EVT,
SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT );
}
else
{
//设备不在网络中的不做任何处理
// Device is no longer in the network
}
break;
default:
break;
}
// 释放消息占用的存储区
osal_msg_deallocate( (uint8 *)MSGpkt );
// 判断操作系统层是否有未处理的数据包,继续处理缓冲区中的包
MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive(
SampleApp_TaskID );
}
//判断是否有未处理的系统消息,有则接收数据包,放到缓冲区一个个处理
return (events ^ SYS_EVENT_MSG);
}
// 判断是否有定时消息
if ( events & SAMPLEAPP_SEND_PERIODIC_MSG_EVT )
{
// 定时时间到发送一个消息
SampleApp_SendPeriodicMessage();
// 重新启动定时器
osal_start_timerEx( SampleApp_TaskID,
SAMPLEAPP_SEND_PERIODIC_MSG_EVT,
(SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT + (osal_rand() & 0x00FF))
);
// 判断是否有未处理的周期消息,有则继续处理
return (events ^ SAMPLEAPP_SEND_PERIODIC_MSG_EVT);
}
// 其它事件不予处理,直接返回
return 0;
}

https://wenku.baidu.com/view/3471740de87101f69e31953a.html?rec_flag=default&sxts=1526628176246

  • 6
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值