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 */
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 */
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} } };
79 #if MSG_INTERFACE > 0 /* Message Queue Interface */
81 #endif /*MSG_INTERFACE*/ /* Message Queue Interface */
82 char KeyEventType[64];
83 struct timeval recordtime;
91 #if MSG_INTERFACE > 0 /* Message Queue Interface */
92 static int sndqueuekey = 55555;
93 static int sndqueueid = 0;
96 #endif /*MSG_INTERFACE*/ /* Message Queue Interface */
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 */
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);
109 static struct libwebsocket_protocols protocols[] = {
110 {LWS_PROTOCOLNAME, lws_callback, 0},
113 #endif /*LWS_INTERFACE*/ /* WebSocket Interface */
115 #if MSG_INTERFACE > 0 /* Message Queue Interface */
117 init_comm(const int mqkey)
125 mqid = msgget(mqkey, 0);
127 mqid = msgget(mqkey, IPC_CREAT);
130 fprintf(stderr, "Can not create message queue(%d(0x%x))[%d]\n",
131 mqkey, mqkey, errno);
134 while (msgrcv(mqid, dummy, sizeof(dummy)-sizeof(long), 0, IPC_NOWAIT) > 0) ;
137 #endif /*MSG_INTERFACE*/ /* Message Queue Interface */
139 #if LWS_INTERFACE > 0 /* WebSocket Interface */
141 lws_callback(struct libwebsocket_context *context, struct libwebsocket *wsi,
142 enum libwebsocket_callback_reasons reason, void *user,
143 void *in, size_t len)
145 if (reason == LWS_CALLBACK_CLIENT_ESTABLISHED) {
153 init_comm(const int port, const char *spadr)
157 context = libwebsocket_create_context(CONTEXT_PORT_NO_LISTEN,
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",
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",
176 /* wait for connection */
177 for (rep = 0; rep < (2*1000); rep += 50) {
178 if (connected) break;
179 libwebsocket_service(context, 50);
182 #endif /*LWS_INTERFACE*/ /* WebSocket Interface */
185 init_vehicleinfo(void)
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);
193 #endif /*MSG_INTERFACE*/ /* Message Queue Interface */
197 set_vehicleinfo(const char *cmd)
206 struct KeyDataMsg_t 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 */
215 for (i = 0; cmd[i]; i++) {
216 if ((cmd[i] == '=') || (cmd[i] == ' ')) break;
217 if (j < (int)(sizeof(prop)-1)) {
225 for (i++; cmd[i]; i++) {
226 if (cmd[i] == ' ') continue;
227 if (j < (int)(sizeof(value)-1)) {
234 if (strcasecmp(prop, "sleep") == 0) {
237 for (i = 0; value[i]; i++) {
238 if (value[i] == '.') break;
239 sec = sec * 10 + (value[i] & 0x0f);
241 if (value[i] == '.') {
244 msec = (value[i] & 0x0f) * 100;
248 msec = msec + (value[i] & 0x0f) * 10;
252 msec = msec + (value[i] & 0x0f);
255 if (sec > 0) sleep(sec);
256 if (msec > 0) usleep(msec * 1000);
261 for (key = 0; vehicleinfo_key[key].prop[0]; key++) {
262 if (strcasecmp(prop, vehicleinfo_key[key].prop) == 0) break;
264 if (! vehicleinfo_key[key].prop[0]) {
265 fprintf(stderr, "VehicleInfo UnKnown property[%s]\n", prop);
269 memset(&msg, 0, sizeof(msg));
270 #if MSG_INTERFACE > 0 /* Message Queue Interface */
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 */
284 for (idx = 0; idx < 4; idx++) {
285 if (vehicleinfo_key[key].datatype[idx] == TYPE_NULL) break;
288 for (j = i; value[j]; j++) {
289 if ((value[j] == ',') || (value[j] == ';') ||
290 (value[j] == ':') || (value[j] == ' ')) break;
295 switch (vehicleinfo_key[key].datatype[idx] % 10) {
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");
303 else if (strcasecmp(&value[i], "sr") == 0) {
304 strcpy(&value[i], "1");
306 else if (strcasecmp(&value[i], "sn") == 0) {
307 strcpy(&value[i], "2");
309 else if ((strcasecmp(&value[i], "sd") == 0) ||
310 (strcasecmp(&value[i], "s4") == 0)) {
311 strcpy(&value[i], "4");
313 else if ((strcasecmp(&value[i], "s1") == 0) ||
314 (strcasecmp(&value[i], "sl") == 0)) {
315 strcpy(&value[i], "5");
317 else if (strcasecmp(&value[i], "s2") == 0) {
318 strcpy(&value[i], "6");
320 else if (strcasecmp(&value[i], "s3") == 0) {
321 strcpy(&value[i], "7");
324 msg.msg.data.status[pt++] = strtoul(&value[i], (char **)0, 0);
329 *((short *)&msg.msg.data.status[pt]) = strtol(&value[i], (char **)0, 0);
331 msgsize += sizeof(short);
335 *((int *)&msg.msg.data.status[pt]) = strtol(&value[i], (char **)0, 0);
337 msgsize += sizeof(int);
340 *((double *)&msg.msg.data.status[pt]) = strtod(&value[i], (char **)0);
341 pt += sizeof(double);
342 msgsize += sizeof(double);
350 switch (vehicleinfo_key[key].datatype[idx]) {
357 msgsize += sizeof(short);
361 msgsize += sizeof(int);
364 msgsize += sizeof(double);
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);
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);
383 #endif /*LWS_INTERFACE*/ /* WebSocket Interface */
387 usage(const char *prog)
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 */
399 main(int argc, char *argv[])
402 #if LWS_INTERFACE > 0 /* WebSocket Interface */
403 int port = LWS_DEFAULTPORT;
405 #endif /*LWS_INTERFACE*/ /* WebSocket Interface */
406 #if MSG_INTERFACE > 0 /* Message Queue Interface */
412 #endif /*MSG_INTERFACE*/ /* Message Queue Interface */
415 #if LWS_INTERFACE > 0 /* WebSocket Interface */
416 strcpy(spadr, LWS_DEFAULTIP);
417 #endif /*LWS_INTERFACE*/ /* WebSocket Interface */
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);
426 else if (strncasecmp(argv[i], "-mq", 3) == 0) {
427 if (argv[i][3] == '=') {
428 mqkey = strtol(&argv[i][4], (char **)0, 0);
431 mqkey = 55552; /* default message queue key */
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);
439 else if (strncasecmp(argv[i], "-ip=", 4) == 0) {
440 memset(spadr, 0, sizeof(spadr));
441 strncpy(spadr, &argv[i][4], sizeof(spadr)-1);
443 #endif /*LWS_INTERFACE*/ /* WebSocket Interface */
453 #if MSG_INTERFACE > 0 /* Message Queue Interface */
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 */
462 #if MSG_INTERFACE > 0 /* Message Queue Interface */
465 memset(&mqbuf, 0, sizeof(mqbuf));
466 if (msgrcv(mqid, &mqbuf, sizeof(mqbuf)-sizeof(long), 0, 0) < 0) break;
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;
478 set_vehicleinfo(&buf[j]);
480 msgctl(mqid, IPC_RMID, NULL);
483 #endif /*MSG_INTERFACE*/ /* Message Queue Interface */
485 while (fgets(buf, sizeof(buf), stdin)) {
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;
494 set_vehicleinfo(&buf[j]);
498 for (i = 1; i < argc; i++) {
499 if (argv[i][0] == '-') continue;
500 set_vehicleinfo(argv[i]);
503 #if LWS_INTERFACE > 0 /* WebSocket Interface */
505 libwebsocket_context_destroy(context);
507 #endif /*LWS_INTERFACE*/ /* WebSocket Interface */