diff --git a/build.gradle b/build.gradle index efcf47f..4ac3695 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ buildscript { google() } dependencies { - classpath 'com.android.tools.build:gradle:3.6.1' + classpath 'com.android.tools.build:gradle:3.6.2' } } diff --git a/usbSerialExamples/src/main/java/com/hoho/android/usbserial/examples/DevicesFragment.java b/usbSerialExamples/src/main/java/com/hoho/android/usbserial/examples/DevicesFragment.java index adfc38b..3a057f9 100644 --- a/usbSerialExamples/src/main/java/com/hoho/android/usbserial/examples/DevicesFragment.java +++ b/usbSerialExamples/src/main/java/com/hoho/android/usbserial/examples/DevicesFragment.java @@ -2,7 +2,6 @@ package com.hoho.android.usbserial.examples; import android.app.AlertDialog; import android.content.Context; -import android.content.DialogInterface; import android.hardware.usb.UsbDevice; import android.hardware.usb.UsbManager; import android.os.Bundle; @@ -41,6 +40,7 @@ public class DevicesFragment extends ListFragment { private ArrayList listItems = new ArrayList<>(); private ArrayAdapter listAdapter; private int baudRate = 19200; + private boolean withIoManager = true; @Override public void onCreate(Bundle savedInstanceState) { @@ -95,15 +95,24 @@ public class DevicesFragment extends ListFragment { refresh(); return true; } else if (id ==R.id.baud_rate) { - final String[] baudRates = getResources().getStringArray(R.array.baud_rates); - int pos = java.util.Arrays.asList(baudRates).indexOf(String.valueOf(baudRate)); + final String[] values = getResources().getStringArray(R.array.baud_rates); + int pos = java.util.Arrays.asList(values).indexOf(String.valueOf(baudRate)); AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setTitle("Baud rate"); - builder.setSingleChoiceItems(baudRates, pos, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int item) { - baudRate = Integer.valueOf(baudRates[item]); - dialog.dismiss(); - } + builder.setSingleChoiceItems(values, pos, (dialog, which) -> { + baudRate = Integer.parseInt(values[which]); + dialog.dismiss(); + }); + builder.create().show(); + return true; + } else if (id ==R.id.read_mode) { + final String[] values = getResources().getStringArray(R.array.read_modes); + int pos = withIoManager ? 0 : 1; // read_modes[0]=event/io-manager, read_modes[1]=direct + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); + builder.setTitle("Read mode"); + builder.setSingleChoiceItems(values, pos, (dialog, which) -> { + withIoManager = (which == 0); + dialog.dismiss(); }); builder.create().show(); return true; @@ -142,6 +151,7 @@ public class DevicesFragment extends ListFragment { args.putInt("device", item.device.getDeviceId()); args.putInt("port", item.port); args.putInt("baud", baudRate); + args.putBoolean("withIoManager", withIoManager); Fragment fragment = new TerminalFragment(); fragment.setArguments(args); getFragmentManager().beginTransaction().replace(R.id.fragment, fragment, "terminal").addToBackStack(null).commit(); diff --git a/usbSerialExamples/src/main/java/com/hoho/android/usbserial/examples/TerminalFragment.java b/usbSerialExamples/src/main/java/com/hoho/android/usbserial/examples/TerminalFragment.java index e4b18f7..6dff18e 100644 --- a/usbSerialExamples/src/main/java/com/hoho/android/usbserial/examples/TerminalFragment.java +++ b/usbSerialExamples/src/main/java/com/hoho/android/usbserial/examples/TerminalFragment.java @@ -36,6 +36,7 @@ import com.hoho.android.usbserial.util.HexDump; import com.hoho.android.usbserial.util.SerialInputOutputManager; import java.io.IOException; +import java.util.Arrays; import java.util.concurrent.Executors; public class TerminalFragment extends Fragment implements SerialInputOutputManager.Listener { @@ -44,8 +45,10 @@ public class TerminalFragment extends Fragment implements SerialInputOutputManag private static final String INTENT_ACTION_GRANT_USB = BuildConfig.APPLICATION_ID + ".GRANT_USB"; private static final int WRITE_WAIT_MILLIS = 2000; + private static final int READ_WAIT_MILLIS = 2000; private int deviceId, portNum, baudRate; + private boolean withIoManager; private BroadcastReceiver broadcastReceiver; private Handler mainLooper; @@ -82,6 +85,7 @@ public class TerminalFragment extends Fragment implements SerialInputOutputManag deviceId = getArguments().getInt("device"); portNum = getArguments().getInt("port"); baudRate = getArguments().getInt("baud"); + withIoManager = getArguments().getBoolean("withIoManager"); } @Override @@ -115,7 +119,13 @@ public class TerminalFragment extends Fragment implements SerialInputOutputManag TextView sendText = view.findViewById(R.id.send_text); View sendBtn = view.findViewById(R.id.send_btn); sendBtn.setOnClickListener(v -> send(sendText.getText().toString())); + View receiveBtn = view.findViewById(R.id.receive_btn); controlLines = new ControlLines(view); + if(withIoManager) { + receiveBtn.setVisibility(View.GONE); + } else { + receiveBtn.setOnClickListener(v -> read()); + } return view; } @@ -197,8 +207,10 @@ public class TerminalFragment extends Fragment implements SerialInputOutputManag try { usbSerialPort.open(usbConnection); usbSerialPort.setParameters(baudRate, 8, UsbSerialPort.STOPBITS_1, UsbSerialPort.PARITY_NONE); - usbIoManager = new SerialInputOutputManager(usbSerialPort, this); - Executors.newSingleThreadExecutor().submit(usbIoManager); + if(withIoManager) { + usbIoManager = new SerialInputOutputManager(usbSerialPort, this); + Executors.newSingleThreadExecutor().submit(usbIoManager); + } status("connected"); connected = true; controlLines.start(); @@ -228,7 +240,7 @@ public class TerminalFragment extends Fragment implements SerialInputOutputManag try { byte[] data = (str + '\n').getBytes(); SpannableStringBuilder spn = new SpannableStringBuilder(); - spn.append("send " + data.length + " bytes:\n"); + spn.append("send " + data.length + " bytes\n"); spn.append(HexDump.dumpHexString(data)+"\n"); spn.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.colorSendText)), 0, spn.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); receiveText.append(spn); @@ -238,11 +250,28 @@ public class TerminalFragment extends Fragment implements SerialInputOutputManag } } + private void read() { + if(!connected) { + Toast.makeText(getActivity(), "not connected", Toast.LENGTH_SHORT).show(); + return; + } + try { + byte[] buffer = new byte[8192]; + int len = usbSerialPort.read(buffer, READ_WAIT_MILLIS); + receive(Arrays.copyOf(buffer, len)); + } catch (IOException e) { + // when using read with timeout, USB bulkTransfer returns -1 on timeout _and_ errors + // like connection loss, so there is typically no exception thrown here on error + status("connection lost: " + e.getMessage()); + disconnect(); + } + } + private void receive(byte[] data) { - String str = new String(data); SpannableStringBuilder spn = new SpannableStringBuilder(); - spn.append("receive " + data.length + " bytes:\n"); - spn.append(HexDump.dumpHexString(data)+"\n"); + spn.append("receive " + data.length + " bytes\n"); + if(data.length > 0) + spn.append(HexDump.dumpHexString(data)+"\n"); receiveText.append(spn); } diff --git a/usbSerialExamples/src/main/res/layout/fragment_terminal.xml b/usbSerialExamples/src/main/res/layout/fragment_terminal.xml index 18c9c7f..7b8a5e9 100644 --- a/usbSerialExamples/src/main/res/layout/fragment_terminal.xml +++ b/usbSerialExamples/src/main/res/layout/fragment_terminal.xml @@ -93,6 +93,12 @@ android:textAppearance="@style/TextAppearance.AppCompat.Medium" android:typeface="monospace" /> +