产品有4个LED,用作指示作用。LED有3种状态,亮,灭,闪烁。在驱动层,LED之间互不干扰,但是在业务中,可以让某LED亮的同时其他LED灭。业务是多变的,但是驱动是不变的。
#define LED_BLINK_PERIOD 3
enum led_state{
LED_STA_IDLE,
LED_STA_ON,
LED_STA_OFF,
LED_STA_BLINK,
};
enum led_id
{
CS_RED_LED,
CS_GREEN_LED,
RS_RED_LED,
RS_GREEN_LED,
LED_NUM
};
struct led_device
{
uint8_t id;
uint8_t state;
uint16_t delay;
void(*led_on)(uint8_t);
};
static void cs_red_led_on (uint8_t val)
{
}
static void cs_green_led_on (uint8_t val)
{
}
static void rs_red_led_on (uint8_t val)
{
}
static void rs_green_led_on (uint8_t val)
{
}
static struct led_device led[LED_NUM]=
{
{ CS_RED_LED, LED_STA_IDLE, 0, cs_red_led_on },
{ CS_GREEN_LED, LED_STA_IDLE, 0, cs_green_led_on },
{ RS_RED_LED, LED_STA_IDLE, 0, rs_red_led_on },
{ RS_GREEN_LED, LED_STA_IDLE, 0, rs_green_led_on },
};
//用户调用这个接口设置LED的状态
void set_led_state( uint8_t id, uint32_t sta )
{
struct led_device* pled = NULL;
if ( id < LED_NUM )
{
pled = &led[id];
pled->delay = 0;
pled->state = sta;
}
}
//周期性调用,100ms调用一次
void led_task( )
{
uint8_t i;
struct led_device* pled = NULL;
for (i = 0; i < LED_NUM; ++i)
{
pled = &led[i];
switch( pled->state )
{
case LED_STA_IDLE:
break;
case LED_STA_ON:
if( pled->led_on )
{
pled->led_on(1);
pled->state = LED_STA_IDLE;
}
break;
case LED_STA_OFF:
if( pled->led_on )
{
pled->led_on(0);
pled->state = LED_STA_IDLE;
}
break;
case LED_STA_BLINK:
pled->delay++;
if( pled->delay == LED_BLINK_PERIOD )
{
if( pled->led_on )
{
pled->led_on(1);
}
}
else if( pled->delay == LED_BLINK_PERIOD * 2 )
{
pled->delay = 0;
if( pled->led_on )
{
pled->led_on(0);
}
}
break;
default:
break;
}
}
}
1938

被折叠的 条评论
为什么被折叠?



