Как обнаружить изменение в файле значений GPIO с помощью сторожевого обработчика - PullRequest
0 голосов
/ 16 марта 2020

Я пытаюсь определить, когда значение булавки gpio на моей машине изменяется, используя обработчик событий сторожевого таймера. Вот основа моего кода:

import watchdog.observers
import watchdog.events
import time
import os.path

#path of the gpio pin for digital input (input w/ config)
src_path = "/sys/class/gpio/gpio1"

#class that handles event change
class Handler(watchdog.events.FileSystemEventHandler):
    #initializes handler and formats logging
    def __init__(self):
        #set the patterns for FileSystemEventHandler
        watchdog.events.FileSystemEventHandler.__init__(self)

    #when file is created within directory
    def on_created(self, event):
        print("Watchdog received created event - % s." % event.src_path)
        #code

    #when file is modified within directory
    def on_modified(self, event):
        print("Watchdog received modified event - % s." % event.src_path)
        #code

#initiates digital input gpio pins
def di_initiate():
    if not os.path.islink('/sys/class/gpio/gpio1'):
        with open('/sys/class/gpio/export', 'w') as gpio_f:    # open the export file before writing the GPIO number
            gpio_f.write('1')    # select the pin number 1
            gpio_f.flush()

    with open('/sys/class/gpio/gpio1/direction', 'w') as gpio_f:
        gpio_f.write('in')    # set the pin as an input
        gpio_f.flush()

#closes digital input gpio pins
def di_close():
    with open('/sys/class/gpio/unexport', 'w') as gpio_f:    # remove the GPIO pin
        gpio_f.write('1')
        gpio_f.flush()

#main function, where the program starts
if __name__ == "__main__":

    event_handler = Handler()

    #initialize Observer
    observer = watchdog.observers.Observer()
    observer.schedule(event_handler,  path = src_path,  recursive=True)

    #start the observer
    while True:
        try:
            print("Starting Observer")
            observer.start()
            print("Observer started")
            di_initiate()
            print("Digital Input Initiated")
            break
        except OSError as e:
            print("Source path does not exist!")
            print(e)

    try:
        while True:
            #set the thread sleep time
            time.sleep(1)
    except KeyboardInterrupt:
        observer.stop()
        di_close()
    observer.join()

Вывод этого кода:

Starting Observer

Исходный путь не существует!

[Errno 20] Не каталог: '/ sys / class / gpio / gpio1'

Запуск наблюдателя

Запуск наблюдателя

Инициированный цифровой вход

Однако сообщения on_modified впоследствии не существует. Я использовал другую программу, чтобы подтвердить, что значение контакта gpio действительно изменяется при вводе сигнала, но сторожевой таймер, похоже, не распознает это изменение.

...