example app with event-based or direct read
This commit is contained in:
parent
2354f93354
commit
ca78840144
|
@ -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'
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
Loading…
Reference in New Issue