M5UnitUnified 0.6.3 git rev:e38fc73
Loading...
Searching...
No Matches
adapter_gpio.hpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2025 M5Stack Technology CO LTD
3 *
4 * SPDX-License-Identifier: MIT
5 */
11#ifndef M5_UNIT_COMPONENT_ADAPTER_GPIO_HPP
12#define M5_UNIT_COMPONENT_ADAPTER_GPIO_HPP
13
15#include "types.hpp"
16#include "adapter_base.hpp"
17
18// GPIO / RMT are ESP platform features
19#if defined(ESP_PLATFORM)
20namespace m5 {
21namespace unit {
22namespace gpio {
23
30uint8_t calculate_rmt_clk_div(const uint32_t apb_freq_hz, const uint32_t tick_ns);
31
38uint32_t calculate_rmt_resolution_hz(const uint32_t apb_freq_hz, const uint32_t tick_ns);
39
45int8_t gpio_to_adc_channel(const int8_t pin);
46
53bool apply_rx_pull(const gpio_num_t pin, const RxPull pull);
54
55} // namespace gpio
56
57// Base class for AdapterGPIO
58class AdapterGPIOBase : public Adapter {
59public:
60 class GPIOImpl : public Adapter::Impl {
61 public:
62 GPIOImpl() = default;
63 GPIOImpl(const int8_t rx_pin, const int8_t tx_pin) : _rx_pin{(gpio_num_t)rx_pin}, _tx_pin{(gpio_num_t)tx_pin}
64 {
65 }
66 virtual ~GPIOImpl() override;
67
68 inline gpio_num_t rx_pin() const
69 {
70 return _rx_pin;
71 }
72 inline gpio_num_t tx_pin() const
73 {
74 return _tx_pin;
75 }
76 inline gpio::adapter_config_t adapter_config() const
77 {
78 return _adapter_cfg;
79 }
80
81 inline virtual bool begin(const gpio::adapter_config_t& cfg)
82 {
83 return false;
84 }
85
87 virtual int rmtTxChannel() const
88 {
89 return -1;
90 }
92 virtual int rmtRxChannel() const
93 {
94 return -1;
95 }
97 virtual void* rmtTxHandle() const
98 {
99 return nullptr;
100 }
102 virtual void* rmtRxHandle() const
103 {
104 return nullptr;
105 }
106
107 //
108 inline virtual m5::hal::error::error_t pinModeRX(const gpio::Mode m) override
109 {
110 return pin_mode(rx_pin(), m);
111 }
112 inline virtual m5::hal::error::error_t writeDigitalRX(const bool high) override
113 {
114 return write_digital(rx_pin(), high);
115 }
116 inline virtual m5::hal::error::error_t readDigitalRX(bool& high) override
117 {
118 return read_digital(rx_pin(), high);
119 }
120 inline virtual m5::hal::error::error_t writeAnalogRX(const uint16_t v) override
121 {
122 return write_analog(rx_pin(), v);
123 }
124 inline virtual m5::hal::error::error_t readAnalogRX(uint16_t& v) override
125 {
126 return read_analog(v, rx_pin());
127 }
128 inline virtual m5::hal::error::error_t readAnalogMilliVoltsRX(uint32_t& mv) override
129 {
130 return read_analog_millivolts(mv, rx_pin());
131 }
132
133 inline virtual m5::hal::error::error_t pulseInRX(uint32_t& duration, const int state,
134 const uint32_t timeout_us = 30000) override
135 {
136 return pulse_in(duration, rx_pin(), state, timeout_us);
137 }
138
139 //
140 inline virtual m5::hal::error::error_t pinModeTX(const gpio::Mode m) override
141 {
142 return pin_mode(tx_pin(), m);
143 }
144 inline virtual m5::hal::error::error_t writeDigitalTX(const bool high) override
145 {
146 return write_digital(tx_pin(), high);
147 }
148 inline virtual m5::hal::error::error_t readDigitalTX(bool& high) override
149 {
150 return read_digital(tx_pin(), high);
151 }
152 inline virtual m5::hal::error::error_t writeAnalogTX(const uint16_t v) override
153 {
154 return write_analog(tx_pin(), v);
155 }
156 inline virtual m5::hal::error::error_t readAnalogTX(uint16_t& v) override
157 {
158 return read_analog(v, tx_pin());
159 }
160 inline virtual m5::hal::error::error_t readAnalogMilliVoltsTX(uint32_t& mv) override
161 {
162 return read_analog_millivolts(mv, tx_pin());
163 }
164 inline virtual m5::hal::error::error_t pulseInTX(uint32_t& duration, const int state,
165 const uint32_t timeout_us = 30000) override
166 {
167 return pulse_in(duration, tx_pin(), state, timeout_us);
168 }
169
170 protected:
171 m5::hal::error::error_t pin_mode(const gpio_num_t pin, const gpio::Mode m);
172 m5::hal::error::error_t write_digital(const gpio_num_t pin, const bool high);
173 m5::hal::error::error_t read_digital(const gpio_num_t pin, bool& high);
174 m5::hal::error::error_t write_analog(const gpio_num_t pin, const uint16_t value);
175 m5::hal::error::error_t read_analog(uint16_t& value, const gpio_num_t pin);
176 m5::hal::error::error_t read_analog_millivolts(uint32_t& millivolts, const gpio_num_t pin);
177 m5::hal::error::error_t pulse_in(uint32_t& duration, const gpio_num_t pin, const int state,
178 const uint32_t timeout_us);
179
180 protected:
181 m5::hal::error::error_t ensure_adc_handle(const gpio_num_t pin);
182 void release_adc_resources();
183
184 gpio_num_t _rx_pin{(gpio_num_t)-1}, _tx_pin{(gpio_num_t)-1};
185 gpio::adapter_config_t _adapter_cfg{};
186
187#if defined(M5_UNIT_UNIFIED_USING_ADC_ONESHOT)
188 void* _adc_handle{}; // adc_oneshot_unit_handle_t
189 void* _cali_handle{}; // adc_cali_handle_t
190 int8_t _cached_adc_unit{-1}; // 0=ADC1, 1=ADC2, -1=uninitialized
191 int8_t _cached_cali_channel{-1}; // cached calibration channel, -1=uninitialized
192#endif
193 };
194 //
195 explicit AdapterGPIOBase(GPIOImpl* impl);
196
197 inline GPIOImpl* impl()
198 {
199 return static_cast<GPIOImpl*>(_impl.get());
200 }
201 inline const GPIOImpl* impl() const
202 {
203 return static_cast<GPIOImpl*>(_impl.get());
204 }
205 inline gpio_num_t rx_pin() const
206 {
207 return impl()->rx_pin();
208 }
209 inline gpio_num_t tx_pin() const
210 {
211 return impl()->tx_pin();
212 }
213 inline bool begin(const gpio::adapter_config_t& cfg)
214 {
215 return impl()->begin(cfg);
216 }
217};
218
219} // namespace unit
220} // namespace m5
221#endif // ESP_PLATFORM
222
223#endif
Adapter base.
Identification of functions to be used.
Top level namespace of M5Stack.
Definition test_helper.hpp:20
Unit-related namespace.
Type and enumerator definitions.