Separated ICO System Controller from HomeScreen.
[profile/ivi/ico-uxf-homescreen.git] / tests / homescreen / ico_set_vehicleinfo.c
1 /*
2  * Copyright (c) 2013, TOYOTA MOTOR CORPORATION.
3  *
4  * This program is licensed under the terms and conditions of the
5  * Apache License, version 2.0.  The full text of the Apache License is at
6  * http://www.apache.org/licenses/LICENSE-2.0
7  *
8  */
9 /**
10  * @brief   System Test Tool for set VehicleInfo
11  *
12  * @date    Apr-09-2013
13  */
14
15 #define MSG_INTERFACE   0               /* 1= Message Queue Interface       */
16 #define LWS_INTERFACE   1               /* 1= WebSockets Interface          */
17
18 #include    <stdio.h>
19 #include    <stdlib.h>
20 #include    <unistd.h>
21 #include    <string.h>
22 #include    <errno.h>
23 #include    <pthread.h>
24 #include    <sys/ioctl.h>
25 #include    <sys/ipc.h>
26 #include    <sys/msg.h>
27 #include    <sys/time.h>
28 #include    <sys/types.h>
29 #if     LWS_INTERFACE > 0               /* WebSocket Interface              */
30 #include    <libwebsockets.h>
31 #endif /*LWS_INTERFACE*/                /* WebSocket Interface              */
32
33 #define TYPE_NULL   0
34 #define TYPE_BOOL   1
35 #define TYPE_BYTE   2
36 #define TYPE_INT16  3
37 #define TYPE_UINT16 4
38 #define TYPE_INT32  5
39 #define TYPE_UINT32 6
40 #define TYPE_DOUBLE 7
41 #define TYPE_STRING 8
42 #define TYPE_SHIFT  12
43
44 #if     LWS_INTERFACE > 0               /* WebSocket Interface              */
45 #define LWS_DEFAULTIP       "127.0.0.1" /* websockets default ip(localhost) */
46 #define LWS_DEFAULTPORT     25010       /* websockets default port          */
47 #define LWS_PROTOCOLNAME    "standarddatamessage-only"
48                                         /* websockets protocol name         */
49 #endif /*LWS_INTERFACE*/                /* WebSocket Interface              */
50
51 static const struct {
52     char        *prop;
53     char        *eventtype;
54     unsigned char   datatype[4];
55 }               vehicleinfo_key[] = {
56     { "VehicleSpeed", "VELOCITY", {TYPE_INT32, TYPE_NULL, 0,0} },
57     { "Speed", "VELOCITY", {TYPE_INT32, TYPE_NULL, 0,0} },
58     { "Velocity", "VELOCITY", {TYPE_INT32, TYPE_NULL, 0,0} },
59     { "Location", "LOCATION", {TYPE_DOUBLE, TYPE_DOUBLE, TYPE_DOUBLE, TYPE_NULL} },
60     { "Direction", "DIRECTION", {TYPE_DOUBLE, TYPE_NULL, 0,0} },
61     { "EngineSpeed", "ENGINE_SPEED", {TYPE_INT32, TYPE_NULL, 0, 0} },
62     { "Engine", "ENGINE_SPEED", {TYPE_INT32, TYPE_NULL, 0, 0} },
63     { "Shift", "SHIFT", {TYPE_SHIFT, TYPE_BYTE, TYPE_NULL, 0} },
64     { "ShiftPosition", "SHIFT", {TYPE_SHIFT, TYPE_BYTE, TYPE_NULL, 0} },
65     { "Break_Signal", "BRAKE_SIGNAL", {TYPE_BOOL, TYPE_NULL, 0,0} },
66     { "BreakSignal", "BRAKE_SIGNAL", {TYPE_BOOL, TYPE_NULL, 0,0} },
67     { "Break", "BRAKE_SIGNAL", {TYPE_BOOL, TYPE_NULL, 0,0} },
68     { "Blinker", "TURN_SIGNAL", {TYPE_INT32, TYPE_NULL, 0, 0} },
69     { "Winker", "TURN_SIGNAL", {TYPE_INT32, TYPE_NULL, 0, 0} },
70     { "TurnSignal", "TURN_SIGNAL", {TYPE_INT32, TYPE_NULL, 0, 0} },
71     { "Turn", "TURN_SIGNAL", {TYPE_INT32, TYPE_NULL, 0, 0} },
72     { "lightStatus", "LIGHTSTATUS", {TYPE_BOOL, TYPE_BOOL, TYPE_BOOL, TYPE_BOOL} },
73     { "light", "LIGHTSTATUS", {TYPE_BOOL, TYPE_BOOL, TYPE_BOOL, TYPE_BOOL} },
74     { "WATER_TEMP", "WATER_TEMP", {TYPE_INT32, TYPE_NULL, 0, 0} },
75     { "\0", "\0", {TYPE_NULL, 0,0,0} } };
76
77 struct KeyDataMsg_t
78 {
79 #if     MSG_INTERFACE > 0               /* Message Queue Interface      */
80     long mtype;
81 #endif /*MSG_INTERFACE*/                /* Message Queue Interface      */
82     char KeyEventType[64];
83     struct timeval recordtime;
84     struct KeyData
85     {
86         int common_status;
87         char status[];
88     } data;
89 };
90
91 #if     MSG_INTERFACE > 0               /* Message Queue Interface      */
92 static int  sndqueuekey = 55555;
93 static int  sndqueueid = 0;
94
95 static int  mqid = -1;
96 #endif /*MSG_INTERFACE*/                /* Message Queue Interface      */
97
98 #if     LWS_INTERFACE > 0               /* WebSocket Interface              */
99 static struct libwebsocket_context  *context = NULL;
100                                         /* websockets context               */
101 static struct libwebsocket          *websocket = NULL;
102                                         /* websockets connection            */
103 static int  connected = 0;              /* connection flag                  */
104
105 static int  lws_callback(struct libwebsocket_context *context, struct libwebsocket *wsi,
106                          enum libwebsocket_callback_reasons reason,
107                          void *user, void *in, size_t len);
108
109 static struct libwebsocket_protocols protocols[] = {
110             {LWS_PROTOCOLNAME, lws_callback, 0},
111             {NULL, NULL, -1}
112         };
113 #endif /*LWS_INTERFACE*/                /* WebSocket Interface              */
114
115 #if     MSG_INTERFACE > 0               /* Message Queue Interface      */
116 static void
117 init_comm(const int mqkey)
118 {
119     char    dummy[256];
120
121     if (mqkey == 0) {
122         mqid = -1;
123     }
124     else    {
125         mqid = msgget(mqkey, 0);
126         if (mqid < 0)   {
127             mqid = msgget(mqkey, IPC_CREAT);
128         }
129         if (mqid < 0)   {
130             fprintf(stderr, "Can not create message queue(%d(0x%x))[%d]\n",
131                     mqkey, mqkey, errno);
132             return;
133         }
134         while (msgrcv(mqid, dummy, sizeof(dummy)-sizeof(long), 0, IPC_NOWAIT) > 0)  ;
135     }
136 }
137 #endif /*MSG_INTERFACE*/                /* Message Queue Interface      */
138
139 #if     LWS_INTERFACE > 0               /* WebSocket Interface              */
140 static int
141 lws_callback(struct libwebsocket_context *context, struct libwebsocket *wsi,
142              enum libwebsocket_callback_reasons reason, void *user,
143              void *in, size_t len)
144 {
145     if (reason == LWS_CALLBACK_CLIENT_ESTABLISHED)  {
146         connected = 1;
147     }
148     /* do nothing       */
149     return 0;
150 }
151
152 static void
153 init_comm(const int port, const char *spadr)
154 {
155     int     rep;
156
157     context = libwebsocket_create_context(CONTEXT_PORT_NO_LISTEN,
158                                           spadr, protocols,
159                                           libwebsocket_internal_extensions,
160                                           NULL, NULL, -1, -1, 0);
161     if (context == NULL)    {
162         fprintf(stderr, "Can not create libwebsockets context(ip=%s port=%d)\n",
163                 spadr, port);
164         exit(2);
165     }
166
167     connected = 0;
168     websocket = libwebsocket_client_connect(context, spadr, port,
169                                             0, "/", spadr, "websocket",
170                                             protocols[0].name, -1);
171     if (websocket == NULL)  {
172         fprintf(stderr, "Can not connect libwebsockets context(ip=%s port=%d)\n",
173                 spadr, port);
174         exit(2);
175     }
176     /* wait for connection          */
177     for (rep = 0; rep < (2*1000); rep += 50)    {
178         if (connected)  break;
179         libwebsocket_service(context, 50);
180     }
181 }
182 #endif /*LWS_INTERFACE*/                /* WebSocket Interface              */
183
184 static void
185 init_vehicleinfo(void)
186 {
187 #if     MSG_INTERFACE > 0               /* Message Queue Interface      */
188     sndqueueid = msgget(sndqueuekey, 0);
189     if (sndqueueid < 0) {
190         fprintf(stderr, "Send Message Queue(%d(0x%x)) dose not exist[%d].\n",
191                 sndqueuekey, sndqueuekey, errno);
192     }
193 #endif /*MSG_INTERFACE*/                /* Message Queue Interface      */
194 }
195
196 static void
197 set_vehicleinfo(const char *cmd)
198 {
199     int     i, j;
200     int     idx, key, pt;
201     int     msgsize;
202     char    prop[64];
203     char    value[128];
204     int     sec, msec;
205     struct  {
206         struct KeyDataMsg_t     msg;
207         char    dummy[128];
208     }       msg;
209 #if     LWS_INTERFACE > 0               /* WebSocket Interface              */
210     unsigned char   buf[LWS_SEND_BUFFER_PRE_PADDING + 512 + LWS_SEND_BUFFER_POST_PADDING];
211     unsigned char   *bufpt = &buf[LWS_SEND_BUFFER_PRE_PADDING];
212 #endif /*LWS_INTERFACE*/                /* WebSocket Interface              */
213
214     j = 0;
215     for (i = 0; cmd[i]; i++)    {
216         if ((cmd[i] == '=') || (cmd[i] == ' ')) break;
217         if (j < (int)(sizeof(prop)-1))  {
218             prop[j++] = cmd[i];
219         }
220     }
221
222     prop[j] = 0;
223     j = 0;
224     if (cmd[i] != 0)    {
225         for (i++; cmd[i]; i++)  {
226             if (cmd[i] == ' ')  continue;
227             if (j < (int)(sizeof(value)-1)) {
228                 value[j++] = cmd[i];
229             }
230         }
231     }
232     value[j] = 0;
233
234     if (strcasecmp(prop, "sleep") == 0) {
235         sec = 0;
236         msec = 0;
237         for (i = 0; value[i]; i++)  {
238             if (value[i] == '.')        break;
239             sec = sec * 10 + (value[i] & 0x0f);
240         }
241         if (value[i] == '.')    {
242             i++;
243             if (value[i] != 0)  {
244                 msec = (value[i] & 0x0f) * 100;
245                 i++;
246             }
247             if (value[i] != 0)  {
248                 msec = msec + (value[i] & 0x0f) * 10;
249                 i++;
250             }
251             if (value[i] != 0)  {
252                 msec = msec + (value[i] & 0x0f);
253             }
254         }
255         if (sec > 0)    sleep(sec);
256         if (msec > 0)   usleep(msec * 1000);
257
258         return;
259     }
260
261     for (key = 0; vehicleinfo_key[key].prop[0]; key++)  {
262         if (strcasecmp(prop, vehicleinfo_key[key].prop) == 0)   break;
263     }
264     if (! vehicleinfo_key[key].prop[0]) {
265         fprintf(stderr, "VehicleInfo UnKnown property[%s]\n", prop);
266         return;
267     }
268
269     memset(&msg, 0, sizeof(msg));
270 #if     MSG_INTERFACE > 0               /* Message Queue Interface      */
271     msg.msg.mtype = 1;
272 #endif /*MSG_INTERFACE*/                /* Message Queue Interface      */
273     strcpy(msg.msg.KeyEventType, vehicleinfo_key[key].eventtype);
274     gettimeofday(&(msg.msg.recordtime), NULL);
275 #if     MSG_INTERFACE > 0               /* Message Queue Interface      */
276     msgsize = sizeof(msg) - 128 - sizeof(long);
277 #endif /*MSG_INTERFACE*/                /* Message Queue Interface      */
278 #if     LWS_INTERFACE > 0               /* WebSocket Interface              */
279     msgsize = sizeof(msg) - 128;
280 #endif /*LWS_INTERFACE*/                /* WebSocket Interface              */
281
282     i = 0;
283     pt = 0;
284     for (idx = 0; idx < 4; idx++)   {
285         if (vehicleinfo_key[key].datatype[idx] == TYPE_NULL)    break;
286
287         if (value[i])   {
288             for (j = i; value[j]; j++)  {
289                 if ((value[j] == ',') || (value[j] == ';') ||
290                     (value[j] == ':') || (value[j] == ' ')) break;
291             }
292             if (value[j] != 0)  {
293                 value[j++] = 0;
294             }
295             switch (vehicleinfo_key[key].datatype[idx] % 10) {
296             case TYPE_BOOL:
297             case TYPE_BYTE:
298                 if (vehicleinfo_key[key].datatype[idx] == TYPE_SHIFT)   {
299                     if ((strcasecmp(&value[i], "sp") == 0) ||
300                         (strcasecmp(&value[i], "s0") == 0)) {
301                         strcpy(&value[i], "0");
302                     }
303                     else if (strcasecmp(&value[i], "sr") == 0)  {
304                         strcpy(&value[i], "1");
305                     }
306                     else if (strcasecmp(&value[i], "sn") == 0)  {
307                         strcpy(&value[i], "2");
308                     }
309                     else if ((strcasecmp(&value[i], "sd") == 0) ||
310                              (strcasecmp(&value[i], "s4") == 0))    {
311                         strcpy(&value[i], "4");
312                     }
313                     else if ((strcasecmp(&value[i], "s1") == 0) ||
314                              (strcasecmp(&value[i], "sl") == 0))    {
315                         strcpy(&value[i], "5");
316                     }
317                     else if (strcasecmp(&value[i], "s2") == 0)  {
318                         strcpy(&value[i], "6");
319                     }
320                     else if (strcasecmp(&value[i], "s3") == 0)  {
321                         strcpy(&value[i], "7");
322                     }
323                 }
324                 msg.msg.data.status[pt++] = strtoul(&value[i], (char **)0, 0);
325                 msgsize += 1;
326                 break;
327             case TYPE_INT16:
328             case TYPE_UINT16:
329                 *((short *)&msg.msg.data.status[pt]) = strtol(&value[i], (char **)0, 0);
330                 pt += sizeof(short);
331                 msgsize += sizeof(short);
332                 break;
333             case TYPE_INT32:
334             case TYPE_UINT32:
335                 *((int *)&msg.msg.data.status[pt]) = strtol(&value[i], (char **)0, 0);
336                 pt += sizeof(int);
337                 msgsize += sizeof(int);
338                 break;
339             case TYPE_DOUBLE:
340                 *((double *)&msg.msg.data.status[pt]) = strtod(&value[i], (char **)0);
341                 pt += sizeof(double);
342                 msgsize += sizeof(double);
343                 break;
344             default:
345                 break;
346             }
347             i = j;
348         }
349         else    {
350             switch (vehicleinfo_key[key].datatype[idx]) {
351             case TYPE_BOOL:
352             case TYPE_BYTE:
353                 msgsize += 1;
354                 break;
355             case TYPE_INT16:
356             case TYPE_UINT16:
357                 msgsize += sizeof(short);
358                 break;
359             case TYPE_INT32:
360             case TYPE_UINT32:
361                 msgsize += sizeof(int);
362                 break;
363             case TYPE_DOUBLE:
364                 msgsize += sizeof(double);
365                 break;
366             default:
367                 break;
368             }
369         }
370     }
371
372 #if     MSG_INTERFACE > 0               /* Message Queue Interface      */
373     if (msgsnd(sndqueueid, &msg, msgsize, 0) < 0)   {
374         fprintf(stderr, "Message Queue(%d(0x%x)) send error[%d].\n",
375                 sndqueuekey, sndqueuekey, errno);
376     }
377 #endif /*MSG_INTERFACE*/                /* Message Queue Interface      */
378 #if     LWS_INTERFACE > 0               /* WebSocket Interface              */
379     memcpy(bufpt, &msg, msgsize);
380     if (libwebsocket_write(websocket, bufpt, msgsize, LWS_WRITE_BINARY) < 0)    {
381         fprintf(stderr, "libwebsockets send error\n"); fflush(stderr);
382     }
383 #endif /*LWS_INTERFACE*/                /* WebSocket Interface              */
384 }
385
386 static void
387 usage(const char *prog)
388 {
389 #if     LWS_INTERFACE > 0               /* WebSocket Interface              */
390     fprintf(stderr, "Usage: %s [-port=port] [-ip=ip_addr] [propaty=value] [propaty=value] ...\n", prog);
391 #endif /*LWS_INTERFACE*/                /* WebSocket Interface              */
392 #if     MSG_INTERFACE > 0               /* Message Queue Interface      */
393     fprintf(stderr, "Usage: %s [-ambkey=key] [-mq[=key]] [propaty=value] [propaty=value] ...\n", prog);
394 #endif /*MSG_INTERFACE*/                /* Message Queue Interface      */
395     exit(0);
396 }
397
398 int
399 main(int argc, char *argv[])
400 {
401     int     i, j;
402 #if     LWS_INTERFACE > 0               /* WebSocket Interface              */
403     int     port = LWS_DEFAULTPORT;
404     char    spadr[64];
405 #endif /*LWS_INTERFACE*/                /* WebSocket Interface              */
406 #if     MSG_INTERFACE > 0               /* Message Queue Interface      */
407     int     mqkey = 0;
408     struct {
409         long    mtype;
410         char    buf[240];
411     }       mqbuf;
412 #endif /*MSG_INTERFACE*/                /* Message Queue Interface      */
413     char    buf[240];
414
415 #if     LWS_INTERFACE > 0               /* WebSocket Interface              */
416     strcpy(spadr, LWS_DEFAULTIP);
417 #endif /*LWS_INTERFACE*/                /* WebSocket Interface              */
418
419     j = 0;
420     for (i = 1; i < argc; i++)  {
421         if (argv[i][0] == '-')  {
422 #if     MSG_INTERFACE > 0               /* Message Queue Interface      */
423             if (strncasecmp(argv[i], "-ambkey=", 8) == 0)   {
424                 sndqueuekey = strtoul(&argv[i][8], (char **)0, 0);
425             }
426             else if (strncasecmp(argv[i], "-mq", 3) == 0)  {
427                 if (argv[i][3] == '=')  {
428                     mqkey = strtol(&argv[i][4], (char **)0, 0);
429                 }
430                 else    {
431                     mqkey = 55552;          /* default message queue key    */
432                 }
433             }
434 #endif /*MSG_INTERFACE*/                /* Message Queue Interface      */
435 #if     LWS_INTERFACE > 0               /* WebSocket Interface              */
436             if (strncasecmp(argv[i], "-port=", 6) == 0)   {
437                 port = strtoul(&argv[i][6], (char **)0, 0);
438             }
439             else if (strncasecmp(argv[i], "-ip=", 4) == 0)   {
440                 memset(spadr, 0, sizeof(spadr));
441                 strncpy(spadr, &argv[i][4], sizeof(spadr)-1);
442             }
443 #endif /*LWS_INTERFACE*/                /* WebSocket Interface              */
444             else    {
445                 usage(argv[0]);
446             }
447         }
448         else    {
449             j++;
450         }
451     }
452
453 #if     MSG_INTERFACE > 0               /* Message Queue Interface      */
454     init_comm(mqkey);
455 #endif /*MSG_INTERFACE*/                /* Message Queue Interface      */
456 #if     LWS_INTERFACE > 0               /* WebSocket Interface              */
457     init_comm(port, spadr);
458 #endif /*LWS_INTERFACE*/                /* WebSocket Interface              */
459
460     init_vehicleinfo();
461
462 #if     MSG_INTERFACE > 0               /* Message Queue Interface      */
463     if (mqid >= 0)  {
464         while (1)   {
465             memset(&mqbuf, 0, sizeof(mqbuf));
466             if (msgrcv(mqid, &mqbuf, sizeof(mqbuf)-sizeof(long), 0, 0) < 0) break;
467             k = 0;
468             j = -1;
469             for (i = 0; mqbuf.buf[i]; i++)    {
470                 if ((mqbuf.buf[i] == '#') || (mqbuf.buf[i] == '\n')
471                     || (mqbuf.buf[i] == '\r'))    break;
472                 if (mqbuf.buf[i] == '\t') buf[k++] = ' ';
473                 else                        buf[k++] = mqbuf.buf[i];
474                 if ((j < 0) && (mqbuf.buf[i] != ' ')) j = i;
475             }
476             if (j < 0)  continue;
477             buf[k] = 0;
478             set_vehicleinfo(&buf[j]);
479         }
480         msgctl(mqid, IPC_RMID, NULL);
481     }
482     else
483 #endif /*MSG_INTERFACE*/                /* Message Queue Interface      */
484     if (j <= 0) {
485         while (fgets(buf, sizeof(buf), stdin))  {
486             j = -1;
487             for (i = 0; buf[i]; i++)    {
488                 if ((buf[i] == '#') || (buf[i] == '\n') || (buf[i] == '\r'))    break;
489                 if (buf[i] == '\t') buf[i] = ' ';
490                 if ((j < 0) && (buf[i] != ' ')) j = i;
491             }
492             if (j < 0)  continue;
493             buf[i] = 0;
494             set_vehicleinfo(&buf[j]);
495         }
496     }
497     else    {
498         for (i = 1; i < argc; i++)  {
499             if (argv[i][0] == '-')  continue;
500             set_vehicleinfo(argv[i]);
501         }
502     }
503 #if     LWS_INTERFACE > 0               /* WebSocket Interface              */
504     if (context)    {
505         libwebsocket_context_destroy(context);
506     }
507 #endif /*LWS_INTERFACE*/                /* WebSocket Interface              */
508
509     exit(0);
510 }
511