├── .gitignore ├── .idea ├── .name ├── compiler.xml ├── copyright │ └── profiles_settings.xml ├── gradle.xml ├── misc.xml ├── modules.xml └── vcs.xml ├── README.md ├── USBDevice.iml ├── app ├── .gitignore ├── app-debug.apk ├── app.iml ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── ti │ │ └── uts │ │ └── alckon │ │ └── usbdevice │ │ └── ApplicationTest.java │ └── main │ ├── AndroidManifest.xml │ ├── ic_launcher-web.png │ ├── java │ ├── grindec │ │ └── uts │ │ │ └── utils │ │ │ └── Logger.java │ └── ti │ │ └── uts │ │ └── alckon │ │ └── usbdevice │ │ ├── BroadcastConnectionUSB.java │ │ ├── IniciarLectura.java │ │ ├── LogViewer.java │ │ └── MainActivity.java │ └── res │ ├── layout │ ├── activity_main.xml │ ├── lectura.xml │ └── log_viewer.xml │ ├── menu │ └── menu_main.xml │ ├── mipmap-hdpi │ └── ic_launcher.png │ ├── mipmap-mdpi │ └── ic_launcher.png │ ├── mipmap-xhdpi │ └── ic_launcher.png │ ├── mipmap-xxhdpi │ └── ic_launcher.png │ ├── mipmap-xxxhdpi │ └── ic_launcher.png │ ├── values-w820dp │ └── dimens.xml │ ├── values │ ├── dimens.xml │ ├── strings.xml │ └── styles.xml │ └── xml │ └── device_filter.xml ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── settings.gradle └── usb-serial-for-android-v010 ├── build.gradle ├── usb-serial-for-android-v010.iml └── usb-serial-for-android-v010.jar /.gitignore: -------------------------------------------------------------------------------- 1 | .gradle 2 | /local.properties 3 | /.idea/workspace.xml 4 | /.idea/libraries 5 | .DS_Store 6 | /build 7 | /captures 8 | -------------------------------------------------------------------------------- /.idea/.name: -------------------------------------------------------------------------------- 1 | USBDevice -------------------------------------------------------------------------------- /.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /.idea/copyright/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 19 | 20 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 22 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # read-arduino-android-otg-usb 2 | In this project we connect an Android device with an Arduino board through OTG Connection - USB , using an external library. 3 | As a first step , we open connection to the device , then you write a byte to the plate, to ask you to send values ​​of 4 sensors at the time, to read them , and represent them on the display device . 4 | 5 | For the project we use the following library : 6 | https://github.com/mik3y/usb-serial-for-android 7 | 8 | Openning connection and settings the Arduino Shield:
9 | ```java 10 | private void startListening() { 11 | 12 | mSerialDevice = UsbSerialProber.acquire(mUsbManager); 13 | Toast.makeText(getApplicationContext(), "Resumed, mSerialDevice=" + mSerialDevice, Toast.LENGTH_SHORT).show(); 14 | if (mSerialDevice == null) 15 | { 16 | textEstado.setText("Dispositivo Serial no Encontrado"); 17 | } else 18 | { 19 | try 20 | { 21 | mSerialDevice.open(); 22 | mSerialDevice.setBaudRate(9600); 23 | } 24 | catch (IOException e) 25 | { 26 | Toast.makeText(getApplicationContext(), "Error configurando el Dispositivo" + e.getMessage(), Toast.LENGTH_SHORT).show(); 27 | textEstado.setText("Error abriendo el dispositivo: " + e.getMessage()); 28 | try { 29 | mSerialDevice.close(); 30 | } catch (IOException e2) { 31 | // Ignore. 32 | } 33 | mSerialDevice = null; 34 | return; 35 | } 36 | 37 | textEstado.setText("Dispositivo Serial: " + mSerialDevice); 38 | } 39 | 40 | onDeviceStateChange(); 41 | } 42 | 43 | //And Readding data 44 | private void updateReceivedData(byte[] data) { 45 | String temp = new String(data); 46 | boolean continuar = false; 47 | if( temp.contains("=") && temp.contains(";") ) { 48 | lastString = temp; 49 | continuar = true; 50 | } else if( temp.contains("=") ) 51 | lastString = temp; 52 | else if( temp.contains(";") ) { 53 | lastString = lastString!=null ? lastString + temp : temp; 54 | if( lastString.contains("=")&&lastString.contains(";")) 55 | continuar = true; 56 | } else { 57 | lastString = ""; 58 | } 59 | if( continuar ) { 60 | String message = lastString; 61 | 62 | if (message.contains("=") && message.contains(";")) 63 | txtLectura.setText(message); 64 | textEstado.setText(message); 65 | textViewHumedad.setText(message.contains("=") + " " + message.contains(";")); 66 | lastRead = null; 67 | lastString = ""; 68 | } 69 | } 70 | ``` 71 | The permission in AndroidManifest.xml 72 | ```xml 73 | 76 | 77 | 78 | 79 | 82 | 83 | ``` 84 | The file device_filter.xml 85 | 86 | ```xml 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | ``` 101 | 102 | 103 | 104 | -------------------------------------------------------------------------------- /USBDevice.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/app-debug.apk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OsmarICancino/read-arduino-android-otg-usb/3d05678ec7bfae164f944d7febdd8257d9e50d08/app/app-debug.apk -------------------------------------------------------------------------------- /app/app.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 8 | 9 | 10 | 11 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 22 5 | buildToolsVersion "22.0.1" 6 | 7 | defaultConfig { 8 | applicationId "ti.uts.alckon.usbdevice" 9 | minSdkVersion 16 10 | targetSdkVersion 22 11 | versionCode 1 12 | versionName "1.0" 13 | } 14 | buildTypes { 15 | release { 16 | minifyEnabled false 17 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 18 | } 19 | } 20 | } 21 | 22 | dependencies { 23 | compile fileTree(dir: 'libs', include: ['*.jar']) 24 | compile 'com.android.support:appcompat-v7:22.2.0' 25 | compile project(':usb-serial-for-android-v010') 26 | } 27 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in /home/alckon/Android/Sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /app/src/androidTest/java/ti/uts/alckon/usbdevice/ApplicationTest.java: -------------------------------------------------------------------------------- 1 | package ti.uts.alckon.usbdevice; 2 | 3 | import android.app.Application; 4 | import android.test.ApplicationTestCase; 5 | 6 | /** 7 | * Testing Fundamentals 8 | */ 9 | public class ApplicationTest extends ApplicationTestCase { 10 | public ApplicationTest() { 11 | super(Application.class); 12 | } 13 | } -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 10 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 21 | 22 | 25 | 26 | 29 | 30 | 31 | 32 | 33 | 36 | 37 | 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /app/src/main/ic_launcher-web.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OsmarICancino/read-arduino-android-otg-usb/3d05678ec7bfae164f944d7febdd8257d9e50d08/app/src/main/ic_launcher-web.png -------------------------------------------------------------------------------- /app/src/main/java/grindec/uts/utils/Logger.java: -------------------------------------------------------------------------------- 1 | package grindec.uts.utils; 2 | 3 | import android.content.Context; 4 | import android.os.Environment; 5 | import android.widget.Toast; 6 | 7 | import java.io.BufferedReader; 8 | import java.io.File; 9 | import java.io.FileOutputStream; 10 | import java.io.FileReader; 11 | import java.io.FileWriter; 12 | import java.io.PrintWriter; 13 | 14 | /** 15 | * Created by Reynolds on 10/08/2015. 16 | */ 17 | public class Logger { 18 | public static void log( String logName, Exception msj, Context context ) { 19 | try { 20 | File appFolder = new File(context.getFilesDir(),"uts"); 21 | if( !appFolder.exists() ) 22 | appFolder.mkdir(); 23 | 24 | if( appFolder.exists() ) { 25 | File archivoLog = new File(appFolder, logName); 26 | if( !archivoLog.exists() ) { 27 | archivoLog.createNewFile(); 28 | } 29 | 30 | if( archivoLog.exists() ) { 31 | PrintWriter pw = new PrintWriter(new FileWriter(archivoLog,true)); 32 | msj.printStackTrace(pw); 33 | pw.close(); 34 | } 35 | } 36 | } catch( Exception e ) { 37 | e.printStackTrace(); 38 | } 39 | } 40 | 41 | public static boolean logString( String logName, String msj, Context context ) { 42 | try { 43 | File appFolder = new File(context.getFilesDir(),"uts"); 44 | if( !appFolder.exists() ) 45 | appFolder.mkdir(); 46 | 47 | if( appFolder.exists() ) { 48 | File archivoLog = new File(appFolder, logName); 49 | if( !archivoLog.exists() ) { 50 | archivoLog.createNewFile(); 51 | } 52 | 53 | if( archivoLog.exists() ) { 54 | PrintWriter pw = new PrintWriter(new FileWriter(archivoLog,true)); 55 | pw.println(msj); 56 | pw.close(); 57 | return true; 58 | } 59 | } 60 | 61 | return false; 62 | } catch( Exception e ) { 63 | e.printStackTrace(); 64 | return false; 65 | } 66 | } 67 | 68 | public static String read( String logName, Context context ) { 69 | try { 70 | File appFolder = new File(context.getFilesDir(),"uts"); 71 | 72 | if( appFolder.exists() ) { 73 | File archivoLog = new File(appFolder, logName); 74 | 75 | if( archivoLog.exists() ) { 76 | BufferedReader br = new BufferedReader( new FileReader(archivoLog) ); 77 | String txt = ""; 78 | String linea = null; 79 | while( (linea=br.readLine())!=null ) { 80 | txt += linea+"\n"; 81 | } 82 | br.close(); 83 | return txt; 84 | } else { 85 | return "--No Existen Entradas--"; 86 | } 87 | } else { 88 | return "--No Existen Entradas--"; 89 | } 90 | } catch( Exception e ) { 91 | e.printStackTrace(); 92 | return "--Error de Lectura--"; 93 | } 94 | } 95 | } 96 | -------------------------------------------------------------------------------- /app/src/main/java/ti/uts/alckon/usbdevice/BroadcastConnectionUSB.java: -------------------------------------------------------------------------------- 1 | package ti.uts.alckon.usbdevice; 2 | 3 | import android.app.PendingIntent; 4 | import android.content.BroadcastReceiver; 5 | import android.content.Context; 6 | import android.content.Intent; 7 | import android.hardware.usb.UsbDevice; 8 | import android.hardware.usb.UsbManager; 9 | import android.widget.Toast; 10 | 11 | import com.hoho.android.usbserial.driver.UsbSerialDriver; 12 | 13 | /** 14 | * Created by alckon on 3/09/15. 15 | */ 16 | public class BroadcastConnectionUSB extends BroadcastReceiver { 17 | 18 | private static final String ACTION_USB_PERMISSION = "ti.uts.alckon.usbdevice.USB_PERMISSION"; 19 | UsbManager mUsbManager; 20 | UsbDevice mUsbDevice; 21 | PendingIntent mPermissionIntent; 22 | 23 | @Override 24 | public void onReceive(Context context, Intent intent) { 25 | try { 26 | String action = intent.getAction(); 27 | // TODO: Al aceptar el permiso del usuario. 28 | if (ACTION_USB_PERMISSION.equals(action)) { 29 | synchronized (this) { 30 | if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) { 31 | Toast.makeText(context, "Permiso aceptado - Asignando Valor USBManager", Toast.LENGTH_LONG).show(); 32 | 33 | //TODO: Obtemos el Manager USB del sistema Android 34 | mUsbManager = (UsbManager) context.getSystemService(Context.USB_SERVICE); 35 | 36 | 37 | } else { 38 | Toast.makeText(context, "Permiso Denegado", Toast.LENGTH_LONG).show(); 39 | } 40 | } 41 | } 42 | 43 | // TODO: Al desconectar el dispositivo USB cerramos las conexiones y liberamos la variables. 44 | if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)) { 45 | UsbDevice device = (UsbDevice) intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); 46 | if (device != null) { 47 | // call your method that cleans up and closes communication with the device 48 | 49 | } 50 | else 51 | { 52 | Toast.makeText(context, "Dispositivo no encontrado --> Broadcast", Toast.LENGTH_SHORT).show(); 53 | } 54 | } 55 | } catch (Exception e ) { 56 | Toast.makeText(context, "ERROR en Broadcast", Toast.LENGTH_SHORT).show(); 57 | } 58 | } 59 | 60 | 61 | } 62 | -------------------------------------------------------------------------------- /app/src/main/java/ti/uts/alckon/usbdevice/IniciarLectura.java: -------------------------------------------------------------------------------- 1 | package ti.uts.alckon.usbdevice; 2 | 3 | import android.app.Activity; 4 | import android.content.BroadcastReceiver; 5 | import android.os.Bundle; 6 | import android.view.View; 7 | import android.widget.Button; 8 | import android.widget.TextView; 9 | import android.widget.Toast; 10 | 11 | /** 12 | * Created by alckon on 3/09/15. 13 | */ 14 | public class IniciarLectura extends Activity { 15 | 16 | 17 | 18 | Button iniciarLectura; 19 | TextView txtVisual; 20 | 21 | public boolean ready = false; 22 | public BroadcastConnectionUSB mBroadcastConnectionUSB; 23 | 24 | 25 | @Override 26 | protected void onCreate(Bundle savedInstanceState) { 27 | super.onCreate(savedInstanceState); 28 | setContentView(R.layout.lectura); 29 | 30 | iniciarLectura = (Button) findViewById(R.id.next_actividad); 31 | txtVisual = (TextView) findViewById(R.id.txt_visualizar); 32 | 33 | iniciarLectura.setOnClickListener(new View.OnClickListener() { 34 | @Override 35 | public void onClick(View v) { 36 | //Toast.makeText(getApplicationContext(), "Iniciar lectura", Toast.LENGTH_LONG).show(); 37 | if(!ready) 38 | { 39 | txtVisual.setText("Not Connection"); 40 | } 41 | else 42 | { 43 | txtVisual.setText("Connection Sucessfull"); 44 | } 45 | } 46 | }); 47 | } 48 | 49 | @Override 50 | protected void onResume() { 51 | super.onResume(); 52 | //Inicialimamos Broacdast 53 | mBroadcastConnectionUSB = new BroadcastConnectionUSB(); 54 | 55 | 56 | } 57 | 58 | @Override 59 | protected void onPause() { 60 | super.onPause(); 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /app/src/main/java/ti/uts/alckon/usbdevice/LogViewer.java: -------------------------------------------------------------------------------- 1 | package ti.uts.alckon.usbdevice; 2 | 3 | import grindec.uts.utils.Logger; 4 | import ti.uts.alckon.usbdevice.R; 5 | 6 | import android.app.Activity; 7 | import android.os.Bundle; 8 | import android.view.View; 9 | import android.widget.Button; 10 | import android.widget.EditText; 11 | import android.widget.TextView; 12 | 13 | public class LogViewer extends Activity { 14 | 15 | TextView txt; 16 | 17 | @Override 18 | protected void onCreate(Bundle savedInstanceState) { 19 | super.onCreate(savedInstanceState); 20 | setContentView(R.layout.log_viewer); 21 | 22 | txt = (TextView) findViewById(R.id.textView1); 23 | txt.setText(Logger.read("error.log", getApplicationContext())); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /app/src/main/java/ti/uts/alckon/usbdevice/MainActivity.java: -------------------------------------------------------------------------------- 1 | package ti.uts.alckon.usbdevice; 2 | 3 | import android.annotation.TargetApi; 4 | import android.app.Activity; 5 | import android.app.PendingIntent; 6 | import android.content.BroadcastReceiver; 7 | import android.content.Context; 8 | import android.content.Intent; 9 | import android.content.IntentFilter; 10 | import android.hardware.usb.UsbDevice; 11 | import android.hardware.usb.UsbDeviceConnection; 12 | import android.hardware.usb.UsbEndpoint; 13 | import android.hardware.usb.UsbInterface; 14 | import android.hardware.usb.UsbManager; 15 | import android.os.Build; 16 | import android.os.Bundle; 17 | import android.util.Log; 18 | import android.view.Menu; 19 | import android.view.MenuItem; 20 | import android.view.View; 21 | import android.widget.Button; 22 | import android.widget.TextView; 23 | import android.widget.Toast; 24 | 25 | import com.hoho.android.usbserial.driver.UsbSerialDriver; 26 | import com.hoho.android.usbserial.driver.UsbSerialProber; 27 | import com.hoho.android.usbserial.util.HexDump; 28 | import com.hoho.android.usbserial.util.SerialInputOutputManager; 29 | 30 | import java.io.IOException; 31 | import java.nio.charset.Charset; 32 | import java.util.Calendar; 33 | import java.util.HashMap; 34 | import java.util.Iterator; 35 | import java.util.concurrent.ExecutorService; 36 | import java.util.concurrent.Executors; 37 | 38 | public class MainActivity extends Activity { 39 | 40 | private static final String TAG = "USB-Example"; 41 | 42 | Calendar lastRead; 43 | String lastString; 44 | 45 | // Variables GUI 46 | Button btn; 47 | Button next; 48 | Button lectura; 49 | 50 | TextView textViewTemperatura; 51 | TextView textViewHumedad; 52 | TextView textViewName; 53 | TextView textViewProtocol; 54 | TextView textViewID; 55 | TextView textViewVendor; 56 | TextView textEstado; 57 | TextView txtLectura; 58 | 59 | 60 | // TODO: Variables USB 61 | UsbManager mUsbManager; 62 | UsbDevice mUsbDevice; 63 | PendingIntent mPermissionIntent; 64 | 65 | private final ExecutorService mExecutor = Executors.newSingleThreadExecutor(); 66 | private UsbSerialDriver mSerialDevice; 67 | 68 | private SerialInputOutputManager mSerialIoManager; 69 | 70 | private final SerialInputOutputManager.Listener mListener = 71 | new SerialInputOutputManager.Listener() { 72 | 73 | @Override 74 | public void onRunError(Exception e) { 75 | Log.d(TAG, "Runner stopped."); 76 | } 77 | 78 | @Override 79 | public void onNewData(final byte[] data) { 80 | MainActivity.this.runOnUiThread(new Runnable() { 81 | @Override 82 | public void run() { 83 | MainActivity.this.updateReceivedData(data); 84 | } 85 | }); 86 | } 87 | }; 88 | 89 | 90 | 91 | // TODO: Al conectar a un dispositvo USB se solicita un permiso al usuario 92 | 93 | private static final String ACTION_USB_PERMISSION = "ti.uts.alckon.usbdevice.USB_PERMISSION"; 94 | 95 | private void updateReceivedData(byte[] data) { 96 | String temp = new String(data); 97 | boolean continuar = false; 98 | if( temp.contains("=") && temp.contains(";") ) { 99 | lastString = temp; 100 | continuar = true; 101 | } else if( temp.contains("=") ) 102 | lastString = temp; 103 | else if( temp.contains(";") ) { 104 | lastString = lastString!=null ? lastString + temp : temp; 105 | if( lastString.contains("=")&&lastString.contains(";")) 106 | continuar = true; 107 | } else { 108 | lastString = ""; 109 | } 110 | if( continuar ) { 111 | String message = lastString; 112 | 113 | if (message.contains("=") && message.contains(";")) 114 | txtLectura.setText(message); 115 | textEstado.setText(message); 116 | textViewHumedad.setText(message.contains("=") + " " + message.contains(";")); 117 | lastRead = null; 118 | lastString = ""; 119 | } 120 | } 121 | 122 | private void stopIoManager() { 123 | if (mSerialIoManager != null) { 124 | Log.i(TAG, "Stopping io manager .."); 125 | mSerialIoManager.stop(); 126 | mSerialIoManager = null; 127 | } 128 | } 129 | 130 | private void startIoManager() { 131 | if (mSerialDevice != null) { 132 | Log.i(TAG, "Starting io manager .."); 133 | mSerialIoManager = new SerialInputOutputManager(mSerialDevice, mListener); 134 | mExecutor.submit(mSerialIoManager); 135 | } 136 | } 137 | 138 | private void onDeviceStateChange() { 139 | stopIoManager(); 140 | startIoManager(); 141 | } 142 | 143 | @Override 144 | protected void onCreate(Bundle savedInstanceState) { 145 | 146 | super.onCreate(savedInstanceState); 147 | setContentView(R.layout.activity_main); 148 | 149 | 150 | textViewTemperatura = (TextView) findViewById(R.id.textView1); 151 | textViewHumedad = (TextView) findViewById(R.id.textView2); 152 | 153 | textViewName = (TextView) findViewById(R.id.txt_name); 154 | textViewProtocol = (TextView) findViewById(R.id.txt_protocol); 155 | textViewID = (TextView) findViewById(R.id.txt_id); 156 | textViewVendor = (TextView) findViewById(R.id.txt_vendor); 157 | textEstado = (TextView) findViewById(R.id.txt_estado); 158 | 159 | txtLectura = (TextView) findViewById(R.id.txt_lectura); 160 | 161 | lectura = (Button) findViewById(R.id.log); 162 | next = (Button) findViewById(R.id.button2); 163 | 164 | next.setOnClickListener(new View.OnClickListener() { 165 | @Override 166 | public void onClick(View v) { 167 | Intent i = new Intent(MainActivity.this, IniciarLectura.class); 168 | startActivity(i); 169 | } 170 | }); 171 | 172 | 173 | // TODO: Boton Conectar. 174 | btn = (Button) findViewById(R.id.button1); 175 | 176 | mUsbManager = (UsbManager) getSystemService(Context.USB_SERVICE); 177 | 178 | btn.setOnClickListener(new View.OnClickListener() { 179 | 180 | @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR1) 181 | @Override 182 | public void onClick(View v) { 183 | 184 | 185 | } 186 | }); 187 | 188 | lectura.setOnClickListener(new View.OnClickListener() { 189 | @Override 190 | public void onClick(View v) { 191 | 192 | Thread hilo = new Thread(new Runnable() { 193 | @Override 194 | public void run() { 195 | while(true) 196 | { 197 | try 198 | { 199 | mSerialDevice.write(new byte[]{5},0); 200 | } 201 | catch( final Exception e ) 202 | { 203 | runOnUiThread(new Runnable() { 204 | @Override 205 | public void run() { 206 | Toast.makeText(getApplicationContext(), "Error de envio...", Toast.LENGTH_LONG).show(); 207 | } 208 | }); 209 | 210 | } 211 | try 212 | { 213 | Thread.sleep(1000); 214 | } 215 | catch (Exception e) 216 | { 217 | runOnUiThread(new Runnable() { 218 | @Override 219 | public void run() { 220 | Toast.makeText(getApplicationContext(), "Error en el hilo", Toast.LENGTH_LONG).show(); 221 | } 222 | }); 223 | } 224 | } 225 | } 226 | }); 227 | //TODO: Iniciamos el Hilo de escritura al Arduino y comnezamos con la lectura 228 | 229 | startListening(); 230 | hilo.start(); 231 | } 232 | }); 233 | } 234 | 235 | @Override 236 | protected void onResume() { 237 | super.onResume(); 238 | 239 | //TODO: Solicitamos permiso al usuario 240 | mPermissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), 0); 241 | mUsbManager = (UsbManager) getSystemService(Context.USB_SERVICE); 242 | Toast.makeText(getApplicationContext(), "Solicitando permiso al Usuario", Toast.LENGTH_SHORT).show(); 243 | 244 | //TODO: Registro del Broadcast 245 | //registerReceiver(mUsbReceiver, new IntentFilter(ACTION_USB_PERMISSION)); 246 | //registerReceiver(mUsbReceiver, new IntentFilter(UsbManager.ACTION_USB_DEVICE_DETACHED)); 247 | startConnection(); 248 | 249 | 250 | } 251 | 252 | @Override 253 | protected void onPause() { 254 | super.onPause(); 255 | 256 | //if (this.mUsbReceiver != null){ 257 | // unregisterReceiver(mUsbReceiver); 258 | //} 259 | } 260 | 261 | @Override 262 | public boolean onCreateOptionsMenu(Menu menu) { 263 | // Inflate the menu; this adds items to the action bar if it is present. 264 | getMenuInflater().inflate(R.menu.menu_main, menu); 265 | return true; 266 | } 267 | 268 | @Override 269 | public boolean onOptionsItemSelected(MenuItem item) { 270 | // Handle action bar item clicks here. The action bar will 271 | // automatically handle clicks on the Home/Up button, so long 272 | // as you specify a parent activity in AndroidManifest.xml. 273 | int id = item.getItemId(); 274 | if (id == R.id.action_settings) { 275 | return true; 276 | } else if (id == R.id.menu_log) { 277 | Intent intent = new Intent(this,LogViewer.class); 278 | startActivity(intent); 279 | return true; 280 | } 281 | return super.onOptionsItemSelected(item); 282 | } 283 | 284 | private void startListening() { 285 | mSerialDevice = UsbSerialProber.acquire(mUsbManager); 286 | Toast.makeText(getApplicationContext(), "Resumed, mSerialDevice=" + mSerialDevice, Toast.LENGTH_SHORT).show(); 287 | if (mSerialDevice == null) 288 | { 289 | textEstado.setText("Dispositivo Serial no Encontrado"); 290 | } else 291 | { 292 | try 293 | { 294 | mSerialDevice.open(); 295 | mSerialDevice.setBaudRate(9600); 296 | } 297 | catch (IOException e) 298 | { 299 | Toast.makeText(getApplicationContext(), "Error configurando el Dispositivo" + e.getMessage(), Toast.LENGTH_SHORT).show(); 300 | textEstado.setText("Error abriendo el dispositivo: " + e.getMessage()); 301 | try { 302 | mSerialDevice.close(); 303 | } catch (IOException e2) { 304 | // Ignore. 305 | } 306 | mSerialDevice = null; 307 | return; 308 | } 309 | 310 | textEstado.setText("Dispositivo Serial: " + mSerialDevice); 311 | } 312 | 313 | onDeviceStateChange(); 314 | } 315 | 316 | public void startConnection() 317 | { 318 | //TODO: Obtemos el Manager USB del sistema Android 319 | mUsbManager = (UsbManager) getSystemService(Context.USB_SERVICE); 320 | 321 | // TODO: Recuperamos todos los dispositvos USB detectados 322 | HashMap deviceList = mUsbManager.getDeviceList(); 323 | 324 | //TODO: en nuestor ejemplo solo conectamos un disposito asi que sera el unico que encontraremos. 325 | 326 | Iterator deviceIterator = deviceList.values().iterator(); 327 | if (deviceIterator != null) { 328 | while (deviceIterator.hasNext()) { 329 | 330 | mUsbDevice = deviceIterator.next(); 331 | 332 | textViewName.setText("USB: " + mUsbDevice.getDeviceName()); 333 | textViewProtocol.setText("Protocolo: " + mUsbDevice.getDeviceProtocol()); 334 | textViewID.setText("ID: " + mUsbDevice.getProductId()); 335 | textViewVendor.setText("Vendor: " + mUsbDevice.getVendorId()); 336 | 337 | //TODO: Solicitamos el permiso al usuario. 338 | mUsbManager.requestPermission(mUsbDevice, mPermissionIntent); 339 | mUsbManager = (UsbManager) getSystemService(Context.USB_SERVICE); 340 | 341 | } 342 | 343 | } else { 344 | Toast.makeText(getApplicationContext(), "Dispositivo No Conectado", Toast.LENGTH_SHORT).show(); 345 | } 346 | } 347 | } 348 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | 15 | 16 | 22 | 23 |