难点:在setting里只能设置两盏灯在什么状态下亮灭。哪怕使用led_set_sta也是同时控制两盏灯
一、要求:
1、耳机放入充电仓后,红灯会长亮5秒后熄灭
2、充电仓开盖后,红灯会长亮10秒后熄灭
3、开机状态下,单耳四击,双耳红灯常亮,再四击关闭灯光,并记忆。第一点第二点不受这个影响。
3、蓝灯按UI正常闪烁
二、实现
tips:开了入仓复位,会导致耳机出入仓灯效反应慢(个人觉得开比较好,能清除耳机标志位,除非客户反馈灯反应慢),如果没有开充电复位,就要在bsp_var_init和bsp_bt_tws_switch_for_charge初始化变量
1、硬件蓝灯PB3,红灯PB4
2、在setting正常配置蓝灯

3、初始化红灯
在config配置红灯
cpp
#define IO_INIT() {GPIOBFEN &= ~BIT(4); GPIOBDE |= BIT(4); GPIOBDIR &= ~ BIT(4); GPIOB |= BIT(4);}
#define IO_H() {GPIOB |= BIT(4);}
#define IO_L() {GPIOB &= ~BIT(4);}
写初始化红灯PB4,参考的是霍尔传感器hall_sensor_init
cpp
void IO_init(void)
{
gpio_t *g = &IO_gpio;
bsp_gpio_cfg_init(g, IO_PB4);
if (g->sfr == NULL) {
return;
}
g->type=0;
g->sfr[GPIOxDE] |=BIT(g->num);
g->sfr[GPIOxPU300] &=~BIT(g->num);
g->sfr[GPIOxDIR] |=BIT(g->num);
}
AT(.com_text.led_disp)
void IO_ON(void)
{
gpio_t *g = &IO_gpio;
g->type=0;
g->sfr[GPIOxDE] |=BIT(g->num);
g->sfr[GPIOxPU300] |=BIT(g->num);
g->sfr[GPIOxDIR] |=BIT(g->num);
}
AT(.com_text.led_disp)
void IO_OFF(void)
{
gpio_t *g = &IO_gpio;
g->type=0;
g->sfr[GPIOxDE] |=BIT(g->num);
g->sfr[GPIOxPU300] &=~BIT(g->num);
g->sfr[GPIOxDIR] |=BIT(g->num);
}
在bsp_io_init初始化红灯
cpp
AT(.text.bsp.sys.init)
static void bsp_io_init(void)
{
..................
IO_init();
}
4、先写最简单,充电红灯常亮5s后熄灭
sys_cb1.orange_led_flag初始化就是0,所以=0为关,=1为开

只要在充电,都会5ms跑一次bsp_charge_box_process_do,哪怕满电耳机也会跑一下

5、第二简单的,四击控制红灯一直亮灭,并记忆
能存在flash的标志位

读写标志位的函数

单耳四击,双耳开关红灯

双耳同步操作

耳机常亮橙灯,另外一直从仓拿出来也要同步亮橙灯

如果耳机常亮,就不进入休眠


5、出仓亮10s

自己写灯效函数取缔led_scan

判断是否在充电
////50ms调用周期
AT(.com_text.led_disp)
void xyy_led_scan(void)
{
uint bcnt;
if(CHARGE_INBOX()) //判断是否在充电仓里
{
// 5s关掉充电 橙灯
if(sys_cb1.charge_orange_led_ticks && tick_check_expire(sys_cb1.charge_orange_led_ticks, 6000)){
IO_OFF();
sys_cb1.charge_orange_led_ticks =0;
}
if(!sys_cb1.in_box_flag)
{
sys_cb1.in_box_flag = true;
sys_cb1.out_box_cnt =0;
IO_OFF();
}
}
else
{
if(sys_cb1.in_box_flag)
{
sys_cb1.out_box_cnt ++;
if(sys_cb1.out_box_cnt >= 20){
sys_cb1.out_box_cnt = 0;
sys_cb1.in_box_flag = false; //出仓
sys_cb1.out_box_led_ticks = tick_get();
}
}
}
if(!sys_cb1.in_box_flag ) //出仓了,要么常亮,要么出仓亮10s
{
if(sys_cb1.orange_led_flag){ //为1是开橙灯,出仓一直常亮
IO_ON();
}
else if(sys_cb1.out_box_led_ticks) //出仓10s后熄灭
{
if(tick_check_expire(sys_cb1.out_box_led_ticks, 10000)){
//sys_cb1.out_box_led_ticks = 0; //不清除这个计时,当sys_cb1.orange_led_flag为关时,关闭灯
IO_OFF();
} else{
IO_ON();
}
}
}
//以下就是关于setting里配置蓝灯灯效走的流程(官方代码)
if (sys_led.scan_dis) { //关LED扫描
return;
}
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.period == 0xff) { //只循环一次
if (bcnt && bcnt <= 8) {
led_cb.bled_sta &= ~BIT(bcnt - 1);
led_cb.rled_sta &= ~BIT(bcnt - 1);
}
}
}
}
希望对你有帮助