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