func.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430
  1. #include "include.h"
  2. extern func_cb_t func_cb;
  3. void bsp_bt_tws_switch_for_charge(void);
  4. void lowpower_vbat_process(void);
  5. void bsp_smic_parse_cmd(void);
  6. u8 bsp_bt_tws_charge_delay(void);
  7. void func_qtest_process(void);
  8. void ble_box_process(void);
  9. void soft_timer_run(void);
  10. AT(.text.func.process)
  11. void func_process(void)
  12. {
  13. WDT_CLR();
  14. #if VBAT_DETECT_EN
  15. lowpower_vbat_process();
  16. #endif // VBAT_DETECT_EN
  17. #if VUSB_TBOX_QTEST_EN
  18. func_qtest_process();
  19. qtest_other_usage_process();
  20. #endif
  21. //PWRKEY模拟硬开关关机处理
  22. if ((PWRKEY_2_HW_PWRON) && (sys_cb.pwrdwn_hw_flag)) {
  23. sys_cb.pwrdwn_tone_en = 1;
  24. func_cb.sta = FUNC_PWROFF;
  25. sys_cb.pwrdwn_hw_flag = 0;
  26. }
  27. hall_trigger_to_pwrdwn();
  28. #if USER_NTC
  29. if (sys_cb.ntc_2_pwrdwn_flag) {
  30. sys_cb.pwrdwn_tone_en = 1;
  31. func_cb.sta = FUNC_PWROFF;
  32. sys_cb.ntc_2_pwrdwn_flag = 0;
  33. }
  34. #endif // USER_NTC
  35. #if TRY_TWS_CONN_SCAN_CLOSE
  36. if(tick_check_expire(sys_cb1.tws_conn_ticks, 1500))
  37. {
  38. if(sys_cb1.tws_conn_ticks)
  39. {
  40. sys_cb1.tws_conn_ticks = 0;
  41. bt_tws_set_scan(2);
  42. }
  43. }
  44. #endif // TRY_TWS_CONN_SCAN_CLOSE
  45. }
  46. void func_volume_up(void)
  47. {
  48. if (func_cb.sta == FUNC_BT) {
  49. if (sys_cb.incall_flag) {
  50. bt_call_volume_change(KU_VOL_UP);
  51. } else {
  52. #if BT_HID_VOL_SYNC_EN
  53. if (bsp_bt_hid_vol_set(HID_KEY_VOL_UP)) {
  54. bsp_set_volume(bsp_volume_inc(sys_cb.vol, sys_cb.hfp2sys_mul));
  55. } else
  56. #endif
  57. {
  58. bsp_set_volume(bsp_volume_inc(sys_cb.vol, 1));
  59. }
  60. #if BT_A2DP_STORE_VOL_EN
  61. bt_store_a2dp_volume(sys_cb.vol);
  62. #endif
  63. bsp_bt_vol_change();
  64. #if WARNING_MAX_VOLUME
  65. if (sys_cb.vol == VOL_MAX && !f_bt.ring_sta) {
  66. if (bt_tws_is_sync_voice()) {
  67. delay_5ms(4);
  68. tws_res_play(TWS_RES_MAX_VOL);
  69. } else {
  70. #if TRY_TOUCH_WARNING_DELAY_FIX
  71. sys_warning_play(T_WARNING_MAX_VOL, 2);
  72. #else
  73. sys_warning_play(T_WARNING_MAX_VOL, PIANO_MAX_VOL);
  74. #endif // TRY_TOUCH_WARNING_DELAY_FIX
  75. }
  76. }
  77. #endif
  78. }
  79. } else {
  80. bsp_set_volume(bsp_volume_inc(sys_cb.vol, 1));
  81. if (sys_cb.vol == VOL_MAX) {
  82. sys_warning_play(T_WARNING_MAX_VOL, PIANO_MAX_VOL);
  83. }
  84. }
  85. if (func_cb.set_vol_callback) {
  86. func_cb.set_vol_callback(1);
  87. }
  88. }
  89. void func_volume_down(void)
  90. {
  91. if (func_cb.sta == FUNC_BT) {
  92. if (sys_cb.incall_flag) {
  93. bt_call_volume_change(KU_VOL_DOWN);
  94. } else {
  95. #if BT_HID_VOL_SYNC_EN
  96. if (bsp_bt_hid_vol_set(HID_KEY_VOL_DOWN)) {
  97. bsp_set_volume(bsp_volume_dec(sys_cb.vol, sys_cb.hfp2sys_mul));
  98. } else
  99. #endif
  100. {
  101. bsp_set_volume(bsp_volume_dec(sys_cb.vol, 1));
  102. }
  103. #if BT_A2DP_STORE_VOL_EN
  104. bt_store_a2dp_volume(sys_cb.vol);
  105. #endif
  106. bsp_bt_vol_change();
  107. #if WARNING_MIN_VOLUME
  108. if (sys_cb.vol == 0 && !f_bt.ring_sta) {
  109. minvol_tone_play();
  110. }
  111. #endif
  112. }
  113. } else {
  114. bsp_set_volume(bsp_volume_dec(sys_cb.vol, 1));
  115. if (sys_cb.vol == 0) {
  116. minvol_tone_play();
  117. }
  118. }
  119. if (func_cb.set_vol_callback) {
  120. func_cb.set_vol_callback(0);
  121. }
  122. }
  123. //func common message process
  124. AT(.text.bfunc.msg)
  125. void func_message(u16 msg)
  126. {
  127. switch (msg) {
  128. #if TRY_CHARGEBOX_PWROFF
  129. case EVT_CHARGE_PWROFF_BT_DISCONNECT:
  130. bt_nor_disconnect();
  131. bt_disconnect();
  132. break;
  133. #endif // TRY_CHARGEBOX_PWROFF
  134. #if WAV_KEY_VOICE_QUICK_EN
  135. case K_PLAY_PWR_USER_DEF:
  136. wav_res_play(RES_BUF_TEST_WAV, RES_LEN_TEST_WAV);
  137. sys_cb.tws_res_brk = 0;
  138. break;
  139. #endif
  140. case KL_NEXT_VOL_UP:
  141. case KH_NEXT_VOL_UP:
  142. case KL_PREV_VOL_UP:
  143. case KH_PREV_VOL_UP:
  144. case KU_VOL_UP_NEXT:
  145. case KU_VOL_UP_PREV:
  146. case KU_VOL_UP:
  147. case KL_VOL_UP:
  148. case KH_VOL_UP:
  149. case KU_VOL_UP_DOWN:
  150. func_volume_up();
  151. break;
  152. case KL_PREV_VOL_DOWN:
  153. case KH_PREV_VOL_DOWN:
  154. case KL_NEXT_VOL_DOWN:
  155. case KH_NEXT_VOL_DOWN:
  156. case KU_VOL_DOWN_PREV:
  157. case KU_VOL_DOWN_NEXT:
  158. case KU_VOL_DOWN:
  159. case KL_VOL_DOWN:
  160. case KH_VOL_DOWN:
  161. case KL_VOL_UP_DOWN:
  162. case KH_VOL_UP_DOWN:
  163. func_volume_down();
  164. break;
  165. //耳机入仓关机
  166. case EVT_CHARGE_INBOX:
  167. sys_cb.pwrdwn_tone_en = 0;
  168. sys_cb.inbox_pwrdwn_flag = 1;
  169. bsp_charge_inbox_wakeup_enable();
  170. func_cb.sta = FUNC_PWROFF;
  171. break;
  172. //长按PP/POWER软关机(通过PWROFF_PRESS_TIME控制长按时间)
  173. case KLH_POWER:
  174. case KLH_MODE_PWR:
  175. case KLH_PLAY_PWR_USER_DEF:
  176. if (!xcfg_cb.kl_pwrdwn_dis) {
  177. sys_cb.discon_reason = !xcfg_cb.bt_tswi_kpwr_en; //按键关机是否主从切换
  178. sys_cb.pwrdwn_tone_en = 1;
  179. func_cb.sta = FUNC_PWROFF;
  180. }
  181. break;
  182. #if IRRX_HW_EN
  183. case KU_IR_POWER:
  184. func_cb.sta = FUNC_SLEEPMODE;
  185. break;
  186. #endif
  187. case KU_MODE:
  188. case KU_MODE_PWR:
  189. #if FUNC_AUX_EN || FUNC_SPEAKER_EN || FUNC_MUSIC_EN
  190. func_cb.sta = FUNC_NULL;
  191. #endif
  192. break;
  193. #if EQ_MODE_EN
  194. case KU_EQ:
  195. sys_set_eq();
  196. break;
  197. #endif // EQ_MODE_EN
  198. // case KU_MUTE:
  199. // if (sys_cb.mute) {
  200. // bsp_sys_unmute();
  201. // } else {
  202. // bsp_sys_mute();
  203. // }
  204. // break;
  205. #if LINEIN_DETECT_EN
  206. case EVT_LINEIN_INSERT:
  207. if (device_is_online(DEV_LINEIN)) {
  208. if (xcfg_cb.linein_2_pwrdown_en) {
  209. sys_cb.pwrdwn_tone_en = LINEIN_2_PWRDOWN_TONE_EN;
  210. func_cb.sta = FUNC_PWROFF;
  211. } else {
  212. func_cb.sta = FUNC_AUX;
  213. }
  214. }
  215. break;
  216. #endif // LINEIN_DETECT_EN
  217. case EVT_HFP_SET_VOL:
  218. if(sys_cb.incall_flag & INCALL_FLAG_SCO){
  219. bsp_change_volume(bt_hfp_get_sys_vol(sys_cb.hfp_vol));
  220. }
  221. break;
  222. case EVT_TWS_SET_VOL:
  223. case EVT_A2DP_SET_VOL:
  224. if ((sys_cb.incall_flag & INCALL_FLAG_SCO) == 0) {
  225. printf("a2dp_vol: %d\n", sys_cb.vol);
  226. #if BT_A2DP_STORE_VOL_EN
  227. bt_store_a2dp_volume(sys_cb.vol);
  228. #endif
  229. bsp_change_volume(sys_cb.vol);
  230. // gui_ocx_show_vol();
  231. param_sys_vol_write();
  232. sys_cb.cm_times = 0;
  233. sys_cb.cm_vol_change = 1;
  234. }
  235. break;
  236. case EVT_BT_SCAN_START:
  237. if (bt_get_status() < BT_STA_SCANNING) {
  238. bt_scan_enable();
  239. }
  240. break;
  241. #if EQ_DBG_IN_UART || EQ_DBG_IN_SPP
  242. case EVT_ONLINE_SET_EQ:
  243. eq_parse_cmd();
  244. break;
  245. #endif
  246. #if ANC_EN
  247. case EVT_ONLINE_SET_ANC:
  248. bsp_anc_parse_cmd();
  249. break;
  250. #endif
  251. case EVT_ONLINE_SET_AEC:
  252. bsp_tws_sync_info_eq_aec();
  253. break;
  254. #if LANG_SELECT >= LANG_EN_ZH
  255. case EVT_BT_SET_LANG_ID:
  256. param_lang_write();
  257. break;
  258. #endif
  259. #if EQ_MODE_EN
  260. case EVT_BT_SET_EQ:
  261. music_set_eq_by_num(sys_cb.eq_mode);
  262. break;
  263. #endif
  264. #if SMIC_DBG_EN
  265. case EVT_ONLINE_SET_SMIC:
  266. bsp_smic_parse_cmd();
  267. break;
  268. #endif
  269. #if VUSB_TBOX_QTEST_EN
  270. case EVT_QTEST_PICKUP_PWROFF:
  271. func_cb.sta = FUNC_PWROFF;
  272. break;
  273. #endif
  274. case EVT_BT_TWS_SWITCH:
  275. if (CHARGE_DC_IN()) {
  276. #if BT_TWS_CHARGE_DELAY_EN
  277. if (!bsp_bt_tws_charge_delay()) {
  278. sys_cb.dc_rst_flag = 1;
  279. vusb_delay_rst_dis();
  280. break;
  281. }
  282. #endif
  283. if ((xcfg_cb.bt_enter_charge_rst_en) || (func_cb.sta != FUNC_BT) || (sys_cb.vbat < 3300)) {
  284. vusb_delay_rst_dis();
  285. func_bt_exit();
  286. sw_reset_kick(SW_RST_DC_IN); //直接复位进入充电
  287. } else {
  288. #if BLUETRUM_RECONNECT_RESET_FIX
  289. vusb_delay_rst_dis();
  290. #endif // BLUETRUM_RECONNECT_RESET_FIX
  291. bsp_bt_tws_switch_for_charge();
  292. }
  293. } else {
  294. sys_cb.dc_rst_flag = 1;
  295. vusb_delay_rst_dis();
  296. }
  297. break;
  298. #if BT_TWS_SLAVE_LOSTCONN_WARNING_EN
  299. case EVT_TWS_SLAVE_LOSTCONN:
  300. sys_warning_play(T_WARNING_BT_DISCONNECT, PIANO_BT_DISCONNECT);
  301. break;
  302. #endif
  303. }
  304. //调节音量,3秒后写入flash
  305. if ((sys_cb.cm_vol_change) && (sys_cb.cm_times >= 3)) {
  306. sys_cb.cm_vol_change = 0;
  307. param_sync();
  308. }
  309. }
  310. AT(.text.func)
  311. void func_clear(void)
  312. {
  313. param_sync();
  314. reset_sleep_delay();
  315. dis_auto_pwroff();
  316. #if FUNC_AUX_EN
  317. func_cb.set_vol_callback = NULL;
  318. #endif
  319. AMPLIFIER_SEL_D();
  320. WDT_CLR();
  321. }
  322. AT(.text.func)
  323. void func_exit(void)
  324. {
  325. u8 func_num;
  326. u8 funcs_total = get_funcs_total();
  327. for (func_num = 0; func_num != funcs_total; func_num++) {
  328. if (func_cb.last == func_sort_table[func_num]) {
  329. break;
  330. }
  331. }
  332. func_num++; //切换到下一个任务
  333. if (func_num >= funcs_total) {
  334. func_num = 0;
  335. }
  336. func_cb.sta = func_sort_table[func_num]; //新的任务
  337. }
  338. AT(.text.func)
  339. void func_run(void)
  340. {
  341. printf("%s\n", __func__);
  342. func_bt_chk_off();
  343. while (1) {
  344. func_clear();
  345. switch (func_cb.sta) {
  346. #if FUNC_BT_EN
  347. case FUNC_BT:
  348. func_bt();
  349. break;
  350. #endif
  351. #if BT_DUT_TEST_EN
  352. case FUNC_BT_DUT:
  353. func_bt_dut();
  354. break;
  355. #endif
  356. #if FUNC_BTHID_EN
  357. case FUNC_BTHID:
  358. func_bthid();
  359. break;
  360. #endif // FUNC_BTHID_EN
  361. #if FUNC_AUX_EN
  362. case FUNC_AUX:
  363. func_aux();
  364. break;
  365. #endif // FUNC_AUX_EN
  366. #if FUNC_SPEAKER_EN
  367. case FUNC_SPEAKER:
  368. func_speaker();
  369. break;
  370. #endif // FUNC_SPEAKER_EN
  371. case FUNC_PWROFF:
  372. func_pwroff(sys_cb.pwrdwn_tone_en);
  373. break;
  374. #if BT_FCC_TEST_EN
  375. case FUNC_BT_FCC:
  376. func_bt_fcc();
  377. break;
  378. #endif // BT_FCC_TEST_EN
  379. default:
  380. func_exit();
  381. break;
  382. }
  383. }
  384. }