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)
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;
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;
}
* 电池电压读取逻辑:
* 充电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;
}
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(¤t_battery_info.battery_voltage,ADC_CHANNEL_BAT_VOLTAGE);
- batteryservice_get_voltage_by_channel(¤t_battery_info.battery_ntc_temp,ADC_CHANNEL_BAT_TEMP);
- batteryservice_get_voltage_by_channel(¤t_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;
}
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(¤t_battery_info.battery_voltage,ADC_CHANNEL_BAT_VOLTAGE);
+ uapi_tcxo_delay_ms(20);
+ batteryservice_get_voltage_by_channel(¤t_battery_info.battery_ntc_temp,ADC_CHANNEL_BAT_TEMP);
+ uapi_tcxo_delay_ms(20);
+ batteryservice_get_voltage_by_channel(¤t_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