ESPHome 2026.3.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/log.h"
5
6namespace esphome::libretiny {
7
8static const char *const TAG = "lt.gpio";
9
10static int IRAM_ATTR flags_to_mode(gpio::Flags flags) {
11 if (flags == gpio::FLAG_INPUT) {
12 return INPUT;
13 } else if (flags == gpio::FLAG_OUTPUT) {
14 return OUTPUT;
15 } else if (flags == (gpio::FLAG_INPUT | gpio::FLAG_PULLUP)) {
16 return INPUT_PULLUP;
17 } else if (flags == (gpio::FLAG_INPUT | gpio::FLAG_PULLDOWN)) {
18 return INPUT_PULLDOWN;
20 return OUTPUT_OPEN_DRAIN;
21 } else {
22 return 0;
23 }
24}
25
26struct ISRPinArg {
27 uint8_t pin;
28 bool inverted;
29};
30
32 auto *arg = new ISRPinArg{}; // NOLINT(cppcoreguidelines-owning-memory)
33 arg->pin = pin_;
34 arg->inverted = inverted_;
35 return ISRInternalGPIOPin((void *) arg);
36}
37
38void ArduinoInternalGPIOPin::attach_interrupt(void (*func)(void *), void *arg, gpio::InterruptType type) const {
39 PinStatus arduino_mode = (PinStatus) 255;
40 switch (type) {
42 arduino_mode = inverted_ ? FALLING : RISING;
43 break;
45 arduino_mode = inverted_ ? RISING : FALLING;
46 break;
48 arduino_mode = CHANGE;
49 break;
51 arduino_mode = inverted_ ? HIGH : LOW;
52 break;
54 arduino_mode = inverted_ ? LOW : HIGH;
55 break;
56 }
57
58 attachInterruptParam(pin_, func, arduino_mode, arg);
59}
60
62 pinMode(pin_, flags_to_mode(flags)); // NOLINT
63}
64
65size_t ArduinoInternalGPIOPin::dump_summary(char *buffer, size_t len) const {
66 return snprintf(buffer, len, "%u", this->pin_);
67}
68
70 return bool(digitalRead(pin_)) ^ inverted_; // NOLINT
71}
73 digitalWrite(pin_, value ^ inverted_); // NOLINT
74}
76 detachInterrupt(pin_); // NOLINT
77}
78
79} // namespace esphome::libretiny
80
81namespace esphome {
82
83using namespace libretiny;
84
85bool IRAM_ATTR ISRInternalGPIOPin::digital_read() {
86 auto *arg = reinterpret_cast<ISRPinArg *>(arg_);
87 return bool(digitalRead(arg->pin)) ^ arg->inverted; // NOLINT
88}
89void IRAM_ATTR ISRInternalGPIOPin::digital_write(bool value) {
90 auto *arg = reinterpret_cast<ISRPinArg *>(arg_);
91 digitalWrite(arg->pin, value ^ arg->inverted); // NOLINT
92}
94 auto *arg = reinterpret_cast<ISRPinArg *>(arg_);
95 detachInterrupt(arg->pin);
96}
98 auto *arg = reinterpret_cast<ISRPinArg *>(arg_);
99 pinMode(arg->pin, flags_to_mode(flags)); // NOLINT
100}
101
102} // namespace esphome
103
104#endif // USE_LIBRETINY
Copy of GPIOPin that is safe to use from ISRs (with no virtual functions)
Definition gpio.h:92
void digital_write(bool value)
Definition gpio.cpp:148
void pin_mode(gpio::Flags flags)
Definition gpio.cpp:157
void pin_mode(gpio::Flags flags) override
void attach_interrupt(void(*func)(void *), void *arg, gpio::InterruptType type) const override
size_t dump_summary(char *buffer, size_t len) const override
ISRInternalGPIOPin to_isr() const override
uint16_t type
uint16_t flags
@ INTERRUPT_FALLING_EDGE
Definition gpio.h:51
@ INTERRUPT_RISING_EDGE
Definition gpio.h:50
@ INTERRUPT_HIGH_LEVEL
Definition gpio.h:54
@ INTERRUPT_LOW_LEVEL
Definition gpio.h:53
@ INTERRUPT_ANY_EDGE
Definition gpio.h:52
@ FLAG_OUTPUT
Definition gpio.h:28
@ FLAG_OPEN_DRAIN
Definition gpio.h:29
@ FLAG_PULLUP
Definition gpio.h:30
@ FLAG_INPUT
Definition gpio.h:27
@ FLAG_PULLDOWN
Definition gpio.h:31
Providing packet encoding functions for exchanging data with a remote host.
Definition a01nyub.cpp:7
std::string size_t len
Definition helpers.h:817