hlw_func.c 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783
  1. #include "include.h"
  2. #include "api.h"
  3. #include "hlw_func.h"
  4. #if HLW_UI
  5. #define HLW_TRACE_EN 1
  6. #if HLW_TRACE_EN
  7. #define TRACE(...) printf(__VA_ARGS__)
  8. #define TRACE_R(...) print_r(__VA_ARGS__)
  9. #else
  10. #define TRACE(...)
  11. #define TRACE_R(...)
  12. #endif
  13. hlw_cb_t hlw_cb AT(.buf.bsp.hlw_cb);
  14. void hlw_func_var_init(void)
  15. {
  16. hlw_cb.reconnect_flag = false;
  17. hlw_cb.reconnect_count = 0;
  18. hlw_cb.poweron_reconnect_fail_flag = false;
  19. hlw_cb.disconnect_flag = 0;
  20. hlw_cb.disconnect_count = 0;
  21. hlw_cb.disconnect_reason = 0;
  22. hlw_cb.sco_kill = 0;
  23. hlw_cb.hfp_kill = 0;
  24. hlw_cb.poweron_first_bat_flag = true;
  25. hlw_cb.curr_bat_level = 10;
  26. hlw_cb.last_bat_level = 10;
  27. memset(hlw_cb.sample_volt, 0x00, SAMPLE_CNT);
  28. memset(hlw_cb.average_volt, 0x00, AVERAGE_CNT);
  29. hlw_cb.charge_poweron_flag = false;
  30. memset(hlw_cb.ntc_volt, 0x00, NTC_AVERAGE_CNT);
  31. hlw_cb.ntc_count = 0;
  32. hlw_func_ntc_var_init();
  33. hlw_cb.charge_qian30s_flag = false;
  34. hlw_cb.charge_qian30s_count = 0;
  35. hlw_cb.usb_con_flag = false;
  36. hlw_cb.charging_flag = false;
  37. hlw_cb.exit_charge_count = 0;
  38. hlw_cb.need_reset_flag = false;
  39. hlw_cb.poweron_led_control_flag = false;
  40. hlw_cb.poweron_led_control_count = 0;
  41. hlw_cb.clear_pairlist_count = 0;
  42. hlw_cb.idle_mode_flag = false;
  43. hlw_cb.idle_mode_count = 0;
  44. hlw_cb.exist_pairlist_flag = 0;
  45. hlw_cb.set_ancled_flag = false;
  46. hlw_cb.set_ancled_control_flag = ANC_LED_END;
  47. hlw_cb.set_ancled_control_count = 0;
  48. hlw_cb.curr_connected_flag = false;
  49. hlw_cb.curr_pairmode_flag = false;
  50. hlw_cb.auto_poweroff_enable_flag = true;
  51. hlw_cb.poweron_pwrkey5s_flag = false;
  52. hlw_cb.eq_init_flag = false;
  53. hlw_cb.eq_spatital_gain_flag = false;
  54. hlw_cb.donot_need_play_flag = false;
  55. hlw_cb.dut_key_count = 0;
  56. hlw_cb.poweron_voice_flag = false;
  57. hlw_cb.uart_spp_data = 0;
  58. memset(hlw_cb.bt_addr, 0x00, 6);
  59. hlw_cb.chance_mode = 0;
  60. memset(hlw_cb.paket_cmd, 0x00, 10);
  61. hlw_cb.poweron_lowbat_flag = true;
  62. hlw_cb.clear_pairlist_flag = false;
  63. hlw_cb.poweron_bat_voice_flag = false;
  64. hlw_cb.poweron_connect_cnt = 0;
  65. memset(hlw_cb.first_phone_addr, 0x00, 6);
  66. memset(hlw_cb.second_phone_addr, 0x00, 6);
  67. hlw_cb.disconnect_auto_off_flag = false;
  68. hlw_cb.connecting_not_enter_pair_flag = false;
  69. hlw_cb.poweron_need_connect_num = 0;
  70. hlw_cb.poweron_need_connect_flag = false;
  71. hlw_cb.poweron_reconfail_cent = 0;
  72. hlw_cb.pair_voice_not_play_flag = false;
  73. }
  74. //battery process
  75. AT(.com_text.battery)
  76. void hlw_func_battery_tran_process(u16 bat_volt)
  77. {
  78. //TRACE("battery_volt %d\n", bat_volt);
  79. if(bat_volt >= 4000)
  80. {
  81. hlw_cb.curr_bat_level = 9;
  82. }
  83. else if(bat_volt >= 3880)
  84. {
  85. hlw_cb.curr_bat_level = 8;
  86. }
  87. else if(bat_volt >= 3780)
  88. {
  89. hlw_cb.curr_bat_level = 7;
  90. }
  91. else if(bat_volt >= 3690)
  92. {
  93. hlw_cb.curr_bat_level = 6;
  94. }
  95. else if(bat_volt >= 3630)
  96. {
  97. hlw_cb.curr_bat_level = 5;
  98. }
  99. else if(bat_volt >= 3580)
  100. {
  101. hlw_cb.curr_bat_level = 4;
  102. }
  103. else if(bat_volt >= 3520)
  104. {
  105. hlw_cb.curr_bat_level = 3;
  106. }
  107. else if(bat_volt >= 3450)
  108. {
  109. hlw_cb.curr_bat_level = 2;
  110. }
  111. else if(bat_volt >= 3380)
  112. {
  113. hlw_cb.curr_bat_level = 1;
  114. }
  115. else
  116. {
  117. hlw_cb.curr_bat_level = 0;
  118. }
  119. //do not rise
  120. if((hlw_cb.last_bat_level != hlw_cb.curr_bat_level)&&(hlw_cb.curr_bat_level < hlw_cb.last_bat_level))
  121. {
  122. hlw_cb.last_bat_level = hlw_cb.curr_bat_level;
  123. msg_enqueue(EVT_ONEMORE_BAT_UPDATE);
  124. //TRACE("hlw_cb.curr_bat_level %d\n", hlw_cb.curr_bat_level);
  125. }
  126. else if((hlw_cb.last_bat_level != hlw_cb.curr_bat_level)&&(hlw_cb.curr_bat_level > hlw_cb.last_bat_level))
  127. {
  128. hlw_cb.curr_bat_level = hlw_cb.last_bat_level;
  129. }
  130. }
  131. AT(.com_text.battery)
  132. void hlw_func_poweron_first_battery_process(void)
  133. {
  134. if(hlw_cb.poweron_first_bat_flag)
  135. {
  136. hlw_cb.poweron_first_bat_flag = false;
  137. hlw_func_battery_tran_process(sys_cb.vbat);
  138. }
  139. }
  140. AT(.com_text.battery)
  141. void hlw_func_battery_process(void)
  142. {
  143. static u8 bat_sample_cnt = 0;
  144. static u8 bat_average_cnt = 0;
  145. u16 temp_sample_volt = 0;
  146. u32 temp_sum_volt = 0;
  147. bool update_bat_flag = false;
  148. u8 i = 0;
  149. u8 j = 0;
  150. hlw_cb.sample_volt[bat_sample_cnt] = sys_cb.vbat;
  151. bat_sample_cnt++;
  152. if(bat_sample_cnt >= SAMPLE_CNT)
  153. {
  154. bat_sample_cnt = 0;
  155. for(i = 0; i < SAMPLE_CNT; i++)
  156. {
  157. for(j = 1; j < SAMPLE_CNT; j++)
  158. {
  159. if(hlw_cb.sample_volt[j-1] > hlw_cb.sample_volt[j])
  160. {
  161. temp_sample_volt = hlw_cb.sample_volt[j-1];
  162. hlw_cb.sample_volt[j-1] = hlw_cb.sample_volt[j];
  163. hlw_cb.sample_volt[j] = temp_sample_volt;
  164. }
  165. }
  166. }
  167. // do not need three lowest batter volt
  168. for(i = MINI_BAT_CNT; i < SAMPLE_CNT; i++)
  169. {
  170. temp_sum_volt = temp_sum_volt + hlw_cb.sample_volt[i];
  171. }
  172. memset(hlw_cb.sample_volt, 0x00, SAMPLE_CNT);
  173. hlw_cb.average_volt[bat_average_cnt] = (u16)(temp_sum_volt/(SAMPLE_CNT - MINI_BAT_CNT));
  174. temp_sum_volt = 0;
  175. bat_average_cnt++;
  176. if(bat_average_cnt >= AVERAGE_CNT)
  177. {
  178. bat_average_cnt = 0;
  179. for(i = 0; i < AVERAGE_CNT; i++)
  180. {
  181. for(j = 1; j < AVERAGE_CNT; j++)
  182. {
  183. if(hlw_cb.average_volt[j-1] > hlw_cb.average_volt[j])
  184. {
  185. temp_sample_volt = hlw_cb.average_volt[j-1];
  186. hlw_cb.average_volt[j-1] = hlw_cb.average_volt[j];
  187. hlw_cb.average_volt[j] = temp_sample_volt;
  188. }
  189. }
  190. }
  191. for(i = AMINI_BAT_CNT; i < AVERAGE_CNT; i++)
  192. {
  193. temp_sum_volt = temp_sum_volt + hlw_cb.average_volt[i];
  194. }
  195. sys_cb.vbat = (u16)(temp_sum_volt/(AVERAGE_CNT - AMINI_BAT_CNT));
  196. update_bat_flag = true;
  197. memset(hlw_cb.average_volt, 0x00, AVERAGE_CNT);
  198. }
  199. if(update_bat_flag)
  200. {
  201. update_bat_flag = false;
  202. hlw_func_battery_tran_process(sys_cb.vbat);
  203. }
  204. }
  205. }
  206. //ntc
  207. AT(.com_text.ntc)
  208. void hlw_func_ntc_var_init(void)
  209. {
  210. hlw_cb.temperature0_flag = 1;
  211. hlw_cb.temperature2_15_flag = 1;
  212. hlw_cb.temperature16_43_flag = 1;
  213. hlw_cb.temperature45_flag = 1;
  214. hlw_cb.control_charge_type = TEMPERATURE_0_TYPE;
  215. }
  216. AT(.com_text.ntc)
  217. void hlw_func_qian30s_count_handle(void)
  218. {
  219. if(hlw_cb.charge_qian30s_flag)
  220. {
  221. if(++hlw_cb.charge_qian30s_count >= QIAN30S_LOW_ELEC)
  222. {
  223. hlw_cb.charge_qian30s_count = 0;
  224. hlw_cb.charge_qian30s_flag = false;
  225. hlw_func_ntc_var_init();
  226. }
  227. }
  228. }
  229. AT(.com_text.ntc)
  230. void hlw_func_ntc_handle_process(void)
  231. {
  232. u8 i = 0;
  233. u16 ntc_average_volt = 0;
  234. static u16 ntc_sumvolt = 0;
  235. u8 update_flag = 0;
  236. hlw_cb.ntc_volt[hlw_cb.ntc_count%NTC_AVERAGE_CNT] = saradc_get_value8(ADCCH_NTC);
  237. hlw_cb.ntc_count++;
  238. if(hlw_cb.ntc_count >= NTC_AVERAGE_CNT)
  239. {
  240. for(i = 0; i < NTC_AVERAGE_CNT; i++)
  241. {
  242. ntc_sumvolt += hlw_cb.ntc_volt[i];
  243. }
  244. ntc_average_volt = ntc_sumvolt/NTC_AVERAGE_CNT;
  245. ntc_sumvolt = 0;
  246. hlw_cb.ntc_count = 0;
  247. }
  248. else
  249. {
  250. return;
  251. }
  252. //TRACE("%s ntc_average_volt %d\n", __func__, ntc_average_volt);
  253. //5000ms 5s 判断一次
  254. if((func_cb.sta == FUNC_CHARGE)
  255. #if FUNC_USBDEV_EN
  256. ||(func_cb.sta == FUNC_USBDEV)
  257. #endif
  258. )
  259. {
  260. if(ntc_average_volt > TEMPERATURE_0)
  261. {
  262. //小于0度, 0度的值是194
  263. if(hlw_cb.temperature0_flag)
  264. {
  265. hlw_cb.temperature0_flag = 0;
  266. hlw_cb.temperature2_15_flag = 1;
  267. hlw_cb.temperature16_43_flag = 1;
  268. hlw_cb.temperature45_flag = 1;
  269. hlw_cb.control_charge_type = TEMPERATURE_0_TYPE;
  270. update_flag = 1;
  271. }
  272. }
  273. else if((ntc_average_volt >= TEMPERATURE_15) && (ntc_average_volt <= TEMPERATURE_2))
  274. {
  275. //2度到15度之间 2度是189 15度是 154
  276. if((hlw_cb.temperature2_15_flag)&&(!hlw_cb.charge_qian30s_flag))
  277. {
  278. hlw_cb.temperature2_15_flag = 0;
  279. hlw_cb.temperature0_flag = 1;
  280. hlw_cb.temperature16_43_flag = 1;
  281. hlw_cb.temperature45_flag = 1;
  282. hlw_cb.control_charge_type = TEMPERATURE_2_15_TYPE;
  283. update_flag = 1;
  284. }
  285. }
  286. else if((ntc_average_volt >= TEMPERATURE_43) && (ntc_average_volt <= TEMPERATURE_16))
  287. {
  288. //16度到43度之间 43度是80 16度是 152
  289. if((hlw_cb.temperature16_43_flag)&&(!hlw_cb.charge_qian30s_flag)&&(!hlw_cb.usb_con_flag))
  290. {
  291. hlw_cb.temperature16_43_flag = 0;
  292. hlw_cb.temperature0_flag = 1;
  293. hlw_cb.temperature2_15_flag = 1;
  294. hlw_cb.temperature45_flag = 1;
  295. hlw_cb.control_charge_type = TEMPERATURE_16_43_TYPE;
  296. update_flag = 1;
  297. }
  298. #if 0
  299. else if((hlw_cb.temperature16_43_flag)&&(hlw_cb.charge_qian30s_flag)&&(!hlw_cb.usb_con_flag))
  300. {
  301. hlw_cb.temperature2_15_flag = 0;
  302. hlw_cb.temperature0_flag = 1;
  303. hlw_cb.temperature16_43_flag = 1;
  304. hlw_cb.temperature45_flag = 1;
  305. hlw_cb.control_charge_type = TEMPERATURE_2_15_TYPE;
  306. update_flag = 1;
  307. }
  308. #endif
  309. #if 0
  310. else if((hlw_cb.temperature16_43_flag)&&(!hlw_cb.charge_qian30s_flag)&&(hlw_cb.usb_con_flag))
  311. {
  312. hlw_cb.temperature2_15_flag = 0;
  313. hlw_cb.temperature0_flag = 1;
  314. hlw_cb.temperature16_43_flag = 1;
  315. hlw_cb.temperature45_flag = 1;
  316. hlw_cb.control_charge_type = TEMPERATURE_2_15_TYPE;
  317. update_flag = 1;
  318. }
  319. #endif
  320. }
  321. else if(ntc_average_volt <= TEMPERATURE_45)
  322. {
  323. //45度 45度是76
  324. if(hlw_cb.temperature45_flag)
  325. {
  326. hlw_cb.temperature45_flag = 0;
  327. hlw_cb.temperature0_flag = 1;
  328. hlw_cb.temperature2_15_flag = 1;
  329. hlw_cb.temperature16_43_flag = 1;
  330. hlw_cb.control_charge_type = TEMPERATURE_45_TYPE;
  331. update_flag = 1;
  332. }
  333. }
  334. }
  335. else
  336. {
  337. if(ntc_average_volt <= TEMPERATURE_60)
  338. {
  339. hlw_cb.control_charge_type = TEMPERATURE_60_TYPE;
  340. //update_flag = 1;
  341. update_flag = 0;
  342. }
  343. else if(ntc_average_volt >= TEMPERATURE_F20)
  344. {
  345. hlw_cb.control_charge_type = TEMPERATURE_F20_TYPE;
  346. //update_flag = 1;
  347. update_flag = 0;
  348. }
  349. }
  350. //TRACE("update_flag %d\n", update_flag);
  351. if(update_flag)
  352. {
  353. update_flag = 0;
  354. msg_enqueue(EVT_NTC_CONTROL);
  355. }
  356. }
  357. void hlw_func_ntc_control_handle(void)
  358. {
  359. TRACE("%s control_charge_type %d\n", __func__, hlw_cb.control_charge_type);
  360. switch(hlw_cb.control_charge_type)
  361. {
  362. case TEMPERATURE_0_TYPE:
  363. case TEMPERATURE_45_TYPE:
  364. //low electric
  365. hlw_func_charge_electric_control_handle(0);
  366. //close charge
  367. hlw_func_charge_enable_handle(0);
  368. break;
  369. case TEMPERATURE_2_15_TYPE:
  370. hlw_func_charge_enable_handle(1);
  371. hlw_func_charge_electric_control_handle(0);
  372. break;
  373. case TEMPERATURE_16_43_TYPE:
  374. hlw_func_charge_enable_handle(1);
  375. hlw_func_charge_electric_control_handle(1);
  376. break;
  377. case TEMPERATURE_60_TYPE:
  378. case TEMPERATURE_F20_TYPE:
  379. sys_cb.pwrdwn_tone_en = 1;
  380. func_cb.sta = FUNC_PWROFF;
  381. break;
  382. }
  383. }
  384. //charge control
  385. void hlw_func_charge_init_handle(void)
  386. {
  387. //enable charge
  388. GPIOBDIR &= ~BIT(0);
  389. GPIOBDE |= BIT(0);
  390. GPIOBCLR = BIT(0);
  391. }
  392. void hlw_func_charge_enable_handle(u8 enable_flag)
  393. {
  394. if(enable_flag)
  395. {
  396. //enable charge
  397. GPIOBCLR = BIT(0);
  398. }
  399. else
  400. {
  401. //disable charge
  402. GPIOBSET = BIT(0);
  403. }
  404. }
  405. void hlw_func_charge_electric_init(void)
  406. {
  407. //init low electric charge
  408. GPIOEDIR &= ~BIT(5);
  409. GPIOEDE |= BIT(5);
  410. GPIOECLR = BIT(5);
  411. }
  412. void hlw_func_charge_electric_control_handle(u8 high_elec_flag)
  413. {
  414. if(high_elec_flag)
  415. {
  416. //high electric
  417. GPIOESET = BIT(5);
  418. }
  419. else
  420. {
  421. //low electric
  422. GPIOECLR = BIT(5);
  423. }
  424. }
  425. u8 hlw_func_exit_charge_handle(void)
  426. {
  427. u8 ret = 0;
  428. if(hlw_cb.charging_flag)
  429. {
  430. if(!CHARGE_DC_IN())
  431. {
  432. printf("hlw_cb.exit_charge_count %d\n", hlw_cb.exit_charge_count);
  433. //if(++hlw_cb.exit_charge_count >= EXIT_CHARGE_COUNT)
  434. //不做计数是为了兼容小米插排,小米插排得查查5V的波形
  435. {
  436. //拔出充电
  437. func_cb.sta = FUNC_PWROFF;
  438. ret = 1;
  439. }
  440. }
  441. }
  442. return ret;
  443. }
  444. //clear pairlist
  445. void hlw_func_clear_pairlist_handle(bool need_reset_flag)
  446. {
  447. bt_nor_delete_link_info();
  448. hlw_cb.need_reset_flag = need_reset_flag;
  449. hlw_cb.donot_need_play_flag = true;
  450. hlw_cb.clear_pairlist_flag = true;
  451. //清除ANC保存的模式
  452. sys_cb.anc_user_mode = 0;
  453. bsp_param_write(&sys_cb.anc_user_mode, PARAM_ANC_NR_STA, 1);
  454. bsp_param_sync();
  455. sys_cb.vol = SYS_INIT_VOLUME;
  456. sys_cb.hfp_vol = SYS_INIT_VOLUME;
  457. param_hfp_vol_write();
  458. param_sys_vol_write();
  459. cm_sync();
  460. //清除APP设置
  461. #if ONEMORE_APP_EN
  462. onemore_app_clear_app_set_handle();
  463. #endif // ONEMORE_APP_EN
  464. if(hlw_cb.need_reset_flag)
  465. {
  466. func_cb.sta = FUNC_PWROFF;
  467. }
  468. }
  469. //设置是否需要关机
  470. void hlw_func_set_auto_poweroff(u8 enable_auto_poweroff)
  471. {
  472. u8 connect_num = bt_get_connected_num();
  473. TRACE("%s connect num %d auto flag %d\n", __func__, connect_num, hlw_cb.disconnect_auto_off_flag);
  474. if(enable_auto_poweroff)
  475. {
  476. if((!hlw_cb.idle_mode_flag)&&(connect_num == 0)&&(!hlw_cb.disconnect_auto_off_flag))
  477. {
  478. //auto poweroff
  479. hlw_cb.auto_poweroff_enable_flag = true;
  480. }
  481. }
  482. else
  483. {
  484. if((connect_num == 0)&&(!hlw_cb.idle_mode_flag)&&(!hlw_cb.disconnect_auto_off_flag))
  485. {
  486. hlw_cb.auto_poweroff_enable_flag = false;
  487. }
  488. }
  489. }
  490. //万魔的特殊待机模式
  491. void hlw_func_onemore_idle_mode_handle(void)
  492. {
  493. if((bt_get_connected_num() == 0)&&(sys_cb.anc_user_mode != 0))
  494. {
  495. if(bt_get_curr_scan() == 0x03)
  496. {
  497. if(++hlw_cb.idle_mode_count >= IDLE_MODE_COUNT)
  498. {
  499. hlw_cb.idle_mode_flag = true;
  500. hlw_cb.idle_mode_count = 0;
  501. TRACE("enter idle mode\n");
  502. hlw_cb.curr_pairmode_flag = false;
  503. hlw_cb.connecting_not_enter_pair_flag = false;
  504. bt_set_scan(0x02);
  505. led_init();
  506. led_bt_play();
  507. }
  508. }
  509. else
  510. {
  511. hlw_cb.idle_mode_count = 0;
  512. }
  513. }
  514. else
  515. {
  516. hlw_cb.idle_mode_count = 0;
  517. }
  518. }
  519. //poweron led
  520. void hlw_func_poweron_led_handle(void)
  521. {
  522. static u32 map_ticks = 0;
  523. static u8 tick_get_flag = true;
  524. if(tick_get_flag)
  525. {
  526. tick_get_flag = false;
  527. map_ticks = tick_get();
  528. }
  529. if (tick_check_expire(map_ticks, 2000))
  530. {
  531. if(hlw_cb.poweron_led_control_flag)
  532. {
  533. //if(++hlw_cb.poweron_led_control_count >= 2) // 2s once
  534. {
  535. hlw_cb.poweron_led_control_flag = false;
  536. //hlw_cb.poweron_led_control_count = 0;
  537. if(PWRKEY_IS_PRESS())
  538. {
  539. //nothing
  540. }
  541. else
  542. {
  543. led_init();
  544. if (bt_get_connected_num() == 0)
  545. {
  546. if(!bt_nor_get_link_info(NULL)) //no pairlist
  547. {
  548. hlw_cb.curr_pairmode_flag = true;
  549. led_bt_scan();
  550. }
  551. else
  552. {
  553. led_bt_reconnect();
  554. }
  555. }
  556. else
  557. {
  558. led_bt_connected();
  559. }
  560. }
  561. }
  562. }
  563. }
  564. }
  565. //anc led
  566. void hlw_func_anc_led_set(void)
  567. {
  568. hlw_cb.set_ancled_flag = false;
  569. hlw_cb.set_ancled_control_flag = ANC_LED_START;
  570. hlw_cb.set_ancled_control_count = 0;
  571. led_init();
  572. led_bt_call();
  573. }
  574. AT(.com_text.anc_led)
  575. void hlw_func_anc_led_handle(void)
  576. {
  577. if(hlw_cb.set_ancled_control_flag == ANC_LED_END)
  578. {
  579. return;
  580. }
  581. if(hlw_cb.set_ancled_control_flag == ANC_LED_START)
  582. {
  583. if(++hlw_cb.set_ancled_control_count >= ANC_LED_RECOVER_COUNT)
  584. {
  585. hlw_cb.set_ancled_control_count = 0;
  586. hlw_cb.set_ancled_control_flag = ANC_LED_RECOVER;
  587. msg_enqueue(EVT_ANC_LED_RECOVER);
  588. }
  589. }
  590. }
  591. void hlw_func_anc_led_recover_handle(void)
  592. {
  593. TRACE("%s ancled_flag %d conflag %d pairflag %d idleflag %d\n", __func__, hlw_cb.set_ancled_control_flag, hlw_cb.curr_connected_flag, hlw_cb.curr_pairmode_flag, hlw_cb.idle_mode_flag);
  594. if(hlw_cb.set_ancled_control_flag == ANC_LED_RECOVER)
  595. {
  596. hlw_cb.set_ancled_control_flag = ANC_LED_END;
  597. if((func_cb.sta == FUNC_CHARGE)
  598. #if FUNC_USBDEV_EN
  599. ||(func_cb.sta == FUNC_USBDEV)
  600. #endif // FUNC_USBDEV_EN
  601. )
  602. {
  603. led_init();
  604. }
  605. else
  606. {
  607. if(hlw_cb.curr_connected_flag == false)
  608. {
  609. if(hlw_cb.reconnect_flag)
  610. {
  611. led_bt_reconnect();
  612. }
  613. else if(hlw_cb.curr_pairmode_flag == true)
  614. {
  615. led_bt_scan();
  616. }
  617. else if(hlw_cb.idle_mode_flag)
  618. {
  619. led_bt_play();
  620. }
  621. }
  622. else
  623. {
  624. led_bt_connected();
  625. }
  626. }
  627. }
  628. }
  629. // 电池电量播报,高 中 低
  630. void hlw_func_battery_voice_handle(void)
  631. {
  632. //只有开机的时候报,其他时候不报
  633. TRACE("%s bat_voice_flag %d\n", __func__, hlw_cb.poweron_bat_voice_flag);
  634. if(hlw_cb.poweron_bat_voice_flag)
  635. {
  636. if(hlw_cb.curr_bat_level >= HIGH_BATTERY)
  637. {
  638. bsp_res_play(TWS_RES_BATTERY_HIGH);
  639. }
  640. else if(hlw_cb.curr_bat_level >= MIDDLE_BATTERY)
  641. {
  642. bsp_res_play(TWS_RES_BATTERY_MIDDLE);
  643. }
  644. else if(hlw_cb.curr_bat_level == LOW_BATTERY)
  645. {
  646. bsp_res_play(TWS_RES_BATTERY_LOW);
  647. }
  648. hlw_cb.poweron_bat_voice_flag = false;
  649. }
  650. }
  651. //dut
  652. void hlw_func_enter_dutmode_handle(void)
  653. {
  654. printf("sys_cb.dut_key_cnt %d\n", hlw_cb.dut_key_count);
  655. if(hlw_cb.dut_key_count < 8)
  656. {
  657. hlw_cb.dut_key_count++;
  658. }
  659. if(hlw_cb.dut_key_count >= 8)
  660. {
  661. hlw_cb.dut_key_count = 8;
  662. if((func_cb.sta == FUNC_BT)&&(!bt_is_connected()))
  663. {
  664. func_cb.sta = FUNC_BT_DUT;
  665. }
  666. }
  667. }
  668. //low battery
  669. AT(.com_text.low_bat)
  670. void hlw_func_low_bat_count_handle(void)
  671. {
  672. if((hlw_cb.curr_bat_level == 0)&&(sys_cb.lpwr_warning_cnt < LOWBAT_VOICE_SPACE))
  673. {
  674. sys_cb.lpwr_warning_cnt++;
  675. }
  676. }
  677. void hlw_func_low_bat_voice_handle(void)
  678. {
  679. if(hlw_cb.curr_bat_level == NEED_LOWBAT_LEVEL)
  680. {
  681. //如果不是低电,进入低电时,直接给最大值,耳机立马报低电
  682. if(!sys_cb.lowbat_flag)
  683. {
  684. sys_cb.lpwr_warning_cnt = LOWBAT_VOICE_SPACE;
  685. }
  686. if (sys_cb.lpwr_warning_cnt >= LOWBAT_VOICE_SPACE)
  687. {
  688. lowpower_warning_do();
  689. sys_cb.lpwr_warning_cnt = 0;
  690. }
  691. }
  692. }
  693. #endif