aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Russell Cohen <rcoh@mit.edu>2011-01-26 22:24:55 -0500
committerGravatar Russell Cohen <rcoh@mit.edu>2011-01-26 22:24:55 -0500
commit5d29906fff79bc6e4ba83be7028e1380a0014d21 (patch)
tree0bb2350046aa69c3b1095983fea59c49026a857b
parent2019fb2895237aa9d86450daaf6d90831189fc13 (diff)
parent82f99fc4583ca3cc9861a9fe30990a4a9ef162c4 (diff)
Merge branch 'mobileapp' into biginstall
Conflicts: behaviors/RestrictLocation.py behaviors/Square.py config/6thFloor.xml inputs/TCPInput.py layouts/60StripLayout.xml operationscore/Behavior.py operationscore/PixelMapper.py pixelcore/Pixel.py pixelcore/Screen.py renderers/60StripSeq.xml
-rw-r--r--behaviors/DebugBehavior.py2
-rw-r--r--behaviors/DimColor.xml8
-rw-r--r--behaviors/DoorBehavior.py4
-rw-r--r--behaviors/Expand.py17
-rw-r--r--behaviors/MoveBehavior.py27
-rw-r--r--config/6thFloor.xml49
-rw-r--r--config/MobileTest.xml230
-rw-r--r--inputs/TCPInput.py19
-rw-r--r--inputs/UDPInput.py6
-rw-r--r--operationscore/PixelEvent.py1
-rw-r--r--pixelcore/Pixel.py29
-rw-r--r--pixelcore/Screen.py10
-rw-r--r--[-rwxr-xr-x]setup.sh0
13 files changed, 366 insertions, 36 deletions
diff --git a/behaviors/DebugBehavior.py b/behaviors/DebugBehavior.py
index 34f4106..17383db 100644
--- a/behaviors/DebugBehavior.py
+++ b/behaviors/DebugBehavior.py
@@ -4,5 +4,5 @@ import pdb
class DebugBehavior(Behavior):
def processResponse(self, sensorInputs, recursiveInputs):
if sensorInputs != []:
- main_log.debug('Sensor Inputs: ' + str(sensorInputs))
+ main_log.error('Sensor Inputs: ' + str(sensorInputs))
return ([], [])
diff --git a/behaviors/DimColor.xml b/behaviors/DimColor.xml
new file mode 100644
index 0000000..b01908e
--- /dev/null
+++ b/behaviors/DimColor.xml
@@ -0,0 +1,8 @@
+<Behavior>
+ <Class>behaviors.ModifyParam</Class>
+ <Args>
+ <ParamType>Sensor</ParamType>
+ <ParamName>Color</ParamName>
+ <ParamOp>[chan*.99 for chan in {val}]</ParamOp>
+ </Args>
+</Behavior>
diff --git a/behaviors/DoorBehavior.py b/behaviors/DoorBehavior.py
new file mode 100644
index 0000000..5058f69
--- /dev/null
+++ b/behaviors/DoorBehavior.py
@@ -0,0 +1,4 @@
+from operationscore.behavior import *
+class DoorBehavior.py(Behavior):
+ def behaviorInit(self):
+ pyt
diff --git a/behaviors/Expand.py b/behaviors/Expand.py
new file mode 100644
index 0000000..3415966
--- /dev/null
+++ b/behaviors/Expand.py
@@ -0,0 +1,17 @@
+from operationscore.Behavior import *
+class Expand(Behavior):
+ def processResponse(self, sensorInputs, recurs):
+ ret = []
+ for data in sensorInputs:
+ if not 'Left' in data: #If this is the first time we have seen this input
+ data['Left'] = data['Location'][0]
+ data['Right'] = data['Location'][0]
+ data['ExpandRate'] = self['ExpandRate']
+
+ data = dict(data)
+ data['Left'] -= data['ExpandRate']
+ data['Right'] += data['ExpandRate']
+ data['Location'] = "{x}>" + str(data['Left']) + ", {x}<" + str(data['Right'])
+ ret.append(data)
+ return (ret, [])
+
diff --git a/behaviors/MoveBehavior.py b/behaviors/MoveBehavior.py
new file mode 100644
index 0000000..590f0e4
--- /dev/null
+++ b/behaviors/MoveBehavior.py
@@ -0,0 +1,27 @@
+from operationscore.Behavior import *
+import util.ComponentRegistry as compReg
+import util.Geo as Geo
+import util.Strings as Strings
+
+class MoveBehavior(Behavior):
+ def processResponse(self, sensorInputs, recursiveInputs):
+ if recursiveInputs:
+ currRecLocs = recursiveInputs
+ else:
+ currRecLocs = [{'Location' : (5, 5), 'Color' : [255, 255, 255]}]
+
+ if sensorInputs: # if input exists, change location
+ ret = []
+ for currRecLoc in currRecLocs:
+ currDict = dict(currRecLoc)
+ for sensorInput in sensorInputs:
+ currDict['Location'] = (currDict['Location'][0] - sensorInput['x'] * self['XStep'], \
+ currDict['Location'][1] + sensorInput['y'] * self['YStep'])
+ currDict['Color'] = [sensorInput['r'], sensorInput['g'], sensorInput['b']]
+ ret.append(currDict)
+ #print ret
+ return (ret, ret)
+
+ else: # if not, return current recursive location.
+ #print currRecLocs
+ return (currRecLocs, currRecLocs)
diff --git a/config/6thFloor.xml b/config/6thFloor.xml
index 3f734d9..c98486a 100644
--- a/config/6thFloor.xml
+++ b/config/6thFloor.xml
@@ -7,7 +7,6 @@
</InstallationConfiguration>
<PixelConfiguration>
<InheritsFrom>layouts/60StripLayout.xml</InheritsFrom>
- <!--<InheritsFrom>layouts/BasicSixStrip.xml</InheritsFrom-->
</PixelConfiguration>
<PixelMapperConfiguration>
<PixelMapper>
@@ -29,9 +28,9 @@
</PixelMapper>
</PixelMapperConfiguration>
<RendererConfiguration>
- <Renderer>
+ <!--Renderer>
<InheritsFrom>renderers/60StripSeq.xml</InheritsFrom>
- </Renderer>
+ </Renderer-->
<Renderer>
<InheritsFrom>renderers/Pygame.xml</InheritsFrom>
</Renderer>
@@ -44,6 +43,14 @@
<RefreshInterval>10</RefreshInterval>
</Args>
</InputElement>
+ <InputElement>
+ <Class>inputs.UDPInput</Class>
+ <Args>
+ <Id>udp</Id>
+ <Port>3344</Port>
+ <RefreshInterval>50</RefreshInterval>
+ </Args>
+ </InputElement>
<!--<InputElement>
<Class>inputs.TCPInput</Class>
<Args>
@@ -71,11 +78,27 @@
<RenderToScreen>False</RenderToScreen>
</Args>
</Behavior>
+ <Behavior Id="dim">
+ <InheritsFrom>behaviors/DimColor.xml</InheritsFrom>
+ </Behavior>
+ <Behavior>
+ <Class>behaviors.Expand</Class>
+ <Args>
+ <Id>expand</Id>
+ <ExpandRate>1</ExpandRate>
+ </Args>
+ </Behavior>
<Behavior Id="redshift">
<InheritsFrom>behaviors/RedShift.xml</InheritsFrom>
</Behavior>
<Behavior Id="colorchange">
<InheritsFrom>behaviors/RandomColor.xml</InheritsFrom>
+ <Args>
+ <ColorList>
+ <Val>(255,0,0)</Val>
+ <Val>(0,0,255)</Val>
+ </ColorList>
+ </Args>
</Behavior>
<Behavior Id="decay">
<InheritsFrom>behaviors/PixelDecay.xml</InheritsFrom>
@@ -129,7 +152,17 @@
<Behavior>
<Class>behaviors.BehaviorChain</Class>
<Args>
- <Id>xymover</Id>
+ <Id>expanddie</Id>
+ <ChainedBehaviors>
+ <Id>expand</Id>
+ <Id>dim</Id>
+ </ChainedBehaviors>
+ </Args>
+ </Behavior>
+ <Behavior>
+ <Class>behaviors.BehaviorChain</Class>
+ <Args>
+ <Id>inpexpanddim</Id>
<Inputs>
<Id>pygame</Id>
</Inputs>
@@ -150,6 +183,7 @@
<z-index>0</z-index>
<Inputs>
<Id>pygame</Id>
+ <Id>udp</Id>
</Inputs>
</Args>
</Behavior>
@@ -166,12 +200,6 @@
<Width>20</Width>
</Args>
</Behavior>
- <Behavior>
- <Class>behaviors.AllPixels</Class>
- <Args>
- <Id>allpixels</Id>
- </Args>
- </Behavior>
<Behavior Id="recursivedecay">
<InheritsFrom>behaviors/LoopAndDie.xml</InheritsFrom>
<Args>
@@ -258,7 +286,6 @@
</Inputs>
<ChainedBehaviors>
<Id>echo</Id>
- <Id>redshift</Id>
<Id>square</Id>
<Id>singleframe</Id>
</ChainedBehaviors>
diff --git a/config/MobileTest.xml b/config/MobileTest.xml
new file mode 100644
index 0000000..a318069
--- /dev/null
+++ b/config/MobileTest.xml
@@ -0,0 +1,230 @@
+<!---All configuration items contain a "Class" tag specifying the python class they represent, and an "Args" tag specifying the args to be passed in.-->
+<LightInstallation>
+ <InstallationConfiguration>
+ <Defaults>
+ <PixelMapper>simplemap</PixelMapper>
+ </Defaults>
+ </InstallationConfiguration>
+ <PixelConfiguration>
+ <InheritsFrom>layouts/60StripLayout.xml</InheritsFrom>
+ </PixelConfiguration>
+ <PixelMapperConfiguration>
+ <PixelMapper>
+ <Class>pixelmappers.SimpleMapper</Class>
+ <Args>
+ <Id>simplemap</Id>
+ <CutoffDist>20</CutoffDist>
+ </Args>
+ </PixelMapper>
+ <PixelMapper>
+ <Class>pixelmappers.GaussianMapper</Class>
+ <Args>
+ <Id>gaussmap</Id>
+ <CutoffDist>30</CutoffDist>
+ <MinWeight>0.1</MinWeight>
+ <Width>10</Width>
+ <Height>1</Height>
+ </Args>
+ </PixelMapper>
+ </PixelMapperConfiguration>
+ <RendererConfiguration>
+ <Renderer>
+ <InheritsFrom>renderers/60StripSeq.xml</InheritsFrom>
+ </Renderer>
+ <Renderer>
+ <InheritsFrom>renderers/Pygame.xml</InheritsFrom>
+ </Renderer>
+ </RendererConfiguration>
+ <InputConfiguration>
+ <InputElement>
+ <Class>inputs.PygameInput</Class>
+ <Args><!--Passed as a dictionary-->
+ <Id>pygame</Id>
+ <RefreshInterval>10</RefreshInterval>
+ </Args>
+ </InputElement>
+ <InputElement>
+ <Class>inputs.TCPInput</Class>
+ <Args>
+ <Id>tcp</Id>
+ <Port>20120</Port>
+ <RefreshInterval>50</RefreshInterval>
+ </Args>
+ </InputElement>
+ <InputElement Id="followmouse">
+ <InheritsFrom>inputs/MouseFollower.xml</InheritsFrom>
+ </InputElement>
+ <InputElement>
+ <Class>inputs.RandomLocs</Class>
+ <Args>
+ <Id>randomLoc</Id>
+ </Args>
+ </InputElement>
+ </InputConfiguration>
+ <BehaviorConfiguration>
+ <Behavior>
+ <Class>behaviors.EchoBehavior</Class>
+ <Args>
+ <Id>echo</Id>
+ <z-index>0</z-index>
+ <RenderToScreen>False</RenderToScreen>
+ </Args>
+ </Behavior>
+ <Behavior Id="redshift">
+ <InheritsFrom>behaviors/RedShift.xml</InheritsFrom>
+ </Behavior>
+ <Behavior Id="colorchange">
+ <InheritsFrom>behaviors/RandomColor.xml</InheritsFrom>
+ </Behavior>
+ <Behavior Id="decay">
+ <InheritsFrom>behaviors/PixelDecay.xml</InheritsFrom>
+ </Behavior>
+ <Behavior Id="slowdecay">
+ <InheritsFrom>behaviors/PixelDecay.xml</InheritsFrom>
+ <Args>
+ <Coefficient>.01</Coefficient>
+ </Args>
+ </Behavior>
+ <Behavior>
+ <Class>behaviors.DebugBehavior</Class>
+ <Args>
+ <Id>debug</Id>
+ <z-index>0</z-index>
+ <Inputs>
+ <Id>pygame</Id>
+ </Inputs>
+ </Args>
+ </Behavior>
+ <Behavior>
+ <Class>behaviors.AllPixelsLeft</Class>
+ <Args>
+ <Id>pixelsleft</Id>
+ </Args>
+ </Behavior>
+ <Behavior>
+ <Class>behaviors.Square</Class>
+ <Args>
+ <Id>square</Id>
+ <Width>20</Width>
+ </Args>
+ </Behavior>
+ <Behavior Id="recursivedecay">
+ <InheritsFrom>behaviors/LoopAndDie.xml</InheritsFrom>
+ <Args>
+ <InitialResponseCount>50</InitialResponseCount>
+ </Args>
+ </Behavior>
+ <Behavior>
+ <Class>behaviors.BehaviorChain</Class>
+ <Args>
+ <Id>runcolordecay</Id>
+ <Inputs>
+ <Id>pygame</Id>
+ </Inputs>
+ <ChainedBehaviors>
+ <Id>colorchange</Id>
+ <Id>running</Id>
+ <Id>decay</Id>
+ </ChainedBehaviors>
+ <RecursiveHooks>{'running':'acceleratedie'}</RecursiveHooks>
+ <RenderToScreen>True</RenderToScreen>
+ <Mapper>gaussmap</Mapper>
+ </Args>
+ </Behavior>
+ <Behavior>
+ <Class>behaviors.BehaviorChain</Class>
+ <Args>
+ <Id>randomwalk</Id>
+ <Inputs>
+ <Id>pygame</Id>
+ </Inputs>
+ <ChainedBehaviors>
+ <Id>colorchange</Id>
+ <Id>mover</Id>
+ <Id>decay</Id>
+ </ChainedBehaviors>
+ <RecursiveHooks>{'mover':'redwalk'}</RecursiveHooks>
+ <RenderToScreen>True</RenderToScreen>
+ <Mapper>gaussmap</Mapper>
+ </Args>
+ </Behavior>
+ <Behavior>
+ <Class>behaviors.ResponseMover</Class>
+ <Args>
+ <Id>mover</Id>
+ </Args>
+ </Behavior>
+ <Behavior>
+ <Class>behaviors.BehaviorChain</Class>
+ <Args>
+ <Id>redwalk</Id>
+ <ChainedBehaviors>
+ <Id>randmovement</Id>
+ <Id>redshift</Id>
+ </ChainedBehaviors>
+ </Args>
+ </Behavior>
+ <Behavior>
+ <Class>behaviors.RandomWalk</Class>
+ <Args>
+ <Id>randmovement</Id>
+ <StepSize>2</StepSize>
+ </Args>
+ </Behavior>
+ <Behavior Id="accelerate">
+ <InheritsFrom>behaviors/Accelerate.xml</InheritsFrom>
+ </Behavior>
+ <Behavior>
+ <Class>behaviors.BehaviorChain</Class>
+ <Args>
+ <Id>acceleratedie</Id>
+ <ChainedBehaviors>
+ <Id>accelerate</Id>
+ <Id>recursivedecay</Id>
+ </ChainedBehaviors>
+ </Args>
+ </Behavior>
+ <Behavior>
+ <Class>behaviors.BehaviorChain</Class>
+ <Args>
+ <Id>mousechaser</Id>
+ <Inputs>
+ <Id>followmouse</Id>
+ </Inputs>
+ <ChainedBehaviors>
+ <Id>echo</Id>
+ <Id>redshift</Id>
+ <Id>square</Id>
+ <Id>slowdecay</Id>
+ </ChainedBehaviors>
+ <RenderToScreen>True</RenderToScreen>
+ </Args>
+ </Behavior>
+ <Behavior Id="running">
+ <InheritsFrom>behaviors/RunningBehavior.xml</InheritsFrom>
+ </Behavior>
+ <Behavior>
+ <Class>behaviors.MoveBehavior</Class>
+ <Args>
+ <Id>move</Id>
+ <XStep>5</XStep>
+ <YStep>5</YStep>
+ </Args>
+ </Behavior>
+ <Behavior>
+ <Class>behaviors.BehaviorChain</Class>
+ <Args>
+ <Id>moveanddecay</Id>
+ <Inputs>
+ <Id>tcp</Id>
+ </Inputs>
+ <ChainedBehaviors>
+ <Id>move</Id>
+ <Id>decay</Id>
+ </ChainedBehaviors>
+ <RenderToScreen>True</RenderToScreen>
+ <Mapper>gaussmap</Mapper>
+ </Args>
+ </Behavior>
+ </BehaviorConfiguration>
+</LightInstallation>
diff --git a/inputs/TCPInput.py b/inputs/TCPInput.py
index 5bf06bf..2bc69ef 100644
--- a/inputs/TCPInput.py
+++ b/inputs/TCPInput.py
@@ -3,6 +3,8 @@ import pdb
from operationscore.Input import *
import socket, json, time
import logging as main_log
+import string
+
class TCPInput(Input):
def inputInit(self):
self.HOST = '' # Symbolic name meaning all available interfaces
@@ -22,7 +24,9 @@ class TCPInput(Input):
if not data or 'end' in data: # data end, close socket
main_log.debug('End in data')
+ print 'end of stream'
self.IS_RESPONDING = 0
+ self.conn.close()
self.sock.close()
if self.IS_RESPONDING == 1: # if 'responding', respond to the received data
@@ -30,20 +34,21 @@ class TCPInput(Input):
for datagroup in data.split('\n'):
if datagroup != None and datagroup != '':
dataDict = json.loads(datagroup)
- # socketDict = {'data':dataDict, 'address':self.address}
- socketDict = {Strings.LOCATION: (dataDict['x'], dataDict['y'])} # like PygameInput
- print 'input'
- self.respond(socketDict)
+ #print dataDict
+ self.respond(dataDict)
+ #socketDict = {'data':dataDict, 'address':self.address}
+ #socketDict = {Strings.LOCATION: (dataDict['x'], dataDict['y'])} # like PygameInput
+ #print 'input'
+ #self.respond(socketDict)
except Exception as exp:
print str(exp)
else:
# if not 'responding', don't respond to data and restart socket
# * an incomplete hack for now. will be changed if same-type-multi-Input is implemented.
- time.sleep(1)
+
+ self.IS_RESPONDING = 1
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.sock.bind((self.HOST, self.PORT))
self.sock.listen(1)
(self.conn, self.address) = self.sock.accept()
- self.IS_RESPONDING = 1
-
diff --git a/inputs/UDPInput.py b/inputs/UDPInput.py
index 7d5609e..e95bd33 100644
--- a/inputs/UDPInput.py
+++ b/inputs/UDPInput.py
@@ -7,7 +7,7 @@ class UDPInput(Input):
self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
self.sock.bind((HOST, PORT))
def sensingLoop(self):
- (data,address) = self.sock.recvfrom(1024)
- dataDict = {'data':data, 'address':address}
- self.respond(dataDict)
+ (data,address) = self.sock.recvfrom(1024)
+ dataDict = {'data':data, 'address':address}
+ self.respond(dataDict)
diff --git a/operationscore/PixelEvent.py b/operationscore/PixelEvent.py
index 80d3b9e..c41df17 100644
--- a/operationscore/PixelEvent.py
+++ b/operationscore/PixelEvent.py
@@ -26,5 +26,6 @@ class PixelEvent(SmootCoreObject):
color = responseDict['Color']
else:
raise Exception('Need Color. Probably')
+ pdb.set_trace()
responseDict['PixelEvent'] = StepEvent.generate(300, color)
diff --git a/pixelcore/Pixel.py b/pixelcore/Pixel.py
index 1fbea2c..2f21fd8 100644
--- a/pixelcore/Pixel.py
+++ b/pixelcore/Pixel.py
@@ -13,7 +13,7 @@ class Pixel:
def __init__(self, location):
self.location = location
- self.events = {}
+ self.events = []
self.lastRenderTime = timeops.time()
self.lastRender = (0,0,0)
@@ -30,38 +30,45 @@ class Pixel:
#Add a pixelEvent to the list of active events
def processInput(self,pixelEvent,zindex, scale=1,currentTime=None): #consider migrating arg to dict
+ #TODO: fix for multiple pixel events
if currentTime == None:
currentTime = timeops.time()
- self.events[currentTime] = (zindex,scale, pixelEvent)
-
+ #if not currentTime in self.events:
+ # self.events[currentTime] = []
+ #self.events[currentTime].append((zindex,scale, pixelEvent))
+ self.events.append((currentTime, zindex, scale, pixelEvent)) #TODO: this is kindof
+ #gross
def clearAllEvents(self):
- self.events = {}
+ self.events = []
#Combines all PixelEvents currently active and computes the current color of
#the pixel.
def state(self, currentTime=timeops.time()): #TODO: this only evaluates at import time, I think
if currentTime-self.lastRenderTime < 5:
return self.lastRender
- if self.events == {}:
+ if self.events == []:
self.lastRenderTime = currentTime
return (0,0,0)
deadEvents = []
resultingColor = (0,0,0)
colors = []
- for eventTime in self.events: #TODO: right color weighting code
- (zindex,scale,event) = self.events[eventTime]
- eventResult = event.state(currentTime-eventTime)
+ for eventObj in self.events: #TODO: right color weighting code
+ if len(self.events) > 50:
+ pdb.set_trace()
+ #TODO: this sucks. fix it
+ eventTime, zindex, scale, pixelEvent = eventObj
+ eventResult = pixelEvent.state(currentTime-eventTime)
if eventResult != None:
scaledEvent = color.multiplyColor(eventResult,scale)
if (scaledEvent[0] + scaledEvent[1] + scaledEvent[2]) < 5:
- deadEvents.append(eventTime)
+ deadEvents.append(eventObj)
else:
colors.append(scaledEvent)
else:
- deadEvents.append(eventTime)
+ deadEvents.append(eventObj)
resultingColor = color.combineColors(colors)
- [self.events.pop(event) for event in deadEvents]
+ [self.events.remove(event) for event in deadEvents]
resultingColor = [int(round(c)) for c in resultingColor]
self.lastRender = tuple(resultingColor)
self.lastRenderTime = currentTime
diff --git a/pixelcore/Screen.py b/pixelcore/Screen.py
index a6fc8c4..b595847 100644
--- a/pixelcore/Screen.py
+++ b/pixelcore/Screen.py
@@ -19,25 +19,28 @@ class Screen:
self.xSortedPixels = []
self.xPixelLocs = []
sizeValid = False
-
+ self.pixelsSorted = False
def addStrip(self, lS):
self.pixelStrips.append(lS)
self.sizeValid = False #keep track of whether or not our screen size has
+ self.pixelsSorted = False
#been invalidated by adding more pixels
- self.computeXSortedPixels()
#Returns (pixelIndex, pixel). Does a binary search.
def pixelsInRange(self, minX, maxX):
+ if not self.pixelsSorted:
+ self.computeXSortedPixels()
minIndex = Search.find_ge(self.xPixelLocs, minX)
maxIndex = Search.find_le(self.xPixelLocs, maxX)+1
return self.xSortedPixels[minIndex:maxIndex]
def computeXSortedPixels(self):
+ self.xSortedPixels = []
for pixel in self:
self.xSortedPixels.append((pixel.location[0], pixel))
self.xSortedPixels.sort()
self.xPixelLocs = [p[0] for p in self.xSortedPixels]
-
+ self.pixelsSorted = True
#For debug only
def allOn(self):
[lS.allOn(-1) for lS in self.pixelStrips]
@@ -77,6 +80,7 @@ class Screen:
maxY = max(y, maxY)
self.size = (0,0, maxX, maxY)
self.sizeValid = True
+ print self.size
return (0, 0, maxX+100, maxY+100) #TODO: cleaner
#private
diff --git a/setup.sh b/setup.sh
index 8f5f6dc..8f5f6dc 100755..100644
--- a/setup.sh
+++ b/setup.sh