From c5c1afaad86f4db6700bd540af9cd5e1999e10bc Mon Sep 17 00:00:00 2001 From: rcoh Date: Tue, 23 Aug 2011 22:11:41 -0700 Subject: Added Pygame renderer and a demo of usage. Also added a renderer for the main lights which is waiting on a layout. --- renderer.py | 73 ++++++++++++++++++++++++++++++++++++++++++++++++--------- rendererdemo.py | 8 +++++++ util.py | 20 ++++++++++++++++ 3 files changed, 90 insertions(+), 11 deletions(-) create mode 100644 rendererdemo.py create mode 100644 util.py diff --git a/renderer.py b/renderer.py index e264f22..a52bfd7 100644 --- a/renderer.py +++ b/renderer.py @@ -1,17 +1,68 @@ class Renderer(object): + def render_game(self, game_board): + """ + renderBoard + @param gameBoard -- dictionary of tuples of location (x,y), 0 indexed from + the top left of the board. + @param boardIndex -- 0 for the left board, 1 for the right board. + """ + raise NotImplementedError + + def color_deref(self, color_str): + return Color(color_str) + +import pygame +from pygame.locals import Color +class PygameRenderer(Renderer): + """ - renderBoard - @param gameBoard -- dictionary of tuples of location (x,y), 0 indexed from - the top left of the board. - @param boardIndex -- 0 for the left board, 1 for the right board. + Based heavily off of PygameRenderer in SmootLight. Renders Tetris to a + pygame Window. """ - def render_board(gameBoard, boardIndex): - raise NotImplementedError + + DISPLAY_SIZE = (1000,1000) + OFFSET = (100, 100) + SCALE = 10 + def __init__(self): + pygame.init() + self.screen = pygame.display.set_mode(self.DISPLAY_SIZE) + self.background = pygame.Surface(self.screen.get_size()) + self.background = self.background.convert() + self.background.fill(Color(0,0,0)) + + def render_game(self, game_board): + for (x,y) in game_board: + pygame.draw.circle(self.background, self.color_deref(game_board[(x,y)]), + (self.OFFSET[0] + x*self.SCALE, self.OFFSET[1] + y*self.SCALE), self.SCALE) + self.screen.blit(self.background, (0,0)) + pygame.display.flip() + +import util +class LedRenderer(Renderer): """ - renderScore - @param score -- int representing the score of the player - @param board index -- 0 for the left board, 1 for the right board. + Renderer for the LEDs. Based heavily on IndoorRenderer in Smootlight and + general Smootlight abstraction patterns """ - def render_score(score, boardIndex): - raise NotImplementedError + POWER_SUPPLY_IPS = [0,0,0,0] #TODO: Fill in + SOCK_PORT = 6038 + sockets = {} + + def render_game(self, game_board): + packets = self.map_to_packets(game_board) + packets_with_destinations = zip(self.POWER_SUPPLY_IPS, packets) + for (ip, (port, packet)) in packets: + if not ip in self.sockets: + self.sockets[ip] = util.getConnectedSocket(ip, self.SOCK_PORT) + final_packet = util.composePixelStripPacket(packet, port) + try: + self.sockets[ip].send(packet, 0x00) + except: + print 'failure sending packet' + + def map_to_packets(game_board): + """ + Performs the mapping between a game_board and a list of (port,packet) pairs. The port,packet + pairs should line up with the ip's in IP_ADDRESSES + """ + #TODO(rcoh): Right this when we decide on a layout diff --git a/rendererdemo.py b/rendererdemo.py new file mode 100644 index 0000000..dcf1288 --- /dev/null +++ b/rendererdemo.py @@ -0,0 +1,8 @@ +""" +Draws some circles on the screen then closes. +""" +from renderer import PygameRenderer +p = PygameRenderer() + +test_dict = {(0,0):"red", (5,5):"orange", (10,10):"blue"} +p.render_game(test_dict) diff --git a/util.py b/util.py new file mode 100644 index 0000000..97982e1 --- /dev/null +++ b/util.py @@ -0,0 +1,20 @@ +from numpy import zeros +argDict = {'flags': 0, 'startcode': 0x0fff, 'pad':0} + +# Allocate a buffer for transmitted packets and fill it with magic +# Only works for strips of 50 pixels +xmit = zeros(174, dtype='ubyte') +xmit[:8], xmit[20:24] = [4,1,220,74,1,0,8,1], [150,0,255,15] + +def composePixelStripPacket(values, port): + xmit[16], xmit[24:] = port, values.ravel() + return xmit + +import socket +def getConnectedSocket(ip,port): + sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + try: + sock.connect((ip, port)) + return sock + except Exception as inst: + print 'socket failure' -- cgit v1.2.3