M5UnitUnified 0.4.6 git rev:c61a63c
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 virtual m5::hal::error::error_t pinModeRX(const gpio::Mode)
73 {
74 return m5::hal::error::error_t::UNKNOWN_ERROR;
75 }
76 virtual m5::hal::error::error_t writeDigitalRX(const bool)
77 {
78 return m5::hal::error::error_t::UNKNOWN_ERROR;
79 }
80 virtual m5::hal::error::error_t readDigitalRX(bool&)
81 {
82 return m5::hal::error::error_t::UNKNOWN_ERROR;
83 }
84 virtual m5::hal::error::error_t writeAnalogRX(const uint16_t)
85 {
86 return m5::hal::error::error_t::UNKNOWN_ERROR;
87 }
88 virtual m5::hal::error::error_t readAnalogRX(uint16_t&)
89 {
90 return m5::hal::error::error_t::UNKNOWN_ERROR;
91 }
92 virtual m5::hal::error::error_t readAnalogMilliVoltsRX(uint32_t&)
93 {
94 return m5::hal::error::error_t::UNKNOWN_ERROR;
95 }
96 virtual m5::hal::error::error_t pulseInRX(uint32_t&, const int, const uint32_t)
97 {
98 return m5::hal::error::error_t::UNKNOWN_ERROR;
99 }
100
101 virtual m5::hal::error::error_t pinModeTX(const gpio::Mode)
102 {
103 return m5::hal::error::error_t::UNKNOWN_ERROR;
104 }
105 virtual m5::hal::error::error_t writeDigitalTX(const bool)
106 {
107 return m5::hal::error::error_t::UNKNOWN_ERROR;
108 }
109 virtual m5::hal::error::error_t readDigitalTX(bool&)
110 {
111 return m5::hal::error::error_t::UNKNOWN_ERROR;
112 }
113 virtual m5::hal::error::error_t writeAnalogTX(const uint16_t)
114 {
115 return m5::hal::error::error_t::UNKNOWN_ERROR;
116 }
117 virtual m5::hal::error::error_t readAnalogTX(uint16_t&)
118 {
119 return m5::hal::error::error_t::UNKNOWN_ERROR;
120 }
121 virtual m5::hal::error::error_t readAnalogMilliVoltsTX(uint32_t&)
122 {
123 return m5::hal::error::error_t::UNKNOWN_ERROR;
124 }
125 virtual m5::hal::error::error_t pulseInTX(uint32_t&, const int, const uint32_t)
126 {
127 return m5::hal::error::error_t::UNKNOWN_ERROR;
128 }
130 };
131
133 explicit Adapter() : _impl{new Impl()}
134 {
135 }
136
137protected:
138 Adapter(const Type t, Impl* impl) : _type{t}, _impl{impl}
139 {
140 }
141
142public:
143 Adapter(const Adapter&) = delete;
144
145 Adapter(Adapter&&) noexcept = default;
146
147 Adapter& operator=(const Adapter&) = delete;
148
149 Adapter& operator=(Adapter&&) noexcept = default;
150
151 virtual ~Adapter() = default;
152
154 inline Type type() const
155 {
156 return _type;
157 }
158
160 virtual Adapter* duplicate(const uint8_t /*addr*/)
161 {
162 return new Adapter();
163 }
164
168 inline virtual void beginTransaction()
169 {
170 }
172 inline virtual void endTransaction()
173 {
174 }
176
180 inline m5::hal::error::error_t readWithTransaction(uint8_t* data, const size_t len)
181 {
182 return _impl->readWithTransaction(data, len);
183 }
184 inline m5::hal::error::error_t writeWithTransaction(const uint8_t* data, const size_t len,
185 const uint32_t exparam = 1)
186 {
187 return _impl->writeWithTransaction(data, len, exparam);
188 }
189 inline m5::hal::error::error_t writeWithTransaction(const uint8_t reg, const uint8_t* data, const size_t len,
190 const uint32_t exparam = 1)
191 {
192 return _impl->writeWithTransaction(reg, data, len, exparam);
193 }
194 inline m5::hal::error::error_t writeWithTransaction(const uint16_t reg, const uint8_t* data, const size_t len,
195 const uint32_t exparam = 1)
196 {
197 return _impl->writeWithTransaction(reg, data, len, exparam);
198 }
200 inline m5::hal::error::error_t generalCall(const uint8_t* data, const size_t len)
201 {
202 return _impl->generalCall(data, len);
203 }
205
208 inline m5::hal::error::error_t pinModeRX(const gpio::Mode m)
209 {
210 return _impl->pinModeRX(m);
211 }
212 inline m5::hal::error::error_t writeDigitalRX(const bool high)
213 {
214 return _impl->writeDigitalRX(high);
215 }
216 inline m5::hal::error::error_t readDigitalRX(bool& high)
217 {
218 return _impl->readDigitalRX(high);
219 }
220 inline m5::hal::error::error_t writeAnalogRX(const uint16_t v)
221 {
222 return _impl->writeAnalogRX(v);
223 }
224 inline m5::hal::error::error_t readAnalogRX(uint16_t& v)
225 {
226 return _impl->readAnalogRX(v);
227 }
228 inline m5::hal::error::error_t readAnalogMilliVoltsRX(uint32_t& mv)
229 {
230 return _impl->readAnalogMilliVoltsRX(mv);
231 }
232 inline m5::hal::error::error_t pulseInRX(uint32_t& duration, const int state, const uint32_t timeout_us)
233 {
234 return _impl->pulseInRX(duration, state, timeout_us);
235 }
236
240 inline m5::hal::error::error_t pinModeTX(const gpio::Mode m)
241 {
242 return _impl->pinModeTX(m);
243 }
244 inline m5::hal::error::error_t writeDigitalTX(const bool high)
245 {
246 return _impl->writeDigitalTX(high);
247 }
248 inline m5::hal::error::error_t readDigitalTX(bool& high)
249 {
250 return _impl->readDigitalTX(high);
251 }
252 inline m5::hal::error::error_t writeAnalogTX(const uint16_t v)
253 {
254 return _impl->writeAnalogTX(v);
255 }
256 inline m5::hal::error::error_t readAnalogTX(uint16_t& v)
257 {
258 return _impl->readAnalogTX(v);
259 }
260 inline m5::hal::error::error_t readAnalogMilliVoltsTX(uint32_t& mv)
261 {
262 return _impl->readAnalogMilliVoltsTX(mv);
263 }
264 inline m5::hal::error::error_t pulseInTX(uint32_t& duration, const int state, const uint32_t timeout_us)
265 {
266 return _impl->pulseInTX(duration, state, timeout_us);
267 }
268
270
271private:
272 Type _type{Type::Unknown};
273
274protected:
275 std::unique_ptr<Impl> _impl{};
276};
277
280 explicit transaction_guard(Adapter* ad) : _ad{ad}
281 {
282 _ad->beginTransaction();
283 }
285 {
286 _ad->endTransaction();
287 }
288 Adapter* _ad{};
289};
290
291} // namespace unit
292} // namespace m5
293#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:133
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:189
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:184
Type
Adapter type.
Definition adapter_base.hpp:28
@ Unknown
Not yet assigned.
Type type() const
Gets the adapter type.
Definition adapter_base.hpp:154
virtual void endTransaction()
End a bus transaction.
Definition adapter_base.hpp:172
virtual void beginTransaction()
Begin a bus transaction.
Definition adapter_base.hpp:168
m5::hal::error::error_t readWithTransaction(uint8_t *data, const size_t len)
Read data within a transaction.
Definition adapter_base.hpp:180
virtual Adapter * duplicate(const uint8_t)
Create a duplicate adapter with a different address.
Definition adapter_base.hpp:160
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:194
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:200
Top level namespace of M5Stack.
Definition test_helper.hpp:20
Unit-related namespace.
RAII guard for adapter transactions.
Definition adapter_base.hpp:279
Type and enumerator definitions.
Mode
Pin mode.
Definition types.hpp:61