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