18class DriverDeviceInfoZephyr :
public IDriverDeviceInfo {
20 DriverDeviceInfoZephyr(
const DriverDeviceInfoZephyr&) =
delete;
21 DriverDeviceInfoZephyr& operator=(
const DriverDeviceInfoZephyr&) =
delete;
22 DriverDeviceInfoZephyr() =
default;
23 bool addI2S(InfoI2S info) {
28 bool addI2S(PinFunction function, device* dev_i2s,
int port = 0) {
29 InfoI2S info(function, dev_i2s, port);
34 bool setI2S(InfoI2S pin) {
return set<InfoI2S>(pin, i2s); }
36 bool addSPI(InfoSPI pin) {
37 if (getSPIPins(pin.function))
return false;
42 bool addSPI(PinFunction function, device* dev_spi) {
43 InfoSPI pin(function, dev_spi);
48 bool setSPI(InfoSPI info) {
return set<InfoSPI>(info, spi); }
50 bool addI2C(InfoI2C info) {
55 bool addI2C(PinFunction function, device* dev_i2c,
int address = -1,
57 InfoI2C info(function, dev_i2c, address, active);
61 bool setI2C(InfoI2C info) {
return set<InfoI2C>(info, i2c); }
63 bool addPin(InfoGPIO info) {
68 bool addPin(PinFunction function, GpioPin pinNo, PinLogic logic,
70 InfoGPIO pin(function, pinNo, logic, index);
75 bool setPin(InfoGPIO updatedPin) {
76 for (InfoGPIO& pin : pins) {
77 if (pin.function == updatedPin.function &&
78 pin.index == updatedPin.index) {
87 bool setPinActive(GpioPin gpioPin,
bool active) {
88 for (InfoGPIO& pin : pins) {
89 if (pin.pin == gpioPin) {
98 bool setPinActive(PinFunction func,
int idx,
bool active) {
99 auto pin = getPin(func, idx);
101 auto value = pin.value();
102 value.active = active;
104 return setPin(value);
112 for (InfoGPIO& pin : pins) {
113 if (pin.function == function && pin.index == pos)
return pin;
120 for (InfoGPIO& pin : pins) {
121 if (pin.pin == pinId)
return pin;
126 GpioPin getPinID(PinFunction function,
int pos = 0) {
127 auto pin = getPin(function, pos);
128 if (pin)
return pin.value().pin;
134 PinFunction function)
override {
135 InfoI2C* pins = getPtr<InfoI2C>(function, i2c);
136 if (pins ==
nullptr)
return {};
142 InfoSPI* pins = getPtr<InfoSPI>(function, spi);
143 if (pins ==
nullptr)
return {};
149 for (InfoI2S& pins : i2s) {
150 if (pins.port == port)
return pins;
157 PinFunction function = PinFunction::CODEC) {
158 InfoI2S* pins = getPtr<InfoI2S>(function, i2s);
159 if (pins ==
nullptr)
return {};
164 virtual bool begin() {
165 AD_LOGD(
"DriverDeviceInfo::begin");
172 for (
auto& tmp : spi) {
173 if (tmp.function == PinFunction::SD) {
175 result &= tmp.begin();
177 result &= tmp.begin();
182 for (
auto& tmp : i2c) {
183 result &= tmp.begin();
190 for (
auto& tmp : spi) {
192 if (tmp.function == PinFunction::SD) {
193 if (sd_active) tmp.end();
199 for (
auto& tmp : i2c) {
200 AD_LOGD(
"DriverDeviceInfo::begin::I2C::end");
206 void setSPIActiveForSD(
bool active) {
207 AD_LOGD(
"DriverDeviceInfo::setSPIActiveForSD: %d", active);
208 sd_active = active; }
211 bool isSPIActiveForSD() {
return sd_active; }
214 void setSDMMCActive(
bool active) {
215 AD_LOGD(
"DriverDeviceInfo::setSDMMCActive: %d", active);
216 sdmmc_active = active;
221 bool isSDMMCActive() {
return sdmmc_active; }
224 bool hasPins() {
return !pins.empty(); }
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;
235 API_GPIO& getGPIO() {
return gpio; }
243 bool sd_active =
false;
244 bool sdmmc_active =
false;
246 template <
typename T>
248 for (
auto& pins : vect) {
249 if (pins.function == function)
return &pins;
254 template <
typename T>
256 T* pins = getPtr<T>(pin.function, vect);
257 if (pins ==
nullptr)
return false;
262 void setupPinMode() {
264 AD_LOGD(
"DriverDeviceInfo::setupPinMode");
266 for (
auto& tmp : pins) {
268 AD_LOGD(
"pinMode for %d", tmp.pin);
269 switch (tmp.pin_logic) {
270 case PinLogic::InputActiveHigh:
271 gpio.pinMode(tmp.pin,
INPUT);
273 case PinLogic::InputActiveLow:
276 case PinLogic::Input:
277 gpio.pinMode(tmp.pin,
INPUT);
279 case PinLogic::Output:
280 gpio.pinMode(tmp.pin,
OUTPUT);
292 bool hasConflict(
int pin) {
296 bool hasSPIConflict(
int pin) {
300 bool hasI2CConflict(
int pin) {
306using DriverDeviceInfo = DriverDeviceInfoZephyr;
314static DriverDeviceInfoZephyr
NoPins;
#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