Improve ScopedLock.
This commit is contained in:
		
							parent
							
								
									8aaed133e8
								
							
						
					
					
						commit
						2dd099f26e
					
				@ -13,7 +13,9 @@
 | 
			
		||||
// To use LV_COLOR_FORMAT_I1, we need an extra buffer to hold the converted data
 | 
			
		||||
uint8_t Display::oled_buffer_[LCD_H_RES * LCD_V_RES / 8];
 | 
			
		||||
 | 
			
		||||
_lock_t Display::lvgl_api_lock_;
 | 
			
		||||
// LVGL library is not thread-safe, this example calls LVGL APIs from tasks.
 | 
			
		||||
// We must use a mutex to protect it.
 | 
			
		||||
_lock_t ScopedLock::lock_;
 | 
			
		||||
 | 
			
		||||
Display::Display() :
 | 
			
		||||
    io_handle_(nullptr),
 | 
			
		||||
@ -149,9 +151,9 @@ void Display::lvgl_port_task(void *arg)
 | 
			
		||||
  ESP_LOGI(TAG, "Starting LVGL task");
 | 
			
		||||
  uint32_t time_till_next_ms = 0;
 | 
			
		||||
  while (1) {
 | 
			
		||||
    _lock_acquire(&lvgl_api_lock_);
 | 
			
		||||
    _lock_acquire(&ScopedLock::lock_);
 | 
			
		||||
    time_till_next_ms = lv_timer_handler();
 | 
			
		||||
    _lock_release(&lvgl_api_lock_);
 | 
			
		||||
    _lock_release(&ScopedLock::lock_);
 | 
			
		||||
    usleep(1000 * time_till_next_ms);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -4,8 +4,10 @@
 | 
			
		||||
#include <esp_lcd_types.h>
 | 
			
		||||
#include <esp_lcd_panel_ssd1306.h>
 | 
			
		||||
#include <driver/i2c_types.h>
 | 
			
		||||
#include <driver/i2c_master.h>
 | 
			
		||||
#include "misc/lv_types.h"
 | 
			
		||||
#include "misc/lv_area.h"
 | 
			
		||||
#include "display/lv_display.h"
 | 
			
		||||
 | 
			
		||||
#define I2C_BUS_PORT  0
 | 
			
		||||
#define LVGL_TICK_PERIOD_MS    5
 | 
			
		||||
@ -33,11 +35,13 @@ static const char *TAG = "lcd-panel";
 | 
			
		||||
#define PIN_RST                -1
 | 
			
		||||
 | 
			
		||||
struct ScopedLock {
 | 
			
		||||
  explicit ScopedLock(_lock_t& lock) : lock_(&lock) { _lock_acquire(lock_); }
 | 
			
		||||
  ~ScopedLock() { _lock_release(lock_); }
 | 
			
		||||
  explicit ScopedLock() { _lock_acquire(&lock_); }
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
  _lock_t* lock_;
 | 
			
		||||
  ~ScopedLock() { _lock_release(&lock_); }
 | 
			
		||||
 | 
			
		||||
  // LVGL library is not thread-safe, this example calls LVGL APIs from tasks.
 | 
			
		||||
  // We must use a mutex to protect it.
 | 
			
		||||
  static _lock_t lock_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class Display {
 | 
			
		||||
@ -59,19 +63,16 @@ public:
 | 
			
		||||
                               esp_lcd_panel_io_event_data_t *data,
 | 
			
		||||
                               void *user_ctx);
 | 
			
		||||
 | 
			
		||||
  static void
 | 
			
		||||
  lvgl_flush_cb(lv_display_t *display, const lv_area_t *area, uint8_t *px_map);
 | 
			
		||||
  static void lvgl_flush_cb(lv_display_t *display,
 | 
			
		||||
                            const lv_area_t *area,
 | 
			
		||||
                            uint8_t *px_map);
 | 
			
		||||
 | 
			
		||||
  static void lvgl_increase_tick(void *arg);
 | 
			
		||||
 | 
			
		||||
  static void lvgl_port_task(void *arg);
 | 
			
		||||
 | 
			
		||||
  // To use LV_COLOR_FORMAT_I1, we need an extra buffer to hold the converted data
 | 
			
		||||
  // 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];
 | 
			
		||||
 | 
			
		||||
  // LVGL library is not thread-safe, this example will call LVGL APIs from different tasks, so use a mutex to protect it
 | 
			
		||||
  static _lock_t lvgl_api_lock_;
 | 
			
		||||
 | 
			
		||||
protected:
 | 
			
		||||
  esp_lcd_panel_io_handle_t io_handle_;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -10,7 +10,7 @@ void setup()
 | 
			
		||||
  // UI function
 | 
			
		||||
  {
 | 
			
		||||
    // Lock the mutex due to the LVGL APIs are not thread-safe
 | 
			
		||||
    ScopedLock lock(Display::lvgl_api_lock_);
 | 
			
		||||
    ScopedLock lock;
 | 
			
		||||
 | 
			
		||||
    ESP_LOGI(TAG, "Display LVGL Scroll Text");
 | 
			
		||||
    lv_obj_t *scr = lv_display_get_screen_active(d.get());
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user