sfunc_bt_ring.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500
  1. #include "include.h"
  2. #include "func.h"
  3. #include "func_bt.h"
  4. #define TRACE_EN 1
  5. #if TRACE_EN
  6. #define TRACE(...) printf(__VA_ARGS__)
  7. #define TRACE_R(...) print_r(__VA_ARGS__)
  8. #else
  9. #define TRACE(...)
  10. #define TRACE_R(...)
  11. #endif // TRACE_EN
  12. #if FUNC_BT_EN
  13. enum {
  14. RING_FLAG_RES = BIT(0), //本地铃声标志
  15. RING_FLAG_SCO = BIT(1), //SCO铃声标志
  16. RING_FLAG_NUM = BIT(2), //报号标志
  17. RING_FLAG_SYNC = BIT(3), //是否同步状态标志
  18. };
  19. enum {
  20. BT_RING_STA_IDLE = 0,
  21. BT_RING_STA_NEGO, //协商状态
  22. BT_RING_STA_SCO, //播放SCO铃声同步状态(不支持手机或选择不同步,播放本地ring)
  23. BT_RING_STA_RES, //播放ring res状态
  24. BT_RING_STA_NUM, //播放来电报号
  25. };
  26. struct bt_ring_st {
  27. u8 rem_sta;
  28. u8 rem_flag;
  29. u8 num_index;
  30. u8 num_len;
  31. u8 num_buf[8];
  32. u32 tickn;
  33. u32 nego_tickn;
  34. u8 loc_sta;
  35. u8 loc_flag;
  36. };
  37. //------------------------------------------------------------------------
  38. static struct bt_ring_st bt_ring;
  39. //------------------------------------------------------------------------
  40. u8 hfp_notice_ring_number(uint8_t index, char *buf, u32 len)
  41. {
  42. bt_update_redial_number(index, (char *)buf, len);
  43. if(bt_ring.num_len == 0) {
  44. if(len > 16){
  45. len = 16;
  46. }
  47. memset(bt_ring.num_buf, 0x00, sizeof(bt_ring.num_buf));
  48. for(u8 i = 0; i < len; i++){
  49. u8 offset = (bool)(i & 0x1)? 4 : 0;
  50. if (buf[i] >= '0' && buf[i] <= '9') {
  51. bt_ring.num_buf[i/2] |= (buf[i] - 0x30) << offset;
  52. }
  53. }
  54. bt_ring.num_len = len;
  55. TRACE("ring_num: %s\n", buf);
  56. // TRACE_R(bt_ring.num_buf, (len+1)/2);
  57. return 1;
  58. }
  59. return 0;
  60. }
  61. //------------------------------------------------------------------------
  62. //
  63. #if BT_TWS_EN
  64. ALIGNED(128)
  65. void tws_local_get_ring_sta_cb(u8 *buf)
  66. {
  67. struct bt_ring_st *p = (void *)buf;
  68. GLOBAL_INT_DISABLE();
  69. memcpy(buf, &bt_ring, offsetof(struct bt_ring_st, tickn));
  70. p->rem_sta = bt_ring.loc_sta;
  71. p->rem_flag = bt_ring.loc_flag;
  72. GLOBAL_INT_RESTORE();
  73. }
  74. ALIGNED(128)
  75. void tws_remote_set_ring_sta_cb(u8 *buf)
  76. {
  77. struct bt_ring_st *p = (void *)buf;
  78. if(bt_tws_is_slave()) {
  79. GLOBAL_INT_DISABLE();
  80. memcpy(&bt_ring, p, offsetof(struct bt_ring_st, tickn));
  81. GLOBAL_INT_RESTORE();
  82. } else {
  83. bt_ring.rem_sta = p->rem_sta;
  84. bt_ring.rem_flag |= p->rem_flag & (~RING_FLAG_SYNC);
  85. }
  86. }
  87. void ring_tws_disconnect_cb(void)
  88. {
  89. bt_ring.rem_sta = BT_RING_STA_IDLE;
  90. bt_ring.rem_flag = 0;
  91. }
  92. static void ring_res_play(uint8_t res_idx)
  93. {
  94. uint8_t flag = 0;
  95. if(bt_tws_is_connected() && (bt_ring.rem_sta != BT_RING_STA_IDLE)) {
  96. flag = RES_FLAG_TWS;
  97. }
  98. TRACE("==>ring_flag: %x, rem_sta=%x\n", flag, bt_ring.rem_sta);
  99. tws_res_add(res_idx, flag);
  100. }
  101. #else
  102. #define ring_res_play(res_idx) bsp_res_play(res_idx)
  103. #endif
  104. #if BT_HFP_INBAND_RING_EN
  105. bool ring_mp3_msg_work(void)
  106. {
  107. bool ret = false;
  108. if (bt_ring.loc_sta == BT_RING_STA_RES) { //判断是否播放本地铃声
  109. bt_ring.loc_sta = BT_RING_STA_IDLE; //暂停本地铃声播放
  110. ret = true;
  111. }
  112. return ret;
  113. }
  114. #endif
  115. //------------------------------------------------------------------------
  116. #if BT_HFP_RING_NUMBER_EN
  117. AT(.text.func.btring) ALIGNED(128) NO_INLINE
  118. static void sfunc_bt_ring_num_init(void)
  119. {
  120. #if BT_HFP_INBAND_RING_EN
  121. bool sco_flag = (bool)(bt_ring.loc_flag & RING_FLAG_SCO);
  122. #endif
  123. GLOBAL_INT_DISABLE();
  124. bt_ring.loc_flag &= ~RING_FLAG_SCO;
  125. bt_ring.loc_flag |= RING_FLAG_NUM;
  126. bt_ring.loc_sta = BT_RING_STA_NUM;
  127. GLOBAL_INT_RESTORE();
  128. bt_tws_sync_ring_sta();
  129. #if BT_HFP_INBAND_RING_EN
  130. if(sco_flag) {
  131. bt_audio_bypass();
  132. }
  133. #endif
  134. }
  135. AT(.text.func.btring) ALIGNED(128) NO_INLINE
  136. static void sfunc_bt_ring_num_exit(void)
  137. {
  138. #if BT_HFP_INBAND_RING_EN
  139. if((bt_ring.loc_flag & RING_FLAG_RES) == 0 && sco_is_connected()) {
  140. GLOBAL_INT_DISABLE();
  141. bt_ring.loc_flag |= RING_FLAG_SCO;
  142. bt_ring.loc_sta = BT_RING_STA_SCO;
  143. GLOBAL_INT_RESTORE();
  144. } else
  145. #endif
  146. {
  147. GLOBAL_INT_DISABLE();
  148. bt_ring.loc_flag |= RING_FLAG_RES;
  149. bt_ring.loc_sta = BT_RING_STA_RES;
  150. GLOBAL_INT_RESTORE();
  151. }
  152. bt_tws_sync_ring_sta();
  153. #if BT_HFP_INBAND_RING_EN
  154. bool sco_flag = (bool)(bt_ring.loc_flag & RING_FLAG_SCO);
  155. if(sco_flag) {
  156. bt_audio_enable();
  157. }
  158. #endif
  159. }
  160. #endif
  161. AT(.text.func.btring) ALIGNED(128) NO_INLINE
  162. static void sfunc_bt_ring_res_init(void)
  163. {
  164. GLOBAL_INT_DISABLE();
  165. bt_ring.loc_flag &= ~RING_FLAG_SCO;
  166. bt_ring.loc_flag |= RING_FLAG_RES;
  167. bt_ring.loc_sta = BT_RING_STA_RES;
  168. GLOBAL_INT_RESTORE();
  169. //不要立刻报号,避免不接听自动挂断时,hfp状态有时延时1s,导致多报一声ring
  170. bt_ring.tickn = TICK_ADD(TICKN_GET(), 1200);
  171. bt_tws_sync_ring_sta();
  172. }
  173. //协商状态
  174. AT(.text.func.btring)
  175. static void sfunc_bt_ring_nego(void)
  176. {
  177. #if BT_TWS_EN
  178. //前1s等待对方进入ring状态
  179. if(bt_tws_is_connected()
  180. && bt_ring.rem_sta == BT_RING_STA_IDLE
  181. && !TICKN_IS_EXPIRE(bt_ring.nego_tickn)) {
  182. printf("w ");
  183. return;
  184. }
  185. #endif
  186. #if BT_HFP_RING_NUMBER_EN
  187. if(bt_ring.num_len != 0) {
  188. bt_ring.tickn = TICKN_GET();
  189. bt_ring.loc_flag |= RING_FLAG_NUM;
  190. bt_ring.loc_sta = BT_RING_STA_NUM;
  191. bt_tws_sync_ring_sta();
  192. return;
  193. }
  194. #endif
  195. #if BT_HFP_INBAND_RING_EN
  196. if(sco_is_connected()) {
  197. bt_ring.tickn = TICKN_GET();
  198. bt_ring.loc_flag |= RING_FLAG_SCO;
  199. bt_ring.loc_sta = BT_RING_STA_SCO;
  200. bt_tws_sync_ring_sta();
  201. bt_audio_enable();
  202. return;
  203. }
  204. #endif
  205. if(TICKN_IS_EXPIRE(bt_ring.tickn)) {
  206. bt_ring.loc_flag |= RING_FLAG_RES;
  207. bt_ring.loc_sta = BT_RING_STA_RES;
  208. bt_tws_sync_ring_sta();
  209. }
  210. }
  211. //播放本地铃声提示音
  212. AT(.text.func.btring)
  213. static void sfunc_bt_ring_res(void)
  214. {
  215. #if BT_HFP_RING_NUMBER_EN
  216. if((bt_ring.loc_flag & RING_FLAG_NUM) == 0) { //未报过号码
  217. if(bt_ring.num_len != 0) {
  218. sfunc_bt_ring_num_init();
  219. return;
  220. }
  221. }
  222. #endif
  223. if(TICKN_IS_EXPIRE(bt_ring.tickn) && bsp_res_is_empty()) {
  224. #if HLW_UI
  225. bt_ring.tickn = TICK_ADD(TICKN_GET(), 3000);
  226. ring_res_play(TWS_RES_RING);
  227. #else
  228. bt_ring.tickn = TICK_ADD(TICKN_GET(), 1500);
  229. ring_res_play(TWS_RES_RING);
  230. #endif
  231. }
  232. }
  233. #if BT_HFP_INBAND_RING_EN
  234. //播放来电同步提示音, 没有同步铃声手机则播放本地的
  235. AT(.text.func.btring) ALIGNED(256)
  236. static void sfunc_bt_ring_sco(void)
  237. {
  238. #if BT_HFP_RING_NUMBER_EN
  239. if((bt_ring.loc_flag & RING_FLAG_NUM) == 0) { //未报过号码
  240. if(bt_ring.num_len != 0) {
  241. sfunc_bt_ring_num_init();
  242. }
  243. } else
  244. #endif
  245. if((bt_ring.loc_flag & RING_FLAG_SCO) && !sco_is_connected()) {
  246. bt_audio_bypass();
  247. sfunc_bt_ring_res_init();
  248. }
  249. }
  250. #endif
  251. #if BT_HFP_RING_NUMBER_EN
  252. //播放来电报号
  253. AT(.text.func.btring)
  254. static void sfunc_bt_ring_num(void)
  255. {
  256. if(bt_ring.num_index < bt_ring.num_len) {
  257. if(TICKN_IS_EXPIRE(bt_ring.tickn) && bsp_res_is_empty()) {
  258. u8 res_num = bt_ring.num_buf[bt_ring.num_index/2];
  259. res_num >>= (4 * (bt_ring.num_index&0x1));
  260. res_num &= 0xF;
  261. TRACE("ring_num%d: %d\n", bt_ring.num_index, res_num);
  262. if (res_num != 0xf) {
  263. res_num = TWS_RES_NUM_0 + res_num;
  264. bt_ring.tickn = TICK_ADD(TICKN_GET(), 1500);
  265. ring_res_play(res_num); //同步报号
  266. }
  267. bt_ring.num_index++;
  268. bt_tws_sync_ring_sta();
  269. }
  270. } else {
  271. sfunc_bt_ring_num_exit();
  272. }
  273. }
  274. #endif
  275. static void sfunc_bt_ring_master(void)
  276. {
  277. if(bt_ring.rem_sta == BT_RING_STA_NEGO
  278. && (bt_ring.rem_flag & RING_FLAG_SYNC) == 0
  279. && bt_tws_is_connected()) {
  280. bt_ring.rem_flag |= RING_FLAG_SYNC;
  281. bt_tws_sync_ring_sta();
  282. }
  283. switch(bt_ring.loc_sta) {
  284. case BT_RING_STA_NEGO:
  285. sfunc_bt_ring_nego();
  286. break;
  287. case BT_RING_STA_RES:
  288. sfunc_bt_ring_res();
  289. break;
  290. #if BT_HFP_INBAND_RING_EN
  291. case BT_RING_STA_SCO:
  292. sfunc_bt_ring_sco();
  293. break;
  294. #endif
  295. #if BT_HFP_RING_NUMBER_EN
  296. case BT_RING_STA_NUM:
  297. sfunc_bt_ring_num();
  298. break;
  299. #endif
  300. default:
  301. break;
  302. }
  303. }
  304. #if BT_TWS_EN
  305. static void sfunc_bt_ring_slave(void)
  306. {
  307. if(bt_ring.rem_sta != bt_ring.loc_sta) {
  308. switch(bt_ring.rem_sta) {
  309. case BT_RING_STA_NEGO:
  310. bt_ring.loc_sta = BT_RING_STA_NEGO;
  311. break;
  312. case BT_RING_STA_RES:
  313. bt_ring.loc_flag |= RING_FLAG_RES;
  314. bt_ring.loc_sta = BT_RING_STA_RES;
  315. #if BT_HFP_INBAND_RING_EN
  316. if((bt_ring.loc_flag & RING_FLAG_SCO)) {
  317. bt_ring.loc_flag &= ~RING_FLAG_SCO;
  318. bt_audio_bypass();
  319. }
  320. #endif
  321. break;
  322. #if BT_HFP_INBAND_RING_EN
  323. case BT_RING_STA_SCO:
  324. bt_ring.loc_sta = BT_RING_STA_SCO;
  325. if((bt_ring.loc_flag & RING_FLAG_SCO) == 0) {
  326. bt_ring.loc_flag |= RING_FLAG_SCO;
  327. bt_audio_enable();
  328. }
  329. break;
  330. #endif
  331. #if BT_HFP_RING_NUMBER_EN
  332. case BT_RING_STA_NUM:
  333. bt_ring.loc_flag |= RING_FLAG_NUM;
  334. bt_ring.loc_sta = BT_RING_STA_NUM;
  335. #if BT_HFP_INBAND_RING_EN
  336. if((bt_ring.loc_flag & RING_FLAG_SCO)) {
  337. bt_ring.loc_flag &= ~RING_FLAG_SCO;
  338. bt_audio_bypass();
  339. }
  340. #endif
  341. break;
  342. #endif
  343. default:
  344. break;
  345. }
  346. }
  347. }
  348. #endif
  349. //------------------------------------------------------------------------
  350. //
  351. AT(.text.func.btring)
  352. static void sfunc_bt_ring_enter(void)
  353. {
  354. bt_ring.loc_flag = 0;
  355. bt_ring.loc_sta = BT_RING_STA_NEGO;
  356. #if BT_HFP_INBAND_RING_EN || BT_HFP_RING_NUMBER_EN
  357. bt_ring.tickn = TICK_ADD(TICKN_GET(), 3500);
  358. #else
  359. bt_ring.tickn = TICK_ADD(TICKN_GET(), 1000);
  360. #endif
  361. bt_ring.nego_tickn = TICK_ADD(TICKN_GET(), 1000);
  362. bt_tws_sync_ring_sta();
  363. dac_set_anl_offset(0);
  364. bt_audio_bypass();
  365. }
  366. AT(.text.func.btring)
  367. static void sfunc_bt_ring_process(void)
  368. {
  369. #if TRACE_EN
  370. static u8 state = -1;
  371. if(state != bt_ring.loc_sta) {
  372. state = bt_ring.loc_sta;
  373. TRACE("ring_sta: %d(%d), disp=%d,, %d\n", bt_ring.loc_sta, bt_ring.rem_sta, f_bt.disp_status, offsetof(struct bt_ring_st, rem_sta));
  374. }
  375. #endif
  376. func_process();
  377. func_bt_disp_status();
  378. if(bt_ring.loc_sta >= BT_RING_STA_RES) {
  379. if(bsp_res_is_playing()) { //等待当前报号播报完
  380. return;
  381. }
  382. }
  383. if((f_bt.disp_status != BT_STA_INCOMING || func_cb.sta != FUNC_BT)
  384. && bt_ring.loc_sta != BT_RING_STA_IDLE) {
  385. bt_ring.tickn = TICK_ADD(TICKN_GET(), 500);
  386. bt_ring.loc_sta = BT_RING_STA_IDLE;
  387. bt_tws_sync_ring_sta();
  388. } else {
  389. #if BT_TWS_EN
  390. if(bt_tws_is_slave()) {
  391. sfunc_bt_ring_slave();
  392. } else
  393. #endif
  394. {
  395. sfunc_bt_ring_master();
  396. }
  397. }
  398. }
  399. AT(.text.func.btring)
  400. static void sfunc_bt_ring_exit(void)
  401. {
  402. #if BT_HFP_INBAND_RING_EN
  403. //避免挂断时后续等待过程漏一点音乐出来
  404. if((bt_ring.loc_flag & RING_FLAG_SCO)) {
  405. bt_audio_bypass();
  406. }
  407. #endif
  408. //等待对方状态变成IDLE
  409. while(bt_tws_is_connected() && func_cb.sta == FUNC_BT) {
  410. if(TICKN_IS_EXPIRE(bt_ring.tickn)
  411. || bt_ring.rem_sta == BT_RING_STA_IDLE) {
  412. break;
  413. }
  414. bt_thread_check_trigger();
  415. delay_5ms(1);
  416. }
  417. bt_audio_enable();
  418. bt_ring.rem_sta = BT_RING_STA_IDLE;
  419. bt_ring.rem_flag = 0;
  420. bt_ring.num_index = 0;
  421. bt_ring.num_len = 0;
  422. }
  423. AT(.text.func.btring)
  424. void sfunc_bt_ring(void)
  425. {
  426. printf("%s\n", __func__);
  427. sfunc_bt_ring_enter();
  428. while (bt_ring.loc_sta != BT_RING_STA_IDLE && func_cb.sta == FUNC_BT) {
  429. sfunc_bt_ring_process();
  430. sfunc_bt_ring_message(msg_dequeue());
  431. func_bt_display();
  432. #if HLW_UI
  433. hlw_bt_disconnect_process();
  434. #endif
  435. }
  436. sfunc_bt_ring_exit();
  437. }
  438. #endif //FUNC_BT_EN