a55718dc681af707106372f68b2f6a09c2644133
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(®);\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