0

Apologies for the newbie Python post, but a bit of Googling and I still can't find what I need.

I have the following Pi Hat; https://github.com/modmypi/Jam-HAT, ...and I'm using their docs to guide me; https://gpiozero.readthedocs.io/en/stable/recipes.html

My idea is pretty simple;

  • run script when button pressed
  • wait for it to run, showing flashy lights whilst running
  • if I press another button, stop/kill script

However, I'm stuck on the part where I need to stop the script with a button

#!/usr/bin/env python3

import gpiozero
import subprocess
from signal import pause
from time import sleep

button1 = gpiozero.Button(18)
button2 = gpiozero.Button(19)
green1  = gpiozero.LED(16)
green2  = gpiozero.LED(17)
red1    = gpiozero.LED(5)
red2    = gpiozero.LED(6)
script  = ""
yellow1 = gpiozero.LED(12)
yellow2 = gpiozero.LED(13)

def kill_hello():
    global script
    script.kill()
    print("Killed PID: ", script.pid)
    red1.on()
    sleep(.5)
    red1.off()
    red2.on()
    sleep(.5)
    red2.off()

def say_hello():
    global script
    green1.on()
    sleep(.5)
    green1.off()
    green2.on()
    sleep(.5)
    green2.off()
    script = subprocess.Popen(['/home/kali/hello.sh'])
    print("Script PID: ", script.pid)
    while script.poll() is None:
        if not button2.when_pressed:
            green1.on()
            sleep(.5)
            green1.off()
            sleep(1)
        button2.when_pressed = kill_hello

print("Press Ctrl & C to Quit")

try:
    button1.when_pressed = say_hello
    pause()
except KeyboardInterrupt:
    print( "\n...Quit!")

I've tried a try/except where that while loop is, but that has also not worked (not like the KeyboardInterrupt). It doesn't recognise the button has been pressed, and I'm assuming because it's not within a valid catch/else/something block.

Any suggestions for a simple break out of loop, please?

Beefcake
  • 733
  • 2
  • 12
  • 37

1 Answers1

0

It seems the issue is around a single process is hogging Python, thus creating multiple threads helped;

#!/usr/bin/env python3

import gpiozero
import subprocess
import time
import threading
from signal import pause

button1 = gpiozero.Button(18)
button2 = gpiozero.Button(19)
green1  = gpiozero.LED(16)
green2  = gpiozero.LED(17)
red1    = gpiozero.LED(5)
red2    = gpiozero.LED(6)
script  = ""
yellow1 = gpiozero.LED(12)
yellow2 = gpiozero.LED(13)
switch  = True

def blink():
    def run():
        while (switch == True):
            green1.on()
            time.sleep(.2)
            green1.off()
            time.sleep(.2)
            if switch == False:
                break
    thread = threading.Thread(target=run)
    thread.start()

def switchon():
    global switch
    global script
    switch = True
    print('switch on')
    script = subprocess.Popen(['/home/kali/hello.sh'])
    blink()

def switchoff():
    global switch
    global script
    print('switch off')
    script.kill()
    switch = False

try:
    button1.when_pressed = switchon
    button2.when_pressed = switchoff
    pause()
except KeyboardInterrupt:
    print( "\n...Quit!")

Beefcake
  • 733
  • 2
  • 12
  • 37