291 lines
5.7 KiB
C
291 lines
5.7 KiB
C
#include "include.h"
|
||
#include "bsp_led.h"
|
||
|
||
#if LED_DISP_EN
|
||
|
||
typedef struct {
|
||
u8 rled_sta; //红灯 亮-灭控制
|
||
u8 bled_sta; //蓝灯 亮-灭控制
|
||
u8 unit; //50ms单位 (范围:1~255)
|
||
u8 period; //间隔周期 (范围:0~255)
|
||
|
||
|
||
u16 circle; //一个周期(n-1)
|
||
u16 cnt; //已运行
|
||
u8 wait;
|
||
|
||
//u8 cnt;
|
||
//u8 bcnt;
|
||
//u8 space_cnt;
|
||
|
||
u8 flag;
|
||
} led_cb_t;
|
||
|
||
led_cb_t led_cb AT(.buf.led);
|
||
led_cb_t led_bak AT(.buf.led);
|
||
void bt_set_sync_info(u8 *buf);
|
||
|
||
void led_port_init(gpio_t *g);
|
||
void m_port_2led_scan(gpio_t *g);
|
||
void led_cfg_port_init(gpio_t *g);
|
||
void led_cfg_set_onoff(gpio_t *g, bool onoff);
|
||
|
||
//50ms调用周期
|
||
AT(.com_text.led_disp)
|
||
void led_scan(void)
|
||
{
|
||
uint bcnt;
|
||
|
||
if (led_cb.wait) {
|
||
led_cb.wait--;
|
||
return;
|
||
}
|
||
|
||
//等待间隔时间
|
||
if (led_cb.unit) {
|
||
bcnt = led_cb.cnt / led_cb.unit;
|
||
} else {
|
||
bcnt = led_cb.cnt;
|
||
}
|
||
if (bcnt <= 7) {
|
||
if (led_cb.bled_sta & BIT(bcnt)) {
|
||
bled_set_on();
|
||
} else {
|
||
bled_set_off();
|
||
}
|
||
if (led_cb.rled_sta & BIT(bcnt)) {
|
||
rled_set_on();
|
||
} else {
|
||
rled_set_off();
|
||
}
|
||
}
|
||
if (led_cb.cnt < 0xffff) {
|
||
led_cb.cnt++;
|
||
if (led_cb.cnt > led_cb.circle) {
|
||
led_cb.cnt = 0;
|
||
}
|
||
// if (led_cb.cnt == 0xffff) {
|
||
// //只亮一次
|
||
// led_cb.bled_sta = 0;
|
||
// led_cb.rled_sta = 0;
|
||
// led_cb.period = 0;
|
||
// }
|
||
}
|
||
}
|
||
|
||
//获取LED当前设置的状态
|
||
AT(.com_text.led_disp)
|
||
u8 get_led_sta(u32 type)
|
||
{
|
||
if (type) {
|
||
return led_cb.rled_sta;
|
||
} else {
|
||
return led_cb.bled_sta;
|
||
}
|
||
}
|
||
|
||
AT(.com_text.led_disp)
|
||
void led_cfg_set_on(gpio_t *g)
|
||
{
|
||
led_cfg_set_onoff(g, 1);
|
||
}
|
||
|
||
AT(.com_text.led_disp)
|
||
void led_cfg_set_off(gpio_t *g)
|
||
{
|
||
led_cfg_set_onoff(g, 0);
|
||
}
|
||
|
||
#if (LED_PWR_EN && (RLED_GPIO_SEL == BLED_GPIO_SEL))
|
||
void led2_port_init_m(gpio_t *g, bool ext_res);
|
||
//一个IO口推两个LED灯
|
||
void led2_port_init(gpio_t *g)
|
||
{
|
||
led2_port_init_m(g, 0);
|
||
}
|
||
|
||
//每ms扫描一次
|
||
AT(.com_text.led_disp)
|
||
void port_2led_scan(void)
|
||
{
|
||
if ((!sys_cb.port2led_en)) {
|
||
return;
|
||
}
|
||
m_port_2led_scan(&bled_gpio);
|
||
}
|
||
|
||
//1个IO推两个灯,充电状态下不进sleep,否则充电灯异常。
|
||
AT(.sleep_text.led)
|
||
bool port_2led_is_sleep_en(void)
|
||
{
|
||
if ((sys_cb.port2led_en) && (CHARGE_DC_IN())) {
|
||
return false;
|
||
}
|
||
return true;
|
||
}
|
||
#endif // LED_PWR_EN
|
||
|
||
AT(.com_text.led_disp)
|
||
void bled_set_off(void)
|
||
{
|
||
if (!sys_cb.charge_bled_flag) { //充满状态优先控制
|
||
LED_SET_OFF();
|
||
}
|
||
}
|
||
|
||
AT(.com_text.led_disp)
|
||
void bled_set_on(void)
|
||
{
|
||
if (!sys_cb.charge_bled_flag) { //充满状态优先控制
|
||
LED_SET_ON();
|
||
}
|
||
}
|
||
|
||
AT(.com_text.led_disp)
|
||
void rled_set_off(void)
|
||
{
|
||
if (!sys_cb.charge_sta) { //充电状态优先控制
|
||
LED_PWR_SET_OFF();
|
||
}
|
||
}
|
||
|
||
AT(.com_text.led_disp)
|
||
void rled_set_on(void)
|
||
{
|
||
if (!sys_cb.charge_sta) { //充电状态优先控制
|
||
LED_PWR_SET_ON();
|
||
}
|
||
}
|
||
|
||
AT(.text.led_disp)
|
||
void led_init(void)
|
||
{
|
||
LED_INIT();
|
||
LED_PWR_INIT();
|
||
memset(&led_cb, 0, sizeof(led_cb));
|
||
}
|
||
|
||
//蓝灯灭
|
||
AT(.text.led_disp)
|
||
void led_off(void)
|
||
{
|
||
led_cb.bled_sta = 0x00;
|
||
bled_set_off();
|
||
}
|
||
|
||
//蓝灯亮
|
||
AT(.text.led_disp)
|
||
void led_on(void)
|
||
{
|
||
led_cb.bled_sta = 0xff;
|
||
bled_set_on();
|
||
}
|
||
|
||
AT(.text.led_disp)
|
||
void rled_on(void)
|
||
{
|
||
led_cb.rled_sta = 0xff;
|
||
rled_set_on();
|
||
}
|
||
|
||
AT(.text.led_disp)
|
||
void rled_off(void)
|
||
{
|
||
led_cb.rled_sta = 0x00;
|
||
rled_set_off();
|
||
}
|
||
|
||
//拔出充电红灯灭
|
||
AT(.com_text.led_disp)
|
||
void charge_led_off(void)
|
||
{
|
||
LED_PWR_SET_OFF();
|
||
}
|
||
|
||
//充电红灯亮
|
||
AT(.com_text.led_disp)
|
||
void charge_led_on(void)
|
||
{
|
||
LED_PWR_SET_ON();
|
||
}
|
||
|
||
//充满蓝灯常亮
|
||
void charge_bled_on(void)
|
||
{
|
||
LED_SET_ON();
|
||
}
|
||
|
||
AT(.com_text.led_disp)
|
||
void led_set_sta(u8 rled_sta, u8 bled_sta, u8 unit, u8 period)
|
||
{
|
||
led_cb_t *s = &led_cb;
|
||
|
||
if (s->flag & LED_TOG_LBAT) { //低电优先闪灯
|
||
s = &led_bak;
|
||
}
|
||
|
||
s->wait = 0xff; //避免中断同时操作led_cb
|
||
|
||
rled_set_off();
|
||
bled_set_off();
|
||
|
||
s->rled_sta = rled_sta;
|
||
s->bled_sta = bled_sta;
|
||
s->unit = unit;
|
||
s->period = period;
|
||
|
||
if (s->period == 0xff) {
|
||
s->circle = 0xffff;
|
||
} else {
|
||
s->circle = s->unit * 8 + s->period;
|
||
if (s->circle > 0) {
|
||
s->circle--;
|
||
}
|
||
}
|
||
|
||
s->cnt = 0;
|
||
}
|
||
|
||
AT(.com_text.led_disp)
|
||
void led_cfg_set_sta(led_cfg_t *cfg_cb)
|
||
{
|
||
led_set_sta(cfg_cb->redpat, cfg_cb->bluepat, cfg_cb->unit, cfg_cb->cycle);
|
||
|
||
}
|
||
|
||
#if LED_LOWBAT_EN
|
||
AT(.text.led_disp)
|
||
void led_lowbat(void)
|
||
{
|
||
if (!(led_cb.flag & LED_TOG_LBAT)) {
|
||
memcpy(&led_bak, &led_cb, sizeof(led_cb_t));
|
||
if (xcfg_cb.led_lowbat_config_en) {
|
||
led_cfg_set_sta((led_cfg_t *)&xcfg_cb.led_lowbat);
|
||
} else {
|
||
led_set_sta(0xaa, 0x00, 6, 0); //红灯300ms周期闪烁
|
||
}
|
||
led_cb.flag |= LED_TOG_LBAT;
|
||
}
|
||
}
|
||
|
||
AT(.text.led_disp)
|
||
void led_lowbat_recover(void)
|
||
{
|
||
if (led_cb.flag & LED_TOG_LBAT) {
|
||
memcpy(&led_cb, &led_bak, sizeof(led_cb_t));
|
||
led_cb.flag &= ~LED_TOG_LBAT;
|
||
}
|
||
}
|
||
|
||
void led_lowbat_follow_warning(void)
|
||
{
|
||
if (!(led_cb.flag & LED_TOG_LBAT)) {
|
||
memcpy(&led_bak, &led_cb, sizeof(led_cb_t));
|
||
led_set_sta(0x0a, 0x00, 2, 0xff); //红灯100ms周期闪2次
|
||
led_cb.flag |= LED_TOG_LBAT;
|
||
}
|
||
}
|
||
#endif // LED_LOWBAT_EN
|
||
|
||
#endif
|