bsp_music.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655
  1. #include "include.h"
  2. #if HLW_UI
  3. #include "hlw_func.h"
  4. #endif // HLW_UI
  5. #define FS_CRC_SEED 0xffff
  6. uint calc_crc(void *buf, uint len, uint seed);
  7. bool mp3_res_play_kick(u32 addr, u32 len, bool kick);
  8. bool wav_res_play_kick(u32 addr, u32 len, bool kick);
  9. void wav_res_dec_process(void);
  10. bool wav_res_is_play(void);
  11. bool wav_res_stop(void);
  12. void mp3_res_play_exit(void);
  13. #if FUNC_MUSIC_EN
  14. #if BT_BACKSTAGE_EN
  15. const u32 *res_addr[] = {
  16. #if WARNING_FUNC_MUSIC
  17. &RES_BUF_MUSIC_MODE_MP3,
  18. #endif
  19. #if WARNING_USB_SD
  20. &RES_BUF_SDCARD_MODE_MP3,
  21. &RES_BUF_USB_MODE_MP3,
  22. #endif
  23. #if WARNING_FUNC_BT
  24. &RES_BUF_BT_MODE_MP3,
  25. #endif
  26. #if WARNING_FUNC_FMRX
  27. &RES_BUF_FM_MODE_MP3,
  28. #endif
  29. #if WARNING_FUNC_AUX
  30. &RES_BUF_AUX_MODE_MP3,
  31. #endif
  32. };
  33. #endif
  34. //扫描全盘文件
  35. bool pf_scan_music(u8 new_dev)
  36. {
  37. if (new_dev) {
  38. #if USB_SD_UPDATE_EN
  39. func_update(); //尝试升级
  40. #endif // USB_SD_UPDATE_EN
  41. }
  42. #if REC_FAST_PLAY
  43. f_msc.rec_scan = BIT(0);
  44. sys_cb.rec_num = 0;
  45. sys_cb.ftime = 0;
  46. #endif // REC_FAST_PLAY
  47. f_msc.file_total = fs_get_total_files();
  48. if (!f_msc.file_total) {
  49. f_msc.dir_total = 0;
  50. return false;
  51. }
  52. #if REC_FAST_PLAY
  53. f_msc.rec_scan = 0;
  54. #endif // REC_FAST_PLAY
  55. if (new_dev) {
  56. #if MUSIC_PLAYDEV_BOX_EN
  57. gui_box_show_playdev();
  58. #endif // MUSIC_PLAYDEV_BOX_EN
  59. #if WARNING_USB_SD
  60. if (sys_cb.cur_dev <= DEV_SDCARD1) {
  61. mp3_res_play(RES_BUF_SDCARD_MODE_MP3, RES_LEN_SDCARD_MODE_MP3);
  62. } else {
  63. mp3_res_play(RES_BUF_USB_MODE_MP3, RES_LEN_USB_MODE_MP3);
  64. }
  65. #endif // WARNING_USB_SD
  66. }
  67. f_msc.dir_total = fs_get_dirs_count(); //获取文件夹总数
  68. return true;
  69. }
  70. #if MUSIC_PLAYMODE_NUM
  71. //music播放模式切换
  72. void music_playmode_next(void)
  73. {
  74. sys_cb.play_mode++;
  75. if (sys_cb.play_mode >= MUSIC_PLAYMODE_NUM) {
  76. sys_cb.play_mode = NORMAL_MODE;
  77. }
  78. gui_box_show_playmode();
  79. plugin_playmode_warning();
  80. }
  81. #endif // MUSIC_PLAYMODE_NUM
  82. #if MUSIC_BREAKPOINT_EN
  83. void bsp_music_breakpoint_clr(void)
  84. {
  85. f_msc.brkpt.file_ptr = 0;
  86. f_msc.brkpt.frame_count = 0;
  87. param_msc_breakpoint_write();
  88. param_sync();
  89. //printf("%s\n", __func__);
  90. }
  91. void bsp_music_breakpoint_init(void)
  92. {
  93. int clr_flag = 0;
  94. if (f_msc.brkpt_flag) {
  95. f_msc.brkpt_flag = 0;
  96. param_msc_breakpoint_read();
  97. //printf("restore: %d, %d, %04x\n", f_msc.brkpt.file_ptr, f_msc.brkpt.frame_count, f_msc.brkpt.fname_crc);
  98. if (calc_crc(f_msc.fname, 8, FS_CRC_SEED) == f_msc.brkpt.fname_crc) {
  99. music_set_jump(&f_msc.brkpt);
  100. } else {
  101. clr_flag = 1;
  102. }
  103. }
  104. f_msc.brkpt.fname_crc = calc_crc(f_msc.fname, 8, FS_CRC_SEED);
  105. f_msc.brkpt.file_ptr = 0;
  106. f_msc.brkpt.frame_count = 0;
  107. if (clr_flag) {
  108. param_msc_breakpoint_write();
  109. }
  110. }
  111. void bsp_music_breakpoint_save(void)
  112. {
  113. music_get_breakpiont(&f_msc.brkpt);
  114. param_msc_breakpoint_write();
  115. param_sync();
  116. //printf("save: %d, %d, %04x\n", f_msc.brkpt.file_ptr, f_msc.brkpt.frame_count, f_msc.brkpt.fname_crc);
  117. }
  118. #endif // MUSIC_BREAKPOINT_EN
  119. #endif // FUNC_MUSIC_EN
  120. #if WARNING_MP3_EN
  121. void mp3_res_play(u32 addr, u32 len)
  122. {
  123. #if QTEST_EN
  124. if(qtest_get_mode()){
  125. return;
  126. }
  127. #endif
  128. u16 msg;
  129. u8 mute_bak;
  130. // printf("%s: addr: %x, len: %x\n", __func__, addr, len);
  131. if (len == 0) {
  132. return;
  133. }
  134. #if BT_BACKSTAGE_EN
  135. if (func_cb.sta_break != FUNC_NULL) {
  136. for (u32 i = 0; i < sizeof(res_addr) / sizeof(u32); i++) {
  137. if (*res_addr[i] == addr) {
  138. if (func_cb.sta != FUNC_BT) {
  139. func_cb.sta_break = FUNC_NULL;
  140. }
  141. return;
  142. }
  143. }
  144. }
  145. #endif
  146. u8 dac_sta = dac_get_pwr_sta();
  147. func_bt_set_dac(1);
  148. #if SYS_KARAOK_EN
  149. u8 voice_bak = 0, func_sta = func_cb.sta;
  150. if (karaok_get_voice_rm_sta()) {
  151. voice_bak = 1;
  152. karaok_voice_rm_disable();
  153. }
  154. bsp_karaok_exit(AUDIO_PATH_KARAOK);
  155. #endif
  156. mute_bak = sys_cb.mute;
  157. if (sys_cb.mute) {
  158. bsp_loudspeaker_unmute();
  159. }
  160. if(get_music_dec_sta() != MUSIC_STOP) { //避免来电响铃/报号未完成,影响get_music_dec_sta()状态
  161. music_control(MUSIC_MSG_STOP);
  162. }
  163. #if BT_MUSIC_EFFECT_EN
  164. music_effect_alg_suspend(MUSIC_EFFECT_SUSPEND_FOR_RES);
  165. #endif // BT_MUSIC_EFFECT_EN
  166. bsp_change_volume(WARNING_VOLUME);
  167. mp3_res_play_kick(addr, len, true);
  168. while (get_music_dec_sta() != MUSIC_STOP) {
  169. bt_thread_check_trigger();
  170. sys_run_loop();
  171. WDT_CLR();
  172. msg = msg_dequeue();
  173. if (sys_cb.voice_evt_brk_en) {
  174. if (((msg == EVT_SD_INSERT) || (msg == EVT_UDISK_INSERT)) && (func_cb.sta != FUNC_MUSIC)) {
  175. func_message(msg);
  176. break;
  177. }
  178. #if BT_HFP_INBAND_RING_EN
  179. // if (ring_mp3_msg_work()) { //mp3本地铃声事件处理
  180. // func_message(msg);
  181. // break;
  182. // }
  183. #endif
  184. }
  185. #if HLW_UI
  186. hlw_func_poweron_led_handle();
  187. #endif // HLW_UI
  188. #if LINEIN_DETECT_EN
  189. if ((msg == EVT_LINEIN_INSERT) && ((sys_cb.voice_evt_brk_en) || (LINEIN_2_PWRDOWN_EN))) {
  190. func_message(msg);
  191. break;
  192. }
  193. #endif // LINEIN_DETECT_EN
  194. if (msg != NO_MSG) {
  195. #if HLW_UI
  196. //部分事件允许打断提示音
  197. if((msg == EVT_POWEROFF_CMD) || (msg == EVT_CLEAR_PAIRLIST) || (msg == KL_PWR_NEXT)
  198. || (msg == KH_PWR_NEXT) || (msg == KLU_PWR_NEXT)|| (msg == KLH_PLAY_PWR_USER_DEF)
  199. || (msg == EVT_IODM_TEST)||(msg == EVT_LED_OPEN)||(msg == EVT_LED_CLOSE)
  200. || (msg == EVT_PC_INSERT))
  201. {
  202. func_message(msg);
  203. //小牛测试需要直接打断提示音
  204. if((msg == EVT_IODM_TEST)||(func_cb.sta == FUNC_PWROFF)||(msg == EVT_CLEAR_PAIRLIST)||(msg == EVT_POWEROFF_CMD))
  205. {
  206. break;
  207. }
  208. }
  209. else
  210. {
  211. msg_enqueue(msg); //还原未处理的消息
  212. }
  213. #else
  214. msg_enqueue(msg); //还原未处理的消息
  215. #endif // HLW_UI
  216. }
  217. #if HLW_UI
  218. //需要进入充电或者在产测模式可以打断mp3
  219. if((func_cb.sta == FUNC_CHARGE)||(hlw_cb.chance_mode == 1)
  220. ||(func_cb.sta == FUNC_BT_DUT)
  221. #if FUNC_USBDEV_EN
  222. ||(func_cb.sta == FUNC_USBDEV)
  223. #endif // FUNC_USBDEV_EN
  224. ||((func_cb.sta == FUNC_PWROFF)&& (addr != RES_BUF_EN_POWEROFF_MP3))
  225. ||(func_cb.sta == FUNC_BT_IODM))
  226. {
  227. break;
  228. }
  229. #endif // HLW_UI
  230. #if (CHARGE_BOX_TYPE == CBOX_SSW)
  231. if(bt_get_status() >= BT_STA_IDLE) {
  232. charge_box_ssw_process(0);
  233. }
  234. #endif
  235. #if BT_TWS_EN && WARNING_BREAK_EN
  236. if(sys_cb.tws_res_brk) {
  237. sys_cb.tws_res_brk = 0;
  238. break;
  239. }
  240. #endif
  241. }
  242. music_control(MUSIC_MSG_STOP);
  243. #if BT_MUSIC_EFFECT_EN
  244. music_effect_alg_reinit();
  245. music_effect_alg_restart();
  246. #endif // BT_MUSIC_EFFECT_EN
  247. #if HLW_UI
  248. #if FUNC_USBDEV_EN
  249. if(func_cb.sta == FUNC_USBDEV)
  250. {
  251. //bsp_change_volume(VOL_MAX);
  252. ude_set_sys_volume(bsp_dac_get_gain_level(VOL_MAX));
  253. }
  254. else
  255. #endif // FUNC_USBDEV_EN
  256. {
  257. if(sys_cb.incall_flag)
  258. {
  259. bsp_change_volume(sys_cb.hfp_vol);
  260. }
  261. else
  262. {
  263. bsp_change_volume(sys_cb.vol);
  264. }
  265. }
  266. #else
  267. bsp_change_volume(sys_cb.vol);
  268. #endif // HLW_UI
  269. mp3_res_play_exit();
  270. sys_cb.mute = mute_bak;
  271. if (sys_cb.mute) {
  272. bsp_loudspeaker_mute();
  273. }
  274. func_bt_set_dac(dac_sta);
  275. #if SYS_KARAOK_EN
  276. if (voice_bak) {
  277. karaok_voice_rm_enable();
  278. }
  279. bsp_karaok_init(AUDIO_PATH_KARAOK, func_sta);
  280. #endif
  281. }
  282. #else
  283. void mp3_res_play(u32 addr, u32 len) {}
  284. #endif
  285. #if WARNING_SYSVOL_ADJ_EN
  286. void bsp_res_sysvol_adjust(void)
  287. {
  288. #if 0//FUNC_USBDEV_EN
  289. if(func_cb.sta == FUNC_USBDEV)
  290. {
  291. ude_set_sys_volume(bsp_dac_get_gain_level(VOL_MAX-12));
  292. }
  293. else
  294. #endif // FUNC_USBDEV_EN
  295. {
  296. #if HLW_UI
  297. if ((sys_cb.vol > VOL_MAX/4)
  298. #if FUNC_USBDEV_EN
  299. ||(func_cb.sta == FUNC_USBDEV)
  300. #endif
  301. )
  302. {
  303. #else
  304. if (sys_cb.vol == VOL_MAX) {
  305. #endif // HLW_UI
  306. #if BT_MUSIC_EFFECT_DYEQ_EN
  307. if (music_effect_get_state_real(MUSIC_EFFECT_DYEQ)) {
  308. music_dyeq_audio_set_vol_by_vol(WARNING_SYSVOL_ADJ_LEVEL, 0);
  309. return;
  310. }
  311. #endif // BT_MUSIC_EFFECT_DYEQ_EN
  312. #if BT_MUSIC_EFFECT_XDRC_EN
  313. if (music_effect_get_state_real(MUSIC_EFFECT_XDRC)) {
  314. music_xdrc_audio_set_vol_by_vol(WARNING_SYSVOL_ADJ_LEVEL, 0);
  315. return;
  316. }
  317. #endif // BT_MUSIC_EFFECT_XDRC_EN
  318. dac_vol_set(WARNING_SYSVOL_ADJ_LEVEL);
  319. }
  320. }
  321. }
  322. void bsp_res_sysvol_resume(void)
  323. {
  324. #if HLW_UI
  325. #if FUNC_USBDEV_EN
  326. if(func_cb.sta == FUNC_USBDEV)
  327. {
  328. ude_set_sys_volume(bsp_dac_get_gain_level(VOL_MAX));
  329. }
  330. else
  331. #endif // FUNC_USBDEV_EN
  332. {
  333. if(sys_cb.incall_flag)
  334. {
  335. bsp_change_volume(sys_cb.hfp_vol);
  336. }
  337. else
  338. {
  339. bsp_change_volume(sys_cb.vol);
  340. }
  341. }
  342. #else
  343. bsp_change_volume(sys_cb.vol);
  344. #endif // HLW_UI
  345. }
  346. #endif
  347. #if WARNING_WAV_EN
  348. void wav_res_play(u32 addr, u32 len)
  349. {
  350. if (len == 0) {
  351. return;
  352. }
  353. #if ABP_EN
  354. if (abp_is_playing()) {
  355. #if ABP_PLAY_DIS_WAV_EN
  356. return;
  357. #else
  358. #if BT_TWS_EN
  359. abp_stop_fade_out();
  360. #endif
  361. abp_stop();
  362. dac1_aubuf_clr();
  363. #endif // ABP_PLAY_DIS_WAV_EN
  364. }
  365. #endif // ABP_EN
  366. u8 dac_sta = dac_get_pwr_sta();
  367. func_bt_set_dac(1);
  368. #if TINY_TRANSPARENCY_EN
  369. sys_cb.ttp_sta = sys_cb.ttp_start;
  370. bsp_ttp_stop();
  371. #endif
  372. #if WARNING_SYSVOL_ADJ_EN
  373. bsp_res_sysvol_adjust();
  374. #endif
  375. sys_clk_req(INDEX_RES_PLAY, SYS_120M);
  376. wav_res_play_kick(addr, len, 1);
  377. while (wav_res_is_play()) {
  378. bt_thread_check_trigger();
  379. wav_res_dec_process();
  380. WDT_CLR();
  381. #if BT_TWS_EN && WARNING_BREAK_EN
  382. if(sys_cb.tws_res_brk) {
  383. sys_cb.tws_res_brk = 0;
  384. break;
  385. }
  386. #endif
  387. }
  388. wav_res_stop();
  389. sys_clk_free(INDEX_RES_PLAY);
  390. #if WARNING_SYSVOL_ADJ_EN
  391. bsp_res_sysvol_resume();
  392. #endif
  393. #if ABP_EN && !ABP_PLAY_DIS_WAV_EN
  394. if (sys_cb.abp_mode) {
  395. abp_start(sys_cb.abp_mode - 1);
  396. #if BT_TWS_EN
  397. abp_start_fade_in();
  398. #endif
  399. }
  400. #endif
  401. func_bt_set_dac(dac_sta);
  402. #if TINY_TRANSPARENCY_EN
  403. if (sys_cb.ttp_sta) {
  404. bsp_ttp_start();
  405. }
  406. #endif
  407. }
  408. #endif
  409. void piano_res_play(u8 type, void *res)
  410. {
  411. #if ABP_EN
  412. if (abp_is_playing()) {
  413. #if ABP_PLAY_DIS_WAV_EN
  414. return;
  415. #else
  416. abp_stop();
  417. dac1_aubuf_clr();
  418. #endif // ABP_PLAY_DIS_WAV_EN
  419. }
  420. #endif // ABP_EN
  421. u8 dac_sta = dac_get_pwr_sta();
  422. func_bt_set_dac(1);
  423. #if WARNING_SYSVOL_ADJ_EN
  424. bsp_res_sysvol_adjust();
  425. #endif
  426. tone_play_kick(type, res, true);
  427. while (tone_is_playing()) {
  428. bt_thread_check_trigger();
  429. piano_play_process();
  430. }
  431. tone_play_end();
  432. #if WARNING_SYSVOL_ADJ_EN
  433. bsp_res_sysvol_resume();
  434. #endif
  435. func_bt_set_dac(dac_sta);
  436. #if ABP_EN && !ABP_PLAY_DIS_WAV_EN
  437. if (sys_cb.abp_mode) {
  438. bsp_abp_set_mode(sys_cb.abp_mode);
  439. }
  440. #endif
  441. }
  442. #if WARNING_WSBC_EN
  443. void wsbc_res_play(u32 addr, u32 len)
  444. {
  445. if (len == 0) {
  446. return;
  447. }
  448. #if ABP_EN
  449. if (abp_is_playing()) {
  450. #if ABP_PLAY_DIS_WAV_EN
  451. return;
  452. #else
  453. abp_stop();
  454. dac1_aubuf_clr();
  455. #endif // ABP_PLAY_DIS_WAV_EN
  456. }
  457. #endif // ABP_EN
  458. u8 dac_sta = dac_get_pwr_sta();
  459. func_bt_set_dac(1);
  460. #if TINY_TRANSPARENCY_EN
  461. sys_cb.ttp_sta = sys_cb.ttp_start;
  462. bsp_ttp_stop();
  463. #endif
  464. #if WARNING_SYSVOL_ADJ_EN
  465. bsp_res_sysvol_adjust();
  466. #endif
  467. sys_clk_req(INDEX_RES_PLAY, SYS_160M);
  468. warning_play_init((u8*)addr, len, 1);
  469. while (!warning_play_proc()) {
  470. bt_thread_check_trigger();
  471. WDT_CLR();
  472. #if BT_TWS_EN && WARNING_BREAK_EN
  473. if(sys_cb.tws_res_brk) {
  474. sys_cb.tws_res_brk = 0;
  475. break;
  476. }
  477. #endif
  478. }
  479. warning_play_exit();
  480. sys_clk_free(INDEX_RES_PLAY);
  481. #if WARNING_SYSVOL_ADJ_EN
  482. bsp_res_sysvol_resume();
  483. #endif
  484. #if ABP_EN && !ABP_PLAY_DIS_WAV_EN
  485. if (sys_cb.abp_mode) {
  486. abp_start(sys_cb.abp_mode - 1);
  487. }
  488. #endif
  489. func_bt_set_dac(dac_sta);
  490. #if TINY_TRANSPARENCY_EN
  491. if (sys_cb.ttp_sta) {
  492. bsp_ttp_start();
  493. }
  494. #endif
  495. }
  496. #endif
  497. //提示音播报完毕,设置状态
  498. void bsp_res_play_exit_cb(uint8_t res_idx)
  499. {
  500. #if BT_LOW_LATENCY_EN
  501. if (TWS_RES_MUSIC_MODE == res_idx) {
  502. printf("music mode\n");
  503. bt_low_latency_disable();
  504. } else if (TWS_RES_GAME_MODE == res_idx) {
  505. printf("game mode\n");
  506. bt_low_latency_enable();
  507. }
  508. #endif
  509. #if ANC_EN
  510. uint8_t anc_mode = 0;
  511. if (TWS_RES_NR_DISABLE == res_idx) {
  512. anc_mode = 1;
  513. } else if (TWS_RES_ANC == res_idx) {
  514. anc_mode = 2;
  515. } else if (TWS_RES_TRANSPARENCY == res_idx) {
  516. anc_mode = 3;
  517. }
  518. if (anc_mode) {
  519. anc_mode--;
  520. bsp_anc_set_mode(anc_mode);
  521. bsp_param_write(&anc_mode, PARAM_ANC_NR_STA, 1);
  522. bsp_param_sync();
  523. }
  524. #endif
  525. #if ASR_EN
  526. if (res_idx == TWS_RES_ASR_ON) {
  527. sys_cb.asr_enable = 1;
  528. if (!bt_tws_is_slave()) {
  529. bsp_asr_start();
  530. }
  531. } else if (res_idx == TWS_RES_ASR_OFF) {
  532. sys_cb.asr_enable = 0;
  533. bsp_asr_stop();
  534. }
  535. #endif
  536. }
  537. #if !BT_TWS_EN
  538. uint8_t bsp_res_play(uint8_t res_idx)
  539. {
  540. //用于APP某些功能需要重启,和清除配对记录
  541. #if HLW_UI
  542. if(hlw_cb.donot_need_play_flag)
  543. {
  544. return;
  545. }
  546. #endif // HLW_UI
  547. uint8_t res_type = tws_res_get_type(res_idx);
  548. if (res_type != RES_TYPE_INVALID) {
  549. u32 addr, len;
  550. tws_res_get_addr(res_idx, &addr, &len);
  551. if (len != 0) {
  552. if(res_type == RES_TYPE_MP3) {
  553. #if WARNING_MP3_EN
  554. bt_audio_bypass();
  555. mp3_res_play(addr, len);
  556. bsp_res_play_exit_cb(res_idx);
  557. bt_audio_enable();
  558. #endif
  559. #if WARNING_WSBC_EN
  560. } else if(res_type == RES_TYPE_WSBC) {
  561. wsbc_res_play(addr, len);
  562. #endif
  563. #if WARNING_WAV_EN
  564. } else if(res_type == RES_TYPE_WAV) {
  565. wav_res_play(addr, len);
  566. #endif
  567. #if WARNING_PIANO_EN
  568. } else if(res_type == RES_TYPE_PIANO || res_type == RES_TYPE_TONE) {
  569. int type = (res_type == RES_TYPE_TONE)? WARNING_TONE : WARNING_PIANO;
  570. piano_res_play(type, (void *)addr);
  571. #endif
  572. }
  573. }
  574. }
  575. #if HLW_UI
  576. //报完电量后,才允许下一次播报低电
  577. if((res_idx == TWS_RES_BATTERY_HIGH)||(res_idx == TWS_RES_BATTERY_MIDDLE)||(res_idx == TWS_RES_BATTERY_LOW))
  578. {
  579. hlw_cb.poweron_lowbat_flag = false;
  580. }
  581. #endif // HLW_UI
  582. return RES_ERR_INVALID;
  583. }
  584. #endif