disconnectFrame method
Future<void>
disconnectFrame(
)
Implementation
Future<void> disconnectFrame() async {
if (frame != null) {
try {
_log.fine('Disconnecting from Frame');
// break first in case it's sleeping - otherwise the reset won't work
await frame!.sendBreakSignal();
_log.fine('Break signal sent');
// TODO the break signal needs some more time to be processed before we can reliably send the reset signal, by the looks of it
await Future.delayed(const Duration(milliseconds: 500));
// cancel the stdout and data subscriptions
_rxStdOut?.cancel();
_log.fine('StdOut subscription canceled');
_rxAppData?.cancel();
_log.fine('AppData subscription canceled');
// try to reset device back to running main.lua
await frame!.sendResetSignal();
_log.fine('Reset signal sent');
// TODO the reset signal doesn't seem to be processed in time if we disconnect immediately, so we introduce a delay here to give it more time
// The sdk's sendResetSignal actually already adds 100ms delay
// perhaps it's not quite enough.
await Future.delayed(const Duration(milliseconds: 500));
} catch (e) {
_log.fine('Error while sending reset signal: $e');
}
try {
// try to disconnect cleanly if the device allows
await frame!.disconnect();
} catch (e) {
_log.fine('Error while calling disconnect(): $e');
}
} else {
_log.fine('Current device is null, disconnection not possible');
}
_batt = null;
currentState = ApplicationState.disconnected;
if (mounted) setState(() {});
}