2016-05-03 6 views
1

Я хочу «вытащить» некоторые значения из моего Arduino в kivy на Raspberry, который подключен через беспроводной модуль NRF24. Я использую библиотеку this с python wrapperKivy Python - Функция обратного вызова с частичным

В чистом Python код работает хорошо, и теперь я хочу интегрировать его в Kivy.

Для этого я сделал две функции внутри zimmerwetter.py:

One для настройки устройства радиосвязи и возвращает объект радио (должен быть запущен, как только начинается приложение):

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

    # doing setup stuff... 

    return radio 

и другую функцию, которая отправьте запрос в Arduino, который поставляет некоторую дату окружающей среды (температура, влажность и т. д.).

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 

Функция getenviroment должна вызываться позже каждые х секунд из приложения kivy, частичная функция используется как предложено в the kivy clock module

from zimmerwetter import * 

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

Ошибка является:

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

Я интересно, почему возвращается объект float, когда я печатаю радиообъект с помощью (радио), он возвращает class RF24(Boost.Python.instance) и функцию stoplistening() exis ц.

ответ

2

Функция, вызванная Clock.schedule_interval, получит dt в качестве аргумента после тех, которые прошли через partial. Подпись для вашей функции: getenviroment(self,radio), поэтому radio будет присвоено значение self, а dt будет присвоено значение radio.

Вместо этого используйте lambda:

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

изменение инструкции на 'Clock.schedule_once (lambda dt: getenviroment (radio), 10)' и удаление аргумента self из функционала тоже работает (функция не объявлена ​​в области действия App) – Triscus

+0

@Triscus в вопросе не указано, где определяется 'getenviroment', поэтому я принял' PyownApp'. Замените 'self' на правильный экземпляр класса с' getenvironment'. Или подумайте об изменении параметра 'self'. – zeeMonkeez

+0

Функции не были определены внутри класса, только с выражением 'def'. Думаю, я должен привыкнуть к ООП, спасибо за ваше вдохновение – Triscus

0

Я нашел его сам, изменяя заявление графика в

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

сделал трюк.

+0

Это работает, но это не очень понятно: Что происходит, является то, что через 'partial' позиционного аргумента, переданного с помощью' schedule_interval' ('dt') получает назначение на первый аргумент в 'getenvironment' (' self'). 'self' не используется позже, поэтому проблем нет. Затем «radio» присваивается по имени, с ожидаемым значением. Так что, если 'self' действительно имел какой-то смысл, этот подход не сработал и не принес бы неожиданных результатов/ошибок. Просто подумал, что я указываю на это ... – zeeMonkeez