123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396 |
- #include "AP_Notify.h"
- #include "AP_BoardLED.h"
- #include "PixRacerLED.h"
- #include "Buzzer.h"
- #include "Display.h"
- #include "ExternalLED.h"
- #include "PCA9685LED_I2C.h"
- #include "NeoPixel.h"
- #include "NCP5623.h"
- #include "OreoLED_I2C.h"
- #include "RCOutputRGBLed.h"
- #include "ToneAlarm.h"
- #include "ToshibaLED_I2C.h"
- #include "VRBoard_LED.h"
- #include "DiscreteRGBLed.h"
- #include "DiscoLED.h"
- #include "Led_Sysfs.h"
- #include "UAVCAN_RGB_LED.h"
- #include "SITL_SFML_LED.h"
- #include <stdio.h>
- #include "AP_BoardLED2.h"
- extern const AP_HAL::HAL& hal;
- AP_Notify *AP_Notify::_singleton;
- #define CONFIG_NOTIFY_DEVICES_MAX 6
- #define TOSHIBA_LED_I2C_BUS_INTERNAL 0
- #define TOSHIBA_LED_I2C_BUS_EXTERNAL 1
- #define I2C_LEDS (Notify_LED_ToshibaLED_I2C_Internal | Notify_LED_ToshibaLED_I2C_External | \
- Notify_LED_NCP5623_I2C_Internal | Notify_LED_NCP5623_I2C_External)
- #ifndef BUILD_DEFAULT_LED_TYPE
- #if CONFIG_HAL_BOARD == HAL_BOARD_CHIBIOS
- #define BUILD_DEFAULT_LED_TYPE (Notify_LED_Board | I2C_LEDS)
- #elif CONFIG_HAL_BOARD == HAL_BOARD_LINUX
- #if CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_NAVIO
- #define BUILD_DEFAULT_LED_TYPE (Notify_LED_Board | I2C_LEDS |\
- Notify_LED_PCA9685LED_I2C_External)
- #elif CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_NAVIO2
- #define BUILD_DEFAULT_LED_TYPE (Notify_LED_Board | I2C_LEDS)
- #elif CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_EDGE
- #define BUILD_DEFAULT_LED_TYPE (Notify_LED_Board | I2C_LEDS |\
- Notify_LED_UAVCAN)
- #elif CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_BBBMINI || \
- CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_BLUE || \
- CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_POCKET || \
- CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_ERLEBRAIN2 || \
- CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_PXFMINI || \
- CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_BH || \
- CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_DISCO
- #define BUILD_DEFAULT_LED_TYPE (Notify_LED_Board)
- #elif CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_RST_ZYNQ
- #define BUILD_DEFAULT_LED_TYPE (Notify_LED_ToshibaLED_I2C_External)
- #else
- #define BUILD_DEFAULT_LED_TYPE (Notify_LED_Board | I2C_LEDS)
- #endif
- #else
- #define BUILD_DEFAULT_LED_TYPE (Notify_LED_Board | I2C_LEDS)
- #endif
- #endif
- #ifndef BUZZER_ENABLE_DEFAULT
- #define BUZZER_ENABLE_DEFAULT 1
- #endif
- const AP_Param::GroupInfo AP_Notify::var_info[] = {
-
-
-
-
-
- AP_GROUPINFO("LED_BRIGHT", 0, AP_Notify, _rgb_led_brightness, RGB_LED_HIGH),
-
-
-
-
-
- AP_GROUPINFO("BUZZ_ENABLE", 1, AP_Notify, _buzzer_enable, BUZZER_ENABLE_DEFAULT),
-
-
-
-
-
- AP_GROUPINFO("LED_OVERRIDE", 2, AP_Notify, _rgb_led_override, 0),
-
-
-
-
-
- AP_GROUPINFO("DISPLAY_TYPE", 3, AP_Notify, _display_type, 0),
- #if !HAL_MINIMIZE_FEATURES
-
-
-
-
-
- AP_GROUPINFO("OREO_THEME", 4, AP_Notify, _oreo_theme, 0),
- #endif
- #if !defined(HAL_BUZZER_PIN)
-
-
-
-
-
- AP_GROUPINFO("BUZZ_PIN", 5, AP_Notify, _buzzer_pin, 0),
- #endif
-
-
-
-
-
- AP_GROUPINFO("LED_TYPES", 6, AP_Notify, _led_type, BUILD_DEFAULT_LED_TYPE),
- #if !defined(HAL_BUZZER_PIN)
-
-
-
-
-
- AP_GROUPINFO("BUZZ_ON_LVL", 7, AP_Notify, _buzzer_level, 1),
- #endif
-
-
-
-
-
- AP_GROUPINFO("BUZZ_VOLUME", 8, AP_Notify, _buzzer_volume, 100),
-
- AP_GROUPEND
- };
- AP_Notify::AP_Notify()
- {
- AP_Param::setup_object_defaults(this, var_info);
- if (_singleton != nullptr) {
- AP_HAL::panic("AP_Notify must be singleton");
- }
- _singleton = this;
- }
- struct AP_Notify::notify_flags_and_values_type AP_Notify::flags;
- struct AP_Notify::notify_events_type AP_Notify::events;
- NotifyDevice *AP_Notify::_devices[CONFIG_NOTIFY_DEVICES_MAX];
- uint8_t AP_Notify::_num_devices;
- void AP_Notify::add_backend_helper(NotifyDevice *backend)
- {
- _devices[_num_devices] = backend;
- _devices[_num_devices]->pNotify = this;
- if(!_devices[_num_devices]->init()) {
- delete _devices[_num_devices];
- _devices[_num_devices] = nullptr;
- } else {
- _num_devices++;
- }
- }
- #define ADD_BACKEND(backend) do { add_backend_helper(backend); if (_num_devices >= CONFIG_NOTIFY_DEVICES_MAX) return;} while(0)
- void AP_Notify::add_backends(void)
- {
- if (_num_devices != 0) {
- return;
- }
- for (uint32_t i = 1; i < Notify_LED_MAX; i = i << 1) {
- switch(_led_type & i) {
- case Notify_LED_None:
- break;
- case Notify_LED_Board:
-
- #if CONFIG_HAL_BOARD == HAL_BOARD_LINUX
- #if CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_NAVIO2
- ADD_BACKEND(new Led_Sysfs("rgb_led0", "rgb_led2", "rgb_led1"));
- #elif CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_EDGE
- ADD_BACKEND(new RCOutputRGBLedInverted(12, 13, 14));
- #elif CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_BH
- ADD_BACKEND(new RCOutputRGBLed(HAL_RCOUT_RGBLED_RED, HAL_RCOUT_RGBLED_GREEN, HAL_RCOUT_RGBLED_BLUE));
- #elif CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_DISCO
- ADD_BACKEND(new DiscoLED());
- #elif CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_NAVIGATOR
- ADD_BACKEND(new DiscreteRGBLed(HAL_RGBLED_RED, HAL_RGBLED_GREEN, HAL_RGBLED_BLUE, HAL_RGBLED_NORMAL_POLARITY));
- #endif
- #endif
- #if CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_CHIBIOS_VRBRAIN_V51 || CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_CHIBIOS_VRBRAIN_V52 || CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_CHIBIOS_VRUBRAIN_V51 || CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_CHIBIOS_VRCORE_V10 || CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_CHIBIOS_VRBRAIN_V54
- ADD_BACKEND(new ExternalLED());
- #endif
- #if defined(HAL_HAVE_PIXRACER_LED)
- ADD_BACKEND(new PixRacerLED());
- #elif (defined(HAL_GPIO_A_LED_PIN) && defined(HAL_GPIO_B_LED_PIN) && defined(HAL_GPIO_C_LED_PIN))
- #if CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_CHIBIOS_VRBRAIN_V51 || CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_CHIBIOS_VRBRAIN_V52 || CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_CHIBIOS_VRUBRAIN_V51 || CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_CHIBIOS_VRCORE_V10 || CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_CHIBIOS_VRBRAIN_V54
- ADD_BACKEND(new VRBoard_LED());
- #else
- ADD_BACKEND(new AP_BoardLED());
- #endif
- #elif (defined(HAL_GPIO_A_LED_PIN) && defined(HAL_GPIO_B_LED_PIN))
- ADD_BACKEND(new AP_BoardLED2());
- #endif
- break;
- case Notify_LED_ToshibaLED_I2C_Internal:
- ADD_BACKEND(new ToshibaLED_I2C(TOSHIBA_LED_I2C_BUS_INTERNAL));
- break;
- case Notify_LED_ToshibaLED_I2C_External:
- ADD_BACKEND(new ToshibaLED_I2C(TOSHIBA_LED_I2C_BUS_EXTERNAL));
- break;
- #if !HAL_MINIMIZE_FEATURES
- case Notify_LED_NCP5623_I2C_External:
- FOREACH_I2C_EXTERNAL(b) {
- ADD_BACKEND(new NCP5623(b));
- }
- break;
- case Notify_LED_NCP5623_I2C_Internal:
- ADD_BACKEND(new NCP5623(TOSHIBA_LED_I2C_BUS_INTERNAL));
- break;
- #endif
- case Notify_LED_PCA9685LED_I2C_External:
- ADD_BACKEND(new PCA9685LED_I2C());
- break;
- case Notify_LED_NeoPixel:
- ADD_BACKEND(new NeoPixel());
- break;
- case Notify_LED_OreoLED:
- #if !HAL_MINIMIZE_FEATURES
- if (_oreo_theme) {
- ADD_BACKEND(new OreoLED_I2C(0, _oreo_theme));
- }
- #endif
- break;
- case Notify_LED_UAVCAN:
- #if HAL_WITH_UAVCAN
- ADD_BACKEND(new UAVCAN_RGB_LED(0));
- #endif
- break;
- }
- }
-
- ADD_BACKEND(new Display());
- #if CONFIG_HAL_BOARD == HAL_BOARD_CHIBIOS
- ADD_BACKEND(new Buzzer());
- #ifdef HAL_PWM_ALARM
- ADD_BACKEND(new AP_ToneAlarm());
- #endif
- #elif CONFIG_HAL_BOARD == HAL_BOARD_LINUX
- #if CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_NAVIO || \
- CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_NAVIO2 || \
- CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_EDGE || \
- CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_ERLEBRAIN2 || \
- CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_PXFMINI || \
- CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_RST_ZYNQ || \
- CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_BLUE
-
- #elif CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_BBBMINI || \
- CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_POCKET
- ADD_BACKEND(new Buzzer());
- #else
- ADD_BACKEND(new AP_ToneAlarm());
- #endif
- #elif CONFIG_HAL_BOARD == HAL_BOARD_SITL
- ADD_BACKEND(new AP_ToneAlarm());
- #ifdef WITH_SITL_RGBLED
- ADD_BACKEND(new SITL_SFML_LED());
- #endif
- #endif
- }
- void AP_Notify::init(void)
- {
-
- memset(&AP_Notify::flags, 0, sizeof(AP_Notify::flags));
- memset(&AP_Notify::events, 0, sizeof(AP_Notify::events));
-
- add_backends();
- }
- void AP_Notify::update(void)
- {
- for (uint8_t i = 0; i < _num_devices; i++) {
- if (_devices[i] != nullptr) {
- _devices[i]->update();
- }
- }
-
- memset(&AP_Notify::events, 0, sizeof(AP_Notify::events));
- }
- void AP_Notify::handle_led_control(const mavlink_message_t &msg)
- {
- for (uint8_t i = 0; i < _num_devices; i++) {
- if (_devices[i] != nullptr) {
- _devices[i]->handle_led_control(msg);
- }
- }
- }
- void AP_Notify::handle_play_tune(const mavlink_message_t &msg)
- {
- for (uint8_t i = 0; i < _num_devices; i++) {
- if (_devices[i] != nullptr) {
- _devices[i]->handle_play_tune(msg);
- }
- }
- }
- void AP_Notify::play_tune(const char *tune)
- {
- for (uint8_t i = 0; i < _num_devices; i++) {
- if (_devices[i] != nullptr) {
- _devices[i]->play_tune(tune);
- }
- }
- }
- void AP_Notify::set_flight_mode_str(const char *str)
- {
- strncpy(_flight_mode_str, str, 4);
- _flight_mode_str[sizeof(_flight_mode_str)-1] = 0;
- }
- void AP_Notify::send_text(const char *str)
- {
- strncpy(_send_text, str, sizeof(_send_text));
- _send_text[sizeof(_send_text)-1] = 0;
- _send_text_updated_millis = AP_HAL::millis();
- }
- namespace AP {
- AP_Notify ¬ify()
- {
- return *AP_Notify::get_singleton();
- }
- };
|