add lcd display and lvgl display library

main
rkcf 2023-02-04 14:29:16 -06:00
parent ef6c473b93
commit fd74c5724e
3 changed files with 100 additions and 2 deletions

View File

@ -1,6 +1,12 @@
* ESP32 Sequencer
A basic step sequencer based on the esp32.
** Project Setup
#+BEGIN_SRC shell
idf.py add-dependency "lvgl/lvgl>=8.*"
#+END_SRC
** TFT LCD Screen
Pinout
| LCD Pin | ESP32 Pin | Function |

View File

@ -1,30 +1,42 @@
#include <stdio.h>
#include <stdint.h>
#include "core/lv_disp.h"
#include "driver/gpio.h"
#include "driver/gptimer.h"
#include "driver/ledc.h"
#include "driver/spi_common.h"
#include "esp_attr.h"
#include "esp_err.h"
#include "esp_heap_caps.h"
#include "esp_lcd_panel_interface.h"
#include "esp_lcd_types.h"
#include "esp_log.h"
#include "esp_random.h"
#include "esp_timer.h"
#include "freertos/FreeRTOS.h"
#include "freertos/portmacro.h"
#include "freertos/projdefs.h"
#include "freertos/queue.h"
#include "freertos/task.h"
#include "hal/gpio_types.h"
#include "hal/lcd_types.h"
#include "hal/ledc_types.h"
#include "hal/lv_hal_disp.h"
#include "hal/spi_types.h"
#include "hal/timer_types.h"
#include "misc/lv_area.h"
#include "misc/lv_color.h"
#include "misc/lv_timer.h"
#include "soc/clk_tree_defs.h"
#include "driver/spi_master.h"
#include "esp_lcd_panel_io.h"
#include "esp_lcd_panel_vendor.h"
#include "esp_lcd_panel_ops.h"
#include "esp_lcd_ili9341.h"
#include "lvgl.h"
#include "widgets/lv_label.h"
/* Inputs */
// Clock In
@ -54,6 +66,8 @@ static QueueHandle_t control_event_queue = NULL;
#define LCD_CS_PIN 36
#define LCD_BK_LIGHT_PIN 41
#define LVGL_TICK_MS 2
/* Timers */
static gptimer_handle_t tap_tempo_timer = NULL;
static gptimer_handle_t gate_timer = NULL;
@ -258,7 +272,27 @@ static void ledc_init(void) {
ESP_ERROR_CHECK(ledc_channel_config(&ledc_gate_channel));
}
static void lcd_init(void) {
static void lvgl_flush_cb(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t *color_map) {
esp_lcd_panel_handle_t panel_handle = (esp_lcd_panel_handle_t)drv->user_data;
int offsetx1 = area->x1;
int offsetx2 = area->x2;
int offsety1 = area->y1;
int offsety2 = area->y2;
esp_lcd_panel_draw_bitmap(panel_handle, offsetx1, offsety1, offsetx2 + 1, offsety2 + 1, color_map);
}
static void lvgl_port_update_cb(lv_disp_drv_t *drv) {
esp_lcd_panel_handle_t panel_handle = (esp_lcd_panel_handle_t)drv->user_data;
esp_lcd_panel_swap_xy(panel_handle, false);
esp_lcd_panel_mirror(panel_handle, true, false);
}
static void lvgl_increase_tick(void *arg) {
lv_tick_inc(LVGL_TICK_MS);
}
/* Setup for TFT LCD Display and LVGL GUI */
static void display_init(void) {
ESP_LOGI(TAG, "Initialing LCD");
// Configure backlight
gpio_reset_pin(LCD_BK_LIGHT_PIN);
@ -302,6 +336,60 @@ static void lcd_init(void) {
// Turn on the panel
ESP_ERROR_CHECK(esp_lcd_panel_disp_on_off(lcd_handle, true));
ESP_LOGI(TAG, "Initalizing LVGL");
lv_init();
// Allocate draw buffers
lv_color_t *buf1 =
heap_caps_malloc(LCD_H_RES * 20 * sizeof(lv_color_t), MALLOC_CAP_DMA);
lv_color_t *buf2 =
heap_caps_malloc(LCD_H_RES * 20 * sizeof(lv_color_t), MALLOC_CAP_DMA);
// Initialize draw buffers
static lv_disp_draw_buf_t disp_buf;
lv_disp_draw_buf_init(&disp_buf, buf1, buf2, LCD_H_RES * 20);
// Initialize display driver then register it
static lv_disp_drv_t disp_drv;
lv_disp_drv_init(&disp_drv);
disp_drv.hor_res = LCD_H_RES;
disp_drv.ver_res = LCD_V_RES;
disp_drv.flush_cb = lvgl_flush_cb;
disp_drv.drv_update_cb = lvgl_port_update_cb;
disp_drv.draw_buf = &disp_buf;
disp_drv.user_data = lcd_handle;
lv_disp_t *disp = lv_disp_drv_register(&disp_drv);
// Install LVGL tick timer
esp_timer_handle_t lvgl_tick_timer = NULL;
const esp_timer_create_args_t lvgl_tick_timer_args = {
.callback = &lvgl_increase_tick,
.name = "lvgl_tick"
};
ESP_ERROR_CHECK(esp_timer_create(&lvgl_tick_timer_args, &lvgl_tick_timer));
ESP_ERROR_CHECK(esp_timer_start_periodic(lvgl_tick_timer, LVGL_TICK_MS * 1000));
}
static void gui_create(void) {
// Get current screen
lv_obj_t * screen = lv_disp_get_scr_act(NULL);
// Set background color
/* lv_obj_set_style_bg_color(lv_scr_act(), lv_color_hex(0x003a57), LV_PART_MAIN); */
// Create and set lable text
lv_obj_t * title_label = lv_label_create(lv_scr_act());
lv_label_set_text(title_label, "Hello World!");
// Align label to center top
/* lv_obj_align(title_label, LV_ALIGN_CENTER, 0, 0); */
}
static void gui_task(void *pvParameter) {
while (1) {
vTaskDelay(pdMS_TO_TICKS(10));
lv_task_handler();
}
}
static void pulse_cv(bool triggered) {
@ -322,7 +410,10 @@ void app_main(void) {
gpio_init();
controls_init();
/* Initialize LCD */
lcd_init();
display_init();
gui_create();
xTaskCreatePinnedToCore(gui_task, "gui", 4096*2, NULL, 0, NULL, 1);
// Start task to handle control events
xTaskCreate(control_event_handler, "control event handler", 2048, NULL, 10, NULL);

View File

@ -1,5 +1,6 @@
## IDF Component Manager Manifest File
dependencies:
lvgl/lvgl: ">=8.*"
espressif/esp_lcd_ili9341: "*"
## Required IDF version
idf: