example app with event-based or direct read

This commit is contained in:
kai-morich 2020-04-08 22:10:33 +02:00
parent 2354f93354
commit ca78840144
6 changed files with 67 additions and 15 deletions

View File

@ -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'
}
}

View File

@ -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<ListItem> listItems = new ArrayList<>();
private ArrayAdapter<ListItem> 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();

View File

@ -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);
}

View File

@ -93,6 +93,12 @@
android:textAppearance="@style/TextAppearance.AppCompat.Medium"
android:typeface="monospace" />
<Button
android:id="@+id/receive_btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Read" />
<View
android:layout_width="match_parent"
android:background="?android:attr/listDivider"

View File

@ -6,4 +6,7 @@
<item
android:id="@+id/baud_rate"
android:title="Baud rate" />
<item
android:id="@+id/read_mode"
android:title="Read mode" />
</menu>

View File

@ -7,4 +7,8 @@
<item>57600</item>
<item>115200</item>
</string-array>
<string-array name="read_modes">
<item>event: SerialInputOutputManager.onNewData()</item>
<item>direct: UsbSerialPort.read()</item>
</string-array>
</resources>