1. 测试了屏幕驱动,lvgl,触摸,驱动文件在Lib/Display当中。全部通过(修改了sdkconfig,以适配lvgl)

2. 新增了优雅的C语言错误处理
This commit is contained in:
Misaki
2025-08-25 11:07:52 +08:00
parent ec33aa0483
commit 7fa73d6183
23 changed files with 4495 additions and 16 deletions
+388
View File
@@ -0,0 +1,388 @@
#include "ST77916.h"
#define LCD_OPCODE_WRITE_CMD (0x02ULL)
#define LCD_OPCODE_READ_CMD (0x0BULL)
#define LCD_OPCODE_WRITE_COLOR (0x32ULL)
static const char *TAG_LCD = "ST77916";
esp_lcd_panel_handle_t panel_handle = NULL;
static const st77916_lcd_init_cmd_t vendor_specific_init_new[] = {
{0xF0, (uint8_t []){0x28}, 1, 0},
{0xF2, (uint8_t []){0x28}, 1, 0},
{0x73, (uint8_t []){0xF0}, 1, 0},
{0x7C, (uint8_t []){0xD1}, 1, 0},
{0x83, (uint8_t []){0xE0}, 1, 0},
{0x84, (uint8_t []){0x61}, 1, 0},
{0xF2, (uint8_t []){0x82}, 1, 0},
{0xF0, (uint8_t []){0x00}, 1, 0},
{0xF0, (uint8_t []){0x01}, 1, 0},
{0xF1, (uint8_t []){0x01}, 1, 0},
{0xB0, (uint8_t []){0x56}, 1, 0},
{0xB1, (uint8_t []){0x4D}, 1, 0},
{0xB2, (uint8_t []){0x24}, 1, 0},
{0xB4, (uint8_t []){0x87}, 1, 0},
{0xB5, (uint8_t []){0x44}, 1, 0},
{0xB6, (uint8_t []){0x8B}, 1, 0},
{0xB7, (uint8_t []){0x40}, 1, 0},
{0xB8, (uint8_t []){0x86}, 1, 0},
{0xBA, (uint8_t []){0x00}, 1, 0},
{0xBB, (uint8_t []){0x08}, 1, 0},
{0xBC, (uint8_t []){0x08}, 1, 0},
{0xBD, (uint8_t []){0x00}, 1, 0},
{0xC0, (uint8_t []){0x80}, 1, 0},
{0xC1, (uint8_t []){0x10}, 1, 0},
{0xC2, (uint8_t []){0x37}, 1, 0},
{0xC3, (uint8_t []){0x80}, 1, 0},
{0xC4, (uint8_t []){0x10}, 1, 0},
{0xC5, (uint8_t []){0x37}, 1, 0},
{0xC6, (uint8_t []){0xA9}, 1, 0},
{0xC7, (uint8_t []){0x41}, 1, 0},
{0xC8, (uint8_t []){0x01}, 1, 0},
{0xC9, (uint8_t []){0xA9}, 1, 0},
{0xCA, (uint8_t []){0x41}, 1, 0},
{0xCB, (uint8_t []){0x01}, 1, 0},
{0xD0, (uint8_t []){0x91}, 1, 0},
{0xD1, (uint8_t []){0x68}, 1, 0},
{0xD2, (uint8_t []){0x68}, 1, 0},
{0xF5, (uint8_t []){0x00, 0xA5}, 2, 0},
{0xDD, (uint8_t []){0x4F}, 1, 0},
{0xDE, (uint8_t []){0x4F}, 1, 0},
{0xF1, (uint8_t []){0x10}, 1, 0},
{0xF0, (uint8_t []){0x00}, 1, 0},
{0xF0, (uint8_t []){0x02}, 1, 0},
{0xE0, (uint8_t []){0xF0, 0x0A, 0x10, 0x09, 0x09, 0x36, 0x35, 0x33, 0x4A, 0x29, 0x15, 0x15, 0x2E, 0x34}, 14, 0},
{0xE1, (uint8_t []){0xF0, 0x0A, 0x0F, 0x08, 0x08, 0x05, 0x34, 0x33, 0x4A, 0x39, 0x15, 0x15, 0x2D, 0x33}, 14, 0},
{0xF0, (uint8_t []){0x10}, 1, 0},
{0xF3, (uint8_t []){0x10}, 1, 0},
{0xE0, (uint8_t []){0x07}, 1, 0},
{0xE1, (uint8_t []){0x00}, 1, 0},
{0xE2, (uint8_t []){0x00}, 1, 0},
{0xE3, (uint8_t []){0x00}, 1, 0},
{0xE4, (uint8_t []){0xE0}, 1, 0},
{0xE5, (uint8_t []){0x06}, 1, 0},
{0xE6, (uint8_t []){0x21}, 1, 0},
{0xE7, (uint8_t []){0x01}, 1, 0},
{0xE8, (uint8_t []){0x05}, 1, 0},
{0xE9, (uint8_t []){0x02}, 1, 0},
{0xEA, (uint8_t []){0xDA}, 1, 0},
{0xEB, (uint8_t []){0x00}, 1, 0},
{0xEC, (uint8_t []){0x00}, 1, 0},
{0xED, (uint8_t []){0x0F}, 1, 0},
{0xEE, (uint8_t []){0x00}, 1, 0},
{0xEF, (uint8_t []){0x00}, 1, 0},
{0xF8, (uint8_t []){0x00}, 1, 0},
{0xF9, (uint8_t []){0x00}, 1, 0},
{0xFA, (uint8_t []){0x00}, 1, 0},
{0xFB, (uint8_t []){0x00}, 1, 0},
{0xFC, (uint8_t []){0x00}, 1, 0},
{0xFD, (uint8_t []){0x00}, 1, 0},
{0xFE, (uint8_t []){0x00}, 1, 0},
{0xFF, (uint8_t []){0x00}, 1, 0},
{0x60, (uint8_t []){0x40}, 1, 0},
{0x61, (uint8_t []){0x04}, 1, 0},
{0x62, (uint8_t []){0x00}, 1, 0},
{0x63, (uint8_t []){0x42}, 1, 0},
{0x64, (uint8_t []){0xD9}, 1, 0},
{0x65, (uint8_t []){0x00}, 1, 0},
{0x66, (uint8_t []){0x00}, 1, 0},
{0x67, (uint8_t []){0x00}, 1, 0},
{0x68, (uint8_t []){0x00}, 1, 0},
{0x69, (uint8_t []){0x00}, 1, 0},
{0x6A, (uint8_t []){0x00}, 1, 0},
{0x6B, (uint8_t []){0x00}, 1, 0},
{0x70, (uint8_t []){0x40}, 1, 0},
{0x71, (uint8_t []){0x03}, 1, 0},
{0x72, (uint8_t []){0x00}, 1, 0},
{0x73, (uint8_t []){0x42}, 1, 0},
{0x74, (uint8_t []){0xD8}, 1, 0},
{0x75, (uint8_t []){0x00}, 1, 0},
{0x76, (uint8_t []){0x00}, 1, 0},
{0x77, (uint8_t []){0x00}, 1, 0},
{0x78, (uint8_t []){0x00}, 1, 0},
{0x79, (uint8_t []){0x00}, 1, 0},
{0x7A, (uint8_t []){0x00}, 1, 0},
{0x7B, (uint8_t []){0x00}, 1, 0},
{0x80, (uint8_t []){0x48}, 1, 0},
{0x81, (uint8_t []){0x00}, 1, 0},
{0x82, (uint8_t []){0x06}, 1, 0},
{0x83, (uint8_t []){0x02}, 1, 0},
{0x84, (uint8_t []){0xD6}, 1, 0},
{0x85, (uint8_t []){0x04}, 1, 0},
{0x86, (uint8_t []){0x00}, 1, 0},
{0x87, (uint8_t []){0x00}, 1, 0},
{0x88, (uint8_t []){0x48}, 1, 0},
{0x89, (uint8_t []){0x00}, 1, 0},
{0x8A, (uint8_t []){0x08}, 1, 0},
{0x8B, (uint8_t []){0x02}, 1, 0},
{0x8C, (uint8_t []){0xD8}, 1, 0},
{0x8D, (uint8_t []){0x04}, 1, 0},
{0x8E, (uint8_t []){0x00}, 1, 0},
{0x8F, (uint8_t []){0x00}, 1, 0},
{0x90, (uint8_t []){0x48}, 1, 0},
{0x91, (uint8_t []){0x00}, 1, 0},
{0x92, (uint8_t []){0x0A}, 1, 0},
{0x93, (uint8_t []){0x02}, 1, 0},
{0x94, (uint8_t []){0xDA}, 1, 0},
{0x95, (uint8_t []){0x04}, 1, 0},
{0x96, (uint8_t []){0x00}, 1, 0},
{0x97, (uint8_t []){0x00}, 1, 0},
{0x98, (uint8_t []){0x48}, 1, 0},
{0x99, (uint8_t []){0x00}, 1, 0},
{0x9A, (uint8_t []){0x0C}, 1, 0},
{0x9B, (uint8_t []){0x02}, 1, 0},
{0x9C, (uint8_t []){0xDC}, 1, 0},
{0x9D, (uint8_t []){0x04}, 1, 0},
{0x9E, (uint8_t []){0x00}, 1, 0},
{0x9F, (uint8_t []){0x00}, 1, 0},
{0xA0, (uint8_t []){0x48}, 1, 0},
{0xA1, (uint8_t []){0x00}, 1, 0},
{0xA2, (uint8_t []){0x05}, 1, 0},
{0xA3, (uint8_t []){0x02}, 1, 0},
{0xA4, (uint8_t []){0xD5}, 1, 0},
{0xA5, (uint8_t []){0x04}, 1, 0},
{0xA6, (uint8_t []){0x00}, 1, 0},
{0xA7, (uint8_t []){0x00}, 1, 0},
{0xA8, (uint8_t []){0x48}, 1, 0},
{0xA9, (uint8_t []){0x00}, 1, 0},
{0xAA, (uint8_t []){0x07}, 1, 0},
{0xAB, (uint8_t []){0x02}, 1, 0},
{0xAC, (uint8_t []){0xD7}, 1, 0},
{0xAD, (uint8_t []){0x04}, 1, 0},
{0xAE, (uint8_t []){0x00}, 1, 0},
{0xAF, (uint8_t []){0x00}, 1, 0},
{0xB0, (uint8_t []){0x48}, 1, 0},
{0xB1, (uint8_t []){0x00}, 1, 0},
{0xB2, (uint8_t []){0x09}, 1, 0},
{0xB3, (uint8_t []){0x02}, 1, 0},
{0xB4, (uint8_t []){0xD9}, 1, 0},
{0xB5, (uint8_t []){0x04}, 1, 0},
{0xB6, (uint8_t []){0x00}, 1, 0},
{0xB7, (uint8_t []){0x00}, 1, 0},
{0xB8, (uint8_t []){0x48}, 1, 0},
{0xB9, (uint8_t []){0x00}, 1, 0},
{0xBA, (uint8_t []){0x0B}, 1, 0},
{0xBB, (uint8_t []){0x02}, 1, 0},
{0xBC, (uint8_t []){0xDB}, 1, 0},
{0xBD, (uint8_t []){0x04}, 1, 0},
{0xBE, (uint8_t []){0x00}, 1, 0},
{0xBF, (uint8_t []){0x00}, 1, 0},
{0xC0, (uint8_t []){0x10}, 1, 0},
{0xC1, (uint8_t []){0x47}, 1, 0},
{0xC2, (uint8_t []){0x56}, 1, 0},
{0xC3, (uint8_t []){0x65}, 1, 0},
{0xC4, (uint8_t []){0x74}, 1, 0},
{0xC5, (uint8_t []){0x88}, 1, 0},
{0xC6, (uint8_t []){0x99}, 1, 0},
{0xC7, (uint8_t []){0x01}, 1, 0},
{0xC8, (uint8_t []){0xBB}, 1, 0},
{0xC9, (uint8_t []){0xAA}, 1, 0},
{0xD0, (uint8_t []){0x10}, 1, 0},
{0xD1, (uint8_t []){0x47}, 1, 0},
{0xD2, (uint8_t []){0x56}, 1, 0},
{0xD3, (uint8_t []){0x65}, 1, 0},
{0xD4, (uint8_t []){0x74}, 1, 0},
{0xD5, (uint8_t []){0x88}, 1, 0},
{0xD6, (uint8_t []){0x99}, 1, 0},
{0xD7, (uint8_t []){0x01}, 1, 0},
{0xD8, (uint8_t []){0xBB}, 1, 0},
{0xD9, (uint8_t []){0xAA}, 1, 0},
{0xF3, (uint8_t []){0x01}, 1, 0},
{0xF0, (uint8_t []){0x00}, 1, 0},
{0x21, (uint8_t []){0x00}, 1, 0},
{0x11, (uint8_t []){0x00}, 1, 120},
{0x29, (uint8_t []){0x00}, 1, 0},
};
void ST7701_Reset(){
Set_EXIO(TCA9554_EXIO2,false);
vTaskDelay(pdMS_TO_TICKS(10));
Set_EXIO(TCA9554_EXIO2,true);
vTaskDelay(pdMS_TO_TICKS(50));
}
void LCD_Init() {
ST77916_Init();
Backlight_Init();
Touch_Init();
}
static void test_draw_bitmap(esp_lcd_panel_handle_t panel_handle)
{
uint16_t row_line = ((EXAMPLE_LCD_WIDTH / EXAMPLE_LCD_COLOR_BITS) << 1) >> 1;
uint8_t byte_per_pixel = EXAMPLE_LCD_COLOR_BITS / 8;
uint8_t *color = (uint8_t *)heap_caps_calloc(1, row_line * EXAMPLE_LCD_HEIGHT * byte_per_pixel, MALLOC_CAP_DMA);
for (int j = 0; j < EXAMPLE_LCD_COLOR_BITS; j++) {
for (int i = 0; i < row_line * EXAMPLE_LCD_HEIGHT; i++) {
for (int k = 0; k < byte_per_pixel; k++) {
color[i * byte_per_pixel + k] = (SPI_SWAP_DATA_TX(BIT(j), EXAMPLE_LCD_COLOR_BITS) >> (k * 8)) & 0xff;
}
}
esp_lcd_panel_draw_bitmap(panel_handle, 0, j * row_line, EXAMPLE_LCD_HEIGHT, (j + 1) * row_line, color);
}
free(color);
}
int QSPI_Init(void){
static const spi_bus_config_t host_config = {
.data0_io_num = ESP_PANEL_LCD_SPI_IO_DATA0,
.data1_io_num = ESP_PANEL_LCD_SPI_IO_DATA1,
.sclk_io_num = ESP_PANEL_LCD_SPI_IO_SCK,
.data2_io_num = ESP_PANEL_LCD_SPI_IO_DATA2,
.data3_io_num = ESP_PANEL_LCD_SPI_IO_DATA3,
.data4_io_num = -1,
.data5_io_num = -1,
.data6_io_num = -1,
.data7_io_num = -1,
.max_transfer_sz = ESP_PANEL_HOST_SPI_MAX_TRANSFER_SIZE,
.flags = SPICOMMON_BUSFLAG_MASTER,
.intr_flags = 0,
};
if(spi_bus_initialize(ESP_PANEL_HOST_SPI_ID_DEFAULT, &host_config, SPI_DMA_CH_AUTO) != ESP_OK){
printf("The SPI initialization failed.\r\n");
return 0;
}
printf("The SPI initialization succeeded.\r\n");
esp_lcd_panel_io_spi_config_t io_config ={
.cs_gpio_num = ESP_PANEL_LCD_SPI_IO_CS,
.dc_gpio_num = -1,
.spi_mode = ESP_PANEL_LCD_SPI_MODE,
.pclk_hz = 3 * 1000 * 1000,
.trans_queue_depth = ESP_PANEL_LCD_SPI_TRANS_QUEUE_SZ,
.on_color_trans_done = NULL,
.user_ctx = NULL,
.lcd_cmd_bits = ESP_PANEL_LCD_SPI_CMD_BITS,
.lcd_param_bits = ESP_PANEL_LCD_SPI_PARAM_BITS,
.flags = {
.dc_low_on_data = 0,
.octal_mode = 0,
.quad_mode = 1,
.sio_mode = 0,
.lsb_first = 0,
.cs_high_active = 0,
},
};
esp_lcd_panel_io_handle_t io_handle = NULL;
if(esp_lcd_new_panel_io_spi((esp_lcd_spi_bus_handle_t)ESP_PANEL_HOST_SPI_ID_DEFAULT, &io_config, &io_handle) != ESP_OK){
printf("Failed to set LCD communication parameters -- SPI\r\n");
return 0;
}
printf("LCD communication parameters are set successfully -- SPI\r\n");
printf("Install LCD driver of st77916\r\n");
st77916_vendor_config_t vendor_config={
.flags = {
.use_qspi_interface = 1,
},
};
printf("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n");
esp_err_t ret;
int lcd_cmd = 0x04;
uint8_t register_data[4];
size_t param_size = sizeof(register_data);
lcd_cmd &= 0xff;
lcd_cmd <<= 8;
lcd_cmd |= LCD_OPCODE_READ_CMD << 24; // Use the read opcode instead of write
ret = esp_lcd_panel_io_rx_param(io_handle, lcd_cmd, register_data, param_size);
if (ret == ESP_OK) {
printf("Register 0x04 data: %02x %02x %02x %02x\n", register_data[0], register_data[1], register_data[2], register_data[3]);
} else {
printf("Failed to read register 0x04, error code: %d\n", ret);
}
// panel_io_spi_del(io_handle);
io_config.pclk_hz = ESP_PANEL_LCD_SPI_CLK_HZ;
if(esp_lcd_new_panel_io_spi((esp_lcd_spi_bus_handle_t)ESP_PANEL_HOST_SPI_ID_DEFAULT, &io_config, &io_handle) != ESP_OK){
printf("Failed to set LCD communication parameters -- SPI\r\n");
return 0;
}
printf("LCD communication parameters are set successfully -- SPI\r\n");
// Check register values and configure accordingly
if (register_data[0] == 0x00 && register_data[1] == 0x7F && register_data[2] == 0x7F && register_data[3] == 0x7F) {
// Handle the case where the register data matches this pattern
printf("Vendor-specific initialization for case 1.\n");
}
else if (register_data[0] == 0x00 && register_data[1] == 0x02 && register_data[2] == 0x7F && register_data[3] == 0x7F) {
// Provide vendor-specific initialization commands if register data matches this pattern
vendor_config.init_cmds = vendor_specific_init_new;
vendor_config.init_cmds_size = sizeof(vendor_specific_init_new) / sizeof(st77916_lcd_init_cmd_t);
printf("Vendor-specific initialization for case 2.\n");
}
printf("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n");
esp_lcd_panel_dev_config_t panel_config={
.reset_gpio_num = EXAMPLE_LCD_PIN_NUM_RST,
.rgb_ele_order = LCD_RGB_ELEMENT_ORDER_RGB,
// .data_endian = LCD_RGB_DATA_ENDIAN_LITTLE,
.bits_per_pixel = EXAMPLE_LCD_COLOR_BITS,
.flags = {
.reset_active_high = 0,
},
.vendor_config = (void *) &vendor_config,
};
esp_lcd_new_panel_st77916(io_handle, &panel_config, &panel_handle);
esp_lcd_panel_reset(panel_handle);
esp_lcd_panel_init(panel_handle);
// esp_lcd_panel_invert_color(panel_handle,false);
esp_lcd_panel_disp_on_off(panel_handle, true);
test_draw_bitmap(panel_handle);
return 1;
}
void ST77916_Init() {
ST7701_Reset();
if(!QSPI_Init()){
printf("ST77916 Failed to be initialized\r\n");
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Backlight program
uint8_t LCD_Backlight = 70;
static ledc_channel_config_t ledc_channel;
void Backlight_Init(void)
{
ESP_LOGI(TAG_LCD, "Turn off LCD backlight");
gpio_config_t bk_gpio_config = {
.mode = GPIO_MODE_OUTPUT,
.pin_bit_mask = 1ULL << EXAMPLE_LCD_PIN_NUM_BK_LIGHT
};
ESP_ERROR_CHECK(gpio_config(&bk_gpio_config));
ledc_timer_config_t ledc_timer = {
.duty_resolution = LEDC_TIMER_13_BIT,
.freq_hz = 5000,
.speed_mode = LEDC_LS_MODE,
.timer_num = LEDC_HS_TIMER,
.clk_cfg = LEDC_AUTO_CLK
};
ledc_timer_config(&ledc_timer);
ledc_channel.channel = LEDC_HS_CH0_CHANNEL;
ledc_channel.duty = 0;
ledc_channel.gpio_num = EXAMPLE_LCD_PIN_NUM_BK_LIGHT;
ledc_channel.speed_mode = LEDC_LS_MODE;
ledc_channel.timer_sel = LEDC_HS_TIMER;
ledc_channel_config(&ledc_channel);
ledc_fade_func_install(0);
Set_Backlight(LCD_Backlight); //0~100
}
void Set_Backlight(uint8_t Light)
{
if(Light > Backlight_MAX) Light = Backlight_MAX;
uint16_t Duty = LEDC_MAX_Duty-(81*(Backlight_MAX-Light));
if(Light == 0)
Duty = 0;
ledc_set_duty(ledc_channel.speed_mode, ledc_channel.channel, Duty);
ledc_update_duty(ledc_channel.speed_mode, ledc_channel.channel);
}
// end Backlight program
+70
View File
@@ -0,0 +1,70 @@
#pragma once
#include "esp_err.h"
#include "esp_log.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "driver/spi_master.h"
#include "esp_timer.h"
#include "esp_lcd_panel_io.h"
#include "esp_lcd_panel_io_interface.h"
#include "esp_intr_alloc.h"
#include "esp_lcd_panel_ops.h"
#include "esp_lcd_panel_vendor.h"
#include "lvgl.h"
#include "driver/ledc.h"
#include "esp_lcd_st77916.h"
#include "CST816.h"
#include "LVGL_Driver.h"
#include "TCA9554PWR.h"
#define EXAMPLE_LCD_WIDTH (360)
#define EXAMPLE_LCD_HEIGHT (360)
#define EXAMPLE_LCD_COLOR_BITS (16)
#define ESP_PANEL_HOST_SPI_ID_DEFAULT (SPI2_HOST)
#define ESP_PANEL_LCD_SPI_MODE (0) // 0/1/2/3, typically set to 0
#define ESP_PANEL_LCD_SPI_CLK_HZ (80 * 1000 * 1000) // Should be an integer divisor of 80M, typically set to 40M
#define ESP_PANEL_LCD_SPI_TRANS_QUEUE_SZ (10) // Typically set to 10
#define ESP_PANEL_LCD_SPI_CMD_BITS (32) // Typically set to 32
#define ESP_PANEL_LCD_SPI_PARAM_BITS (8) // Typically set to 8
#define ESP_PANEL_LCD_SPI_IO_TE (18)
#define ESP_PANEL_LCD_SPI_IO_SCK (40)
#define ESP_PANEL_LCD_SPI_IO_DATA0 (46)
#define ESP_PANEL_LCD_SPI_IO_DATA1 (45)
#define ESP_PANEL_LCD_SPI_IO_DATA2 (42)
#define ESP_PANEL_LCD_SPI_IO_DATA3 (41)
#define ESP_PANEL_LCD_SPI_IO_CS (21)
#define EXAMPLE_LCD_PIN_NUM_RST (-1) // EXIO2
#define EXAMPLE_LCD_PIN_NUM_BK_LIGHT (5)
#define EXAMPLE_LCD_BK_LIGHT_ON_LEVEL (1)
#define EXAMPLE_LCD_BK_LIGHT_OFF_LEVEL !EXAMPLE_LCD_BK_LIGHT_ON_LEVEL
#define ESP_PANEL_HOST_SPI_MAX_TRANSFER_SIZE (2048)
#define LEDC_HS_TIMER LEDC_TIMER_0
#define LEDC_LS_MODE LEDC_LOW_SPEED_MODE
#define LEDC_HS_CH0_GPIO EXAMPLE_LCD_PIN_NUM_BK_LIGHT
#define LEDC_HS_CH0_CHANNEL LEDC_CHANNEL_0
#define LEDC_TEST_DUTY (4000)
#define LEDC_ResolutionRatio LEDC_TIMER_13_BIT
#define LEDC_MAX_Duty ((1 << LEDC_ResolutionRatio) - 1)
#define Backlight_MAX 100
extern esp_lcd_panel_handle_t panel_handle;
extern uint8_t LCD_Backlight;
void ST77916_Init();
void LCD_Init(void); // Call this function to initialize the screen (must be called in the main function) !!!!!
void LCD_addWindow(uint16_t Xstart, uint16_t Ystart, uint16_t Xend, uint16_t Yend,uint16_t* color);
void Backlight_Init(void); // Initialize the LCD backlight, which has been called in the LCD_Init function, ignore it
void Set_Backlight(uint8_t Light); // Call this function to adjust the brightness of the backlight. The value of the parameter Light ranges from 0 to 100
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,114 @@
/*
* SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
#pragma once
#include <stdint.h>
#include "esp_lcd_panel_vendor.h"
#ifdef __cplusplus
extern "C" {
#endif
/**
* @brief LCD panel initialization commands.
*
*/
typedef struct {
int cmd; /*<! The specific LCD command */
const void *data; /*<! Buffer that holds the command specific data */
size_t data_bytes; /*<! Size of `data` in memory, in bytes */
unsigned int delay_ms; /*<! Delay in milliseconds after this command */
} st77916_lcd_init_cmd_t;
/**
* @brief LCD panel vendor configuration.
*
* @note This structure can be used to select interface type and override default initialization commands.
* @note This structure needs to be passed to the `vendor_config` field in `esp_lcd_panel_dev_config_t`.
*
*/
typedef struct {
const st77916_lcd_init_cmd_t *init_cmds; /*!< Pointer to initialization commands array.
* The array should be declared as `static const` and positioned outside the function.
* Please refer to `vendor_specific_init_default` in source file
*/
uint16_t init_cmds_size; /*<! Number of commands in above array */
struct {
unsigned int use_qspi_interface: 1; /*<! Set to 1 if use QSPI interface, default is SPI interface */
} flags;
} st77916_vendor_config_t;
/**
* @brief Create LCD panel for model ST77916
*
* @param[in] io LCD panel IO handle
* @param[in] panel_dev_config General panel device configuration (Use `vendor_config` to select QSPI interface or override default initialization commands)
* @param[out] ret_panel Returned LCD panel handle
* @return
* - ESP_OK: Success
* - Otherwise: Fail
*/
esp_err_t esp_lcd_new_panel_st77916(const esp_lcd_panel_io_handle_t io, const esp_lcd_panel_dev_config_t *panel_dev_config, esp_lcd_panel_handle_t *ret_panel);
/**
* @brief LCD panel bus configuration structure
*
*/
#define ST77916_PANEL_BUS_SPI_CONFIG(sclk, mosi, max_trans_sz) \
{ \
.sclk_io_num = sclk, \
.mosi_io_num = mosi, \
.miso_io_num = -1, \
.quadhd_io_num = -1, \
.quadwp_io_num = -1, \
.max_transfer_sz = max_trans_sz, \
}
#define ST77916_PANEL_BUS_QSPI_CONFIG(sclk, d0, d1, d2, d3, max_trans_sz)\
{ \
.sclk_io_num = sclk, \
.data0_io_num = d0, \
.data1_io_num = d1, \
.data2_io_num = d2, \
.data3_io_num = d3, \
.max_transfer_sz = max_trans_sz, \
}
/**
* @brief LCD panel IO configuration structure
*
*/
#define ST77916_PANEL_IO_SPI_CONFIG(cs, dc, cb, cb_ctx) \
{ \
.cs_gpio_num = cs, \
.dc_gpio_num = dc, \
.spi_mode = 0, \
.pclk_hz = 40 * 1000 * 1000, \
.trans_queue_depth = 10, \
.on_color_trans_done = cb, \
.user_ctx = cb_ctx, \
.lcd_cmd_bits = 8, \
.lcd_param_bits = 8, \
}
#define ST77916_PANEL_IO_QSPI_CONFIG(cs, cb, cb_ctx) \
{ \
.cs_gpio_num = cs, \
.dc_gpio_num = -1, \
.spi_mode = 0, \
.pclk_hz = 40 * 1000 * 1000, \
.trans_queue_depth = 10, \
.on_color_trans_done = cb, \
.user_ctx = cb_ctx, \
.lcd_cmd_bits = 32, \
.lcd_param_bits = 8, \
.flags = { \
.quad_mode = true, \
}, \
}
#ifdef __cplusplus
}
#endif
+127
View File
@@ -0,0 +1,127 @@
#include "LVGL_Driver.h"
static const char *TAG_LVGL = "LVGL";
lv_disp_draw_buf_t disp_buf; // contains internal graphic buffer(s) called draw buffer(s)
lv_disp_drv_t disp_drv; // contains callback functions
lv_indev_drv_t indev_drv;
void example_increase_lvgl_tick(void *arg)
{
/* Tell LVGL how many milliseconds has elapsed */
lv_tick_inc(EXAMPLE_LVGL_TICK_PERIOD_MS);
}
void example_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;
// copy a buffer's content to a specific area of the display
esp_lcd_panel_draw_bitmap(panel_handle, offsetx1, offsety1, offsetx2 +1, offsety2 + 1, color_map);
lv_disp_flush_ready(drv);
}
/*Read the touchpad*/
void example_touchpad_read( lv_indev_drv_t * drv, lv_indev_data_t * data )
{
uint16_t touchpad_x[5] = {0};
uint16_t touchpad_y[5] = {0};
uint8_t touchpad_cnt = 0;
/* Read touch controller data */
esp_lcd_touch_read_data(drv->user_data);
/* Get coordinates */
bool touchpad_pressed = esp_lcd_touch_get_coordinates(drv->user_data, touchpad_x, touchpad_y, NULL, &touchpad_cnt, 5);
// printf("CCCCCCCCCCCCC=%d \r\n",touchpad_cnt);
if (touchpad_pressed && touchpad_cnt > 0) {
data->point.x = touchpad_x[0];
data->point.y = touchpad_y[0];
data->state = LV_INDEV_STATE_PR;
// printf("X=%u Y=%u num=%d \r\n", data->point.x, data->point.y,touchpad_cnt);
} else {
data->state = LV_INDEV_STATE_REL;
}
}
/* Rotate display and touch, when rotated screen in LVGL. Called when driver parameters are updated. */
void example_lvgl_port_update_callback(lv_disp_drv_t *drv)
{
esp_lcd_panel_handle_t panel_handle = (esp_lcd_panel_handle_t) drv->user_data;
switch (drv->rotated) {
case LV_DISP_ROT_NONE:
// Rotate LCD display
esp_lcd_panel_swap_xy(panel_handle, false);
esp_lcd_panel_mirror(panel_handle, true, false);
break;
case LV_DISP_ROT_90:
// Rotate LCD display
esp_lcd_panel_swap_xy(panel_handle, true);
esp_lcd_panel_mirror(panel_handle, true, true);
break;
case LV_DISP_ROT_180:
// Rotate LCD display
esp_lcd_panel_swap_xy(panel_handle, false);
esp_lcd_panel_mirror(panel_handle, false, true);
break;
case LV_DISP_ROT_270:
// Rotate LCD display
esp_lcd_panel_swap_xy(panel_handle, true);
esp_lcd_panel_mirror(panel_handle, false, false);
break;
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
lv_disp_t *disp;
void LVGL_Init(void)
{
ESP_LOGI(TAG_LVGL, "Initialize LVGL library");
lv_init();
lv_color_t *buf1 = heap_caps_malloc(LVGL_BUF_LEN * sizeof(lv_color_t), MALLOC_CAP_SPIRAM);
assert(buf1);
lv_color_t *buf2 = heap_caps_malloc(LVGL_BUF_LEN * sizeof(lv_color_t) , MALLOC_CAP_SPIRAM);
assert(buf2);
lv_disp_draw_buf_init(&disp_buf, buf1, buf2, LVGL_BUF_LEN); // initialize LVGL draw buffers
ESP_LOGI(TAG_LVGL, "Register display driver to LVGL");
lv_disp_drv_init(&disp_drv); // Create a new screen object and initialize the associated device
disp_drv.hor_res = EXAMPLE_LCD_WIDTH;
disp_drv.ver_res = EXAMPLE_LCD_HEIGHT; // Horizontal pixel count
// disp_drv.rotated = LV_DISP_ROT_90; // 图像旋转 // Vertical axis pixel count
disp_drv.flush_cb = example_lvgl_flush_cb; // Function : copy a buffer's content to a specific area of the display
disp_drv.drv_update_cb = example_lvgl_port_update_callback; // Function : Rotate display and touch, when rotated screen in LVGL. Called when driver parameters are updated.
disp_drv.draw_buf = &disp_buf; // LVGL will use this buffer(s) to draw the screens contents
disp_drv.user_data = panel_handle;
ESP_LOGI(TAG_LVGL,"Register display indev to LVGL"); // Custom display driver user data
disp = lv_disp_drv_register(&disp_drv);
lv_indev_drv_init ( &indev_drv );
indev_drv.type = LV_INDEV_TYPE_POINTER;
indev_drv.disp = disp;
indev_drv.read_cb = example_touchpad_read;
indev_drv.user_data = tp;
lv_indev_drv_register( &indev_drv );
/********************* LVGL *********************/
ESP_LOGI(TAG_LVGL, "Install LVGL tick timer");
// Tick interface for LVGL (using esp_timer to generate 2ms periodic event)
const esp_timer_create_args_t lvgl_tick_timer_args = {
.callback = &example_increase_lvgl_tick,
.name = "lvgl_tick"
};
esp_timer_handle_t lvgl_tick_timer = NULL;
ESP_ERROR_CHECK(esp_timer_create(&lvgl_tick_timer_args, &lvgl_tick_timer));
ESP_ERROR_CHECK(esp_timer_start_periodic(lvgl_tick_timer, EXAMPLE_LVGL_TICK_PERIOD_MS * 1000));
}
+25
View File
@@ -0,0 +1,25 @@
#pragma once
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_timer.h"
#include "esp_err.h"
#include "esp_log.h"
#include "lvgl.h"
#include "demos/lv_demos.h"
#include "ST77916.h"
#define LVGL_BUF_LEN (EXAMPLE_LCD_WIDTH * EXAMPLE_LCD_HEIGHT / 20)
#define EXAMPLE_LVGL_TICK_PERIOD_MS 2
extern lv_disp_draw_buf_t disp_buf; // contains internal graphic buffer(s) called draw buffer(s)
extern lv_disp_drv_t disp_drv; // contains callback functions
extern lv_disp_t *disp;
void example_lvgl_flush_cb(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t *color_map);
/* Rotate display and touch, when rotated screen in LVGL. Called when driver parameters are updated. */
void example_lvgl_port_update_callback(lv_disp_drv_t *drv);
void example_increase_lvgl_tick(void *arg);
void LVGL_Init(void); // Call this function to initialize the screen (must be called in the main function) !!!!!
+360
View File
@@ -0,0 +1,360 @@
#include "LVGL_Example.h"
#include "LVGL_Music.h"
#include <demos/lv_demos.h>
// #include <demos/music/lv_demo_music_main.h>
// #include <demos/music/lv_demo_music_list.h>
/**********************
* TYPEDEFS
**********************/
typedef enum {
DISP_SMALL,
DISP_MEDIUM,
DISP_LARGE,
} disp_size_t;
/**********************
* STATIC PROTOTYPES
**********************/
static void Onboard_create(lv_obj_t * parent);
static void Music_create(lv_obj_t * parent);
static void ta_event_cb(lv_event_t * e);
void example1_increase_lvgl_tick(lv_timer_t * t);
/**********************
* STATIC VARIABLES
**********************/
static disp_size_t disp_size;
static lv_obj_t * tv;
// static lv_obj_t * calendar;
lv_style_t style_text_muted;
lv_style_t style_title;
static lv_style_t style_icon;
static lv_style_t style_bullet;
static const lv_font_t * font_large;
static const lv_font_t * font_normal;
static lv_timer_t * auto_step_timer;
static lv_color_t original_screen_bg_color;
static lv_timer_t * meter2_timer;
lv_obj_t * SD_Size;
lv_obj_t * FlashSize;
lv_obj_t * BAT_Volts;
lv_obj_t * Board_angle;
lv_obj_t * RTC_Time;
lv_obj_t * Wireless_Scan;
lv_obj_t * Backlight_slider;
void auto_switch(lv_timer_t * t)
{
uint16_t page = lv_tabview_get_tab_act(tv);
if (page == 0) {
lv_tabview_set_act(tv, 1, LV_ANIM_ON);
} else if (page == 3) {
lv_tabview_set_act(tv, 2, LV_ANIM_ON);
}
}
void Lvgl_Example1(void){
disp_size = DISP_SMALL;
font_large = LV_FONT_DEFAULT;
font_normal = LV_FONT_DEFAULT;
lv_coord_t tab_h;
tab_h = 45;
#if LV_FONT_MONTSERRAT_18
font_large = &lv_font_montserrat_18;
#else
LV_LOG_WARN("LV_FONT_MONTSERRAT_18 is not enabled for the widgets demo. Using LV_FONT_DEFAULT instead.");
#endif
#if LV_FONT_MONTSERRAT_12
font_normal = &lv_font_montserrat_12;
#else
LV_LOG_WARN("LV_FONT_MONTSERRAT_12 is not enabled for the widgets demo. Using LV_FONT_DEFAULT instead.");
#endif
lv_style_init(&style_text_muted);
lv_style_set_text_opa(&style_text_muted, LV_OPA_90);
lv_style_init(&style_title);
lv_style_set_text_font(&style_title, font_large);
lv_style_init(&style_icon);
lv_style_set_text_color(&style_icon, lv_theme_get_color_primary(NULL));
lv_style_set_text_font(&style_icon, font_large);
lv_style_init(&style_bullet);
lv_style_set_border_width(&style_bullet, 0);
lv_style_set_radius(&style_bullet, LV_RADIUS_CIRCLE);
tv = lv_tabview_create(lv_scr_act(), LV_DIR_TOP, tab_h);
lv_obj_set_style_text_font(lv_scr_act(), font_normal, 0);
if(disp_size == DISP_LARGE) {
lv_obj_t * tab_btns = lv_tabview_get_tab_btns(tv);
lv_obj_set_style_pad_left(tab_btns, LV_HOR_RES / 2, 0);
lv_obj_t * logo = lv_img_create(tab_btns);
LV_IMG_DECLARE(img_lvgl_logo);
lv_img_set_src(logo, &img_lvgl_logo);
lv_obj_align(logo, LV_ALIGN_LEFT_MID, -LV_HOR_RES / 2 + 25, 0);
lv_obj_t * label = lv_label_create(tab_btns);
lv_obj_add_style(label, &style_title, 0);
lv_label_set_text(label, "LVGL v8");
lv_obj_align_to(label, logo, LV_ALIGN_OUT_RIGHT_TOP, 10, 0);
label = lv_label_create(tab_btns);
lv_label_set_text(label, "Widgets demo");
lv_obj_add_style(label, &style_text_muted, 0);
lv_obj_align_to(label, logo, LV_ALIGN_OUT_RIGHT_BOTTOM, 10, 0);
}
lv_obj_t * t0 = lv_tabview_add_tab(tv, " ");
lv_obj_t * t1 = lv_tabview_add_tab(tv, "Onboard");
lv_obj_t * t2 = lv_tabview_add_tab(tv, "music");
lv_obj_t * t3 = lv_tabview_add_tab(tv, " ");
LV_UNUSED(t0);
LV_UNUSED(t3);
Onboard_create(t1);
Music_create(t2);
lv_timer_create(auto_switch, 100, NULL);
}
void Lvgl_Example1_close(void)
{
/*Delete all animation*/
lv_anim_del(NULL, NULL);
lv_timer_del(meter2_timer);
meter2_timer = NULL;
lv_obj_clean(lv_scr_act());
lv_style_reset(&style_text_muted);
lv_style_reset(&style_title);
lv_style_reset(&style_icon);
lv_style_reset(&style_bullet);
}
/**********************
* STATIC FUNCTIONS
**********************/
static void Onboard_create(lv_obj_t * parent)
{
/*Create a panel*/
lv_obj_t * panel1 = lv_obj_create(parent);
lv_obj_set_height(panel1, LV_SIZE_CONTENT);
lv_obj_t * panel1_title = lv_label_create(panel1);
lv_label_set_text(panel1_title, "Onboard parameter");
lv_obj_add_style(panel1_title, &style_title, 0);
lv_obj_t * SD_label = lv_label_create(panel1);
lv_label_set_text(SD_label, "SD Card");
lv_obj_add_style(SD_label, &style_text_muted, 0);
SD_Size = lv_textarea_create(panel1);
lv_textarea_set_one_line(SD_Size, true);
lv_textarea_set_placeholder_text(SD_Size, "SD Size");
lv_obj_add_event_cb(SD_Size, ta_event_cb, LV_EVENT_ALL, NULL);
lv_obj_t * Flash_label = lv_label_create(panel1);
lv_label_set_text(Flash_label, "Flash Size");
lv_obj_add_style(Flash_label, &style_text_muted, 0);
FlashSize = lv_textarea_create(panel1);
lv_textarea_set_one_line(FlashSize, true);
lv_textarea_set_placeholder_text(FlashSize, "Flash Size");
lv_obj_add_event_cb(FlashSize, ta_event_cb, LV_EVENT_ALL, NULL);
lv_obj_t * BAT_label = lv_label_create(panel1);
lv_label_set_text(BAT_label, "Battery Voltage");
lv_obj_add_style(BAT_label, &style_text_muted, 0);
BAT_Volts = lv_textarea_create(panel1);
lv_textarea_set_one_line(BAT_Volts, true);
lv_textarea_set_placeholder_text(BAT_Volts, "BAT Volts");
lv_obj_add_event_cb(BAT_Volts, ta_event_cb, LV_EVENT_ALL, NULL);
lv_obj_t * angle_label = lv_label_create(panel1);
lv_label_set_text(angle_label, "Angular deflection");
lv_obj_add_style(angle_label, &style_text_muted, 0);
Board_angle = lv_textarea_create(panel1);
lv_textarea_set_one_line(Board_angle, true);
lv_textarea_set_placeholder_text(Board_angle, "Board angle");
lv_obj_add_event_cb(Board_angle, ta_event_cb, LV_EVENT_ALL, NULL);
lv_obj_t * Time_label = lv_label_create(panel1);
lv_label_set_text(Time_label, "RTC Time");
lv_obj_add_style(Time_label, &style_text_muted, 0);
RTC_Time = lv_textarea_create(panel1);
lv_textarea_set_one_line(RTC_Time, true);
lv_textarea_set_placeholder_text(RTC_Time, "Display time");
lv_obj_add_event_cb(RTC_Time, ta_event_cb, LV_EVENT_ALL, NULL);
lv_obj_t * Wireless_label = lv_label_create(panel1);
lv_label_set_text(Wireless_label, "Wireless scan");
lv_obj_add_style(Wireless_label, &style_text_muted, 0);
Wireless_Scan = lv_textarea_create(panel1);
lv_textarea_set_one_line(Wireless_Scan, true);
lv_textarea_set_placeholder_text(Wireless_Scan, "Wireless number");
lv_obj_add_event_cb(Wireless_Scan, ta_event_cb, LV_EVENT_ALL, NULL);
lv_obj_t * Backlight_label = lv_label_create(panel1);
lv_label_set_text(Backlight_label, "Backlight brightness");
lv_obj_add_style(Backlight_label, &style_text_muted, 0);
Backlight_slider = lv_slider_create(panel1);
lv_obj_add_flag(Backlight_slider, LV_OBJ_FLAG_CLICKABLE);
lv_obj_set_size(Backlight_slider, 200, 35);
lv_obj_set_style_radius(Backlight_slider, 3, LV_PART_KNOB); // Adjust the value for more or less rounding
lv_obj_set_style_bg_opa(Backlight_slider, LV_OPA_TRANSP, LV_PART_KNOB);
// lv_obj_set_style_pad_all(Backlight_slider, 0, LV_PART_KNOB);
lv_obj_set_style_bg_color(Backlight_slider, lv_color_hex(0xAAAAAA), LV_PART_KNOB);
lv_obj_set_style_bg_color(Backlight_slider, lv_color_hex(0xFFFFFF), LV_PART_INDICATOR);
lv_obj_set_style_outline_width(Backlight_slider, 2, LV_PART_INDICATOR);
lv_obj_set_style_outline_color(Backlight_slider, lv_color_hex(0xD3D3D3), LV_PART_INDICATOR);
lv_slider_set_range(Backlight_slider, 5, Backlight_MAX);
lv_slider_set_value(Backlight_slider, LCD_Backlight, LV_ANIM_ON);
lv_obj_add_event_cb(Backlight_slider, Backlight_adjustment_event_cb, LV_EVENT_VALUE_CHANGED, NULL);
static lv_coord_t grid_main_col_dsc[] = {LV_GRID_FR(1), LV_GRID_TEMPLATE_LAST};
static lv_coord_t grid_main_row_dsc[] = {LV_GRID_CONTENT, LV_GRID_CONTENT, LV_GRID_CONTENT, LV_GRID_TEMPLATE_LAST};
lv_obj_set_grid_dsc_array(parent, grid_main_col_dsc, grid_main_row_dsc);
/*Create the top panel*/
static lv_coord_t grid_1_col_dsc[] = {LV_GRID_CONTENT, LV_GRID_FR(1), LV_GRID_TEMPLATE_LAST};
static lv_coord_t grid_1_row_dsc[] = {LV_GRID_CONTENT, /*Avatar*/
LV_GRID_CONTENT, /*Name*/
LV_GRID_CONTENT, /*Description*/
LV_GRID_CONTENT, /*Email*/
LV_GRID_CONTENT, /*Phone number*/
LV_GRID_CONTENT, /*Button1*/
LV_GRID_CONTENT, /*Button2*/
LV_GRID_TEMPLATE_LAST
};
lv_obj_set_grid_dsc_array(panel1, grid_1_col_dsc, grid_1_row_dsc);
/*Create the top panel*/
static lv_coord_t grid_2_col_dsc[] = {LV_GRID_FR(1), LV_GRID_FR(5), LV_GRID_FR(1), LV_GRID_TEMPLATE_LAST};
static lv_coord_t grid_2_row_dsc[] = {
LV_GRID_CONTENT, /*Title*/
5, /*Separator*/
LV_GRID_CONTENT, /*Box title*/
40, /*Box*/
LV_GRID_CONTENT, /*Box title*/
40, /*Box*/
LV_GRID_CONTENT, /*Box title*/
40, /*Box*/
LV_GRID_CONTENT, /*Box title*/
40, /*Box*/
LV_GRID_CONTENT, /*Box title*/
40, /*Box*/
LV_GRID_CONTENT, /*Box title*/
40, /*Box*/
LV_GRID_CONTENT, /*Box title*/
40, /*Box*/
LV_GRID_TEMPLATE_LAST
};
lv_obj_set_grid_cell(panel1, LV_GRID_ALIGN_STRETCH, 0, 1, LV_GRID_ALIGN_START, 0, 1);
lv_obj_set_grid_dsc_array(panel1, grid_2_col_dsc, grid_2_row_dsc);
lv_obj_set_grid_cell(panel1_title, LV_GRID_ALIGN_START, 1, 1, LV_GRID_ALIGN_CENTER, 0, 1);
lv_obj_set_grid_cell(SD_label, LV_GRID_ALIGN_START, 1, 1, LV_GRID_ALIGN_START, 2, 1);
lv_obj_set_grid_cell(SD_Size, LV_GRID_ALIGN_STRETCH, 1, 1, LV_GRID_ALIGN_CENTER, 3, 1);
lv_obj_set_grid_cell(Flash_label, LV_GRID_ALIGN_START, 1, 1, LV_GRID_ALIGN_START, 4, 1);
lv_obj_set_grid_cell(FlashSize, LV_GRID_ALIGN_STRETCH, 1, 1, LV_GRID_ALIGN_CENTER, 5, 1);
lv_obj_set_grid_cell(BAT_label, LV_GRID_ALIGN_START, 1, 1, LV_GRID_ALIGN_START, 6, 1);
lv_obj_set_grid_cell(BAT_Volts, LV_GRID_ALIGN_STRETCH, 1, 1, LV_GRID_ALIGN_CENTER, 7, 1);
lv_obj_set_grid_cell(angle_label, LV_GRID_ALIGN_START, 1, 1, LV_GRID_ALIGN_START, 8, 1);
lv_obj_set_grid_cell(Board_angle, LV_GRID_ALIGN_STRETCH, 1, 1, LV_GRID_ALIGN_CENTER, 9, 1);
lv_obj_set_grid_cell(Time_label, LV_GRID_ALIGN_START, 1, 1, LV_GRID_ALIGN_START, 10, 1);
lv_obj_set_grid_cell(RTC_Time, LV_GRID_ALIGN_STRETCH, 1, 1, LV_GRID_ALIGN_CENTER, 11, 1);
lv_obj_set_grid_cell(Wireless_label, LV_GRID_ALIGN_START, 1, 1, LV_GRID_ALIGN_START, 12, 1);
lv_obj_set_grid_cell(Wireless_Scan, LV_GRID_ALIGN_STRETCH, 1, 1, LV_GRID_ALIGN_CENTER, 13, 1);
lv_obj_set_grid_cell(Backlight_label, LV_GRID_ALIGN_START, 1, 1, LV_GRID_ALIGN_START, 14, 1);
lv_obj_set_grid_cell(Backlight_slider, LV_GRID_ALIGN_STRETCH, 1, 1, LV_GRID_ALIGN_CENTER, 15, 1);
auto_step_timer = lv_timer_create(example1_increase_lvgl_tick, 100, NULL);
}
void example1_increase_lvgl_tick(lv_timer_t * t)
{
char buf[100];
snprintf(buf, sizeof(buf), "%ld MB\r\n", SDCard_Size);
lv_textarea_set_placeholder_text(SD_Size, buf);
snprintf(buf, sizeof(buf), "%ld MB\r\n", Flash_Size);
lv_textarea_set_placeholder_text(FlashSize, buf);
snprintf(buf, sizeof(buf), "%.2f V\r\n", BAT_analogVolts);
lv_textarea_set_placeholder_text(BAT_Volts, buf);
snprintf(buf, sizeof(buf), "X:%.2f Y:%.2f Z:%.2f\r\n", Accel.x, Accel.y, Accel.z);
lv_textarea_set_placeholder_text(Board_angle, buf);
snprintf(buf, sizeof(buf), "%d.%d.%d %d:%d:%d\r\n",datetime.year,datetime.month,datetime.day,datetime.hour,datetime.minute,datetime.second);
lv_textarea_set_placeholder_text(RTC_Time, buf);
if(Scan_finish)
// snprintf(buf, sizeof(buf), "WIFI: %d BLE: %d ..Scan Finish.\r\n",WIFI_NUM,BLE_NUM);
snprintf(buf, sizeof(buf), "WIFI: %d ..Scan Finish.\r\n",WIFI_NUM);
else
snprintf(buf, sizeof(buf), "WIFI: %d \r\n",WIFI_NUM);
// snprintf(buf, sizeof(buf), "WIFI: %d BLE: %d\r\n",WIFI_NUM,BLE_NUM);
lv_textarea_set_placeholder_text(Wireless_Scan, buf);
lv_slider_set_value(Backlight_slider, LCD_Backlight, LV_ANIM_ON);
LVGL_Backlight_adjustment(LCD_Backlight);
}
static void Music_create(lv_obj_t * parent)
{
original_screen_bg_color = lv_obj_get_style_bg_color(parent, 0);
lv_obj_set_style_bg_color(parent, lv_color_hex(0x343247), 0);
_lv_demo_music_main_create(parent);
}
void Backlight_adjustment_event_cb(lv_event_t * e) {
uint8_t Backlight = lv_slider_get_value(lv_event_get_target(e));
if (Backlight <= Backlight_MAX) {
lv_slider_set_value(Backlight_slider, Backlight, LV_ANIM_ON);
LCD_Backlight = Backlight;
LVGL_Backlight_adjustment(Backlight);
}
else
printf("Volume out of range: %d\n", Backlight);
}
static void ta_event_cb(lv_event_t * e)
{
}
void LVGL_Backlight_adjustment(uint8_t Backlight) {
Set_Backlight(Backlight);
}
+19
View File
@@ -0,0 +1,19 @@
#pragma once
#include "lvgl.h"
#include "demos/lv_demos.h"
#include "LVGL_Driver.h"
#include "PCF85063.h"
#include "QMI8658.h"
#include "SD_MMC.h"
#include "BAT_Driver.h"
#include "Wireless.h"
#define EXAMPLE1_LVGL_TICK_PERIOD_MS 1000
void Backlight_adjustment_event_cb(lv_event_t * e);
void Lvgl_Example1(void);
void LVGL_Backlight_adjustment(uint8_t Backlight);
+813
View File
@@ -0,0 +1,813 @@
#include "LVGL_Music.h"
#include <demos/music/assets/spectrum_1.h>
#include <demos/music/assets/spectrum_2.h>
#include <demos/music/assets/spectrum_3.h>
/*********************
* DEFINES
*********************/
#define INTRO_TIME 2000
#define BAR_COLOR1 lv_color_hex(0xe9dbfc)
#define BAR_COLOR2 lv_color_hex(0x6f8af6)
#define BAR_COLOR3 lv_color_hex(0xffffff)
#if LV_DEMO_MUSIC_LARGE
#define BAR_COLOR1_STOP 160
#define BAR_COLOR2_STOP 200
#else
#define BAR_COLOR1_STOP 80
#define BAR_COLOR2_STOP 100
#endif
#define BAR_COLOR3_STOP (2 * LV_HOR_RES / 3)
#define BAR_CNT 20
#define DEG_STEP (180/BAR_CNT)
#define BAND_CNT 4
#define BAR_PER_BAND_CNT (BAR_CNT / BAND_CNT)
/**********************
* STATIC VARIABLES
**********************/
lv_style_t music_style;
lv_style_t parts_style;
lv_obj_t * panel1;
lv_obj_t * panel2;
static lv_obj_t * main_cont;
static lv_obj_t * spectrum_obj;
static lv_obj_t * title_label;
static lv_obj_t * album_img_obj;
static uint32_t time_act;
static lv_timer_t * sec_counter_timer;
static const lv_font_t * font_small;
static const lv_font_t * font_large;
static bool Playing_Flag;
static uint32_t track_id;
static lv_obj_t * play_obj;
static const uint16_t (* spectrum)[4];
static uint32_t spectrum_len;
lv_obj_t * Music_img;
char SD_Name[100][100] ;
char File_Name[100][100] ;
char Audio_Name[100] ;
uint16_t ACTIVE_TRACK_CNT;
uint16_t Audio_energy;
static lv_obj_t * list;
static lv_style_t style_btn_round;
static lv_style_t style_btn_pr;
static lv_style_t style_btn_play;
static lv_style_t style_btn_stop;
static lv_style_t style_title;
static bool first_Flag = false;
LV_IMG_DECLARE(img_lv_demo_music_btn_list_play);
LV_IMG_DECLARE(img_lv_demo_music_btn_list_pause);
void refresh_screen() {
lv_obj_t *screen = lv_scr_act();
lv_obj_invalidate(screen);
}
/*
* Callback adapter function to convert parameter types to avoid compile-time
* warning.
*/
void _img_set_zoom_anim_cb(void * obj, int32_t zoom)
{
lv_img_set_zoom((lv_obj_t *)obj, (uint16_t)zoom);
}
/*
* Callback adapter function to convert parameter types to avoid compile-time
* warning.
*/
void _obj_set_x_anim_cb(void * obj, int32_t x)
{
lv_obj_set_x((lv_obj_t *)obj, (lv_coord_t)x);
}
lv_obj_t * _lv_demo_music_main_create(lv_obj_t * parent)
{
LVGL_Search_Music();
if(ACTIVE_TRACK_CNT) {
lv_style_init(&music_style);
lv_style_set_text_font(&music_style, font_large);
font_small = &lv_font_montserrat_12;
font_large = &lv_font_montserrat_16;
// 1
panel1 = lv_obj_create(parent);
lv_obj_set_height(panel1, LV_SIZE_CONTENT);
lv_obj_t * cont = create_cont(panel1);
create_wave_images(cont);
spectrum_obj = create_spectrum_obj(panel1);
lv_obj_add_style(spectrum_obj, &music_style, 0);
lv_obj_t * title_box = create_title_box(panel1);
lv_obj_add_style(title_box, &music_style, 0);
lv_obj_t * ctrl_box = create_ctrl_box(panel1);
lv_obj_add_style(ctrl_box, &music_style, 0);
static lv_coord_t grid_main_col_dsc[] = {LV_GRID_FR(1), LV_GRID_TEMPLATE_LAST};
static lv_coord_t grid_main_row_dsc[] = {LV_GRID_CONTENT, LV_GRID_CONTENT, LV_GRID_CONTENT, LV_GRID_TEMPLATE_LAST};
lv_obj_set_grid_dsc_array(parent, grid_main_col_dsc, grid_main_row_dsc);
/*Create the top panel*/
static lv_coord_t grid_1_col_dsc[] = {LV_GRID_CONTENT, LV_GRID_FR(1), LV_GRID_TEMPLATE_LAST};
static lv_coord_t grid_1_row_dsc[] = {
LV_GRID_CONTENT, /*title_box*/
LV_GRID_CONTENT, /*cont*/
170, /*spectrum_obj*/
LV_GRID_CONTENT, /*ctrl_box*/
LV_GRID_CONTENT, /*handle_box*/
LV_GRID_CONTENT, /*Button2*/
LV_GRID_TEMPLATE_LAST
};
lv_obj_set_grid_cell(panel1, LV_GRID_ALIGN_STRETCH, 0, 1, LV_GRID_ALIGN_START, 0, 1);
lv_obj_set_grid_dsc_array(panel1, grid_1_col_dsc, grid_1_row_dsc);
lv_obj_set_grid_cell(title_box , LV_GRID_ALIGN_STRETCH, 0, 2, LV_GRID_ALIGN_CENTER, 0, 1);
lv_obj_set_grid_cell(cont , LV_GRID_ALIGN_STRETCH, 1, 1, LV_GRID_ALIGN_CENTER, 1, 1);
lv_obj_set_grid_cell(spectrum_obj , LV_GRID_ALIGN_STRETCH, 0, 2, LV_GRID_ALIGN_CENTER, 2, 1);
lv_obj_set_grid_cell(ctrl_box , LV_GRID_ALIGN_STRETCH, 0, 2, LV_GRID_ALIGN_CENTER, 3, 1);
// 2
panel2 = lv_obj_create(parent);
lv_obj_set_height(panel2, LV_SIZE_CONTENT);
lv_obj_t * list_box = create_List_box(panel2);
lv_obj_set_size(list_box, LV_SIZE_CONTENT, LV_SIZE_CONTENT);
// lv_obj_add_style(list_box, &music_style, 0);
static lv_coord_t grid_2_col_dsc[] = {LV_GRID_FR(1),LV_GRID_FR(1), LV_GRID_TEMPLATE_LAST};
static lv_coord_t grid_2_row_dsc[] = {
LV_GRID_CONTENT, /*list_box*/
LV_GRID_TEMPLATE_LAST
};
lv_obj_set_grid_cell(panel2, LV_GRID_ALIGN_STRETCH, 0, 1, LV_GRID_ALIGN_START, 1, 1);
lv_obj_set_grid_dsc_array(panel2, grid_2_col_dsc, grid_2_row_dsc);
lv_obj_set_grid_cell(list_box , LV_GRID_ALIGN_STRETCH, 0, 2, LV_GRID_ALIGN_CENTER, 0, 1);
lv_timer_create(timer_cb, 100, NULL);
lv_obj_fade_in(title_box, 500, INTRO_TIME - 1000);
lv_obj_fade_in(ctrl_box, 500, INTRO_TIME - 1000);
lv_obj_fade_in(album_img_obj, 300, INTRO_TIME - 1000);
lv_obj_fade_in(spectrum_obj, 0, INTRO_TIME - 1000);
}
else{
lv_obj_t *label = lv_label_create(parent);
lv_label_set_text(label, "No MP3 file found in SD card!");
// lv_obj_set_size(label, LV_PCT(100), LV_PCT(100));
lv_obj_set_size(label, LV_SIZE_CONTENT, LV_SIZE_CONTENT);
lv_obj_align(label, LV_ALIGN_CENTER, 0, 0);
lv_obj_set_style_text_align(label, LV_TEXT_ALIGN_CENTER, 0);
}
return main_cont;
}
/************************************************************************************************************************************
* create_title_box
************************************************************************************************************************************/
lv_obj_t * create_title_box(lv_obj_t * parent)
{
/*Create the titles*/
lv_obj_t * cont = lv_obj_create(parent);
lv_obj_remove_style_all(cont);
lv_obj_set_height(cont, LV_SIZE_CONTENT);
lv_obj_set_flex_flow(cont, LV_FLEX_FLOW_COLUMN);
lv_obj_set_flex_align(cont, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER);
title_label = lv_label_create(cont);
lv_obj_set_style_text_font(title_label, font_large, 0);
lv_obj_set_style_text_color(title_label, lv_color_hex(0x504d6d), 0);
lv_label_set_text(title_label, Audio_Name);
lv_obj_set_height(title_label, lv_font_get_line_height(font_large) );
return cont;
}
/************************************************************************************************************************************
* create_title_box END * create_title_box END * create_title_box END * create_title_box END
************************************************************************************************************************************/
/************************************************************************************************************************************
* create_cont * create_cont * create_cont * create_cont
************************************************************************************************************************************/
lv_obj_t * create_cont(lv_obj_t * parent)
{
/* */
/*A transparent container in which the player section will be scrolled*/
main_cont = lv_obj_create(parent);
lv_obj_clear_flag(main_cont, LV_OBJ_FLAG_CLICKABLE);
lv_obj_clear_flag(main_cont, LV_OBJ_FLAG_SCROLL_ELASTIC);
lv_obj_remove_style_all(main_cont); /*Make it transparent*/
lv_obj_set_size(main_cont, lv_pct(100), lv_pct(100));
lv_obj_set_scroll_snap_y(main_cont, LV_SCROLL_SNAP_CENTER); /*Snap the children to the center*/
/*Create a container for the player*/
lv_obj_t * player = lv_obj_create(main_cont);
lv_obj_set_y(player, - LV_DEMO_MUSIC_HANDLE_SIZE);
lv_obj_set_size(player, LV_HOR_RES, 2 * LV_VER_RES + LV_DEMO_MUSIC_HANDLE_SIZE * 2);
lv_obj_set_style_bg_color(player, lv_color_hex(0xffffff), 0);
lv_obj_set_style_border_width(player, 0, 0);
lv_obj_set_style_pad_all(player, 0, 0);
lv_obj_set_scroll_dir(player, LV_DIR_VER);
/* Transparent placeholders below the player container
* It is used only to snap it to center.*/
lv_obj_t * placeholder1 = lv_obj_create(main_cont);
lv_obj_remove_style_all(placeholder1);
lv_obj_clear_flag(placeholder1, LV_OBJ_FLAG_CLICKABLE);
lv_obj_t * placeholder2 = lv_obj_create(main_cont);
lv_obj_remove_style_all(placeholder2);
lv_obj_clear_flag(placeholder2, LV_OBJ_FLAG_CLICKABLE);
lv_obj_t * placeholder3 = lv_obj_create(main_cont);
lv_obj_remove_style_all(placeholder3);
lv_obj_clear_flag(placeholder3, LV_OBJ_FLAG_CLICKABLE);
lv_obj_set_size(placeholder1, lv_pct(100), LV_VER_RES);
lv_obj_set_y(placeholder1, 0);
lv_obj_set_size(placeholder2, lv_pct(100), LV_VER_RES);
lv_obj_set_y(placeholder2, LV_VER_RES);
lv_obj_set_size(placeholder3, lv_pct(100), LV_VER_RES - 2 * LV_DEMO_MUSIC_HANDLE_SIZE);
lv_obj_set_y(placeholder3, 2 * LV_VER_RES + LV_DEMO_MUSIC_HANDLE_SIZE);
lv_obj_update_layout(main_cont);
return player;
}
void create_wave_images(lv_obj_t * parent)
{
LV_IMG_DECLARE(img_lv_demo_music_wave_top);
LV_IMG_DECLARE(img_lv_demo_music_wave_bottom);
lv_obj_t * wave_top = lv_img_create(parent);
lv_img_set_src(wave_top, &img_lv_demo_music_wave_top);
lv_obj_set_width(wave_top, LV_HOR_RES);
lv_obj_align(wave_top, LV_ALIGN_TOP_MID, 0, 0);
lv_obj_add_flag(wave_top, LV_OBJ_FLAG_IGNORE_LAYOUT);
lv_obj_t * wave_bottom = lv_img_create(parent);
lv_img_set_src(wave_bottom, &img_lv_demo_music_wave_bottom);
lv_obj_set_width(wave_bottom, LV_HOR_RES);
lv_obj_align(wave_bottom, LV_ALIGN_BOTTOM_MID, 0, 0);
lv_obj_add_flag(wave_bottom, LV_OBJ_FLAG_IGNORE_LAYOUT);
LV_IMG_DECLARE(img_lv_demo_music_corner_left);
LV_IMG_DECLARE(img_lv_demo_music_corner_right);
lv_obj_t * wave_corner = lv_img_create(parent);
lv_img_set_src(wave_corner, &img_lv_demo_music_corner_left);
lv_obj_align(wave_corner, LV_ALIGN_BOTTOM_LEFT, -LV_HOR_RES / 6, 0);
lv_obj_add_flag(wave_corner, LV_OBJ_FLAG_IGNORE_LAYOUT);
wave_corner = lv_img_create(parent);
lv_img_set_src(wave_corner, &img_lv_demo_music_corner_right);
lv_obj_align(wave_corner, LV_ALIGN_BOTTOM_RIGHT, LV_HOR_RES / 6, 0);
lv_obj_add_flag(wave_corner, LV_OBJ_FLAG_IGNORE_LAYOUT);
}
/************************************************************************************************************************************
* create_cont END * create_cont END * create_cont END * create_cont END
************************************************************************************************************************************/
/************************************************************************************************************************************
* spectrum * spectrum * spectrum * spectrum
************************************************************************************************************************************/
lv_obj_t * create_spectrum_obj(lv_obj_t * parent)
{
/*Create the spectrum visualizer*/
lv_obj_t * obj = lv_obj_create(parent);
lv_obj_remove_style_all(obj);
lv_obj_set_height(obj, 250);
lv_obj_clear_flag(obj, LV_OBJ_FLAG_CLICKABLE | LV_OBJ_FLAG_SCROLLABLE);
lv_obj_refresh_ext_draw_size(obj);
album_img_obj = album_img_create(obj);
return obj;
}
lv_anim_t Music_img_animation;
uint16_t Music_img_angle = 0;
static void set_angle(void* img, int32_t v)
{
lv_img_set_angle(img, v);
}
static uint16_t get_angle(void* img)
{
uint16_t Angle = lv_img_get_angle(img);
return Angle;
}
void Start_animation() {
lv_anim_init(&Music_img_animation);
lv_anim_set_var(&Music_img_animation, Music_img);
lv_anim_set_exec_cb(&Music_img_animation, set_angle);
lv_anim_set_values(&Music_img_animation, Music_img_angle, 3550 + Music_img_angle);
lv_anim_set_time(&Music_img_animation, 7000);
lv_anim_set_repeat_count(&Music_img_animation, LV_ANIM_REPEAT_INFINITE);
lv_anim_start(&Music_img_animation);
}
void Stop_animation() {
Music_img_angle = get_angle(Music_img);
lv_anim_del(&Music_img_animation, set_angle);
}
lv_obj_t * album_img_create(lv_obj_t * parent)
{
LV_IMG_DECLARE(img_lv_demo_music_cover_1);
LV_IMG_DECLARE(img_lv_demo_music_cover_2);
LV_IMG_DECLARE(img_lv_demo_music_cover_3);
Music_img = lv_img_create(parent);
switch(track_id % 3) {
case 2:
lv_img_set_src(Music_img, &img_lv_demo_music_cover_3);
break;
case 1:
lv_img_set_src(Music_img, &img_lv_demo_music_cover_2);
break;
case 0:
lv_img_set_src(Music_img, &img_lv_demo_music_cover_1);
break;
}
spectrum = spectrum_3;
spectrum_len = sizeof(spectrum_3) / sizeof(spectrum_3[0]);
lv_img_set_antialias(Music_img, true);
lv_obj_align(Music_img, LV_ALIGN_CENTER, 0, 0);
lv_obj_add_event_cb(Music_img, album_gesture_event_cb, LV_EVENT_GESTURE, NULL);
lv_obj_clear_flag(Music_img, LV_OBJ_FLAG_GESTURE_BUBBLE);
lv_obj_add_flag(Music_img, LV_OBJ_FLAG_CLICKABLE);
return Music_img;
}
void album_gesture_event_cb(lv_event_t * e)
{
lv_dir_t dir = lv_indev_get_gesture_dir(lv_indev_get_act());
if(dir == LV_DIR_LEFT) _lv_demo_music_album_next(true);
if(dir == LV_DIR_RIGHT) _lv_demo_music_album_next(false);
}
/************************************************************************************************************************************
* spectrum END * spectrum END * spectrum END * spectrum END
************************************************************************************************************************************/
/************************************************************************************************************************************
* create_ctrl_box * create_ctrl_box * create_ctrl_box * create_ctrl_box
************************************************************************************************************************************/
lv_obj_t * create_ctrl_box(lv_obj_t * parent)
{
lv_obj_t * cont = lv_obj_create(parent);
lv_obj_remove_style_all(cont);
lv_obj_set_height(cont, LV_SIZE_CONTENT);
lv_obj_set_style_pad_bottom(cont, 8, 0);
static const lv_coord_t grid_col[] = {LV_GRID_FR(1), LV_GRID_FR(4), LV_GRID_FR(4), LV_GRID_FR(5), LV_GRID_FR(4), LV_GRID_FR(4), LV_GRID_FR(1), LV_GRID_TEMPLATE_LAST};
static const lv_coord_t grid_row[] = {LV_GRID_CONTENT, LV_GRID_CONTENT, LV_GRID_TEMPLATE_LAST};
lv_obj_set_grid_dsc_array(cont, grid_col, grid_row);
// LV_IMG_DECLARE(img_lv_demo_music_btn_loop);
LV_IMG_DECLARE(img_lv_demo_music_btn_rnd);
LV_IMG_DECLARE(img_lv_demo_music_btn_next);
LV_IMG_DECLARE(img_lv_demo_music_btn_prev);
LV_IMG_DECLARE(img_lv_demo_music_btn_play);
LV_IMG_DECLARE(img_lv_demo_music_btn_pause);
lv_obj_t * icon1;
lv_obj_t * icon2;
lv_obj_t * icon3;
lv_obj_t * icon4;
icon1 = lv_img_create(cont);
lv_img_set_src(icon1, &img_lv_demo_music_btn_rnd);
lv_obj_set_grid_cell(icon1, LV_GRID_ALIGN_CENTER, 1, 1, LV_GRID_ALIGN_CENTER, 0, 1);
icon2 = lv_obj_create(cont);
lv_obj_set_size(icon2, 70, 150);
lv_obj_set_grid_cell(icon2, LV_GRID_ALIGN_CENTER, 5, 1, LV_GRID_ALIGN_CENTER, 0, 1);
lv_obj_set_style_bg_opa(icon2, LV_OPA_COVER, 0);
lv_obj_set_style_border_width(icon2, 0, 0);
lv_obj_set_style_radius(icon2, LV_RADIUS_CIRCLE, 0);
lv_obj_clear_flag(icon2, LV_OBJ_FLAG_SCROLLABLE);
lv_obj_t * icon2_volume = lv_label_create(icon2);
lv_label_set_text(icon2_volume, LV_SYMBOL_VOLUME_MAX);
lv_obj_set_style_text_font(icon2_volume, &lv_font_montserrat_14, 0);
lv_obj_align(icon2_volume, LV_ALIGN_CENTER, 0, 0);
lv_obj_t *circle_button = lv_obj_create(icon2);
lv_obj_set_style_bg_opa(circle_button, LV_OPA_TRANSP, 0);
lv_obj_set_style_border_width(circle_button, 0, 0);
lv_obj_set_size(circle_button, 65, 130);
lv_obj_set_style_radius(circle_button, LV_RADIUS_CIRCLE, 0);
lv_obj_align(circle_button, LV_ALIGN_CENTER, 0, 10);
lv_obj_add_event_cb(circle_button, volume_event_cb, LV_EVENT_CLICKED, NULL);
lv_obj_add_flag(circle_button, LV_OBJ_FLAG_CLICKABLE);
icon3 = lv_img_create(cont);
lv_img_set_src(icon3, &img_lv_demo_music_btn_prev);
lv_obj_set_grid_cell(icon3, LV_GRID_ALIGN_CENTER, 2, 1, LV_GRID_ALIGN_CENTER, 0, 1);
lv_obj_add_event_cb(icon3, prev_click_event_cb, LV_EVENT_CLICKED, NULL);
lv_obj_add_flag(icon3, LV_OBJ_FLAG_CLICKABLE);
play_obj = lv_imgbtn_create(cont);
lv_imgbtn_set_src(play_obj, LV_IMGBTN_STATE_RELEASED, NULL, &img_lv_demo_music_btn_play, NULL);
lv_imgbtn_set_src(play_obj, LV_IMGBTN_STATE_CHECKED_RELEASED, NULL, &img_lv_demo_music_btn_pause, NULL);
lv_obj_add_flag(play_obj, LV_OBJ_FLAG_CHECKABLE);
lv_obj_set_grid_cell(play_obj, LV_GRID_ALIGN_CENTER, 3, 1, LV_GRID_ALIGN_CENTER, 0, 1);
lv_obj_add_event_cb(play_obj, play_event_click_cb, LV_EVENT_CLICKED, NULL);
lv_obj_add_flag(play_obj, LV_OBJ_FLAG_CLICKABLE);
lv_obj_set_width(play_obj, img_lv_demo_music_btn_play.header.w);
icon4 = lv_img_create(cont);
lv_img_set_src(icon4, &img_lv_demo_music_btn_next);
lv_obj_set_grid_cell(icon4, LV_GRID_ALIGN_CENTER, 4, 1, LV_GRID_ALIGN_CENTER, 0, 1);
lv_obj_add_event_cb(icon4, next_click_event_cb, LV_EVENT_CLICKED, NULL);
lv_obj_add_flag(icon4, LV_OBJ_FLAG_CLICKABLE);
return cont;
}
void track_load(uint32_t id)
{
if(first_Flag) {
if(id == track_id) return;
}
time_act = 0;
bool next = false;
if((track_id + 1) % ACTIVE_TRACK_CNT == id) next = true;
if(first_Flag || id != track_id) {
_lv_demo_music_list_btn_check(track_id, false);
track_id = id;
}
_lv_demo_music_list_btn_check(id, true);
first_Flag = true;
lv_label_set_text(title_label, Audio_Name);
lv_anim_t a;
lv_anim_init(&a);
lv_anim_set_var(&a, album_img_obj);
lv_anim_set_values(&a, lv_obj_get_style_img_opa(album_img_obj, 0), LV_OPA_TRANSP);
lv_anim_set_exec_cb(&a, album_fade_anim_cb);
lv_anim_set_time(&a, 500);
lv_anim_start(&a);
lv_anim_init(&a);
lv_anim_set_var(&a, album_img_obj);
lv_anim_set_time(&a, 500);
lv_anim_set_path_cb(&a, lv_anim_path_ease_out);
if(next) {
lv_anim_set_values(&a, 0, - LV_HOR_RES / 2);
}
else {
lv_anim_set_values(&a, 0, LV_HOR_RES / 2);
}
lv_anim_set_exec_cb(&a, _obj_set_x_anim_cb);
lv_anim_set_ready_cb(&a, lv_obj_del_anim_ready_cb);
lv_anim_start(&a);
lv_anim_set_path_cb(&a, lv_anim_path_linear);
lv_anim_set_var(&a, album_img_obj);
lv_anim_set_time(&a, 500);
lv_anim_set_values(&a, LV_IMG_ZOOM_NONE, LV_IMG_ZOOM_NONE / 2);
lv_anim_set_exec_cb(&a, _img_set_zoom_anim_cb);
lv_anim_set_ready_cb(&a, NULL);
lv_anim_start(&a);
album_img_obj = album_img_create(spectrum_obj);
lv_anim_set_path_cb(&a, lv_anim_path_overshoot);
lv_anim_set_var(&a, album_img_obj);
lv_anim_set_time(&a, 500);
lv_anim_set_delay(&a, 100);
lv_anim_set_values(&a, LV_IMG_ZOOM_NONE / 4, LV_IMG_ZOOM_NONE);
lv_anim_set_exec_cb(&a, _img_set_zoom_anim_cb);
lv_anim_set_ready_cb(&a, NULL);
lv_anim_start(&a);
lv_anim_init(&a);
lv_anim_set_var(&a, album_img_obj);
lv_anim_set_values(&a, 0, LV_OPA_COVER);
lv_anim_set_exec_cb(&a, album_fade_anim_cb);
lv_anim_set_time(&a, 500);
lv_anim_set_delay(&a, 100);
lv_anim_start(&a);
}
void play_event_click_cb(lv_event_t * e)
{
lv_obj_t * obj = lv_event_get_target(e);
lv_anim_del(Music_img, set_angle);
if(lv_obj_has_state(obj, LV_STATE_CHECKED)) {
_lv_demo_music_resume();
}
else {
_lv_demo_music_pause();
}
}
void prev_click_event_cb(lv_event_t * e)
{
lv_event_code_t code = lv_event_get_code(e);
if(code == LV_EVENT_CLICKED) {
_lv_demo_music_album_next(false);
}
}
void next_click_event_cb(lv_event_t * e)
{
lv_event_code_t code = lv_event_get_code(e);
if(code == LV_EVENT_CLICKED) {
_lv_demo_music_album_next(true);
}
}
void timer_cb(lv_timer_t * t)
{
LV_UNUSED(t);
if(Music_Next_Flag){
Music_Next_Flag = 0;
_lv_demo_music_album_next(true);
}
}
static lv_obj_t * panel;
static lv_obj_t * slider;
static lv_obj_t * slider_volume;
void volume_adjustment_event_cb(lv_event_t * e) {
uint8_t Volume = lv_slider_get_value(lv_event_get_target(e));
if (Volume <= Volume_MAX) {
lv_slider_set_value(slider, Volume, LV_ANIM_ON);
LVGL_volume_adjustment(Volume);
// printf("Volume:%d\r\n",Volume) ;
}
else
printf("Volume out of range: %d\n", Volume);
}
void background_event_cb(lv_event_t * e) {
lv_event_code_t code = lv_event_get_code(e);
if (code == LV_EVENT_CLICKED) {
if (lv_event_get_target(e) == panel && lv_event_get_target(e) != slider_volume) {
lv_obj_add_flag(panel, LV_OBJ_FLAG_HIDDEN);
}
}
}
void volume_event_cb(lv_event_t * e) {
printf("Clicked on volume icon\r\n");
lv_event_code_t code = lv_event_get_code(e);
if(code == LV_EVENT_CLICKED) {
if (!slider) {
panel = lv_obj_create(lv_scr_act());
lv_obj_set_size(panel, lv_obj_get_width(lv_scr_act()), lv_obj_get_height(lv_scr_act()));
lv_obj_set_pos(panel, 0, 0);
lv_obj_set_style_border_width(panel, 0, 0);
lv_obj_clear_flag(panel, LV_OBJ_FLAG_SCROLLABLE);
lv_obj_set_style_bg_opa(panel, LV_OPA_TRANSP, LV_PART_MAIN);
slider = lv_slider_create(panel);
lv_obj_add_flag(slider, LV_OBJ_FLAG_CLICKABLE);
lv_obj_set_size(slider, 20, 170);
lv_obj_set_style_bg_opa(slider, LV_OPA_TRANSP, LV_PART_KNOB);
lv_obj_set_style_pad_all(slider, 20, LV_PART_KNOB);
lv_obj_set_style_bg_color(slider, lv_color_hex(0xADD8F6), LV_PART_INDICATOR);
lv_obj_set_style_outline_width(slider, 0, 0);
lv_slider_set_range(slider, 0, Volume_MAX);
lv_slider_set_value(slider, Volume, LV_ANIM_ON);
lv_obj_align_to(slider, panel, LV_ALIGN_RIGHT_MID, -10, 0);
slider_volume = lv_slider_create(panel);
lv_obj_add_flag(slider_volume, LV_OBJ_FLAG_CLICKABLE);
lv_obj_set_size(slider_volume, 50, 170);
lv_obj_set_style_bg_opa(slider_volume, LV_OPA_TRANSP, LV_PART_KNOB);
lv_obj_set_style_pad_all(slider_volume, 50, LV_PART_KNOB);
lv_obj_set_style_bg_color(slider_volume, lv_color_hex(0xFFFFFF), LV_PART_INDICATOR);
lv_obj_set_style_outline_width(slider_volume, 0, 0);
lv_slider_set_range(slider_volume, 0, Volume_MAX);
lv_slider_set_value(slider_volume, Volume, LV_ANIM_ON);
lv_obj_align_to(slider_volume, panel, LV_ALIGN_RIGHT_MID, 20, 0);
lv_obj_set_style_bg_opa(slider_volume, LV_OPA_TRANSP, LV_PART_MAIN);
lv_obj_set_style_bg_opa(slider_volume, LV_OPA_TRANSP, LV_PART_KNOB);
lv_obj_set_style_bg_opa(slider_volume, LV_OPA_TRANSP, LV_PART_INDICATOR);
lv_obj_add_event_cb(slider_volume, volume_adjustment_event_cb, LV_EVENT_VALUE_CHANGED, NULL);
lv_obj_add_event_cb(panel, background_event_cb, LV_EVENT_ALL, NULL);
}
lv_obj_clear_flag(panel, LV_OBJ_FLAG_HIDDEN);
}
}
void album_fade_anim_cb(void * var, int32_t v)
{
lv_obj_set_style_img_opa(var, v, 0);
}
/************************************************************************************************************************************
* create_ctrl_box END * create_ctrl_box END * create_ctrl_box END * create_ctrl_box END
************************************************************************************************************************************/
/************************************************************************************************************************************
* create_ctrl_box * create_ctrl_box * create_ctrl_box * create_ctrl_box
************************************************************************************************************************************/
lv_obj_t * create_List_box(lv_obj_t * parent)
{
static const lv_coord_t grid_cols[] = {LV_GRID_CONTENT, LV_GRID_FR(1), LV_GRID_CONTENT, LV_GRID_TEMPLATE_LAST};
static const lv_coord_t grid_rows[] = {LV_GRID_CONTENT, LV_GRID_CONTENT, LV_GRID_CONTENT, LV_GRID_CONTENT, LV_GRID_TEMPLATE_LAST};
lv_style_init(&style_btn_stop);
lv_style_set_bg_opa(&style_btn_stop, LV_OPA_TRANSP);
lv_style_set_grid_column_dsc_array(&style_btn_stop, grid_cols);
lv_style_set_grid_row_dsc_array(&style_btn_stop, grid_rows);
lv_style_set_grid_row_align(&style_btn_stop, LV_GRID_ALIGN_CENTER);
lv_style_set_layout(&style_btn_stop, LV_LAYOUT_GRID);
lv_style_set_pad_right(&style_btn_stop, 20);
lv_style_init(&style_btn_round);
lv_style_set_radius(&style_btn_round, 10);
lv_style_init(&style_btn_pr);
lv_style_set_bg_opa(&style_btn_pr, LV_OPA_COVER);
lv_style_set_bg_color(&style_btn_pr, lv_color_hex(0xCDE8F3));
lv_style_init(&style_btn_play);
lv_style_set_bg_opa(&style_btn_play, LV_OPA_COVER);
lv_style_set_bg_color(&style_btn_play, lv_color_hex(0xAAD3E0));
lv_style_init(&style_title);
lv_style_set_text_font(&style_title, font_small);
lv_style_set_text_color(&style_title, lv_color_hex(0x101010));
list = lv_obj_create(parent);
lv_obj_remove_style_all(list);
lv_obj_set_size(list, LV_SIZE_CONTENT, LV_SIZE_CONTENT);
lv_obj_set_pos(list, 0, LV_DEMO_MUSIC_HANDLE_SIZE);
// lv_obj_set_y(list, LV_DEMO_MUSIC_HANDLE_SIZE);
lv_obj_add_style(list, &music_style, LV_PART_SCROLLBAR);
lv_obj_set_flex_flow(list, LV_FLEX_FLOW_COLUMN);
uint32_t List_id;
for(List_id = 0; List_id < ACTIVE_TRACK_CNT; List_id++) {
add_list_btn(list, List_id);
}
lv_obj_set_scroll_snap_y(list, LV_SCROLL_SNAP_CENTER);
_lv_demo_music_list_btn_check(0, true);
return list;
}
lv_obj_t * add_list_btn(lv_obj_t * parent, uint32_t List_id)
{
lv_obj_t * btn = lv_obj_create(parent);
lv_obj_remove_style_all(btn);
lv_obj_set_size(btn, lv_pct(100), 60);
lv_obj_add_style(btn, &style_btn_round, 0);
lv_obj_add_style(btn, &style_btn_stop, 0);
lv_obj_add_style(btn, &style_btn_play, LV_STATE_CHECKED);
lv_obj_add_style(btn, &style_btn_pr, LV_STATE_PRESSED);
lv_obj_add_event_cb(btn, btn_click_event_cb, LV_EVENT_CLICKED, NULL);
lv_obj_t * icon = lv_img_create(btn);
lv_img_set_src(icon, &img_lv_demo_music_btn_list_play);
lv_obj_set_grid_cell(icon, LV_GRID_ALIGN_START, 0, 1, LV_GRID_ALIGN_CENTER, 0, 2);
lv_obj_t * title_label = lv_label_create(btn);
lv_label_set_text(title_label, File_Name[List_id]);
lv_obj_set_grid_cell(title_label, LV_GRID_ALIGN_START, 1, 1, LV_GRID_ALIGN_CENTER, 0, 1);
lv_obj_add_style(title_label, &style_title, 0);
return btn;
}
void _lv_demo_music_list_btn_check(uint32_t List_id, bool state)
{
lv_obj_t * btn = lv_obj_get_child(list, List_id);
lv_obj_t * icon = lv_obj_get_child(btn, 0);
if(state) {
lv_obj_add_state(btn, LV_STATE_CHECKED);
lv_img_set_src(icon, &img_lv_demo_music_btn_list_pause);
lv_obj_scroll_to_view(btn, LV_ANIM_ON);
}
else {
lv_obj_clear_state(btn, LV_STATE_CHECKED);
lv_img_set_src(icon, &img_lv_demo_music_btn_list_play);
}
// lv_obj_scroll_to_view(panel1, LV_ANIM_ON);
lv_obj_invalidate(panel1);
}
void btn_click_event_cb(lv_event_t * e)
{
lv_obj_t * btn = lv_event_get_target(e);
uint32_t idx = lv_obj_get_child_id(btn);
if(idx == track_id)
_lv_demo_music_resume();
else
_lv_demo_music_play(idx);
}
/************************************************************************************************************************************
* create_ctrl_box END * create_ctrl_box END * create_ctrl_box END * create_ctrl_box END
************************************************************************************************************************************/
/************************************************************************************************************************************
* Music * Music * Music * Music
************************************************************************************************************************************/
void _lv_demo_music_main_close(void)
{
lv_timer_del(sec_counter_timer);
}
void _lv_demo_music_album_next(bool next)
{
uint32_t id = track_id;
if(next) {
id++;
if(id >= ACTIVE_TRACK_CNT) id = 0;
}
else {
if(id == 0) {
id = ACTIVE_TRACK_CNT - 1;
}
else {
id--;
}
}
_lv_demo_music_play(id);
}
void _lv_demo_music_play(uint32_t id)
{
if(Playing_Flag && id == track_id){
}
else{
if(id == track_id){
LVGL_Resume_Music();
_lv_demo_music_resume();
}
else{
Music_img_angle = 0;
track_load(id);
LVGL_Play_Music(id);
_lv_demo_music_resume();
}
}
}
void _lv_demo_music_resume(void) {
Playing_Flag = true;
lv_obj_add_state(play_obj, LV_STATE_CHECKED);
LVGL_Resume_Music();
Start_animation();
refresh_screen();
}
void _lv_demo_music_pause(void)
{
Playing_Flag = false;
lv_img_set_zoom(album_img_obj, LV_IMG_ZOOM_NONE);
lv_obj_clear_state(play_obj, LV_STATE_CHECKED);
LVGL_Pause_Music();
Stop_animation();
refresh_screen();
}
/************************************************************************************************************************************
* Other * Other * Other * Other
************************************************************************************************************************************/
void remove_file_extension(char *file_name) {
char *last_dot = strrchr(file_name, '.');
if (last_dot != NULL) {
*last_dot = '\0';
}
}
void LVGL_Search_Music() {
ACTIVE_TRACK_CNT = Folder_retrieval("/sdcard",".mp3",SD_Name,100);
if(ACTIVE_TRACK_CNT) {
for (int i = 0; i < ACTIVE_TRACK_CNT; i++) {
strcpy(File_Name[i], SD_Name[i]);
remove_file_extension(File_Name[i]);
}
LVGL_Play_Music(0);
}
}
void LVGL_Play_Music(uint32_t ID) {
Play_Music("/sdcard",SD_Name[ID]);
LVGL_Pause_Music();
strncpy(Audio_Name,File_Name[ID], sizeof(File_Name[ID]));
}
void LVGL_Resume_Music() {
Music_resume();
}
void LVGL_Pause_Music() {
Music_pause();
}
void LVGL_volume_adjustment(uint8_t Volume) {
Volume_adjustment(Volume);
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+69
View File
@@ -0,0 +1,69 @@
#pragma once
/*********************
* INCLUDES
*********************/
// #include <demos/music/lv_demo_music_list.h>
#include <demos/music/lv_demo_music.h>
#include <demos/lv_demos.h>
#include <lvgl.h>
// #include "assets/spectrum_1.h"
// #include "assets/spectrum_2.h"
// #include "assets/spectrum_3.h"
#include "SD_MMC.h"
#include "PCM5101.h"
/**********************
* GLOBAL FUNCTIONS
**********************/
extern uint16_t ACTIVE_TRACK_CNT;
/*
* Callback adapter function to convert parameter types to avoid compile-time
* warning.
*/
void _img_set_zoom_anim_cb(void * obj, int32_t zoom);
/*
* Callback adapter function to convert parameter types to avoid compile-time
* warning.
*/
void _obj_set_x_anim_cb(void * obj, int32_t x);
lv_obj_t * _lv_demo_music_main_create(lv_obj_t * parent);
void _lv_demo_music_main_close(void);
void _lv_demo_music_album_next(bool next);
void _lv_demo_music_play(uint32_t id);
void _lv_demo_music_resume(void);
void _lv_demo_music_pause(void);
/**********************
* STATIC FUNCTIONS
**********************/
lv_obj_t * create_List_box(lv_obj_t * parent);
lv_obj_t * add_list_btn(lv_obj_t * parent, uint32_t track_id);
void _lv_demo_music_list_btn_check(uint32_t track_id, bool state);
void btn_click_event_cb(lv_event_t * e);
lv_obj_t * create_cont(lv_obj_t * parent);
void create_wave_images(lv_obj_t * parent);
lv_obj_t * create_title_box(lv_obj_t * parent);
lv_obj_t * create_icon_box(lv_obj_t * parent);
lv_obj_t * create_spectrum_obj(lv_obj_t * parent);
lv_obj_t * create_ctrl_box(lv_obj_t * parent);
lv_obj_t * create_handle(lv_obj_t * parent);
void track_load(uint32_t id);
lv_obj_t * album_img_create(lv_obj_t * parent);
void album_gesture_event_cb(lv_event_t * e);
void play_event_click_cb(lv_event_t * e);
void prev_click_event_cb(lv_event_t * e);
void next_click_event_cb(lv_event_t * e);
void volume_event_cb(lv_event_t * e);
void album_fade_anim_cb(void * var, int32_t v);
void timer_cb(lv_timer_t * t);
void LVGL_Search_Music();
void LVGL_Resume_Music();
void LVGL_Pause_Music();
void LVGL_Play_Music(uint32_t ID);
void LVGL_volume_adjustment(uint8_t Volume);
+243
View File
@@ -0,0 +1,243 @@
#include "CST816.h"
#define POINT_NUM_MAX (1)
#define DATA_START_REG (0x02)
#define CHIP_ID_REG (0xA7)
#define AutoSleep_REG (0xFE)
static const char *TAG = "CST816";
esp_lcd_touch_handle_t tp = NULL;
static esp_err_t read_data(esp_lcd_touch_handle_t tp);
static bool get_xy(esp_lcd_touch_handle_t tp, uint16_t *x, uint16_t *y, uint16_t *strength, uint8_t *point_num, uint8_t max_point_num);
static esp_err_t del(esp_lcd_touch_handle_t tp);
static esp_err_t i2c_read_bytes(esp_lcd_touch_handle_t tp, uint16_t reg, uint8_t *data, uint8_t len);
static esp_err_t i2c_write_bytes(esp_lcd_touch_handle_t tp, uint16_t reg, uint8_t* data, uint8_t len);
static esp_err_t reset(esp_lcd_touch_handle_t tp);
static esp_err_t read_id(esp_lcd_touch_handle_t tp);
static void AutoSleep(bool Sleep_State);
esp_err_t esp_lcd_touch_new_i2c_cst816(const esp_lcd_panel_io_handle_t io, const esp_lcd_touch_config_t *config, esp_lcd_touch_handle_t *tp)
{
ESP_RETURN_ON_FALSE(io, ESP_ERR_INVALID_ARG, TAG, "Invalid io");
ESP_RETURN_ON_FALSE(config, ESP_ERR_INVALID_ARG, TAG, "Invalid config");
ESP_RETURN_ON_FALSE(tp, ESP_ERR_INVALID_ARG, TAG, "Invalid touch handle");
/* Prepare main structure */
esp_err_t ret = ESP_OK;
esp_lcd_touch_handle_t cst816s = calloc(1, sizeof(esp_lcd_touch_t));
ESP_GOTO_ON_FALSE(cst816s, ESP_ERR_NO_MEM, err, TAG, "Touch handle malloc failed");
/* Communication interface */
cst816s->io = io;
/* Only supported callbacks are set */
cst816s->read_data = read_data;
cst816s->get_xy = get_xy;
cst816s->del = del;
/* Mutex */
cst816s->data.lock.owner = portMUX_FREE_VAL;
/* Save config */
memcpy(&cst816s->config, config, sizeof(esp_lcd_touch_config_t));
/* Prepare pin for touch interrupt */
if (cst816s->config.int_gpio_num != GPIO_NUM_NC) {
const gpio_config_t int_gpio_config = {
.mode = GPIO_MODE_INPUT,
.intr_type = (cst816s->config.levels.interrupt ? GPIO_INTR_POSEDGE : GPIO_INTR_NEGEDGE),
.pin_bit_mask = BIT64(cst816s->config.int_gpio_num)
};
ESP_GOTO_ON_ERROR(gpio_config(&int_gpio_config), err, TAG, "GPIO intr config failed");
/* Register interrupt callback */
if (cst816s->config.interrupt_callback) {
esp_lcd_touch_register_interrupt_callback(cst816s, cst816s->config.interrupt_callback);
}
}
/* Prepare pin for touch controller reset */
if (cst816s->config.rst_gpio_num != GPIO_NUM_NC) {
const gpio_config_t rst_gpio_config = {
.mode = GPIO_MODE_OUTPUT,
.pin_bit_mask = BIT64(cst816s->config.rst_gpio_num)
};
ESP_GOTO_ON_ERROR(gpio_config(&rst_gpio_config), err, TAG, "GPIO reset config failed");
}
/* Reset controller */
ESP_GOTO_ON_ERROR(reset(cst816s), err, TAG, "Reset failed");
/* Read product id */
ESP_GOTO_ON_ERROR(read_id(cst816s), err, TAG, "Read version failed");
*tp = cst816s;
AutoSleep(false);
return ESP_OK;
err:
if (cst816s) {
del(cst816s);
}
ESP_LOGE(TAG, "Initialization failed!");
return ret;
}
static esp_err_t read_data(esp_lcd_touch_handle_t tp)
{
typedef struct {
uint8_t num;
uint8_t x_h : 4;
uint8_t : 4;
uint8_t x_l;
uint8_t y_h : 4;
uint8_t : 4;
uint8_t y_l;
} data_t;
data_t point;
ESP_RETURN_ON_ERROR(i2c_read_bytes(tp, DATA_START_REG, (uint8_t *)&point, sizeof(data_t)), TAG, "I2C read failed");
portENTER_CRITICAL(&tp->data.lock);
point.num = (point.num > POINT_NUM_MAX ? POINT_NUM_MAX : point.num);
tp->data.points = point.num;
/* Fill all coordinates */
for (int i = 0; i < point.num; i++) {
tp->data.coords[i].x = point.x_h << 8 | point.x_l;
tp->data.coords[i].y = point.y_h << 8 | point.y_l;
}
portEXIT_CRITICAL(&tp->data.lock);
return ESP_OK;
}
static bool get_xy(esp_lcd_touch_handle_t tp, uint16_t *x, uint16_t *y, uint16_t *strength, uint8_t *point_num, uint8_t max_point_num)
{
portENTER_CRITICAL(&tp->data.lock);
/* Count of points */
*point_num = (tp->data.points > max_point_num ? max_point_num : tp->data.points);
for (size_t i = 0; i < *point_num; i++) {
x[i] = tp->data.coords[i].x;
y[i] = tp->data.coords[i].y;
if (strength) {
strength[i] = tp->data.coords[i].strength;
}
}
/* Invalidate */
tp->data.points = 0;
portEXIT_CRITICAL(&tp->data.lock);
return (*point_num > 0);
}
static esp_err_t del(esp_lcd_touch_handle_t tp)
{
/* Reset GPIO pin settings */
if (tp->config.int_gpio_num != GPIO_NUM_NC) {
gpio_reset_pin(tp->config.int_gpio_num);
if (tp->config.interrupt_callback) {
gpio_isr_handler_remove(tp->config.int_gpio_num);
}
}
if (tp->config.rst_gpio_num != GPIO_NUM_NC) {
gpio_reset_pin(tp->config.rst_gpio_num);
}
/* Release memory */
free(tp);
return ESP_OK;
}
static esp_err_t reset(esp_lcd_touch_handle_t tp)
{
Set_EXIO(TCA9554_EXIO1,false);
vTaskDelay(pdMS_TO_TICKS(10));
Set_EXIO(TCA9554_EXIO1,true);
vTaskDelay(pdMS_TO_TICKS(50));
return ESP_OK;
}
static esp_err_t read_id(esp_lcd_touch_handle_t tp)
{
uint8_t id;
ESP_RETURN_ON_ERROR(i2c_read_bytes(tp, CHIP_ID_REG, &id, 1), TAG, "I2C read failed");
ESP_LOGI(TAG, "IC id: %d", id);
return ESP_OK;
}
/*!
@brief Fall asleep automatically
*/
static void AutoSleep(bool Sleep_State) {
uint8_t Sleep_State_Set = (uint8_t)(!Sleep_State);
i2c_write_bytes(tp, AutoSleep_REG, &Sleep_State_Set, 1);
}
static esp_err_t i2c_read_bytes(esp_lcd_touch_handle_t tp, uint16_t reg, uint8_t *data, uint8_t len)
{
ESP_RETURN_ON_FALSE(data, ESP_ERR_INVALID_ARG, TAG, "Invalid data");
return esp_lcd_panel_io_rx_param(tp->io, reg, data, len);
}
static esp_err_t i2c_write_bytes(esp_lcd_touch_handle_t tp, uint16_t reg, uint8_t* data, uint8_t len)
{
assert(tp != NULL);
// *INDENT-OFF*
/* Write data */
return esp_lcd_panel_io_tx_param(tp->io, reg, data, len);
// *INDENT-ON*
}
/**
* @brief i2c master initialization
*/
esp_err_t Touch_I2C_Init(void)
{
int i2c_master_port = I2C_Touch_MASTER_NUM;
i2c_config_t conf = {
.mode = I2C_MODE_MASTER,
.sda_io_num = I2C_Touch_SDA_IO,
.scl_io_num = I2C_Touch_SCL_IO,
.sda_pullup_en = GPIO_PULLUP_ENABLE,
.scl_pullup_en = GPIO_PULLUP_ENABLE,
.master.clk_speed = I2C_Touch_MASTER_FREQ_HZ,
};
i2c_param_config(i2c_master_port, &conf);
return i2c_driver_install(i2c_master_port, conf.mode, I2C_MASTER_RX_BUF_DISABLE, I2C_MASTER_TX_BUF_DISABLE, 0);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void Touch_Init(void)
{
ESP_ERROR_CHECK(Touch_I2C_Init());
ESP_LOGI(TAG, "I2C initialized successfully");
/********************* Touch *********************/
esp_lcd_panel_io_handle_t tp_io_handle = NULL;
esp_lcd_panel_io_i2c_config_t tp_io_config = ESP_LCD_TOUCH_IO_I2C_CST816_CONFIG();
ESP_LOGI(TAG, "Initialize touch IO (I2C)");
/* Touch IO handle */
ESP_ERROR_CHECK(esp_lcd_new_panel_io_i2c((esp_lcd_i2c_bus_handle_t)I2C_Touch_MASTER_NUM, &tp_io_config, &tp_io_handle));
esp_lcd_touch_config_t tp_cfg = {
.x_max = EXAMPLE_LCD_WIDTH,
.y_max = EXAMPLE_LCD_HEIGHT,
.rst_gpio_num = I2C_Touch_RST_IO,
.int_gpio_num = I2C_Touch_INT_IO,
.flags = {
.swap_xy = 0,
.mirror_x = 0,
.mirror_y = 0,
},
};
/* Initialize touch */
ESP_LOGI(TAG, "Initialize touch controller CST816");
ESP_ERROR_CHECK(esp_lcd_touch_new_i2c_cst816(tp_io_handle, &tp_cfg, &tp));
}
+70
View File
@@ -0,0 +1,70 @@
/**
* @file
* @brief ESP LCD touch: CST820
*/
#pragma once
#include <inttypes.h>
#include <stdio.h>
#include <string.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "driver/i2c.h"
#include "esp_system.h"
#include "esp_err.h"
#include "esp_log.h"
#include "esp_check.h"
#include "esp_lcd_panel_io.h"
#include "esp_lcd_touch.h"
#include "TCA9554PWR.h"
#include "ST77916.h"
/**
* @brief Create a new CST816S touch driver
*
* @note The I2C communication should be initialized before use this function.
*
* @param io LCD panel IO handle, it should be created by `esp_lcd_new_panel_io_i2c()`
* @param config Touch panel configuration
* @param tp Touch panel handle
* @return
* - ESP_OK: on success
*/
esp_err_t esp_lcd_touch_new_i2c_cst816s(const esp_lcd_panel_io_handle_t io, const esp_lcd_touch_config_t *config, esp_lcd_touch_handle_t *tp);
/**
* @brief I2C address of the CST816S controller
*
*/
#define ESP_LCD_TOUCH_IO_I2C_CST816S_ADDRESS (0x15)
/**
* @brief Touch IO configuration structure
*
*/
#define ESP_LCD_TOUCH_IO_I2C_CST816_CONFIG() \
{ \
.dev_addr = ESP_LCD_TOUCH_IO_I2C_CST816S_ADDRESS, \
.control_phase_bytes = 1, \
.dc_bit_offset = 0, \
.lcd_cmd_bits = 8, \
.flags = \
{ \
.disable_control_phase = 1, \
} \
}
// I2C settings
#define I2C_Touch_SDA_IO 1 /*!< GPIO number used for I2C master data */
#define I2C_Touch_SCL_IO 3 /*!< GPIO number used for I2C master clock */
#define I2C_Touch_INT_IO 4 /*!< GPIO number used for I2C master data */
#define I2C_Touch_RST_IO -1 /*!< GPIO number used for I2C master clock */
#define I2C_Touch_MASTER_NUM 1 /*!< I2C master i2c port number, the number of i2c peripheral interfaces available will depend on the chip */
#define I2C_Touch_MASTER_FREQ_HZ 400000 /*!< I2C master clock frequency */
extern esp_lcd_touch_handle_t tp;
void Touch_Init(void);
@@ -0,0 +1,258 @@
/*
* SPDX-FileCopyrightText: 2015-2023 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <stdlib.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "esp_system.h"
#include "esp_err.h"
#include "esp_check.h"
#include "esp_log.h"
#include "esp_lcd_touch.h"
static const char *TAG = "TP";
/*******************************************************************************
* Function definitions
*******************************************************************************/
/*******************************************************************************
* Local variables
*******************************************************************************/
/*******************************************************************************
* Public API functions
*******************************************************************************/
esp_err_t esp_lcd_touch_enter_sleep(esp_lcd_touch_handle_t tp)
{
assert(tp != NULL);
if (tp->enter_sleep == NULL) {
ESP_LOGE(TAG, "Sleep mode not supported!");
return ESP_FAIL;
} else {
return tp->enter_sleep(tp);
}
}
esp_err_t esp_lcd_touch_exit_sleep(esp_lcd_touch_handle_t tp)
{
assert(tp != NULL);
if (tp->exit_sleep == NULL) {
ESP_LOGE(TAG, "Sleep mode not supported!");
return ESP_FAIL;
} else {
return tp->exit_sleep(tp);
}
}
esp_err_t esp_lcd_touch_read_data(esp_lcd_touch_handle_t tp)
{
assert(tp != NULL);
assert(tp->read_data != NULL);
return tp->read_data(tp);
}
bool esp_lcd_touch_get_coordinates(esp_lcd_touch_handle_t tp, uint16_t *x, uint16_t *y, uint16_t *strength, uint8_t *point_num, uint8_t max_point_num)
{
bool touched = false;
assert(tp != NULL);
assert(x != NULL);
assert(y != NULL);
assert(tp->get_xy != NULL);
touched = tp->get_xy(tp, x, y, strength, point_num, max_point_num);
if (!touched) {
return false;
}
/* Process coordinates by user */
if (tp->config.process_coordinates != NULL) {
tp->config.process_coordinates(tp, x, y, strength, point_num, max_point_num);
}
/* Software coordinates adjustment needed */
bool sw_adj_needed = ((tp->config.flags.mirror_x && (tp->set_mirror_x == NULL)) ||
(tp->config.flags.mirror_y && (tp->set_mirror_y == NULL)) ||
(tp->config.flags.swap_xy && (tp->set_swap_xy == NULL)));
/* Adjust all coordinates */
for (int i = 0; (sw_adj_needed && i < *point_num); i++) {
/* Mirror X coordinates (if not supported by HW) */
if (tp->config.flags.mirror_x && tp->set_mirror_x == NULL) {
x[i] = tp->config.x_max - x[i];
}
/* Mirror Y coordinates (if not supported by HW) */
if (tp->config.flags.mirror_y && tp->set_mirror_y == NULL) {
y[i] = tp->config.y_max - y[i];
}
/* Swap X and Y coordinates (if not supported by HW) */
if (tp->config.flags.swap_xy && tp->set_swap_xy == NULL) {
uint16_t tmp = x[i];
x[i] = y[i];
y[i] = tmp;
}
}
return touched;
}
#if (CONFIG_ESP_LCD_TOUCH_MAX_BUTTONS > 0)
esp_err_t esp_lcd_touch_get_button_state(esp_lcd_touch_handle_t tp, uint8_t n, uint8_t *state)
{
assert(tp != NULL);
assert(state != NULL);
*state = 0;
if (tp->get_button_state) {
return tp->get_button_state(tp, n, state);
} else {
return ESP_ERR_NOT_SUPPORTED;
}
return ESP_OK;
}
#endif
esp_err_t esp_lcd_touch_set_swap_xy(esp_lcd_touch_handle_t tp, bool swap)
{
assert(tp != NULL);
tp->config.flags.swap_xy = swap;
/* Is swap supported by HW? */
if (tp->set_swap_xy) {
return tp->set_swap_xy(tp, swap);
}
return ESP_OK;
}
esp_err_t esp_lcd_touch_get_swap_xy(esp_lcd_touch_handle_t tp, bool *swap)
{
assert(tp != NULL);
assert(swap != NULL);
/* Is swap supported by HW? */
if (tp->get_swap_xy) {
return tp->get_swap_xy(tp, swap);
} else {
*swap = tp->config.flags.swap_xy;
}
return ESP_OK;
}
esp_err_t esp_lcd_touch_set_mirror_x(esp_lcd_touch_handle_t tp, bool mirror)
{
assert(tp != NULL);
tp->config.flags.mirror_x = mirror;
/* Is mirror supported by HW? */
if (tp->set_mirror_x) {
return tp->set_mirror_x(tp, mirror);
}
return ESP_OK;
}
esp_err_t esp_lcd_touch_get_mirror_x(esp_lcd_touch_handle_t tp, bool *mirror)
{
assert(tp != NULL);
assert(mirror != NULL);
/* Is swap supported by HW? */
if (tp->get_mirror_x) {
return tp->get_mirror_x(tp, mirror);
} else {
*mirror = tp->config.flags.mirror_x;
}
return ESP_OK;
}
esp_err_t esp_lcd_touch_set_mirror_y(esp_lcd_touch_handle_t tp, bool mirror)
{
assert(tp != NULL);
tp->config.flags.mirror_y = mirror;
/* Is mirror supported by HW? */
if (tp->set_mirror_y) {
return tp->set_mirror_y(tp, mirror);
}
return ESP_OK;
}
esp_err_t esp_lcd_touch_get_mirror_y(esp_lcd_touch_handle_t tp, bool *mirror)
{
assert(tp != NULL);
assert(mirror != NULL);
/* Is swap supported by HW? */
if (tp->get_mirror_y) {
return tp->get_mirror_y(tp, mirror);
} else {
*mirror = tp->config.flags.mirror_y;
}
return ESP_OK;
}
esp_err_t esp_lcd_touch_del(esp_lcd_touch_handle_t tp)
{
assert(tp != NULL);
if (tp->del != NULL) {
return tp->del(tp);
}
return ESP_OK;
}
esp_err_t esp_lcd_touch_register_interrupt_callback(esp_lcd_touch_handle_t tp, esp_lcd_touch_interrupt_callback_t callback)
{
esp_err_t ret = ESP_OK;
assert(tp != NULL);
/* Interrupt pin is not selected */
if (tp->config.int_gpio_num == GPIO_NUM_NC) {
return ESP_ERR_INVALID_ARG;
}
tp->config.interrupt_callback = callback;
if (callback != NULL) {
ret = gpio_install_isr_service(0);
/* ISR service can be installed from user before, then it returns invalid state */
if (ret != ESP_OK && ret != ESP_ERR_INVALID_STATE) {
ESP_LOGE(TAG, "GPIO ISR install failed");
return ret;
}
/* Add GPIO ISR handler */
ret = gpio_intr_enable(tp->config.int_gpio_num);
ESP_RETURN_ON_ERROR(ret, TAG, "GPIO ISR install failed");
ret = gpio_isr_handler_add(tp->config.int_gpio_num, (gpio_isr_t)tp->config.interrupt_callback, tp);
ESP_RETURN_ON_ERROR(ret, TAG, "GPIO ISR install failed");
} else {
/* Remove GPIO ISR handler */
ret = gpio_isr_handler_remove(tp->config.int_gpio_num);
ESP_RETURN_ON_ERROR(ret, TAG, "GPIO ISR remove handler failed");
ret = gpio_intr_disable(tp->config.int_gpio_num);
ESP_RETURN_ON_ERROR(ret, TAG, "GPIO ISR disable failed");
}
return ESP_OK;
}
@@ -0,0 +1,413 @@
/*
* SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
/**
* @file
* @brief ESP LCD touch
*/
#pragma once
#include <stdbool.h>
#include "sdkconfig.h"
#include "esp_err.h"
#include "driver/gpio.h"
#include "esp_lcd_panel_io.h"
#include "freertos/FreeRTOS.h"
#include "freertos/semphr.h"
#ifdef __cplusplus
extern "C" {
#endif
#define CONFIG_ESP_LCD_TOUCH_MAX_POINTS 2
/**
* @brief Touch controller type
*
*/
typedef struct esp_lcd_touch_s esp_lcd_touch_t;
typedef esp_lcd_touch_t *esp_lcd_touch_handle_t;
/**
* @brief Touch controller interrupt callback type
*
*/
typedef void (*esp_lcd_touch_interrupt_callback_t)(esp_lcd_touch_handle_t tp);
/**
* @brief Touch Configuration Type
*
*/
typedef struct {
uint16_t x_max; /*!< X coordinates max (for mirroring) */
uint16_t y_max; /*!< Y coordinates max (for mirroring) */
gpio_num_t rst_gpio_num; /*!< GPIO number of reset pin */
gpio_num_t int_gpio_num; /*!< GPIO number of interrupt pin */
struct {
unsigned int reset: 1; /*!< Level of reset pin in reset */
unsigned int interrupt: 1;/*!< Active Level of interrupt pin */
} levels;
struct {
unsigned int swap_xy: 1; /*!< Swap X and Y after read coordinates */
unsigned int mirror_x: 1; /*!< Mirror X after read coordinates */
unsigned int mirror_y: 1; /*!< Mirror Y after read coordinates */
} flags;
/*!< User callback called after get coordinates from touch controller for apply user adjusting */
void (*process_coordinates)(esp_lcd_touch_handle_t tp, uint16_t *x, uint16_t *y, uint16_t *strength, uint8_t *point_num, uint8_t max_point_num);
/*!< User callback called after the touch interrupt occured */
esp_lcd_touch_interrupt_callback_t interrupt_callback;
} esp_lcd_touch_config_t;
typedef struct {
uint8_t points; /*!< Count of touch points saved */
struct {
uint16_t x; /*!< X coordinate */
uint16_t y; /*!< Y coordinate */
uint16_t strength; /*!< Strength */
} coords[CONFIG_ESP_LCD_TOUCH_MAX_POINTS];
#if (CONFIG_ESP_LCD_TOUCH_MAX_BUTTONS > 0)
uint8_t buttons; /*!< Count of buttons states saved */
struct {
uint8_t status; /*!< Status of button */
} button[CONFIG_ESP_LCD_TOUCH_MAX_BUTTONS];
#endif
portMUX_TYPE lock; /*!< Lock for read/write */
} esp_lcd_touch_data_t;
/**
* @brief Declare of Touch Type
*
*/
struct esp_lcd_touch_s {
/**
* @brief set touch controller into sleep mode
*
* @note This function is usually blocking.
*
* @param tp: Touch handler
*
* @return
* - ESP_OK on success, otherwise returns ESP_ERR_xxx
*/
esp_err_t (*enter_sleep)(esp_lcd_touch_handle_t tp);
/**
* @brief set touch controller into normal mode
*
* @note This function is usually blocking.
*
* @param tp: Touch handler
*
* @return
* - ESP_OK on success, otherwise returns ESP_ERR_xxx
*/
esp_err_t (*exit_sleep)(esp_lcd_touch_handle_t tp);
/**
* @brief Read data from touch controller (mandatory)
*
* @note This function is usually blocking.
*
* @param tp: Touch handler
*
* @return
* - ESP_OK on success, otherwise returns ESP_ERR_xxx
*/
esp_err_t (*read_data)(esp_lcd_touch_handle_t tp);
/**
* @brief Get coordinates from touch controller (mandatory)
*
* @param tp: Touch handler
* @param x: Array of X coordinates
* @param y: Array of Y coordinates
* @param strength: Array of strengths
* @param point_num: Count of points touched (equals with count of items in x and y array)
* @param max_point_num: Maximum count of touched points to return (equals with max size of x and y array)
*
* @return
* - Returns true, when touched and coordinates readed. Otherwise returns false.
*/
bool (*get_xy)(esp_lcd_touch_handle_t tp, uint16_t *x, uint16_t *y, uint16_t *strength, uint8_t *point_num, uint8_t max_point_num);
#if (CONFIG_ESP_LCD_TOUCH_MAX_BUTTONS > 0)
/**
* @brief Get button state (optional)
*
* @param tp: Touch handler
* @param n: Button index
* @param state: Button state
*
* @return
* - Returns true, when touched and coordinates readed. Otherwise returns false.
*/
esp_err_t (*get_button_state)(esp_lcd_touch_handle_t tp, uint8_t n, uint8_t *state);
#endif
/**
* @brief Swap X and Y after read coordinates (optional)
* If set, then not used SW swapping.
*
* @param tp: Touch handler
* @param swap: Set swap value
*
* @return
* - ESP_OK on success, otherwise returns ESP_ERR_xxx
*/
esp_err_t (*set_swap_xy)(esp_lcd_touch_handle_t tp, bool swap);
/**
* @brief Are X and Y coordinates swapped (optional)
*
* @param tp: Touch handler
* @param swap: Get swap value
*
* @return
* - ESP_OK on success, otherwise returns ESP_ERR_xxx
*/
esp_err_t (*get_swap_xy)(esp_lcd_touch_handle_t tp, bool *swap);
/**
* @brief Mirror X after read coordinates
* If set, then not used SW mirroring.
*
* @param tp: Touch handler
* @param mirror: Set X mirror value
*
* @return
* - ESP_OK on success, otherwise returns ESP_ERR_xxx
*/
esp_err_t (*set_mirror_x)(esp_lcd_touch_handle_t tp, bool mirror);
/**
* @brief Is mirrored X (optional)
*
* @param tp: Touch handler
* @param mirror: Get X mirror value
*
* @return
* - ESP_OK on success, otherwise returns ESP_ERR_xxx
*/
esp_err_t (*get_mirror_x)(esp_lcd_touch_handle_t tp, bool *mirror);
/**
* @brief Mirror Y after read coordinates
* If set, then not used SW mirroring.
*
* @param tp: Touch handler
* @param mirror: Set Y mirror value
*
* @return
* - ESP_OK on success, otherwise returns ESP_ERR_xxx
*/
esp_err_t (*set_mirror_y)(esp_lcd_touch_handle_t tp, bool mirror);
/**
* @brief Is mirrored Y (optional)
*
* @param tp: Touch handler
* @param mirror: Get Y mirror value
*
* @return
* - ESP_OK on success, otherwise returns ESP_ERR_xxx
*/
esp_err_t (*get_mirror_y)(esp_lcd_touch_handle_t tp, bool *mirror);
/**
* @brief Delete Touch
*
* @param tp: Touch handler
*
* @return
* - ESP_OK on success, otherwise returns ESP_ERR_xxx
*/
esp_err_t (*del)(esp_lcd_touch_handle_t tp);
/**
* @brief Configuration structure
*/
esp_lcd_touch_config_t config;
/**
* @brief Communication interface
*/
esp_lcd_panel_io_handle_t io;
/**
* @brief Data structure
*/
esp_lcd_touch_data_t data;
};
/**
* @brief Read data from touch controller
*
* @note This function is usually blocking.
*
* @param tp: Touch handler
*
* @return
* - ESP_OK on success
* - ESP_ERR_INVALID_ARG parameter error
* - ESP_FAIL sending command error, slave hasn't ACK the transfer
* - ESP_ERR_INVALID_STATE I2C driver not installed or not in master mode
* - ESP_ERR_TIMEOUT operation timeout because the bus is busy
*/
esp_err_t esp_lcd_touch_read_data(esp_lcd_touch_handle_t tp);
/**
* @brief Read coordinates from touch controller
*
* @param tp: Touch handler
* @param x: Array of X coordinates
* @param y: Array of Y coordinates
* @param strength: Array of the strengths (can be NULL)
* @param point_num: Count of points touched (equals with count of items in x and y array)
* @param max_point_num: Maximum count of touched points to return (equals with max size of x and y array)
*
* @return
* - Returns true, when touched and coordinates readed. Otherwise returns false.
*/
bool esp_lcd_touch_get_coordinates(esp_lcd_touch_handle_t tp, uint16_t *x, uint16_t *y, uint16_t *strength, uint8_t *point_num, uint8_t max_point_num);
#if (CONFIG_ESP_LCD_TOUCH_MAX_BUTTONS > 0)
/**
* @brief Get button state
*
* @param tp: Touch handler
* @param n: Button index
* @param state: Button state
*
* @return
* - ESP_OK on success
* - ESP_ERR_NOT_SUPPORTED if this function is not supported by controller
* - ESP_ERR_INVALID_ARG if bad button index
*/
esp_err_t esp_lcd_touch_get_button_state(esp_lcd_touch_handle_t tp, uint8_t n, uint8_t *state);
#endif
/**
* @brief Swap X and Y after read coordinates
*
* @param tp: Touch handler
* @param swap: Set swap value
*
* @return
* - ESP_OK on success
*/
esp_err_t esp_lcd_touch_set_swap_xy(esp_lcd_touch_handle_t tp, bool swap);
/**
* @brief Are X and Y coordinates swapped
*
* @param tp: Touch handler
* @param swap: Get swap value
*
* @return
* - ESP_OK on success
*/
esp_err_t esp_lcd_touch_get_swap_xy(esp_lcd_touch_handle_t tp, bool *swap);
/**
* @brief Mirror X after read coordinates
*
* @param tp: Touch handler
* @param mirror: Set X mirror value
*
* @return
* - ESP_OK on success
*/
esp_err_t esp_lcd_touch_set_mirror_x(esp_lcd_touch_handle_t tp, bool mirror);
/**
* @brief Is mirrored X
*
* @param tp: Touch handler
* @param mirror: Get X mirror value
*
* @return
* - ESP_OK on success
*/
esp_err_t esp_lcd_touch_get_mirror_x(esp_lcd_touch_handle_t tp, bool *mirror);
/**
* @brief Mirror Y after read coordinates
*
* @param tp: Touch handler
* @param mirror: Set Y mirror value
*
* @return
* - ESP_OK on success
*/
esp_err_t esp_lcd_touch_set_mirror_y(esp_lcd_touch_handle_t tp, bool mirror);
/**
* @brief Is mirrored Y
*
* @param tp: Touch handler
* @param mirror: Get Y mirror value
*
* @return
* - ESP_OK on success
*/
esp_err_t esp_lcd_touch_get_mirror_y(esp_lcd_touch_handle_t tp, bool *mirror);
/**
* @brief Delete touch (free all allocated memory and restart HW)
*
* @param tp: Touch handler
*
* @return
* - ESP_OK on success
*/
esp_err_t esp_lcd_touch_del(esp_lcd_touch_handle_t tp);
/**
* @brief Register user callback called after the touch interrupt occured
*
* @param tp: Touch handler
* @param callback: Interrupt callback
*
* @return
* - ESP_OK on success
*/
esp_err_t esp_lcd_touch_register_interrupt_callback(esp_lcd_touch_handle_t tp, esp_lcd_touch_interrupt_callback_t callback);
/**
* @brief Enter sleep mode
*
* @param tp: Touch handler
*
* @return
* - ESP_OK on success
* - ESP_ERR_INVALID_ARG if parameter is invalid
*/
esp_err_t esp_lcd_touch_enter_sleep(esp_lcd_touch_handle_t tp);
/**
* @brief Exit sleep mode
*
* @param tp: Touch handler
*
* @return
* - ESP_OK on success
* - ESP_ERR_INVALID_ARG if parameter is invalid
*/
esp_err_t esp_lcd_touch_exit_sleep(esp_lcd_touch_handle_t tp);
#ifdef __cplusplus
}
#endif
+3
View File
@@ -0,0 +1,3 @@
//
// Created by misaki on 2025/8/25.
//
+12
View File
@@ -0,0 +1,12 @@
//
// Created by misaki on 2025/8/25.
//
#ifndef BIONIC_SPHERE_ERR_HANDLE_H
#define BIONIC_SPHERE_ERR_HANDLE_H
#define ESP_GOTO(goto_tag) do { \
goto goto_tag; \
} while (0)
#endif //BIONIC_SPHERE_ERR_HANDLE_H
+10 -1
View File
@@ -3,7 +3,10 @@
#include <esp_log.h>
#include <drivers_test.h>
#include "err_handle.h"
#include "drivers_test.h"
void app_main(void)
@@ -21,4 +24,10 @@ void app_main(void)
// exio_text();
// audio_test();
lcd_touch_lvgl_test();
ESP_GOTO(err);
err:
ESP_LOGI("app_main", "app_main error");
}
+18 -1
View File
@@ -2,6 +2,7 @@ idf_component_register(SRCS "Bionic_sphere.c"
"../test/driver_test/drivers_test.c" # 测试用例
"../test/EXIO_Test/TCA9554PWR_Test.c" # 测试用例
"../test/audio_test/audio_test.c" # 测试用例
"../Util/general_err_handle/err_handle.c" # 错误处理库
"../Lib/I2C_Driver/I2C_Driver.c" # IIC底层驱动库
"../Lib/QMI8658/QMI8658.c" # IMU驱动库
"../Lib/BAT_Driver/BAT_Driver.c" # 电池adc驱动库
@@ -10,10 +11,18 @@ idf_component_register(SRCS "Bionic_sphere.c"
"../Lib/PCF85063/PCF85063.c" # RTC驱动库
"../Lib/EXIO/TCA9554PWR.c" # IO拓展库
"../Lib/Audio_Driver/PCM5101.c" # 音频驱动库(播放)
INCLUDE_DIRS "."
"../Lib/Display/LCD_Driver/ST77916.c"
"../Lib/Display/LCD_Driver/esp_lcd_st77916/esp_lcd_st77916.c"
"../Lib/Display/LVGL_Driver/LVGL_Driver.c"
"../Lib/Display/LVGL_UI/LVGL_Music.c"
"../Lib/Display/LVGL_UI/LVGL_Example.c"
"../Lib/Display/Touch_Driver/CST816.c"
"../Lib/Display/Touch_Driver/esp_lcd_touch/esp_lcd_touch.c"
INCLUDE_DIRS "."
"../test/driver_test"
"../test/EXIO_Test"
"../test/audio_test"
"../Util/general_err_handle"
"../Lib/I2C_Driver"
"../Lib/QMI8658"
"../Lib/BAT_Driver"
@@ -22,6 +31,13 @@ idf_component_register(SRCS "Bionic_sphere.c"
"../Lib/PCF85063"
"../Lib/EXIO"
"../Lib/Audio_Driver"
"../Lib/Display/LCD_Driver"
"../Lib/Display/LCD_Driver/esp_lcd_st77916"
"../Lib/Display/LVGL_Driver"
"../Lib/Display/LVGL_UI"
"../Lib/Display/LVGL_UI"
"../Lib/Display/Touch_Driver"
"../Lib/Display/Touch_Driver/esp_lcd_touch"
PRIV_REQUIRES # 私有依赖
driver
bt
@@ -30,4 +46,5 @@ idf_component_register(SRCS "Bionic_sphere.c"
esp_adc
fatfs
unity
esp_lcd
)
+15 -8
View File
@@ -2475,7 +2475,7 @@ CONFIG_LV_COLOR_DEPTH_16=y
# CONFIG_LV_COLOR_DEPTH_8 is not set
# CONFIG_LV_COLOR_DEPTH_1 is not set
CONFIG_LV_COLOR_DEPTH=16
# CONFIG_LV_COLOR_16_SWAP is not set
CONFIG_LV_COLOR_16_SWAP=y
# CONFIG_LV_COLOR_SCREEN_TRANSP is not set
CONFIG_LV_COLOR_MIX_ROUND_OFS=128
CONFIG_LV_COLOR_CHROMA_KEY_HEX=0x00FF00
@@ -2485,7 +2485,7 @@ CONFIG_LV_COLOR_CHROMA_KEY_HEX=0x00FF00
# Memory settings
#
# CONFIG_LV_MEM_CUSTOM is not set
CONFIG_LV_MEM_SIZE_KILOBYTES=32
CONFIG_LV_MEM_SIZE_KILOBYTES=48
CONFIG_LV_MEM_ADDR=0x0
CONFIG_LV_MEM_BUF_MAX_NUM=16
# CONFIG_LV_MEMCPY_MEMSET_STD is not set
@@ -2578,9 +2578,9 @@ CONFIG_LV_ATTRIBUTE_MEM_ALIGN_SIZE=1
#
# CONFIG_LV_FONT_MONTSERRAT_8 is not set
# CONFIG_LV_FONT_MONTSERRAT_10 is not set
# CONFIG_LV_FONT_MONTSERRAT_12 is not set
CONFIG_LV_FONT_MONTSERRAT_12=y
CONFIG_LV_FONT_MONTSERRAT_14=y
# CONFIG_LV_FONT_MONTSERRAT_16 is not set
CONFIG_LV_FONT_MONTSERRAT_16=y
# CONFIG_LV_FONT_MONTSERRAT_18 is not set
# CONFIG_LV_FONT_MONTSERRAT_20 is not set
# CONFIG_LV_FONT_MONTSERRAT_22 is not set
@@ -2758,11 +2758,18 @@ CONFIG_LV_BUILD_EXAMPLES=y
#
# Demos
#
# CONFIG_LV_USE_DEMO_WIDGETS is not set
# CONFIG_LV_USE_DEMO_KEYPAD_AND_ENCODER is not set
# CONFIG_LV_USE_DEMO_BENCHMARK is not set
CONFIG_LV_USE_DEMO_WIDGETS=y
CONFIG_LV_DEMO_WIDGETS_SLIDESHOW=y
CONFIG_LV_USE_DEMO_KEYPAD_AND_ENCODER=y
CONFIG_LV_USE_DEMO_BENCHMARK=y
# CONFIG_LV_DEMO_BENCHMARK_RGB565A8 is not set
# CONFIG_LV_USE_DEMO_STRESS is not set
# CONFIG_LV_USE_DEMO_MUSIC is not set
CONFIG_LV_USE_DEMO_MUSIC=y
# CONFIG_LV_DEMO_MUSIC_SQUARE is not set
# CONFIG_LV_DEMO_MUSIC_LANDSCAPE is not set
# CONFIG_LV_DEMO_MUSIC_ROUND is not set
# CONFIG_LV_DEMO_MUSIC_LARGE is not set
# CONFIG_LV_DEMO_MUSIC_AUTO_PLAY is not set
# end of Demos
# end of LVGL configuration
# end of Component config
+389 -6
View File
@@ -536,6 +536,59 @@ CONFIG_PARTITION_TABLE_OFFSET=0x8000
CONFIG_PARTITION_TABLE_MD5=y
# end of Partition Table
#
# ESP Speech Recognition
#
CONFIG_MODEL_IN_FLASH=y
# CONFIG_MODEL_IN_SDCARD is not set
CONFIG_USE_AFE=y
CONFIG_AFE_INTERFACE_V1=y
# CONFIG_USE_NSNET is not set
CONFIG_USE_WAKENET=y
# CONFIG_SR_WN_WN8_ALEXA is not set
CONFIG_SR_WN_WN9_HILEXIN=y
# CONFIG_SR_WN_WN9_XIAOAITONGXUE is not set
# CONFIG_SR_WN_WN9_ALEXA is not set
# CONFIG_SR_WN_WN9_HIESP is not set
# CONFIG_SR_WN_WN9_HIMFIVE is not set
# CONFIG_SR_WN_WN9_NIHAOXIAOZHI_TTS is not set
# CONFIG_SR_WN_WN9_JARVIS_TTS is not set
# CONFIG_SR_WN_WN9_COMPUTER_TTS is not set
# CONFIG_SR_WN_WN9_HEYWILLOW_TTS is not set
# CONFIG_SR_WN_WN9_SOPHIA_TTS is not set
# CONFIG_SR_WN_WN9_NIHAOXIAOXIN_TTS is not set
# CONFIG_SR_WN_WN9_XIAOMEITONGXUE_TTS is not set
# CONFIG_SR_WN_WN9_HIXIAOXING_TTS is not set
# CONFIG_SR_WN_WN9_MYCROFT_TTS is not set
# CONFIG_SR_WN_WN9_HEYPRINTER_TTS is not set
# CONFIG_SR_WN_WN9_XIAOLONGXIAOLONG_TTS is not set
# CONFIG_SR_WN_WN9_MIAOMIAOTONGXUE_TTS is not set
# CONFIG_SR_WN_WN9_HIJOY_TTS is not set
# CONFIG_SR_WN_WN9_HILILI_TTS is not set
# CONFIG_SR_WN_WN9_HITELLY_TTS is not set
# CONFIG_SR_WN_WN9_HEYWANDA_TTS is not set
# CONFIG_SR_WN_WN9_HIMIAOMIAO_TTS is not set
# CONFIG_SR_WN_WN9_XIAOBINXIAOBIN_TTS is not set
# CONFIG_SR_WN_WN9_HAIXIAOWU_TTS is not set
# CONFIG_SR_WN_WN9_ASTROLABE_TTS is not set
# CONFIG_SR_WN_WN9_XIAOYAXIAOYA_TTS2 is not set
# CONFIG_SR_WN_WN9_HIJASON_TTS2 is not set
# CONFIG_SR_WN_WN9_LINAIBAN_TTS2 is not set
# CONFIG_SR_WN_WN9_CUSTOMWORD is not set
# CONFIG_SR_WN_LOAD_MULIT_WORD is not set
CONFIG_USE_MULTINET=y
# CONFIG_SR_MN_CN_NONE is not set
# CONFIG_SR_MN_CN_MULTINET5_RECOGNITION_QUANT8 is not set
CONFIG_SR_MN_CN_MULTINET6_QUANT=y
# CONFIG_SR_MN_CN_MULTINET6_AC_QUANT is not set
# CONFIG_SR_MN_CN_MULTINET7_QUANT is not set
# CONFIG_SR_MN_CN_MULTINET7_AC_QUANT is not set
CONFIG_SR_MN_EN_NONE=y
# CONFIG_SR_MN_EN_MULTINET5_SINGLE_RECOGNITION_QUANT8 is not set
# CONFIG_SR_MN_EN_MULTINET6_QUANT is not set
# CONFIG_SR_MN_EN_MULTINET7_QUANT is not set
# end of ESP Speech Recognition
#
# Compiler options
#
@@ -1392,9 +1445,9 @@ CONFIG_SPIRAM_MALLOC_RESERVE_INTERNAL=32768
# ESP System Settings
#
# CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_80 is not set
CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_160=y
# CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_240 is not set
CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ=160
# CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_160 is not set
CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_240=y
CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ=240
#
# Cache config
@@ -2382,6 +2435,336 @@ CONFIG_WIFI_PROV_AUTOSTOP_TIMEOUT=30
CONFIG_WIFI_PROV_STA_ALL_CHANNEL_SCAN=y
# CONFIG_WIFI_PROV_STA_FAST_SCAN is not set
# end of Wi-Fi Provisioning Manager
#
# Audio playback
#
CONFIG_AUDIO_PLAYER_ENABLE_MP3=y
CONFIG_AUDIO_PLAYER_ENABLE_WAV=y
CONFIG_AUDIO_PLAYER_LOG_LEVEL=0
# end of Audio playback
#
# DSP Library
#
CONFIG_DSP_OPTIMIZATIONS_SUPPORTED=y
# CONFIG_DSP_ANSI is not set
CONFIG_DSP_OPTIMIZED=y
CONFIG_DSP_OPTIMIZATION=1
# CONFIG_DSP_MAX_FFT_SIZE_512 is not set
# CONFIG_DSP_MAX_FFT_SIZE_1024 is not set
# CONFIG_DSP_MAX_FFT_SIZE_2048 is not set
CONFIG_DSP_MAX_FFT_SIZE_4096=y
# CONFIG_DSP_MAX_FFT_SIZE_8192 is not set
# CONFIG_DSP_MAX_FFT_SIZE_16384 is not set
# CONFIG_DSP_MAX_FFT_SIZE_32768 is not set
CONFIG_DSP_MAX_FFT_SIZE=4096
# end of DSP Library
#
# LVGL configuration
#
CONFIG_LV_CONF_SKIP=y
# CONFIG_LV_CONF_MINIMAL is not set
#
# Color settings
#
# CONFIG_LV_COLOR_DEPTH_32 is not set
CONFIG_LV_COLOR_DEPTH_16=y
# CONFIG_LV_COLOR_DEPTH_8 is not set
# CONFIG_LV_COLOR_DEPTH_1 is not set
CONFIG_LV_COLOR_DEPTH=16
# CONFIG_LV_COLOR_16_SWAP is not set
# CONFIG_LV_COLOR_SCREEN_TRANSP is not set
CONFIG_LV_COLOR_MIX_ROUND_OFS=128
CONFIG_LV_COLOR_CHROMA_KEY_HEX=0x00FF00
# end of Color settings
#
# Memory settings
#
# CONFIG_LV_MEM_CUSTOM is not set
CONFIG_LV_MEM_SIZE_KILOBYTES=32
CONFIG_LV_MEM_ADDR=0x0
CONFIG_LV_MEM_BUF_MAX_NUM=16
# CONFIG_LV_MEMCPY_MEMSET_STD is not set
# end of Memory settings
#
# HAL Settings
#
CONFIG_LV_DISP_DEF_REFR_PERIOD=30
CONFIG_LV_INDEV_DEF_READ_PERIOD=30
# CONFIG_LV_TICK_CUSTOM is not set
CONFIG_LV_DPI_DEF=130
# end of HAL Settings
#
# Feature configuration
#
#
# Drawing
#
CONFIG_LV_DRAW_COMPLEX=y
CONFIG_LV_SHADOW_CACHE_SIZE=0
CONFIG_LV_CIRCLE_CACHE_SIZE=4
CONFIG_LV_LAYER_SIMPLE_BUF_SIZE=24576
CONFIG_LV_IMG_CACHE_DEF_SIZE=0
CONFIG_LV_GRADIENT_MAX_STOPS=2
CONFIG_LV_GRAD_CACHE_DEF_SIZE=0
# CONFIG_LV_DITHER_GRADIENT is not set
CONFIG_LV_DISP_ROT_MAX_BUF=10240
# end of Drawing
#
# GPU
#
# CONFIG_LV_USE_GPU_ARM2D is not set
# CONFIG_LV_USE_GPU_STM32_DMA2D is not set
# CONFIG_LV_USE_GPU_RA6M3_G2D is not set
# CONFIG_LV_USE_GPU_SWM341_DMA2D is not set
# CONFIG_LV_USE_GPU_NXP_PXP is not set
# CONFIG_LV_USE_GPU_NXP_VG_LITE is not set
# CONFIG_LV_USE_GPU_SDL is not set
# end of GPU
#
# Logging
#
# CONFIG_LV_USE_LOG is not set
# end of Logging
#
# Asserts
#
CONFIG_LV_USE_ASSERT_NULL=y
CONFIG_LV_USE_ASSERT_MALLOC=y
# CONFIG_LV_USE_ASSERT_STYLE is not set
# CONFIG_LV_USE_ASSERT_MEM_INTEGRITY is not set
# CONFIG_LV_USE_ASSERT_OBJ is not set
CONFIG_LV_ASSERT_HANDLER_INCLUDE="assert.h"
# end of Asserts
#
# Others
#
# CONFIG_LV_USE_PERF_MONITOR is not set
# CONFIG_LV_USE_MEM_MONITOR is not set
# CONFIG_LV_USE_REFR_DEBUG is not set
# CONFIG_LV_SPRINTF_CUSTOM is not set
# CONFIG_LV_SPRINTF_USE_FLOAT is not set
CONFIG_LV_USE_USER_DATA=y
# CONFIG_LV_ENABLE_GC is not set
# end of Others
#
# Compiler settings
#
# CONFIG_LV_BIG_ENDIAN_SYSTEM is not set
CONFIG_LV_ATTRIBUTE_MEM_ALIGN_SIZE=1
# CONFIG_LV_ATTRIBUTE_FAST_MEM_USE_IRAM is not set
# CONFIG_LV_USE_LARGE_COORD is not set
# end of Compiler settings
# end of Feature configuration
#
# Font usage
#
#
# Enable built-in fonts
#
# CONFIG_LV_FONT_MONTSERRAT_8 is not set
# CONFIG_LV_FONT_MONTSERRAT_10 is not set
CONFIG_LV_FONT_MONTSERRAT_12=y
CONFIG_LV_FONT_MONTSERRAT_14=y
CONFIG_LV_FONT_MONTSERRAT_16=y
# CONFIG_LV_FONT_MONTSERRAT_18 is not set
# CONFIG_LV_FONT_MONTSERRAT_20 is not set
# CONFIG_LV_FONT_MONTSERRAT_22 is not set
# CONFIG_LV_FONT_MONTSERRAT_24 is not set
# CONFIG_LV_FONT_MONTSERRAT_26 is not set
# CONFIG_LV_FONT_MONTSERRAT_28 is not set
# CONFIG_LV_FONT_MONTSERRAT_30 is not set
# CONFIG_LV_FONT_MONTSERRAT_32 is not set
# CONFIG_LV_FONT_MONTSERRAT_34 is not set
# CONFIG_LV_FONT_MONTSERRAT_36 is not set
# CONFIG_LV_FONT_MONTSERRAT_38 is not set
# CONFIG_LV_FONT_MONTSERRAT_40 is not set
# CONFIG_LV_FONT_MONTSERRAT_42 is not set
# CONFIG_LV_FONT_MONTSERRAT_44 is not set
# CONFIG_LV_FONT_MONTSERRAT_46 is not set
# CONFIG_LV_FONT_MONTSERRAT_48 is not set
# CONFIG_LV_FONT_MONTSERRAT_12_SUBPX is not set
# CONFIG_LV_FONT_MONTSERRAT_28_COMPRESSED is not set
# CONFIG_LV_FONT_DEJAVU_16_PERSIAN_HEBREW is not set
# CONFIG_LV_FONT_SIMSUN_16_CJK is not set
# CONFIG_LV_FONT_UNSCII_8 is not set
# CONFIG_LV_FONT_UNSCII_16 is not set
# CONFIG_LV_FONT_CUSTOM is not set
# end of Enable built-in fonts
# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_8 is not set
# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_12 is not set
CONFIG_LV_FONT_DEFAULT_MONTSERRAT_14=y
# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_16 is not set
# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_18 is not set
# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_20 is not set
# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_22 is not set
# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_24 is not set
# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_26 is not set
# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_28 is not set
# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_30 is not set
# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_32 is not set
# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_34 is not set
# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_36 is not set
# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_38 is not set
# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_40 is not set
# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_42 is not set
# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_44 is not set
# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_46 is not set
# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_48 is not set
# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_12_SUBPX is not set
# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_28_COMPRESSED is not set
# CONFIG_LV_FONT_DEFAULT_DEJAVU_16_PERSIAN_HEBREW is not set
# CONFIG_LV_FONT_DEFAULT_SIMSUN_16_CJK is not set
# CONFIG_LV_FONT_DEFAULT_UNSCII_8 is not set
# CONFIG_LV_FONT_DEFAULT_UNSCII_16 is not set
# CONFIG_LV_FONT_FMT_TXT_LARGE is not set
# CONFIG_LV_USE_FONT_COMPRESSED is not set
# CONFIG_LV_USE_FONT_SUBPX is not set
CONFIG_LV_USE_FONT_PLACEHOLDER=y
# end of Font usage
#
# Text Settings
#
CONFIG_LV_TXT_ENC_UTF8=y
# CONFIG_LV_TXT_ENC_ASCII is not set
CONFIG_LV_TXT_BREAK_CHARS=" ,.;:-_"
CONFIG_LV_TXT_LINE_BREAK_LONG_LEN=0
CONFIG_LV_TXT_COLOR_CMD="#"
# CONFIG_LV_USE_BIDI is not set
# CONFIG_LV_USE_ARABIC_PERSIAN_CHARS is not set
# end of Text Settings
#
# Widget usage
#
CONFIG_LV_USE_ARC=y
CONFIG_LV_USE_BAR=y
CONFIG_LV_USE_BTN=y
CONFIG_LV_USE_BTNMATRIX=y
CONFIG_LV_USE_CANVAS=y
CONFIG_LV_USE_CHECKBOX=y
CONFIG_LV_USE_DROPDOWN=y
CONFIG_LV_USE_IMG=y
CONFIG_LV_USE_LABEL=y
CONFIG_LV_LABEL_TEXT_SELECTION=y
CONFIG_LV_LABEL_LONG_TXT_HINT=y
CONFIG_LV_USE_LINE=y
CONFIG_LV_USE_ROLLER=y
CONFIG_LV_ROLLER_INF_PAGES=7
CONFIG_LV_USE_SLIDER=y
CONFIG_LV_USE_SWITCH=y
CONFIG_LV_USE_TEXTAREA=y
CONFIG_LV_TEXTAREA_DEF_PWD_SHOW_TIME=1500
CONFIG_LV_USE_TABLE=y
# end of Widget usage
#
# Extra Widgets
#
CONFIG_LV_USE_ANIMIMG=y
CONFIG_LV_USE_CALENDAR=y
# CONFIG_LV_CALENDAR_WEEK_STARTS_MONDAY is not set
CONFIG_LV_USE_CALENDAR_HEADER_ARROW=y
CONFIG_LV_USE_CALENDAR_HEADER_DROPDOWN=y
CONFIG_LV_USE_CHART=y
CONFIG_LV_USE_COLORWHEEL=y
CONFIG_LV_USE_IMGBTN=y
CONFIG_LV_USE_KEYBOARD=y
CONFIG_LV_USE_LED=y
CONFIG_LV_USE_LIST=y
CONFIG_LV_USE_MENU=y
CONFIG_LV_USE_METER=y
CONFIG_LV_USE_MSGBOX=y
CONFIG_LV_USE_SPAN=y
CONFIG_LV_SPAN_SNIPPET_STACK_SIZE=64
CONFIG_LV_USE_SPINBOX=y
CONFIG_LV_USE_SPINNER=y
CONFIG_LV_USE_TABVIEW=y
CONFIG_LV_USE_TILEVIEW=y
CONFIG_LV_USE_WIN=y
# end of Extra Widgets
#
# Themes
#
CONFIG_LV_USE_THEME_DEFAULT=y
# CONFIG_LV_THEME_DEFAULT_DARK is not set
CONFIG_LV_THEME_DEFAULT_GROW=y
CONFIG_LV_THEME_DEFAULT_TRANSITION_TIME=80
CONFIG_LV_USE_THEME_BASIC=y
# CONFIG_LV_USE_THEME_MONO is not set
# end of Themes
#
# Layouts
#
CONFIG_LV_USE_FLEX=y
CONFIG_LV_USE_GRID=y
# end of Layouts
#
# 3rd Party Libraries
#
# CONFIG_LV_USE_FS_STDIO is not set
# CONFIG_LV_USE_FS_POSIX is not set
# CONFIG_LV_USE_FS_WIN32 is not set
# CONFIG_LV_USE_FS_FATFS is not set
# CONFIG_LV_USE_FS_LITTLEFS is not set
# CONFIG_LV_USE_PNG is not set
# CONFIG_LV_USE_BMP is not set
# CONFIG_LV_USE_SJPG is not set
# CONFIG_LV_USE_GIF is not set
# CONFIG_LV_USE_QRCODE is not set
# CONFIG_LV_USE_FREETYPE is not set
# CONFIG_LV_USE_TINY_TTF is not set
# CONFIG_LV_USE_RLOTTIE is not set
# CONFIG_LV_USE_FFMPEG is not set
# end of 3rd Party Libraries
#
# Others
#
CONFIG_LV_USE_SNAPSHOT=y
# CONFIG_LV_USE_MONKEY is not set
# CONFIG_LV_USE_GRIDNAV is not set
# CONFIG_LV_USE_FRAGMENT is not set
# CONFIG_LV_USE_IMGFONT is not set
# CONFIG_LV_USE_MSG is not set
# CONFIG_LV_USE_IME_PINYIN is not set
# end of Others
#
# Examples
#
CONFIG_LV_BUILD_EXAMPLES=y
# end of Examples
#
# Demos
#
# CONFIG_LV_USE_DEMO_WIDGETS is not set
# CONFIG_LV_USE_DEMO_KEYPAD_AND_ENCODER is not set
# CONFIG_LV_USE_DEMO_BENCHMARK is not set
# CONFIG_LV_USE_DEMO_STRESS is not set
# CONFIG_LV_USE_DEMO_MUSIC is not set
# end of Demos
# end of LVGL configuration
# end of Component config
# CONFIG_IDF_EXPERIMENTAL_FEATURES is not set
@@ -2633,9 +3016,9 @@ CONFIG_ESP32S3_SPIRAM_SUPPORT=y
CONFIG_DEFAULT_PSRAM_CLK_IO=30
CONFIG_DEFAULT_PSRAM_CS_IO=26
# CONFIG_ESP32S3_DEFAULT_CPU_FREQ_80 is not set
CONFIG_ESP32S3_DEFAULT_CPU_FREQ_160=y
# CONFIG_ESP32S3_DEFAULT_CPU_FREQ_240 is not set
CONFIG_ESP32S3_DEFAULT_CPU_FREQ_MHZ=160
# CONFIG_ESP32S3_DEFAULT_CPU_FREQ_160 is not set
CONFIG_ESP32S3_DEFAULT_CPU_FREQ_240=y
CONFIG_ESP32S3_DEFAULT_CPU_FREQ_MHZ=240
CONFIG_SYSTEM_EVENT_QUEUE_SIZE=32
CONFIG_SYSTEM_EVENT_TASK_STACK_SIZE=2304
CONFIG_MAIN_TASK_STACK_SIZE=3584
+34
View File
@@ -210,3 +210,37 @@ void audio_test(void)
{
run_audio_test();
}
#include "ST77916.h"
#include "LVGL_Driver.h"
#include "LVGL_Example.h"
void lcd_touch_lvgl_test(void)
{
// 1. 初始化硬件
I2C_Init();
LCD_Init(); // 初始化屏幕和背光
LVGL_Init(); // 初始化 LVGL
// 2. 创建一个简单的测试界面
lv_obj_t *label = lv_label_create(lv_scr_act());
lv_label_set_text(label, "Hello, ST77916 + LVGL!");
lv_obj_align(label, LV_ALIGN_CENTER, 0, 0);
// 3. 创建一个按钮用于测试触摸
lv_obj_t *btn = lv_btn_create(lv_scr_act());
lv_obj_align(btn, LV_ALIGN_CENTER, 0, 50);
lv_obj_t *btn_label = lv_label_create(btn);
lv_label_set_text(btn_label, "Click Me");
lv_obj_center(btn_label);
// lv_obj_add_event_cb(btn, [](lv_event_t *e) {
// lv_label_set_text(label, "Button Clicked!");
// }, LV_EVENT_CLICKED, NULL);
// 4. 在主循环中运行 LVGL
while (1) {
lv_timer_handler();
vTaskDelay(pdMS_TO_TICKS(10));
}
}
+3
View File
@@ -26,5 +26,8 @@ void exio_text(void);
// 音频测试
void audio_test(void);
// LCD测试
void lcd_touch_lvgl_test(void);
#endif //BIONIC_SPHERE_DRIVERS_TEST_H
+6
View File
@@ -146,3 +146,9 @@
- [x] 9. 测试了音频播放功能,测试通过
#### Day4 2025.8.25
##### 主要目标:测试开发板官方提供的例程中的驱动能否使用
实际完成任务:
- [x] 1. 测试了屏幕驱动,lvgl,触摸,驱动文件在Lib/Display当中。全部通过(修改了sdkconfig,以适配lvgl)
- [x] 2. 新增了优雅的C语言错误处理