libxr 1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
esp_gpio.hpp
1#pragma once
2
3#include "driver/gpio.h"
4#include "esp_log.h"
5#include "gpio.hpp"
6
7namespace LibXR
8{
9class ESP32GPIO : public GPIO
10{
11 public:
12 explicit ESP32GPIO(gpio_num_t gpio_num) : gpio_num_(gpio_num) { map_[gpio_num_] = this; }
13
14 bool Read() override { return gpio_get_level(gpio_num_) != 0; }
15
16 ErrorCode Write(bool value) override
17 {
18 gpio_set_level(gpio_num_, value ? 1 : 0);
19 return ErrorCode::OK;
20 }
21
22 ErrorCode EnableInterrupt() override
23 {
24 if (!isr_service_installed_)
25 {
26 gpio_install_isr_service(0);
27 isr_service_installed_ = true;
28 }
29
30 gpio_isr_handler_add(gpio_num_, ESP32GPIO::InterruptDispatcher, (void*)gpio_num_);
31 gpio_intr_enable(gpio_num_);
32 return ErrorCode::OK;
33 }
34
35 ErrorCode DisableInterrupt() override
36 {
37 gpio_intr_disable(gpio_num_);
38 gpio_isr_handler_remove(gpio_num_);
39 return ErrorCode::OK;
40 }
41
42 ErrorCode SetConfig(Configuration config) override
43 {
44 gpio_config_t io_conf = {};
45 io_conf.pin_bit_mask = 1ULL << gpio_num_;
46
47 switch (config.direction)
48 {
50 io_conf.mode = GPIO_MODE_INPUT;
51 break;
53 io_conf.mode = GPIO_MODE_OUTPUT;
54 break;
56 io_conf.mode = GPIO_MODE_OUTPUT_OD;
57 break;
59 io_conf.mode = GPIO_MODE_INPUT;
60 io_conf.intr_type = GPIO_INTR_NEGEDGE;
61 break;
63 io_conf.mode = GPIO_MODE_INPUT;
64 io_conf.intr_type = GPIO_INTR_POSEDGE;
65 break;
67 io_conf.mode = GPIO_MODE_INPUT;
68 io_conf.intr_type = GPIO_INTR_ANYEDGE;
69 break;
70 }
71
72 switch (config.pull)
73 {
74 case Pull::NONE:
75 io_conf.pull_down_en = GPIO_PULLDOWN_DISABLE;
76 io_conf.pull_up_en = GPIO_PULLUP_DISABLE;
77 break;
78 case Pull::UP:
79 io_conf.pull_up_en = GPIO_PULLUP_ENABLE;
80 io_conf.pull_down_en = GPIO_PULLDOWN_DISABLE;
81 break;
82 case Pull::DOWN:
83 io_conf.pull_down_en = GPIO_PULLDOWN_ENABLE;
84 io_conf.pull_up_en = GPIO_PULLUP_DISABLE;
85 break;
86 }
87
88 gpio_config(&io_conf);
89
90 return ErrorCode::OK;
91 }
92
93 static void IRAM_ATTR InterruptDispatcher(void* arg)
94 {
95 auto gpio_num = static_cast<gpio_num_t>(reinterpret_cast<uintptr_t>(arg));
96 auto gpio = map_[gpio_num];
97 if (gpio)
98 {
99 gpio->callback_.Run(true);
100 }
101 }
102
103 private:
104 gpio_num_t gpio_num_;
105 static inline bool isr_service_installed_ = false;
106 static inline ESP32GPIO* map_[GPIO_NUM_MAX];
107};
108
109} // namespace LibXR
void Run(bool in_isr, PassArgs &&...args) const
执行回调函数,并传递参数。 Executes the callback function, passing the arguments.
Definition libxr_cb.hpp:208
bool Read() override
读取 GPIO 引脚状态。Reads the GPIO pin state.
Definition esp_gpio.hpp:14
ErrorCode Write(bool value) override
写入 GPIO 引脚状态。Writes the GPIO pin state.
Definition esp_gpio.hpp:16
ErrorCode DisableInterrupt() override
禁用 GPIO 引脚中断。Disables the GPIO pin interrupt.
Definition esp_gpio.hpp:35
ErrorCode SetConfig(Configuration config) override
配置 GPIO 引脚参数。Configures the GPIO pin settings.
Definition esp_gpio.hpp:42
ErrorCode EnableInterrupt() override
使能 GPIO 引脚中断。Enables the GPIO pin interrupt.
Definition esp_gpio.hpp:22
通用输入输出(GPIO)接口类。General Purpose Input/Output (GPIO) interface class.
Definition gpio.hpp:13
Callback callback_
GPIO 事件的回调函数。Callback function for GPIO events.
Definition gpio.hpp:56
@ OUTPUT_PUSH_PULL
推挽输出模式。Push-pull output mode.
@ RISING_INTERRUPT
上升沿中断模式。Rising edge interrupt mode.
@ FALL_RISING_INTERRUPT
双沿触发中断模式。Both edge interrupt mode.
@ OUTPUT_OPEN_DRAIN
开漏输出模式。Open-drain output mode.
@ INPUT
输入模式。Input mode.
@ FALL_INTERRUPT
下降沿中断模式。Falling edge interrupt mode.
@ NONE
无上拉或下拉。No pull-up or pull-down.
@ DOWN
下拉模式。Pull-down mode.
@ UP
上拉模式。Pull-up mode.
LibXR Color Control Library / LibXR终端颜色控制库
Definition esp_gpio.hpp:8
存储 GPIO 配置参数的结构体。Structure storing GPIO configuration parameters.
Definition gpio.hpp:46
Pull pull
GPIO 上拉/下拉配置。GPIO pull-up/pull-down configuration.
Definition gpio.hpp:48
Direction direction
GPIO 引脚方向。GPIO pin direction.
Definition gpio.hpp:47