|
|
|
@ -21,6 +21,9 @@
@@ -21,6 +21,9 @@
|
|
|
|
|
#include "RGBLed.h" |
|
|
|
|
#include "AP_Notify.h" |
|
|
|
|
|
|
|
|
|
#ifndef USE_WS2812 |
|
|
|
|
#define USE_WS2812 1 |
|
|
|
|
#endif |
|
|
|
|
extern const AP_HAL::HAL& hal; |
|
|
|
|
|
|
|
|
|
RGBLed::RGBLed(uint8_t led_off, uint8_t led_bright, uint8_t led_medium, uint8_t led_dim): |
|
|
|
@ -163,6 +166,106 @@ uint32_t RGBLed::get_colour_sequence(void) const
@@ -163,6 +166,106 @@ uint32_t RGBLed::get_colour_sequence(void) const
|
|
|
|
|
return sequence_disarmed_bad_gps; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void RGBLed::get_colour_ws2812(void)
|
|
|
|
|
{ |
|
|
|
|
// initialising pattern
|
|
|
|
|
if (AP_Notify::flags.initialising) { |
|
|
|
|
// return sequence_initialising;
|
|
|
|
|
_red_ws = _led_medium; |
|
|
|
|
_blue_ws = _led_off; |
|
|
|
|
_green_ws = _led_medium; |
|
|
|
|
set_rgb_mode(1); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// save trim and esc calibration pattern
|
|
|
|
|
if (AP_Notify::flags.save_trim || AP_Notify::flags.esc_calibration) { |
|
|
|
|
// return sequence_trim_or_esc;
|
|
|
|
|
_red_ws = _led_medium; |
|
|
|
|
_blue_ws = _led_medium; |
|
|
|
|
_green_ws = _led_medium; |
|
|
|
|
set_rgb_mode(1); // flow
|
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// radio and battery failsafe patter: flash yellow
|
|
|
|
|
// gps failsafe pattern : flashing yellow and blue
|
|
|
|
|
// ekf_bad pattern : flashing yellow and red
|
|
|
|
|
if (AP_Notify::flags.failsafe_radio || |
|
|
|
|
AP_Notify::flags.failsafe_battery || |
|
|
|
|
AP_Notify::flags.ekf_bad || |
|
|
|
|
AP_Notify::flags.gps_glitching || |
|
|
|
|
AP_Notify::flags.leak_detected) { |
|
|
|
|
|
|
|
|
|
if (AP_Notify::flags.leak_detected) { |
|
|
|
|
// purple if leak detected
|
|
|
|
|
// return sequence_failsafe_leak;
|
|
|
|
|
} else if (AP_Notify::flags.ekf_bad) { |
|
|
|
|
// red on if ekf bad
|
|
|
|
|
// return sequence_failsafe_ekf;
|
|
|
|
|
} else if (AP_Notify::flags.gps_glitching) { |
|
|
|
|
// blue on gps glitch
|
|
|
|
|
// return sequence_failsafe_gps_glitching;
|
|
|
|
|
} |
|
|
|
|
// all off for radio or battery failsafe
|
|
|
|
|
// return sequence_failsafe_radio_or_battery;
|
|
|
|
|
_red_ws = _led_medium; |
|
|
|
|
_blue_ws = _led_medium; |
|
|
|
|
_green_ws = _led_off; |
|
|
|
|
set_rgb_mode(1); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// solid green or blue if armed
|
|
|
|
|
if (AP_Notify::flags.armed) { |
|
|
|
|
// solid green if armed with GPS 3d lock
|
|
|
|
|
if (AP_Notify::flags.gps_status >= AP_GPS::GPS_OK_FIX_3D) { |
|
|
|
|
// return sequence_armed;
|
|
|
|
|
_red_ws = _led_off; |
|
|
|
|
_blue_ws = _led_off; |
|
|
|
|
_green_ws = _led_medium; |
|
|
|
|
} |
|
|
|
|
// solid blue if armed with no GPS lock
|
|
|
|
|
// return sequence_armed_nogps;
|
|
|
|
|
_red_ws = _led_off; |
|
|
|
|
_blue_ws = _led_medium; |
|
|
|
|
_green_ws = _led_medium; |
|
|
|
|
set_rgb_mode(0); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// double flash yellow if failing pre-arm checks
|
|
|
|
|
if (!AP_Notify::flags.pre_arm_check) { |
|
|
|
|
// return sequence_prearm_failing;
|
|
|
|
|
_red_ws = _led_medium; |
|
|
|
|
_blue_ws = _led_off; |
|
|
|
|
_green_ws = _led_medium; |
|
|
|
|
set_rgb_mode(1); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
if (AP_Notify::flags.gps_status >= AP_GPS::GPS_OK_FIX_3D_DGPS && AP_Notify::flags.pre_arm_gps_check) { |
|
|
|
|
// return sequence_disarmed_good_dgps;
|
|
|
|
|
_red_ws = _led_off; |
|
|
|
|
_blue_ws = _led_off; |
|
|
|
|
_green_ws = _led_medium; |
|
|
|
|
set_rgb_mode(2); // green breath
|
|
|
|
|
}else if (AP_Notify::flags.gps_status >= AP_GPS::GPS_OK_FIX_3D && AP_Notify::flags.pre_arm_gps_check) { |
|
|
|
|
// return sequence_disarmed_good_gps;
|
|
|
|
|
_red_ws = _led_off; |
|
|
|
|
_blue_ws = _led_off; |
|
|
|
|
_green_ws = _led_medium; |
|
|
|
|
set_rgb_mode(2); // blue green breath
|
|
|
|
|
}else{ |
|
|
|
|
_red_ws = _led_off; |
|
|
|
|
_blue_ws = _led_medium; |
|
|
|
|
_green_ws = _led_medium; |
|
|
|
|
set_rgb_mode(2); // blue breath
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// return sequence_disarmed_bad_gps;
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
uint32_t RGBLed::get_colour_sequence_traffic_light(void) const |
|
|
|
|
{ |
|
|
|
|
if (AP_Notify::flags.initialising) { |
|
|
|
@ -206,6 +309,10 @@ void RGBLed::update()
@@ -206,6 +309,10 @@ void RGBLed::update()
|
|
|
|
|
case traffic_light: |
|
|
|
|
current_colour_sequence = get_colour_sequence_traffic_light(); |
|
|
|
|
break; |
|
|
|
|
case use_ws2812: |
|
|
|
|
get_colour_ws2812(); |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
const uint8_t brightness = get_brightness(); |
|
|
|
@ -220,9 +327,19 @@ void RGBLed::update()
@@ -220,9 +327,19 @@ void RGBLed::update()
|
|
|
|
|
|
|
|
|
|
const uint8_t colour = (current_colour_sequence >> (step*3)) & 7; |
|
|
|
|
|
|
|
|
|
_red_des = (colour & RED) ? brightness : 0; |
|
|
|
|
_green_des = (colour & GREEN) ? brightness : 0; |
|
|
|
|
_blue_des = (colour & BLUE) ? brightness : 0; |
|
|
|
|
// _red_des = (colour & RED) ? brightness : 0;
|
|
|
|
|
// _green_des = (colour & GREEN) ? brightness : 0;
|
|
|
|
|
// _blue_des = (colour & BLUE) ? brightness : 0;
|
|
|
|
|
|
|
|
|
|
if(rgb_source() == use_ws2812){ |
|
|
|
|
_red_des = (_red_ws != _led_off) ? brightness : 0; |
|
|
|
|
_green_des = (_green_ws != _led_off) ? brightness : 0; |
|
|
|
|
_blue_des = (_blue_ws != _led_off) ? brightness : 0; |
|
|
|
|
}else{ |
|
|
|
|
_red_des = (colour & RED) ? brightness : 0; |
|
|
|
|
_green_des = (colour & GREEN) ? brightness : 0; |
|
|
|
|
_blue_des = (colour & BLUE) ? brightness : 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
set_rgb(_red_des, _green_des, _blue_des); |
|
|
|
|
} |
|
|
|
@ -262,6 +379,14 @@ void RGBLed::handle_led_control(const mavlink_message_t &msg)
@@ -262,6 +379,14 @@ void RGBLed::handle_led_control(const mavlink_message_t &msg)
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void RGBLed::set_rgb_mode(uint8_t mode) |
|
|
|
|
{ |
|
|
|
|
if (!pNotify->_rgb_led_override) { |
|
|
|
|
// ignore LED_CONTROL commands if not in LED_OVERRIDE mode
|
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
/*
|
|
|
|
|
update LED when in override mode |
|
|
|
|
*/ |
|
|
|
|