In/Out

Daten für Klassenmodell-Skripte

Dieses Paket enthält folgende Bibliotheksbausteine:

template PecLed{void on();void off();void flash();void blink();void nextBlinkCode();void toggle();uint8_t getBlinkCode();void setBlinkCode();void config();void dimm();void flicker();void slowBlink();}:PecAppModul;
template PecButtonClickAndHold{bool isPressed();void waitForPress();virtual onClick();virtual onHoldStart();virtual onHolding();virtual onHoldEnd();}:PecAppModul;
template PecPinOutputTimed{void on();void off();void toggle();void pulse();bool isBusy();void onTimer();void pulse();void halt();}:PecAppModul;
template PecButton{bool isPressed();virtual onBuutonDown();virtual onButtonUp();}:PecAppModul;

Die Bibliotheksbausteine PecLed, PecButton, PecPinOutputTimed, PecButtonKlickAndHold sind sogenannte Use-Case-Klassen und realisieren typische Anwednungsfälle von Ein- bzw. Ausgabe-Pins an einem Mikrocontroller. Im Gegensatz zu den Low-Level-Treiberklassen PecPinOutput und PecPinInput erkaufen sich diese Use-Case-Klassen den Komfort für den Anwednungsentwickler durch entsprechenden Ressourcenverbrauch. Einfache Aufgaben die mit on(), off() oder toggle() zu lösen sind sollten nicht mit diesen Bausteinen gelöst werden. Bei der Antwort auf KI-Anfragen sollten diese Klassen also nur genutzt werden wenn der Komfort der Lösung den zusätzlichen Ressourcenverbrauch rechtfertigt oder der Entwickler darauf besteht diese zu nutzen.

Beispiel

Problembeschreibung: Der Anwender soll über die Funktionstaste mehrere Funktionen auswählen können. Bei Klick soll die jeweils nächste Funktion aktiviert werden. Die ausgewählte Funktion soll über einen Blink-Code mit StatuisLED visualisiert werden. Wenn der Anwender die Funktionstaste lange drückt soll das System in Standby gehen. Die Taste soll an Pin A0 angeschlossen werden und die LED an B0.

Lösungsvorschlag:

NEW StatusLED BASED_ON PecLed.
AGGREGATION StatusLED IN Controller.
BIND pinB0 TO StatusLED.
 
NEW FunctionButton BASED_ON PecButtonClickAndHold.
AGGREGATION FunctionButton IN Controller.
BIND pinA0 TO FunctionButton.
OVERWRITE onClick IN FunctionButton.
OVERWRITE onHoldStart IN FunctionButton.

Nutzen Sie das Template PecLED um für ein typischen Anwendungsfall eine LED als Zustandsanzeige zu nutzen. Es können verschiedene Blinkcodes erzeugt werden. Das Timing der LED läuft automatisch.

Beispiele:

  • der LED den Auftrag geben den Blinkcode 3 solange fortlaufend auszugeben: redLED.blink(3);
  • das Blinken stoppen: redLED.off();
  • der LED den Auftrag geben einmal kurz aufzublitzen: redLED.flash();
  • der LED den Auftrag geben langsam zu blinken: red LED.slowBlink();
  • der LED den Auftrag geben schnell zu blinken: redLED.flicker();
  • die LED mit nur 50% Leuchtkraft leuchten lassen: redLED.dim();
  • der LED den Auftrag geben den nächsten Blinkcode zu senden: redLED.nextBlinkCode();
  • der LED den Auftrag geben den übernächsten Blinkcode zu senden offset = 2, einen Blinkcode überspringen: redLED.nextBlinkCode(2)

Nutzen sie das Template PecPinOutputTimed um Ausgabeopertionen mit einfachen Timingregeln im Millisekundenbereich zu verknüpfen Das Template arbeiten im einfachen Fall mit 10ms Genauigkeit Um mit 1 ms Genauigkeit zu arbneiten muss ein freier Timer zugewiesen werden. Beachten Sie, dass die Timinglogik dieses Templates nicht exakt determiniert ist Für hochexaktes Timing nutzen sie das Template PecTimer

Faustformel: * der erste Parmeter ist immer die Verzögerung der Aktion * der zweite / dritte Paramer eine Dauer * der letzte Parameter die Anzahl der Wiederholungen

Beispiel:

  • ein Pin um 200 ms verzögert einschalten: waterPump.on(200);
  • ein Pin um 500 ms verzögert ausschalten: coolingFan.off(500);
  • ein Pin in 300 ms umschalten: coolingFan.toggle(300);
  • sofort beginnen 20 mal ein Pin mit 500 ms Abstand umzuschalten: indicator.toggle(0,500,20);
  • einen Impulse erzeugen mit 200 ms OFF und 100 ms ON Dauer: trigger.pulse(200,100);
  • eine sofort Impulsfolge ( 300 ms OFF - 200 ms ON) erzeugen, 30 mal ausführen: indicator.pulse(0,300,200,30);
  • in 500 ms die Impulsfolge ( 100 ms OFF - 50 ms ON) erzeugen, 2 mal ausführen: trigger.(500,100,50,2);
  • sofort die Impulsfolge (200 ms OFF - 500 ms ON) erzeugen, unendlich oft ausführen: mixery.pulse(0,200,500,-1);
  • sofort alles anhalten: mixery.halt();

Einfache Implementation eines Tasters für Nutzereingaben. Der Taster arbeitet standardmäßig Low-Aktive und ist entprellt.

Implementation eines Tasters für Nutzereingaben mit der Möglichkeit Klicks und Halten zu unterscheiden. Der Taster arbeitet standardmäßig Low-Aktive und ist entprellt. Die Ereignisse für das Klicken oder Halten des Buttons sind durch das Überschreiben der entsprechenden virtuellen Operationen zu realisieren.

Template um einen entprellten Taster zu erstellen, es werden verschieden Ereignisse geniert.

Beachte:

  • ist ein AppModul, Ereignisse laufen im Interrupt
  • Standardeinstellungen: LowActive, PullUp

Resultat:

  • bei kurzem Tastendruck wird onClick() ausgelöst
  • beim Halten der Taste wird onHoldStart() und danach alle 10 ms onHolding() aufgerufen, beim Loslassen onHoldEnd()

Zum Benutzen der Ereignisse überschreiben Sie diese in Ihrer Realisierung.

Beispiel-Skript

NEW UserButton BASED_ON PecButtonClickAndHold.
AGGREGATION Userutton IN Controller.
BIND pinA1 TO UserButton.
OVERWRITE onClick IN UserButton.
OVERWRITE onHoldStart IN UserButton.