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 Lockwood
21b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwoodimport java.io.FileDescriptor;
22b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwoodimport java.io.IOException;
23b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood
24b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwoodimport java.nio.ByteBuffer;
25b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood
26b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood/**
27b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * @hide
28b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood */
29b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwoodpublic class SerialPort {
30b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood
31b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood    private static final String TAG = "SerialPort";
32b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood
33b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood    // used by the JNI code
34b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood    private int mNativeContext;
35b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood    private final String mName;
36b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood    private ParcelFileDescriptor mFileDescriptor;
37b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood
38b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood    /**
39b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood     * SerialPort should only be instantiated by SerialManager
40b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood     * @hide
41b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood     */
42b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood    public SerialPort(String name) {
43b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood        mName = name;
44b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood    }
45b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood
46b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood    /**
47b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood     * SerialPort should only be instantiated by SerialManager
48b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood     * Speed must be one of 50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800, 9600,
49b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood     * 19200, 38400, 57600, 115200, 230400, 460800, 500000, 576000, 921600, 1000000, 1152000,
50b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood     * 1500000, 2000000, 2500000, 3000000, 3500000, 4000000
51b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood     *
52b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood     * @hide
53b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood     */
54b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood    public void open(ParcelFileDescriptor pfd, int speed) throws IOException {
55b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood        native_open(pfd.getFileDescriptor(), speed);
56b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood        mFileDescriptor = pfd;
57b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood    }
58b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood
59b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood    /**
60b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood     * Closes the serial port
61b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood     */
62b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood    public void close() throws IOException {
63b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood        if (mFileDescriptor != null) {
64b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood            mFileDescriptor.close();
65b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood            mFileDescriptor = null;
66b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood        }
67b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood        native_close();
68b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood    }
69b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood
70b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood    /**
71b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood     * Returns the name of the serial port
72b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood     *
73b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood     * @return the serial port's name
74b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood     */
75b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood    public String getName() {
76b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood        return mName;
77b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood    }
78b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood
79b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood    /**
80cfde15d709a3466b9d503f51819b7d28e718b482Glenn Kasten     * Reads data into the provided buffer.
81cfde15d709a3466b9d503f51819b7d28e718b482Glenn Kasten     * Note that the value returned by {@link java.nio.Buffer#position()} on this buffer is
82cfde15d709a3466b9d503f51819b7d28e718b482Glenn Kasten     * unchanged after a call to this method.
83b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood     *
84b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood     * @param buffer to read into
85b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood     * @return number of bytes read
86b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood     */
87b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood    public int read(ByteBuffer buffer) throws IOException {
88b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood        if (buffer.isDirect()) {
89b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood            return native_read_direct(buffer, buffer.remaining());
90b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood        } else if (buffer.hasArray()) {
91b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood            return native_read_array(buffer.array(), buffer.remaining());
92b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood        } else {
93b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood            throw new IllegalArgumentException("buffer is not direct and has no array");
94b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood        }
95b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood    }
96b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood
97b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood    /**
98cfde15d709a3466b9d503f51819b7d28e718b482Glenn Kasten     * Writes data from provided buffer.
99cfde15d709a3466b9d503f51819b7d28e718b482Glenn Kasten     * Note that the value returned by {@link java.nio.Buffer#position()} on this buffer is
100cfde15d709a3466b9d503f51819b7d28e718b482Glenn Kasten     * unchanged after a call to this method.
101b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood     *
102b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood     * @param buffer to write
103b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood     * @param length number of bytes to write
104b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood     */
105b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood    public void write(ByteBuffer buffer, int length) throws IOException {
106b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood        if (buffer.isDirect()) {
107b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood            native_write_direct(buffer, length);
108b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood        } else if (buffer.hasArray()) {
109b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood            native_write_array(buffer.array(), length);
110b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood        } else {
111b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood            throw new IllegalArgumentException("buffer is not direct and has no array");
112b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood        }
113b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood    }
114b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood
1157dbc4b457d2c2c6dd39fa445e7edd8109796f0a2Mike Lockwood    /**
1167dbc4b457d2c2c6dd39fa445e7edd8109796f0a2Mike Lockwood     * Sends a stream of zero valued bits for 0.25 to 0.5 seconds
1177dbc4b457d2c2c6dd39fa445e7edd8109796f0a2Mike Lockwood     */
1187dbc4b457d2c2c6dd39fa445e7edd8109796f0a2Mike Lockwood    public void sendBreak() {
1197dbc4b457d2c2c6dd39fa445e7edd8109796f0a2Mike Lockwood        native_send_break();
1207dbc4b457d2c2c6dd39fa445e7edd8109796f0a2Mike Lockwood    }
1217dbc4b457d2c2c6dd39fa445e7edd8109796f0a2Mike Lockwood
122b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood    private native void native_open(FileDescriptor pfd, int speed) throws IOException;
123b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood    private native void native_close();
124b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood    private native int native_read_array(byte[] buffer, int length) throws IOException;
125b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood    private native int native_read_direct(ByteBuffer buffer, int length) throws IOException;
126b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood    private native void native_write_array(byte[] buffer, int length) throws IOException;
127b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood    private native void native_write_direct(ByteBuffer buffer, int length) throws IOException;
1287dbc4b457d2c2c6dd39fa445e7edd8109796f0a2Mike Lockwood    private native void native_send_break();
129b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood}
130