Fixed boot command to work with old and new bootloader
[iot-gateway/lighting-gateway.git] / getFwModel / getFwModel.c
1 /**************************************************************************************************\r
2  * Filename:       fwGetModel.c\r
3  * Description:    This file contains the interface to the UART.\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 #include <string.h>\r
40 #include <stdio.h>\r
41 #include <stdlib.h>\r
42 #include <poll.h>\r
43 \r
44 #include "zbSocCmd.h"\r
45 \r
46 uint8_t tlIndicationCb(epInfo_t *epInfo);\r
47 uint8_t utilGetDevInfoRspCb(uint8_t status, uint16_t nwkAddr,\r
48                 uint8_t ieeeAddr[8], uint8_t devType, uint8_t devState);\r
49 uint8_t zclGetModelCb(uint8_t *ModelId);\r
50 \r
51 static zbSocCallbacks_t zbSocCbs =\r
52 { tlIndicationCb, // pfnTlIndicationCb - TouchLink Indication callback\r
53                 NULL, // pfnNewDevIndicationCb - New Device Indication callback\r
54                 NULL, //pfnZclGetStateCb - ZCL response callback for get State\r
55                 NULL, //pfnZclGetLevelCb_t - ZCL response callback for get Level\r
56                 NULL, // pfnZclGetHueCb - ZCL response callback for get Hue\r
57                 NULL, //pfnZclGetSatCb - ZCL response callback for get Sat\r
58                 NULL, //pfnzdoSimpleDescRspCb - ZDO simple desc rsp\r
59                 NULL, // pfnZdoLeaveIndCb - ZDO Leave indication\r
60                 utilGetDevInfoRspCb, //pfnUtilGetDevInfoRspCb\r
61                 zclGetModelCb //pfnZclGetModelCb\r
62                 };\r
63 \r
64 void usage(char* exeName)\r
65 {\r
66         printf("Usage: ./%s <port>\n", exeName);\r
67         printf("Eample: ./%s /dev/ttyACM0\n", exeName);\r
68 }\r
69 \r
70 int main(int argc, char* argv[])\r
71 {       \r
72         int retval = 0;\r
73         int zbSoc_fd;\r
74 \r
75         //printf("%s -- %s %s\n", argv[0], __DATE__, __TIME__);\r
76 \r
77 \r
78         // accept only 1\r
79         if (argc != 2)\r
80         {\r
81                 usage(argv[0]);\r
82                 //printf("attempting to use /dev/ttyACM0\n");\r
83                 zbSoc_fd = zbSocOpen("/dev/ttyO4");\r
84         }\r
85         else\r
86         {\r
87                 zbSoc_fd = zbSocOpen(argv[1]);\r
88         }\r
89 \r
90         if (zbSoc_fd == -1)\r
91         {\r
92                 exit(-1);\r
93         }\r
94 \r
95         zbSocRegisterCallbacks(zbSocCbs);\r
96 \r
97         zbSocGetInfo();\r
98 \r
99         while (1)\r
100         {\r
101                 struct pollfd pollFd;\r
102 \r
103                 //set the zllSoC serial port FD in the poll file descriptors\r
104                 pollFd.fd = zbSoc_fd;\r
105                 pollFd.events = POLLIN;\r
106 \r
107                 //printf("%s: waiting for poll()\n", argv[1]);\r
108 \r
109                 poll(&pollFd, 1, 500);\r
110 \r
111                 //printf("%s: got poll()\n", argv[1]);\r
112 \r
113                 //did the poll unblock because of the zllSoC serial?\r
114                 if (pollFd.revents)\r
115                 {\r
116                         //printf("%s: Message from ZB SoC\n", argv[1]);\r
117                         zbSocProcessRpc();\r
118                 }\r
119                 else\r
120                 {\r
121                         //printf("timeout\n");\r
122                         static int timeoutCnt = 0;\r
123                         timeoutCnt++;\r
124                         if(timeoutCnt > 5)\r
125                         {\r
126                                 printf("Unknown model\n");\r
127                                 zbSocClose();\r
128                                 exit(0);\r
129                         }\r
130                         else if(timeoutCnt > 3)\r
131                         {\r
132                                 //maybe MT_UTIL is not define, assume coord (nwkAddr=0x0) and try to get model ID\r
133                                 zbSocGetModel(0x0000, 0xff, afAddr16Bit);\r
134                         }\r
135                         else\r
136                         {\r
137                                 zbSocGetInfo();\r
138                         }\r
139                 }\r
140         }\r
141 \r
142         return retval;\r
143 }\r
144 \r
145 uint8_t tlIndicationCb(epInfo_t *epInfo)\r
146 {\r
147 \r
148 return 0;\r
149 }\r
150 \r
151 uint8_t utilGetDevInfoRspCb(uint8_t status, uint16_t nwkAddr,\r
152         uint8_t ieeeAddr[8], uint8_t devType, uint8_t devState)\r
153 {\r
154         //printf("processRpcUtilGetDevInfoRsp: status:%x devState:%x, nwkAddr:%x ieeeIdx:%x:%x:%x:%x:%x:%x:%x:%x\n", status, devState, nwkAddr,\r
155 //ieeeAddr[7], ieeeAddr[6], ieeeAddr[5], ieeeAddr[4], ieeeAddr[3], ieeeAddr[2], ieeeAddr[1], ieeeAddr[0]);\r
156 \r
157         zbSocGetModel(nwkAddr, 0xff, afAddr16Bit);\r
158 \r
159         return 0;\r
160 }\r
161 \r
162 uint8_t zclGetModelCb(uint8_t *ModelId)\r
163 {\r
164         uint8_t strIdx;\r
165         printf("Model ID:");\r
166 \r
167         for(strIdx = 0; strIdx < ModelId[0]; strIdx++)\r
168         {\r
169                 printf("%c", ModelId[strIdx+1]);\r
170         }\r
171         printf("\n");\r
172 \r
173         zbSocClose();\r
174         exit(0);\r
175 \r
176         return 0;\r
177 }\r
178 \r