| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- """ClientDistUpdate module: contains the ClientDistUpdate class"""
- import DirectNotifyGlobal
- import Datagram
- from MsgTypes import *
- class ClientDistUpdate:
- notify = DirectNotifyGlobal.directNotify.newCategory("ClientDistUpdate")
- def __init__(self, cdc, dcField):
- self.cdc = cdc
- self.field = dcField
- self.number = dcField.getNumber()
- self.name = dcField.getName()
- self.types = []
- self.divisors = []
- self.deriveTypesFromParticle(dcField)
- # Figure out our function pointer
- exec("import " + cdc.name)
- try:
- self.func = eval(cdc.name + "." + cdc.name + "." + self.name)
- except:
- ClientDistUpdate.notify.warning(cdc.name + "." + self.name +
- " does not exist")
- self.func = None
- return None
- def deriveTypesFromParticle(self, dcField):
- dcFieldAtomic = dcField.asAtomicField()
- dcFieldMolecular = dcField.asMolecularField()
- if dcFieldAtomic:
- for i in range(0, dcFieldAtomic.getNumElements()):
- self.types.append(dcFieldAtomic.getElementType(i))
- self.divisors.append(dcFieldAtomic.getElementDivisor(i))
- elif dcFieldMolecular:
- for i in range(0, dcFieldMolecular.getNumAtomics()):
- componentField = dcFieldMolecular.getAtomic(i)
- for j in range(0, componentField.getNumElements()):
- self.types.append(componentField.getElementType(j))
- self.divisors.append(componentField.getElementDivisor(j))
- else:
- ClientDistUpdate.notify.error("field is neither atom nor molecule")
- return None
- def updateField(self, cdc, do, di):
- #func = eval(cdc.name + "." + cdc.name + "." + self.name)
- #print("Calling: " + cdc.name + "." + cdc.name + "." + self.name +
- # " for do " + str(do.getDoId()))
- # Get the arguments into a list
- args = self.extractArgs(di)
- # Apply the function to the object with the arguments
- apply(self.func, [do] + args)
- return None
- def extractArgs(self, di):
- args = []
- assert(len(self.types) == len(self.divisors))
- numTypes = len(self.types)
- for i in range(numTypes):
- args.append(di.getArg(self.types[i], self.divisors[i]))
- return args
- def addArgs(self, datagram, args):
- # Add the args to the datagram
- numElems = len(args)
- assert (numElems == len(self.types) == len(self.divisors))
- for i in range(0, numElems):
- datagram.putArg(args[i], self.types[i], self.divisors[i])
-
- def sendUpdate(self, cr, do, args):
- datagram = Datagram.Datagram()
- # Add message type
- datagram.addUint16(CLIENT_OBJECT_UPDATE_FIELD)
- # Add the DO id
- datagram.addUint32(do.doId)
- # Add the field id
- datagram.addUint16(self.number)
- # Add the arguments
- self.addArgs(datagram, args)
- # send the datagram
- cr.send(datagram)
|