本篇博客介绍ember zigbee的custom event的用法,ember zigbee application framework提供事件机制,通过事件,你可以控制一个事件发生的具体时间。那么该如何使用事件?请看下面介绍:
一个custom event有两部分构成:
1、custom event执行函数(event function):当事件时间到了就会执行该函数,你可以在这个函数添加需要执行的代码;
2、custom event结构体(EmberEventControl struct):它用来管理事件的时间,它的定义如下:
typedef struct {
/** The event's status, either inactive or the units for timeToExecute. */
EmberEventUnits status;
/** The id of the task this event belongs to. */
EmberTaskId taskid;
/** How long before the event fires.
* Units are always in milliseconds
*/
int32u timeToExecute;
} EmberEventControl;
status用来记录事件的状态是非激活状态还是延时执行,taskid每个事件都有一个事件ID,timeToExecute下一次事件执行还需要等待的时间
要使用custom event首先要创建一个custom event,在app builder的include选项卡中添加自己的custom事件如下图:
点击new,就能创建一个custom event,如图·costomEventControl为事件控制结构体名,customEventFunction为时间执行函数(当然你也可以根据自己需要更改名字)。点击生成后你可以在你工程名文件的callback中看到:
// Event control struct declarations
EmberEventControl customEventControl;
// Event function forward declarations
void customEventFunction(void);
// Event function stubs
void customEventFunction(void)
{
}
事件创建以后如何激活事件,可以调用下面的API(详见event.h):
emberEventControlSetActive(control)
激活事件,control为事件控制结构体名,如要激活上面建的事件,就可以emberEventControlSetActive(customEventControl),注意这个函数只是激活事件但是没有指定事件下次执行的的时间,所以他会以最快的周期执行事件
emberEventControlSetInactive(control)
将已激活的事件置回到未激活的状态,那么事件将不再执行,直到再次激活该事件
emberEventControlGetActive(control)
获取事件的状态,知道事件是否激活
emberEventControlSetDelayMS(control, delay)
该函数也用于激活事件但是它有指定多少ms以后执行事件,如emberEventControlSetDelayMS(customEventControl,100)表示100ms后执行事件
emberEventControlSetDelayQS(control, delay)
该函数同上一个函数类似,只是时间单位为1/4s,emberEventControlSetDelayQS(customEventControl,100)表示25s后执行事件
emberEventControlSetDelayMinutes(control, delay)
该函数同上一个函数类似,只是时间单位为分钟,emberEventControlSetDelayMinutes(customEventControl,100)表示100分钟后执行事件
emberEventControlGetRemainingMS(control)
该函数用于获取事件的执行还需要等待的时间
用法举例:我需要一个时间每100ms执行一次,如下:
首先在初始化中激活该事件,通常初始化在emberAfMainInitCallback中进行:
void emberAfMainInitCallback(void)
{
.........
emberEventControlSetActive(customEventControl);//激活事件
}
在事件函数中处理如下:
void customEventFunction(void)
{
.........
emberEventControlSetDelayMS(customEventControl,100);//设置下次执行的时间为100ms以后,需要注意的是如果在这里你不设置下次执行的时间那么它会以最快的周期执行
}