9 static const char *
const TAG =
"esp32";
16 return GPIO_MODE_INPUT;
18 return GPIO_MODE_OUTPUT;
20 return GPIO_MODE_OUTPUT_OD;
22 return GPIO_MODE_INPUT_OUTPUT_OD;
24 return GPIO_MODE_INPUT_OUTPUT;
27 return GPIO_MODE_DISABLE;
37 auto *arg =
new ISRPinArg{};
39 arg->inverted = inverted_;
44 gpio_int_type_t idf_type = GPIO_INTR_ANYEDGE;
47 idf_type = inverted_ ? GPIO_INTR_NEGEDGE : GPIO_INTR_POSEDGE;
50 idf_type = inverted_ ? GPIO_INTR_POSEDGE : GPIO_INTR_NEGEDGE;
53 idf_type = GPIO_INTR_ANYEDGE;
56 idf_type = inverted_ ? GPIO_INTR_HIGH_LEVEL : GPIO_INTR_LOW_LEVEL;
59 idf_type = inverted_ ? GPIO_INTR_LOW_LEVEL : GPIO_INTR_HIGH_LEVEL;
62 gpio_set_intr_type(pin_, idf_type);
63 gpio_intr_enable(pin_);
64 if (!isr_service_installed) {
65 auto res = gpio_install_isr_service(ESP_INTR_FLAG_LEVEL3);
67 ESP_LOGE(TAG,
"attach_interrupt(): call to gpio_install_isr_service() failed, error code: %d", res);
70 isr_service_installed =
true;
72 gpio_isr_handler_add(pin_, func, arg);
77 snprintf(buffer,
sizeof(buffer),
"GPIO%u", static_cast<uint32_t>(pin_));
83 conf.pin_bit_mask = 1ULL << static_cast<uint32_t>(pin_);
84 conf.mode = flags_to_mode(flags_);
85 conf.pull_up_en = flags_ &
gpio::FLAG_PULLUP ? GPIO_PULLUP_ENABLE : GPIO_PULLUP_DISABLE;
86 conf.pull_down_en = flags_ &
gpio::FLAG_PULLDOWN ? GPIO_PULLDOWN_ENABLE : GPIO_PULLDOWN_DISABLE;
87 conf.intr_type = GPIO_INTR_DISABLE;
90 gpio_set_drive_capability(pin_, drive_strength_);
96 gpio_set_direction(pin_, flags_to_mode(flags));
97 gpio_pull_mode_t pull_mode = GPIO_FLOATING;
99 pull_mode = GPIO_PULLUP_PULLDOWN;
100 }
else if (flags & gpio::FLAG_PULLUP) {
101 pull_mode = GPIO_PULLUP_ONLY;
102 }
else if (flags & gpio::FLAG_PULLDOWN) {
103 pull_mode = GPIO_PULLDOWN_ONLY;
105 gpio_set_pull_mode(pin_, pull_mode);
114 using namespace esp32;
117 auto *arg =
reinterpret_cast<ISRPinArg *
>(arg_);
118 return bool(gpio_get_level(arg->pin)) != arg->inverted;
121 auto *arg =
reinterpret_cast<ISRPinArg *
>(arg_);
122 gpio_set_level(arg->pin, value != arg->inverted ? 1 : 0);
128 auto *arg =
reinterpret_cast<ISRPinArg *
>(arg_);
129 gpio_set_direction(arg->pin, flags_to_mode(flags));
130 gpio_pull_mode_t pull_mode = GPIO_FLOATING;
132 pull_mode = GPIO_PULLUP_PULLDOWN;
133 }
else if (flags & gpio::FLAG_PULLUP) {
134 pull_mode = GPIO_PULLUP_ONLY;
135 }
else if (flags & gpio::FLAG_PULLDOWN) {
136 pull_mode = GPIO_PULLDOWN_ONLY;
138 gpio_set_pull_mode(arg->pin, pull_mode);
ISRInternalGPIOPin to_isr() const override
Copy of GPIOPin that is safe to use from ISRs (with no virtual functions)
void detach_interrupt() const override
void pin_mode(gpio::Flags flags)
bool digital_read() override
static bool isr_service_installed
void digital_write(bool value) override
void pin_mode(gpio::Flags flags) override
void attach_interrupt(void(*func)(void *), void *arg, gpio::InterruptType type) const override
std::string dump_summary() const override
void digital_write(bool value)