/* MultiWii EZ-GUI Copyright (C) <2012> Bartosz Szczygiel (eziosoft) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program 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 General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ package communication; import jp.ksksue.driver.serial.FTDriver; import android.annotation.TargetApi; import android.app.PendingIntent; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.hardware.usb.UsbManager; import android.os.Build; import android.widget.Toast; public class SerialFTDI extends Communication { // [FTDriver] Permission String private static final String ACTION_USB_PERMISSION = "jp.ksksue.tutorial.USB_PERMISSION"; FTDriver mSerial; SimpleQueue<Integer> fifo = new SimpleQueue<Integer>(); boolean loopStop = false; public SerialFTDI(Context context) { super(context); Enable(); } @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR1) @Override public void Enable() { Toast.makeText(context, "Starting Serial FTDI", Toast.LENGTH_SHORT).show(); // [FTDriver] Create Instance mSerial = new FTDriver((UsbManager) context.getSystemService(Context.USB_SERVICE)); // [FTDriver] setPermissionIntent() before begin() PendingIntent permissionIntent = PendingIntent.getBroadcast(context, 0, new Intent(ACTION_USB_PERMISSION), 0); mSerial.setPermissionIntent(permissionIntent); // listen for new devices IntentFilter filter = new IntentFilter(); filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED); filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED); ((Context) context).registerReceiver(mUsbReceiver, filter); } @Override public void Connect(String address) { // [FTDriver] Open USB Serial if (mSerial.begin(Integer.parseInt(address))) { Connected = true; loopStop = false; startMainLoop(); Toast.makeText(context, "Serial connected", Toast.LENGTH_SHORT).show(); } else { Connected = false; Toast.makeText(context, "Serial cannot connect", Toast.LENGTH_SHORT).show(); } } @Override public boolean dataAvailable() { return !fifo.isEmpty(); } @Override public byte Read() { return (byte) (fifo.get() & 0xff); } @Override public void Write(byte[] arr) { Connected = mSerial.isConnected(); if (mSerial.isConnected()) { mSerial.write(arr, arr.length); } else { // Toast.makeText(context, // "Serial port Write error - not connected", // Toast.LENGTH_SHORT).show(); } } @Override public void Close() { Connected = false; loopStop = true; mSerial.end(); Toast.makeText(context, "Serial port disconnected", Toast.LENGTH_SHORT).show(); } @Override public void Disable() { Connected = false; loopStop = true; mSerial.end(); context.unregisterReceiver(mUsbReceiver); Toast.makeText(context, "Serial port disconnected", Toast.LENGTH_SHORT).show(); } // BroadcastReceiver when insert/remove the device USB plug into/from a USB // port BroadcastReceiver mUsbReceiver = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) { Toast.makeText(context, "USB_DEVICE_ATTACHED", Toast.LENGTH_LONG).show(); mSerial.usbAttached(intent); // mSerial.begin(SERIAL_BAUDRATE); // mainloop(); } else if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)) { Toast.makeText(context, "USB_DEVICE_DETACHED", Toast.LENGTH_LONG).show(); Connected = false; mSerial.usbDetached(intent); mSerial.end(); loopStop = true; } } }; private void readToBuffer() { Connected = mSerial.isConnected(); // [FTDriver] Create Read Buffer byte[] rbuf = new byte[4096]; // 1byte <--slow-- [Transfer Speed] // --fast--> // 4096 byte if (mSerial.isConnected()) { // [FTDriver] Read from USB Serial int len = mSerial.read(rbuf); // Log.d("aaa", "ReadtoBuffer:" + String.valueOf(rbuf)); for (int i = 0; i < len; i++) fifo.put(Integer.valueOf(rbuf[i])); // Log.d("aaa", "FiFo count:" + String.valueOf(fifo.size())); } } private void startMainLoop() { new Thread(mLoop).start(); } private Runnable mLoop = new Runnable() { @Override public void run() { while (!loopStop) {// this is the main loop for transferring readToBuffer(); try { Thread.sleep(5); } catch (InterruptedException e) { e.printStackTrace(); } } } }; }