diff --git a/vloed.py b/vloed.py index 74421fc..03b6800 100755 --- a/vloed.py +++ b/vloed.py @@ -5,36 +5,38 @@ Inspired by the PixelFlut beamer on eth0:winter 2016 and code from https://github.com/defnull/pixelflut/ """ -__version__ = 0.1 +__version__ = 0.2 __author__ = "Jan Klopper " import pygame -import socket import struct -import Queue -import threading import time +from gevent import spawn, socket, monkey +from gevent.server import DatagramServer +from gevent.queue import Queue + +monkey.patch_all() +UDP_IP = "127.0.0.1" +UDP_PORT= 5005 def main(): """Runs a pixelvloed server""" - PixelVloed() + PixelVloed(':%d' %(UDP_PORT)).serve_forever() -class PixelVloed(object): +class Canvas(object): """PixelVloed server class""" - def __init__(self, udp_ip="127.0.0.1", udp_port=5005, debug=False): + def __init__(self, queue, debug=False): """Init the pixelVloed server""" self.debug = debug self.pixeloffset = 2 self.fps = 30 self.screen = None + self.udp_ip = UDP_IP + self.udp_port = UDP_PORT self.canvas() self.set_title() - self.queue = Queue.Queue() - self.receivethread = threading.Thread(target=self.Socket, args=(udp_ip, udp_port), name="ReceiveThread") - self.drawthread = threading.Thread(target=self.CanvasUpdate, name="DrawThread") - self.receivethread.start() - self.drawthread.start() + self.queue = queue @staticmethod def set_title(text=None): @@ -44,7 +46,7 @@ class PixelVloed(object): title += ' ' + text pygame.display.set_caption(title) - def canvas(self, width=768, height=1366): + def canvas(self, width=1366, height=768): """Init the pygame canvas""" pygame.init() self.screen = pygame.display.set_mode((width, height)) @@ -57,17 +59,8 @@ class PixelVloed(object): """Print a pixel to the screen""" self.screen.set_at((x, y), (r, g, b, a)) - def Socket(self, ipaddress, port): - """Sets up a udp listening socket and handles the incoming binary data""" - sock = socket.socket(socket.AF_INET, # Internet - socket.SOCK_DGRAM) # UDP - sock.bind((ipaddress, port)) - - while True: - self.queue.put(sock.recvfrom(1024)) - self.queue.join() - def CanvasUpdate(self): + """Updates the screen according to self.fps""" lasttime = time.time() while True: currenttime = time.time() @@ -77,26 +70,38 @@ class PixelVloed(object): lasttime = time.time() def Draw(self): - data, addr = self.queue.get() - self.queue.task_done() - preamble = struct.unpack_from("