M5UnitUnified 0.5.8 git rev:47d29eb
Loading...
Searching...
No Matches
adapter_base.hpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2024 M5Stack Technology CO LTD
3 *
4 * SPDX-License-Identifier: MIT
5 */
10#ifndef M5_UNIT_COMPONENT_ADAPTER_BASE_HPP
11#define M5_UNIT_COMPONENT_ADAPTER_BASE_HPP
12
13#include <cstdint>
14#include <cstddef>
15#include <memory>
16#include <M5HAL.hpp>
17#include "types.hpp"
18
19namespace m5 {
20namespace unit {
25class Adapter {
26public:
28 enum class Type : uint8_t {
29 Unknown,
30 I2C,
31 GPIO,
32 UART,
33 SPI,
34 };
35
37 class Impl {
38 public:
39 Impl() = default;
40
41 virtual ~Impl()
42 {
43 }
44
47 virtual m5::hal::error::error_t readWithTransaction(uint8_t*, const size_t)
48 {
49 return m5::hal::error::error_t::UNKNOWN_ERROR;
50 }
51 virtual m5::hal::error::error_t writeWithTransaction(const uint8_t*, const size_t, const uint32_t)
52 {
53 return m5::hal::error::error_t::UNKNOWN_ERROR;
54 }
55 virtual m5::hal::error::error_t writeWithTransaction(const uint8_t, const uint8_t*, const size_t,
56 const uint32_t)
57 {
58 return m5::hal::error::error_t::UNKNOWN_ERROR;
59 }
60 virtual m5::hal::error::error_t writeWithTransaction(const uint16_t, const uint8_t*, const size_t,
61 const uint32_t)
62 {
63 return m5::hal::error::error_t::UNKNOWN_ERROR;
64 }
65 virtual m5::hal::error::error_t generalCall(const uint8_t*, const size_t)
66 {
67 return m5::hal::error::error_t::UNKNOWN_ERROR;
68 }
72#if defined(ESP_PLATFORM)
73 virtual m5::hal::error::error_t pinModeRX(const gpio::Mode)
74 {
75 return m5::hal::error::error_t::UNKNOWN_ERROR;
76 }
77#endif
78 virtual m5::hal::error::error_t writeDigitalRX(const bool)
79 {
80 return m5::hal::error::error_t::UNKNOWN_ERROR;
81 }
82 virtual m5::hal::error::error_t readDigitalRX(bool&)
83 {
84 return m5::hal::error::error_t::UNKNOWN_ERROR;
85 }
86 virtual m5::hal::error::error_t writeAnalogRX(const uint16_t)
87 {
88 return m5::hal::error::error_t::UNKNOWN_ERROR;
89 }
90 virtual m5::hal::error::error_t readAnalogRX(uint16_t&)
91 {
92 return m5::hal::error::error_t::UNKNOWN_ERROR;
93 }
94 virtual m5::hal::error::error_t readAnalogMilliVoltsRX(uint32_t&)
95 {
96 return m5::hal::error::error_t::UNKNOWN_ERROR;
97 }
98 virtual m5::hal::error::error_t pulseInRX(uint32_t&, const int, const uint32_t)
99 {
100 return m5::hal::error::error_t::UNKNOWN_ERROR;
101 }
102
103#if defined(ESP_PLATFORM)
104 virtual m5::hal::error::error_t pinModeTX(const gpio::Mode)
105 {
106 return m5::hal::error::error_t::UNKNOWN_ERROR;
107 }
108#endif
109 virtual m5::hal::error::error_t writeDigitalTX(const bool)
110 {
111 return m5::hal::error::error_t::UNKNOWN_ERROR;
112 }
113 virtual m5::hal::error::error_t readDigitalTX(bool&)
114 {
115 return m5::hal::error::error_t::UNKNOWN_ERROR;
116 }
117 virtual m5::hal::error::error_t writeAnalogTX(const uint16_t)
118 {
119 return m5::hal::error::error_t::UNKNOWN_ERROR;
120 }
121 virtual m5::hal::error::error_t readAnalogTX(uint16_t&)
122 {
123 return m5::hal::error::error_t::UNKNOWN_ERROR;
124 }
125 virtual m5::hal::error::error_t readAnalogMilliVoltsTX(uint32_t&)
126 {
127 return m5::hal::error::error_t::UNKNOWN_ERROR;
128 }
129 virtual m5::hal::error::error_t pulseInTX(uint32_t&, const int, const uint32_t)
130 {
131 return m5::hal::error::error_t::UNKNOWN_ERROR;
132 }
134 };
135
137 explicit Adapter() : _impl{new Impl()}
138 {
139 }
140
141protected:
142 Adapter(const Type t, Impl* impl) : _type{t}, _impl{impl}
143 {
144 }
145
146public:
147 Adapter(const Adapter&) = delete;
148
149 Adapter(Adapter&&) noexcept = default;
150
151 Adapter& operator=(const Adapter&) = delete;
152
153 Adapter& operator=(Adapter&&) noexcept = default;
154
155 virtual ~Adapter() = default;
156
158 inline Type type() const
159 {
160 return _type;
161 }
162
164 virtual Adapter* duplicate(const uint8_t /*addr*/)
165 {
166 return new Adapter();
167 }
168
172 inline virtual void beginTransaction()
173 {
174 }
176 inline virtual void endTransaction()
177 {
178 }
180
184 inline m5::hal::error::error_t readWithTransaction(uint8_t* data, const size_t len)
185 {
186 return _impl->readWithTransaction(data, len);
187 }
188 inline m5::hal::error::error_t writeWithTransaction(const uint8_t* data, const size_t len,
189 const uint32_t exparam = 1)
190 {
191 return _impl->writeWithTransaction(data, len, exparam);
192 }
193 inline m5::hal::error::error_t writeWithTransaction(const uint8_t reg, const uint8_t* data, const size_t len,
194 const uint32_t exparam = 1)
195 {
196 return _impl->writeWithTransaction(reg, data, len, exparam);
197 }
198 inline m5::hal::error::error_t writeWithTransaction(const uint16_t reg, const uint8_t* data, const size_t len,
199 const uint32_t exparam = 1)
200 {
201 return _impl->writeWithTransaction(reg, data, len, exparam);
202 }
204 inline m5::hal::error::error_t generalCall(const uint8_t* data, const size_t len)
205 {
206 return _impl->generalCall(data, len);
207 }
209
212#if defined(ESP_PLATFORM)
213 inline m5::hal::error::error_t pinModeRX(const gpio::Mode m)
214 {
215 return _impl->pinModeRX(m);
216 }
217#endif
218 inline m5::hal::error::error_t writeDigitalRX(const bool high)
219 {
220 return _impl->writeDigitalRX(high);
221 }
222 inline m5::hal::error::error_t readDigitalRX(bool& high)
223 {
224 return _impl->readDigitalRX(high);
225 }
226 inline m5::hal::error::error_t writeAnalogRX(const uint16_t v)
227 {
228 return _impl->writeAnalogRX(v);
229 }
230 inline m5::hal::error::error_t readAnalogRX(uint16_t& v)
231 {
232 return _impl->readAnalogRX(v);
233 }
234 inline m5::hal::error::error_t readAnalogMilliVoltsRX(uint32_t& mv)
235 {
236 return _impl->readAnalogMilliVoltsRX(mv);
237 }
238 inline m5::hal::error::error_t pulseInRX(uint32_t& duration, const int state, const uint32_t timeout_us)
239 {
240 return _impl->pulseInRX(duration, state, timeout_us);
241 }
242
246#if defined(ESP_PLATFORM)
247 inline m5::hal::error::error_t pinModeTX(const gpio::Mode m)
248 {
249 return _impl->pinModeTX(m);
250 }
251#endif
252 inline m5::hal::error::error_t writeDigitalTX(const bool high)
253 {
254 return _impl->writeDigitalTX(high);
255 }
256 inline m5::hal::error::error_t readDigitalTX(bool& high)
257 {
258 return _impl->readDigitalTX(high);
259 }
260 inline m5::hal::error::error_t writeAnalogTX(const uint16_t v)
261 {
262 return _impl->writeAnalogTX(v);
263 }
264 inline m5::hal::error::error_t readAnalogTX(uint16_t& v)
265 {
266 return _impl->readAnalogTX(v);
267 }
268 inline m5::hal::error::error_t readAnalogMilliVoltsTX(uint32_t& mv)
269 {
270 return _impl->readAnalogMilliVoltsTX(mv);
271 }
272 inline m5::hal::error::error_t pulseInTX(uint32_t& duration, const int state, const uint32_t timeout_us)
273 {
274 return _impl->pulseInTX(duration, state, timeout_us);
275 }
276
278
279private:
280 Type _type{Type::Unknown};
281
282protected:
283 std::unique_ptr<Impl> _impl{};
284};
285
288 explicit transaction_guard(Adapter* ad) : _ad{ad}
289 {
290 _ad->beginTransaction();
291 }
293 {
294 _ad->endTransaction();
295 }
296 Adapter* _ad{};
297};
298
299} // namespace unit
300} // namespace m5
301#endif
Implementation base class (Pimpl pattern)
Definition adapter_base.hpp:37
Adapter base class to treat M5HAL and TwoWire,GPIO,Serial,SPI... in the same way.
Adapter()
Default constructor (creates Unknown type adapter)
Definition adapter_base.hpp:137
m5::hal::error::error_t writeWithTransaction(const uint8_t reg, const uint8_t *data, const size_t len, const uint32_t exparam=1)
Read data within a transaction.
Definition adapter_base.hpp:193
m5::hal::error::error_t writeWithTransaction(const uint8_t *data, const size_t len, const uint32_t exparam=1)
Read data within a transaction.
Definition adapter_base.hpp:188
Type
Adapter type.
Definition adapter_base.hpp:28
@ Unknown
Not yet assigned.
Type type() const
Gets the adapter type.
Definition adapter_base.hpp:158
virtual void endTransaction()
End a bus transaction.
Definition adapter_base.hpp:176
virtual void beginTransaction()
Begin a bus transaction.
Definition adapter_base.hpp:172
m5::hal::error::error_t readWithTransaction(uint8_t *data, const size_t len)
Read data within a transaction.
Definition adapter_base.hpp:184
virtual Adapter * duplicate(const uint8_t)
Create a duplicate adapter with a different address.
Definition adapter_base.hpp:164
m5::hal::error::error_t writeWithTransaction(const uint16_t reg, const uint8_t *data, const size_t len, const uint32_t exparam=1)
Read data within a transaction.
Definition adapter_base.hpp:198
m5::hal::error::error_t generalCall(const uint8_t *data, const size_t len)
Send a general call on the I2C bus.
Definition adapter_base.hpp:204
Top level namespace of M5Stack.
Definition test_helper.hpp:20
Unit-related namespace.
RAII guard for adapter transactions.
Definition adapter_base.hpp:287
Type and enumerator definitions.