Factor out I2C.
This commit is contained in:
		
							parent
							
								
									2dd099f26e
								
							
						
					
					
						commit
						ef7a027cf0
					
				| @ -17,13 +17,22 @@ uint8_t Display::oled_buffer_[LCD_H_RES * LCD_V_RES / 8]; | ||||
| // We must use a mutex to protect it.
 | ||||
| _lock_t ScopedLock::lock_; | ||||
| 
 | ||||
| Display::Display() : | ||||
| Display::Display(const I2C &i2c) : | ||||
|     io_handle_(nullptr), | ||||
|     panel_handle_(nullptr), | ||||
|     i2c_bus_(nullptr), | ||||
|     buf_(nullptr) | ||||
| { | ||||
|   init_i2c(); | ||||
|   ESP_LOGI(TAG, "Install panel IO"); | ||||
|   esp_lcd_panel_io_i2c_config_t io_config = { | ||||
|       .dev_addr = I2C_HW_ADDR, | ||||
|       .control_phase_bytes = 1,               // According to SSD1306 datasheet
 | ||||
|       .dc_bit_offset = 6,                     // According to SSD1306 datasheet
 | ||||
|       .lcd_cmd_bits = LCD_CMD_BITS,           // According to SSD1306 datasheet
 | ||||
|       .lcd_param_bits = LCD_CMD_BITS,         // According to SSD1306 datasheet
 | ||||
|       .scl_speed_hz = LCD_PIXEL_CLOCK_HZ, | ||||
|   }; | ||||
|   ESP_ERROR_CHECK( | ||||
|       esp_lcd_new_panel_io_i2c(i2c.i2c_bus_, &io_config, &io_handle_)); | ||||
| 
 | ||||
|   ESP_LOGI(TAG, "Install SSD1306 panel driver"); | ||||
|   ssd1306_config_ = { | ||||
| @ -158,7 +167,15 @@ void Display::lvgl_port_task(void *arg) | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| void Display::init_i2c() | ||||
| //SSD1306::SSD1306() {
 | ||||
| //
 | ||||
| //}
 | ||||
| //void *SSD1306::vendor_config()
 | ||||
| //{
 | ||||
| //  return &ssd1306_config_;
 | ||||
| //}
 | ||||
| 
 | ||||
| I2C::I2C() : i2c_bus_(nullptr) | ||||
| { | ||||
|   ESP_LOGI(TAG, "Initialize I2C bus"); | ||||
|   i2c_master_bus_config_t bus_config = { | ||||
| @ -172,25 +189,4 @@ void Display::init_i2c() | ||||
|       }, | ||||
|   }; | ||||
|   ESP_ERROR_CHECK(i2c_new_master_bus(&bus_config, &i2c_bus_)); | ||||
| 
 | ||||
|   ESP_LOGI(TAG, "Install panel IO"); | ||||
|   esp_lcd_panel_io_i2c_config_t io_config = { | ||||
|       .dev_addr = I2C_HW_ADDR, | ||||
|       .control_phase_bytes = 1,               // According to SSD1306 datasheet
 | ||||
|       .dc_bit_offset = 6,                     // According to SSD1306 datasheet
 | ||||
|       .lcd_cmd_bits = LCD_CMD_BITS,           // According to SSD1306 datasheet
 | ||||
|       .lcd_param_bits = LCD_CMD_BITS,         // According to SSD1306 datasheet
 | ||||
|       .scl_speed_hz = LCD_PIXEL_CLOCK_HZ, | ||||
|   }; | ||||
|   ESP_ERROR_CHECK(esp_lcd_new_panel_io_i2c(i2c_bus_, &io_config, &io_handle_)); | ||||
| } | ||||
| 
 | ||||
| //SSD1306::SSD1306() {
 | ||||
| //
 | ||||
| //}
 | ||||
| //void *SSD1306::vendor_config()
 | ||||
| //{
 | ||||
| //  return &ssd1306_config_;
 | ||||
| //}
 | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
| @ -34,6 +34,14 @@ static const char *TAG = "lcd-panel"; | ||||
| #define PIN_SCL                GPIO_NUM_22 | ||||
| #define PIN_RST                -1 | ||||
| 
 | ||||
| struct I2C { | ||||
|   I2C(); | ||||
| 
 | ||||
|   ~I2C() = default; | ||||
| 
 | ||||
|   i2c_master_bus_handle_t i2c_bus_; | ||||
| }; | ||||
| 
 | ||||
| struct ScopedLock { | ||||
|   explicit ScopedLock() { _lock_acquire(&lock_); } | ||||
| 
 | ||||
| @ -46,11 +54,10 @@ struct ScopedLock { | ||||
| 
 | ||||
| class Display { | ||||
| public: | ||||
|   Display(); | ||||
|   explicit Display(const I2C &i2c); | ||||
| 
 | ||||
|   ~Display() = default; | ||||
| 
 | ||||
| 
 | ||||
|   [[nodiscard]] inline const lv_display_t *get() const { return display_; } | ||||
| 
 | ||||
|   [[nodiscard]] inline lv_display_t *get() { return display_; } | ||||
| @ -73,6 +80,7 @@ public: | ||||
| 
 | ||||
|   // For LV_COLOR_FORMAT_I1 we need an extra buffer to hold the converted data.
 | ||||
|   static uint8_t oled_buffer_[LCD_H_RES * LCD_V_RES / 8]; | ||||
| 
 | ||||
| protected: | ||||
|   esp_lcd_panel_io_handle_t io_handle_; | ||||
| 
 | ||||
| @ -82,17 +90,14 @@ protected: | ||||
| 
 | ||||
|   esp_lcd_panel_ssd1306_config_t ssd1306_config_; | ||||
| 
 | ||||
|   i2c_master_bus_handle_t  i2c_bus_; | ||||
| 
 | ||||
| private: | ||||
|   void init_i2c(); | ||||
| 
 | ||||
| //  virtual void *vendor_config() = 0;
 | ||||
| 
 | ||||
|   lv_display_t *display_; | ||||
| 
 | ||||
|   void * vendor_config_; | ||||
|   void * buf_; | ||||
|   void *vendor_config_; | ||||
| 
 | ||||
|   void *buf_; | ||||
| }; | ||||
| 
 | ||||
| //class SSD1306 : public Display {
 | ||||
|  | ||||
| @ -3,11 +3,13 @@ | ||||
| #include "esp_log.h" | ||||
| #include "lvgl.h" | ||||
| 
 | ||||
| I2C i2c; | ||||
| 
 | ||||
| void setup() | ||||
| { | ||||
|   Display d; | ||||
|   Display d(i2c); | ||||
| 
 | ||||
|   // UI function
 | ||||
|   // UI function scope.
 | ||||
|   { | ||||
|     // Lock the mutex due to the LVGL APIs are not thread-safe
 | ||||
|     ScopedLock lock; | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user