1 /* 2 * Copyright (C) 2011 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.serialchat; 18 19 import android.app.Activity; 20 import android.content.Context; 21 import android.hardware.SerialManager; 22 import android.hardware.SerialPort; 23 import android.os.Bundle; 24 import android.os.Handler; 25 import android.os.Message; 26 import android.os.ParcelFileDescriptor; 27 import android.view.KeyEvent; 28 import android.view.View; 29 import android.view.inputmethod.EditorInfo; 30 import android.util.Log; 31 import android.widget.EditText; 32 import android.widget.TextView; 33 34 import java.nio.ByteBuffer; 35 import java.io.IOException; 36 37 public class SerialChat extends Activity implements Runnable, TextView.OnEditorActionListener { 38 39 private static final String TAG = "SerialChat"; 40 41 private TextView mLog; 42 private EditText mEditText; 43 private ByteBuffer mInputBuffer; 44 private ByteBuffer mOutputBuffer; 45 private SerialManager mSerialManager; 46 private SerialPort mSerialPort; 47 private boolean mPermissionRequestPending; 48 49 private static final int MESSAGE_LOG = 1; 50 51 @Override 52 public void onCreate(Bundle savedInstanceState) { 53 super.onCreate(savedInstanceState); 54 55 mSerialManager = (SerialManager)getSystemService(Context.SERIAL_SERVICE); 56 setContentView(R.layout.serial_chat); 57 mLog = (TextView)findViewById(R.id.log); 58 mEditText = (EditText)findViewById(R.id.message); 59 mEditText.setOnEditorActionListener(this); 60 61 if (false) { 62 mInputBuffer = ByteBuffer.allocateDirect(1024); 63 mOutputBuffer = ByteBuffer.allocateDirect(1024); 64 } else { 65 mInputBuffer = ByteBuffer.allocate(1024); 66 mOutputBuffer = ByteBuffer.allocate(1024); 67 } 68 } 69 70 @Override 71 public void onResume() { 72 super.onResume(); 73 74 String[] ports = mSerialManager.getSerialPorts(); 75 if (ports != null && ports.length > 0) { 76 try { 77 mSerialPort = mSerialManager.openSerialPort(ports[0], 115200); 78 if (mSerialPort != null) { 79 new Thread(this).start(); 80 } 81 } catch (IOException e) { 82 } 83 } 84 85 } 86 87 @Override 88 public void onPause() { 89 super.onPause(); 90 91 } 92 93 @Override 94 public void onDestroy() { 95 if (mSerialPort != null) { 96 try { 97 mSerialPort.close(); 98 } catch (IOException e) { 99 } 100 mSerialPort = null; 101 } 102 super.onDestroy(); 103 } 104 105 public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { 106 if (/* actionId == EditorInfo.IME_ACTION_DONE && */ mSerialPort != null) { 107 try { 108 String text = v.getText().toString(); 109 Log.d(TAG, "write: " + text); 110 byte[] bytes = text.getBytes(); 111 mOutputBuffer.clear(); 112 mOutputBuffer.put(bytes); 113 mSerialPort.write(mOutputBuffer, bytes.length); 114 } catch (IOException e) { 115 Log.e(TAG, "write failed", e); 116 } 117 v.setText(""); 118 return true; 119 } 120 Log.d(TAG, "onEditorAction " + actionId + " event: " + event); 121 return false; 122 } 123 124 public void run() { 125 Log.d(TAG, "run"); 126 int ret = 0; 127 byte[] buffer = new byte[1024]; 128 while (ret >= 0) { 129 try { 130 Log.d(TAG, "calling read"); 131 mInputBuffer.clear(); 132 ret = mSerialPort.read(mInputBuffer); 133 Log.d(TAG, "read returned " + ret); 134 mInputBuffer.get(buffer, 0, ret); 135 } catch (IOException e) { 136 Log.e(TAG, "read failed", e); 137 break; 138 } 139 140 if (ret > 0) { 141 Message m = Message.obtain(mHandler, MESSAGE_LOG); 142 String text = new String(buffer, 0, ret); 143 Log.d(TAG, "chat: " + text); 144 m.obj = text; 145 mHandler.sendMessage(m); 146 } 147 } 148 Log.d(TAG, "thread out"); 149 } 150 151 Handler mHandler = new Handler() { 152 @Override 153 public void handleMessage(Message msg) { 154 switch (msg.what) { 155 case MESSAGE_LOG: 156 mLog.setText(mLog.getText() + (String)msg.obj); 157 break; 158 } 159 } 160 }; 161 } 162 163 164