From c8316a35a1eb292f09db8b7ff36dd33b43dfe8b6 Mon Sep 17 00:00:00 2001 From: rcoh Date: Sat, 12 Feb 2011 20:39:58 -0500 Subject: Added an override of setLastOutput to square.py. Added some pre-built queries into the BQS. Modified the default behavior or setLastOutput to make a deep copy of ouput to prevent accidental interference. --- operationscore/Behavior.py | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) (limited to 'operationscore') diff --git a/operationscore/Behavior.py b/operationscore/Behavior.py index 7090a23..349c4cf 100644 --- a/operationscore/Behavior.py +++ b/operationscore/Behavior.py @@ -12,6 +12,7 @@ class Behavior(SmootCoreObject): specifically designed to do this (like AddPixelEvent). timeStep is called on every iteration of the LightInstallation addInput is called on each individual input received, and the inputs queue""" + def init(self): self.validateArgs('Behavior.params') if type(self['Inputs']) != type([]): @@ -21,34 +22,55 @@ class Behavior(SmootCoreObject): self.outGoingQueue = [] self.lastState = None self.behaviorInit() + def behaviorInit(self): pass + def addMapper(fn): def withmap(fn): return self.addMapperToResponse(fn()) return withmap + def processResponse(self, sensorInputs, recursiveInputs): raise Exception('ProcessResponse not defined!') + def addInput(self, sensorInput): self.sensorResponseQueue.append(sensorInput) + #used for behavior chaining + def immediateProcessInput(self, sensorInputs, recursiveInputs=[]): (outputs,recursions) = self.processResponse(sensorInputs, \ recursiveInputs) return self.addMapperToResponse((outputs,recursions)) + def addInputs(self, sensorInputs): if type(sensorInputs) == type([]): [self.addInput(sensorInput) for sensorInput in sensorInputs] else: self.addInput(sensorInputs) - #private + + @staticmethod + def deepCopyPacket(self, datapacket): + """Returns a deep copy of a behavior data packet (a list of dicts) so that modifying the + returned packet will not modify the incoming packet.""" + ret = [] + for d in datapacket: + d = dict(d) + ret.append[d] + return ret + def getLastOutput(self): return self.lastState + def setLastOutput(self, output): """Override to modify state. For example: if you are using a behavior that does uses strings for location specification, you will want to override this to point to a single - location. Make sure you keep lastState as a [] of {}. (List of dicts)""" - self.lastState = output + location. Make sure you keep lastState as a [] of {}. (List of dicts). Additonally, + ensure that you call Behavior.deepCopyPacket on the packet before hand to avoid inadvertent + down-stream modifications. Look at Square.py for an example of this.""" + self.lastState = Behavior.deepCopyPacket(output) + def addMapperToResponse(self, responses): if self['Mapper'] != None: if type(responses) == type(tuple): @@ -59,11 +81,14 @@ class Behavior(SmootCoreObject): r['Mapper'] = self['Mapper'] return responses return responses + def timeStep(self): #TODO: type checking. clean this up (outputs, recursions) = self.processResponse(self.sensorResponseQueue, \ self.recursiveResponseQueue) self.sensorResponseQueue = [] self.recursiveResponseQueue = recursions self.setLastOutput(outputs) + if outputs != []: + pdb.set_trace() main_log.debug(self['Id'] + ' Ouputs ' + str(outputs)) return self.addMapperToResponse(outputs) -- cgit v1.2.3