2 * Copyright (c) 2013, TOYOTA MOTOR CORPORATION.
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
10 * @brief System Test Tool for set VehicleInfo
15 #define MSG_INTERFACE 0 /* 1= Message Queue Interface */
16 #define LWS_INTERFACE 1 /* 1= WebSockets Interface */
24 #include <sys/ioctl.h>
28 #include <sys/types.h>
29 #if LWS_INTERFACE > 0 /* WebSocket Interface */
30 #include <libwebsockets.h>
31 #endif /*LWS_INTERFACE*/ /* WebSocket Interface */
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 */
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} } };
78 #if MSG_INTERFACE > 0 /* Message Queue Interface */
80 #endif /*MSG_INTERFACE*/ /* Message Queue Interface */
81 char KeyEventType[64];
82 struct timeval recordtime;
90 #if MSG_INTERFACE > 0 /* Message Queue Interface */
91 static int sndqueuekey = 55555;
92 static int sndqueueid = 0;
95 #endif /*MSG_INTERFACE*/ /* Message Queue Interface */
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 */
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);
108 static struct libwebsocket_protocols protocols[] = {
109 {LWS_PROTOCOLNAME, lws_callback, 0},
112 #endif /*LWS_INTERFACE*/ /* WebSocket Interface */
114 #if MSG_INTERFACE > 0 /* Message Queue Interface */
116 init_comm(const int mqkey)
124 mqid = msgget(mqkey, 0);
126 mqid = msgget(mqkey, IPC_CREAT);
129 fprintf(stderr, "Can not create message queue(%d(0x%x))[%d]\n",
130 mqkey, mqkey, errno);
133 while (msgrcv(mqid, dummy, sizeof(dummy)-sizeof(long), 0, IPC_NOWAIT) > 0) ;
136 #endif /*MSG_INTERFACE*/ /* Message Queue Interface */
138 #if LWS_INTERFACE > 0 /* WebSocket Interface */
140 lws_callback(struct libwebsocket_context *context, struct libwebsocket *wsi,
141 enum libwebsocket_callback_reasons reason, void *user,
142 void *in, size_t len)
144 if (reason == LWS_CALLBACK_CLIENT_ESTABLISHED) {
152 init_comm(const int port, const char *spadr)
156 context = libwebsocket_create_context(CONTEXT_PORT_NO_LISTEN,
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",
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",
175 /* wait for connection */
176 for (rep = 0; rep < (2*1000); rep += 50) {
177 if (connected) break;
178 libwebsocket_service(context, 50);
181 #endif /*LWS_INTERFACE*/ /* WebSocket Interface */
184 init_vehicleinfo(void)
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);
192 #endif /*MSG_INTERFACE*/ /* Message Queue Interface */
196 set_vehicleinfo(const char *cmd)
205 struct KeyDataMsg_t 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 */
214 for (i = 0; cmd[i]; i++) {
215 if ((cmd[i] == '=') || (cmd[i] == ' ')) break;
216 if (j < (int)(sizeof(prop)-1)) {
224 for (i++; cmd[i]; i++) {
225 if (cmd[i] == ' ') continue;
226 if (j < (int)(sizeof(value)-1)) {
233 if (strcasecmp(prop, "sleep") == 0) {
236 for (i = 0; value[i]; i++) {
237 if (value[i] == '.') break;
238 sec = sec * 10 + (value[i] & 0x0f);
240 if (value[i] == '.') {
243 msec = (value[i] & 0x0f) * 100;
247 msec = msec + (value[i] & 0x0f) * 10;
251 msec = msec + (value[i] & 0x0f);
254 if (sec > 0) sleep(sec);
255 if (msec > 0) usleep(msec * 1000);
260 for (key = 0; vehicleinfo_key[key].prop[0]; key++) {
261 if (strcasecmp(prop, vehicleinfo_key[key].prop) == 0) break;
263 if (! vehicleinfo_key[key].prop[0]) {
264 fprintf(stderr, "VehicleInfo UnKnown property[%s]\n", prop);
268 memset(&msg, 0, sizeof(msg));
269 #if MSG_INTERFACE > 0 /* Message Queue Interface */
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 */
283 for (idx = 0; idx < 4; idx++) {
284 if (vehicleinfo_key[key].datatype[idx] == TYPE_NULL) break;
287 for (j = i; value[j]; j++) {
288 if ((value[j] == ',') || (value[j] == ';') ||
289 (value[j] == ':') || (value[j] == ' ')) break;
294 switch (vehicleinfo_key[key].datatype[idx]) {
297 msg.msg.data.status[pt++] = strtoul(&value[i], (char **)0, 0);
302 *((short *)&msg.msg.data.status[pt]) = strtol(&value[i], (char **)0, 0);
304 msgsize += sizeof(short);
308 *((int *)&msg.msg.data.status[pt]) = strtol(&value[i], (char **)0, 0);
310 msgsize += sizeof(int);
313 *((double *)&msg.msg.data.status[pt]) = strtod(&value[i], (char **)0);
314 pt += sizeof(double);
315 msgsize += sizeof(double);
323 switch (vehicleinfo_key[key].datatype[idx]) {
330 msgsize += sizeof(short);
334 msgsize += sizeof(int);
337 msgsize += sizeof(double);
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);
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);
356 #endif /*LWS_INTERFACE*/ /* WebSocket Interface */
360 usage(const char *prog)
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 */
372 main(int argc, char *argv[])
375 #if LWS_INTERFACE > 0 /* WebSocket Interface */
376 int port = LWS_DEFAULTPORT;
378 #endif /*LWS_INTERFACE*/ /* WebSocket Interface */
379 #if MSG_INTERFACE > 0 /* Message Queue Interface */
385 #endif /*MSG_INTERFACE*/ /* Message Queue Interface */
388 #if LWS_INTERFACE > 0 /* WebSocket Interface */
389 strcpy(spadr, LWS_DEFAULTIP);
390 #endif /*LWS_INTERFACE*/ /* WebSocket Interface */
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);
399 else if (strncasecmp(argv[i], "-mq", 3) == 0) {
400 if (argv[i][3] == '=') {
401 mqkey = strtol(&argv[i][4], (char **)0, 0);
404 mqkey = 55552; /* default message queue key */
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);
412 else if (strncasecmp(argv[i], "-ip=", 4) == 0) {
413 memset(spadr, 0, sizeof(spadr));
414 strncpy(spadr, &argv[i][4], sizeof(spadr)-1);
416 #endif /*LWS_INTERFACE*/ /* WebSocket Interface */
426 #if MSG_INTERFACE > 0 /* Message Queue Interface */
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 */
435 #if MSG_INTERFACE > 0 /* Message Queue Interface */
438 memset(&mqbuf, 0, sizeof(mqbuf));
439 if (msgrcv(mqid, &mqbuf, sizeof(mqbuf)-sizeof(long), 0, 0) < 0) break;
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;
451 set_vehicleinfo(&buf[j]);
453 msgctl(mqid, IPC_RMID, NULL);
456 #endif /*MSG_INTERFACE*/ /* Message Queue Interface */
458 while (fgets(buf, sizeof(buf), stdin)) {
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;
467 set_vehicleinfo(&buf[j]);
471 for (i = 1; i < argc; i++) {
472 if (argv[i][0] == '-') continue;
473 set_vehicleinfo(argv[i]);
476 #if LWS_INTERFACE > 0 /* WebSocket Interface */
478 libwebsocket_context_destroy(context);
480 #endif /*LWS_INTERFACE*/ /* WebSocket Interface */