bleSDK_expansion_board/projects/blezongkong/src/app_bat.c

98 lines
3.4 KiB
C
Raw Normal View History

#include "b6x.h"
#include "drvs.h"
#include "dbg.h"
#include "app_bat.h"
#include "sys_config.h"
#define BAT_Message_interval 1000
tmr_id_t BAT_Message_tmr_id;
BAT_Message_t BAT_Message;
uint16_t Bat_Voltage_Last;
uint16_t Voltage_lag_count;
uint8_t Bat_STA_Last;
// 门锁状态更新标志
bool GRB_Door_lock_updata=0;
// uint8_t bat_str[50]={0,0},bat_str_len=0;
static tmr_tk_t BAT_Message_Handle(tmr_id_t id) {
uint16_t Bat_Voltage = get_bat_voltage() * 10;
if(Bat_Voltage_Last >= Bat_Voltage){
if(Bat_Percent_Low > Bat_Voltage){
BAT_Message.Bat_STA =(BAT_Message.Bat_STA & 0xF3)|Bat_Low_STA;
WS2812_GRBs.GRBs=GRB_RED;
}else if(Bat_Percent_30 > Bat_Voltage){
BAT_Message.Bat_STA =(BAT_Message.Bat_STA & 0x03)|Bat_30_STA;
WS2812_GRBs.GRBs=GRB_RED;
}else if(Bat_Percent_60 > Bat_Voltage){
BAT_Message.Bat_STA =(BAT_Message.Bat_STA & 0x03)|Bat_60_STA;
WS2812_GRBs.GRBs=GRB_BLUE;
}else if(Bat_Percent_100 > Bat_Voltage){
BAT_Message.Bat_STA =(BAT_Message.Bat_STA & 0x03)|Bat_100_STA;
WS2812_GRBs.GRBs=GRB_GREEN;
}else{
BAT_Message.Bat_STA =(BAT_Message.Bat_STA & 0xF3)|Bat_Full_STA;
WS2812_GRBs.GRBs=GRB_GREEN;
}
if(0==(BAT_Message.Bat_STA & Bat_Charge_STA)){
Bat_Voltage_Last =Bat_Voltage;
}else{
if(Bat_Voltage <= (Bat_Voltage_Last - 15)){
BAT_Message.Bat_STA =(BAT_Message.Bat_STA & 0xFC)|Bat_NotCharge_STA;
}
}
Voltage_lag_count=0;
}else {
Voltage_lag_count++;
if((3000/BAT_Message_interval) ==Voltage_lag_count){//3s
Voltage_lag_count=0;
uint16_t in_acc_percent= get_in_acc_percent();
// bat_str_len =sprintf((char *)bat_str, "ACC=%d%%\n", in_acc_percent);
// uart_send(UART1_PORT,bat_str_len,bat_str);
2024-06-02 16:00:42 +08:00
if(in_acc_percent <= 3){ // 油门小于2%时,才判断是否在充电
// uart_putc(UART1_PORT,'A');
2024-06-02 16:00:42 +08:00
if(Bat_Voltage >= (Bat_Voltage_Last + 15)){// 电压
BAT_Message.Bat_STA =(BAT_Message.Bat_STA & 0xFC)|Bat_Charge_STA;
}
}else{
BAT_Message.Bat_STA =(BAT_Message.Bat_STA & 0xFC);
}
Bat_Voltage_Last =Bat_Voltage;
}
}
if((Bat_STA_Last != BAT_Message.Bat_STA) || GRB_Door_lock_updata != Get_Status(OUT_Door_lock)){
GRB_Door_lock_updata=Get_Status(OUT_Door_lock);
// bat_str_len =sprintf((char *)bat_str, "STA=%#X,Vol=%d\n", BAT_Message.Bat_STA ,Bat_Voltage);
// uart_send(UART1_PORT,bat_str_len,bat_str);
Bat_STA_Last =BAT_Message.Bat_STA;
if( Get_Status(OUT_Door_lock)){
if(BAT_Message.Bat_STA & Bat_Charge_STA){
Time_Event_On(GRB_WS2812_Event,NULL);
}else if(BAT_Message.Bat_STA & Bat_Low_STA){
Time_Event_Blink(GRB_WS2812_Event,150,150,0xffff,NULL);
}else{
Time_Event_Blink(GRB_WS2812_Event,500,500,0xffff,NULL);
}
}else{
Time_Event_Off(GRB_WS2812_Event,NULL);
}
}
BAT_Message.Bat_Voltage =Bat_Voltage;
return (BAT_Message_interval / 10);
}
void BAT_Message_Init(void) {
BAT_Message_tmr_id = sftmr_start(10, BAT_Message_Handle);
Bat_Voltage_Last =get_bat_voltage() * 10;
}