Package org.jnode.driver.net.usb.bluetooth

Source Code of org.jnode.driver.net.usb.bluetooth.UsbBluetoothDriver

/*
* $Id$
*
* Copyright (C) 2003-2014 JNode.org
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published
* by the Free Software Foundation; either version 2.1 of the License, or
* (at your option) any later version.
*
* This library is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
* License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library; If not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
package org.jnode.driver.net.usb.bluetooth;

import org.apache.log4j.Logger;
import org.jnode.driver.Driver;
import org.jnode.driver.DriverException;
import org.jnode.driver.bus.usb.InterfaceDescriptor;
import org.jnode.driver.bus.usb.USBConfiguration;
import org.jnode.driver.bus.usb.USBDataPipe;
import org.jnode.driver.bus.usb.USBDevice;
import org.jnode.driver.bus.usb.USBEndPoint;
import org.jnode.driver.bus.usb.USBException;
import org.jnode.driver.bus.usb.USBInterface;
import org.jnode.driver.bus.usb.USBPacket;
import org.jnode.driver.bus.usb.USBPipeListener;
import org.jnode.driver.bus.usb.USBRequest;
import org.jnode.driver.net.usb.UsbNetConstant;
import org.jnode.util.NumberUtils;

public class UsbBluetoothDriver extends Driver implements USBPipeListener, UsbNetConstant {

    private static final Logger log = Logger.getLogger(UsbBluetoothDriver.class);

    USBDataPipe intPipe;
    USBPacket intData;

    @Override
    protected void startDevice() throws DriverException {

        UsbBluetoothDevice UsbBtDevice = new UsbBluetoothDevice();

        final USBDevice dev = (USBDevice) getDevice();
        UsbBtDevice.setUsbDevice(dev);
        final USBConfiguration conf = dev.getConfiguration(0);
        final USBInterface intf = conf.getInterface(0);
        final InterfaceDescriptor iDesc = intf.getDescriptor();

        USBEndPoint bulkInEndpoint[] = new USBEndPoint[8];
        USBEndPoint bulkOutEndpoint[] = new USBEndPoint[8];
        USBEndPoint intrInEndpoint[] = new USBEndPoint[8];

        int num_bulk_in = 0;
        int num_bulk_out = 0;
        int num_bulk_intr = 0;

        USBEndPoint ep = null;

        for (int i = 0; i < iDesc.getNumEndPoints(); i++) {
            ep = intf.getEndPoint(i);
            // Is it a bulk endpoint ?
            if ((ep.getDescriptor().getAttributes() & USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_BULK) {
                // In or Out ?
                if ((ep.getDescriptor().getEndPointAddress() & USB_DIR_IN) == 0) {
                    bulkInEndpoint[num_bulk_in] = ep;
                    num_bulk_in++;
                    log.debug("*** Set bulk in endpoint");
                } else {
                    bulkOutEndpoint[num_bulk_out] = ep;
                    num_bulk_out++;
                    log.debug("*** Set bulk out endpoint");
                }
            } else if ((ep.getDescriptor().getAttributes() & USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_INT) {
                intrInEndpoint[num_bulk_intr] = ep;
                num_bulk_intr++;
                log.debug("*** Set interrupt endpoint");
            }
        }
        if ((num_bulk_intr != 1) || (num_bulk_out != 1) || (num_bulk_in != 1)) {
            throw new DriverException("Must have one bulk-in (" + num_bulk_in +
                    "), one bulk out (" + num_bulk_out + ") and one interrupt (" + num_bulk_intr +
                    ") endpoints. Driver not bound.");
        }
        UsbBtDevice.setBulkInEndpoint(bulkInEndpoint[0]);
        UsbBtDevice.setBulkOutEndpoint(bulkOutEndpoint[0]);
        UsbBtDevice.setIntrInEndpoint(intrInEndpoint[0]);

        intPipe = (USBDataPipe) UsbBtDevice.getIntrInEndpoint().getPipe();
        intPipe.addListener(this);
        try {
            intPipe.open();
            intData =
                    new USBPacket(UsbBtDevice.getIntrInEndpoint().getDescriptor()
                            .getMaxPacketSize());
            final USBRequest req = intPipe.createRequest(intData);
            intPipe.asyncSubmit(req);
        } catch (USBException e1) {
            log.debug("*** USB exception occurs.");
            e1.printStackTrace();
        }
        log.debug("*** Send test command via control endpoint");
        try {
            UsbBtDevice.testCommand();
        } catch (USBException e) {
            log.debug("*** USB exception occurs.");
            e.printStackTrace();
        }
    }

    @Override
    protected void stopDevice() throws DriverException {
        if (intPipe != null) {
            intPipe.close();
            intPipe.removeListener(this);
        }
        intData = null;
    }

    public void requestCompleted(USBRequest request) {
        // log.debug("Bluetooth Completed");
        final byte[] data = intData.getData();
        StringBuilder buffer = new StringBuilder();
        buffer.append("Data received : ");
        for (byte aData : data) {
            buffer.append(NumberUtils.hex(data[0], 2)).append(' ');
        }
        log.debug(buffer.toString());
    }

    public void requestFailed(USBRequest request) {
        log.debug("Bluetooth interrupt error status:" + request.getStatus());
        intPipe.close();
    }

}
TOP

Related Classes of org.jnode.driver.net.usb.bluetooth.UsbBluetoothDriver

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.