57 lines
1.9 KiB
C++
57 lines
1.9 KiB
C++
|
/*#############################################################################
|
||
|
## Author: Shaun Reed ##
|
||
|
## Legal: All Content (c) 2025 Shaun Reed, all rights reserved ##
|
||
|
## ##
|
||
|
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com ##
|
||
|
##############################################################################
|
||
|
*/
|
||
|
#include <lv_init.h>
|
||
|
|
||
|
#include "display.h"
|
||
|
|
||
|
// Static TimeKeeper for managing ESP timers across all displays.
|
||
|
TimeKeeper Display::timers_;
|
||
|
|
||
|
Display::Display(IPanelDevice &device) :
|
||
|
panel_(device)
|
||
|
{
|
||
|
if (!lv_is_initialized()) {
|
||
|
ESP_LOGI(TAG, "Initialize LVGL");
|
||
|
lv_init();
|
||
|
}
|
||
|
|
||
|
ESP_LOGI(TAG, "Creating LVGL display");
|
||
|
lv_display_ = panel_.device_->create_display();
|
||
|
// associate the i2c panel handle to the display
|
||
|
lv_display_set_user_data(lv_display_, panel_.esp_panel_);
|
||
|
|
||
|
panel_.register_display_callbacks(lv_display_);
|
||
|
}
|
||
|
|
||
|
void Display::set_text(const char *text,
|
||
|
const char *name,
|
||
|
lv_label_long_mode_t long_mode,
|
||
|
lv_align_t align)
|
||
|
{
|
||
|
// Lock the mutex due to the LVGL APIs are not thread-safe.
|
||
|
ScopedLock lock;
|
||
|
|
||
|
ESP_LOGI(TAG, "Display LVGL Scroll Text");
|
||
|
lv_obj_t *scr = lv_display_get_screen_active(lv_display_);
|
||
|
|
||
|
// Create the label if it's `name` doesn't already exist in the map keys.
|
||
|
if (!lv_objects_.count(name)) {
|
||
|
lv_objects_[name] = lv_label_create(scr);
|
||
|
}
|
||
|
auto obj = lv_objects_[name];
|
||
|
|
||
|
// Set text and long mode.
|
||
|
lv_label_set_long_mode(obj, long_mode);
|
||
|
lv_label_set_text(obj, text);
|
||
|
|
||
|
// Set the size of the screen.
|
||
|
// If you use rotation 90 or 270 use lv_display_get_vertical_resolution.
|
||
|
lv_obj_set_width(obj, lv_display_get_horizontal_resolution(lv_display_));
|
||
|
lv_obj_align(obj, align, 0, 0);
|
||
|
}
|