func_bt.c 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844
  1. #include "include.h"
  2. #include "func.h"
  3. #include "func_bt.h"
  4. #if HLW_UI
  5. #include "hlw_func.h"
  6. #endif // HLW_UI
  7. func_bt_t f_bt;
  8. void uart_cmd_process(void);
  9. ALIGNED(128)
  10. u16 func_bt_chkclr_warning(u16 bits)
  11. {
  12. u16 value;
  13. GLOBAL_INT_DISABLE();
  14. value = f_bt.warning_status & bits;
  15. if(value != 0) {
  16. f_bt.warning_status &= ~value;
  17. GLOBAL_INT_RESTORE();
  18. return value;
  19. }
  20. GLOBAL_INT_RESTORE();
  21. return value;
  22. }
  23. #if FUNC_BT_EN
  24. void func_bt_set_dac(u8 enable)
  25. {
  26. if (bsp_dac_off_for_bt_conn()) {
  27. if (enable) {
  28. if (!dac_get_pwr_sta()) {
  29. dac_restart();
  30. }
  31. } else {
  32. if (dac_get_pwr_sta()) {
  33. dac_power_off();
  34. }
  35. }
  36. }
  37. }
  38. void func_bt_mp3_res_play(u32 addr, u32 len)
  39. {
  40. if (len == 0) {
  41. return;
  42. }
  43. bt_audio_bypass();
  44. mp3_res_play(addr, len);
  45. bt_audio_enable();
  46. }
  47. //切换提示音语言
  48. void func_bt_switch_voice_lang(void)
  49. {
  50. #if (LANG_SELECT == LANG_EN_ZH)
  51. if (xcfg_cb.lang_id >= LANG_EN_ZH) {
  52. sys_cb.lang_id = (sys_cb.lang_id) ? 0 : 1;
  53. multi_lang_init(sys_cb.lang_id);
  54. param_lang_id_write();
  55. param_sync();
  56. if (xcfg_cb.bt_tws_en) {
  57. bt_tws_sync_setting(); //同步语言
  58. bsp_res_play(TWS_RES_LANGUAGE_EN + sys_cb.lang_id); //同步播放语言提示音
  59. } else {
  60. func_bt_mp3_res_play(RES_BUF_LANGUAGE, RES_LEN_LANGUAGE);
  61. }
  62. }
  63. #endif
  64. }
  65. #if BT_TWS_EN
  66. static void func_bt_tws_set_channel(void)
  67. {
  68. if(f_bt.tws_status & FEAT_TWS_FLAG) { //对箱状态.
  69. tws_get_lr_channel();
  70. dac_mono_init(0, sys_cb.tws_left_channel);
  71. } else {
  72. dac_mono_init(1, 0);
  73. }
  74. }
  75. #endif
  76. u8 func_bt_tws_get_channel(void)
  77. {
  78. #if BT_TWS_EN
  79. return sys_cb.tws_left_channel;
  80. #else
  81. return false;
  82. #endif
  83. }
  84. void func_bt_warning_do(void)
  85. {
  86. #if QTEST_EN
  87. if(qtest_get_mode()){
  88. func_bt_chkclr_warning(0xffff);
  89. return;
  90. }
  91. #endif
  92. if(func_bt_chkclr_warning(BT_WARN_TWS_DISCON | BT_WARN_TWS_CON)) {
  93. #if BT_TWS_EN
  94. if(xcfg_cb.bt_tws_en) {
  95. if(xcfg_cb.bt_tws_lr_mode != 0) {
  96. func_bt_tws_set_channel();
  97. }
  98. }
  99. #endif
  100. }
  101. if(func_bt_chkclr_warning(BT_WARN_DISCON)) {
  102. #if BT_HID_DOUYIN_EN
  103. cfg_bt_hid_android_param = 0;
  104. bt_hid_finger_select_ios();
  105. #endif
  106. #if WARNING_BT_DISCONNECT
  107. if(!bt_tws_is_slave()) {
  108. bsp_res_play(TWS_RES_DISCONNECT);
  109. return;
  110. }
  111. #endif // WARNING_BT_DISCONNECT
  112. }
  113. if(func_bt_chkclr_warning(BT_WARN_PAIRING)) {
  114. if(!bt_tws_is_slave()) {
  115. printf("pair ..........\n");
  116. bsp_res_play(TWS_RES_PAIRING);
  117. return;
  118. }
  119. }
  120. #if BT_TWS_EN
  121. if(xcfg_cb.bt_tws_en) {
  122. u16 tws_warning = func_bt_chkclr_warning(BT_WARN_TWS_SCON | BT_WARN_TWS_MCON );
  123. if(tws_warning != 0) {
  124. f_bt.tws_had_pair = 1;
  125. if (xcfg_cb.bt_tws_lr_mode != 0) {
  126. func_bt_tws_set_channel();
  127. }
  128. ///固定声道方案,TWS连接后异步播放声音提示音。否则同步播放连接提示音
  129. if (xcfg_cb.bt_tws_lr_mode >= 8) {
  130. func_bt_tws_set_channel();
  131. tws_get_lr_channel();
  132. if (!bsp_res_is_playing()) {
  133. #if WARNING_WSBC_EN
  134. if(sys_cb.tws_left_channel) {
  135. wsbc_res_play(RES_BUF_LEFT_CH, RES_LEN_LEFT_CH);
  136. } else {
  137. wsbc_res_play(RES_BUF_RIGHT_CH, RES_LEN_RIGHT_CH);
  138. }
  139. #else
  140. if(sys_cb.tws_left_channel) {
  141. func_cb.mp3_res_play(RES_BUF_LEFT_CH, RES_LEN_LEFT_CH);
  142. } else {
  143. bt_audio_bypass();
  144. u8 timer_cnt = 100;
  145. while (timer_cnt--) {
  146. bt_thread_check_trigger();
  147. bsp_res_process();
  148. delay_5ms(2);
  149. WDT_CLR();
  150. }
  151. func_cb.mp3_res_play(RES_BUF_RIGHT_CH, RES_LEN_RIGHT_CH);
  152. bt_audio_enable();
  153. }
  154. #endif
  155. }
  156. } else {
  157. if (tws_warning & BT_WARN_TWS_MCON) {
  158. bsp_res_play(TWS_RES_CONNECTED);
  159. return;
  160. }
  161. }
  162. }
  163. }
  164. #endif
  165. #if HLW_UI
  166. if(func_bt_chkclr_warning(BT_WARN_BAT_VOICE)) {
  167. if(!bt_tws_is_slave()) {
  168. hlw_func_battery_voice_handle();
  169. return;
  170. }
  171. }
  172. #endif // HLW_UI
  173. if(func_bt_chkclr_warning(BT_WARN_CON)) {
  174. #if WARNING_BT_CONNECT
  175. if(!bt_tws_is_slave()) {
  176. #if !HLW_UI
  177. bsp_res_play(TWS_RES_CONNECTED);
  178. #else
  179. printf("hlw_cb.poweron_connect_cnt 00: %d\n", hlw_cb.poweron_connect_cnt);
  180. if(hlw_cb.poweron_connect_cnt > 0)
  181. {
  182. hlw_cb.poweron_connect_cnt--;
  183. bsp_res_play(TWS_RES_CONNECTED);
  184. }
  185. printf("hlw_cb.poweron_connect_cnt 11: %d\n", hlw_cb.poweron_connect_cnt);
  186. if(hlw_cb.poweron_connect_cnt > 0)
  187. {
  188. hlw_cb.poweron_connect_cnt--;
  189. bsp_res_play(TWS_RES_CONNECTED);
  190. }
  191. printf("hlw_cb.poweron_connect_cnt 22: %d\n", hlw_cb.poweron_connect_cnt);
  192. /*
  193. while(1)
  194. {
  195. printf("hlw_cb.poweron_connect_cnt %d\n", hlw_cb.poweron_connect_cnt);
  196. if(hlw_cb.poweron_connect_cnt > 0)
  197. {
  198. hlw_cb.poweron_connect_cnt--;
  199. bsp_res_play(TWS_RES_CONNECTED);
  200. }
  201. if(hlw_cb.poweron_connect_cnt == 0)
  202. {
  203. break;
  204. }
  205. }
  206. */
  207. #endif // HLW_UI
  208. return;
  209. }
  210. #endif
  211. }
  212. #if BT_HID_MANU_EN
  213. //按键手动断开HID Profile的提示音
  214. if (xcfg_cb.bt_hid_manu_en) {
  215. #if WARNING_BT_HID_MENU
  216. if (func_bt_chkclr_warning(BT_WARN_HID_CON)) {
  217. func_cb.mp3_res_play(RES_BUF_CAMERA_ON_MP3, RES_LEN_CAMERA_ON_MP3);
  218. }
  219. #endif
  220. #if WARNING_BT_HID_MENU
  221. if (func_bt_chkclr_warning(BT_WARN_HID_DISCON)) {
  222. func_cb.mp3_res_play(RES_BUF_CAMERA_OFF_MP3, RES_LEN_CAMERA_OFF_MP3);
  223. }
  224. #endif
  225. #if BT_HID_DISCON_DEFAULT_EN
  226. if (f_bt.hid_discon_flag) {
  227. if (bt_hid_is_ready_to_discon()) {
  228. f_bt.hid_discon_flag = 0;
  229. bt_hid_disconnect();
  230. }
  231. }
  232. #endif
  233. }
  234. #endif // BT_HID_MANU_EN
  235. }
  236. AT(.text.func.bt.process)
  237. void func_bt_warning(void)
  238. {
  239. if(f_bt.warning_status != 0 && !bsp_res_is_full()) {
  240. func_bt_warning_do();
  241. }
  242. }
  243. void func_bt_disp_status_do(void)
  244. {
  245. if(!bt_is_connected()) {
  246. en_auto_pwroff();
  247. sys_cb.sleep_en = BT_PAIR_SLEEP_EN;
  248. } else {
  249. dis_auto_pwroff();
  250. sys_cb.sleep_en = 1;
  251. }
  252. printf("%s f_bt.disp_status %d\n", __func__, f_bt.disp_status);
  253. switch (f_bt.disp_status) {
  254. case BT_STA_CONNECTING:
  255. if (BT_RECONN_LED_EN) {
  256. led_bt_reconnect();
  257. break;
  258. }
  259. case BT_STA_INITING:
  260. case BT_STA_IDLE:
  261. #if HLW_UI
  262. hlw_bt_poweron_enter_pairmode_handle();
  263. #else
  264. led_bt_idle();
  265. #if WARNING_BT_PAIR
  266. if(f_bt.need_pairing && f_bt.disp_status == BT_STA_IDLE) {
  267. f_bt.need_pairing = 0;
  268. if(xcfg_cb.warning_bt_pair && xcfg_cb.bt_tws_en) {
  269. f_bt.warning_status |= BT_WARN_PAIRING;
  270. }
  271. }
  272. #endif
  273. #endif // HLW_UI
  274. break;
  275. case BT_STA_SCANNING:
  276. #if HLW_UI
  277. hlw_bt_reconnect_fail_no_pairlist_handle();
  278. #else
  279. led_bt_scan();
  280. #endif
  281. break;
  282. case BT_STA_DISCONNECTING:
  283. #if !HLW_UI
  284. led_bt_connected();
  285. #endif
  286. break;
  287. case BT_STA_CONNECTED:
  288. #if !HLW_UI
  289. led_bt_connected();
  290. #endif
  291. #if ABP_EN && ABP_MUSIC_DIS_PINK_EN
  292. if (sys_cb.abp_mode == ABP_MODE_PINK) {
  293. bsp_abp_set_mode(sys_cb.abp_mode);
  294. }
  295. #endif
  296. #if ANC_MAX_VOL_DIS_FB_EN
  297. bsp_anc_max_vol_dac_det_stop();
  298. #endif // ANC_MAX_VOL_DIS_FB_EN
  299. break;
  300. case BT_STA_INCOMING:
  301. led_bt_ring();
  302. break;
  303. case BT_STA_PLAYING:
  304. #if !HLW_UI
  305. led_bt_play();
  306. #endif
  307. #if ABP_EN && ABP_MUSIC_DIS_PINK_EN
  308. if (sys_cb.abp_mode == ABP_MODE_PINK) {
  309. abp_stop();
  310. }
  311. #endif
  312. #if ANC_MAX_VOL_DIS_FB_EN
  313. bsp_anc_max_vol_dac_det_start();
  314. #endif // ANC_MAX_VOL_DIS_FB_EN
  315. break;
  316. case BT_STA_OUTGOING:
  317. case BT_STA_INCALL:
  318. #if !HLW_UI
  319. led_bt_call();
  320. #endif
  321. break;
  322. }
  323. if(f_bt.disp_status >= BT_STA_CONNECTED) {
  324. f_bt.need_pairing = 1;
  325. sys_cb.dac_sta_bck = 1;
  326. func_bt_set_dac(1);
  327. dac_fade_in();
  328. } else {
  329. sys_cb.dac_sta_bck = 0;
  330. func_bt_set_dac(0);
  331. }
  332. #if BT_BACKSTAGE_EN
  333. if (f_bt.disp_status < BT_STA_PLAYING && func_cb.sta_break != FUNC_NULL) {
  334. func_cb.sta = func_cb.sta_break;
  335. }
  336. #endif
  337. }
  338. AT(.text.func.bt.process) ALIGNED(128)
  339. void func_bt_disp_status(void)
  340. {
  341. uint status = bt_get_disp_status();
  342. GLOBAL_INT_DISABLE();
  343. if(f_bt.disp_status != status || f_bt.disp_update) {
  344. f_bt.disp_status = status;
  345. f_bt.disp_update = 0;
  346. GLOBAL_INT_RESTORE();
  347. func_bt_disp_status_do();
  348. } else {
  349. GLOBAL_INT_RESTORE();
  350. }
  351. }
  352. AT(.text.func.bt.process)
  353. void func_bt_status(void)
  354. {
  355. func_bt_disp_status();
  356. #if FUNC_BTHID_EN
  357. if(is_bthid_mode()) {
  358. func_bt_hid_warning();
  359. } else
  360. #endif
  361. {
  362. func_bt_warning();
  363. }
  364. }
  365. #if USER_INEAR_DETECT_EN
  366. AT(.text.func.bt.process)
  367. void func_bt_inear_process(void)
  368. {
  369. if (dev_is_online(DEV_EARIN)) {
  370. if (sys_cb.loc_ear_sta) {
  371. if (sys_cb.rem_ear_sta) { //检测到对耳已经入耳,不用播放入耳提示音
  372. func_cb.mp3_res_play(RES_BUF_INEAR_DU_MP3, RES_LEN_INEAR_DU_MP3);
  373. }
  374. bt_set_ear_sta(0); //入耳
  375. // bt_music_play(); //播放音乐,需要时打开
  376. }
  377. } else {
  378. if (!sys_cb.loc_ear_sta) {
  379. bt_set_ear_sta(1); //摘下
  380. // bt_music_pause(); //暂停播放
  381. }
  382. }
  383. }
  384. #endif // USER_TKEY_INEAR
  385. #if BT_2ACL_AUTO_SWITCH
  386. struct {
  387. uint32_t check_tick;
  388. uint16_t play_timer_cnt;
  389. uint16_t clear_timer_cnt;
  390. uint8_t protect_timer_cnt;
  391. } bt_silence;
  392. AT(.text.func.bt.process)
  393. bool bt_play_data_check_do(void)
  394. {
  395. bool ret = false;
  396. if (bt_silence.protect_timer_cnt) {
  397. bt_silence.protect_timer_cnt--;
  398. return false;
  399. }
  400. //消抖
  401. if (!bt_is_silence()) {
  402. bt_silence.clear_timer_cnt = 0;
  403. bt_silence.play_timer_cnt++;
  404. if (bt_silence.play_timer_cnt > 100) {
  405. ret = true;
  406. bt_silence.play_timer_cnt = 0;
  407. bt_silence.protect_timer_cnt = 200;
  408. }
  409. } else {
  410. bt_silence.clear_timer_cnt++;
  411. if (bt_silence.clear_timer_cnt > 100) {
  412. bt_silence.play_timer_cnt = 0;
  413. }
  414. }
  415. return ret;
  416. }
  417. AT(.text.func.bt.process)
  418. bool bt_play_data_check(void)
  419. {
  420. #if BT_TWS_EN
  421. if(bt_tws_is_slave()){
  422. return false;
  423. }
  424. #endif
  425. if (tick_check_expire(bt_silence.check_tick, 10)) {
  426. bt_silence.check_tick = tick_get();
  427. } else {
  428. return false;
  429. }
  430. return bt_play_data_check_do();
  431. }
  432. AT(.text.func.bt)
  433. void bt_play_data_init(void)
  434. {
  435. memset(&bt_silence, 0, sizeof(bt_silence));
  436. }
  437. void bt_play_switch_device()
  438. {
  439. bt_silence.play_timer_cnt = 0;
  440. bt_silence.clear_timer_cnt = 0;
  441. bt_silence.protect_timer_cnt = 200;
  442. bt_music_play_switch();
  443. }
  444. #endif
  445. //借用读参数区做load flash的动作,使flash一直busy
  446. static void func_bt_load_flash(void)
  447. {
  448. static u32 tick = 0;
  449. u8 load_buf[32];
  450. if (tick_check_expire(tick, 1000)) {
  451. printf("load flash test\n");
  452. tick = tick_get();
  453. }
  454. cm_read(load_buf, PAGE0(0), 32);
  455. cm_read(load_buf, PAGE1(0), 32);
  456. cm_read(load_buf, PAGE2(0), 32);
  457. }
  458. AT(.text.func.bt.process)
  459. void func_bt_sub_process(void)
  460. {
  461. func_bt_status();
  462. #if USER_INEAR_DETECT_EN
  463. func_bt_inear_process();
  464. #endif
  465. #if USER_TKEY_DEBUG_EN
  466. bsp_tkey_spp_tx();
  467. #endif
  468. #if BT_2ACL_AUTO_SWITCH
  469. if (bt_play_data_check()) {
  470. bt_music_play_switch();
  471. }
  472. #endif
  473. #if BT_BQB_RF_EN
  474. if (func_cb.sta != FUNC_BT_DUT) {
  475. func_cb.sta = FUNC_BT_DUT;
  476. }
  477. #endif
  478. if (func_cb.sta == FUNC_BT_DUT || BT_DUT_MODE_EN) {
  479. func_bt_load_flash(); //如果在DUT模式就让flash动起来,测试flash对rf的影响
  480. }
  481. }
  482. AT(.text.func.bt.process)
  483. void func_bt_process(void)
  484. {
  485. func_process();
  486. func_bt_sub_process();
  487. #if BT_TWS_MS_SWITCH_EN
  488. if ((xcfg_cb.bt_tswi_msc_en) && bt_tws_need_switch(0) && !bsp_res_is_playing()) {
  489. printf("AUDIO SWITCH\n");
  490. bt_tws_switch();
  491. }
  492. #endif
  493. if(f_bt.disp_status == BT_STA_INCOMING) {
  494. sfunc_bt_ring();
  495. reset_sleep_delay();
  496. reset_pwroff_delay();
  497. f_bt.siri_kl_flag = 0;
  498. f_bt.user_kl_flag = 0;
  499. } else if(f_bt.disp_status == BT_STA_OTA) {
  500. sfunc_bt_ota();
  501. reset_sleep_delay();
  502. reset_pwroff_delay();
  503. } else if(f_bt.disp_status >= BT_STA_OUTGOING) {
  504. sfunc_bt_call();
  505. reset_sleep_delay();
  506. reset_pwroff_delay();
  507. f_bt.siri_kl_flag = 0;
  508. f_bt.user_kl_flag = 0;
  509. }
  510. #if HLW_UI
  511. if((sys_cb.pwroff_delay == 0)&&(hlw_cb.auto_poweroff_enable_flag)){
  512. #else
  513. if(sys_cb.pwroff_delay == 0) {
  514. #endif // HLW_UI
  515. sys_cb.pwrdwn_tone_en = 1; //连接超时关主从切换,同步关机
  516. func_cb.sta = FUNC_PWROFF;
  517. return;
  518. }
  519. if(sleep_process(bt_is_allow_sleep)) {
  520. f_bt.disp_status = 0xff;
  521. }
  522. #if HLW_UI
  523. hlw_bt_disconnect_process();
  524. #endif
  525. }
  526. AT(.text.func.bt)
  527. void func_bt_init(void)
  528. {
  529. if (!f_bt.bt_is_inited) {
  530. msg_queue_clear();
  531. func_bt_set_dac(0);
  532. bsp_bt_init();
  533. f_bt.bt_is_inited = 1;
  534. }
  535. }
  536. AT(.text.func.bt)
  537. void func_bt_chk_off(void)
  538. {
  539. if ((func_cb.sta != FUNC_BT) && (f_bt.bt_is_inited)) {
  540. #if BT_PWRKEY_5S_DISCOVER_EN
  541. bsp_bt_pwrkey5s_clr();
  542. #endif
  543. bt_disconnect(0);
  544. bt_off();
  545. func_bt_set_dac(1);
  546. f_bt.bt_is_inited = 0;
  547. }
  548. }
  549. bool func_bt_charge_dcin(void)
  550. {
  551. #if QTEST_EN
  552. u32 qtest_5v_tick = tick_get();
  553. if(qtest_get_mode()){
  554. return false;
  555. }
  556. if(qtest_cb.sta) {
  557. while(!tick_check_expire(qtest_5v_tick, 1000)) {
  558. if(!CHARGE_DC_IN()) {
  559. return false;
  560. }
  561. if(func_cb.sta == FUNC_BT) {
  562. bt_thread_check_trigger();
  563. bsp_res_process();
  564. }
  565. }
  566. qtest_cb.sta = 0;
  567. }
  568. #endif
  569. if ((xcfg_cb.bt_tswi_charge_rst_en) || (func_cb.sta != FUNC_BT)) {
  570. sys_cb.discon_reason = 0;
  571. //开启UART2检测VUSB KEY,避免func_bt_exit过程太久,无法进入VUSB升级
  572. sys_clk_set(SYS_24M);
  573. #if !UART1_EN && !UART2_EN
  574. uart2_key_mode(9600);
  575. #endif
  576. func_bt_exit();
  577. sw_reset_kick(SW_RST_DC_IN); //直接复位进入充电
  578. while(1);
  579. }
  580. if(sys_cb.discon_reason == 0xff) {
  581. sys_cb.discon_reason = 0; //不同步关机
  582. }
  583. return true;
  584. }
  585. AT(.text.func.bt)
  586. void func_bt_enter(void)
  587. {
  588. if (func_cb.last != FUNC_NULL) { //开机进入不清res
  589. bsp_res_cleanup();
  590. }
  591. bsp_res_set_enable(true);
  592. func_cb.mp3_res_play = func_bt_mp3_res_play;
  593. func_bt_enter_display();
  594. #if !HLW_UI
  595. led_bt_init();
  596. #endif // HLW_UI
  597. func_bt_init();
  598. //en_auto_pwroff();
  599. #if WARNING_FUNC_BT
  600. mp3_res_play(RES_BUF_BT_MODE, RES_LEN_BT_MODE);
  601. #endif // WARNING_FUNC_BT
  602. #if WARNING_BT_WAIT_CONNECT
  603. mp3_res_play(RES_BUF_WAIT4CONN, RES_LEN_WAIT4CONN);
  604. #endif // WARNING_BT_WAIT_CONNECT
  605. f_bt.disp_status = 0xfe;
  606. f_bt.rec_pause = 0;
  607. f_bt.pp_2_unmute = 0;
  608. sys_cb.key2unmute_cnt = 0;
  609. bt_redial_init();
  610. bt_audio_enable();
  611. #if HLW_UI
  612. if(func_cb.sta == FUNC_BT)
  613. {
  614. if(func_bt_ldac_is_auth())
  615. {
  616. printf("ldac auth is ok!!!\n");
  617. }
  618. else
  619. {
  620. printf("ldac auth is err!!!\n");
  621. }
  622. //anc set
  623. printf("func_bt_enter anc mode %d\n", sys_cb.anc_user_mode);
  624. if(sys_cb.anc_user_mode != 0)
  625. {
  626. bsp_anc_set_mode(sys_cb.anc_user_mode);
  627. }
  628. }
  629. #endif
  630. #if HLW_UI
  631. if(func_cb.sta == FUNC_BT)
  632. #endif // HLW_UI
  633. {
  634. #if BT_PWRKEY_5S_DISCOVER_EN
  635. if(bsp_bt_pwrkey5s_check()) {
  636. f_bt.need_pairing = 0; //已经播报了
  637. #if HLW_UI
  638. hlw_cb.poweron_pwrkey5s_flag = true;
  639. #endif // HLW_UI
  640. func_bt_disp_status();
  641. #if HLW_UI
  642. #else
  643. func_bt_mp3_res_play(RES_BUF_PAIRING_MP3, RES_LEN_PAIRING_MP3);
  644. #endif // HLW_UI
  645. } else {
  646. #if HLW_UI
  647. if((!hlw_cb.poweron_reconnect_fail_flag)&&(bt_nor_get_link_info(NULL))&&(bt_get_connected_num() == 0))
  648. {
  649. f_bt.warning_status |= BT_WARN_BAT_VOICE;
  650. }
  651. #endif // HLW_UI
  652. func_bt_disp_status();
  653. #if WARNING_BT_PAIR
  654. if (xcfg_cb.warning_bt_pair && !xcfg_cb.bt_tws_en) {
  655. #if HLW_UI
  656. #else
  657. func_bt_mp3_res_play(RES_BUF_PAIRING_MP3, RES_LEN_PAIRING_MP3);
  658. #endif // HLW_UI
  659. }
  660. #endif // WARNING_BT_PAIR
  661. }
  662. }
  663. #endif
  664. #if BT_2ACL_AUTO_SWITCH
  665. bt_play_data_init();
  666. #endif
  667. #if LE_PRIV_EN
  668. ble_priv_adv_en(1);
  669. #endif
  670. }
  671. AT(.text.func.bt)
  672. void func_bt_exit(void)
  673. {
  674. bsp_res_set_enable(false);
  675. while(bsp_res_is_playing()) {
  676. bt_thread_check_trigger();
  677. bsp_res_process();
  678. }
  679. bsp_res_cleanup();
  680. bsp_res_set_break(false);
  681. if(sys_cb.discon_reason == 0xff && func_cb.sta == FUNC_PWROFF) {
  682. sys_cb.discon_reason = 1; //默认同步关机
  683. }
  684. dac_fade_out();
  685. #if ASR_EN
  686. if (sys_cb.asr_enable) {
  687. bsp_asr_stop();
  688. sys_cb.asr_enable = 0;
  689. }
  690. #endif
  691. #if BT_PWRKEY_5S_DISCOVER_EN
  692. bsp_bt_pwrkey5s_clr();
  693. #endif
  694. func_bt_exit_display();
  695. bt_audio_bypass();
  696. #if BT_TWS_EN
  697. dac_mono_init(1, 0);
  698. u16 timeout = 350;
  699. while (bt_nor_acl_is_connected() && bt_tws_is_connected() && !bt_tws_is_slave() && timeout--) { //如果没跑完回连流程,在这里等一下回连完HFP和A2DP
  700. if (hfp_is_connected() && a2dp_is_avctp_connect()) {
  701. break;
  702. }
  703. vusb4s_reset_clr_cnt();
  704. bt_thread_check_trigger();
  705. delay_5ms(2);
  706. WDT_CLR();
  707. }
  708. #endif
  709. #if !BT_BACKSTAGE_EN
  710. bt_disconnect(sys_cb.discon_reason);
  711. bt_off();
  712. f_bt.bt_is_inited = 0;
  713. #else
  714. if (bt_get_status() == BT_STA_PLAYING && !bt_is_testmode()) { //蓝牙退出停掉音乐
  715. delay_5ms(10);
  716. if(bt_get_status() == BT_STA_PLAYING) { //再次确认play状态
  717. u32 timeout = 850; //8.5s
  718. bt_music_pause();
  719. while (bt_get_status() == BT_STA_PLAYING && timeout > 0) {
  720. timeout--;
  721. delay_5ms(2);
  722. }
  723. }
  724. }
  725. #endif
  726. #if ABP_EN
  727. if (abp_is_playing()) {
  728. sys_cb.abp_mode = 0;
  729. abp_stop();
  730. }
  731. #endif // ABP_EN
  732. f_bt.rec_pause = 0;
  733. f_bt.pp_2_unmute = 0;
  734. sys_cb.key2unmute_cnt = 0;
  735. func_bt_set_dac(1);
  736. func_cb.last = FUNC_BT;
  737. }
  738. AT(.text.func.bt)
  739. void func_bt(void)
  740. {
  741. printf("%s\n", __func__);
  742. func_bt_enter();
  743. while (func_cb.sta == FUNC_BT) {
  744. func_bt_process();
  745. func_bt_message(msg_dequeue());
  746. func_bt_display();
  747. }
  748. func_bt_exit();
  749. }
  750. #if HLW_UI
  751. AT(.text.func.bt)
  752. bool func_bt_ldac_is_auth(void)
  753. {
  754. #if 0
  755. return true;
  756. #else
  757. u32 *key = (u32*)&xcfg_cb.soft_key[16];
  758. if (*key == 0xDDE05A0D) {
  759. return true;
  760. } else {
  761. return false;
  762. }
  763. #endif // 0
  764. }
  765. #endif // HLW_UI
  766. #endif //FUNC_BT_EN