ESPHome 2025.5.2
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Modules Pages
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 {
7namespace libretiny {
8
9static const char *const TAG = "lt.gpio";
10
11static int IRAM_ATTR flags_to_mode(gpio::Flags flags) {
12 if (flags == gpio::FLAG_INPUT) {
13 return INPUT;
14 } else if (flags == gpio::FLAG_OUTPUT) {
15 return OUTPUT;
16 } else if (flags == (gpio::FLAG_INPUT | gpio::FLAG_PULLUP)) {
17 return INPUT_PULLUP;
18 } else if (flags == (gpio::FLAG_INPUT | gpio::FLAG_PULLDOWN)) {
19 return INPUT_PULLDOWN;
20 } else if (flags == (gpio::FLAG_OUTPUT | gpio::FLAG_OPEN_DRAIN)) {
21 return OUTPUT_OPEN_DRAIN;
22 } else {
23 return 0;
24 }
25}
26
27struct ISRPinArg {
28 uint8_t pin;
29 bool inverted;
30};
31
33 auto *arg = new ISRPinArg{}; // NOLINT(cppcoreguidelines-owning-memory)
34 arg->pin = pin_;
35 arg->inverted = inverted_;
36 return ISRInternalGPIOPin((void *) arg);
37}
38
39void ArduinoInternalGPIOPin::attach_interrupt(void (*func)(void *), void *arg, gpio::InterruptType type) const {
40 PinStatus arduino_mode = (PinStatus) 255;
41 switch (type) {
43 arduino_mode = inverted_ ? FALLING : RISING;
44 break;
46 arduino_mode = inverted_ ? RISING : FALLING;
47 break;
49 arduino_mode = CHANGE;
50 break;
52 arduino_mode = inverted_ ? HIGH : LOW;
53 break;
55 arduino_mode = inverted_ ? LOW : HIGH;
56 break;
57 }
58
59 attachInterruptParam(pin_, func, arduino_mode, arg);
60}
61
63 pinMode(pin_, flags_to_mode(flags)); // NOLINT
64}
65
67 char buffer[32];
68 snprintf(buffer, sizeof(buffer), "%u", pin_);
69 return buffer;
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 libretiny
83
84using namespace libretiny;
85
86bool IRAM_ATTR ISRInternalGPIOPin::digital_read() {
87 auto *arg = reinterpret_cast<ISRPinArg *>(arg_);
88 return bool(digitalRead(arg->pin)) ^ arg->inverted; // NOLINT
89}
90void IRAM_ATTR ISRInternalGPIOPin::digital_write(bool value) {
91 auto *arg = reinterpret_cast<ISRPinArg *>(arg_);
92 digitalWrite(arg->pin, value ^ arg->inverted); // NOLINT
93}
95 auto *arg = reinterpret_cast<ISRPinArg *>(arg_);
96 detachInterrupt(arg->pin);
97}
98void IRAM_ATTR ISRInternalGPIOPin::pin_mode(gpio::Flags flags) {
99 auto *arg = reinterpret_cast<ISRPinArg *>(arg_);
100 pinMode(arg->pin, flags_to_mode(flags)); // NOLINT
101}
102
103} // namespace esphome
104
105#endif // USE_LIBRETINY
Copy of GPIOPin that is safe to use from ISRs (with no virtual functions)
Definition gpio.h:73
void digital_write(bool value)
Definition gpio.cpp:147
void pin_mode(gpio::Flags flags)
Definition gpio.cpp:156
void pin_mode(gpio::Flags flags) override
void attach_interrupt(void(*func)(void *), void *arg, gpio::InterruptType type) const override
ISRInternalGPIOPin to_isr() const override
std::string dump_summary() const override
uint8_t type
@ INTERRUPT_FALLING_EDGE
Definition gpio.h:42
@ INTERRUPT_RISING_EDGE
Definition gpio.h:41
@ INTERRUPT_HIGH_LEVEL
Definition gpio.h:45
@ INTERRUPT_LOW_LEVEL
Definition gpio.h:44
@ INTERRUPT_ANY_EDGE
Definition gpio.h:43
@ FLAG_OUTPUT
Definition gpio.h:19
@ FLAG_OPEN_DRAIN
Definition gpio.h:20
@ FLAG_PULLUP
Definition gpio.h:21
@ FLAG_INPUT
Definition gpio.h:18
@ FLAG_PULLDOWN
Definition gpio.h:22
Providing packet encoding functions for exchanging data with a remote host.
Definition a01nyub.cpp:7