Skip to content

Commit 4a37079

Browse files
committed
IOIO: rework usb handling
1 parent 5dd8e1c commit 4a37079

File tree

13 files changed

+109
-195
lines changed

13 files changed

+109
-195
lines changed
Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,20 @@
11
package ioio.smallbasic;
22

33
public class IOIOException extends RuntimeException {
4+
public IOIOException() {
5+
super();
6+
}
7+
48
public IOIOException(Exception exception) {
5-
super(exception.getMessage());
9+
this(exception.getMessage());
610
}
711

812
public IOIOException(String message) {
913
super(message);
14+
IOUtil.setError(message);
1015
}
1116

1217
public String getMessage() {
13-
String result = super.getMessage();
14-
if (result != null) {
15-
result = result.replace("ioio.smallbasic.IOIOException:", "").trim();
16-
}
17-
return result;
18+
return IOUtil.getError();
1819
}
1920
}

ioio/ioio/src/main/java/ioio/smallbasic/IOIOImpl.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ public void sync() {
6060
}
6161

6262
public void waitForConnect(int latency) {
63+
IOUtil.setError(null);
6364
TimerUtil.setLatency(latency);
6465
IOService.getInstance().start();
6566
lock.invoke(IOIO::waitForConnect);

ioio/ioio/src/main/java/ioio/smallbasic/IOLock.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,6 @@ private CountDownLatch beginLatch() {
9090
private void endLatch(CountDownLatch latch) {
9191
try {
9292
if (!latch.await(TIMEOUT_SECS, TimeUnit.SECONDS)) {
93-
IOService.setHardReset(true);
9493
throw new IOIOException("Timeout waiting for device");
9594
}
9695
} catch (InterruptedException e) {

ioio/ioio/src/main/java/ioio/smallbasic/IOService.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ public void loop() throws ConnectionLostException, InterruptedException {
111111
try {
112112
next.loop();
113113
} catch (Throwable e) {
114-
next.setError(e.getLocalizedMessage());
114+
IOUtil.setError(e.getLocalizedMessage());
115115
break;
116116
}
117117
}
@@ -125,7 +125,7 @@ public void setup(IOIO ioio) {
125125
try {
126126
next.setup(ioio);
127127
} catch (Throwable e) {
128-
next.setError(e.getLocalizedMessage());
128+
IOUtil.setError(e.getLocalizedMessage());
129129
break;
130130
}
131131
}

ioio/ioio/src/main/java/ioio/smallbasic/IOTask.java

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import java.io.Closeable;
44
import java.io.IOException;
5-
import java.util.concurrent.atomic.AtomicReference;
65

76
import ioio.lib.api.IOIO;
87
import ioio.lib.api.exception.ConnectionLostException;
@@ -14,29 +13,23 @@
1413
*/
1514
public abstract class IOTask implements Closeable {
1615
protected int pin;
17-
private AtomicReference<String> error;
1816

1917
@Override
2018
public void close() {
2119
IOService.getInstance().removeTask(this);
2220
}
2321

2422
public void handleError() {
25-
if (error.get() != null) {
26-
throw new IOIOException(error.get());
23+
if (IOUtil.getError() != null) {
24+
throw new IOIOException();
2725
}
2826
}
2927

3028
public void open(int pin) throws IOException {
3129
this.pin = pin;
32-
this.error = new AtomicReference<>(null);
3330
IOService.getInstance().addTask(this);
3431
}
3532

36-
public void setError(String error) {
37-
this.error.set(error);
38-
}
39-
4033
int getPin() {
4134
return pin;
4235
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package ioio.smallbasic;
2+
3+
import java.util.concurrent.atomic.AtomicReference;
4+
5+
public class IOUtil {
6+
private static final AtomicReference<String> ERROR = new AtomicReference<>();
7+
8+
private IOUtil() {
9+
// no access
10+
}
11+
12+
public static String getError() {
13+
return ERROR.get();
14+
}
15+
16+
public static synchronized void setError(String error) {
17+
if (error != null && ERROR.get() != null && !ERROR.get().contains(error)) {
18+
ERROR.set(error + " [" + ERROR.get() + "]");
19+
} else {
20+
ERROR.set(error);
21+
}
22+
}
23+
}

ioio/ioio/src/main/java/ioio/smallbasic/SpiMasterImpl.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ void setup(IOIO ioio) throws ConnectionLostException {
5959
}
6060

6161
private void pinError(String name) {
62-
setError("Incorrect " + name + " pin value");
62+
IOUtil.setError("Incorrect " + name + " pin value");
6363
}
6464

6565
private void validatePins() {
@@ -77,7 +77,7 @@ private void validatePins() {
7777
mosi == clk ||
7878
mosi == slaveSelect ||
7979
clk == slaveSelect) {
80-
setError("One or pins have duplicate values");
80+
IOUtil.setError("One or pins have duplicate values");
8181
}
8282
}
8383
}

ioio/ioio/src/main/java/ioio/smallbasic/android/AccessoryConnectionBootstrap.java

Lines changed: 4 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -29,32 +29,20 @@
2929

3030
package ioio.smallbasic.android;
3131

32-
import android.content.Context;
33-
import android.hardware.usb.UsbAccessory;
34-
import android.hardware.usb.UsbManager;
35-
3632
import java.util.Collection;
3733

3834
import ioio.lib.api.IOIOConnection;
3935
import ioio.lib.spi.IOIOConnectionBootstrap;
4036
import ioio.lib.spi.IOIOConnectionFactory;
41-
import ioio.lib.spi.Log;
42-
import ioio.lib.spi.NoRuntimeSupportException;
4337

4438
public class AccessoryConnectionBootstrap implements IOIOConnectionBootstrap, IOIOConnectionFactory {
45-
private static final String TAG = AccessoryConnectionBootstrap.class.getSimpleName();
46-
47-
public AccessoryConnectionBootstrap() throws NoRuntimeSupportException {
48-
Log.d(TAG, "creating AccessoryConnectionBootstrap");
39+
public AccessoryConnectionBootstrap() {
40+
super();
4941
}
5042

5143
@Override
5244
public IOIOConnection createConnection() {
53-
Log.i(TAG, "createConnection");
54-
Context activity = IOIOLoader.getContext();
55-
UsbManager usbManager = (UsbManager) activity.getSystemService(Context.USB_SERVICE);
56-
UsbAccessory accessory = usbManager.getAccessoryList()[0];
57-
return new BluetoothConnection(getUsbManager().openAccessory(accessory));
45+
return new UsbConnection();
5846
}
5947

6048
@Override
@@ -69,11 +57,6 @@ public void getFactories(Collection<IOIOConnectionFactory> result) {
6957

7058
@Override
7159
public String getType() {
72-
return BluetoothConnection.class.getCanonicalName();
73-
}
74-
75-
private UsbManager getUsbManager() {
76-
Context activity = IOIOLoader.getContext();
77-
return (UsbManager) activity.getSystemService(Context.USB_SERVICE);
60+
return UsbConnection.class.getCanonicalName();
7861
}
7962
}

ioio/ioio/src/main/java/ioio/smallbasic/android/AccessoryPermissionCheck.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,12 @@ public class AccessoryPermissionCheck extends BroadcastReceiver {
2323
@TargetApi(Build.VERSION_CODES.TIRAMISU)
2424
public AccessoryPermissionCheck() {
2525
Log.d(TAG, "AccessoryPermissionCheck entered");
26-
UsbManager usbManager = (UsbManager) IOIOLoader.getContext().getSystemService(Context.USB_SERVICE);
27-
UsbAccessory[] accessories = usbManager.getAccessoryList();
28-
UsbAccessory accessory = (accessories == null ? null : accessories[0]);
26+
UsbAccessory accessory = UsbUtil.getUsbAccessory();
2927
if (accessory == null) {
3028
throw new IOIOException("No usb accessory found.");
3129
}
30+
31+
UsbManager usbManager = (UsbManager) IOIOLoader.getContext().getSystemService(Context.USB_SERVICE);
3232
if (!usbManager.hasPermission(accessory)) {
3333
new Handler(Looper.getMainLooper()).post(() -> {
3434
Context context = IOIOLoader.getContext();
@@ -40,7 +40,7 @@ public AccessoryPermissionCheck() {
4040
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, flags);
4141
usbManager.requestPermission(accessory, pendingIntent);
4242
});
43-
// for some reason using a latch caused an ANR here
43+
// for some reason using a latch here caused an ANR
4444
Log.d(TAG, "requesting permission");
4545
throw new IOIOException(PERMISSION_ERROR);
4646
}

ioio/ioio/src/main/java/ioio/smallbasic/android/FixedReadBufferedInputStream.java

Lines changed: 0 additions & 99 deletions
This file was deleted.

0 commit comments

Comments
 (0)