Simple synchronization based on UDP broadcast
This commit is contained in:
parent
7385a57699
commit
3137b57c6f
@ -7,6 +7,8 @@ import serial
|
|||||||
import webapp
|
import webapp
|
||||||
import threading
|
import threading
|
||||||
import logging
|
import logging
|
||||||
|
import socket
|
||||||
|
import json
|
||||||
|
|
||||||
logging.basicConfig(level=logging.INFO)
|
logging.basicConfig(level=logging.INFO)
|
||||||
import random, math, pygame
|
import random, math, pygame
|
||||||
@ -44,6 +46,10 @@ class ImageSlide(Slide):
|
|||||||
screen.blit(self.image, (0, 0))
|
screen.blit(self.image, (0, 0))
|
||||||
|
|
||||||
class FinalSlide(ImageSlide):
|
class FinalSlide(ImageSlide):
|
||||||
|
def exit(self, next_slide):
|
||||||
|
return False
|
||||||
|
|
||||||
|
class FinalEverythingSlide(ImageSlide):
|
||||||
def enter(self, prev_slide):
|
def enter(self, prev_slide):
|
||||||
global wall_a
|
global wall_a
|
||||||
if(wall_a):
|
if(wall_a):
|
||||||
@ -51,6 +57,9 @@ class FinalSlide(ImageSlide):
|
|||||||
pygame.mixer.music.load("media/win.mp3")
|
pygame.mixer.music.load("media/win.mp3")
|
||||||
pygame.mixer.music.play(MP3_LOOPS)
|
pygame.mixer.music.play(MP3_LOOPS)
|
||||||
pygame.mixer.music.set_volume(1.0)
|
pygame.mixer.music.set_volume(1.0)
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
||||||
def exit(self, next_slide):
|
def exit(self, next_slide):
|
||||||
return False
|
return False
|
||||||
|
|
||||||
@ -254,6 +263,7 @@ SLIDE_MAZE = 7
|
|||||||
SLIDE_MP3 = 8
|
SLIDE_MP3 = 8
|
||||||
SLIDE_KEYBOARD = 11
|
SLIDE_KEYBOARD = 11
|
||||||
SLIDE_CONGRATS = 9
|
SLIDE_CONGRATS = 9
|
||||||
|
SLIDE_CONGRATS_EVERYTHING = 12
|
||||||
|
|
||||||
SLIDE_SNAKE_DEAD = 10 #to nie slajd, tylko wartosc potrzebna do resetowania snake po przegranej
|
SLIDE_SNAKE_DEAD = 10 #to nie slajd, tylko wartosc potrzebna do resetowania snake po przegranej
|
||||||
|
|
||||||
@ -270,6 +280,7 @@ slides = {
|
|||||||
SLIDE_MAZE: ImageSlide(IMG_MAZE),
|
SLIDE_MAZE: ImageSlide(IMG_MAZE),
|
||||||
SLIDE_MP3: ImageSlide(IMG_MP3),
|
SLIDE_MP3: ImageSlide(IMG_MP3),
|
||||||
SLIDE_CONGRATS: FinalSlide(IMG_WIN),
|
SLIDE_CONGRATS: FinalSlide(IMG_WIN),
|
||||||
|
SLIDE_CONGRATS_EVERYTHING: FinalEverythingSlide(IMG_WIN),
|
||||||
SLIDE_SNAKE: SnakeSlide(),
|
SLIDE_SNAKE: SnakeSlide(),
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -311,11 +322,48 @@ class SerialThread(threading.Thread):
|
|||||||
go_to_slide(int(args))
|
go_to_slide(int(args))
|
||||||
print('Setting slide to: ', slide)
|
print('Setting slide to: ', slide)
|
||||||
|
|
||||||
|
class BroadcastThread(threading.Thread):
|
||||||
|
def run(self):
|
||||||
|
cs = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
||||||
|
cs.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
||||||
|
cs.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
|
||||||
|
while True:
|
||||||
|
global slide
|
||||||
|
|
||||||
|
print('sending')
|
||||||
|
cs.sendto(json.dumps({
|
||||||
|
'slide': slide,
|
||||||
|
}), ('255.255.255.255', 54545))
|
||||||
|
time.sleep(1)
|
||||||
|
|
||||||
|
class ReceiveThread(threading.Thread):
|
||||||
|
states = None
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
self.states = {}
|
||||||
|
|
||||||
|
s=socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
||||||
|
s.bind(('',54545))
|
||||||
|
while True:
|
||||||
|
try:
|
||||||
|
msg, (host, port) = s.recvfrom(1024)
|
||||||
|
self.states[host] = json.loads(msg)
|
||||||
|
print(self.states)
|
||||||
|
|
||||||
|
if all(s['slide'] in [SLIDE_CONGRATS, SLIDE_CONGRATS_EVERYTHING]
|
||||||
|
for s in self.states.values()):
|
||||||
|
go_to_slide(SLIDE_CONGRATS_EVERYTHING)
|
||||||
|
except:
|
||||||
|
logging.exception('Receiver failed')
|
||||||
|
time.sleep(0.5)
|
||||||
|
|
||||||
|
|
||||||
for c in ['/dev/ttyUSB0', '/dev/ttyACM0']:
|
for c in ['/dev/ttyUSB0', '/dev/ttyACM0']:
|
||||||
try:
|
try:
|
||||||
ser = serial.Serial(c, 115200)
|
ser = serial.Serial(c, 115200)
|
||||||
except:
|
except:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
print('Using ', c)
|
print('Using ', c)
|
||||||
webapp.init(ser)
|
webapp.init(ser)
|
||||||
th = SerialThread()
|
th = SerialThread()
|
||||||
@ -323,12 +371,19 @@ for c in ['/dev/ttyUSB0', '/dev/ttyACM0']:
|
|||||||
th.daemon = True
|
th.daemon = True
|
||||||
th.start()
|
th.start()
|
||||||
|
|
||||||
|
bth = BroadcastThread()
|
||||||
|
bth.daemon = True
|
||||||
|
bth.start()
|
||||||
|
|
||||||
|
rth = ReceiveThread()
|
||||||
|
rth.daemon = True
|
||||||
|
rth.start()
|
||||||
|
|
||||||
|
|
||||||
def win():
|
def win():
|
||||||
print "GAME OVER - YOU WIN"
|
print "GAME OVER - YOU WIN"
|
||||||
GPIO.output(PIN_RELAY, 0)
|
GPIO.output(PIN_RELAY, 0)
|
||||||
|
|
||||||
|
|
||||||
def signalWin(success):
|
def signalWin(success):
|
||||||
pin = 0
|
pin = 0
|
||||||
if success == 4:
|
if success == 4:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user