zstack中事件加入到任务的方式

关于任务的初始化和处理 函数,前面的文章已经讲述的很清楚了,这里就不再啰嗦了。

在zstack的协议栈中一个任务下最多可以15个事件(除去系统的强制事件),那么这些事件是如何添加到任务中的呢?在这里我仅仅探讨一些用户自己的任务下的事件是如何添加的,至于APS层和网络层,这里暂不做过多的讲解。

先给出实现的两种方式,我仅仅知道两种方式,至于其他的方式暂且不知道,欢迎大家进行补充和指教。

1、 osal_set_event();使用这个函数,至于如何调用,大家看看介绍就知道了。这个函数在用户的任务初始化程序中添加。当所有的基本参数(端点,任务id,描述符等等)配置完毕后,调用这个函数。一般会放在最后一句。

2、在用户处理函数中添加。且看如下代码:

if ( events & SYS_EVENT_MSG )

{

MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( SampleApp_TaskID );

while ( MSGpkt )

{

switch ( MSGpkt->hdr.event )

{

// Received when a key is pressed

case KEY_CHANGE:

SampleApp_HandleKeys( ((keyChange_t *)MSGpkt)->state, ((keyChange_t *)MSGpkt)->keys );

break;

// Received when a messages is received (OTA) for this endpoint

case AF_INCOMING_MSG_CMD:

SampleApp_MessageMSGCB( MSGpkt );

break;

// Received whenever the device changes state in the network

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

{

// Start sending the periodic message in a regular interval.

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;

}

在我的工程文件中,我的任务处理事件函数为uint16 SampleApp_ProcessEvent( uint8 task_id, uint16 events );

在这个函数里面可以看到上面的代码。注意看彩色的部分,可以看到当取出事件的消息后,消息中有一个为ZDO_STATE_CHANGE的消息,当节点加入网络后,节点的状态将会发生变化,这个时候这个消息就会被加入到系统消息事件的队列中,当执行用户事件的时候,这个消息就会被处理,然后就执行下面的

osal_start_timerEx( SampleApp_TaskID,

SAMPLEAPP_SEND_PERIODIC_MSG_EVT,

SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT );

这个函数执行后,相应的事件就会加入到任务中。大家看看这个函数的定义就清楚了。第一个参数是对应任务的id,第二个参数是对应的事件id,第三个是对应事件的查询时间。

在原始程序中,并没有用到osal_set_event函数,而是用状态消息改变来处理的。

后来我修改了很虚,在初始化任务的函数中,我加入了osal_set_event这个函数,而将消息处理的处理路由器的那个位置可屏蔽掉,实验结果时一样的,路由器和协调器之间正常通信。

当我不加入osal_set_event这个函数的时候,并且将路由器那个判断语句给屏蔽掉,结果无法正常通信。因此,实验结果证明,osal_set_event确实将事件添加到任务中去了。

图片以后又机会再加上了。

时间: 2024-08-08 09:27:52

zstack中事件加入到任务的方式的相关文章

JS中事件绑定的三种方式

以下是搜集的在JS中事件绑定的三种方式. 1. HTML onclick attribute <button type="button" id="upload" onclick="upload_file();"> 原文: http://www.w3school.com.cn/jsref/jsref_events.asp 2. jQuery .on() $(node).on("change", function(e)

ZStack中的编程技巧

1. 像函数一样使用的宏 //这个宏,用来被其他宏使用,构造一个正确有效的表达式.这个适合于一些离散语句的组合,不适合函数的重新命名 #define st(x)      do { x } while (__LINE__ == -1) 例如:#define aps_GroupsRemaingCapacity() ( APS_MAX_GROUPS - aps_CountAllGroups() ) 上述的这个宏,调用的其他函数来实现其功能,因此,不适合使用st()宏. 使用场景:  aps_Grou

Android的按钮单击事件及监听器的实现方式

第一种:匿名内部类作为事件监听器类 第二种:内部类作为监听器 第三种:Activity本身作为事件监听器 第四种:外部类作为监听器 当用户单击button按钮时,程序将会触发MyButtonListener监听器外部MyButtonListener类 使用顶级类定义事件监听器类的形式比较少见,主要因为如下两个原因:1.事件监听器通常属于特定的gui界面,定义成外部类不篮球提高程序的内聚性.2.外部类形式的事件监听器不能自由访问创建gui界面的类中的组件,编程不够简洁.但如果某个事件监听器确实需要

Z-Stack中SimpleApp开关结点加入网络流程

(1)开关结点初始化 这时选择的节点类型是终端节点,所以使用f8wEndev.cfg文件,所以在Zglobals.h文件中,我们可以得到下面的定义 #define ZG_DEVICETYPE_ENDDEVICE        0x02 #define DEVICE_LOGICAL_TYPE   ZG_DEVICETYPE_ENDDEVICE uint8 zgDeviceLogicalType = DEVICE_LOGICAL_TYPE; 开关节点的 IAR 工程配置选项中定义了阻止自定义启动,即

jQuery中事件绑定

一.前言 最近在做项目中要用到jQuery来绑定事件,首先想到的是$(selector).事件名();这样绑定事件的方式,这种方式对事件进行绑定其实也就是bind()方法,但当选择器匹配的元素过多,$(selector).事件名();对每个元素进行迭代绑定,会影响性能.除了这种方式可以绑定事件以外,还有live()(已过期).delegate().on()方法绑定事件,接下来分析一下它们的区别,以及使用哪种方式最值得推荐.由于live()方法已过期,只分析另外三种,欢迎拍砖.吐槽~~~ 二.用法

【JS】Js中函数的三种调用方式

在同一个页面中,函数名必须是唯一的,并且区分大小写.Js中可以通过下面三种方式调用函数: 1. 函数的简单调用 2. 在事件的响应中调用函数 3. 通过连接调用函数 具体是怎么操作的呢,下面一一讲解: 函数的简单调用:函数的定义语句通畅被放在HTML文件的<head>内,而函数的调用语句通常被放在<body>中.如果函数定义之前调用函数,执行将会出错. 语法如下: <head> <script type="text/javascript">

DataGridView 中添加CheckBox和常用处理方式 .

DataGridView 中添加CheckBox和常用处理方式 文章1 转载:http://blog.csdn.net/pinkey1987/article/details/5267934 DataGridView中添加CheckBox控件主要采用两种方法 1.  通过在DataGridView的Columns中添加System.Windows.Forms.DataGridViewCheckBoxColumn类型的列.并可以设置该列相关的属性信息. 2. 在程序代码中直接添加相应的代码 Syst

JavaScript中事件回顾

事件其实在第一次学习JavaScript的时候就接触了,一行非常简单的代码 alert('Hello JavaScript!!!')就诠释了什么是事件.事件是什么呢?事件在基于浏览器编程的语言JavaScript中是一个非常非常重要的方法,遍地都是这种语法.什么是事件呢?在JavaScript中事件可以理解为发生的一件事情,事件这个对象记录了这个过程中所有的数据. 1.事件的兼容性处理 准所周知,现在很多浏览器中分为标准浏览器阵营Chrome.FireFox等,非标准浏览器就是IE为代表了,在写

jQuery中的Ajax几种请求方式

1. load( url, [data], [callback] ) :载入远程 HTML 文件代码并插入至 DOM 中. url (String) : 请求的HTML页的URL地址. data (Map) : (可选参数) 发送至服务器的 key/value 数据. callback (Callback) : (可选参数) 请求完成时(不需要是success的)的回调函数. 这个方法默认使用 GET 方式来传递的,如果[data]参数有传递数据进去,就会自动转换为POST方式的.jQuery