M5UnitUnified 0.4.4 git rev:306ddd5
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:
27 enum class Type : uint8_t {
28 Unknown,
29 I2C,
30 GPIO,
31 UART,
32 SPI,
33 };
34
35 class Impl {
36 public:
37 Impl() = default;
38
39 virtual ~Impl()
40 {
41 }
42
43 // R/W
44 virtual m5::hal::error::error_t readWithTransaction(uint8_t*, const size_t)
45 {
46 return m5::hal::error::error_t::UNKNOWN_ERROR;
47 }
48 virtual m5::hal::error::error_t writeWithTransaction(const uint8_t*, const size_t, const uint32_t)
49 {
50 return m5::hal::error::error_t::UNKNOWN_ERROR;
51 }
52 virtual m5::hal::error::error_t writeWithTransaction(const uint8_t, const uint8_t*, const size_t,
53 const uint32_t)
54 {
55 return m5::hal::error::error_t::UNKNOWN_ERROR;
56 }
57 virtual m5::hal::error::error_t writeWithTransaction(const uint16_t, const uint8_t*, const size_t,
58 const uint32_t)
59 {
60 return m5::hal::error::error_t::UNKNOWN_ERROR;
61 }
62 virtual m5::hal::error::error_t generalCall(const uint8_t*, const size_t)
63 {
64 return m5::hal::error::error_t::UNKNOWN_ERROR;
65 }
66 // GPIO
67 virtual m5::hal::error::error_t pinModeRX(const gpio::Mode)
68 {
69 return m5::hal::error::error_t::UNKNOWN_ERROR;
70 }
71 virtual m5::hal::error::error_t writeDigitalRX(const bool)
72 {
73 return m5::hal::error::error_t::UNKNOWN_ERROR;
74 }
75 virtual m5::hal::error::error_t readDigitalRX(bool&)
76 {
77 return m5::hal::error::error_t::UNKNOWN_ERROR;
78 }
79 virtual m5::hal::error::error_t writeAnalogRX(const uint16_t)
80 {
81 return m5::hal::error::error_t::UNKNOWN_ERROR;
82 }
83 virtual m5::hal::error::error_t readAnalogRX(uint16_t&)
84 {
85 return m5::hal::error::error_t::UNKNOWN_ERROR;
86 }
87 virtual m5::hal::error::error_t readAnalogMilliVoltsRX(uint32_t&)
88 {
89 return m5::hal::error::error_t::UNKNOWN_ERROR;
90 }
91 virtual m5::hal::error::error_t pulseInRX(uint32_t&, const int, const uint32_t)
92 {
93 return m5::hal::error::error_t::UNKNOWN_ERROR;
94 }
95
96 virtual m5::hal::error::error_t pinModeTX(const gpio::Mode)
97 {
98 return m5::hal::error::error_t::UNKNOWN_ERROR;
99 }
100 virtual m5::hal::error::error_t writeDigitalTX(const bool)
101 {
102 return m5::hal::error::error_t::UNKNOWN_ERROR;
103 }
104 virtual m5::hal::error::error_t readDigitalTX(bool&)
105 {
106 return m5::hal::error::error_t::UNKNOWN_ERROR;
107 }
108 virtual m5::hal::error::error_t writeAnalogTX(const uint16_t)
109 {
110 return m5::hal::error::error_t::UNKNOWN_ERROR;
111 }
112 virtual m5::hal::error::error_t readAnalogTX(uint16_t&)
113 {
114 return m5::hal::error::error_t::UNKNOWN_ERROR;
115 }
116 virtual m5::hal::error::error_t readAnalogMilliVoltsTX(uint32_t&)
117 {
118 return m5::hal::error::error_t::UNKNOWN_ERROR;
119 }
120 virtual m5::hal::error::error_t pulseInTX(uint32_t&, const int, const uint32_t)
121 {
122 return m5::hal::error::error_t::UNKNOWN_ERROR;
123 }
124 };
125
126 explicit Adapter() : _impl{new Impl()}
127 {
128 }
129
130protected:
131 Adapter(const Type t, Impl* impl) : _type{t}, _impl{impl}
132 {
133 }
134
135public:
136 Adapter(const Adapter&) = delete;
137
138 Adapter(Adapter&&) noexcept = default;
139
140 Adapter& operator=(const Adapter&) = delete;
141
142 Adapter& operator=(Adapter&&) noexcept = default;
143
144 virtual ~Adapter() = default;
145
146 inline Type type() const
147 {
148 return _type;
149 }
150
151 virtual Adapter* duplicate(const uint8_t /*addr*/)
152 {
153 return new Adapter();
154 }
155
156 //
157 inline virtual void beginTransaction()
158 {
159 }
160 inline virtual void endTransaction()
161 {
162 }
163
164 // I2C R/W
165 inline m5::hal::error::error_t readWithTransaction(uint8_t* data, const size_t len)
166 {
167 return _impl->readWithTransaction(data, len);
168 }
169 inline m5::hal::error::error_t writeWithTransaction(const uint8_t* data, const size_t len,
170 const uint32_t exparam = 1)
171 {
172 return _impl->writeWithTransaction(data, len, exparam);
173 }
174 inline m5::hal::error::error_t writeWithTransaction(const uint8_t reg, const uint8_t* data, const size_t len,
175 const uint32_t exparam = 1)
176 {
177 return _impl->writeWithTransaction(reg, data, len, exparam);
178 }
179 inline m5::hal::error::error_t writeWithTransaction(const uint16_t reg, const uint8_t* data, const size_t len,
180 const uint32_t exparam = 1)
181 {
182 return _impl->writeWithTransaction(reg, data, len, exparam);
183 }
184 inline m5::hal::error::error_t generalCall(const uint8_t* data, const size_t len)
185 {
186 return _impl->generalCall(data, len);
187 }
188
189 // GPIO
190 inline m5::hal::error::error_t pinModeRX(const gpio::Mode m)
191 {
192 return _impl->pinModeRX(m);
193 }
194 inline m5::hal::error::error_t writeDigitalRX(const bool high)
195 {
196 return _impl->writeDigitalRX(high);
197 }
198 inline m5::hal::error::error_t readDigitalRX(bool& high)
199 {
200 return _impl->readDigitalRX(high);
201 }
202 inline m5::hal::error::error_t writeAnalogRX(const uint16_t v)
203 {
204 return _impl->writeAnalogRX(v);
205 }
206 inline m5::hal::error::error_t readAnalogRX(uint16_t& v)
207 {
208 return _impl->readAnalogRX(v);
209 }
210 inline m5::hal::error::error_t readAnalogMilliVoltsRX(uint32_t& mv)
211 {
212 return _impl->readAnalogMilliVoltsRX(mv);
213 }
214 inline m5::hal::error::error_t pulseInRX(uint32_t& duration, const int state, const uint32_t timeout_us)
215 {
216 return _impl->pulseInRX(duration, state, timeout_us);
217 }
218
219 inline m5::hal::error::error_t pinModeTX(const gpio::Mode m)
220 {
221 return _impl->pinModeTX(m);
222 }
223 inline m5::hal::error::error_t writeDigitalTX(const bool high)
224 {
225 return _impl->writeDigitalTX(high);
226 }
227 inline m5::hal::error::error_t readDigitalTX(bool& high)
228 {
229 return _impl->readDigitalTX(high);
230 }
231 inline m5::hal::error::error_t writeAnalogTX(const uint16_t v)
232 {
233 return _impl->writeAnalogTX(v);
234 }
235 inline m5::hal::error::error_t readAnalogTX(uint16_t& v)
236 {
237 return _impl->readAnalogTX(v);
238 }
239 inline m5::hal::error::error_t readAnalogMilliVoltsTX(uint32_t& mv)
240 {
241 return _impl->readAnalogMilliVoltsTX(mv);
242 }
243 inline m5::hal::error::error_t pulseInTX(uint32_t& duration, const int state, const uint32_t timeout_us)
244 {
245 return _impl->pulseInTX(duration, state, timeout_us);
246 }
247
248private:
249 Type _type{Type::Unknown};
250
251protected:
252 std::unique_ptr<Impl> _impl{};
253};
254
256 explicit transaction_guard(Adapter* ad) : _ad{ad}
257 {
258 _ad->beginTransaction();
259 }
261 {
262 _ad->endTransaction();
263 }
264 Adapter* _ad{};
265};
266
267} // namespace unit
268} // namespace m5
269#endif
Definition adapter_base.hpp:35
Adapter base class to treat M5HAL and TwoWire,GPIO,Serial,SPI... in the same way.
Top level namespace of M5stack.
Definition test_helper.hpp:20
Unit-related namespace.
Definition adapter_base.hpp:255
Type and enumerator definitions.
Mode
Pin mode.
Definition types.hpp:61