From 163cd99871261f38ab01953f660af85df9f3d097 Mon Sep 17 00:00:00 2001 From: Gold87 <91761103+Gold872@users.noreply.github.com> Date: Tue, 24 Sep 2024 19:04:35 -0400 Subject: [PATCH 01/17] Initial rough draft of mini dashboard --- lib/mini.dart | 180 +++++++++++++++ lib/src/models/data/sockets.dart | 14 ++ lib/src/pages/mini_home.dart | 213 ++++++++++++++++++ lib/src/pages/mini_metrics.dart | 34 +++ lib/src/widgets/navigation/footer.dart | 4 +- macos/Flutter/GeneratedPluginRegistrant.swift | 2 + pubspec.lock | 123 +++++++++- pubspec.yaml | 1 + 8 files changed, 567 insertions(+), 4 deletions(-) create mode 100644 lib/mini.dart create mode 100644 lib/src/pages/mini_home.dart create mode 100644 lib/src/pages/mini_metrics.dart diff --git a/lib/mini.dart b/lib/mini.dart new file mode 100644 index 0000000000..b70bf665f5 --- /dev/null +++ b/lib/mini.dart @@ -0,0 +1,180 @@ +/// The entrypoint of the app. +/// +/// These `library` declarations are not needed, the default name for a Dart library is simply the +/// name of the file. However, DartDoc comments placed above a library declaration will show up on +/// the libraries page in the generated documentation. +/// +/// This library's main purpose is to execute the app defined in the app library and is designed to +/// be as simple as possible. +library main; + +import "dart:async"; +import "dart:io"; +import "package:flutter/material.dart"; + +import "package:rover_dashboard/app.dart"; +import "package:rover_dashboard/data.dart"; +import "package:rover_dashboard/models.dart"; +import "package:rover_dashboard/services.dart"; +import "package:rover_dashboard/src/pages/logs.dart"; +import "package:rover_dashboard/src/pages/mini_home.dart"; +import "package:device_preview/device_preview.dart"; +import "package:rover_dashboard/src/pages/mini_metrics.dart"; +import "package:rover_dashboard/widgets.dart"; + +class MiniHomePage extends StatefulWidget { + const MiniHomePage({super.key}); + + @override + State createState() => _MiniHomePageState(); +} + +class _MiniHomePageState extends State { + @override + void initState() { + init(); + super.initState(); + } + + Future init() async { + await services.init(); + await models.init(); + + if (mounted) { + setState(() {}); + } + } + + @override + Widget build(BuildContext context) => Scaffold( + appBar: AppBar( + automaticallyImplyLeading: false, + title: Text("Dashboard v${models.home.version ?? ''}"), + actions: const [ + PowerButton(), + ], + ), + body: DefaultTabController( + length: 3, + child: Column( + children: [ + const TabBar( + tabs: [ + Tab(text: "Home"), + Tab(text: "Metrics"), + Tab(text: "Logs"), + ], + ), + Expanded( + child: TabBarView( + children: [ + const MiniHome(), + MiniMetrics(models.rover.metrics), + LogsPage(), + ], + ), + ), + ], + ), + ), + bottomNavigationBar: MiniFooter(), + ); +} + +class PowerButton extends StatelessWidget { + const PowerButton({super.key}); + + @override + Widget build(BuildContext context) => Container( + decoration: const BoxDecoration( + color: Colors.white, + shape: BoxShape.circle, + ), + padding: EdgeInsets.zero, + child: IconButton( + icon: const Icon( + Icons.power_settings_new, + color: Colors.red, + ), + onPressed: () async { + await showDialog( + context: context, + barrierDismissible: false, + builder: (_) => AlertDialog( + title: const Text("Are you sure?"), + content: const Text("This will turn off the rover and you must physically turn it back on again"), + actions: [ + TextButton(child: const Text("Cancel"), onPressed: () => Navigator.of(context).pop()), + ElevatedButton( + onPressed: () { + models.rover.settings.setStatus(RoverStatus.POWER_OFF); + Navigator.of(context).pop(); + }, + child: const Text("Continue"), + ), + ], + ), + ); + }, + ), + ); +} + +class MiniFooter extends StatelessWidget { + const MiniFooter({super.key}); + + @override + Widget build(BuildContext context) => ColoredBox( + color: context.colorScheme.secondary, + child: MessageDisplay(showLogs: false), + ); +} + +class MiniDashboard extends StatelessWidget { + const MiniDashboard({super.key}); + + @override + Widget build(BuildContext context) => MaterialApp( + title: "Binghamton University Rover Team", + debugShowCheckedModeBanner: false, + themeMode: ThemeMode.light, + theme: ThemeData( + colorScheme: const ColorScheme.light( + primary: binghamtonGreen, + secondary: binghamtonGreen, + ), + appBarTheme: const AppBarTheme( + backgroundColor: binghamtonGreen, + foregroundColor: Colors.white, + ), + ), + darkTheme: ThemeData.from( + colorScheme: const ColorScheme.dark( + primary: binghamtonGreen, + secondary: binghamtonGreen, + ), + ), + home: const MiniHomePage(), + ); +} + +/// Network errors that can be fixed by a simple reset. +const networkErrors = {1234, 1231}; + +void main() async { + runZonedGuarded( + () => runApp( + DevicePreview( + enabled: false, + builder: (context) => const MiniDashboard(), + ), + ), (error, stack) async { + if (error is SocketException && networkErrors.contains(error.osError!.errorCode)) { + models.home.setMessage(severity: Severity.critical, text: "Network error, restart by clicking the network icon"); + } else { + models.home.setMessage(severity: Severity.critical, text: "Dashboard error. See the logs"); + await services.files.logError(error, stack); + Error.throwWithStackTrace(error, stack); + } + }); +} diff --git a/lib/src/models/data/sockets.dart b/lib/src/models/data/sockets.dart index 9454fb1fd1..222fb4f56c 100644 --- a/lib/src/models/data/sockets.dart +++ b/lib/src/models/data/sockets.dart @@ -37,6 +37,9 @@ class Sockets extends Model { /// The rover-like system currently in use. RoverType rover = RoverType.rover; + /// Whether or not the sockets are currently enabled + bool isEnabled = true; + /// The [InternetAddress] to use instead of the address on the rover. InternetAddress? get addressOverride => switch (rover) { RoverType.rover => null, @@ -55,6 +58,7 @@ class Sockets extends Model { @override Future init() async { + isEnabled = true; for (final socket in sockets) { await socket.init(); } @@ -62,8 +66,18 @@ class Sockets extends Model { Logger.level = LogLevel.warning; await updateSockets(); Logger.level = level; + notifyListeners(); } + /// Disconnects from all sockets without restarting them + Future disable() async { + isEnabled = false; + for (final socket in sockets) { + await socket.dispose(); + } + notifyListeners(); + } + @override Future dispose() async { for (final socket in sockets) { diff --git a/lib/src/pages/mini_home.dart b/lib/src/pages/mini_home.dart new file mode 100644 index 0000000000..5a8072cd02 --- /dev/null +++ b/lib/src/pages/mini_home.dart @@ -0,0 +1,213 @@ +import "package:flutter/material.dart"; +import "package:rover_dashboard/data.dart"; +import "package:rover_dashboard/models.dart"; +import "package:rover_dashboard/widgets.dart"; + +class MiniHome extends StatelessWidget { + const MiniHome({super.key}); + + @override + Widget build(BuildContext context) => Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Expanded( + flex: 3, + child: Column( + children: [ + Expanded( + child: MiniHomeVoltage(models.rover.metrics), + ), + const Divider(), + const Flexible( + child: Placeholder(), + ), + const Divider(), + SizedBox( + height: 75, + child: MiniHomeToggleOptions(models.sockets), + ), + ], + ), + ), + const SizedBox(width: 5), + Expanded( + flex: 2, + child: MiniHomeSystemStatus(LogsViewModel()), + ), + ], + ); +} + +class MiniHomeVoltage extends ReusableReactiveWidget { + const MiniHomeVoltage(super.model); + + /// An appropriate battery icon in increments of 1/8 battery level. + IconData getBatteryIcon(double percentage) { + if (percentage >= 0.84) { + return Icons.battery_full; + } // 80-100 + else if (percentage >= 0.72) { + return Icons.battery_6_bar; + } // 60-80 + else if (percentage >= 0.60) { + return Icons.battery_5_bar; + } // 60-80 + else if (percentage >= 0.48) { + return Icons.battery_4_bar; + } // 60-80 + else if (percentage >= 0.36) { + return Icons.battery_3_bar; + } // 60-80 + else if (percentage >= 0.24) { + return Icons.battery_2_bar; + } // 40-60 + else if (percentage >= 0.12) { + return Icons.battery_1_bar; + } // 20-40 + else { + return Icons.battery_0_bar; + } // 0-20 + } + + @override + Widget build(BuildContext context, RoverMetrics model) => Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SizedBox( + width: 150, + height: 150, + child: FittedBox( + fit: BoxFit.fill, + child: Icon( + getBatteryIcon(model.drive.batteryVoltage), + ), + ), + ), + const SizedBox(width: 5), + Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "${model.drive.batteryVoltage.toStringAsFixed(2)} V", + style: context.textTheme.displaySmall, + ), + Text( + "${model.drive.data.batteryCurrent.toStringAsFixed(2)} A", + style: context.textTheme.displaySmall, + ), + Text( + "${model.drive.data.batteryTemperature.toStringAsFixed(2)} °C", + style: context.textTheme.displaySmall, + ), + ], + ), + ], + ); +} + +class MiniHomeToggleOptions extends ReusableReactiveWidget { + const MiniHomeToggleOptions(super.model); + + @override + Widget build(BuildContext context, Sockets model) => Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Row( + children: [ + const Text("Dashboard Enabled"), + const SizedBox(width: 5), + Switch( + value: model.isEnabled, + onChanged: (enabled) async { + if (model.rover != RoverType.localhost) { + await model.setRover(RoverType.localhost); + } + + if (!enabled) { + await model.disable(); + } else { + await model.init(); + } + }, + ), + ], + ), + Row( + children: [ + const Text("Idle"), + const SizedBox(width: 5), + ValueListenableBuilder( + valueListenable: models.rover.status, + builder: (context, value, child) => Switch( + value: value != RoverStatus.IDLE, + onChanged: (idle) async { + final value = idle ? RoverStatus.IDLE : RoverStatus.MANUAL; + + await models.rover.settings.setStatus(value); + }, + ), + ), + ], + ), + ], + ); +} + +class MiniHomeSystemStatus extends ReusableReactiveWidget { + const MiniHomeSystemStatus(super.model); + + /// Returns the appropriate status icon for the log messages received from [device] + Widget statusIcon(Device? device) { + final socket = + models.sockets.sockets.firstWhere((socket) => socket.device == device); //models.sockets.fromDevice(device); + final lowestLevel = BurtLogLevel.info; //model.lowestLevel(device); + + Color? iconColor = switch (lowestLevel) { + BurtLogLevel.critical => Colors.red, + BurtLogLevel.info || BurtLogLevel.debug || BurtLogLevel.trace => Colors.green, + BurtLogLevel.warning => Colors.yellow, // Separate line in case if we need to change it at any point + BurtLogLevel.error => Colors.red, + _ => null, + }; + + if (device == null || /*socket == null ||*/ !socket.isConnected) { + iconColor = Colors.black; + } + + return Icon(Icons.circle, color: iconColor); + } + + @override + Widget build(BuildContext context, LogsViewModel model) => Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + for (final device in [Device.SUBSYSTEMS, Device.VIDEO, Device.AUTONOMY]) + SizedBox( + width: 300, + child: Card( + child: Column( + children: [ + ListTile( + title: Text(device.humanName), + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + statusIcon(device), + TextButton.icon( + icon: const Icon(Icons.restart_alt), + onPressed: () { + model.options.resetDevice(device); + }, + label: const Text("Restart Device"), + ), + ], + ), + ], + ), + ), + ), + ], + ); +} diff --git a/lib/src/pages/mini_metrics.dart b/lib/src/pages/mini_metrics.dart new file mode 100644 index 0000000000..8bce53f530 --- /dev/null +++ b/lib/src/pages/mini_metrics.dart @@ -0,0 +1,34 @@ +import "package:flutter/material.dart"; +import "package:rover_dashboard/models.dart"; +import "package:rover_dashboard/src/widgets/generic/reactive_widget.dart"; +import "package:rover_dashboard/widgets.dart"; + +class MiniMetrics extends ReusableReactiveWidget { + const MiniMetrics(super.model); + + @override + Widget build(BuildContext context, RoverMetrics model) => Row( + children: [ + const Spacer(), + Expanded( + flex: 3, + child: ListView( + padding: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 4.0), + children: [ + for (int i = 0; i < 3; i++) MetricsList(model.allMetrics[i]), + ], + ), + ), + const Expanded(child: VerticalDivider()), + Expanded( + flex: 3, + child: ListView( + children: [ + for (int i = 3; i < model.allMetrics.length; i++) MetricsList(model.allMetrics[i]), + ], + ), + ), + const Spacer(), + ], + ); +} diff --git a/lib/src/widgets/navigation/footer.dart b/lib/src/widgets/navigation/footer.dart index 5212e9f58f..ade67172cc 100644 --- a/lib/src/widgets/navigation/footer.dart +++ b/lib/src/widgets/navigation/footer.dart @@ -253,7 +253,9 @@ class MessageDisplay extends ReusableReactiveWidget { Widget build(BuildContext context, HomeModel model) => SizedBox( height: 48, child: InkWell( - onTap: () => Navigator.of(context).push(MaterialPageRoute(builder: (context) => LogsPage())), + onTap: showLogs + ? () => Navigator.of(context).push(MaterialPageRoute(builder: (context) => LogsPage())) + : null, child: Card( shadowColor: Colors.transparent, color: getColor(model.message?.severity), diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index b89dca3d67..27139dadb2 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -10,6 +10,7 @@ import flutter_libserialport import just_audio import package_info_plus import path_provider_foundation +import shared_preferences_foundation import url_launcher_macos func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { @@ -18,5 +19,6 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { JustAudioPlugin.register(with: registry.registrar(forPlugin: "JustAudioPlugin")) FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin")) PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) + SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin")) } diff --git a/pubspec.lock b/pubspec.lock index 51a7dd7fdd..5303ca939d 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -114,6 +114,22 @@ packages: url: "https://pub.dev" source: hosted version: "3.0.3" + device_frame: + dependency: transitive + description: + name: device_frame + sha256: d031a06f5d6f4750009672db98a5aa1536aa4a231713852469ce394779a23d75 + url: "https://pub.dev" + source: hosted + version: "1.2.0" + device_preview: + dependency: "direct main" + description: + name: device_preview + sha256: a694acdd3894b4c7d600f4ee413afc4ff917f76026b97ab06575fe886429ef19 + url: "https://pub.dev" + source: hosted + version: "1.2.0" dylib: dependency: transitive description: @@ -146,6 +162,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.2" + file: + dependency: transitive + description: + name: file + sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c" + url: "https://pub.dev" + source: hosted + version: "7.0.0" file_picker: dependency: "direct main" description: @@ -191,6 +215,11 @@ packages: url: "https://pub.dev" source: hosted version: "0.4.0" + flutter_localizations: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" flutter_plugin_android_lifecycle: dependency: transitive description: @@ -217,6 +246,14 @@ packages: description: flutter source: sdk version: "0.0.0" + freezed_annotation: + dependency: transitive + description: + name: freezed_annotation + sha256: c2e2d632dd9b8a2b7751117abcfc2b4888ecfe181bd9fca7170d9ef02e595fe2 + url: "https://pub.dev" + source: hosted + version: "2.4.4" get_it: dependency: transitive description: @@ -257,6 +294,14 @@ packages: url: "https://pub.dev" source: hosted version: "4.2.0" + intl: + dependency: transitive + description: + name: intl + sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf + url: "https://pub.dev" + source: hosted + version: "0.19.0" json_annotation: dependency: transitive description: @@ -369,6 +414,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.16.7" + nested: + dependency: transitive + description: + name: nested + sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" + url: "https://pub.dev" + source: hosted + version: "1.0.0" package_config: dependency: transitive description: @@ -481,6 +534,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.1.0" + provider: + dependency: transitive + description: + name: provider + sha256: c8a055ee5ce3fd98d6fc872478b03823ffdb448699c6ebdbbc71d59b596fd48c + url: "https://pub.dev" + source: hosted + version: "6.1.2" pub_semver: dependency: transitive description: @@ -497,6 +558,62 @@ packages: url: "https://pub.dev" source: hosted version: "0.27.7" + shared_preferences: + dependency: transitive + description: + name: shared_preferences + sha256: "746e5369a43170c25816cc472ee016d3a66bc13fcf430c0bc41ad7b4b2922051" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + shared_preferences_android: + dependency: transitive + description: + name: shared_preferences_android + sha256: "480ba4345773f56acda9abf5f50bd966f581dac5d514e5fc4a18c62976bbba7e" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + shared_preferences_foundation: + dependency: transitive + description: + name: shared_preferences_foundation + sha256: c4b35f6cb8f63c147312c054ce7c2254c8066745125264f0c88739c417fc9d9f + url: "https://pub.dev" + source: hosted + version: "2.5.2" + shared_preferences_linux: + dependency: transitive + description: + name: shared_preferences_linux + sha256: "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + shared_preferences_platform_interface: + dependency: transitive + description: + name: shared_preferences_platform_interface + sha256: "57cbf196c486bc2cf1f02b85784932c6094376284b3ad5779d1b1c6c6a816b80" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + shared_preferences_web: + dependency: transitive + description: + name: shared_preferences_web + sha256: d2ca4132d3946fec2184261726b355836a82c33d7d5b67af32692aff18a4684e + url: "https://pub.dev" + source: hosted + version: "2.4.2" + shared_preferences_windows: + dependency: transitive + description: + name: shared_preferences_windows + sha256: "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1" + url: "https://pub.dev" + source: hosted + version: "2.4.1" sky_engine: dependency: transitive description: flutter @@ -666,10 +783,10 @@ packages: dependency: transitive description: name: vm_service - sha256: f652077d0bdf60abe4c1f6377448e8655008eef28f128bc023f7b5e8dfeb48fc + sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d" url: "https://pub.dev" source: hosted - version: "14.2.4" + version: "14.2.5" web: dependency: transitive description: @@ -720,4 +837,4 @@ packages: version: "3.1.2" sdks: dart: ">=3.4.0 <4.0.0" - flutter: ">=3.19.0" + flutter: ">=3.22.0" diff --git a/pubspec.yaml b/pubspec.yaml index bfa0fd367a..277c9fdedf 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -24,6 +24,7 @@ dependencies: just_audio: ^0.9.36 just_audio_windows: ^0.2.0 collection: ^1.18.0 + device_preview: ^1.2.0 # Prefer to use `flutter pub add --dev packageName` rather than modify this section by hand. dev_dependencies: From f3287e7b33de6c11b01950320f6f3e449081f69d Mon Sep 17 00:00:00 2001 From: Gold87 <91761103+Gold872@users.noreply.github.com> Date: Tue, 24 Sep 2024 19:41:05 -0400 Subject: [PATCH 02/17] Added gamepad buttons and changed alignments --- lib/mini.dart | 4 +++- lib/src/pages/mini_home.dart | 12 ++++++++++-- lib/src/pages/mini_metrics.dart | 25 +++++++++++++++++++++++-- 3 files changed, 36 insertions(+), 5 deletions(-) diff --git a/lib/mini.dart b/lib/mini.dart index b70bf665f5..6f64763d81 100644 --- a/lib/mini.dart +++ b/lib/mini.dart @@ -39,6 +39,8 @@ class _MiniHomePageState extends State { Future init() async { await services.init(); await models.init(); + await models.sockets.setRover(RoverType.localhost); + await models.sockets.disable(); if (mounted) { setState(() {}); @@ -61,7 +63,7 @@ class _MiniHomePageState extends State { const TabBar( tabs: [ Tab(text: "Home"), - Tab(text: "Metrics"), + Tab(text: "Metrics & Controls"), Tab(text: "Logs"), ], ), diff --git a/lib/src/pages/mini_home.dart b/lib/src/pages/mini_home.dart index 5a8072cd02..524d94d479 100644 --- a/lib/src/pages/mini_home.dart +++ b/lib/src/pages/mini_home.dart @@ -13,13 +13,21 @@ class MiniHome extends StatelessWidget { Expanded( flex: 3, child: Column( + mainAxisAlignment: MainAxisAlignment.center, children: [ Expanded( child: MiniHomeVoltage(models.rover.metrics), ), const Divider(), - const Flexible( - child: Placeholder(), + Flexible( + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + GamepadButton(models.rover.controller1), + GamepadButton(models.rover.controller2), + GamepadButton(models.rover.controller3), + ], + ), ), const Divider(), SizedBox( diff --git a/lib/src/pages/mini_metrics.dart b/lib/src/pages/mini_metrics.dart index 8bce53f530..0d06762450 100644 --- a/lib/src/pages/mini_metrics.dart +++ b/lib/src/pages/mini_metrics.dart @@ -15,7 +15,12 @@ class MiniMetrics extends ReusableReactiveWidget { child: ListView( padding: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 4.0), children: [ - for (int i = 0; i < 3; i++) MetricsList(model.allMetrics[i]), + Text( + "Metrics", + style: context.textTheme.displaySmall, + textAlign: TextAlign.center, + ), + for (final metrics in model.allMetrics) MetricsList(metrics), ], ), ), @@ -24,7 +29,23 @@ class MiniMetrics extends ReusableReactiveWidget { flex: 3, child: ListView( children: [ - for (int i = 3; i < model.allMetrics.length; i++) MetricsList(model.allMetrics[i]), + Text( + "Controls", + style: context.textTheme.displaySmall, + textAlign: TextAlign.center, + ), + ControlsDisplay( + controller: models.rover.controller1, + gamepadNum: 1, + ), + ControlsDisplay( + controller: models.rover.controller2, + gamepadNum: 2, + ), + ControlsDisplay( + controller: models.rover.controller3, + gamepadNum: 3, + ), ], ), ), From e337b6d59ad8dc5f1dcfc156ee30bb4ce58fbd83 Mon Sep 17 00:00:00 2001 From: Gold87 <91761103+Gold872@users.noreply.github.com> Date: Tue, 24 Sep 2024 20:42:41 -0400 Subject: [PATCH 03/17] Added logo and dark mode --- assets/logo-dark.png | Bin 0 -> 64796 bytes assets/logo-light.png | Bin 0 -> 64797 bytes lib/mini.dart | 68 ++++++++++++++++++++++++----------- lib/src/pages/mini_home.dart | 24 ++++++++++--- 4 files changed, 67 insertions(+), 25 deletions(-) create mode 100644 assets/logo-dark.png create mode 100644 assets/logo-light.png diff --git a/assets/logo-dark.png b/assets/logo-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..f5ad750942e380ee2ee338cb4a2942da6ca13954 GIT binary patch literal 64796 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

