func_bt.c 20 KB

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