LED调试中碰到的优先级问题

来源:互联网 发布:win32系统编程 哈特 编辑:程序博客网 时间:2024/05/22 05:24

      最近调试LED驱动时,基本问题解决了。在一个LED多功能共享上却遇到了拦路虎。对同一个LED灯的控制,要实现以下要求:

(1)在未开机的BOOT LOADER状态,插入充电线闪橙灯,拔掉灭;充满显示绿灯;电压太低开不了机时显示红色灯。

(2)在开机后的操作系统状态,充电闪橙色灯,充满显示绿色灯;电量不够闪红色灯,电量严重不够一直亮红色灯;打开WIFI时显示蓝色灯。其中WIFI的状态优先级要低于电源指示灯,也就是电源指示用的红绿橙色可以抢占WIFI所用的蓝色。

      一开始在灯的设置前加入了判断函数,用if else把很多状况列举出来,后来发现在WIFI工作和插拔充电线时会有很多冲突。比如WIFI工作亮蓝色灯,此时插入充电线显示橙色灯,拔掉充电线要恢复成蓝色灯;又或者在充电时亮橙色灯,此时打开或者关闭WIFI对灯是没有任何影响的。

(3)最后决定采用固定优先级的做法来处理。因为红色、绿色、橙色这三种颜色不可能同时起作用,而且是表示电源状态,可以统一将他们设定为优先级0,WIFI用的蓝色灯设定优先级1。那么在设置灯的入口之前,用下面函数处理下。

typedef struct

{

      UINT8 OnOffState ;

      UINT8 color ;

      UINT8 OffTime ;

}RGBLED_STATE;  //用来存储优先级及要用的参数

 

struct NLED_SETTINGS_INFO  *SelectByPriority(struct NLED_SETTINGS_INFO* p)//p是标准的NLED设置参数,待处理
{
      int priority;
      int  cnt = 0;
 
      if((p->MetaCycleOn>WF43_BLUE_LED)||(p->MetaCycleOn<WF43_GREEN_LED))
            return NULL;                                               //判断参数是否在正确范围内
      if(p->MetaCycleOn == WF43_BLUE_LED)
            priority = 1;                                                 //设定蓝色灯优先级
      else
            priority = 0;                                                 //设定其它色灯优先级
  
      static RGBLED_STATE State[2]={{0,0,0},{0,0,0}};         //初始化静态数组
      State[priority].OnOffState = p->OffOnBlink;                     //出入数据到静态数组元素,保存用
      State[priority].color = p->MetaCycleOn;
      State[priority].OffTime = p->OffTime;

      for(cnt = 0; cnt<2; cnt++)                                        //从优先级0的开始处理
      {
             if(State[cnt].OnOffState>0)                               //当灯处于常亮或者闪烁时,优先返回此状态
             {
                    p->OffOnBlink= State[cnt].OnOffState;   
                    p->MetaCycleOn= State[cnt].color;
                    p->OffTime= State[cnt].OffTime;
                    break;                                                        //推出循环,以返回覆盖之前状态
              }
       } 
       return p;                                                                 //就算循环中没有合适的,反悔设定的关灯操作
}

(4)类似的问题还有,诸如:同一个LED驱动控制多个LED,哪个LED优先相应,也需要做类似的处理。最好的办法是固定优先级,因为这个不需要涉及到恢复的操作,打开和关闭也不需要成对。

原创粉丝点击