暂时解决battery电量获取死机问题,battery_service仍然工作不正常
authorSnickerSun <snickersun@163.com>
Tue, 16 Jan 2024 04:28:49 +0000 (12:28 +0800)
committerSnickerSun <snickersun@163.com>
Tue, 16 Jan 2024 04:28:49 +0000 (12:28 +0800)
code/sdk/application/battery/CMakeLists.txt
code/sdk/application/battery/service/battery_service.c
code/sdk/application/battery/service/battery_service.h
code/sdk/application/brandy/brandy_standard/chip_init.c
code/sdk/application/brandy/brandy_standard/service_init.c
code/sdk/application/brandy/brandy_standard/thread_pri_init.c
code/sdk/application/wearable/service/power_manager/src/actions/display_action.c

index b859477..94abd93 100644 (file)
@@ -8,9 +8,9 @@ set(COMPONENT_NAME "batterry_service")
 set(PUBLIC_HEADER
 ${CMAKE_CURRENT_SOURCE_DIR}/hal
 ${CMAKE_CURRENT_SOURCE_DIR}/test
+${CMAKE_CURRENT_SOURCE_DIR}/service
 )
 set(PRIVATE_HEADER
-${CMAKE_CURRENT_SOURCE_DIR}/service
 )
 
 set(SOURCES
index 75cffe2..d60cf2d 100644 (file)
@@ -313,13 +313,13 @@ errcode_t uapi_battery_init(void);
 uint8_t batteryservice_get_voltage(float *voltage)
 {
 
-    if (g_batter_service_initialled == false)
-    {
-        uapi_battery_init();
-        g_batter_service_initialled = true;
-        *voltage = 0;
-        return 0;
-    }
+    // if (g_batter_service_initialled == false)
+    // {
+    //     uapi_battery_init();
+    //     g_batter_service_initialled = true;
+    //     *voltage = 0;
+    //     return 0;
+    // }
     uint8_t percent = 0;
     *voltage = current_battery_info.battery_voltage;
     if (*voltage <= batteryservice_VOLTAGE_MIN)
@@ -332,13 +332,13 @@ uint8_t batteryservice_get_voltage(float *voltage)
 uint8_t batteryservice_get_battery_temp(float *temp)
 {
 
-    if (g_batter_service_initialled == false)
-    {
-        uapi_battery_init();
-        g_batter_service_initialled = true;
-        *temp = 0;
-        return 0;
-    }
+    // if (g_batter_service_initialled == false)
+    // {
+    //     uapi_battery_init();
+    //     g_batter_service_initialled = true;
+    //     *temp = 0;
+    //     return 0;
+    // }
    
     *temp = current_battery_info.battery_ntc_temp;
    
@@ -347,13 +347,13 @@ uint8_t batteryservice_get_battery_temp(float *temp)
 uint8_t batteryservice_get_pcb_temp(float *temp)
 {
 
-    if (g_batter_service_initialled == false)
-    {
-        uapi_battery_init();
-        g_batter_service_initialled = true;
-        *temp = 0;
-        return 0;
-    }
+    // if (g_batter_service_initialled == false)
+    // {
+    //     uapi_battery_init();
+    //     g_batter_service_initialled = true;
+    //     *temp = 0;
+    //     return 0;
+    // }
     *temp = current_battery_info.pcb_ntc_temp;
     return 0;
 }
@@ -362,14 +362,28 @@ uint8_t batteryservice_get_pcb_temp(float *temp)
  * 电池电压读取逻辑:
  *      充电10秒,停止充电1秒,并读取电压。之后再开始充电10秒,再停止充电一秒,读取电压,然后再开始充电。。。。依此类推。
  * **/
+#define USE_APP_TIMER 0
+
+#include "cmsis_os2.h"
+#include "input_app.h"
+#if USE_APP_TIMER
+osTimerId_t g_battery_timer = NULL;
+#else
 timer_handle_t g_battery_timer = {0};
+#endif
 static bool g_bat_timer_is_running = false;
 #define DISABLE_CHARGE_CHECK_MS 1000
 #define ENABLE_CHARGE_TIMEOUT_MS 10000
 bool last_battery_charge_enable_status=false; // true上次刚设置在充电状态,false 上次设置不在充电状态。注意这个是充电IC的充电开关设置,并非真正处于充电状态的标识。
+static unsigned long g_app_queue;
+#define BATTERY_CMD_CHECK_VOLTAGE 0x11
+#define BATTERY_CMD_DISABLE_CHARGE 0x12
 
+#if USE_APP_TIMER
+static void battery_check_timer_callback(void* data);
+#else
 static void battery_check_timer_callback(uint32_t data);
-
+#endif
 static void battery_timer_start_check_released(uint32_t rtc_ms)
 {
     bool start = false;
@@ -379,26 +393,37 @@ static void battery_timer_start_check_released(uint32_t rtc_ms)
     }
 
     if (start) {
+#if USE_APP_TIMER
+        osTimerStop(g_battery_timer);
+        osTimerStart(g_battery_timer, rtc_ms);
+#else
         uapi_rtc_stop(g_battery_timer);
         uapi_rtc_start(g_battery_timer, rtc_ms, battery_check_timer_callback, 0);
+#endif
     }
 }
-
-
+void do_battery_check_msg(int cmd);
+static void battery_check_and_enable_charge(void);
+#if USE_APP_TIMER
+static void battery_check_timer_callback(void * data)
+#else
 static void battery_check_timer_callback(uint32_t data)
+#endif
 {
     unused(data);
 
     g_bat_timer_is_running = false;
     if(last_battery_charge_enable_status == true){
+        // do_battery_check_msg(BATTERY_CMD_DISABLE_CHARGE);
         disable_charge();
+        uapi_tcxo_delay_ms(20);
         battery_timer_start_check_released(DISABLE_CHARGE_CHECK_MS);
         last_battery_charge_enable_status = false;
     }else{
-        batteryservice_get_voltage_by_channel(&current_battery_info.battery_voltage,ADC_CHANNEL_BAT_VOLTAGE);
-        batteryservice_get_voltage_by_channel(&current_battery_info.battery_ntc_temp,ADC_CHANNEL_BAT_TEMP);
-        batteryservice_get_voltage_by_channel(&current_battery_info.pcb_ntc_temp,ADC_CHANNEL_PCB_TEMP);
-        enable_charge();
+        
+        // do_battery_check_msg(BATTERY_CMD_CHECK_VOLTAGE);
+        battery_check_and_enable_charge();
+        uapi_tcxo_delay_ms(20);
         battery_timer_start_check_released(ENABLE_CHARGE_TIMEOUT_MS);
         last_battery_charge_enable_status = true;
     }
@@ -407,27 +432,113 @@ static void battery_check_timer_callback(uint32_t data)
 void uapi_battery_deinit(void)
 {
     /* Stop the time and clear the pin map */
+#if USE_APP_TIMER
+    osTimerStop(g_battery_timer);
+    osTimerDelete(g_battery_timer);
+#else
     uapi_rtc_stop(g_battery_timer);
     uapi_rtc_delete(g_battery_timer);
+#endif
     g_battery_timer = NULL;
 }
 
-errcode_t uapi_battery_init(void)
-{
-    errcode_t ret = 0;
-    ret = uapi_rtc_init();
 
-    ret |= uapi_rtc_adapter(0, RTC_0_IRQN, irq_prio(RTC_0_IRQN)); /* 1: using timer1 */
-    if (ret != ERRCODE_SUCC) {
-        PRINT("uapi_rtc_init FAILED 0x%x", ret);
-        return ret;
+
+void do_battery_check_msg(int cmd)
+{
+    int ret;
+
+    common_notify_mail_t mail = {0};
+    mail.comm.app = cmd;
+    ret = osal_msg_queue_write_copy(g_app_queue, (void *)&mail,
+                                    sizeof(common_notify_mail_t), 0);
+    if (ret != OSAL_SUCCESS) {
+        PRINT("Error battery Check MSG 0x%02X send failed! err=0x%x! \r\n",cmd, ret);
     }
-    ret = uapi_rtc_create(0, &g_battery_timer); /* 1: using timer1 */
+    
+}
+
+static void battery_check_and_enable_charge(void)
+{
+    batteryservice_get_voltage_by_channel(&current_battery_info.battery_voltage,ADC_CHANNEL_BAT_VOLTAGE);
+    uapi_tcxo_delay_ms(20);
+    batteryservice_get_voltage_by_channel(&current_battery_info.battery_ntc_temp,ADC_CHANNEL_BAT_TEMP);
+    uapi_tcxo_delay_ms(20);
+    batteryservice_get_voltage_by_channel(&current_battery_info.pcb_ntc_temp,ADC_CHANNEL_PCB_TEMP);
+    uapi_tcxo_delay_ms(20);
+    enable_charge();
+}
+static void battery_check_task(void const *arg)
+{
+    unused(arg);
+    int32_t ret;
+    common_notify_mail_t mail;
+    uint32_t msgsize = (uint32_t)sizeof(common_notify_mail_t);
+
+#if USE_APP_TIMER
+    g_battery_timer = osTimerNew((osTimerFunc_t)battery_check_timer_callback, osTimerPeriodic, NULL, NULL);
+#else
+    // ret = uapi_rtc_init();
+
+    // ret |= uapi_rtc_adapter(0, RTC_0_IRQN, irq_prio(RTC_0_IRQN)); /* 1: using timer1 */
+    // if (ret != ERRCODE_SUCC) {
+    //     PRINT("uapi_rtc_init FAILED 0x%x", ret);
+    //     return ;
+    // }
+    ret = uapi_rtc_create(RTC_1, &g_battery_timer); /* 1: using timer1 */
     if (ret != ERRCODE_SUCC) {
         PRINT("uapi_rtc_create FAILED 0x%x", ret);
-        return ret;
+        return ;
     }
+
+#endif
+
     //开始timer
-    battery_check_timer_callback(0);
+    battery_timer_start_check_released(ENABLE_CHARGE_TIMEOUT_MS);
+
+    while (1) {
+        ret = osal_msg_queue_read_copy(g_app_queue, (void *)&mail, &msgsize,
+                                       OSAL_MSGQ_WAIT_FOREVER);
+        if (ret != OSAL_SUCCESS) {
+            continue;
+        }
+
+        if (mail.comm.app == BATTERY_CMD_CHECK_VOLTAGE) {
+            battery_check_and_enable_charge();
+            uapi_tcxo_delay_ms(20);
+        }else if (mail.comm.app == BATTERY_CMD_DISABLE_CHARGE) {
+            disable_charge();
+            uapi_tcxo_delay_ms(20);
+        }
+    }
+}
+
+errcode_t uapi_battery_init(void)
+{
+    if (osal_msg_queue_create("battery_queue", APP_BOARD_MSG_COUNT, &g_app_queue,
+                              0, sizeof(common_notify_mail_t)) != ERRCODE_SUCC) {
+        PRINT("[battery][service] app create mail fail\n");
+        return ERRCODE_FAIL;
+    }
+
+
+    osal_task *task_handle = osal_kthread_create((osal_kthread_handler)battery_check_task, NULL,
+                                                 "battery_service", APP_BOARD_TASK_SIZE);
+    if (task_handle == NULL) {
+        osal_msg_queue_is_full(g_app_queue);
+        PRINT("create battery service thread fail!\r\n");
+        return ERRCODE_FAIL;
+    }
+
+    osal_kthread_set_priority(task_handle, APP_BOARD_TASK_PRIO);
     return ERRCODE_SUCC;
 }
+
+void battery_service_resume(void)
+{
+    battery_check_timer_callback(0);
+}
+void battery_service_suspend(void)
+{
+
+}
\ No newline at end of file
index c7d3334..5e64cc8 100644 (file)
 extern "C" {
 #endif /* __cplusplus */
 #endif /* __cplusplus */
+
 #include "stdint.h"
+#include "errcode.h"
+
 uint8_t batteryservice_get_battery_temp(float *temp);
 uint8_t batteryservice_get_pcb_temp(float *temp);
 uint8_t batteryservice_get_voltage(float *voltage);
+errcode_t uapi_battery_init(void);
+void uapi_battery_deinit(void);
+void battery_service_resume(void);
+void battery_service_suspend(void);
 #ifdef __cplusplus
 #if __cplusplus
 }
index 98d6cee..151de5b 100755 (executable)
@@ -144,6 +144,7 @@ void chip_init(void)
 
     uapi_rtc_init();
     uapi_rtc_adapter(RTC_0, RTC_0_IRQN, g_aucIntPri[RTC_0_IRQN]);
+    uapi_rtc_adapter(RTC_1, RTC_1_IRQN, g_aucIntPri[RTC_1_IRQN]);
 
     uapi_dma_init();
     uapi_dma_open();
index ff107e2..f3d2889 100755 (executable)
@@ -70,6 +70,7 @@
 #ifdef CONFIG_OTA_UPDATE_SUPPORT
 #include "upg.h"
 #endif
+
 static void register_at_service(void)
 {
 #ifdef SUPPORT_AT_GRAPHIC
@@ -200,4 +201,5 @@ void service_init(void)
 #endif
 
     register_at_service();
+
 }
index 22cbd3d..df411ad 100755 (executable)
 #include "ohosfwk_startup.h"
 #endif
 
+#ifdef SUPPORT_BATTERY_SERVICE
+#include "battery_service.h"
+#endif
+
 #define EMMC_BASE_ADDR              0x52062000
 #define TASK_PRIORITY_APP           (osPriority_t)(17)
 #define TICK_TEN_MS                 (10U)
@@ -263,6 +267,11 @@ static void thread_main(const void *unused)
     ohos_startup();
 #endif
     uapi_pm_remove_sleep_veto(PM_ID_DEBUG);
+
+
+#ifdef SUPPORT_BATTERY_SERVICE
+    uapi_battery_init();
+#endif
     set_startup_finish_flag();
 }
 
index d23e4c4..a47b18d 100755 (executable)
@@ -20,7 +20,9 @@
 #include "pm_lp_stub.h"
 #include "hal_pmu_ldo.h"
 #include "cmsis_os2.h"
-
+#ifdef SUPPORT_BATTERY_SERVICE
+#include "battery_service.h"
+#endif 
 #ifdef CONFIG_LOW_POWER_TEST
 static bool g_pms_dpu_ready = false;
 #else
@@ -105,6 +107,9 @@ static uint32_t action_display_lcd_on()
             return ERRCODE_FAIL;
         }
     }
+#ifdef SUPPORT_BATTERY_SERVICE
+    battery_service_resume();
+#endif
 #if defined(ENABLE_UIKIT) || defined(ENABLE_LVGL)
     NotifyScreenOn(); // Instruct the uikit to start the display operation.
 #endif
@@ -158,6 +163,10 @@ static uint32_t action_display_lcd_off()
     lcd_set_status(false);
     g_pms_dpu_ready = false;
     display_suspend_power_off();
+
+    #ifdef SUPPORT_BATTERY_SERVICE
+    battery_service_suspend();
+    #endif
     uapi_pm_request_mode(PM_ID_VIDEO, PM_MODE_LP);
     return ERRCODE_SUCC;
 }