Z-Statk协调器 路由器 终端的确定 - Simple例程(一) frank 编(3)

2019-04-21 14:22

// If SW5 is pressed and held while powerup, force auto-start and nv-restore off and reset

//如果SW5按下,并且打开电源,强迫关闭自动启动,并且不从NV中读出参数,并重启

startOptions = ZCD_STARTOPT_CLEAR_STATE | ZCD_STARTOPT_CLEAR_CONFIG; //把默认的启动选项写入到NV中

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

zb_SystemReset();//并重新启动系统 }

#endif // HAL_KEY

// Set an event to start the application

osal_set_event(task_id, ZB_ENTRY_EVENT); }

我们看了一下startOptions选项表示的是什么意思。下面的代码在ZComDef.h文件中,

#define ZCD_STARTOPT_DEFAULT_CONFIG_STATE 0x01 #define ZCD_STARTOPT_DEFAULT_NETWORK_STATE 0x02 #define ZCD_STARTOPT_AUTO_START 0x04 #define

ZCD_STARTOPT_CLEAR_CONFIG ZCD_STARTOPT_DEFAULT_CONFIG_STATE #define

ZCD_STARTOPT_CLEAR_STATE ZCD_STARTOPT_DEFAULT_NETWORK_STATE

通过宏定义可以看出,他们都是默认的选项。可以看到在程序的最后启动了ZB_ENTRY_EVENT事件,

UINT16 SAPI_ProcessEvent( byte task_id, UINT16 events ) {

............................................ if ( events & ZB_ENTRY_EVENT ) {

uint8 startOptions;

// Give indication to application of device startup 这里这个函数是一空函数

zb_HandleOsalEvent( ZB_ENTRY_EVENT );

// LED off cancels HOLD_AUTO_START blink set in the stack HalLedSet (HAL_LED_4, HAL_LED_MODE_OFF);

//在上面当按下SW5按键后写入了默认的启动选项,这里进行了读取 zb_ReadConfiguration( ZCD_NV_STARTUP_OPTION, sizeof(uint8), &startOptions );

if ( startOptions & ZCD_STARTOPT_AUTO_START ) {

zb_StartRequest(); } else {

// blink leds and wait for external input to config and restart HalLedBlink(HAL_LED_2, 0, 50, 500); }

return (events ^ ZB_ENTRY_EVENT ); }

............................................ }

我们看一下ZCD_NV_STARTUP_OPTION的初始值是什么,在下面的函数中写入了ZCD_NV_STARTUP_OPTION的初始值,初始值为0.这个函数,在uint8 zgInit( void )中被调用。

uint8 zgReadStartupOptions( void ) {

// Default to Use Config State and Use Network State uint8 startupOption = 0;

// This should have been done in ZMain.c, but just in case. if ( osal_nv_item_init( ZCD_NV_STARTUP_OPTION, sizeof(startupOption),

&startupOption ) == ZSUCCESS ) {

// Read saved startup control

osal_nv_read( ZCD_NV_STARTUP_OPTION, 0,

sizeof( startupOption ), &startupOption); }

return ( startupOption ); }

由于#define ZCD_STARTOPT_AUTO_START 0x04所以下面的判断语句不成立,也就是没有执行zb_StartRequest();函数。 if ( startOptions & ZCD_STARTOPT_AUTO_START )

这时也就是网络没有形成,没有具体确定那个是协调器,还是作为路由器。下面就是通过应用程序的按键来确定。下面是灯设备,也就是SimpleController.c文件中的按键个事件的处理过程。

void zb_HandleKeys( uint8 shift, uint8 keys ) {

uint8 startOptions; uint8 logicalType;

// Shift is used to make each button/switch dual purpose. if ( shift ) {

if ( keys & HAL_KEY_SW_1 ) { }

if ( keys & HAL_KEY_SW_2 ) { }

if ( keys & HAL_KEY_SW_3 ) { }

if ( keys & HAL_KEY_SW_4 ) { } } else {

if ( keys & HAL_KEY_SW_1 ) {

if ( myAppState == APP_INIT )

{

// In the init state, keys are used to indicate the logical mode. // Key 1 starts device as a coordinator

//当按下按键1时,读取配置信息,通过读取NV中的ZCD_NV_LOGICAL_TYPE条目,判断设备的逻辑类型,

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

if ( logicalType != ZG_DEVICETYPE_ENDDEVICE ) {

logicalType = ZG_DEVICETYPE_COORDINATOR;

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

// Do more configuration if necessary and then restart device with auto-start bit set

// write endpoint to simple desc...dont pass it in start req..then reset

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

startOptions = ZCD_STARTOPT_AUTO_START;

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

zb_SystemReset();

} else {

// Initiate a binding

zb_AllowBind( myAllowBindTimeout ); } }

if ( keys & HAL_KEY_SW_2 ) {

if ( myAppState == APP_INIT ) {

// In the init state, keys are used to indicate the logical mode. // Key 2 starts device as a router

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

if ( logicalType != ZG_DEVICETYPE_ENDDEVICE ) {

logicalType = ZG_DEVICETYPE_ROUTER;

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

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

startOptions = ZCD_STARTOPT_AUTO_START;

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

zb_SystemReset(); } else { } }

if ( keys & HAL_KEY_SW_3 ) { }

if ( keys & HAL_KEY_SW_4 ) { } } }

在 ZGlobals.c文件中,我们可以找到ZCD_NV_LOGICAL_TYPE的初始值是什么?

static CONST zgItem_t zgItemTable[] = {

#if defined ( NV_INIT ) {


Z-Statk协调器 路由器 终端的确定 - Simple例程(一) frank 编(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:肝病科 非酒精性脂肪性肝炎中医临床路径(试行版)

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: