Was ist der richtige Weg, um Bibliotheks-Pin-Zuordnungen konfigurierbar zu machen?

8

Ich arbeite mit einigen Bibliotheken, die APIs für die Interaktion mit bestimmten Hardware-Chips bereitstellen (wodurch diese Treiber hergestellt werden?). Bei verschiedenen benutzerdefinierten Boards oder Shields wird der Chip jedoch unterschiedlichen Pins zugeordnet, sodass die Bibliothek für jeden Fall geändert werden muss. Das Ändern der Bibliothek funktioniert mit dem Arduino IDE Library Manager nicht gut.

Gibt es bevorzugte / empfohlene Muster zum Offenlegen dieser Konfiguration, damit die Bibliothek selbst nicht jedes Mal geändert werden muss?

Hier ist ein Beispiel, in dem dokumentiert ist, welches Teil geändert werden muss, um dem Pin-Layout Ihrer Platine zu entsprechen.

vossad01
quelle
Viele der normalen Arduino-Bibliotheken tun dies bereits - machen Sie sich zunächst mit dieser Methode vertraut, auch aus Anwendersicht.
Chris Stratton

Antworten:

6

Die Methode, die ich verwende, besteht darin, die Pins als Parameter für den Konstruktor bereitzustellen. Diese PIN-Nummern werden in Variablen gespeichert, um sie später in der .begin()Funktion und anderswo zu verwenden.

Die meiste Zeit verwende ich Initialisierungslisten, um die Dinge einfach zu halten. Zum Beispiel:

class Something {
    uint8_t _cs;
    uint8_t _dc;

    Something(uint8_t cs, uint8_t dc) : _cs(cs), _dc(dc) {}
    void begin();
};

void Something::begin() {
    pinMode(_cs, OUTPUT);
    pinMode(_dc, OUTPUT);
}

Something mySomething(10, 8);
Majenko
quelle
6

Ich würde eine der beiden folgenden Möglichkeiten nutzen:

Verwenden Sie (Klassen-) Variablen und legen Sie sie im Konstruktor fest.

Vorteile:

  • Immer initialisiert
  • Einfach zu bedienen (Konstruktor- und Pin-Setup gleichzeitig)

Verwenden Sie eine separate Methode (z. B. Init).

Vorteile:

  • Kann dynamisch geändert werden

Bemerkungen

Für Pin-Einstellungen werden meistens statische Schaltkreise verwendet, daher ist der erste Ansatz wahrscheinlich besser.

Bei den Einstellungen ist meistens die zweite Methode besser.

Wenn viele Pins beteiligt sind (nicht wahrscheinlich), verwenden Sie eine Struktur oder eine separate Pin-Einstellungsklasse.

Makros

Was ich nicht empfehlen würde, sind Makros. Wenn Benutzer den Quellcode selbst ändern müssen und neue Versionen installiert werden, müssen sie die Änderungen entweder zusammenführen oder erneut wiederholen. Die Vorteile sind etwas weniger (Maschinen-) Code, wahrscheinlich etwas schneller und etwas weniger Speicherbedarf, aber alle drei Aspekte sind minimal.

Michel Keijzers
quelle
2

abhängig von Ihrem Ansatz.

1) Wenn Sie nur die Binär- + Header-Dateien bereitstellen, müssen Sie die Pins-Variablen festlegen.

2) Wenn Sie den Quellcode angeben und erwarten, dass der Benutzer den Quellcode neu kompiliert, verwenden Sie Makros.

dannyf
quelle
2

Für den Fall, dass Sie das C ++ - Konstruktor-Zeug vermeiden würden, das bei Arduino häufig ein Overkill ist, können Sie #define's (objektähnliche Makros) verwenden.

Wie so:

#define PIN_ONE 1
#define PIN_TWO 2

Der Präprozessor wird nahtlos durch PIN_ONEdie Nummer 1 und PIN_TWO2 ersetzt, vorausgesetzt, diese Definitionen befinden sich in der Bibliotheksheaderdatei .h. Dies wird im Vergleich zu den anderen möglichen Lösungen höchstwahrscheinlich die geringste Menge an Ressourcen erfordern.

Avamander
quelle
Das Problem ist, dass sie sich an einem Ort befinden müssen, an den sowohl die INO-Datei als auch die Bibliotheksquelle gelangen können. Dies bedeutet normalerweise eine separate Header-Datei mit allem, was benötigt wird.
Ignacio Vazquez-Abrams
Bist du sicher? Ich bin mir ziemlich sicher, dass ich # Define-Schalter in .ino's ausführen kann und sie in Bibliotheken verwendet werden, aber ich könnte mich irren.
Avamander
1
Dies kann funktionieren, wenn sich der Code für die Bibliothek ausschließlich im Header befindet, jedoch nicht, wenn er sich insgesamt in einer anderen Kompilierungseinheit befindet.
Ignacio Vazquez-Abrams
Ja, das macht Sinn, kannte die genauen Einschränkungen nicht und fügte diesen Haftungsausschluss hinzu.
Avamander