arduino-audio-driver
Loading...
Searching...
No Matches
DriverDeviceInfoZephyr.h
Go to the documentation of this file.
1
2#pragma once
3#include "DriverCommon.h"
4#ifdef __zephyr__
7
8namespace audio_driver {
9
18class DriverDeviceInfoZephyr : public IDriverDeviceInfo {
19 public:
20 DriverDeviceInfoZephyr(const DriverDeviceInfoZephyr&) = delete;
21 DriverDeviceInfoZephyr& operator=(const DriverDeviceInfoZephyr&) = delete;
22 DriverDeviceInfoZephyr() = default;
23 bool addI2S(InfoI2S info) {
24 i2s.push_back(info);
25 return true;
26 }
27
28 bool addI2S(PinFunction function, device* dev_i2s, int port = 0) {
29 InfoI2S info(function, dev_i2s, port);
30 return addI2S(info);
31 }
32
34 bool setI2S(InfoI2S pin) { return set<InfoI2S>(pin, i2s); }
35
36 bool addSPI(InfoSPI pin) {
37 if (getSPIPins(pin.function)) return false;
38 spi.push_back(pin);
39 return true;
40 }
41
42 bool addSPI(PinFunction function, device* dev_spi) {
43 InfoSPI pin(function, dev_spi);
44 return addSPI(pin);
45 }
46
48 bool setSPI(InfoSPI info) { return set<InfoSPI>(info, spi); }
49
50 bool addI2C(InfoI2C info) {
51 i2c.push_back(info);
52 return true;
53 }
54
55 bool addI2C(PinFunction function, device* dev_i2c, int address = -1,
56 bool active = true) {
57 InfoI2C info(function, dev_i2c, address, active);
58 return addI2C(info);
59 }
61 bool setI2C(InfoI2C info) { return set<InfoI2C>(info, i2c); }
62
63 bool addPin(InfoGPIO info) {
64 pins.push_back(info);
65 return true;
66 }
67
68 bool addPin(PinFunction function, GpioPin pinNo, PinLogic logic,
69 int index = 0) {
70 InfoGPIO pin(function, pinNo, logic, index);
71 return addPin(pin);
72 }
73
75 bool setPin(InfoGPIO updatedPin) {
76 for (InfoGPIO& pin : pins) {
77 if (pin.function == updatedPin.function &&
78 pin.index == updatedPin.index) {
79 pin = updatedPin;
80 return true;
81 }
82 }
83 return false;
84 }
85
87 bool setPinActive(GpioPin gpioPin, bool active) {
88 for (InfoGPIO& pin : pins) {
89 if (pin.pin == gpioPin) {
90 pin.active = active;
91 return true;
92 }
93 }
94 return false;
95 }
96
98 bool setPinActive(PinFunction func, int idx, bool active) {
99 auto pin = getPin(func, idx);
100 if (pin) {
101 auto value = pin.value();
102 value.active = active;
103 // update pin
104 return setPin(value);
105 }
106 return false;
107 }
108
110 audio_driver_local::Optional<InfoGPIO> getPin(PinFunction function,
111 int pos = 0) {
112 for (InfoGPIO& pin : pins) {
113 if (pin.function == function && pin.index == pos) return pin;
114 }
115 return {};
116 }
117
119 audio_driver_local::Optional<InfoGPIO> getPin(GpioPin pinId) {
120 for (InfoGPIO& pin : pins) {
121 if (pin.pin == pinId) return pin;
122 }
123 return {};
124 }
125
126 GpioPin getPinID(PinFunction function, int pos = 0) {
127 auto pin = getPin(function, pos);
128 if (pin) return pin.value().pin;
129 return GPIO_UNDEFINED;
130 }
131
134 PinFunction function) override {
135 InfoI2C* pins = getPtr<InfoI2C>(function, i2c);
136 if (pins == nullptr) return {};
137 return *pins;
138 }
139
141 audio_driver_local::Optional<InfoSPI> getSPIPins(PinFunction function) {
142 InfoSPI* pins = getPtr<InfoSPI>(function, spi);
143 if (pins == nullptr) return {};
144 return *pins;
145 }
146
148 audio_driver_local::Optional<InfoI2S> getI2SPins(int port) {
149 for (InfoI2S& pins : i2s) {
150 if (pins.port == port) return pins;
151 }
152 return {};
153 }
154
157 PinFunction function = PinFunction::CODEC) {
158 InfoI2S* pins = getPtr<InfoI2S>(function, i2s);
159 if (pins == nullptr) return {};
160 return *pins;
161 }
162
164 virtual bool begin() {
165 AD_LOGD("DriverDeviceInfo::begin");
166
167 // setup function pins
168 setupPinMode();
169
170 // setup spi
171 bool result = true;
172 for (auto& tmp : spi) {
173 if (tmp.function == PinFunction::SD) {
174 if (sd_active)
175 result &= tmp.begin();
176 else
177 result &= tmp.begin();
178 }
179 }
180
181 // setup i2c
182 for (auto& tmp : i2c) {
183 result &= tmp.begin();
184 }
185 return result;
186 }
187
188 void end() {
189 // close spi
190 for (auto& tmp : spi) {
191 // close SD only when sd_active
192 if (tmp.function == PinFunction::SD) {
193 if (sd_active) tmp.end();
194 } else {
195 tmp.end();
196 }
197 }
198 // close i2c
199 for (auto& tmp : i2c) {
200 AD_LOGD("DriverDeviceInfo::begin::I2C::end");
201 tmp.end();
202 }
203 }
204
206 void setSPIActiveForSD(bool active) {
207 AD_LOGD("DriverDeviceInfo::setSPIActiveForSD: %d", active);
208 sd_active = active; }
209
211 bool isSPIActiveForSD() { return sd_active; }
212
214 void setSDMMCActive(bool active) {
215 AD_LOGD("DriverDeviceInfo::setSDMMCActive: %d", active);
216 sdmmc_active = active;
217 sd_active = false;
218 }
219
221 bool isSDMMCActive() { return sdmmc_active; }
222
224 bool hasPins() { return !pins.empty(); }
225
227 virtual bool isKeyPressed(uint8_t key) {
228 auto pin_opt = getPin(PinFunction::KEY, key);
229 if (!pin_opt) return false;
230 auto pin = pin_opt.value();
231 bool value = gpio.digitalRead(pin.pin);
232 return pin.pin_logic == PinLogic::InputActiveLow ? !value : value;
233 }
234
235 API_GPIO& getGPIO() { return gpio; }
236
237 protected:
242 GPIO gpio; // standard Arduino GPIO
243 bool sd_active = false;
244 bool sdmmc_active = false;
245
246 template <typename T>
247 T* getPtr(PinFunction function, audio_driver_local::Vector<T>& vect) {
248 for (auto& pins : vect) {
249 if (pins.function == function) return &pins;
250 }
251 return nullptr;
252 }
253
254 template <typename T>
255 bool set(T pin, audio_driver_local::Vector<T>& vect) {
256 T* pins = getPtr<T>(pin.function, vect);
257 if (pins == nullptr) return false;
258 *pins = pin;
259 return true;
260 }
261
262 void setupPinMode() {
263 gpio.begin(*this);
264 AD_LOGD("DriverDeviceInfo::setupPinMode");
265 // setup pins
266 for (auto& tmp : pins) {
267 if (tmp.pin != GPIO_UNDEFINED) {
268 AD_LOGD("pinMode for %d", tmp.pin);
269 switch (tmp.pin_logic) {
270 case PinLogic::InputActiveHigh:
271 gpio.pinMode(tmp.pin, INPUT);
272 break;
273 case PinLogic::InputActiveLow:
274 gpio.pinMode(tmp.pin, INPUT_PULLUP);
275 break;
276 case PinLogic::Input:
277 gpio.pinMode(tmp.pin, INPUT);
278 break;
279 case PinLogic::Output:
280 gpio.pinMode(tmp.pin, OUTPUT);
281 break;
282 default:
283 // do nothing
284 break;
285 }
286 } else {
287 AD_LOGD("Pin is -1");
288 }
289 }
290 }
291
292 bool hasConflict(int pin) {
293 return false;
294 }
295
296 bool hasSPIConflict(int pin) {
297 return false;
298 }
299
300 bool hasI2CConflict(int pin) {
301 return false;
302 }
303};
304
306using DriverDeviceInfo = DriverDeviceInfoZephyr;
307
308
309// -- Pins
314static DriverDeviceInfoZephyr NoPins;
315
316} // namespace audio_driver
317
318#endif
#define INPUT
Definition DriverCommon.h:41
#define GPIO_UNDEFINED
Definition DriverCommon.h:131
#define OUTPUT
Definition DriverCommon.h:44
#define INPUT_PULLUP
Definition DriverCommon.h:47
#define AD_LOGD(...)
Definition Logger.h:12
Abstraction for digital GPIO pin operations.
A simple optonal implementation.
Definition Optional.h:10
Vector implementation which provides the most important methods as defined by std::vector....
Definition Vector.h:15
static DriverDeviceInfo NoPins
Pins need to be set up in the sketch.
Definition DriverDeviceInfo.h:390
Namespace for audio driver components.
Definition AudioBoard.h:5
int16_t GpioPin
Definition DriverCommon.h:153