@@ -197,10 +197,10 @@ struct PinsI2C {
197
197
}
198
198
return true ;
199
199
}
200
- void end () {
200
+ void end () {
201
201
#ifndef ESP8266
202
202
p_wire->end ();
203
- #endif
203
+ #endif
204
204
}
205
205
};
206
206
@@ -233,32 +233,57 @@ struct PinsFunction {
233
233
*/
234
234
class DriverPins {
235
235
public:
236
- void addI2S (PinsI2S pin) { i2s.push_back (pin); }
237
- void addI2S (PinFunction function, GpioPin mclk, GpioPin bck, GpioPin ws,
236
+ bool addI2S (PinsI2S pin) {
237
+ if (getI2SPins (pin.function )) return false ;
238
+ i2s.push_back (pin);
239
+ return true ;
240
+ }
241
+
242
+ bool addI2S (PinFunction function, GpioPin mclk, GpioPin bck, GpioPin ws,
238
243
GpioPin data_out, GpioPin data_in = -1 , int port = 0 ) {
239
244
PinsI2S pin{function, mclk, bck, ws, data_out, data_in, port};
240
- addI2S (pin);
245
+ return addI2S (pin);
241
246
}
242
- void addSPI (PinsSPI pin) { spi.push_back (pin); }
243
- void addSPI (PinFunction function, GpioPin clk, GpioPin miso, GpioPin mosi,
247
+
248
+ bool setI2S (PinsI2S pin) { return set<PinsI2S>(pin, i2s); }
249
+
250
+ bool addSPI (PinsSPI pin) {
251
+ if (getSPIPins (pin.function )) return false ;
252
+ spi.push_back (pin);
253
+ return true ;
254
+ }
255
+
256
+ bool addSPI (PinFunction function, GpioPin clk, GpioPin miso, GpioPin mosi,
244
257
GpioPin cs, SPIClass &spi = SPI) {
245
258
PinsSPI pin (function, clk, miso, mosi, cs, spi);
246
- addSPI (pin);
259
+ return addSPI (pin);
247
260
}
261
+
262
+ bool setSPI (PinsSPI pin) { return set<PinsSPI>(pin, spi); }
248
263
249
- void addI2C (PinsI2C pin) { i2c.push_back (pin); }
250
- void addI2C (PinFunction function, GpioPin scl, GpioPin sda, int port = -1 ,
264
+ bool addI2C (PinsI2C pin) {
265
+ if (getI2CPins (pin.function )) return false ;
266
+ i2c.push_back (pin);
267
+ return true ;
268
+ }
269
+
270
+ bool addI2C (PinFunction function, GpioPin scl, GpioPin sda, int port = -1 ,
251
271
uint32_t frequency = 100000 , TwoWire &wire = Wire) {
252
272
PinsI2C pin (function, scl, sda, port, frequency, wire);
253
- addI2C (pin);
273
+ return addI2C (pin);
254
274
}
275
+
276
+ bool setI2C (PinsI2C pin) { return set<PinsI2C>(pin, i2c); }
255
277
256
- void addPin (PinsFunction pin) { pins.push_back (pin); }
278
+ bool addPin (PinsFunction pin) {
279
+ pins.push_back (pin);
280
+ return true ;
281
+ }
257
282
258
- void addPin (PinFunction function, GpioPin pinNo, PinLogic logic,
283
+ bool addPin (PinFunction function, GpioPin pinNo, PinLogic logic,
259
284
int index = 0 ) {
260
285
PinsFunction pin (function, pinNo, logic, index);
261
- addPin (pin);
286
+ return addPin (pin);
262
287
}
263
288
// / Get pin information by function
264
289
Optional<PinsFunction> getPin (PinFunction function, int pos = 0 ) {
@@ -283,17 +308,15 @@ class DriverPins {
283
308
}
284
309
285
310
Optional<PinsI2C> getI2CPins (PinFunction function) {
286
- for (PinsI2C &pin : i2c) {
287
- if (pin.function == function) return pin;
288
- }
289
- return {};
311
+ PinsI2C *pins = getPtr<PinsI2C>(function, i2c);
312
+ if (pins == nullptr ) return {};
313
+ return *pins;
290
314
}
291
315
292
316
Optional<PinsSPI> getSPIPins (PinFunction function) {
293
- for (PinsSPI &pins : spi) {
294
- if (pins.function == function) return pins;
295
- }
296
- return {};
317
+ PinsSPI *pins = getPtr<PinsSPI>(function, spi);
318
+ if (pins == nullptr ) return {};
319
+ return *pins;
297
320
}
298
321
299
322
// / Finds the I2S pins with the help of the port
@@ -306,10 +329,9 @@ class DriverPins {
306
329
307
330
// / Finds the I2S pins with the help of the function
308
331
Optional<PinsI2S> getI2SPins (PinFunction function = PinFunction::CODEC) {
309
- for (PinsI2S &pins : i2s) {
310
- if (pins.function == function) return pins;
311
- }
312
- return {};
332
+ PinsI2S *pins = getPtr<PinsI2S>(function, i2s);
333
+ if (pins == nullptr ) return {};
334
+ return *pins;
313
335
}
314
336
315
337
virtual bool begin () {
@@ -370,6 +392,22 @@ class DriverPins {
370
392
Vector<PinsFunction> pins{0 };
371
393
bool sd_active = true ;
372
394
395
+ template <typename T>
396
+ T *getPtr (PinFunction function, Vector<T> &vect) {
397
+ for (auto &pins : vect) {
398
+ if (pins.function == function) return &pins;
399
+ }
400
+ return nullptr ;
401
+ }
402
+
403
+ template <typename T>
404
+ bool set (T pin, Vector<T> &vect) {
405
+ T *pins = getPtr<T>(pin.function , vect);
406
+ if (pins == nullptr ) return false ;
407
+ *pins = pin;
408
+ return true ;
409
+ }
410
+
373
411
void setupPinMode () {
374
412
// setup pins
375
413
for (auto &tmp : pins) {
0 commit comments