SerialPort.java revision 7dbc4b457d2c2c6dd39fa445e7edd8109796f0a2
1b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood/* 2b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * Copyright (C) 2011 The Android Open Source Project 3b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * 4b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * Licensed under the Apache License, Version 2.0 (the "License"); 5b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * you may not use this file except in compliance with the License. 6b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * You may obtain a copy of the License at 7b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * 8b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * http://www.apache.org/licenses/LICENSE-2.0 9b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * 10b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * Unless required by applicable law or agreed to in writing, software 11b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * distributed under the License is distributed on an "AS IS" BASIS, 12b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * See the License for the specific language governing permissions and 14b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * limitations under the License. 15b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood */ 16b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood 17b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwoodpackage android.hardware; 18b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood 19b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwoodimport android.os.ParcelFileDescriptor; 20b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwoodimport android.util.Log; 21b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood 22b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwoodimport java.io.FileDescriptor; 23b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwoodimport java.io.FileInputStream; 24b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwoodimport java.io.FileOutputStream; 25b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwoodimport java.io.InputStream; 26b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwoodimport java.io.IOException; 27b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwoodimport java.io.OutputStream; 28b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood 29b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwoodimport java.nio.ByteBuffer; 30b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood 31b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood/** 32b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * @hide 33b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood */ 34b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwoodpublic class SerialPort { 35b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood 36b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood private static final String TAG = "SerialPort"; 37b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood 38b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood // used by the JNI code 39b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood private int mNativeContext; 40b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood private final String mName; 41b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood private ParcelFileDescriptor mFileDescriptor; 42b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood 43b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood /** 44b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * SerialPort should only be instantiated by SerialManager 45b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * @hide 46b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood */ 47b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood public SerialPort(String name) { 48b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood mName = name; 49b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood } 50b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood 51b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood /** 52b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * SerialPort should only be instantiated by SerialManager 53b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * Speed must be one of 50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800, 9600, 54b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * 19200, 38400, 57600, 115200, 230400, 460800, 500000, 576000, 921600, 1000000, 1152000, 55b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * 1500000, 2000000, 2500000, 3000000, 3500000, 4000000 56b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * 57b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * @hide 58b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood */ 59b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood public void open(ParcelFileDescriptor pfd, int speed) throws IOException { 60b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood native_open(pfd.getFileDescriptor(), speed); 61b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood mFileDescriptor = pfd; 62b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood } 63b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood 64b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood /** 65b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * Closes the serial port 66b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood */ 67b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood public void close() throws IOException { 68b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood if (mFileDescriptor != null) { 69b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood mFileDescriptor.close(); 70b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood mFileDescriptor = null; 71b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood } 72b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood native_close(); 73b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood } 74b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood 75b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood /** 76b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * Returns the name of the serial port 77b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * 78b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * @return the serial port's name 79b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood */ 80b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood public String getName() { 81b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood return mName; 82b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood } 83b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood 84b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood /** 85b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * Reads data into the provided buffer 86b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * 87b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * @param buffer to read into 88b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * @return number of bytes read 89b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood */ 90b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood public int read(ByteBuffer buffer) throws IOException { 91b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood if (buffer.isDirect()) { 92b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood return native_read_direct(buffer, buffer.remaining()); 93b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood } else if (buffer.hasArray()) { 94b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood return native_read_array(buffer.array(), buffer.remaining()); 95b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood } else { 96b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood throw new IllegalArgumentException("buffer is not direct and has no array"); 97b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood } 98b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood } 99b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood 100b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood /** 101b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * Writes data from provided buffer 102b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * 103b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * @param buffer to write 104b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * @param length number of bytes to write 105b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood */ 106b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood public void write(ByteBuffer buffer, int length) throws IOException { 107b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood if (buffer.isDirect()) { 108b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood native_write_direct(buffer, length); 109b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood } else if (buffer.hasArray()) { 110b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood native_write_array(buffer.array(), length); 111b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood } else { 112b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood throw new IllegalArgumentException("buffer is not direct and has no array"); 113b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood } 114b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood } 115b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood 1167dbc4b457d2c2c6dd39fa445e7edd8109796f0a2Mike Lockwood /** 1177dbc4b457d2c2c6dd39fa445e7edd8109796f0a2Mike Lockwood * Sends a stream of zero valued bits for 0.25 to 0.5 seconds 1187dbc4b457d2c2c6dd39fa445e7edd8109796f0a2Mike Lockwood */ 1197dbc4b457d2c2c6dd39fa445e7edd8109796f0a2Mike Lockwood public void sendBreak() { 1207dbc4b457d2c2c6dd39fa445e7edd8109796f0a2Mike Lockwood native_send_break(); 1217dbc4b457d2c2c6dd39fa445e7edd8109796f0a2Mike Lockwood } 1227dbc4b457d2c2c6dd39fa445e7edd8109796f0a2Mike Lockwood 123b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood private native void native_open(FileDescriptor pfd, int speed) throws IOException; 124b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood private native void native_close(); 125b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood private native int native_read_array(byte[] buffer, int length) throws IOException; 126b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood private native int native_read_direct(ByteBuffer buffer, int length) throws IOException; 127b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood private native void native_write_array(byte[] buffer, int length) throws IOException; 128b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood private native void native_write_direct(ByteBuffer buffer, int length) throws IOException; 1297dbc4b457d2c2c6dd39fa445e7edd8109796f0a2Mike Lockwood private native void native_send_break(); 130b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood} 131