GPIO Interrupt löst nicht aus

  • Moin :D ,
    jetzt bin ich mal wieder etwas ratlos.


    Ich definiere ja Userevents:


    Code
    GPIO_24_UP_event = pygame.event.Event(24, PIN_UP)
    GPIO_24_DOWN_event = pygame.event.Event(24, PIN_DOWN)
    GPIO_25_UP_event = pygame.event.Event(25, PIN_UP)
    GPIO_25_DOWN_event = pygame.event.Event(25, PIN_DOWN)


    (hier mal die Ausgabe von print event : <Event(25-UserEvent {'State': 'Down'})> )


    Laut Doku ist der Typ des Events also 24 und 25 oder 24-UserEvent und 25-UserEvent?



    Jetzt wollte ich mit (Klick mich) pygame.event.EventType mir den Typ holen, weiß das aber nicht recht anzuwenden.... (syntax error)


    Code
    print event.EventType.24-UserEvent



    jemand eine Idee?


    :danke_ATDE:

    Wenn's qualmt und stinkt hast du was falsch gemacht :D

  • Nachdem ich da noch mal naeher drauf geschaut habe, ist da noch viel mehr Murks drin. Warum hast du nicht mal das befolgt, was in dem von mir verlinkten Stackoverflow Artikel gemacht wird? Deine Event-IDs sind *nicht* aus dem Wertebereich von USEREVENT und groesser. Das faellt dir auf die Fuesse, das ist nicht einfach so gemacht. Und ebenso steht da drin, wie man auf den Typ zugreift. Mit "event.type". Und mit "event.message" auf die individuelle Nachricht.


  • Nachdem ich da noch mal naeher drauf geschaut habe, ist da noch viel mehr Murks drin. Warum hast du nicht mal das befolgt, was in dem von mir verlinkten Stackoverflow Artikel gemacht wird? Deine Event-IDs sind *nicht* aus dem Wertebereich von USEREVENT und groesser. Das faellt dir auf die Fuesse, das ist nicht einfach so gemacht. Und ebenso steht da drin, wie man auf den Typ zugreift. Mit "event.type". Und mit "event.message" auf die individuelle Nachricht.


    Sorry dein Post war mir entgangen - wir haben wohl zur selben Zeit geschrieben.


    Schaue es mir gleich mal an :danke_ATDE:
    Automatisch zusammengefügt:[hr]



    Ich kümmere mich drum =)


    Die nutzlosen Kommentare sind ... Politik ... Diplomatie trifft es ganz gut - ich lasse die hier zukünftig raus muss sie am Ende aber wieder einarbeiten ... (ist nicht auf meinen Mist gewachsen)


    :D
    Automatisch zusammengefügt:[hr]

    Quote


    Und das waere in deinem Fall am einfachsten zu reparieren durch ein

    Code
    bttn1.when_pressed = lambda: pygame.event.post(GPIO_24_DOWN_event) #event wenn button 1 gedrueckt


    Das zweitwichtigste: dieser Registrierung erfolgt *einmal*, vor der Ereihnisschleife! Nicht permanent wieder. Dein Code aendert sich doch auch nicht permanent, oder? Das ist im uebrigen IMHO auch die Erklaerung, warum da was "prellt". Du feuerst einfach permanent Ereignisse.


    Ach das ist nur eine Registrierung! Jetzt dämmert mir etwas ...


    Öhm :-/ was ist Lambda? #16:50 WIe Geil ist das denn bitte? Inlinefunktionen!



    Hier der Neue Code
    SCHWARZE MAGIE! :D
    sau gut funktioniert reibungslos und zuverlässig - Wünsche? Anmerkungen? Vorschläge?


    :danke_ATDE:

    Wenn's qualmt und stinkt hast du was falsch gemacht :D

    Edited once, last by Adiamus ().

  • Du musst den Typ auch schon mit dem Typ vergleichen. Nicht mit dem Event.


  • Du musst den Typ auch schon mit dem Typ vergleichen. Nicht mit dem Event.


    Frohes Neues :D


    CodePad ist leider grade offline.


    Habe das geändert, erhalte aber jetzt sobald ich event.message im Code lasse, folgende Fehlermeldung nach dem betätigen:


    Könnte das etwas mit dem nicht wirklich vorhandenen Display zu tun haben?
    (es läuft kein xserver und ich habe auch kein Display/Fenster/etc ...)





    [code=php]
    und los gehts!
    event's
    Traceback (most recent call last):
    File "buttontest_neu.py", line 45, in <module>
    print event.message
    AttributeError: event member not defined
    Traceback (most recent call last):
    File "/usr/lib/python2.7/dist-packages/gpiozero/pins/rpigpio.py", line 232, in <lambda>
    callback=lambda channel: self._when_changed(),
    File "/usr/lib/python2.7/dist-packages/gpiozero/mixins.py", line 311, in _fire_events
    self._fire_activated()
    File "/usr/lib/python2.7/dist-packages/gpiozero/mixins.py", line 343, in _fire_activated
    super(HoldMixin, self)._fire_activated()
    File "/usr/lib/python2.7/dist-packages/gpiozero/mixins.py", line 289, in _fire_activated
    self.when_activated()
    File "buttontest_neu.py", line 29, in <lambda>
    back.when_pressed = lambda: pygame.event.post(GPIO_BACK_DOWN_event)
    pygame.error: video system not initialized
    [/php]


    :danke_ATDE:

    Wenn's qualmt und stinkt hast du was falsch gemacht :D

  • Naja, er sagt dir ja recht klar, was ihm fehlt. Also - mach doch mal ein Fenster auf :rolleyes:

  • Werde das Morgen mal testen ...
    Ich muss das erst vorbereiten. :)


    Kann ich das Später umgehen?
    ich will eigentlich weder den xserver starten noch ein Fenster haben... :denker:


    :danke_ATDE:

    Wenn's qualmt und stinkt hast du was falsch gemacht :D

  • noe, kannst du nicht. Ich vermute aber das du das falsch verstehst. Du musst halt das display benutzen, so wie vorher auch. Mit X oder Fenstern hat das nix zu tun. Oder hast du gar keine graphische Ausgabe? Dann brauchst du ja auch kein pygame....

  • :D
    oha jetzt wirds lustig...



    Eigentlich wollte ich den Pi im Text-Modus laufen lassen da kein Display angeschlossen ist/wird.
    Das mit den events finde ich aber gar nicht mehr soooo schlimm/uninteressant.
    Pygame brauchte ich um möglichst schnell und unkompliziert Sounds auszugeben - was an sich ja gut lief...
    Nur das die "Interrupts" (die ja keine sind) nicht mehr funktioniert haben nachdem ich alle Sounds eingearbeitet hatte...
    oh und die Kontrolle der Last und der Geschwindigkeit über die pygame clock fand ich auch nicht schlecht...


    Die Schwierigkeit besteht darin das ich diese zwei GPIO Taster mit mehreren Funktionen innerhalb des Programms ausstatten muss.


    also je nachdem ob der Spieler gerade im Menü ist oder im Spiel. ist der Knopf in die eine Richtung mit OK und in die andere mit ZURÜCK belegt oder mit FEUER und MENÜ.


    weg vom Spieler / zum Spieler
    MENÜ / FEUER #im Spiel
    ZURÜCK / OK #im Menü


    wenn du eine bessere Alternative zu Pygame für mich hast immer her damit -> kann gerade keinen code posten aber der Fehler besteht auch mit einem echten Fenster...



    :danke_ATDE:

    Wenn's qualmt und stinkt hast du was falsch gemacht :D

  • Hast du eine grafische Ausgabe? Es koennte theoretisch sein, dass die SDL zwar multi-threading fest ist, pygame aber nicht. Das muesste ich mal selbst ausprobieren, kann etwas dauern.

  • Jain :D


    also in meinem Fenster ist nichts drin.
    Aber ich habe ja auch nichts rein geschrieben.
    Wenn ich die Maus über das schwarze Fenster bewege laufen auf der Konsole etliche Maus Ereignisse etc... (das ist ja normal)




    Oh und mir ist noch aufgefallen, jetzt wo ich per Chinch an einem Fernseher hänge:
    Starte ich das Skript direkt am Pi macht er ein Fenster auf.
    Starte ich das Skript per ssh geht der Pi in den Vollbildmodus.


    und wenn kein xserver läuft macht er ihn einfach auf :rolleyes:



    :danke_ATDE:

    Wenn's qualmt und stinkt hast du was falsch gemacht :D

  • Etwas Chaos in deinem Script. pygame und gpio sachen miteinander vermischt...
    Das "pygame.display.update()" mitten drin kannst du dir zB sparen da direkt am Anfang der while das bereits steht. Es ist aber auch denkbar ungünstig den kompletten screen neu zu zeichnen wenn sich da aber gar nichts an der Darstellung verändert, bedeutet: Du kannst dir pygame.display.update() komplett schenken das bremst nur unnötig aus. Du hast gar keine "quit()" Funktion also ist dessen Aufruf witzlos. Und zu guter letzt macht es nicht viel Sinn in der "for event" Schleife jedes mal "if" zu nutzen, da bei einem Durchlauf eh nur eins davon zutreffen kann, also nutzt man in nachfolgenden Abfragen "elif" um den Prozess zu beschleunigen.


    Meiner Meinung nach würde folgendes reichen:
    [code=php]
    from gpiozero import Button
    import pygame
    import time
    import os



    #os.environ["SDL_VIDEODRIVER"] = "dummy"
    pygame.init()
    screen = pygame.display.set_mode((400,400))
    clock = pygame.time.Clock()



    ok = Button(24) #(ok/feuer)
    back = Button(25) #(zurueck/menue)


    OK_EVENT = pygame.USEREVENT+1
    BACK_EVENT = pygame.USEREVENT+2


    PIN_DOWN = {'State':'Down'}
    PIN_UP = {'State':'UP'}


    GPIO_OK_UP_event = pygame.event.Event(OK_EVENT, PIN_UP)
    GPIO_OK_DOWN_event = pygame.event.Event(OK_EVENT, PIN_DOWN)
    GPIO_BACK_UP_event = pygame.event.Event(BACK_EVENT, PIN_UP)
    GPIO_BACK_DOWN_event = pygame.event.Event(BACK_EVENT, PIN_DOWN)


    ok.when_pressed = lambda: pygame.event.post(GPIO_OK_DOWN_event)
    ok.when_released = lambda: pygame.event.post(GPIO_OK_UP_event)


    back.when_pressed = lambda: pygame.event.post(GPIO_BACK_DOWN_event)
    back.when_released = lambda: pygame.event.post(GPIO_BACK_UP_event)



    print 'und los gehts!'


    mainloop = True
    while mainloop:
    milliseconds = clock.tick(10) # milliseconds passed since last frame
    #pygame.event.pump()


    for event in pygame.event.get():
    print "event's"
    if event.type == pygame.QUIT:
    pygame.quit()
    mainloop = False
    elif event.type == OK_EVENT:
    print event.message
    print 'Feuer!'
    elif event.type == BACK_EVENT:
    print event.message
    print 'Menue'



    #EOF
    [/php]


    Wenn du gar kein Fenster angezeigt haben möchtest würde sich das Python Module pyvirtualdisplay anbieten.




    PS: Mittlerweile ist das hier aber eigentlich offtopic, die Überschrift lautet nämlich immer noch: GPIO Interrupt löst nicht aus

  • Kann ich die Überschrift ändern? :D


    Ich kam leider noch nicht dazu deinen Code zu testen ... aber deine Anmerkungen ergeben Sinn :rolleyes:


    Werde mir das virtualdisplay Modul mal ansehen ...


    :danke_ATDE:


    Eins noch: warum hast du pygame.event.pump() auskommentiert?
    Automatisch zusammengefügt:[hr]
    Ich habe noch nicht verstanden wie ich meine Anwendung dazu bekomme das andere Display zu nutzen (das virtuelle).
    Aber ich werde das gefühl nicht los das etwas hiermit zu tun hat. :s

    Wenn's qualmt und stinkt hast du was falsch gemacht :D

    Edited once, last by Adiamus ().

  • die Description auf dieser Seite erklärt zumindest warum diese Zeile nicht funktioniert hat ...

    Wenn's qualmt und stinkt hast du was falsch gemacht :D

  • Moin :D ,
    um diverse Fehler durch alte Bibliotheken, falsche configs und alten Müll zu eliminieren, habe ich eine frische SD Karte aufgesetzt und meinen letzten Codeschnipsel und Meigrafs letzten Codeschnipsel getestet.
    Das Ergebniss:


    pygame event's scheinen generell zu funktionieren unr die userevents nicht:


    [code=php]pi@Mark2:~/python/rebuild $ sudo python gpio140117meigraf.py
    und los gehts!
    event's
    event's
    event's
    event's
    event's
    event's
    event's
    Traceback (most recent call last):
    File "gpio140117meigraf.py", line 50, in <module>
    print event.message
    AttributeError: 'Event' object has no attribute 'message'
    Traceback (most recent call last):
    File "/usr/lib/python2.7/dist-packages/gpiozero/pins/rpigpio.py", line 232, in <lambda>
    callback=lambda channel: self._when_changed(),
    File "/usr/lib/python2.7/dist-packages/gpiozero/mixins.py", line 315, in _fire _events
    self._fire_deactivated()
    File "/usr/lib/python2.7/dist-packages/gpiozero/mixins.py", line 348, in _fire _deactivated
    super(HoldMixin, self)._fire_deactivated()
    File "/usr/lib/python2.7/dist-packages/gpiozero/mixins.py", line 294, in _fire _deactivated
    self.when_deactivated()
    File "gpio140117meigraf.py", line 31, in <lambda>
    back.when_released = lambda: pygame.event.post(GPIO_BACK_UP_event)
    pygame.error: video system not initialized
    Traceback (most recent call last):
    File "/usr/lib/python2.7/dist-packages/gpiozero/pins/rpigpio.py", line 232, in <lambda>
    callback=lambda channel: self._when_changed(),
    File "/usr/lib/python2.7/dist-packages/gpiozero/mixins.py", line 315, in _fire _events
    self._fire_deactivated()
    File "/usr/lib/python2.7/dist-packages/gpiozero/mixins.py", line 348, in _fire _deactivated
    super(HoldMixin, self)._fire_deactivated()
    File "/usr/lib/python2.7/dist-packages/gpiozero/mixins.py", line 294, in _fire _deactivated
    self.when_deactivated()
    File "gpio140117meigraf.py", line 28, in <lambda>
    ok.when_released = lambda: pygame.event.post(GPIO_OK_UP_event)
    pygame.error: video system not initialized
    [/php]


    ich teste jetzt mal statt USEREVENTS einfach Tastaturevents zu posten.


    mal sehen ob dass was wird ... :s
    Automatisch zusammengefügt:[hr]
    Moin :D ,
    um diverse Fehler durch alte Bibliotheken, falsche configs und alten Müll zu eliminieren, habe ich eine frische SD Karte aufgesetzt und meinen letzten Codeschnipsel und Meigrafs letzten Codeschnipsel getestet.
    Das Ergebniss:


    pygame event's scheinen generell zu funktionieren unr die userevents nicht:


    [code=php]pi@Mark2:~/python/rebuild $ sudo python gpio140117meigraf.py
    und los gehts!
    event's
    event's
    event's
    event's
    event's
    event's
    event's
    Traceback (most recent call last):
    File "gpio140117meigraf.py", line 50, in <module>
    print event.message
    AttributeError: 'Event' object has no attribute 'message'
    Traceback (most recent call last):
    File "/usr/lib/python2.7/dist-packages/gpiozero/pins/rpigpio.py", line 232, in <lambda>
    callback=lambda channel: self._when_changed(),
    File "/usr/lib/python2.7/dist-packages/gpiozero/mixins.py", line 315, in _fire _events
    self._fire_deactivated()
    File "/usr/lib/python2.7/dist-packages/gpiozero/mixins.py", line 348, in _fire _deactivated
    super(HoldMixin, self)._fire_deactivated()
    File "/usr/lib/python2.7/dist-packages/gpiozero/mixins.py", line 294, in _fire _deactivated
    self.when_deactivated()
    File "gpio140117meigraf.py", line 31, in <lambda>
    back.when_released = lambda: pygame.event.post(GPIO_BACK_UP_event)
    pygame.error: video system not initialized
    Traceback (most recent call last):
    File "/usr/lib/python2.7/dist-packages/gpiozero/pins/rpigpio.py", line 232, in <lambda>
    callback=lambda channel: self._when_changed(),
    File "/usr/lib/python2.7/dist-packages/gpiozero/mixins.py", line 315, in _fire _events
    self._fire_deactivated()
    File "/usr/lib/python2.7/dist-packages/gpiozero/mixins.py", line 348, in _fire _deactivated
    super(HoldMixin, self)._fire_deactivated()
    File "/usr/lib/python2.7/dist-packages/gpiozero/mixins.py", line 294, in _fire _deactivated
    self.when_deactivated()
    File "gpio140117meigraf.py", line 28, in <lambda>
    ok.when_released = lambda: pygame.event.post(GPIO_OK_UP_event)
    pygame.error: video system not initialized
    [/php]


    ich teste jetzt mal statt USEREVENTS einfach Tastaturevents zu posten.


    mal sehen ob dass was wird ... :s

    Wenn's qualmt und stinkt hast du was falsch gemacht :D

    Edited once, last by Adiamus ().

  • So, ich hab' das jetzt mal selbst ausprobiert. Kannst meiner Stirnhoehlenentzuendung danken, wegen der ich im Bett liege & nix besseres zu tun habe :D


    Das ist ein Bug in pygame. Den man eigentlich melden sollte, vielleicht mache ich das, aber die sind irgendwie gerade im Umbruch. Wie dem auch sei, die sind nicht auf multi-threading vorbereitet. Darum gibt es die Fehlermeldung. Aber ich habe einen Weg gefunden, daran vorbei zu kommen.



    Ein Hinweis: dein Code haette einen anderen Fehler geworfen, weil du auf "message" zugreifst. Gibt's nicht. Das Event-Objekt hat einfach die Attribute des Dictionaries, welches da uebergeben wird. Siehe meinen Code.


  • Danke für deinen Einsatz trotz Krankheit. Zu dieser Lösung wäre ich nie gekommen. Gute Besserung :danke_ATDE: :thumbs1:

    Wenn's qualmt und stinkt hast du was falsch gemacht :D