diff options
| author | xengineering <me@xengineering.eu> | 2026-03-08 17:27:52 +0100 |
|---|---|---|
| committer | xengineering <me@xengineering.eu> | 2026-03-08 17:27:52 +0100 |
| commit | 4bc034c7ab627c50aba7e2ce4da360c14465c150 (patch) | |
| tree | b4e2c5d497ff94ae1d8a32dcb32b5c01a66c2dfa | |
| parent | ef8877ccffe0ebcc8f9f1c0bb6db372fa0886c2a (diff) | |
| download | sia-app-4bc034c7ab627c50aba7e2ce4da360c14465c150.tar sia-app-4bc034c7ab627c50aba7e2ce4da360c14465c150.tar.zst sia-app-4bc034c7ab627c50aba7e2ce4da360c14465c150.zip | |
Switch completely to connection state machine
This makes use of the state machine in the UI and implements all states
and transitions planned so far.
| -rw-r--r-- | lib/data.dart | 40 | ||||
| -rw-r--r-- | lib/ui.dart | 26 |
2 files changed, 39 insertions, 27 deletions
diff --git a/lib/data.dart b/lib/data.dart index 415e61e..eaf301a 100644 --- a/lib/data.dart +++ b/lib/data.dart @@ -9,11 +9,17 @@ const String topicPrefix = 'sia'; enum MachineState { init, // user does not want connection MQTT not connected disconnected, // user wants connection but MQTT not (yet) connected + unreachable, // connected to MQTT broker but Sia server not reachable + reachable, // connected to MQTT and Sia server reachable } enum MachineEvent { connect, // user wants to connect disconnect, // user does not want an connection anymore + connected, // connection to MQTT broker established + disconnected, // connection to MQTT broker lost + reachable, // Sia server is reachable via MQTT + unreachable, // Sia server not reachable via MQTT } class AppState with ChangeNotifier { @@ -23,16 +29,23 @@ class AppState with ChangeNotifier { }, MachineState.disconnected: <MachineEvent, MachineState> { MachineEvent.disconnect: MachineState.init, + MachineEvent.connected: MachineState.unreachable, + }, + MachineState.unreachable: <MachineEvent, MachineState> { + MachineEvent.disconnect: MachineState.init, + MachineEvent.disconnected: MachineState.disconnected, + MachineEvent.reachable: MachineState.reachable, + }, + MachineState.reachable: <MachineEvent, MachineState> { + MachineEvent.disconnect: MachineState.init, + MachineEvent.disconnected: MachineState.disconnected, + MachineEvent.unreachable: MachineState.unreachable, }, }; MachineState state = MachineState.init; Map<String, bool> contacts = <String, bool>{}; late MqttServerClient _client; - bool _brokerConnected = false; - bool get brokerConnected => _brokerConnected; - bool _serverConnected = false; - bool get serverConnected => _serverConnected; AppState(); @@ -105,23 +118,20 @@ class AppState with ChangeNotifier { void _onConnected() { _client.subscribe('$topicPrefix/contact/+/state', MqttQos.exactlyOnce); _client.subscribe('$topicPrefix/server/health', MqttQos.exactlyOnce); - _brokerConnected = true; - notifyListeners(); + + process(MachineEvent.connected); } void _onDisconnected() { - _brokerConnected = false; - notifyListeners(); + process(MachineEvent.disconnected); } void _onAutoReconnect() { - _brokerConnected = false; - notifyListeners(); + process(MachineEvent.disconnected); } void _onAutoReconnected() { - _brokerConnected = true; - notifyListeners(); + process(MachineEvent.connected); } void _onMessage(List<MqttReceivedMessage<MqttMessage>> messages) { @@ -135,13 +145,11 @@ class AppState with ChangeNotifier { if (topic == '$topicPrefix/server/health') { if (payload == 'good') { - _serverConnected = true; - notifyListeners(); + process(MachineEvent.reachable); } if (payload == 'bad') { - _serverConnected = false; - notifyListeners(); + process(MachineEvent.unreachable); } } diff --git a/lib/ui.dart b/lib/ui.dart index e14895b..7a97f32 100644 --- a/lib/ui.dart +++ b/lib/ui.dart @@ -98,18 +98,22 @@ class ConnectionStatus extends StatelessWidget { return SafeArea( child: Consumer<AppState>( builder: (BuildContext context, AppState state, Widget? child) { - Icon icon; - Text text; + Icon icon = const Icon(Icons.cloud_off, color: Colors.grey); + Text text = const Text('Disconnected'); - if (state.brokerConnected && state.serverConnected) { - icon = const Icon(Icons.cloud, color: Colors.green); - text = const Text('Connected'); - } else if (state.brokerConnected && !state.serverConnected) { - icon = const Icon(Icons.cloud_off, color: Colors.orange); - text = const Text('Connection issue'); - } else { - icon = const Icon(Icons.cloud_off, color: Colors.red); - text = const Text('Disconnected'); + switch (state.state) { + case MachineState.init: + icon = const Icon(Icons.cloud_off, color: Colors.grey); + text = const Text('Off'); + case MachineState.disconnected: + icon = const Icon(Icons.cloud_off, color: Colors.red); + text = const Text('Disconnected'); + case MachineState.unreachable: + icon = const Icon(Icons.cloud_off, color: Colors.orange); + text = const Text('Unreachable'); + case MachineState.reachable: + icon = const Icon(Icons.cloud, color: Colors.green); + text = const Text('Connected'); } MachineEvent event = MachineEvent.disconnect; |