Skgp{$h%!(64f<4`mPaz=tveT)N+QL)Q2P! z?ko|?%dA0)pOta;r7~cM*kSW^On8k?k-;JpkKQ+^etjlE0Vgg{i%rO{mhq1?=s5N*bYdyA!&B^>k;h5B-p%I9wwaVEQm*8(&$yoU-5iAE$KSCOn>R-=r5Bi;KF5ORZQmsKW$;Ta z%oK!#9q0xHr=s>tzO(PwLsu4v*I2%fr1ONT)QCgVZ;h6c%Uy9DU3fgYF*^&j%^c-K zB;Fm2L}>+!F>l5mYrRZ#NBpwK=*&)2^d14-omS{Q7eGh=Jgh*qE_l2>jRnQUdmKUi zFnD|bb?e}9pKGTz8I-91Y(oD37ymDt)5bkRb literal 0 HcmV?d00001 diff --git a/lib/mini.dart b/lib/mini.dart index 6f64763d81..99dff05971 100644 --- a/lib/mini.dart +++ b/lib/mini.dart @@ -22,38 +22,61 @@ import "package:device_preview/device_preview.dart"; import "package:rover_dashboard/src/pages/mini_metrics.dart"; import "package:rover_dashboard/widgets.dart"; -class MiniHomePage extends StatefulWidget { - const MiniHomePage({super.key}); +class MiniViewModel with ChangeNotifier { + /// Constructor for [MiniViewModel], calls [init] to setup mini dashboard + MiniViewModel() { + init(); + } - @override - State createState() => _MiniHomePageState(); -} + bool _darkMode = false; -class _MiniHomePageState extends State { - @override - void initState() { - init(); - super.initState(); + set darkMode(bool darkMode) { + _darkMode = darkMode; + notifyListeners(); } + /// Whether or not dark mode is enabled + bool get darkMode => _darkMode; + + /// Initializes necessary systems and models for the Mini Dashboard + /// + /// Sets the rover type to localhost and disables the sockets until + /// it is manually turned on by the user Future init() async { await services.init(); await models.init(); await models.sockets.setRover(RoverType.localhost); await models.sockets.disable(); - if (mounted) { - setState(() {}); - } + notifyListeners(); } +} + +class MiniHomePage extends StatelessWidget { + final MiniViewModel model; + + /// A const constructor + const MiniHomePage({required this.model}); @override Widget build(BuildContext context) => Scaffold( appBar: AppBar( automaticallyImplyLeading: false, title: Text("Dashboard v${models.home.version ?? ''}"), - actions: const [ - PowerButton(), + actions: [ + Row( + children: [ + const Text( + "Dark Mode", + style: TextStyle(color: Colors.white), + ), + const SizedBox(width: 5), + Switch(value: model.darkMode, onChanged: (value) => model.darkMode = value), + ], + ), + const SizedBox(width: 10), + const PowerButton(), + const SizedBox(width: 5), ], ), body: DefaultTabController( @@ -79,7 +102,7 @@ class _MiniHomePageState extends State { ], ), ), - bottomNavigationBar: MiniFooter(), + bottomNavigationBar: const MiniFooter(), ); } @@ -132,14 +155,17 @@ class MiniFooter extends StatelessWidget { ); } -class MiniDashboard extends StatelessWidget { - const MiniDashboard({super.key}); +class MiniDashboard extends ReactiveWidget { + const MiniDashboard(); + + @override + MiniViewModel createModel() => MiniViewModel(); @override - Widget build(BuildContext context) => MaterialApp( + Widget build(BuildContext context, MiniViewModel model) => MaterialApp( title: "Binghamton University Rover Team", debugShowCheckedModeBanner: false, - themeMode: ThemeMode.light, + themeMode: model.darkMode ? ThemeMode.dark : ThemeMode.light, theme: ThemeData( colorScheme: const ColorScheme.light( primary: binghamtonGreen, @@ -156,7 +182,7 @@ class MiniDashboard extends StatelessWidget { secondary: binghamtonGreen, ), ), - home: const MiniHomePage(), + home: MiniHomePage(model: model), ); } diff --git a/lib/src/pages/mini_home.dart b/lib/src/pages/mini_home.dart index 524d94d479..2f8a5ff4f2 100644 --- a/lib/src/pages/mini_home.dart +++ b/lib/src/pages/mini_home.dart @@ -13,13 +13,15 @@ class MiniHome extends StatelessWidget { Expanded( flex: 3, child: Column( - mainAxisAlignment: MainAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ Expanded( + flex: 5, child: MiniHomeVoltage(models.rover.metrics), ), const Divider(), - Flexible( + Expanded( + flex: 2, child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ @@ -188,16 +190,28 @@ class MiniHomeSystemStatus extends ReusableReactiveWidget { @override Widget build(BuildContext context, LogsViewModel model) => Column( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ + const Spacer(), + Expanded( + flex: 8, + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 6), + child: Image.asset( + context.colorScheme.brightness == Brightness.light ? "assets/logo-light.png" : "assets/logo-dark.png", + ), + ), + ), + const Spacer(), for (final device in [Device.SUBSYSTEMS, Device.VIDEO, Device.AUTONOMY]) SizedBox( width: 300, child: Card( + color: Colors.white, + elevation: 3, child: Column( children: [ ListTile( - title: Text(device.humanName), + title: Text(device.humanName, style: const TextStyle(color: Colors.black)), ), Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, @@ -212,10 +226,12 @@ class MiniHomeSystemStatus extends ReusableReactiveWidget { ), ], ), + const SizedBox(height: 5), ], ), ), ), + const SizedBox(height: 5), ], ); } From 9c3565d0475f2cd0eaa5b599ea5fe54d7f79b5c0 Mon Sep 17 00:00:00 2001 From: Gold87 <91761103+Gold872@users.noreply.github.com> Date: Tue, 24 Sep 2024 21:11:50 -0400 Subject: [PATCH 04/17] Improved gamepad --- lib/src/widgets/generic/gamepad.dart | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/lib/src/widgets/generic/gamepad.dart b/lib/src/widgets/generic/gamepad.dart index 94b831b411..dc346fbf75 100644 --- a/lib/src/widgets/generic/gamepad.dart +++ b/lib/src/widgets/generic/gamepad.dart @@ -37,11 +37,19 @@ class GamepadButton extends ReusableReactiveWidget { IconButton( icon: Stack( children: [ - const Icon(Icons.sports_esports), + const SizedBox(height: 32), + Icon(Icons.sports_esports, color: context.colorScheme.onSurface), Positioned( - bottom: -2, - right: -2, - child: Text("${model.gamepadIndex + 1}", style: const TextStyle(fontSize: 12, color: Colors.white)), + bottom: 0, + right: 4.5, + child: Text( + "${model.gamepadIndex + 1}", + style: TextStyle( + fontSize: 12, + color: context.colorScheme.onSurface, + fontWeight: FontWeight.bold, + ), + ), ), ], ), From 233cff9da90595e570579c82b20ab0be89651d8e Mon Sep 17 00:00:00 2001 From: Gold87 <91761103+Gold872@users.noreply.github.com> Date: Tue, 24 Sep 2024 21:13:20 -0400 Subject: [PATCH 05/17] Fixed home page not displaying voltage --- lib/src/pages/mini_home.dart | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/lib/src/pages/mini_home.dart b/lib/src/pages/mini_home.dart index 2f8a5ff4f2..24e325b602 100644 --- a/lib/src/pages/mini_home.dart +++ b/lib/src/pages/mini_home.dart @@ -17,7 +17,7 @@ class MiniHome extends StatelessWidget { children: [ Expanded( flex: 5, - child: MiniHomeVoltage(models.rover.metrics), + child: MiniHomeVoltage(models.rover.metrics.drive), ), const Divider(), Expanded( @@ -48,7 +48,7 @@ class MiniHome extends StatelessWidget { ); } -class MiniHomeVoltage extends ReusableReactiveWidget { +class MiniHomeVoltage extends ReusableReactiveWidget { const MiniHomeVoltage(super.model); /// An appropriate battery icon in increments of 1/8 battery level. @@ -80,7 +80,7 @@ class MiniHomeVoltage extends ReusableReactiveWidget { } @override - Widget build(BuildContext context, RoverMetrics model) => Row( + Widget build(BuildContext context, DriveMetrics model) => Row( mainAxisAlignment: MainAxisAlignment.center, children: [ SizedBox( @@ -89,7 +89,7 @@ class MiniHomeVoltage extends ReusableReactiveWidget { child: FittedBox( fit: BoxFit.fill, child: Icon( - getBatteryIcon(model.drive.batteryVoltage), + getBatteryIcon(model.batteryPercentage), ), ), ), @@ -99,15 +99,15 @@ class MiniHomeVoltage extends ReusableReactiveWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "${model.drive.batteryVoltage.toStringAsFixed(2)} V", + "${model.batteryVoltage.toStringAsFixed(2)} V", style: context.textTheme.displaySmall, ), Text( - "${model.drive.data.batteryCurrent.toStringAsFixed(2)} A", + "${model.data.batteryCurrent.toStringAsFixed(2)} A", style: context.textTheme.displaySmall, ), Text( - "${model.drive.data.batteryTemperature.toStringAsFixed(2)} °C", + "${model.data.batteryTemperature.toStringAsFixed(2)} °C", style: context.textTheme.displaySmall, ), ], From 89f8cda4cee0994283ddfea47f9f53dc8f7c19c3 Mon Sep 17 00:00:00 2001 From: Gold87 <91761103+Gold872@users.noreply.github.com> Date: Tue, 24 Sep 2024 21:39:03 -0400 Subject: [PATCH 06/17] Fixed vitals metrics --- lib/src/data/metrics/vitals.dart | 4 +++- lib/src/models/rover/metrics.dart | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/src/data/metrics/vitals.dart b/lib/src/data/metrics/vitals.dart index af8b0f48f9..4af571ed5a 100644 --- a/lib/src/data/metrics/vitals.dart +++ b/lib/src/data/metrics/vitals.dart @@ -4,7 +4,9 @@ import "package:rover_dashboard/models.dart"; /// Metrics about the vitals of the rover. class VitalsMetrics extends Metrics { /// A const constructor. - VitalsMetrics() : super(DriveData()); + VitalsMetrics() : super(DriveData()) { + models.rover.metrics.drive.addListener(notifyListeners); + } @override Version parseVersion(Message message) => Version(major: 0, minor: 0); diff --git a/lib/src/models/rover/metrics.dart b/lib/src/models/rover/metrics.dart index a6815617f0..21259325f3 100644 --- a/lib/src/models/rover/metrics.dart +++ b/lib/src/models/rover/metrics.dart @@ -20,7 +20,7 @@ class RoverMetrics extends Model { final gripper = GripperMetrics(); /// Vitals data from the rover. - final vitals = VitalsMetrics(); + late final vitals = VitalsMetrics(); /// A list of all the metrics to iterate over. /// From 7606bf4e42fd0094c7f9aed2a875cdfef3288bf9 Mon Sep 17 00:00:00 2001 From: Gold87 <91761103+Gold872@users.noreply.github.com> Date: Tue, 24 Sep 2024 21:45:37 -0400 Subject: [PATCH 07/17] Added view tab --- lib/mini.dart | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/mini.dart b/lib/mini.dart index 99dff05971..d9273fdb08 100644 --- a/lib/mini.dart +++ b/lib/mini.dart @@ -80,7 +80,7 @@ class MiniHomePage extends StatelessWidget { ], ), body: DefaultTabController( - length: 3, + length: 4, child: Column( children: [ const TabBar( @@ -88,6 +88,7 @@ class MiniHomePage extends StatelessWidget { Tab(text: "Home"), Tab(text: "Metrics & Controls"), Tab(text: "Logs"), + Tab(text: "View"), ], ), Expanded( @@ -96,6 +97,7 @@ class MiniHomePage extends StatelessWidget { const MiniHome(), MiniMetrics(models.rover.metrics), LogsPage(), + ViewsWidget(), ], ), ), From f21724d0711d444b03fa56731eb2be565ea165df Mon Sep 17 00:00:00 2001 From: Gold87 <91761103+Gold872@users.noreply.github.com> Date: Wed, 25 Sep 2024 17:30:22 -0400 Subject: [PATCH 08/17] Fixed pubspec.lock --- pubspec.lock | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 74 insertions(+), 2 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index b12c6005f5..0b1c8eb7be 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -550,6 +550,78 @@ packages: url: "https://pub.dev" source: hosted version: "0.27.7" + sdl3: + dependency: transitive + description: + name: sdl3 + sha256: "9998e3c40778978c9836d1460c40ab912e9fdc0ae83084d356913303deb2b14f" + url: "https://pub.dev" + source: hosted + version: "0.1.34" + sdl_gamepad: + dependency: "direct main" + description: + name: sdl_gamepad + sha256: "3bce11dbf7da9a543ce17177342171d5033a2b7198dbfa51b5bee7cdc45d4ac2" + url: "https://pub.dev" + source: hosted + version: "1.0.2" + shared_preferences: + dependency: transitive + description: + name: shared_preferences + sha256: "746e5369a43170c25816cc472ee016d3a66bc13fcf430c0bc41ad7b4b2922051" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + shared_preferences_android: + dependency: transitive + description: + name: shared_preferences_android + sha256: "480ba4345773f56acda9abf5f50bd966f581dac5d514e5fc4a18c62976bbba7e" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + shared_preferences_foundation: + dependency: transitive + description: + name: shared_preferences_foundation + sha256: c4b35f6cb8f63c147312c054ce7c2254c8066745125264f0c88739c417fc9d9f + url: "https://pub.dev" + source: hosted + version: "2.5.2" + shared_preferences_linux: + dependency: transitive + description: + name: shared_preferences_linux + sha256: "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + shared_preferences_platform_interface: + dependency: transitive + description: + name: shared_preferences_platform_interface + sha256: "57cbf196c486bc2cf1f02b85784932c6094376284b3ad5779d1b1c6c6a816b80" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + shared_preferences_web: + dependency: transitive + description: + name: shared_preferences_web + sha256: d2ca4132d3946fec2184261726b355836a82c33d7d5b67af32692aff18a4684e + url: "https://pub.dev" + source: hosted + version: "2.4.2" + shared_preferences_windows: + dependency: transitive + description: + name: shared_preferences_windows + sha256: "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1" + url: "https://pub.dev" + source: hosted + version: "2.4.1" sky_engine: dependency: transitive description: flutter @@ -764,5 +836,5 @@ packages: source: hosted version: "3.1.2" sdks: - dart: ">=3.4.0 <4.0.0" - flutter: ">=3.19.0" + dart: ">=3.5.2 <4.0.0" + flutter: ">=3.22.0" From a9b528975d5871f533bbcc4cef85f3d2e5dd2108 Mon Sep 17 00:00:00 2001 From: Gold87 <91761103+Gold872@users.noreply.github.com> Date: Wed, 25 Sep 2024 17:34:02 -0400 Subject: [PATCH 09/17] Updated home page to work with new log and sockets methods --- lib/src/pages/mini_home.dart | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/lib/src/pages/mini_home.dart b/lib/src/pages/mini_home.dart index 24e325b602..7ba7e330fc 100644 --- a/lib/src/pages/mini_home.dart +++ b/lib/src/pages/mini_home.dart @@ -3,7 +3,12 @@ import "package:rover_dashboard/data.dart"; import "package:rover_dashboard/models.dart"; import "package:rover_dashboard/widgets.dart"; +/// The homepage for the Mini Dashboard +/// +/// Displays voltage/current information, subsystem statuses, gamepad selection, +/// and options to enable/disable the dashboard and rover class MiniHome extends StatelessWidget { + /// Const constructor for the MiniHome const MiniHome({super.key}); @override @@ -48,7 +53,11 @@ class MiniHome extends StatelessWidget { ); } +/// The voltage display for the mini home page, listens to drive metrics to update data +/// +/// Displays a battery charge icon, voltage, current, and battery temperature class MiniHomeVoltage extends ReusableReactiveWidget { + /// Const constructor for the home voltage widget const MiniHomeVoltage(super.model); /// An appropriate battery icon in increments of 1/8 battery level. @@ -116,7 +125,11 @@ class MiniHomeVoltage extends ReusableReactiveWidget { ); } +/// Toggle options that appear at the bottom of the home page +/// +/// Displays switches for enabling the dashboard or setting the rover to idle class MiniHomeToggleOptions extends ReusableReactiveWidget { + /// Const constructor const MiniHomeToggleOptions(super.model); @override @@ -164,14 +177,17 @@ class MiniHomeToggleOptions extends ReusableReactiveWidget { ); } +/// Systems status cards for the mini home page +/// +/// Displays a color status indicator and a button to restart the system class MiniHomeSystemStatus extends ReusableReactiveWidget { + /// Const constructor for system status cards const MiniHomeSystemStatus(super.model); /// Returns the appropriate status icon for the log messages received from [device] Widget statusIcon(Device? device) { - final socket = - models.sockets.sockets.firstWhere((socket) => socket.device == device); //models.sockets.fromDevice(device); - final lowestLevel = BurtLogLevel.info; //model.lowestLevel(device); + final socket = models.sockets.socketForDevice(device ?? Device.DEVICE_UNDEFINED); + final lowestLevel = model.getMostSevereLevel(device); Color? iconColor = switch (lowestLevel) { BurtLogLevel.critical => Colors.red, @@ -181,7 +197,7 @@ class MiniHomeSystemStatus extends ReusableReactiveWidget { _ => null, }; - if (device == null || /*socket == null ||*/ !socket.isConnected) { + if (device == null || socket == null || !socket.isConnected) { iconColor = Colors.black; } From 76a06e12ee0022619efe16492427ed34bf54a22a Mon Sep 17 00:00:00 2001 From: Gold87 <91761103+Gold872@users.noreply.github.com> Date: Wed, 25 Sep 2024 18:11:30 -0400 Subject: [PATCH 10/17] Made mini logs page and removed device preview --- lib/mini.dart | 46 ++++--- lib/src/pages/logs.dart | 106 ++++++++++------ lib/src/pages/mini_logs.dart | 49 ++++++++ lib/src/pages/mini_metrics.dart | 1 - macos/Flutter/GeneratedPluginRegistrant.swift | 2 - pubspec.lock | 119 +----------------- pubspec.yaml | 1 - 7 files changed, 146 insertions(+), 178 deletions(-) create mode 100644 lib/src/pages/mini_logs.dart diff --git a/lib/mini.dart b/lib/mini.dart index d9273fdb08..ea0a42a362 100644 --- a/lib/mini.dart +++ b/lib/mini.dart @@ -16,20 +16,20 @@ import "package:rover_dashboard/app.dart"; import "package:rover_dashboard/data.dart"; import "package:rover_dashboard/models.dart"; import "package:rover_dashboard/services.dart"; -import "package:rover_dashboard/src/pages/logs.dart"; import "package:rover_dashboard/src/pages/mini_home.dart"; -import "package:device_preview/device_preview.dart"; +import "package:rover_dashboard/src/pages/mini_logs.dart"; import "package:rover_dashboard/src/pages/mini_metrics.dart"; import "package:rover_dashboard/widgets.dart"; class MiniViewModel with ChangeNotifier { + bool _darkMode = false; + Widget Function(BuildContext context)? _footerWidget; + /// Constructor for [MiniViewModel], calls [init] to setup mini dashboard MiniViewModel() { init(); } - bool _darkMode = false; - set darkMode(bool darkMode) { _darkMode = darkMode; notifyListeners(); @@ -38,6 +38,14 @@ class MiniViewModel with ChangeNotifier { /// Whether or not dark mode is enabled bool get darkMode => _darkMode; + set footerWidget(Widget Function(BuildContext context)? footerWidget) { + _footerWidget = footerWidget; + notifyListeners(); + } + + /// The builder for the footer widget + Widget Function(BuildContext context)? get footerWidget => _footerWidget; + /// Initializes necessary systems and models for the Mini Dashboard /// /// Sets the rover type to localhost and disables the sockets until @@ -96,7 +104,7 @@ class MiniHomePage extends StatelessWidget { children: [ const MiniHome(), MiniMetrics(models.rover.metrics), - LogsPage(), + MiniLogs(miniViewModel: model), ViewsWidget(), ], ), @@ -104,11 +112,15 @@ class MiniHomePage extends StatelessWidget { ], ), ), - bottomNavigationBar: const MiniFooter(), + bottomNavigationBar: MiniFooter(model), ); } +/// Button to set the rover status to [RoverStatus.POWER_OFF], shutting off the rover +/// +/// Displays a confirmation dialog before shutting down class PowerButton extends StatelessWidget { + /// Constructor for power button const PowerButton({super.key}); @override @@ -147,13 +159,19 @@ class PowerButton extends StatelessWidget { ); } -class MiniFooter extends StatelessWidget { - const MiniFooter({super.key}); +class MiniFooter extends ReusableReactiveWidget { + const MiniFooter(super.model) : super(); @override - Widget build(BuildContext context) => ColoredBox( + Widget build(BuildContext context, MiniViewModel model) => ColoredBox( color: context.colorScheme.secondary, - child: MessageDisplay(showLogs: false), + child: Row( + children: [ + MessageDisplay(showLogs: false), + const Spacer(), + if (model.footerWidget != null) model.footerWidget!.call(context), + ], + ), ); } @@ -192,13 +210,7 @@ class MiniDashboard extends ReactiveWidget { const networkErrors = {1234, 1231}; void main() async { - runZonedGuarded( - () => runApp( - DevicePreview( - enabled: false, - builder: (context) => const MiniDashboard(), - ), - ), (error, stack) async { + runZonedGuarded(() => runApp(const MiniDashboard()), (error, stack) async { if (error is SocketException && networkErrors.contains(error.osError!.errorCode)) { models.home.setMessage(severity: Severity.critical, text: "Network error, restart by clicking the network icon"); } else { diff --git a/lib/src/pages/logs.dart b/lib/src/pages/logs.dart index 18eea23a8e..9b61e70b5d 100644 --- a/lib/src/pages/logs.dart +++ b/lib/src/pages/logs.dart @@ -126,6 +126,72 @@ class LogsOptions extends ReusableReactiveWidget { ); } +/// Returns a list of widgets that are used as the header or footer actions for the log page +List getLogsActions(BuildContext context, LogsViewModel model) => [ + IconButton( + icon: const Icon(Icons.help, color: Colors.white), + tooltip: "Help", + onPressed: () => showDialog( + context: context, + builder: (context) => AlertDialog( + scrollable: true, + title: const Text("Logs Help"), + content: Column( + mainAxisSize: MainAxisSize.min, + children: [ + const Text( + "This page contains all logs received by the dashboard.\nSelecting a level means that only messages of that level or higher will be shown.", + textAlign: TextAlign.center, + ), + const SizedBox(height: 4), + ListTile( + leading: criticalWidget, + title: const Text("Critical"), + subtitle: const Text("The rover is in a broken state and may shutdown")), + const ListTile( + leading: errorWidget, + title: Text("Error"), + subtitle: Text("Something you tried didn't work, but the rover can still function")), + const ListTile( + leading: warningWidget, + title: Text("Warning"), + subtitle: Text("Something may have gone wrong, you should check it out")), + ListTile( + leading: infoWidget, + title: const Text("Info"), + subtitle: const Text("The rover is functioning normally")), + const ListTile( + leading: debugWidget, + title: Text("Debug"), + subtitle: Text("Extra information that shows what the rover's thinking")), + const ListTile( + leading: traceWidget, + title: Text("Trace"), + subtitle: Text("Values from the code to debug specific issues")), + const SizedBox(height: 12), + ], + ), + actions: [ + ElevatedButton( + onPressed: () => Navigator.of(context).pop(), + child: const Text("Close"), + ), + ], + ), + ), + ), + IconButton( + icon: const Icon(Icons.vertical_align_bottom, color: Colors.white), + onPressed: model.jumpToBottom, + tooltip: "Jump to Bottom", + ), + IconButton( + icon: const Icon(Icons.delete_forever, color: Colors.white), + onPressed: models.logs.clear, + tooltip: "Clear Logs", + ), + ]; + /// The logs page, containing the [LogsOptions] and [LogsBody] widgets. /// /// This page lets the user view logs, set filters, and reboot the rover. @@ -149,45 +215,7 @@ class LogsState extends State { ],), appBar: AppBar( title: const Text("Logs"), - actions: [ - IconButton( - icon: const Icon(Icons.help), - tooltip: "Help", - onPressed: () => showDialog( - context: context, - builder: (context) => AlertDialog( - title: const Text("Logs Help"), - content: Column(mainAxisSize: MainAxisSize.min, children: [ - const Text("This page contains all logs received by the dashboard.\nSelecting a level means that only messages of that level or higher will be shown.", textAlign: TextAlign.center,), - const SizedBox(height: 4), - ListTile(leading: criticalWidget, title: const Text("Critical"), subtitle: const Text("The rover is in a broken state and may shutdown")), - const ListTile(leading: errorWidget, title: Text("Error"), subtitle: Text("Something you tried didn't work, but the rover can still function")), - const ListTile(leading: warningWidget, title: Text("Warning"), subtitle: Text("Something may have gone wrong, you should check it out")), - ListTile(leading: infoWidget, title: const Text("Info"), subtitle: const Text("The rover is functioning normally")), - const ListTile(leading: debugWidget, title: Text("Debug"), subtitle: Text("Extra information that shows what the rover's thinking")), - const ListTile(leading: traceWidget, title: Text("Trace"), subtitle: Text("Values from the code to debug specific issues")), - const SizedBox(height: 12), - ],), - actions: [ - ElevatedButton( - onPressed: () => Navigator.of(context).pop(), - child: const Text("Close"), - ), - ], - ), - ), - ), - IconButton( - icon: const Icon(Icons.vertical_align_bottom), - onPressed: model.jumpToBottom, - tooltip: "Jump to Bottom", - ), - IconButton( - icon: const Icon(Icons.delete_forever), - onPressed: models.logs.clear, - tooltip: "Clear Logs", - ), - ], + actions: getLogsActions(context, model), ), bottomNavigationBar: const Footer(showLogs: false), ); diff --git a/lib/src/pages/mini_logs.dart b/lib/src/pages/mini_logs.dart new file mode 100644 index 0000000000..852e54775b --- /dev/null +++ b/lib/src/pages/mini_logs.dart @@ -0,0 +1,49 @@ +import "dart:async"; + +import "package:flutter/material.dart"; +import "package:rover_dashboard/mini.dart"; +import "package:rover_dashboard/models.dart"; +import "package:rover_dashboard/pages.dart"; + +/// Logs tab for the mini dashboard +/// +/// Displays the same content of the normal logs page but without the extra header and footer +class MiniLogs extends StatefulWidget { + /// MiniViewModel used to control the widget on the footer of the mini dashboard + final MiniViewModel miniViewModel; + + /// Constructor for mini logs + const MiniLogs({required this.miniViewModel, super.key}); + + @override + State createState() => _MiniLogsState(); +} + +class _MiniLogsState extends State { + /// [LogsViewModel] used to view the different elements of the logs page + final LogsViewModel logsViewModel = LogsViewModel(); + + @override + void initState() { + // The footer has to be set in Timer.run since otherwise it will try to rebuild during build + Timer.run( + () => widget.miniViewModel.footerWidget = (context) => Row(children: getLogsActions(context, logsViewModel))); + super.initState(); + } + + @override + void dispose() { + Timer.run(() => widget.miniViewModel.footerWidget = null); + super.dispose(); + } + + @override + Widget build(BuildContext context) => Column( + children: [ + const SizedBox(height: 12), + LogsOptions(logsViewModel), + const Divider(), + Expanded(child: LogsBody(logsViewModel)), + ], + ); +} diff --git a/lib/src/pages/mini_metrics.dart b/lib/src/pages/mini_metrics.dart index 0d06762450..a4112d49d9 100644 --- a/lib/src/pages/mini_metrics.dart +++ b/lib/src/pages/mini_metrics.dart @@ -1,6 +1,5 @@ import "package:flutter/material.dart"; import "package:rover_dashboard/models.dart"; -import "package:rover_dashboard/src/widgets/generic/reactive_widget.dart"; import "package:rover_dashboard/widgets.dart"; class MiniMetrics extends ReusableReactiveWidget { diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index 27139dadb2..b89dca3d67 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -10,7 +10,6 @@ import flutter_libserialport import just_audio import package_info_plus import path_provider_foundation -import shared_preferences_foundation import url_launcher_macos func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { @@ -19,6 +18,5 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { JustAudioPlugin.register(with: registry.registrar(forPlugin: "JustAudioPlugin")) FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin")) PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) - SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin")) } diff --git a/pubspec.lock b/pubspec.lock index 0b1c8eb7be..0054931079 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -114,22 +114,6 @@ packages: url: "https://pub.dev" source: hosted version: "3.0.3" - device_frame: - dependency: transitive - description: - name: device_frame - sha256: d031a06f5d6f4750009672db98a5aa1536aa4a231713852469ce394779a23d75 - url: "https://pub.dev" - source: hosted - version: "1.2.0" - device_preview: - dependency: "direct main" - description: - name: device_preview - sha256: a694acdd3894b4c7d600f4ee413afc4ff917f76026b97ab06575fe886429ef19 - url: "https://pub.dev" - source: hosted - version: "1.2.0" dylib: dependency: transitive description: @@ -162,14 +146,6 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.3" - file: - dependency: transitive - description: - name: file - sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c" - url: "https://pub.dev" - source: hosted - version: "7.0.0" file_picker: dependency: "direct main" description: @@ -215,11 +191,6 @@ packages: url: "https://pub.dev" source: hosted version: "0.4.0" - flutter_localizations: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" flutter_plugin_android_lifecycle: dependency: transitive description: @@ -246,14 +217,6 @@ packages: description: flutter source: sdk version: "0.0.0" - freezed_annotation: - dependency: transitive - description: - name: freezed_annotation - sha256: c2e2d632dd9b8a2b7751117abcfc2b4888ecfe181bd9fca7170d9ef02e595fe2 - url: "https://pub.dev" - source: hosted - version: "2.4.4" get_it: dependency: transitive description: @@ -294,14 +257,6 @@ packages: url: "https://pub.dev" source: hosted version: "4.2.0" - intl: - dependency: transitive - description: - name: intl - sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf - url: "https://pub.dev" - source: hosted - version: "0.19.0" json_annotation: dependency: transitive description: @@ -406,14 +361,6 @@ packages: url: "https://pub.dev" source: hosted version: "3.16.7" - nested: - dependency: transitive - description: - name: nested - sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" - url: "https://pub.dev" - source: hosted - version: "1.0.0" package_config: dependency: transitive description: @@ -526,14 +473,6 @@ packages: url: "https://pub.dev" source: hosted version: "3.1.0" - provider: - dependency: transitive - description: - name: provider - sha256: c8a055ee5ce3fd98d6fc872478b03823ffdb448699c6ebdbbc71d59b596fd48c - url: "https://pub.dev" - source: hosted - version: "6.1.2" pub_semver: dependency: transitive description: @@ -566,62 +505,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.2" - shared_preferences: - dependency: transitive - description: - name: shared_preferences - sha256: "746e5369a43170c25816cc472ee016d3a66bc13fcf430c0bc41ad7b4b2922051" - url: "https://pub.dev" - source: hosted - version: "2.3.2" - shared_preferences_android: - dependency: transitive - description: - name: shared_preferences_android - sha256: "480ba4345773f56acda9abf5f50bd966f581dac5d514e5fc4a18c62976bbba7e" - url: "https://pub.dev" - source: hosted - version: "2.3.2" - shared_preferences_foundation: - dependency: transitive - description: - name: shared_preferences_foundation - sha256: c4b35f6cb8f63c147312c054ce7c2254c8066745125264f0c88739c417fc9d9f - url: "https://pub.dev" - source: hosted - version: "2.5.2" - shared_preferences_linux: - dependency: transitive - description: - name: shared_preferences_linux - sha256: "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f" - url: "https://pub.dev" - source: hosted - version: "2.4.1" - shared_preferences_platform_interface: - dependency: transitive - description: - name: shared_preferences_platform_interface - sha256: "57cbf196c486bc2cf1f02b85784932c6094376284b3ad5779d1b1c6c6a816b80" - url: "https://pub.dev" - source: hosted - version: "2.4.1" - shared_preferences_web: - dependency: transitive - description: - name: shared_preferences_web - sha256: d2ca4132d3946fec2184261726b355836a82c33d7d5b67af32692aff18a4684e - url: "https://pub.dev" - source: hosted - version: "2.4.2" - shared_preferences_windows: - dependency: transitive - description: - name: shared_preferences_windows - sha256: "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1" - url: "https://pub.dev" - source: hosted - version: "2.4.1" sky_engine: dependency: transitive description: flutter @@ -837,4 +720,4 @@ packages: version: "3.1.2" sdks: dart: ">=3.5.2 <4.0.0" - flutter: ">=3.22.0" + flutter: ">=3.19.0" diff --git a/pubspec.yaml b/pubspec.yaml index 18f5635e37..2aea0c3a6a 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -22,7 +22,6 @@ dependencies: url_launcher: ^6.1.10 just_audio: ^0.9.36 collection: ^1.18.0 - device_preview: ^1.2.0 sdl_gamepad: ^1.0.1 # Prefer to use `flutter pub add --dev packageName` rather than modify this section by hand. From 919a33b45ddcc00a4b37b5474c09b184fececfa6 Mon Sep 17 00:00:00 2001 From: Gold87 <91761103+Gold872@users.noreply.github.com> Date: Mon, 30 Sep 2024 12:26:58 -0400 Subject: [PATCH 11/17] Fix build errors --- lib/src/pages/mini_home.dart | 2 +- lib/src/pages/mini_logs.dart | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/src/pages/mini_home.dart b/lib/src/pages/mini_home.dart index 7ba7e330fc..1857ee02fb 100644 --- a/lib/src/pages/mini_home.dart +++ b/lib/src/pages/mini_home.dart @@ -187,7 +187,7 @@ class MiniHomeSystemStatus extends ReusableReactiveWidget { /// Returns the appropriate status icon for the log messages received from [device] Widget statusIcon(Device? device) { final socket = models.sockets.socketForDevice(device ?? Device.DEVICE_UNDEFINED); - final lowestLevel = model.getMostSevereLevel(device); + final lowestLevel = model.options.getSeverity(device ?? Device.DEVICE_UNDEFINED); Color? iconColor = switch (lowestLevel) { BurtLogLevel.critical => Colors.red, diff --git a/lib/src/pages/mini_logs.dart b/lib/src/pages/mini_logs.dart index 852e54775b..343d7f9d71 100644 --- a/lib/src/pages/mini_logs.dart +++ b/lib/src/pages/mini_logs.dart @@ -41,7 +41,7 @@ class _MiniLogsState extends State { Widget build(BuildContext context) => Column( children: [ const SizedBox(height: 12), - LogsOptions(logsViewModel), + LogsOptions(logsViewModel.options), const Divider(), Expanded(child: LogsBody(logsViewModel)), ], From 8cb5bff9cc447394f56ed0803b96d5585a451146 Mon Sep 17 00:00:00 2001 From: Gold87 <91761103+Gold872@users.noreply.github.com> Date: Fri, 22 Nov 2024 00:04:16 -0500 Subject: [PATCH 12/17] Fixed build errors and added settings --- lib/mini.dart | 47 ++++++++++++++++++++---------------- lib/src/pages/mini_home.dart | 9 +++++-- 2 files changed, 33 insertions(+), 23 deletions(-) diff --git a/lib/mini.dart b/lib/mini.dart index ea0a42a362..6261067a6b 100644 --- a/lib/mini.dart +++ b/lib/mini.dart @@ -15,6 +15,7 @@ import "package:flutter/material.dart"; import "package:rover_dashboard/app.dart"; import "package:rover_dashboard/data.dart"; import "package:rover_dashboard/models.dart"; +import "package:rover_dashboard/pages.dart"; import "package:rover_dashboard/services.dart"; import "package:rover_dashboard/src/pages/mini_home.dart"; import "package:rover_dashboard/src/pages/mini_logs.dart"; @@ -22,7 +23,6 @@ import "package:rover_dashboard/src/pages/mini_metrics.dart"; import "package:rover_dashboard/widgets.dart"; class MiniViewModel with ChangeNotifier { - bool _darkMode = false; Widget Function(BuildContext context)? _footerWidget; /// Constructor for [MiniViewModel], calls [init] to setup mini dashboard @@ -30,14 +30,6 @@ class MiniViewModel with ChangeNotifier { init(); } - set darkMode(bool darkMode) { - _darkMode = darkMode; - notifyListeners(); - } - - /// Whether or not dark mode is enabled - bool get darkMode => _darkMode; - set footerWidget(Widget Function(BuildContext context)? footerWidget) { _footerWidget = footerWidget; notifyListeners(); @@ -56,8 +48,16 @@ class MiniViewModel with ChangeNotifier { await models.sockets.setRover(RoverType.localhost); await models.sockets.disable(); + models.settings.addListener(notifyListeners); + notifyListeners(); } + + @override + void dispose() { + models.settings.removeListener(notifyListeners); + super.dispose(); + } } class MiniHomePage extends StatelessWidget { @@ -72,15 +72,9 @@ class MiniHomePage extends StatelessWidget { automaticallyImplyLeading: false, title: Text("Dashboard v${models.home.version ?? ''}"), actions: [ - Row( - children: [ - const Text( - "Dark Mode", - style: TextStyle(color: Colors.white), - ), - const SizedBox(width: 5), - Switch(value: model.darkMode, onChanged: (value) => model.darkMode = value), - ], + IconButton( + onPressed: () => Navigator.of(context).pushNamed(Routes.settings), + icon: const Icon(Icons.settings), ), const SizedBox(width: 10), const PowerButton(), @@ -185,7 +179,7 @@ class MiniDashboard extends ReactiveWidget { Widget build(BuildContext context, MiniViewModel model) => MaterialApp( title: "Binghamton University Rover Team", debugShowCheckedModeBanner: false, - themeMode: model.darkMode ? ThemeMode.dark : ThemeMode.light, + themeMode: models.isReady ? models.settings.dashboard.themeMode : ThemeMode.system, theme: ThemeData( colorScheme: const ColorScheme.light( primary: binghamtonGreen, @@ -203,6 +197,10 @@ class MiniDashboard extends ReactiveWidget { ), ), home: MiniHomePage(model: model), + routes: { + Routes.home: (_) => MiniHomePage(model: model), + Routes.settings: (_) => SettingsPage(), + }, ); } @@ -214,8 +212,15 @@ void main() async { if (error is SocketException && networkErrors.contains(error.osError!.errorCode)) { models.home.setMessage(severity: Severity.critical, text: "Network error, restart by clicking the network icon"); } else { - models.home.setMessage(severity: Severity.critical, text: "Dashboard error. See the logs"); - await services.files.logError(error, stack); + models.home.setMessage(severity: Severity.critical, text: "Dashboard error. See the logs", logMessage: false); + models.logs.handleLog( + BurtLog( + level: BurtLogLevel.critical, + title: "Dashboard Error. Click for details", + body: "$error\n$stack", + device: Device.DASHBOARD, + ), + ); Error.throwWithStackTrace(error, stack); } }); diff --git a/lib/src/pages/mini_home.dart b/lib/src/pages/mini_home.dart index 1857ee02fb..859d55e6a9 100644 --- a/lib/src/pages/mini_home.dart +++ b/lib/src/pages/mini_home.dart @@ -143,11 +143,16 @@ class MiniHomeToggleOptions extends ReusableReactiveWidget { Switch( value: model.isEnabled, onChanged: (enabled) async { - if (model.rover != RoverType.localhost) { - await model.setRover(RoverType.localhost); + if (enabled) { + if (model.rover != RoverType.localhost) { + await model.setRover(RoverType.localhost); + } } if (!enabled) { + for (final socket in model.sockets) { + await socket.dispose(); + } await model.disable(); } else { await model.init(); From 8252ca127c11d2edc6c283280701e2922b6270ff Mon Sep 17 00:00:00 2001 From: Gold87 <91761103+Gold872@users.noreply.github.com> Date: Fri, 22 Nov 2024 00:42:23 -0500 Subject: [PATCH 13/17] Added docs for mini.dart --- lib/mini.dart | 35 ++++++++++++++++++++++++----------- 1 file changed, 24 insertions(+), 11 deletions(-) diff --git a/lib/mini.dart b/lib/mini.dart index 6261067a6b..c07ad36517 100644 --- a/lib/mini.dart +++ b/lib/mini.dart @@ -1,13 +1,3 @@ -/// The entrypoint of the app. -/// -/// These `library` declarations are not needed, the default name for a Dart library is simply the -/// name of the file. However, DartDoc comments placed above a library declaration will show up on -/// the libraries page in the generated documentation. -/// -/// This library's main purpose is to execute the app defined in the app library and is designed to -/// be as simple as possible. -library main; - import "dart:async"; import "dart:io"; import "package:flutter/material.dart"; @@ -22,6 +12,11 @@ import "package:rover_dashboard/src/pages/mini_logs.dart"; import "package:rover_dashboard/src/pages/mini_metrics.dart"; import "package:rover_dashboard/widgets.dart"; +/// View model for the Mini dashboard home page +/// +/// Stores the function to define the extra widget displayed on the +/// footer, and initializes all necessary data, services, and other +/// view models class MiniViewModel with ChangeNotifier { Widget Function(BuildContext context)? _footerWidget; @@ -60,10 +55,16 @@ class MiniViewModel with ChangeNotifier { } } +/// The main app page for the Mini dashboard +/// +/// Displays a header with the dashboard version, a tab bar view +/// to select between the home page, metrics/controls, logs, and +/// a page to display a view class MiniHomePage extends StatelessWidget { + /// The Mini Dashboard view model final MiniViewModel model; - /// A const constructor + /// A const constructor for the mini home page const MiniHomePage({required this.model}); @override @@ -153,7 +154,14 @@ class PowerButton extends StatelessWidget { ); } +/// The footer for the mini dashboard +/// +/// Displays any necessary messages in the left of the footer, and +/// a custom defined widget on the right side. The custom widget space +/// is used by pages such as the Logs page to display extra information +/// in a small amount of space class MiniFooter extends ReusableReactiveWidget { + /// Const constructor for the mini dashboard footer const MiniFooter(super.model) : super(); @override @@ -169,7 +177,12 @@ class MiniFooter extends ReusableReactiveWidget { ); } +/// The main widget for the mini dashboard +/// +/// Initializes the Material App, necessary themes, and defines the +/// routes to the home and settings page class MiniDashboard extends ReactiveWidget { + /// Const constructor for the mini dashboard const MiniDashboard(); @override From 9bc706eaeb5aaf14b58a6fe20e6a3627803fe9cc Mon Sep 17 00:00:00 2001 From: Gold87 <91761103+Gold872@users.noreply.github.com> Date: Fri, 22 Nov 2024 00:49:43 -0500 Subject: [PATCH 14/17] Fixed CI warnings (hopefully) --- lib/src/pages/logs.dart | 17 +++++++++++------ lib/src/pages/mini_metrics.dart | 7 ++++++- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/lib/src/pages/logs.dart b/lib/src/pages/logs.dart index a09d925c5a..d73d6ad800 100644 --- a/lib/src/pages/logs.dart +++ b/lib/src/pages/logs.dart @@ -142,27 +142,32 @@ List getLogsActions(BuildContext context, LogsViewModel model) => [ ListTile( leading: criticalWidget, title: const Text("Critical"), - subtitle: const Text("The rover is in a broken state and may shutdown")), + subtitle: const Text("The rover is in a broken state and may shutdown"),), const ListTile( leading: errorWidget, title: Text("Error"), - subtitle: Text("Something you tried didn't work, but the rover can still function")), + subtitle: Text("Something you tried didn't work, but the rover can still function"), + ), const ListTile( leading: warningWidget, title: Text("Warning"), - subtitle: Text("Something may have gone wrong, you should check it out")), + subtitle: Text("Something may have gone wrong, you should check it out"), + ), ListTile( leading: infoWidget, title: const Text("Info"), - subtitle: const Text("The rover is functioning normally")), + subtitle: const Text("The rover is functioning normally"), + ), const ListTile( leading: debugWidget, title: Text("Debug"), - subtitle: Text("Extra information that shows what the rover's thinking")), + subtitle: Text("Extra information that shows what the rover's thinking"), + ), const ListTile( leading: traceWidget, title: Text("Trace"), - subtitle: Text("Values from the code to debug specific issues")), + subtitle: Text("Values from the code to debug specific issues"), + ), const SizedBox(height: 12), ], ), diff --git a/lib/src/pages/mini_metrics.dart b/lib/src/pages/mini_metrics.dart index a4112d49d9..e7ba485e1f 100644 --- a/lib/src/pages/mini_metrics.dart +++ b/lib/src/pages/mini_metrics.dart @@ -2,7 +2,12 @@ import "package:flutter/material.dart"; import "package:rover_dashboard/models.dart"; import "package:rover_dashboard/widgets.dart"; +/// Metrics for the Mini Dashboard +/// +/// Displays 2 columns of expansion tiles, the left is the regular rover +/// metrics, and the right is the controls class MiniMetrics extends ReusableReactiveWidget { + /// Const constructor for mini metrics const MiniMetrics(super.model); @override @@ -12,7 +17,7 @@ class MiniMetrics extends ReusableReactiveWidget { Expanded( flex: 3, child: ListView( - padding: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 4.0), + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), children: [ Text( "Metrics", From e80852194794796c9ebeb0e4d24912c2ea13e693 Mon Sep 17 00:00:00 2001 From: Gold87 <91761103+Gold872@users.noreply.github.com> Date: Fri, 22 Nov 2024 00:51:02 -0500 Subject: [PATCH 15/17] Fixed idle switch --- lib/src/pages/mini_home.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/src/pages/mini_home.dart b/lib/src/pages/mini_home.dart index 859d55e6a9..eafbdb0366 100644 --- a/lib/src/pages/mini_home.dart +++ b/lib/src/pages/mini_home.dart @@ -168,7 +168,7 @@ class MiniHomeToggleOptions extends ReusableReactiveWidget { ValueListenableBuilder( valueListenable: models.rover.status, builder: (context, value, child) => Switch( - value: value != RoverStatus.IDLE, + value: value == RoverStatus.IDLE, onChanged: (idle) async { final value = idle ? RoverStatus.IDLE : RoverStatus.MANUAL; From 093ebe934747937ca6ebab054b47ad246b3a06d7 Mon Sep 17 00:00:00 2001 From: Gold87 <91761103+Gold872@users.noreply.github.com> Date: Fri, 22 Nov 2024 00:53:05 -0500 Subject: [PATCH 16/17] Fix the last CI warning --- lib/src/pages/mini_logs.dart | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/src/pages/mini_logs.dart b/lib/src/pages/mini_logs.dart index 343d7f9d71..31999f073e 100644 --- a/lib/src/pages/mini_logs.dart +++ b/lib/src/pages/mini_logs.dart @@ -27,7 +27,10 @@ class _MiniLogsState extends State { void initState() { // The footer has to be set in Timer.run since otherwise it will try to rebuild during build Timer.run( - () => widget.miniViewModel.footerWidget = (context) => Row(children: getLogsActions(context, logsViewModel))); + () => widget.miniViewModel.footerWidget = (context) => Row( + children: getLogsActions(context, logsViewModel), + ), + ); super.initState(); } From ca745db8b665749ccd6d52cc7264555e0d67642d Mon Sep 17 00:00:00 2001 From: Gold87 <91761103+Gold872@users.noreply.github.com> Date: Wed, 27 Nov 2024 12:19:56 -0500 Subject: [PATCH 17/17] Reset network settings only when enabled --- lib/src/models/view/builders/settings_builder.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/src/models/view/builders/settings_builder.dart b/lib/src/models/view/builders/settings_builder.dart index a879040b08..2387afdf04 100644 --- a/lib/src/models/view/builders/settings_builder.dart +++ b/lib/src/models/view/builders/settings_builder.dart @@ -383,7 +383,7 @@ class SettingsBuilder extends ValueBuilder { value.network.toJson(), )); await models.settings.update(value); - if (resetSockets) { + if (resetSockets && models.sockets.isEnabled) { await models.sockets.reset(); } models.video.reset();