]> Gitweb @ Texas Instruments - Open Source Git Repositories - git.TI.com/gitweb - znp-host-framework/znp-host-framework.git/blob - examples/dataSendRcv/dataSendRcv.c
a55718dc681af707106372f68b2f6a09c2644133
[znp-host-framework/znp-host-framework.git] / examples / dataSendRcv / dataSendRcv.c
1 /**************************************************************************************************\r
2  * Filename:       dataSendRcv.c\r
3  * Description:    This file contains dataSendRcv 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 "rpcTransport.h"\r
53 #include "dbgPrint.h"\r
54 #include "hostConsole.h"\r
55 \r
56 /*********************************************************************\r
57  * MACROS\r
58  */\r
59 \r
60 /*********************************************************************\r
61  * TYPES\r
62  */\r
63 \r
64 /*********************************************************************\r
65  * LOCAL VARIABLE\r
66  */\r
67 \r
68 //init ZDO device state\r
69 devStates_t devState = DEV_HOLD;\r
70 uint8_t gSrcEndPoint = 1;\r
71 uint8_t gDstEndPoint = 1;\r
72 \r
73 /***********************************************************************/\r
74 \r
75 /*********************************************************************\r
76  * LOCAL FUNCTIONS\r
77  */\r
78 //ZDO Callbacks\r
79 static uint8_t mtZdoStateChangeIndCb(uint8_t newDevState);\r
80 static uint8_t mtZdoSimpleDescRspCb(SimpleDescRspFormat_t *msg);\r
81 static uint8_t mtZdoActiveEpRspCb(ActiveEpRspFormat_t *msg);\r
82 static uint8_t mtZdoEndDeviceAnnceIndCb(EndDeviceAnnceIndFormat_t *msg);\r
83 \r
84 static uint8_t mtZdoMgmtLqiRspCb(MgmtLqiRspFormat_t *msg);\r
85 \r
86 //SYS Callbacks\r
87 \r
88 static uint8_t mtSysResetIndCb(ResetIndFormat_t *msg);\r
89 \r
90 //AF callbacks\r
91 static uint8_t mtAfDataConfirmCb(DataConfirmFormat_t *msg);\r
92 static uint8_t mtAfIncomingMsgCb(IncomingMsgFormat_t *msg);\r
93 \r
94 //helper functions\r
95 static uint8_t setNVStartup(uint8_t startupOption);\r
96 static uint8_t setNVChanList(uint32_t chanList);\r
97 static uint8_t setNVPanID(uint32_t panId);\r
98 static uint8_t setNVDevType(uint8_t devType);\r
99 static int32_t startNetwork(void);\r
100 static int32_t registerAf(void);\r
101 \r
102 /*********************************************************************\r
103  * CALLBACK FUNCTIONS\r
104  */\r
105 \r
106 // SYS callbacks\r
107 static mtSysCb_t mtSysCb =\r
108         { NULL, NULL, NULL, mtSysResetIndCb, NULL, NULL, NULL, NULL, NULL, NULL,\r
109                 NULL, NULL, NULL, NULL };\r
110 \r
111 static mtZdoCb_t mtZdoCb =\r
112         { NULL,       // MT_ZDO_NWK_ADDR_RSP\r
113                 NULL,      // MT_ZDO_IEEE_ADDR_RSP\r
114                 NULL,      // MT_ZDO_NODE_DESC_RSP\r
115                 NULL,     // MT_ZDO_POWER_DESC_RSP\r
116                 mtZdoSimpleDescRspCb,    // MT_ZDO_SIMPLE_DESC_RSP\r
117                 mtZdoActiveEpRspCb,      // MT_ZDO_ACTIVE_EP_RSP\r
118                 NULL,     // MT_ZDO_MATCH_DESC_RSP\r
119                 NULL,   // MT_ZDO_COMPLEX_DESC_RSP\r
120                 NULL,      // MT_ZDO_USER_DESC_RSP\r
121                 NULL,     // MT_ZDO_USER_DESC_CONF\r
122                 NULL,    // MT_ZDO_SERVER_DISC_RSP\r
123                 NULL, // MT_ZDO_END_DEVICE_BIND_RSP\r
124                 NULL,          // MT_ZDO_BIND_RSP\r
125                 NULL,        // MT_ZDO_UNBIND_RSP\r
126                 NULL,   // MT_ZDO_MGMT_NWK_DISC_RSP\r
127                 mtZdoMgmtLqiRspCb,       // MT_ZDO_MGMT_LQI_RSP\r
128                 NULL,       // MT_ZDO_MGMT_RTG_RSP\r
129                 NULL,      // MT_ZDO_MGMT_BIND_RSP\r
130                 NULL,     // MT_ZDO_MGMT_LEAVE_RSP\r
131                 NULL,     // MT_ZDO_MGMT_DIRECT_JOIN_RSP\r
132                 NULL,     // MT_ZDO_MGMT_PERMIT_JOIN_RSP\r
133                 mtZdoStateChangeIndCb,   // MT_ZDO_STATE_CHANGE_IND\r
134                 mtZdoEndDeviceAnnceIndCb,   // MT_ZDO_END_DEVICE_ANNCE_IND\r
135                 NULL,        // MT_ZDO_SRC_RTG_IND\r
136                 NULL,    //MT_ZDO_BEACON_NOTIFY_IND\r
137                 NULL,                    //MT_ZDO_JOIN_CNF\r
138                 NULL,    //MT_ZDO_NWK_DISCOVERY_CNF\r
139                 NULL,                    // MT_ZDO_CONCENTRATOR_IND_CB\r
140                 NULL,         // MT_ZDO_LEAVE_IND\r
141                 NULL,   //MT_ZDO_STATUS_ERROR_RSP\r
142                 NULL,  //MT_ZDO_MATCH_DESC_RSP_SENT\r
143                 NULL, NULL };\r
144 \r
145 static mtAfCb_t mtAfCb =\r
146         { mtAfDataConfirmCb,                            //MT_AF_DATA_CONFIRM\r
147                 mtAfIncomingMsgCb,                              //MT_AF_INCOMING_MSG\r
148                 NULL,                           //MT_AF_INCOMING_MSG_EXT\r
149                 NULL,                   //MT_AF_DATA_RETRIEVE\r
150                 NULL,                       //MT_AF_REFLECT_ERROR\r
151             };\r
152 typedef struct\r
153 {\r
154         uint16_t ChildAddr;\r
155         uint8_t Type;\r
156 \r
157 } ChildNode_t;\r
158 \r
159 typedef struct\r
160 {\r
161         uint16_t NodeAddr;\r
162         uint8_t Type;\r
163         uint8_t ChildCount;\r
164         ChildNode_t childs[256];\r
165 } Node_t;\r
166 \r
167 Node_t nodeList[64];\r
168 uint8_t nodeCount = 0;\r
169 \r
170 /********************************************************************\r
171  * START OF SYS CALL BACK FUNCTIONS\r
172  */\r
173 \r
174 static uint8_t mtSysResetIndCb(ResetIndFormat_t *msg)\r
175 {\r
176 \r
177         consolePrint("ZNP Version: %d.%d.%d\n", msg->MajorRel, msg->MinorRel,\r
178                 msg->HwRev);\r
179         return 0;\r
180 }\r
181 \r
182 /********************************************************************\r
183  * START OF ZDO CALL BACK FUNCTIONS\r
184  */\r
185 \r
186 /********************************************************************\r
187  * @fn     Callback function for ZDO State Change Indication\r
188 \r
189  * @brief  receives the AREQ status and specifies the change ZDO state\r
190  *\r
191  * @param  uint8 zdoState\r
192  *\r
193  * @return SUCCESS or FAILURE\r
194  */\r
195 \r
196 static uint8_t mtZdoStateChangeIndCb(uint8_t newDevState)\r
197 {\r
198 \r
199         switch (newDevState)\r
200         {\r
201         case DEV_HOLD:\r
202                 dbg_print(PRINT_LEVEL_INFO,\r
203                         "mtZdoStateChangeIndCb: Initialized - not started automatically\n");\r
204                 break;\r
205         case DEV_INIT:\r
206                 dbg_print(PRINT_LEVEL_INFO,\r
207                         "mtZdoStateChangeIndCb: Initialized - not connected to anything\n");\r
208                 break;\r
209         case DEV_NWK_DISC:\r
210                 dbg_print(PRINT_LEVEL_INFO,\r
211                         "mtZdoStateChangeIndCb: Discovering PAN's to join\n");\r
212                 consolePrint("Network Discovering\n");\r
213                 break;\r
214         case DEV_NWK_JOINING:\r
215                 dbg_print(PRINT_LEVEL_INFO, "mtZdoStateChangeIndCb: Joining a PAN\n");\r
216                 consolePrint("Network Joining\n");\r
217                 break;\r
218         case DEV_NWK_REJOIN:\r
219                 dbg_print(PRINT_LEVEL_INFO,\r
220                         "mtZdoStateChangeIndCb: ReJoining a PAN, only for end devices\n");\r
221                 consolePrint("Network Rejoining\n");\r
222                 break;\r
223         case DEV_END_DEVICE_UNAUTH:\r
224                 consolePrint("Network Authenticating\n");\r
225                 dbg_print(PRINT_LEVEL_INFO,\r
226                         "mtZdoStateChangeIndCb: Joined but not yet authenticated by trust center\n");\r
227                 break;\r
228         case DEV_END_DEVICE:\r
229                 consolePrint("Network Joined\n");\r
230                 dbg_print(PRINT_LEVEL_INFO,\r
231                         "mtZdoStateChangeIndCb: Started as device after authentication\n");\r
232                 break;\r
233         case DEV_ROUTER:\r
234                 consolePrint("Network Joined\n");\r
235                 dbg_print(PRINT_LEVEL_INFO,\r
236                         "mtZdoStateChangeIndCb: Device joined, authenticated and is a router\n");\r
237                 break;\r
238         case DEV_COORD_STARTING:\r
239                 consolePrint("Network Starting\n");\r
240                 dbg_print(PRINT_LEVEL_INFO,\r
241                         "mtZdoStateChangeIndCb: Started as Zigbee Coordinator\n");\r
242                 break;\r
243         case DEV_ZB_COORD:\r
244                 consolePrint("Network Started\n");\r
245                 dbg_print(PRINT_LEVEL_INFO,\r
246                         "mtZdoStateChangeIndCb: Started as Zigbee Coordinator\n");\r
247                 break;\r
248         case DEV_NWK_ORPHAN:\r
249                 consolePrint("Network Orphaned\n");\r
250                 dbg_print(PRINT_LEVEL_INFO,\r
251                         "mtZdoStateChangeIndCb: Device has lost information about its parent\n");\r
252                 break;\r
253         default:\r
254                 dbg_print(PRINT_LEVEL_INFO, "mtZdoStateChangeIndCb: unknown state");\r
255                 break;\r
256         }\r
257 \r
258         devState = (devStates_t) newDevState;\r
259 \r
260         return SUCCESS;\r
261 }\r
262 static uint8_t mtZdoSimpleDescRspCb(SimpleDescRspFormat_t *msg)\r
263 {\r
264 \r
265         if (msg->Status == MT_RPC_SUCCESS)\r
266         {\r
267                 consolePrint("\tEndpoint: 0x%02X\n", msg->Endpoint);\r
268                 consolePrint("\tProfileID: 0x%04X\n", msg->ProfileID);\r
269                 consolePrint("\tDeviceID: 0x%04X\n", msg->DeviceID);\r
270                 consolePrint("\tDeviceVersion: 0x%02X\n", msg->DeviceVersion);\r
271                 consolePrint("\tNumInClusters: %d\n", msg->NumInClusters);\r
272                 uint32_t i;\r
273                 for (i = 0; i < msg->NumInClusters; i++)\r
274                 {\r
275                         consolePrint("\t\tInClusterList[%d]: 0x%04X\n", i,\r
276                                 msg->InClusterList[i]);\r
277                 }\r
278                 consolePrint("\tNumOutClusters: %d\n", msg->NumOutClusters);\r
279                 for (i = 0; i < msg->NumOutClusters; i++)\r
280                 {\r
281                         consolePrint("\t\tOutClusterList[%d]: 0x%04X\n", i,\r
282                                 msg->OutClusterList[i]);\r
283                 }\r
284                 consolePrint("\n");\r
285         }\r
286         else\r
287         {\r
288                 consolePrint("SimpleDescRsp Status: FAIL 0x%02X\n", msg->Status);\r
289         }\r
290 \r
291         return msg->Status;\r
292 }\r
293 \r
294 static uint8_t mtZdoMgmtLqiRspCb(MgmtLqiRspFormat_t *msg)\r
295 {\r
296         uint8_t devType = 0;\r
297         uint8_t devRelation = 0;\r
298         MgmtLqiReqFormat_t req;\r
299         if (msg->Status == MT_RPC_SUCCESS)\r
300         {\r
301                 nodeList[nodeCount].NodeAddr = msg->SrcAddr;\r
302                 nodeList[nodeCount].Type = (msg->SrcAddr == 0 ?\r
303                 DEVICETYPE_COORDINATOR :\r
304                                                                 DEVICETYPE_ROUTER);\r
305                 nodeList[nodeCount].ChildCount = 0;\r
306                 uint32_t i;\r
307                 for (i = 0; i < msg->NeighborLqiListCount; i++)\r
308                 {\r
309                         devType = msg->NeighborLqiList[i].DevTyp_RxOnWhenIdle_Relat & 3;\r
310                         devRelation = ((msg->NeighborLqiList[i].DevTyp_RxOnWhenIdle_Relat\r
311                                 >> 4) & 7);\r
312                         if (devRelation == 1 || devRelation == 3)\r
313                         {\r
314                                 uint8_t cCount = nodeList[nodeCount].ChildCount;\r
315                                 nodeList[nodeCount].childs[cCount].ChildAddr =\r
316                                         msg->NeighborLqiList[i].NetworkAddress;\r
317                                 nodeList[nodeCount].childs[cCount].Type = devType;\r
318                                 nodeList[nodeCount].ChildCount++;\r
319                                 if (devType == DEVICETYPE_ROUTER)\r
320                                 {\r
321                                         req.DstAddr = msg->NeighborLqiList[i].NetworkAddress;\r
322                                         req.StartIndex = 0;\r
323                                         zdoMgmtLqiReq(&req);\r
324                                 }\r
325                         }\r
326                 }\r
327                 nodeCount++;\r
328 \r
329         }\r
330         else\r
331         {\r
332                 consolePrint("MgmtLqiRsp Status: FAIL 0x%02X\n", msg->Status);\r
333         }\r
334 \r
335         return msg->Status;\r
336 }\r
337 \r
338 static uint8_t mtZdoActiveEpRspCb(ActiveEpRspFormat_t *msg)\r
339 {\r
340 \r
341         //SimpleDescReqFormat_t simReq;\r
342         consolePrint("NwkAddr: 0x%04X\n", msg->NwkAddr);\r
343         if (msg->Status == MT_RPC_SUCCESS)\r
344         {\r
345                 consolePrint("Number of Endpoints: %d\nActive Endpoints: ",\r
346                         msg->ActiveEPCount);\r
347                 uint32_t i;\r
348                 for (i = 0; i < msg->ActiveEPCount; i++)\r
349                 {\r
350                         consolePrint("0x%02X\t", msg->ActiveEPList[i]);\r
351 \r
352                 }\r
353                 consolePrint("\n");\r
354         }\r
355         else\r
356         {\r
357                 consolePrint("ActiveEpRsp Status: FAIL 0x%02X\n", msg->Status);\r
358         }\r
359 \r
360         return msg->Status;\r
361 }\r
362 \r
363 static uint8_t mtZdoEndDeviceAnnceIndCb(EndDeviceAnnceIndFormat_t *msg)\r
364 {\r
365 \r
366         ActiveEpReqFormat_t actReq;\r
367         actReq.DstAddr = msg->NwkAddr;\r
368         actReq.NwkAddrOfInterest = msg->NwkAddr;\r
369 \r
370         consolePrint("\nNew device joined network.\n");\r
371         zdoActiveEpReq(&actReq);\r
372         return 0;\r
373 }\r
374 \r
375 /********************************************************************\r
376  * AF CALL BACK FUNCTIONS\r
377  */\r
378 \r
379 static uint8_t mtAfDataConfirmCb(DataConfirmFormat_t *msg)\r
380 {\r
381 \r
382         if (msg->Status == MT_RPC_SUCCESS)\r
383         {\r
384                 consolePrint("Message transmited Succesfully!\n");\r
385         }\r
386         else\r
387         {\r
388                 consolePrint("Message failed to transmit\n");\r
389         }\r
390         return msg->Status;\r
391 }\r
392 static uint8_t mtAfIncomingMsgCb(IncomingMsgFormat_t *msg)\r
393 {\r
394 \r
395         consolePrint(\r
396                 "\nIncoming Message from Endpoint 0x%02X and Address 0x%04X:\n",\r
397                 msg->SrcEndpoint, msg->SrcAddr);\r
398         msg->Data[msg->Len] = '\0';\r
399         consolePrint("%s\n", (char*) msg->Data);\r
400         consolePrint(\r
401                 "\nEnter message to send or type CHANGE to change the destination \nor QUIT to exit:\n");\r
402 \r
403         return 0;\r
404 }\r
405 \r
406 /********************************************************************\r
407  * HELPER FUNCTIONS\r
408  */\r
409 // helper functions for building and sending the NV messages\r
410 static uint8_t setNVStartup(uint8_t startupOption)\r
411 {\r
412         uint8_t status;\r
413         OsalNvWriteFormat_t nvWrite;\r
414 \r
415         // sending startup option\r
416         nvWrite.Id = ZCD_NV_STARTUP_OPTION;\r
417         nvWrite.Offset = 0;\r
418         nvWrite.Len = 1;\r
419         nvWrite.Value[0] = startupOption;\r
420         status = sysOsalNvWrite(&nvWrite);\r
421 \r
422         dbg_print(PRINT_LEVEL_INFO, "\n");\r
423 \r
424         dbg_print(PRINT_LEVEL_INFO, "NV Write Startup Option cmd sent[%d]...\n",\r
425                 status);\r
426 \r
427         return status;\r
428 }\r
429 \r
430 static uint8_t setNVDevType(uint8_t devType)\r
431 {\r
432         uint8_t status;\r
433         OsalNvWriteFormat_t nvWrite;\r
434 \r
435         // setting dev type\r
436         nvWrite.Id = ZCD_NV_LOGICAL_TYPE;\r
437         nvWrite.Offset = 0;\r
438         nvWrite.Len = 1;\r
439         nvWrite.Value[0] = devType;\r
440         status = sysOsalNvWrite(&nvWrite);\r
441 \r
442         dbg_print(PRINT_LEVEL_INFO, "\n");\r
443         dbg_print(PRINT_LEVEL_INFO, "NV Write Device Type cmd sent... [%d]\n",\r
444                 status);\r
445 \r
446         return status;\r
447 }\r
448 \r
449 static uint8_t setNVPanID(uint32_t panId)\r
450 {\r
451         uint8_t status;\r
452         OsalNvWriteFormat_t nvWrite;\r
453 \r
454         dbg_print(PRINT_LEVEL_INFO, "\n");\r
455         dbg_print(PRINT_LEVEL_INFO, "NV Write PAN ID cmd sending...\n");\r
456 \r
457         nvWrite.Id = ZCD_NV_PANID;\r
458         nvWrite.Offset = 0;\r
459         nvWrite.Len = 2;\r
460         nvWrite.Value[0] = LO_UINT16(panId);\r
461         nvWrite.Value[1] = HI_UINT16(panId);\r
462         status = sysOsalNvWrite(&nvWrite);\r
463 \r
464         dbg_print(PRINT_LEVEL_INFO, "\n");\r
465         dbg_print(PRINT_LEVEL_INFO, "NV Write PAN ID cmd sent...[%d]\n", status);\r
466 \r
467         return status;\r
468 }\r
469 \r
470 static uint8_t setNVChanList(uint32_t chanList)\r
471 {\r
472         OsalNvWriteFormat_t nvWrite;\r
473         uint8_t status;\r
474         // setting chanList\r
475         nvWrite.Id = ZCD_NV_CHANLIST;\r
476         nvWrite.Offset = 0;\r
477         nvWrite.Len = 4;\r
478         nvWrite.Value[0] = BREAK_UINT32(chanList, 0);\r
479         nvWrite.Value[1] = BREAK_UINT32(chanList, 1);\r
480         nvWrite.Value[2] = BREAK_UINT32(chanList, 2);\r
481         nvWrite.Value[3] = BREAK_UINT32(chanList, 3);\r
482         status = sysOsalNvWrite(&nvWrite);\r
483 \r
484         dbg_print(PRINT_LEVEL_INFO, "\n");\r
485         dbg_print(PRINT_LEVEL_INFO, "NV Write Channel List cmd sent...[%d]\n",\r
486                 status);\r
487 \r
488         return status;\r
489 }\r
490 \r
491 uint8_t dType;\r
492 static int32_t startNetwork(void)\r
493 {\r
494         char cDevType;\r
495         uint8_t devType;\r
496         int32_t status;\r
497         uint8_t newNwk = 0;\r
498         char sCh[128];\r
499 \r
500         do\r
501         {\r
502                 consolePrint("Do you wish to start/join a new network? (y/n)\n");\r
503                 consoleGetLine(sCh, 128);\r
504                 if (sCh[0] == 'n' || sCh[0] == 'N')\r
505                 {\r
506                         status = setNVStartup(0);\r
507                 }\r
508                 else if (sCh[0] == 'y' || sCh[0] == 'Y')\r
509                 {\r
510                         status = setNVStartup(\r
511                         ZCD_STARTOPT_CLEAR_STATE | ZCD_STARTOPT_CLEAR_CONFIG);\r
512                         newNwk = 1;\r
513 \r
514                 }\r
515                 else\r
516                 {\r
517                         consolePrint("Incorrect input please type y or n\n");\r
518                 }\r
519         } while (sCh[0] != 'y' && sCh[0] != 'Y' && sCh[0] != 'n' && sCh[0] != 'N');\r
520 \r
521         if (status != MT_RPC_SUCCESS)\r
522         {\r
523                 dbg_print(PRINT_LEVEL_WARNING, "network start failed\n");\r
524                 return -1;\r
525         }\r
526         consolePrint("Resetting ZNP\n");\r
527         ResetReqFormat_t resReq;\r
528         resReq.Type = 1;\r
529         sysResetReq(&resReq);\r
530         //flush the rsp\r
531         rpcWaitMqClientMsg(5000);\r
532 \r
533         if (newNwk)\r
534         {\r
535                 consolePrint(\r
536                         "Enter device type c: Coordinator, r: Router, e: End Device:\n");\r
537                 consoleGetLine(sCh, 128);\r
538                 cDevType = sCh[0];\r
539 \r
540                 switch (cDevType)\r
541                 {\r
542                 case 'c':\r
543                 case 'C':\r
544                         devType = DEVICETYPE_COORDINATOR;\r
545                         break;\r
546                 case 'r':\r
547                 case 'R':\r
548                         devType = DEVICETYPE_ROUTER;\r
549                         break;\r
550                 case 'e':\r
551                 case 'E':\r
552                 default:\r
553                         devType = DEVICETYPE_ENDDEVICE;\r
554                         break;\r
555                 }\r
556                 status = setNVDevType(devType);\r
557 \r
558                 if (status != MT_RPC_SUCCESS)\r
559                 {\r
560                         dbg_print(PRINT_LEVEL_WARNING, "setNVDevType failed\n");\r
561                         return 0;\r
562                 }\r
563                 //Select random PAN ID for Coord and join any PAN for RTR/ED\r
564                 status = setNVPanID(0xFFFF);\r
565                 if (status != MT_RPC_SUCCESS)\r
566                 {\r
567                         dbg_print(PRINT_LEVEL_WARNING, "setNVPanID failed\n");\r
568                         return -1;\r
569                 }\r
570                 consolePrint("Enter channel 11-26:\n");\r
571                 consoleGetLine(sCh, 128);\r
572 \r
573                 status = setNVChanList(1 << atoi(sCh));\r
574                 if (status != MT_RPC_SUCCESS)\r
575                 {\r
576                         dbg_print(PRINT_LEVEL_INFO, "setNVPanID failed\n");\r
577                         return -1;\r
578                 }\r
579 \r
580         }\r
581 \r
582         registerAf();\r
583         consolePrint("EndPoint: 1\n");\r
584 \r
585         status = zdoInit();\r
586         if (status == NEW_NETWORK)\r
587         {\r
588                 dbg_print(PRINT_LEVEL_INFO, "zdoInit NEW_NETWORK\n");\r
589                 status = MT_RPC_SUCCESS;\r
590         }\r
591         else if (status == RESTORED_NETWORK)\r
592         {\r
593                 dbg_print(PRINT_LEVEL_INFO, "zdoInit RESTORED_NETWORK\n");\r
594                 status = MT_RPC_SUCCESS;\r
595         }\r
596         else\r
597         {\r
598                 dbg_print(PRINT_LEVEL_INFO, "zdoInit failed\n");\r
599                 status = -1;\r
600         }\r
601 \r
602         dbg_print(PRINT_LEVEL_INFO, "process zdoStatechange callbacks\n");\r
603 \r
604         //flush AREQ ZDO State Change messages\r
605         while (status != -1)\r
606         {\r
607                 status = rpcWaitMqClientMsg(5000);\r
608 \r
609                 if (((devType == DEVICETYPE_COORDINATOR) && (devState == DEV_ZB_COORD))\r
610                         || ((devType == DEVICETYPE_ROUTER) && (devState == DEV_ROUTER))\r
611                         || ((devType == DEVICETYPE_ENDDEVICE)\r
612                                 && (devState == DEV_END_DEVICE)))\r
613                 {\r
614                         break;\r
615                 }\r
616         }\r
617         //set startup option back to keep configuration in case of reset\r
618         status = setNVStartup(0);\r
619         if (devState < DEV_END_DEVICE)\r
620         {\r
621                 //start network failed\r
622                 return -1;\r
623         }\r
624 \r
625         return 0;\r
626 }\r
627 static int32_t registerAf(void)\r
628 {\r
629         int32_t status = 0;\r
630         RegisterFormat_t reg;\r
631 \r
632         reg.EndPoint = 1;\r
633         reg.AppProfId = 0x0104;\r
634         reg.AppDeviceId = 0x0100;\r
635         reg.AppDevVer = 1;\r
636         reg.LatencyReq = 0;\r
637         reg.AppNumInClusters = 1;\r
638         reg.AppInClusterList[0] = 0x0006;\r
639         reg.AppNumOutClusters = 0;\r
640 \r
641         status = afRegister(&reg);\r
642         return status;\r
643 }\r
644 \r
645 static void displayDevices(void)\r
646 {\r
647         ActiveEpReqFormat_t actReq;\r
648         int32_t status;\r
649 \r
650         MgmtLqiReqFormat_t req;\r
651 \r
652         req.DstAddr = 0;\r
653         req.StartIndex = 0;\r
654         nodeCount = 0;\r
655         zdoMgmtLqiReq(&req);\r
656         do\r
657         {\r
658                 status = rpcWaitMqClientMsg(1000);\r
659         } while (status != -1);\r
660 \r
661         consolePrint("\nAvailable devices:\n");\r
662         uint8_t i;\r
663         for (i = 0; i < nodeCount; i++)\r
664         {\r
665                 char *devtype =\r
666                         (nodeList[i].Type == DEVICETYPE_ROUTER ?\r
667                                 "ROUTER" : "COORDINATOR");\r
668 \r
669                 consolePrint("Type: %s\n", devtype);\r
670                 actReq.DstAddr = nodeList[i].NodeAddr;\r
671                 actReq.NwkAddrOfInterest = nodeList[i].NodeAddr;\r
672                 zdoActiveEpReq(&actReq);\r
673                 rpcGetMqClientMsg();\r
674                 do\r
675                 {\r
676                         status = rpcWaitMqClientMsg(1000);\r
677                 } while (status != -1);\r
678                 uint8_t cI;\r
679                 for (cI = 0; cI < nodeList[i].ChildCount; cI++)\r
680                 {\r
681                         uint8_t type = nodeList[i].childs[cI].Type;\r
682                         if (type == DEVICETYPE_ENDDEVICE)\r
683                         {\r
684                                 consolePrint("Type: END DEVICE\n");\r
685                                 actReq.DstAddr = nodeList[i].childs[cI].ChildAddr;\r
686                                 actReq.NwkAddrOfInterest = nodeList[i].childs[cI].ChildAddr;\r
687                                 zdoActiveEpReq(&actReq);\r
688                                 status = 0;\r
689                                 rpcGetMqClientMsg();\r
690                                 while (status != -1)\r
691                                 {\r
692                                         status = rpcWaitMqClientMsg(1000);\r
693                                 }\r
694                         }\r
695 \r
696                 }\r
697                 consolePrint("\n");\r
698 \r
699         }\r
700 }\r
701 /*********************************************************************\r
702  * INTERFACE FUNCTIONS\r
703  */\r
704 uint32_t appInit(void)\r
705 {\r
706         int32_t status = 0;\r
707         uint32_t msgCnt = 0;\r
708 \r
709         //Flush all messages from the que\r
710         while (status != -1)\r
711         {\r
712                 status = rpcWaitMqClientMsg(10);\r
713                 if (status != -1)\r
714                 {\r
715                         msgCnt++;\r
716                 }\r
717         }\r
718 \r
719         dbg_print(PRINT_LEVEL_INFO, "flushed %d message from msg queue\n", msgCnt);\r
720 \r
721         //Register Callbacks MT system callbacks\r
722         sysRegisterCallbacks(mtSysCb);\r
723         zdoRegisterCallbacks(mtZdoCb);\r
724         afRegisterCallbacks(mtAfCb);\r
725 \r
726         return 0;\r
727 }\r
728 uint8_t initDone = 0;\r
729 void* appMsgProcess(void *argument)\r
730 {\r
731 \r
732         if (initDone)\r
733         {\r
734                 rpcWaitMqClientMsg(10000);\r
735         }\r
736 \r
737         return 0;\r
738 }\r
739 \r
740 void* appProcess(void *argument)\r
741 {\r
742         int32_t status;\r
743         uint32_t quit = 0;\r
744 \r
745         //Flush all messages from the que\r
746         do\r
747         {\r
748                 status = rpcWaitMqClientMsg(50);\r
749         } while (status != -1);\r
750 \r
751         devState = DEV_HOLD;\r
752 \r
753         status = startNetwork();\r
754         if (status != -1)\r
755         {\r
756                 consolePrint("Network up\n\n");\r
757         }\r
758         else\r
759         {\r
760                 consolePrint("Network Error\n\n");\r
761         }\r
762 \r
763         sysGetExtAddr();\r
764 \r
765         OsalNvWriteFormat_t nvWrite;\r
766         nvWrite.Id = ZCD_NV_ZDO_DIRECT_CB;\r
767         nvWrite.Offset = 0;\r
768         nvWrite.Len = 1;\r
769         nvWrite.Value[0] = 1;\r
770         status = sysOsalNvWrite(&nvWrite);\r
771 \r
772         char cmd[128];\r
773         int attget;\r
774 \r
775         while (quit == 0)\r
776         {\r
777                 nodeCount = 0;\r
778                 initDone = 0;\r
779                 displayDevices();\r
780                 DataRequestFormat_t DataRequest;\r
781                 consolePrint("Enter DstAddr:\n");\r
782                 consoleGetLine(cmd, 128);\r
783                 sscanf(cmd, "%x", &attget);\r
784                 DataRequest.DstAddr = (uint16_t) attget;\r
785 \r
786                 consolePrint("Enter DstEndpoint:\n");\r
787                 consoleGetLine(cmd, 128);\r
788                 sscanf(cmd, "%x", &attget);\r
789                 DataRequest.DstEndpoint = (uint8_t) attget;\r
790 \r
791                 DataRequest.SrcEndpoint = 1;\r
792 \r
793                 DataRequest.ClusterID = 6;\r
794 \r
795                 DataRequest.TransID = 5;\r
796 \r
797                 DataRequest.Options = 0;\r
798 \r
799                 DataRequest.Radius = 0xEE;\r
800 \r
801                 initDone = 1;\r
802 \r
803                 while (1)\r
804                 {\r
805                         uint8_t *data;\r
806                         //initDone = 0;\r
807 \r
808                         consolePrint(\r
809                                 "Enter message to send or type CHANGE to change the destination\n");\r
810                         consolePrint("or QUIT to exit\n");\r
811 \r
812                         consoleGetLine(cmd, 128);\r
813                         //initDone = 1;\r
814                         if (strcmp(cmd, "CHANGE") == 0)\r
815                         {\r
816                                 break;\r
817                         }\r
818                         else if (strcmp(cmd, "QUIT") == 0)\r
819                         {\r
820                                 quit = 1;\r
821                                 break;\r
822                         }\r
823                         data = (uint8_t*) cmd;\r
824                         memcpy(DataRequest.Data, data, strlen(cmd));\r
825                         DataRequest.Len = strlen(cmd);\r
826                         initDone = 0;\r
827                         afDataRequest(&DataRequest);\r
828                         rpcWaitMqClientMsg(500);\r
829                         initDone = 1;\r
830                 }\r
831 \r
832         }\r
833 \r
834         return 0;\r
835 }\r
836 \r