1 #include <unistd.h>
2 #include <stdio.h>
3 #include <string.h>
4 #include <errno.h>
5 #include <alsa/asoundlib.h>
6 #include <pthread.h>
7
8 #include <RkBtBase.h>
9 #include <RkBtSink.h>
10 #include <RkBtSource.h>
11 #include <RkBle.h>
12 #include <RkBtSpp.h>
13 #include <RkBtHfp.h>
14 #include <RkBleClient.h>
15 #include <RkBtObex.h>
16 #include <RkBtPan.h>
17
18 #include "bt_test.h"
19
20 /* Immediate wifi Service UUID */
21 #define BLE_UUID_SERVICE "00001111-0000-1000-8000-00805F9B34FB"
22 #define BLE_UUID_WIFI_CHAR "00002222-0000-1000-8000-00805F9B34FB"
23 #define BLE_UUID_PROXIMITY "7B931104-1810-4CBC-94DA-875C8067F845"
24 #define BLE_UUID_SEND "dfd4416e-1810-47f7-8248-eb8be3dc47f9"
25 #define BLE_UUID_RECV "9884d812-1810-4a24-94d3-b2c11a851fac"
26 #define SERVICE_UUID "00001910-0000-1000-8000-00805f9b34fb"
27
28 #define HFP_PCM_CHANNEL_NB 2
29 #define CVSD_SAMPLE_RATE 8000
30 #define MSBC_SAMPLE_RATE 16000
31
32 #define READ_FRAME_256 256
33 #define BUFFER_SIZE_1024 1024
34 #define PERIOD_SIZE_256 READ_FRAME_256
35
36 #define READ_FRAME_512 512
37 #define BUFFER_SIZE_2048 2048
38 #define PERIOD_SIZE_512 READ_FRAME_512
39
40 #define READ_FRAME_1024 1024
41 #define BUFFER_SIZE_4096 4096
42 #define PERIOD_SIZE_1024 READ_FRAME_1024
43
44 static const char *alsa_playback_device = "default";
45 static const char *alsa_capture_device = "6mic_loopback"; //"2mic_loopback";
46 static const char *bt_playback_device = "hw:1,0";
47 static const char *bt_capture_device = "hw:1,0";
48
49 typedef struct {
50 unsigned int channels;
51 unsigned int sample_rate;
52 snd_pcm_uframes_t period_size;
53 snd_pcm_uframes_t buffer_size;
54 } alsa_config_t;
55
56 typedef struct {
57 bool alsa_duplex_opened;
58 bool bt_duplex_opened;
59 pthread_t alsa_tid;
60 pthread_t bt_tid;
61 } duplex_info_t;
62
63 static duplex_info_t g_duplex_control = {
64 false,
65 false,
66 0,
67 0,
68 };
69
70 static RkBtScanedDevice *g_paired_dev_list;
71 static unsigned int g_mtu = 0;
72
73 static void bt_test_ble_recv_data_callback(const char *uuid, char *data, int len);
74 static void bt_test_ble_request_data_callback(const char *uuid, char *data, int *len);
75 /* Must be initialized before using Bluetooth ble */
76 static RkBtContent bt_content;
77
78 static RK_BT_SCO_CODEC_TYPE sco_codec = BT_SCO_CODEC_CVSD;
79 /******************************************/
80 /* BT base server init */
81 /******************************************/
82 static volatile bool gonff = false;
bt_test_state_cb(RK_BT_STATE state)83 static void bt_test_state_cb(RK_BT_STATE state)
84 {
85 switch(state) {
86 case RK_BT_STATE_TURNING_ON:
87 printf("++++++++++ RK_BT_STATE_TURNING_ON ++++++++++\n");
88 break;
89 case RK_BT_STATE_ON:
90 printf("++++++++++ RK_BT_STATE_ON ++++++++++\n");
91 gonff = true;
92 break;
93 case RK_BT_STATE_TURNING_OFF:
94 printf("++++++++++ RK_BT_STATE_TURNING_OFF ++++++++++\n");
95 break;
96 case RK_BT_STATE_OFF:
97 printf("++++++++++ RK_BT_STATE_OFF ++++++++++\n");
98 gonff = false;
99 break;
100 }
101 }
102
bt_test_bond_state_cb(const char * bd_addr,const char * name,RK_BT_BOND_STATE state)103 static void bt_test_bond_state_cb(const char *bd_addr, const char *name, RK_BT_BOND_STATE state)
104 {
105 switch(state) {
106 case RK_BT_BOND_STATE_NONE:
107 printf("++++++++++ BT BOND NONE: %s, %s ++++++++++\n", name, bd_addr);
108 break;
109 case RK_BT_BOND_STATE_BONDING:
110 printf("++++++++++ BT BOND BONDING: %s, %s ++++++++++\n", name, bd_addr);
111 break;
112 case RK_BT_BOND_STATE_BONDED:
113 printf("++++++++++ BT BONDED: %s, %s ++++++++++\n", name, bd_addr);
114 break;
115 }
116 }
117
bt_test_discovery_status_cb(RK_BT_DISCOVERY_STATE status)118 static void bt_test_discovery_status_cb(RK_BT_DISCOVERY_STATE status)
119 {
120 switch(status) {
121 case RK_BT_DISC_STARTED:
122 printf("++++++++++ RK_BT_DISC_STARTED ++++++++++\n");
123 break;
124 case RK_BT_DISC_STOPPED_AUTO:
125 printf("++++++++++ RK_BT_DISC_STOPPED_AUTO ++++++++++\n");
126 break;
127 case RK_BT_DISC_START_FAILED:
128 printf("++++++++++ RK_BT_DISC_START_FAILED ++++++++++\n");
129 break;
130 case RK_BT_DISC_STOPPED_BY_USER:
131 printf("++++++++++ RK_BT_DISC_STOPPED_BY_USER ++++++++++\n");
132 break;
133 }
134
135 if(status != RK_BT_DISC_STARTED) {
136 printf("+++++++++ deregister scan callback +++++++++\n");
137 rk_bt_register_discovery_callback(NULL);
138 rk_bt_register_dev_found_callback(NULL);
139 }
140 }
141
bt_test_dev_found_cb(const char * address,const char * name,unsigned int bt_class,int rssi)142 static void bt_test_dev_found_cb(const char *address,const char *name, unsigned int bt_class, int rssi)
143 {
144 printf("++++++++++++ Device is found ++++++++++++\n");
145 printf(" address: %s\n", address);
146 printf(" name: %s\n", name);
147 printf(" class: 0x%x\n", bt_class);
148 printf(" rssi: %d\n", rssi);
149 printf("+++++++++++++++++++++++++++++++++++++++++\n");
150 }
151
bt_test_name_change_cb(const char * bd_addr,const char * name)152 static void bt_test_name_change_cb(const char *bd_addr, const char *name)
153 {
154 if(bd_addr)
155 printf("+++++ Device Name Change(%s, %s) +++++\n", bd_addr, name);
156 }
157
158
159 /*
160 * The Bluetooth basic service is turned on and the function
161 * must be called before using the Bluetooth function.
162 */
163 #if 0
164 void *bt_test_bluetooth_init_thread(void *arg)
165 {
166 printf("%s: BT BLUETOOTH INIT\n", __func__);
167 memset(&bt_content, 0, sizeof(RkBtContent));
168 bt_content.bt_name = "ROCKCHIP_TEST";
169 //bt_content.bt_addr = "11:22:33:44:55:66";
170
171 bt_content.ble_content.ble_name = "ROCKCHIP_AUDIO BLE";
172
173 #if 0
174 //user-defined ble address test, if not set, the default random address
175 bt_content.ble_content.ble_addr[0] = 0x11;
176 bt_content.ble_content.ble_addr[1] = 0x22;
177 bt_content.ble_content.ble_addr[2] = 0x33;
178 bt_content.ble_content.ble_addr[3] = 0x44;
179 bt_content.ble_content.ble_addr[4] = 0x55;
180 bt_content.ble_content.ble_addr[5] = 0x66;
181 //Clear two most significant bits
182 bt_content.ble_content.ble_addr[5] &= 0x3f;
183 //Set second most significant bit, Private resolvable
184 bt_content.ble_content.ble_addr[5] |= 0x40;
185 printf("ble_addr: %02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx\n",
186 bt_content.ble_content.ble_addr[5], bt_content.ble_content.ble_addr[4],
187 bt_content.ble_content.ble_addr[3], bt_content.ble_content.ble_addr[2],
188 bt_content.ble_content.ble_addr[1], bt_content.ble_content.ble_addr[0]);
189 #endif
190
191 bt_content.ble_content.server_uuid.uuid = BLE_UUID_SERVICE;
192 bt_content.ble_content.server_uuid.len = UUID_128;
193 bt_content.ble_content.chr_uuid[0].uuid = BLE_UUID_WIFI_CHAR;
194 bt_content.ble_content.chr_uuid[0].len = UUID_128;
195 bt_content.ble_content.chr_uuid[1].uuid = BLE_UUID_SEND;
196 bt_content.ble_content.chr_uuid[1].len = UUID_128;
197 bt_content.ble_content.chr_uuid[2].uuid = BLE_UUID_RECV;
198 bt_content.ble_content.chr_uuid[2].len = UUID_128;
199 bt_content.ble_content.chr_cnt = 3;
200 bt_content.ble_content.advDataType = BLE_ADVDATA_TYPE_SYSTEM;
201 bt_content.ble_content.cb_ble_recv_fun = bt_test_ble_recv_data_callback;
202 bt_content.ble_content.cb_ble_request_data = bt_test_ble_request_data_callback;
203
204 rk_bt_register_state_callback(bt_test_state_cb);
205 rk_bt_register_bond_callback(bt_test_bond_state_cb);
206 rk_bt_register_name_change_callback(bt_test_name_change_cb);
207 rk_bt_init(&bt_content);
208
209 return NULL;
210 }
211 #else
212 //BLE_ADVDATA_TYPE_USER demo
bt_test_bluetooth_init_thread(void * arg)213 void *bt_test_bluetooth_init_thread(void *arg)
214 {
215 printf("%s: BT BLUETOOTH INIT\n", __func__);
216
217 int len, ble_name_len, remain_len;
218
219 memset(&bt_content, 0, sizeof(RkBtContent));
220 bt_content.bt_name = "ROCKCHIP_AUDIO";
221 //bt_content.bt_addr = "11:22:33:44:55:66";
222
223 bt_content.ble_content.ble_name = "ROCKCHIP_AUDIO_BLE";
224 bt_content.ble_content.server_uuid.uuid = SERVICE_UUID;
225 bt_content.ble_content.server_uuid.len = UUID_128;
226 bt_content.ble_content.chr_uuid[0].uuid = BLE_UUID_SEND;
227 bt_content.ble_content.chr_uuid[0].len = UUID_128;
228 bt_content.ble_content.chr_uuid[1].uuid = BLE_UUID_RECV;
229 bt_content.ble_content.chr_uuid[1].len = UUID_128;
230 bt_content.ble_content.chr_cnt = 2;
231
232 bt_content.ble_content.advDataType = BLE_ADVDATA_TYPE_USER;
233
234 //标识设备 LE 物理连接的功能
235 bt_content.ble_content.advData[1] = 0x02;
236 bt_content.ble_content.advData[2] = 0x01;
237 bt_content.ble_content.advData[3] = 0x02;
238
239 //service uuid(SERVICE_UUID)
240 bt_content.ble_content.advData[4] = 0x03;
241 bt_content.ble_content.advData[5] = 0x03;
242 bt_content.ble_content.advData[6] = 0x10;
243 bt_content.ble_content.advData[7] = 0x19;
244
245 //ble name
246 printf("ble_name_len: %s(%d)\n", bt_content.ble_content.ble_name, strlen(bt_content.ble_content.ble_name));
247 ble_name_len = strlen(bt_content.ble_content.ble_name);
248 remain_len = 31 - (bt_content.ble_content.advData[1] + 1)
249 - (bt_content.ble_content.advData[4] + 1);
250 len = ble_name_len > remain_len ? remain_len : ble_name_len;
251 bt_content.ble_content.advData[8] = len + 1;
252 bt_content.ble_content.advData[9] = 0x09;
253 memcpy(&bt_content.ble_content.advData[10], bt_content.ble_content.ble_name, len);
254
255 bt_content.ble_content.advData[0] = bt_content.ble_content.advData[1] + 1
256 + bt_content.ble_content.advData[4] + 1
257 + bt_content.ble_content.advData[8] + 1;
258 bt_content.ble_content.advDataLen = bt_content.ble_content.advData[0] + 1;
259
260 //==========================rsp======================
261 bt_content.ble_content.respData[1] = 0x16; //长度
262 bt_content.ble_content.respData[2] = 0xFF; //字段类型
263
264 /*厂商编码*/
265 bt_content.ble_content.respData[3] = 0x46;
266 bt_content.ble_content.respData[4] = 0x00;
267
268 bt_content.ble_content.respData[5] = 0x02; //项目代号长度
269
270 /*项目代号*/
271 bt_content.ble_content.respData[6] = 0x1c;
272 bt_content.ble_content.respData[7] = 0x02;
273
274 bt_content.ble_content.respData[8] = 0x04; //版本号长度
275 bt_content.ble_content.respData[9] = 'T'; //版本号类型
276 /*版本号*/
277 bt_content.ble_content.respData[10] = 0x01;
278 bt_content.ble_content.respData[11] = 0x00;
279 bt_content.ble_content.respData[12] = 0x00;
280
281 bt_content.ble_content.respData[13] = 0x08; // SN长度
282 /*SN号*/
283 bt_content.ble_content.respData[14] = 0x54;
284 bt_content.ble_content.respData[15] = 0x00;
285 bt_content.ble_content.respData[16] = 0x00;
286 bt_content.ble_content.respData[17] = 0x00;
287 bt_content.ble_content.respData[18] = 0x00;
288 bt_content.ble_content.respData[19] = 0x00;
289 bt_content.ble_content.respData[20] = 0x00;
290 bt_content.ble_content.respData[21] = 0x36;
291
292 bt_content.ble_content.respData[22] = 0x01; //绑定信息长度
293 bt_content.ble_content.respData[23] = 0x00; //绑定信息
294
295 bt_content.ble_content.respData[0] = bt_content.ble_content.respData[1] + 1; //长度
296 bt_content.ble_content.respDataLen = bt_content.ble_content.respData[0] + 1;
297
298 bt_content.ble_content.cb_ble_recv_fun = bt_test_ble_recv_data_callback;
299 bt_content.ble_content.cb_ble_request_data = bt_test_ble_request_data_callback;
300 rk_bt_register_state_callback(bt_test_state_cb);
301 rk_bt_register_bond_callback(bt_test_bond_state_cb);
302 rk_bt_init(&bt_content);
303
304 return NULL;
305 }
306
307 #endif
308
309 static int bt_onff_cnt = 0;
bt_test_onff_thread(void * arg)310 void *bt_test_onff_thread(void *arg)
311 {
312 while (1) {
313 bt_test_bluetooth_init_thread(NULL);
314 bt_test_source_open(NULL);
315 while (gonff == false) {
316 sleep(1);
317 printf("%s: BT BLUETOOTH TURNING ON ...\n", __func__);
318 }
319
320 printf("%s: BT BLUETOOTH DEINIT\n", __func__);
321 bt_test_source_close(NULL);
322 rk_bt_deinit();
323 while (gonff == true) {
324 sleep(1);
325 printf("%s: BT BLUETOOTH TURNING OFF ...\n", __func__);
326 }
327 printf("%s: BT BLUETOOTH TURN ONOFF CNT: [%d] \n", __func__, bt_onff_cnt++);
328 }
329 }
330
331 static pthread_t bt_init_onoff_thread = 0;
bt_test_bluetooth_onff_init(char * data)332 void bt_test_bluetooth_onff_init(char *data)
333 {
334 printf("%s: ", __func__);
335
336 if (bt_init_onoff_thread) {
337 printf("bt init thread already exist\n");
338 return;
339 }
340
341 if (pthread_create(&bt_init_onoff_thread, NULL, bt_test_onff_thread, NULL)) {
342 printf("Create bt init pthread failed\n");
343 return;
344 }
345 }
346
347 static pthread_t bt_init_thread = 0;
bt_test_bluetooth_init(char * data)348 void bt_test_bluetooth_init(char *data)
349 {
350 printf("%s: ", __func__);
351 bt_test_bluetooth_init_thread(NULL);
352 return;
353
354 if (bt_init_thread) {
355 printf("bt init thread already exist\n");
356 return;
357 }
358
359 if (pthread_create(&bt_init_thread, NULL, bt_test_bluetooth_init_thread, NULL)) {
360 printf("Create bt init pthread failed\n");
361 return;
362 }
363 }
364
bt_test_bluetooth_deinit(char * data)365 void bt_test_bluetooth_deinit(char *data)
366 {
367 int ret;
368
369 printf("%s: BT BLUETOOTH DEINIT\n", __func__);
370 rk_bt_deinit();
371
372 if(bt_init_thread) {
373 ret = pthread_join(bt_init_thread, NULL);
374 if (ret) {
375 printf("%s: bt init thread exit failed!\n", __func__);
376 } else {
377 printf("%s: bt init thread exit ok\n", __func__);
378 }
379 bt_init_thread = 0;
380 }
381
382 }
383
bt_test_set_class(char * data)384 void bt_test_set_class(char *data)
385 {
386 rk_bt_set_class(0x240404);
387 }
388
bt_test_enable_reconnect(char * data)389 void bt_test_enable_reconnect(char *data)
390 {
391 rk_bt_enable_reconnect(1);
392 }
393
bt_test_disable_reconnect(char * data)394 void bt_test_disable_reconnect(char *data)
395 {
396 rk_bt_enable_reconnect(0);
397 }
398
bt_test_get_device_name(char * data)399 void bt_test_get_device_name(char *data)
400 {
401 char name[256];
402 memset(name, 0, 256);
403 rk_bt_get_device_name(name, 256);
404 printf("bt device name: %s\n", name);
405 }
406
bt_test_get_device_addr(char * data)407 void bt_test_get_device_addr(char *data)
408 {
409 char addr[18];
410 memset(addr, 0, 18);
411 rk_bt_get_device_addr(addr, 18);
412 printf("bt device addr: %s\n", addr);
413 }
414
bt_test_set_device_name(char * data)415 void bt_test_set_device_name(char *data)
416 {
417 printf("%s: device name: %s\n", __func__, data);
418 rk_bt_set_device_name(data);
419 }
420
bt_test_pair_by_addr(char * data)421 void bt_test_pair_by_addr(char *data)
422 {
423 rk_bt_pair_by_addr(data);
424 }
425
bt_test_unpair_by_addr(char * data)426 void bt_test_unpair_by_addr(char *data)
427 {
428 rk_bt_unpair_by_addr(data);
429 }
430
bt_test_get_paired_devices(char * data)431 void bt_test_get_paired_devices(char *data)
432 {
433 int i, count;
434 RkBtScanedDevice *dev_tmp = NULL;
435
436 if(g_paired_dev_list)
437 bt_test_free_paired_devices(NULL);
438
439 rk_bt_get_paired_devices(&g_paired_dev_list, &count);
440
441 printf("%s: current paired devices count: %d\n", __func__, count);
442 dev_tmp = g_paired_dev_list;
443 for(i = 0; i < count; i++) {
444 printf("device %d\n", i);
445 printf(" remote_address: %s\n", dev_tmp->remote_address);
446 printf(" remote_name: %s\n", dev_tmp->remote_name);
447 printf(" is_connected: %d\n", dev_tmp->is_connected);
448 dev_tmp = dev_tmp->next;
449 }
450 }
451
bt_test_free_paired_devices(char * data)452 void bt_test_free_paired_devices(char *data)
453 {
454 rk_bt_free_paired_devices(g_paired_dev_list);
455 g_paired_dev_list = NULL;
456 }
457
bt_test_start_discovery(char * data)458 void bt_test_start_discovery(char *data)
459 {
460 int time;
461
462 if(data == NULL) {
463 printf("Please enter the scan time\n");
464 return;
465 }
466
467 time = atoi(data);
468 if(time < 10000) {
469 printf("Scan time is too short(%d), reset to 10000ms\n", time);
470 time = 10000;
471 }
472
473 rk_bt_register_discovery_callback(bt_test_discovery_status_cb);
474 rk_bt_register_dev_found_callback(bt_test_dev_found_cb);
475 rk_bt_start_discovery(time, SCAN_TYPE_AUTO);
476 }
477
bt_test_start_discovery_bredr(char * data)478 void bt_test_start_discovery_bredr(char *data)
479 {
480 int time;
481
482 if(data == NULL) {
483 printf("Please enter the scan time\n");
484 return;
485 }
486
487 time = atoi(data);
488 if(time < 10000) {
489 printf("Scan time is too short(%d), reset to 10000ms\n", time);
490 time = 10000;
491 }
492
493 rk_bt_register_discovery_callback(bt_test_discovery_status_cb);
494 rk_bt_register_dev_found_callback(bt_test_dev_found_cb);
495 rk_bt_start_discovery(time, SCAN_TYPE_BREDR);
496 }
497
bt_test_start_discovery_le(char * data)498 void bt_test_start_discovery_le(char *data)
499 {
500 int time;
501
502 if(data == NULL) {
503 printf("Please enter the scan time\n");
504 return;
505 }
506
507 time = atoi(data);
508 if(time < 10000) {
509 printf("Scan time is too short(%d), reset to 10000ms\n", time);
510 time = 10000;
511 }
512
513 rk_bt_register_discovery_callback(bt_test_discovery_status_cb);
514 rk_bt_register_dev_found_callback(bt_test_dev_found_cb);
515 rk_bt_start_discovery(time, SCAN_TYPE_LE);
516 }
517
bt_test_start_discovery_pan(char * data)518 void bt_test_start_discovery_pan(char *data)
519 {
520 int time;
521
522 if(data == NULL) {
523 printf("Please enter the scan time\n");
524 return;
525 }
526
527 time = atoi(data);
528 if(time < 10000) {
529 printf("Scan time is too short(%d), reset to 10000ms\n", time);
530 time = 10000;
531 }
532
533 rk_bt_register_discovery_callback(bt_test_discovery_status_cb);
534 rk_bt_register_dev_found_callback(bt_test_dev_found_cb);
535 rk_bt_start_discovery(time, SCAN_TYPE_PAN);
536 }
537
bt_test_start_discovery_spp(char * data)538 void bt_test_start_discovery_spp(char *data)
539 {
540 int time;
541
542 if(data == NULL) {
543 printf("Please enter the scan time\n");
544 return;
545 }
546
547 time = atoi(data);
548 if(time < 10000) {
549 printf("Scan time is too short(%d), reset to 10000ms\n", time);
550 time = 10000;
551 }
552
553 rk_bt_register_discovery_callback(bt_test_discovery_status_cb);
554 rk_bt_register_dev_found_callback(bt_test_dev_found_cb);
555 rk_bt_start_discovery(time, SCAN_TYPE_SPP);
556 }
557
bt_test_cancel_discovery(char * data)558 void bt_test_cancel_discovery(char *data)
559 {
560 rk_bt_cancel_discovery();
561 }
562
bt_test_is_discovering(char * data)563 void bt_test_is_discovering(char *data)
564 {
565 bool ret = rk_bt_is_discovering();
566 printf("the device discovery procedure is active? %s\n", (ret == true) ? "yes" : "no");
567 }
568
bt_test_get_scaned_devices(char * data)569 void bt_test_get_scaned_devices(char *data)
570 {
571 int i, count;
572 RkBtScanedDevice *dev_tmp = NULL;
573 RkBtScanedDevice *scaned_dev_list = NULL;
574
575 rk_bt_get_scaned_devices(&scaned_dev_list, &count);
576
577 printf("%s: current scaned devices count: %d\n", __func__, count);
578 dev_tmp = scaned_dev_list;
579 for(i = 0; i < count; i++) {
580 printf("device %d\n", i);
581 printf(" remote_address: %s\n", dev_tmp->remote_address);
582 printf(" remote_name: %s\n", dev_tmp->remote_name);
583 printf(" is_connected: %d\n", dev_tmp->is_connected);
584 printf(" class_of_device: 0x%x\n", dev_tmp->cod);
585 dev_tmp = dev_tmp->next;
586 }
587
588 rk_bt_free_scaned_devices(scaned_dev_list);
589 }
590
bt_test_display_devices(char * data)591 void bt_test_display_devices(char *data)
592 {
593 rk_bt_display_devices();
594 }
595
bt_test_display_paired_devices(char * data)596 void bt_test_display_paired_devices(char *data)
597 {
598 rk_bt_display_paired_devices();
599 }
600
bt_test_get_connected_properties(char * data)601 void bt_test_get_connected_properties(char *data)
602 {
603 bool is_connected = false;
604 is_connected = rk_bt_get_connected_properties(data);
605 printf("the device connected properties is %s\n", (is_connected == true) ? "yes" : "no");
606 }
607
bt_test_read_remote_device_name(char * data)608 void bt_test_read_remote_device_name(char *data)
609 {
610 rk_bt_read_remote_device_name(data, RK_BT_TRANSPORT_UNKNOWN);
611 }
612
613 /******************************************/
614 /* A2DP SINK */
615 /******************************************/
bt_sink_callback(RK_BT_SINK_STATE state)616 int bt_sink_callback(RK_BT_SINK_STATE state)
617 {
618 switch(state) {
619 case RK_BT_SINK_STATE_IDLE:
620 printf("++++++++++++ BT SINK EVENT: idle ++++++++++\n");
621 break;
622 case RK_BT_SINK_STATE_CONNECT:
623 printf("++++++++++++ BT SINK EVENT: connect sucess ++++++++++\n");
624 break;
625 case RK_BT_SINK_STATE_DISCONNECT:
626 printf("++++++++++++ BT SINK EVENT: disconnected ++++++++++\n");
627 //system("amixer set bt 255");
628 break;
629 //avrcp
630 case RK_BT_SINK_STATE_PLAY:
631 printf("++++++++++++ BT SINK EVENT: playing ++++++++++\n");
632 break;
633 case RK_BT_SINK_STATE_PAUSE:
634 printf("++++++++++++ BT SINK EVENT: paused ++++++++++\n");
635 break;
636 case RK_BT_SINK_STATE_STOP:
637 printf("++++++++++++ BT SINK EVENT: stoped ++++++++++\n");
638 break;
639 //avdtp(a2dp)
640 case RK_BT_A2DP_SINK_STARTED:
641 printf("++++++++++++ BT A2DP SINK STATE: started ++++++++++\n");
642 break;
643 case RK_BT_A2DP_SINK_SUSPENDED:
644 printf("++++++++++++ BT A2DP SINK STATE: suspended ++++++++++\n");
645 break;
646 case RK_BT_A2DP_SINK_STOPPED:
647 printf("++++++++++++ BT A2DP SINK STATE: stoped ++++++++++\n");
648 break;
649 }
650
651 return 0;
652 }
653
bt_sink_volume_callback(int volume)654 void bt_sink_volume_callback(int volume)
655 {
656 printf("++++++++ bt sink volume change, volume: %d ++++++++\n", volume);
657
658 /* Change the code below based on which interface audio is going out to. */
659 #if 0
660 char buffer[100];
661 sprintf(buffer, "amixer set bt %d", volume * 255 / 127);
662 if (-1 == system(buffer))
663 printf("set volume error: %d, volume: %d\n", errno, volume);
664 #endif
665 }
666
bt_sink_track_change_callback(const char * bd_addr,BtTrackInfo track_info)667 void bt_sink_track_change_callback(const char *bd_addr, BtTrackInfo track_info)
668 {
669 #if 0
670 printf("++++++++ bt sink track change ++++++++\n");
671 printf(" remote device address: %s\n", bd_addr);
672 printf(" title: %s\n", track_info.title);
673 printf(" artist: %s\n", track_info.artist);
674 printf(" album: %s\n", track_info.album);
675 printf(" genre: %s\n", track_info.genre);
676 printf(" num_tracks: %s\n", track_info.num_tracks);
677 printf(" track_num: %s\n", track_info.track_num);
678 printf(" playing_time: %s\n", track_info.playing_time);
679 #endif
680 }
681
bt_sink_position_change_callback(const char * bd_addr,int song_len,int song_pos)682 void bt_sink_position_change_callback(const char *bd_addr, int song_len, int song_pos)
683 {
684 #if 0
685 printf("++++++++ bt sink position change ++++++++\n");
686 printf(" remote device address: %s\n", bd_addr);
687 printf(" song_len: %d, song_pos: %d\n", song_len, song_pos);
688 #endif
689 }
690
bt_test_sink_open(char * data)691 void bt_test_sink_open(char *data)
692 {
693 rk_bt_sink_register_volume_callback(bt_sink_volume_callback);
694 rk_bt_sink_register_track_callback(bt_sink_track_change_callback);
695 rk_bt_sink_register_position_callback(bt_sink_position_change_callback);
696 rk_bt_sink_register_callback(bt_sink_callback);
697 rk_bt_sink_open();
698 //rk_bt_sink_set_alsa_device("bt");
699 }
700
bt_test_sink_visibility00(char * data)701 void bt_test_sink_visibility00(char *data)
702 {
703 rk_bt_set_visibility(0, 0);
704 }
705
bt_test_sink_visibility01(char * data)706 void bt_test_sink_visibility01(char *data)
707 {
708 rk_bt_set_visibility(0, 1);
709 }
710
bt_test_sink_visibility10(char * data)711 void bt_test_sink_visibility10(char *data)
712 {
713 rk_bt_set_visibility(1, 0);
714 }
715
bt_test_sink_visibility11(char * data)716 void bt_test_sink_visibility11(char *data)
717 {
718 rk_bt_set_visibility(1, 1);
719 }
720
bt_test_ble_visibility00(char * data)721 void bt_test_ble_visibility00(char *data)
722 {
723 rk_bt_set_visibility(0, 0);
724 }
725
bt_test_ble_visibility11(char * data)726 void bt_test_ble_visibility11(char *data)
727 {
728 rk_bt_set_visibility(1, 1);
729 }
730
bt_test_sink_status(char * data)731 void bt_test_sink_status(char *data)
732 {
733 RK_BT_SINK_STATE pState;
734
735 rk_bt_sink_get_state(&pState);
736 switch(pState) {
737 case RK_BT_SINK_STATE_IDLE:
738 printf("++++++++++++ BT SINK STATUS: idle ++++++++++\n");
739 break;
740 case RK_BT_SINK_STATE_CONNECT:
741 printf("++++++++++++ BT SINK STATUS: connect sucess ++++++++++\n");
742 break;
743 case RK_BT_SINK_STATE_PLAY:
744 case RK_BT_A2DP_SINK_STARTED:
745 printf("++++++++++++ BT SINK STATUS: playing ++++++++++\n");
746 break;
747 case RK_BT_SINK_STATE_PAUSE:
748 case RK_BT_A2DP_SINK_SUSPENDED:
749 printf("++++++++++++ BT SINK STATUS: paused ++++++++++\n");
750 break;
751 case RK_BT_SINK_STATE_STOP:
752 case RK_BT_A2DP_SINK_STOPPED:
753 printf("++++++++++++ BT SINK STATUS: stoped ++++++++++\n");
754 break;
755 case RK_BT_SINK_STATE_DISCONNECT:
756 printf("++++++++++++ BT SINK STATUS: disconnected ++++++++++\n");
757 break;
758 }
759 }
760
bt_test_sink_music_play(char * data)761 void bt_test_sink_music_play(char *data)
762 {
763 rk_bt_sink_play();
764 }
765
bt_test_sink_music_pause(char * data)766 void bt_test_sink_music_pause(char *data)
767 {
768 rk_bt_sink_pause();
769 }
770
bt_test_sink_music_next(char * data)771 void bt_test_sink_music_next(char *data)
772 {
773 rk_bt_sink_next();
774 }
775
bt_test_sink_music_previous(char * data)776 void bt_test_sink_music_previous(char *data)
777 {
778 rk_bt_sink_prev();
779 }
780
bt_test_sink_music_stop(char * data)781 void bt_test_sink_music_stop(char *data)
782 {
783 rk_bt_sink_stop();
784 }
785
bt_test_sink_disconnect(char * data)786 void bt_test_sink_disconnect(char *data)
787 {
788 rk_bt_sink_disconnect();
789 }
790
bt_test_sink_close(char * data)791 void bt_test_sink_close(char *data)
792 {
793 rk_bt_sink_close();
794 }
795
bt_test_sink_set_volume(char * data)796 void bt_test_sink_set_volume(char *data)
797 {
798 int i = 0;
799
800 printf("===== A2DP SINK Set Volume:100 =====\n");
801 rk_bt_sink_set_volume(127);
802 sleep(2);
803 printf("===== A2DP SINK Set Volume:64 =====\n");
804 rk_bt_sink_set_volume(64);
805 sleep(2);
806 printf("===== A2DP SINK Set Volume:0 =====\n");
807 rk_bt_sink_set_volume(0);
808 sleep(2);
809
810 for (; i < 17; i++) {
811 printf("===== A2DP SINK Set Volume UP =====\n");
812 rk_bt_sink_volume_up();
813 sleep(2);
814 }
815
816 for (i = 0; i < 17; i++) {
817 printf("===== A2DP SINK Set Volume DOWN =====\n");
818 rk_bt_sink_volume_down();
819 sleep(2);
820 }
821 }
822
bt_test_sink_connect_by_addr(char * data)823 void bt_test_sink_connect_by_addr(char *data)
824 {
825 rk_bt_sink_connect_by_addr(data);
826 }
827
bt_test_sink_disconnect_by_addr(char * data)828 void bt_test_sink_disconnect_by_addr(char *data)
829 {
830 rk_bt_sink_disconnect_by_addr(data);
831 }
832
bt_test_sink_get_play_status(char * data)833 void bt_test_sink_get_play_status(char *data)
834 {
835 rk_bt_sink_get_play_status();
836 }
837
bt_test_sink_get_poschange(char * data)838 void bt_test_sink_get_poschange(char *data)
839 {
840 bool pos_change = rk_bt_sink_get_poschange();
841 printf("support position change: %s\n", pos_change ? "yes" : "no");
842 }
843
844 /******************************************/
845 /* A2DP SOURCE */
846 /******************************************/
bt_test_source_status_callback(void * userdata,const char * bd_addr,const char * name,const RK_BT_SOURCE_EVENT enEvent)847 void bt_test_source_status_callback(void *userdata, const char *bd_addr,
848 const char *name, const RK_BT_SOURCE_EVENT enEvent)
849 {
850 switch(enEvent)
851 {
852 case BT_SOURCE_EVENT_CONNECT_FAILED:
853 printf("+++++ BT_SOURCE_EVENT_CONNECT_FAILED: %s, %s +++++\n", name, bd_addr);
854 break;
855 case BT_SOURCE_EVENT_CONNECTED:
856 printf("+++++ BT_SOURCE_EVENT_CONNECTED: %s, %s +++++\n", name, bd_addr);
857 printf("+++++ device playrole: %d\n", rk_bt_get_playrole_by_addr(bd_addr));
858 break;
859 case BT_SOURCE_EVENT_AUTO_RECONNECTING:
860 printf("+++++ BT_SOURCE_EVENT_AUTO_RECONNECTING: %s, %s +++++\n", name, bd_addr);
861 break;
862 case BT_SOURCE_EVENT_DISCONNECT_FAILED:
863 printf("+++++ BT_SOURCE_EVENT_DISCONNECT_FAILED: %s, %s +++++\n", name, bd_addr);
864 break;
865 case BT_SOURCE_EVENT_DISCONNECTED:
866 printf("+++++ BT_SOURCE_EVENT_DISCONNECTED: %s, %s +++++\n", name, bd_addr);
867 break;
868 #if 0
869 case BT_SOURCE_EVENT_REMOVE_FAILED:
870 printf("+++++ BT_SOURCE_EVENT_REMOVE_FAILED +++++\n");
871 break;
872 case BT_SOURCE_EVENT_REMOVED:
873 printf("+++++ BT_SOURCE_EVENT_REMOVED +++++\n");
874 break;
875 #endif
876 case BT_SOURCE_EVENT_RC_PLAY:
877 printf("+++++ BT_SOURCE_EVENT_RC_PLAY: %s, %s +++++\n", name, bd_addr);
878 break;
879 case BT_SOURCE_EVENT_RC_STOP:
880 printf("+++++ BT_SOURCE_EVENT_RC_STOP: %s, %s +++++\n", name, bd_addr);
881 break;
882 case BT_SOURCE_EVENT_RC_PAUSE:
883 printf("+++++ BT_SOURCE_EVENT_RC_PAUSE: %s, %s +++++\n", name, bd_addr);
884 break;
885 case BT_SOURCE_EVENT_RC_FORWARD:
886 printf("+++++ BT_SOURCE_EVENT_RC_FORWARD: %s, %s +++++\n", name, bd_addr);
887 break;
888 case BT_SOURCE_EVENT_RC_BACKWARD:
889 printf("+++++ BT_SOURCE_EVENT_RC_BACKWARD: %s, %s +++++\n", name, bd_addr);
890 break;
891 case BT_SOURCE_EVENT_RC_VOL_UP:
892 printf("+++++ BT_SOURCE_EVENT_RC_VOL_UP: %s, %s +++++\n", name, bd_addr);
893 break;
894 case BT_SOURCE_EVENT_RC_VOL_DOWN:
895 printf("+++++ BT_SOURCE_EVENT_RC_VOL_DOWN: %s, %s +++++\n", name, bd_addr);
896 break;
897 }
898 }
899
bt_test_source_auto_start(char * data)900 void bt_test_source_auto_start(char *data)
901 {
902 rk_bt_source_auto_connect_start(NULL, bt_test_source_status_callback);
903 }
904
bt_test_source_auto_stop(char * data)905 void bt_test_source_auto_stop(char *data)
906 {
907 rk_bt_source_auto_connect_stop();
908 }
909
bt_test_source_connect_status(char * data)910 void bt_test_source_connect_status(char *data)
911 {
912 RK_BT_SOURCE_STATUS status;
913 char name[256], address[256];
914
915 rk_bt_source_get_status(&status, name, 256, address, 256);
916 if (status == BT_SOURCE_STATUS_CONNECTED) {
917 printf("++++++++++++ BT SOURCE STATUS: connected ++++++++++++\n");
918 printf("\t name:%s, address:%s\n", name, address);
919 } else
920 printf("++++++++++++ BT SOURCE STATUS: disconnected ++++++++++++\n");
921 }
922
bt_test_source_open(char * data)923 void bt_test_source_open(char *data)
924 {
925 rk_bt_source_register_status_cb(NULL, bt_test_source_status_callback);
926 rk_bt_source_open();
927 }
928
bt_test_source_close(char * data)929 void bt_test_source_close(char *data)
930 {
931 rk_bt_source_close();
932 }
933
bt_test_source_connect_by_addr(char * data)934 void bt_test_source_connect_by_addr(char *data)
935 {
936 rk_bt_source_connect_by_addr(data);
937 }
938
bt_test_source_disconnect_by_addr(char * data)939 void bt_test_source_disconnect_by_addr(char *data)
940 {
941 rk_bt_source_disconnect_by_addr(data);
942 }
943
bt_test_source_remove_by_addr(char * data)944 void bt_test_source_remove_by_addr(char *data)
945 {
946 rk_bt_source_remove(data);
947 }
948
bt_test_source_disconnect(char * data)949 void bt_test_source_disconnect(char *data)
950 {
951 rk_bt_source_disconnect();
952 }
953
bt_test_source_set_vol(char * data)954 void bt_test_source_set_vol(char *data)
955 {
956 int vol;
957
958 vol = atoi(data);
959 printf("+++++ bt_test_source_set_vol: %s, %d +++++\n", data, vol);
960 rk_bt_source_set_vol(vol);
961 }
962
963 /******************************************/
964 /* BLE */
965 /******************************************/
ble_status_callback_test(const char * bd_addr,const char * name,RK_BLE_STATE state)966 static void ble_status_callback_test(const char *bd_addr, const char *name, RK_BLE_STATE state)
967 {
968 printf("%s: status: %d.\n", __func__, state);
969
970 switch (state) {
971 case RK_BLE_STATE_IDLE:
972 printf("+++++ RK_BLE_STATE_IDLE +++++\n");
973 break;
974 case RK_BLE_STATE_CONNECT:
975 printf("+++++ RK_BLE_STATE_CONNECT: %s, %s +++++\n", name, bd_addr);
976 break;
977 case RK_BLE_STATE_DISCONNECT:
978 printf("+++++ RK_BLE_STATE_DISCONNECT: %s, %s +++++\n", name, bd_addr);
979 g_mtu = 0;
980 break;
981 }
982 }
983
bt_test_ble_recv_data_callback(const char * uuid,char * data,int len)984 static void bt_test_ble_recv_data_callback(const char *uuid, char *data, int len)
985 {
986 char data_t[512];
987 char reply_buf[512] = {"My name is rockchip"};
988
989 printf("=== %s uuid: %s===\n", __func__, uuid);
990 memcpy(data_t, data, len);
991 for (int i = 0 ; i < len; i++) {
992 printf("%02x ", data_t[i]);
993 }
994 printf("\n");
995
996 if (strstr(data_t, "Hello RockChip") || strstr(data_t, "HelloRockChip") ||
997 strstr(data_t, "HELLO ROCKCHIP") || strstr(data_t, "HELLOROCKCHIP") ||
998 strstr(data_t, "hello rockchip") || strstr(data_t, "hellorockchip")) {
999 printf("=== %s Reply:%s ===\n", __func__, reply_buf);
1000 rk_ble_write(uuid, reply_buf, 17);
1001 }
1002 }
1003
_send_data(void * data)1004 void *_send_data(void *data)
1005 {
1006 char *uuid = (char *)data;
1007
1008 rk_ble_write(uuid, "abcd", 4);
1009 usleep(100000);
1010 rk_ble_write(uuid, "wwww", 4);
1011 usleep(100000);
1012 rk_ble_write(uuid, "zzzz", 4);
1013
1014 return ((void *)0);
1015 }
1016
send_data(char * uuid)1017 void send_data(char *uuid)
1018 {
1019 pthread_t tid = 0;
1020 if (pthread_create(&tid, NULL, _send_data, (void *)uuid)) {
1021 printf("Create _send_data pthread failed\n");
1022 return;
1023 }
1024 }
1025
bt_test_ble_request_data_callback(const char * uuid,char * data,int * len)1026 static void bt_test_ble_request_data_callback(const char *uuid, char *data, int *len)
1027 {
1028 printf("=== %s uuid: %s===\n", __func__, uuid);
1029
1030 //len <= mtu(g_mtu)
1031 *len = strlen("hello rockchip");
1032 memcpy(data, "hello rockchip", strlen("hello rockchip"));
1033
1034 printf("=== %s uuid: %s data: %s[%d]===\n", __func__, uuid, data, *len);
1035
1036 return;
1037 }
1038
bt_test_mtu_callback(const char * bd_addr,unsigned int mtu)1039 static void bt_test_mtu_callback(const char *bd_addr, unsigned int mtu)
1040 {
1041 printf("=== %s: bd_addr: %s, mtu: %d ===\n", __func__, bd_addr, mtu);
1042 g_mtu = mtu;
1043 }
1044
bt_test_ble_start(char * data)1045 void bt_test_ble_start(char *data)
1046 {
1047 rk_ble_register_status_callback(ble_status_callback_test);
1048 rk_ble_register_mtu_callback(bt_test_mtu_callback);
1049 rk_ble_start(&bt_content.ble_content);
1050 }
1051
bt_test_ble_set_address(char * data)1052 void bt_test_ble_set_address(char *data)
1053 {
1054 //user-defined ble address test, if not set, the default random address
1055 char ble_addr[DEVICE_ADDR_LEN];
1056
1057 if(!data || strlen(data) < 17)
1058 return;
1059
1060 printf("ble address: %s\n", data);
1061 if (sscanf(data, "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx",
1062 &ble_addr[5], &ble_addr[4], &ble_addr[3],
1063 &ble_addr[2], &ble_addr[1], &ble_addr[0]) != 6) {
1064 return;
1065 }
1066
1067 //Clear two most significant bits
1068 ble_addr[5] &= 0x3f;
1069 //Set second most significant bit, Private resolvable
1070 ble_addr[5] |= 0x40;
1071
1072 printf("ble_addr: %02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx\n",
1073 ble_addr[5], ble_addr[4], ble_addr[3],
1074 ble_addr[2], ble_addr[1], ble_addr[0]);
1075
1076 rk_ble_set_address(ble_addr);
1077 }
1078
bt_test_ble_set_adv_interval(char * data)1079 void bt_test_ble_set_adv_interval(char *data)
1080 {
1081 //default 100ms, test: 20ms(32 * 0.625) ~ 100ms(160 * 0.625)
1082 rk_ble_set_adv_interval(32, 160);
1083 }
1084
bt_test_ble_write(char * data)1085 void bt_test_ble_write(char *data)
1086 {
1087 int i = 0, write_len = BT_ATT_DEFAULT_LE_MTU;
1088 char *write_buf;
1089
1090 if(g_mtu > BT_ATT_HEADER_LEN)
1091 write_len = g_mtu;
1092
1093 write_len -= BT_ATT_HEADER_LEN;
1094 if(write_len > BT_ATT_MAX_VALUE_LEN)
1095 write_len = BT_ATT_MAX_VALUE_LEN;
1096
1097 write_buf = (char *)malloc(write_len);
1098 for (i = 0; i < (write_len - 1); i++)
1099 write_buf[i] = '0' + i % 10;
1100 write_buf[write_len - 1] = '\0';
1101
1102 rk_ble_write(BLE_UUID_SEND, data, strlen(data));
1103 //rk_ble_write(BLE_UUID_WIFI_CHAR, write_buf, write_len);
1104 free(write_buf);
1105 }
1106
bt_test_ble_get_status(char * data)1107 void bt_test_ble_get_status(char *data)
1108 {
1109 RK_BLE_STATE state;
1110
1111 printf("RK_ble_status_test: ");
1112 rk_ble_get_state(&state);
1113 switch (state) {
1114 case RK_BLE_STATE_IDLE:
1115 printf("RK_BLE_STATE_IDLE.\n");
1116 break;
1117 case RK_BLE_STATE_CONNECT:
1118 printf("RK_BLE_STATE_CONNECT.\n");
1119 break;
1120 case RK_BLE_STATE_DISCONNECT:
1121 printf("RK_BLE_STATE_DISCONNECT.\n");
1122 break;
1123 }
1124 }
1125
bt_test_ble_stop(char * data)1126 void bt_test_ble_stop(char *data) {
1127 g_mtu = 0;
1128 rk_ble_stop();
1129 }
1130
bt_test_ble_disconnect(char * data)1131 void bt_test_ble_disconnect(char *data) {
1132 rk_ble_disconnect();
1133 }
1134
1135
1136 /******************************************/
1137 /* BLE CLIENT */
1138 /******************************************/
ble_client_test_state_callback(const char * bd_addr,const char * name,RK_BLE_CLIENT_STATE state)1139 void ble_client_test_state_callback(const char *bd_addr, const char *name, RK_BLE_CLIENT_STATE state)
1140 {
1141 switch(state)
1142 {
1143 case RK_BLE_CLIENT_STATE_IDLE:
1144 printf("+++++ RK_BLE_CLIENT_STATE_IDLE +++++\n");
1145 break;
1146 case RK_BLE_CLIENT_STATE_CONNECT:
1147 printf("+++++ RK_BLE_CLIENT_STATE_CONNECT(%s, %s) +++++\n", bd_addr, name);
1148 break;
1149 case RK_BLE_CLIENT_STATE_DISCONNECT:
1150 printf("+++++ RK_BLE_CLIENT_STATE_DISCONNECT(%s, %s) +++++\n", bd_addr, name);
1151 g_mtu = 0;
1152 break;
1153 case RK_BLE_CLIENT_WRITE_SUCCESS:
1154 printf("+++++ RK_BLE_CLIENT_WRITE_SUCCESS(%s, %s) +++++\n", bd_addr, name);
1155 break;
1156 case RK_BLE_CLIENT_WRITE_ERROR:
1157 printf("+++++ RK_BLE_CLIENT_WRITE_ERROR(%s, %s) +++++\n", bd_addr, name);
1158 break;
1159 }
1160 }
1161
bt_test_ble_client_recv_data_callback(const char * uuid,char * data,int len)1162 static void bt_test_ble_client_recv_data_callback(const char *uuid, char *data, int len)
1163 {
1164 printf("+++++ recv data +++++\n");
1165 printf(" uuid: %s\n", uuid);
1166 printf(" data len: %d\n ", len);
1167 for (int i = 0 ; i < len; i++) {
1168 printf("%02x ", data[i]);
1169 }
1170 printf("\n");
1171 }
1172
1173
bt_test_ble_client_open(char * data)1174 void bt_test_ble_client_open(char *data)
1175 {
1176 rk_ble_client_register_state_callback(ble_client_test_state_callback);
1177 rk_ble_client_register_recv_callback(bt_test_ble_client_recv_data_callback);
1178 rk_ble_client_register_mtu_callback(bt_test_mtu_callback);
1179 rk_ble_client_open(true);
1180 }
1181
bt_test_ble_client_close(char * data)1182 void bt_test_ble_client_close(char *data)
1183 {
1184 g_mtu = 0;
1185 rk_ble_client_close();
1186 }
1187
bt_test_ble_client_get_status(char * data)1188 void bt_test_ble_client_get_status(char *data)
1189 {
1190 RK_BLE_CLIENT_STATE state;
1191
1192 state = rk_ble_client_get_state();
1193 switch (state) {
1194 case RK_BLE_CLIENT_STATE_IDLE:
1195 printf("RK_BLE_CLIENT_STATE_IDLE\n");
1196 break;
1197 case RK_BLE_CLIENT_STATE_CONNECT:
1198 printf("RK_BLE_CLIENT_STATE_CONNECT\n");
1199 break;
1200 case RK_BLE_CLIENT_STATE_DISCONNECT:
1201 printf("RK_BLE_CLIENT_STATE_DISCONNECT\n");
1202 break;
1203 }
1204 }
1205
bt_test_ble_client_connect(char * data)1206 void bt_test_ble_client_connect(char *data)
1207 {
1208 rk_ble_client_connect(data);
1209 }
1210
bt_test_ble_client_disconnect(char * data)1211 void bt_test_ble_client_disconnect(char *data)
1212 {
1213 rk_ble_client_disconnect(data);
1214 }
1215
bt_test_ble_client_get_service_info(char * data)1216 void bt_test_ble_client_get_service_info(char *data)
1217 {
1218 int i, j, k;
1219 RK_BLE_CLIENT_SERVICE_INFO info;
1220
1221 if(!rk_ble_client_get_service_info(data, &info)) {
1222 printf("+++++ get device(%s) service info +++++\n", data);
1223 for(i = 0; i < info.service_cnt; i++) {
1224 printf("service[%d]:\n", i);
1225 printf(" describe: %s\n", info.service[i].describe);
1226 printf(" path: %s\n", info.service[i].path);
1227 printf(" uuid: %s\n", info.service[i].uuid);
1228
1229 for(j = 0; j < info.service[i].chrc_cnt; j++) {
1230 printf(" characteristic[%d]:\n", j);
1231 printf(" describe: %s\n", info.service[i].chrc[j].describe);
1232 printf(" path: %s\n", info.service[i].chrc[j].path);
1233 printf(" uuid: %s\n", info.service[i].chrc[j].uuid);
1234 printf(" props: 0x%x\n", info.service[i].chrc[j].props);
1235 printf(" ext_props: 0x%x\n", info.service[i].chrc[j].ext_props);
1236 printf(" perm: 0x%x\n", info.service[i].chrc[j].perm);
1237 printf(" notifying: %d\n", info.service[i].chrc[j].notifying);
1238
1239 for(k = 0; k < info.service[i].chrc[j].desc_cnt; k++) {
1240 printf(" descriptor[%d]:\n", k);
1241
1242 printf(" describe: %s\n", info.service[i].chrc[j].desc[k].describe);
1243 printf(" path: %s\n", info.service[i].chrc[j].desc[k].path);
1244 printf(" uuid: %s\n", info.service[i].chrc[j].desc[k].uuid);
1245 }
1246 }
1247 }
1248 }
1249 }
1250
bt_test_ble_client_read(char * data)1251 void bt_test_ble_client_read(char *data)
1252 {
1253 rk_ble_client_read(data);
1254 }
1255
bt_test_ble_client_write(char * data)1256 void bt_test_ble_client_write(char *data)
1257 {
1258 #if 0
1259 //write data len no more than (g_mtu - BT_ATT_HEADER_LEN)
1260 rk_ble_client_write(data, "rockchip ble client write test", strlen("rockchip ble client write test"));
1261 #else
1262 int i = 0, write_len = BT_ATT_DEFAULT_LE_MTU;
1263 char *write_buf;
1264
1265 if(g_mtu > BT_ATT_HEADER_LEN)
1266 write_len = g_mtu;
1267
1268 write_len -= BT_ATT_HEADER_LEN;
1269 if(write_len > BT_ATT_MAX_VALUE_LEN)
1270 write_len = BT_ATT_MAX_VALUE_LEN;
1271
1272 write_buf = (char *)malloc(write_len);
1273 for (i = 0; i < (write_len - 1); i++)
1274 write_buf[i] = '0' + i % 10;
1275 write_buf[write_len - 1] = '\0';
1276
1277 rk_ble_client_write(data, write_buf, strlen(write_buf));
1278 free(write_buf);
1279 #endif
1280 }
1281
bt_test_ble_client_is_notify(char * data)1282 void bt_test_ble_client_is_notify(char *data)
1283 {
1284 bool notifying;
1285
1286 notifying = rk_ble_client_is_notifying(data);
1287 printf("%s notifying %s\n", data, notifying ? "yes" : "no");
1288 }
1289
bt_test_ble_client_notify_on(char * data)1290 void bt_test_ble_client_notify_on(char *data)
1291 {
1292 rk_ble_client_notify(data, false, true);
1293 }
1294
bt_test_ble_client_notify_off(char * data)1295 void bt_test_ble_client_notify_off(char *data)
1296 {
1297 rk_ble_client_notify(data, false, false);
1298 }
1299
bt_test_ble_client_indicate_on(char * data)1300 void bt_test_ble_client_indicate_on(char *data)
1301 {
1302 rk_ble_client_notify(data, true, true);
1303 }
1304
bt_test_ble_client_indicate_off(char * data)1305 void bt_test_ble_client_indicate_off(char *data)
1306 {
1307 rk_ble_client_notify(data, true, false);
1308 }
1309
bt_test_ble_client_get_eir_data(char * data)1310 void bt_test_ble_client_get_eir_data(char *data)
1311 {
1312 char eir_data[300];
1313
1314 rk_ble_client_get_eir_data(data, eir_data, 300);
1315 #if 1
1316 int i;
1317 for(i = 0; i < 300; i++) {
1318 printf("%02x ", eir_data[i]);
1319 if((i != 0) && (i % 20 == 0))
1320 printf("\n");
1321 }
1322 printf("\n");
1323 #endif
1324 }
1325
bt_test_get_eir_data(char * data)1326 void bt_test_get_eir_data(char *data)
1327 {
1328 char eir_data[300];
1329 int len;
1330
1331 len = rk_bt_get_eir_data(data, eir_data, 300);
1332 #if 1
1333 int i;
1334 printf("\n");
1335 for (i = 0; i < len; i++) {
1336 if((i != 0) && (i % 16 == 0))
1337 printf("\n");
1338 printf("%02x ", eir_data[i]);
1339 }
1340 printf("\n");
1341 #endif
1342 }
1343
1344 /******************************************/
1345 /* SPP */
1346 /******************************************/
_btspp_status_callback(RK_BT_SPP_STATE type)1347 void _btspp_status_callback(RK_BT_SPP_STATE type)
1348 {
1349 switch(type) {
1350 case RK_BT_SPP_STATE_IDLE:
1351 printf("+++++++ RK_BT_SPP_STATE_IDLE +++++\n");
1352 break;
1353 case RK_BT_SPP_STATE_CONNECT:
1354 printf("+++++++ RK_BT_SPP_EVENT_CONNECT +++++\n");
1355 break;
1356 case RK_BT_SPP_STATE_DISCONNECT:
1357 printf("+++++++ RK_BT_SPP_EVENT_DISCONNECT +++++\n");
1358 break;
1359 default:
1360 printf("+++++++ BT SPP NOT SUPPORT TYPE! +++++\n");
1361 break;
1362 }
1363 }
1364
_btspp_recv_callback(char * data,int len)1365 void _btspp_recv_callback(char *data, int len)
1366 {
1367 if (len) {
1368 printf("+++++++ RK BT SPP RECV DATA: +++++\n");
1369 printf("\tRECVED(%d):%s\n", len, data);
1370 }
1371 }
1372
bt_test_spp_open(char * data)1373 void bt_test_spp_open(char *data)
1374 {
1375 rk_bt_spp_open(data);
1376 rk_bt_spp_register_status_cb(_btspp_status_callback);
1377 rk_bt_spp_register_recv_cb(_btspp_recv_callback);
1378 }
1379
bt_test_spp_write(char * data)1380 void bt_test_spp_write(char *data)
1381 {
1382 unsigned int ret = 0;
1383 char buff[100] = {"This is a message from rockchip board!"};
1384
1385 ret = rk_bt_spp_write(data, strlen(data));
1386 if (ret < 0) {
1387 printf("%s failed\n", __func__);
1388 }
1389 }
1390
bt_test_spp_connect(char * data)1391 void bt_test_spp_connect(char *data)
1392 {
1393 rk_bt_spp_connect(data);
1394 }
1395
bt_test_spp_disconnect(char * data)1396 void bt_test_spp_disconnect(char *data)
1397 {
1398 rk_bt_spp_disconnect(data);
1399 }
1400
bt_test_spp_listen(char * data)1401 void bt_test_spp_listen(char *data)
1402 {
1403 rk_bt_spp_listen();
1404 }
1405
bt_test_spp_close(char * data)1406 void bt_test_spp_close(char *data)
1407 {
1408 rk_bt_spp_close();
1409 }
1410
bt_test_spp_status(char * data)1411 void bt_test_spp_status(char *data)
1412 {
1413 RK_BT_SPP_STATE status;
1414
1415 rk_bt_spp_get_state(&status);
1416 switch(status) {
1417 case RK_BT_SPP_STATE_IDLE:
1418 printf("+++++++ RK_BT_SPP_STATE_IDLE +++++\n");
1419 break;
1420 case RK_BT_SPP_STATE_CONNECT:
1421 printf("+++++++ RK_BT_SPP_STATE_CONNECT +++++\n");
1422 break;
1423 case RK_BT_SPP_STATE_DISCONNECT:
1424 printf("+++++++ RK_BT_SPP_STATE_DISCONNECT +++++\n");
1425 break;
1426 default:
1427 printf("+++++++ BTSPP NO STATUS SUPPORT! +++++\n");
1428 break;
1429 }
1430 }
1431
1432 /******************************************/
1433 /* HFP */
1434 /******************************************/
hfp_set_sw_params(snd_pcm_t * pcm,snd_pcm_uframes_t buffer_size,snd_pcm_uframes_t period_size,char ** msg)1435 static int hfp_set_sw_params(snd_pcm_t *pcm, snd_pcm_uframes_t buffer_size,
1436 snd_pcm_uframes_t period_size, char **msg)
1437 {
1438 int err;
1439 snd_pcm_sw_params_t *params;
1440
1441 snd_pcm_sw_params_malloc(¶ms);
1442 if ((err = snd_pcm_sw_params_current(pcm, params)) != 0) {
1443 printf("Get current params: %s\n", snd_strerror(err));
1444 return -1;
1445 }
1446
1447 /* start the transfer when the buffer is full (or almost full) */
1448 snd_pcm_uframes_t threshold = (buffer_size / period_size) * period_size;
1449 if ((err = snd_pcm_sw_params_set_start_threshold(pcm, params, threshold)) != 0) {
1450 printf("Set start threshold: %s: %lu\n", snd_strerror(err), threshold);
1451 return -1;
1452 }
1453
1454 /* allow the transfer when at least period_size samples can be processed */
1455 if ((err = snd_pcm_sw_params_set_avail_min(pcm, params, period_size)) != 0) {
1456 printf("Set avail min: %s: %lu\n", snd_strerror(err), period_size);
1457 return -1;
1458 }
1459
1460 if ((err = snd_pcm_sw_params(pcm, params)) != 0) {
1461 printf("snd_pcm_sw_params: %s\n", snd_strerror(err));
1462 return -1;
1463 }
1464
1465 if(params)
1466 snd_pcm_sw_params_free(params);
1467
1468 return 0;
1469 }
1470
hfp_playback_device_open(snd_pcm_t ** playback_handle,const char * device_name,alsa_config_t alsa_config)1471 static int hfp_playback_device_open(snd_pcm_t** playback_handle,
1472 const char* device_name, alsa_config_t alsa_config)
1473 {
1474 int err;
1475 snd_pcm_hw_params_t *hw_params;
1476 unsigned int rate = alsa_config.sample_rate;
1477 snd_pcm_uframes_t period_size = alsa_config.period_size;
1478 snd_pcm_uframes_t buffer_size = alsa_config.buffer_size;
1479
1480 err = snd_pcm_open(playback_handle, device_name, SND_PCM_STREAM_PLAYBACK, 0);
1481 if (err) {
1482 printf( "Unable to open playback PCM device: %s\n", device_name);
1483 return -1;
1484 }
1485 printf("Open playback PCM device: %s\n", device_name);
1486
1487 err = snd_pcm_hw_params_malloc(&hw_params);
1488 if (err) {
1489 printf("cannot malloc hardware parameter structure (%s)\n", snd_strerror(err));
1490 return -1;
1491 }
1492
1493 err = snd_pcm_hw_params_any(*playback_handle, hw_params);
1494 if (err) {
1495 printf("cannot initialize hardware parameter structure (%s)\n", snd_strerror(err));
1496 return -1;
1497 }
1498
1499 err = snd_pcm_hw_params_set_access(*playback_handle, hw_params, SND_PCM_ACCESS_RW_INTERLEAVED);
1500 if (err) {
1501 printf("Error setting interleaved mode: %s\n", snd_strerror(err));
1502 return -1;
1503 }
1504
1505 err = snd_pcm_hw_params_set_format(*playback_handle, hw_params, SND_PCM_FORMAT_S16_LE);
1506 if (err) {
1507 printf("Error setting format: %s\n", snd_strerror(err));
1508 return -1;
1509 }
1510
1511 err = snd_pcm_hw_params_set_channels(*playback_handle, hw_params, alsa_config.channels);
1512 if (err) {
1513 printf( "Error setting channels: %s\n", snd_strerror(err));
1514 return -1;
1515 }
1516 printf("setting channels (%d)\n", alsa_config.channels);
1517
1518 printf("WANT-RATE = %d\n", rate);
1519 err = snd_pcm_hw_params_set_rate_near(*playback_handle, hw_params, &rate, 0);
1520 if (err) {
1521 printf("Error setting sampling rate (%d): %s\n", rate, snd_strerror(err));
1522 return -1;
1523 }
1524 printf("set sampling rate (%d)\n", rate);
1525
1526 err = snd_pcm_hw_params_set_period_size_near(*playback_handle, hw_params, &period_size, 0);
1527 if (err) {
1528 printf("Error setting period size (%ld): %s\n", period_size, snd_strerror(err));
1529 return -1;
1530 }
1531 printf("period_size = %d\n", (int)period_size);
1532
1533 err = snd_pcm_hw_params_set_buffer_size_near(*playback_handle, hw_params, &buffer_size);
1534 if (err) {
1535 printf("Error setting buffer size (%ld): %s\n", buffer_size, snd_strerror(err));
1536 return -1;
1537 }
1538 printf("buffer_size = %d\n", (int)buffer_size);
1539
1540 /* Write the parameters to the driver */
1541 err = snd_pcm_hw_params(*playback_handle, hw_params);
1542 if (err < 0) {
1543 printf( "Unable to set HW parameters: %s\n", snd_strerror(err));
1544 return -1;
1545 }
1546
1547 printf("Open playback device is successful: %s\n", device_name);
1548
1549 hfp_set_sw_params(*playback_handle, buffer_size, period_size, NULL);
1550 if (hw_params)
1551 snd_pcm_hw_params_free(hw_params);
1552
1553 return 0;
1554 }
1555
hfp_capture_device_open(snd_pcm_t ** capture_handle,const char * device_name,alsa_config_t alsa_config)1556 static int hfp_capture_device_open(snd_pcm_t** capture_handle,
1557 const char* device_name, alsa_config_t alsa_config)
1558 {
1559 int err;
1560 snd_pcm_hw_params_t *hw_params;
1561 unsigned int rate = alsa_config.sample_rate;
1562 snd_pcm_uframes_t period_size = alsa_config.period_size;
1563 snd_pcm_uframes_t buffer_size = alsa_config.buffer_size;
1564
1565 err = snd_pcm_open(capture_handle, device_name, SND_PCM_STREAM_CAPTURE, 0);
1566 if (err) {
1567 printf( "Unable to open capture PCM device: %s\n", device_name);
1568 return -1;
1569 }
1570 printf("Open capture PCM device: %s\n", device_name);
1571
1572 err = snd_pcm_hw_params_malloc(&hw_params);
1573 if (err) {
1574 printf("cannot allocate hardware parameter structure (%s)\n", snd_strerror(err));
1575 return -1;
1576 }
1577
1578 err = snd_pcm_hw_params_any(*capture_handle, hw_params);
1579 if (err) {
1580 printf("cannot initialize hardware parameter structure (%s)\n", snd_strerror(err));
1581 return -1;
1582 }
1583
1584 err = snd_pcm_hw_params_set_access(*capture_handle, hw_params, SND_PCM_ACCESS_RW_INTERLEAVED);
1585 if (err) {
1586 printf("Error setting interleaved mode: %s\n", snd_strerror(err));
1587 return -1;
1588 }
1589
1590 err = snd_pcm_hw_params_set_format(*capture_handle, hw_params, SND_PCM_FORMAT_S16_LE);
1591 if (err) {
1592 printf("Error setting format: %s\n", snd_strerror(err));
1593 return -1;
1594 }
1595
1596 err = snd_pcm_hw_params_set_channels(*capture_handle, hw_params, alsa_config.channels);
1597 if (err) {
1598 printf( "Error setting channels: %s, channels = %d\n", snd_strerror(err), alsa_config.channels);
1599 return -1;
1600 }
1601 printf("setting channels (%d)\n", alsa_config.channels);
1602
1603 printf("WANT-RATE = %d\n", rate);
1604 err = snd_pcm_hw_params_set_rate_near(*capture_handle, hw_params, &rate, 0);
1605 if (err) {
1606 printf("Error setting sampling rate (%d): %s\n", rate, snd_strerror(err));
1607 return -1;
1608 }
1609 printf("set sampling rate (%d)\n", rate);
1610
1611 err = snd_pcm_hw_params_set_period_size_near(*capture_handle, hw_params, &period_size, 0);
1612 if (err) {
1613 printf("Error setting period size (%d): %s\n", (int)period_size, snd_strerror(err));
1614 return -1;
1615 }
1616 printf("period_size = %d\n", (int)period_size);
1617
1618 err = snd_pcm_hw_params_set_buffer_size_near(*capture_handle, hw_params, &buffer_size);
1619 if (err) {
1620 printf("Error setting buffer size (%d): %s\n", (int)buffer_size, snd_strerror(err));
1621 return -1;
1622 }
1623 printf("buffer_size = %d\n", (int)buffer_size);
1624
1625 /* Write the parameters to the driver */
1626 err = snd_pcm_hw_params(*capture_handle, hw_params);
1627 if (err < 0) {
1628 printf( "Unable to set HW parameters: %s\n", snd_strerror(err));
1629 return -1;
1630 }
1631
1632 printf("Open capture device is successful: %s\n", device_name);
1633 if (hw_params)
1634 snd_pcm_hw_params_free(hw_params);
1635
1636 return 0;
1637 }
1638
hfp_pcm_close(snd_pcm_t * handle)1639 static void hfp_pcm_close(snd_pcm_t *handle)
1640 {
1641 if(handle)
1642 snd_pcm_close(handle);
1643 }
1644
hfp_tinymix_set(int group,int volume)1645 static void hfp_tinymix_set(int group, int volume)
1646 {
1647 char cmd[50] = {0};
1648
1649 sprintf(cmd, "tinymix set 'ADC MIC Group %d Left Volume' %d", group, volume);
1650 if (-1 == system(cmd))
1651 printf("tinymix set ADC MIC Group %d Left Volume failed\n", group);
1652
1653 memset(cmd, 0, 50);
1654 sprintf(cmd, "tinymix set 'ADC MIC Group %d Right Volume' %d", group, volume);
1655 if (-1 == system(cmd))
1656 printf("tinymix set ADC MIC Group %d Right Volume failed\n", group);
1657 }
1658
hfp_alsa_playback(void * arg)1659 static void *hfp_alsa_playback(void *arg)
1660 {
1661 int err, ret = -1;
1662 snd_pcm_t *capture_handle = NULL;
1663 snd_pcm_t *playbcak_handle = NULL;
1664 short *buffer;
1665 int read_frame, buffer_size;
1666 alsa_config_t alsa_config;
1667
1668 switch(sco_codec) {
1669 case BT_SCO_CODEC_CVSD:
1670 read_frame = READ_FRAME_512;
1671 alsa_config.sample_rate = CVSD_SAMPLE_RATE;
1672 alsa_config.period_size = PERIOD_SIZE_512;
1673 alsa_config.buffer_size = BUFFER_SIZE_2048;
1674 break;
1675 case BT_SCO_CODEC_MSBC:
1676 read_frame = READ_FRAME_1024;
1677 alsa_config.sample_rate = MSBC_SAMPLE_RATE;
1678 alsa_config.period_size = PERIOD_SIZE_1024;
1679 alsa_config.buffer_size = BUFFER_SIZE_4096;
1680 break;
1681 default:
1682 printf("%s: invalid sco codec type: %d\n", __func__, sco_codec);
1683 return NULL;
1684 }
1685 alsa_config.channels = HFP_PCM_CHANNEL_NB;
1686 buffer_size = read_frame * HFP_PCM_CHANNEL_NB * sizeof(short);
1687 buffer = (short *)malloc(buffer_size);
1688 memset((char *)buffer, 0, buffer_size);
1689
1690 device_open:
1691 printf("==========bt capture, alsa playback============\n");
1692 ret = hfp_capture_device_open(&capture_handle, bt_capture_device, alsa_config);
1693 if (ret == -1) {
1694 printf("capture device open failed: %s\n", bt_capture_device);
1695 goto exit;
1696 }
1697
1698 ret = hfp_playback_device_open(&playbcak_handle, alsa_playback_device, alsa_config);
1699 if (ret == -1) {
1700 printf("playback device open failed: %s\n", alsa_playback_device);
1701 goto exit;
1702 }
1703
1704 g_duplex_control.alsa_duplex_opened = true;
1705
1706 while (g_duplex_control.alsa_duplex_opened) {
1707 err = snd_pcm_readi(capture_handle, buffer , read_frame);
1708 if (!g_duplex_control.alsa_duplex_opened)
1709 goto exit;
1710
1711 if (err != read_frame)
1712 printf("=====read frame error = %d=====\n", err);
1713
1714 if (err == -EPIPE)
1715 printf("Overrun occurred: %d\n", err);
1716
1717 if (err < 0) {
1718 err = snd_pcm_recover(capture_handle, err, 0);
1719 // Still an error, need to exit.
1720 if (err < 0) {
1721 printf( "Error occured while recording: %s\n", snd_strerror(err));
1722 usleep(100 * 1000);
1723 hfp_pcm_close(capture_handle);
1724 hfp_pcm_close(playbcak_handle);
1725 goto device_open;
1726 }
1727 }
1728
1729 err = snd_pcm_writei(playbcak_handle, buffer, read_frame);
1730 if (!g_duplex_control.alsa_duplex_opened)
1731 goto exit;
1732
1733 if (err != read_frame)
1734 printf("=====write frame error = %d=====\n", err);
1735
1736 if (err == -EPIPE)
1737 printf("Underrun occurred from write: %d\n", err);
1738
1739 if (err < 0) {
1740 err = snd_pcm_recover(playbcak_handle, err, 0);
1741 // Still an error, need to exit.
1742 if (err < 0) {
1743 printf( "Error occured while writing: %s\n", snd_strerror(err));
1744 usleep(100 * 1000);
1745 hfp_pcm_close(capture_handle);
1746 hfp_pcm_close(playbcak_handle);
1747 goto device_open;
1748 }
1749 }
1750 }
1751
1752 exit:
1753 hfp_pcm_close(capture_handle);
1754 hfp_pcm_close(playbcak_handle);
1755 free(buffer);
1756
1757 printf("Exit app hs alsa playback thread\n");
1758 pthread_exit(0);
1759 }
1760
hfp_bt_playback(void * arg)1761 static void *hfp_bt_playback(void *arg)
1762 {
1763 int err, ret = -1;
1764 snd_pcm_t *capture_handle = NULL;
1765 snd_pcm_t *playbcak_handle = NULL;
1766 short buffer[READ_FRAME_256 * HFP_PCM_CHANNEL_NB] = {0};
1767 alsa_config_t alsa_config;
1768
1769 alsa_config.channels = HFP_PCM_CHANNEL_NB;
1770 alsa_config.period_size = PERIOD_SIZE_256;
1771 alsa_config.buffer_size = BUFFER_SIZE_1024;
1772 switch(sco_codec) {
1773 case BT_SCO_CODEC_CVSD:
1774 alsa_config.sample_rate = CVSD_SAMPLE_RATE;
1775 break;
1776 case BT_SCO_CODEC_MSBC:
1777 alsa_config.sample_rate = MSBC_SAMPLE_RATE;
1778 break;
1779 default:
1780 printf("%s: invalid sco codec type: %d\n", __func__, sco_codec);
1781 return NULL;
1782 }
1783
1784 device_open:
1785 printf("==========mic capture, bt playback============\n");
1786 ret = hfp_capture_device_open(&capture_handle, alsa_capture_device, alsa_config);
1787 if (ret == -1) {
1788 printf("capture device open failed: %s\n", alsa_capture_device);
1789 goto exit;
1790 }
1791
1792 hfp_tinymix_set(1, 3);
1793
1794 ret = hfp_playback_device_open(&playbcak_handle, bt_playback_device, alsa_config);
1795 if (ret == -1) {
1796 printf("playback device open failed: %s\n", bt_playback_device);
1797 goto exit;
1798 }
1799
1800 g_duplex_control.bt_duplex_opened = true;
1801
1802 while (g_duplex_control.bt_duplex_opened) {
1803 err = snd_pcm_readi(capture_handle, buffer , READ_FRAME_256);
1804 if (!g_duplex_control.bt_duplex_opened)
1805 goto exit;
1806
1807 if (err != READ_FRAME_256)
1808 printf("=====read frame error = %d=====\n", err);
1809
1810 if (err == -EPIPE)
1811 printf("Overrun occurred: %d\n", err);
1812
1813 if (err < 0) {
1814 err = snd_pcm_recover(capture_handle, err, 0);
1815 // Still an error, need to exit.
1816 if (err < 0) {
1817 printf( "Error occured while recording: %s\n", snd_strerror(err));
1818 usleep(100 * 1000);
1819 hfp_pcm_close(capture_handle);
1820 hfp_pcm_close(playbcak_handle);
1821 goto device_open;
1822 }
1823 }
1824
1825 err = snd_pcm_writei(playbcak_handle, buffer, READ_FRAME_256);
1826 if (!g_duplex_control.bt_duplex_opened)
1827 goto exit;
1828
1829 if (err != READ_FRAME_256)
1830 printf("====write frame error = %d===\n",err);
1831
1832 if (err == -EPIPE)
1833 printf("Underrun occurred from write: %d\n", err);
1834
1835 if (err < 0) {
1836 err = snd_pcm_recover(playbcak_handle, err, 0);
1837 // Still an error, need to exit.
1838 if (err < 0) {
1839 printf( "Error occured while writing: %s\n", snd_strerror(err));
1840 usleep(100 * 1000);
1841 hfp_pcm_close(capture_handle);
1842 hfp_pcm_close(playbcak_handle);
1843 goto device_open;
1844 }
1845 }
1846 }
1847
1848 exit:
1849 hfp_pcm_close(capture_handle);
1850 hfp_pcm_close(playbcak_handle);
1851
1852 printf("Exit app hs bt pcm playback thread\n");
1853 pthread_exit(0);
1854 }
1855
hfp_open_alsa_duplex()1856 static int hfp_open_alsa_duplex()
1857 {
1858 if (!g_duplex_control.alsa_duplex_opened) {
1859 if (pthread_create(&g_duplex_control.alsa_tid, NULL, hfp_alsa_playback, NULL)) {
1860 printf("Create alsa duplex thread failed\n");
1861 return -1;
1862 }
1863 } else {
1864 printf("hfp_open_alsa_duplex: alsa duplex already open\n");
1865 }
1866
1867 return 0;
1868 }
1869
hfp_close_alsa_duplex(void)1870 static void hfp_close_alsa_duplex(void)
1871 {
1872 printf("app_hs_close_alsa_duplex start\n");
1873 g_duplex_control.alsa_duplex_opened = false;
1874 if (g_duplex_control.alsa_tid) {
1875 pthread_join(g_duplex_control.alsa_tid, NULL);
1876 g_duplex_control.alsa_tid = 0;
1877 }
1878
1879 printf("app_hs_close_alsa_duplex end\n");
1880 }
1881
hfp_open_bt_duplex()1882 static int hfp_open_bt_duplex()
1883 {
1884 if (!g_duplex_control.bt_duplex_opened) {
1885 if (pthread_create(&g_duplex_control.bt_tid, NULL, hfp_bt_playback, NULL)) {
1886 printf("Create bt pcm duplex thread failed\n");
1887 return -1;
1888 }
1889 } else {
1890 printf("hfp_open_bt_duplex: bt duplex already open\n");
1891 }
1892
1893 return 0;
1894 }
1895
hfp_close_bt_duplex(void)1896 static void hfp_close_bt_duplex(void)
1897 {
1898 printf("app_hs_close_bt_duplex start\n");
1899 g_duplex_control.bt_duplex_opened = false;
1900 if (g_duplex_control.bt_tid) {
1901 pthread_join(g_duplex_control.bt_tid, NULL);
1902 g_duplex_control.bt_tid = 0;
1903 }
1904
1905 printf("app_hs_close_bt_duplex end\n");
1906 }
1907
hfp_open_audio_duplex()1908 static int hfp_open_audio_duplex()
1909 {
1910 if(sco_codec != BT_SCO_CODEC_CVSD && sco_codec != BT_SCO_CODEC_MSBC) {
1911 printf("%s: invalid sco codec type: %d\n", __func__, sco_codec);
1912 return -1;
1913 }
1914
1915 if(hfp_open_alsa_duplex() < 0)
1916 return -1;
1917
1918 if(hfp_open_bt_duplex() < 0)
1919 return -1;
1920
1921 return 0;
1922 }
1923
hfp_close_audio_duplex()1924 static void hfp_close_audio_duplex()
1925 {
1926 hfp_close_alsa_duplex();
1927 hfp_close_bt_duplex();
1928 }
1929
get_call_info(char * str)1930 static void get_call_info(char *str)
1931 {
1932 char number[20];
1933 char name[256];
1934 int i = 0;
1935 char *p0=str;
1936 char *p1=number;
1937 char *p2=name;
1938
1939 if(!str)
1940 return;
1941
1942 while(*p0!='\0')
1943 {
1944
1945 if(*p0=='\"')
1946 i++;
1947 if(i==1)
1948 {
1949 if(*p0!='\"')
1950 {*p1=*p0;p1++;}
1951 }
1952 if(i==3)
1953 {
1954 if(*p0!='\"')
1955 {*p2=*p0;p2++;}
1956 }
1957 p0++;
1958 }
1959 printf("Call info: %s\n", str);
1960 if(i>0)
1961 printf("Call number: %s\n", number);
1962 if(i>2)
1963 printf("Call name: %s\n", name);
1964 }
1965
bt_test_hfp_hp_cb(const char * bd_addr,RK_BT_HFP_EVENT event,void * data)1966 int bt_test_hfp_hp_cb(const char *bd_addr, RK_BT_HFP_EVENT event, void *data)
1967 {
1968 switch(event) {
1969 case RK_BT_HFP_CONNECT_EVT:
1970 printf("+++++ BT HFP HP CONNECT(%s) +++++\n", bd_addr);
1971 printf("device platform is %s\n", rk_bt_get_dev_platform((char *)bd_addr) == RK_BT_DEV_PLATFORM_UNKNOWN ?
1972 "Unknown Platform" : "Apple IOS");
1973 break;
1974 case RK_BT_HFP_DISCONNECT_EVT:
1975 printf("+++++ BT HFP HP DISCONNECT(%s) +++++\n", bd_addr);
1976 break;
1977 case RK_BT_HFP_RING_EVT:
1978 printf("+++++ BT HFP HP RING(%s) +++++\n", bd_addr);
1979 break;
1980 case RK_BT_HFP_AUDIO_OPEN_EVT:
1981 printf("+++++ BT HFP AUDIO OPEN(%s) +++++\n", bd_addr);
1982 hfp_open_audio_duplex();
1983 break;
1984 case RK_BT_HFP_AUDIO_CLOSE_EVT:
1985 printf("+++++ BT HFP AUDIO CLOSE(%s) +++++\n", bd_addr);
1986 hfp_close_audio_duplex();
1987 break;
1988 case RK_BT_HFP_PICKUP_EVT:
1989 printf("+++++ BT HFP PICKUP(%s) +++++\n", bd_addr);
1990 break;
1991 case RK_BT_HFP_HANGUP_EVT:
1992 printf("+++++ BT HFP HANGUP(%s) +++++\n", bd_addr);
1993 break;
1994 case RK_BT_HFP_VOLUME_EVT:
1995 {
1996 unsigned short volume = *(unsigned short*)data;
1997 printf("+++++ BT HFP VOLUME CHANGE, volume: %d +++++\n", volume);
1998 break;
1999 }
2000 case RK_BT_HFP_BCS_EVT:
2001 {
2002 unsigned short codec_type = *(unsigned short*)data;
2003 printf("+++++ BT HFP BCS EVENT: %d(%s) +++++\n", codec_type,
2004 (codec_type == BT_SCO_CODEC_MSBC) ? "mSBC":"CVSD");
2005 sco_codec = (RK_BT_SCO_CODEC_TYPE)codec_type;
2006 break;
2007 }
2008 case RK_BT_HFP_CLIP_EVT:
2009 {
2010 printf("+++++ BT HFP CLIP EVENT(%s) +++++\n", bd_addr);
2011 get_call_info((char *)data);
2012 break;
2013 }
2014
2015 case RK_BT_HFP_OUTGOING_CALL_DIAL_EVT:
2016 printf("+++++ BT HFP OUTGOING CALL DIAL EVT(%s) +++++\n", bd_addr);
2017 break;
2018
2019 case RK_BT_HFP_OUTGOING_CALL_RING_EVT:
2020 printf("+++++ BT HFP OUTGOING CALL RING EVT(%s) +++++\n", bd_addr);
2021 break;
2022
2023 case RK_BT_HFP_CLCC_EVT:
2024 {
2025 printf("+++++ BT HFP CLCC EVENT(%s) +++++\n", bd_addr);
2026 get_call_info((char *)data);
2027 }
2028 default:
2029 break;
2030 }
2031
2032 return 0;
2033 }
2034
bt_test_hfp_hp_open(char * data)2035 void bt_test_hfp_hp_open(char *data)
2036 {
2037 int ret = 0;
2038
2039 /* must be placed before rk_bt_hfp_open */
2040 rk_bt_hfp_register_callback(bt_test_hfp_hp_cb);
2041
2042 /* only bsa: if enable cvsd, sco_codec must be set to BT_SCO_CODEC_CVSD */
2043 rk_bt_hfp_enable_cvsd();
2044 ret = rk_bt_hfp_open();
2045 if (ret < 0)
2046 printf("%s hfp open failed!\n", __func__);
2047 }
2048
bt_test_hfp_hp_accept(char * data)2049 void bt_test_hfp_hp_accept(char *data)
2050 {
2051 int ret = 0;
2052
2053 ret = rk_bt_hfp_pickup();
2054 if (ret < 0)
2055 printf("%s hfp accept failed!\n", __func__);
2056 }
2057
bt_test_hfp_hp_hungup(char * data)2058 void bt_test_hfp_hp_hungup(char *data)
2059 {
2060 int ret = 0;
2061
2062 ret = rk_bt_hfp_hangup();
2063 if (ret < 0)
2064 printf("%s hfp hungup failed!\n", __func__);
2065 }
2066
bt_test_hfp_hp_redial(char * data)2067 void bt_test_hfp_hp_redial(char *data)
2068 {
2069 int ret = 0;
2070
2071 ret = rk_bt_hfp_redial();
2072 if (ret < 0)
2073 printf("%s hfp redial failed!\n", __func__);
2074 }
2075
bt_test_hfp_hp_dial_number(char * data)2076 void bt_test_hfp_hp_dial_number(char *data)
2077 {
2078 rk_bt_hfp_dial_number(data);
2079 }
2080
2081
bt_test_hfp_hp_report_battery(char * data)2082 void bt_test_hfp_hp_report_battery(char *data)
2083 {
2084 int ret = 0;
2085 int i = 0;
2086
2087 for (i = 0; i < 10; i++) {
2088 ret = rk_bt_hfp_report_battery(i);
2089 if (ret < 0) {
2090 printf("%s hfp report battery(%d) failed!\n", __func__, i);
2091 break;
2092 }
2093
2094 sleep(1);
2095 }
2096 }
2097
bt_test_hfp_hp_set_volume(char * data)2098 void bt_test_hfp_hp_set_volume(char *data)
2099 {
2100 int i;
2101
2102 for(i = 0; i <= 15; i++) {
2103 if (rk_bt_hfp_set_volume(i) < 0) {
2104 printf("%s hfp set volume(%d) failed!\n", __func__, i);
2105 break;
2106 }
2107 sleep(2);
2108 }
2109 }
2110
bt_test_hfp_hp_close(char * data)2111 void bt_test_hfp_hp_close(char *data)
2112 {
2113 rk_bt_hfp_close();
2114 }
2115
bt_test_hfp_hp_disconnect(char * data)2116 void bt_test_hfp_hp_disconnect(char *data)
2117 {
2118 rk_bt_hfp_disconnect();
2119 }
2120
bt_test_hfp_sink_open(char * data)2121 void bt_test_hfp_sink_open(char *data)
2122 {
2123 rk_bt_sink_register_volume_callback(bt_sink_volume_callback);
2124 rk_bt_sink_register_track_callback(bt_sink_track_change_callback);
2125 rk_bt_sink_register_position_callback(bt_sink_position_change_callback);
2126 rk_bt_sink_register_callback(bt_sink_callback);
2127 rk_bt_hfp_register_callback(bt_test_hfp_hp_cb);
2128 rk_bt_hfp_sink_open();
2129 }
2130
2131
2132 /******************************************/
2133 /* OBEX */
2134 /******************************************/
obex_pbap_event_cb(const char * bd_addr,RK_BT_OBEX_STATE state)2135 static void obex_pbap_event_cb(const char *bd_addr, RK_BT_OBEX_STATE state)
2136 {
2137 switch(state) {
2138 case RK_BT_OBEX_CONNECT_FAILED:
2139 printf("----- RK_BT_OBEX_CONNECT_FAILED(%s) -----\n", bd_addr);
2140 break;
2141
2142 case RK_BT_OBEX_CONNECTED:
2143 printf("----- RK_BT_OBEX_CONNECTED(%s) -----\n", bd_addr);
2144 break;
2145
2146 case RK_BT_OBEX_DISCONNECT_FAILED:
2147 printf("----- RK_BT_OBEX_DISCONNECT_FAILED(%s) -----\n", bd_addr);
2148 break;
2149
2150 case RK_BT_OBEX_DISCONNECTED:
2151 printf("----- RK_BT_OBEX_DISCONNECTED(%s) -----\n", bd_addr);
2152 break;
2153
2154 case RK_BT_OBEX_TRANSFER_ACTIVE:
2155 printf("----- RK_BT_OBEX_TRANSFER_ACTIVE(%s) -----\n", bd_addr);
2156 break;
2157
2158 case RK_BT_OBEX_TRANSFER_COMPLETE:
2159 printf("----- RK_BT_OBEX_TRANSFER_COMPLETE(%s) -----\n", bd_addr);
2160 break;
2161 }
2162 }
2163
bt_test_obex_init(char * data)2164 void bt_test_obex_init(char *data)
2165 {
2166 rk_bt_obex_init(data);
2167 }
2168
bt_test_obex_pbap_init(char * data)2169 void bt_test_obex_pbap_init(char *data)
2170 {
2171 rk_bt_obex_register_status_cb(obex_pbap_event_cb);
2172 rk_bt_obex_pbap_init();
2173 }
2174
bt_test_obex_pbap_connect(char * data)2175 void bt_test_obex_pbap_connect(char *data)
2176 {
2177 rk_bt_obex_pbap_connect(data);
2178 }
2179
bt_test_obex_pbap_get_pb_vcf(char * data)2180 void bt_test_obex_pbap_get_pb_vcf(char *data)
2181 {
2182 rk_bt_obex_pbap_get_vcf("pb", "/data/pb.vcf");
2183 }
2184
bt_test_obex_pbap_get_ich_vcf(char * data)2185 void bt_test_obex_pbap_get_ich_vcf(char *data)
2186 {
2187 rk_bt_obex_pbap_get_vcf("ich", "/data/ich.vcf");
2188 }
2189
bt_test_obex_pbap_get_och_vcf(char * data)2190 void bt_test_obex_pbap_get_och_vcf(char *data)
2191 {
2192 rk_bt_obex_pbap_get_vcf("och", "/data/och.vcf");
2193 }
2194
bt_test_obex_pbap_get_mch_vcf(char * data)2195 void bt_test_obex_pbap_get_mch_vcf(char *data)
2196 {
2197 rk_bt_obex_pbap_get_vcf("mch", "/data/mch.vcf");
2198 }
2199
bt_test_obex_pbap_get_spd_vcf(char * data)2200 void bt_test_obex_pbap_get_spd_vcf(char *data)
2201 {
2202 rk_bt_obex_pbap_get_vcf("spd", "/data/spd.vcf");
2203 }
2204
bt_test_obex_pbap_get_fav_vcf(char * data)2205 void bt_test_obex_pbap_get_fav_vcf(char *data)
2206 {
2207 rk_bt_obex_pbap_get_vcf("fav", "/data/fav.vcf");
2208 }
2209
bt_test_obex_pbap_disconnect(char * data)2210 void bt_test_obex_pbap_disconnect(char *data)
2211 {
2212 rk_bt_obex_pbap_disconnect(data);
2213 }
2214
bt_test_obex_pbap_deinit(char * data)2215 void bt_test_obex_pbap_deinit(char *data)
2216 {
2217 rk_bt_obex_pbap_deinit();
2218 }
2219
bt_test_obex_deinit(char * data)2220 void bt_test_obex_deinit(char *data)
2221 {
2222 rk_bt_obex_deinit();
2223 }
2224
2225 /******************************************/
2226 /* PAN */
2227 /******************************************/
pan_event_cb(RK_BT_PAN_EVENT event,char * bd_addr)2228 static void pan_event_cb(RK_BT_PAN_EVENT event, char *bd_addr)
2229 {
2230 switch(event) {
2231 case RK_BT_PAN_CONNECT_FAILED:
2232 printf("----- RK_BT_PAN_CONNECT_FAILED(%s) -----\n", bd_addr);
2233 break;
2234
2235 case RK_BT_PAN_CONNECT:
2236 printf("----- RK_BT_PAN_CONNECT(%s) -----\n", bd_addr);
2237 break;
2238
2239 case RK_BT_PAN_DISCONNECT:
2240 printf("----- RK_BT_PAN_DISCONNECT(%s) -----\n", bd_addr);
2241 break;
2242 }
2243 }
2244
bt_test_pan_init(char * data)2245 void bt_test_pan_init(char *data)
2246 {
2247 rk_bt_pan_register_event_cb(pan_event_cb);
2248 rk_bt_pan_open();
2249 }
2250
bt_test_pan_deinit(char * data)2251 void bt_test_pan_deinit(char *data)
2252 {
2253 rk_bt_pan_close();
2254 }
2255
bt_test_pan_connect(char * data)2256 void bt_test_pan_connect(char *data)
2257 {
2258 rk_bt_pan_connect(data);
2259 }
2260
bt_test_pan_disconnect(char * data)2261 void bt_test_pan_disconnect(char *data)
2262 {
2263 rk_bt_pan_disconnect(data);
2264 }
2265