@@ -21,6 +21,7 @@ struct blink_timer
2121{
2222 rt_bool_t toggle ;
2323 rt_bool_t enabled ;
24+ rt_uint32_t count ;
2425 struct rt_timer timer ;
2526};
2627
@@ -104,19 +105,42 @@ const static struct rt_device_ops _led_ops =
104105
105106static void _led_blink_timerout (void * param )
106107{
108+ rt_tick_t tick ;
107109 struct rt_led_device * led = param ;
108110 struct blink_timer * btimer = led -> sysdata ;
109111
110112 if (btimer -> toggle )
111113 {
112114 led -> ops -> set_state (led , RT_LED_S_OFF );
115+
116+ if (btimer -> count ++ & 1 )
117+ {
118+ btimer -> count = 0 ;
119+ tick = rt_tick_from_millisecond (1000 );
120+ goto _set_timeout ;
121+ }
113122 }
114123 else
115124 {
116125 led -> ops -> set_state (led , RT_LED_S_ON );
126+
127+ if (!btimer -> count )
128+ {
129+ tick = rt_tick_from_millisecond (80 );
130+ goto _set_timeout ;
131+ }
117132 }
118133
134+ _toggle :
119135 btimer -> toggle = !btimer -> toggle ;
136+ return ;
137+
138+ _set_timeout :
139+ rt_timer_stop (& btimer -> timer );
140+ rt_timer_control (& btimer -> timer , RT_TIMER_CTRL_SET_TIME , & tick );
141+ rt_timer_start (& btimer -> timer );
142+
143+ goto _toggle ;
120144}
121145
122146rt_err_t rt_led_register (struct rt_led_device * led )
@@ -159,7 +183,7 @@ rt_err_t rt_led_register(struct rt_led_device *led)
159183 btimer -> toggle = RT_FALSE ;
160184 btimer -> enabled = RT_FALSE ;
161185 rt_timer_init (& btimer -> timer , dev_name , _led_blink_timerout , led ,
162- rt_tick_from_millisecond (500 ), RT_TIMER_FLAG_PERIODIC );
186+ rt_tick_from_millisecond (1000 ), RT_TIMER_FLAG_PERIODIC );
163187 }
164188
165189 led -> parent .type = RT_Device_Class_Char ;
0 commit comments