Kivy на Raspberry PI: правильный способ отменить мероприятие - PullRequest
0 голосов
/ 09 апреля 2019

Здесь я читаю данные из Arduino через последовательный порт, Arduino постоянно отправляет данные со скоростью 9600 бод. Отправка данных в течение нескольких десятков секунд напоминает «AGVtoUPF», а затем следующие данные в течение нескольких десятков секунд и т. Д. .

Мне нужно вызвать другое событие в соответствии с данными, которые я получил.

Здесь я наблюдаю, что данные, которые я получаю, правильные и быстрые, когда ничего не запланировано. Но когда срабатывает один из графиков, я получаю задержку в получении данных (например, Arduino отправляет следующие данные, но Kivy все еще показывает последние данные в течение ~ 3 секунд, ОГРОМНАЯ задержка !!).

Я не уверен, что это потому, что я неправильно планирую / отменяю события или fps of kivy не может догнать скорость передачи, когда что-то запланировано.

Вот код, где происходит расписание / внеплановое

class OperationScreen(Screen):
    def __init__(self,**kwargs):
        super(OperationScreen,self).__init__(**kwargs)
        Clock.schedule_interval(self.Read,1.0/60.0)


    def Read(self,dt):
        data = arduino.readline()
        if data =='':
            pass
        if data != '' and data != self.ids.data_label.text:
            self.ids.data_label.text = data
            if data == 'AGVtoUPFt\r\n':
                print("1")
                Clock.schedule_interval(self.ids.upf.transfer,1.75)
                Clock.schedule_interval(self.ids.agvin.transfer,1.75)
            elif data =='AGVtoUPFv\r\n':
                print("2")
                Clock.schedule_interval(self.ids.upf.vacuum,1.75)
            elif data =='AGVtoUPFvi\r\n':
                print("3")
                Clock.schedule_interval(self.ids.upf.vacin,1.75)
            elif data =='AGVtoUPFi\r\n':
                print("4")
                Clock.schedule_interval(self.ids.upf.inert,1.75)            
            else:
                Clock.unschedule(self.ids.agvin.transfer)
                Clock.unschedule(self.ids.upf.inert)
                Clock.unschedule(self.ids.upf.transfer)
                Clock.unschedule(self.ids.upf.vacuum)
                Clock.unschedule(self.ids.upf.vacin)

Я сделал случай if / else таким образом, потому что не хочу, чтобы одно и то же событие вызывалось дважды.

Я пытался объявить событие, подобное event_trigger = ObjectProperty(None) в class OperationScreen(Screen), затем сделать event_trigger = Clock.schedule_interval(self.ids.agvin.transfer) в __init__, чтобы я мог напрямую использовать event_trigger() и event_trigger.cancel() в случае if / else для расписание / unscheduling

Но как-то выдает ошибку, когда я делаю event_trigger = Clock.schedule_interval(self.ids.agvin.transfer). Таким образом, я описал вышеописанный метод, я видел, что в документации Kivy не рекомендуется использовать Clock.unschedule(self.ids.agvin.transfer), не является ли это причиной такой задержки в моей программе?

Пожалуйста, советуйте, если кто-нибудь что-нибудь знает об этом.

Пожалуйста, скажите мне, если я должен предоставить больше информации!

Заранее спасибо !!

UPDATE

Как и предполагалось, я изменил свой метод планирования, вот мой новый код

class OperationScreen(Screen):
    event_read = ObjectProperty(None)
    upf_transfer = ObjectProperty(None)
    agv_trigger = ObjectProperty(None)
    upf_vacuum = ObjectProperty(None)
    upf_vacin = ObjectProperty(None)
    upf_inert = ObjectProperty(None)
    def __init__(self,**kwargs):
        super(OperationScreen,self).__init__(**kwargs)
        self.event_read = Clock.schedule_interval(self.Read,1.0/60.0)
        self.event_read()

    def Read(self,dt):
        data = arduino.readline()
        if data =='':
            pass
        if data != '' and data != self.ids.data_label.text:
            self.ids.data_label.text = data
            if data == 'AGVtoUPFt\r\n':
                print("1")
                self.agv_trigger = Clock.schedule_interval(self.ids.agvin.transfer,1.75)
                self.agv_trigger()
                self.upf_transfer = Clock.schedule_interval(self.ids.upf.transfer,1.75)
                self.upf_transfer()

            elif data =='AGVtoUPFv\r\n':
                print("2")
                self.upf_vacuum = Clock.schedule_interval(self.ids.upf.vacuum,1.75)
                self.upf_vacuum()
            elif data =='AGVtoUPFtvi\r\n':
                print("3")
                self.upf_vacin = Clock.schedule_interval(self.ids.upf.vacin,1.75)
                self.upf_vacin()
            elif data =='AGVtoUPFti\r\n':
                print("4")
                self.upf_inert = Clock.schedule_interval(self.ids.upf.inert,1.75)
                self.upf_inert()
            else:
                Clock.unschedule(self.agv_trigger)
                Clock.unschedule(self.upf_inert)
                Clock.unschedule(self.upf_vacin)
                Clock.unschedule(self.upf_vacuum)
                Clock.unschedule(self.upf_transfer)

Но задержка в получении данных все еще есть, и это происходит только тогда, когда у меня идет анимация, пожалуйста, помогите.

1 Ответ

0 голосов
/ 09 апреля 2019

Присвойте планирование или триггер атрибуту, например,

Создание триггерного события

self.event_trigger = Clock.create_trigger(self.ids.agvin.transfer, 1.75)

Событие планирования

self.event_trigger()
self.event_read = Clock.schedule_interval(self.Read,1.0/60.0)

внеплановое событие

Clock.unschedule(self.event_trigger)
Clock.unschedule(self.event_read)

или

self.event_trigger.cancel()
self.event_read.cancel()

Ссылки * * один тысяча двадцать-одна Объект Kivy Clock

...