Esempio n. 1
0
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)
Esempio n. 2
0
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)
Esempio n. 3
0
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])