diff options
author | Russell Cohen <rcoh@mit.edu> | 2011-01-26 22:24:55 -0500 |
---|---|---|
committer | Russell Cohen <rcoh@mit.edu> | 2011-01-26 22:24:55 -0500 |
commit | 5d29906fff79bc6e4ba83be7028e1380a0014d21 (patch) | |
tree | 0bb2350046aa69c3b1095983fea59c49026a857b | |
parent | 2019fb2895237aa9d86450daaf6d90831189fc13 (diff) | |
parent | 82f99fc4583ca3cc9861a9fe30990a4a9ef162c4 (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.py | 2 | ||||
-rw-r--r-- | behaviors/DimColor.xml | 8 | ||||
-rw-r--r-- | behaviors/DoorBehavior.py | 4 | ||||
-rw-r--r-- | behaviors/Expand.py | 17 | ||||
-rw-r--r-- | behaviors/MoveBehavior.py | 27 | ||||
-rw-r--r-- | config/6thFloor.xml | 49 | ||||
-rw-r--r-- | config/MobileTest.xml | 230 | ||||
-rw-r--r-- | inputs/TCPInput.py | 19 | ||||
-rw-r--r-- | inputs/UDPInput.py | 6 | ||||
-rw-r--r-- | operationscore/PixelEvent.py | 1 | ||||
-rw-r--r-- | pixelcore/Pixel.py | 29 | ||||
-rw-r--r-- | pixelcore/Screen.py | 10 | ||||
-rw-r--r--[-rwxr-xr-x] | setup.sh | 0 |
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 |