Files
app-flutter/lib/net.dart
T
mikkeli 6b5fef41c4
CI / Analyze & Test (push) Successful in 10s
CI / Debug APK (push) Successful in 25s
Link test: UDP echo sweep, soak and TCP each way, driven by the app
The tablet's app sockets are the only ones bound to the USB link, so the
measurement has to run in the app. tool/linktest_server.py serves the
Orin end and logs every result with its own TCP_INFO. Startable without
touching the screen: am start ... --es linktest <label>.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DDwfd6Ki8UfG4hK6W5YpJz
2026-10-11 15:55:52 +09:00

43 lines
1.4 KiB
Dart

// Android only: binding the process to the USB (NCM) Ethernet link to the Orin.
// See MainActivity.kt for why Android needs telling.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/services.dart';
class UsbLink extends ChangeNotifier {
static const _ch = MethodChannel('yukart/net');
bool supported = Platform.isAndroid;
bool up = false;
bool bound = false;
/// Development hook: a link test requested by launch intent (see MainActivity.kt).
void Function(String label)? onLinkTest;
UsbLink() {
if (!supported) return;
_ch.setMethodCallHandler((call) async {
if (call.method == 'ethernet') {
final a = Map<String, dynamic>.from(call.arguments as Map);
up = a['up'] == true;
bound = a['bound'] == true;
notifyListeners();
} else if (call.method == 'linktest') {
onLinkTest?.call(call.arguments as String);
}
});
}
/// A link test requested by the intent that launched the app, once.
Future<String?> takeLinkTest() async => supported ? _ch.invokeMethod<String>('takeLinkTest') : null;
/// Bind only when the target is on the USB link; a workstation over WiFi must stay reachable.
Future<void> bindFor(Uri target) async {
if (!supported) return;
final want = target.host.startsWith('192.168.55.');
await _ch.invokeMethod<bool>('bindEthernet', want);
}
}