diff --git a/examples/audio/.gitignore b/examples/audio/.gitignore deleted file mode 100644 index 771a53d0..00000000 --- a/examples/audio/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -build/** -managed_components/** -dependencies.lock \ No newline at end of file diff --git a/examples/display_audio_photo/.gitignore b/examples/display_audio_photo/.gitignore deleted file mode 100644 index 333409ae..00000000 --- a/examples/display_audio_photo/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -.vscode/ -build/** -managed_components/** -dependencies.lock -sdkconfig \ No newline at end of file diff --git a/examples/display_rotation/.gitignore b/examples/display_rotation/.gitignore deleted file mode 100644 index 333409ae..00000000 --- a/examples/display_rotation/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -.vscode/ -build/** -managed_components/** -dependencies.lock -sdkconfig \ No newline at end of file diff --git a/examples/display_sensors/.gitignore b/examples/display_sensors/.gitignore deleted file mode 100644 index 9f69130e..00000000 --- a/examples/display_sensors/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -build/** -managed_components/** -dependencies.lock diff --git a/examples/display_usb_hid/CMakeLists.txt b/examples/display_usb_hid/CMakeLists.txt new file mode 100644 index 00000000..f7ff0a74 --- /dev/null +++ b/examples/display_usb_hid/CMakeLists.txt @@ -0,0 +1,9 @@ +# For more information about build system see +# https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html +# The following five lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.5) + +set(COMPONENTS main) # "Trim" the build. Include the minimal set of components; main and anything it depends on. +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(display-usb-hid) \ No newline at end of file diff --git a/examples/display_usb_hid/README.md b/examples/display_usb_hid/README.md new file mode 100644 index 00000000..b1010548 --- /dev/null +++ b/examples/display_usb_hid/README.md @@ -0,0 +1,58 @@ +# BSP: Display USB HID Example + +This example demonstrates usage of the USB HID (keyboard, mouse or GamePad) with Board Support Package. + +## How to use the example + +### Hardware Required + +* Board ESP32-S3-USB-OTG + +### Compile and flash + +``` +idf.py -p COMx flash monitor +``` + +### Example outputs + +``` +I (0) cpu_start: App cpu up. +I (235) cpu_start: Pro cpu start user code +I (235) cpu_start: cpu freq: 160000000 Hz +I (235) cpu_start: Application information: +I (238) cpu_start: Project name: display-usb-hid +I (244) cpu_start: App version: squareline-latest-21-g87b0e54 +I (251) cpu_start: Compile time: Apr 5 2023 14:15:08 +I (257) cpu_start: ELF file SHA256: a74d139d1fcf326b... +I (263) cpu_start: ESP-IDF: v5.0-dev-8835-g29737e1bc8a-dirt +I (270) cpu_start: Min chip rev: v0.0 +I (275) cpu_start: Max chip rev: v0.99 +I (279) cpu_start: Chip rev: v0.1 +I (284) heap_init: Initializing. RAM available for dynamic allocation: +I (291) heap_init: At 3FC976B8 len 00052058 (328 KiB): DRAM +I (298) heap_init: At 3FCE9710 len 00005724 (21 KiB): STACK/DRAM +I (304) heap_init: At 3FCF0000 len 00008000 (32 KiB): DRAM +I (310) heap_init: At 600FE010 len 00001FF0 (7 KiB): RTCRAM +I (318) spi_flash: detected chip: gd +I (321) spi_flash: flash io: dio +W (325) spi_flash: Detected size(8192k) larger than the size in the binary image header(2048k). Using the size in the binary image header. +I (338) sleep: Configure to isolate all GPIO pins in sleep state +I (345) sleep: Enable automatic switching of GPIO sleep configuration +I (352) app_start: Starting scheduler on CPU0 +I (357) app_start: Starting scheduler on CPU1 +I (357) main_task: Started on CPU0 +I (367) main_task: Calling app_main() +I (367) gpio: GPIO[18]| InputEn: 0| OutputEn: 1| OpenDrain: 0| Pullup: 0| Pulldown: 0| Intr:0 +I (377) gpio: GPIO[12]| InputEn: 0| OutputEn: 1| OpenDrain: 0| Pullup: 0| Pulldown: 0| Intr:0 +I (387) gpio: GPIO[13]| InputEn: 0| OutputEn: 1| OpenDrain: 0| Pullup: 0| Pulldown: 0| Intr:0 +I (397) gpio: GPIO[17]| InputEn: 0| OutputEn: 1| OpenDrain: 0| Pullup: 0| Pulldown: 0| Intr:0 +I (467) USB-OTG: Installing USB Host +I (497) LVGL: Starting LVGL task +I (497) gpio: GPIO[4]| InputEn: 0| OutputEn: 1| OpenDrain: 0| Pullup: 0| Pulldown: 0| Intr:0 +I (497) gpio: GPIO[8]| InputEn: 0| OutputEn: 1| OpenDrain: 0| Pullup: 0| Pulldown: 0| Intr:0 +I (627) USB-OTG: Setting LCD backlight: 100% +I (667) example: Keyboard input device group was set. +I (667) example: Example initialization done. +I (667) main_task: Returned from app_main() +``` diff --git a/examples/display_usb_hid/main/CMakeLists.txt b/examples/display_usb_hid/main/CMakeLists.txt new file mode 100644 index 00000000..cf2c455c --- /dev/null +++ b/examples/display_usb_hid/main/CMakeLists.txt @@ -0,0 +1,2 @@ +idf_component_register(SRCS "main.c" + INCLUDE_DIRS ".") diff --git a/examples/display_usb_hid/main/idf_component.yml b/examples/display_usb_hid/main/idf_component.yml new file mode 100644 index 00000000..b356726c --- /dev/null +++ b/examples/display_usb_hid/main/idf_component.yml @@ -0,0 +1,7 @@ +description: BSP Display USB HID Example +dependencies: + idf: ">=4.4" + usb_host_hid: "*" + esp32_s3_usb_otg: + version: "*" + override_path: "../../../bsp/esp32_s3_usb_otg" diff --git a/examples/display_usb_hid/main/main.c b/examples/display_usb_hid/main/main.c new file mode 100644 index 00000000..b241cd09 --- /dev/null +++ b/examples/display_usb_hid/main/main.c @@ -0,0 +1,159 @@ +/* + * SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: CC0-1.0 + */ + +#include "esp_log.h" +#include "bsp/esp-bsp.h" +#include "lvgl.h" +#include "esp_lvgl_port.h" + +static const char *TAG = "example"; + +static lv_disp_t *display; +static lv_indev_t *kb_indev = NULL; +static lv_obj_t *result = NULL; +static lv_obj_t *ta_name = NULL; +static lv_obj_t *ta_email = NULL; +static lv_group_t *kb_group = NULL; + +/******************************************************************************* +* Private functions +*******************************************************************************/ +static void app_lvgl_btn_back_cb(lv_event_t *e) +{ + if (result) { + lv_obj_clean(result); + lv_obj_del(result); + result = NULL; + } + if (kb_indev) { + lv_indev_set_group(kb_indev, kb_group); + } +} + +static void app_lvgl_btn_ok_cb(lv_event_t *e) +{ + lv_obj_t *scr = lv_scr_act(); + const char *name = lv_textarea_get_text(ta_name); + const char *email = lv_textarea_get_text(ta_email); + + result = lv_obj_create(scr); + lv_obj_set_size(result, BSP_LCD_V_RES, BSP_LCD_H_RES); + lv_obj_align(result, LV_ALIGN_TOP_MID, 0, 0); + lv_obj_set_flex_flow(result, LV_FLEX_FLOW_COLUMN); + lv_obj_set_flex_align(result, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); + + lv_obj_t *lbl = lv_label_create(result); + lv_label_set_text_fmt(lbl, "Your name: %s", name); + lbl = lv_label_create(result); + lv_label_set_text_fmt(lbl, "Your email: %s", email); + + lv_obj_t *back_btn = lv_btn_create(result); + lbl = lv_label_create(back_btn); + lv_label_set_text_static(lbl, "BACK"); + /* Button event */ + lv_obj_add_event_cb(back_btn, app_lvgl_btn_back_cb, LV_EVENT_CLICKED, NULL); + + if (kb_indev) { + lv_group_t *group = lv_group_create(); + lv_group_add_obj(group, back_btn); + lv_indev_set_group(kb_indev, group); + } +} + +static void app_lvgl_display(void) +{ + lv_obj_t *scr = lv_scr_act(); + lv_obj_t *lbl; + bsp_display_lock(0); + + lv_obj_t *col = lv_obj_create(scr); + lv_obj_set_size(col, BSP_LCD_V_RES, BSP_LCD_H_RES); + lv_obj_align(col, LV_ALIGN_TOP_MID, 0, 0); + lv_obj_set_flex_flow(col, LV_FLEX_FLOW_COLUMN); + lv_obj_set_flex_align(col, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); + + lbl = lv_label_create(col); + lv_label_set_text(lbl, "USB HID Example"); + + lv_obj_t *cont_row = lv_obj_create(col); + lv_obj_set_size(cont_row, BSP_LCD_V_RES - 10, 50); + lv_obj_align(cont_row, LV_ALIGN_TOP_MID, 0, 20); + lv_obj_set_flex_flow(cont_row, LV_FLEX_FLOW_ROW); + lv_obj_set_style_pad_top(cont_row, 5, 0); + lv_obj_set_style_pad_bottom(cont_row, 5, 0); + lv_obj_set_style_pad_left(cont_row, 5, 0); + lv_obj_set_style_pad_right(cont_row, 5, 0); + lv_obj_set_flex_align(cont_row, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); + + lbl = lv_label_create(cont_row); + lv_label_set_text(lbl, "Name:"); + ta_name = lv_textarea_create(cont_row); + lv_obj_set_width(ta_name, BSP_LCD_V_RES - 100); + lv_textarea_set_one_line(ta_name, true); + + cont_row = lv_obj_create(col); + lv_obj_set_size(cont_row, BSP_LCD_V_RES - 10, 50); + lv_obj_align(cont_row, LV_ALIGN_TOP_MID, 0, 20); + lv_obj_set_flex_flow(cont_row, LV_FLEX_FLOW_ROW); + lv_obj_set_style_pad_top(cont_row, 5, 0); + lv_obj_set_style_pad_bottom(cont_row, 5, 0); + lv_obj_set_style_pad_left(cont_row, 5, 0); + lv_obj_set_style_pad_right(cont_row, 5, 0); + lv_obj_set_flex_align(cont_row, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); + + lbl = lv_label_create(cont_row); + lv_label_set_text(lbl, "E-mail:"); + ta_email = lv_textarea_create(cont_row); + lv_obj_set_width(ta_email, BSP_LCD_V_RES - 100); + lv_textarea_set_one_line(ta_email, true); + + /* Button OK */ + lv_obj_t *btn_ok = lv_btn_create(col); + lbl = lv_label_create(btn_ok); + lv_label_set_text_static(lbl, "OK"); + /* Button event */ + lv_obj_add_event_cb(btn_ok, app_lvgl_btn_ok_cb, LV_EVENT_CLICKED, NULL); + + if (kb_indev) { + kb_group = lv_group_create(); + lv_group_add_obj(kb_group, ta_name); + lv_group_add_obj(kb_group, ta_email); + lv_group_add_obj(kb_group, btn_ok); + lv_indev_set_group(kb_indev, kb_group); + ESP_LOGI(TAG, "Keyboard input device group was set."); + } + + bsp_display_unlock(); +} + +void app_main(void) +{ + /* Initialize USB */ + bsp_usb_host_start(BSP_USB_HOST_POWER_MODE_USB_DEV, true); + + /* Initialize display and LVGL */ + display = bsp_display_start(); + + /* Set display brightness to 100% */ + bsp_display_backlight_on(); + + const lvgl_port_hid_mouse_cfg_t mouse_cfg = { + .disp = display, + .sensitivity = 1, + }; + lvgl_port_add_usb_hid_mouse_input(&mouse_cfg); + + const lvgl_port_hid_keyboard_cfg_t kb_cfg = { + .disp = display, + }; + kb_indev = lvgl_port_add_usb_hid_keyboard_input(&kb_cfg); + + /* Add and show objects on display */ + app_lvgl_display(); + + ESP_LOGI(TAG, "Example initialization done."); + +} diff --git a/examples/display_usb_hid/sdkconfig.defaults b/examples/display_usb_hid/sdkconfig.defaults new file mode 100644 index 00000000..80a2848c --- /dev/null +++ b/examples/display_usb_hid/sdkconfig.defaults @@ -0,0 +1,8 @@ +# This file was generated using idf.py save-defconfig. It can be edited manually. +# Espressif IoT Development Framework (ESP-IDF) Project Minimal Configuration +# +CONFIG_IDF_TARGET="esp32s3" +CONFIG_LV_COLOR_16_SWAP=y +CONFIG_LV_MEM_CUSTOM=y +CONFIG_LV_MEMCPY_MEMSET_STD=y +CONFIG_LV_USE_PERF_MONITOR=y diff --git a/examples/mqtt_example/.gitignore b/examples/mqtt_example/.gitignore deleted file mode 100644 index 9f69130e..00000000 --- a/examples/mqtt_example/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -build/** -managed_components/** -dependencies.lock