xref: /OK3568_Linux_fs/external/rkwifibt-app/test/bt_test.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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(&params);
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