class Channel(OSCBaseObject): def __init__(self, **kwargs): self.channel = kwargs.get('channel') kwargs.setdefault('osc_address', str(self.channel + 1)) super(Channel, self).__init__(**kwargs) self.register_signal('event') self.notes = ChildGroup(name='note', osc_parent_node=self.osc_node) self.controllers = ChildGroup(name='controller', osc_parent_node=self.osc_node) for i in range(128): n = self.notes.add_child(Note, note=i, channel=self, Index=i) n.bind(event=self.on_child_event) c = self.controllers.add_child(Controller, controller=i, channel=self) c.bind(event=self.on_child_event) def unlink(self): for n in self.notes.iteritems(): n.unlink() for c in self.controllers.iteritems(): c.unlink() super(Channel, self).unlink() def trigger_event(self, **kwargs): type = kwargs.get('type') attr = type + 's' if not hasattr(self, attr): return obj = getattr(self, attr).get(kwargs.get(type)) if not obj: return obj.trigger_event(**kwargs) def on_child_event(self, **kwargs): kwargs.setdefault('channel', self.channel) self.emit('event', **kwargs)
class Channel(OSCBaseObject): def __init__(self, **kwargs): self.channel = kwargs.get('channel') kwargs.setdefault('osc_address', str(self.channel + 1)) super(Channel, self).__init__(**kwargs) self.register_signal('event') self.notes = ChildGroup(name='note', osc_parent_node=self.osc_node) self.controllers = ChildGroup(name='controller', osc_parent_node=self.osc_node) for i in range(128): n = self.notes.add_child(Note, note=i, channel=self, Index=i) n.bind(event=self.on_child_event) c = self.controllers.add_child(Controller, controller=i, channel=self) c.bind(event=self.on_child_event) def unlink(self): for n in self.notes.iteritems(): n.unlink() for c in self.controllers.iteritems(): c.unlink() super(Channel, self).unlink() def trigger_event(self, **kwargs): type = kwargs.get('type') attr = type + 's' if not hasattr(self, attr): return obj = getattr(self, attr).get(kwargs.get(type)) if not obj: return obj.trigger_event(**kwargs) def on_child_event(self, **kwargs): kwargs.setdefault('channel', self.channel) self.emit('event', **kwargs)
class ArtBaseMsg(object): _fields = {1:'ID', 2:'OpCode'} def __init__(self, **kwargs): self.msg_type = kwargs.get('msg_type', self.__class__.__name__) cls = self.__class__ fields = {} while cls != ArtBaseMsg: fields.update(getattr(cls, '_fields', {})) cls = cls.__bases__[0] fields.update(ArtBaseMsg._fields) self.Fields = ChildGroup(name='Fields') for index, key in fields.iteritems(): fcls = getattr(FieldClasses, key, None) if fcls is not None: fobj = self.Fields.add_child(fcls, Index=index) for i in range(1, self._num_fields + 1): current = self.Fields.indexed_items.get(i) if current is not None: field = current else: if i <= field.Index + field.expected_length - 1: pass else: fobj = self.Fields.add_child(FieldClasses.Dummy, id='Dummy_%s' % (i), Index=i) #print 'added dummyobj: i=%s, current=%s, field=%s' % (i, current, field) self.init_msg(**kwargs) datastr = kwargs.get('from_string') if datastr: self._parse_success = True result = self.from_string(datastr) if result is False: self._parse_success = False else: for key, field in self.Fields.iteritems(): value = getattr(self, key, kwargs.get(key, FIELD_DEFAULTS.get(key))) if value is not None: field.value = value def init_msg(self, **kwargs): pass def from_string(self, string): if string is None: return False l, fmt = self.get_data() while len(string) < struct.calcsize(fmt): before = fmt fmt = fmt[:-1] #print 'fmt trunc: before=%s, after=%s' % (before, fmt) if len(string) > struct.calcsize(fmt): string = string[:struct.calcsize(fmt)] try: values = list(struct.unpack(fmt, string)) except: LOG.warning(self, 'could not unpack', struct.calcsize(fmt), len(string)) return False #print 'from_string: ', values for field in self.Fields.indexed_items.itervalues(): length = field.expected_length if length > len(values): #print 'not enough data for field: ', field.id break field.set_data(values[:length]) #print field.__class__.__name__, values[:length], values del values[:length] def get_data(self): l = [] #print 'getdata: ', self.msg_type for field in self.Fields.indexed_items.itervalues(): data = field.get_data() #print field.id, data l.extend(data) fmt = '=%s' % (''.join([type(item).struct_fmt for item in l])) return l, fmt def build_string(self): l, fmt = self.get_data() return struct.pack(fmt, *l) def copy(self): msg = self.__class__() for i, field in self.Fields.indexed_items.iteritems(): msg.Fields.indexed_items[i].value = field.value return msg def __str__(self): keys = sorted(self.Fields.indexed_items.keys()) fields = ', '.join([str(self.Fields.indexed_items[key]) for key in keys]) return ': '.join([self.msg_type, fields])