115 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			115 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/*#############################################################################
 | 
						|
## Author: Shaun Reed                                                        ##
 | 
						|
## Legal: All Content (c) 2025 Shaun Reed, all rights reserved               ##
 | 
						|
##                                                                           ##
 | 
						|
## Contact: shaunrd0@gmail.com  | URL: www.shaunreed.com                     ##
 | 
						|
##############################################################################
 | 
						|
*/
 | 
						|
#ifndef DISPLAY_H
 | 
						|
#define DISPLAY_H
 | 
						|
 | 
						|
#include <widgets/label/lv_label.h>
 | 
						|
 | 
						|
#include <unordered_map>
 | 
						|
 | 
						|
#include "time_keeper.h"
 | 
						|
#include "panel.h"
 | 
						|
#include "scoped_lock.h"
 | 
						|
 | 
						|
/**
 | 
						|
 * Encapsulates lv_display handle and related LVGL operations.
 | 
						|
 * Contains helper methods that wrap basic LVGL operations such as drawing text.
 | 
						|
 * The underlying lv_display can be obtained for manual LVGL operations.
 | 
						|
 * @sa ScopedLock
 | 
						|
 * @sa Display::get()
 | 
						|
 */
 | 
						|
class Display {
 | 
						|
public:
 | 
						|
  /**
 | 
						|
   * Construct a new Display using an object that implements IPanelDevice.
 | 
						|
   *
 | 
						|
   * @param device An object that implements the IPanelDevice interface.
 | 
						|
   */
 | 
						|
  explicit Display(IPanelDevice &device);
 | 
						|
 | 
						|
  ~Display() = default;
 | 
						|
 | 
						|
  Display(const Display &) = delete;
 | 
						|
 | 
						|
  Display(Display &) = delete;
 | 
						|
 | 
						|
  Display &operator=(Display &) = delete;
 | 
						|
 | 
						|
  using lv_display_handle_t = lv_display_t *;
 | 
						|
 | 
						|
  //
 | 
						|
  // GETTERS
 | 
						|
 | 
						|
  /**
 | 
						|
   * Getter for accessing LVGL display handle.
 | 
						|
   *
 | 
						|
   * @sa ScopedLock for calling custom LVGL API's not implemented by Display.
 | 
						|
   */
 | 
						|
  [[nodiscard]] inline lv_display_handle_t get() const { return lv_display_; }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Getter for accessing LVGL display handle.
 | 
						|
   *
 | 
						|
   * @sa ScopedLock for calling custom LVGL API's not implemented by Display.
 | 
						|
   */
 | 
						|
  [[nodiscard]] inline lv_display_handle_t get() { return lv_display_; }
 | 
						|
 | 
						|
  /// Dereference operator for accessing LVGL display handle.
 | 
						|
  [[nodiscard]] inline lv_display_handle_t operator*() const { return get(); }
 | 
						|
 | 
						|
  /// Dereference operator for accessing LVGL display handle.
 | 
						|
  [[nodiscard]] inline lv_display_handle_t operator*() { return get(); }
 | 
						|
 | 
						|
  //
 | 
						|
  // LVGL OPERATIONS
 | 
						|
 | 
						|
  /**
 | 
						|
   * Create a LVGL label with some given text on the current display.
 | 
						|
   * The name of the object can be reused to change text on this label later.
 | 
						|
   *
 | 
						|
   * @param text Text to write to the display.
 | 
						|
   * @param name Name for the LVGL label object associated with this text.
 | 
						|
   * @param long_mode LVGL long mode for text wider than the current display.
 | 
						|
   * @param align LVGL alignment to use for placing the label on the display.
 | 
						|
   */
 | 
						|
  void set_text(const char *text,
 | 
						|
                const char *name,
 | 
						|
                lv_label_long_mode_t long_mode = LV_LABEL_LONG_SCROLL_CIRCULAR,
 | 
						|
                lv_align_t align = LV_ALIGN_TOP_MID);
 | 
						|
 | 
						|
  //
 | 
						|
  // PUBLIC STATIC MEMBERS
 | 
						|
 | 
						|
  /// Public static TimeKeeper for managing ESP timers across all displays.
 | 
						|
  static TimeKeeper timers_;
 | 
						|
 | 
						|
private:
 | 
						|
 | 
						|
  //
 | 
						|
  // PRIVATE MEMBERS
 | 
						|
 | 
						|
  /// Panel associated with this Display.
 | 
						|
  Panel panel_;
 | 
						|
 | 
						|
  /// LVGL display handle.
 | 
						|
  lv_display_handle_t lv_display_;
 | 
						|
 | 
						|
  /**
 | 
						|
   * LVGL object handles stored in the LVGL screen associated with this Display.
 | 
						|
   *
 | 
						|
   * @sa Display::set_text
 | 
						|
   * @sa lv_display_get_screen_active
 | 
						|
   */
 | 
						|
  std::unordered_map<const char *, lv_obj_t *> lv_objects_;
 | 
						|
 | 
						|
  /// Tag used for ESP logging.
 | 
						|
  constexpr static const char *TAG = "Display";
 | 
						|
};
 | 
						|
 | 
						|
#endif // DISPLAY_H
 |