Как прервать кнопку GPIO, вызвавшую длительный процесс другим событием на Raspberry Pi? - PullRequest
0 голосов
/ 07 октября 2018

У меня есть 2 кнопки, подключенные к Rapsberry Pi Zero W на 38 и 40 контактах.У меня запущен длительный процесс на контакте 38, и я хотел бы прервать его после нажатия на контакт 40.Но контакт 40 неактивен, пока выполняется обратный вызов контакта 38.Как остановить длительный процесс с помощью другого события?

import RPi.GPIO as GPIO
import time

should_stop = False


def cb1(pin):
    if GPIO.input(pin) == 0:
        print("long running:", pin)

        global should_stop
        should_stop = False

        for _ in range(10):
            if not should_stop:
                print("long running is running")
                time.sleep(1)

        print("long running DONE")


def interrupt(pin):
    if GPIO.input(pin) == 0:
        print("fast running:", pin)

        global should_stop
        should_stop = True


GPIO.setmode(GPIO.BOARD)

GPIO.setup(38, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(40, GPIO.IN, pull_up_down=GPIO.PUD_UP)

GPIO.add_event_detect(38, GPIO.RISING, callback=cb1, bouncetime=300)
GPIO.add_event_detect(40, GPIO.RISING, callback=interrupt, bouncetime=300)

while True:
    time.sleep(1)

1 Ответ

0 голосов
/ 07 октября 2018

Я протестировал следующий код на PI и он работает, он использует python для процесса python:

import RPi.GPIO as GPIO

import multiprocessing
import time

# function responsable for doing the heavy work when button1 is pressed
# this function will stop doing the work when button 2 is pressed
def long_processing(e):
    # runs for ever
    while True:
        # waits until the event is set
        e.wait()
        # do work while the event is set
        while e.is_set():
            # do some intensive work here
            print('intensive work...')
            time.sleep(0.5)


if __name__ == '__main__':
    # initialize GPIO buttons
    GPIO.setmode(GPIO.BOARD)
    button1_pin = 16
    button2_pin = 12
    GPIO.setup(button1_pin, GPIO.IN, pull_up_down=GPIO.PUD_UP)
    GPIO.setup(button2_pin, GPIO.IN, pull_up_down=GPIO.PUD_UP)

    first_button_pushed = multiprocessing.Event()

    # GPIO callbacks
    def but1_callback(channel):
        print('first button bushed')
        first_button_pushed.set()

    def but2_callback(channel):
        print('second button bushed')
        first_button_pushed.clear()

    # GPIO callbacks hooks
    GPIO.add_event_detect(button1_pin, GPIO.RISING, callback=but1_callback, bouncetime=300)
    GPIO.add_event_detect(button2_pin, GPIO.RISING, callback=but2_callback, bouncetime=300)

    # a process used to run the "long_processing" function in background
    # the first_button_pushed event is passed along
    process = multiprocessing.Process(name='first_process', target=long_processing, args=(first_button_pushed,))
    process.daemon = True
    process.start()

    while True:
        time.sleep(1)
...