M5UnitUnified 0.5.8 git rev:47d29eb
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
40} // namespace gpio
41
42// Base class for AdapterGPIO
43class AdapterGPIOBase : public Adapter {
44public:
45 class GPIOImpl : public Adapter::Impl {
46 public:
47 GPIOImpl() = default;
48 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}
49 {
50 }
51 virtual ~GPIOImpl() override;
52
53 inline gpio_num_t rx_pin() const
54 {
55 return _rx_pin;
56 }
57 inline gpio_num_t tx_pin() const
58 {
59 return _tx_pin;
60 }
61 inline gpio::adapter_config_t adapter_config() const
62 {
63 return _adapter_cfg;
64 }
65
66 inline virtual bool begin(const gpio::adapter_config_t& cfg)
67 {
68 return false;
69 }
70
72 virtual int rmtTxChannel() const
73 {
74 return -1;
75 }
77 virtual int rmtRxChannel() const
78 {
79 return -1;
80 }
82 virtual void* rmtTxHandle() const
83 {
84 return nullptr;
85 }
87 virtual void* rmtRxHandle() const
88 {
89 return nullptr;
90 }
91
92 //
93 inline virtual m5::hal::error::error_t pinModeRX(const gpio::Mode m) override
94 {
95 return pin_mode(rx_pin(), m);
96 }
97 inline virtual m5::hal::error::error_t writeDigitalRX(const bool high) override
98 {
99 return write_digital(rx_pin(), high);
100 }
101 inline virtual m5::hal::error::error_t readDigitalRX(bool& high) override
102 {
103 return read_digital(rx_pin(), high);
104 }
105 inline virtual m5::hal::error::error_t writeAnalogRX(const uint16_t v) override
106 {
107 return write_analog(rx_pin(), v);
108 }
109 inline virtual m5::hal::error::error_t readAnalogRX(uint16_t& v) override
110 {
111 return read_analog(v, rx_pin());
112 }
113 inline virtual m5::hal::error::error_t readAnalogMilliVoltsRX(uint32_t& mv) override
114 {
115 return read_analog_millivolts(mv, rx_pin());
116 }
117
118 inline virtual m5::hal::error::error_t pulseInRX(uint32_t& duration, const int state,
119 const uint32_t timeout_us = 30000) override
120 {
121 return pulse_in(duration, rx_pin(), state, timeout_us);
122 }
123
124 //
125 inline virtual m5::hal::error::error_t pinModeTX(const gpio::Mode m) override
126 {
127 return pin_mode(tx_pin(), m);
128 }
129 inline virtual m5::hal::error::error_t writeDigitalTX(const bool high) override
130 {
131 return write_digital(tx_pin(), high);
132 }
133 inline virtual m5::hal::error::error_t readDigitalTX(bool& high) override
134 {
135 return read_digital(tx_pin(), high);
136 }
137 inline virtual m5::hal::error::error_t writeAnalogTX(const uint16_t v) override
138 {
139 return write_analog(tx_pin(), v);
140 }
141 inline virtual m5::hal::error::error_t readAnalogTX(uint16_t& v) override
142 {
143 return read_analog(v, tx_pin());
144 }
145 inline virtual m5::hal::error::error_t readAnalogMilliVoltsTX(uint32_t& mv) override
146 {
147 return read_analog_millivolts(mv, tx_pin());
148 }
149 inline virtual m5::hal::error::error_t pulseInTX(uint32_t& duration, const int state,
150 const uint32_t timeout_us = 30000) override
151 {
152 return pulse_in(duration, tx_pin(), state, timeout_us);
153 }
154
155 protected:
156 m5::hal::error::error_t pin_mode(const gpio_num_t pin, const gpio::Mode m);
157 m5::hal::error::error_t write_digital(const gpio_num_t pin, const bool high);
158 m5::hal::error::error_t read_digital(const gpio_num_t pin, bool& high);
159 m5::hal::error::error_t write_analog(const gpio_num_t pin, const uint16_t value);
160 m5::hal::error::error_t read_analog(uint16_t& value, const gpio_num_t pin);
161 m5::hal::error::error_t read_analog_millivolts(uint32_t& millivolts, const gpio_num_t pin);
162 m5::hal::error::error_t pulse_in(uint32_t& duration, const gpio_num_t pin, const int state,
163 const uint32_t timeout_us);
164
165 protected:
166 m5::hal::error::error_t ensure_adc_handle(const gpio_num_t pin);
167 void release_adc_resources();
168
169 gpio_num_t _rx_pin{(gpio_num_t)-1}, _tx_pin{(gpio_num_t)-1};
170 gpio::adapter_config_t _adapter_cfg{};
171
172#if defined(M5_UNIT_UNIFIED_USING_ADC_ONESHOT)
173 void* _adc_handle{}; // adc_oneshot_unit_handle_t
174 void* _cali_handle{}; // adc_cali_handle_t
175 int8_t _cached_adc_unit{-1}; // 0=ADC1, 1=ADC2, -1=uninitialized
176 int8_t _cached_cali_channel{-1}; // cached calibration channel, -1=uninitialized
177#endif
178 };
179 //
180 explicit AdapterGPIOBase(GPIOImpl* impl);
181
182 inline GPIOImpl* impl()
183 {
184 return static_cast<GPIOImpl*>(_impl.get());
185 }
186 inline const GPIOImpl* impl() const
187 {
188 return static_cast<GPIOImpl*>(_impl.get());
189 }
190 inline gpio_num_t rx_pin() const
191 {
192 return impl()->rx_pin();
193 }
194 inline gpio_num_t tx_pin() const
195 {
196 return impl()->tx_pin();
197 }
198 inline bool begin(const gpio::adapter_config_t& cfg)
199 {
200 return impl()->begin(cfg);
201 }
202};
203
204} // namespace unit
205} // namespace m5
206#endif // ESP_PLATFORM
207
208#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.