中科蓝讯-两个灯独立控制

难点:在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);
            }
        }
    }
}

希望对你有帮助

相关推荐
热爱嵌入式7 小时前
中科蓝讯-在仓内摇晃会开机
中科蓝讯
热爱嵌入式5 个月前
中科蓝讯-鸿蒙音量同步
蓝牙耳机·中科蓝讯
热爱嵌入式5 个月前
中科蓝讯-5656C 非VDDIO给NTC供电
蓝牙耳机·中科蓝讯