From 6341992254c837b1d814b3eaa24b2ab3e729c8e2 Mon Sep 17 00:00:00 2001 From: eugue Date: Thu, 27 Jan 2011 20:27:12 -0500 Subject: Added HTMLInput, SmootWind behavior, and a config file for testing. --- behaviors/SmootWind.py | 32 +++++++ behaviors/XYMove.py | 2 +- config/HTMLTest.xml | 58 +++++++++++++ config/SmootWindTest.xml | 166 +++++++++++++++++++++++++++++++++++++ inputs/HTMLInput.py | 29 +++++++ pixelmappers/WindGaussianMapper.py | 18 ++++ util/Geo.py | 6 ++ 7 files changed, 310 insertions(+), 1 deletion(-) create mode 100755 behaviors/SmootWind.py create mode 100755 config/HTMLTest.xml create mode 100755 config/SmootWindTest.xml create mode 100755 inputs/HTMLInput.py create mode 100755 pixelmappers/WindGaussianMapper.py diff --git a/behaviors/SmootWind.py b/behaviors/SmootWind.py new file mode 100755 index 0000000..bf05ab2 --- /dev/null +++ b/behaviors/SmootWind.py @@ -0,0 +1,32 @@ +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) diff --git a/behaviors/XYMove.py b/behaviors/XYMove.py index 0ba3baf..44a93bb 100644 --- a/behaviors/XYMove.py +++ b/behaviors/XYMove.py @@ -13,7 +13,7 @@ class XYMove(Behavior): for loc in sensor: oploc = dict(loc) self.insertStepIfMissing(oploc) - print oploc['YStep'] + #print oploc['YStep'] oploc['Location'] = Geo.addLocations((oploc['XStep'], oploc['YStep']), oploc['Location']) ret.append(oploc) return (ret, []) diff --git a/config/HTMLTest.xml b/config/HTMLTest.xml new file mode 100755 index 0000000..159cec4 --- /dev/null +++ b/config/HTMLTest.xml @@ -0,0 +1,58 @@ + + + + simplemap + + + + layouts/BasicSixStrip.xml + + + + pixelmappers.SimpleMapper + + simplemap + 20 + + + + pixelmappers.GaussianMapper + + gaussmap + 30 + 0.1 + 10 + 1 + + + + + + renderers/Pygame.xml + + + + + inputs.HTMLInput + + weatherinput + 'http://sailing.mit.edu/weather/' + + 'rtWindSpeed = (\d+).*\s.*\s.*rtWindDir = (\d+)' + + + + + + + behaviors.EchoBehavior + + + weatherinput + + echo + False + + + + diff --git a/config/SmootWindTest.xml b/config/SmootWindTest.xml new file mode 100755 index 0000000..a494720 --- /dev/null +++ b/config/SmootWindTest.xml @@ -0,0 +1,166 @@ + + + + + simplemap + + + + layouts/60StripLayout.xml + + + + + pixelmappers.SimpleMapper + + simplemap + 20 + + + + pixelmappers.GaussianMapper + + gaussmap + 10 + 0.1 + 10 + 5 + + + + pixelmappers.WindGaussianMapper + + windgaussmap + 150 + 0.005 + 30 + 10 + + + + + + + renderers/Pygame.xml + + + + + inputs.PygameInput + + pygame + 1 + + + + inputs.HTMLInput + + weatherinput + 'http://sailing.mit.edu/weather/' + + 'rtWindSpeed = (\d+).*\s.*\s.*rtWindDir = (\d+)' + + + + + inputs.RandomLocs + + randomLoc + + + + + + behaviors/RandomColor.xml + + + behaviors/RandomColor.xml + + + (100,200,255) + (50,200,255) + (0,200,255) + (0,150,255) + + + + + behaviors/PixelDecay.xml + + + behaviors.XYMove + + xymove + 0 + 0 + + + + behaviors.BehaviorChain + + movebounce + + xymove + yfor + xfor + + + + + behaviors.ModifyParam + + yfor + YStep + Sensor + 10*(2*math.sin({x}/float(100))+math.sin({x}/float(50))) + + + + + behaviors.ModifyParam + + xfor + XStep + Sensor + + 25 + + + + + behaviors.SmootWind + + smootwind + + weatherinput + + + + + behaviors.ResponseMover + + mover + + + + behaviors.BehaviorChain + + xymover + + pygame + randomLoc + + + staticcolor + mover + decay + + {'mover':'movebounce'} + True + windgaussmap + + + + diff --git a/inputs/HTMLInput.py b/inputs/HTMLInput.py new file mode 100755 index 0000000..9697a32 --- /dev/null +++ b/inputs/HTMLInput.py @@ -0,0 +1,29 @@ +from operationscore.Input import * +import urllib, re + +""" +HTML Input, which takes 2 arguments: +- 'Src': a URL to a web page, and +- 'Regex': a Regex to parse data out of the web page. +The input parses the source code of the web page according to the regex, and processes the parsed regex groups. +""" +class HTMLInput(Input): + def inputInit(self): + self.src = self.argDict['Src'] + self.regex = self.argDict['Regex'] + + def getHTML(self): + self.sock = urllib.urlopen(self.src); + self.html = self.sock.read() + self.sock.close() + + def sensingLoop(self): + self.getHTML() + self.dataList = [] + + pattern = re.compile(self.regex) + matchObj = pattern.search(self.html) + self.dataList = matchObj.groups() + + self.respond(self.dataList) + diff --git a/pixelmappers/WindGaussianMapper.py b/pixelmappers/WindGaussianMapper.py new file mode 100755 index 0000000..c5d77ca --- /dev/null +++ b/pixelmappers/WindGaussianMapper.py @@ -0,0 +1,18 @@ +from operationscore.PixelMapper import * +import util.Geo as Geo +import math +class WindGaussianMapper(PixelMapper): + def mappingFunction(self, eventLocation, screen): + returnPixels = [] #TODO: consider preallocation and trimming + [x,y] = eventLocation + potentialPixels = screen.pixelsInRange(x-self.CutoffDist, x) + for (xloc,pixel) in screen.pixelsInRange(x-self.CutoffDist, x): + pixelDistx = math.fabs(pixel.location[0] - x) + pixelDisty = math.fabs(pixel.location[1] - y) + if pixelDistx < self.CutoffDist: + if pixelDisty < 30: + w = Geo.windtrail(pixelDistx, pixelDisty, self.Height, 0, self.Width) + if w > self.MinWeight: + returnPixels.append((pixel, w)) + + return returnPixels diff --git a/util/Geo.py b/util/Geo.py index 05ea9fe..0dde80b 100644 --- a/util/Geo.py +++ b/util/Geo.py @@ -26,3 +26,9 @@ def randomLoc(boundingBox): #TODO: make less shitty def approxexp(x): """Approximates exp with a 3 term Taylor Series.""" return 1+x+x**2/2+x**3/6 + +def windtrail(x,y,height,center,width): + a=height + b=center + c=width + return a*((math.exp(-((x-b))/(c)))**2)*(math.exp(-((y))/(0.2*c)))**2 -- cgit v1.2.3