aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--LightInstallation.py74
-rw-r--r--TestProfile.py30
-rw-r--r--behaviors/AddPixelEvent.py26
-rw-r--r--behaviors/DebugBehavior.py2
-rw-r--r--behaviors/LoopAndDie.xml2
-rw-r--r--behaviors/PixelDecay.xml11
-rw-r--r--config/Outdoor.xml23
-rw-r--r--docs/designDocs.tex6
-rw-r--r--[-rwxr-xr-x]ga0
-rw-r--r--inputs/PygameInput.py4
-rw-r--r--inputs/TCPInput.py19
-rw-r--r--layouts/50PixelStrip.xml2
-rw-r--r--logger/loggingConfig.ini2
-rw-r--r--operationscore/Input.py14
-rw-r--r--operationscore/Renderer.py1
-rw-r--r--operationscore/SmootCoreObject.py27
-rw-r--r--operationscore/ThreadedSmootCoreObject.py8
-rw-r--r--pixelcore/Screen.py7
-rw-r--r--renderers/SixStripUDP.xml4
-rw-r--r--[-rwxr-xr-x]setup.sh0
-rw-r--r--util/PacketComposition.py25
21 files changed, 213 insertions, 74 deletions
diff --git a/LightInstallation.py b/LightInstallation.py
index 2726005..b54a892 100644
--- a/LightInstallation.py
+++ b/LightInstallation.py
@@ -9,7 +9,7 @@ import util.ComponentRegistry as compReg
from logger import main_log
#Python class to instantiate and drive a Screen through different patterns,
#and effects.
-class LightInstallation:
+class LightInstallation(object):
def __init__(self, configFileName):
main_log.info("System Initialization began based on: " + str(configFileName))
self.timer = clock.Stopwatch()
@@ -21,36 +21,50 @@ class LightInstallation:
self.behaviorInputs = {}
self.componentDict = {}
self.inputBehaviorRegistry = {} #inputid -> behaviors listening to that
+ self.dieNow = False
#input
self.screen = Screen()
compReg.initRegistry()
compReg.registerComponent(self.screen, 'Screen') #TODO: move to constants file
- config = configGetter.loadConfigFile(configFileName)
+
#read configs from xml
+ config = configGetter.loadConfigFile(configFileName)
+
rendererConfig = config.find('RendererConfiguration')
+ self.initializeRenderers(rendererConfig)
+
pixelConfig = config.find('PixelConfiguration')
+ self.initializeScreen(pixelConfig)
+
inputConfig = config.find('InputConfiguration')
+ self.initializeInputs(inputConfig)
+
behaviorConfig = config.find('BehaviorConfiguration')
+ self.initializeBehaviors(behaviorConfig)
+
mapperConfig = config.find('PixelMapperConfiguration')
+ self.initializeMapper(mapperConfig)
- installationConfig = config.find('InstallationConfiguration')
#inits
- self.initializeScreen(pixelConfig)
- self.initializeRenderers(rendererConfig)
- self.initializeInputs(inputConfig)
- self.initializeBehaviors(behaviorConfig)
- self.initializeMapper(mapperConfig)
main_log.info('All components initialized')
- #registration in dict
- self.registerComponents(self.renderers)
- self.registerComponents(self.inputs)
- self.registerComponents(self.behaviors)
- self.registerComponents(self.mappers)
+ #
+ self.registerAllComponents()
+
+ installationConfig = config.find('InstallationConfiguration')
self.configureInstallation(installationConfig)
#Done initializing. Lets start this thing!
self.timer.stop()
#main_log.info('Initialization done. Time: ', self.timer.elapsed(), 'ms')
self.mainLoop()
+
+ def registerAllComponents(self):
+ #registration in dict
+ self.registerComponents(self.renderers)
+ self.registerComponents(self.inputs)
+ self.registerComponents(self.behaviors)
+ self.registerComponents(self.mappers)
+
+
def configureInstallation(self, installationConfig):
defaults = configGetter.generateArgDict(installationConfig.find('Defaults'))
for defaultSelection in defaults:
@@ -62,12 +76,15 @@ class LightInstallation:
def initializeMapper(self, mapperConfig):
self.mappers = self.initializeComponent(mapperConfig)
+
def initializeScreen(self, layoutConfig):
pixelAssemblers = self.initializeComponent(layoutConfig)
[self.addPixelStrip(l) for l in pixelAssemblers]
+
def addPixelStrip(self, layoutEngine):
pixelStrip = PixelStrip(layoutEngine)
self.screen.addStrip(pixelStrip)
+
def initializeInputs(self, inputConfig):
inputs = self.initializeComponent(inputConfig)
self.inputs = inputs
@@ -75,12 +92,21 @@ class LightInstallation:
inputClass.start()
self.inputBehaviorRegistry[inputClass['Id']] = []
#empty list is list of bound behaviors
+
def initializeRenderers(self, rendererConfig):
self.renderers = self.initializeComponent(rendererConfig)
+
def registerComponents(self, components):
for component in components:
cid = compReg.registerComponent(component)
main_log.debug(cid + ' registered')
+ cid = component['Id']
+ if cid == None: #TODO: determine if componenent is critical, and if so, die
+ main_log.error('Components must be registered with Ids. Component not registered')
+ else:
+ compReg.registerComponent(component)
+ main_log.debug(cid + ' registered')
+
def initializeComponent(self, config):
components = []
if config != None:
@@ -95,7 +121,7 @@ class LightInstallation:
exec('from ' + module+'.'+className + ' import *')
main_log.debug(module +'.' +className + 'imported')
except Exception as inst:
- main_log.error('Error importing ' + module+'.'+'.className. Component not\
+ main_log.error('Error importing ' + module+'.'+className+ '. Component not\
initialized.')
main_log.error(str(inst))
continue
@@ -103,7 +129,9 @@ class LightInstallation:
args['parentScope'] = self #TODO: we shouldn't give away scope
#like this, find another way.
try:
- components.append(eval(className+'(args)'))
+ new_component = eval(className+'(args)')
+ new_component.addDieListener(self)
+ components.append(new_component) #TODO: doesn't error
main_log.debug(className + 'initialized with args ' + str(args))
#right
except Exception as inst:
@@ -111,13 +139,15 @@ class LightInstallation:
main_log.error(str(inst))
return components
+
def alive(self):
return True
+
def mainLoop(self):
lastLoopTime = clock.time()
refreshInterval = 30
- runCount = 200
- while runCount > 0:
+ runCount = 2000
+ while runCount > 0 and not self.dieNow:
runCount -= 1
loopStart = clock.time()
responses = self.evaluateBehaviors() #inputs are all queued when they
@@ -133,6 +163,7 @@ class LightInstallation:
#print self.timer.elapsed()
if sleepTime > 0:
time.sleep(sleepTime/1000)
+
#evaluates all the behaviors (including inter-dependencies) and returns a
#list of responses to go to the screen.
def evaluateBehaviors(self):
@@ -149,12 +180,14 @@ class LightInstallation:
self.behaviors = self.initializeComponent(behaviorConfig)
for behavior in self.behaviors:
self.addBehavior(behavior)
+
#Does work needed to add a behavior: currently -- maps behavior inputs into
#the input behavior registry.
def addBehavior(self, behavior):
for inputId in behavior.argDict['Inputs']:
if inputId in self.inputBehaviorRegistry: #it could be a behavior
self.inputBehaviorRegistry[inputId].append(behavior['Id'])
+
def processResponse(self,inputDict, responseDict):
inputId = inputDict['Id']
boundBehaviorIds = self.inputBehaviorRegistry[inputId]
@@ -163,12 +196,17 @@ class LightInstallation:
[compReg.getComponent(b).addInput(responseDict) for b in boundBehaviorIds]
except:
pass
- #print 'Behaviors not initialized yet. WAIT!'
+ #print 'Behaviors not initialized yet. WAIT!'
+
+ def handleDie(self, caller):
+ self.dieNow = True
+
def main(argv):
if len(argv) == 1:
l = LightInstallation('LightInstallationConfig.xml')
else:
l = LightInstallation(argv[1])
+
if __name__ == "__main__":
try:
main(sys.argv)
diff --git a/TestProfile.py b/TestProfile.py
index 663e57b..f25a63d 100644
--- a/TestProfile.py
+++ b/TestProfile.py
@@ -1,6 +1,7 @@
import cProfile
import struct
import random
+import scipy.weave as weave
import math
#from LightInstallation import main
numiter = 1000000
@@ -56,9 +57,34 @@ def expapprox():
for i in xrange(0, numiter):
a = 1+-1+(-1)**2/float(2)
print a
-command = """exptest()"""
+
+def normal_python():
+ for i in xrange(0,numiter):
+ a = math.sqrt(3 + 4 + 5)
+
+def weave_outloop():
+ code = """
+ float x = 0;
+ for (int i = 0;i < numiter;i++) {
+ x = sqrt(3 + 4 + 5);
+ }
+ """
+ weave.inline(code, ['numiter'])
+
+def weave_inloop():
+ code = """
+ x = sqrt(3 + 4 + 5);
+ """
+ x = 0.0
+ for i in xrange(0,numiter):
+ weave.inline(code, ['x'])
+
+command = """normal_python()"""
+cProfile.runctx(command, globals(), locals())
+
+command = """weave_outloop()"""
cProfile.runctx(command, globals(), locals())
-command = """expapprox()"""
+command = """weave_inloop()"""
cProfile.runctx(command, globals(), locals())
diff --git a/behaviors/AddPixelEvent.py b/behaviors/AddPixelEvent.py
new file mode 100644
index 0000000..7f134e1
--- /dev/null
+++ b/behaviors/AddPixelEvent.py
@@ -0,0 +1,26 @@
+from operationscore.Behavior import *
+import util.Strings as Strings
+from logger import main_log
+class AddPixelEvent(Behavior):
+ def behaviorInit(self):
+ [module, className] = self['Class'].split('.')
+ try:
+ exec('from ' + module+'.'+className + ' import *', globals())
+ except Exception as inst:
+ main_log.error('Error importing ' + module+'.'+className+ '. Component not\
+ initialized.')
+ main_log.error(str(inst))
+ self.eventGenerator = eval('lambda args:'+className+'(args)')
+
+ #^lambda function to do generate new event (takes args)
+
+ def processResponse(self, sensors, recurses):
+ ret = []
+ for sensory in sensors:
+ outDict = {}
+ outDict[Strings.LOCATION] = sensory[Strings.LOCATION]
+ settingsDict = dict(self.argDict)
+ settingsDict['Color'] = sensory['Color']
+ outDict['PixelEvent'] = self.eventGenerator(settingsDict)
+ ret.append(outDict)
+ return (ret, recurses)
diff --git a/behaviors/DebugBehavior.py b/behaviors/DebugBehavior.py
index eb525e7..9bf3ea8 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.debug('Sensor Inputs: ' + str(sensorInputs))
return []
diff --git a/behaviors/LoopAndDie.xml b/behaviors/LoopAndDie.xml
index af26562..e2940e4 100644
--- a/behaviors/LoopAndDie.xml
+++ b/behaviors/LoopAndDie.xml
@@ -1,6 +1,6 @@
<Behavior>
<Class>behaviors.RecursiveDecay</Class>
<Args>
- <InitialResponseCount>70</InitialResponseCount>
+ <InitialResponseCount>20</InitialResponseCount>
</Args>
</Behavior>
diff --git a/behaviors/PixelDecay.xml b/behaviors/PixelDecay.xml
index f9eee0d..bfe84ca 100644
--- a/behaviors/PixelDecay.xml
+++ b/behaviors/PixelDecay.xml
@@ -1,4 +1,4 @@
-<Behavior>
+<!--<Behavior>
<Class>behaviors.DecayBehavior</Class>
<Args>
<DecayType>Exponential</DecayType>
@@ -6,4 +6,13 @@
<z-index>0</z-index>
<RenderToScreen>False</RenderToScreen>
</Args>
+</Behavior>-->
+<Behavior>
+ <Class>behaviors.AddPixelEvent</Class>
+ <Args>
+ <Class>pixelevents.DecayEvent</Class>
+ <DecayType>Exponential</DecayType>
+ <Coefficient>.01</Coefficient>
+ <z-index>0</z-index>
+ </Args>
</Behavior>
diff --git a/config/Outdoor.xml b/config/Outdoor.xml
index 053f31e..5ad2c58 100644
--- a/config/Outdoor.xml
+++ b/config/Outdoor.xml
@@ -40,9 +40,17 @@
<Class>inputs.PygameInput</Class>
<Args><!--Passed as a dictionary-->
<Id>pygame</Id>
- <RefreshInterval>100</RefreshInterval>
+ <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>
@@ -68,6 +76,12 @@
<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>
@@ -88,13 +102,13 @@
<Class>behaviors.Square</Class>
<Args>
<Id>square</Id>
- <Width>10</Width>
+ <Width>5</Width>
</Args>
</Behavior>
<Behavior Id="recursivedecay">
<InheritsFrom>behaviors/LoopAndDie.xml</InheritsFrom>
<Args>
- <InitialResponseCount>2000</InitialResponseCount>
+ <InitialResponseCount>300</InitialResponseCount>
</Args>
</Behavior>
<Behavior>
@@ -134,11 +148,12 @@
<Id>mousechaser</Id>
<Inputs>
<Id>followmouse</Id>
+ <Id>tcp</Id>
</Inputs>
<ChainedBehaviors>
<Id>echo</Id>
<Id>square</Id>
- <Id>decay</Id>
+ <Id>slowdecay</Id>
</ChainedBehaviors>
<RenderToScreen>True</RenderToScreen>
</Args>
diff --git a/docs/designDocs.tex b/docs/designDocs.tex
index 9b47d7d..8e62edc 100644
--- a/docs/designDocs.tex
+++ b/docs/designDocs.tex
@@ -35,6 +35,9 @@
between members as python dictionaries because their easy
serialization.
\end{itemize}
+ \section{Overview}
+ \begin{itemize}
+ \item
\section{Operations Class Patterns}
\classDoc{SmootCoreObject}{None}{All 2nd level classes (PixelAssembler, Renderer,
Input, Behavior)}
@@ -44,7 +47,8 @@
\item Defines a constructor that sets argDict
\item Defines a \texttt{\_\_getitem\_\_} , which lets us acces items in
argDict as if the class was a dictionary.
- (\texttt{self['itemName']})
+ (\texttt{self['itemName']}). It also automatically maps the
+ initial contents of the argDict to class attributes.
\item Defines validateArgs and validateArgDict which
validate the incoming arguments against a dictionary
containing argument names as keys and an error message to
diff --git a/ga b/ga
index 7bed4ad..7bed4ad 100755..100644
--- a/ga
+++ b/ga
diff --git a/inputs/PygameInput.py b/inputs/PygameInput.py
index a39c089..27b82b0 100644
--- a/inputs/PygameInput.py
+++ b/inputs/PygameInput.py
@@ -13,8 +13,8 @@ class PygameInput(Input):
return
for event in pygame.event.get():
if event.type is KEYDOWN:
- if event.key == 301:
- exit()
+ if event.key == 27:
+ self.die()
self.respond({Strings.LOCATION: (5,5),'Key': event.key})
if event.type is MOUSEBUTTONDOWN:
self.respond({Strings.LOCATION: pygame.mouse.get_pos()})
diff --git a/inputs/TCPInput.py b/inputs/TCPInput.py
index 197045f..5bf06bf 100644
--- a/inputs/TCPInput.py
+++ b/inputs/TCPInput.py
@@ -1,4 +1,5 @@
import util.Strings as Strings
+import pdb
from operationscore.Input import *
import socket, json, time
import logging as main_log
@@ -18,17 +19,23 @@ class TCPInput(Input):
def sensingLoop(self):
data = self.conn.recv(self.BUFFER_SIZE)
main_log.debug('Incoming data', data)
+
if not data or 'end' in data: # data end, close socket
main_log.debug('End in data')
self.IS_RESPONDING = 0
self.sock.close()
- if self.IS_RESPONDING == 1: # if 'responding', respond to the received data
- dataDict = json.loads(data)
- # socketDict = {'data':dataDict, 'address':self.address}
- socketDict = {Strings.LOCATION: (100 * (1 - dataDict['x'] / 10), 25 * (1 + dataDict['y'] / 10))} # like PygameInput
-
- self.respond(socketDict)
+ if self.IS_RESPONDING == 1: # if 'responding', respond to the received data
+ try:
+ 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)
+ 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.
diff --git a/layouts/50PixelStrip.xml b/layouts/50PixelStrip.xml
index 11fa5e1..beabb97 100644
--- a/layouts/50PixelStrip.xml
+++ b/layouts/50PixelStrip.xml
@@ -3,6 +3,6 @@
<Args>
<pixelToPixelSpacing>4</pixelToPixelSpacing>
<spacing>4</spacing>
- <numPixels>500</numPixels>
+ <numPixels>50</numPixels>
</Args>
</PixelStrip>
diff --git a/logger/loggingConfig.ini b/logger/loggingConfig.ini
index 6727c26..ac760ce 100644
--- a/logger/loggingConfig.ini
+++ b/logger/loggingConfig.ini
@@ -18,7 +18,7 @@ level = INFO
handlers = console
[logger_smoot_light]
-level = DEBUG
+level = ERROR
handlers = file
qualname = smoot_light
propagate = 0
diff --git a/operationscore/Input.py b/operationscore/Input.py
index 3dd74cf..2ee3c3c 100644
--- a/operationscore/Input.py
+++ b/operationscore/Input.py
@@ -11,28 +11,28 @@ import pdb
class Input(ThreadedSmootCoreObject):
#Event scope is a function pointer the function that will get called when
#an Parent is raised.
- def __init__(self, argDict):
+ def init(self):
self.eventQueue = []
- self.parentScope = argDict['parentScope']
- self.argDict = argDict
- if not 'RefreshInterval' in argDict:
+ if not 'RefreshInterval' in self.argDict:
print 'RefreshInterval not defined. Defaulting to .5s.'
self.argDict['RefreshInterval'] = 500
+ self.parentScope = self.argDict['parentScope']
self.inputInit()
- threading.Thread.__init__(self)
- self.daemon = True #This kills this thread when the main thread stops
+
def respond(self, eventDict):
#if eventDict != []:
self.parentScope.lock.acquire()
self.parentScope.processResponse(self.argDict, eventDict)
self.parentScope.lock.release()
time.sleep(.001)
+
def parentAlive(self):
try:
parentAlive = self.parentScope.alive()
return parentAlive
except:
return False
+
def run(self):
while 1:
try:
@@ -43,8 +43,10 @@ class Input(ThreadedSmootCoreObject):
self.acquireLock()
self.sensingLoop()
self.releaseLock()
+
def sensingLoop(self):
pass
+
def inputInit(self):
pass
diff --git a/operationscore/Renderer.py b/operationscore/Renderer.py
index 88da606..ed88a8c 100644
--- a/operationscore/Renderer.py
+++ b/operationscore/Renderer.py
@@ -7,7 +7,6 @@ from operationscore.ThreadedSmootCoreObject import *
class Renderer(ThreadedSmootCoreObject):
def init(self):
self.initRenderer()
- threading.Thread.__init__(self)
def render(lightSystem):
pass
def initRenderer(self):
diff --git a/operationscore/SmootCoreObject.py b/operationscore/SmootCoreObject.py
index c481776..8b36f4d 100644
--- a/operationscore/SmootCoreObject.py
+++ b/operationscore/SmootCoreObject.py
@@ -2,39 +2,62 @@ import pdb
import threading
import thread
import util.Config as configGetter
+
class SmootCoreObject(object):
def __init__(self, argDict, skipValidation = False):
+ self.dieListeners = []
self.argDict = argDict
self.validateArgs(self.className()+'.params')
self.lock = thread.allocate_lock()
- self.init() #call init of inheriting class
#put everything into attributes for speed
for key in argDict:
setattr(self, key, argDict[key])
+ self.init() #call init of inheriting class
# self.__setitem__ = self.argDict.__setitem__
# self.__getitem__ = self.argDict.__getitem__
+
def init(self):
pass
+
def acquireLock(self):
- self.lock = thread.allocate_lock() #TODO: fix.
+ self.lock = thread.allocate_lock() #TODO: fix. -- investigate this, it should only have to be run once in the initialization.
self.lock.acquire()
+
def releaseLock(self):
self.lock.release()
+
def className(self):
return self.__class__.__name__
+
def __setitem__(self,k, item):
self.argDict[k] = item
+
def __getitem__(self, item):
if item in self.argDict:
return self.argDict[item]
else:
return None
+
def __getiter__(self):
return self.argDict.__getiter__()
+
def validateArgs(self, argFileName):
self.validateArgDict(configGetter.loadParamRequirementDict(argFileName))#util
#caches for us, woo!
+
def validateArgDict(self, validationDict):
for item in validationDict:
if not item in self.argDict:
raise Exception(validationDict[item])
+
+ def addDieListener(self, listener):
+ if listener not in self.dieListeners:
+ self.dieListeners.append(listener)
+
+ def removeDieListener(self, listener):
+ if listener in self.dieListeners:
+ self.dieListeners.remove(listener)
+
+ def die(self):
+ for listener in self.dieListeners:
+ listener.handleDie(self)
diff --git a/operationscore/ThreadedSmootCoreObject.py b/operationscore/ThreadedSmootCoreObject.py
index 90611bc..967ee35 100644
--- a/operationscore/ThreadedSmootCoreObject.py
+++ b/operationscore/ThreadedSmootCoreObject.py
@@ -5,10 +5,6 @@ import util.Config as configGetter
from operationscore.SmootCoreObject import SmootCoreObject
class ThreadedSmootCoreObject(SmootCoreObject, threading.Thread):
def __init__(self, argDict, skipValidation = False):
- self.argDict = argDict
- self.validateArgs(self.className()+'.params')
- self.lock = thread.allocate_lock()
+ SmootCoreObject.__init__(self, argDict, skipValidation)
threading.Thread.__init__(self)
- self.init() #call init of inheriting class
- # self.__setitem__ = self.argDict.__setitem__
- # self.__getitem__ = self.argDict.__getitem__
+ self.daemon = True #This kills this thread when the main thread stops
diff --git a/pixelcore/Screen.py b/pixelcore/Screen.py
index 198bd3f..3e8ad5e 100644
--- a/pixelcore/Screen.py
+++ b/pixelcore/Screen.py
@@ -37,9 +37,7 @@ class Screen:
self.xSortedPixels.sort()
self.xPixelLocs = [p[0] for p in self.xSortedPixels]
- def render(self, surface):
- [lS.render(surface) for lS in self.pixelStrips]
-
+ #For debug only
def allOn(self):
[lS.allOn(-1) for lS in self.pixelStrips]
@@ -89,8 +87,7 @@ class Screen:
#if type(mapper) != type(PixelMapper):
# raise Exception('No default mapper specified.')
pixelWeightList = mapper.mapEvent(responseInfo['Location'], self)
- main_log.debug(str(len(pixelWeightList)))
- main_log.debug(pixelWeightList)
+
PixelEvent.addPixelEventIfMissing(responseInfo)
currentTime = timeops.time()
for (pixel, weight) in pixelWeightList:
diff --git a/renderers/SixStripUDP.xml b/renderers/SixStripUDP.xml
index f3c9e75..04f493b 100644
--- a/renderers/SixStripUDP.xml
+++ b/renderers/SixStripUDP.xml
@@ -3,11 +3,11 @@
<Args>
<Id>indoorRenderer</Id>
<PowerSupply>
- <IP>10.31.255.233</IP>
+ <IP>10.32.97.17</IP>
<PortMapping>{'strip1':1, 'strip2':2}</PortMapping>
</PowerSupply>
<PowerSupply>
- <IP>10.32.97.17</IP>
+ <IP>10.31.255.233</IP>
<PortMapping>{'strip3':1, 'strip4':2}</PortMapping>
</PowerSupply>
<PowerSupply>
diff --git a/setup.sh b/setup.sh
index 8f5f6dc..8f5f6dc 100755..100644
--- a/setup.sh
+++ b/setup.sh
diff --git a/util/PacketComposition.py b/util/PacketComposition.py
index 3574170..c4fcdc3 100644
--- a/util/PacketComposition.py
+++ b/util/PacketComposition.py
@@ -1,14 +1,11 @@
import struct
VERSION = 0x0001
MAGIC = 0x4adc0104
-MOREMAGIC = 0xdeadbeef
-DEEPMAGIC = 0xc001d00d
-MAGICHASH = 0x69000420
PORTOUT = 0x0108
UNI = 0
import pdb
import util.TimeOps as timeops
-kinetDict = {'flags': 0, 'startcode': 0, 'pad':0}
+argDict = {'flags': 0, 'startcode': 0, 'pad':0}
def composePixelStripData(pixelStrip,currentTime=timeops.time()):
packet = bytearray()
for light in pixelStrip:
@@ -32,10 +29,10 @@ def memoize(f):
@memoize
def cachePacketHeader(port):
packet = bytearray()
- subDict = dict(kinetDict)
- subDict['len'] = 38000 #I have no idea why this works.
+ subDict = dict(argDict)
+ subDict['len'] = 38500 #I have no idea why this works.
subDict['port'] = port
- packet.extend(kinetPortOutPacket(subDict))
+ packet.extend(portOutPacket(subDict))
packet.append(0x0)
return packet
def composePixelStripPacket(pixelStrip,port, currentTime):
@@ -43,18 +40,18 @@ def composePixelStripPacket(pixelStrip,port, currentTime):
data = composePixelStripData(pixelStrip, currentTime)
packet.extend(data)
return packet
-def kinetHeader():
+def packheader():
header = bytearray()
header.extend(struct.pack('L', MAGIC))
header.extend(struct.pack('H', VERSION))
header.extend(struct.pack('H', PORTOUT))
header.extend(struct.pack('L', 0))
return header
-def kinetPortOut():
- header = kinetHeader()
+def portOut():
+ header = packheader()
header.extend(struct.pack('L', UNI))
return header
-def kinetPortOutPayload(argDict):
+def portOutPayload(argDict):
payload = bytearray()
payload.extend(struct.pack('B', argDict['port']))
payload.extend(struct.pack('H', argDict['flags']))
@@ -62,8 +59,8 @@ def kinetPortOutPayload(argDict):
payload.extend(struct.pack('H', argDict['len']))
payload.extend(struct.pack('H', argDict['startcode']))
return payload
-def kinetPortOutPacket(payloadArgs):
+def portOutPacket(payloadArgs):
packet = bytearray()
- packet.extend(kinetPortOut())
- packet.extend(kinetPortOutPayload(payloadArgs))
+ packet.extend(portOut())
+ packet.extend(portOutPayload(payloadArgs))
return packet