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