Paso 9: código
Aquí está el código. Usted necesitará instalar pyomxplayer, pexpect y pyOSC. También, dependiendo de la versión de omxplayer, puede que necesite modificar pyomxplayer por la forma en que intenta analizar la salida de omxplayer. Este script trabaja para el amo y el esclavo basado en el nombre de host. Aquí es el proceso básico:
- Cuando arrancar todas las máquinas, copiar el contenido en la unidad de ram y lanzarlo en omxplayer en pausa
- Los esclavos entonces entran en un bucle de arranque enviando una dirección de "lista" al maestro hasta que escuchan nuevamente.
- El maestro entra en un bucle para comprobar si ambos esclavos están listos, escuchar para una dirección de "lista" de cada uno.
- Cuando el maestro determina tanto esclavos están listos, envía una dirección de "escuchar" a los esclavos y los esclavos salen de su bucle de arranque.
- De aquí encendido hacia fuera, el maestro controla a los esclavos a través de OSC para reanudar/pausa/rebobinar las peliculas indefinidamente.
- Las máquinas de reinician o apagar cuando el pin GPIO específico se establece en el maestro.
< p > #! / usr/bin/python < br > Importar OSC import threading, zócalo, shutil de importación pyomxplayer OMXPlayer de importación sueño ''' Thomas Hollier, 2015. ''' hosts = {'master': '192.168.11.45', 'slave1': '192.168.11.46', 'slave2': '192.168.11.47'} películas = {'master':'/home/pi/media/movie_lf.mov', 'slave1':'/home/pi/media/movie_cn.mov', 'slave2':'/home/pi/media/movie_rt.mov'} movieLength = 60 * 5 hostname = socket.gethostname() print "copia de %s a/var/ramdisk" % películas [hostname] shutil.copy (películas [hostname], "/ var/ramdisk /") películas [hostname] = películas [hostname] .replace ('/ home/pi/medios de comunicación', '/ var/ramdisk') impresión "reproducir película de %s" % películas [hostname] omx = OMXPlayer(movies[hostname]) sleep(5) omx.toggle_pause() sleep(1) omx.rewind() sleep(1) def reboot() : comando = "/ usr/bin/sudo/sbin/shutdown - r ahora" importar proceso subproceso = subproceso. Popen(Command.Split(), stdout = subproceso. Salida de la tubería) = process.communicate() [0] impresión def poweroff(): comando = "/ usr/bin/sudo/sbin/shutdown -h ahora" importar proceso subproceso = subproceso. Popen(Command.Split(), stdout = subproceso. Salida de la tubería) = process.communicate() [0] impresión si nombre == 'master': def gpio_check(): importar RPi.GPIO como GPIO.setmode(GPIO. GPIO BCM) GPIO.setup (23, GPIO. IN, pull_up_down = GPIO. PUD_UP) GPIO.setup (24, GPIO. IN, pull_up_down = GPIO. PUD_UP) mientras que True: input_state = GPIO.input(23) si input_state == False: imprimir (' detecta una solicitud de reinicio: presiona el botón 23') send_reboot(slaves['slave1'][2]) send_reboot(slaves['slave2'][2]) sleep(.3) reboot() input_state = GPIO.input(24) si input_state == False: imprimir (' detecta una solicitud poweroff: presiona el botón 24') send_poweroff(slaves['slave1'][2]) send_poweroff(slaves['slave2'][2]) imprimir ('24 el pulsador') sleep(.3) poweroff() sleep(.1) gpio_thread = threading. Thread(Target=gpio_check) gpio_thread.start() # enviar escuchar def send_listen(slaveServer): impresión "auxiliar de consulta", slaveServer msg = OSC. OSCMessage() msg.setAddress("/listen") # set OSC dirección msg.append ("el maestro de maestro. \nThe es una pausa durante 20 segundos.") # int slaveServer.send(msg) # enviarlo! # enviar juego comando def send_play(slaveServer): print "enviando el juego a", slaveServer msg = OSC. OSCMessage() msg.setAddress("/play") # set OSC dirección msg.append ("el maestro") # int slaveServer.send(msg) # enviarlo! # enviar toggle_pause comando def send_toggle_pause(slaveServer): print "enviando toggle_pause a", slaveServer msg = OSC. OSCMessage() msg.setAddress("/toggle_pause") # set OSC dirección msg.append ("el maestro") # int slaveServer.send(msg) # enviarlo! # enviar rebobinado comando def send_rewind(slaveServer): print "rebobinado a enviar", slaveServer msg = OSC. OSCMessage() msg.setAddress("/rewind") # set OSC dirección msg.append ("el maestro") # int slaveServer.send(msg) # enviarlo! # enviar reboot comando def send_reboot(slaveServer): print "reboot a enviar", slaveServer msg = OSC. OSCMessage() msg.setAddress("/reboot") # set OSC dirección msg.append ("el maestro") # int slaveServer.send(msg) # enviarlo! # Envíe poweroff comando def send_poweroff(slaveServer): print "enviar apagado a", slaveServer msg = OSC. OSCMessage() msg.setAddress("/poweroff") # set OSC dirección msg.append ("el maestro") # int slaveServer.send(msg) # enviar! controlador de # dirección lista def ready_handler (addr, etiquetas, material, origen): Si no esclavos [cosas [0]] [0]: esclavos [cosas [0]] [0] = True impresión "ajuste de %s para listos" % cosas [0] # configuración clientes para enviar mensajes a slavesReady = False c1 = OSC. OSCClient() c2 = OSC. OSCClient() esclavos = {'slave1': [False, (alberga ['slave1'], 9000), c1], 'slave2': [False, (alberga ['slave2'], 9000), c2]} # auto configurado para recibir mensajes receive_address = hosts ['maestra'], 9000 s = OSC. OSCServer(receive_address) # s.addDefaultHandlers() básica s.addMsgHandler ("por listo" ready_handler) # añadir la función # OSCServer iniciar impresión "\nStarting OSCServer. Use ctrl-C para dejar de fumar."st = threading. Del hilo de rosca (objetivo = s.serve_forever) st.start() # configurar clientes para enviar mensajes a esclavos ['slave1'] [2] .connect (esclavos ['slave1'] [1]) # set la dirección de todos los esclavos mensajes siguientes ['slave2'] [2] .connect (esclavos ['slave2'] [1]) # establece la dirección de todos los mensajes de siguientes ### # establecer comunicación Imprimir "Maestro está esperando para oír de los esclavos." # el maestro espera hasta que ambos esclavos están listos mientras no slavesReady : sleep(.01) si esclavos ['slave1'] [0] y esclavos ['slave2'] [0]: slavesReady = True Imprimir "el maestro ha oído de ambos esclavos" # el maestro le dice a los esclavos para escuchar send_listen(slaves['slave1'][2]) send_listen(slaves['slave2'][2]) impresión "el maestro ha dicho a los esclavos a escuchar" Imprimir "Pausa de 20 segundos" captura de # nuestra respiración sleep(20) ### medios # controlan # entramos en un bucle infinito donde nos # activar , espere a que la pausa de # de longitud de película, esperar, retroceder, esperar, reanudar impresión "entrando en bucle principal" aunque la verdad: send_toggle_pause(slaves['slave1'][2]) send_toggle_pause(slaves['slave2'][2]) omx.toggle_pause() sleep(movieLength) send_toggle_pause(slaves['slave1'][2]) send_toggle_pause(slaves['slave2'][2]) omx.toggle_pause() sleep(2) send_rewind(slaves['slave1'][2]) send_rewind(slaves['slave2'][2]) omx.rewind() sleep(2) más : thisName = thisIP nombre de host = host [host], 9000 masterStatus = {'despierta': [falso], 'play': [falso]} masterAddress = hosts ['maestra'], 9000 def send_ready(c): msg = OSC. Trate de OSCMessage() msg.setAddress("/ready") # set OSC dirección msg.append(thisName) # int: c.send(msg) excepto: pase def listen_handler (añadir, etiquetas, material, origen): print "Me dijeron que escuche por %s" % cosas masterStatus [0] ['despiertos'] [0] = True def play_handler (añadir, etiquetas, material, origen): print "Me dijo para jugar por %s" % cosas masterStatus [0] [juego] [0] = True def toggle_pause_handler (añadir etiquetas, materia, origen): impresión "Me dijeron que toggle_pause por %s" % de la materia [0] omx.toggle_pause() def rewind_handler (añadir, etiquetas, material, origen): print "Me dijeron que rebobinar por %s" % de la materia masterStatus de omx.rewind() [0] ['despiertos'] = False def reboot_handler (añadir, etiquetas, material, origen): print "Me dijeron que reiniciar por %s" % de la materia [0] reboot() def poweroff_handler (añadir, etiquetas, material origen): impresión "Me dijo a poweroff %s" % de la materia [0] poweroff() ### # crear un cliente para enviar mensajes al maestro c = OSC. OSCClient() c.connect (masterAddress) ### # escuchar mensajes del maestro receive_address = thisIP s = OSC. OSCServer(receive_address) # basic # definir controladores s.addDefaultHandlers() s.addMsgHandler ("/ escuchar", listen_handler) s.addMsgHandler ("por jugar" play_handler) s.addMsgHandler ("/ toggle_pause", toggle_pause_handler) s.addMsgHandler ("/ rewind", rewind_handler) s.addMsgHandler ("/ reiniciar", reboot_handler) s.addMsgHandler ("/ poweroff", poweroff_handler) # OSCServer empezar a imprimir "\nStarting OSCServer. Use ctrl-C para dejar de fumar."st = threading. Del hilo de rosca (objetivo = s.serve_forever) st.start() de impresión "%s conexión al maestro." % nombre de equipo aunque la verdad: #i ## ## # seguir enviándonos listo señales hasta que el maestro envía un mensaje # en la dirección /listen que nos lleva fuera de este bucle mientras no masterStatus ['despierto'] [0]: sleep(.01) send_ready(c) ### # una vez que el maestro ha tomado el control, no hacemos nada y permiten la reproducción de la unidad principal a través de controladores < /p >