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 applicatoin that send a command to homescreen
24 #include "home_screen.h"
25 #include "home_screen_res.h"
28 /*============================================================================*/
29 /* Define data types */
30 /*============================================================================*/
31 #define ICO_HSCMD_WS_TIMEOUT 0.05
32 #define ICO_HSCMD_WS_ADDRESS "127.0.0.1"
33 #define ICO_HSCMD_WS_PROTOCOL_NAME ICO_HS_PROTOCOL_CM
35 //#define hscmd_trace(...)
36 #define hscmd_trace(fmt, arg...) fprintf(stderr, ""fmt"\n",##arg)
38 /*============================================================================*/
39 /* static(internal) functions prototype */
40 /*============================================================================*/
41 static void hscmd_callback_uws(const struct ico_uws_context *context,
42 const ico_uws_evt_e event, const void *id,
43 const ico_uws_detail *detail, void *data);
45 static void hscmd_create_ws_context(void);
46 static void hscmd_destroy_ws_context(void);
47 static void hscmd_ws_service_loop(void);
48 static void hscmd_usage(const char *prog);
50 /*============================================================================*/
52 /*============================================================================*/
53 static int hscmd_ws_port = ICO_HS_WS_PORT;
54 static int hscmd_ws_connected = 0;
55 static struct ico_uws_context *hscmd_uws_context = NULL;
56 static void *hscmd_uws_id = NULL;
57 static FILE *hscmd_fp;
58 static int hscnd_send_end = 0;
60 /*============================================================================*/
62 /*============================================================================*/
63 /*--------------------------------------------------------------------------*/
65 * @brief hscmd_callback_uws
66 * callback function from UWS
68 * @param[in] context context
69 * @param[in] event event kinds
70 * @param[in] id client id
71 * @param[in] detail event detail
72 * @param[in] data user data
75 /*--------------------------------------------------------------------------*/
77 hscmd_callback_uws(const struct ico_uws_context *context,
78 const ico_uws_evt_e event, const void *id,
79 const ico_uws_detail *detail, void *data)
81 unsigned char msg[ICO_HS_TEMP_BUF_SIZE];
87 hscmd_trace("hscmd_callback_uws %p", context);
90 case ICO_UWS_EVT_OPEN:
91 hscmd_trace("hscmd_callback_uws: ICO_UWS_EVT_OPEN(id=%d)", (int)id);
92 hscmd_uws_id = (void *)id;
93 len = sprintf((char *)msg, "%s %s", ICO_HS_MSG_HEAD_CM, HS_REQ_ANS_HELLO);
94 ico_uws_send((struct ico_uws_context *)context, (void *)id, msg, len);
97 case ICO_UWS_EVT_CLOSE:
98 hscmd_trace("hscmd_callback_uws: ICO_UWS_EVT_CLOSE(id=%d)", (int)id);
99 hscmd_uws_context = NULL;
103 case ICO_UWS_EVT_RECEIVE:
104 hscmd_trace("hscmd_callback_uws: ICO_UWS_EVT_RECEIVE(id=%d, msg=%s, len=%d)",
105 (int)id, (char *)detail->_ico_uws_message.recv_data,
106 detail->_ico_uws_message.recv_len);
107 in = (char *)detail->_ico_uws_message.recv_data;
109 if(strncmp("ANS HELLO", in, 9) == 0) {
110 fseek(hscmd_fp, 0, SEEK_END);
111 fsize = ftell(hscmd_fp);
112 fseek(hscmd_fp, 0L, SEEK_SET);
114 len = (int)fsize + 4;
115 send = (void *)malloc(len);
117 memset(send, 0, len);
119 sprintf((char *)send, "%s ", ICO_HS_MSG_HEAD_CM);
121 fread(send + 4, 1, fsize, hscmd_fp);
122 hscmd_trace("hscmd_callback_uws: send (%s)", send);
124 ico_uws_send((struct ico_uws_context *)context, (void *)id, send, len);
130 case ICO_UWS_EVT_ERROR:
131 hscmd_trace("hscmd_callback_uws: ICO_UWS_EVT_ERROR(id=%d, err=%d)",
132 (int)id, detail->_ico_uws_error.code);
135 case ICO_UWS_EVT_ADD_FD:
136 hscmd_trace("hscmd_callback_uws: ICO_UWS_EVT_ADD_FD(id=%d, fd=%d)",
137 (int)id, detail->_ico_uws_fd.fd);
140 case ICO_UWS_EVT_DEL_FD:
141 hscmd_trace("hscmd_callback_uws: ICO_UWS_EVT_DEL_FD(id=%d, fd=%d)",
142 (int)id, detail->_ico_uws_fd.fd);
152 /*--------------------------------------------------------------------------*/
154 * @brief hscmd_create_ws_context
155 * connect to the homescreen using websocket.
160 /*--------------------------------------------------------------------------*/
162 hscmd_create_ws_context(void)
165 char uri[ICO_HS_TEMP_BUF_SIZE];
167 /* set up URI "ws://HOST:PORT" */
168 sprintf(uri, "ws://%s:%d", ICO_HS_WS_HOST, hscmd_ws_port);
170 hscmd_uws_context = ico_uws_create_context(uri, ICO_HS_PROTOCOL);
172 hscmd_ws_connected = 0;
173 if (hscmd_uws_context == NULL) {
174 fprintf(stderr, "libwebsocket_create_context failed.\n");
177 ret = ico_uws_set_event_cb(hscmd_uws_context, hscmd_callback_uws, NULL);
178 if (ret != ICO_UWS_ERR_NONE) {
179 hscmd_trace("hscmd_create_ws_context: cannnot set callback");
181 hscmd_ws_connected = 1;
185 /*--------------------------------------------------------------------------*/
187 * @brief hscmd_destroy_ws_context
188 * destroy websokets connection.
193 /*--------------------------------------------------------------------------*/
195 hscmd_destroy_ws_context(void)
197 if (hscmd_uws_context) {
198 ico_uws_service(hscmd_uws_context);
200 ico_uws_unset_event_cb(hscmd_uws_context);
201 ico_uws_close(hscmd_uws_context);
202 hscmd_uws_context = NULL;
203 hscmd_ws_connected = 0;
208 hscmd_ws_service_loop(void)
210 while (hscmd_ws_connected) {
211 ico_uws_service(hscmd_uws_context);
213 if (hscnd_send_end == 1) {
214 hscmd_destroy_ws_context();
220 hscmd_usage(const char *prog)
222 fprintf(stderr, "Usage: %s filename\n", prog);
226 /*--------------------------------------------------------------------------*/
228 * @brief test command tools
229 * send json format command to
232 * @param main() finction's standard parameter (argc,argv)
237 /*--------------------------------------------------------------------------*/
239 main(int argc, char *argv[])
244 hscmd_usage(argv[0]);
247 hscmd_fp = fopen(argv[1], "rb");
248 if (hscmd_fp == NULL) {
249 hscmd_usage(argv[0]);
252 /* Init websockets */
253 hscmd_create_ws_context();
255 hscmd_ws_service_loop();
257 hscmd_destroy_ws_context();