18f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown/*
28f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown * Copyright (C) 2013 The Android Open Source Project
38f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown *
48f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown * Licensed under the Apache License, Version 2.0 (the "License");
58f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown * you may not use this file except in compliance with the License.
68f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown * You may obtain a copy of the License at
78f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown *
88f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown *      http://www.apache.org/licenses/LICENSE-2.0
98f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown *
108f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown * Unless required by applicable law or agreed to in writing, software
118f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown * distributed under the License is distributed on an "AS IS" BASIS,
128f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown * See the License for the specific language governing permissions and
148f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown * limitations under the License.
158f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown */
168f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown
178f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brownpackage com.android.accessorydisplay.sink;
188f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown
198f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brownimport com.android.accessorydisplay.common.Logger;
208f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brownimport com.android.accessorydisplay.common.Transport;
218f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown
228f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brownimport android.hardware.usb.UsbDevice;
238f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brownimport android.hardware.usb.UsbDeviceConnection;
248f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brownimport android.hardware.usb.UsbEndpoint;
258f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown
268f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brownimport java.io.IOException;
278f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown
288f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown/**
298f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown * Sends or receives messages using bulk endpoints associated with a {@link UsbDevice}
308f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown * that represents a USB accessory.
318f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown */
328f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brownpublic class UsbAccessoryBulkTransport extends Transport {
338f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown    private static final int TIMEOUT_MILLIS = 1000;
348f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown
358f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown    private UsbDeviceConnection mConnection;
368f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown    private UsbEndpoint mBulkInEndpoint;
378f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown    private UsbEndpoint mBulkOutEndpoint;
388f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown
398f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown    public UsbAccessoryBulkTransport(Logger logger, UsbDeviceConnection connection,
408f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown            UsbEndpoint bulkInEndpoint, UsbEndpoint bulkOutEndpoint) {
418f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown        super(logger, 16384);
428f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown        mConnection = connection;
438f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown        mBulkInEndpoint = bulkInEndpoint;
448f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown        mBulkOutEndpoint = bulkOutEndpoint;
458f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown    }
468f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown
478f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown    @Override
488f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown    protected void ioClose() {
498f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown        mConnection = null;
508f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown        mBulkInEndpoint = null;
518f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown        mBulkOutEndpoint = null;
528f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown    }
538f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown
548f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown    @Override
558f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown    protected int ioRead(byte[] buffer, int offset, int count) throws IOException {
568f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown        if (mConnection == null) {
578f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown            throw new IOException("Connection was closed.");
588f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown        }
598f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown        return mConnection.bulkTransfer(mBulkInEndpoint, buffer, offset, count, -1);
608f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown    }
618f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown
628f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown    @Override
638f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown    protected void ioWrite(byte[] buffer, int offset, int count) throws IOException {
648f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown        if (mConnection == null) {
658f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown            throw new IOException("Connection was closed.");
668f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown        }
678f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown        int result = mConnection.bulkTransfer(mBulkOutEndpoint,
688f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown                buffer, offset, count, TIMEOUT_MILLIS);
698f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown        if (result < 0) {
708f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown            throw new IOException("Bulk transfer failed.");
718f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown        }
728f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown    }
738f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown}
74