Event detect in einer Klasse mittel pigpio

  • Hallo zusammen,


    ich komme leider bei meinem Projekt nicht weiter und bitte euch mir zu helfen. :)


    In dem Projekt habe ich diverse Klassen erstellt um nur die Funktionen von den Standard-Libs zu nutzen, welche ich auch tatsächlich benötige und um es einfacher bzw. übersichtlicher zu gestalten.


    Ich habe nun Probleme bei der Erstellung meiner GPIO Klasse genauer bei der GPIO_Input Klasse. Hier mein Code:


    Mein Problem:

    Ich starte nun mein Programm, welches diverse Loops ausführt. Während einer Loop kann dann ein Taster gedrückt werden, der mit der Klasse GPIO_Input initialisiert wurde. Jetzt habe ich das Problem, dass ich nicht mitbekomme, wenn der Taster gedrückt wurde.

    Ich habe eigentlich gedacht und gehofft, dass wenn der Taster gedrückt wurde intern die Flanke detektiert wird und das ins Register geschrieben wird. Ich lese dann das Register aus und erhalte ein "TRUE" als Return-Wert. Das klappt aber nicht :helpnew:


    Ich habe das auch schon mit diesen callback Funktionen gesehen, allerdings weiß ich nicht, wie ich das in diese Klasse implementieren kann.


    Könnt Ihr mir hier bitte weiterhelfen? :)


    Vielen lieben Dank!

    LG

    Bastian

  • Hi,


    vielen Dank für deine Reaktion. :)

    Klar, ich stelle hier mal meine rudimentäre Test Datei rein:


    Und hier noch die Klasse von dem PushButton:


    Im Prinzip soll ein TRUE als Status zurückgegeben werden, wenn seit der letzten Abfrage der Taster gedrückt wurde.


    Ich hoffe es hilft weiter :)


    LG

    Bastian

  • Bastian7032 Die doppelten führenden Unterstriche bedeuten *nicht* ``private`` aus anderen Sprachen. Lass das bleiben. *Ein* führender Unterstrich bedeutet in Python, dass es sich um ein Implementierungsdetail handelt, das man von aussen nicht benutzen sollte.


    Dann werden Namen klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (PascalCase).


    Triviale Getter und Setter schreibt man in Python nicht und nur geringfügig nicht-triviale auch nicht, dafür sind Properties da.


    Dann vergiss mal ``as`` beim Importieren. Das ist zum Umbenennen. Wenn Du nix umbenennst, dann macht das keinen Sinn. Und falls Du doch etwas umbenennst, dann sollte da auch einen Grund haben den man nachvollziehen kann. Warum ein Modul `Peri_PushButton` beim Importieren in `Hw_PushButton` umbenannt werden muss, vor allem wenn auch der ursprüngliche Modulname von Dir vergeben wurde, erschliesst sich mir nicht. Was sollen die komischen Abkürzungspräfixe? Steht `Peri` für `Periphery`? Also noch mal redundant den Packagenamen in den Modulnamen gepackt? Das sollte das einfach ganz weg — weil redundant.


    Insgesamt würde ich an Deiner Stelle aufhören `gpiozero` noch mal in schlechter neu zu erfinden. Das gibt's doch alles schon.

    “If debugging is the process of removing software bugs, then programming must be the process of putting them in.” — Edsger Dijkstra

  • Hallo,


    danke für deine Anmerkungen hinsichtlich der Codierungsrichtlinien. Die werde ich später einarbeiten bzw. umsetzen.


    Oh. das mit dem Hw_PushButton und den Peri_PushButton war ein Fehler von mir. Das ergibt so natürlich keinen Sinn.


    Ich will das nicht neu erfinden, sondern einfach für meine Anwendung zuschneiden. Was allerdings auch nur nebensächlich ist. Mir geht`s eigentlich nur darum, dass ich verstehen will, wie man in einer Klasse ein EventTrigger von einem Taster abbildet und das mit Hilfe von pigpio. :) Vielleicht kannst du mir ja trotzdem weiterhelfen?


    LG

    Bastian

  • Bastian7032 Naja Du müsstest halt einen Rückruf registrieren der sowohl bei steigender als auch bei fallender Flanke den Status aktualisiert, denn sonst gehen diese Statusänderungen während Du nicht abfragst, also insbesondere während `sleep()`-Aufrufen verloren.

    “If debugging is the process of removing software bugs, then programming must be the process of putting them in.” — Edsger Dijkstra

  • Genau hier benötige ich Hilfe, da ich nicht weiß wie genau man das hier umsetzen kann. :) Könntest du mir hier einen Tipp geben?


    Ich dachte eigentlich, dass so eine Flanke eventuell in ein Register geschrieben wird, dass man ausliest und nach dem Auslesen wieder storniert. Aber keine Ahnung, ob und wie sowas funktioniert. :)


    LG

    Bastian

  • Danke, allerdings bin ich auf die Doku schon gestoßen und komme damit nicht weiter.


    Die Methoden verstehe ich schon, allerdings weiß ich nicht wie man das in einer Klasse abbildet.


    LG

    Bastian

  • Bastian7032: Noch mal allgemeines: Der Typname, oder ein Teil davon sollte nicht noch mal in allen Methodennamen auftauchen. Auch das ist redundant.


    Beim `GPIOInput` macht es nicht wirklich Sinn sich den Status zu merken wenn man den doch sowieso immer lesen muss um den aktuellen zu bekommen.


    Das gleiche gilt für den `PushButton`. Da dessen ID nirgends verwendet wird, würde ich mir diese Klasse auch komplett sparen. Wozu braucht das Ding eine numerische ID?


    Der Code im ``if __name__ …``-Zweig sollte in einer Funktion stehen und `Counter` ist keine Konstante, gehört also auch nicht auf Modulebene.


    Zudem sollte so eine einfache Zählschleife keine ``while``-Schleife sein wo Initialisierung und test und hochzählen manuell geschrieben und über den Code verteilt ist.


    Da `Counter` dann nirgends wirklich verwendet wird, ist der übliche Name dafür einfach `_`, damit der Leser a) weiss, dass der Wert nicht verwendet wird und b) dass das Absicht ist.


    Der `pi()`-Aufruf gehört nicht in die `GPIO…`-Klassen. Du erstellst dadurch für jeden Pin eine neue, eigene Verbindung zum Daemon, wo eine ausreichen würde. Potentiell sind das ja TCP-Verbindungen zu einem anderen Rechner. Und wenn man das sauber machen will, würde man auch die `stop()`-Methode zum abbauen der Verbindung aufrufen, was im Moment auch nicht geht.


    Grundsätzlich würde der Code in Python dann also erst einmal so aussehen:

    Wenn das zu nervig ist jedem `GPIO…:`-Objekt beim Erstellen das `pi`-Objekt mitzugeben, würde man sich so etwas wie eine `GPIOFactory` basteln. Womit wir dann schon wieder beim Thema `gpiozero` wären, denn dort wird das so gemacht. Du erfindest etwas neu was es gut getestet bereits gibt.

    “If debugging is the process of removing software bugs, then programming must be the process of putting them in.” — Edsger Dijkstra

  • auch wenn er nicht den Ansprüchen von __blackjack__ gerecht wird?

    Ja, sonst wird es ihm och langweilig ^^


    Spass bei Seite, es geht nicht um Ansprüche von ihm oder anderen User. Es gibt gewisse Konventionen an die sich jeder halten sollte. Diese finest du hier.

    Ein Tipp: Nutze die sehr ausfühlichen Antworten von bspw. __blackjack__ dabei lernt man eine Menge und mit der Zeit wird der eigene Code immer einfacher und smarter. :thumbup:


    Grüße

    Dennis

    ... ob's hinterm Horizont wirklich so weit runter geht oder ob die Welt vielleicht doch gar keine Scheibe ist?