aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar rcoh <rcoh@mit.edu>2011-01-27 17:21:23 -0500
committerGravatar rcoh <rcoh@mit.edu>2011-01-27 17:21:23 -0500
commit890e167b2cd2a438f81a759833fc4f1c876c4142 (patch)
tree71b12f331fc7877d021f04c7abc231bbd853da98
parent5fb3ea060025241105dc8e9a174513c112f9a133 (diff)
parent51d58d511d474cb01339d504624b9418c75869e3 (diff)
Merge branch 'osc'
Conflicts: behaviors/Square.py pixelcore/PixelStrip.py
-rwxr-xr-x[-rw-r--r--]LightInstallation.py2
-rw-r--r--behaviors/MrmrSetColor.py21
-rw-r--r--behaviors/TouchOSC.py33
-rw-r--r--config/6thFloorOSC.xml286
-rw-r--r--config/osc.xml10
-rw-r--r--inputs/OSCInput.py22
-rwxr-xr-xoscserver.py36
-rw-r--r--pixelcore/PixelStrip.py4
-rwxr-xr-xtestosc.py36
9 files changed, 446 insertions, 4 deletions
diff --git a/LightInstallation.py b/LightInstallation.py
index ad1e38d..24ad8b1 100644..100755
--- a/LightInstallation.py
+++ b/LightInstallation.py
@@ -1,3 +1,5 @@
+#!/usr/bin/python
+
from xml.etree.ElementTree import ElementTree
from pixelcore.Screen import *
from pixelcore.PixelStrip import *
diff --git a/behaviors/MrmrSetColor.py b/behaviors/MrmrSetColor.py
new file mode 100644
index 0000000..97b9fb7
--- /dev/null
+++ b/behaviors/MrmrSetColor.py
@@ -0,0 +1,21 @@
+from operationscore.Behavior import *
+from logger import main_log
+#import util.ColorOps as color
+import colorsys
+import pdb
+class MrmrSetColor(Behavior):
+ def behaviorInit(self):
+ self.h=0
+ self.s=0
+ self.v=0
+ def processResponse(self, sensorInputs, recursiveInputs):
+ ret = []
+ for data in sensorInputs:
+ if data['Path'].find('horizontal') != -1:
+ self.h = data['Value'] / 2.78
+ elif data['Path'].find('vertical') != -1:
+ self.s = data['Value'] / 1000.0
+ else:
+ main_log.error('Sensor Inputs: ' + str(sensorInputs))
+ ret.append({'Color':[i*255 for i in colorsys.hsv_to_rgb(self.h,self.s,self.v)]})
+ return (ret, [])
diff --git a/behaviors/TouchOSC.py b/behaviors/TouchOSC.py
new file mode 100644
index 0000000..1c41b5e
--- /dev/null
+++ b/behaviors/TouchOSC.py
@@ -0,0 +1,33 @@
+from operationscore.Behavior import *
+from logger import main_log
+#import util.ColorOps as color
+import colorsys
+import pdb
+import util.ComponentRegistry as compReg
+class TouchOSC(Behavior):
+ def behaviorInit(self):
+ self.h=0
+ self.s=0
+ self.v=0
+ self.xy = (-1,-1)
+ def processResponse(self, sensorInputs, recursiveInputs):
+ ret = []
+ for data in sensorInputs:
+ if data['Path'] == '/1/fader1':
+ try:
+ self.h = data['Value'][0]*360.0
+ except:
+ pdb.set_trace()
+ elif data['Path'] == '/1/fader2':
+ self.s = data['Value'][0]
+ elif data['Path'] == '/1/fader3':
+ self.v = data['Value'][0]
+ elif data['Path'] == '/1/xy':
+ val=data['Value']
+ ssize = compReg.getComponent('Screen').getSize()[-2:] #896 x 310
+ self.xy = (val[1]*ssize[0], (1.0-val[0])*ssize[1])
+ else:
+ main_log.error('Sensor Inputs: ' + str(sensorInputs))
+ ret.append({'Color':[i*255 for i in colorsys.hsv_to_rgb(self.h,self.s,self.v)],'Location':self.xy})
+
+ return (ret, [])
diff --git a/config/6thFloorOSC.xml b/config/6thFloorOSC.xml
new file mode 100644
index 0000000..792fd0c
--- /dev/null
+++ b/config/6thFloorOSC.xml
@@ -0,0 +1,286 @@
+<!---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>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.OSCInput</Class>
+ <Args>
+ <Id>osc</Id>
+ <Port>12345</Port>
+ <RefreshInterval>10</RefreshInterval>
+ </Args>
+ </InputElement>
+ <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>10</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>
+ <Args>
+ <Id>touchosc</Id>
+ </Args>
+ <Class>behaviors.TouchOSC</Class>
+ </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="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}&lt;0 or {x}&gt;800</LocationRestriction>
+ </Args>
+ </Behavior>
+ <Behavior>
+ <Class>behaviors.RestrictLocation</Class>
+ <Args>
+ <Id>ybounce</Id>
+ <Action>{val}*-1</Action>
+ <ParamName>YStep</ParamName>
+ <LocationRestriction>{y}&lt;0 or {y}&gt;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.BehaviorChain</Class>
+ <Args>
+ <Id>xymover</Id>
+ <Inputs>
+ <Id>pygame</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.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>
+ <Class>behaviors.AllPixels</Class>
+ <Args>
+ <Id>allpixels</Id>
+ </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>False</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>False</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-->
+ <Id>tcp</Id>
+ <Id>osc</Id>
+ </Inputs>
+ <ChainedBehaviors>
+ <Id>touchosc</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/osc.xml b/config/osc.xml
new file mode 100644
index 0000000..6efea40
--- /dev/null
+++ b/config/osc.xml
@@ -0,0 +1,10 @@
+ <InputElement>
+ <Class>inputs.OSCInput</Class>
+ <Args>
+ <Id>osc</Id>
+ <Port>1234</Port>
+ </Args>
+ </InputElement>
+ <Behavior Id="mrmrcolor">
+ <Class>behaviors.MrmrSetColor</Class>
+ </Behavior>
diff --git a/inputs/OSCInput.py b/inputs/OSCInput.py
new file mode 100644
index 0000000..f867fb5
--- /dev/null
+++ b/inputs/OSCInput.py
@@ -0,0 +1,22 @@
+from operationscore.Input import *
+import liblo
+from logger import main_log
+
+
+class OSCInput(Input):
+ def inputInit(self):
+ HOST = '' # Symbolic name meaning all available interfaces
+ PORT = self['Port'] # Arbitrary non-privileged port
+ self.server = liblo.Server(PORT)
+ self.server.add_method(None,None, self.fallback)
+# except liblo.ServerError, err:
+ # main_log.error(str(err))
+
+ def fallback(self,path,args,types, src):
+ self.respond({'Path':path,'Type':types,'Value':args})
+ def sensingLoop(self):
+ self.server.recv(100)
+ pass#(data,address) = self.sock.recvfrom(1024)
+ #dataDict = {'data':data, 'address':address}
+ #self.respond(dataDict)
+
diff --git a/oscserver.py b/oscserver.py
new file mode 100755
index 0000000..6763f41
--- /dev/null
+++ b/oscserver.py
@@ -0,0 +1,36 @@
+#!/usr/bin/env python
+
+import liblo, sys
+
+# create server, listening on port 1234
+try:
+ server = liblo.Server(1234)
+except liblo.ServerError, err:
+ print str(err)
+ sys.exit()
+
+def foo_bar_callback(path, args):
+ i, f = args
+ print "received message '%s' with arguments '%d' and '%f'" % (path, i, f)
+
+def foo_baz_callback(path, args, types, src, data):
+ print "received message '%s'" % path
+ print "blob contains %d bytes, user data was '%s'" % (len(args[0]), data)
+
+def fallback(path, args, types, src):
+ print "got unknown message '%s' from '%s'" % (path, src.get_url())
+ for a, t in zip(args, types):
+ print "argument of type '%s': %s" % (t, a)
+
+# register method taking an int and a float
+server.add_method("/foo/bar", 'if', foo_bar_callback)
+
+# register method taking a blob, and passing user data to the callback
+server.add_method("/foo/baz", 'b', foo_baz_callback, "blah")
+
+# register a fallback for unhandled messages
+server.add_method(None, None, fallback)
+
+# loop and dispatch messages every 100ms
+while True:
+ server.recv(100)
diff --git a/pixelcore/PixelStrip.py b/pixelcore/PixelStrip.py
index 595ce72..29d3b31 100644
--- a/pixelcore/PixelStrip.py
+++ b/pixelcore/PixelStrip.py
@@ -17,8 +17,4 @@ class PixelStrip:
def __iter__(self):
return self.pixels.__iter__()
-
-
-
-
diff --git a/testosc.py b/testosc.py
new file mode 100755
index 0000000..cea03f4
--- /dev/null
+++ b/testosc.py
@@ -0,0 +1,36 @@
+#!/usr/bin/env python
+
+import liblo, sys
+
+# create server, listening on port 1234
+try:
+ server = liblo.Server(12345)
+except liblo.ServerError, err:
+ print str(err)
+ sys.exit()
+
+def foo_bar_callback(path, args):
+ i, f = args
+ print "received message '%s' with arguments '%d' and '%f'" % (path, i, f)
+
+def foo_baz_callback(path, args, types, src, data):
+ print "received message '%s'" % path
+ print "blob contains %d bytes, user data was '%s'" % (len(args[0]), data)
+
+def fallback(path, args, types, src):
+ print "got unknown message '%s' from '%s'" % (path, src.get_url())
+ for a, t in zip(args, types):
+ print "argument of type '%s': %s" % (t, a)
+
+# register method taking an int and a float
+server.add_method("/foo/bar", 'if', foo_bar_callback)
+
+# register method taking a blob, and passing user data to the callback
+server.add_method("/foo/baz", 'b', foo_baz_callback, "blah")
+
+# register a fallback for unhandled messages
+server.add_method(None, None, fallback)
+
+# loop and dispatch messages every 100ms
+while True:
+ server.recv(100)