hlw_func.c 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781
  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. onemore_app_clear_app_set_handle();
  462. if(hlw_cb.need_reset_flag)
  463. {
  464. func_cb.sta = FUNC_PWROFF;
  465. }
  466. }
  467. //设置是否需要关机
  468. void hlw_func_set_auto_poweroff(u8 enable_auto_poweroff)
  469. {
  470. u8 connect_num = bt_get_connected_num();
  471. TRACE("%s connect num %d auto flag %d\n", __func__, connect_num, hlw_cb.disconnect_auto_off_flag);
  472. if(enable_auto_poweroff)
  473. {
  474. if((!hlw_cb.idle_mode_flag)&&(connect_num == 0)&&(!hlw_cb.disconnect_auto_off_flag))
  475. {
  476. //auto poweroff
  477. hlw_cb.auto_poweroff_enable_flag = true;
  478. }
  479. }
  480. else
  481. {
  482. if((connect_num == 0)&&(!hlw_cb.idle_mode_flag)&&(!hlw_cb.disconnect_auto_off_flag))
  483. {
  484. hlw_cb.auto_poweroff_enable_flag = false;
  485. }
  486. }
  487. }
  488. //万魔的特殊待机模式
  489. void hlw_func_onemore_idle_mode_handle(void)
  490. {
  491. if((bt_get_connected_num() == 0)&&(sys_cb.anc_user_mode != 0))
  492. {
  493. if(bt_get_curr_scan() == 0x03)
  494. {
  495. if(++hlw_cb.idle_mode_count >= IDLE_MODE_COUNT)
  496. {
  497. hlw_cb.idle_mode_flag = true;
  498. hlw_cb.idle_mode_count = 0;
  499. TRACE("enter idle mode\n");
  500. hlw_cb.curr_pairmode_flag = false;
  501. hlw_cb.connecting_not_enter_pair_flag = false;
  502. bt_set_scan(0x02);
  503. led_init();
  504. led_bt_play();
  505. }
  506. }
  507. else
  508. {
  509. hlw_cb.idle_mode_count = 0;
  510. }
  511. }
  512. else
  513. {
  514. hlw_cb.idle_mode_count = 0;
  515. }
  516. }
  517. //poweron led
  518. void hlw_func_poweron_led_handle(void)
  519. {
  520. static u32 map_ticks = 0;
  521. static u8 tick_get_flag = true;
  522. if(tick_get_flag)
  523. {
  524. tick_get_flag = false;
  525. map_ticks = tick_get();
  526. }
  527. if (tick_check_expire(map_ticks, 2000))
  528. {
  529. if(hlw_cb.poweron_led_control_flag)
  530. {
  531. //if(++hlw_cb.poweron_led_control_count >= 2) // 2s once
  532. {
  533. hlw_cb.poweron_led_control_flag = false;
  534. //hlw_cb.poweron_led_control_count = 0;
  535. if(PWRKEY_IS_PRESS())
  536. {
  537. //nothing
  538. }
  539. else
  540. {
  541. led_init();
  542. if (bt_get_connected_num() == 0)
  543. {
  544. if(!bt_nor_get_link_info(NULL)) //no pairlist
  545. {
  546. hlw_cb.curr_pairmode_flag = true;
  547. led_bt_scan();
  548. }
  549. else
  550. {
  551. led_bt_reconnect();
  552. }
  553. }
  554. else
  555. {
  556. led_bt_connected();
  557. }
  558. }
  559. }
  560. }
  561. }
  562. }
  563. //anc led
  564. void hlw_func_anc_led_set(void)
  565. {
  566. hlw_cb.set_ancled_flag = false;
  567. hlw_cb.set_ancled_control_flag = ANC_LED_START;
  568. hlw_cb.set_ancled_control_count = 0;
  569. led_init();
  570. led_bt_call();
  571. }
  572. AT(.com_text.anc_led)
  573. void hlw_func_anc_led_handle(void)
  574. {
  575. if(hlw_cb.set_ancled_control_flag == ANC_LED_END)
  576. {
  577. return;
  578. }
  579. if(hlw_cb.set_ancled_control_flag == ANC_LED_START)
  580. {
  581. if(++hlw_cb.set_ancled_control_count >= ANC_LED_RECOVER_COUNT)
  582. {
  583. hlw_cb.set_ancled_control_count = 0;
  584. hlw_cb.set_ancled_control_flag = ANC_LED_RECOVER;
  585. msg_enqueue(EVT_ANC_LED_RECOVER);
  586. }
  587. }
  588. }
  589. void hlw_func_anc_led_recover_handle(void)
  590. {
  591. 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);
  592. if(hlw_cb.set_ancled_control_flag == ANC_LED_RECOVER)
  593. {
  594. hlw_cb.set_ancled_control_flag = ANC_LED_END;
  595. if((func_cb.sta == FUNC_CHARGE)
  596. #if FUNC_USBDEV_EN
  597. ||(func_cb.sta == FUNC_USBDEV)
  598. #endif // FUNC_USBDEV_EN
  599. )
  600. {
  601. led_init();
  602. }
  603. else
  604. {
  605. if(hlw_cb.curr_connected_flag == false)
  606. {
  607. if(hlw_cb.reconnect_flag)
  608. {
  609. led_bt_reconnect();
  610. }
  611. else if(hlw_cb.curr_pairmode_flag == true)
  612. {
  613. led_bt_scan();
  614. }
  615. else if(hlw_cb.idle_mode_flag)
  616. {
  617. led_bt_play();
  618. }
  619. }
  620. else
  621. {
  622. led_bt_connected();
  623. }
  624. }
  625. }
  626. }
  627. // 电池电量播报,高 中 低
  628. void hlw_func_battery_voice_handle(void)
  629. {
  630. //只有开机的时候报,其他时候不报
  631. TRACE("%s bat_voice_flag %d\n", __func__, hlw_cb.poweron_bat_voice_flag);
  632. if(hlw_cb.poweron_bat_voice_flag)
  633. {
  634. if(hlw_cb.curr_bat_level >= HIGH_BATTERY)
  635. {
  636. bsp_res_play(TWS_RES_BATTERY_HIGH);
  637. }
  638. else if(hlw_cb.curr_bat_level >= MIDDLE_BATTERY)
  639. {
  640. bsp_res_play(TWS_RES_BATTERY_MIDDLE);
  641. }
  642. else if(hlw_cb.curr_bat_level == LOW_BATTERY)
  643. {
  644. bsp_res_play(TWS_RES_BATTERY_LOW);
  645. }
  646. hlw_cb.poweron_bat_voice_flag = false;
  647. }
  648. }
  649. //dut
  650. void hlw_func_enter_dutmode_handle(void)
  651. {
  652. printf("sys_cb.dut_key_cnt %d\n", hlw_cb.dut_key_count);
  653. if(hlw_cb.dut_key_count < 8)
  654. {
  655. hlw_cb.dut_key_count++;
  656. }
  657. if(hlw_cb.dut_key_count >= 8)
  658. {
  659. hlw_cb.dut_key_count = 8;
  660. if((func_cb.sta == FUNC_BT)&&(!bt_is_connected()))
  661. {
  662. func_cb.sta = FUNC_BT_DUT;
  663. }
  664. }
  665. }
  666. //low battery
  667. AT(.com_text.low_bat)
  668. void hlw_func_low_bat_count_handle(void)
  669. {
  670. if((hlw_cb.curr_bat_level == 0)&&(sys_cb.lpwr_warning_cnt < LOWBAT_VOICE_SPACE))
  671. {
  672. sys_cb.lpwr_warning_cnt++;
  673. }
  674. }
  675. void hlw_func_low_bat_voice_handle(void)
  676. {
  677. if(hlw_cb.curr_bat_level == NEED_LOWBAT_LEVEL)
  678. {
  679. //如果不是低电,进入低电时,直接给最大值,耳机立马报低电
  680. if(!sys_cb.lowbat_flag)
  681. {
  682. sys_cb.lpwr_warning_cnt = LOWBAT_VOICE_SPACE;
  683. }
  684. if (sys_cb.lpwr_warning_cnt >= LOWBAT_VOICE_SPACE)
  685. {
  686. lowpower_warning_do();
  687. sys_cb.lpwr_warning_cnt = 0;
  688. }
  689. }
  690. }
  691. #endif