示例#1
0
    def read_callback(self, transfer):
        if not self.alive:
            return

        status = transfer.getStatus()
        if status == libusb1.LIBUSB_TRANSFER_COMPLETED:
            data = transfer.getBuffer()

            data = data[0:brick_protocol.get_length_from_data(data)]

            # Apply routing table
            data = self.apply_routing_table_in(data)

            stack_id = brick_protocol.get_stack_id_from_data(data)
            type = brick_protocol.get_type_from_data(data)
            if stack_id == 0 and type == USBDevice.TYPE_ENUMERATE_CALLBACK:
                self.new_device(data)

            key = brick_protocol.get_callback_key_from_data(data)

            # Data is return value of function call
            if key in self.data_callback:
                callback = self.data_callback[key].get()
                twisted.internet.reactor.callFromThread(callback, data)
            # Data is Signal or Broadcast Message
            else:
                # Stack ID = 0 -> Broadcast Message
                if stack_id == 0:
                    for bp in brick_protocol.brick_protocol_list:
                        callback = bp.callback
                        twisted.internet.reactor.callFromThread(callback, data)
                elif stack_id in brick_protocol.device_dict:
                    callbacks = brick_protocol.device_dict[stack_id][3]
                    for callback in callbacks:
                        twisted.internet.reactor.callFromThread(callback, data)
                else:
                    logging.warn("Read callback with unknown Stack ID: " +
                                 str(stack_id))

            logging.info("Read callback: " + str(type))
        else:
            # TODO: Better error handling
            logging.warn("Read callback not successful (status " +
                         str(status) + "): Probably disconnect")
            self.alive = False

        try:
            transfer.submit()
        except libusb1.USBError:
            logging.warn("Transfer exception: Probably disconnect")
            self.alive = False
示例#2
0
    def read_callback(self, transfer):
        if not self.alive:
            return

        status = transfer.getStatus()
        if status == libusb1.LIBUSB_TRANSFER_COMPLETED:
            data = transfer.getBuffer()

            data = data[0 : brick_protocol.get_length_from_data(data)]

            # Apply routing table
            data = self.apply_routing_table_in(data)

            stack_id = brick_protocol.get_stack_id_from_data(data)
            type = brick_protocol.get_type_from_data(data)
            if stack_id == 0 and type == USBDevice.TYPE_ENUMERATE_CALLBACK:
                self.new_device(data)

            key = brick_protocol.get_callback_key_from_data(data)

            # Data is return value of function call
            if key in self.data_callback:
                callback = self.data_callback[key].get()
                twisted.internet.reactor.callFromThread(callback, data)
            # Data is Signal or Broadcast Message
            else:
                # Stack ID = 0 -> Broadcast Message
                if stack_id == 0:
                    for bp in brick_protocol.brick_protocol_list:
                        callback = bp.callback
                        twisted.internet.reactor.callFromThread(callback, data)
                elif stack_id in brick_protocol.device_dict:
                    callbacks = brick_protocol.device_dict[stack_id][3]
                    for callback in callbacks:
                        twisted.internet.reactor.callFromThread(callback, data)
                else:
                    logging.warn("Read callback with unknown Stack ID: " + str(stack_id))

            logging.info("Read callback: " + str(type))
        else:
            # TODO: Better error handling
            logging.warn("Read callback not successful (status " + str(status) + "): Probably disconnect")
            self.alive = False

        try:
            transfer.submit()
        except libusb1.USBError:
            logging.warn("Transfer exception: Probably disconnect")
            self.alive = False
示例#3
0
    def apply_routing_table_in(self, data):
        stack_id = brick_protocol.get_stack_id_from_data(data)
        type = brick_protocol.get_type_from_data(data)
        if stack_id == 0:
            if type == USBDevice.TYPE_ENUMERATE_CALLBACK:
                old_stack_id = ord(self.routing_table_in[ord(data[52])])
                if old_stack_id in brick_protocol.device_dict:
                    uid = data[4:12]
                    if brick_protocol.device_dict[old_stack_id][1] != uid:
                        self.extend_routing_table(old_stack_id)

                return data[0:52] + self.routing_table_in[old_stack_id] + data[53:]

            elif type == USBDevice.TYPE_GET_STACK_ID:
                old_stack_id = ord(data[55])
                return data[0:55] + self.routing_table_in[old_stack_id]
            else:
                return data
        else:
            return self.apply_routing_table(self.routing_table_in, data)
示例#4
0
    def apply_routing_table_in(self, data):
        stack_id = brick_protocol.get_stack_id_from_data(data)
        type = brick_protocol.get_type_from_data(data)
        if stack_id == 0:
            if type == USBDevice.TYPE_ENUMERATE_CALLBACK:
                old_stack_id = ord(self.routing_table_in[ord(data[52])])
                if old_stack_id in brick_protocol.device_dict:
                    uid = data[4:12]
                    if brick_protocol.device_dict[old_stack_id][1] != uid:
                        self.extend_routing_table(old_stack_id)

                return data[0:52] + \
                       self.routing_table_in[old_stack_id] + \
                       data[53:]

            elif type == USBDevice.TYPE_GET_STACK_ID:
                old_stack_id = ord(data[55])
                return data[0:55] + self.routing_table_in[old_stack_id]
            else:
                return data
        else:
            return self.apply_routing_table(self.routing_table_in, data)