diff options
-rw-r--r-- | behaviors/Accelerate.xml | 2 | ||||
-rw-r--r-- | behaviors/Deccelerate.xml | 9 | ||||
-rw-r--r-- | behaviors/DimColor.xml | 2 | ||||
-rw-r--r-- | behaviors/Expand.py | 3 | ||||
-rw-r--r-- | behaviors/ExpandingColorZones.py | 20 | ||||
-rw-r--r-- | behaviors/MITDoors.py | 7 | ||||
-rw-r--r-- | behaviors/ResponseMover.py | 8 | ||||
-rwxr-xr-x | behaviors/SmootWind.py | 65 | ||||
-rw-r--r-- | behaviors/XYMove.py | 1 | ||||
-rw-r--r-- | config/6thFloor.xml | 2 | ||||
-rw-r--r-- | config/Demo.xml | 227 | ||||
-rw-r--r-- | config/Jennifer.xml | 128 | ||||
-rw-r--r-- | config/Kuan.xml | 99 | ||||
-rwxr-xr-x | config/SmootWindTest.xml | 339 | ||||
-rw-r--r-- | inputs/PygameInput.py | 2 | ||||
-rw-r--r-- | inputs/RandomLocs.py | 32 | ||||
-rw-r--r-- | pixelcore/Screen.py | 19 |
17 files changed, 726 insertions, 239 deletions
diff --git a/behaviors/Accelerate.xml b/behaviors/Accelerate.xml index f9de077..c78195b 100644 --- a/behaviors/Accelerate.xml +++ b/behaviors/Accelerate.xml @@ -3,6 +3,6 @@ <Args> <ParamType>Sensor</ParamType> <ParamName>StepSize</ParamName> - <ParamOp>{val}*1.1</ParamOp> + <ParamOp>{val}*1.01</ParamOp> </Args> </Behavior> diff --git a/behaviors/Deccelerate.xml b/behaviors/Deccelerate.xml new file mode 100644 index 0000000..e64e61d --- /dev/null +++ b/behaviors/Deccelerate.xml @@ -0,0 +1,9 @@ + +<Behavior> + <Class>behaviors.ModifyParam</Class> + <Args> + <ParamType>Sensor</ParamType> + <ParamName>StepSize</ParamName> + <ParamOp>{val}*.98</ParamOp> + </Args> +</Behavior> diff --git a/behaviors/DimColor.xml b/behaviors/DimColor.xml index 58b0673..ef98fee 100644 --- a/behaviors/DimColor.xml +++ b/behaviors/DimColor.xml @@ -3,6 +3,6 @@ <Args> <ParamType>Sensor</ParamType> <ParamName>Color</ParamName> - <ParamOp>[chan*.95 for chan in {val}]</ParamOp> + <ParamOp>[chan*.98 for chan in {val}]</ParamOp> </Args> </Behavior> diff --git a/behaviors/Expand.py b/behaviors/Expand.py index 323e71f..f017c16 100644 --- a/behaviors/Expand.py +++ b/behaviors/Expand.py @@ -15,7 +15,8 @@ class Expand(Behavior): data = dict(data) data['Left'] -= data['ExpandRate'] data['Right'] += data['ExpandRate'] - data['Location'] = "{x}>" + str(data['Left']) + ", {x}<" + str(data['Right']) + data['Location'] = "{x}>" + str(data['Left']) + ", {x}<" +\ + str(data['Right'])+", {y}<50" ret.append(data) return (ret, []) diff --git a/behaviors/ExpandingColorZones.py b/behaviors/ExpandingColorZones.py new file mode 100644 index 0000000..345851e --- /dev/null +++ b/behaviors/ExpandingColorZones.py @@ -0,0 +1,20 @@ +from operationscore.Behavior import * +from logger import main_log +class ExpandingColorZones(Behavior): + def behaviorInit(self): + self.mapping = {'r':[(132,0),(255,0,0)], 'g':[(400,0), (0,255,0)], + 'b':[(668,0), + (0,0,255)]} + self.mappingkey = 'KeyChar' + def processResponse(self, sensorInputs, recursiveInputs): + ret = [] + for data in sensorInputs: + data = dict(data) + if self.mappingkey in data: + try: + data['Location'], data['Color'] =\ + self.mapping[data[self.mappingkey]] + ret.append(data) + except: + main_log.warn('Bad mapping key. Expanding Color Zones.') + return (ret,[]) diff --git a/behaviors/MITDoors.py b/behaviors/MITDoors.py index d602a55..03bef6d 100644 --- a/behaviors/MITDoors.py +++ b/behaviors/MITDoors.py @@ -1,4 +1,6 @@ from operationscore.Behavior import * +import math +import util.ComponentRegistry as compReg class MITDoors(Behavior): """MITDoors is a case-specific behavior to map keypresses to specific locations. Written for Kuan 1/26/11 by RCOH""" @@ -6,6 +8,11 @@ class MITDoors(Behavior): def behaviorInit(self): self.keymapping = {'q':[2,19], 'w':[22,36], 'e':[37,49], 'r':[52,69], 't':[76,91], 'y':[94,105], 'u':[106,117], 'i':[123,154], 'o':[158,161], 'p':[164,167], '[':[172,184]} + screenWidth = compReg.getComponent('Screen').getSize()[2] #(minx, miny,maxx, maxy) + maxKey = max([max(self.keymapping[v]) for v in self.keymapping]) + mult = screenWidth / float(maxKey) + for k in self.keymapping: + self.keymapping[k] = [int(val*mult) for val in self.keymapping[k]] def processResponse(self, sensorInputs, recursiveInputs): ret = [] for data in sensorInputs: diff --git a/behaviors/ResponseMover.py b/behaviors/ResponseMover.py index 59e353a..3d559df 100644 --- a/behaviors/ResponseMover.py +++ b/behaviors/ResponseMover.py @@ -7,11 +7,5 @@ class ResponseMover(Behavior): modulates the location.""" def processResponse(self, sensorInputs, recursiveInputs): - newResponses = sensorInputs - ret = [] - for recurInput in recursiveInputs: - outDict = dict(recurInput) - ret.append(outDict) - ret += newResponses - return (ret, ret) + return (recursiveInputs, recursiveInputs+sensorInputs) diff --git a/behaviors/SmootWind.py b/behaviors/SmootWind.py index bf05ab2..347e2fc 100755 --- a/behaviors/SmootWind.py +++ b/behaviors/SmootWind.py @@ -1,32 +1,33 @@ -from operationscore.Behavior import * -import util.ComponentRegistry as compReg - -class SmootWind(Behavior): - def behaviorInit(self): - self.mapper = None - self.xFor = None - - def processResponse(self, sensorInputs, recursiveInputs): - if self.mapper == None: - try: - self.mapper = compReg.getComponent('windgaussmap') - except KeyError: - pass - if self.xFor == None: - try: - self.xFor = compReg.getComponent('xfor') - except KeyError: - pass - - for sensory in sensorInputs: - #print sensory - # input[0] is windspeed, [1] is dir - windSpeed = sensory[0] - windDir = sensory[1] - - #print self.mapper.argDict - self.mapper.argDict['Width'] = float(windSpeed) ** 3 - self.xFor.argDict['ParamOp'] = float(windSpeed) ** 2 - #print 'Width: ' + str(self.mapper.argDict['Width']) - #print 'xFor: ' + str(self.xFor.argDict['ParamOp']) - return (sensorInputs, recursiveInputs) +from operationscore.Behavior import *
+import util.ComponentRegistry as compReg
+import random
+
+class SmootWind(Behavior):
+ def behaviorInit(self):
+ self.mapper = None
+ self.xFor = None
+
+ def processResponse(self, sensorInputs, recursiveInputs):
+ if self.mapper == None:
+ try:
+ self.mapper = compReg.getComponent('windgaussmap')
+ except KeyError:
+ pass
+ if self.xFor == None:
+ try:
+ self.xFor = compReg.getComponent('xfor')
+ except KeyError:
+ pass
+
+ for sensory in sensorInputs:
+ print sensory
+ # input[0] is windspeed, [1] is dir
+ windSpeed = sensory[0]
+ windDir = sensory[1]
+
+ #print self.mapper.argDict
+ self.mapper.argDict['Width'] = float(windSpeed)*2+20
+ self.xFor.argDict['ParamOp'] = float(windSpeed)*3+10*random.random();
+ #print 'Width: ' + str(self.mapper.argDict['Width'])
+ #print 'xFor: ' + str(self.xFor.argDict['ParamOp'])
+ return (sensorInputs, recursiveInputs)
diff --git a/behaviors/XYMove.py b/behaviors/XYMove.py index 44a93bb..11cee96 100644 --- a/behaviors/XYMove.py +++ b/behaviors/XYMove.py @@ -13,7 +13,6 @@ class XYMove(Behavior): for loc in sensor: oploc = dict(loc) self.insertStepIfMissing(oploc) - #print oploc['YStep'] oploc['Location'] = Geo.addLocations((oploc['XStep'], oploc['YStep']), oploc['Location']) ret.append(oploc) return (ret, []) diff --git a/config/6thFloor.xml b/config/6thFloor.xml index 81f0c9f..ef195ec 100644 --- a/config/6thFloor.xml +++ b/config/6thFloor.xml @@ -186,7 +186,7 @@ <Behavior> <Class>behaviors.BehaviorChain</Class> <Args> - <Id>inpexpanddim</Id> + <Id>doors</Id> <Inputs> <Id>pygamekey</Id> </Inputs> diff --git a/config/Demo.xml b/config/Demo.xml new file mode 100644 index 0000000..525e468 --- /dev/null +++ b/config/Demo.xml @@ -0,0 +1,227 @@ +<!---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> + <Id>pygameclick</Id> + <RefreshInterval>10</RefreshInterval> + <Clicks>True</Clicks> + </Args> + </InputElement> + <InputElement> + <Class>inputs.PygameInput</Class> + <Args> + <Id>pygamekey</Id> + <RefreshInterval>10</RefreshInterval> + <Keyboard>True</Keyboard> + </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> + <Id>tcp</Id> + <Port>20120</Port> + <RefreshInterval>10</RefreshInterval> + </Args> + </InputElement>--> + <InputElement Id="followmouse"> + <InheritsFrom>inputs/MouseFollower.xml</InheritsFrom> + </InputElement> + </InputConfiguration> + <BehaviorConfiguration> + <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> + </Behavior> + <Behavior Id="singleframe"> + <InheritsFrom>behaviors/SingleFrame.xml</InheritsFrom> + </Behavior> + <Behavior Id="slowdecay"> + <InheritsFrom>behaviors/PixelDecay.xml</InheritsFrom> + <Args> + <Coefficient>.01</Coefficient> + </Args> + </Behavior> + <Behavior> + <Class>behaviors.XYMove</Class> + <Args> + <Id>xymove</Id> + <XStep>5</XStep> + <YStep>2</YStep> + </Args> + </Behavior> + <Behavior> + <Class>behaviors.RestrictLocation</Class> + <Args> + <Id>xbounce</Id> + <Action>{val}*-1</Action> + <ParamName>XStep</ParamName> + <LocationRestriction>{x}<0 or {x}>800</LocationRestriction> + </Args> + </Behavior> + <Behavior> + <Class>behaviors.RestrictLocation</Class> + <Args> + <Id>ybounce</Id> + <Action>{val}*-1</Action> + <ParamName>YStep</ParamName> + <LocationRestriction>{y}<0 or {y}>200</LocationRestriction> + </Args> + </Behavior> + <Behavior> + <Class>behaviors.BehaviorChain</Class> + <Args> + <Id>movebounce</Id> + <ChainedBehaviors> + <Id>xymove</Id> + <Id>ybounce</Id> + <Id>xbounce</Id> + </ChainedBehaviors> + </Args> + </Behavior> + <Behavior> + <Class>behaviors.ModifyParam</Class> + <Args> + <Id>ysin</Id> + <ParamName>YStep</ParamName> + <ParamType>Sensor</ParamType> + <ParamOp>4*math.sin({x}/float(40))</ParamOp> + </Args> + </Behavior> + <Behavior> + <Class>behaviors.DebugBehavior</Class> + <Args> + <Id>debug</Id> + <z-index>0</z-index> + <Inputs> + <Id>pygamekey</Id> + <Id>udp</Id> + </Inputs> + </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>80</InitialResponseCount> + </Args> + </Behavior> + <Behavior> + <Class>behaviors.BehaviorChain</Class> + <Args> + <Id>runcolordecay</Id> + <Inputs> + <Id>pygameclick</Id> + </Inputs> + <ChainedBehaviors> + <Id>colorchange</Id> + <Id>mover</Id> + <Id>decay</Id> + </ChainedBehaviors> + <RecursiveHooks>{'mover':'movebounce'}</RecursiveHooks> + <RenderToScreen>True</RenderToScreen> + <Mapper>gaussmap</Mapper> + </Args> + </Behavior> + <Behavior> + <Class>behaviors.ResponseMover</Class> + <Args> + <Id>mover</Id> + </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.EchoBehavior</Class> + <Args> + <Id>echo</Id> + <z-index>0</z-index> + <RenderToScreen>False</RenderToScreen> + </Args> + </Behavior> + <Behavior> + <Class>behaviors.BehaviorChain</Class> + <Args> + <Id>mousechaser</Id> + <Inputs> + <Id>followmouse</Id> + </Inputs> + <ChainedBehaviors> + <Id>echo</Id> + <Id>square</Id> + <Id>singleframe</Id> + </ChainedBehaviors> + <RenderToScreen>True</RenderToScreen> + </Args> + </Behavior> + <Behavior Id="running"> + <InheritsFrom>behaviors/RunningBehavior.xml</InheritsFrom> + </Behavior> + </BehaviorConfiguration> +</LightInstallation> diff --git a/config/Jennifer.xml b/config/Jennifer.xml new file mode 100644 index 0000000..e6cfc40 --- /dev/null +++ b/config/Jennifer.xml @@ -0,0 +1,128 @@ +<!---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> + </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>pygameclick</Id> + <RefreshInterval>10</RefreshInterval> + <Clicks>True</Clicks> + </Args> + </InputElement> + <InputElement> + <Class>inputs.PygameInput</Class> + <Args><!--Passed as a dictionary--> + <Id>pygamekey</Id> + <RefreshInterval>10</RefreshInterval> + <Keyboard>True</Keyboard> + </Args> + </InputElement> + <InputElement> + <Class>inputs.UDPInput</Class> + <Args> + <Id>udp</Id> + <Port>3344</Port> + <RefreshInterval>50</RefreshInterval> + </Args> + </InputElement> + </InputConfiguration> + <BehaviorConfiguration> + <Behavior Id="dim"> + <InheritsFrom>behaviors/DimColor.xml</InheritsFrom> + </Behavior> + <Behavior> + <Class>behaviors.Expand</Class> + <Args> + <Id>expand</Id> + <ExpandRate>8</ExpandRate> + </Args> + </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> + </Behavior> + <Behavior> + <Class>behaviors.BehaviorChain</Class> + <Args> + <Id>expanddie</Id> + <ChainedBehaviors> + <Id>expand</Id> + <Id>decexpand</Id> + <Id>dim</Id> + <Id>8sectimeout</Id> + </ChainedBehaviors> + </Args> + </Behavior> + <Behavior> + <Class>behaviors.ExpandingColorZones</Class> + <Args> + <Id>colorzones</Id> + </Args> + </Behavior> + <Behavior> + <Class>behaviors.BehaviorChain</Class> + <Args> + <Id>colorbars</Id> + <Inputs> + <Id>pygamekey</Id> + </Inputs> + <ChainedBehaviors> + <Id>colorzones</Id> + <Id>mover</Id> + <Id>decay</Id> + </ChainedBehaviors> + <RecursiveHooks>{'mover':'expanddie'}</RecursiveHooks> + <RenderToScreen>True</RenderToScreen> + </Args> + </Behavior> + <Behavior> + <Class>behaviors.Timeout</Class> + <Args> + <Id>8sectimeout</Id> + <Timeout>8000</Timeout> + </Args> + </Behavior> + <Behavior> + <Class>behaviors.ResponseMover</Class> + <Args> + <Id>mover</Id> + </Args> + </Behavior> + <Behavior Id="decexpand" ParamName="ExpandRate"> + <InheritsFrom>behaviors/Deccelerate.xml</InheritsFrom> + </Behavior> + </BehaviorConfiguration> +</LightInstallation> diff --git a/config/Kuan.xml b/config/Kuan.xml new file mode 100644 index 0000000..c85cb75 --- /dev/null +++ b/config/Kuan.xml @@ -0,0 +1,99 @@ +<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> + </PixelMapperConfiguration> + <RendererConfiguration> + <Renderer> + <InheritsFrom>renderers/60StripSeq.xml</InheritsFrom> + </Renderer> + <Renderer> + <InheritsFrom>renderers/Pygame.xml</InheritsFrom> + </Renderer> + </RendererConfiguration> + <InputConfiguration> + <InputElement> + <Class>inputs.PygameInput</Class> + <Args> + <Id>pygamekey</Id> + <RefreshInterval>10</RefreshInterval> + <Keyboard>True</Keyboard> + </Args> + </InputElement> + </InputConfiguration> + <BehaviorConfiguration> + <Behavior Id="risefall" MaxHeight="200"> + <InheritsFrom>behaviors/RiseFall.xml</InheritsFrom> + </Behavior> + <Behavior Id="dim"> + <InheritsFrom>behaviors/DimColor.xml</InheritsFrom> + </Behavior> + <Behavior Id="colorchange"> + <InheritsFrom>behaviors/RandomColor.xml</InheritsFrom> + </Behavior> + <Behavior Id="decay"> + <InheritsFrom>behaviors/PixelDecay.xml</InheritsFrom> + </Behavior> + <Behavior> + <Class>behaviors.BehaviorChain</Class> + <Args> + <Id>risefalldie</Id> + <ChainedBehaviors> + <Id>risefall</Id> + <Id>2sec</Id> + <Id>dim</Id> + </ChainedBehaviors> + </Args> + </Behavior> + <Behavior> + <Class>behaviors.BehaviorChain</Class> + <Args> + <Id>doors</Id> + <Inputs> + <Id>pygamekey</Id> + </Inputs> + <ChainedBehaviors> + <Id>mitdoors</Id> + <Id>colorchange</Id> + <Id>mover</Id> + <Id>decay</Id> + </ChainedBehaviors> + <RecursiveHooks>{'mover':'risefalldie'}</RecursiveHooks> + <RenderToScreen>True</RenderToScreen> + </Args> + </Behavior> + <Behavior> + <Class>behaviors.Timeout</Class> + <Args> + <Id>2sec</Id> + <Timeout>2000</Timeout> + </Args> + </Behavior> + <Behavior> + <Class>behaviors.MITDoors</Class> + <Args> + <Id>mitdoors</Id> + <Bottom>200</Bottom> + </Args> + </Behavior> + <Behavior> + <Class>behaviors.ResponseMover</Class> + <Args> + <Id>mover</Id> + </Args> + </Behavior> + </BehaviorConfiguration> +</LightInstallation> diff --git a/config/SmootWindTest.xml b/config/SmootWindTest.xml index a494720..6b74450 100755 --- a/config/SmootWindTest.xml +++ b/config/SmootWindTest.xml @@ -1,166 +1,173 @@ -<!---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> - <!--<InheritsFrom>layouts/BasicSixStrip.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>10</CutoffDist> - <MinWeight>0.1</MinWeight> - <Width>10</Width> - <Height>5</Height> - </Args> - </PixelMapper> - <PixelMapper> - <Class>pixelmappers.WindGaussianMapper</Class> - <Args> - <Id>windgaussmap</Id> - <CutoffDist>150</CutoffDist> - <MinWeight>0.005</MinWeight> - <Width>30</Width> - <Height>10</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>1</RefreshInterval> - </Args> - </InputElement> - <InputElement> - <Class>inputs.HTMLInput</Class> - <Args> - <Id>weatherinput</Id> - <Src>'http://sailing.mit.edu/weather/'</Src> - <!--<Regex>'rtWindSpeed = (\d+).*rtWindDir = (\d+)'</Regex>--> - <Regex>'rtWindSpeed = (\d+).*\s.*\s.*rtWindDir = (\d+)'</Regex> - <!--<RefreshInterval>60000</RefreshInterval>--> - </Args> - </InputElement> - <InputElement> - <Class>inputs.RandomLocs</Class> - <Args> - <Id>randomLoc</Id> - </Args> - </InputElement> - </InputConfiguration> - <BehaviorConfiguration> - <Behavior Id="colorchange"> - <InheritsFrom>behaviors/RandomColor.xml</InheritsFrom> - </Behavior> - <Behavior Id="staticcolor"> - <InheritsFrom>behaviors/RandomColor.xml</InheritsFrom> - <Args> - <ColorList> - <Val>(100,200,255)</Val> - <Val>(50,200,255)</Val> - <Val>(0,200,255)</Val> - <Val>(0,150,255)</Val> - </ColorList> - </Args> - </Behavior> - <Behavior Id="decay"> - <InheritsFrom>behaviors/PixelDecay.xml</InheritsFrom> - </Behavior> - <Behavior> - <Class>behaviors.XYMove</Class> - <Args> - <Id>xymove</Id> - <XStep>0</XStep> - <YStep>0</YStep> - </Args> - </Behavior> - <Behavior> - <Class>behaviors.BehaviorChain</Class> - <Args> - <Id>movebounce</Id> - <ChainedBehaviors> - <Id>xymove</Id> - <Id>yfor</Id> - <Id>xfor</Id> - </ChainedBehaviors> - </Args> - </Behavior> - <Behavior> - <Class>behaviors.ModifyParam</Class> - <Args> - <Id>yfor</Id> - <ParamName>YStep</ParamName> - <ParamType>Sensor</ParamType> - <ParamOp>10*(2*math.sin({x}/float(100))+math.sin({x}/float(50)))</ParamOp> - </Args> - </Behavior> - - <Behavior> - <Class>behaviors.ModifyParam</Class> - <Args> - <Id>xfor</Id> - <ParamName>XStep</ParamName> - <ParamType>Sensor</ParamType> - <!--<ParamOp>75</ParamOp>--> - <ParamOp>25</ParamOp> - </Args> - </Behavior> - - <Behavior> - <Class>behaviors.SmootWind</Class> - <Args> - <Id>smootwind</Id> - <Inputs> - <Id>weatherinput</Id> - </Inputs> - </Args> - </Behavior> - <Behavior> - <Class>behaviors.ResponseMover</Class> - <Args> - <Id>mover</Id> - </Args> - </Behavior> - <Behavior> - <Class>behaviors.BehaviorChain</Class> - <Args> - <Id>xymover</Id> - <Inputs> - <Id>pygame</Id> - <Id>randomLoc</Id> - </Inputs> - <ChainedBehaviors> - <Id>staticcolor</Id> - <Id>mover</Id> - <Id>decay</Id> - </ChainedBehaviors> - <RecursiveHooks>{'mover':'movebounce'}</RecursiveHooks> - <RenderToScreen>True</RenderToScreen> - <Mapper>windgaussmap</Mapper> - </Args> - </Behavior> - </BehaviorConfiguration> -</LightInstallation> +<!---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>10</CutoffDist>
+ <MinWeight>0.1</MinWeight>
+ <Width>10</Width>
+ <Height>5</Height>
+ </Args>
+ </PixelMapper>
+ <PixelMapper>
+ <Class>pixelmappers.WindGaussianMapper</Class>
+ <Args>
+ <Id>windgaussmap</Id>
+ <CutoffDist>150</CutoffDist>
+ <MinWeight>0.005</MinWeight>
+ <Width>30</Width>
+ <Height>10</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>1</RefreshInterval>
+ </Args>
+ </InputElement>
+ <InputElement>
+ <Class>inputs.HTMLInput</Class>
+ <Args>
+ <Id>weatherinput</Id>
+ <Src>'http://sailing.mit.edu/weather/'</Src>
+ <!--<Regex>'rtWindSpeed = (\d+).*rtWindDir = (\d+)'</Regex>-->
+ <Regex>'rtWindSpeed = (\d+).*\s.*\s.*rtWindDir = (\d+)'</Regex>
+ <!--<RefreshInterval>60000</RefreshInterval>-->
+ </Args>
+ </InputElement>
+ <InputElement>
+ <Class>inputs.RandomLocs</Class>
+ <Args>
+ <Id>randomLoc</Id>
+ </Args>
+ </InputElement>
+ </InputConfiguration>
+ <BehaviorConfiguration>
+ <Behavior Id="colorchange">
+ <InheritsFrom>behaviors/RandomColor.xml</InheritsFrom>
+ </Behavior>
+ <Behavior Id="staticcolor">
+ <InheritsFrom>behaviors/RandomColor.xml</InheritsFrom>
+ <Args>
+ <ColorList>
+ <Val>(100,200,255)</Val>
+ <Val>(50,200,255)</Val>
+ <Val>(0,200,255)</Val>
+ <Val>(0,150,255)</Val>
+ </ColorList>
+ </Args>
+ </Behavior>
+ <Behavior Id="decay">
+ <InheritsFrom>behaviors/PixelDecay.xml</InheritsFrom>
+ </Behavior>
+ <Behavior>
+ <Class>behaviors.XYMove</Class>
+ <Args>
+ <Id>xymove</Id>
+ <XStep>0</XStep>
+ <YStep>0</YStep>
+ </Args>
+ </Behavior>
+ <Behavior>
+ <Class>behaviors.BehaviorChain</Class>
+ <Args>
+ <Id>movebounce</Id>
+ <ChainedBehaviors>
+ <Id>xymove</Id>
+ <Id>yfor</Id>
+ <Id>xfor</Id>
+ <Id>20sectimeout</Id>
+ </ChainedBehaviors>
+ </Args>
+ </Behavior>
+ <Behavior>
+ <Class>behaviors.Timeout</Class>
+ <Args>
+ <Id>20sectimeout</Id>
+ <Timeout>20000</Timeout>
+ </Args>
+ </Behavior>
+ <Behavior>
+ <Class>behaviors.ModifyParam</Class>
+ <Args>
+ <Id>yfor</Id>
+ <ParamName>YStep</ParamName>
+ <ParamType>Sensor</ParamType>
+ <ParamOp>2*(2*math.sin({x}/float(100))+math.sin({x}/float(50)))</ParamOp>
+ </Args>
+ </Behavior>
+
+ <Behavior>
+ <Class>behaviors.ModifyParam</Class>
+ <Args>
+ <Id>xfor</Id>
+ <ParamName>XStep</ParamName>
+ <ParamType>Sensor</ParamType>
+ <!--<ParamOp>75</ParamOp>-->
+ <ParamOp>25</ParamOp>
+ </Args>
+ </Behavior>
+
+ <Behavior>
+ <Class>behaviors.SmootWind</Class>
+ <Args>
+ <Id>smootwind</Id>
+ <Inputs>
+ <Id>weatherinput</Id>
+ </Inputs>
+ </Args>
+ </Behavior>
+ <Behavior>
+ <Class>behaviors.ResponseMover</Class>
+ <Args>
+ <Id>mover</Id>
+ </Args>
+ </Behavior>
+ <Behavior>
+ <Class>behaviors.BehaviorChain</Class>
+ <Args>
+ <Id>xymover</Id>
+ <Inputs>
+ <Id>pygame</Id>
+ <Id>randomLoc</Id>
+ </Inputs>
+ <ChainedBehaviors>
+ <Id>staticcolor</Id>
+ <Id>mover</Id>
+ <Id>decay</Id>
+ </ChainedBehaviors>
+ <RecursiveHooks>{'mover':'movebounce'}</RecursiveHooks>
+ <RenderToScreen>True</RenderToScreen>
+ <Mapper>windgaussmap</Mapper>
+ </Args>
+ </Behavior>
+ </BehaviorConfiguration>
+</LightInstallation>
diff --git a/inputs/PygameInput.py b/inputs/PygameInput.py index 399a77e..18f463d 100644 --- a/inputs/PygameInput.py +++ b/inputs/PygameInput.py @@ -23,7 +23,7 @@ class PygameInput(Input): if event.key == 27: self.die() if self['Keyboard']: - self.respond({'Key': event.key}) + self.respond({'Key': event.key, 'KeyChar': chr(event.key)}) return else: pygame.event.post(event) diff --git a/inputs/RandomLocs.py b/inputs/RandomLocs.py index 2719981..f4182cf 100644 --- a/inputs/RandomLocs.py +++ b/inputs/RandomLocs.py @@ -1,16 +1,16 @@ -import util.TimeOps as clock -import random -import util.Geo as Geo -import util.Strings as Strings -from operationscore.Input import * -class RandomLocs(Input): - """RandomLocs is an Input that generates RandomLocations at a preset time interval. Just a - prototype, some assembly required.""" - - def inputInit(self): - self['LastEvent'] = clock.time() - def sensingLoop(self): #TODO: move to params - currentTime = clock.time() - if currentTime - self['LastEvent'] > 2000: - self.respond({Strings.LOCATION: Geo.randomLoc((50,50))}) - self['LastEvent'] = currentTime +import util.TimeOps as clock
+import random
+import util.Geo as Geo
+import util.Strings as Strings
+from operationscore.Input import *
+class RandomLocs(Input):
+ """RandomLocs is an Input that generates RandomLocations at a preset but randomly changing time interval. Just a
+ prototype, some assembly required."""
+
+ def inputInit(self):
+ self['LastEvent'] = clock.time()
+ def sensingLoop(self): #TODO: move to params
+ currentTime = clock.time()
+ if currentTime - self['LastEvent'] > 200+500*random.random():
+ self.respond({Strings.LOCATION: Geo.randomLoc((200,200))})
+ self['LastEvent'] = currentTime
diff --git a/pixelcore/Screen.py b/pixelcore/Screen.py index 9a81df7..ada8d4a 100644 --- a/pixelcore/Screen.py +++ b/pixelcore/Screen.py @@ -22,14 +22,14 @@ class Screen: sizeValid = False self.pixelsSorted = False - def addStrip(self, lS): - self.pixelStrips.append(lS) + def addStrip(self, strip): + self.pixelStrips.append(strip) self.sizeValid = False #keep track of whether or not our screen size has self.pixelsSorted = False #been invalidated by adding more pixels def pixelsInRange(self, minX, maxX): - """Returns (pixelIndex, pixel). Does a binary search.""" + """Returns (pixelIndex, pixel). Does a binary search. Sorts first if neccesary.""" if not self.pixelsSorted: self.computeXSortedPixels() minIndex = Search.find_ge(self.xPixelLocs, minX) @@ -48,12 +48,11 @@ class Screen: return itertools.chain(*[strip.__iter__() for strip in \ self.pixelStrips]) #the * operator breaks the list into args - #increment time -- This processes all queued responses. Responses generated - #during this period are added to the queue that will be processed on the next - #time step. #SUBVERTING DESIGN FOR EFFICIENCY 1/24/11, RCOH -- It would be cleaner to store the time on the responses #themselves, however, it is faster to just pass it in. def timeStep(self, currentTime=None): + """Increments time -- This processes all queued responses, adding that to a queue that will + be processed on the next time step.""" if currentTime == None: currentTime = timeops.time() tempQueue = list(self.responseQueue) @@ -66,6 +65,7 @@ class Screen: self.responseQueue.append(responseInfo) def getSize(self): + """Returns the size of the screen in the form: (minx, miny, maxx, maxy)""" if self.sizeValid: return self.size (minX, minY, maxX, maxY) = (sys.maxint,sys.maxint,-sys.maxint,-sys.maxint) @@ -79,24 +79,19 @@ 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 + return (0, 0, maxX, maxY) #private def processResponse(self, responseInfo, currentTime=None): #we need to make a new dict for #each to prevent interference - #[strip.respond(dict(responseInfo)) for strip in self.pixelStrips] if currentTime == None: currentTime = timeops.time() - print 'cachetime fail' if type(responseInfo) != type(dict()): pass if 'Mapper' in responseInfo: mapper = compReg.getComponent(responseInfo['Mapper']) else: mapper = compReg.getComponent(Strings.DEFAULT_MAPPER) - #if type(mapper) != type(PixelMapper): - # raise Exception('No default mapper specified.') pixelWeightList = mapper.mapEvent(responseInfo['Location'], self) main_log.debug('Screen processing response. ' + str(len(pixelWeightList)) + ' events\ generated') |