From 2d519de3c702e719957a514b7123afb421b492dc Mon Sep 17 00:00:00 2001 From: Li Junru Date: Wed, 27 Mar 2024 14:15:09 +0800 Subject: [PATCH] feat: Add component esp_keyboard --- .github/workflows/upload_component.yml | 1 + .gitlab/ci/build.yml | 12 + .gitlab/ci/deploy.yml | 1 + .gitlab/ci/rules.yml | 16 + README.md | 1 + README_CN.md | 1 + components/.build-rules.yml | 5 + components/keyboard_button/CMakeLists.txt | 6 + components/keyboard_button/README.md | 22 + components/keyboard_button/idf_component.yml | 9 + components/keyboard_button/include/kbd_gpio.h | 151 +++++ .../keyboard_button/include/kbd_gptimer.h | 75 +++ .../keyboard_button/include/keyboard_button.h | 184 ++++++ components/keyboard_button/keyboard_button.c | 536 ++++++++++++++++++ components/keyboard_button/src/kbd_gpio.c | 133 +++++ components/keyboard_button/src/kbd_gptimer.c | 60 ++ .../keyboard_button/test_apps/CMakeLists.txt | 8 + .../test_apps/main/CMakeLists.txt | 3 + .../test_apps/main/idf_component.yml | 6 + .../test_apps/main/keyboard_test.c | 153 +++++ .../test_apps/sdkconfig.defaults | 8 + docs/Doxyfile | 1 + .../keyboard_button/keyboard_hardware.png | Bin 0 -> 203965 bytes docs/en/input_device/index.rst | 1 + docs/en/input_device/keyboard_button.rst | 108 ++++ docs/zh_CN/contribute/style-guide.rst | 44 +- docs/zh_CN/input_device/index.rst | 1 + docs/zh_CN/input_device/keyboard_button.rst | 108 ++++ 28 files changed, 1632 insertions(+), 22 deletions(-) create mode 100644 components/keyboard_button/CMakeLists.txt create mode 100644 components/keyboard_button/README.md create mode 100644 components/keyboard_button/idf_component.yml create mode 100644 components/keyboard_button/include/kbd_gpio.h create mode 100644 components/keyboard_button/include/kbd_gptimer.h create mode 100644 components/keyboard_button/include/keyboard_button.h create mode 100644 components/keyboard_button/keyboard_button.c create mode 100644 components/keyboard_button/src/kbd_gpio.c create mode 100644 components/keyboard_button/src/kbd_gptimer.c create mode 100644 components/keyboard_button/test_apps/CMakeLists.txt create mode 100644 components/keyboard_button/test_apps/main/CMakeLists.txt create mode 100644 components/keyboard_button/test_apps/main/idf_component.yml create mode 100644 components/keyboard_button/test_apps/main/keyboard_test.c create mode 100644 components/keyboard_button/test_apps/sdkconfig.defaults create mode 100644 docs/_static/input_device/keyboard_button/keyboard_hardware.png create mode 100644 docs/en/input_device/keyboard_button.rst create mode 100644 docs/zh_CN/input_device/keyboard_button.rst diff --git a/.github/workflows/upload_component.yml b/.github/workflows/upload_component.yml index 64e87a8be..b5619fe73 100644 --- a/.github/workflows/upload_component.yml +++ b/.github/workflows/upload_component.yml @@ -37,6 +37,7 @@ jobs: components/display/lcd_touch/esp_lcd_touch_spd2010; components/display/lcd_touch/esp_lcd_touch_st7123; components/elf_loader; + components/keyboard_button; components/extended_vfs; components/gprof; components/ir/ir_learn; diff --git a/.gitlab/ci/build.yml b/.gitlab/ci/build.yml index 290a06993..f0973aa40 100644 --- a/.gitlab/ci/build.yml +++ b/.gitlab/ci/build.yml @@ -800,6 +800,18 @@ build_components_display_lcd_touch_esp_lcd_touch_st7123_test_apps: variables: EXAMPLE_DIR: components/display/lcd_touch/esp_lcd_touch_st7123/test_apps +build_components_keyboard_button_test_apps: + extends: + - .build_examples_template + - .rules:build:components_keyboard_button_test_apps + parallel: + matrix: + - IMAGE: espressif/idf:release-v5.0 + - IMAGE: espressif/idf:release-v5.1 + - IMAGE: espressif/idf:release-v5.2 + variables: + EXAMPLE_DIR: components/keyboard_button/test_apps + build_components_ir_ir_learn_test_apps: extends: - .build_examples_template diff --git a/.gitlab/ci/deploy.yml b/.gitlab/ci/deploy.yml index 81048103d..77151540a 100644 --- a/.gitlab/ci/deploy.yml +++ b/.gitlab/ci/deploy.yml @@ -11,6 +11,7 @@ push_to_github: image: $CI_DOCKER_REGISTRY/esp32-ci-env variables: GIT_STRATEGY: clone + dependencies: [] before_script: - echo "skip default before_script" script: diff --git a/.gitlab/ci/rules.yml b/.gitlab/ci/rules.yml index 3e14d03c6..5a6d753bd 100644 --- a/.gitlab/ci/rules.yml +++ b/.gitlab/ci/rules.yml @@ -100,6 +100,9 @@ .patterns-components_display_touch_panel: &patterns-components_display_touch_panel - "components/display/touch_panel/**/*" +.patterns-components_keyboard_button: &patterns-components_keyboard_button + - "components/keyboard_button/**/*" + .patterns-components_expander_io_expander_mcp23017: &patterns-components_expander_io_expander_mcp23017 - "components/expander/io_expander/mcp23017/**/*" @@ -248,6 +251,7 @@ - "components/display/screen/screen_driver.h" - "components/display/touch_panel/touch_panel.h" - "components/ir/ir_learn/include/ir_learn.h" + - "components/keyboard_button/include/keyboard_button.h" - "components/knob/iot_knob.h" - "components/led/led_indicator/include/led_indicator.h" - "components/motor/esp_sensorless_bldc_control/control/include/bldc_control.h" @@ -1362,6 +1366,18 @@ - <<: *if-dev-push changes: *patterns-components_display_touch_panel +.rules:build:components_keyboard_button_test_apps: + rules: + - <<: *if-protected + - <<: *if-label-build + - <<: *if-label-target_test + - <<: *if-trigger-job + - <<: *if-dev-push + changes: *patterns-build_system + - <<: *if-dev-push + changes: *patterns-components_keyboard_button + + .rules:build:components_expander_io_expander_mcp23017_test: rules: - <<: *if-protected diff --git a/README.md b/README.md index 62bfc62cd..ce713c36b 100644 --- a/README.md +++ b/README.md @@ -69,6 +69,7 @@ The registered components in ESP-IoT-Solution are listed below: | [esp_lcd_st77922](https://components.espressif.com/components/espressif/esp_lcd_st77922) | [![Component Registry](https://components.espressif.com/components/espressif/esp_lcd_st77922/badge.svg)](https://components.espressif.com/components/espressif/esp_lcd_st77922) | [esp_lcd_touch_spd2010](https://components.espressif.com/components/espressif/esp_lcd_touch_spd2010) | [![Component Registry](https://components.espressif.com/components/espressif/esp_lcd_touch_spd2010/badge.svg)](https://components.espressif.com/components/espressif/esp_lcd_touch_spd2010) | | [esp_lcd_touch_st7123](https://components.espressif.com/components/espressif/esp_lcd_touch_st7123) | [![Component Registry](https://components.espressif.com/components/espressif/esp_lcd_touch_st7123/badge.svg)](https://components.espressif.com/components/espressif/esp_lcd_touch_st7123) | +| [keyboard_button](https://components.espressif.com/components/espressif/keyboard_button) | [![Component Registry](https://components.espressif.com/components/espressif/keyboard_button/badge.svg)](https://components.espressif.com/components/espressif/keyboard_button) | | [esp_simplefoc](https://components.espressif.com/components/espressif/esp_simplefoc) | [![Component Registry](https://components.espressif.com/components/espressif/esp_simplefoc/badge.svg)](https://components.espressif.com/components/espressif/esp_simplefoc) | | [esp_sensorless_bldc_control](https://components.espressif.com/components/espressif/esp_sensorless_bldc_control) | [![Component Registry](https://components.espressif.com/components/espressif/esp_sensorless_bldc_control/badge.svg)](https://components.espressif.com/components/espressif/esp_sensorless_bldc_control) | [esp_tinyuf2](https://components.espressif.com/components/espressif/esp_tinyuf2) | [![Component Registry](https://components.espressif.com/components/espressif/esp_tinyuf2/badge.svg)](https://components.espressif.com/components/espressif/esp_tinyuf2) | diff --git a/README_CN.md b/README_CN.md index 929a02a38..110935d66 100644 --- a/README_CN.md +++ b/README_CN.md @@ -69,6 +69,7 @@ ESP-IoT-Solution 中注册的组件如下: | [esp_lcd_st77922](https://components.espressif.com/components/espressif/esp_lcd_st77922) | [![Component Registry](https://components.espressif.com/components/espressif/esp_lcd_st77922/badge.svg)](https://components.espressif.com/components/espressif/esp_lcd_st77922) | [esp_lcd_touch_spd2010](https://components.espressif.com/components/espressif/esp_lcd_touch_spd2010) | [![Component Registry](https://components.espressif.com/components/espressif/esp_lcd_touch_spd2010/badge.svg)](https://components.espressif.com/components/espressif/esp_lcd_touch_spd2010) | | [esp_lcd_touch_st7123](https://components.espressif.com/components/espressif/esp_lcd_touch_st7123) | [![Component Registry](https://components.espressif.com/components/espressif/esp_lcd_touch_st7123/badge.svg)](https://components.espressif.com/components/espressif/esp_lcd_touch_st7123) | +| [keyboard_button](https://components.espressif.com/components/espressif/keyboard_button) | [![Component Registry](https://components.espressif.com/components/espressif/keyboard_button/badge.svg)](https://components.espressif.com/components/espressif/keyboard_button) | | [esp_simplefoc](https://components.espressif.com/components/espressif/esp_simplefoc) | [![Component Registry](https://components.espressif.com/components/espressif/esp_simplefoc/badge.svg)](https://components.espressif.com/components/espressif/esp_simplefoc) | | [esp_sensorless_bldc_control](https://components.espressif.com/components/espressif/esp_sensorless_bldc_control) | [![Component Registry](https://components.espressif.com/components/espressif/esp_sensorless_bldc_control/badge.svg)](https://components.espressif.com/components/espressif/esp_sensorless_bldc_control) | [esp_tinyuf2](https://components.espressif.com/components/espressif/esp_tinyuf2) | [![Component Registry](https://components.espressif.com/components/espressif/esp_tinyuf2/badge.svg)](https://components.espressif.com/components/espressif/esp_tinyuf2) | diff --git a/components/.build-rules.yml b/components/.build-rules.yml index 0b9369ef6..93e2e75b5 100644 --- a/components/.build-rules.yml +++ b/components/.build-rules.yml @@ -33,6 +33,7 @@ components/motor/esp_sensorless_bldc_control/test_apps/bldc_adc: components/motor/esp_sensorless_bldc_control/test_apps/bldc_comparer: disable: - if: IDF_TARGET in ["esp32c2"] + components/led/lightbulb_driver/test_apps: enable: - if: INCLUDE_DEFAULT == 1 @@ -96,3 +97,7 @@ components/display/lcd_touch/esp_lcd_touch_spd2010/test_apps: components/display/lcd_touch/esp_lcd_touch_st7123/test_apps: enable: - if: INCLUDE_DEFAULT == 1 + +components/keyboard_button/test_apps: + enable: + - if: INCLUDE_DEFAULT == 1 diff --git a/components/keyboard_button/CMakeLists.txt b/components/keyboard_button/CMakeLists.txt new file mode 100644 index 000000000..1255e1094 --- /dev/null +++ b/components/keyboard_button/CMakeLists.txt @@ -0,0 +1,6 @@ +idf_component_register(SRC_DIRS "src" "." + INCLUDE_DIRS "include" + REQUIRES driver esp_timer) + +include(package_manager) +cu_pkg_define_version(${CMAKE_CURRENT_LIST_DIR}) diff --git a/components/keyboard_button/README.md b/components/keyboard_button/README.md new file mode 100644 index 000000000..e47a39665 --- /dev/null +++ b/components/keyboard_button/README.md @@ -0,0 +1,22 @@ +[![Component Registry](https://components.espressif.com/components/espressif/keyboard_button/badge.svg)](https://components.espressif.com/components/espressif/keyboard_button) + +# Component: Keyboard Button +[Online documentation](https://docs.espressif.com/projects/esp-iot-solution/en/latest/input_device/keyboard_button.html) + +`keyboard_button` is a library for scanning keyboard matrix, supporting the following features: + +List of supported events: + * KBD_EVENT_PRESSED + * KBD_EVENT_COMBINATION + +* Supports full-key anti-ghosting scanning method. +* Supports efficient key scanning with a scan rate of no less than 1K. +* Supports low-power keyboard scanning. + +## Add component to your project + +Please use the component manager command `add-dependency` to add the `keyboard_button` to your project's dependency, during the `CMake` step the component will be downloaded automatically + +``` +idf.py add-dependency "espressif/keyboard_button=*" +``` \ No newline at end of file diff --git a/components/keyboard_button/idf_component.yml b/components/keyboard_button/idf_component.yml new file mode 100644 index 000000000..e04ba1713 --- /dev/null +++ b/components/keyboard_button/idf_component.yml @@ -0,0 +1,9 @@ +version: "0.1.0" +description: Keyboard button driver +url: https://github.com/espressif/esp-iot-solution/tree/master/components/keyboard_button +repository: https://github.com/espressif/esp-iot-solution.git +documentation: https://docs.espressif.com/projects/esp-iot-solution/en/latest/input_device/keyboard_button.html +issues: https://github.com/espressif/esp-iot-solution/issues +dependencies: + idf: ">=5.0" + cmake_utilities: "0.*" diff --git a/components/keyboard_button/include/kbd_gpio.h b/components/keyboard_button/include/kbd_gpio.h new file mode 100644 index 000000000..81559acbe --- /dev/null +++ b/components/keyboard_button/include/kbd_gpio.h @@ -0,0 +1,151 @@ +/* + * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#pragma once + +#include "driver/gpio.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Enumeration defining keyboard GPIO modes + */ +typedef enum { + KBD_GPIO_MODE_OUTPUT = 0, + KBD_GPIO_MODE_INPUT, +} kbd_gpio_mode_t; + +typedef struct { + const int *gpios; /*!< Array, contains GPIO numbers */ + uint32_t gpio_num; /*!< gpios array size */ + kbd_gpio_mode_t gpio_mode; /*!< GPIO mode */ + uint32_t active_level; /*!< Active level, only for input mode */ + bool enable_power_save; /*!< Enable power save, only for input mode */ +} kbd_gpio_config_t; + +/** + * @brief Init GPIOs for keyboard + * + * @param config Pointer to kbd_gpio_config_t + * @return + * - ESP_OK on success + * - ESP_ERR_INVALID_ARG Arguments is invalid. + */ +esp_err_t kbd_gpio_init(const kbd_gpio_config_t *config); + +/** + * @brief Deinitialize GPIOs used for keyboard + * + * This function deinitializes the GPIO pins used by the keyboard. + * It is a counterpart of kbd_gpio_init(). + * + * @param gpios Pointer to an array of GPIO numbers + * @param gpio_num Number of elements in the gpios array + */ +void kbd_gpio_deinit(const int *gpios, uint32_t gpio_num); + +/** + * @brief Read levels of multiple GPIOs + * + * This function reads levels of multiple GPIOs in one call. + * + * @param gpios Pointer to an array of GPIO numbers + * @param gpio_num Number of elements in the gpios array + * + * @return Bitmask of GPIO levels, bit N is set if GPIO N level is high + */ +uint32_t kbd_gpios_read_level(const int *gpios, uint32_t gpio_num); + +/** + * Read the level of a GPIO pin. + * + * @param gpio The GPIO pin number to read the level from + * + * @return The level of the GPIO pin (0 or 1) + */ +uint32_t kbd_gpio_read_level(int gpio); + +/** + * Set the level of one or more GPIO pins. + * + * @param gpio_num The GPIO pin number to set the level for + * @param level The level to set (0 or 1) + * + * @return esp_err_t The error code indicating success or failure + */ +void kbd_gpios_set_level(const int *gpios, uint32_t gpio_num, uint32_t level); + +/** + * Set the level of a GPIO pin. + * + * @param gpio The GPIO pin number to set the level for + * @param level The level to set (0 or 1) + * + * @return esp_err_t The error code indicating success or failure + */ +void kbd_gpio_set_level(int gpio, uint32_t level); + +/** + * @brief Enable holding of GPIOs to prevent them from floating + * + * This function enables holding of GPIOs to prevent them from floating. + * It iterates through the array of GPIO pins provided and enables hold + * for each of them. + * + * @param gpios Pointer to an array of GPIO numbers + * @param gpio_num Number of GPIOs in the array + */ +void kbd_gpios_set_hold_en(const int *gpios, uint32_t gpio_num); + +/** + * @brief Disable holding of GPIOs to prevent them from being held in reset + * + * This function disables holding of GPIOs to prevent them from being held in reset. + * It iterates through the array of GPIO pins provided and disables hold for each of them. + * + * @param gpios Pointer to an array of GPIO numbers + * @param gpio_num Number of GPIOs in the array + */ +void kbd_gpios_set_hold_dis(const int *gpios, uint32_t gpio_num); + +/** + * @brief Set interrupt configuration for multiple GPIOs + * + * This function configures interrupt settings for multiple GPIOs. + * It installs the ISR service if not already installed, then iterates + * through the array of GPIO pins provided and sets the interrupt type + * and ISR handler for each GPIO. + * + * @param gpios Pointer to an array of GPIO numbers + * @param gpio_num Number of GPIOs in the array + * @param intr_type Type of GPIO interrupt (GPIO_INTR_POSEDGE, GPIO_INTR_NEGEDGE, GPIO_INTR_ANYEDGE, GPIO_INTR_HIGH_LEVEL, GPIO_INTR_LOW_LEVEL) + * @param isr_handler ISR handler function pointer + * @param args Pointer to additional arguments for the ISR handler + * + * @return ESP_OK on success, error code otherwise + */ +esp_err_t kbd_gpios_set_intr(const int *gpios, uint32_t gpio_num, gpio_int_type_t intr_type, gpio_isr_t isr_handler, void *args); + +/** + * @brief Enable or disable GPIO interrupts + * + * This function enables or disables interrupts on the specified GPIOs. + * + * @param gpios Pointer to an array of GPIO numbers + * @param gpio_num Number of elements in the gpios array + * @param enable true to enable interrupts, false to disable + * + * @return + * - ESP_OK on success + * - ESP_ERR_INVALID_ARG Arguments is invalid. + */ +esp_err_t kbd_gpios_intr_control(const int *gpios, uint32_t gpio_num, bool enable); + +#ifdef __cplusplus +} +#endif diff --git a/components/keyboard_button/include/kbd_gptimer.h b/components/keyboard_button/include/kbd_gptimer.h new file mode 100644 index 000000000..2c2bc70d5 --- /dev/null +++ b/components/keyboard_button/include/kbd_gptimer.h @@ -0,0 +1,75 @@ +/* + * SPDX-FileCopyrightText: 2023-2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include "driver/gptimer.h" + +// 1MHz, 1 tick = 1us +#define GPTIMER_CONFIG_DEFAULT() \ +{ \ + .clk_src = GPTIMER_CLK_SRC_DEFAULT, \ + .direction = GPTIMER_COUNT_UP, \ + .resolution_hz = 1 * 1000 * 1000, \ +} + +#define GPTIMER_ALARM_CONFIG_DEFAULT(count) \ +{ \ + .reload_count = 0, \ + .flags.auto_reload_on_alarm = true, \ + .alarm_count = count, \ +} + +typedef struct { + gptimer_handle_t *gptimer; /*!< Pointer to gptimer handle */ + gptimer_event_callbacks_t cbs; /*!< gptimer event callbacks */ + void *user_data; /*!< User data */ + uint32_t alarm_count_us; /*!< Timer interrupt period */ +} kbd_gptimer_config_t; + +/** + * @brief Initialize gptime + * + * @param config Configuration for the gptimer + * @return + * ESP_OK on success + * ESP_ERR_INVALID_ARG if the parameter is invalid + */ +esp_err_t kbd_gptimer_init(kbd_gptimer_config_t *config); + +/** + * @brief deinitialize gptimer + * + * @param gptimer gptimer handle + * @return + * ESP_ERR_INVALID_ARG if parameter is invalid + * ESP_OK if success + */ +esp_err_t kbd_gptimer_deinit(gptimer_handle_t gptimer); + +/** + * @brief Stop the gptimer. + * + * @param gptimer gptimer handle + * @return ESP_OK if success + */ +esp_err_t kbd_gptimer_stop(gptimer_handle_t gptimer); + +/** + * @brief Start the gptimer. + * + * @param gptimer gptimer handle + * @return ESP_OK if success + */ +esp_err_t kbd_gptimer_start(gptimer_handle_t gptimer); + +#ifdef __cplusplus +} +#endif diff --git a/components/keyboard_button/include/keyboard_button.h b/components/keyboard_button/include/keyboard_button.h new file mode 100644 index 000000000..910e11582 --- /dev/null +++ b/components/keyboard_button/include/keyboard_button.h @@ -0,0 +1,184 @@ +/* + * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#pragma once + +#include "esp_err.h" +#include "kbd_gpio.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Keyboard button event + * + */ +typedef enum { + KBD_EVENT_PRESSED = 0, /*!< Report all currently pressed keys when a key is either pressed or released. */ + KBD_EVENT_COMBINATION, /*!< When the component buttons are pressed in sequence, report. */ + KBD_EVENT_MAX, +} keyboard_btn_event_t; + +/** + * @brief keyboard button data + * + */ +typedef struct { + uint8_t output_index; /*!< key position's output gpio number */ + uint8_t input_index; /*!< key position's input gpio number */ +} keyboard_btn_data_t; + +/** + * @brief keyboard button report data + * + */ +typedef struct { + int key_change_num; /*!< Number of key changes */ + uint32_t key_pressed_num; /*!< Number of keys pressed */ + uint32_t key_release_num; /*!< Number of keys released */ + keyboard_btn_data_t *key_data; /*!< Array, contains key codes */ + keyboard_btn_data_t *key_release_data; /*!< Array, contains key codes */ +} keyboard_btn_report_t; + +/** + * @brief keyboard button event data + * + */ +typedef union { + /** + * @brief combination event data + * eg: Set key_data = {(1,1), (2,2)} means + * that the button sequence is (1,1) -> (2,2) + */ + struct combination_t { + uint32_t key_num; /*!< Number of keys */ + keyboard_btn_data_t *key_data; /*!< Array, contains key codes by index. The button sequence is also provided through this */ + } combination; /*!< combination event */ +} keyboard_btn_event_data_t; + +/** + * @brief keyboard handle type + * + */ +typedef struct keyboard_btn_t *keyboard_btn_handle_t; + +/** + * @brief keyboard callback handle for unregister + * + */ +typedef void *keyboard_btn_cb_handle_t; + +typedef void (*keyboard_btn_callback_t)(keyboard_btn_handle_t kbd_handle, keyboard_btn_report_t kbd_report, void *user_data); + +/** + * @brief keybaord button callback config + * + */ +typedef struct { + keyboard_btn_event_t event; /*!< Event type */ + keyboard_btn_event_data_t event_data; /*!< Event data */ + keyboard_btn_callback_t callback; /*!< Callback function */ + void *user_data; /*!< Callback user data */ +} keyboard_btn_cb_config_t; + +/** + * @brief keyboard button config + * + */ +typedef struct { + const int *output_gpios; /*!< Array, contains output GPIO numbers used by rom/col line */ + const int *input_gpios; /*!< Array, contains input GPIO numbers used by rom/col line */ + uint32_t output_gpio_num; /*!< output_gpios array size */ + uint32_t input_gpio_num; /*!< input_gpios array size */ + uint32_t active_level; /*!< active level for the input gpios */ + uint32_t debounce_ticks; /*!< debounce time in ticks */ + uint32_t ticks_interval; /*!< interval time in us */ + bool enable_power_save; /*!< enable power save mode */ + UBaseType_t priority; /*!< FreeRTOS task priority */ + BaseType_t core_id; /*!< ESP32 core ID */ +} keyboard_btn_config_t; + +/** + * @brief Create a keyboard instance + * + * @param kbd_cfg keyboard configuration + * @param kbd_handle keyboard handle + * @return + * - ESP_OK on success + * - ESP_ERR_INVALID_ARG Arguments is invalid. + * - ESP_ERR_NO_MEM No more memory allocation. + */ +esp_err_t keyboard_button_create(keyboard_btn_config_t *kbd_cfg, keyboard_btn_handle_t *kbd_handle); + +/** + * @brief Delete the keyboard instance + * + * @param kbd_handle keyboard handle + * @return + * - ESP_OK on success + * - ESP_ERR_INVALID_ARG Arguments is invalid. + */ +esp_err_t keyboard_button_delete(keyboard_btn_handle_t kbd_handle); + +/** + * @brief Register the button callback function + * + * @param kbd_handle keyboard handle + * @param cb_cfg callback configuration + * @param rtn_cb_hdl callback handle for unregister + * @return + * - ESP_OK on success + * - ESP_ERR_INVALID_ARG Arguments is invalid. + * - ESP_ERR_NO_MEM No more memory allocation for the event + */ +esp_err_t keyboard_button_register_cb(keyboard_btn_handle_t kbd_handle, keyboard_btn_cb_config_t cb_cfg, keyboard_btn_cb_handle_t *rtn_cb_hdl); + +/** + * @brief Unregister the button callback function + * + * @note If only the event is provided, all callbacks associated with this event will be canceled. + * If rtn_cb_hdl is provided, only the specified callback will be unregistered. + * @param kbd_handle keyboard handle + * @param event event type + * @param rtn_cb_hdl callback handle for unregister + * @return + * - ESP_OK on success + * - ESP_ERR_INVALID_ARG Arguments is invalid. + * - ESP_ERR_NO_MEM No more memory allocation for the event + */ +esp_err_t keyboard_button_unregister_cb(keyboard_btn_handle_t kbd_handle, keyboard_btn_event_t event, keyboard_btn_cb_handle_t rtn_cb_hdl); + +/** + * @brief Get index by gpio number + * + * @param kbd_handle keyboard handle + * @param gpio_num gpio number + * @param gpio_mode gpio mode, input or output + * @param index return index + * @return + * - ESP_OK on success + * - ESP_ERR_INVALID_ARG Arguments is invalid. + * - ESP_ERR_NOT_FOUND The gpio number is not found. + */ +esp_err_t keyboard_button_get_index_by_gpio(keyboard_btn_handle_t kbd_handle, uint32_t gpio_num, kbd_gpio_mode_t gpio_mode, uint32_t *index); + +/** + * @brief Get gpio number by index + * + * @param kbd_handle keyboard handle + * @param index index + * @param gpio_mode gpio mode, input or output + * @param gpio_num return gpio number + * @return + * - ESP_OK on success + * - ESP_ERR_INVALID_ARG Arguments is invalid. + * - ESP_ERR_NOT_FOUND The index is not found. + */ +esp_err_t keyboard_button_get_gpio_by_index(keyboard_btn_handle_t kbd_handle, uint32_t index, kbd_gpio_mode_t gpio_mode, uint32_t *gpio_num); + +#ifdef __cplusplus +} +#endif diff --git a/components/keyboard_button/keyboard_button.c b/components/keyboard_button/keyboard_button.c new file mode 100644 index 000000000..2a7aa27fa --- /dev/null +++ b/components/keyboard_button/keyboard_button.c @@ -0,0 +1,536 @@ +/* + * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/event_groups.h" +#include "esp_log.h" +#include "esp_check.h" +#include "keyboard_button.h" +#include "kbd_gpio.h" +#include "kbd_gptimer.h" + +static const char *TAG = "keyboard_button"; + +#define OUTPUT_MASK_HIGE 0xFFFFFFFF +#define OUTPUT_MASK_LOW 0x00000000 + +#define KBD_TIMER_NOTIFY (1<<0) +#define KBD_EXIT (1<<1) +#define KBD_EXIT_OK (1<<2) + +#define CALL_EVENT_CB(ev) \ + if (kbd->cb_info[ev]) { \ + for (int i = 0; i < kbd->cb_size[ev]; i++) { \ + kbd->cb_info[ev][i].cb(kbd, report,kbd->cb_info[ev][i].user_data); \ + } \ + } \ + +typedef struct { + keyboard_btn_callback_t cb; + void *user_data; + keyboard_btn_event_data_t event_data; +} kbd_cb_info_t; + +typedef struct keyboard_btn_t { + int *input_gpios; + int input_gpio_num; + int *output_gpios; + int output_gpio_num; + bool enable_power_save; + bool can_enter_power_save; + EventGroupHandle_t event_group; + gptimer_handle_t gptimer_handle; + kbd_cb_info_t *cb_info[KBD_EVENT_MAX]; + size_t cb_size[KBD_EVENT_MAX]; + bool gptimer_start; + uint32_t debounce_ticks; + uint32_t ticks_interval; + uint32_t key_pressed_num; + uint8_t active_level; + /*!< Size: output_gpio_num * sizeof(uint32_t) */ + uint8_t *button_level; + /*!< Size: output_gpio_num * input_gpio_num * sizeof(uint8_t) */ + uint8_t *debounce_cnt; + /*!< Size: output_gpio_num * input_gpio_num * sizeof(keyboard_data_t) */ + keyboard_btn_data_t *key_data; + /*!< Size: output_gpio_num * input_gpio_num * sizeof(keyboard_data_t) */ + keyboard_btn_data_t *key_release_data; +} keyboard_btn_t; + +static bool IRAM_ATTR kbd_gptimer_cb(gptimer_handle_t timer, const gptimer_alarm_event_data_t *edata, void *user_ctx) +{ + keyboard_btn_t *kbd = (keyboard_btn_t *)user_ctx; + /*!< Determine if xSemaphore exists */ + BaseType_t xHigherPriorityTaskWoken = pdFALSE; + /*!< Floating-point numbers cannot be computed in an interrupt, informing the task to start an arithmetic control */ + xEventGroupSetBitsFromISR(kbd->event_group, KBD_TIMER_NOTIFY, &xHigherPriorityTaskWoken); + return (xHigherPriorityTaskWoken == pdTRUE); +} + +static inline void kbd_handler(keyboard_btn_t *kbd) +{ + bool key_change_inc_flag = false; + bool key_change_dec_flag = false; + uint32_t key_last_pressed_num = kbd->key_pressed_num; + uint32_t key_release_num = 0; + // Clear all output level + uint32_t output_level = kbd->active_level ? OUTPUT_MASK_LOW : OUTPUT_MASK_HIGE; + if (kbd->enable_power_save) { + kbd_gpios_set_hold_dis(kbd->output_gpios, kbd->output_gpio_num); + } + kbd_gpios_set_level(kbd->output_gpios, kbd->output_gpio_num, output_level); + + for (int i = 0; i < kbd->output_gpio_num; i++) { + /*!< Set the output level */ + kbd_gpio_set_level(kbd->output_gpios[i], kbd->active_level ? 1 : 0); + /*!< Read the input level */ + uint32_t input_level = kbd_gpios_read_level(kbd->input_gpios, kbd->input_gpio_num); + /*!< Clear the output level */ + kbd_gpio_set_level(kbd->output_gpios[i], kbd->active_level ? 0 : 1); + for (int j = 0; j < kbd->input_gpio_num; j++) { + uint8_t currect_btn_num = i * kbd->input_gpio_num + j; + uint8_t read_gpio_level = (input_level >> j) & 0x01; + uint8_t button_level = kbd->active_level ? kbd->button_level[currect_btn_num] : !kbd->button_level[currect_btn_num]; + if (read_gpio_level != button_level) { + kbd->can_enter_power_save = false; + if (++kbd->debounce_cnt[currect_btn_num] >= kbd->debounce_ticks) { + kbd->debounce_cnt[currect_btn_num] = 0; + kbd->button_level[currect_btn_num] = kbd->active_level ? read_gpio_level : !read_gpio_level; + // Make a report + if (kbd->button_level[currect_btn_num] == 1) { + key_change_inc_flag = true; + kbd->key_data[kbd->key_pressed_num].output_index = i; + kbd->key_data[kbd->key_pressed_num].input_index = j; + kbd->key_pressed_num++; + } else { + key_change_dec_flag = true; + /*!< Remove kbd->key_data and move the data forward */ + for (int k = 0; k < kbd->key_pressed_num; k++) { + if (kbd->key_data[k].output_index == i && kbd->key_data[k].input_index == j) { + for (int l = k; l < kbd->key_pressed_num; l++) { + kbd->key_data[l] = kbd->key_data[l + 1]; + } + break; + } + } + kbd->key_pressed_num--; + + kbd->key_release_data[key_release_num].output_index = i; + kbd->key_release_data[key_release_num].input_index = j; + key_release_num++; + } + } + } else { + kbd->debounce_cnt[currect_btn_num] = 0; + } + } + + } + + if (!(key_change_inc_flag || key_change_dec_flag)) { + return; + } + + /*!< Report the pressed event */ + keyboard_btn_report_t report = { + .key_data = kbd->key_data, + .key_pressed_num = kbd->key_pressed_num, + .key_release_num = key_release_num, + .key_change_num = kbd->key_pressed_num - key_last_pressed_num, + .key_release_data = kbd->key_release_data + }; + CALL_EVENT_CB(KBD_EVENT_PRESSED); + + /*!< Check the combination event */ + if (key_change_inc_flag && kbd->cb_info[KBD_EVENT_COMBINATION]) { + for (int i = 0; i < kbd->cb_size[KBD_EVENT_COMBINATION]; i++) { + kbd_cb_info_t *cb_info = &kbd->cb_info[KBD_EVENT_COMBINATION][i]; + keyboard_btn_data_t *combination_key_data = cb_info->event_data.combination.key_data; + uint8_t key_num = cb_info->event_data.combination.key_num; + if (key_num == kbd->key_pressed_num) { + uint8_t key_pressed = true; + for (int j = 0; j < key_num; j++) { + if (combination_key_data[j].output_index != kbd->key_data[j].output_index || + combination_key_data[j].input_index != kbd->key_data[j].input_index) { + key_pressed = false; + break; + } + } + + if (key_pressed) { + cb_info->cb(kbd, report, cb_info->user_data); + } + } + } + } +} + +// TODO: Add to kconfig +#define CONFIG_KEYBOARD_TEST_RUN_TIME 0 + +#if CONFIG_KEYBOARD_TEST_RUN_TIME +#include "esp_timer.h" +#endif + +static void kbd_task(void *args) +{ + keyboard_btn_t *kbd = (keyboard_btn_t *)args; + EventBits_t uxBits; + while (1) { + /*!< Waiting for the notification */ + uxBits = xEventGroupWaitBits(kbd->event_group, KBD_TIMER_NOTIFY | KBD_EXIT, pdTRUE, pdFALSE, portMAX_DELAY); + if (uxBits & KBD_EXIT) { + ESP_LOGI(TAG, "kbd task exit"); + break; + } + if (uxBits & KBD_TIMER_NOTIFY) { + /*!< Keyboard handler */ +#if CONFIG_KEYBOARD_TEST_RUN_TIME + uint64_t start_time = esp_timer_get_time(); +#endif + if (kbd->enable_power_save) { + kbd->can_enter_power_save = true; + } + kbd_handler(kbd); + if (kbd->enable_power_save && kbd->key_pressed_num == 0 && kbd->can_enter_power_save == true) { + /*!< Enter power save */ + ESP_LOGD(TAG, "Enter power save"); + kbd_gptimer_stop(kbd->gptimer_handle); + kbd->gptimer_start = false; + kbd_gpios_intr_control(kbd->input_gpios, kbd->input_gpio_num, true); + kbd_gpios_set_level(kbd->output_gpios, kbd->output_gpio_num, kbd->active_level ? OUTPUT_MASK_HIGE : OUTPUT_MASK_LOW); + kbd_gpios_set_hold_en(kbd->output_gpios, kbd->output_gpio_num); + } + +#if CONFIG_KEYBOARD_TEST_RUN_TIME + uint64_t end_time = esp_timer_get_time(); + uint64_t duration = end_time - start_time; + printf("Task duration: %llu microseconds\n", duration); +#endif + } + } + xEventGroupSetBits(kbd->event_group, KBD_EXIT_OK); + vTaskDelete(NULL); +} + +static void IRAM_ATTR kbd_power_save_isr_handler(void* arg) +{ + keyboard_btn_t *kbd = (keyboard_btn_t *)arg; + if (!kbd->gptimer_start) { + kbd_gptimer_start(kbd->gptimer_handle); + kbd->gptimer_start = true; + } + kbd_gpios_intr_control(kbd->input_gpios, kbd->input_gpio_num, false); +} + +esp_err_t keyboard_button_create(keyboard_btn_config_t *kbd_cfg, keyboard_btn_handle_t *kbd_handle) +{ + ESP_LOGI(TAG, "KeyBoard Button Version: %d.%d.%d", KEYBOARD_BUTTON_VER_MAJOR, KEYBOARD_BUTTON_VER_MINOR, KEYBOARD_BUTTON_VER_PATCH); + + ESP_RETURN_ON_FALSE(kbd_cfg, ESP_ERR_INVALID_ARG, TAG, "Config cannot be NULL"); + ESP_RETURN_ON_FALSE(kbd_handle, ESP_ERR_INVALID_ARG, TAG, "keyboard handle cannot be NULL"); + ESP_RETURN_ON_FALSE(kbd_cfg->output_gpios, ESP_ERR_INVALID_ARG, TAG, "Output GPIOs cannot be NULL"); + ESP_RETURN_ON_FALSE(kbd_cfg->input_gpios, ESP_ERR_INVALID_ARG, TAG, "Input GPIOs cannot be NULL"); + ESP_RETURN_ON_FALSE(kbd_cfg->output_gpio_num, ESP_ERR_INVALID_ARG, TAG, "Output number cannot be 0"); + ESP_RETURN_ON_FALSE(kbd_cfg->input_gpio_num, ESP_ERR_INVALID_ARG, TAG, "Input number cannot be 0"); + + esp_err_t ret = ESP_OK; + + keyboard_btn_t *kbd = calloc(1, sizeof(keyboard_btn_t)); + ESP_RETURN_ON_FALSE(kbd, ESP_ERR_NO_MEM, TAG, "Failed to allocate memory for keyboard"); + + int *output_gpios = calloc(kbd_cfg->output_gpio_num, sizeof(int)); + ESP_GOTO_ON_FALSE(output_gpios, ESP_ERR_NO_MEM, exit, TAG, "Failed to allocate memory for output GPIOs"); + + int *input_gpios = calloc(kbd_cfg->input_gpio_num, sizeof(int)); + ESP_GOTO_ON_FALSE(input_gpios, ESP_ERR_NO_MEM, exit, TAG, "Failed to allocate memory for input GPIOs"); + + kbd->output_gpios = output_gpios; + kbd->output_gpio_num = kbd_cfg->output_gpio_num; + memcpy(kbd->output_gpios, kbd_cfg->output_gpios, kbd_cfg->output_gpio_num * sizeof(int)); + + kbd->input_gpios = input_gpios; + kbd->input_gpio_num = kbd_cfg->input_gpio_num; + memcpy(kbd->input_gpios, kbd_cfg->input_gpios, kbd_cfg->input_gpio_num * sizeof(int)); + + kbd->active_level = kbd_cfg->active_level ? 1 : 0; + kbd->debounce_ticks = kbd_cfg->debounce_ticks; + kbd->ticks_interval = kbd_cfg->ticks_interval; + kbd->enable_power_save = kbd_cfg->enable_power_save; + kbd->button_level = calloc(kbd->output_gpio_num * kbd->input_gpio_num, sizeof(uint8_t)); + ESP_GOTO_ON_FALSE(kbd->button_level, ESP_ERR_NO_MEM, exit, TAG, "Failed to allocate memory for button level"); + + kbd->debounce_cnt = calloc(kbd->output_gpio_num * kbd->input_gpio_num, sizeof(uint8_t)); + ESP_GOTO_ON_FALSE(kbd->debounce_cnt, ESP_ERR_NO_MEM, exit, TAG, "Failed to allocate memory for debounce count"); + + kbd->key_data = calloc(kbd->output_gpio_num * kbd->input_gpio_num, sizeof(keyboard_btn_data_t)); + ESP_GOTO_ON_FALSE(kbd->key_data, ESP_ERR_NO_MEM, exit, TAG, "Failed to allocate memory for key data"); + + kbd->key_release_data = calloc(kbd->output_gpio_num * kbd->input_gpio_num, sizeof(keyboard_btn_data_t)); + ESP_GOTO_ON_FALSE(kbd->key_release_data, ESP_ERR_NO_MEM, exit, TAG, "Failed to allocate memory for key release data"); + + kbd_gpio_config_t gpio_cfg = {0}; + gpio_cfg.gpios = kbd_cfg->input_gpios; + gpio_cfg.gpio_num = kbd_cfg->input_gpio_num; + gpio_cfg.gpio_mode = KBD_GPIO_MODE_INPUT; + gpio_cfg.active_level = kbd_cfg->active_level; + gpio_cfg.enable_power_save = kbd_cfg->enable_power_save; + ret = kbd_gpio_init(&gpio_cfg); + ESP_GOTO_ON_FALSE(ret == ESP_OK, ESP_FAIL, exit, TAG, "Failed to initialize input GPIOs"); + + gpio_cfg.gpios = kbd_cfg->output_gpios; + gpio_cfg.gpio_num = kbd_cfg->output_gpio_num; + gpio_cfg.gpio_mode = KBD_GPIO_MODE_OUTPUT; + ret = kbd_gpio_init(&gpio_cfg); + ESP_GOTO_ON_FALSE(ret == ESP_OK, ESP_FAIL, exit, TAG, "Failed to initialize output GPIOs"); + + kbd->event_group = xEventGroupCreate(); + ESP_GOTO_ON_FALSE(kbd->event_group, ESP_ERR_NO_MEM, exit, TAG, "Failed to create event group"); + + /*!< Create a timer */ + kbd_gptimer_config_t gptimer_cfg = { + .gptimer = &kbd->gptimer_handle, + .cbs.on_alarm = kbd_gptimer_cb, + .user_data = kbd, + .alarm_count_us = kbd_cfg->ticks_interval, + }; + + uint32_t priority = kbd_cfg->priority; + if (priority == 0) { + priority = 5; + } + + ret = kbd_gptimer_init(&gptimer_cfg); + ESP_GOTO_ON_FALSE(ret == ESP_OK, ESP_FAIL, exit, TAG, "Failed to initialize gptimer"); + + /*!< Start the timer */ + if (!kbd->gptimer_start) { + ret = kbd_gptimer_start(kbd->gptimer_handle); + ESP_GOTO_ON_FALSE(ret == ESP_OK, ESP_FAIL, exit, TAG, "Failed to start gptimer"); + kbd->gptimer_start = true; + } + + if (kbd_cfg->enable_power_save) { + kbd_gpios_set_intr(kbd->input_gpios, kbd->input_gpio_num, kbd->active_level == 0 ? GPIO_INTR_LOW_LEVEL : GPIO_INTR_HIGH_LEVEL, kbd_power_save_isr_handler, (void *)kbd); + } + + /*!< Create a task */ + xTaskCreatePinnedToCore(kbd_task, "kbd_task", 4096, kbd, priority, NULL, kbd_cfg->core_id); + + *kbd_handle = kbd; + + return ESP_OK; + +exit: + if (kbd) { + if (kbd->button_level) { + free(kbd->button_level); + } + if (kbd->debounce_cnt) { + free(kbd->debounce_cnt); + } + if (kbd->key_data) { + free(kbd->key_data); + } + if (kbd->key_release_data) { + free(kbd->key_release_data); + } + if (kbd->input_gpios) { + free(kbd->input_gpios); + } + if (kbd->output_gpios) { + free(kbd->output_gpios); + } + if (kbd->gptimer_handle) { + kbd_gptimer_deinit(kbd->gptimer_handle); + } + if (kbd->event_group) { + vEventGroupDelete(kbd->event_group); + } + free(kbd); + } + return ret; +} + +esp_err_t keyboard_button_delete(keyboard_btn_handle_t kbd_handle) +{ + ESP_RETURN_ON_FALSE(kbd_handle, ESP_ERR_INVALID_ARG, TAG, "Keyboard handle cannot be NULL"); + + keyboard_btn_t *kbd = (keyboard_btn_t *)kbd_handle; + kbd_gptimer_deinit(kbd->gptimer_handle); + xEventGroupSetBits(kbd->event_group, KBD_EXIT); + xEventGroupWaitBits(kbd->event_group, KBD_EXIT_OK, pdTRUE, pdTRUE, portMAX_DELAY); + + kbd_gpio_deinit(kbd->input_gpios, kbd->input_gpio_num); + kbd_gpio_deinit(kbd->output_gpios, kbd->output_gpio_num); + if (kbd->button_level) { + free(kbd->button_level); + } + if (kbd->debounce_cnt) { + free(kbd->debounce_cnt); + } + if (kbd->key_data) { + free(kbd->key_data); + } + if (kbd->key_release_data) { + free(kbd->key_release_data); + } + if (kbd->input_gpios) { + free(kbd->input_gpios); + } + if (kbd->output_gpios) { + free(kbd->output_gpios); + } + for (int i = 0; i < KBD_EVENT_MAX; i++) { + if (kbd->cb_info[i]) { + for (int j = 0; j < kbd->cb_size[i]; j++) { + if (kbd->cb_info[i][j].event_data.combination.key_data) { + free(kbd->cb_info[i][j].event_data.combination.key_data); + } + } + free(kbd->cb_info[i]); + } + } + free(kbd); + return ESP_OK; +} + +esp_err_t keyboard_button_register_cb(keyboard_btn_handle_t kbd_handle, keyboard_btn_cb_config_t cb_cfg, keyboard_btn_cb_handle_t *rtn_cb_hdl) +{ + ESP_RETURN_ON_FALSE(kbd_handle, ESP_ERR_INVALID_ARG, TAG, "Keyboard handle cannot be NULL"); + ESP_RETURN_ON_FALSE(cb_cfg.callback, ESP_ERR_INVALID_ARG, TAG, "Callback cannot be NULL"); + ESP_RETURN_ON_FALSE(cb_cfg.event < KBD_EVENT_MAX, ESP_ERR_INVALID_ARG, TAG, "Invalid event"); + + keyboard_btn_t *kbd = (keyboard_btn_t *)kbd_handle; + keyboard_btn_event_t event = cb_cfg.event; + + /*!< Expand the event dynamic array. */ + if (!kbd->cb_info[event]) { + kbd->cb_info[event] = calloc(1, sizeof(kbd_cb_info_t)); + ESP_RETURN_ON_FALSE(kbd->cb_info[event], ESP_ERR_NO_MEM, TAG, "Failed to allocate memory for callback info"); + + } else { + kbd_cb_info_t *p = realloc(kbd->cb_info[event], sizeof(kbd_cb_info_t) * (kbd->cb_size[event] + 1)); + ESP_RETURN_ON_FALSE(p, ESP_ERR_NO_MEM, TAG, "Failed to allocate memory for callback info"); + kbd->cb_info[event] = p; + } + + kbd_cb_info_t *cb_info = &kbd->cb_info[event][kbd->cb_size[event]]; + kbd->cb_size[event]++; + cb_info->cb = cb_cfg.callback; + cb_info->user_data = cb_cfg.user_data; + + /*!< For combination event */ + if (event == KBD_EVENT_COMBINATION) { + cb_info->event_data.combination.key_num = cb_cfg.event_data.combination.key_num; + cb_info->event_data.combination.key_data = calloc(cb_cfg.event_data.combination.key_num, sizeof(keyboard_btn_data_t)); + ESP_RETURN_ON_FALSE(cb_info->event_data.combination.key_data, ESP_ERR_NO_MEM, TAG, "Failed to allocate memory for combination key data"); + memcpy(cb_info->event_data.combination.key_data, cb_cfg.event_data.combination.key_data, cb_cfg.event_data.combination.key_num * sizeof(keyboard_btn_data_t)); + } + + if (rtn_cb_hdl) { + *rtn_cb_hdl = cb_info; + } + + return ESP_OK; +} +esp_err_t keyboard_button_unregister_cb(keyboard_btn_handle_t kbd_handle, keyboard_btn_event_t event, keyboard_btn_cb_handle_t rtn_cb_hdl) +{ + ESP_RETURN_ON_FALSE(kbd_handle, ESP_ERR_INVALID_ARG, TAG, "Keyboard handle cannot be NULL"); + ESP_RETURN_ON_FALSE(event < KBD_EVENT_MAX, ESP_ERR_INVALID_ARG, TAG, "Invalid event"); + + keyboard_btn_t *kbd = (keyboard_btn_t *)kbd_handle; + if (rtn_cb_hdl) { + /*!< Find the cb */ + int check = -1; + for (int i = 0; i < kbd->cb_size[event]; i++) { + if (&kbd->cb_info[event][i] == (kbd_cb_info_t *)rtn_cb_hdl) { + check = i; + break; + } + } + + ESP_RETURN_ON_FALSE(check != -1, ESP_ERR_NOT_FOUND, TAG, "Callback not found"); + kbd_cb_info_t *cb_info = &kbd->cb_info[event][check]; + if (cb_info->event_data.combination.key_data) { + free(cb_info->event_data.combination.key_data); + } + + /*!< Move the last one to the current position */ + if (check != kbd->cb_size[event] - 1) { + kbd->cb_info[event][check] = kbd->cb_info[event][kbd->cb_size[event] - 1]; + } + + if (kbd->cb_size[event] != 1) { + kbd_cb_info_t *p = realloc(kbd->cb_info[event], sizeof(kbd_cb_info_t) * (kbd->cb_size[event] - 1)); + ESP_RETURN_ON_FALSE(p, ESP_ERR_NO_MEM, TAG, "Failed to allocate memory for callback info"); + kbd->cb_info[event] = p; + } else { + free(kbd->cb_info[event]); + kbd->cb_info[event] = NULL; + } + + kbd->cb_size[event]--; + } else { + for (int i = 0; i < kbd->cb_size[event]; i++) { + kbd_cb_info_t *cb_info = &kbd->cb_info[event][i]; + if (cb_info->event_data.combination.key_data) { + free(cb_info->event_data.combination.key_data); + } + } + free(kbd->cb_info[event]); + kbd->cb_info[event] = NULL; + kbd->cb_size[event] = 0; + } + return ESP_OK; +} + +esp_err_t keyboard_button_get_index_by_gpio(keyboard_btn_handle_t kbd_handle, uint32_t gpio_num, kbd_gpio_mode_t gpio_mode, uint32_t *index) +{ + ESP_RETURN_ON_FALSE(kbd_handle, ESP_ERR_INVALID_ARG, TAG, "Keyboard handle cannot be NULL"); + ESP_RETURN_ON_FALSE(index, ESP_ERR_INVALID_ARG, TAG, "Index cannot be NULL"); + + keyboard_btn_t *kbd = (keyboard_btn_t *)kbd_handle; + if (gpio_mode == KBD_GPIO_MODE_INPUT) { + for (int i = 0; i < kbd->input_gpio_num; i++) { + if (kbd->input_gpios[i] == gpio_num) { + *index = i; + return ESP_OK; + } + } + } else if (gpio_mode == KBD_GPIO_MODE_OUTPUT) { + for (int i = 0; i < kbd->output_gpio_num; i++) { + if (kbd->output_gpios[i] == gpio_num) { + *index = i; + return ESP_OK; + } + } + } + return ESP_ERR_NOT_FOUND; +} + +esp_err_t keyboard_button_get_gpio_by_index(keyboard_btn_handle_t kbd_handle, uint32_t index, kbd_gpio_mode_t gpio_mode, uint32_t *gpio_num) +{ + ESP_RETURN_ON_FALSE(kbd_handle, ESP_ERR_INVALID_ARG, TAG, "Keyboard handle cannot be NULL"); + ESP_RETURN_ON_FALSE(gpio_num, ESP_ERR_INVALID_ARG, TAG, "GPIO number cannot be NULL"); + + keyboard_btn_t *kbd = (keyboard_btn_t *)kbd_handle; + if (gpio_mode == KBD_GPIO_MODE_INPUT) { + if (index < kbd->input_gpio_num) { + *gpio_num = kbd->input_gpios[index]; + return ESP_OK; + } + } else if (gpio_mode == KBD_GPIO_MODE_OUTPUT) { + if (index < kbd->output_gpio_num) { + *gpio_num = kbd->output_gpios[index]; + return ESP_OK; + } + } + return ESP_ERR_NOT_FOUND; +} diff --git a/components/keyboard_button/src/kbd_gpio.c b/components/keyboard_button/src/kbd_gpio.c new file mode 100644 index 000000000..000339460 --- /dev/null +++ b/components/keyboard_button/src/kbd_gpio.c @@ -0,0 +1,133 @@ +/* + * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "esp_log.h" +#include "driver/gpio.h" +#include "kbd_gpio.h" +#include "esp_check.h" +#include "esp_sleep.h" + +static const char *TAG = "kbd_gpio"; + +esp_err_t kbd_gpio_init(const kbd_gpio_config_t *config) +{ + ESP_RETURN_ON_FALSE(config, ESP_ERR_INVALID_ARG, TAG, "Pointer of config is invalid"); + ESP_RETURN_ON_FALSE(config->gpio_num < GPIO_NUM_MAX && config->gpio_num > 0, ESP_ERR_INVALID_ARG, TAG, "Invalid GPIO number"); + + gpio_config_t gpio_conf = {0}; + esp_err_t ret = ESP_OK; + gpio_conf.intr_type = GPIO_INTR_DISABLE; + if (config->gpio_mode == KBD_GPIO_MODE_INPUT) { + gpio_conf.mode = GPIO_MODE_INPUT; + if (config->active_level) { + gpio_conf.pull_down_en = GPIO_PULLDOWN_ENABLE; + gpio_conf.pull_up_en = GPIO_PULLUP_DISABLE; + } else { + gpio_conf.pull_down_en = GPIO_PULLDOWN_DISABLE; + gpio_conf.pull_up_en = GPIO_PULLUP_ENABLE; + } + } else { + gpio_conf.mode = GPIO_MODE_OUTPUT; + } + + for (int i = 0; i < config->gpio_num; i++) { + ESP_RETURN_ON_FALSE(config->gpios[i] < GPIO_NUM_MAX && config->gpios[i] > -1, ESP_ERR_INVALID_ARG, TAG, "Invalid GPIO number"); + gpio_conf.pin_bit_mask = 1ULL << config->gpios[i]; + gpio_config(&gpio_conf); + } + + if (config->enable_power_save) { + if (!(config->gpio_mode == KBD_GPIO_MODE_INPUT)) { + return ESP_OK; + } + + for (int i = 0; i < config->gpio_num; i++) { + ret = gpio_wakeup_enable(config->gpios[i], config->active_level == 0 ? GPIO_INTR_LOW_LEVEL : GPIO_INTR_HIGH_LEVEL); + ESP_RETURN_ON_FALSE(ret == ESP_OK, ESP_FAIL, TAG, "Enable gpio wakeup failed"); + } + ret = esp_sleep_enable_gpio_wakeup(); + ESP_RETURN_ON_FALSE(ret == ESP_OK, ESP_FAIL, TAG, "Enable gpio wakeup failed"); + } + + // TODO: Use dedicated_gpio + + return ESP_OK; +} + +void kbd_gpio_deinit(const int *gpios, uint32_t gpio_num) +{ + for (int i = 0; i < gpio_num; i++) { + gpio_reset_pin(gpios[i]); + } +} + +uint32_t kbd_gpios_read_level(const int *gpios, uint32_t gpio_num) +{ + uint32_t level = 0; + for (int i = 0; i < gpio_num; i++) { + level |= (gpio_get_level(gpios[i]) << i); + } + return level; +} + +uint32_t kbd_gpio_read_level(int gpio) +{ + return (uint32_t)gpio_get_level(gpio); +} + +void kbd_gpios_set_level(const int *gpios, uint32_t gpio_num, uint32_t level) +{ + for (int i = 0; i < gpio_num; i++) { + gpio_set_level(gpios[i], (level >> i) & 0x01); + } +} + +void kbd_gpio_set_level(int gpio, uint32_t level) +{ + gpio_set_level(gpio, level); +} + +void kbd_gpios_set_hold_en(const int *gpios, uint32_t gpio_num) +{ + for (int i = 0; i < gpio_num; i++) { + gpio_hold_en(gpios[i]); + } +} + +void kbd_gpios_set_hold_dis(const int *gpios, uint32_t gpio_num) +{ + for (int i = 0; i < gpio_num; i++) { + gpio_hold_dis(gpios[i]); + } +} + +esp_err_t kbd_gpios_set_intr(const int *gpios, uint32_t gpio_num, gpio_int_type_t intr_type, gpio_isr_t isr_handler, void *args) +{ + static bool isr_service_installed = false; + if (!isr_service_installed) { + gpio_install_isr_service(ESP_INTR_FLAG_IRAM); + isr_service_installed = true; + } + for (int i = 0; i < gpio_num; i++) { + gpio_set_intr_type(gpios[i], intr_type); + gpio_isr_handler_add(gpios[i], isr_handler, args); + } + return ESP_OK; +} + +esp_err_t kbd_gpios_intr_control(const int *gpios, uint32_t gpio_num, bool enable) +{ + for (int i = 0; i < gpio_num; i++) { + if (enable) { + gpio_intr_enable(gpios[i]); + } else { + gpio_intr_disable(gpios[i]); + } + } + return ESP_OK; +} + +// TODO: uint32_t kbd_dedicated_gpio_read_level(void *bundle) diff --git a/components/keyboard_button/src/kbd_gptimer.c b/components/keyboard_button/src/kbd_gptimer.c new file mode 100644 index 000000000..a1b49d634 --- /dev/null +++ b/components/keyboard_button/src/kbd_gptimer.c @@ -0,0 +1,60 @@ +/* + * SPDX-FileCopyrightText: 2023-2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "esp_check.h" +#include "kbd_gptimer.h" + +static const char *TAG = "kbd_gptimer"; + +esp_err_t kbd_gptimer_init(kbd_gptimer_config_t *config) +{ + ESP_RETURN_ON_FALSE(config != NULL, ESP_ERR_INVALID_ARG, TAG, "Pointer of config is NULL"); + ESP_RETURN_ON_FALSE(config->gptimer != NULL, ESP_ERR_INVALID_ARG, TAG, "Pointer of gptimer is NULL"); + gptimer_config_t timer_config = GPTIMER_CONFIG_DEFAULT(); + esp_err_t err = gptimer_new_timer(&timer_config, config->gptimer); + ESP_RETURN_ON_FALSE(err == ESP_OK, err, TAG, "Failed to create gptimer"); + + err = gptimer_register_event_callbacks(*config->gptimer, &config->cbs, config->user_data); + ESP_RETURN_ON_FALSE(err == ESP_OK, err, TAG, "Failed to register gptimer callbacks"); + + gptimer_alarm_config_t alarm_config = GPTIMER_ALARM_CONFIG_DEFAULT(config->alarm_count_us); + err = gptimer_set_alarm_action(*config->gptimer, &alarm_config); + ESP_RETURN_ON_FALSE(err == ESP_OK, err, TAG, "Failed to set gptimer alarm action"); + + return ESP_OK; +} + +esp_err_t kbd_gptimer_start(gptimer_handle_t gptimer) +{ + ESP_RETURN_ON_FALSE(gptimer != NULL, ESP_ERR_INVALID_ARG, TAG, "Pointer of gptimer is NULL"); + esp_err_t err = gptimer_enable(gptimer); + ESP_RETURN_ON_FALSE(err == ESP_OK, err, TAG, "Failed to enable gptimer"); + err = gptimer_start(gptimer); + ESP_RETURN_ON_FALSE(err == ESP_OK, err, TAG, "Failed to start gptimer"); + return ESP_OK; +} + +esp_err_t kbd_gptimer_stop(gptimer_handle_t gptimer) +{ + ESP_RETURN_ON_FALSE(gptimer != NULL, ESP_ERR_INVALID_ARG, TAG, "Pointer of gptimer is NULL"); + esp_err_t err = gptimer_stop(gptimer); + ESP_RETURN_ON_FALSE(err == ESP_OK, err, TAG, "Failed to stop gptimer"); + err = gptimer_disable(gptimer); + ESP_RETURN_ON_FALSE(err == ESP_OK, err, TAG, "Failed to disable gptimer"); + return ESP_OK; +} + +esp_err_t kbd_gptimer_deinit(gptimer_handle_t gptimer) +{ + ESP_RETURN_ON_FALSE(gptimer != NULL, ESP_ERR_INVALID_ARG, TAG, "Pointer of gptimer is NULL"); + esp_err_t err = gptimer_stop(gptimer); + ESP_RETURN_ON_FALSE(err == ESP_OK, err, TAG, "Failed to stop gptimer"); + err = gptimer_disable(gptimer); + ESP_RETURN_ON_FALSE(err == ESP_OK, err, TAG, "Failed to disable gptimer"); + err = gptimer_del_timer(gptimer); + ESP_RETURN_ON_FALSE(err == ESP_OK, err, TAG, "Failed to delete gptimer"); + return ESP_OK; +} diff --git a/components/keyboard_button/test_apps/CMakeLists.txt b/components/keyboard_button/test_apps/CMakeLists.txt new file mode 100644 index 000000000..dbe1500bb --- /dev/null +++ b/components/keyboard_button/test_apps/CMakeLists.txt @@ -0,0 +1,8 @@ + +# The following 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(EXTRA_COMPONENT_DIRS "$ENV{IDF_PATH}/tools/unit-test-app/components") +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(keyboard_test) diff --git a/components/keyboard_button/test_apps/main/CMakeLists.txt b/components/keyboard_button/test_apps/main/CMakeLists.txt new file mode 100644 index 000000000..47ccb852a --- /dev/null +++ b/components/keyboard_button/test_apps/main/CMakeLists.txt @@ -0,0 +1,3 @@ +idf_component_register(SRC_DIRS "." + PRIV_INCLUDE_DIRS "." + PRIV_REQUIRES unity test_utils keyboard_button) diff --git a/components/keyboard_button/test_apps/main/idf_component.yml b/components/keyboard_button/test_apps/main/idf_component.yml new file mode 100644 index 000000000..55d63e630 --- /dev/null +++ b/components/keyboard_button/test_apps/main/idf_component.yml @@ -0,0 +1,6 @@ +version: "0.0.1" +dependencies: + idf: ">=5.0" + keyboard_button: + version: "*" + override_path: "../../../keyboard_button" diff --git a/components/keyboard_button/test_apps/main/keyboard_test.c b/components/keyboard_button/test_apps/main/keyboard_test.c new file mode 100644 index 000000000..26c96c413 --- /dev/null +++ b/components/keyboard_button/test_apps/main/keyboard_test.c @@ -0,0 +1,153 @@ +/* SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "stdio.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "esp_idf_version.h" +#include "esp_log.h" +#include "unity.h" +#include "keyboard_button.h" +#include "sdkconfig.h" + +static const char *TAG = "KEYBOARD TEST"; + +#define TEST_MEMORY_LEAK_THRESHOLD (-400) + +static size_t before_free_8bit; +static size_t before_free_32bit; + +static void keyboard_cb(keyboard_btn_handle_t kbd_handle, keyboard_btn_report_t kbd_report, void *user_data) +{ + if (kbd_report.key_pressed_num == 0) { + ESP_LOGI(TAG, "All keys released\n\n"); + return; + } + printf("pressed: "); + for (int i = 0; i < kbd_report.key_pressed_num; i++) { + printf("(%d,%d) ", kbd_report.key_data[i].output_index, kbd_report.key_data[i].input_index); + } + printf("\n\n"); +} + +static void keyboard_combination_cb1(keyboard_btn_handle_t kbd_handle, keyboard_btn_report_t kbd_report, void *user_data) +{ + printf("combination 1: "); + for (int i = 0; i < kbd_report.key_pressed_num; i++) { + printf("(%d,%d) ", kbd_report.key_data[i].output_index, kbd_report.key_data[i].input_index); + } + printf("\n\n"); +} + +static keyboard_btn_handle_t _kbd_init(void) +{ + keyboard_btn_config_t cfg = { + .output_gpios = (int[]) + { + 40, 39, 38, 45, 48, 47 + }, + .output_gpio_num = 6, + .input_gpios = (int[]) + { + 21, 14, 13, 12, 11, 10, 9, 4, 5, 6, 7, 15, 16, 17, 18 + }, + .input_gpio_num = 15, + .active_level = 1, + .debounce_ticks = 2, + .ticks_interval = 500, + .enable_power_save = true, + }; + keyboard_btn_handle_t kbd_handle = NULL; + keyboard_button_create(&cfg, &kbd_handle); + return kbd_handle; +} + +TEST_CASE("keyboard test", "[keyboard]") +{ + keyboard_btn_handle_t kbd_handle = _kbd_init(); + TEST_ASSERT_NOT_NULL(kbd_handle); + keyboard_btn_cb_config_t cb_cfg = { + .event = KBD_EVENT_PRESSED, + .callback = keyboard_cb, + }; + keyboard_button_register_cb(kbd_handle, cb_cfg, NULL); + + cb_cfg.event = KBD_EVENT_COMBINATION; + cb_cfg.callback = keyboard_combination_cb1; + cb_cfg.event_data.combination.key_num = 2; + cb_cfg.event_data.combination.key_data = (keyboard_btn_data_t[]) { + {5, 1}, + {1, 1}, + }; + keyboard_button_register_cb(kbd_handle, cb_cfg, NULL); + + while (1) { + vTaskDelay(1000 / portTICK_PERIOD_MS); + } +} + +TEST_CASE("keyboard test memory leak", "[keyboard][memory leak]") +{ + keyboard_btn_handle_t kbd_handle = _kbd_init(); + TEST_ASSERT_NOT_NULL(kbd_handle); + keyboard_btn_cb_config_t cb_cfg = { + .event = KBD_EVENT_PRESSED, + .callback = keyboard_cb, + }; + keyboard_button_register_cb(kbd_handle, cb_cfg, NULL); + + cb_cfg.event = KBD_EVENT_COMBINATION; + cb_cfg.callback = keyboard_combination_cb1; + cb_cfg.event_data.combination.key_num = 2; + cb_cfg.event_data.combination.key_data = (keyboard_btn_data_t[]) { + {5, 1}, + {1, 1}, + }; + keyboard_button_register_cb(kbd_handle, cb_cfg, NULL); + + vTaskDelay(1000 / portTICK_PERIOD_MS); + + keyboard_button_delete(kbd_handle); +} + +static void check_leak(size_t before_free, size_t after_free, const char *type) +{ + ssize_t delta = after_free - before_free; + printf("MALLOC_CAP_%s: Before %u bytes free, After %u bytes free (delta %d)\n", type, before_free, after_free, delta); + TEST_ASSERT_MESSAGE(delta >= TEST_MEMORY_LEAK_THRESHOLD, "memory leak"); +} + +void setUp(void) +{ + before_free_8bit = heap_caps_get_free_size(MALLOC_CAP_8BIT); + before_free_32bit = heap_caps_get_free_size(MALLOC_CAP_32BIT); +} + +void tearDown(void) +{ + size_t after_free_8bit = heap_caps_get_free_size(MALLOC_CAP_8BIT); + size_t after_free_32bit = heap_caps_get_free_size(MALLOC_CAP_32BIT); + check_leak(before_free_8bit, after_free_8bit, "8BIT"); + check_leak(before_free_32bit, after_free_32bit, "32BIT"); +} + +void app_main(void) +{ + /* + * _____ ____ ____ _ __ ____ _ _____ _____ ____ _____ + *| ____/ ___|| _ \ | |/ /___ _ _| __ ) ___ __ _ _ __ __| | |_ _| ____/ ___|_ _| + *| _| \___ \| |_) | | ' // _ \ | | | _ \ / _ \ / _` | '__/ _` | | | | _| \___ \ | | + *| |___ ___) | __/ | . \ __/ |_| | |_) | (_) | (_| | | | (_| | | | | |___ ___) || | + *|_____|____/|_| |_|\_\___|\__, |____/ \___/ \__,_|_| \__,_| |_| |_____|____/ |_| + * |___/ + */ + printf(" _____ ____ ____ _ __ ____ _ _____ _____ ____ _____ \n"); + printf(" | ____/ ___|| _ \\ | |/ /___ _ _| __ ) ___ __ _ _ __ __| | |_ _| ____/ ___|_ _|\n"); + printf(" | _| \\___ \\| |_) | | ' // _ \\ | | | _ \\ / _ \\ / _` | '__/ _` | | | | _| \\___ \\ | | \n"); + printf(" | |___ ___) | __/ | . \\ __/ |_| | |_) | (_) | (_| | | | (_| | | | | |___ ___) || | \n"); + printf(" |_____|____/|_| |_|\\_\\___|\\__, |____/ \\___/ \\__,_|_| \\__,_| |_| |_____|____/ |_| \n"); + printf(" |___/ \n"); + unity_run_menu(); +} diff --git a/components/keyboard_button/test_apps/sdkconfig.defaults b/components/keyboard_button/test_apps/sdkconfig.defaults new file mode 100644 index 000000000..057bce0b2 --- /dev/null +++ b/components/keyboard_button/test_apps/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_ESP_DEFAULT_CPU_FREQ_MHZ_240=y +CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG=y +CONFIG_ESP_TASK_WDT_EN=n +CONFIG_FREERTOS_HZ=1000 diff --git a/docs/Doxyfile b/docs/Doxyfile index 5e53aa089..d8dc62de1 100644 --- a/docs/Doxyfile +++ b/docs/Doxyfile @@ -41,6 +41,7 @@ INPUT = \ $(PROJECT_PATH)/components/display/screen/screen_driver.h \ $(PROJECT_PATH)/components/display/touch_panel/touch_panel.h \ $(PROJECT_PATH)/components/ir/ir_learn/include/ir_learn.h \ + $(PROJECT_PATH)/components/keyboard_button/include/keyboard_button.h \ $(PROJECT_PATH)/components/knob/iot_knob.h \ $(PROJECT_PATH)/components/led/led_indicator/include/led_indicator.h \ $(PROJECT_PATH)/components/motor/esp_sensorless_bldc_control/control/include/bldc_control_param.h \ diff --git a/docs/_static/input_device/keyboard_button/keyboard_hardware.png b/docs/_static/input_device/keyboard_button/keyboard_hardware.png new file mode 100644 index 0000000000000000000000000000000000000000..2d60a190d6128f801dd51fa74423e4261881729c GIT binary patch literal 203965 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 + Keyboard Button Knob Touch Panel \ No newline at end of file diff --git a/docs/en/input_device/keyboard_button.rst b/docs/en/input_device/keyboard_button.rst new file mode 100644 index 000000000..3668f4bcc --- /dev/null +++ b/docs/en/input_device/keyboard_button.rst @@ -0,0 +1,108 @@ +**Keyboard Scanning** +====================== + +:link_to_translation:`zh_CN:[中文]` + +The `Keyboard Scanning Component `_ implements fast and efficient keyboard scanning, supporting key debouncing, key release and press event reporting, as well as combination keys. + +This component uses matrix key row-column scanning and, through special circuit design, achieves full-key rollover circuit detection. + +.. figure:: ../../_static/input_device/keyboard_button/keyboard_hardware.png + :width: 650 + +- In this circuit, rows output high-level signals sequentially, detecting whether columns have high-level signals. If they do, it indicates the key is pressed. + +.. note:: + + - Since the logic of this component does not involve swapping row-column scanning, it is not suitable for traditional row-column scanning circuits and is only applicable to full-key rollover circuits for keyboards. + +**Component Events** +---------------------- + +- :cpp:enumerator:`KBD_EVENT_PRESSED`: Reports data when there is a change in key states. + + * `key_pressed_num`: Number of keys pressed. + * `key_release_num`: Number of keys released. + * `key_change_num`: Number of keys with changed states compared to the previous state. **>0** indicates an increase in pressed keys, **<0** indicates a decrease. + * `key_data`: Information of the currently pressed keys, with positions (x, y). Indexed in the order they were pressed, with smaller indexes being pressed earlier. + * `key_release_data`: Information of keys released compared to the previous state, with positions (x, y). + +- :cpp:enumerator:`KBD_EVENT_COMBINATION`: Combination key event. Triggered when a combination key is pressed. + + * `key_num`: Number of keys in the combination. + * `key_data`: Position information of the combination keys. For setting a combination key (1,1) and (2,2), (1,1) must be pressed first followed by (2,2) to trigger the combination key event. Combination keys only trigger with increasing combinations. + +**Application Example** +------------------------- + +**Initializing Keyboard Scanning** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. code:: c + + keyboard_btn_config_t cfg = { + .output_gpios = (int[]) + { + 40, 39, 38, 45, 48, 47 + }, + .output_gpio_num = 6, + .input_gpios = (int[]) + { + 21, 14, 13, 12, 11, 10, 9, 4, 5, 6, 7, 15, 16, 17, 18 + }, + .input_gpio_num = 15, + .active_level = 1, + .debounce_ticks = 2, + .ticks_interval = 500, // us + .enable_power_save = false, // enable power save + }; + keyboard_btn_handle_t kbd_handle = NULL; + keyboard_button_create(&cfg, &kbd_handle); + +**Registering Callback Functions** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- Registration of `KBD_EVENT_PRESSED` event is as follows: + +.. code:: C + + keyboard_btn_cb_config_t cb_cfg = { + .event = KBD_EVENT_PRESSED, + .callback = keyboard_cb, + }; + keyboard_button_register_cb(kbd_handle, cb_cfg, NULL); + +- Registration of `KBD_EVENT_COMBINATION` event requires passing combination key information through the `combination` member: + +.. code:: C + + keyboard_btn_cb_config_t cb_cfg = { + .event = KBD_EVENT_COMBINATION, + .callback = keyboard_combination_cb1, + .event_data.combination.key_num = 2, + .event_data.combination.key_data = (keyboard_btn_data_t[]) { + {5, 1}, + {1, 1}, + }, + }; + + keyboard_button_register_cb(kbd_handle, cb_cfg, NULL); + +.. note:: Additionally, multiple callbacks can be registered for each event. When registering multiple callbacks, it's recommended to save **keyboard_btn_cb_handle_t *rtn_cb_hdl** for later unbinding of specific callbacks. + +**Key Scanning Efficiency** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- Testing with `ESP32S3` chip scanning a `5*16` matrix keyboard, the maximum scanning rate can reach 20K. + +**Low Power Support** +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- Set enable_power_save to true during initialization to activate the low-power mode. In this mode, key scanning is suspended when no key changes occur, allowing the CPU to enter a sleep state. The CPU wakes up when a key is pressed. + +.. Note:: This feature only ensures that it does not occupy the CPU; it does not guarantee that the CPU will necessarily enter low-power mode. Currently, only Light Sleep mode is supported. + +**API Reference** +--------------------- + +.. include-build-file:: inc/keyboard_button.inc diff --git a/docs/zh_CN/contribute/style-guide.rst b/docs/zh_CN/contribute/style-guide.rst index 5ade33870..520568d56 100644 --- a/docs/zh_CN/contribute/style-guide.rst +++ b/docs/zh_CN/contribute/style-guide.rst @@ -75,11 +75,11 @@ esp-iot-solution 编码规范 .. code:: c /** - * @brief - * - * @param port - * @param conf - * @return i2c_bus_handle_t + * @brief + * + * @param port + * @param conf + * @return i2c_bus_handle_t */ i2c_bus_handle_t iot_i2c_bus_create(i2c_port_t port, i2c_config_t* conf); @@ -89,16 +89,16 @@ esp-iot-solution 编码规范 .. code:: c /** - * @brief Create an I2C bus instance then return a handle if created successfully. + * @brief Create an I2C bus instance then return a handle if created successfully. * @note Each I2C bus works in a singleton mode, which means for an i2c port only one group parameter works. When * iot_i2c_bus_create is called more than one time for the same i2c port, following parameter will override the previous one. - * + * * @param[in] port I2C port number * @param[in] conf Pointer to I2C parameters - * @return i2c_bus_handle_t Return the I2C bus handle if created successfully, return NULL if failed. + * @return i2c_bus_handle_t Return the I2C bus handle if created successfully, return NULL if failed. */ i2c_bus_handle_t iot_i2c_bus_create(i2c_port_t port, i2c_config_t* conf); - + - 版权声明注释(第三方代码,请保留版权声明信息) @@ -172,17 +172,17 @@ esp-iot-solution 编码规范 - 常用缩写列表 -+--------+-----------+--------+---------------+---------+-------------+--------+--------------------------+ -| 缩写 | 全称 | 缩写 | 全称 | 缩写 | 全称 | 缩写 | 全称 | -+========+===========+========+===============+=========+=============+========+==========================+ -| addr | address | id | identifier | len | length | ptr | pointer | -+--------+-----------+--------+---------------+---------+-------------+--------+--------------------------+ -| buf | buffer | info | information | obj | object | ret | return | -+--------+-----------+--------+---------------+---------+-------------+--------+--------------------------+ -| cfg | command | hdr | header | param | parameter | temp | temporary、temperature | -+--------+-----------+--------+---------------+---------+-------------+--------+--------------------------+ -| cmd | command | init | initialize | pos | position | ts | timestamp | -+--------+-----------+--------+---------------+---------+-------------+--------+--------------------------+ ++------+---------+------+-------------+-------+-----------+------+------------------------+ +| 缩写 | 全称 | 缩写 | 全称 | 缩写 | 全称 | 缩写 | 全称 | ++======+=========+======+=============+=======+===========+======+========================+ +| addr | address | id | identifier | len | length | ptr | pointer | ++------+---------+------+-------------+-------+-----------+------+------------------------+ +| buf | buffer | info | information | obj | object | ret | return | ++------+---------+------+-------------+-------+-----------+------+------------------------+ +| cfg | config | hdr | header | param | parameter | temp | temporary、temperature | ++------+---------+------+-------------+-------+-----------+------+------------------------+ +| cmd | command | init | initialize | pos | position | ts | timestamp | ++------+---------+------+-------------+-------+-----------+------+------------------------+ 类型定义 -------- @@ -197,10 +197,10 @@ esp-iot-solution 编码规范 .. code:: c - typedef enum { + typedef enum { MODULE_FOO_ONE, MODULE_FOO_TWO, - MODULE_FOO_THREE + MODULE_FOO_THREE } module_foo_t; 格式和排版规范 diff --git a/docs/zh_CN/input_device/index.rst b/docs/zh_CN/input_device/index.rst index 506925a7d..a82007cb6 100644 --- a/docs/zh_CN/input_device/index.rst +++ b/docs/zh_CN/input_device/index.rst @@ -7,5 +7,6 @@ :maxdepth: 1 按键