]> Gitweb @ Texas Instruments - Open Source Git Repositories - git.TI.com/gitweb - znp-host-framework/znp-host-framework.git/blob - examples/nwkTopology/nwkTopology.c
bfdd82482e3eb0692171eba3791e4aa45f0b184a
[znp-host-framework/znp-host-framework.git] / examples / nwkTopology / nwkTopology.c
1 /**************************************************************************************************\r
2  * Filename:       nwkTopology.c\r
3  * Description:    This file contains nwkTopology application.\r
4  *\r
5  *\r
6  * Copyright (C) 2013 Texas Instruments Incorporated - http://www.ti.com/\r
7  *\r
8  *\r
9  *  Redistribution and use in source and binary forms, with or without\r
10  *  modification, are permitted provided that the following conditions\r
11  *  are met:\r
12  *\r
13  *    Redistributions of source code must retain the above copyright\r
14  *    notice, this list of conditions and the following disclaimer.\r
15  *\r
16  *    Redistributions in binary form must reproduce the above copyright\r
17  *    notice, this list of conditions and the following disclaimer in the\r
18  *    documentation and/or other materials provided with the\r
19  *    distribution.\r
20  *\r
21  *    Neither the name of Texas Instruments Incorporated nor the names of\r
22  *    its contributors may be used to endorse or promote products derived\r
23  *    from this software without specific prior written permission.\r
24  *\r
25  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
26  *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
27  *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
28  *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
29  *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
30  *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
31  *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
32  *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
33  *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
34  *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
35  *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
36  *\r
37  */\r
38 \r
39 /*********************************************************************\r
40  * INCLUDES\r
41  */\r
42 #include <string.h>\r
43 #include <stdio.h>\r
44 #include <unistd.h>\r
45 #include <stdlib.h>\r
46 \r
47 #include "rpc.h"\r
48 #include "mtSys.h"\r
49 #include "mtZdo.h"\r
50 #include "mtAf.h"\r
51 #include "mtParser.h"\r
52 #include "mtSapi.h"\r
53 #include "rpcTransport.h"\r
54 #include "dbgPrint.h"\r
55 #include "hostConsole.h"\r
56 \r
57 /*********************************************************************\r
58  * MACROS\r
59  */\r
60 \r
61 #define MAX_CHILDREN 20\r
62 #define MAX_NODE_LIST 64\r
63 \r
64 /*********************************************************************\r
65  * TYPES\r
66  */\r
67 \r
68 /*********************************************************************\r
69  * LOCAL VARIABLE\r
70  */\r
71 \r
72 //init ZDO device state\r
73 devStates_t devState = DEV_HOLD;\r
74 uint8_t gSrcEndPoint = 1;\r
75 uint8_t gDstEndPoint = 1;\r
76 \r
77 /***********************************************************************/\r
78 \r
79 void usage(char* exeName)\r
80 {\r
81         consolePrint("Usage: ./%s <port>\n", exeName);\r
82         consolePrint("Eample: ./%s /dev/ttyACM0\n", exeName);\r
83 }\r
84 \r
85 /*********************************************************************\r
86  * LOCAL FUNCTIONS\r
87  */\r
88 //ZDO Callbacks\r
89 static uint8_t mtZdoStateChangeIndCb(uint8_t newDevState);\r
90 static uint8_t mtZdoMgmtLqiRspCb(MgmtLqiRspFormat_t *msg);\r
91 \r
92 //SYS Callbacks\r
93 \r
94 static uint8_t mtSysResetIndCb(ResetIndFormat_t *msg);\r
95 \r
96 //helper functions\r
97 static uint8_t setNVStartup(uint8_t startupOption);\r
98 static uint8_t setNVChanList(uint32_t chanList);\r
99 static uint8_t setNVPanID(uint32_t panId);\r
100 static uint8_t setNVDevType(uint8_t devType);\r
101 static int32_t startNetwork(void);\r
102 static int32_t registerAf(void);\r
103 \r
104 /*********************************************************************\r
105  * CALLBACK FUNCTIONS\r
106  */\r
107 \r
108 // SYS callbacks\r
109 static mtSysCb_t mtSysCb =\r
110         {\r
111                 //mtSysResetInd          //MT_SYS_RESET_IND\r
112                 NULL, NULL, NULL, mtSysResetIndCb, NULL, NULL, NULL, NULL, NULL,\r
113                 NULL, NULL, NULL, NULL, NULL };\r
114 \r
115 static mtZdoCb_t mtZdoCb =\r
116         { NULL,       // MT_ZDO_NWK_ADDR_RSP\r
117                 NULL,      // MT_ZDO_IEEE_ADDR_RSP\r
118                 NULL,      // MT_ZDO_NODE_DESC_RSP\r
119                 NULL,     // MT_ZDO_POWER_DESC_RSP\r
120                 NULL,    // MT_ZDO_SIMPLE_DESC_RSP\r
121                 NULL,      // MT_ZDO_ACTIVE_EP_RSP\r
122                 NULL,     // MT_ZDO_MATCH_DESC_RSP\r
123                 NULL,   // MT_ZDO_COMPLEX_DESC_RSP\r
124                 NULL,      // MT_ZDO_USER_DESC_RSP\r
125                 NULL,     // MT_ZDO_USER_DESC_CONF\r
126                 NULL,    // MT_ZDO_SERVER_DISC_RSP\r
127                 NULL, // MT_ZDO_END_DEVICE_BIND_RSP\r
128                 NULL,          // MT_ZDO_BIND_RSP\r
129                 NULL,        // MT_ZDO_UNBIND_RSP\r
130                 NULL,   // MT_ZDO_MGMT_NWK_DISC_RSP\r
131                 mtZdoMgmtLqiRspCb,       // MT_ZDO_MGMT_LQI_RSP\r
132                 NULL,       // MT_ZDO_MGMT_RTG_RSP\r
133                 NULL,      // MT_ZDO_MGMT_BIND_RSP\r
134                 NULL,     // MT_ZDO_MGMT_LEAVE_RSP\r
135                 NULL,     // MT_ZDO_MGMT_DIRECT_JOIN_RSP\r
136                 NULL,     // MT_ZDO_MGMT_PERMIT_JOIN_RSP\r
137                 mtZdoStateChangeIndCb,   // MT_ZDO_STATE_CHANGE_IND\r
138                 NULL,   // MT_ZDO_END_DEVICE_ANNCE_IND\r
139                 NULL,        // MT_ZDO_SRC_RTG_IND\r
140                 NULL,    //MT_ZDO_BEACON_NOTIFY_IND\r
141                 NULL,                    //MT_ZDO_JOIN_CNF\r
142                 NULL,    //MT_ZDO_NWK_DISCOVERY_CNF\r
143                 NULL,                    // MT_ZDO_CONCENTRATOR_IND_CB\r
144                 NULL,         // MT_ZDO_LEAVE_IND\r
145                 NULL,   //MT_ZDO_STATUS_ERROR_RSP\r
146                 NULL,  //MT_ZDO_MATCH_DESC_RSP_SENT\r
147                 NULL, NULL };\r
148 \r
149 typedef struct\r
150 {\r
151         uint16_t ChildAddr;\r
152         uint8_t Type;\r
153 \r
154 } ChildNode_t;\r
155 \r
156 typedef struct\r
157 {\r
158         uint16_t NodeAddr;\r
159         uint8_t Type;\r
160         uint8_t ChildCount;\r
161         ChildNode_t childs[MAX_CHILDREN];\r
162 } Node_t;\r
163 \r
164 Node_t nodeList[MAX_NODE_LIST];\r
165 uint8_t nodeCount = 0;\r
166 static uint8_t mtSysResetIndCb(ResetIndFormat_t *msg)\r
167 {\r
168 \r
169         consolePrint("ZNP Version: %d.%d.%d\n", msg->MajorRel, msg->MinorRel,\r
170                 msg->HwRev);\r
171         return 0;\r
172 }\r
173 \r
174 /********************************************************************\r
175  * START OF ZDO CALL BACK FUNCTIONS\r
176  */\r
177 \r
178 static uint8_t mtZdoStateChangeIndCb(uint8_t newDevState)\r
179 {\r
180 \r
181         switch (newDevState)\r
182         {\r
183         case DEV_HOLD:\r
184                 dbg_print(PRINT_LEVEL_INFO,\r
185                         "mtZdoStateChangeIndCb: Initialized - not started automatically\n");\r
186                 break;\r
187         case DEV_INIT:\r
188                 dbg_print(PRINT_LEVEL_INFO,\r
189                         "mtZdoStateChangeIndCb: Initialized - not connected to anything\n");\r
190                 break;\r
191         case DEV_NWK_DISC:\r
192                 dbg_print(PRINT_LEVEL_INFO,\r
193                         "mtZdoStateChangeIndCb: Discovering PAN's to join\n");\r
194                 consolePrint("Network Discovering\n");\r
195                 break;\r
196         case DEV_NWK_JOINING:\r
197                 dbg_print(PRINT_LEVEL_INFO, "mtZdoStateChangeIndCb: Joining a PAN\n");\r
198                 consolePrint("Network Joining\n");\r
199                 break;\r
200         case DEV_NWK_REJOIN:\r
201                 dbg_print(PRINT_LEVEL_INFO,\r
202                         "mtZdoStateChangeIndCb: ReJoining a PAN, only for end devices\n");\r
203                 consolePrint("Network Rejoining\n");\r
204                 break;\r
205         case DEV_END_DEVICE_UNAUTH:\r
206                 consolePrint("Network Authenticating\n");\r
207                 dbg_print(PRINT_LEVEL_INFO,\r
208                         "mtZdoStateChangeIndCb: Joined but not yet authenticated by trust center\n");\r
209                 break;\r
210         case DEV_END_DEVICE:\r
211                 consolePrint("Network Joined\n");\r
212                 dbg_print(PRINT_LEVEL_INFO,\r
213                         "mtZdoStateChangeIndCb: Started as device after authentication\n");\r
214                 break;\r
215         case DEV_ROUTER:\r
216                 consolePrint("Network Joined\n");\r
217                 dbg_print(PRINT_LEVEL_INFO,\r
218                         "mtZdoStateChangeIndCb: Device joined, authenticated and is a router\n");\r
219                 break;\r
220         case DEV_COORD_STARTING:\r
221                 consolePrint("Network Starting\n");\r
222                 dbg_print(PRINT_LEVEL_INFO,\r
223                         "mtZdoStateChangeIndCb: Started as Zigbee Coordinator\n");\r
224                 break;\r
225         case DEV_ZB_COORD:\r
226                 consolePrint("Network Started\n");\r
227                 dbg_print(PRINT_LEVEL_INFO,\r
228                         "mtZdoStateChangeIndCb: Started as Zigbee Coordinator\n");\r
229                 break;\r
230         case DEV_NWK_ORPHAN:\r
231                 consolePrint("Network Orphaned\n");\r
232                 dbg_print(PRINT_LEVEL_INFO,\r
233                         "mtZdoStateChangeIndCb: Device has lost information about its parent\n");\r
234                 break;\r
235         default:\r
236                 dbg_print(PRINT_LEVEL_INFO, "mtZdoStateChangeIndCb: unknown state");\r
237                 break;\r
238         }\r
239 \r
240         devState = (devStates_t) newDevState;\r
241 \r
242         return SUCCESS;\r
243 }\r
244 \r
245 static uint8_t mtZdoMgmtLqiRspCb(MgmtLqiRspFormat_t *msg)\r
246 {\r
247         uint8_t devType = 0;\r
248         uint8_t devRelation = 0;\r
249         uint8_t localNodeCount = nodeCount;\r
250         MgmtLqiReqFormat_t req;\r
251 \r
252         if (msg->Status == MT_RPC_SUCCESS)\r
253         {\r
254                 nodeCount++;\r
255                 nodeList[localNodeCount].NodeAddr = msg->SrcAddr;\r
256                 nodeList[localNodeCount].Type = (msg->SrcAddr == 0 ?\r
257                 DEVICETYPE_COORDINATOR :\r
258                                                                 DEVICETYPE_ROUTER);\r
259                 nodeList[localNodeCount].ChildCount = 0;\r
260                 uint32_t i;\r
261                 for (i = 0; i < msg->NeighborLqiListCount; i++)\r
262                 {\r
263                         devType = msg->NeighborLqiList[i].DevTyp_RxOnWhenIdle_Relat & 3;\r
264                         devRelation = ((msg->NeighborLqiList[i].DevTyp_RxOnWhenIdle_Relat\r
265                                 >> 4) & 7);\r
266                         if (devRelation == 1)\r
267                         {\r
268                                 uint8_t cCount = nodeList[localNodeCount].ChildCount;\r
269                                 nodeList[localNodeCount].childs[cCount].ChildAddr =\r
270                                         msg->NeighborLqiList[i].NetworkAddress;\r
271                                 nodeList[localNodeCount].childs[cCount].Type = devType;\r
272                                 nodeList[localNodeCount].ChildCount++;\r
273                                 if (devType == DEVICETYPE_ROUTER)\r
274                                 {\r
275                                         req.DstAddr = msg->NeighborLqiList[i].NetworkAddress;\r
276                                         req.StartIndex = 0;\r
277                                         zdoMgmtLqiReq(&req);\r
278                                 }\r
279                         }\r
280                 }\r
281         }\r
282         else\r
283         {\r
284                 consolePrint("MgmtLqiRsp Status: FAIL 0x%02X\n", msg->Status);\r
285         }\r
286 \r
287         return msg->Status;\r
288 }\r
289 \r
290 // helper functions for building and sending the NV messages\r
291 static uint8_t setNVStartup(uint8_t startupOption)\r
292 {\r
293         uint8_t status;\r
294         OsalNvWriteFormat_t nvWrite;\r
295         // sending startup option\r
296 \r
297         nvWrite.Id = ZCD_NV_STARTUP_OPTION;\r
298         nvWrite.Offset = 0;\r
299         nvWrite.Len = 1;\r
300         nvWrite.Value[0] = startupOption;\r
301         status = sysOsalNvWrite(&nvWrite);\r
302         dbg_print(PRINT_LEVEL_INFO, "\n");\r
303 \r
304         dbg_print(PRINT_LEVEL_INFO, "NV Write Startup Option cmd sent[%d]...\n",\r
305                 status);\r
306 \r
307         return status;\r
308 }\r
309 \r
310 static uint8_t setNVDevType(uint8_t devType)\r
311 {\r
312         uint8_t status;\r
313         OsalNvWriteFormat_t nvWrite;\r
314         // setting dev type\r
315         nvWrite.Id = ZCD_NV_LOGICAL_TYPE;\r
316         nvWrite.Offset = 0;\r
317         nvWrite.Len = 1;\r
318         nvWrite.Value[0] = devType;\r
319         status = sysOsalNvWrite(&nvWrite);\r
320         dbg_print(PRINT_LEVEL_INFO, "\n");\r
321         dbg_print(PRINT_LEVEL_INFO, "NV Write Device Type cmd sent... [%d]\n",\r
322                 status);\r
323 \r
324         return status;\r
325 }\r
326 \r
327 static uint8_t setNVPanID(uint32_t panId)\r
328 {\r
329         uint8_t status;\r
330         OsalNvWriteFormat_t nvWrite;\r
331 \r
332         dbg_print(PRINT_LEVEL_INFO, "\n");\r
333         dbg_print(PRINT_LEVEL_INFO, "NV Write PAN ID cmd sending...\n");\r
334 \r
335         nvWrite.Id = ZCD_NV_PANID;\r
336         nvWrite.Offset = 0;\r
337         nvWrite.Len = 2;\r
338         nvWrite.Value[0] = LO_UINT16(panId);\r
339         nvWrite.Value[1] = HI_UINT16(panId);\r
340         status = sysOsalNvWrite(&nvWrite);\r
341         dbg_print(PRINT_LEVEL_INFO, "\n");\r
342         dbg_print(PRINT_LEVEL_INFO, "NV Write PAN ID cmd sent...[%d]\n", status);\r
343 \r
344         return status;\r
345 }\r
346 \r
347 static uint8_t setNVChanList(uint32_t chanList)\r
348 {\r
349         OsalNvWriteFormat_t nvWrite;\r
350         uint8_t status;\r
351         // setting chanList\r
352         nvWrite.Id = ZCD_NV_CHANLIST;\r
353         nvWrite.Offset = 0;\r
354         nvWrite.Len = 4;\r
355         nvWrite.Value[0] = BREAK_UINT32(chanList, 0);\r
356         nvWrite.Value[1] = BREAK_UINT32(chanList, 1);\r
357         nvWrite.Value[2] = BREAK_UINT32(chanList, 2);\r
358         nvWrite.Value[3] = BREAK_UINT32(chanList, 3);\r
359         status = sysOsalNvWrite(&nvWrite);\r
360         dbg_print(PRINT_LEVEL_INFO, "\n");\r
361         dbg_print(PRINT_LEVEL_INFO, "NV Write Channel List cmd sent...[%d]\n",\r
362                 status);\r
363 \r
364         return status;\r
365 }\r
366 \r
367 static int32_t startNetwork(void)\r
368 {\r
369         char cDevType;\r
370         uint8_t devType;\r
371         int32_t status;\r
372         uint8_t newNwk = 0;\r
373         char sCh[128];\r
374 \r
375         do\r
376         {\r
377                 consolePrint("Do you wish to start/join a new network? (y/n)\n");\r
378                 consoleGetLine(sCh, 128);\r
379                 if (sCh[0] == 'n' || sCh[0] == 'N')\r
380                 {\r
381                         status = setNVStartup(0);\r
382                 }\r
383                 else if (sCh[0] == 'y' || sCh[0] == 'Y')\r
384                 {\r
385                         status = setNVStartup(\r
386                         ZCD_STARTOPT_CLEAR_STATE | ZCD_STARTOPT_CLEAR_CONFIG);\r
387                         newNwk = 1;\r
388 \r
389                 }\r
390                 else\r
391                 {\r
392                         consolePrint("Incorrect input please type y or n\n");\r
393                 }\r
394         } while (sCh[0] != 'y' && sCh[0] != 'Y' && sCh[0] != 'n' && sCh[0] != 'N');\r
395 \r
396         if (status != MT_RPC_SUCCESS)\r
397         {\r
398                 dbg_print(PRINT_LEVEL_WARNING, "network start failed\n");\r
399                 return -1;\r
400         }\r
401         consolePrint("Resetting ZNP\n");\r
402         ResetReqFormat_t resReq;\r
403         resReq.Type = 1;\r
404         sysResetReq(&resReq);\r
405         //flush the rsp\r
406         rpcWaitMqClientMsg(5000);\r
407 \r
408         if (newNwk)\r
409         {\r
410                 consolePrint(\r
411                         "Enter device type c: Coordinator, r: Router, e: End Device:\n");\r
412                 consoleGetLine(sCh, 128);\r
413                 cDevType = sCh[0];\r
414 \r
415                 switch (cDevType)\r
416                 {\r
417                 case 'c':\r
418                 case 'C':\r
419                         devType = DEVICETYPE_COORDINATOR;\r
420                         break;\r
421                 case 'r':\r
422                 case 'R':\r
423                         devType = DEVICETYPE_ROUTER;\r
424                         break;\r
425                 case 'e':\r
426                 case 'E':\r
427                 default:\r
428                         devType = DEVICETYPE_ENDDEVICE;\r
429                         break;\r
430                 }\r
431                 status = setNVDevType(devType);\r
432 \r
433                 if (status != MT_RPC_SUCCESS)\r
434                 {\r
435                         dbg_print(PRINT_LEVEL_WARNING, "setNVDevType failed\n");\r
436                         return 0;\r
437                 }\r
438                 //Select random PAN ID for Coord and join any PAN for RTR/ED\r
439                 status = setNVPanID(0xFFFF);\r
440                 if (status != MT_RPC_SUCCESS)\r
441                 {\r
442                         dbg_print(PRINT_LEVEL_WARNING, "setNVPanID failed\n");\r
443                         return -1;\r
444                 }\r
445                 consolePrint("Enter channel 11-26:\n");\r
446                 consoleGetLine(sCh, 128);\r
447 \r
448                 status = setNVChanList(1 << atoi(sCh));\r
449                 if (status != MT_RPC_SUCCESS)\r
450                 {\r
451                         dbg_print(PRINT_LEVEL_INFO, "setNVPanID failed\n");\r
452                         return -1;\r
453                 }\r
454 \r
455         }\r
456 \r
457         registerAf();\r
458         consolePrint("EndPoint: 1\n");\r
459 \r
460         status = zdoInit();\r
461         if (status == NEW_NETWORK)\r
462         {\r
463                 dbg_print(PRINT_LEVEL_INFO, "zdoInit NEW_NETWORK\n");\r
464                 status = MT_RPC_SUCCESS;\r
465         }\r
466         else if (status == RESTORED_NETWORK)\r
467         {\r
468                 dbg_print(PRINT_LEVEL_INFO, "zdoInit RESTORED_NETWORK\n");\r
469                 status = MT_RPC_SUCCESS;\r
470         }\r
471         else\r
472         {\r
473                 dbg_print(PRINT_LEVEL_INFO, "zdoInit failed\n");\r
474                 status = -1;\r
475         }\r
476 \r
477         dbg_print(PRINT_LEVEL_INFO, "process zdoStatechange callbacks\n");\r
478 \r
479         //flush AREQ ZDO State Change messages\r
480         while (status != -1)\r
481         {\r
482                 status = rpcWaitMqClientMsg(5000);\r
483 \r
484                 if (((devType == DEVICETYPE_COORDINATOR) && (devState == DEV_ZB_COORD))\r
485                         || ((devType == DEVICETYPE_ROUTER) && (devState == DEV_ROUTER))\r
486                         || ((devType == DEVICETYPE_ENDDEVICE)\r
487                                 && (devState == DEV_END_DEVICE)))\r
488                 {\r
489                         break;\r
490                 }\r
491         }\r
492         //set startup option back to keep configuration in case of reset\r
493         status = setNVStartup(0);\r
494         if (devState < DEV_END_DEVICE)\r
495         {\r
496                 //start network failed\r
497                 return -1;\r
498         }\r
499 \r
500         return 0;\r
501 }\r
502 \r
503 static int32_t registerAf(void)\r
504 {\r
505         int32_t status = 0;\r
506         RegisterFormat_t reg;\r
507 \r
508         reg.EndPoint = 1;\r
509         reg.AppProfId = 0x0104;\r
510         reg.AppDeviceId = 0x0100;\r
511         reg.AppDevVer = 1;\r
512         reg.LatencyReq = 0;\r
513         reg.AppNumInClusters = 1;\r
514         reg.AppInClusterList[0] = 0x0006;\r
515         reg.AppNumOutClusters = 0;\r
516 \r
517         status = afRegister(&reg);\r
518         return status;\r
519 }\r
520 \r
521 /*********************************************************************\r
522  * INTERFACE FUNCTIONS\r
523  */\r
524 uint32_t appInit(void)\r
525 {\r
526         int32_t status = 0;\r
527         uint32_t msgCnt = 0;\r
528 \r
529         //Flush all messages from the que\r
530         while (status != -1)\r
531         {\r
532                 status = rpcWaitMqClientMsg(10);\r
533                 if (status != -1)\r
534                 {\r
535                         msgCnt++;\r
536                 }\r
537         }\r
538 \r
539         dbg_print(PRINT_LEVEL_INFO, "flushed %d message from msg queue\n", msgCnt);\r
540 \r
541         //Register Callbacks MT system callbacks\r
542         sysRegisterCallbacks(mtSysCb);\r
543         zdoRegisterCallbacks(mtZdoCb);\r
544 \r
545         return 0;\r
546 }\r
547 \r
548 void* appProcess(void *argument)\r
549 {\r
550         int32_t status = 0;\r
551         //Flush all messages from the que\r
552         while (status != -1)\r
553         {\r
554                 status = rpcWaitMqClientMsg(50);\r
555         }\r
556         //init variable\r
557         devState = DEV_HOLD;\r
558         gSrcEndPoint = 1;\r
559         gDstEndPoint = 1;\r
560 \r
561         status = startNetwork();\r
562         if (status != -1)\r
563         {\r
564                 consolePrint("Network up\n\n");\r
565         }\r
566         else\r
567         {\r
568                 consolePrint("Network Error\n\n");\r
569         }\r
570 \r
571         sysGetExtAddr();\r
572 \r
573         OsalNvWriteFormat_t nvWrite;\r
574         nvWrite.Id = ZCD_NV_ZDO_DIRECT_CB;\r
575         nvWrite.Offset = 0;\r
576         nvWrite.Len = 1;\r
577         nvWrite.Value[0] = 1;\r
578         status = sysOsalNvWrite(&nvWrite);\r
579         status = 0;\r
580         char cmd[128];\r
581         MgmtLqiReqFormat_t req;\r
582         req.DstAddr = 0;\r
583         req.StartIndex = 0;\r
584         while (1)\r
585         {\r
586                 consolePrint("Press Enter to discover Network Topology:\n");\r
587 \r
588                 consoleGetLine(cmd, 128);\r
589                 nodeCount = 0;\r
590 \r
591                 zdoMgmtLqiReq(&req);\r
592                 while (status != -1)\r
593                 {\r
594                         status = rpcWaitMqClientMsg(1000);\r
595                 }\r
596                 status = 0;\r
597                 uint8_t i;\r
598                 for (i = 0; i < nodeCount; i++)\r
599                 {\r
600                         char *devtype = (\r
601                                 nodeList[i].Type == DEVICETYPE_ROUTER ?\r
602                                         "ROUTER" : "END DEVICE");\r
603                         if (nodeList[i].Type == DEVICETYPE_COORDINATOR)\r
604                         {\r
605                                 devtype = "COORDINATOR";\r
606                         }\r
607                         consolePrint("Node Address: 0x%04X   Type: %s\n",\r
608                                 nodeList[i].NodeAddr, devtype);\r
609 \r
610                         consolePrint("Children: %d\n", nodeList[i].ChildCount);\r
611                         uint8_t cI;\r
612                         for (cI = 0; cI < nodeList[i].ChildCount; cI++)\r
613                         {\r
614                                 uint8_t type = nodeList[i].childs[cI].Type;\r
615                                 consolePrint("\tAddress: 0x%04X   Type: %s\n",\r
616                                         nodeList[i].childs[cI].ChildAddr,\r
617                                         (type == DEVICETYPE_ROUTER ? "ROUTER" : "END DEVICE"));\r
618                         }\r
619                         consolePrint("\n");\r
620                 }\r
621         }\r
622         return 0;\r
623 }\r
624 \r