#include "service_charger.h" #include "TjdUiMsgCenter.h" #include "input_app.h" #include "charger_api.h" #include "power_display_service.h" #include "sys_config.h" #include "sys_typedef.h" #include "task_service_timer.h" #include "ui_screennotify.h" #include "osal_msgqueue.h" #define ENABLE_PRINT_INFO 0 #if ENABLE_PRINT_INFO #define static_print_info(...) sys_chrg_log_i(__VA_ARGS__) #define static_print_warn(...) sys_chrg_log_w(__VA_ARGS__) #define static_print_error(...) sys_chrg_log_e(__VA_ARGS__) #else #define static_print_info(...) #define static_print_warn(...) #define static_print_error(...) #endif #define CHARGER_SCAN_TIME (10* 1000) static struct charger_class_ops *g_charger_api = NULL; static uint8_t g_battery = 0; static charger_status_t g_charger_status = CHARGER_STATUS_NOT_CHARGING; static bool g_low_power = false; static bool low_power_20_shown = false; static bool low_power_10_shown = false; static bool low_power_5_shown = false; static bool low_power_0_shown = false; static void show_low_power_view(uint8_t battery) { uint8_t bat = battery; TjdUiMsgEventPublish(TJDUI_TOPIC_EVENT_LOW_POWER, &bat, sizeof(bat)); } static void insert_vbus_event(void) { bool show = true; static_print_info("insert_vbus_event"); const power_display_svr_api_t *display_api = power_display_svr_get_api(); display_api->turn_on_screen(); TjdUiMsgEventPublish(TJDUI_TOPIC_EVENT_CHARING, &show, sizeof(show)); g_charger_status = CHARGER_STATUS_CHARGING; } static void unplug_vbus_event(void) { static_print_info("unplug_vbus_event"); bool show = false; TjdUiMsgEventPublish(TJDUI_TOPIC_EVENT_CHARING, &show, sizeof(show)); g_charger_status = CHARGER_STATUS_NOT_CHARGING; } static signed int tjd_service_charger_handle(void *param) { UNUSED(param); if (g_charger_api == NULL) { static_print_error("tjd_service_charger is not open"); return 0; } uint32_t battery = 0; uint32_t ret = g_charger_api->sample_event(&battery); if (ret != 0) { static_print_error("tjd_service_charger_get_battery failed"); } g_battery = battery; uint8_t tmp_battery = tjd_service_charger_get_battery(); /* 电量低于20%且非充电状态 */ if ((tmp_battery <= 20) && (g_charger_status != CHARGER_STATUS_CHARGING)) { if ((tmp_battery == 0)&&(!low_power_0_shown)) { show_low_power_view(0); low_power_0_shown = true; }else if ((tmp_battery <= 5) && (tmp_battery > 0) && (!low_power_5_shown)) { show_low_power_view(5); low_power_5_shown = true; } else if ((tmp_battery <= 10) && (tmp_battery > 5) && (!low_power_10_shown)) { show_low_power_view(10); low_power_10_shown = true; } else if ((tmp_battery <= 20) && (tmp_battery > 10) && (!low_power_20_shown)) { show_low_power_view(20); low_power_20_shown = true; } } /* 电量高于25%后再能再次显示 */ if (tmp_battery >= 25) { low_power_20_shown = false; low_power_10_shown = false; low_power_5_shown = false; low_power_0_shown = false; } return CHARGER_SCAN_TIME; } static void tjd_service_charger_start_send(void) { queue_default_info_t data = {tjd_service_charger_handle, NULL, CHARGER_SCAN_TIME, NULL}; osal_msg_queue_write_copy(tjd_task_service_timer_get_queue_id(), (void *)&data, sizeof(queue_default_info_t), 0); } static void tjd_service_charger_end_send(void) { queue_default_info_t data = {tjd_service_charger_handle, NULL, 0, NULL}; osal_msg_queue_write_copy(tjd_task_service_timer_get_queue_id(), (void *)&data, sizeof(queue_default_info_t), 0); } uint32_t tjd_service_charger_open(void) { g_charger_api = tjd_driver_charger_get_ops(); uint32_t ret = g_charger_api->open(); if (ret != 0) { static_print_error("tjd_service_charger_open failed"); return 1; } tjd_driver_button_register_insert_vbus_cb(insert_vbus_event); tjd_driver_button_register_unplug_vbus_cb(unplug_vbus_event); /* 开启服务时需要读取一次 */ uint32_t battery = 0; recheck_battery: ret = g_charger_api->sample_event(&battery); if (ret != 0) { static_print_error("tjd_service_charger_get_battery failed"); } g_battery = battery; float status_value = g_charger_api->sample_status_event(); // TODO:这个值需要测试确认 if (status_value < 1.0) { g_charger_status = CHARGER_STATUS_NOT_CHARGING; if (g_battery <= 0) { static_print_info("battery is zero, power down"); // tjd_driver_pm_power_down_event(); // uapi_sys_shipmode(0); } } else { g_charger_status = CHARGER_STATUS_CHARGING; if (g_battery <= 0) { static_print_info("battery is low, charging..."); g_low_power = true; // uapi_watchdog_kick(); // msleep(1000); goto recheck_battery; }else if(g_low_power){ // tjd_driver_rtc_save_time(); // tjd_driver_pm_shutdown_event(); // tjd_service_ancillary_device_restart(); } } tjd_service_charger_start_send(); return 0; } void tjd_service_charger_close(void) { tjd_service_charger_end_send(); g_charger_api->close(); g_charger_api = NULL; } uint8_t tjd_service_charger_get_battery(void) { if (g_charger_api == NULL) { static_print_error("tjd_service_charger is not open"); return 0; } static uint8_t last_battery = 0; if (last_battery == 0) { last_battery = g_battery; } if (g_charger_status == CHARGER_STATUS_CHARGING) { /* 充电状态不允许返回的比上次低 */ if (g_battery <= last_battery) { g_battery = last_battery; } } else { /* 非充电状态不允许返回的比上次高 */ if (g_battery >= last_battery) { g_battery = last_battery; }else{ if(g_battery !=0) g_battery = last_battery - 1; } } last_battery = g_battery; static_print_info("last_battery[%d] g_battery[%d]", last_battery, g_battery); return g_battery; } charger_status_t tjd_service_charger_get_charger_status(void) { return g_charger_status; }