Remove debian packaging stuff
[platform/core/api/usb-accessory.git] / test / acc_test.c
1
2 #include <usb_accessory.h>
3 #include <Elementary.h>
4 #include <dlog.h>
5
6 #undef LOG_TAG
7 #define LOG_TAG "USB_ACC_TEST"
8
9 #define ACC_LOG(fmt, args...)   SLOGD(fmt, ##args)
10
11 #define FREE(arg) \
12         do { \
13                 if(arg) { \
14                         free((void *)arg); \
15                         arg = NULL; \
16                 } \
17         } while (0);
18
19 usb_accessory_h usbAcc;
20
21 Evas_Object *win = NULL;
22 Evas_Object *bg = NULL;
23 Evas_Object *btn1 = NULL;
24 Evas_Object *btn2 = NULL;
25 Evas_Object *btn3 = NULL;
26 Evas_Object *btn4 = NULL;
27 Evas_Object *popup = NULL;
28
29 static void unload_popup();
30
31 static void _block_clicked_cb(void *data, Evas_Object *obj, void *event_info)
32 {
33         ACC_LOG("ENTER: _block_clicked_cb()");
34         unload_popup();
35         ACC_LOG("EXIT: _block_clicked_cb()");
36 }
37
38 static void _timeout_cb(void *data, Evas_Object *obj, void *event_info)
39 {
40         ACC_LOG("ENTER: _timeout_cb()");
41         unload_popup();
42         ACC_LOG("EXIT: _timeout_cb()");
43 }
44
45 static void unload_popup()
46 {
47         ACC_LOG("ENTER: unload_popup()");
48         evas_object_smart_callback_del(popup, "block,clicked", _block_clicked_cb);
49         evas_object_smart_callback_del(popup, "timeout", _timeout_cb);
50         if (popup) {
51                 evas_object_del(popup);
52                 popup = NULL;
53         }
54         ACC_LOG("EXIT: unload_popup()");
55 }
56
57 static void launch_popup(char *str)
58 {
59         ACC_LOG("ENTER: launch_popup(char *str)");
60         if (!win) return;
61         if (popup) {
62                 evas_object_del(popup);
63                 popup = NULL;
64         }
65         popup = elm_popup_add(win);
66         evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
67         elm_object_text_set(popup, str);
68         evas_object_smart_callback_add(popup, "block,clicked", _block_clicked_cb, NULL);
69         elm_popup_timeout_set(popup, 3.0);
70         evas_object_smart_callback_add(popup, "timeout", _timeout_cb, NULL);
71         evas_object_show(popup);
72         ACC_LOG("EXIT: launch_popup(char *str)");
73 }
74
75 void connect_acc_cb(void *data)
76 {
77         ACC_LOG("ENTER: connect_acc_cb()");
78         ACC_LOG("EXIT: connect_acc_cb()");
79 }
80
81 void disconnect_acc_cb(void *data)
82 {
83         ACC_LOG("ENTER: disconnect_acc_cb()");
84         int ret = usb_accessory_connection_unset_cb();
85         if (ret < 0) {
86                 ACC_LOG("FAIL: usb_accessory_connection_unset_cb()");
87         }
88         ret = usb_accessory_destroy(usbAcc);
89         if (ret < 0){
90                 ACC_LOG("FAIL: usb_accessory_destroy(&usbAcc)");
91         }
92         elm_exit();
93         ACC_LOG("EXIT: disconnect_acc_cb()");
94 }
95
96 void connection_cb_func(usb_accessory_h accessory, bool isConnected, void *data)
97 {
98         ACC_LOG("ENTER: connection_cb_func()");
99         if (isConnected == true) {
100                 connect_acc_cb(accessory);
101         } else {
102                 disconnect_acc_cb(accessory);
103         }
104         ACC_LOG("EXIT: connection_cb_func()");
105 }
106
107 static void send_request(unsigned char input[], int len)
108 {
109         ACC_LOG("ENTER: send_request()");
110         char str[64];
111         FILE *fp;
112         int ret;
113         unsigned char output[3];
114
115         ret = usb_accessory_open(usbAcc, &fp);
116         if (ret < 0) {
117                 ACC_LOG("FAIL: usb_accessory_open(usbAcc, fp)");
118                 return ;
119         }
120         if (!fp) {
121                 disconnect_acc_cb(usbAcc);
122                 return ;
123         }
124
125         ACC_LOG("Before fwrite(), len: %d", len);
126
127         ret = fwrite(input, len, 1, fp);
128         if (ret < 0) {
129                 ACC_LOG("FAIL: fwrite()");
130                 return ;
131         }
132
133         ACC_LOG("After fwrite()");
134
135         ret = fread(output, sizeof(output), 1, fp);
136         if (ret < 0) {
137                 ACC_LOG("FAIL: fread()");
138                 return ;
139         }
140
141         ACC_LOG("OUTPUT: %d, %d, %d", output[0], output[1], output[2]);
142         snprintf(str, sizeof(str), "Input: Type %d<br>Output: %d, %d, %d",
143                                 input[1], output[0], output[1], output[2]);
144         launch_popup(str);
145
146         ret = fclose(fp);
147         if (0 != ret) {
148                 ACC_LOG("FAIL: fclose()");
149                 return ;
150         }
151
152         ACC_LOG("EXIT: send_request()");
153 }
154
155 static void on_click_1(void *data, Evas_Object *obj, void *event_info)
156 {
157         ACC_LOG("ENTER: on_click_1()");
158         unsigned char input[3];
159
160         input[0] = 0x2;
161         input[1] = 0x1;
162         input[2] = 0x1;
163
164         send_request(input, sizeof(input));
165         ACC_LOG("EXIT: on_click_1()");
166 }
167
168 static void on_click_2(void *data, Evas_Object *obj, void *event_info)
169 {
170         ACC_LOG("ENTER: on_click_2()");
171         unsigned char input[3];
172
173         input[0] = 0x2;
174         input[1] = 0x2;
175         input[2] = 0x1;
176
177         send_request(input, sizeof(input));
178         ACC_LOG("EXIT: on_click_2()");
179 }
180
181 static void on_click_3(void *data, Evas_Object *obj, void *event_info)
182 {
183         ACC_LOG("ENTER: on_click_3()");
184         unsigned char input[3];
185
186         input[0] = 0x2;
187         input[1] = 0x3;
188         input[2] = 0x1;
189
190         send_request(input, sizeof(input));
191         ACC_LOG("EXIT: on_click_3()");
192 }
193
194 static void on_click_4(void *data, Evas_Object *obj, void *event_info)
195 {
196         ACC_LOG("ENTER: on_click_4()");
197         disconnect_acc_cb(usbAcc);
198         ACC_LOG("EXIT: on_click_4()");
199 }
200
201 static void register_btn_cb(usb_accessory_h accessory, bool isGranted)
202 {
203         ACC_LOG("ENTER: register_btn_cb()");
204         if (!isGranted) {
205                 disconnect_acc_cb(usbAcc);
206                 return ;
207         }
208         evas_object_smart_callback_add(btn1, "clicked", on_click_1, NULL);
209         evas_object_smart_callback_add(btn2, "clicked", on_click_2, NULL);
210         evas_object_smart_callback_add(btn3, "clicked", on_click_3, NULL);
211         evas_object_smart_callback_add(btn4, "clicked", on_click_4, NULL);
212         ACC_LOG("EXIT: register_btn_cb()\n");
213 }
214
215 bool foreach_cb(usb_accessory_h handle, void *data)
216 {
217         ACC_LOG("ENTER: foreach_cb()");
218         int ret;
219         char *manufacturer;
220         char *model;
221         char *version;
222
223         if (!handle)
224                 return false;
225
226         ret = usb_accessory_get_manufacturer(handle, &manufacturer);
227         if (ret < 0) {
228                 ACC_LOG("FAIL: usb_accessory_get_manufacturer()");
229                 goto out_manufacturer;
230         }
231
232         ret = usb_accessory_get_model(handle, &model);
233         if (ret < 0) {
234                 ACC_LOG("FAIL: usb_accessory_get_model()");
235                 goto out_model;
236         }
237
238         ret = usb_accessory_get_version(handle, &version);
239         if (ret < 0) {
240                 ACC_LOG("FAIL: usb_accessory_get_version()");
241                 goto out_version;
242         }
243
244         ACC_LOG("Manufacturer(%s), model(%s), version(%s)", manufacturer, model, version);
245
246         if (!strncmp(manufacturer, "Tizen", strlen("Tizen"))
247                         && !strncmp(model, "DemoKit", strlen("DemoKit"))
248                         && !strncmp(version, "1.0", strlen("1.0"))) {
249                 ret = usb_accessory_clone(handle, &usbAcc);
250                 if (ret == USB_ERROR_NONE) {
251                         FREE(version);
252                         FREE(model);
253                         FREE(manufacturer);
254                         ACC_LOG("EXIT: foreach_cb()");
255                         return false;
256                 }
257         }
258
259 out_version:
260         FREE(version);
261 out_model:
262         FREE(model);
263 out_manufacturer:
264         FREE(manufacturer);
265
266         ACC_LOG("EXIT: foreach_cb()");
267         return true;
268 }
269
270 int main(int argc, char **argv)
271 {
272         ACC_LOG("ENTER: MAIN()");
273         bool ret;
274         bool connected;
275         bool perm;
276         usbAcc = NULL;
277
278         ret = usb_accessory_set_connection_changed_cb(connection_cb_func, usbAcc);
279         if (ret < 0) {
280                 ACC_LOG("FAIL: usb_accessory_set_connection_changed_cb()");
281                 return -1;
282         }
283
284         /* Check whether or not accessory is connected */
285         ret = usb_accessory_is_connected(NULL, &connected);
286         if (ret < 0) {
287                 ACC_LOG("FAIL: usb_accessory_is_connected(NULL, &connected)");
288                 return -1;
289         }
290         if (!connected) {
291                 ACC_LOG("Accessory is not connected");
292                 disconnect_acc_cb(NULL);
293                 exit(0);
294         }
295
296         /* Retrieve an accessory which is one of the accessories connected and matches to this app */
297         ret = usb_accessory_foreach_attached(foreach_cb, &usbAcc);
298         if (ret < 0) {
299                 ACC_LOG("FAIL: usb_accessory_foreach_attached(foreach_cb, usbAcc)");
300                 disconnect_acc_cb(NULL);
301                 return -1;
302         }
303         if (!usbAcc) {
304                 ACC_LOG("Accessory is NULL");
305                 disconnect_acc_cb(NULL);
306                 return -1;
307         }
308
309         /* Check whether or not this app has permission to open the accessory */
310         ret = usb_accessory_has_permission(usbAcc, &perm);
311         if (ret < 0) {
312                 ACC_LOG("FAIL: usb_accessory_has_permission(usbAcc)");
313                 return -1;
314         }
315
316         elm_init(argc, argv);
317         win = elm_win_add(NULL, "Accessory", ELM_WIN_BASIC);
318         elm_win_title_set(win, "Usb Accessory Test");
319         elm_win_autodel_set(win, EINA_TRUE);
320         elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_LAST_WINDOW_CLOSED);
321         evas_object_resize(win, 240, 60);
322         evas_object_show(win);
323
324         bg = elm_bg_add(win);
325         evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
326         elm_win_resize_object_add(win, bg);
327         evas_object_show(bg);
328
329         btn1 = elm_button_add(win);
330         elm_object_text_set(btn1, "Type 1");
331         evas_object_resize(btn1, 300, 200);
332         evas_object_move(btn1, 100, 200);
333         evas_object_show(btn1);
334
335         btn2 = elm_button_add(win);
336         elm_object_text_set(btn2, "Type 2");
337         evas_object_resize(btn2, 300, 200);
338         evas_object_move(btn2, 100,450);
339         evas_object_show(btn2);
340
341         btn3 = elm_button_add(win);
342         elm_object_text_set(btn3, "Type 3");
343         evas_object_resize(btn3, 300, 200);
344         evas_object_move(btn3, 100, 700);
345         evas_object_show(btn3);
346
347         btn4 = elm_button_add(win);
348         elm_object_text_set(btn4, "Exit");
349         evas_object_resize(btn4, 300, 200);
350         evas_object_move(btn4, 100, 950);
351         evas_object_show(btn4);
352
353         if (perm) {
354                 register_btn_cb(usbAcc, true);
355         } else {
356                 ret = usb_accessory_request_permission(usbAcc, register_btn_cb, NULL);
357                 if (ret < 0) {
358                         disconnect_acc_cb(NULL);
359                 }
360         }
361
362         elm_run();
363
364         elm_shutdown();
365         return 0;
366 }