diff --git a/libraries/AP_Notify/AP_Notify.cpp b/libraries/AP_Notify/AP_Notify.cpp index bf3b7b1024..1a1b6d2158 100644 --- a/libraries/AP_Notify/AP_Notify.cpp +++ b/libraries/AP_Notify/AP_Notify.cpp @@ -535,6 +535,27 @@ void AP_Notify::send_text(const char *str) _send_text_updated_millis = AP_HAL::millis(); } +#if AP_SCRIPTING_ENABLED +void AP_Notify::send_text_scripting(const char *str, uint8_t r) +{ + for (uint8_t i = 0; i < _num_devices; i++) { + if (_devices[i] != nullptr) { + _devices[i]->send_text_blocking(str, r); + } + } +} + +void AP_Notify::release_text_scripting(uint8_t r) +{ + for (uint8_t i = 0; i < _num_devices; i++) { + if (_devices[i] != nullptr) { + _devices[i]->release_text(r); + } + } +} +#endif + + // convert 0-3 to 0-100 int8_t AP_Notify::get_rgb_led_brightness_percent() const { diff --git a/libraries/AP_Notify/AP_Notify.h b/libraries/AP_Notify/AP_Notify.h index 0db8c825bb..b71988bdf1 100644 --- a/libraries/AP_Notify/AP_Notify.h +++ b/libraries/AP_Notify/AP_Notify.h @@ -210,6 +210,12 @@ public: void send_text(const char *str); const char* get_text() const { return _send_text; } uint32_t get_text_updated_millis() const {return _send_text_updated_millis; } + +#if AP_SCRIPTING_ENABLED + // send text to the display using scripting + void send_text_scripting(const char *str, uint8_t r); + void release_text_scripting(uint8_t r); +#endif static const struct AP_Param::GroupInfo var_info[]; int8_t get_buzz_pin() const { return _buzzer_pin; } diff --git a/libraries/AP_Notify/Display.cpp b/libraries/AP_Notify/Display.cpp index 35ecbdb315..a17b726379 100644 --- a/libraries/AP_Notify/Display.cpp +++ b/libraries/AP_Notify/Display.cpp @@ -404,17 +404,53 @@ void Display::update() void Display::update_all() { - update_text(0); - update_mode(1); + if(!BIT_IS_SET(_send_text_scr_override, 0)) { + update_text(0); + } + + if(!BIT_IS_SET(_send_text_scr_override, 1)) { + update_mode(1); + } + #if AP_BATTERY_ENABLED - update_battery(2); + if(!BIT_IS_SET(_send_text_scr_override, 2)) { + update_battery(2); + } #endif #if AP_GPS_ENABLED - update_gps(3); + if(!BIT_IS_SET(_send_text_scr_override, 3)) { + update_gps(3); + } #endif - //update_gps_sats(4); - update_prearm(4); - update_ekf(5); + + if(!BIT_IS_SET(_send_text_scr_override, 4)) { + //update_gps_sats(4); + update_prearm(4); + } + + if(!BIT_IS_SET(_send_text_scr_override, 5)) { + update_ekf(5); + } +} + +void Display::send_text_blocking(const char *text, uint8_t r) +{ + if (text == nullptr) { + return; + } + if (r >= DISPLAY_TEXT_NUM_ROWS) { + return; + } + BIT_SET(_send_text_scr_override, r); + char txt [DISPLAY_MESSAGE_SIZE] = {}; + memset(txt, ' ', DISPLAY_MESSAGE_SIZE); + memcpy(txt, text, strnlen(text, DISPLAY_MESSAGE_SIZE)); + draw_text(COLUMN(0), ROW(r), txt); +} + +void Display::release_text(uint8_t r) +{ + BIT_CLEAR(_send_text_scr_override, r); } void Display::draw_text(uint16_t x, uint16_t y, const char* c) diff --git a/libraries/AP_Notify/Display.h b/libraries/AP_Notify/Display.h index 5c0fbb3e85..6243a3696e 100644 --- a/libraries/AP_Notify/Display.h +++ b/libraries/AP_Notify/Display.h @@ -9,6 +9,7 @@ #define ROW(Y) ((Y * 10) + 6) #define COLUMN(X) ((X * 7) + 0) +#define DISPLAY_TEXT_NUM_ROWS 6 #define DISPLAY_MESSAGE_SIZE 19 class Display_Backend; @@ -19,7 +20,8 @@ public: bool init(void) override; void update() override; - + void send_text_blocking(const char *text, uint8_t line) override; + void release_text(uint8_t line) override; private: void draw_char(uint16_t x, uint16_t y, const char c); void draw_text(uint16_t x, uint16_t y, const char *c); @@ -42,6 +44,9 @@ private: // stop showing text in display after this many millis: const uint16_t _send_text_valid_millis = 20000; + + //Bitmask of what lines send_text_scripting should override + uint8_t _send_text_scr_override; }; #endif // HAL_DISPLAY_ENABLED diff --git a/libraries/AP_Notify/NotifyDevice.h b/libraries/AP_Notify/NotifyDevice.h index 2f2f76ca92..f5f6d89d80 100644 --- a/libraries/AP_Notify/NotifyDevice.h +++ b/libraries/AP_Notify/NotifyDevice.h @@ -30,6 +30,10 @@ public: // give RGB value for single led virtual void rgb_set_id(uint8_t r, uint8_t g, uint8_t b, uint8_t id) {} + // Allow text to be sent or removed from a display + virtual void send_text_blocking(const char *text, uint8_t line) {} + virtual void release_text(uint8_t line) {} + // this pointer is used to read the parameters relative to devices const AP_Notify *pNotify; };