diff options
-rw-r--r-- | LightInstallation.py | 74 | ||||
-rw-r--r-- | TestProfile.py | 30 | ||||
-rw-r--r-- | behaviors/AddPixelEvent.py | 26 | ||||
-rw-r--r-- | behaviors/DebugBehavior.py | 2 | ||||
-rw-r--r-- | behaviors/LoopAndDie.xml | 2 | ||||
-rw-r--r-- | behaviors/PixelDecay.xml | 11 | ||||
-rw-r--r-- | config/Outdoor.xml | 23 | ||||
-rw-r--r-- | docs/designDocs.tex | 6 | ||||
-rw-r--r--[-rwxr-xr-x] | ga | 0 | ||||
-rw-r--r-- | inputs/PygameInput.py | 4 | ||||
-rw-r--r-- | inputs/TCPInput.py | 19 | ||||
-rw-r--r-- | layouts/50PixelStrip.xml | 2 | ||||
-rw-r--r-- | logger/loggingConfig.ini | 2 | ||||
-rw-r--r-- | operationscore/Input.py | 14 | ||||
-rw-r--r-- | operationscore/Renderer.py | 1 | ||||
-rw-r--r-- | operationscore/SmootCoreObject.py | 27 | ||||
-rw-r--r-- | operationscore/ThreadedSmootCoreObject.py | 8 | ||||
-rw-r--r-- | pixelcore/Screen.py | 7 | ||||
-rw-r--r-- | renderers/SixStripUDP.xml | 4 | ||||
-rw-r--r--[-rwxr-xr-x] | setup.sh | 0 | ||||
-rw-r--r-- | util/PacketComposition.py | 25 |
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/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/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 |