2016-05-03 10 views
1

Ich möchte einige Werte von meinem Arduino in kivy auf Raspberry "ziehen", die über eine drahtlose NRF24-Modul verbunden ist. Ich verwende this Bibliothek mit python wrapperKivy Python - Callback-Funktion mit partiellen

In reinem Python funktioniert der Code gut und jetzt möchte ich es in Kivy integrieren.

für das gemacht I zwei Funktionen innerhalb zimmerwetter.py:

eine für das Funkgerät der Einrichtung und gibt den Funk Objekt (sollte ausgeführt werden, wenn die Anwendung gestartet wird):

def radiosetup(): 
    radio = RF24(RPI_BPLUS_GPIO_J8_22, RPI_BPLUS_GPIO_J8_24, BCM2835_SPI_SPEED_8MHZ) 

    # doing setup stuff... 

    return radio 

und eine andere Funktion, die Senden Sie eine Anfrage an den Arduino, die ein Datum für die Umgebung liefert (Temperatur, Luftfeuchtigkeit usw.).

def getenviroment(self,radio): 

    millis = lambda: int(round(time.time() * 1000)) 
    # send command 
    send_payload = 'getdata' 
    # First, stop listening so we can talk. 

    radio.stopListening() 

    # Take the time, and send it. This will block until complete 
    print 'Now sending length ', len(send_payload), ' ... ', 
    radio.write(send_payload[:len(send_payload)]) 

    a = datetime.datetime.now() 

    # Now, continue listening 
    radio.startListening() 

    # Wait here until we get a response, or timeout 
    started_waiting_at = millis() 
    timeout = False 
    while (not radio.available()) and (not timeout): 
     if (millis() - started_waiting_at) > 1000: 
      timeout = True 

    # Describe the results 
    if timeout: 
     b = datetime.datetime.now() 
     #  print(b - a) 
     print 'failed, response timed out.' 
    else: 
     # Grab the response, compare, and send to debugging spew 
     length = radio.getDynamicPayloadSize() 
     receive_payload = [] 
     receive_payload = radio.read(length) 

     print 'got response size=', length 
     print struct.unpack("bbbbhbbbb", ''.join(chr(c) for c in receive_payload)) 
     b = datetime.datetime.now() 
     print(b - a) 
     return receive_payload 

Die getenviroment Funktion sollte the kivy clock module

from zimmerwetter import * 

class PyowmApp(App): 
    def build(self): 
     radio = radiosetup() 
     Clock.schedule_interval(partial(getenviroment,radio), 10) 

Der Fehler ist in wie vorgeschlagen genannt werden später alle x Sekunden vom Kivy App, die Teilfunktion verwendet:

File "/home/pi/pyscripts/pyowm/zimmerwetter.py", line 83, in getenviroment 
    radio.stopListening() 
AttributeError: 'float' object has no attribute 'stopListening' 

I Ich frage mich, warum ein Float-Objekt zurückgegeben wird, wenn ich das Radio-Objekt mit Hilfe (Radio) drucke, gibt es class RF24(Boost.Python.instance) und die Funktion stoplistening() exis zurück ts.

Antwort

2

Die von Clock.schedule_interval aufgerufene Funktion erhält dt als Argument nach den durch partial übergebenen. Die Signatur für Ihre Funktion lautet getenviroment(self,radio), daher wird radioself zugewiesen und dt wird radio zugewiesen.

Verwenden Sie stattdessen lambda:

Clock.schedule_once(lambda dt: self.getenviroment(radio), 10) 
+0

die Anweisung in 'Clock.schedule_once (Lambda dt: getenviroment (radio), 10)' zu ändern und das self-Argument von der functon zu entfernen, funktioniert auch (die Funktion ist nicht im Rahmen der App) – Triscus

+0

@Triscus die Frage gibt nicht an, wo 'getenviroment' definiert ist, also nahm ich' PyownApp' an. Ersetzen Sie "self" durch die korrekte Instanz der Klasse mit 'getenvironment'. Oder erwägen Sie, den Parameter 'self' zu ändern. – zeeMonkeez

+0

Die Funktionen wurden nicht innerhalb einer Klasse definiert, nur mit einer 'def'-Anweisung. Ich denke, ich sollte mich an OOP gewöhnen, danke für Ihre Inspiration – Triscus

0

Ich habe es von mir herausgefunden, um den Zeitplan zu ändern Anweisung

Clock.schedule_interval(partial(getenviroment,radio=radio), 10) 

den Trick.

+0

Dies funktioniert, aber es ist nicht ganz klar: Was hier passiert, ist, dass durch 'partial' die Positions Argument übergeben von' schedule_interval' ('dt') an die zugewiesen wird erstes Argument in 'getenvironment' (' self'). 'self' wird später nicht verwendet, also gibt es kein Problem. Dann wird 'radio' mit dem erwarteten Wert zugewiesen. Wenn "Selbst" tatsächlich eine Bedeutung hätte, würde dieser Ansatz nicht funktionieren und unerwartete Ergebnisse/Fehler erzeugen. Nur gedacht, ich weise darauf hin ... – zeeMonkeez