@ -48,13 +48,8 @@ bool RGBLed::init()
@@ -48,13 +48,8 @@ bool RGBLed::init()
}
// set_rgb - set color as a combination of red, green and blue values
void RGBLed : : set_rgb ( uint8_t red , uint8_t green , uint8_t blue )
void RGBLed : : _ set_rgb( uint8_t red , uint8_t green , uint8_t blue )
{
// return immediately if not enabled
if ( ! _healthy ) {
return ;
}
if ( red ! = _red_curr | |
green ! = _green_curr | |
blue ! = _blue_curr ) {
@ -67,6 +62,20 @@ void RGBLed::set_rgb(uint8_t red, uint8_t green, uint8_t blue)
@@ -67,6 +62,20 @@ void RGBLed::set_rgb(uint8_t red, uint8_t green, uint8_t blue)
}
}
// set_rgb - set color as a combination of red, green and blue values
void RGBLed : : set_rgb ( uint8_t red , uint8_t green , uint8_t blue )
{
// return immediately if not enabled
if ( ! _healthy ) {
return ;
}
if ( pNotify - > _rgb_led_override ) {
// don't set if in override mode
return ;
}
_set_rgb ( red , green , blue ) ;
}
// _scheduled_update - updates _red, _green, _blue according to notify flags
void RGBLed : : update_colours ( void )
@ -323,6 +332,66 @@ void RGBLed::update()
@@ -323,6 +332,66 @@ void RGBLed::update()
if ( ! _healthy ) {
return ;
}
update_colours ( ) ;
set_rgb ( _red_des , _green_des , _blue_des ) ;
if ( ! pNotify - > _rgb_led_override ) {
update_colours ( ) ;
set_rgb ( _red_des , _green_des , _blue_des ) ;
} else {
update_override ( ) ;
}
}
/*
handle LED control , only used when LED_OVERRIDE = 1
*/
void RGBLed : : handle_led_control ( mavlink_message_t * msg )
{
if ( ! pNotify - > _rgb_led_override ) {
// ignore LED_CONTROL commands if not in LED_OVERRIDE mode
return ;
}
// decode mavlink message
mavlink_led_control_t packet ;
mavlink_msg_led_control_decode ( msg , & packet ) ;
_led_override . start_ms = AP_HAL : : millis ( ) ;
switch ( packet . custom_len ) {
case 3 :
_led_override . rate_hz = 0 ;
_led_override . r = packet . custom_bytes [ 0 ] ;
_led_override . g = packet . custom_bytes [ 1 ] ;
_led_override . b = packet . custom_bytes [ 2 ] ;
break ;
case 4 :
_led_override . rate_hz = packet . custom_bytes [ 3 ] ;
_led_override . r = packet . custom_bytes [ 0 ] ;
_led_override . g = packet . custom_bytes [ 1 ] ;
_led_override . b = packet . custom_bytes [ 2 ] ;
break ;
default :
// not understood
break ;
}
}
/*
update LED when in override mode
*/
void RGBLed : : update_override ( void )
{
if ( _led_override . rate_hz = = 0 ) {
// solid colour
_set_rgb ( _led_override . r , _led_override . g , _led_override . b ) ;
return ;
}
// blinking
uint32_t ms_per_cycle = 1000 / _led_override . rate_hz ;
uint32_t cycle = ( AP_HAL : : millis ( ) - _led_override . start_ms ) % ms_per_cycle ;
if ( cycle > ms_per_cycle / 2 ) {
// on
_set_rgb ( _led_override . r , _led_override . g , _led_override . b ) ;
} else {
_set_rgb ( 0 , 0 , 0 ) ;
}
}