#include "include.h" #include "api.h" #include "hlw_func.h" #if HLW_UI #define HLW_TRACE_EN 1 #if HLW_TRACE_EN #define TRACE(...) printf(__VA_ARGS__) #define TRACE_R(...) print_r(__VA_ARGS__) #else #define TRACE(...) #define TRACE_R(...) #endif hlw_cb_t hlw_cb AT(.buf.bsp.hlw_cb); void hlw_func_var_init(void) { hlw_cb.reconnect_flag = false; hlw_cb.reconnect_count = 0; hlw_cb.poweron_reconnect_fail_flag = false; hlw_cb.disconnect_flag = 0; hlw_cb.disconnect_count = 0; hlw_cb.disconnect_reason = 0; hlw_cb.sco_kill = 0; hlw_cb.hfp_kill = 0; hlw_cb.poweron_first_bat_flag = true; hlw_cb.curr_bat_level = 10; hlw_cb.last_bat_level = 10; memset(hlw_cb.sample_volt, 0x00, SAMPLE_CNT); memset(hlw_cb.average_volt, 0x00, AVERAGE_CNT); hlw_cb.charge_poweron_flag = false; memset(hlw_cb.ntc_volt, 0x00, NTC_AVERAGE_CNT); hlw_cb.ntc_count = 0; hlw_func_ntc_var_init(); hlw_cb.charge_qian30s_flag = false; hlw_cb.charge_qian30s_count = 0; hlw_cb.usb_con_flag = false; hlw_cb.charging_flag = false; hlw_cb.exit_charge_count = 0; hlw_cb.need_reset_flag = false; hlw_cb.poweron_led_control_flag = false; hlw_cb.poweron_led_control_count = 0; hlw_cb.clear_pairlist_count = 0; hlw_cb.idle_mode_flag = false; hlw_cb.idle_mode_count = 0; hlw_cb.exist_pairlist_flag = 0; hlw_cb.set_ancled_flag = false; hlw_cb.set_ancled_control_flag = ANC_LED_END; hlw_cb.set_ancled_control_count = 0; hlw_cb.curr_connected_flag = false; hlw_cb.curr_pairmode_flag = false; hlw_cb.auto_poweroff_enable_flag = true; hlw_cb.poweron_pwrkey5s_flag = false; hlw_cb.eq_init_flag = false; hlw_cb.eq_spatital_gain_flag = false; hlw_cb.donot_need_play_flag = false; hlw_cb.dut_key_count = 0; hlw_cb.poweron_voice_flag = false; hlw_cb.uart_spp_data = 0; memset(hlw_cb.bt_addr, 0x00, 6); hlw_cb.chance_mode = 0; memset(hlw_cb.paket_cmd, 0x00, 10); hlw_cb.poweron_lowbat_flag = true; hlw_cb.clear_pairlist_flag = false; hlw_cb.poweron_bat_voice_flag = false; hlw_cb.poweron_connect_cnt = 0; memset(hlw_cb.first_phone_addr, 0x00, 6); memset(hlw_cb.second_phone_addr, 0x00, 6); hlw_cb.disconnect_auto_off_flag = false; hlw_cb.connecting_not_enter_pair_flag = false; hlw_cb.poweron_need_connect_num = 0; hlw_cb.poweron_need_connect_flag = false; hlw_cb.poweron_reconfail_cent = 0; hlw_cb.pair_voice_not_play_flag = false; } //battery process AT(.com_text.battery) void hlw_func_battery_tran_process(u16 bat_volt) { //TRACE("battery_volt %d\n", bat_volt); if(bat_volt >= 4000) { hlw_cb.curr_bat_level = 9; } else if(bat_volt >= 3880) { hlw_cb.curr_bat_level = 8; } else if(bat_volt >= 3780) { hlw_cb.curr_bat_level = 7; } else if(bat_volt >= 3690) { hlw_cb.curr_bat_level = 6; } else if(bat_volt >= 3630) { hlw_cb.curr_bat_level = 5; } else if(bat_volt >= 3580) { hlw_cb.curr_bat_level = 4; } else if(bat_volt >= 3520) { hlw_cb.curr_bat_level = 3; } else if(bat_volt >= 3450) { hlw_cb.curr_bat_level = 2; } else if(bat_volt >= 3380) { hlw_cb.curr_bat_level = 1; } else { hlw_cb.curr_bat_level = 0; } //do not rise if((hlw_cb.last_bat_level != hlw_cb.curr_bat_level)&&(hlw_cb.curr_bat_level < hlw_cb.last_bat_level)) { hlw_cb.last_bat_level = hlw_cb.curr_bat_level; msg_enqueue(EVT_ONEMORE_BAT_UPDATE); //TRACE("hlw_cb.curr_bat_level %d\n", hlw_cb.curr_bat_level); } else if((hlw_cb.last_bat_level != hlw_cb.curr_bat_level)&&(hlw_cb.curr_bat_level > hlw_cb.last_bat_level)) { hlw_cb.curr_bat_level = hlw_cb.last_bat_level; } } AT(.com_text.battery) void hlw_func_poweron_first_battery_process(void) { if(hlw_cb.poweron_first_bat_flag) { hlw_cb.poweron_first_bat_flag = false; hlw_func_battery_tran_process(sys_cb.vbat); } } AT(.com_text.battery) void hlw_func_battery_process(void) { static u8 bat_sample_cnt = 0; static u8 bat_average_cnt = 0; u16 temp_sample_volt = 0; u32 temp_sum_volt = 0; bool update_bat_flag = false; u8 i = 0; u8 j = 0; hlw_cb.sample_volt[bat_sample_cnt] = sys_cb.vbat; bat_sample_cnt++; if(bat_sample_cnt >= SAMPLE_CNT) { bat_sample_cnt = 0; for(i = 0; i < SAMPLE_CNT; i++) { for(j = 1; j < SAMPLE_CNT; j++) { if(hlw_cb.sample_volt[j-1] > hlw_cb.sample_volt[j]) { temp_sample_volt = hlw_cb.sample_volt[j-1]; hlw_cb.sample_volt[j-1] = hlw_cb.sample_volt[j]; hlw_cb.sample_volt[j] = temp_sample_volt; } } } // do not need three lowest batter volt for(i = MINI_BAT_CNT; i < SAMPLE_CNT; i++) { temp_sum_volt = temp_sum_volt + hlw_cb.sample_volt[i]; } memset(hlw_cb.sample_volt, 0x00, SAMPLE_CNT); hlw_cb.average_volt[bat_average_cnt] = (u16)(temp_sum_volt/(SAMPLE_CNT - MINI_BAT_CNT)); temp_sum_volt = 0; bat_average_cnt++; if(bat_average_cnt >= AVERAGE_CNT) { bat_average_cnt = 0; for(i = 0; i < AVERAGE_CNT; i++) { for(j = 1; j < AVERAGE_CNT; j++) { if(hlw_cb.average_volt[j-1] > hlw_cb.average_volt[j]) { temp_sample_volt = hlw_cb.average_volt[j-1]; hlw_cb.average_volt[j-1] = hlw_cb.average_volt[j]; hlw_cb.average_volt[j] = temp_sample_volt; } } } for(i = AMINI_BAT_CNT; i < AVERAGE_CNT; i++) { temp_sum_volt = temp_sum_volt + hlw_cb.average_volt[i]; } sys_cb.vbat = (u16)(temp_sum_volt/(AVERAGE_CNT - AMINI_BAT_CNT)); update_bat_flag = true; memset(hlw_cb.average_volt, 0x00, AVERAGE_CNT); } if(update_bat_flag) { update_bat_flag = false; hlw_func_battery_tran_process(sys_cb.vbat); } } } //ntc AT(.com_text.ntc) void hlw_func_ntc_var_init(void) { hlw_cb.temperature0_flag = 1; hlw_cb.temperature2_15_flag = 1; hlw_cb.temperature16_43_flag = 1; hlw_cb.temperature45_flag = 1; hlw_cb.control_charge_type = TEMPERATURE_0_TYPE; } AT(.com_text.ntc) void hlw_func_qian30s_count_handle(void) { if(hlw_cb.charge_qian30s_flag) { if(++hlw_cb.charge_qian30s_count >= QIAN30S_LOW_ELEC) { hlw_cb.charge_qian30s_count = 0; hlw_cb.charge_qian30s_flag = false; hlw_func_ntc_var_init(); } } } AT(.com_text.ntc) void hlw_func_ntc_handle_process(void) { u8 i = 0; u16 ntc_average_volt = 0; static u16 ntc_sumvolt = 0; u8 update_flag = 0; hlw_cb.ntc_volt[hlw_cb.ntc_count%NTC_AVERAGE_CNT] = saradc_get_value8(ADCCH_NTC); hlw_cb.ntc_count++; if(hlw_cb.ntc_count >= NTC_AVERAGE_CNT) { for(i = 0; i < NTC_AVERAGE_CNT; i++) { ntc_sumvolt += hlw_cb.ntc_volt[i]; } ntc_average_volt = ntc_sumvolt/NTC_AVERAGE_CNT; ntc_sumvolt = 0; hlw_cb.ntc_count = 0; } else { return; } //TRACE("%s ntc_average_volt %d\n", __func__, ntc_average_volt); //5000ms 5s 判断一次 if((func_cb.sta == FUNC_CHARGE) #if FUNC_USBDEV_EN ||(func_cb.sta == FUNC_USBDEV) #endif ) { if(ntc_average_volt > TEMPERATURE_0) { //小于0度, 0度的值是194 if(hlw_cb.temperature0_flag) { hlw_cb.temperature0_flag = 0; hlw_cb.temperature2_15_flag = 1; hlw_cb.temperature16_43_flag = 1; hlw_cb.temperature45_flag = 1; hlw_cb.control_charge_type = TEMPERATURE_0_TYPE; update_flag = 1; } } else if((ntc_average_volt >= TEMPERATURE_15) && (ntc_average_volt <= TEMPERATURE_2)) { //2度到15度之间 2度是189 15度是 154 if((hlw_cb.temperature2_15_flag)&&(!hlw_cb.charge_qian30s_flag)) { hlw_cb.temperature2_15_flag = 0; hlw_cb.temperature0_flag = 1; hlw_cb.temperature16_43_flag = 1; hlw_cb.temperature45_flag = 1; hlw_cb.control_charge_type = TEMPERATURE_2_15_TYPE; update_flag = 1; } } else if((ntc_average_volt >= TEMPERATURE_43) && (ntc_average_volt <= TEMPERATURE_16)) { //16度到43度之间 43度是80 16度是 152 if((hlw_cb.temperature16_43_flag)&&(!hlw_cb.charge_qian30s_flag)&&(!hlw_cb.usb_con_flag)) { hlw_cb.temperature16_43_flag = 0; hlw_cb.temperature0_flag = 1; hlw_cb.temperature2_15_flag = 1; hlw_cb.temperature45_flag = 1; hlw_cb.control_charge_type = TEMPERATURE_16_43_TYPE; update_flag = 1; } #if 0 else if((hlw_cb.temperature16_43_flag)&&(hlw_cb.charge_qian30s_flag)&&(!hlw_cb.usb_con_flag)) { hlw_cb.temperature2_15_flag = 0; hlw_cb.temperature0_flag = 1; hlw_cb.temperature16_43_flag = 1; hlw_cb.temperature45_flag = 1; hlw_cb.control_charge_type = TEMPERATURE_2_15_TYPE; update_flag = 1; } #endif #if 0 else if((hlw_cb.temperature16_43_flag)&&(!hlw_cb.charge_qian30s_flag)&&(hlw_cb.usb_con_flag)) { hlw_cb.temperature2_15_flag = 0; hlw_cb.temperature0_flag = 1; hlw_cb.temperature16_43_flag = 1; hlw_cb.temperature45_flag = 1; hlw_cb.control_charge_type = TEMPERATURE_2_15_TYPE; update_flag = 1; } #endif } else if(ntc_average_volt <= TEMPERATURE_45) { //45度 45度是76 if(hlw_cb.temperature45_flag) { hlw_cb.temperature45_flag = 0; hlw_cb.temperature0_flag = 1; hlw_cb.temperature2_15_flag = 1; hlw_cb.temperature16_43_flag = 1; hlw_cb.control_charge_type = TEMPERATURE_45_TYPE; update_flag = 1; } } } else { if(ntc_average_volt <= TEMPERATURE_60) { hlw_cb.control_charge_type = TEMPERATURE_60_TYPE; //update_flag = 1; update_flag = 0; } else if(ntc_average_volt >= TEMPERATURE_F20) { hlw_cb.control_charge_type = TEMPERATURE_F20_TYPE; //update_flag = 1; update_flag = 0; } } //TRACE("update_flag %d\n", update_flag); if(update_flag) { update_flag = 0; msg_enqueue(EVT_NTC_CONTROL); } } void hlw_func_ntc_control_handle(void) { TRACE("%s control_charge_type %d\n", __func__, hlw_cb.control_charge_type); switch(hlw_cb.control_charge_type) { case TEMPERATURE_0_TYPE: case TEMPERATURE_45_TYPE: //low electric hlw_func_charge_electric_control_handle(0); //close charge hlw_func_charge_enable_handle(0); break; case TEMPERATURE_2_15_TYPE: hlw_func_charge_enable_handle(1); hlw_func_charge_electric_control_handle(0); break; case TEMPERATURE_16_43_TYPE: hlw_func_charge_enable_handle(1); hlw_func_charge_electric_control_handle(1); break; case TEMPERATURE_60_TYPE: case TEMPERATURE_F20_TYPE: sys_cb.pwrdwn_tone_en = 1; func_cb.sta = FUNC_PWROFF; break; } } //charge control void hlw_func_charge_init_handle(void) { //enable charge GPIOBDIR &= ~BIT(0); GPIOBDE |= BIT(0); GPIOBCLR = BIT(0); } void hlw_func_charge_enable_handle(u8 enable_flag) { if(enable_flag) { //enable charge GPIOBCLR = BIT(0); } else { //disable charge GPIOBSET = BIT(0); } } void hlw_func_charge_electric_init(void) { //init low electric charge GPIOEDIR &= ~BIT(5); GPIOEDE |= BIT(5); GPIOECLR = BIT(5); } void hlw_func_charge_electric_control_handle(u8 high_elec_flag) { if(high_elec_flag) { //high electric GPIOESET = BIT(5); } else { //low electric GPIOECLR = BIT(5); } } u8 hlw_func_exit_charge_handle(void) { u8 ret = 0; if(hlw_cb.charging_flag) { if(!CHARGE_DC_IN()) { printf("hlw_cb.exit_charge_count %d\n", hlw_cb.exit_charge_count); //if(++hlw_cb.exit_charge_count >= EXIT_CHARGE_COUNT) //不做计数是为了兼容小米插排,小米插排得查查5V的波形 { //拔出充电 func_cb.sta = FUNC_PWROFF; ret = 1; } } } return ret; } //clear pairlist void hlw_func_clear_pairlist_handle(bool need_reset_flag) { bt_nor_delete_link_info(); hlw_cb.need_reset_flag = need_reset_flag; hlw_cb.donot_need_play_flag = true; hlw_cb.clear_pairlist_flag = true; //清除ANC保存的模式 sys_cb.anc_user_mode = 0; bsp_param_write(&sys_cb.anc_user_mode, PARAM_ANC_NR_STA, 1); bsp_param_sync(); sys_cb.vol = SYS_INIT_VOLUME; sys_cb.hfp_vol = SYS_INIT_VOLUME; param_hfp_vol_write(); param_sys_vol_write(); cm_sync(); //清除APP设置 #if ONEMORE_APP_EN onemore_app_clear_app_set_handle(); #endif // ONEMORE_APP_EN if(hlw_cb.need_reset_flag) { func_cb.sta = FUNC_PWROFF; } } //设置是否需要关机 void hlw_func_set_auto_poweroff(u8 enable_auto_poweroff) { u8 connect_num = bt_get_connected_num(); TRACE("%s connect num %d auto flag %d\n", __func__, connect_num, hlw_cb.disconnect_auto_off_flag); if(enable_auto_poweroff) { if((!hlw_cb.idle_mode_flag)&&(connect_num == 0)&&(!hlw_cb.disconnect_auto_off_flag)) { //auto poweroff hlw_cb.auto_poweroff_enable_flag = true; } } else { if((connect_num == 0)&&(!hlw_cb.idle_mode_flag)&&(!hlw_cb.disconnect_auto_off_flag)) { hlw_cb.auto_poweroff_enable_flag = false; } } } //万魔的特殊待机模式 void hlw_func_onemore_idle_mode_handle(void) { if((bt_get_connected_num() == 0)&&(sys_cb.anc_user_mode != 0)) { if(bt_get_curr_scan() == 0x03) { if(++hlw_cb.idle_mode_count >= IDLE_MODE_COUNT) { hlw_cb.idle_mode_flag = true; hlw_cb.idle_mode_count = 0; TRACE("enter idle mode\n"); hlw_cb.curr_pairmode_flag = false; hlw_cb.connecting_not_enter_pair_flag = false; bt_set_scan(0x02); led_init(); led_bt_play(); } } else { hlw_cb.idle_mode_count = 0; } } else { hlw_cb.idle_mode_count = 0; } } //poweron led void hlw_func_poweron_led_handle(void) { static u32 map_ticks = 0; static u8 tick_get_flag = true; if(tick_get_flag) { tick_get_flag = false; map_ticks = tick_get(); } if (tick_check_expire(map_ticks, 2000)) { if(hlw_cb.poweron_led_control_flag) { //if(++hlw_cb.poweron_led_control_count >= 2) // 2s once { hlw_cb.poweron_led_control_flag = false; //hlw_cb.poweron_led_control_count = 0; if(PWRKEY_IS_PRESS()) { //nothing } else { led_init(); if (bt_get_connected_num() == 0) { if(!bt_nor_get_link_info(NULL)) //no pairlist { hlw_cb.curr_pairmode_flag = true; led_bt_scan(); } else { led_bt_reconnect(); } } else { led_bt_connected(); } } } } } } //anc led void hlw_func_anc_led_set(void) { hlw_cb.set_ancled_flag = false; hlw_cb.set_ancled_control_flag = ANC_LED_START; hlw_cb.set_ancled_control_count = 0; led_init(); led_bt_call(); } AT(.com_text.anc_led) void hlw_func_anc_led_handle(void) { if(hlw_cb.set_ancled_control_flag == ANC_LED_END) { return; } if(hlw_cb.set_ancled_control_flag == ANC_LED_START) { if(++hlw_cb.set_ancled_control_count >= ANC_LED_RECOVER_COUNT) { hlw_cb.set_ancled_control_count = 0; hlw_cb.set_ancled_control_flag = ANC_LED_RECOVER; msg_enqueue(EVT_ANC_LED_RECOVER); } } } void hlw_func_anc_led_recover_handle(void) { 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); if(hlw_cb.set_ancled_control_flag == ANC_LED_RECOVER) { hlw_cb.set_ancled_control_flag = ANC_LED_END; if((func_cb.sta == FUNC_CHARGE) #if FUNC_USBDEV_EN ||(func_cb.sta == FUNC_USBDEV) #endif // FUNC_USBDEV_EN ) { led_init(); } else { if(hlw_cb.curr_connected_flag == false) { if(hlw_cb.reconnect_flag) { led_bt_reconnect(); } else if(hlw_cb.curr_pairmode_flag == true) { led_bt_scan(); } else if(hlw_cb.idle_mode_flag) { led_bt_play(); } } else { led_bt_connected(); } } } } // 电池电量播报,高 中 低 void hlw_func_battery_voice_handle(void) { //只有开机的时候报,其他时候不报 TRACE("%s bat_voice_flag %d\n", __func__, hlw_cb.poweron_bat_voice_flag); if(hlw_cb.poweron_bat_voice_flag) { if(hlw_cb.curr_bat_level >= HIGH_BATTERY) { bsp_res_play(TWS_RES_BATTERY_HIGH); } else if(hlw_cb.curr_bat_level >= MIDDLE_BATTERY) { bsp_res_play(TWS_RES_BATTERY_MIDDLE); } else if(hlw_cb.curr_bat_level == LOW_BATTERY) { bsp_res_play(TWS_RES_BATTERY_LOW); } hlw_cb.poweron_bat_voice_flag = false; } } //dut void hlw_func_enter_dutmode_handle(void) { printf("sys_cb.dut_key_cnt %d\n", hlw_cb.dut_key_count); if(hlw_cb.dut_key_count < 8) { hlw_cb.dut_key_count++; } if(hlw_cb.dut_key_count >= 8) { hlw_cb.dut_key_count = 8; if((func_cb.sta == FUNC_BT)&&(!bt_is_connected())) { func_cb.sta = FUNC_BT_DUT; } } } //low battery AT(.com_text.low_bat) void hlw_func_low_bat_count_handle(void) { if((hlw_cb.curr_bat_level == 0)&&(sys_cb.lpwr_warning_cnt < LOWBAT_VOICE_SPACE)) { sys_cb.lpwr_warning_cnt++; } } void hlw_func_low_bat_voice_handle(void) { if(hlw_cb.curr_bat_level == NEED_LOWBAT_LEVEL) { //如果不是低电,进入低电时,直接给最大值,耳机立马报低电 if(!sys_cb.lowbat_flag) { sys_cb.lpwr_warning_cnt = LOWBAT_VOICE_SPACE; } if (sys_cb.lpwr_warning_cnt >= LOWBAT_VOICE_SPACE) { lowpower_warning_do(); sys_cb.lpwr_warning_cnt = 0; } } } #endif