M5UnitUnified 0.1.2 git rev:98f967c
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 inline gpio_num_t rx_pin() const
50 {
51 return _rx_pin;
52 }
53 inline gpio_num_t tx_pin() const
54 {
55 return _tx_pin;
56 }
57 inline gpio::adapter_config_t adapter_config() const
58 {
59 return _adapter_cfg;
60 }
61
62 inline virtual bool begin(const gpio::adapter_config_t& cfg)
63 {
64 return false;
65 }
66
67 //
68 inline virtual m5::hal::error::error_t pinModeRX(const gpio::Mode m) override
69 {
70 return pin_mode(rx_pin(), m);
71 }
72 inline virtual m5::hal::error::error_t writeDigitalRX(const bool high) override
73 {
74 return write_digital(rx_pin(), high);
75 }
76 inline virtual m5::hal::error::error_t readDigitalRX(bool& high) override
77 {
78 return read_digital(rx_pin(), high);
79 }
80 inline virtual m5::hal::error::error_t writeAnalogRX(const uint16_t v) override
81 {
82 return write_analog(rx_pin(), v);
83 }
84 inline virtual m5::hal::error::error_t readAnalogRX(uint16_t& v)
85 {
86 return read_analog(v, rx_pin());
87 }
88
89 inline virtual m5::hal::error::error_t pulseInRX(uint32_t& duration, const int state,
90 const uint32_t timeout_us) override
91 {
92 return pulse_in(duration, rx_pin(), state, timeout_us);
93 }
94
95 //
96 inline virtual m5::hal::error::error_t pinModeTX(const gpio::Mode m) override
97 {
98 return pin_mode(tx_pin(), m);
99 }
100 inline virtual m5::hal::error::error_t writeDigitalTX(const bool high) override
101 {
102 return write_digital(tx_pin(), high);
103 }
104 inline virtual m5::hal::error::error_t readDigitalTX(bool& high) override
105 {
106 return read_digital(tx_pin(), high);
107 }
108 inline virtual m5::hal::error::error_t writeAnalogTX(const uint16_t v) override
109 {
110 return write_analog(tx_pin(), v);
111 }
112 inline virtual m5::hal::error::error_t readAnalogTX(uint16_t& v)
113 {
114 return read_analog(v, tx_pin());
115 }
116 inline virtual m5::hal::error::error_t pulseInTX(uint32_t& duration, const int state,
117 const uint32_t timeout_us) override
118 {
119 return pulse_in(duration, tx_pin(), state, timeout_us);
120 }
121
122 protected:
123 m5::hal::error::error_t pin_mode(const gpio_num_t pin, const gpio::Mode m);
124 m5::hal::error::error_t write_digital(const gpio_num_t pin, const bool high);
125 m5::hal::error::error_t read_digital(const gpio_num_t pin, bool& high);
126 m5::hal::error::error_t write_analog(const gpio_num_t pin, const uint16_t value);
127 m5::hal::error::error_t read_analog(uint16_t& value, const gpio_num_t pin);
128 m5::hal::error::error_t pulse_in(uint32_t& duration, const gpio_num_t pin, const int state,
129 const uint32_t timeout_us);
130
131 protected:
132 gpio_num_t _rx_pin{(gpio_num_t)-1}, _tx_pin{(gpio_num_t)-1};
133 gpio::adapter_config_t _adapter_cfg{};
134 };
135 //
136 explicit AdapterGPIOBase(GPIOImpl* impl);
137
138 inline GPIOImpl* impl()
139 {
140 return static_cast<GPIOImpl*>(_impl.get());
141 }
142 inline const GPIOImpl* impl() const
143 {
144 return static_cast<GPIOImpl*>(_impl.get());
145 }
146 inline gpio_num_t rx_pin() const
147 {
148 return impl()->rx_pin();
149 }
150 inline gpio_num_t tx_pin() const
151 {
152 return impl()->tx_pin();
153 }
154 inline bool begin(const gpio::adapter_config_t& cfg)
155 {
156 return impl()->begin(cfg);
157 }
158};
159
160} // namespace unit
161} // namespace m5
162
163#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:299
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:288
Definition adapter_base.hpp:35
Definition adapter_gpio.hpp:43
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:18
Unit-related namespace.
Common pinMode, RMT v1 and v2 settings.
Type and enumerator definitions.
Mode
Pin mode.
Definition types.hpp:50