Tizen 2.0 Release
[framework/api/usb-accessory.git] / test / acc_test.c
1
2 #include <usb_accessory.h>
3 #include <Elementary.h>
4 #include <dlog.h>
5
6 #define USB_TAG "USB_ACC_TEST"
7
8 #define ACC_LOG(format, args...) \
9         LOG(LOG_VERBOSE, USB_TAG, "[%s][Ln: %d] " format, \
10                                         (char*)(strrchr(__FILE__, '/')+1), __LINE__, ##args)
11
12 #define ACC_LOG_ERROR(format, args...) \
13         LOG(LOG_ERROR, USB_TAG, "[%s][Ln: %d] " format, \
14                                         (char*)(strrchr(__FILE__, '/')+1), __LINE__, ##args)
15
16 #define __ACC_FUNC_ENTER__ \
17                         ACC_LOG("Entering: %s()\n", __func__)
18
19 #define __ACC_FUNC_EXIT__ \
20                         ACC_LOG("Exit: %s()\n", __func__)
21
22 #define FREE(arg) \
23         do { \
24                 if(arg) { \
25                         free((void *)arg); \
26                         arg = NULL; \
27                 } \
28         } while (0);
29
30 usb_accessory_h usbAcc;
31 unsigned char input[3];
32 unsigned char output[3];
33
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;
41
42 static void unload_popup();
43
44 static void _block_clicked_cb(void *data, Evas_Object *obj, void *event_info)
45 {
46         ACC_LOG("ENTER: _block_clicked_cb()");
47         unload_popup();
48         ACC_LOG("EXIT: _block_clicked_cb()");
49 }
50
51 static void _timeout_cb(void *data, Evas_Object *obj, void *event_info)
52 {
53         ACC_LOG("ENTER: _timeout_cb()");
54         unload_popup();
55         ACC_LOG("EXIT: _timeout_cb()");
56 }
57
58 static void unload_popup()
59 {
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);
63         if (popup) {
64                 evas_object_del(popup);
65                 popup = NULL;
66         }
67         ACC_LOG("EXIT: unload_popup()");
68 }
69
70 static void launch_popup(char *str)
71 {
72         ACC_LOG("ENTER: launch_popup(char *str)");
73         if (!win) return;
74         if (popup) {
75                 evas_object_del(popup);
76                 popup = NULL;
77         }
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)");
86 }
87
88 void connect_acc_cb(void *data)
89 {
90         ACC_LOG("ENTER: connect_acc_cb()\n");
91         ACC_LOG("EXIT: connect_acc_cb()\n");
92 }
93
94 void disconnect_acc_cb(void *data)
95 {
96         ACC_LOG("ENTER: disconnect_acc_cb()\n");
97         int ret = usb_accessory_connection_unset_cb();
98         if (ret < 0) {
99                 ACC_LOG("FAIL: usb_accessory_connection_unset_cb()\n");
100         }
101         ret = usb_accessory_destroy(usbAcc);
102         if (ret < 0){
103                 ACC_LOG("FAIL: usb_accessory_destroy(&usbAcc)\n");
104         }
105         elm_exit();
106         ACC_LOG("EXIT: disconnect_acc_cb()\n");
107 }
108
109 void connection_cb_func(usb_accessory_h accessory, bool isConnected, void *data)
110 {
111         ACC_LOG("ENTER: connection_cb_func()\n");
112         if (isConnected == true) {
113                 connect_acc_cb(accessory);
114         } else {
115                 disconnect_acc_cb(accessory);
116         }
117         ACC_LOG("EXIT: connection_cb_func()\n");
118 }
119
120 static void send_request()
121 {
122         ACC_LOG("ENTER: send_request()\n");
123         char str[64];
124         FILE *fp = NULL;
125         int ret = usb_accessory_open(usbAcc, &fp);
126         if (ret < 0) {
127                 ACC_LOG("FAIL: usb_accessory_open(usbAcc, fp)\n");
128                 return ;
129         }
130         ACC_LOG("fd : %d\n", (int)fp);
131         if (fp <= 0) {
132                 disconnect_acc_cb(usbAcc);
133         }
134
135         ret = fwrite(input, 3, 1, fp);
136         if (ret < 0) {
137                 ACC_LOG("FAIL: fwrite(input, 1, 3, fp)\n");
138                 return ;
139         }
140         ret = fread(output, 3, 1, fp);
141         if (ret < 0) {
142                 ACC_LOG("FAIL: fread(output, 1, 3, fp)\n");
143                 return ;
144         }
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]);
147         launch_popup(str);
148         ret = fclose(fp);
149         if (0 != ret) {
150                 ACC_LOG("FAIL: fclose(fp)\n");
151                 return ;
152         }
153         ACC_LOG("EXIT: send_request()\n");
154 }
155
156 static void on_click_1(void *data, Evas_Object *obj, void *event_info)
157 {
158         ACC_LOG("ENTER: on_click_1()\n");
159         input[0] = 0x2;
160         input[1] = 0x1;
161         input[2] = 0x1;
162         send_request();
163         ACC_LOG("EXIT: on_click_1()\n");
164 }
165
166 static void on_click_2(void *data, Evas_Object *obj, void *event_info)
167 {
168         ACC_LOG("ENTER: on_click_2()\n");
169         input[0] = 0x2;
170         input[1] = 0x2;
171         input[2] = 0x1;
172         send_request();
173         ACC_LOG("EXIT: on_click_2()\n");
174 }
175
176 static void on_click_3(void *data, Evas_Object *obj, void *event_info)
177 {
178         ACC_LOG("ENTER: on_click_3()\n");
179         input[0] = 0x2;
180         input[1] = 0x3;
181         input[2] = 0x1;
182         send_request();
183         ACC_LOG("EXIT: on_click_3()\n");
184 }
185
186 static void on_click_4(void *data, Evas_Object *obj, void *event_info)
187 {
188         ACC_LOG("ENTER: on_click_4()\n");
189         disconnect_acc_cb(usbAcc);
190         ACC_LOG("EXIT: on_click_4()\n");
191 }
192
193 static void register_btn_cb(usb_accessory_h accessory, bool isGranted)
194 {
195         ACC_LOG("ENTER: register_btn_cb()\n");
196         if (isGranted != true) {
197                 disconnect_acc_cb(usbAcc);
198                 return ;
199         }
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");
205 }
206
207 bool foreach_cb(usb_accessory_h handle, void *data)
208 {
209         ACC_LOG("ENTER: foreach_cb()\n");
210         if (!handle) return false;
211         bool ret_val = true;
212         int ret = -1;
213         char *manufacturer = NULL;
214         char *model = NULL;
215         char *version = NULL;
216         ret = usb_accessory_get_manufacturer(handle, &manufacturer);
217         if (ret < 0) {
218                 ACC_LOG("FAIL: usb_accessory_get_manufacturer(handle, &manufacturer)\n");
219                 return true;
220         }
221         ret = usb_accessory_get_model(handle, &model);
222         if (ret < 0) {
223                 ACC_LOG("FAIL: usb_accessory_get_model(handle, &model)\n");
224                 return true;
225         }
226         ret = usb_accessory_get_version(handle, &version);
227         if (ret < 0) {
228                 ACC_LOG("FAIL: usb_accessory_get_version(handle, &version)");
229                 return true;
230         }
231
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");
238                         ret_val = true;
239                 } else {
240                         ret_val = false;
241                 }
242         } else {
243                 ret_val = true;
244         }
245         FREE(manufacturer);
246         FREE(model);
247         FREE(version);
248
249         ACC_LOG("EXIT: foreach_cb()\n");
250         return ret_val;
251 }
252
253 int main(int argc, char **argv)
254 {
255         ACC_LOG("ENTER: MAIN()");
256         bool ret = false;
257         usbAcc = NULL;
258
259         ret = usb_accessory_set_connection_changed_cb(connection_cb_func, usbAcc);
260         if (ret < 0) {
261                 ACC_LOG("FAIL: usb_accessory_set_connection_changed_cb()\n");
262                 return -1;
263         }
264         /* Check whether or not accessory is connected */
265         bool connected;
266         ret = usb_accessory_is_connected(NULL, &connected);
267         if (ret < 0) {
268                 ACC_LOG("FAIL: usb_accessory_is_connected(NULL, &connected)\n");
269                 return -1;
270         }
271         if (connected == false) {
272                 ACC_LOG("Accessory is not connected\n");
273                 disconnect_acc_cb(NULL);
274                 exit(0);
275         }
276
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);
279         if (ret < 0) {
280                 ACC_LOG("FAIL: usb_accessory_foreach_attached(foreach_cb, usbAcc)\n");
281                 disconnect_acc_cb(NULL);
282                 return -1;
283         }
284         if (usbAcc == NULL) {
285                 ACC_LOG("Accessory is NULL\n");
286                 disconnect_acc_cb(NULL);
287                 return -1;
288         }
289
290         /* Check whether or not this app has permission to open the accessory */
291         bool perm;
292         ret = usb_accessory_has_permission(usbAcc, &perm);
293         if (ret < 0) {
294                 ACC_LOG("FAIL: usb_accessory_has_permission(usbAcc)\n");
295                 return -1;
296         }
297
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);
305
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);
310
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);
316
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);
322
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);
328
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);
334
335         if (perm == true) {
336                 register_btn_cb(usbAcc, true);
337         } else {
338                 ret = usb_accessory_request_permission(usbAcc, register_btn_cb, NULL);
339                 if (ret < 0) {
340                         disconnect_acc_cb(NULL);
341                 }
342         }
343
344         elm_run();
345
346         elm_shutdown();
347         return 0;
348 }