M5UnitUnified 0.3.0 git rev:6b3818b
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 pulseInRX(uint32_t&, const int, const uint32_t)
88 {
89 return m5::hal::error::error_t::UNKNOWN_ERROR;
90 }
91
92 virtual m5::hal::error::error_t pinModeTX(const gpio::Mode)
93 {
94 return m5::hal::error::error_t::UNKNOWN_ERROR;
95 }
96 virtual m5::hal::error::error_t writeDigitalTX(const bool)
97 {
98 return m5::hal::error::error_t::UNKNOWN_ERROR;
99 }
100 virtual m5::hal::error::error_t readDigitalTX(bool&)
101 {
102 return m5::hal::error::error_t::UNKNOWN_ERROR;
103 }
104 virtual m5::hal::error::error_t writeAnalogTX(const uint16_t)
105 {
106 return m5::hal::error::error_t::UNKNOWN_ERROR;
107 }
108 virtual m5::hal::error::error_t readAnalogTX(uint16_t&)
109 {
110 return m5::hal::error::error_t::UNKNOWN_ERROR;
111 }
112 virtual m5::hal::error::error_t pulseInTX(uint32_t&, const int, const uint32_t)
113 {
114 return m5::hal::error::error_t::UNKNOWN_ERROR;
115 }
116 };
117
118 explicit Adapter() : _impl{new Impl()}
119 {
120 }
121
122protected:
123 Adapter(const Type t, Impl* impl) : _type{t}, _impl{impl}
124 {
125 }
126
127public:
128 Adapter(const Adapter&) = delete;
129
130 Adapter(Adapter&&) noexcept = default;
131
132 Adapter& operator=(const Adapter&) = delete;
133
134 Adapter& operator=(Adapter&&) noexcept = default;
135
136 virtual ~Adapter() = default;
137
138 inline Type type() const
139 {
140 return _type;
141 }
142
143 virtual Adapter* duplicate(const uint8_t /*addr*/)
144 {
145 return new Adapter();
146 }
147
148 //
149 inline virtual void beginTransaction()
150 {
151 }
152 inline virtual void endTransaction()
153 {
154 }
155
156 // I2C R/W
157 inline m5::hal::error::error_t readWithTransaction(uint8_t* data, const size_t len)
158 {
159 return _impl->readWithTransaction(data, len);
160 }
161 inline m5::hal::error::error_t writeWithTransaction(const uint8_t* data, const size_t len,
162 const uint32_t exparam = 1)
163 {
164 return _impl->writeWithTransaction(data, len, exparam);
165 }
166 inline m5::hal::error::error_t writeWithTransaction(const uint8_t reg, const uint8_t* data, const size_t len,
167 const uint32_t exparam = 1)
168 {
169 return _impl->writeWithTransaction(reg, data, len, exparam);
170 }
171 inline m5::hal::error::error_t writeWithTransaction(const uint16_t reg, const uint8_t* data, const size_t len,
172 const uint32_t exparam = 1)
173 {
174 return _impl->writeWithTransaction(reg, data, len, exparam);
175 }
176 inline m5::hal::error::error_t generalCall(const uint8_t* data, const size_t len)
177 {
178 return _impl->generalCall(data, len);
179 }
180
181 // GPIO
182 inline m5::hal::error::error_t pinModeRX(const gpio::Mode m)
183 {
184 return _impl->pinModeRX(m);
185 }
186 inline m5::hal::error::error_t writeDigitalRX(const bool high)
187 {
188 return _impl->writeDigitalRX(high);
189 }
190 inline m5::hal::error::error_t readDigitalRX(bool& high)
191 {
192 return _impl->readDigitalRX(high);
193 }
194 inline m5::hal::error::error_t writeAnalogRX(const uint16_t v)
195 {
196 return _impl->writeAnalogRX(v);
197 }
198 inline m5::hal::error::error_t readAnalogRX(uint16_t& v)
199 {
200 return _impl->readAnalogRX(v);
201 }
202 inline m5::hal::error::error_t pulseInRX(uint32_t& duration, const int state, const uint32_t timeout_us)
203 {
204 return _impl->pulseInRX(duration, state, timeout_us);
205 }
206
207 inline m5::hal::error::error_t pinModeTX(const gpio::Mode m)
208 {
209 return _impl->pinModeTX(m);
210 }
211 inline m5::hal::error::error_t writeDigitalTX(const bool high)
212 {
213 return _impl->writeDigitalTX(high);
214 }
215 inline m5::hal::error::error_t readDigitalTX(bool& high)
216 {
217 return _impl->readDigitalTX(high);
218 }
219 inline m5::hal::error::error_t writeAnalogTX(const uint16_t v)
220 {
221 return _impl->writeAnalogTX(v);
222 }
223 inline m5::hal::error::error_t readAnalogTX(uint16_t& v)
224 {
225 return _impl->readAnalogTX(v);
226 }
227 inline m5::hal::error::error_t pulseInTX(uint32_t& duration, const int state, const uint32_t timeout_us)
228 {
229 return _impl->pulseInTX(duration, state, timeout_us);
230 }
231
232private:
233 Type _type{Type::Unknown};
234
235protected:
236 std::unique_ptr<Impl> _impl{};
237};
238
240 explicit transaction_guard(Adapter* ad) : _ad{ad}
241 {
242 _ad->beginTransaction();
243 }
245 {
246 _ad->endTransaction();
247 }
248 Adapter* _ad{};
249};
250
251} // namespace unit
252} // namespace m5
253#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:18
Unit-related namespace.
Definition adapter_base.hpp:239
Type and enumerator definitions.
Mode
Pin mode.
Definition types.hpp:61