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 #ifndef CC26xx\r
536 consolePrint(\r
537 "Enter device type c: Coordinator, r: Router, e: End Device:\n");\r
538 consoleGetLine(sCh, 128);\r
539 cDevType = sCh[0];\r
540 \r
541 switch (cDevType)\r
542 {\r
543 case 'c':\r
544 case 'C':\r
545 devType = DEVICETYPE_COORDINATOR;\r
546 break;\r
547 case 'r':\r
548 case 'R':\r
549 devType = DEVICETYPE_ROUTER;\r
550 break;\r
551 case 'e':\r
552 case 'E':\r
553 default:\r
554 devType = DEVICETYPE_ENDDEVICE;\r
555 break;\r
556 }\r
557 status = setNVDevType(devType);\r
558 \r
559 if (status != MT_RPC_SUCCESS)\r
560 {\r
561 dbg_print(PRINT_LEVEL_WARNING, "setNVDevType failed\n");\r
562 return 0;\r
563 }\r
564 #endif //CC26xx\r
565 //Select random PAN ID for Coord and join any PAN for RTR/ED\r
566 status = setNVPanID(0xFFFF);\r
567 if (status != MT_RPC_SUCCESS)\r
568 {\r
569 dbg_print(PRINT_LEVEL_WARNING, "setNVPanID failed\n");\r
570 return -1;\r
571 }\r
572 consolePrint("Enter channel 11-26:\n");\r
573 consoleGetLine(sCh, 128);\r
574 \r
575 status = setNVChanList(1 << atoi(sCh));\r
576 if (status != MT_RPC_SUCCESS)\r
577 {\r
578 dbg_print(PRINT_LEVEL_INFO, "setNVPanID failed\n");\r
579 return -1;\r
580 }\r
581 \r
582 }\r
583 \r
584 registerAf();\r
585 consolePrint("EndPoint: 1\n");\r
586 \r
587 status = zdoInit();\r
588 if (status == NEW_NETWORK)\r
589 {\r
590 dbg_print(PRINT_LEVEL_INFO, "zdoInit NEW_NETWORK\n");\r
591 status = MT_RPC_SUCCESS;\r
592 }\r
593 else if (status == RESTORED_NETWORK)\r
594 {\r
595 dbg_print(PRINT_LEVEL_INFO, "zdoInit RESTORED_NETWORK\n");\r
596 status = MT_RPC_SUCCESS;\r
597 }\r
598 else\r
599 {\r
600 dbg_print(PRINT_LEVEL_INFO, "zdoInit failed\n");\r
601 status = -1;\r
602 }\r
603 \r
604 dbg_print(PRINT_LEVEL_INFO, "process zdoStatechange callbacks\n");\r
605 \r
606 //flush AREQ ZDO State Change messages\r
607 while (status != -1)\r
608 {\r
609 status = rpcWaitMqClientMsg(5000);\r
610 \r
611 if (((devType == DEVICETYPE_COORDINATOR) && (devState == DEV_ZB_COORD))\r
612 || ((devType == DEVICETYPE_ROUTER) && (devState == DEV_ROUTER))\r
613 || ((devType == DEVICETYPE_ENDDEVICE)\r
614 && (devState == DEV_END_DEVICE)))\r
615 {\r
616 break;\r
617 }\r
618 }\r
619 //set startup option back to keep configuration in case of reset\r
620 status = setNVStartup(0);\r
621 if (devState < DEV_END_DEVICE)\r
622 {\r
623 //start network failed\r
624 return -1;\r
625 }\r
626 \r
627 return 0;\r
628 }\r
629 static int32_t registerAf(void)\r
630 {\r
631 int32_t status = 0;\r
632 RegisterFormat_t reg;\r
633 \r
634 reg.EndPoint = 1;\r
635 reg.AppProfId = 0x0104;\r
636 reg.AppDeviceId = 0x0100;\r
637 reg.AppDevVer = 1;\r
638 reg.LatencyReq = 0;\r
639 reg.AppNumInClusters = 1;\r
640 reg.AppInClusterList[0] = 0x0006;\r
641 reg.AppNumOutClusters = 0;\r
642 \r
643 status = afRegister(®);\r
644 return status;\r
645 }\r
646 \r
647 static void displayDevices(void)\r
648 {\r
649 ActiveEpReqFormat_t actReq;\r
650 int32_t status;\r
651 \r
652 MgmtLqiReqFormat_t req;\r
653 \r
654 req.DstAddr = 0;\r
655 req.StartIndex = 0;\r
656 nodeCount = 0;\r
657 zdoMgmtLqiReq(&req);\r
658 do\r
659 {\r
660 status = rpcWaitMqClientMsg(1000);\r
661 } while (status != -1);\r
662 \r
663 consolePrint("\nAvailable devices:\n");\r
664 uint8_t i;\r
665 for (i = 0; i < nodeCount; i++)\r
666 {\r
667 char *devtype =\r
668 (nodeList[i].Type == DEVICETYPE_ROUTER ?\r
669 "ROUTER" : "COORDINATOR");\r
670 \r
671 consolePrint("Type: %s\n", devtype);\r
672 actReq.DstAddr = nodeList[i].NodeAddr;\r
673 actReq.NwkAddrOfInterest = nodeList[i].NodeAddr;\r
674 zdoActiveEpReq(&actReq);\r
675 rpcGetMqClientMsg();\r
676 do\r
677 {\r
678 status = rpcWaitMqClientMsg(1000);\r
679 } while (status != -1);\r
680 uint8_t cI;\r
681 for (cI = 0; cI < nodeList[i].ChildCount; cI++)\r
682 {\r
683 uint8_t type = nodeList[i].childs[cI].Type;\r
684 if (type == DEVICETYPE_ENDDEVICE)\r
685 {\r
686 consolePrint("Type: END DEVICE\n");\r
687 actReq.DstAddr = nodeList[i].childs[cI].ChildAddr;\r
688 actReq.NwkAddrOfInterest = nodeList[i].childs[cI].ChildAddr;\r
689 zdoActiveEpReq(&actReq);\r
690 status = 0;\r
691 rpcGetMqClientMsg();\r
692 while (status != -1)\r
693 {\r
694 status = rpcWaitMqClientMsg(1000);\r
695 }\r
696 }\r
697 \r
698 }\r
699 consolePrint("\n");\r
700 \r
701 }\r
702 }\r
703 /*********************************************************************\r
704 * INTERFACE FUNCTIONS\r
705 */\r
706 uint32_t appInit(void)\r
707 {\r
708 int32_t status = 0;\r
709 uint32_t msgCnt = 0;\r
710 \r
711 //Flush all messages from the que\r
712 while (status != -1)\r
713 {\r
714 status = rpcWaitMqClientMsg(10);\r
715 if (status != -1)\r
716 {\r
717 msgCnt++;\r
718 }\r
719 }\r
720 \r
721 dbg_print(PRINT_LEVEL_INFO, "flushed %d message from msg queue\n", msgCnt);\r
722 \r
723 //Register Callbacks MT system callbacks\r
724 sysRegisterCallbacks(mtSysCb);\r
725 zdoRegisterCallbacks(mtZdoCb);\r
726 afRegisterCallbacks(mtAfCb);\r
727 \r
728 return 0;\r
729 }\r
730 uint8_t initDone = 0;\r
731 void* appMsgProcess(void *argument)\r
732 {\r
733 \r
734 if (initDone)\r
735 {\r
736 rpcWaitMqClientMsg(10000);\r
737 }\r
738 \r
739 return 0;\r
740 }\r
741 \r
742 void* appProcess(void *argument)\r
743 {\r
744 int32_t status;\r
745 uint32_t quit = 0;\r
746 \r
747 //Flush all messages from the que\r
748 do\r
749 {\r
750 status = rpcWaitMqClientMsg(50);\r
751 } while (status != -1);\r
752 \r
753 devState = DEV_HOLD;\r
754 \r
755 status = startNetwork();\r
756 if (status != -1)\r
757 {\r
758 consolePrint("Network up\n\n");\r
759 }\r
760 else\r
761 {\r
762 consolePrint("Network Error\n\n");\r
763 }\r
764 \r
765 sysGetExtAddr();\r
766 \r
767 OsalNvWriteFormat_t nvWrite;\r
768 nvWrite.Id = ZCD_NV_ZDO_DIRECT_CB;\r
769 nvWrite.Offset = 0;\r
770 nvWrite.Len = 1;\r
771 nvWrite.Value[0] = 1;\r
772 status = sysOsalNvWrite(&nvWrite);\r
773 \r
774 char cmd[128];\r
775 int attget;\r
776 \r
777 while (quit == 0)\r
778 {\r
779 nodeCount = 0;\r
780 initDone = 0;\r
781 displayDevices();\r
782 DataRequestFormat_t DataRequest;\r
783 consolePrint("Enter DstAddr:\n");\r
784 consoleGetLine(cmd, 128);\r
785 sscanf(cmd, "%x", &attget);\r
786 DataRequest.DstAddr = (uint16_t) attget;\r
787 \r
788 consolePrint("Enter DstEndpoint:\n");\r
789 consoleGetLine(cmd, 128);\r
790 sscanf(cmd, "%x", &attget);\r
791 DataRequest.DstEndpoint = (uint8_t) attget;\r
792 \r
793 DataRequest.SrcEndpoint = 1;\r
794 \r
795 DataRequest.ClusterID = 6;\r
796 \r
797 DataRequest.TransID = 5;\r
798 \r
799 DataRequest.Options = 0;\r
800 \r
801 DataRequest.Radius = 0xEE;\r
802 \r
803 initDone = 1;\r
804 \r
805 while (1)\r
806 {\r
807 uint8_t *data;\r
808 //initDone = 0;\r
809 \r
810 consolePrint(\r
811 "Enter message to send or type CHANGE to change the destination\n");\r
812 consolePrint("or QUIT to exit\n");\r
813 \r
814 consoleGetLine(cmd, 128);\r
815 //initDone = 1;\r
816 if (strcmp(cmd, "CHANGE") == 0)\r
817 {\r
818 break;\r
819 }\r
820 else if (strcmp(cmd, "QUIT") == 0)\r
821 {\r
822 quit = 1;\r
823 break;\r
824 }\r
825 data = (uint8_t*) cmd;\r
826 memcpy(DataRequest.Data, data, strlen(cmd));\r
827 DataRequest.Len = strlen(cmd);\r
828 initDone = 0;\r
829 afDataRequest(&DataRequest);\r
830 rpcWaitMqClientMsg(500);\r
831 initDone = 1;\r
832 }\r
833 \r
834 }\r
835 \r
836 return 0;\r
837 }\r
838 \r