aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar rcoh <rcoh@mit.edu>2011-08-23 22:11:41 -0700
committerGravatar rcoh <rcoh@mit.edu>2011-08-23 22:11:41 -0700
commitc5c1afaad86f4db6700bd540af9cd5e1999e10bc (patch)
treeea3001072705eb416616e5ed75280accef65568f
parentdae7c73578819575aaac2790546509343d7c7074 (diff)
Added Pygame renderer and a demo of usage. Also added a renderer for the main lights which is
waiting on a layout.
-rw-r--r--renderer.py73
-rw-r--r--rendererdemo.py8
-rw-r--r--util.py20
3 files changed, 90 insertions, 11 deletions
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'