Завершите цикл while из другого оператора IF - PullRequest
1 голос
/ 20 марта 2019

Я строю телефон с моими Raspberry Pi и Twinkle. В моем примере я запускаю Twinkle с подпроцессом и проверяю вывод моего кода.

Теперь мне нужно запустить цикл while, когда кто-то звонит, чтобы проверить «кнопку завершения вызова». Это работает хорошо, но мне нужно завершить цикл, если дальний конец отменил вызов. Как я могу прервать цикл while из другого условия if?

Вот мой код, например:

#IMPORTS
import sys
import time
import RPi.GPIO as GPIO
from multiprocessing.pool import ThreadPool
import threading

#START TWINKLE
from subprocess import Popen, PIPE

proc = Popen(["twinkle", "-c"], stdin=PIPE, stdout=PIPE, bufsize=1)

for line in iter(proc.stdout.readline, b''):
        print line

        #BUTTON WATCHER
        def button_watch():
                input_state = GPIO.input(36)
                while (input_state == False):
                        print "loop"
                        #END LOOP ON BUTTON PRESS
                        if (input_state == False):
                                print('Button Pressed')
                                input_state = GPIO.input(36)
                                GPIO.setup(32, GPIO.OUT)
                                GPIO.output(32, GPIO.LOW)
                                proc.stdin.write("answer\n")
                                time.sleep(0.2)
                                break

        #INCOMING CALL
        def main():
                if (line.find("incoming call") > 0):
                        print "call is coming"
                        GPIO.setmode(GPIO.BOARD)
                        GPIO.setup(32, GPIO.OUT)
                        GPIO.output(32, GPIO.HIGH)
                        GPIO.setmode(GPIO.BOARD)
                        GPIO.setup(36, GPIO.IN, pull_up_down=GPIO.PUD_UP)
                        #START BUTTON WATCHER ON INCOMING CALL
                        t1 = threading.Thread(target=button_watch)
                        t1.start()


        #CALL CANCELLED
        if (line.find("far end cancelled call") > 0):
                print "call was cancelled"
                GPIO.setmode(GPIO.BOARD)
                GPIO.setup(32, GPIO.OUT)
                GPIO.output(32, GPIO.LOW)
                ##############################################
                # NEED TO END WHILE LOOP FROM "button_watch" #
                ##############################################


        tmain = threading.Thread(target=main)
        tmain.start()


proc.communicate()

Ответы [ 2 ]

1 голос
/ 20 марта 2019

Я добавил комментарий, требуя разъяснений, потому что я не уверен, что полностью понимаю намерение.Теперь, в конце концов, вы найдете лучшие и более надежные способы сделать это, но самое простое решение - это проверить составное условие (при условии, что вам все еще нужно input_condition == False).

Таким образом, вы можете определить глобальный флаг под названиемremote_disconnected, инициализируйте его так, чтобы ваш цикл while выполнялся в начале, и составьте его следующим образом: while (input_condition == False and remote_disconnected == False):

0 голосов
/ 20 марта 2019

делает button_watch зависимым от глобального флага, поэтому вы можете установить флаг в False

...