2 #include <usb_accessory.h>
3 #include <Elementary.h>
6 #define USB_TAG "USB_ACC_TEST"
8 #define ACC_LOG(format, args...) \
9 LOG(LOG_VERBOSE, USB_TAG, "[%s][Ln: %d] " format, \
10 (char*)(strrchr(__FILE__, '/')+1), __LINE__, ##args)
12 #define ACC_LOG_ERROR(format, args...) \
13 LOG(LOG_ERROR, USB_TAG, "[%s][Ln: %d] " format, \
14 (char*)(strrchr(__FILE__, '/')+1), __LINE__, ##args)
16 #define __ACC_FUNC_ENTER__ \
17 ACC_LOG("Entering: %s()\n", __func__)
19 #define __ACC_FUNC_EXIT__ \
20 ACC_LOG("Exit: %s()\n", __func__)
30 usb_accessory_h usbAcc;
31 unsigned char input[3];
32 unsigned char output[3];
34 Evas_Object *win = NULL;
35 Evas_Object *bg = NULL;
36 Evas_Object *btn1 = NULL;
37 Evas_Object *btn2 = NULL;
38 Evas_Object *btn3 = NULL;
39 Evas_Object *btn4 = NULL;
40 Evas_Object *popup = NULL;
42 static void unload_popup();
44 static void _block_clicked_cb(void *data, Evas_Object *obj, void *event_info)
46 ACC_LOG("ENTER: _block_clicked_cb()");
48 ACC_LOG("EXIT: _block_clicked_cb()");
51 static void _timeout_cb(void *data, Evas_Object *obj, void *event_info)
53 ACC_LOG("ENTER: _timeout_cb()");
55 ACC_LOG("EXIT: _timeout_cb()");
58 static void unload_popup()
60 ACC_LOG("ENTER: unload_popup()");
61 evas_object_smart_callback_del(popup, "block,clicked", _block_clicked_cb);
62 evas_object_smart_callback_del(popup, "timeout", _timeout_cb);
64 evas_object_del(popup);
67 ACC_LOG("EXIT: unload_popup()");
70 static void launch_popup(char *str)
72 ACC_LOG("ENTER: launch_popup(char *str)");
75 evas_object_del(popup);
78 popup = elm_popup_add(win);
79 evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
80 elm_object_text_set(popup, str);
81 evas_object_smart_callback_add(popup, "block,clicked", _block_clicked_cb, NULL);
82 elm_popup_timeout_set(popup, 3.0);
83 evas_object_smart_callback_add(popup, "timeout", _timeout_cb, NULL);
84 evas_object_show(popup);
85 ACC_LOG("EXIT: launch_popup(char *str)");
88 void connect_acc_cb(void *data)
90 ACC_LOG("ENTER: connect_acc_cb()\n");
91 ACC_LOG("EXIT: connect_acc_cb()\n");
94 void disconnect_acc_cb(void *data)
96 ACC_LOG("ENTER: disconnect_acc_cb()\n");
97 int ret = usb_accessory_connection_unset_cb();
99 ACC_LOG("FAIL: usb_accessory_connection_unset_cb()\n");
101 ret = usb_accessory_destroy(usbAcc);
103 ACC_LOG("FAIL: usb_accessory_destroy(&usbAcc)\n");
106 ACC_LOG("EXIT: disconnect_acc_cb()\n");
109 void connection_cb_func(usb_accessory_h accessory, bool isConnected, void *data)
111 ACC_LOG("ENTER: connection_cb_func()\n");
112 if (isConnected == true) {
113 connect_acc_cb(accessory);
115 disconnect_acc_cb(accessory);
117 ACC_LOG("EXIT: connection_cb_func()\n");
120 static void send_request()
122 ACC_LOG("ENTER: send_request()\n");
125 int ret = usb_accessory_open(usbAcc, &fp);
127 ACC_LOG("FAIL: usb_accessory_open(usbAcc, fp)\n");
130 ACC_LOG("fd : %d\n", (int)fp);
132 disconnect_acc_cb(usbAcc);
135 ret = fwrite(input, 3, 1, fp);
137 ACC_LOG("FAIL: fwrite(input, 1, 3, fp)\n");
140 ret = fread(output, 3, 1, fp);
142 ACC_LOG("FAIL: fread(output, 1, 3, fp)\n");
145 ACC_LOG("OUTPUT: %d, %d, %d\n", output[0], output[1], output[2]);
146 snprintf(str, 64, "Input: Type %d<br>Output: %d, %d, %d", input[1], output[0], output[1], output[2]);
150 ACC_LOG("FAIL: fclose(fp)\n");
153 ACC_LOG("EXIT: send_request()\n");
156 static void on_click_1(void *data, Evas_Object *obj, void *event_info)
158 ACC_LOG("ENTER: on_click_1()\n");
163 ACC_LOG("EXIT: on_click_1()\n");
166 static void on_click_2(void *data, Evas_Object *obj, void *event_info)
168 ACC_LOG("ENTER: on_click_2()\n");
173 ACC_LOG("EXIT: on_click_2()\n");
176 static void on_click_3(void *data, Evas_Object *obj, void *event_info)
178 ACC_LOG("ENTER: on_click_3()\n");
183 ACC_LOG("EXIT: on_click_3()\n");
186 static void on_click_4(void *data, Evas_Object *obj, void *event_info)
188 ACC_LOG("ENTER: on_click_4()\n");
189 disconnect_acc_cb(usbAcc);
190 ACC_LOG("EXIT: on_click_4()\n");
193 static void register_btn_cb(usb_accessory_h accessory, bool isGranted)
195 ACC_LOG("ENTER: register_btn_cb()\n");
196 if (isGranted != true) {
197 disconnect_acc_cb(usbAcc);
200 evas_object_smart_callback_add(btn1, "clicked", on_click_1, NULL);
201 evas_object_smart_callback_add(btn2, "clicked", on_click_2, NULL);
202 evas_object_smart_callback_add(btn3, "clicked", on_click_3, NULL);
203 evas_object_smart_callback_add(btn4, "clicked", on_click_4, NULL);
204 ACC_LOG("EXIT: register_btn_cb()\n");
207 bool foreach_cb(usb_accessory_h handle, void *data)
209 ACC_LOG("ENTER: foreach_cb()\n");
210 if (!handle) return false;
213 char *manufacturer = NULL;
215 char *version = NULL;
216 ret = usb_accessory_get_manufacturer(handle, &manufacturer);
218 ACC_LOG("FAIL: usb_accessory_get_manufacturer(handle, &manufacturer)\n");
221 ret = usb_accessory_get_model(handle, &model);
223 ACC_LOG("FAIL: usb_accessory_get_model(handle, &model)\n");
226 ret = usb_accessory_get_version(handle, &version);
228 ACC_LOG("FAIL: usb_accessory_get_version(handle, &version)");
232 if (!strncmp(manufacturer, "Google, Inc.", strlen("Google, Inc."))
233 && !strncmp(model, "DemoKit", strlen("DemoKit"))
234 && !strncmp(version, "1.0", strlen("1.0"))) {
235 ret = usb_accessory_clone(handle, &usbAcc);
236 if (ret != USB_ERROR_NONE) {
237 ACC_LOG("FAIL: usb_accessory_clone(handle, &usbAcc)\n");
249 ACC_LOG("EXIT: foreach_cb()\n");
253 int main(int argc, char **argv)
255 ACC_LOG("ENTER: MAIN()");
259 ret = usb_accessory_set_connection_changed_cb(connection_cb_func, usbAcc);
261 ACC_LOG("FAIL: usb_accessory_set_connection_changed_cb()\n");
264 /* Check whether or not accessory is connected */
266 ret = usb_accessory_is_connected(NULL, &connected);
268 ACC_LOG("FAIL: usb_accessory_is_connected(NULL, &connected)\n");
271 if (connected == false) {
272 ACC_LOG("Accessory is not connected\n");
273 disconnect_acc_cb(NULL);
277 /* Retrieve an accessory which is one of the accessories connected and matches to this app */
278 ret = usb_accessory_foreach_attached(foreach_cb, &usbAcc);
280 ACC_LOG("FAIL: usb_accessory_foreach_attached(foreach_cb, usbAcc)\n");
281 disconnect_acc_cb(NULL);
284 if (usbAcc == NULL) {
285 ACC_LOG("Accessory is NULL\n");
286 disconnect_acc_cb(NULL);
290 /* Check whether or not this app has permission to open the accessory */
292 ret = usb_accessory_has_permission(usbAcc, &perm);
294 ACC_LOG("FAIL: usb_accessory_has_permission(usbAcc)\n");
298 elm_init(argc, argv);
299 win = elm_win_add(NULL, "Accessory", ELM_WIN_BASIC);
300 elm_win_title_set(win, "Usb Accessory Test");
301 elm_win_autodel_set(win, EINA_TRUE);
302 elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_LAST_WINDOW_CLOSED);
303 evas_object_resize(win, 240, 60);
304 evas_object_show(win);
306 bg = elm_bg_add(win);
307 evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
308 elm_win_resize_object_add(win, bg);
309 evas_object_show(bg);
311 btn1 = elm_button_add(win);
312 elm_object_text_set(btn1, "Type 1");
313 evas_object_resize(btn1, 300, 200);
314 evas_object_move(btn1, 100, 200);
315 evas_object_show(btn1);
317 btn2 = elm_button_add(win);
318 elm_object_text_set(btn2, "Type 2");
319 evas_object_resize(btn2, 300, 200);
320 evas_object_move(btn2, 100,450);
321 evas_object_show(btn2);
323 btn3 = elm_button_add(win);
324 elm_object_text_set(btn3, "Type 3");
325 evas_object_resize(btn3, 300, 200);
326 evas_object_move(btn3, 100, 700);
327 evas_object_show(btn3);
329 btn4 = elm_button_add(win);
330 elm_object_text_set(btn4, "Exit");
331 evas_object_resize(btn4, 300, 200);
332 evas_object_move(btn4, 100, 950);
333 evas_object_show(btn4);
336 register_btn_cb(usbAcc, true);
338 ret = usb_accessory_request_permission(usbAcc, register_btn_cb, NULL);
340 disconnect_acc_cb(NULL);