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);
							 | 
						||
| 
								 | 
							
								}
							 |