ESPHome 2026.11.0-dev
Loading...
Searching...
No Matches
gpio_arduino.cpp
Go to the documentation of this file.
1#ifdef USE_LIBRETINY
2
3#include "gpio_arduino.h"
4#include "esphome/core/hal.h"
5#include "esphome/core/log.h"
6
7namespace esphome::libretiny {
8
9ESPHOME_LOG_TAG(TAG, "libretiny.gpio");
10
11static int IRAM_ATTR flags_to_mode(gpio::Flags flags) {
12 flags =
14 if (flags == gpio::FLAG_INPUT) {
15 return INPUT;
16 } else if (flags == gpio::FLAG_OUTPUT) {
17 return OUTPUT;
18 } else if (flags == (gpio::FLAG_INPUT | gpio::FLAG_PULLUP)) {
19 return INPUT_PULLUP;
20 } else if (flags == (gpio::FLAG_INPUT | gpio::FLAG_PULLDOWN)) {
21 return INPUT_PULLDOWN;
23 return OUTPUT_OPEN_DRAIN;
24 } else {
25 return 0;
26 }
27}
28
29struct ISRPinArg {
30 uint8_t pin;
31 bool inverted;
32};
33
35 auto *arg = new ISRPinArg{}; // NOLINT(cppcoreguidelines-owning-memory)
36 arg->pin = pin_;
37 arg->inverted = inverted_;
38 return ISRInternalGPIOPin((void *) arg);
39}
40
41void ArduinoInternalGPIOPin::attach_interrupt_(void (*func)(void *), void *arg, gpio::InterruptType type) const {
42 PinStatus arduino_mode = (PinStatus) 255;
43 switch (type) {
45 arduino_mode = inverted_ ? FALLING : RISING;
46 break;
48 arduino_mode = inverted_ ? RISING : FALLING;
49 break;
51 arduino_mode = CHANGE;
52 break;
54 arduino_mode = inverted_ ? HIGH : LOW;
55 break;
57 arduino_mode = inverted_ ? LOW : HIGH;
58 break;
59 }
60
61 attachInterruptParam(pin_, func, arduino_mode, arg);
62}
63
65 pinMode(pin_, flags_to_mode(flags)); // NOLINT
66}
67
68size_t ArduinoInternalGPIOPin::dump_summary(char *buffer, size_t len) const {
69 return snprintf(buffer, len, "%u", this->pin_);
70}
71
73 return bool(digitalRead(pin_)) ^ inverted_; // NOLINT
74}
76 digitalWrite(pin_, value ^ inverted_); // NOLINT
77}
79 detachInterrupt(pin_); // NOLINT
80}
81
82} // namespace esphome::libretiny
83
84namespace esphome {
85
86using namespace libretiny;
87
88bool IRAM_ATTR ISRInternalGPIOPin::digital_read() {
89 auto *arg = reinterpret_cast<ISRPinArg *>(arg_);
90 return bool(digitalRead(arg->pin)) ^ arg->inverted; // NOLINT
91}
92void IRAM_ATTR ISRInternalGPIOPin::digital_write(bool value) {
93 auto *arg = reinterpret_cast<ISRPinArg *>(arg_);
94 digitalWrite(arg->pin, value ^ arg->inverted); // NOLINT
95}
97 auto *arg = reinterpret_cast<ISRPinArg *>(arg_);
98 detachInterrupt(arg->pin);
99}
101 auto *arg = reinterpret_cast<ISRPinArg *>(arg_);
102 pinMode(arg->pin, flags_to_mode(flags)); // NOLINT
103}
104
105} // namespace esphome
106
107#endif // USE_LIBRETINY
Copy of GPIOPin that is safe to use from ISRs (with no virtual functions)
Definition gpio_pin.h:98
void digital_write(bool value)
Definition gpio.cpp:227
void pin_mode(gpio::Flags flags)
Definition gpio.cpp:239
void pin_mode(gpio::Flags flags) override
void attach_interrupt_(void(*func)(void *), void *arg, gpio::InterruptType type) const
size_t dump_summary(char *buffer, size_t len) const override
uint16_t flags
uint8_t type
uint32_t buffer
Definition gif.cpp:50
@ INTERRUPT_FALLING_EDGE
Definition gpio_pin.h:53
@ INTERRUPT_RISING_EDGE
Definition gpio_pin.h:52
@ INTERRUPT_HIGH_LEVEL
Definition gpio_pin.h:56
@ INTERRUPT_LOW_LEVEL
Definition gpio_pin.h:55
@ INTERRUPT_ANY_EDGE
Definition gpio_pin.h:54
ESPHOME_LOG_TAG(TAG, "libretiny.gpio")
const void size_t len
Definition hal.h:68