hlw_func.c 20 KB

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