M5UnitUnified 0.4.6 git rev:c61a63c
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
18namespace m5 {
19namespace unit {
20namespace gpio {
21
28uint8_t calculate_rmt_clk_div(const uint32_t apb_freq_hz, const uint32_t tick_ns);
29
36uint32_t calculate_rmt_resolution_hz(const uint32_t apb_freq_hz, const uint32_t tick_ns);
37
38} // namespace gpio
39
40// Base class for AdapterGPIO
41class AdapterGPIOBase : public Adapter {
42public:
43 class GPIOImpl : public Adapter::Impl {
44 public:
45 GPIOImpl() = default;
46 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}
47 {
48 }
49 virtual ~GPIOImpl() override;
50
51 inline gpio_num_t rx_pin() const
52 {
53 return _rx_pin;
54 }
55 inline gpio_num_t tx_pin() const
56 {
57 return _tx_pin;
58 }
59 inline gpio::adapter_config_t adapter_config() const
60 {
61 return _adapter_cfg;
62 }
63
64 inline virtual bool begin(const gpio::adapter_config_t& cfg)
65 {
66 return false;
67 }
68
70 virtual int rmtTxChannel() const
71 {
72 return -1;
73 }
75 virtual int rmtRxChannel() const
76 {
77 return -1;
78 }
80 virtual void* rmtTxHandle() const
81 {
82 return nullptr;
83 }
85 virtual void* rmtRxHandle() const
86 {
87 return nullptr;
88 }
89
90 //
91 inline virtual m5::hal::error::error_t pinModeRX(const gpio::Mode m) override
92 {
93 return pin_mode(rx_pin(), m);
94 }
95 inline virtual m5::hal::error::error_t writeDigitalRX(const bool high) override
96 {
97 return write_digital(rx_pin(), high);
98 }
99 inline virtual m5::hal::error::error_t readDigitalRX(bool& high) override
100 {
101 return read_digital(rx_pin(), high);
102 }
103 inline virtual m5::hal::error::error_t writeAnalogRX(const uint16_t v) override
104 {
105 return write_analog(rx_pin(), v);
106 }
107 inline virtual m5::hal::error::error_t readAnalogRX(uint16_t& v) override
108 {
109 return read_analog(v, rx_pin());
110 }
111 inline virtual m5::hal::error::error_t readAnalogMilliVoltsRX(uint32_t& mv) override
112 {
113 return read_analog_millivolts(mv, rx_pin());
114 }
115
116 inline virtual m5::hal::error::error_t pulseInRX(uint32_t& duration, const int state,
117 const uint32_t timeout_us = 30000) override
118 {
119 return pulse_in(duration, rx_pin(), state, timeout_us);
120 }
121
122 //
123 inline virtual m5::hal::error::error_t pinModeTX(const gpio::Mode m) override
124 {
125 return pin_mode(tx_pin(), m);
126 }
127 inline virtual m5::hal::error::error_t writeDigitalTX(const bool high) override
128 {
129 return write_digital(tx_pin(), high);
130 }
131 inline virtual m5::hal::error::error_t readDigitalTX(bool& high) override
132 {
133 return read_digital(tx_pin(), high);
134 }
135 inline virtual m5::hal::error::error_t writeAnalogTX(const uint16_t v) override
136 {
137 return write_analog(tx_pin(), v);
138 }
139 inline virtual m5::hal::error::error_t readAnalogTX(uint16_t& v) override
140 {
141 return read_analog(v, tx_pin());
142 }
143 inline virtual m5::hal::error::error_t readAnalogMilliVoltsTX(uint32_t& mv) override
144 {
145 return read_analog_millivolts(mv, tx_pin());
146 }
147 inline virtual m5::hal::error::error_t pulseInTX(uint32_t& duration, const int state,
148 const uint32_t timeout_us = 30000) override
149 {
150 return pulse_in(duration, tx_pin(), state, timeout_us);
151 }
152
153 protected:
154 m5::hal::error::error_t pin_mode(const gpio_num_t pin, const gpio::Mode m);
155 m5::hal::error::error_t write_digital(const gpio_num_t pin, const bool high);
156 m5::hal::error::error_t read_digital(const gpio_num_t pin, bool& high);
157 m5::hal::error::error_t write_analog(const gpio_num_t pin, const uint16_t value);
158 m5::hal::error::error_t read_analog(uint16_t& value, const gpio_num_t pin);
159 m5::hal::error::error_t read_analog_millivolts(uint32_t& millivolts, const gpio_num_t pin);
160 m5::hal::error::error_t pulse_in(uint32_t& duration, const gpio_num_t pin, const int state,
161 const uint32_t timeout_us);
162
163 protected:
164 m5::hal::error::error_t ensure_adc_handle(const gpio_num_t pin);
165 void release_adc_resources();
166
167 gpio_num_t _rx_pin{(gpio_num_t)-1}, _tx_pin{(gpio_num_t)-1};
168 gpio::adapter_config_t _adapter_cfg{};
169
170#if defined(M5_UNIT_UNIFIED_USING_ADC_ONESHOT)
171 void* _adc_handle{}; // adc_oneshot_unit_handle_t
172 void* _cali_handle{}; // adc_cali_handle_t
173 int8_t _cached_adc_unit{-1}; // 0=ADC1, 1=ADC2, -1=uninitialized
174 int8_t _cached_cali_channel{-1}; // cached calibration channel, -1=uninitialized
175#endif
176 };
177 //
178 explicit AdapterGPIOBase(GPIOImpl* impl);
179
180 inline GPIOImpl* impl()
181 {
182 return static_cast<GPIOImpl*>(_impl.get());
183 }
184 inline const GPIOImpl* impl() const
185 {
186 return static_cast<GPIOImpl*>(_impl.get());
187 }
188 inline gpio_num_t rx_pin() const
189 {
190 return impl()->rx_pin();
191 }
192 inline gpio_num_t tx_pin() const
193 {
194 return impl()->tx_pin();
195 }
196 inline bool begin(const gpio::adapter_config_t& cfg)
197 {
198 return impl()->begin(cfg);
199 }
200};
201
202} // namespace unit
203} // namespace m5
204
205#endif
Adapter base.
uint32_t calculate_rmt_resolution_hz(uint32_t apb_freq_hz, uint32_t tick_ns)
Calculate resolution from desired tick time.
Definition adapter_gpio.cpp:417
uint8_t calculate_rmt_clk_div(uint32_t apb_freq_hz, uint32_t tick_ns)
Calculate clk_div from desired tick time (nanoseconds)
Definition adapter_gpio.cpp:406
Implementation base class (Pimpl pattern)
Definition adapter_base.hpp:37
Definition adapter_gpio.hpp:43
virtual int rmtTxChannel() const
Get the RMT TX channel (V1: rmt_channel_t, V2: -1)
Definition adapter_gpio.hpp:70
virtual void * rmtRxHandle() const
Get the RMT RX handle (V2: rmt_channel_handle_t, V1: nullptr)
Definition adapter_gpio.hpp:85
virtual void * rmtTxHandle() const
Get the RMT TX handle (V2: rmt_channel_handle_t, V1: nullptr)
Definition adapter_gpio.hpp:80
virtual int rmtRxChannel() const
Get the RMT RX channel (V1: rmt_channel_t, V2: -1)
Definition adapter_gpio.hpp:75
Definition adapter_gpio.hpp:41
Adapter base class to treat M5HAL and TwoWire,GPIO,Serial,SPI... in the same way.
Identification of functions to be used.
Top level namespace of M5Stack.
Definition test_helper.hpp:20
Unit-related namespace.
Unified configuration for RMT v1/v2.
Type and enumerator definitions.
Mode
Pin mode.
Definition types.hpp:61