mcu_hi3321_watch/tjd/service/service_charger.c
2025-05-26 20:15:20 +08:00

204 lines
6.3 KiB
C

#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; }