From 5f319f664028db17024f36e4d42e54c0f94c6368 Mon Sep 17 00:00:00 2001 From: PaulGD03 Date: Mon, 13 Oct 2025 22:20:52 +0200 Subject: [PATCH 01/44] feat(tools): update icons in bottom navigation bar to use Phosphor icons --- lib/tools/tools_screen.dart | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/tools/tools_screen.dart b/lib/tools/tools_screen.dart index 836f154..4eaa034 100644 --- a/lib/tools/tools_screen.dart +++ b/lib/tools/tools_screen.dart @@ -17,6 +17,8 @@ import 'package:flutter/material.dart'; +import 'package:phosphor_flutter/phosphor_flutter.dart'; + import 'package:orion/glasser/glasser.dart'; import 'package:orion/tools/exposure_screen.dart'; import 'package:orion/tools/move_z_screen.dart'; @@ -56,13 +58,13 @@ class ToolsScreenState extends State { : const MoveZScreen(), bottomNavigationBar: GlassBottomNavigationBar( type: BottomNavigationBarType.fixed, - items: const [ + items: [ BottomNavigationBarItem( - icon: Icon(Icons.height), + icon: PhosphorIcon(PhosphorIcons.arrowsDownUp()), label: 'Move Z', ), BottomNavigationBarItem( - icon: Icon(Icons.lightbulb), + icon: PhosphorIcon(PhosphorIcons.lightbulbFilament()), label: 'Exposure', ) // TODO: Implement Self Test From 128efb4d5034342523c0dfa5404fa9a658cee339 Mon Sep 17 00:00:00 2001 From: PaulGD03 Date: Mon, 13 Oct 2025 22:21:49 +0200 Subject: [PATCH 02/44] feat(util): ThumnailCache: enhance cache clearing methods for improved disk management --- lib/util/thumbnail_cache.dart | 47 ++++++++++++++++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/lib/util/thumbnail_cache.dart b/lib/util/thumbnail_cache.dart index b713943..38c6176 100644 --- a/lib/util/thumbnail_cache.dart +++ b/lib/util/thumbnail_cache.dart @@ -197,6 +197,51 @@ class ThumbnailCache { _cache.remove(key); _inFlight.remove(key); } + // Also remove any disk cache files for this location asynchronously. + scheduleMicrotask(() async { + try { + final dir = await _ensureDiskCacheDir(); + final files = dir.listSync().whereType(); + for (final f in files) { + final decoded = Uri.decodeComponent(p.basename(f.path)); + if (decoded.startsWith(prefix)) { + try { + await f.delete(); + } catch (_) { + // ignore individual delete failures + } + } + } + } catch (_) { + // ignore disk errors + } + }); + } + + /// Delete all cached files on disk. This is best-effort and will not + /// throw on failure; it may be expensive so callers should prefer to run + /// this asynchronously (it already returns a Future). + Future clearDisk() async { + try { + final dir = await _ensureDiskCacheDir(); + final files = dir.listSync().whereType().toList(growable: false); + for (final f in files) { + try { + await f.delete(); + } catch (_) { + // ignore deletion errors + } + } + } catch (e, st) { + _log.fine('Failed to clear disk thumbnail cache: $e', e, st); + } + } + + /// Clear both in-memory and on-disk caches. Prefer calling this + /// from an async context so disk work can be awaited. + Future clearAll() async { + clear(); + await clearDisk(); } String _cacheKey(String location, OrionApiFile file, String size) { @@ -328,7 +373,7 @@ class ThumbnailCache { final fname = _diskFileNameForKey(key); final file = File(p.join(dir.path, fname)); // Write atomically by writing to a temp file and renaming. - final tmpFile = File(p.join(dir.path, '\$${fname}.tmp')); + final tmpFile = File(p.join(dir.path, '\$$fname.tmp')); await tmpFile.writeAsBytes(bytes, flush: true); await tmpFile.rename(file.path); // Suppress successful disk write logs. From 6ca7aad62f57801332ac46abe0e9914bd103ad60 Mon Sep 17 00:00:00 2001 From: PaulGD03 Date: Mon, 13 Oct 2025 22:43:07 +0200 Subject: [PATCH 03/44] feat(util): StatusCard: add showPercentage option to control progress display --- lib/util/status_card.dart | 141 +++++++++++++++++++++----------------- 1 file changed, 80 insertions(+), 61 deletions(-) diff --git a/lib/util/status_card.dart b/lib/util/status_card.dart index d0aa592..5c59263 100644 --- a/lib/util/status_card.dart +++ b/lib/util/status_card.dart @@ -26,6 +26,7 @@ class StatusCard extends StatefulWidget { final double progress; final Color statusColor; final StatusModel? status; + final bool showPercentage; const StatusCard({ super.key, @@ -34,6 +35,7 @@ class StatusCard extends StatefulWidget { required this.progress, required this.statusColor, required this.status, + this.showPercentage = true, }); @override @@ -52,6 +54,12 @@ class StatusCardState extends State { cardIcon = const Icon(Icons.stop); } else if (widget.isPausing || s?.isPaused == true) { cardIcon = const Icon(Icons.pause); + } else if (s?.layer != null && s?.isPaused != true) { + // Active printing (not paused/canceled): when we're rendering the + // compact circular form (e.g., because percentage is hidden), show a + // pause icon to indicate active printing rather than the default help + // icon. + cardIcon = const Icon(Icons.pause); } // Determine what to show in the progress circle: @@ -95,68 +103,79 @@ class StatusCardState extends State { s?.isIdle != true); // While the print is active, show the progress in percentage. (overlapping text for outline effect) - return isActive - ? Stack( - children: [ - Text( - '${(widget.progress * 100).toStringAsFixed(0)}%', - style: TextStyle( - fontSize: 75, - foreground: Paint() - ..style = PaintingStyle.stroke - ..strokeWidth = 5 - ..color = Theme.of(context).colorScheme.primaryContainer, - ), - ), - Text( - '${(widget.progress * 100).toStringAsFixed(0)}%', - style: TextStyle( - fontSize: 75, - color: Theme.of(context).colorScheme.primary, - ), - ), - ], - ) - : Builder( - builder: (context) { - return GlassCard( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(999), - ), - child: Padding( - padding: const EdgeInsets.all(2.0), - child: Stack( - children: [ - Positioned( - top: 0, - bottom: 0, - left: 0, - right: 0, - child: Padding( - padding: const EdgeInsets.all(10), - child: CircularProgressIndicator( - value: circleProgress, - strokeWidth: 6, - valueColor: AlwaysStoppedAnimation( - widget.statusColor), - backgroundColor: - widget.statusColor.withValues(alpha: 0.5), - ), - ), - ), - Padding( - padding: const EdgeInsets.all(25), - child: Icon( - cardIcon.icon, - color: widget.statusColor, - size: 70, - ), - ) - ], + final shouldShowPercentage = isActive && widget.showPercentage; + final shouldShowEmpty = isActive && !widget.showPercentage; + + if (shouldShowPercentage) { + return Stack( + children: [ + Text( + '${(widget.progress * 100).toStringAsFixed(0)}%', + style: TextStyle( + fontSize: 75, + foreground: Paint() + ..style = PaintingStyle.stroke + ..strokeWidth = 5 + ..color = Theme.of(context).colorScheme.primaryContainer, + ), + ), + Text( + '${(widget.progress * 100).toStringAsFixed(0)}%', + style: TextStyle( + fontSize: 75, + color: Theme.of(context).colorScheme.primary, + ), + ), + ], + ); + } + + if (shouldShowEmpty) { + // Active print but percentage hidden: render absolutely nothing. + return const SizedBox.shrink(); + } + + // Default compact form with icon + return Builder( + builder: (context) { + return GlassCard( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(999), + ), + child: Padding( + padding: const EdgeInsets.all(2.0), + child: Stack( + children: [ + Positioned( + top: 0, + bottom: 0, + left: 0, + right: 0, + child: Padding( + padding: const EdgeInsets.all(10), + child: CircularProgressIndicator( + value: circleProgress, + strokeWidth: 6, + valueColor: + AlwaysStoppedAnimation(widget.statusColor), + backgroundColor: + widget.statusColor.withValues(alpha: 0.5), + ), ), ), - ); - }, - ); + Padding( + padding: const EdgeInsets.all(25), + child: Icon( + cardIcon.icon, + color: widget.statusColor, + size: 70, + ), + ) + ], + ), + ), + ); + }, + ); } } From bcd14f37dc6d30fb3681de03db23593642e89d5e Mon Sep 17 00:00:00 2001 From: PaulGD03 Date: Mon, 13 Oct 2025 22:43:48 +0200 Subject: [PATCH 04/44] refactor(util): ConnectionError: update header comments and simplify nanoDLP mode check --- .../connection_error_dialog.dart | 21 ++++++++++++++----- .../connection_error_watcher.dart | 21 +++++++++++++++++-- 2 files changed, 35 insertions(+), 7 deletions(-) diff --git a/lib/util/error_handling/connection_error_dialog.dart b/lib/util/error_handling/connection_error_dialog.dart index e136e55..884d3fe 100644 --- a/lib/util/error_handling/connection_error_dialog.dart +++ b/lib/util/error_handling/connection_error_dialog.dart @@ -1,7 +1,19 @@ /* - * Orion - Connection Error Dialog - * Shows live reconnection attempt counts and countdown to next attempt. - */ +* Orion - Connection Error Dialog +* Copyright (C) 2025 Open Resin Alliance +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ import 'dart:async'; @@ -139,8 +151,7 @@ class _ConnectionErrorDialogContentState try { final cfg = OrionConfig(); backendName = cfg.getString('backend', category: 'advanced'); - final devNano = cfg.getFlag('nanoDLPmode', category: 'developer'); - final isNano = backendName == 'nanodlp' || devNano; + final isNano = cfg.isNanoDlpMode(); if (isNano) { final base = cfg.getString('nanodlp.base_url', category: 'advanced'); final useCustom = cfg.getFlag('useCustomUrl', category: 'advanced'); diff --git a/lib/util/error_handling/connection_error_watcher.dart b/lib/util/error_handling/connection_error_watcher.dart index b826139..2a40c53 100644 --- a/lib/util/error_handling/connection_error_watcher.dart +++ b/lib/util/error_handling/connection_error_watcher.dart @@ -1,3 +1,20 @@ +/* +* Orion - Connection Error Watcher +* Copyright (C) 2025 Open Resin Alliance +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + import 'package:flutter/widgets.dart'; import 'package:logging/logging.dart'; import 'package:provider/provider.dart'; @@ -38,7 +55,7 @@ class ConnectionErrorWatcher { } void _onProviderChange() async { - final _log = Logger('ConnErrorWatcher'); + final log = Logger('ConnErrorWatcher'); try { final hasError = _provider.error != null; // Only log transitions or when there's something noteworthy to report @@ -48,7 +65,7 @@ class ConnectionErrorWatcher { (providerError != null) || _dialogVisible; if (shouldLog) { - _log.info( + log.info( 'provider error=${providerError != null} dialogVisible=$_dialogVisible'); _lastProviderError = providerError; _lastDialogVisible = _dialogVisible; From c869f3cad56e97a52638d682871c8f36c2edbcbd Mon Sep 17 00:00:00 2001 From: PaulGD03 Date: Mon, 13 Oct 2025 22:46:52 +0200 Subject: [PATCH 05/44] feat(backend_service): implement NotificationProvider and NotificationItem for handling notifications - only on NanoDLP for now --- .../models/nano_notification_types.dart | 132 ++++++++ .../providers/notification_provider.dart | 179 +++++++++++ .../error_handling/notification_watcher.dart | 293 ++++++++++++++++++ 3 files changed, 604 insertions(+) create mode 100644 lib/backend_service/nanodlp/models/nano_notification_types.dart create mode 100644 lib/backend_service/providers/notification_provider.dart create mode 100644 lib/util/error_handling/notification_watcher.dart diff --git a/lib/backend_service/nanodlp/models/nano_notification_types.dart b/lib/backend_service/nanodlp/models/nano_notification_types.dart new file mode 100644 index 0000000..1f0541c --- /dev/null +++ b/lib/backend_service/nanodlp/models/nano_notification_types.dart @@ -0,0 +1,132 @@ +/* +* Orion - NanoDLP Notification Types +* Copyright (C) 2025 Open Resin Alliance +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +class NanoDlpNotificationType { + final String type; + final List actions; + final int priority; + + const NanoDlpNotificationType( + {required this.type, required this.actions, required this.priority}); +} + +class NanoDlpNotificationTypes { + static const List _table = [ + NanoDlpNotificationType( + type: 'error', actions: ['continue', 'stop'], priority: 1), + NanoDlpNotificationType( + type: 'warn', actions: ['continue', 'stop'], priority: 2), + NanoDlpNotificationType( + type: 'klipper-error', actions: ['confirm'], priority: 3), + NanoDlpNotificationType( + type: 'aegis-error', actions: ['confirm'], priority: 4), + NanoDlpNotificationType( + type: 'aegis-info', actions: ['confirm'], priority: 5), + NanoDlpNotificationType(type: 'default', actions: ['confirm'], priority: 6), + ]; + + static NanoDlpNotificationType lookup(String? type) { + if (type == null) return _table.last; + try { + return _table.firstWhere((e) => e.type == type, + orElse: () => _table.last); + } catch (_) { + return _table.last; + } + } + + static int priorityOf(String? type) => lookup(type).priority; +} + +// Backwards-compatible functional helpers +const List> _defaultNanoNotificationTypes = [ + { + 'type': 'error', + 'actions': ['continue', 'stop'], + 'priority': 1 + }, + { + 'type': 'warn', + 'actions': ['continue', 'stop'], + 'priority': 2 + }, + { + 'type': 'klipper-error', + 'actions': ['confirm'], + 'priority': 3 + }, + { + 'type': 'aegis-error', + 'actions': ['confirm'], + 'priority': 4 + }, + { + 'type': 'aegis-info', + 'actions': ['confirm'], + 'priority': 5 + }, + { + 'type': 'default', + 'actions': ['confirm'], + 'priority': 6 + }, +]; + +const List> _notificationTypeTitles = [ + {'type': 'error', 'title': 'Error'}, + {'type': 'warn', 'title': 'Warning'}, + {'type': 'klipper-error', 'title': 'Klipper Error'}, + {'type': 'aegis-error', 'title': 'AEGIS Error'}, + {'type': 'aegis-info', 'title': 'AEGIS Info'}, + {'type': 'default', 'title': 'Notification'}, +]; + +Map> _indexByType( + List> list) { + final map = >{}; + for (final e in list) { + final t = (e['type'] ?? 'default').toString(); + map[t] = e; + } + return map; +} + +/// Returns the default lookup table as a type -> config map. +Map> getDefaultNanoNotificationLookup() { + return _indexByType(_defaultNanoNotificationTypes); +} + +/// Convenience: get priority for a type. Lower = higher priority. +int getNanoTypePriority(String? type) { + if (type == null) return 999; + final lookup = getDefaultNanoNotificationLookup(); + final entry = lookup[type] ?? lookup['default']; + return (entry?['priority'] as int?) ?? 999; +} + +/// Convenience: get config for a type (actions + priority). Returns default if missing. +Map getNanoTypeConfig(String? type) { + final lookup = getDefaultNanoNotificationLookup(); + return lookup[type] ?? lookup['default']!; +} + +/// Convenience: get a human-friendly title for the notification type. +String getNanoTypeTitle(String? type) { + final lookup = _indexByType(_notificationTypeTitles); + final entry = lookup[type] ?? lookup['default']; + return (entry?['title'] as String?) ?? 'Notification'; +} diff --git a/lib/backend_service/providers/notification_provider.dart b/lib/backend_service/providers/notification_provider.dart new file mode 100644 index 0000000..ff4744a --- /dev/null +++ b/lib/backend_service/providers/notification_provider.dart @@ -0,0 +1,179 @@ +/* +* Orion - Notification Provider +* Copyright (C) 2025 Open Resin Alliance +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +import 'dart:async'; +import 'package:flutter/material.dart'; +import 'package:logging/logging.dart'; +import 'package:orion/backend_service/backend_service.dart'; +import 'package:orion/backend_service/odyssey/odyssey_client.dart'; +import 'package:orion/util/orion_config.dart'; + +/// A simple notification model used locally. +class NotificationItem { + final int? timestamp; + final String? type; + final int? duration; + final String? text; + + NotificationItem.fromJson(Map j) + : timestamp = j['Timestamp'] is int + ? j['Timestamp'] + : (j['timestamp'] is int ? j['timestamp'] : null), + type = j['Type']?.toString() ?? j['type']?.toString(), + duration = j['Duration'] is int + ? j['Duration'] + : (j['duration'] is int ? j['duration'] : null), + text = j['Text']?.toString() ?? j['text']?.toString(); +} + +class NotificationProvider extends ChangeNotifier { + final OdysseyClient _client; + final _log = Logger('NotificationProvider'); + + Timer? _timer; + bool _disposed = false; + final int _pollIntervalSeconds = 1; + final Set _seen = {}; // track seen notifications by text+ts + final List _pending = []; + // Keys present on the server in the most recent poll. Each key is + // '::'. Watchers can read this to determine if a + // currently-shown notification still exists server-side. + Set _lastServerKeys = {}; + + /// Pending notifications that have not yet been handled by a watcher. + List get pendingNotifications => + List.unmodifiable(_pending); + + /// Consume and return pending notifications, clearing the pending list. + List popPendingNotifications() { + final copy = List.from(_pending); + _pending.clear(); + return copy; + } + + NotificationProvider({OdysseyClient? client}) + : _client = client ?? BackendService() { + _start(); + } + + void _start() { + try { + final cfg = OrionConfig(); + final isNano = cfg.isNanoDlpMode(); + if (!isNano) return; // placeholder: only NanoDLP implemented + } catch (_) { + // if config read fails, default to not starting + return; + } + + // Start a periodic poller + _timer = Timer.periodic(Duration(seconds: _pollIntervalSeconds), (_) { + _pollOnce(); + }); + // run an initial poll + _pollOnce(); + } + + Future _pollOnce() async { + if (_disposed) return; + try { + final raw = await _client.getNotifications(); + if (raw.isEmpty) { + // If server returned no notifications, clear any pending items and + // forget seen non-timestamped entries that cannot be reconciled. + // Also, remove any seen keys that referenced timestamped items which + // are no longer present on the server (they were acked elsewhere). + // Build an empty server set and prune below. + } + + // Parse server items into NotificationItem so we can build consistent keys + final serverItems = []; + for (final r in raw) { + try { + serverItems.add(NotificationItem.fromJson(r)); + } catch (_) {} + } + + // Build set of keys present on server + final serverKeys = {}; + for (final item in serverItems) { + final k = '${item.timestamp}:${item.type}:${item.text}'; + serverKeys.add(k); + } + + // Publish last seen server keys for watchers. + _lastServerKeys = serverKeys; + + // Prune _seen entries that are for timestamped notifications no longer + // present on server: they were likely acknowledged elsewhere. + final toRemove = []; + for (final s in _seen) { + // Only consider keys which include a timestamp (non-null prefix) + final parts = s.split(':'); + if (parts.isEmpty) continue; + final tsPart = parts[0]; + if (tsPart == 'null' || tsPart.isEmpty) continue; + if (!serverKeys.contains(s)) { + toRemove.add(s); + } + } + if (toRemove.isNotEmpty) { + for (final r in toRemove) { + _seen.remove(r); + } + // Also drop any pending NotificationItems which match the removed keys + _pending.removeWhere((p) { + final k = '${p.timestamp}:${p.type}:${p.text}'; + return toRemove.contains(k); + }); + } + + // Add new items that we haven't seen yet + var added = false; + for (final item in serverItems) { + final key = '${item.timestamp}:${item.type}:${item.text}'; + if (_seen.contains(key)) continue; + _seen.add(key); + _pending.add(item); + added = true; + } + + if (added) notifyListeners(); + } catch (e, st) { + _log.fine('Notification poll failed', e, st); + } + } + + /// Returns an unmodifiable view of the last-known server notification keys. + Set get serverKeys => Set.unmodifiable(_lastServerKeys); + + // Attempt to find a top-level context. This simple approach relies on + // WidgetsBinding having a current root view; it mirrors other usages in + // main.dart where a nav context is used. If unavailable, notification + // dialogs will be skipped. + // No direct UI responsibilities: watchers should listen to this provider + // and display dialogs using an appropriate BuildContext. + + @override + void dispose() { + _disposed = true; + try { + _timer?.cancel(); + } catch (_) {} + super.dispose(); + } +} diff --git a/lib/util/error_handling/notification_watcher.dart b/lib/util/error_handling/notification_watcher.dart new file mode 100644 index 0000000..604d320 --- /dev/null +++ b/lib/util/error_handling/notification_watcher.dart @@ -0,0 +1,293 @@ +/* +* Orion - Notification Watcher +* Copyright (C) 2025 Open Resin Alliance +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +import 'dart:async'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +import 'package:orion/backend_service/providers/notification_provider.dart'; +import 'package:orion/glasser/glasser.dart'; +import 'package:orion/backend_service/backend_service.dart'; +import 'package:orion/backend_service/nanodlp/models/nano_notification_types.dart'; + +/// Installs a watcher that will show a GlassAlertDialog for each new +/// notification reported by [NotificationProvider]. The provided [context] +/// must be attached to a Navigator (top-level app context). +class NotificationWatcher { + final BuildContext _context; + late final NotificationProvider _provider; + bool _listening = false; + final Set _locallyAcked = {}; + + NotificationWatcher._(this._context) { + _provider = Provider.of(_context, listen: false); + } + + static NotificationWatcher? install(BuildContext context) { + try { + final watcher = NotificationWatcher._(context); + watcher._start(); + return watcher; + } catch (_) { + return null; + } + } + + void _start() { + if (_listening) return; + _listening = true; + _provider.addListener(_onProviderChange); + _onProviderChange(); + } + + void _onProviderChange() { + try { + var items = _provider.popPendingNotifications(); + if (items.isEmpty) return; + // Keep only the highest-priority notifications (lower number = higher priority). + if (items.length > 1) { + final prios = items.map((i) => getNanoTypePriority(i.type)); + final minPrio = prios.reduce((a, b) => a < b ? a : b); + items = items + .where((i) => getNanoTypePriority(i.type) == minPrio) + .toList(growable: false); + } + // Sort the remaining items deterministically by priority (should be same) and timestamp (newest first) + items.sort((a, b) { + final p = + getNanoTypePriority(a.type).compareTo(getNanoTypePriority(b.type)); + if (p != 0) return p; + return (b.timestamp ?? 0).compareTo(a.timestamp ?? 0); + }); + // Show dialogs for each pending notification on next frame. + WidgetsBinding.instance.addPostFrameCallback((_) async { + for (final item in items) { + try { + await _showNotificationDialog(_context, item); + } catch (_) {} + } + }); + } catch (_) {} + } + + /// Show a notification dialog safely: retry a few times until a Navigator + /// and MaterialLocalizations are available on the provided [context]. + Future _showNotificationDialog( + BuildContext context, NotificationItem item) async { + final completer = Completer(); + + void attemptShow(int triesLeft) { + WidgetsBinding.instance.addPostFrameCallback((_) { + final hasNavigator = Navigator.maybeOf(context) != null; + final hasMaterialLocs = Localizations.of( + context, MaterialLocalizations) != + null; + if (!hasNavigator || !hasMaterialLocs) { + if (triesLeft > 0) { + Future.delayed(const Duration(milliseconds: 300), () { + attemptShow(triesLeft - 1); + }); + } else { + if (!completer.isCompleted) completer.complete(); + } + return; + } + + try { + final cfg = getNanoTypeConfig(item.type); + final actions = (cfg['actions'] as List) + .map((e) => e.toString()) + .toList(growable: false); + // Build the dialog and capture its inner BuildContext so we can + // programmatically dismiss it if the server-side notification + // disappears. + BuildContext? dialogCtx; + final key = '${item.timestamp}:${item.type}:${item.text}'; + + final dialogFuture = showDialog( + context: context, + barrierDismissible: true, + useRootNavigator: true, + builder: (BuildContext ctx) { + dialogCtx = ctx; + // Build action buttons from config + final buttons = actions.map((act) { + final label = act[0].toUpperCase() + act.substring(1); + + Future onPressed() async { + try { + // Map actions to backend calls. Keep failures isolated. + if (act == 'stop') { + try { + await BackendService().cancelPrint(); + } catch (_) {} + } else if (act == 'pause') { + try { + await BackendService().pausePrint(); + } catch (_) {} + } else if (act == 'resume') { + try { + await BackendService().resumePrint(); + } catch (_) {} + } else if (act == 'confirm' || + act == 'ack' || + act == 'acknowledge') { + // Acknowledge this notification on the server when possible. + if (item.timestamp != null) { + final k = key; + try { + await BackendService() + .disableNotification(item.timestamp!); + _locallyAcked.add(k); + } catch (_) {} + } + } else if (act == 'continue') { + // 'continue' is a no-op: dismiss and let printing continue. + } else { + // Unknown action - no-op for safety. + } + } finally { + try { + Navigator.of(ctx).pop(); + } catch (_) {} + } + } + + final style = (act == 'stop') + ? ElevatedButton.styleFrom( + minimumSize: const Size(0, 56), + backgroundColor: Colors.red.shade600, + ) + : ElevatedButton.styleFrom(minimumSize: const Size(0, 60)); + + return Flexible( + child: Padding( + padding: const EdgeInsets.only(right: 6.0), + child: GlassButton( + onPressed: onPressed, + style: style, + child: Text(label, style: const TextStyle(fontSize: 22)), + ), + ), + ); + }).toList(growable: false); + + return GlassAlertDialog( + title: Row( + children: [ + Icon( + Icons.notification_important, + color: Colors.orange.shade600, + size: 26, + ), + const SizedBox(width: 16), + Expanded( + child: Text( + getNanoTypeTitle(item.type), + style: const TextStyle( + fontSize: 22, fontWeight: FontWeight.bold), + ), + ), + ], + ), + content: Column( + mainAxisSize: MainAxisSize.min, + children: [ + const SizedBox(height: 12), + Text(item.text ?? '(no text)', + style: const TextStyle( + fontSize: 22, color: Colors.white70), + textAlign: TextAlign.center), + const SizedBox(height: 16), + ], + ), + actions: [ + Row(children: buttons), + ], + ); + }, + ); + + // Start a periodic watcher that will auto-close the dialog if the + // server no longer reports the notification key. Cancel the timer + // when the dialog completes. + Timer? autoCloseTimer; + autoCloseTimer = + Timer.periodic(const Duration(milliseconds: 500), (_) { + try { + final serverHas = _provider.serverKeys.contains(key); + if (!serverHas && dialogCtx != null) { + try { + Navigator.of(dialogCtx!, rootNavigator: true).pop(); + } catch (_) {} + autoCloseTimer?.cancel(); + } + } catch (_) {} + }); + + dialogFuture.then((_) async { + // Dialog dismissed (either by user or auto-close). If the server + // still contains the notification key at this moment, assume the + // user dismissed it and send disableNotification. If the server + // no longer contains it, it was acked elsewhere and no network + // call is necessary. + try { + final serverHas = _provider.serverKeys.contains(key); + if (serverHas && item.timestamp != null) { + try { + await BackendService().disableNotification(item.timestamp!); + } catch (_) {} + } + } catch (_) {} + + try { + autoCloseTimer?.cancel(); + } catch (_) {} + + if (!completer.isCompleted) completer.complete(); + }).catchError((err, st) { + try { + autoCloseTimer?.cancel(); + } catch (_) {} + if (!completer.isCompleted) completer.complete(); + }); + } catch (e) { + if (triesLeft > 0) { + Future.delayed(const Duration(milliseconds: 300), () { + attemptShow(triesLeft - 1); + }); + } else { + if (!completer.isCompleted) completer.complete(); + } + } + }); + } + + attemptShow(5); + return completer.future; + } + + void dispose() { + if (_listening) { + _provider.removeListener(_onProviderChange); + _listening = false; + } + } + + // Use centralized NanoDLP notification lookup utilities in + // `lib/backend_service/nanodlp/nanodlp_notification_types.dart`. +} From 6a3cf5cfefd68f65349cfff1cd6e525611295d06 Mon Sep 17 00:00:00 2001 From: PaulGD03 Date: Mon, 13 Oct 2025 22:48:18 +0200 Subject: [PATCH 06/44] fix(install_script): update downsampled resolution to 210x210 for corrected scaling. 210 effectively disables Flutter-Pi logical pixel scaling --- scripts/install_orion_athena2.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/install_orion_athena2.sh b/scripts/install_orion_athena2.sh index 873d3cc..c96bb2e 100644 --- a/scripts/install_orion_athena2.sh +++ b/scripts/install_orion_athena2.sh @@ -26,7 +26,7 @@ trap cleanup EXIT SCRIPT_NAME="$(basename "$0")" ORION_URL="https://github.com/Open-Resin-Alliance/Orion/releases/download/BRANCH_nanodlp_basic_support/orion_armv7.tar.gz" -DOWNSAMPLED_RES="200, 200" +DOWNSAMPLED_RES="210, 210" uninstall_orion() { local mode=${1:-manual} From ed73d53f738e4465b4f3c70cb609fb2db55fca48 Mon Sep 17 00:00:00 2001 From: PaulGD03 Date: Mon, 13 Oct 2025 22:50:17 +0200 Subject: [PATCH 07/44] feat(materials): add MaterialsScreen with navigation and placeholder content --- lib/home/home_screen.dart | 30 +++++++++-- lib/materials/materials_screen.dart | 80 +++++++++++++++++++++++++++++ 2 files changed, 106 insertions(+), 4 deletions(-) create mode 100644 lib/materials/materials_screen.dart diff --git a/lib/home/home_screen.dart b/lib/home/home_screen.dart index d1d165f..08e20e9 100644 --- a/lib/home/home_screen.dart +++ b/lib/home/home_screen.dart @@ -22,6 +22,7 @@ import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:orion/backend_service/providers/manual_provider.dart'; +import 'package:phosphor_flutter/phosphor_flutter.dart'; import 'package:provider/provider.dart'; import 'package:orion/glasser/glasser.dart'; import 'package:orion/l10n/generated/app_localizations.dart'; @@ -181,7 +182,7 @@ class HomeScreenState extends State { }, ); }, - child: const Icon(Icons.power_settings_new_outlined, size: 38), + child: PhosphorIcon(PhosphorIcons.power(), size: 42), ), ), ], @@ -205,7 +206,7 @@ class HomeScreenState extends State { mainAxisSize: MainAxisSize.min, mainAxisAlignment: MainAxisAlignment.center, children: [ - const Icon(Icons.print_outlined, size: 52), + PhosphorIcon(PhosphorIcons.printer(), size: 52), Text( l10n.homeBtnPrint, style: const TextStyle(fontSize: 28), @@ -215,6 +216,27 @@ class HomeScreenState extends State { ), ), const SizedBox(width: 20), + if (_config.enableResinProfiles()) ...[ + Expanded( + child: GlassButton( + style: theme.elevatedButtonTheme.style, + onPressed: + null, // () => context.go('/materials'), + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + PhosphorIcon(PhosphorIcons.flask(), size: 52), + Text( + 'Materials', + style: const TextStyle(fontSize: 28), + ), + ], + ), + ), + ), + const SizedBox(width: 20), + ], ], ), ), @@ -231,7 +253,7 @@ class HomeScreenState extends State { mainAxisSize: MainAxisSize.min, mainAxisAlignment: MainAxisAlignment.center, children: [ - const Icon(Icons.handyman_outlined, size: 52), + PhosphorIcon(PhosphorIcons.toolbox(), size: 52), Text( l10n.homeBtnTools, style: const TextStyle(fontSize: 28), @@ -249,7 +271,7 @@ class HomeScreenState extends State { mainAxisSize: MainAxisSize.min, mainAxisAlignment: MainAxisAlignment.center, children: [ - const Icon(Icons.settings_outlined, size: 52), + PhosphorIcon(PhosphorIcons.gear(), size: 52), Text( l10n.homeBtnSettings, style: const TextStyle(fontSize: 28), diff --git a/lib/materials/materials_screen.dart b/lib/materials/materials_screen.dart new file mode 100644 index 0000000..ef7e57b --- /dev/null +++ b/lib/materials/materials_screen.dart @@ -0,0 +1,80 @@ +/* +* Orion - Materials Screen +* Copyright (C) 2025 Open Resin Alliance +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +import 'package:flutter/material.dart'; + +import 'package:orion/glasser/glasser.dart'; +import 'package:phosphor_flutter/phosphor_flutter.dart'; + +class MaterialsScreen extends StatefulWidget { + const MaterialsScreen({super.key}); + + @override + MaterialsScreenState createState() => MaterialsScreenState(); +} + +class MaterialsScreenState extends State { + int _selectedIndex = 1; + + void _onItemTapped(int index) { + setState(() { + _selectedIndex = index; + }); + } + + @override + void initState() { + super.initState(); + } + + @override + Widget build(BuildContext context) { + return GlassApp( + child: Scaffold( + appBar: AppBar( + title: const Text('Materials'), + ), + body: _selectedIndex == 0 + ? const Center(child: Text('To Be Implemented Soon!')) + : _selectedIndex == 1 + ? const Center(child: Text('To Be Implemented Soon!')) + : const Center(child: Text('To Be Implemented Soon!')), + bottomNavigationBar: GlassBottomNavigationBar( + type: BottomNavigationBarType.fixed, + items: [ + BottomNavigationBarItem( + icon: PhosphorIcon(PhosphorIcons.flask()), + label: 'Resins', + ), + BottomNavigationBarItem( + icon: PhosphorIcon(PhosphorIcons.scales()), + label: 'Calibration', + ), + BottomNavigationBarItem( + icon: PhosphorIcon(PhosphorIcons.thermometer()), + label: 'Heaters', + ), + ], + currentIndex: _selectedIndex, + selectedItemColor: Theme.of(context).colorScheme.primary, + onTap: _onItemTapped, + unselectedItemColor: Theme.of(context).colorScheme.secondary, + ), + ), + ); + } +} From 860b3d48edbe369dd030a65fab22c7e4df6730e0 Mon Sep 17 00:00:00 2001 From: PaulGD03 Date: Mon, 13 Oct 2025 22:51:11 +0200 Subject: [PATCH 08/44] fix(files): DetailsScreen: update title and remove redundant name card from layout --- lib/files/details_screen.dart | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/lib/files/details_screen.dart b/lib/files/details_screen.dart index 662db4d..0d40f99 100644 --- a/lib/files/details_screen.dart +++ b/lib/files/details_screen.dart @@ -143,7 +143,7 @@ class DetailScreenState extends State { return GlassApp( child: Scaffold( appBar: AppBar( - title: Text('Print Details'), + title: Text(_meta?.fileData.name ?? widget.fileName), centerTitle: true, ), body: Center( @@ -182,11 +182,10 @@ class DetailScreenState extends State { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - buildNameCard(_meta?.fileData.name ?? widget.fileName), - const SizedBox(height: 16), Expanded( child: Column( children: [ + const SizedBox(height: 16), buildThumbnailView(context), const Spacer(), Row( @@ -258,7 +257,6 @@ class DetailScreenState extends State { flex: 1, child: ListView( children: [ - buildNameCard(_meta?.fileData.name ?? widget.fileName), buildInfoCard( 'Layer Height', _meta?.layerHeight != null @@ -287,7 +285,7 @@ class DetailScreenState extends State { 'File Size', _meta?.fileData.fileSize != null ? '${(_meta!.fileData.fileSize! / 1024 / 1024).toStringAsFixed(2)} MB' - : '-'), + : '-') ], ), ), @@ -310,8 +308,13 @@ class DetailScreenState extends State { Widget buildInfoCard(String title, String subtitle) { final cardContent = ListTile( - title: Text(title), - subtitle: Text(subtitle), + title: AutoSizeText(title), + subtitle: AutoSizeText( + subtitle, + maxLines: 1, + minFontSize: 18, + overflow: TextOverflow.ellipsis, + ), ); return GlassCard( From e436425a0c79258ed7254612ca6beec334e3d200 Mon Sep 17 00:00:00 2001 From: PaulGD03 Date: Mon, 13 Oct 2025 22:53:01 +0200 Subject: [PATCH 09/44] feat(util): implement LayerPreviewCache for in-memory caching of 2D layer previews --- lib/util/layer_preview_cache.dart | 110 ++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 lib/util/layer_preview_cache.dart diff --git a/lib/util/layer_preview_cache.dart b/lib/util/layer_preview_cache.dart new file mode 100644 index 0000000..d2a81f7 --- /dev/null +++ b/lib/util/layer_preview_cache.dart @@ -0,0 +1,110 @@ +/* +* Orion - Layer Preview Cache +* Copyright (C) 2025 Open Resin Alliance +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +import 'dart:typed_data'; + +import 'package:orion/backend_service/backend_service.dart'; + +/// Simple in-memory LRU cache for 2D layer previews. +class LayerPreviewCache { + LayerPreviewCache._private(); + static final LayerPreviewCache instance = LayerPreviewCache._private(); + + // Key format: '$plateId:$layer' + final _map = {}; + final _order = []; // keys in insertion order for simple LRU + final int _maxEntries = 100; + + // Use proper string interpolation so each plate/layer gets a unique key. + String _key(int plateId, int layer) => '$plateId:$layer'; + + // Track in-flight fetches so concurrent requests for the same + // plate/layer are deduped and only one network call is made. + final _inflight = >{}; + + /// Fetch a specific plate/layer via [backend] and cache the result. + /// Concurrent callers for the same plate/layer will await the same + /// in-flight future. + Future fetchAndCache( + BackendService backend, int plateId, int layer) async { + final k = _key(plateId, layer); + final existing = _map[k]; + if (existing != null) return existing; + final inflight = _inflight[k]; + if (inflight != null) return await inflight; + + final future = backend.getPlateLayerImage(plateId, layer).then((bytes) { + if (bytes.isNotEmpty) set(plateId, layer, bytes); + return bytes; + }).whenComplete(() { + _inflight.remove(k); + }); + + _inflight[k] = future; + return await future; + } + + Uint8List? get(int plateId, int layer) { + final k = _key(plateId, layer); + final v = _map[k]; + if (v == null) return null; + // Refresh order (move to end) + _order.remove(k); + _order.add(k); + return v; + } + + void set(int plateId, int layer, Uint8List bytes) { + final k = _key(plateId, layer); + if (_map.containsKey(k)) { + _order.remove(k); + } + _map[k] = bytes; + _order.add(k); + _evictIfNeeded(); + } + + void _evictIfNeeded() { + while (_order.length > _maxEntries) { + final oldest = _order.removeAt(0); + _map.remove(oldest); + } + } + + void clear() { + _map.clear(); + _order.clear(); + } + + /// Preload [count] layers starting at [layer+1]. Runs best-effort in + /// background using the provided backend service instance. + void preload(BackendService backend, int plateId, int layer, + {int count = 2}) async { + for (int i = 1; i <= count; i++) { + final target = layer + i; + final k = _key(plateId, target); + if (_map.containsKey(k)) continue; + try { + // Use fetchAndCache which dedupes inflight requests and ensures + // resizing is performed off the main isolate where supported. + await fetchAndCache(backend, plateId, target); + } catch (_) { + // ignore preload failures + } + } + } +} From ee189c838ff58e04a3cfada5a89ff7e55a57de7f Mon Sep 17 00:00:00 2001 From: PaulGD03 Date: Mon, 13 Oct 2025 22:53:21 +0200 Subject: [PATCH 10/44] refactor(status): simplify NanoDLP mode check by using isNanoDlpMode method --- lib/backend_service/providers/status_provider.dart | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/lib/backend_service/providers/status_provider.dart b/lib/backend_service/providers/status_provider.dart index 72e5b01..a9fa127 100644 --- a/lib/backend_service/providers/status_provider.dart +++ b/lib/backend_service/providers/status_provider.dart @@ -202,9 +202,8 @@ class StatusProvider extends ChangeNotifier { // attempting to establish an SSE subscription in that case. try { final cfg = OrionConfig(); - final backend = cfg.getString('backend', category: 'advanced'); - final devNano = cfg.getFlag('nanoDLPmode', category: 'developer'); - if (backend == 'nanodlp' || devNano) { + final isNano = cfg.isNanoDlpMode(); + if (isNano) { _log.info( 'Backend is NanoDLP; skipping SSE subscription and using polling'); _startPolling(); @@ -669,9 +668,7 @@ class StatusProvider extends ChangeNotifier { // visually responsive. try { final cfg = OrionConfig(); - final backend = cfg.getString('backend', category: 'advanced'); - final devNano = cfg.getFlag('nanoDLPmode', category: 'developer'); - final isNano = backend == 'nanodlp' || devNano; + final isNano = cfg.isNanoDlpMode(); if (!shouldNotify && isNano && (_status?.isPrinting == true || _status?.isPaused == true)) { From b3b5b8bf8a4975b572c3b9567b80381aeebb4cf3 Mon Sep 17 00:00:00 2001 From: PaulGD03 Date: Mon, 13 Oct 2025 22:54:08 +0200 Subject: [PATCH 11/44] feat(backend_service): nanodlp: thumbnail: maintain aspect ratio, 2d layer preview --- .../nanodlp/nanodlp_thumbnail_generator.dart | 102 ++++++++++++++++-- 1 file changed, 94 insertions(+), 8 deletions(-) diff --git a/lib/backend_service/nanodlp/nanodlp_thumbnail_generator.dart b/lib/backend_service/nanodlp/nanodlp_thumbnail_generator.dart index a687f69..4e89462 100644 --- a/lib/backend_service/nanodlp/nanodlp_thumbnail_generator.dart +++ b/lib/backend_service/nanodlp/nanodlp_thumbnail_generator.dart @@ -1,6 +1,25 @@ +/* +* Orion - NanoDLP Thumbnail Generator +* Copyright (C) 2025 Open Resin Alliance +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + import 'dart:typed_data'; +import 'dart:math' as math; import 'package:image/image.dart' as img; +import 'package:flutter/foundation.dart'; class NanoDlpThumbnailGenerator { const NanoDlpThumbnailGenerator._(); @@ -54,16 +73,55 @@ class NanoDlpThumbnailGenerator { try { final decoded = img.decodeImage(sourceBytes); if (decoded != null) { - img.Image resized; + // If the image already matches the target size, return it as-is. if (decoded.width == width && decoded.height == height) { - resized = decoded; - } else { - resized = img.copyResize(decoded, - width: width, - height: height, - interpolation: img.Interpolation.cubic); + return Uint8List.fromList(img.encodePng(decoded)); } - return Uint8List.fromList(img.encodePng(resized)); + + // Apply a small internal padding so thumbnails don't touch the + // canvas edges. The padded area (innerWidth x innerHeight) is the + // space available for the aspect-fit image. + const int pad = 8; + final innerWidth = math.max(1, width - (pad * 2)); + final innerHeight = math.max(1, height - (pad * 2)); + + // Compute aspect-fit scale to preserve aspect ratio inside the + // inner padded box. + final scale = math.min( + innerWidth / decoded.width, innerHeight / decoded.height); + final targetW = math.max(1, (decoded.width * scale).round()); + final targetH = math.max(1, (decoded.height * scale).round()); + + final resized = img.copyResize(decoded, + width: targetW, + height: targetH, + interpolation: img.Interpolation.cubic); + + // Create a transparent canvas of the requested size and center the + // resized image on it so we don't distort the aspect ratio. This + // results in translucent padding when the aspect ratios differ. + // Ensure canvas has an alpha channel so transparent padding stays + // transparent when encoded to PNG. + final canvas = + img.Image(width: width, height: height, numChannels: 4); + // Ensure fully transparent background (ARGB = 0). + final transparent = img.ColorRgba8(0, 0, 0, 0); + img.fill(canvas, color: transparent); + + final dx = pad + ((innerWidth - targetW) / 2).round(); + final dy = pad + ((innerHeight - targetH) / 2).round(); + + // Blit the resized image into the centered position on the + // transparent canvas by copying pixels — this works across + // image package versions without relying on draw helpers. + for (var y = 0; y < targetH; y++) { + for (var x = 0; x < targetW; x++) { + final px = resized.getPixel(x, y); + canvas.setPixel(dx + x, dy + y, px); + } + } + + return Uint8List.fromList(img.encodePng(canvas)); } } catch (_) { // fall back to placeholder below @@ -75,4 +133,32 @@ class NanoDlpThumbnailGenerator { /// Convenience helper to force the canonical NanoDLP large size. static Uint8List resizeToLarge(Uint8List? sourceBytes) => resizeOrPlaceholder(sourceBytes, largeWidth, largeHeight); + + /// Resize a 2D layer PNG (from /static/plates/`/N.png) to the + /// canonical large size, ignoring aspect ratio (force resize). This is + /// intentionally different from `resizeOrPlaceholder` which preserves + /// aspect ratio and adds transparent padding. + static Uint8List resizeLayer2D(Uint8List? sourceBytes) { + if (sourceBytes != null && sourceBytes.isNotEmpty) { + try { + final decoded = img.decodeImage(sourceBytes); + if (decoded != null) { + final resized = img.copyResize(decoded, + width: largeWidth, + height: largeHeight, + interpolation: img.Interpolation.cubic); + return Uint8List.fromList(img.encodePng(resized)); + } + } catch (_) { + // fall-through to placeholder + } + } + return generatePlaceholder(largeWidth, largeHeight); + } } + +// Public top-level entrypoint for compute() so other libraries can call +// compute(resizeLayer2DCompute, bytes). Must be public (non-underscore) +// so it is available across library boundaries when spawning an isolate. +Uint8List resizeLayer2DCompute(Uint8List bytes) => + NanoDlpThumbnailGenerator.resizeLayer2D(bytes); From 991f6f31827b58cf692e2a786c949b1108ac4fc5 Mon Sep 17 00:00:00 2001 From: PaulGD03 Date: Mon, 13 Oct 2025 22:57:26 +0200 Subject: [PATCH 12/44] feat(backend_service): add getNotifications and disableNotification methods to BackendService - also implements per-layer previews --- lib/backend_service/backend_service.dart | 29 +++++++ .../nanodlp/nanodlp_http_client.dart | 81 ++++++++++++++++++- .../odyssey/odyssey_client.dart | 33 ++++++++ .../odyssey/odyssey_http_client.dart | 43 ++++++++++ 4 files changed, 183 insertions(+), 3 deletions(-) diff --git a/lib/backend_service/backend_service.dart b/lib/backend_service/backend_service.dart index e6dd2a3..148820b 100644 --- a/lib/backend_service/backend_service.dart +++ b/lib/backend_service/backend_service.dart @@ -1,3 +1,20 @@ +/* +* Orion - Backend Service +* Copyright (C) 2025 Open Resin Alliance +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + import 'dart:typed_data'; import 'package:orion/backend_service/odyssey/odyssey_client.dart'; import 'package:orion/backend_service/odyssey/odyssey_http_client.dart'; @@ -71,6 +88,14 @@ class BackendService implements OdysseyClient { @override Stream> getStatusStream() => _delegate.getStatusStream(); + @override + Future>> getNotifications() => + _delegate.getNotifications(); + + @override + Future disableNotification(int timestamp) => + _delegate.disableNotification(timestamp); + @override Future cancelPrint() => _delegate.cancelPrint(); @@ -115,4 +140,8 @@ class BackendService implements OdysseyClient { @override Future displayTest(String test) => _delegate.displayTest(test); + + @override + Future getPlateLayerImage(int plateId, int layer) => + _delegate.getPlateLayerImage(plateId, layer); } diff --git a/lib/backend_service/nanodlp/nanodlp_http_client.dart b/lib/backend_service/nanodlp/nanodlp_http_client.dart index a54da0b..a70e9df 100644 --- a/lib/backend_service/nanodlp/nanodlp_http_client.dart +++ b/lib/backend_service/nanodlp/nanodlp_http_client.dart @@ -16,7 +16,6 @@ */ import 'dart:async'; -import 'dart:typed_data'; import 'dart:convert'; import 'package:http/http.dart' as http; @@ -26,6 +25,7 @@ import 'package:orion/backend_service/nanodlp/models/nano_status.dart'; import 'package:orion/backend_service/nanodlp/models/nano_manual.dart'; import 'package:orion/backend_service/nanodlp/nanodlp_mappers.dart'; import 'package:orion/backend_service/nanodlp/nanodlp_thumbnail_generator.dart'; +import 'package:flutter/foundation.dart'; import 'package:orion/backend_service/odyssey/odyssey_client.dart'; import 'package:orion/util/orion_config.dart'; @@ -77,7 +77,7 @@ class NanoDlpHttpClient implements OdysseyClient { } catch (e) { apiUrl = 'http://localhost'; } - _log.info('constructed NanoDlpHttpClient apiUrl=$apiUrl'); + // _log.info('constructed NanoDlpHttpClient apiUrl=$apiUrl'); // commented out to reduce noise } http.Client _createClient() { @@ -221,6 +221,29 @@ class NanoDlpHttpClient implements OdysseyClient { } } + @override + Future>> getNotifications() async { + final baseNoSlash = apiUrl.replaceAll(RegExp(r'/+$'), ''); + final uri = Uri.parse('$baseNoSlash/notification'); + final client = _createClient(); + try { + final resp = await client.get(uri); + if (resp.statusCode != 200) return []; + final decoded = json.decode(resp.body); + if (decoded is List) { + return decoded + .whereType>() + .toList(growable: false); + } + return []; + } catch (e, st) { + _log.fine('NanoDLP getNotifications failed', e, st); + return []; + } finally { + client.close(); + } + } + @override Future usbAvailable() async { // NanoDLP runs on a networked device, USB availability is not applicable. @@ -743,6 +766,31 @@ class NanoDlpHttpClient implements OdysseyClient { } }(); + @override + Future disableNotification(int timestamp) async { + try { + final baseNoSlash = apiUrl.replaceAll(RegExp(r'/+$'), ''); + final uri = Uri.parse('$baseNoSlash/notification/disable/$timestamp'); + _log.info('NanoDLP disableNotification: $uri'); + final client = _createClient(); + try { + final resp = await client.get(uri); + if (resp.statusCode != 200) { + _log.warning( + 'NanoDLP disableNotification returned ${resp.statusCode}: ${resp.body}'); + throw Exception( + 'NanoDLP disableNotification failed: ${resp.statusCode}'); + } + return; + } finally { + client.close(); + } + } catch (e, st) { + _log.warning('NanoDLP disableNotification error', e, st); + rethrow; + } + } + @override Future pausePrint() async { try { @@ -938,6 +986,33 @@ class NanoDlpHttpClient implements OdysseyClient { } } + /// Fetch a 2D layer PNG for a given plate and layer index. This will + /// return a canonical large-sized PNG (800x480) by force-resizing the + /// downloaded image. On error, a generated placeholder is returned. + @override + Future getPlateLayerImage(int plateId, int layer) async { + final baseNoSlash = apiUrl.replaceAll(RegExp(r'/+$'), ''); + final uri = Uri.parse('$baseNoSlash/static/plates/$plateId/$layer.png'); + final entry = await _downloadThumbnail(uri, 'plate $plateId layer $layer'); + if (entry.bytes.isNotEmpty) { + try { + // Resize on a background isolate to avoid blocking the UI thread. + try { + return await compute(resizeLayer2DCompute, entry.bytes); + } catch (_) { + // If compute fails (e.g., in test environment), fall back to + // synchronous resize. + return NanoDlpThumbnailGenerator.resizeLayer2D(entry.bytes); + } + } catch (_) { + // fall through to placeholder + } + } + return NanoDlpThumbnailGenerator.generatePlaceholder( + NanoDlpThumbnailGenerator.largeWidth, + NanoDlpThumbnailGenerator.largeHeight); + } + Future> _fetchPlates({bool forceRefresh = false}) { if (!forceRefresh) { final cached = _platesCacheData; @@ -976,7 +1051,7 @@ class NanoDlpHttpClient implements OdysseyClient { Future> _loadPlatesFromNetwork() async { final baseNoSlash = apiUrl.replaceAll(RegExp(r'/+$'), ''); final uri = Uri.parse('$baseNoSlash/plates/list/json'); - _log.fine('Requesting NanoDLP plates list (no query params): $uri'); + // _log.fine('Requesting NanoDLP plates list (no query params): $uri'); // commented out to reduce noise final client = _createClient(); try { diff --git a/lib/backend_service/odyssey/odyssey_client.dart b/lib/backend_service/odyssey/odyssey_client.dart index cad757b..a0ec337 100644 --- a/lib/backend_service/odyssey/odyssey_client.dart +++ b/lib/backend_service/odyssey/odyssey_client.dart @@ -1,3 +1,20 @@ +/* +* Orion - Odyssey Client +* Copyright (C) 2025 Open Resin Alliance +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + import 'dart:typed_data'; import 'dart:async'; @@ -32,6 +49,16 @@ abstract class OdysseyClient { /// object parsed from the stream's data payloads. Stream> getStatusStream(); + /// Fetch recent notifications from the backend. Returns a list of JSON + /// objects representing notifications. Some backends (e.g. NanoDLP) + /// expose a `/notification` endpoint that returns an array. + Future>> getNotifications(); + + /// Disable / acknowledge a notification on the backend when supported. + /// The timestamp argument is the numeric timestamp provided by the + /// notification payload (e.g. NanoDLP uses an integer timestamp). + Future disableNotification(int timestamp); + // Print control Future cancelPrint(); Future pausePrint(); @@ -57,4 +84,10 @@ abstract class OdysseyClient { Future> manualCommand(String command); Future> emergencyStop(); Future displayTest(String test); + + /// Fetch a specific 2D layer PNG from a NanoDLP-style plates endpoint. + /// plateId is the numeric plate identifier and layer is the layer index + /// (as reported by the backend). Implementations that don't support this + /// may return a placeholder image or empty bytes. + Future getPlateLayerImage(int plateId, int layer); } diff --git a/lib/backend_service/odyssey/odyssey_http_client.dart b/lib/backend_service/odyssey/odyssey_http_client.dart index f5fffa0..82fe6f7 100644 --- a/lib/backend_service/odyssey/odyssey_http_client.dart +++ b/lib/backend_service/odyssey/odyssey_http_client.dart @@ -22,6 +22,7 @@ import 'package:http/http.dart' as http; import 'package:logging/logging.dart'; import 'package:orion/backend_service/odyssey/odyssey_client.dart'; import 'package:orion/util/orion_config.dart'; +import 'package:orion/backend_service/nanodlp/nanodlp_thumbnail_generator.dart'; class OdysseyHttpClient implements OdysseyClient { late final String apiUrl; @@ -102,6 +103,22 @@ class OdysseyHttpClient implements OdysseyClient { return json.decode(resp.body) as Map; } + @override + Future>> getNotifications() async { + try { + final resp = await _odysseyGet('/notification', {}); + final decoded = json.decode(resp.body); + if (decoded is List) { + return decoded + .whereType>() + .toList(growable: false); + } + return []; + } catch (e) { + return []; + } + } + @override Stream> getStatusStream() async* { final uri = _dynUri(apiUrl, '/status/stream', {}); @@ -218,6 +235,26 @@ class OdysseyHttpClient implements OdysseyClient { return resp.bodyBytes; } + @override + Future getPlateLayerImage(int plateId, int layer) async { + // Odyssey backend does not generally provide NanoDLP-style plate layer + // images. Return a placeholder matching the canonical NanoDLP large + // size so callers can display a consistent image. + try { + // Use the NanoDLP thumbnail generator's placeholder if available. + // Importing here avoids adding a package-level dependency at the + // top-level of this file which may not be desired for all builds. + // However, NanoDlpThumbnailGenerator is a light-weight helper already + // present in the project. + // ignore: avoid_dynamic_calls + return Future.value(NanoDlpThumbnailGenerator.generatePlaceholder( + NanoDlpThumbnailGenerator.largeWidth, + NanoDlpThumbnailGenerator.largeHeight)); + } catch (_) { + return Future.value(Uint8List(0)); + } + } + @override Future startPrint(String location, String filePath) async { await _odysseyPost( @@ -289,6 +326,12 @@ class OdysseyHttpClient implements OdysseyClient { client.close(); } } + + @override + Future disableNotification(int timestamp) { + // TODO: implement disableNotification + throw UnimplementedError(); + } } class _TimeoutHttpClient extends http.BaseClient { From 9ce9af5327bef295a9887f48d6e17e025b367237 Mon Sep 17 00:00:00 2001 From: PaulGD03 Date: Mon, 13 Oct 2025 22:58:36 +0200 Subject: [PATCH 13/44] feat(backend_service: nanodlp): refine printing state logic to avoid false positives --- lib/backend_service/nanodlp/nanodlp_state_handler.dart | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/backend_service/nanodlp/nanodlp_state_handler.dart b/lib/backend_service/nanodlp/nanodlp_state_handler.dart index 12824ea..c7f07bb 100644 --- a/lib/backend_service/nanodlp/nanodlp_state_handler.dart +++ b/lib/backend_service/nanodlp/nanodlp_state_handler.dart @@ -156,7 +156,12 @@ class NanoDlpStateHandler { return result; } - if (stateCode == 1 || stateCode == 5) { + // Treat state==1 as a transient printing/start state. For state==5 + // (active print) require that the status payload's `Printing` flag is + // actually true before we consider the device printing. Some NanoDLP + // installs emit State==5 but have Printing==false in corner cases; + // requiring both helps avoid false-positive printing reports. + if (stateCode == 1 || (stateCode == 5 && ns.printing == true)) { final result = { 'status': 'Printing', 'paused': false, From 6040543a67f321efb6d7550643a71a04ec864356 Mon Sep 17 00:00:00 2001 From: PaulGD03 Date: Mon, 13 Oct 2025 23:01:23 +0200 Subject: [PATCH 14/44] feat(status): implement 2D layer preview with prefetching and caching - slightly redesign appBar for more information density - grey out pause button while already pausing --- lib/status/status_screen.dart | 633 ++++++++++++++++++++++++++-------- 1 file changed, 486 insertions(+), 147 deletions(-) diff --git a/lib/status/status_screen.dart b/lib/status/status_screen.dart index dd8ad32..5444508 100644 --- a/lib/status/status_screen.dart +++ b/lib/status/status_screen.dart @@ -19,6 +19,7 @@ import 'package:auto_size_text/auto_size_text.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/foundation.dart'; import 'package:provider/provider.dart'; import 'dart:typed_data'; import 'package:orion/backend_service/nanodlp/nanodlp_thumbnail_generator.dart'; @@ -31,6 +32,8 @@ import 'package:orion/util/providers/theme_provider.dart'; import 'package:orion/util/status_card.dart'; import 'package:orion/backend_service/providers/status_provider.dart'; import 'package:orion/backend_service/odyssey/models/status_models.dart'; +import 'package:orion/backend_service/backend_service.dart'; +import 'package:orion/util/layer_preview_cache.dart'; class StatusScreen extends StatefulWidget { final bool newPrint; @@ -61,11 +64,6 @@ class StatusScreenState extends State { // Presentation-local state (derived values computed per build instead of storing) bool get _isLandscape => MediaQuery.of(context).orientation == Orientation.landscape; - int get _maxNameLength => _isLandscape ? 12 : 24; - - String _truncateFileName(String name) => name.length >= _maxNameLength - ? '${name.substring(0, _maxNameLength)}...' - : name; // Duration formatting moved to StatusModel.formattedElapsedPrintTime @@ -86,6 +84,17 @@ class StatusScreenState extends State { } } + // Local UI state for toggling 2D layer preview + bool _showLayer2D = false; + Uint8List? _layer2DBytes; + ImageProvider? _layer2DImageProvider; + bool _layer2DLoading = false; + DateTime? _lastLayerToggleTime; + bool _prefetched = false; + int? _lastPrefetchedLayer; + int? _resolvedPlateIdForPrefetch; + String? _resolvedFilePathForPrefetch; + bool _bytesEqual(Uint8List a, Uint8List b) { if (identical(a, b)) return true; if (a.lengthInBytes != b.lengthInBytes) return false; @@ -240,6 +249,33 @@ class StatusScreenState extends State { } final elapsedStr = status.formattedElapsedPrintTime; + // Trigger a one-time prefetch of 3D and current 2D layer thumbnails + // when we first observe a valid status with file metadata. + if (!_prefetched && status.printData?.fileData != null) { + _prefetched = true; + WidgetsBinding.instance.addPostFrameCallback((_) { + if (!mounted) return; + _prefetchThumbnails(status); + }); + } + + // Proactively preload next layers when the reported layer changes. + // Use a post-frame callback to perform async work outside build. + if (status.layer != null && + status.printData?.fileData != null && + status.printData?.fileData?.path != _resolvedFilePathForPrefetch) { + // File changed; clear previously-resolved plate id so we'll re-resolve. + _resolvedFilePathForPrefetch = status.printData?.fileData?.path; + _resolvedPlateIdForPrefetch = null; + _lastPrefetchedLayer = null; + } + + if (status.layer != null && status.layer != _lastPrefetchedLayer) { + WidgetsBinding.instance.addPostFrameCallback((_) { + if (!mounted) return; + _maybePreloadNextLayers(status); + }); + } final fileName = _frozenFileName ?? status.printData?.fileData?.name ?? ''; @@ -247,15 +283,77 @@ class StatusScreenState extends State { child: Scaffold( appBar: AppBar( automaticallyImplyLeading: false, + centerTitle: true, title: Builder(builder: (context) { final deviceMsg = provider.deviceStatusMessage; final statusText = (deviceMsg != null && deviceMsg.trim().isNotEmpty) ? deviceMsg : provider.displayStatus; - return Text( - statusText, - style: Theme.of(context).appBarTheme.titleTextStyle, + // Use a single base font size for both title lines so they appear + // visually consistent. If the AppBar theme provides a title + // fontSize, use that as the base; otherwise default to 14 and + // reduce slightly. + final baseFontSize = + (Theme.of(context).appBarTheme.titleTextStyle?.fontSize ?? + 14) - + 10; + + return Column( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisSize: MainAxisSize.min, + children: [ + Text( + fileName.isNotEmpty ? fileName : 'No file', + textAlign: TextAlign.center, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: Theme.of(context) + .appBarTheme + .titleTextStyle + ?.copyWith( + fontSize: baseFontSize, + fontWeight: FontWeight.normal, + color: Theme.of(context) + .appBarTheme + .titleTextStyle + ?.color + ?.withValues(alpha: 0.95), + ), + ), + const SizedBox(height: 2), + Text( + statusText, + textAlign: TextAlign.center, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: Theme.of(context) + .appBarTheme + .titleTextStyle + ?.merge(TextStyle( + fontWeight: FontWeight.normal, + fontSize: baseFontSize, + )) + .copyWith( + // Make status less visually dominant by lowering + // its alpha relative to the AppBar title color. + color: Theme.of(context) + .appBarTheme + .titleTextStyle + ?.color + ?.withValues(alpha: 0.65), + ) ?? + TextStyle( + fontSize: baseFontSize, + fontWeight: FontWeight.normal, + color: Theme.of(context) + .appBarTheme + .titleTextStyle + ?.color + ?.withValues(alpha: 0.65), + ), + ), + ], ); }), ), @@ -311,7 +409,6 @@ class StatusScreenState extends State { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - _buildNameCard(fileName, provider), const SizedBox(height: 16), Expanded( child: Column( @@ -366,7 +463,6 @@ class StatusScreenState extends State { Expanded( flex: 1, child: ListView(children: [ - _buildNameCard(fileName, provider), _buildInfoCard( 'Current Z Position', '${statusModel?.physicalState.z.toStringAsFixed(3) ?? '-'} mm', @@ -413,37 +509,6 @@ class StatusScreenState extends State { ); } - Widget _buildNameCard(String fileName, StatusProvider provider) { - final truncated = _truncateFileName(fileName); - final statusModel = provider.status; - final finishedSnapshot = - statusModel?.isIdle == true && statusModel?.layer != null; - // Prefer canonical 'finished' hint from the mapper. - final effectivelyFinished = statusModel?.finished == true; - final color = (finishedSnapshot && !effectivelyFinished) - ? Theme.of(context).colorScheme.error - : provider.statusColor(context); - return GlassCard( - outlined: true, - child: ListTile( - title: AutoSizeText.rich( - maxLines: 1, - minFontSize: 16, - TextSpan(children: [ - TextSpan( - text: truncated, - style: TextStyle( - fontSize: 24, - fontWeight: FontWeight.bold, - color: color, - ), - ), - ]), - ), - ), - ); - } - Widget _buildThumbnailView( BuildContext context, StatusProvider provider, StatusModel? status) { // Prefer provider's thumbnail bytes. If none yet, consider the @@ -483,132 +548,401 @@ class StatusScreenState extends State { ? Theme.of(context).colorScheme.error : statusColor; return Center( - child: Stack( - children: [ - GlassCard( - outlined: true, - elevation: 1.0, - child: Padding( - padding: const EdgeInsets.all(4.5), - child: ClipRRect( - borderRadius: themeProvider.isGlassTheme - ? BorderRadius.circular(10.5) - : BorderRadius.circular(7.75), - child: Stack(children: [ - ColorFiltered( - colorFilter: const ColorFilter.matrix([ - 0.2126, 0.7152, 0.0722, 0, 0, // grayscale matrix - 0.2126, 0.7152, 0.0722, 0, 0, - 0.2126, 0.7152, 0.0722, 0, 0, - 0, 0, 0, 1, 0, - ]), - child: thumbnail != null && thumbnail.isNotEmpty - ? Image.memory( - thumbnail, - fit: BoxFit.cover, - ) - : Center( - child: CircularProgressIndicator( - valueColor: AlwaysStoppedAnimation( - effectiveStatusColor), + child: GestureDetector( + onTap: () { + // Debounce toggles: ignore taps that occur within 500ms of the + // previous toggle, and ignore while a layer load is in progress. + final now = DateTime.now(); + if (_layer2DLoading) return; + if (_lastLayerToggleTime != null && + now.difference(_lastLayerToggleTime!) < + const Duration(milliseconds: 500)) { + return; + } + + // Toggle 2D layer preview. If enabling, trigger fetch. + final providerState = + Provider.of(context, listen: false); + setState(() { + _showLayer2D = !_showLayer2D; + _lastLayerToggleTime = now; + }); + if (_showLayer2D) { + _fetchLayer2D(providerState, statusModel); + } + }, + child: Stack( + children: [ + GlassCard( + outlined: true, + elevation: 1.0, + child: Padding( + padding: const EdgeInsets.all(4.5), + child: ClipRRect( + borderRadius: themeProvider.isGlassTheme + ? BorderRadius.circular(12.5) + : BorderRadius.circular(7.75), + child: Stack(children: [ + // Base thumbnail / spinner + ColorFiltered( + colorFilter: const ColorFilter.matrix([ + 0.2126, 0.7152, 0.0722, 0, 0, // grayscale matrix + 0.2126, 0.7152, 0.0722, 0, 0, + 0.2126, 0.7152, 0.0722, 0, 0, + 0, 0, 0, 1, 0, + ]), + child: thumbnail != null && thumbnail.isNotEmpty + ? Image.memory( + thumbnail, + fit: BoxFit.cover, + ) + : Center( + child: CircularProgressIndicator( + valueColor: AlwaysStoppedAnimation( + effectiveStatusColor), + ), ), - ), - ), - Positioned.fill( - child: Container( - color: Colors.black.withValues(alpha: 0.35), ), - ), - Positioned.fill( - child: Align( - alignment: Alignment.bottomCenter, - child: ClipRect( - child: Align( - alignment: Alignment.bottomCenter, - heightFactor: progress, - child: thumbnail != null && thumbnail.isNotEmpty - ? Image.memory( - thumbnail, - fit: BoxFit.cover, - ) - : Center( - child: CircularProgressIndicator( - valueColor: AlwaysStoppedAnimation( - effectiveStatusColor), + + // Dim overlay + Positioned.fill( + child: Container( + color: Colors.black.withValues(alpha: 0.35), + ), + ), + + // Progress wipe + Positioned.fill( + child: Align( + alignment: Alignment.bottomCenter, + child: ClipRect( + child: Align( + alignment: Alignment.bottomCenter, + heightFactor: progress, + child: thumbnail != null && thumbnail.isNotEmpty + ? Image.memory( + thumbnail, + fit: BoxFit.cover, + ) + : Center( + child: CircularProgressIndicator( + valueColor: AlwaysStoppedAnimation( + effectiveStatusColor), + ), ), - ), + ), ), ), ), - ), - ]), + + // 2D layer overlay (covers base thumbnail and status card when active) + if (_showLayer2D) + Positioned.fill( + child: _layer2DLoading + ? Center( + child: CircularProgressIndicator( + valueColor: AlwaysStoppedAnimation( + effectiveStatusColor), + ), + ) + : (_layer2DImageProvider != null + ? Image( + image: _layer2DImageProvider!, + gaplessPlayback: true, + fit: BoxFit.cover, + ) + : (_layer2DBytes != null && + _layer2DBytes!.isNotEmpty + ? Image.memory( + _layer2DBytes!, + fit: BoxFit.cover, + ) + : Center( + child: Text('2D preview unavailable'), + ))), + ), + ]), + ), ), ), - ), - Positioned.fill( - right: 15, - child: Center( - child: StatusCard( - isCanceling: provider.isCanceling, - isPausing: provider.isPausing, - progress: progress, - statusColor: effectiveStatusColor, - status: status, + Positioned.fill( + right: 15, + child: Center( + child: StatusCard( + isCanceling: provider.isCanceling, + isPausing: provider.isPausing, + progress: progress, + statusColor: effectiveStatusColor, + status: status, + showPercentage: !_showLayer2D, + ), ), ), - ), - Positioned( - top: 0, - bottom: 0, - right: 0, - child: Padding( - padding: const EdgeInsets.all(2), - child: Builder(builder: (context) { - final isGlassTheme = themeProvider.isGlassTheme; - return Card( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.only( - topRight: isGlassTheme - ? const Radius.circular(14.0) - : const Radius.circular(9.75), - bottomRight: isGlassTheme - ? const Radius.circular(14.0) - : const Radius.circular(9.75), - ), - ), - child: Padding( - padding: const EdgeInsets.all(2.5), - child: ClipRRect( + Positioned( + top: 0, + bottom: 0, + right: 0, + child: Padding( + padding: const EdgeInsets.all(2), + child: Builder(builder: (context) { + final isGlassTheme = themeProvider.isGlassTheme; + return GlassCard( + shape: RoundedRectangleBorder( borderRadius: BorderRadius.only( topRight: isGlassTheme - ? const Radius.circular(11.5) - : const Radius.circular(7.75), + ? const Radius.circular(14.0) + : const Radius.circular(9.75), bottomRight: isGlassTheme - ? const Radius.circular(11.5) - : const Radius.circular(7.75), + ? const Radius.circular(14.0) + : const Radius.circular(9.75), ), - child: RotatedBox( - quarterTurns: 3, - child: LinearProgressIndicator( - minHeight: 30, - color: effectiveStatusColor, - value: progress, - backgroundColor: isGlassTheme - ? effectiveStatusColor.withValues(alpha: 0.1) - : null, + ), + child: Padding( + padding: const EdgeInsets.all(2.5), + child: ClipRRect( + borderRadius: BorderRadius.only( + topRight: isGlassTheme + ? const Radius.circular(11.5) + : const Radius.circular(7.75), + bottomRight: isGlassTheme + ? const Radius.circular(11.5) + : const Radius.circular(7.75), + ), + child: RotatedBox( + quarterTurns: 3, + child: LinearProgressIndicator( + minHeight: 15, + color: effectiveStatusColor, + value: progress, + backgroundColor: isGlassTheme + ? effectiveStatusColor.withValues(alpha: 0.1) + : null, + ), ), ), ), - ), - ); - }), + ); + }), + ), ), - ), - ], + ], + ), ), ); } + Future _fetchLayer2D( + StatusProvider provider, StatusModel? status) async { + if (status == null) return; + final fileData = status.printData?.fileData; + int? plateId; + final layerIndex = status.layer; + if (layerIndex == null) return; + + try { + if (fileData != null) { + final meta = await BackendService().getFileMetadata( + fileData.locationCategory ?? 'Local', fileData.path); + if (meta['plate_id'] != null) { + plateId = meta['plate_id'] as int?; + } + } + } catch (_) { + plateId = widget.initialPlateId; + } + if (plateId == null) return; + + final cached = LayerPreviewCache.instance.get(plateId, layerIndex); + if (cached != null) { + setState(() { + _layer2DBytes = cached; + _layer2DImageProvider = MemoryImage(cached); + _showLayer2D = true; + }); + LayerPreviewCache.instance + .preload(BackendService(), plateId, layerIndex, count: 2); + return; + } + + setState(() { + _layer2DLoading = true; + }); + try { + final bytes = await LayerPreviewCache.instance + .fetchAndCache(BackendService(), plateId, layerIndex); + if (bytes.isNotEmpty) { + final imgProv = MemoryImage(bytes); + // Start precaching but don't await it — decoding can be expensive + // and awaiting here can cause UI jank. Fire-and-forget instead. + precacheImage(imgProv, context).catchError((_) {}); + setState(() { + _layer2DBytes = bytes; + _layer2DImageProvider = imgProv; + _showLayer2D = true; + }); + LayerPreviewCache.instance + .preload(BackendService(), plateId, layerIndex, count: 2); + } + } catch (_) { + // ignore + } finally { + setState(() { + _layer2DLoading = false; + }); + } + } + + Future _prefetchThumbnails(StatusModel status) async { + // Prefetch the 3D thumbnail for the current file (Large) and the + // current 2D layer (and preload next layers). Best-effort; ignore + // any failures. + try { + final fileData = status.printData?.fileData; + if (fileData != null) { + // Prefetch 3D thumbnail (Large size) — fetch bytes and precache so + // Flutter's image cache holds a decoded image for instant display. + BackendService() + .getFileThumbnail( + fileData.locationCategory ?? 'Local', fileData.path, 'Large') + .then((bytes) async { + try { + if (bytes.isNotEmpty) { + await precacheImage(MemoryImage(bytes), context); + } + } catch (_) { + // ignore precache failures + } + }, onError: (_) {}); + } + } catch (_) { + // ignore + } + + // Prefetch current layer via LayerPreviewCache.fetchAndCache and + // then preload n+1/n+2 layers. + try { + final layerIndex = status.layer; + if (layerIndex == null) return; + + int? plateId; + try { + final fileData = status.printData?.fileData; + if (fileData != null) { + final meta = await BackendService().getFileMetadata( + fileData.locationCategory ?? 'Local', fileData.path); + if (meta['plate_id'] != null) { + plateId = meta['plate_id'] as int?; + } + } + } catch (_) { + plateId = widget.initialPlateId; + } + if (plateId == null) return; + + // Use fetchAndCache to dedupe concurrent fetches. + try { + final bytes = await LayerPreviewCache.instance + .fetchAndCache(BackendService(), plateId, layerIndex); + if (bytes.isNotEmpty) { + // If user already enabled 2D preview, immediately display the + // prefetched current layer so the preview reflects the active + // layer without requiring a manual toggle. + if (mounted && _showLayer2D) { + if (!(_layer2DBytes != null && + _bytesEqual(_layer2DBytes!, bytes))) { + setState(() { + _layer2DBytes = bytes; + _layer2DImageProvider = MemoryImage(bytes); + }); + } + } + // Fire off preloads for the next two layers in parallel; do not + // await to avoid blocking the UI thread. + for (int i = 1; i <= 2; i++) { + final target = layerIndex + i; + LayerPreviewCache.instance + .fetchAndCache(BackendService(), plateId, target) + .then((nextBytes) { + if (nextBytes.isNotEmpty) { + precacheImage(MemoryImage(nextBytes), context) + .catchError((_) {}); + } + }).catchError((_) {}); + } + } + } catch (_) { + // ignore + } + } catch (_) { + // ignore + } + } + + Future _maybePreloadNextLayers(StatusModel status) async { + final layerIndex = status.layer; + if (layerIndex == null) return; + + // Resolve plate id if not already resolved for current file path. + int? plateId = _resolvedPlateIdForPrefetch; + if (plateId == null) { + try { + final fileData = status.printData?.fileData; + if (fileData != null) { + final meta = await BackendService().getFileMetadata( + fileData.locationCategory ?? 'Local', fileData.path); + if (meta['plate_id'] != null) { + plateId = meta['plate_id'] as int?; + _resolvedPlateIdForPrefetch = plateId; + } + } + } catch (_) { + plateId = widget.initialPlateId; + _resolvedPlateIdForPrefetch = plateId; + } + } + if (plateId == null) return; + + try { + // Ensure current layer is cached (deduped) then fetch+precache next two. + // Fetch current layer (deduped) but don't block on any decoding. + LayerPreviewCache.instance + .fetchAndCache(BackendService(), plateId, layerIndex) + .then((curBytes) { + if (curBytes.isNotEmpty) { + // Precache decoded image for faster rendering (fire-and-forget). + precacheImage(MemoryImage(curBytes), context).catchError((_) {}); + // If the user currently has the 2D preview visible, immediately + // update the displayed image so the preview follows the layer. + if (mounted && _showLayer2D) { + // Avoid re-setting if the bytes are identical. + if (!(_layer2DBytes != null && + _bytesEqual(_layer2DBytes!, curBytes))) { + setState(() { + _layer2DBytes = curBytes; + _layer2DImageProvider = MemoryImage(curBytes); + }); + } + } + } + }).catchError((_) {}); + + // Launch preloads for the next two layers in parallel. + for (int i = 1; i <= 2; i++) { + final target = layerIndex + i; + LayerPreviewCache.instance + .fetchAndCache(BackendService(), plateId, target) + .then((nextBytes) { + if (nextBytes.isNotEmpty) { + precacheImage(MemoryImage(nextBytes), context).catchError((_) {}); + } + }).catchError((_) {}); + } + _lastPrefetchedLayer = layerIndex; + } catch (_) { + // ignore + } + } + Widget _buildButtons(StatusProvider provider, StatusModel? status) { final s = status; final isFinished = s != null && s.isIdle && s.layer != null; @@ -619,9 +953,14 @@ class StatusScreenState extends State { // * Active print (to allow pause/resume) // * Finished print (return home) // * Canceled print (return home) - // Disabled only when status not yet loaded or during cancel transition. - final pauseResumeEnabled = s != null && (!provider.isCanceling); + // Disabled when status not yet loaded, during cancel transition, or + // while a pause is latched (provider.isPausing) and we're not already + // in the paused state (i.e., disable the Pause action while it's + // latched). Resume should still be enabled when paused. final isPaused = s?.isPaused ?? false; + final pauseResumeEnabled = s != null && + !provider.isCanceling && + !(provider.isPausing && !isPaused); return Row(children: [ Expanded( From f55af3edb8487c63fd1ab711a9c4722e44fa809d Mon Sep 17 00:00:00 2001 From: PaulGD03 Date: Mon, 13 Oct 2025 23:01:45 +0200 Subject: [PATCH 15/44] feat(main): add NotificationProvider and NotificationWatcher for improved notification handling --- lib/main.dart | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/lib/main.dart b/lib/main.dart index 9da7266..ffea4a1 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -38,23 +38,26 @@ import 'package:orion/l10n/generated/app_localizations.dart'; import 'package:orion/settings/about_screen.dart'; import 'package:orion/settings/settings_screen.dart'; import 'package:orion/status/status_screen.dart'; +import 'package:orion/materials/materials_screen.dart'; import 'package:orion/backend_service/providers/status_provider.dart'; import 'package:orion/backend_service/providers/files_provider.dart'; import 'package:orion/backend_service/providers/config_provider.dart'; import 'package:orion/backend_service/providers/print_provider.dart'; +import 'package:orion/backend_service/providers/notification_provider.dart'; import 'package:orion/backend_service/providers/manual_provider.dart'; import 'package:orion/tools/tools_screen.dart'; import 'package:orion/util/error_handling/error_handler.dart'; import 'package:orion/util/providers/locale_provider.dart'; import 'package:orion/util/providers/theme_provider.dart'; import 'package:orion/util/error_handling/connection_error_watcher.dart'; +import 'package:orion/util/error_handling/notification_watcher.dart'; void main() { WidgetsFlutterBinding.ensureInitialized(); if (Platform.isLinux || Platform.isMacOS || Platform.isWindows) { setWindowTitle('Orion - Open Resin Alliance'); - setWindowMinSize(const Size(480, 480)); + setWindowMinSize(const Size(480, 480 + 28)); // account for title bar if (kDebugMode) { setWindowMaxSize(const Size(800, 800)); } @@ -144,6 +147,10 @@ class OrionRoot extends StatelessWidget { create: (_) => StatusProvider(), lazy: false, ), + ChangeNotifierProvider( + create: (_) => NotificationProvider(), + lazy: true, + ), ChangeNotifierProvider( create: (_) => ConfigProvider(), lazy: false, @@ -176,6 +183,7 @@ class OrionMainApp extends StatefulWidget { class OrionMainAppState extends State { late final GoRouter _router; ConnectionErrorWatcher? _connWatcher; + NotificationWatcher? _notifWatcher; final GlobalKey _navKey = GlobalKey(); bool _statusListenerAttached = false; bool _wasPrinting = false; @@ -191,6 +199,7 @@ class OrionMainAppState extends State { @override void dispose() { _connWatcher?.dispose(); + _notifWatcher?.dispose(); super.dispose(); } @@ -224,6 +233,12 @@ class OrionMainAppState extends State { return const GridFilesScreen(); }, ), + GoRoute( + path: 'materials', + builder: (BuildContext context, GoRouterState state) { + return const MaterialsScreen(); + }, + ), GoRoute( path: 'settings', builder: (BuildContext context, GoRouterState state) { @@ -288,6 +303,9 @@ class OrionMainAppState extends State { if (_connWatcher == null && navCtx != null) { _connWatcher = ConnectionErrorWatcher.install(navCtx); } + if (_notifWatcher == null && navCtx != null) { + _notifWatcher = NotificationWatcher.install(navCtx); + } // Attach a listener to StatusProvider so we can auto-open // the StatusScreen when a print becomes active (remote start). try { From 0d71fd12b7f7c82200e8eab0b628abd5a7d3e2be Mon Sep 17 00:00:00 2001 From: PaulGD03 Date: Mon, 13 Oct 2025 23:02:07 +0200 Subject: [PATCH 16/44] feat(tests): add fake Odyssey client implementations and thumbnail cache clear tests --- test/fakes/fake_odyssey_client.dart | 35 +++++++++ ...ake_odyssey_client_for_thumbnail_test.dart | 35 +++++++++ test/thumbnail_cache_clear_test.dart | 75 +++++++++++++++++++ test/widget_test.dart | 35 +++++++-- 4 files changed, 173 insertions(+), 7 deletions(-) create mode 100644 test/thumbnail_cache_clear_test.dart diff --git a/test/fakes/fake_odyssey_client.dart b/test/fakes/fake_odyssey_client.dart index 96be54f..1661418 100644 --- a/test/fakes/fake_odyssey_client.dart +++ b/test/fakes/fake_odyssey_client.dart @@ -1,3 +1,20 @@ +/* +* Orion - Fake Odyssey Client +* Copyright (C) 2025 Open Resin Alliance +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + import 'dart:typed_data'; import 'dart:async'; @@ -131,4 +148,22 @@ class FakeOdysseyClient implements OdysseyClient { Future getBackendVersion() { return Future.value('0.0.0'); } + + @override + Future>> getNotifications() async { + return >[]; + } + + @override + Future disableNotification(int timestamp) async { + // no-op fake for tests + return; + } + + @override + Future getPlateLayerImage(int plateId, int layer) async { + // Tests that use this fake generally don't fetch real plate layers. + // Return empty bytes which callers should handle as placeholder. + return Uint8List(0); + } } diff --git a/test/fakes/fake_odyssey_client_for_thumbnail_test.dart b/test/fakes/fake_odyssey_client_for_thumbnail_test.dart index af973fb..fcdf4c5 100644 --- a/test/fakes/fake_odyssey_client_for_thumbnail_test.dart +++ b/test/fakes/fake_odyssey_client_for_thumbnail_test.dart @@ -1,3 +1,20 @@ +/* +* Orion - Fake Odyssey Client for Thumbnail Test +* Copyright (C) 2025 Open Resin Alliance +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + import 'dart:async'; import 'dart:typed_data'; @@ -13,6 +30,13 @@ class FakeOdysseyClientForThumbnailTest implements OdysseyClient { return bytes; } + @override + Future getPlateLayerImage(int plateId, int layer) async { + // For thumbnail tests, just return the supplied bytes as a stand-in + // for a plate layer image. + return bytes; + } + // Minimal implementations for the rest of the interface used to satisfy // the abstract class. They should not be called by the thumbnail test. @override @@ -131,4 +155,15 @@ class FakeOdysseyClientForThumbnailTest implements OdysseyClient { Future getBackendVersion() { throw UnimplementedError(); } + + @override + Future>> getNotifications() async { + return >[]; + } + + @override + Future disableNotification(int timestamp) async { + // no-op for this fake + return; + } } diff --git a/test/thumbnail_cache_clear_test.dart b/test/thumbnail_cache_clear_test.dart new file mode 100644 index 0000000..ee7a167 --- /dev/null +++ b/test/thumbnail_cache_clear_test.dart @@ -0,0 +1,75 @@ +/* +* Orion - Thumbnail Cache Clear Test +* Copyright (C) 2025 Open Resin Alliance +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +import 'dart:io'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:orion/util/thumbnail_cache.dart'; +import 'package:path/path.dart' as p; + +Directory _expectedDiskCacheDir() { + if (Platform.isLinux) { + final xdg = Platform.environment['XDG_CACHE_HOME'] ?? + (Platform.environment['HOME'] != null + ? p.join(Platform.environment['HOME']!, '.cache') + : null); + if (xdg != null && xdg.isNotEmpty) { + return Directory(p.join(xdg, 'orion_thumbnail_cache')); + } else { + return Directory( + p.join(Directory.systemTemp.path, 'orion_thumbnail_cache')); + } + } else if (Platform.isMacOS) { + final home = Platform.environment['HOME'] ?? '.'; + return Directory( + p.join(home, 'Library', 'Caches', 'orion_thumbnail_cache')); + } else if (Platform.isWindows) { + final local = Platform.environment['LOCALAPPDATA'] ?? + Platform.environment['USERPROFILE'] ?? + '.'; + return Directory(p.join(local, 'orion_thumbnail_cache')); + } else { + return Directory( + p.join(Directory.systemTemp.path, 'orion_thumbnail_cache')); + } +} + +void main() { + test('clearDisk removes files in disk cache directory', () async { + final dir = _expectedDiskCacheDir(); + if (!await dir.exists()) await dir.create(recursive: true); + + final testFile = File(p.join(dir.path, 'thumbnail_cache_clear_test.tmp')); + await testFile.writeAsString('dummy'); + expect(await testFile.exists(), isTrue, + reason: 'test file should exist before clearDisk'); + + // Now call clearDisk and expect the file to be removed (best-effort). + await ThumbnailCache.instance.clearDisk(); + + // Allow for potential async deletion scheduling; check that file no longer exists + // or that the directory may have been cleaned. + final existsAfter = await testFile.exists(); + expect(existsAfter, isFalse, + reason: + 'clearDisk should remove cache files created under the thumbnail disk cache dir'); + }); + + test('clear() runs without error (memory clear)', () async { + // This test simply ensures the in-memory clear does not throw. + ThumbnailCache.instance.clear(); + }); +} diff --git a/test/widget_test.dart b/test/widget_test.dart index 2af071b..0ea4b57 100644 --- a/test/widget_test.dart +++ b/test/widget_test.dart @@ -1,19 +1,40 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility in the flutter_test package. For example, you can send tap and scroll -// gestures. You can also use WidgetTester to find child widgets in the widget -// tree, read text, and verify that the values of widget properties are correct. +/* +* Orion - Widget Test +* Copyright (C) 2025 Open Resin Alliance +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:orion/main.dart'; +import 'package:provider/provider.dart'; +import 'package:orion/util/providers/locale_provider.dart'; +import 'package:orion/util/providers/theme_provider.dart'; void main() { testWidgets('Counter increments smoke test', (WidgetTester tester) async { // Build our app and trigger a frame. - await tester.pumpWidget(const OrionMainApp()); + await tester.pumpWidget( + MultiProvider( + providers: [ + ChangeNotifierProvider(create: (_) => LocaleProvider()), + ChangeNotifierProvider(create: (_) => ThemeProvider()), + ], + child: const OrionMainApp(), + ), + ); // Verify that our counter starts at 0. expect(find.text('0'), findsOneWidget); From 388264d9a70e4d41d365274898c260856a5695a2 Mon Sep 17 00:00:00 2001 From: PaulGD03 Date: Tue, 14 Oct 2025 12:43:39 +0200 Subject: [PATCH 17/44] dev(backend_service: nanodlp): add NanoDlpSimulatedClient for local development Add a NanoDlpSimulatedClient implementing OdysseyClient to simulate a NanoDLP backend. --- lib/backend_service/backend_service.dart | 11 +- .../nanodlp/nanodlp_simulated_client.dart | 251 ++++++++++++++++++ 2 files changed, 258 insertions(+), 4 deletions(-) create mode 100644 lib/backend_service/nanodlp/nanodlp_simulated_client.dart diff --git a/lib/backend_service/backend_service.dart b/lib/backend_service/backend_service.dart index 148820b..cd3f089 100644 --- a/lib/backend_service/backend_service.dart +++ b/lib/backend_service/backend_service.dart @@ -19,6 +19,7 @@ import 'dart:typed_data'; import 'package:orion/backend_service/odyssey/odyssey_client.dart'; import 'package:orion/backend_service/odyssey/odyssey_http_client.dart'; import 'package:orion/backend_service/nanodlp/nanodlp_http_client.dart'; +import 'package:orion/backend_service/nanodlp/nanodlp_simulated_client.dart'; import 'package:orion/util/orion_config.dart'; /// BackendService is a small façade that selects a concrete @@ -36,11 +37,13 @@ class BackendService implements OdysseyClient { static OdysseyClient _chooseFromConfig() { try { final cfg = OrionConfig(); - final backend = cfg.getString('backend', category: 'advanced'); - if (backend == 'nanodlp') { + // Developer-mode simulated backend flag (developer.simulated = true) + final simulated = cfg.getFlag('simulated', category: 'developer'); + if (simulated) { + return NanoDlpSimulatedClient(); + } + if (cfg.isNanoDlpMode()) { // Return the NanoDLP adapter when explicitly requested in config. - // Add a small log to aid debugging in cases where config isn't applied. - // Note: avoid bringing logging package into this file if not used return NanoDlpHttpClient(); } } catch (_) { diff --git a/lib/backend_service/nanodlp/nanodlp_simulated_client.dart b/lib/backend_service/nanodlp/nanodlp_simulated_client.dart new file mode 100644 index 0000000..4b24389 --- /dev/null +++ b/lib/backend_service/nanodlp/nanodlp_simulated_client.dart @@ -0,0 +1,251 @@ +/* +* Orion - NanoDLP Simulated Client +* Provides a simple in-memory simulated NanoDLP backend for development +* without a physical printer. Behavior is intentionally simple: it +* simulates a print job advancing layers over time and responds to +* control commands (start/pause/resume/cancel). This implementation +* implements the OdysseyClient interface used by the app. +*/ + +import 'dart:async'; +import 'dart:typed_data'; +import 'dart:math' as math; + +import 'package:orion/backend_service/odyssey/odyssey_client.dart'; +import 'package:orion/backend_service/nanodlp/nanodlp_thumbnail_generator.dart'; +import 'package:orion/backend_service/nanodlp/models/nano_status.dart'; +import 'package:orion/backend_service/nanodlp/nanodlp_mappers.dart'; + +class NanoDlpSimulatedClient implements OdysseyClient { + // Simulated job state + bool _printing = false; + bool _paused = false; + bool _cancelLatched = false; + int _currentLayer = 0; + int _totalLayers = 200; + + // Status stream + final StreamController> _statusController = + StreamController.broadcast(); + Timer? _tickTimer; + + NanoDlpSimulatedClient() { + // start periodic tick to update status stream + _tickTimer = Timer.periodic(Duration(seconds: 1), (_) => _tick()); + } + + void _tick() { + if (_printing && !_paused && !_cancelLatched) { + _currentLayer = math.min(_totalLayers, _currentLayer + 1); + if (_currentLayer >= _totalLayers) { + // job finished + _printing = false; + } + } + + final nanoJson = _makeStatusMap(); + try { + final ns = NanoStatus.fromJson(Map.from(nanoJson)); + final odyssey = nanoStatusToOdysseyMap(ns); + if (!_statusController.isClosed) _statusController.add(odyssey); + } catch (_) { + // Fallback: emit the raw nano map if mapping fails + if (!_statusController.isClosed) _statusController.add(nanoJson); + } + } + + Map _makeStatusMap() { + return { + 'Printing': _printing, + 'Paused': _paused, + 'State': _printing ? 5 : 0, + 'LayerID': _printing ? _currentLayer : null, + 'LayersCount': _totalLayers, + 'Status': _printing ? 'Printing' : 'Idle', + // Minimal file metadata when a job is active + if (_printing) + 'file': { + 'name': 'simulated_print.gcode', + 'path': '/sim/simulated_print.gcode', + 'layer_count': _totalLayers, + } + }; + } + + @override + Future cancelPrint() async { + if (!_printing) return; + _cancelLatched = true; + // simulate immediate stop + _printing = false; + _paused = false; + _currentLayer = 0; + _statusController.add(_makeStatusMap()); + } + + @override + Future pausePrint() async { + if (!_printing || _paused) return; + _paused = true; + _statusController.add(_makeStatusMap()); + } + + @override + Future resumePrint() async { + if (!_printing || !_paused) return; + _paused = false; + _statusController.add(_makeStatusMap()); + } + + @override + Future> deleteFile( + String location, String filePath) async { + return {'deleted': true}; + } + + @override + Future> displayTest(String test) async { + return {'ok': true}; + } + + @override + Future startPrint(String location, String filePath) async { + _printing = true; + _paused = false; + _cancelLatched = false; + _currentLayer = 0; + _statusController.add(_makeStatusMap()); + } + + @override + Future> getConfig() async { + return { + 'general': {'hostname': 'sim-nanodlp'}, + 'advanced': {'backend': 'nanodlp'} + }; + } + + @override + Future getBackendVersion() async => 'NanoDLP-sim-1.0'; + + @override + Future getFileThumbnail( + String location, String filePath, String size) async { + final dims = _parseSize(size); + return NanoDlpThumbnailGenerator.generatePlaceholder(dims[0], dims[1]); + } + + List _parseSize(String size) { + // expected like 'thumb' or 'large' - default to large + if (size == 'thumb') return [160, 96]; + return [ + NanoDlpThumbnailGenerator.largeWidth, + NanoDlpThumbnailGenerator.largeHeight + ]; + } + + @override + Future> getFileMetadata( + String location, String filePath) async { + return { + 'file_data': { + 'path': filePath, + 'name': filePath.split('/').last, + 'last_modified': DateTime.now().millisecondsSinceEpoch, + 'parent_path': '/sim' + } + }; + } + + @override + Future> listItems( + String location, int pageSize, int pageIndex, String subdirectory) async { + // Return a small simulated file list for Local location. + final files = List.generate(5, (i) { + return { + 'name': 'sim_model_${i + 1}.stl', + 'path': '/sim/sim_model_${i + 1}.stl', + 'last_modified': DateTime.now().millisecondsSinceEpoch - i * 1000, + }; + }); + return { + 'files': files, + 'dirs': >[], + 'page_index': pageIndex, + 'page_size': pageSize, + }; + } + + @override + Future disableNotification(int timestamp) async { + // no-op for simulated backend + return; + } + + @override + Future>> getNotifications() async => []; + + @override + Future> getStatus() async { + final nanoJson = _makeStatusMap(); + final ns = NanoStatus.fromJson(Map.from(nanoJson)); + return nanoStatusToOdysseyMap(ns); + } + + @override + Stream> getStatusStream() => _statusController.stream; + + @override + Future usbAvailable() async => false; + + @override + Future> manualCommand(String command) async => + {'ok': true}; + + @override + Future> manualCure(bool cure) async => {'ok': true}; + + @override + Future> manualHome() async => {'ok': true}; + + @override + Future> move(double height) async => {'ok': true}; + + @override + Future> moveDelta(double deltaMm) async => {'ok': true}; + + @override + Future canMoveToFloor() async => false; + + @override + Future canMoveToTop() async => false; + + @override + Future> moveToFloor() async => {'ok': true}; + + @override + Future> moveToTop() async => {'ok': true}; + + @override + Future> emergencyStop() async { + _printing = false; + _paused = false; + _statusController.add(_makeStatusMap()); + return {'stopped': true}; + } + + @override + Future getPlateLayerImage(int plateId, int layer) async { + // Generate a simple placeholder image for the requested layer. + // We'll encode a tiny image with a band indicating the layer number. + final bytes = NanoDlpThumbnailGenerator.resizeLayer2D(Uint8List.fromList([ + // empty source triggers placeholder + ])); + return bytes; + } + + void dispose() { + _tickTimer?.cancel(); + _statusController.close(); + } +} From 096abdc407ced26cadab87a6c811cb26566d16cd Mon Sep 17 00:00:00 2001 From: PaulGD03 Date: Tue, 14 Oct 2025 17:27:47 +0200 Subject: [PATCH 18/44] feat(scripts/install_orion_athena2): add thumbnail-cache clearing and CLI helper - Add --clear-thumbnails / --clear-thumbnail-cache installer option - Install clear_orion_thumbnails helper to /usr/local/bin for manual cache clears - Add clear_thumbnail_cache_for_user() to remove both $HOME/.cache/orion_thumbnail_cache and XDG_CACHE_HOME/.../orion_thumbnail_cache - Preserve vendor/config files on "reinstall_keep" and auto-clear cache on full "reinstall" - Extend existing install/uninstall menu with Reinstall (keep), Thumbnail-clear choice, and updated prompts --- scripts/install_orion_athena2.sh | 118 +++++++++++++++++++++++++++++-- 1 file changed, 111 insertions(+), 7 deletions(-) diff --git a/scripts/install_orion_athena2.sh b/scripts/install_orion_athena2.sh index c96bb2e..64be96e 100644 --- a/scripts/install_orion_athena2.sh +++ b/scripts/install_orion_athena2.sh @@ -12,6 +12,7 @@ set -euo pipefail tmp_tar="" tmp_dir="" +CLEAR_THUMBNAILS=0 cleanup() { if [[ -n "$tmp_tar" && -f "$tmp_tar" ]]; then @@ -33,6 +34,8 @@ uninstall_orion() { local enable_nano=1 if [[ $mode == "reinstall" ]]; then enable_nano=0 + elif [[ $mode == "reinstall_keep" ]]; then + enable_nano=0 fi printf '\n[%s] Removing existing Orion installation...\n' "$SCRIPT_NAME" @@ -71,15 +74,23 @@ uninstall_orion() { rm -rf "$ORION_DIR" rm -f "$DEST_DSI" - if [[ -f "$CONFIG_PATH" ]]; then - rm -f "$CONFIG_PATH" - fi - if [[ -f "$VENDOR_CONFIG_PATH" ]]; then - rm -f "$VENDOR_CONFIG_PATH" + # Delete configs only for full override reinstall or manual uninstall + if [[ $mode != "reinstall_keep" ]]; then + if [[ -f "$CONFIG_PATH" ]]; then + rm -f "$CONFIG_PATH" + fi + if [[ -f "$VENDOR_CONFIG_PATH" ]]; then + rm -f "$VENDOR_CONFIG_PATH" + fi fi rm -f "$ACTIVATE_PATH" "$REVERT_PATH" + # Clear thumbnail cache automatically on full override reinstall + if [[ $mode == "reinstall" ]]; then + clear_thumbnail_cache_for_user "$ORIGINAL_USER" + fi + if [[ $mode != "reinstall" ]]; then printf '\n[%s] Orion has been removed from this system.\n' "$SCRIPT_NAME" else @@ -101,6 +112,15 @@ require_root() { main() { require_root "$@" + # Parse CLI options (e.g., --clear-thumbnails) + for arg in "$@"; do + case "$arg" in + --clear-thumbnails|--clear-thumbnail-cache) + CLEAR_THUMBNAILS=1 + ;; + esac + done + ORIGINAL_USER=${SUDO_USER:-} if [[ -z "$ORIGINAL_USER" || "$ORIGINAL_USER" == "root" ]]; then printf '\n[%s] Unable to determine invoking non-root user. Please run with sudo from the target account.\n' "$SCRIPT_NAME" >&2 @@ -134,11 +154,14 @@ main() { BIN_DIR="/usr/local/bin" ACTIVATE_PATH="${BIN_DIR}/activate_orion" REVERT_PATH="${BIN_DIR}/revert_orion" + CLEAR_THUMBS_PATH="${BIN_DIR}/clear_orion_thumbnails" printf '\nTemporary Orion installer for Athena 2\n========================================\n' printf ' - Target user : %s\n' "$ORIGINAL_USER" printf ' - Target home : %s\n' "$TARGET_HOME" printf ' - Orion source : %s\n\n' "$ORION_URL" + printf 'Options:\n' + printf ' --clear-thumbnails Clear Orion thumbnail disk cache for the target user during install.\n\n' read -r -p "Continue with installation? [y/N] " reply reply=${reply:-N} @@ -155,13 +178,23 @@ main() { if [[ $existing == true ]]; then printf '\n[%s] Existing Orion installation detected.\n' "$SCRIPT_NAME" while true; do - read -r -p "Choose: [O]verride & reinstall / [U]ninstall / [C]ancel: " choice + read -r -p "Choose: [O]verride & reinstall (clears cache & configs) / [R]einstall (keep cache & configs) / [T]humbnail cache clear / [U]ninstall / [C]ancel: " choice choice=${choice:-C} case "$choice" in [Oo]) uninstall_orion reinstall break ;; + [Rr]) + uninstall_orion reinstall_keep + break + ;; + [Tt]) + printf '\n[%s] Clearing thumbnail cache for %s...\n' "$SCRIPT_NAME" "$ORIGINAL_USER" + clear_thumbnail_cache_for_user "$ORIGINAL_USER" + printf '[%s] Thumbnail cache cleared.\n' "$SCRIPT_NAME" + exit 0 + ;; [Uu]) uninstall_orion manual exit 0 @@ -171,7 +204,7 @@ main() { exit 0 ;; *) - printf ' Invalid selection. Please choose O, U, or C.\n' + printf ' Invalid selection. Please choose O, R, T, U, or C.\n' ;; esac done @@ -369,10 +402,81 @@ systemctl start nanodlp-dsi.service EOF chmod 0755 "$REVERT_PATH" + # Install helper to clear thumbnail cache for the Orion user + printf '\n[%s] Installing helper command: %s...\n' "$SCRIPT_NAME" "$CLEAR_THUMBS_PATH" + cat >"$CLEAR_THUMBS_PATH" <<'EOF' +#!/usr/bin/env bash +set -euo pipefail + +if [[ $EUID -ne 0 ]]; then + if command -v sudo >/dev/null 2>&1; then + exec sudo -E "$0" "$@" + else + echo "clear_orion_thumbnails must be run as root or via sudo" >&2 + exit 1 + fi +fi + +# Determine target non-root user +TARGET_USER=${SUDO_USER:-${USER}} +if [[ -z "${TARGET_USER}" || "${TARGET_USER}" == "root" ]]; then + echo "Unable to determine non-root target user." >&2 + exit 1 +fi + +TARGET_HOME=$(eval echo "~${TARGET_USER}") +if [[ ! -d "${TARGET_HOME}" ]]; then + echo "Home directory for ${TARGET_USER} not found at ${TARGET_HOME}" >&2 + exit 1 +fi + +# Default Linux cache dir used by the app: $HOME/.cache/orion_thumbnail_cache +CACHE_DIR="${TARGET_HOME}/.cache/orion_thumbnail_cache" + +echo "Clearing Orion thumbnail cache at ${CACHE_DIR} (user: ${TARGET_USER})..." +rm -rf -- "${CACHE_DIR}" || true +echo "Done." +EOF + chmod 0755 "$CLEAR_THUMBS_PATH" + + # If requested via CLI option, clear thumbnail cache now for target user + if [[ "$CLEAR_THUMBNAILS" -eq 1 ]]; then + printf '\n[%s] Clearing thumbnail cache for %s...\n' "$SCRIPT_NAME" "$ORIGINAL_USER" + clear_thumbnail_cache_for_user "$ORIGINAL_USER" + fi + printf '\nInstallation complete!\n' printf ' Default config written to %s.\n' "$CONFIG_PATH" printf ' Use "activate_orion" to launch Orion and "revert_orion" to restore NanoDLP.\n' + printf ' Use "clear_orion_thumbnails" to clear the thumbnail disk cache.\n' systemctl status orion.service --no-pager } +# Helper: clear thumbnail disk cache for a given user name +clear_thumbnail_cache_for_user() { + local user_name="$1" + local home_dir + home_dir=$(eval echo "~${user_name}") + if [[ -z "$home_dir" || ! -d "$home_dir" ]]; then + printf '[%s] Cannot resolve home for user %s; skipping cache clear.\n' "$SCRIPT_NAME" "$user_name" >&2 + return 0 + fi + + # Default Linux cache dir + local cache_dir_default="${home_dir}/.cache/orion_thumbnail_cache" + # If XDG_CACHE_HOME is defined for the environment, also clear that path + local xdg_cache_home="${XDG_CACHE_HOME:-}" + local cache_dir_xdg="" + if [[ -n "$xdg_cache_home" ]]; then + cache_dir_xdg="${xdg_cache_home%/}/orion_thumbnail_cache" + fi + + printf '[%s] Clearing thumbnail cache at %s\n' "$SCRIPT_NAME" "$cache_dir_default" + rm -rf -- "$cache_dir_default" || true + if [[ -n "$cache_dir_xdg" ]]; then + printf '[%s] Clearing thumbnail cache at %s\n' "$SCRIPT_NAME" "$cache_dir_xdg" + rm -rf -- "$cache_dir_xdg" || true + fi +} + main "$@" \ No newline at end of file From c1caf1c591c8fbb1cc5cf50100febadce655fb2d Mon Sep 17 00:00:00 2001 From: PaulGD03 Date: Wed, 15 Oct 2025 00:23:55 +0200 Subject: [PATCH 19/44] refactor(glasser): simplify GlassPlatformConfig logic and tighten docs - Shorten and clarify doc comments. - Collapse redundant platform-specific branches and simplify conditionals. - Make shouldBlur default to skipping blur for interactive surfaces (can be forced on), and remove extra early returns/whitespace. - Minor formatting cleanup across helper methods. --- lib/glasser/src/platform_config.dart | 77 ++++++---------------------- 1 file changed, 15 insertions(+), 62 deletions(-) diff --git a/lib/glasser/src/platform_config.dart b/lib/glasser/src/platform_config.dart index 8f3c8b2..4a19ad7 100644 --- a/lib/glasser/src/platform_config.dart +++ b/lib/glasser/src/platform_config.dart @@ -18,62 +18,33 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; -/// Provides adaptive configuration knobs for the glass widgets so that -/// expensive visual effects can be tuned per platform. The Linux desktop -/// renderer in particular struggles with multiple backdrop filters, so we -/// dampen the blur radius while slightly boosting opacity to preserve the -/// perceived look. +/// Platform-adaptive configuration for glass widgets. class GlassPlatformConfig { const GlassPlatformConfig._(); - /// Returns true when we are running on Flutter's Linux desktop target. static bool get isLinuxDesktop => !kIsWeb && defaultTargetPlatform == TargetPlatform.linux; - /// Determines whether applying a live blur is acceptable for the current - /// surface. Small interactive elements on Linux tend to look fine without a - /// full backdrop blur and skipping it saves a costly render pass. - static bool shouldBlur({ - bool interactiveSurface = false, - bool force = false, - }) { - if (force) { - return true; - } - - if (!isLinuxDesktop) { - return true; - } - - // Prioritise blur for larger structural surfaces like dialogs/cards, but - // skip it for small interactive controls by default. - if (interactiveSurface) { - return false; - } - - return true; + /// Whether to apply a backdrop blur for this surface. + /// Small interactive controls (interactiveSurface=true) skip blur by + /// default to improve performance; pass [force] to override. + static bool shouldBlur( + {bool interactiveSurface = false, bool force = false}) { + if (force) return true; + return !interactiveSurface; } - /// Returns a platform-tuned blur sigma. + /// Platform-tuned blur sigma. static double blurSigma(double base) { - if (!isLinuxDesktop) { - return base; - } - - // Linux performs significantly better with a lower sigma. Adding a small - // constant keeps the blur from looking too sharp on large surfaces. + if (!isLinuxDesktop) return base; final adjusted = (base * 0.65) + 1.5; return adjusted.clamp(0.0, base).toDouble(); } - /// Normalises surface opacity for translucent fills. On Linux we boost the - /// opacity slightly to compensate for the reduced blur strength while trying - /// to maintain the darker glass aesthetic. + /// Surface opacity normalization. Slightly boosts opacity for better + /// readability; [emphasize] increases the boost. static double surfaceOpacity(double base, {bool emphasize = false}) { final reducedBase = (base - 0.02).clamp(0.0, 1.0); - - if (!isLinuxDesktop) return reducedBase; - final boost = emphasize ? 0.06 : 0.04; final maxOpacity = emphasize ? 0.28 : 0.22; final targetCap = (reducedBase + boost).clamp(0.0, maxOpacity); @@ -81,20 +52,15 @@ class GlassPlatformConfig { return adjusted > targetCap ? targetCap : adjusted; } - /// Adjusts border opacity so that edge highlights remain visible when we - /// increase the surface opacity on Linux. + /// Border opacity adjustment so edge highlights remain visible with + /// increased surface opacity. static double borderOpacity(double base, {bool emphasize = false}) { - if (!isLinuxDesktop) { - return base; - } - final boost = emphasize ? 0.07 : 0.05; final maxOpacity = emphasize ? 0.38 : 0.3; final adjusted = base + boost; return adjusted > maxOpacity ? maxOpacity : adjusted; } - /// Returns a shadow list suitable for surface elements such as cards. static List surfaceShadow({ double blurRadius = 15.0, double yOffset = 4.0, @@ -109,7 +75,6 @@ class GlassPlatformConfig { ), ]; } - return [ BoxShadow( color: Colors.black.withValues(alpha: alpha), @@ -119,17 +84,13 @@ class GlassPlatformConfig { ]; } - /// Returns shadow settings for elevated interactive elements (FABs, buttons). static List? interactiveShadow({ bool enabled = true, double blurRadius = 20.0, double yOffset = 4.0, double alpha = 0.1, }) { - if (!enabled) { - return null; - } - + if (!enabled) return null; if (isLinuxDesktop) { return [ BoxShadow( @@ -139,7 +100,6 @@ class GlassPlatformConfig { ), ]; } - return [ BoxShadow( color: Colors.black.withValues(alpha: alpha), @@ -149,7 +109,6 @@ class GlassPlatformConfig { ]; } - /// Returns a soft glow for selected controls (chips, toggles, etc.). static List selectionGlow({ double blurRadius = 12.0, double alpha = 0.3, @@ -163,7 +122,6 @@ class GlassPlatformConfig { ), ]; } - return [ BoxShadow( color: Colors.white.withValues(alpha: alpha), @@ -173,11 +131,6 @@ class GlassPlatformConfig { ]; } - /// Tile mode used by blur filters. Using [TileMode.decal] prevents sampling - /// beyond the clipped region which slightly improves performance. static TileMode get blurTileMode => TileMode.decal; - - /// Clip behaviour used by our glass surfaces. Keeping anti aliasing on - /// avoids jagged edges without incurring the cost of saveLayer operations. static Clip get clipBehavior => Clip.antiAlias; } From 77294ee51b5e5bd801847740b85241fbcd1c5f77 Mon Sep 17 00:00:00 2001 From: PaulGD03 Date: Wed, 15 Oct 2025 00:24:39 +0200 Subject: [PATCH 20/44] feat(glasser): add floatingSurface to control blur usage, support custom borderColor, and tweak defaults - Introduce floatingSurface on GlassEffect to ensure backdrop blur is only applied for floating surfaces (dialogs, FABs) or when forceBlur is set. - Plumb floatingSurface through GlassAlertDialog, GlassDialog, GlassCard, GlassChoiceChip, and GlassFloatingActionButton. - Add optional borderColor to createGlassDecoration and use it for the decoration border. - Change default base fill color to grey for the glass decoration and restructure Dialog wrapper to apply shadow/borderRadius. --- lib/glasser/src/glass_effect.dart | 24 ++++++++++---- .../src/widgets/glass_alert_dialog.dart | 1 + lib/glasser/src/widgets/glass_card.dart | 1 + .../src/widgets/glass_choice_chip.dart | 1 + lib/glasser/src/widgets/glass_dialog.dart | 31 ++++++++++++++++--- .../widgets/glass_floating_action_button.dart | 2 ++ 6 files changed, 49 insertions(+), 11 deletions(-) diff --git a/lib/glasser/src/glass_effect.dart b/lib/glasser/src/glass_effect.dart index cead680..3aad2cb 100644 --- a/lib/glasser/src/glass_effect.dart +++ b/lib/glasser/src/glass_effect.dart @@ -30,10 +30,12 @@ class GlassEffect extends StatelessWidget { final BorderRadiusGeometry? borderRadius; final double borderWidth; final bool emphasizeBorder; + final Color? borderColor; final double borderAlpha; final bool useRawOpacity; final bool useRawBorderAlpha; final bool interactiveSurface; + final bool floatingSurface; final bool disableBlur; final bool forceBlur; @@ -47,10 +49,12 @@ class GlassEffect extends StatelessWidget { this.borderRadius, this.borderWidth = 1.0, this.emphasizeBorder = false, + this.borderColor, this.borderAlpha = 0.2, this.useRawOpacity = false, this.useRawBorderAlpha = false, this.interactiveSurface = false, + this.floatingSurface = false, this.disableBlur = false, this.forceBlur = false, }); @@ -63,17 +67,22 @@ class GlassEffect extends StatelessWidget { final effectiveSigma = GlassPlatformConfig.blurSigma(sigma); final effectiveOpacity = useRawOpacity ? opacity : GlassPlatformConfig.surfaceOpacity(opacity); + // Only enable a backdrop blur for explicitly floating surfaces (dialogs, + // floating action buttons, etc.) or when [forceBlur] is true. Interactive + // surfaces (buttons, chips) skip blur by default for performance. final enableBlur = !disableBlur && - GlassPlatformConfig.shouldBlur( - interactiveSurface: interactiveSurface, - force: forceBlur, - ); + (forceBlur || + (floatingSurface && + GlassPlatformConfig.shouldBlur( + interactiveSurface: interactiveSurface, + ))); Widget decoratedChild = DecoratedBox( decoration: createGlassDecoration( opacity: effectiveOpacity, borderRadius: resolvedBorderRadius, color: color, + borderColor: borderColor, borderWidth: borderWidth, emphasizeBorder: emphasizeBorder, borderAlpha: borderAlpha, @@ -107,6 +116,7 @@ BoxDecoration createGlassDecoration({ BorderRadiusGeometry borderRadius = const BorderRadius.all(Radius.circular(glassCornerRadius)), Color? color, + Color? borderColor, double borderWidth = 1.0, bool emphasizeBorder = false, double borderAlpha = 0.2, @@ -119,11 +129,13 @@ BoxDecoration createGlassDecoration({ emphasize: emphasizeBorder, ); + // Default base is white (frosted). Callers can override the base color if + // a different aesthetic is desired. return BoxDecoration( - color: (color ?? Colors.white).withValues(alpha: opacity), + color: (color ?? Colors.grey).withValues(alpha: opacity), borderRadius: borderRadius, border: Border.all( - color: Colors.white.withValues( + color: (borderColor ?? Colors.white).withValues( alpha: effectiveBorderAlpha, ), width: borderWidth, diff --git a/lib/glasser/src/widgets/glass_alert_dialog.dart b/lib/glasser/src/widgets/glass_alert_dialog.dart index bc8d4b4..ddfaf22 100644 --- a/lib/glasser/src/widgets/glass_alert_dialog.dart +++ b/lib/glasser/src/widgets/glass_alert_dialog.dart @@ -106,6 +106,7 @@ class GlassAlertDialog extends StatelessWidget { borderRadius: borderRadius, sigma: glassBlurSigma, opacity: fillOpacity, + floatingSurface: true, borderWidth: 1.6, emphasizeBorder: true, interactiveSurface: false, diff --git a/lib/glasser/src/widgets/glass_card.dart b/lib/glasser/src/widgets/glass_card.dart index 90cc5bc..110c8ef 100644 --- a/lib/glasser/src/widgets/glass_card.dart +++ b/lib/glasser/src/widgets/glass_card.dart @@ -106,6 +106,7 @@ class GlassCard extends StatelessWidget { ), sigma: glassBlurSigma, borderWidth: outlined ? 1.4 : 1.0, + floatingSurface: false, child: Material( type: MaterialType.transparency, shape: RoundedRectangleBorder(borderRadius: borderRadius), diff --git a/lib/glasser/src/widgets/glass_choice_chip.dart b/lib/glasser/src/widgets/glass_choice_chip.dart index 97b3df0..9ac9abc 100644 --- a/lib/glasser/src/widgets/glass_choice_chip.dart +++ b/lib/glasser/src/widgets/glass_choice_chip.dart @@ -94,6 +94,7 @@ class GlassChoiceChip extends StatelessWidget { borderWidth: borderWidth, emphasizeBorder: selected, interactiveSurface: true, + floatingSurface: false, child: Material( color: Colors.transparent, child: InkWell( diff --git a/lib/glasser/src/widgets/glass_dialog.dart b/lib/glasser/src/widgets/glass_dialog.dart index d8e8184..cd2680f 100644 --- a/lib/glasser/src/widgets/glass_dialog.dart +++ b/lib/glasser/src/widgets/glass_dialog.dart @@ -18,7 +18,9 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import '../../../util/providers/theme_provider.dart'; +import '../constants.dart'; import '../glass_effect.dart'; +import '../platform_config.dart'; /// A dialog that automatically becomes glassmorphic when the glass theme is active. /// @@ -60,14 +62,33 @@ class GlassDialog extends StatelessWidget { ); } + final borderRadius = BorderRadius.circular(glassCornerRadius); + final shadow = GlassPlatformConfig.surfaceShadow( + blurRadius: 26, + yOffset: 12, + alpha: 0.24, + ); + return Dialog( backgroundColor: Colors.transparent, elevation: 0, - child: GlassEffect( - opacity: 0.1, // Use dialog-specific opacity - child: Padding( - padding: padding, - child: child, + child: Container( + decoration: BoxDecoration( + borderRadius: borderRadius, + boxShadow: shadow, + ), + child: GlassEffect( + borderRadius: borderRadius, + sigma: glassBlurSigma, + opacity: 0.1, // Use dialog-specific opacity + floatingSurface: true, + borderWidth: 1.6, + emphasizeBorder: true, + interactiveSurface: false, + child: Padding( + padding: padding, + child: child, + ), ), ), ); diff --git a/lib/glasser/src/widgets/glass_floating_action_button.dart b/lib/glasser/src/widgets/glass_floating_action_button.dart index 1e384f9..0d5d605 100644 --- a/lib/glasser/src/widgets/glass_floating_action_button.dart +++ b/lib/glasser/src/widgets/glass_floating_action_button.dart @@ -181,6 +181,7 @@ class GlassFloatingActionButton extends StatelessWidget { borderRadius: borderRadius, sigma: glassBlurSigma, opacity: fillOpacity, + floatingSurface: true, borderWidth: 1.6, emphasizeBorder: true, child: Material( @@ -281,6 +282,7 @@ class GlassFloatingActionButton extends StatelessWidget { borderRadius: borderRadius, sigma: glassBlurSigma, opacity: fillOpacity, + floatingSurface: true, borderWidth: 1.6, emphasizeBorder: true, child: Center( From cf8e083137fcaf4672c58b26f1ffc097f7b00d16 Mon Sep 17 00:00:00 2001 From: PaulGD03 Date: Wed, 15 Oct 2025 00:26:50 +0200 Subject: [PATCH 21/44] feat(glasser): add GlassButton tinting and apply semantic tints across UI - Introduce GlassButtonTint and context-aware tint palettes; make GlassButton tint-aware for both glass and material variants (tinted outlines, blended fill, adjusted overlays, icon/text coloring). - Add helper palette resolution and toButtonStyle() to produce consistent material fallback styles. - Use tinting in DetailsScreen and StatusScreen for semantic actions (delete -> negative, options/confirm -> neutral, pause/resume -> positive/warn mapping, hold -> negative). - Enhance NotificationWatcher: map notification actions to semantic tints, mark 'resume'/'continue' as neutral, call resume before cancel for 'stop' flow (with a short delay), and simplify button styling. - Replace notification icon with Phosphor warning icon and slightly adjust dialog title typography for improved legibility. --- lib/files/details_screen.dart | 2 + lib/glasser/README.md | 20 ++ lib/glasser/src/widgets/glass_button.dart | 215 +++++++++++++++++- lib/status/status_screen.dart | 8 + .../error_handling/notification_watcher.dart | 44 ++-- lib/util/hold_button.dart | 5 +- 6 files changed, 272 insertions(+), 22 deletions(-) diff --git a/lib/files/details_screen.dart b/lib/files/details_screen.dart index 0d40f99..03dcbcb 100644 --- a/lib/files/details_screen.dart +++ b/lib/files/details_screen.dart @@ -465,6 +465,7 @@ class DetailScreenState extends State { return Row( children: [ GlassButton( + tint: GlassButtonTint.negative, wantIcon: false, onPressed: () { launchDeleteDialog(); @@ -484,6 +485,7 @@ class DetailScreenState extends State { const SizedBox(width: 20), Expanded( child: GlassButton( + tint: GlassButtonTint.neutral, onPressed: () async { try { final provider = diff --git a/lib/glasser/README.md b/lib/glasser/README.md index 1df1d0f..bffcb61 100644 --- a/lib/glasser/README.md +++ b/lib/glasser/README.md @@ -61,8 +61,28 @@ showDialog( ], ), ); + +// Apply semantic tint accents that work in both themes +GlassButton( + onPressed: () {}, + tint: GlassButtonTint.negative, + child: Text('Stop'), +) ``` +### Button Tints + +`GlassButton` supports semantic tint accents via the `tint` property. The available options are: + +- `GlassButtonTint.none` (default) +- `GlassButtonTint.none` (default) +- `GlassButtonTint.positive` (green accent) +- `GlassButtonTint.off` (orange/off-accent) +- `GlassButtonTint.neutral` (uses theme primary color) +- `GlassButtonTint.negative` (red accent) + +Tint accents automatically adapt their styling for glass and non-glass themes, ensuring consistent semantics without extra configuration. + ### Theme Detection Widgets automatically detect the current theme - no manual checking required: diff --git a/lib/glasser/src/widgets/glass_button.dart b/lib/glasser/src/widgets/glass_button.dart index 53a9295..8869ab2 100644 --- a/lib/glasser/src/widgets/glass_button.dart +++ b/lib/glasser/src/widgets/glass_button.dart @@ -22,6 +22,24 @@ import '../constants.dart'; import '../glass_effect.dart'; import '../platform_config.dart'; +/// Available tint accents for [GlassButton]. +enum GlassButtonTint { + /// No tint, keeps the default styling for both glass and non-glass themes. + none, + + /// Positive accent, rendered with a green emphasis. + positive, + + /// Neutral accent that uses the current theme primary color. + neutral, + + /// Warning accent, rendered with an orange emphasis. + warn, + + /// Negative accent, rendered with a red emphasis. + negative, +} + /// A button that automatically becomes glassmorphic when the glass theme is active. /// /// This widget is a drop-in replacement for [ElevatedButton]. When the glass theme is enabled, @@ -45,6 +63,7 @@ class GlassButton extends StatelessWidget { final VoidCallback? onPressed; final ButtonStyle? style; final bool wantIcon; + final GlassButtonTint tint; const GlassButton({ super.key, @@ -52,16 +71,24 @@ class GlassButton extends StatelessWidget { required this.onPressed, this.style, this.wantIcon = false, + this.tint = GlassButtonTint.none, }); @override Widget build(BuildContext context) { final themeProvider = Provider.of(context); + // If the button is disabled, force no tint so disabled buttons keep + // the neutral / muted appearance. + final effectiveTint = (onPressed == null) ? GlassButtonTint.none : tint; + // Resolve palette; neutral needs the theme primary so use context-aware resolver. + final tintPalette = _resolveTintPaletteWithContext(effectiveTint, context); + final resolvedMaterialStyle = + tintPalette == null ? style : tintPalette.toButtonStyle().merge(style); if (!themeProvider.isGlassTheme) { return ElevatedButton( onPressed: onPressed, - style: style, + style: resolvedMaterialStyle, child: child, ); } @@ -70,6 +97,7 @@ class GlassButton extends StatelessWidget { onPressed: onPressed, style: style, wantIcon: wantIcon, + tintPalette: tintPalette, child: child, // Pass the wantIcon parameter ); } @@ -81,12 +109,14 @@ class _GlassmorphicButton extends StatelessWidget { final VoidCallback? onPressed; final ButtonStyle? style; final bool wantIcon; + final _GlassButtonTintPalette? tintPalette; const _GlassmorphicButton({ required this.child, required this.onPressed, this.style, this.wantIcon = true, + this.tintPalette, }); @override @@ -106,10 +136,29 @@ class _GlassmorphicButton extends StatelessWidget { final isCircle = style?.shape?.resolve({}) is CircleBorder; final borderRadius = BorderRadius.circular(isCircle ? 30 : glassCornerRadius); + final palette = tintPalette; + final hasTint = palette != null; + final tintColor = palette?.color; + final fillOpacity = GlassPlatformConfig.surfaceOpacity( isEnabled ? 0.14 : 0.1, emphasize: isEnabled, ); + // When a tint is present we keep the white frosted base but make it a + // little more opaque so the tint's outline/text read better. We also + // blend a subtle tint over the white so the button keeps a frosted + // appearance while carrying semantic color. + final effectiveFillOpacity = + hasTint ? (fillOpacity + 0.06).clamp(0.0, 1.0) : fillOpacity; + Color? blendedFillColor; + if (hasTint) { + // Blend a low-opacity tint over white. Use alphaBlend so the result + // keeps white highlights while adding color. + blendedFillColor = Color.alphaBlend( + tintColor!.withValues(alpha: 0.75), + Colors.white, + ); + } final shadow = GlassPlatformConfig.interactiveShadow( enabled: isEnabled, blurRadius: isCircle ? 18 : 16, @@ -125,10 +174,20 @@ class _GlassmorphicButton extends StatelessWidget { child: GlassEffect( borderRadius: borderRadius, sigma: glassBlurSigma, - opacity: fillOpacity, + opacity: effectiveFillOpacity, + // Provide a subtle tinted white base when a tint is requested so the + // control remains frosted but carries semantic color. + color: blendedFillColor, + // Tone down the outline brightness so tinted buttons aren't too + // aggressive. We still bypass platform adjustments for tinted buttons + // but use a reduced alpha for a softer outline. borderWidth: 1.5, emphasizeBorder: isEnabled, + borderColor: hasTint ? tintColor : null, + borderAlpha: hasTint ? 0.45 : 0.2, + useRawBorderAlpha: hasTint, interactiveSurface: true, + floatingSurface: false, child: Material( color: Colors.transparent, shape: RoundedRectangleBorder(borderRadius: borderRadius), @@ -136,9 +195,16 @@ class _GlassmorphicButton extends StatelessWidget { child: InkWell( borderRadius: borderRadius, onTap: onPressed, - splashColor: isEnabled ? Colors.white.withValues(alpha: 0.2) : null, - highlightColor: - isEnabled ? Colors.white.withValues(alpha: 0.1) : null, + splashColor: isEnabled + ? (hasTint + ? tintColor!.withValues(alpha: 0.28) + : Colors.white.withValues(alpha: 0.2)) + : null, + highlightColor: isEnabled + ? (hasTint + ? tintColor!.withValues(alpha: 0.18) + : Colors.white.withValues(alpha: 0.1)) + : null, child: Opacity( opacity: isEnabled ? 1.0 : 0.6, child: Padding( @@ -147,7 +213,10 @@ class _GlassmorphicButton extends StatelessWidget { : const EdgeInsets.symmetric( horizontal: 24.0, vertical: 8.0), child: Center( - child: _buildButtonContentWithIcon(child, wantIcon: wantIcon), + child: _buildTintAwareContent( + _buildButtonContentWithIcon(child, wantIcon: wantIcon), + palette, + ), ), ), ), @@ -213,7 +282,6 @@ Widget _buildButtonContentWithIcon(Widget originalChild, Icon( icon, size: 18, - color: Colors.white, ), const SizedBox(width: 8), Text(originalChild.data ?? ''), @@ -224,3 +292,136 @@ Widget _buildButtonContentWithIcon(Widget originalChild, return originalChild; } + +Widget _buildTintAwareContent( + Widget content, + _GlassButtonTintPalette? palette, +) { + if (palette == null) { + return content; + } + + return IconTheme( + data: IconThemeData(color: palette.glassForeground), + child: DefaultTextStyle.merge( + style: TextStyle(color: palette.glassForeground), + child: content, + ), + ); +} + +_GlassButtonTintPalette? _resolveTintPalette(GlassButtonTint tint) { + switch (tint) { + case GlassButtonTint.none: + return null; + case GlassButtonTint.positive: + return const _GlassButtonTintPalette( + color: Colors.greenAccent, + materialForeground: Colors.white, + glassForeground: Colors.greenAccent, + ); + case GlassButtonTint.warn: + return const _GlassButtonTintPalette( + color: Colors.orangeAccent, + materialForeground: Colors.white, + glassForeground: Colors.orangeAccent, + ); + case GlassButtonTint.neutral: + // neutral uses theme primary; we'll resolve a placeholder here but + // callers should call the context-aware resolver below. + return const _GlassButtonTintPalette( + color: Colors.black, + materialForeground: Colors.white, + glassForeground: Colors.black, + ); + case GlassButtonTint.negative: + return const _GlassButtonTintPalette( + color: Colors.redAccent, + materialForeground: Colors.white, + glassForeground: Colors.redAccent, + ); + } +} + +_GlassButtonTintPalette? _resolveTintPaletteWithContext( + GlassButtonTint tint, BuildContext context) { + if (tint == GlassButtonTint.neutral) { + final primary = Theme.of(context).colorScheme.primary; + return _GlassButtonTintPalette( + color: primary, + materialForeground: Colors.white, + glassForeground: primary, + ); + } + + return _resolveTintPalette(tint); +} + +class _GlassButtonTintPalette { + final Color color; + + /// Foreground color to use for non-glass (material) buttons - usually a + /// high-contrast value like white. + final Color materialForeground; + + /// Foreground color to use for glass buttons: full tint color so the text + /// and icons match the outline. + final Color glassForeground; + + const _GlassButtonTintPalette({ + required this.color, + required this.materialForeground, + required this.glassForeground, + }); + + ButtonStyle toButtonStyle() { + return ButtonStyle( + // Use a light inner tint with a strong outline for material buttons so + // they visually match the glass variant (light fill + strong outline). + backgroundColor: WidgetStateProperty.resolveWith((states) { + if (states.contains(WidgetState.disabled)) { + return color.withValues(alpha: 0.08); + } + // Light inner tint + return color.withValues(alpha: 0.10); + }), + // Foreground (text/icon) should be full tint color for punchiness. + foregroundColor: WidgetStateProperty.resolveWith((states) { + if (states.contains(WidgetState.disabled)) { + return color.withValues(alpha: 0.6); + } + return color; + }), + iconColor: WidgetStateProperty.resolveWith((states) { + if (states.contains(WidgetState.disabled)) { + return color.withValues(alpha: 0.6); + } + return color; + }), + // Strong outline using side, and overlay uses a slightly stronger tint. + side: WidgetStateProperty.resolveWith((states) { + final c = states.contains(WidgetState.disabled) + ? color.withValues(alpha: 0.45) + : color.withValues(alpha: 0.75); + return BorderSide(color: c, width: 1.4); + }), + overlayColor: WidgetStateProperty.resolveWith((states) { + if (states.contains(WidgetState.pressed)) { + return color.withValues(alpha: 0.22); + } + if (states.contains(WidgetState.focused) || + states.contains(WidgetState.hovered)) { + return color.withValues(alpha: 0.12); + } + return null; + }), + surfaceTintColor: WidgetStateProperty.all(Colors.transparent), + shadowColor: WidgetStateProperty.resolveWith((states) { + if (states.contains(WidgetState.disabled)) { + return Colors.black.withValues(alpha: 0.08); + } + return Colors.black.withValues(alpha: 0.18); + }), + ); + } +} diff --git a/lib/status/status_screen.dart b/lib/status/status_screen.dart index 5444508..c90e7c0 100644 --- a/lib/status/status_screen.dart +++ b/lib/status/status_screen.dart @@ -965,6 +965,7 @@ class StatusScreenState extends State { return Row(children: [ Expanded( child: GlassButton( + tint: GlassButtonTint.neutral, onPressed: (!canShowOptions || provider.isCanceling) ? null : () { @@ -1003,6 +1004,7 @@ class StatusScreenState extends State { height: 65, width: 450, child: GlassButton( + tint: GlassButtonTint.neutral, style: buttonStyle, onPressed: () { Navigator.pop(ctx); @@ -1029,6 +1031,7 @@ class StatusScreenState extends State { height: 65, width: 450, child: HoldButton( + tint: GlassButtonTint.negative, style: buttonStyle, duration: const Duration(seconds: 2), onPressed: () { @@ -1062,6 +1065,11 @@ class StatusScreenState extends State { const SizedBox(width: 20), Expanded( child: GlassButton( + tint: isCanceled || isFinished + ? GlassButtonTint.neutral + : isPaused + ? GlassButtonTint.positive + : GlassButtonTint.warn, onPressed: !pauseResumeEnabled ? null : () { diff --git a/lib/util/error_handling/notification_watcher.dart b/lib/util/error_handling/notification_watcher.dart index 604d320..9248a4a 100644 --- a/lib/util/error_handling/notification_watcher.dart +++ b/lib/util/error_handling/notification_watcher.dart @@ -17,6 +17,7 @@ import 'dart:async'; import 'package:flutter/material.dart'; +import 'package:phosphor_flutter/phosphor_flutter.dart'; import 'package:provider/provider.dart'; import 'package:orion/backend_service/providers/notification_provider.dart'; @@ -133,13 +134,16 @@ class NotificationWatcher { // Map actions to backend calls. Keep failures isolated. if (act == 'stop') { try { + await BackendService().resumePrint(); + // Give a moment for the state to update before canceling. + await Future.delayed(const Duration(milliseconds: 500)); await BackendService().cancelPrint(); } catch (_) {} } else if (act == 'pause') { try { await BackendService().pausePrint(); } catch (_) {} - } else if (act == 'resume') { + } else if (act == 'resume' || act == 'continue') { try { await BackendService().resumePrint(); } catch (_) {} @@ -155,8 +159,6 @@ class NotificationWatcher { _locallyAcked.add(k); } catch (_) {} } - } else if (act == 'continue') { - // 'continue' is a no-op: dismiss and let printing continue. } else { // Unknown action - no-op for safety. } @@ -167,18 +169,32 @@ class NotificationWatcher { } } - final style = (act == 'stop') - ? ElevatedButton.styleFrom( - minimumSize: const Size(0, 56), - backgroundColor: Colors.red.shade600, - ) - : ElevatedButton.styleFrom(minimumSize: const Size(0, 60)); + final GlassButtonTint tint; + if (act == 'stop') { + tint = GlassButtonTint.negative; + } else if (act == 'pause') { + tint = GlassButtonTint.warn; + } else if (act == 'resume' || + act == 'close' || + act == 'confirm' || + act == 'ack' || + act == 'acknowledge' || + act == 'continue') { + tint = GlassButtonTint.neutral; + } else { + tint = GlassButtonTint.none; + } + + final style = ElevatedButton.styleFrom( + minimumSize: Size(0, act == 'stop' ? 56 : 60), + ); return Flexible( child: Padding( padding: const EdgeInsets.only(right: 6.0), child: GlassButton( onPressed: onPressed, + tint: tint, style: style, child: Text(label, style: const TextStyle(fontSize: 22)), ), @@ -189,17 +205,17 @@ class NotificationWatcher { return GlassAlertDialog( title: Row( children: [ - Icon( - Icons.notification_important, - color: Colors.orange.shade600, - size: 26, + PhosphorIcon( + PhosphorIcons.warning(), + color: Colors.orangeAccent, + size: 28, ), const SizedBox(width: 16), Expanded( child: Text( getNanoTypeTitle(item.type), style: const TextStyle( - fontSize: 22, fontWeight: FontWeight.bold), + fontSize: 24, fontWeight: FontWeight.w600), ), ), ], diff --git a/lib/util/hold_button.dart b/lib/util/hold_button.dart index fcfd04e..07e54c9 100644 --- a/lib/util/hold_button.dart +++ b/lib/util/hold_button.dart @@ -1,5 +1,5 @@ /* -* Orion - Orion HoldButton +* Orion - Hold Button * Copyright (C) 2025 Open Resin Alliance * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -26,6 +26,7 @@ class HoldButton extends StatefulWidget { final Widget child; final ButtonStyle? style; final Duration duration; + final GlassButtonTint tint; const HoldButton({ super.key, @@ -33,6 +34,7 @@ class HoldButton extends StatefulWidget { required this.child, this.style, this.duration = const Duration(seconds: 3), + this.tint = GlassButtonTint.none, }); @override @@ -94,6 +96,7 @@ class HoldButtonState extends State with TickerProviderStateMixin { // Intentionally left empty: HoldButton manages tap events via GestureDetector. onPressed: () {}, style: widget.style, + tint: widget.tint, child: Center( child: widget.child, ), From a5f933ef1866094c2835dcda028922eaa44d4dec Mon Sep 17 00:00:00 2001 From: PaulGD03 Date: Wed, 15 Oct 2025 00:27:17 +0200 Subject: [PATCH 22/44] fix(backend_service: nanodlp): replace 'confirm' with 'close' for klipper-error, aegis-error, aegis-info and default notification types --- .../nanodlp/models/nano_notification_types.dart | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/backend_service/nanodlp/models/nano_notification_types.dart b/lib/backend_service/nanodlp/models/nano_notification_types.dart index 1f0541c..4ad12c3 100644 --- a/lib/backend_service/nanodlp/models/nano_notification_types.dart +++ b/lib/backend_service/nanodlp/models/nano_notification_types.dart @@ -66,22 +66,22 @@ const List> _defaultNanoNotificationTypes = [ }, { 'type': 'klipper-error', - 'actions': ['confirm'], + 'actions': ['close'], 'priority': 3 }, { 'type': 'aegis-error', - 'actions': ['confirm'], + 'actions': ['close'], 'priority': 4 }, { 'type': 'aegis-info', - 'actions': ['confirm'], + 'actions': ['close'], 'priority': 5 }, { 'type': 'default', - 'actions': ['confirm'], + 'actions': ['close'], 'priority': 6 }, ]; From 6266d1a9fd76e623d21befd2a681d6a02a580481 Mon Sep 17 00:00:00 2001 From: PaulGD03 Date: Wed, 15 Oct 2025 00:27:30 +0200 Subject: [PATCH 23/44] refactor(backend_service: nanodlp): make _totalLayers final in NanoDlpSimulatedClient --- lib/backend_service/nanodlp/nanodlp_simulated_client.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/backend_service/nanodlp/nanodlp_simulated_client.dart b/lib/backend_service/nanodlp/nanodlp_simulated_client.dart index 4b24389..4db75f7 100644 --- a/lib/backend_service/nanodlp/nanodlp_simulated_client.dart +++ b/lib/backend_service/nanodlp/nanodlp_simulated_client.dart @@ -22,7 +22,7 @@ class NanoDlpSimulatedClient implements OdysseyClient { bool _paused = false; bool _cancelLatched = false; int _currentLayer = 0; - int _totalLayers = 200; + final int _totalLayers = 200; // Status stream final StreamController> _statusController = From 279de41949c62ed39e72ad63e9c9838e6e8902ac Mon Sep 17 00:00:00 2001 From: PaulGD03 Date: Wed, 15 Oct 2025 00:27:55 +0200 Subject: [PATCH 24/44] refactor(backend_service: files_provider): simplify usbAvailable log interpolation --- lib/backend_service/providers/files_provider.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/backend_service/providers/files_provider.dart b/lib/backend_service/providers/files_provider.dart index 34e893c..592dc09 100644 --- a/lib/backend_service/providers/files_provider.dart +++ b/lib/backend_service/providers/files_provider.dart @@ -109,7 +109,7 @@ class FilesProvider extends ChangeNotifier { const ttl = Duration(seconds: 30); if (_usbAvailableCache != null && _usbAvailableCachedAt != null) { if (now.difference(_usbAvailableCachedAt!) < ttl) { - _log.fine('usbAvailable: returning cached=${_usbAvailableCache}'); + _log.fine('usbAvailable: returning cached=$_usbAvailableCache'); return _usbAvailableCache!; } } From 87dad3122eb1f0f8c07362d860c51da884422ccd Mon Sep 17 00:00:00 2001 From: PaulGD03 Date: Wed, 15 Oct 2025 00:28:12 +0200 Subject: [PATCH 25/44] refactor(util: sl1_thumbnail): remove unused dart:typed_data import --- lib/util/sl1_thumbnail.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/util/sl1_thumbnail.dart b/lib/util/sl1_thumbnail.dart index a28df41..f953862 100644 --- a/lib/util/sl1_thumbnail.dart +++ b/lib/util/sl1_thumbnail.dart @@ -20,7 +20,6 @@ import 'package:logging/logging.dart'; import 'package:orion/backend_service/backend_service.dart'; import 'package:orion/backend_service/odyssey/odyssey_client.dart'; import 'package:flutter/foundation.dart'; -import 'dart:typed_data'; import 'package:orion/backend_service/nanodlp/nanodlp_thumbnail_generator.dart'; import 'package:path_provider/path_provider.dart'; import 'package:path/path.dart' as p; From 6057aabae47a1384b6f70459a96660771366ab92 Mon Sep 17 00:00:00 2001 From: PaulGD03 Date: Wed, 15 Oct 2025 00:28:24 +0200 Subject: [PATCH 26/44] refactor(util: status_card): replace GlassCard with standard Card and remove glasser import --- lib/util/status_card.dart | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/util/status_card.dart b/lib/util/status_card.dart index 5c59263..a5b6528 100644 --- a/lib/util/status_card.dart +++ b/lib/util/status_card.dart @@ -17,7 +17,6 @@ import 'package:flutter/material.dart'; -import 'package:orion/glasser/glasser.dart'; import 'package:orion/backend_service/odyssey/models/status_models.dart'; class StatusCard extends StatefulWidget { @@ -138,7 +137,7 @@ class StatusCardState extends State { // Default compact form with icon return Builder( builder: (context) { - return GlassCard( + return Card( shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(999), ), From a3546e692a58e4a5d86e25b69538b90d9f9dc34f Mon Sep 17 00:00:00 2001 From: PaulGD03 Date: Wed, 15 Oct 2025 00:28:46 +0200 Subject: [PATCH 27/44] refactor(scripts: install_orion_athena2): use vendor colorSeed and add vendor theme seed/gradient to vendor config --- scripts/install_orion_athena2.sh | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/scripts/install_orion_athena2.sh b/scripts/install_orion_athena2.sh index 64be96e..9f2014f 100644 --- a/scripts/install_orion_athena2.sh +++ b/scripts/install_orion_athena2.sh @@ -267,7 +267,7 @@ main() { { "general": { "themeMode": "glass", - "colorSeed": "orange", + "colorSeed": "vendor", "useUsbByDefault": true }, "advanced": { @@ -300,7 +300,13 @@ EOF "vendorMachineName": "Athena 2", "machineModelName": "Athena 2", "homePosition": "up", - "vendorUrl": "https://concepts3d.ca" + "vendorUrl": "https://concepts3d.ca", + "vendorThemeSeed": "#FFFFA500", + "vendorThemeGradient": [ + "#FF221505", + "#FF3A2605", + "#FF5B3B05" + ] }, "featureFlags": { "enableBetaFeatures": false, From 150b7cb4e22a60ec064322ba91e452d1a84e9c11 Mon Sep 17 00:00:00 2001 From: PaulGD03 Date: Wed, 15 Oct 2025 15:16:51 +0200 Subject: [PATCH 28/44] feat(backend_service: nanodlp): implement manualCure and displayTest Implement previously unimplemented NanoDLP endpoints: - manualCure(bool): call /projector/on or /projector/blank, log request/response, parse JSON into NanoManualResult (fall back to ok=true on parse error), and throw on non-200 responses. - displayTest(String): map common test names to real NanoDLP endpoints (Grid, Logo, Measure, White), resolve a command fallback to /display/test/, perform the request, treat HTTP 200 as success and throw on non-200. --- .../nanodlp/nanodlp_http_client.dart | 72 +++++++++++++++++-- 1 file changed, 68 insertions(+), 4 deletions(-) diff --git a/lib/backend_service/nanodlp/nanodlp_http_client.dart b/lib/backend_service/nanodlp/nanodlp_http_client.dart index a70e9df..30a0614 100644 --- a/lib/backend_service/nanodlp/nanodlp_http_client.dart +++ b/lib/backend_service/nanodlp/nanodlp_http_client.dart @@ -710,8 +710,37 @@ class NanoDlpHttpClient implements OdysseyClient { throw UnimplementedError('NanoDLP manualCommand not implemented'); @override - Future> manualCure(bool cure) async => - throw UnimplementedError('NanoDLP manualCure not implemented'); + Future> manualCure(bool cure) async { + try { + final action = cure ? 'on' : 'blank'; + final baseNoSlash = apiUrl.replaceAll(RegExp(r'/+$'), ''); + final uri = Uri.parse('$baseNoSlash/projector/$action'); + _log.info( + 'NanoDLP manualCure($cure) request -> /projector/$action: $uri'); + final client = _createClient(); + try { + final resp = await client.get(uri); + if (resp.statusCode != 200) { + _log.warning( + 'NanoDLP manualCure($cure) failed: ${resp.statusCode} ${resp.body}'); + throw Exception( + 'NanoDLP manualCure($cure) failed: ${resp.statusCode}'); + } + try { + final decoded = json.decode(resp.body); + final nm = NanoManualResult.fromDynamic(decoded); + return nm.toMap(); + } catch (_) { + return NanoManualResult(ok: true).toMap(); + } + } finally { + client.close(); + } + } catch (e, st) { + _log.warning('NanoDLP manualCure($cure) error', e, st); + throw Exception('NanoDLP manualCure($cure) failed: $e'); + } + } @override Future> emergencyStop() async { @@ -919,8 +948,43 @@ class NanoDlpHttpClient implements OdysseyClient { } @override - Future displayTest(String test) async => - throw UnimplementedError('NanoDLP displayTest not implemented'); + Future displayTest(String test) async { + // Map test names to real NanoDLP test endpoints. + const Map testMappings = { + 'Grid': '/projector/generate/calibration', + // So far Athena is the only printer with NanoDLP that we support + 'Logo': '/projector/display/general***athena.png', + 'Measure': '/projector/generate/boundaries', + 'White': '/projector/generate/white', + }; + + try { + final baseNoSlash = apiUrl.replaceAll(RegExp(r'/+$'), ''); + // Resolve mapped command; fall back to legacy /display/test/ if unknown. + final mapped = testMappings[test]; + final command = mapped ?? '/display/test/$test'; + final cmdWithSlash = command.startsWith('/') ? command : '/$command'; + final uri = Uri.parse('$baseNoSlash$cmdWithSlash'); + + _log.info('NanoDLP displayTest request for "$test": $uri'); + final client = _createClient(); + try { + final resp = await client.get(uri); + if (resp.statusCode != 200) { + _log.warning( + 'NanoDLP displayTest failed: ${resp.statusCode} ${resp.body}'); + throw Exception('NanoDLP displayTest failed: ${resp.statusCode}'); + } + // Some installs return JSON or plain text; ignore body and treat 200 as success + return; + } finally { + client.close(); + } + } catch (e, st) { + _log.warning('NanoDLP displayTest error', e, st); + rethrow; + } + } bool _matchesPath(String? lhs, String rhs) { if (lhs == null) return false; From 06e8fb21e72e996144e068e356336c9dfcb603d6 Mon Sep 17 00:00:00 2001 From: PaulGD03 Date: Wed, 15 Oct 2025 15:17:22 +0200 Subject: [PATCH 29/44] fix(tools: exposure_screen): respect device exposure delay and correct exposure buttons/icons - add OrionConfig instance and compute delayTime (1s default, 0s for NanoDLP) - pass delayTime into showExposureDialog and wait before starting countdown - set progress indicator background color for visibility - fix exposure button targets, icons and labels (Logo / Measure / Clean mappings) --- lib/tools/exposure_screen.dart | 35 +++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/lib/tools/exposure_screen.dart b/lib/tools/exposure_screen.dart index d53ed6b..ec4093c 100644 --- a/lib/tools/exposure_screen.dart +++ b/lib/tools/exposure_screen.dart @@ -22,6 +22,7 @@ import 'package:flutter/material.dart'; import 'package:logging/logging.dart'; import 'package:orion/backend_service/providers/manual_provider.dart'; +import 'package:orion/util/orion_config.dart'; import 'package:provider/provider.dart'; import 'package:orion/backend_service/providers/config_provider.dart'; import 'package:orion/glasser/glasser.dart'; @@ -38,6 +39,7 @@ class ExposureScreen extends StatefulWidget { class ExposureScreenState extends State { final _logger = Logger('Exposure'); + final _config = OrionConfig(); CancelableOperation? _exposureOperation; Completer? _exposureCompleter; @@ -45,6 +47,12 @@ class ExposureScreenState extends State { bool _apiErrorState = false; Future exposeScreen(String type) async { + int delayTime = 1; // Odyssey requires a 1 second delay before exposure + + if (_config.isNanoDlpMode()) { + delayTime = 0; + } + try { _logger.info('Testing exposure for $exposureTime seconds'); final manual = Provider.of(context, listen: false); @@ -67,7 +75,7 @@ class ExposureScreenState extends State { return; } - showExposureDialog(context, exposureTime, type: type); + showExposureDialog(context, exposureTime, delayTime, type: type); _exposureCompleter = Completer(); _exposureOperation = CancelableOperation.fromFuture( Future.any([ @@ -90,7 +98,8 @@ class ExposureScreenState extends State { } } - void showExposureDialog(BuildContext context, int countdownTime, + void showExposureDialog( + BuildContext context, int countdownTime, int delayTime, {String? type}) { _logger.info('Showing countdown dialog'); @@ -100,7 +109,7 @@ class ExposureScreenState extends State { builder: (BuildContext context) { return StreamBuilder( stream: (() async* { - await Future.delayed(const Duration(seconds: 1)); + await Future.delayed(Duration(seconds: delayTime)); yield* Stream.periodic(const Duration(milliseconds: 1), (i) => countdownTime * 1000 - i) .take((countdownTime * 1000) + 1); @@ -161,6 +170,7 @@ class ExposureScreenState extends State { height: 180, // Make the progress indicator larger width: 180, // Make the progress indicator larger child: CircularProgressIndicator( + backgroundColor: Colors.grey.shade800, value: snapshot.data! / (countdownTime * 1000), strokeWidth: 12, // Make the progress indicator thicker ), @@ -324,9 +334,8 @@ class ExposureScreenState extends State { const SizedBox(width: 30), Expanded( child: GlassButton( - onPressed: _apiErrorState - ? null - : () => exposeScreen('Dimensions'), + onPressed: + _apiErrorState ? null : () => exposeScreen('Logo'), style: ElevatedButton.styleFrom( shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(15), @@ -339,13 +348,13 @@ class ExposureScreenState extends State { mainAxisAlignment: MainAxisAlignment.center, children: [ PhosphorIcon( - PhosphorIconsFill.ruler, + PhosphorIcons.linuxLogo(), size: 40, color: _apiErrorState ? Colors.grey : null, ), const SizedBox(height: 8), Text( - 'Measure', + 'Logo', style: TextStyle( fontSize: 24, color: _apiErrorState ? Colors.grey : null, @@ -368,7 +377,7 @@ class ExposureScreenState extends State { Expanded( child: GlassButton( onPressed: - _apiErrorState ? null : () => exposeScreen('Blank'), + _apiErrorState ? null : () => exposeScreen('Measure'), style: ElevatedButton.styleFrom( shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(15), @@ -380,13 +389,13 @@ class ExposureScreenState extends State { mainAxisAlignment: MainAxisAlignment.center, children: [ PhosphorIcon( - PhosphorIcons.square(), + PhosphorIcons.ruler(), size: 40, color: _apiErrorState ? Colors.grey : null, ), const SizedBox(height: 8), Text( - 'Blank', + 'Measure', style: TextStyle( fontSize: 24, color: _apiErrorState ? Colors.grey : null, @@ -411,8 +420,8 @@ class ExposureScreenState extends State { mainAxisSize: MainAxisSize.min, mainAxisAlignment: MainAxisAlignment.center, children: [ - Icon( - Icons.cleaning_services, + PhosphorIcon( + PhosphorIcons.broom(), size: 40, color: _apiErrorState ? Colors.grey : null, ), From 7e1dfc695b5f86410732fd602f2cf7347be1ae14 Mon Sep 17 00:00:00 2001 From: PaulGD03 Date: Wed, 15 Oct 2025 15:17:39 +0200 Subject: [PATCH 30/44] fix(scripts: install_orion_athena2): point ORION_URL to BRANCH_athena_features Use the Athena-specific release branch when downloading the Orion tarball for Athena 2. --- scripts/install_orion_athena2.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/install_orion_athena2.sh b/scripts/install_orion_athena2.sh index 9f2014f..9f77562 100644 --- a/scripts/install_orion_athena2.sh +++ b/scripts/install_orion_athena2.sh @@ -26,7 +26,7 @@ cleanup() { trap cleanup EXIT SCRIPT_NAME="$(basename "$0")" -ORION_URL="https://github.com/Open-Resin-Alliance/Orion/releases/download/BRANCH_nanodlp_basic_support/orion_armv7.tar.gz" +ORION_URL="https://github.com/Open-Resin-Alliance/Orion/releases/download/BRANCH_athena_features/orion_armv7.tar.gz" DOWNSAMPLED_RES="210, 210" uninstall_orion() { From 19ff307e1858004b99fd8d22c6daf842ce0c5b82 Mon Sep 17 00:00:00 2001 From: PaulGD03 Date: Wed, 15 Oct 2025 16:11:27 +0200 Subject: [PATCH 31/44] fix(util: error_handling): make dialogs modal and order notification action buttons - Set barrierDismissible=false for connection and notification dialogs to prevent accidental dismissal. - Rework notification watcher button construction: build coreButtons list, classify primary actions so they render on the right, preserve tints/sizes, and remove trailing padding on the last button for consistent spacing. --- .../connection_error_dialog.dart | 2 +- .../error_handling/notification_watcher.dart | 58 ++++++++++++++++--- 2 files changed, 50 insertions(+), 10 deletions(-) diff --git a/lib/util/error_handling/connection_error_dialog.dart b/lib/util/error_handling/connection_error_dialog.dart index 884d3fe..7f3639f 100644 --- a/lib/util/error_handling/connection_error_dialog.dart +++ b/lib/util/error_handling/connection_error_dialog.dart @@ -58,7 +58,7 @@ Future showConnectionErrorDialog(BuildContext context) async { 'showConnectionErrorDialog: attempting to show dialog (triesLeft=$triesLeft)'); showDialog( context: context, - barrierDismissible: true, + barrierDismissible: false, useRootNavigator: true, builder: (BuildContext ctx) { return _ConnectionErrorDialogContent(); diff --git a/lib/util/error_handling/notification_watcher.dart b/lib/util/error_handling/notification_watcher.dart index 9248a4a..f2510e9 100644 --- a/lib/util/error_handling/notification_watcher.dart +++ b/lib/util/error_handling/notification_watcher.dart @@ -121,12 +121,16 @@ class NotificationWatcher { final dialogFuture = showDialog( context: context, - barrierDismissible: true, + barrierDismissible: false, useRootNavigator: true, builder: (BuildContext ctx) { dialogCtx = ctx; // Build action buttons from config - final buttons = actions.map((act) { + // Build core button widgets, split into primary vs others so + // primary actions (resume/continue/confirm/etc.) appear on the + // right side of the dialog. + final List coreButtons = []; + for (final act in actions) { final label = act[0].toUpperCase() + act.substring(1); Future onPressed() async { @@ -189,15 +193,51 @@ class NotificationWatcher { minimumSize: Size(0, act == 'stop' ? 56 : 60), ); + coreButtons.add( + GlassButton( + onPressed: onPressed, + tint: tint, + style: style, + child: Text(label, style: const TextStyle(fontSize: 22)), + ), + ); + } + + // Place non-primary buttons first, primary buttons (resume/confirm) + // after them so primary is on the right. Primary set matches the + // tint mapping above. + final primarySet = { + 'resume', + 'close', + 'confirm', + 'ack', + 'acknowledge', + 'continue' + }; + + final List primary = []; + final List others = []; + for (var i = 0; i < actions.length; i++) { + final act = actions[i]; + final core = coreButtons[i]; + if (primarySet.contains(act)) { + primary.add(core); + } else { + others.add(core); + } + } + + final ordered = [...others, ...primary]; + + // Wrap with Flexible and padding; last item gets no trailing padding. + final buttons = ordered.asMap().entries.map((entry) { + final idx = entry.key; + final widget = entry.value; + final isLast = idx == ordered.length - 1; return Flexible( child: Padding( - padding: const EdgeInsets.only(right: 6.0), - child: GlassButton( - onPressed: onPressed, - tint: tint, - style: style, - child: Text(label, style: const TextStyle(fontSize: 22)), - ), + padding: EdgeInsets.only(right: isLast ? 0.0 : 6.0), + child: widget, ), ); }).toList(growable: false); From a971dea39e588ddacc15ba54d3bda90f7a4476ee Mon Sep 17 00:00:00 2001 From: PaulGD03 Date: Wed, 15 Oct 2025 17:49:24 +0200 Subject: [PATCH 32/44] feat(backend_service): add BackendClient abstraction and NanoDLP helpers - Introduce BackendClient interface and switch BackendService to use it - Add NanoDLP helper modules: - nano_thumbnail_generator: resizing/placeholder + compute entrypoint - nano_simulated_client: in-memory simulated NanoDLP backend for dev - nano_state_handler: canonical state/latching logic for cancel/pause - nano_analytics_config: mapping and id->key helper - Implement getAnalytics on NanoDlpHttpClient and OdysseyHttpClient - Extend NanoFile to parse/respect resinTemperature and expose it - Preserve raw numeric resin/temp/mcu fields in nanodlp->odyssey mapper - Capture/resurface resin temperature in StatusProvider - Update many providers, utilities and tests to depend on BackendClient (updated imports, fakes, and thumbnails usage) - Minor refactors: move thumbnail generator into helpers, update imports This prepares the codebase for multiple backend implementations (real, simulated) and adds NanoDLP-specific utilities used by status, thumbnails, and testing. --- ...dyssey_client.dart => backend_client.dart} | 10 ++- lib/backend_service/backend_service.dart | 20 +++--- .../helpers/nano_analytics_config.dart | 39 +++++++++++ .../nano_simulated_client.dart} | 14 ++-- .../nano_state_handler.dart} | 0 .../nano_thumbnail_generator.dart} | 0 .../nanodlp/models/nano_file.dart | 27 ++++++++ .../nanodlp/nanodlp_http_client.dart | 31 +++++++-- .../nanodlp/nanodlp_mappers.dart | 10 ++- .../odyssey/odyssey_http_client.dart | 26 ++++++- .../providers/config_provider.dart | 6 +- .../providers/files_provider.dart | 6 +- .../providers/manual_provider.dart | 8 +-- .../providers/notification_provider.dart | 6 +- .../providers/print_provider.dart | 6 +- .../providers/status_provider.dart | 67 +++++++++++++++++-- lib/util/sl1_thumbnail.dart | 12 ++-- test/backend/nanodlp_state_handler_test.dart | 2 +- test/fakes/fake_odyssey_client.dart | 10 ++- ...ake_odyssey_client_for_thumbnail_test.dart | 12 +++- test/manual_provider_test.dart | 10 +-- test/nanodlp/finished_flow_test.dart | 2 +- test/nanodlp_thumbnail_generator_test.dart | 2 +- test/thumbnail_util_test.dart | 2 +- 24 files changed, 264 insertions(+), 64 deletions(-) rename lib/backend_service/{odyssey/odyssey_client.dart => backend_client.dart} (91%) create mode 100644 lib/backend_service/nanodlp/helpers/nano_analytics_config.dart rename lib/backend_service/nanodlp/{nanodlp_simulated_client.dart => helpers/nano_simulated_client.dart} (94%) rename lib/backend_service/nanodlp/{nanodlp_state_handler.dart => helpers/nano_state_handler.dart} (100%) rename lib/backend_service/nanodlp/{nanodlp_thumbnail_generator.dart => helpers/nano_thumbnail_generator.dart} (100%) diff --git a/lib/backend_service/odyssey/odyssey_client.dart b/lib/backend_service/backend_client.dart similarity index 91% rename from lib/backend_service/odyssey/odyssey_client.dart rename to lib/backend_service/backend_client.dart index a0ec337..b9d38d4 100644 --- a/lib/backend_service/odyssey/odyssey_client.dart +++ b/lib/backend_service/backend_client.dart @@ -1,5 +1,5 @@ /* -* Orion - Odyssey Client +* Orion - Backend Client * Copyright (C) 2025 Open Resin Alliance * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -18,10 +18,10 @@ import 'dart:typed_data'; import 'dart:async'; -/// Minimal abstraction over the Odyssey API used by providers. This allows +/// Minimal abstraction over the Backend API used by providers. This allows /// swapping implementations (real HTTP client, mock, or unit-test doubles) /// while keeping providers free from direct dependency on ApiService. -abstract class OdysseyClient { +abstract class BackendClient { Future> listItems( String location, int pageSize, int pageIndex, String subdirectory); @@ -90,4 +90,8 @@ abstract class OdysseyClient { /// (as reported by the backend). Implementations that don't support this /// may return a placeholder image or empty bytes. Future getPlateLayerImage(int plateId, int layer); + + /// Fetch recent analytics entries. `n` requests the last N entries. + /// Returns a list of JSON objects with keys like 'ID', 'T', 'V'. + Future>> getAnalytics(int n); } diff --git a/lib/backend_service/backend_service.dart b/lib/backend_service/backend_service.dart index cd3f089..09991ed 100644 --- a/lib/backend_service/backend_service.dart +++ b/lib/backend_service/backend_service.dart @@ -16,25 +16,25 @@ */ import 'dart:typed_data'; -import 'package:orion/backend_service/odyssey/odyssey_client.dart'; +import 'package:orion/backend_service/backend_client.dart'; import 'package:orion/backend_service/odyssey/odyssey_http_client.dart'; import 'package:orion/backend_service/nanodlp/nanodlp_http_client.dart'; -import 'package:orion/backend_service/nanodlp/nanodlp_simulated_client.dart'; +import 'package:orion/backend_service/nanodlp/helpers/nano_simulated_client.dart'; import 'package:orion/util/orion_config.dart'; /// BackendService is a small façade that selects a concrete -/// `OdysseyClient` implementation at runtime. This centralizes the +/// `BackendClient` implementation at runtime. This centralizes the /// point where an alternative backend implementation (different API) /// can be swapped in without changing providers or UI code. -class BackendService implements OdysseyClient { - final OdysseyClient _delegate; +class BackendService implements BackendClient { + final BackendClient _delegate; /// Default constructor: picks the concrete implementation based on /// configuration (or defaults to the HTTP adapter). - BackendService({OdysseyClient? delegate}) + BackendService({BackendClient? delegate}) : _delegate = delegate ?? _chooseFromConfig(); - static OdysseyClient _chooseFromConfig() { + static BackendClient _chooseFromConfig() { try { final cfg = OrionConfig(); // Developer-mode simulated backend flag (developer.simulated = true) @@ -52,7 +52,7 @@ class BackendService implements OdysseyClient { return OdysseyHttpClient(); } - // Forward all OdysseyClient methods to the selected delegate. + // Forward all BackendClient methods to the selected delegate. @override Future> listItems( String location, int pageSize, int pageIndex, String subdirectory) => @@ -147,4 +147,8 @@ class BackendService implements OdysseyClient { @override Future getPlateLayerImage(int plateId, int layer) => _delegate.getPlateLayerImage(plateId, layer); + + @override + Future>> getAnalytics(int n) => + _delegate.getAnalytics(n); } diff --git a/lib/backend_service/nanodlp/helpers/nano_analytics_config.dart b/lib/backend_service/nanodlp/helpers/nano_analytics_config.dart new file mode 100644 index 0000000..a8eaa60 --- /dev/null +++ b/lib/backend_service/nanodlp/helpers/nano_analytics_config.dart @@ -0,0 +1,39 @@ +// Mapping of NanoDLP analytic metric ids (T) to canonical keys used by the UI. +const List> allChartConfig = [ + {'key': 'LayerHeight', 'id': 0}, + {'key': 'SolidArea', 'id': 1}, + {'key': 'AreaCount', 'id': 2}, + {'key': 'LargestArea', 'id': 3}, + {'key': 'Speed', 'id': 4}, + {'key': 'Cure', 'id': 5}, + {'key': 'Pressure', 'id': 6}, + {'key': 'TemperatureInside', 'id': 7}, + {'key': 'TemperatureOutside', 'id': 8}, + {'key': 'LayerTime', 'id': 9}, + {'key': 'LiftHeight', 'id': 10}, + {'key': 'TemperatureMCU', 'id': 11}, + {'key': 'TemperatureInsideTarget', 'id': 12}, + {'key': 'TemperatureOutsideTarget', 'id': 13}, + {'key': 'TemperatureMCUTarget', 'id': 14}, + {'key': 'MCUFanRPM', 'id': 15}, + {'key': 'UVFanRPM', 'id': 16}, + {'key': 'DynamicWait', 'id': 17}, + {'key': 'TemperatureVat', 'id': 18}, + {'key': 'TemperatureVatTarget', 'id': 19}, + {'key': 'PTCFanRPM', 'id': 20}, + {'key': 'AEGISFanRPM', 'id': 21}, + {'key': 'TemperatureChamber', 'id': 22}, + {'key': 'TemperatureChamberTarget', 'id': 23}, + {'key': 'TemperaturePTC', 'id': 24}, + {'key': 'TemperaturePTCTarget', 'id': 25}, + {'key': 'VOCInlet', 'id': 26}, + {'key': 'VOCOutlet', 'id': 27}, +]; + +String? idToKey(int id) { + for (final e in allChartConfig) { + final val = e['id']; + if (val is int && val == id) return e['key'] as String?; + } + return null; +} diff --git a/lib/backend_service/nanodlp/nanodlp_simulated_client.dart b/lib/backend_service/nanodlp/helpers/nano_simulated_client.dart similarity index 94% rename from lib/backend_service/nanodlp/nanodlp_simulated_client.dart rename to lib/backend_service/nanodlp/helpers/nano_simulated_client.dart index 4db75f7..876f896 100644 --- a/lib/backend_service/nanodlp/nanodlp_simulated_client.dart +++ b/lib/backend_service/nanodlp/helpers/nano_simulated_client.dart @@ -4,19 +4,19 @@ * without a physical printer. Behavior is intentionally simple: it * simulates a print job advancing layers over time and responds to * control commands (start/pause/resume/cancel). This implementation -* implements the OdysseyClient interface used by the app. +* implements the BackendClient interface used by the app. */ import 'dart:async'; import 'dart:typed_data'; import 'dart:math' as math; -import 'package:orion/backend_service/odyssey/odyssey_client.dart'; -import 'package:orion/backend_service/nanodlp/nanodlp_thumbnail_generator.dart'; +import 'package:orion/backend_service/backend_client.dart'; +import 'package:orion/backend_service/nanodlp/helpers/nano_thumbnail_generator.dart'; import 'package:orion/backend_service/nanodlp/models/nano_status.dart'; import 'package:orion/backend_service/nanodlp/nanodlp_mappers.dart'; -class NanoDlpSimulatedClient implements OdysseyClient { +class NanoDlpSimulatedClient implements BackendClient { // Simulated job state bool _printing = false; bool _paused = false; @@ -195,6 +195,12 @@ class NanoDlpSimulatedClient implements OdysseyClient { @override Stream> getStatusStream() => _statusController.stream; + @override + Future>> getAnalytics(int n) async { + // Simulated client has no analytics; return empty list. + return []; + } + @override Future usbAvailable() async => false; diff --git a/lib/backend_service/nanodlp/nanodlp_state_handler.dart b/lib/backend_service/nanodlp/helpers/nano_state_handler.dart similarity index 100% rename from lib/backend_service/nanodlp/nanodlp_state_handler.dart rename to lib/backend_service/nanodlp/helpers/nano_state_handler.dart diff --git a/lib/backend_service/nanodlp/nanodlp_thumbnail_generator.dart b/lib/backend_service/nanodlp/helpers/nano_thumbnail_generator.dart similarity index 100% rename from lib/backend_service/nanodlp/nanodlp_thumbnail_generator.dart rename to lib/backend_service/nanodlp/helpers/nano_thumbnail_generator.dart diff --git a/lib/backend_service/nanodlp/models/nano_file.dart b/lib/backend_service/nanodlp/models/nano_file.dart index f9292c7..431aeca 100644 --- a/lib/backend_service/nanodlp/models/nano_file.dart +++ b/lib/backend_service/nanodlp/models/nano_file.dart @@ -24,6 +24,7 @@ class NanoFile { final String? name; final int? layerCount; final double? printTime; // seconds + final int? resinTemperature; // Extended metadata commonly returned by /plates/list/json or similar final int? lastModified; @@ -44,6 +45,7 @@ class NanoFile { this.name, this.layerCount, this.printTime, + this.resinTemperature, this.lastModified, this.parentPath, this.fileSize, @@ -131,6 +133,24 @@ class NanoFile { return numeric; } + int? parseResinTemperature(dynamic v) { + if (v == null) return null; + if (v is int) return v; + if (v is num) return v.toInt(); + if (v is String) { + var s = v.trim().toLowerCase(); + // Remove degree symbol and common suffixes like 'c' or '°c' + s = s.replaceAll('°', '').replaceAll('c', '').trim(); + // Strip any non-number characters except dot, sign and exponent + final numStr = s.replaceAll(RegExp(r'[^0-9+\-.eE]'), ''); + if (numStr.isEmpty) return null; + final d = double.tryParse(numStr); + if (d != null) return d.round(); + return int.tryParse(numStr); + } + return null; + } + String? path = json['path']?.toString() ?? json['Path']?.toString() ?? json['file_path']?.toString() ?? @@ -269,11 +289,18 @@ class NanoFile { parentPath = resolvedPath.substring(0, resolvedPath.lastIndexOf('/')); } + // Try several common keys for resin temperature returned by NanoDLP/status + final resinTemp = parseResinTemperature(json['resin'] ?? + json['Resin'] ?? + json['resin_temperature'] ?? + json['ResinTemperature']); + return NanoFile( path: resolvedPath, name: resolvedName, layerCount: layerCount, printTime: printTime, + resinTemperature: resinTemp, lastModified: finalLastModified, parentPath: parentPath ?? '', fileSize: fileSize, diff --git a/lib/backend_service/nanodlp/nanodlp_http_client.dart b/lib/backend_service/nanodlp/nanodlp_http_client.dart index 30a0614..198487a 100644 --- a/lib/backend_service/nanodlp/nanodlp_http_client.dart +++ b/lib/backend_service/nanodlp/nanodlp_http_client.dart @@ -24,17 +24,17 @@ import 'package:orion/backend_service/nanodlp/models/nano_file.dart'; import 'package:orion/backend_service/nanodlp/models/nano_status.dart'; import 'package:orion/backend_service/nanodlp/models/nano_manual.dart'; import 'package:orion/backend_service/nanodlp/nanodlp_mappers.dart'; -import 'package:orion/backend_service/nanodlp/nanodlp_thumbnail_generator.dart'; +import 'package:orion/backend_service/nanodlp/helpers/nano_thumbnail_generator.dart'; import 'package:flutter/foundation.dart'; -import 'package:orion/backend_service/odyssey/odyssey_client.dart'; +import 'package:orion/backend_service/backend_client.dart'; import 'package:orion/util/orion_config.dart'; /// NanoDLP adapter (initial implementation) /// -/// Implements a small subset of the `OdysseyClient` contract needed for +/// Implements a small subset of the `BackendClient` contract needed for /// StatusProvider and thumbnail fetching. Other methods remain unimplemented /// and should be added as needed. -class NanoDlpHttpClient implements OdysseyClient { +class NanoDlpHttpClient implements BackendClient { late final String apiUrl; final _log = Logger('NanoDlpHttpClient'); final http.Client Function() _clientFactory; @@ -264,6 +264,29 @@ class NanoDlpHttpClient implements OdysseyClient { } } + @override + Future>> getAnalytics(int n) async { + final baseNoSlash = apiUrl.replaceAll(RegExp(r'/+$'), ''); + final uri = Uri.parse('$baseNoSlash/analytic/data/$n'); + final client = _createClient(); + try { + final resp = await client.get(uri); + if (resp.statusCode != 200) return []; + final decoded = json.decode(resp.body); + if (decoded is List) { + return decoded + .whereType>() + .toList(growable: false); + } + return []; + } catch (e, st) { + _log.fine('NanoDLP getAnalytics failed', e, st); + return []; + } finally { + client.close(); + } + } + @override Future getFileThumbnail( String location, String filePath, String size) async { diff --git a/lib/backend_service/nanodlp/nanodlp_mappers.dart b/lib/backend_service/nanodlp/nanodlp_mappers.dart index 574b4ca..6d47a79 100644 --- a/lib/backend_service/nanodlp/nanodlp_mappers.dart +++ b/lib/backend_service/nanodlp/nanodlp_mappers.dart @@ -16,7 +16,7 @@ */ import 'package:orion/backend_service/nanodlp/models/nano_status.dart'; -import 'package:orion/backend_service/nanodlp/nanodlp_state_handler.dart'; +import 'package:orion/backend_service/nanodlp/helpers/nano_state_handler.dart'; /// Map NanoDLP DTOs into Odyssey-shaped maps expected by StatusModel.fromJson Map nanoStatusToOdysseyMap(NanoStatus ns) { @@ -109,5 +109,13 @@ Map nanoStatusToOdysseyMap(NanoStatus ns) { 'finished': finished, }; + // Preserve a few original numeric fields from the NanoDLP payload so + // consumers that expect the raw keys (e.g., StatusProvider parsing logic) + // can access them. These are derived from the parsed NanoStatus fields. + // Keep keys lowercase to match common NanoDLP payloads. + result['resin'] = ns.resinLevel; + result['temp'] = ns.temp; + result['mcu'] = ns.mcuTemp; + return result; } diff --git a/lib/backend_service/odyssey/odyssey_http_client.dart b/lib/backend_service/odyssey/odyssey_http_client.dart index 82fe6f7..95ea6c9 100644 --- a/lib/backend_service/odyssey/odyssey_http_client.dart +++ b/lib/backend_service/odyssey/odyssey_http_client.dart @@ -20,11 +20,11 @@ import 'dart:async'; import 'dart:convert'; import 'package:http/http.dart' as http; import 'package:logging/logging.dart'; -import 'package:orion/backend_service/odyssey/odyssey_client.dart'; +import 'package:orion/backend_service/backend_client.dart'; import 'package:orion/util/orion_config.dart'; -import 'package:orion/backend_service/nanodlp/nanodlp_thumbnail_generator.dart'; +import 'package:orion/backend_service/nanodlp/helpers/nano_thumbnail_generator.dart'; -class OdysseyHttpClient implements OdysseyClient { +class OdysseyHttpClient implements BackendClient { late final String apiUrl; final _log = Logger('OdysseyHttpClient'); final http.Client Function() _clientFactory; @@ -103,6 +103,26 @@ class OdysseyHttpClient implements OdysseyClient { return json.decode(resp.body) as Map; } + @override + Future>> getAnalytics(int n) async { + // Odyssey doesn't currently define a standard analytics endpoint. As a + // best-effort, try '/analytic/data/' on Odyssey host; otherwise return + // an empty list. + try { + final uri = _dynUri(apiUrl, '/analytic/data/$n', {}); + final client = _createClient(); + final resp = await client.get(uri); + client.close(); + if (resp.statusCode != 200) return []; + final decoded = json.decode(resp.body); + if (decoded is List) + return decoded + .whereType>() + .toList(growable: false); + } catch (_) {} + return []; + } + @override Future>> getNotifications() async { try { diff --git a/lib/backend_service/providers/config_provider.dart b/lib/backend_service/providers/config_provider.dart index a61c744..a799249 100644 --- a/lib/backend_service/providers/config_provider.dart +++ b/lib/backend_service/providers/config_provider.dart @@ -1,12 +1,12 @@ import 'package:flutter/material.dart'; import 'package:logging/logging.dart'; -import 'package:orion/backend_service/odyssey/odyssey_client.dart'; +import 'package:orion/backend_service/backend_client.dart'; import 'package:orion/backend_service/backend_service.dart'; import 'package:orion/backend_service/odyssey/models/config_models.dart'; class ConfigProvider extends ChangeNotifier { - final OdysseyClient _client; + final BackendClient _client; final _log = Logger('ConfigProvider'); ConfigModel? _config; @@ -18,7 +18,7 @@ class ConfigProvider extends ChangeNotifier { Object? _error; Object? get error => _error; - ConfigProvider({OdysseyClient? client}) + ConfigProvider({BackendClient? client}) : _client = client ?? BackendService() { // Don't call refresh synchronously during construction — when the // provider is created inside widget build (e.g. `create: (_) => diff --git a/lib/backend_service/providers/files_provider.dart b/lib/backend_service/providers/files_provider.dart index 592dc09..680ec3d 100644 --- a/lib/backend_service/providers/files_provider.dart +++ b/lib/backend_service/providers/files_provider.dart @@ -8,7 +8,7 @@ import 'dart:async'; import 'package:flutter/material.dart'; import 'package:logging/logging.dart'; -import 'package:orion/backend_service/odyssey/odyssey_client.dart'; +import 'package:orion/backend_service/backend_client.dart'; import 'package:orion/backend_service/backend_service.dart'; import 'package:orion/backend_service/odyssey/models/files_models.dart'; import 'package:orion/util/orion_api_filesystem/orion_api_file.dart'; @@ -22,7 +22,7 @@ import 'package:orion/util/orion_api_filesystem/orion_api_item.dart'; /// * Expose current directory, loading and error state /// * Perform file actions: delete, start print, refresh class FilesProvider extends ChangeNotifier { - final OdysseyClient _client; + final BackendClient _client; final _log = Logger('FilesProvider'); FilesListModel? _listing; @@ -43,7 +43,7 @@ class FilesProvider extends ChangeNotifier { String _subdirectory = ''; String get subdirectory => _subdirectory; - FilesProvider({OdysseyClient? client}) : _client = client ?? BackendService(); + FilesProvider({BackendClient? client}) : _client = client ?? BackendService(); /// Load items into provider state (convenience wrapper around listItemsAsOrionApiItems) Future loadItems(String location, String subdirectory, diff --git a/lib/backend_service/providers/manual_provider.dart b/lib/backend_service/providers/manual_provider.dart index 7bef35b..caf5c04 100644 --- a/lib/backend_service/providers/manual_provider.dart +++ b/lib/backend_service/providers/manual_provider.dart @@ -17,14 +17,14 @@ import 'package:flutter/foundation.dart'; import 'package:logging/logging.dart'; -import 'package:orion/backend_service/odyssey/odyssey_client.dart'; +import 'package:orion/backend_service/backend_client.dart'; import 'package:orion/backend_service/backend_service.dart'; /// Provider that exposes manual hardware controls (move, home, cure, commands, -/// and display test) using the `OdysseyClient` abstraction so screens do not +/// and display test) using the `BackendClient` abstraction so screens do not /// depend on the concrete ApiService implementation. class ManualProvider extends ChangeNotifier { - final OdysseyClient _client; + final BackendClient _client; final _log = Logger('ManualProvider'); bool _busy = false; @@ -33,7 +33,7 @@ class ManualProvider extends ChangeNotifier { Object? _error; Object? get error => _error; - ManualProvider({OdysseyClient? client}) + ManualProvider({BackendClient? client}) : _client = client ?? BackendService(); Future move(double height) async { diff --git a/lib/backend_service/providers/notification_provider.dart b/lib/backend_service/providers/notification_provider.dart index ff4744a..30d50bf 100644 --- a/lib/backend_service/providers/notification_provider.dart +++ b/lib/backend_service/providers/notification_provider.dart @@ -19,7 +19,7 @@ import 'dart:async'; import 'package:flutter/material.dart'; import 'package:logging/logging.dart'; import 'package:orion/backend_service/backend_service.dart'; -import 'package:orion/backend_service/odyssey/odyssey_client.dart'; +import 'package:orion/backend_service/backend_client.dart'; import 'package:orion/util/orion_config.dart'; /// A simple notification model used locally. @@ -41,7 +41,7 @@ class NotificationItem { } class NotificationProvider extends ChangeNotifier { - final OdysseyClient _client; + final BackendClient _client; final _log = Logger('NotificationProvider'); Timer? _timer; @@ -65,7 +65,7 @@ class NotificationProvider extends ChangeNotifier { return copy; } - NotificationProvider({OdysseyClient? client}) + NotificationProvider({BackendClient? client}) : _client = client ?? BackendService() { _start(); } diff --git a/lib/backend_service/providers/print_provider.dart b/lib/backend_service/providers/print_provider.dart index 6c6158e..440e3f6 100644 --- a/lib/backend_service/providers/print_provider.dart +++ b/lib/backend_service/providers/print_provider.dart @@ -1,13 +1,13 @@ import 'package:flutter/foundation.dart'; import 'package:logging/logging.dart'; -import 'package:orion/backend_service/odyssey/odyssey_client.dart'; +import 'package:orion/backend_service/backend_client.dart'; import 'package:orion/backend_service/backend_service.dart'; /// Provider to encapsulate print-related actions (start, cancel, pause, resume) /// and expose simple busy/error state for UI wiring. class PrintProvider extends ChangeNotifier { - final OdysseyClient _client; + final BackendClient _client; final _log = Logger('PrintProvider'); bool _busy = false; @@ -16,7 +16,7 @@ class PrintProvider extends ChangeNotifier { Object? _error; Object? get error => _error; - PrintProvider({OdysseyClient? client}) : _client = client ?? BackendService(); + PrintProvider({BackendClient? client}) : _client = client ?? BackendService(); Future startPrint(String location, String filePath) async { _log.info('startPrint: $location/$filePath'); diff --git a/lib/backend_service/providers/status_provider.dart b/lib/backend_service/providers/status_provider.dart index a9fa127..89e25a5 100644 --- a/lib/backend_service/providers/status_provider.dart +++ b/lib/backend_service/providers/status_provider.dart @@ -21,13 +21,13 @@ import 'dart:math'; import 'package:flutter/material.dart'; import 'package:logging/logging.dart'; -import 'package:orion/backend_service/odyssey/odyssey_client.dart'; +import 'package:orion/backend_service/backend_client.dart'; import 'package:orion/backend_service/backend_service.dart'; import 'package:orion/util/orion_config.dart'; import 'package:orion/backend_service/odyssey/models/status_models.dart'; import 'dart:typed_data'; import 'package:orion/util/thumbnail_cache.dart'; -import 'package:orion/backend_service/nanodlp/nanodlp_thumbnail_generator.dart'; +import 'package:orion/backend_service/nanodlp/helpers/nano_thumbnail_generator.dart'; import 'package:orion/util/orion_api_filesystem/orion_api_file.dart'; /// Polls the backend `/status` endpoint and exposes a typed [StatusModel]. @@ -38,11 +38,12 @@ import 'package:orion/util/orion_api_filesystem/orion_api_file.dart'; /// * Lazy thumbnail fetching and caching /// * Convenience accessors for the UI class StatusProvider extends ChangeNotifier { - final OdysseyClient _client; + final BackendClient _client; final _log = Logger('StatusProvider'); StatusModel? _status; String? _deviceStatusMessage; + int? _resinTemperature; /// Optional raw device-provided status message (e.g. NanoDLP "Status" /// field). When present this may be used to override the app bar title @@ -51,6 +52,9 @@ class StatusProvider extends ChangeNotifier { String? get deviceStatusMessage => _deviceStatusMessage; StatusModel? get status => _status; + /// Current resin temperature reported by the backend (degrees Celsius). + int? get resinTemperature => _resinTemperature; + bool _loading = true; bool get isLoading => _loading; @@ -154,7 +158,7 @@ class StatusProvider extends ChangeNotifier { bool? get sseSupported => _sseSupported; - StatusProvider({OdysseyClient? client}) + StatusProvider({BackendClient? client}) : _client = client ?? BackendService() { // Prefer an SSE subscription when the backend supports it. If the // connection fails we fall back to the existing polling loop. See @@ -222,7 +226,7 @@ class StatusProvider extends ChangeNotifier { // If config read fails, proceed to attempt SSE as a best-effort. } - _log.info('Attempting SSE subscription via OdysseyClient.getStatusStream'); + _log.info('Attempting SSE subscription via BackendClient.getStatusStream'); try { final stream = _client.getStatusStream(); // When SSE becomes active, cancel any existing polling loop so we rely @@ -244,6 +248,33 @@ class StatusProvider extends ChangeNotifier { } catch (_) { _deviceStatusMessage = null; } + // Capture resin temperature if the backend provides it (common NanoDLP fields) + try { + final maybeTemp = raw['resin'] ?? + raw['Resin'] ?? + raw['resin_temperature'] ?? + raw['ResinTemperature']; + int? parsedTemp; + if (maybeTemp == null) { + parsedTemp = null; + } else if (maybeTemp is num) { + parsedTemp = maybeTemp.toInt(); + } else { + final s = maybeTemp + .toString() + .trim() + .toLowerCase() + .replaceAll('°', '') + .replaceAll('c', '') + .trim(); + final numStr = s.replaceAll(RegExp(r'[^0-9+\-.eE]'), ''); + parsedTemp = + double.tryParse(numStr)?.round() ?? int.tryParse(numStr); + } + _resinTemperature = parsedTemp; + } catch (_) { + // ignore parsing errors and leave _resinTemperature unchanged + } final parsed = StatusModel.fromJson(raw); // (previous snapshot removed) transitional clears now rely on the // parsed payload directly. @@ -481,6 +512,32 @@ class StatusProvider extends ChangeNotifier { } catch (_) { _deviceStatusMessage = null; } + // Capture resin temperature if available + try { + final maybeTemp = raw['resin'] ?? + raw['Resin'] ?? + raw['resin_temperature'] ?? + raw['ResinTemperature']; + int? parsedTemp; + if (maybeTemp == null) { + parsedTemp = null; + } else if (maybeTemp is num) { + parsedTemp = maybeTemp.toInt(); + } else { + final s = maybeTemp + .toString() + .trim() + .toLowerCase() + .replaceAll('°', '') + .replaceAll('c', '') + .trim(); + final numStr = s.replaceAll(RegExp(r'[^0-9+\-.eE]'), ''); + parsedTemp = double.tryParse(numStr)?.round() ?? int.tryParse(numStr); + } + _resinTemperature = parsedTemp; + } catch (_) { + // ignore + } final parsed = StatusModel.fromJson(raw); // Compute fingerprint difference to detect meaningful changes that // should update the UI (z/layer/progress/etc.). This allows the diff --git a/lib/util/sl1_thumbnail.dart b/lib/util/sl1_thumbnail.dart index f953862..6d1bd40 100644 --- a/lib/util/sl1_thumbnail.dart +++ b/lib/util/sl1_thumbnail.dart @@ -18,9 +18,9 @@ import 'dart:io'; import 'package:logging/logging.dart'; import 'package:orion/backend_service/backend_service.dart'; -import 'package:orion/backend_service/odyssey/odyssey_client.dart'; +import 'package:orion/backend_service/backend_client.dart'; import 'package:flutter/foundation.dart'; -import 'package:orion/backend_service/nanodlp/nanodlp_thumbnail_generator.dart'; +import 'package:orion/backend_service/nanodlp/helpers/nano_thumbnail_generator.dart'; import 'package:path_provider/path_provider.dart'; import 'package:path/path.dart' as p; @@ -32,8 +32,8 @@ class ThumbnailUtil { /// which forwards to the existing `ApiService` implementation. static Future extractThumbnail( String location, String subdirectory, String filename, - {String size = "Small", OdysseyClient? client}) async { - final OdysseyClient odysseyClient = client ?? BackendService(); + {String size = "Small", BackendClient? client}) async { + final BackendClient odysseyClient = client ?? BackendService(); try { // Build a safe relative path for the file on the server. Normalize // separators and strip any leading slashes so we never request @@ -138,8 +138,8 @@ class ThumbnailUtil { /// janking the UI thread. static Future extractThumbnailBytes( String location, String subdirectory, String filename, - {String size = "Small", OdysseyClient? client}) async { - final OdysseyClient odysseyClient = client ?? BackendService(); + {String size = "Small", BackendClient? client}) async { + final BackendClient odysseyClient = client ?? BackendService(); try { String finalLocation = _isDefaultDir(subdirectory) ? filename diff --git a/test/backend/nanodlp_state_handler_test.dart b/test/backend/nanodlp_state_handler_test.dart index f3547b8..f23f533 100644 --- a/test/backend/nanodlp_state_handler_test.dart +++ b/test/backend/nanodlp_state_handler_test.dart @@ -16,7 +16,7 @@ */ import 'package:flutter_test/flutter_test.dart'; -import 'package:orion/backend_service/nanodlp/nanodlp_state_handler.dart'; +import 'package:orion/backend_service/nanodlp/helpers/nano_state_handler.dart'; import 'package:orion/backend_service/nanodlp/models/nano_status.dart'; void main() { diff --git a/test/fakes/fake_odyssey_client.dart b/test/fakes/fake_odyssey_client.dart index 1661418..5ecb026 100644 --- a/test/fakes/fake_odyssey_client.dart +++ b/test/fakes/fake_odyssey_client.dart @@ -18,10 +18,10 @@ import 'dart:typed_data'; import 'dart:async'; -import 'package:orion/backend_service/odyssey/odyssey_client.dart'; +import 'package:orion/backend_service/backend_client.dart'; /// Simple fake client used by unit tests to assert ManualProvider behavior. -class FakeOdysseyClient implements OdysseyClient { +class FakeBackendClient implements BackendClient { bool moveCalled = false; double? lastMoveHeight; bool manualHomeCalled = false; @@ -166,4 +166,10 @@ class FakeOdysseyClient implements OdysseyClient { // Return empty bytes which callers should handle as placeholder. return Uint8List(0); } + + @override + Future>> getAnalytics(int n) { + // TODO: implement getAnalytics + throw UnimplementedError(); + } } diff --git a/test/fakes/fake_odyssey_client_for_thumbnail_test.dart b/test/fakes/fake_odyssey_client_for_thumbnail_test.dart index fcdf4c5..8383a5f 100644 --- a/test/fakes/fake_odyssey_client_for_thumbnail_test.dart +++ b/test/fakes/fake_odyssey_client_for_thumbnail_test.dart @@ -18,11 +18,11 @@ import 'dart:async'; import 'dart:typed_data'; -import 'package:orion/backend_service/odyssey/odyssey_client.dart'; +import 'package:orion/backend_service/backend_client.dart'; -class FakeOdysseyClientForThumbnailTest implements OdysseyClient { +class FakeBackendClientForThumbnailTest implements BackendClient { final Uint8List bytes; - FakeOdysseyClientForThumbnailTest(this.bytes); + FakeBackendClientForThumbnailTest(this.bytes); @override Future getFileThumbnail( @@ -166,4 +166,10 @@ class FakeOdysseyClientForThumbnailTest implements OdysseyClient { // no-op for this fake return; } + + @override + Future>> getAnalytics(int n) { + // TODO: implement getAnalytics + throw UnimplementedError(); + } } diff --git a/test/manual_provider_test.dart b/test/manual_provider_test.dart index 415999e..7c25c76 100644 --- a/test/manual_provider_test.dart +++ b/test/manual_provider_test.dart @@ -5,7 +5,7 @@ import 'fakes/fake_odyssey_client.dart'; void main() { group('ManualProvider', () { test('move forwards to client and toggles busy flag', () async { - final fake = FakeOdysseyClient(); + final fake = FakeBackendClient(); final provider = ManualProvider(client: fake); expect(provider.busy, isFalse); @@ -20,7 +20,7 @@ void main() { }); test('move handles client exception gracefully', () async { - final fake = FakeOdysseyClient(); + final fake = FakeBackendClient(); fake.throwOnMove = true; final provider = ManualProvider(client: fake); @@ -32,7 +32,7 @@ void main() { }); test('manualHome forwards correctly', () async { - final fake = FakeOdysseyClient(); + final fake = FakeBackendClient(); final provider = ManualProvider(client: fake); final ok = await provider.manualHome(); expect(ok, isTrue); @@ -40,7 +40,7 @@ void main() { }); test('manualCommand forwards correctly', () async { - final fake = FakeOdysseyClient(); + final fake = FakeBackendClient(); final provider = ManualProvider(client: fake); final ok = await provider.manualCommand('M112'); expect(ok, isTrue); @@ -48,7 +48,7 @@ void main() { }); test('manualCure and displayTest forwards correctly', () async { - final fake = FakeOdysseyClient(); + final fake = FakeBackendClient(); final provider = ManualProvider(client: fake); final ok1 = await provider.manualCure(true); final ok2 = await provider.displayTest('Grid'); diff --git a/test/nanodlp/finished_flow_test.dart b/test/nanodlp/finished_flow_test.dart index 77f967e..b06628c 100644 --- a/test/nanodlp/finished_flow_test.dart +++ b/test/nanodlp/finished_flow_test.dart @@ -17,7 +17,7 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:orion/backend_service/nanodlp/models/nano_status.dart'; -import 'package:orion/backend_service/nanodlp/nanodlp_state_handler.dart'; +import 'package:orion/backend_service/nanodlp/helpers/nano_state_handler.dart'; import 'package:orion/backend_service/nanodlp/nanodlp_mappers.dart'; import 'package:orion/backend_service/odyssey/models/status_models.dart'; diff --git a/test/nanodlp_thumbnail_generator_test.dart b/test/nanodlp_thumbnail_generator_test.dart index 383964a..0f83043 100644 --- a/test/nanodlp_thumbnail_generator_test.dart +++ b/test/nanodlp_thumbnail_generator_test.dart @@ -2,7 +2,7 @@ import 'dart:typed_data'; import 'package:flutter_test/flutter_test.dart'; import 'package:image/image.dart' as img; -import 'package:orion/backend_service/nanodlp/nanodlp_thumbnail_generator.dart'; +import 'package:orion/backend_service/nanodlp/helpers/nano_thumbnail_generator.dart'; void main() { group('NanoDlpThumbnailGenerator', () { diff --git a/test/thumbnail_util_test.dart b/test/thumbnail_util_test.dart index 1c62e51..fefa539 100644 --- a/test/thumbnail_util_test.dart +++ b/test/thumbnail_util_test.dart @@ -35,7 +35,7 @@ void main() { return null; }); final data = Uint8List.fromList(List.generate(16, (i) => i % 256)); - final fake = FakeOdysseyClientForThumbnailTest(data); + final fake = FakeBackendClientForThumbnailTest(data); final path = await ThumbnailUtil.extractThumbnail('local', '', 'test.sl1', client: fake); From 5ea6e127f5943f347c2af0b1ff788a7f4bcb52d5 Mon Sep 17 00:00:00 2001 From: PaulGD03 Date: Wed, 15 Oct 2025 17:49:58 +0200 Subject: [PATCH 33/44] fix(files: details_screen): show filename + modified time in AppBar, remove duplicate Modified Date card, and tidy landscape layout --- lib/files/details_screen.dart | 92 +++++++++++++++++++++++++++-------- 1 file changed, 73 insertions(+), 19 deletions(-) diff --git a/lib/files/details_screen.dart b/lib/files/details_screen.dart index 03dcbcb..b515ed2 100644 --- a/lib/files/details_screen.dart +++ b/lib/files/details_screen.dart @@ -143,8 +143,76 @@ class DetailScreenState extends State { return GlassApp( child: Scaffold( appBar: AppBar( - title: Text(_meta?.fileData.name ?? widget.fileName), centerTitle: true, + title: Builder(builder: (context) { + // Use a single base font size for both title lines so they appear + // visually consistent. If the AppBar theme provides a title + // fontSize, use that as the base; otherwise default to 14 and + // reduce slightly. + final baseFontSize = + (Theme.of(context).appBarTheme.titleTextStyle?.fontSize ?? 14) - + 10; + + return Column( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisSize: MainAxisSize.min, + children: [ + Text( + widget.fileName.isNotEmpty ? widget.fileName : 'No file', + textAlign: TextAlign.center, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: Theme.of(context).appBarTheme.titleTextStyle?.copyWith( + fontSize: baseFontSize, + fontWeight: FontWeight.normal, + color: Theme.of(context) + .appBarTheme + .titleTextStyle + ?.color + ?.withValues(alpha: 0.95), + ), + ), + const SizedBox(height: 2), + Text( + _meta != null + ? DateTime.fromMillisecondsSinceEpoch( + _meta!.fileData.lastModified * 1000) + .toString() + .split('.') + .first + : '', + textAlign: TextAlign.center, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: Theme.of(context) + .appBarTheme + .titleTextStyle + ?.merge(TextStyle( + fontWeight: FontWeight.normal, + fontSize: baseFontSize, + )) + .copyWith( + // Make status less visually dominant by lowering + // its alpha relative to the AppBar title color. + color: Theme.of(context) + .appBarTheme + .titleTextStyle + ?.color + ?.withValues(alpha: 0.65), + ) ?? + TextStyle( + fontSize: baseFontSize, + fontWeight: FontWeight.normal, + color: Theme.of(context) + .appBarTheme + .titleTextStyle + ?.color + ?.withValues(alpha: 0.65), + ), + ), + ], + ); + }), ), body: Center( child: loading @@ -227,14 +295,6 @@ class DetailScreenState extends State { ), ]), const SizedBox(height: 5), - buildInfoCard( - 'Modified Date', - _meta != null - ? DateTime.fromMillisecondsSinceEpoch( - _meta!.fileData.lastModified * 1000) - .toString() - : '-', - ), const Spacer(), buildPrintButtons(), ], @@ -255,8 +315,9 @@ class DetailScreenState extends State { children: [ Expanded( flex: 1, - child: ListView( + child: Column( children: [ + Spacer(), buildInfoCard( 'Layer Height', _meta?.layerHeight != null @@ -273,19 +334,12 @@ class DetailScreenState extends State { ? _meta!.formattedPrintTime : '-', ), - buildInfoCard( - 'Modified Date', - _meta != null - ? DateTime.fromMillisecondsSinceEpoch( - _meta!.fileData.lastModified * 1000) - .toString() - : '-', - ), buildInfoCard( 'File Size', _meta?.fileData.fileSize != null ? '${(_meta!.fileData.fileSize! / 1024 / 1024).toStringAsFixed(2)} MB' - : '-') + : '-'), + Spacer(), ], ), ), From 692b1c81d570f30cc34dd7949b5a371c798999f8 Mon Sep 17 00:00:00 2001 From: PaulGD03 Date: Wed, 15 Oct 2025 17:50:20 +0200 Subject: [PATCH 34/44] feat(backend_service): add AnalyticsProvider to fetch telemetry via SSE or polling Add AnalyticsProvider ChangeNotifier that retrieves recent analytics/telemetry snapshots. Uses BackendClient.getStatusStream (SSE) when available and falls back to polling for NanoDLP or on SSE errors. Normalizes NanoDLP analytics into a nano_analytics map and exposes helpers (analyticsByKey, getSeriesForKey, getLatestForKey). Implements exponential backoff with jitter on consecutive errors and manages polling/SSE lifecycle and disposal. --- .../providers/analytics_provider.dart | 238 ++++++++++++++++++ 1 file changed, 238 insertions(+) create mode 100644 lib/backend_service/providers/analytics_provider.dart diff --git a/lib/backend_service/providers/analytics_provider.dart b/lib/backend_service/providers/analytics_provider.dart new file mode 100644 index 0000000..f48ebf4 --- /dev/null +++ b/lib/backend_service/providers/analytics_provider.dart @@ -0,0 +1,238 @@ +/* + * Orion - Analytics Provider + * + * Lightweight provider that fetches recent analytics/telemetry snapshots + * from the backend. For NanoDLP we poll at a fixed interval (polling-only + * backends). For Odyssey we attempt to subscribe to an SSE-style stream + * and fall back to polling on error. + */ +import 'dart:async'; +import 'dart:math'; + +import 'package:flutter/foundation.dart'; +import 'package:logging/logging.dart'; +import 'package:orion/backend_service/backend_service.dart'; +import 'package:orion/backend_service/backend_client.dart'; +import 'package:orion/util/orion_config.dart'; +import 'package:orion/backend_service/nanodlp/helpers/nano_analytics_config.dart'; + +class AnalyticsProvider extends ChangeNotifier { + final BackendClient _client; + final _log = Logger('AnalyticsProvider'); + + Map? _analytics; + Map? get analytics => _analytics; + + /// Convenience map: when NanoDLP analytics are present this contains a + /// mapping from metric key (e.g. 'Pressure') to list of {id, v} entries. + Map>> get analyticsByKey { + final a = _analytics; + if (a == null) return {}; + if (a.containsKey('nano_analytics')) { + try { + final Map>> byId = + Map>>.from(a['nano_analytics']); + final Map>> mapped = {}; + byId.forEach((id, list) { + final key = idToKey(id) ?? id.toString(); + mapped[key] = list; + }); + return mapped; + } catch (_) { + return {}; + } + } + return {}; + } + + List> getSeriesForKey(String key) { + return analyticsByKey[key] ?? []; + } + + dynamic getLatestForKey(String key) { + final series = getSeriesForKey(key); + if (series.isEmpty) return null; + final last = series.last; + return last['v']; + } + + bool _loading = true; + bool get isLoading => _loading; + + Object? _error; + Object? get error => _error; + + bool _disposed = false; + + // Polling state + bool _polling = false; + int _pollIntervalSeconds = 5; + static const int _minPollIntervalSeconds = 2; + static const int _maxPollIntervalSeconds = 60; + int _consecutiveErrors = 0; + bool _fetchInFlight = false; + + // SSE state + bool _sseConnected = false; + StreamSubscription>? _sseSub; + + AnalyticsProvider({BackendClient? client}) + : _client = client ?? BackendService() { + // Try SSE when appropriate; NanoDLP is polling-only so it will skip. + _tryStartSse(); + } + + void _startPolling() { + if (_polling || _sseConnected || _disposed) return; + _polling = true; + Future(() async { + try { + await refresh(); + while (!_disposed && _polling && !_sseConnected) { + try { + await Future.delayed(Duration(seconds: _pollIntervalSeconds)); + } catch (_) {} + if (_disposed || !_polling || _sseConnected) break; + await refresh(); + } + } finally { + _polling = false; + } + }); + } + + Future _tryStartSse() async { + if (_sseConnected || _disposed) return; + try { + final cfg = OrionConfig(); + final isNano = cfg.isNanoDlpMode(); + if (isNano) { + _log.fine('NanoDLP mode: AnalyticsProvider using polling'); + _startPolling(); + return; + } + } catch (_) { + // ignore and attempt SSE as a best-effort + } + + _log.fine( + 'Attempting Analytics SSE subscription via BackendClient.getStatusStream'); + try { + final stream = _client.getStatusStream(); + _sseConnected = true; + _sseSub = stream.listen((raw) { + try { + // The status stream may include periodic telemetry; treat the + // incoming status object as the latest analytics snapshot. + _analytics = raw; + _error = null; + _loading = false; + } catch (e) { + _log.warning('Failed to handle analytics SSE payload', e); + } + if (!_disposed) notifyListeners(); + }, onError: (err, st) { + _log.warning( + 'Analytics SSE stream error, falling back to polling', err, st); + _closeSse(); + if (!_disposed) _startPolling(); + }, onDone: () { + _log.info( + 'Analytics SSE stream closed by server; falling back to polling'); + _closeSse(); + if (!_disposed) _startPolling(); + }, cancelOnError: true); + } catch (e) { + _log.info('Analytics SSE subscription failed; using polling', e); + _sseConnected = false; + if (!_disposed) _startPolling(); + } + } + + void _closeSse() { + _sseConnected = false; + try { + _sseSub?.cancel(); + } catch (_) {} + _sseSub = null; + } + + Future refresh() async { + if (_fetchInFlight || _disposed) return; + _fetchInFlight = true; + final startedAt = DateTime.now(); + try { + // If configured for NanoDLP, use the NanoDLP-specific analytics + // endpoint which returns a list of recent analytic samples. + try { + final cfg = OrionConfig(); + if (cfg.isNanoDlpMode()) { + final list = await _client.getAnalytics(200); + // Normalize into a map keyed by the metric id (T) -> list of + // {id: timestamp, v: value} entries for easier consumption. + final Map>> grouped = {}; + for (final item in list) { + try { + final t = item['T']; + final id = item['ID']; + final v = item['V']; + final tid = t is int ? t : int.tryParse(t?.toString() ?? ''); + if (tid == null) continue; + grouped.putIfAbsent(tid, () => []).add({'id': id, 'v': v}); + } catch (_) { + continue; + } + } + _analytics = {'nano_analytics': grouped}; + } else { + final raw = await _client.getStatus(); + _analytics = raw; + } + } catch (e) { + // Fall back to status snapshot if analytics endpoint fails. + final raw = await _client.getStatus(); + _analytics = raw; + } + _error = null; + _loading = false; + _consecutiveErrors = 0; + _pollIntervalSeconds = _minPollIntervalSeconds; + if (!_disposed) notifyListeners(); + } catch (e) { + _log.warning('Analytics refresh failed', e); + _error = e; + _loading = false; + _consecutiveErrors = min(_consecutiveErrors + 1, 1000); + final backoff = _computeBackoff(_consecutiveErrors, + base: _minPollIntervalSeconds, max: _maxPollIntervalSeconds); + _pollIntervalSeconds = backoff; + _log.fine( + 'Backing off analytics polling for ${backoff}s (attempt $_consecutiveErrors)'); + } finally { + _fetchInFlight = false; + if (!_disposed) { + final elapsed = DateTime.now().difference(startedAt); + _log.finer('Analytics refresh took ${elapsed.inMilliseconds}ms'); + } + } + } + + int _computeBackoff(int attempts, {required int base, required int max}) { + final raw = base * pow(2, attempts); + int secs = raw.toInt(); + if (secs > max) secs = max; + final rand = Random(); + final jitter = rand.nextInt((secs ~/ 2) + 1); + secs = secs + jitter; + if (secs > max) secs = max; + return secs; + } + + @override + void dispose() { + _disposed = true; + _closeSse(); + _polling = false; + super.dispose(); + } +} From 0319eac4df74296a5521f7c6eb8591eeb05ef62e Mon Sep 17 00:00:00 2001 From: PaulGD03 Date: Wed, 15 Oct 2025 17:51:02 +0200 Subject: [PATCH 35/44] feat(status_screen): display resin temperature in AppBar, tidy landscape info layout, and update NanoDLP thumbnail import path --- lib/status/status_screen.dart | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/lib/status/status_screen.dart b/lib/status/status_screen.dart index c90e7c0..aa4458d 100644 --- a/lib/status/status_screen.dart +++ b/lib/status/status_screen.dart @@ -22,7 +22,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/foundation.dart'; import 'package:provider/provider.dart'; import 'dart:typed_data'; -import 'package:orion/backend_service/nanodlp/nanodlp_thumbnail_generator.dart'; +import 'package:orion/backend_service/nanodlp/helpers/nano_thumbnail_generator.dart'; import 'package:orion/files/grid_files_screen.dart'; import 'package:orion/glasser/glasser.dart'; @@ -284,6 +284,33 @@ class StatusScreenState extends State { appBar: AppBar( automaticallyImplyLeading: false, centerTitle: true, + actions: [ + Padding( + padding: const EdgeInsets.only(right: 16), + child: Builder(builder: (context) { + final provider = Provider.of(context); + final int? temp = provider.resinTemperature; + return GlassCard( + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 8, vertical: 6), + child: Row( + children: [ + Icon(Icons.thermostat, + size: 20, + color: + Theme.of(context).colorScheme.primary), + const SizedBox(width: 6), + Text( + '$temp\u00B0C', + style: TextStyle(fontSize: 18), + ), + const SizedBox(width: 8), + ], + ))); + }), + ), + ], title: Builder(builder: (context) { final deviceMsg = provider.deviceStatusMessage; final statusText = @@ -462,7 +489,8 @@ class StatusScreenState extends State { child: Row(children: [ Expanded( flex: 1, - child: ListView(children: [ + child: Column(children: [ + Spacer(), _buildInfoCard( 'Current Z Position', '${statusModel?.physicalState.z.toStringAsFixed(3) ?? '-'} mm', @@ -480,6 +508,7 @@ class StatusScreenState extends State { ? '-' : '${usedMaterial.toStringAsFixed(2)} mL', ), + Spacer(), ]), ), const SizedBox(width: 16.0), From 3cc1e0c7251b686e3957f4f081b9f2ec679d5e47 Mon Sep 17 00:00:00 2001 From: PaulGD03 Date: Thu, 16 Oct 2025 00:30:49 +0200 Subject: [PATCH 36/44] feat(backend_service): add getAnalyticValue and refactor AnalyticsProvider - Add BackendClient.getAnalyticValue(int) to expose a scalar analytic endpoint (e.g. /analytic/value/) so callers can request a single metric quickly. - Implement getAnalyticValue in NanoDlpHttpClient (HTTP GET, parse numeric/JSON, return null on error). Odyssey, simulated and test fakes return null. - Forward new API through BackendService to the selected delegate. - Refactor AnalyticsProvider: - Simplify provider to a single polling loop (configurable 10 Hz). - Fast-path uses getAnalyticValue for the pressure metric (id 6) to append samples to an in-memory pressureSeries and publish a normalized 'nano_analytics' snapshot. - Falls back to getAnalytics batch call when scalar value is unavailable. - Remove SSE subscription / backoff complexity and related state. - Keep pressure series bounded to recent samples. - Update simulated and fake backend clients to implement the new method (returning null). --- lib/backend_service/backend_client.dart | 4 + lib/backend_service/backend_service.dart | 3 + .../helpers/nano_simulated_client.dart | 6 + .../nanodlp/nanodlp_http_client.dart | 27 ++ .../odyssey/odyssey_http_client.dart | 7 + .../providers/analytics_provider.dart | 315 ++++++++---------- test/fakes/fake_odyssey_client.dart | 6 + ...ake_odyssey_client_for_thumbnail_test.dart | 6 + 8 files changed, 192 insertions(+), 182 deletions(-) diff --git a/lib/backend_service/backend_client.dart b/lib/backend_service/backend_client.dart index b9d38d4..5c4e25b 100644 --- a/lib/backend_service/backend_client.dart +++ b/lib/backend_service/backend_client.dart @@ -94,4 +94,8 @@ abstract class BackendClient { /// Fetch recent analytics entries. `n` requests the last N entries. /// Returns a list of JSON objects with keys like 'ID', 'T', 'V'. Future>> getAnalytics(int n); + + /// Fetch a single analytic value by metric id (e.g. /analytic/value/6). + /// Returns the raw value (number or string) or null on failure. + Future getAnalyticValue(int id); } diff --git a/lib/backend_service/backend_service.dart b/lib/backend_service/backend_service.dart index 09991ed..be14cac 100644 --- a/lib/backend_service/backend_service.dart +++ b/lib/backend_service/backend_service.dart @@ -151,4 +151,7 @@ class BackendService implements BackendClient { @override Future>> getAnalytics(int n) => _delegate.getAnalytics(n); + + @override + Future getAnalyticValue(int id) => _delegate.getAnalyticValue(id); } diff --git a/lib/backend_service/nanodlp/helpers/nano_simulated_client.dart b/lib/backend_service/nanodlp/helpers/nano_simulated_client.dart index 876f896..d220844 100644 --- a/lib/backend_service/nanodlp/helpers/nano_simulated_client.dart +++ b/lib/backend_service/nanodlp/helpers/nano_simulated_client.dart @@ -201,6 +201,12 @@ class NanoDlpSimulatedClient implements BackendClient { return []; } + @override + Future getAnalyticValue(int id) async { + // Simulated client does not provide scalar analytic values. + return null; + } + @override Future usbAvailable() async => false; diff --git a/lib/backend_service/nanodlp/nanodlp_http_client.dart b/lib/backend_service/nanodlp/nanodlp_http_client.dart index 198487a..b2fd88a 100644 --- a/lib/backend_service/nanodlp/nanodlp_http_client.dart +++ b/lib/backend_service/nanodlp/nanodlp_http_client.dart @@ -287,6 +287,33 @@ class NanoDlpHttpClient implements BackendClient { } } + @override + Future getAnalyticValue(int id) async { + final baseNoSlash = apiUrl.replaceAll(RegExp(r'/+$'), ''); + final uri = Uri.parse('$baseNoSlash/analytic/value/$id'); + final client = _createClient(); + try { + final resp = await client.get(uri); + if (resp.statusCode != 200) return null; + final body = resp.body.trim(); + // NanoDLP returns a plain numeric value like "-3.719..." so try parsing + final v = double.tryParse(body); + if (v != null) return v; + // Fallback: try JSON decode (in case the server returns JSON) + try { + final decoded = json.decode(body); + return decoded; + } catch (_) { + return body; + } + } catch (e, st) { + _log.fine('NanoDLP getAnalyticValue failed', e, st); + return null; + } finally { + client.close(); + } + } + @override Future getFileThumbnail( String location, String filePath, String size) async { diff --git a/lib/backend_service/odyssey/odyssey_http_client.dart b/lib/backend_service/odyssey/odyssey_http_client.dart index 95ea6c9..2594387 100644 --- a/lib/backend_service/odyssey/odyssey_http_client.dart +++ b/lib/backend_service/odyssey/odyssey_http_client.dart @@ -123,6 +123,13 @@ class OdysseyHttpClient implements BackendClient { return []; } + @override + Future getAnalyticValue(int id) async { + // Odyssey doesn't support the scalar NanoDLP analytic/value endpoint. + // Return null to indicate unsupported / no-value. + return null; + } + @override Future>> getNotifications() async { try { diff --git a/lib/backend_service/providers/analytics_provider.dart b/lib/backend_service/providers/analytics_provider.dart index f48ebf4..b4493bc 100644 --- a/lib/backend_service/providers/analytics_provider.dart +++ b/lib/backend_service/providers/analytics_provider.dart @@ -1,60 +1,24 @@ -/* - * Orion - Analytics Provider - * - * Lightweight provider that fetches recent analytics/telemetry snapshots - * from the backend. For NanoDLP we poll at a fixed interval (polling-only - * backends). For Odyssey we attempt to subscribe to an SSE-style stream - * and fall back to polling on error. - */ +// Clean AnalyticsProvider implementation import 'dart:async'; -import 'dart:math'; import 'package:flutter/foundation.dart'; import 'package:logging/logging.dart'; -import 'package:orion/backend_service/backend_service.dart'; import 'package:orion/backend_service/backend_client.dart'; +import 'package:orion/backend_service/backend_service.dart'; import 'package:orion/util/orion_config.dart'; import 'package:orion/backend_service/nanodlp/helpers/nano_analytics_config.dart'; class AnalyticsProvider extends ChangeNotifier { final BackendClient _client; - final _log = Logger('AnalyticsProvider'); - - Map? _analytics; - Map? get analytics => _analytics; + final Logger _log = Logger('AnalyticsProvider'); - /// Convenience map: when NanoDLP analytics are present this contains a - /// mapping from metric key (e.g. 'Pressure') to list of {id, v} entries. - Map>> get analyticsByKey { - final a = _analytics; - if (a == null) return {}; - if (a.containsKey('nano_analytics')) { - try { - final Map>> byId = - Map>>.from(a['nano_analytics']); - final Map>> mapped = {}; - byId.forEach((id, list) { - final key = idToKey(id) ?? id.toString(); - mapped[key] = list; - }); - return mapped; - } catch (_) { - return {}; - } - } - return {}; - } - - List> getSeriesForKey(String key) { - return analyticsByKey[key] ?? []; + AnalyticsProvider({BackendClient? client}) + : _client = client ?? BackendService() { + _start(); } - dynamic getLatestForKey(String key) { - final series = getSeriesForKey(key); - if (series.isEmpty) return null; - final last = series.last; - return last['v']; - } + Map? _analytics; + Map? get analytics => _analytics; bool _loading = true; bool get isLoading => _loading; @@ -62,176 +26,163 @@ class AnalyticsProvider extends ChangeNotifier { Object? _error; Object? get error => _error; - bool _disposed = false; + static const int _pressureId = 6; + final List> _pressureSeries = []; + List> get pressureSeries => + List.unmodifiable(_pressureSeries); - // Polling state - bool _polling = false; - int _pollIntervalSeconds = 5; - static const int _minPollIntervalSeconds = 2; - static const int _maxPollIntervalSeconds = 60; - int _consecutiveErrors = 0; - bool _fetchInFlight = false; + int pollIntervalHertz = 10; // 10 Hz + double get pollIntervalMilliseonds => 1000.0 / pollIntervalHertz; + int get _maxPressureSamples => (60 * pollIntervalHertz); // 1 minute - // SSE state - bool _sseConnected = false; - StreamSubscription>? _sseSub; - - AnalyticsProvider({BackendClient? client}) - : _client = client ?? BackendService() { - // Try SSE when appropriate; NanoDLP is polling-only so it will skip. - _tryStartSse(); - } + bool _disposed = false; + bool _polling = false; - void _startPolling() { - if (_polling || _sseConnected || _disposed) return; + void _start() { + if (_polling || _disposed) return; _polling = true; - Future(() async { - try { - await refresh(); - while (!_disposed && _polling && !_sseConnected) { + () async { + while (!_disposed && _polling) { + final before = DateTime.now(); + await _pollOnce(); + final took = DateTime.now().difference(before).inMilliseconds; + final wait = pollIntervalMilliseonds - took; + if (wait > 0) { try { - await Future.delayed(Duration(seconds: _pollIntervalSeconds)); + await Future.delayed(Duration(milliseconds: wait.toInt())); } catch (_) {} - if (_disposed || !_polling || _sseConnected) break; - await refresh(); } - } finally { - _polling = false; } - }); + _polling = false; + }(); } - Future _tryStartSse() async { - if (_sseConnected || _disposed) return; - try { - final cfg = OrionConfig(); - final isNano = cfg.isNanoDlpMode(); - if (isNano) { - _log.fine('NanoDLP mode: AnalyticsProvider using polling'); - _startPolling(); - return; - } - } catch (_) { - // ignore and attempt SSE as a best-effort - } + /// Public trigger to immediately refresh analytics once. + Future refresh() async { + if (_disposed) return; + await _pollOnce(); + } - _log.fine( - 'Attempting Analytics SSE subscription via BackendClient.getStatusStream'); + Future _pollOnce() async { + if (_disposed) return; + _loading = true; try { - final stream = _client.getStatusStream(); - _sseConnected = true; - _sseSub = stream.listen((raw) { + final cfg = OrionConfig(); + if (cfg.isNanoDlpMode()) { + // Fast path: scalar endpoint try { - // The status stream may include periodic telemetry; treat the - // incoming status object as the latest analytics snapshot. - _analytics = raw; - _error = null; - _loading = false; - } catch (e) { - _log.warning('Failed to handle analytics SSE payload', e); + final val = await _client.getAnalyticValue(_pressureId); + if (val != null) { + final num? v = (val is num) ? val : double.tryParse(val.toString()); + if (v != null) { + final id = DateTime.now().millisecondsSinceEpoch; + _pressureSeries.add({'id': id, 'v': v}); + if (_pressureSeries.length > _maxPressureSamples) { + _pressureSeries.removeRange( + 0, _pressureSeries.length - _maxPressureSamples); + } + _analytics = { + 'nano_analytics': { + _pressureId: List>.from(_pressureSeries) + } + }; + _error = null; + _loading = false; + if (!_disposed) notifyListeners(); + return; + } + } + } catch (e, st) { + _log.fine('getAnalyticValue failed', e, st); } - if (!_disposed) notifyListeners(); - }, onError: (err, st) { - _log.warning( - 'Analytics SSE stream error, falling back to polling', err, st); - _closeSse(); - if (!_disposed) _startPolling(); - }, onDone: () { - _log.info( - 'Analytics SSE stream closed by server; falling back to polling'); - _closeSse(); - if (!_disposed) _startPolling(); - }, cancelOnError: true); - } catch (e) { - _log.info('Analytics SSE subscription failed; using polling', e); - _sseConnected = false; - if (!_disposed) _startPolling(); - } - } - - void _closeSse() { - _sseConnected = false; - try { - _sseSub?.cancel(); - } catch (_) {} - _sseSub = null; - } - Future refresh() async { - if (_fetchInFlight || _disposed) return; - _fetchInFlight = true; - final startedAt = DateTime.now(); - try { - // If configured for NanoDLP, use the NanoDLP-specific analytics - // endpoint which returns a list of recent analytic samples. - try { - final cfg = OrionConfig(); - if (cfg.isNanoDlpMode()) { - final list = await _client.getAnalytics(200); - // Normalize into a map keyed by the metric id (T) -> list of - // {id: timestamp, v: value} entries for easier consumption. - final Map>> grouped = {}; + // Fallback: batch analytics + try { + final list = await _client.getAnalytics(20); + final newPressure = >[]; for (final item in list) { - try { - final t = item['T']; - final id = item['ID']; - final v = item['V']; - final tid = t is int ? t : int.tryParse(t?.toString() ?? ''); - if (tid == null) continue; - grouped.putIfAbsent(tid, () => []).add({'id': id, 'v': v}); - } catch (_) { - continue; - } + final tRaw = item['T']; + final tid = + tRaw is int ? tRaw : int.tryParse(tRaw?.toString() ?? ''); + if (tid != _pressureId) continue; + final idRaw = item['ID']; + final vRaw = item['V']; + final id = idRaw is int + ? idRaw + : int.tryParse(idRaw?.toString() ?? '') ?? + DateTime.now().millisecondsSinceEpoch; + final num? v = + vRaw is num ? vRaw : double.tryParse(vRaw?.toString() ?? ''); + if (v == null) continue; + newPressure.add({'id': id, 'v': v}); + } + if (newPressure.isNotEmpty) { + _pressureSeries.clear(); + _pressureSeries.addAll(newPressure); + _analytics = { + 'nano_analytics': { + _pressureId: List>.from(_pressureSeries) + } + }; + _error = null; + _loading = false; + if (!_disposed) notifyListeners(); + return; } - _analytics = {'nano_analytics': grouped}; - } else { - final raw = await _client.getStatus(); - _analytics = raw; + } catch (e, st) { + _log.fine('getAnalytics fallback failed', e, st); } - } catch (e) { - // Fall back to status snapshot if analytics endpoint fails. + + _loading = false; + return; + } else { final raw = await _client.getStatus(); _analytics = raw; + _error = null; + _loading = false; + if (!_disposed) notifyListeners(); + return; } - _error = null; - _loading = false; - _consecutiveErrors = 0; - _pollIntervalSeconds = _minPollIntervalSeconds; - if (!_disposed) notifyListeners(); - } catch (e) { - _log.warning('Analytics refresh failed', e); + } catch (e, st) { + _log.fine('Analytics poll failed', e, st); _error = e; _loading = false; - _consecutiveErrors = min(_consecutiveErrors + 1, 1000); - final backoff = _computeBackoff(_consecutiveErrors, - base: _minPollIntervalSeconds, max: _maxPollIntervalSeconds); - _pollIntervalSeconds = backoff; - _log.fine( - 'Backing off analytics polling for ${backoff}s (attempt $_consecutiveErrors)'); - } finally { - _fetchInFlight = false; - if (!_disposed) { - final elapsed = DateTime.now().difference(startedAt); - _log.finer('Analytics refresh took ${elapsed.inMilliseconds}ms'); + if (!_disposed) notifyListeners(); + } + } + + Map>> get analyticsByKey { + final a = _analytics; + if (a == null) return {}; + if (a.containsKey('nano_analytics')) { + try { + final Map>> byId = + Map>>.from(a['nano_analytics']); + final mapped = >>{}; + byId.forEach((id, list) { + final key = idToKey(id) ?? id.toString(); + mapped[key] = List>.from(list); + }); + return mapped; + } catch (_) { + return {}; } } + return {}; } - int _computeBackoff(int attempts, {required int base, required int max}) { - final raw = base * pow(2, attempts); - int secs = raw.toInt(); - if (secs > max) secs = max; - final rand = Random(); - final jitter = rand.nextInt((secs ~/ 2) + 1); - secs = secs + jitter; - if (secs > max) secs = max; - return secs; + List> getSeriesForKey(String key) => + analyticsByKey[key] ?? []; + + dynamic getLatestForKey(String key) { + final s = getSeriesForKey(key); + if (s.isEmpty) return null; + return s.last['v']; } @override void dispose() { _disposed = true; - _closeSse(); _polling = false; super.dispose(); } diff --git a/test/fakes/fake_odyssey_client.dart b/test/fakes/fake_odyssey_client.dart index 5ecb026..cd6a9c0 100644 --- a/test/fakes/fake_odyssey_client.dart +++ b/test/fakes/fake_odyssey_client.dart @@ -172,4 +172,10 @@ class FakeBackendClient implements BackendClient { // TODO: implement getAnalytics throw UnimplementedError(); } + + @override + Future getAnalyticValue(int id) async { + // Not used in most tests; return null to indicate unsupported. + return null; + } } diff --git a/test/fakes/fake_odyssey_client_for_thumbnail_test.dart b/test/fakes/fake_odyssey_client_for_thumbnail_test.dart index 8383a5f..3f97805 100644 --- a/test/fakes/fake_odyssey_client_for_thumbnail_test.dart +++ b/test/fakes/fake_odyssey_client_for_thumbnail_test.dart @@ -172,4 +172,10 @@ class FakeBackendClientForThumbnailTest implements BackendClient { // TODO: implement getAnalytics throw UnimplementedError(); } + + @override + Future getAnalyticValue(int id) async { + // Not used by thumbnail tests. + return null; + } } From 86a7d095ae1c97d0ab78a70880cba175b9792ecf Mon Sep 17 00:00:00 2001 From: PaulGD03 Date: Thu, 16 Oct 2025 00:31:03 +0200 Subject: [PATCH 37/44] feat(tools): add Force Sensor screen, wire into ToolsScreen; register AnalyticsProvider; add fl_chart dependency --- lib/main.dart | 5 + lib/tools/force_screen.dart | 545 ++++++++++++++++++++++++++++++++++++ lib/tools/tools_screen.dart | 13 +- pubspec.lock | 10 +- pubspec.yaml | 1 + 5 files changed, 570 insertions(+), 4 deletions(-) create mode 100644 lib/tools/force_screen.dart diff --git a/lib/main.dart b/lib/main.dart index ffea4a1..6254fda 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -45,6 +45,7 @@ import 'package:orion/backend_service/providers/config_provider.dart'; import 'package:orion/backend_service/providers/print_provider.dart'; import 'package:orion/backend_service/providers/notification_provider.dart'; import 'package:orion/backend_service/providers/manual_provider.dart'; +import 'package:orion/backend_service/providers/analytics_provider.dart'; import 'package:orion/tools/tools_screen.dart'; import 'package:orion/util/error_handling/error_handler.dart'; import 'package:orion/util/providers/locale_provider.dart'; @@ -163,6 +164,10 @@ class OrionRoot extends StatelessWidget { create: (_) => PrintProvider(), lazy: true, ), + ChangeNotifierProvider( + create: (_) => AnalyticsProvider(), + lazy: false, + ), ChangeNotifierProvider( create: (_) => ManualProvider(), lazy: true, diff --git a/lib/tools/force_screen.dart b/lib/tools/force_screen.dart new file mode 100644 index 0000000..5a8cb9d --- /dev/null +++ b/lib/tools/force_screen.dart @@ -0,0 +1,545 @@ +/* +* Orion - Force Sensor Screen +* Copyright (C) 2025 Open Resin Alliance +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +import 'dart:math'; + +import 'package:fl_chart/fl_chart.dart'; +import 'package:flutter/material.dart'; +import 'package:orion/glasser/glasser.dart'; +import 'package:phosphor_flutter/phosphor_flutter.dart'; +import 'package:provider/provider.dart'; +import 'package:orion/backend_service/providers/analytics_provider.dart'; + +class ForceSensorScreen extends StatefulWidget { + const ForceSensorScreen({super.key}); + + @override + ForceSensorScreenState createState() => ForceSensorScreenState(); +} + +class ForceSensorScreenState extends State { + VoidCallback? _listener; + late final AnalyticsProvider _prov; + bool _isPaused = false; + double _tareOffset = 0.0; + + @override + void initState() { + super.initState(); + _prov = Provider.of(context, listen: false); + _prov.refresh(); + _listener = () { + if (mounted && !_isPaused) setState(() {}); + }; + _prov.addListener(_listener!); + } + + @override + void dispose() { + if (_listener != null) _prov.removeListener(_listener!); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final prov = Provider.of(context); + final series = prov.pressureSeries.isNotEmpty + ? prov.pressureSeries + : prov.getSeriesForKey('Pressure'); + bool isLandscape = + MediaQuery.of(context).orientation == Orientation.landscape; + void togglePause() { + setState(() { + _isPaused = !_isPaused; + }); + } + + void doTare() { + // Tare to the latest sample value if available + final values = series + .map((m) { + final vRaw = m['v']; + if (vRaw is num) return vRaw.toDouble(); + return double.tryParse(vRaw?.toString() ?? ''); + }) + .where((v) => v != null) + .cast() + .toList(growable: false); + setState(() { + _tareOffset = values.isNotEmpty ? values.last : 0.0; + }); + } + + return Scaffold( + body: Padding( + padding: + const EdgeInsets.only(left: 12.0, right: 12.0, bottom: 6, top: 6), + child: isLandscape + ? buildLandscapeLayout(context, series, + isPaused: _isPaused, + onPauseToggle: togglePause, + onTare: doTare, + tareOffset: _tareOffset) + : buildPortraitLayout(context, series, + isPaused: _isPaused, + onPauseToggle: togglePause, + onTare: doTare, + tareOffset: _tareOffset), + ), + ); + } +} + +Widget buildStatsCard(String label, String value) { + return GlassCard( + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Center( + child: Text( + label, + style: const TextStyle( + fontSize: 16, + color: Colors.white70, + ), + ), + ), + const SizedBox(height: 8), + Center( + child: Text( + value, + style: const TextStyle( + fontSize: 19, + fontWeight: FontWeight.bold, + color: Colors.white, + ), + ), + ), + ], + ), + ), + ); +} + +String _formatMass(double grams) { + // Show in kg when >= 1000 g, otherwise show in g. + if (grams.abs() >= 1000.0) { + final kg = grams / 1000.0; + // Show kilograms with two decimal places (x.xx kg) + return '${kg.toStringAsFixed(2)} kg'; + } + return '${grams.toStringAsFixed(0)} g'; +} + +Widget buildControlButtons(BuildContext context, + {required bool isPaused, + required VoidCallback onPauseToggle, + required VoidCallback onTare}) { + final theme = Theme.of(context).copyWith( + elevatedButtonTheme: ElevatedButtonThemeData( + style: ButtonStyle( + shape: WidgetStateProperty.resolveWith(( + Set states, + ) { + return RoundedRectangleBorder( + borderRadius: BorderRadius.circular(15), + side: const BorderSide(color: Colors.transparent), + ); + }), + minimumSize: WidgetStateProperty.resolveWith(( + Set states, + ) { + return const Size(double.infinity, double.infinity); + }), + ), + ), + ); + + return Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Expanded( + child: GlassButton( + tint: !isPaused ? GlassButtonTint.none : GlassButtonTint.positive, + onPressed: onPauseToggle, + style: theme.elevatedButtonTheme.style, + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + isPaused + ? const PhosphorIcon(PhosphorIconsFill.play, size: 40) + : const PhosphorIcon(PhosphorIconsFill.pause, size: 40), + const SizedBox( + height: 8), // Add some space between icon and label + Text(isPaused ? 'Resume' : 'Pause', + style: const TextStyle(fontSize: 22)), + ], + ), + ), + ), + const SizedBox(height: 16), + Expanded( + child: GlassButton( + tint: GlassButtonTint.none, + onPressed: onTare, + style: theme.elevatedButtonTheme.style, + child: const Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + PhosphorIcon(PhosphorIconsFill.scales, size: 40), + SizedBox(height: 8), // Add some space between icon and label + Text('Tare', style: TextStyle(fontSize: 24)), + ], + ), + ), + ), + ], + ); +} + +Widget buildPortraitLayout( + BuildContext context, + List> series, { + required bool isPaused, + required VoidCallback onPauseToggle, + required VoidCallback onTare, + required double tareOffset, +}) { + return Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Expanded( + child: GlassCard( + child: Padding( + padding: const EdgeInsets.all(16.0), + child: _PressureLineChart(series: series, tareOffset: tareOffset), + ), + ), + ), + const SizedBox(height: 16), + SizedBox( + height: 120, + child: buildControlButtons(context, + isPaused: isPaused, onPauseToggle: onPauseToggle, onTare: onTare), + ), + ], + ); +} + +Widget buildLandscapeLayout( + BuildContext context, + List> series, { + required bool isPaused, + required VoidCallback onPauseToggle, + required VoidCallback onTare, + required double tareOffset, +}) { + // Derive numeric stats from the series to show in the stat cards. + final values = series + .map((m) { + final vRaw = m['v']; + if (vRaw is num) return vRaw.toDouble(); + return double.tryParse(vRaw?.toString() ?? ''); + }) + .where((v) => v != null) + .cast() + .toList(growable: false); + + final bool hasData = values.isNotEmpty; + final double currentVal = hasData ? values.last : 0.0; + final double maxVal = hasData ? values.reduce(max) : 0.0; + final double minVal = hasData ? values.reduce(min) : 0.0; + return Row( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + SizedBox( + width: 130, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Expanded( + child: SizedBox( + width: 130, + child: buildStatsCard( + 'Current', + _formatMass(currentVal), + ), + ), + ), + const SizedBox(height: 12), + Expanded( + child: SizedBox( + width: 130, + child: buildStatsCard( + 'Max', + _formatMass(maxVal), + ), + ), + ), + const SizedBox(height: 12), + Expanded( + child: SizedBox( + width: 130, + child: buildStatsCard( + 'Min', + _formatMass(minVal), + ), + ), + ), + ], + ), + ), + const SizedBox(width: 12), + Expanded( + flex: 3, + child: GlassCard( + child: Padding( + padding: const EdgeInsets.all(2.0), + child: _PressureLineChart(series: series, tareOffset: tareOffset), + ), + ), + ), + const SizedBox(width: 12), + SizedBox( + width: 130, + child: buildControlButtons(context, + isPaused: isPaused, onPauseToggle: onPauseToggle, onTare: onTare), + ), + ], + ); +} + +class _PressureLineChart extends StatefulWidget { + final List> series; + final double tareOffset; + const _PressureLineChart({required this.series, this.tareOffset = 0.0}); + + @override + State<_PressureLineChart> createState() => _PressureLineChartState(); +} + +class _PressureLineChartState extends State<_PressureLineChart> { + static const int _windowSize = 600; // stable X-axis window + double? _displayMin; + double? _displayMax; + double _windowMaxX = 0.0; + // Persistent mapping from sample id -> X coordinate so older points keep + // their X positions and the chart appears to scroll rather than redraw. + final Map _idToX = {}; + double _lastX = -1.0; + + // _isPaused removed; pausing is handled by the controls section where needed. + + List _toSpots(List> serie) { + final last = serie.length; + final start = last - _windowSize < 0 ? 0 : last - _windowSize; + final window = serie.sublist(start, last); + final spots = []; + final currentIds = {}; + for (var i = 0; i < window.length; i++) { + final item = window[i]; + final idRaw = item['id'] ?? i; // fallback to index if no id + final key = idRaw is Object ? idRaw : idRaw.toString(); + currentIds.add(key); + + final vRaw = item['v']; + final v = vRaw is num + ? vRaw.toDouble() + : double.tryParse(vRaw?.toString() ?? ''); + if (v == null) continue; + + double x; + if (_idToX.containsKey(key)) { + x = _idToX[key]!; + } else { + _lastX = _lastX + 1.0; + x = _lastX; + _idToX[key] = x; + } + spots.add(FlSpot(x, v)); + } + + // Trim mapping to current window to keep memory bounded. + final toRemove = []; + _idToX.forEach((k, v) { + if (!currentIds.contains(k)) toRemove.add(k); + }); + for (final k in toRemove) { + _idToX.remove(k); + } + + // Window max X is the last assigned X (or fallback) + _windowMaxX = _lastX <= 0 ? (_windowSize - 1).toDouble() : _lastX; + // To keep the grid fixed we render the chart in a stationary X range + // [0, _windowSize-1] and shift the sample X positions into that range. + final windowStart = _windowMaxX <= 0 + ? 0.0 + : max(0.0, _windowMaxX - (_windowSize - 1).toDouble()); + + final remapped = spots + .map((s) => FlSpot(s.x - windowStart, s.y)) + .toList(growable: false); + return remapped; + } + + void _updateDisplayRange(List spots) { + if (spots.isEmpty) return; + final minY = spots.map((s) => s.y).reduce(min); + final maxY = spots.map((s) => s.y).reduce(max); + final span = maxY - minY; + final pad = span == 0 ? (maxY.abs() * 0.05 + 1.0) : (span * 0.05); + + // Default safe range is [-100, 100]. Expand only when data goes outside + // that range, up to +/-60000 (60kg). + // If you manage to exceed that, well, may your printer find peace. + double targetMin; + double targetMax; + const double hardLimit = 60000.0; + + if (minY >= -100.0 && maxY <= 100.0) { + // Data within default bounds: keep the simple default range + targetMin = -100.0; + targetMax = 100.0; + } else { + // Expand to include data with a small padding, but clamp to hard limits + targetMin = max(minY - pad, -hardLimit); + targetMax = min(maxY + pad, hardLimit); + // Ensure we always include zero if data is near zero-ish to keep chart centered + if (targetMin > 0) targetMin = 0; + if (targetMax < 0) targetMax = 0; + } + + // If the incoming data lies significantly outside the current display + // range, expand immediately to avoid clipping spikes. Otherwise interpolate + // more quickly than before so the chart follows changes responsively. + const double immediateFraction = + 0.25; // fraction of current span to trigger immediate jump + const double immediateAbs = + 200.0; // absolute threshold to trigger immediate jump + const double smoothAlpha = 0.6; // faster smoothing than before + + if (_displayMin == null || _displayMax == null) { + _displayMin = targetMin; + _displayMax = targetMax; + } else { + final curSpan = (_displayMax! - _displayMin!).abs(); + final needImmediate = (minY < + _displayMin! - max(immediateAbs, curSpan * immediateFraction)) || + (maxY > + _displayMax! + max(immediateAbs, curSpan * immediateFraction)); + + if (needImmediate) { + // Jump immediately to include outlier(s). + _displayMin = targetMin; + _displayMax = targetMax; + } else { + // Smoothly move towards the target but faster than before. + _displayMin = _displayMin! + (targetMin - _displayMin!) * smoothAlpha; + _displayMax = _displayMax! + (targetMax - _displayMax!) * smoothAlpha; + } + } + } + + @override + void didUpdateWidget(covariant _PressureLineChart oldWidget) { + super.didUpdateWidget(oldWidget); + final spots = _toSpots(widget.series); + _updateDisplayRange(spots); + } + + Widget leftTitleWidgets(double value, TitleMeta meta) { + const style = TextStyle( + fontSize: 20, + ); + String text; + if (value == 0) { + text = '0'; + } else if (value == _displayMin) { + text = _displayMin!.toStringAsFixed(0); + } else if (value == _displayMax) { + text = _displayMax!.toStringAsFixed(0); + } else { + return const SizedBox.shrink(); + } + + return Text(text, style: style, textAlign: TextAlign.left); + } + + @override + Widget build(BuildContext context) { + final spots = _toSpots(widget.series); + if (spots.isEmpty) return const Center(child: Text('No data')); + + _updateDisplayRange(spots); + final displayMin = _displayMin ?? spots.map((s) => s.y).reduce(min) - 1.0; + final displayMax = _displayMax ?? spots.map((s) => s.y).reduce(max) + 1.0; + + return LineChart( + duration: Duration.zero, + LineChartData( + borderData: FlBorderData( + border: Border.all( + color: Colors.transparent, + ), + ), + gridData: FlGridData(show: true), + titlesData: FlTitlesData( + /*leftTitles: AxisTitles( + sideTitles: SideTitles( + showTitles: true, + reservedSize: 60, + getTitlesWidget: leftTitleWidgets, + ), + ),*/ + leftTitles: AxisTitles(sideTitles: SideTitles(showTitles: false)), + topTitles: AxisTitles(sideTitles: SideTitles(showTitles: false)), + rightTitles: AxisTitles(sideTitles: SideTitles(showTitles: false)), + bottomTitles: AxisTitles(sideTitles: SideTitles(showTitles: false)), + ), + minY: displayMin, + maxY: displayMax, + // Fixed screen range so the grid remains stationary while the data + // moves underneath. X runs from 0 to _windowSize-1. + maxX: (_windowSize - 1).toDouble(), + minX: 0.0, + lineBarsData: [ + LineChartBarData( + spots: spots, + gradient: LinearGradient( + colors: [ + Colors.greenAccent, + Colors.redAccent, + ], + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + ), + isCurved: true, + isStrokeCapRound: true, + dotData: FlDotData(show: false), + color: Theme.of(context).colorScheme.primary, + barWidth: 2, + ) + ], + ), + ); + } +} diff --git a/lib/tools/tools_screen.dart b/lib/tools/tools_screen.dart index 4eaa034..bb3706f 100644 --- a/lib/tools/tools_screen.dart +++ b/lib/tools/tools_screen.dart @@ -20,8 +20,9 @@ import 'package:flutter/material.dart'; import 'package:phosphor_flutter/phosphor_flutter.dart'; import 'package:orion/glasser/glasser.dart'; -import 'package:orion/tools/exposure_screen.dart'; import 'package:orion/tools/move_z_screen.dart'; +import 'package:orion/tools/exposure_screen.dart'; +import 'package:orion/tools/force_screen.dart'; class ToolsScreen extends StatefulWidget { const ToolsScreen({super.key}); @@ -55,7 +56,9 @@ class ToolsScreenState extends State { ? const MoveZScreen() : _selectedIndex == 1 ? const ExposureScreen() - : const MoveZScreen(), + : _selectedIndex == 2 + ? const ForceSensorScreen() + : const MoveZScreen(), bottomNavigationBar: GlassBottomNavigationBar( type: BottomNavigationBarType.fixed, items: [ @@ -66,7 +69,11 @@ class ToolsScreenState extends State { BottomNavigationBarItem( icon: PhosphorIcon(PhosphorIcons.lightbulbFilament()), label: 'Exposure', - ) + ), + BottomNavigationBarItem( + icon: PhosphorIcon(PhosphorIcons.chartLineUp()), + label: 'Force Sensor', + ), // TODO: Implement Self Test /*BottomNavigationBarItem( icon: Icon(Icons.check), diff --git a/pubspec.lock b/pubspec.lock index ebbea41..51f6381 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -289,6 +289,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.1.1" + fl_chart: + dependency: "direct main" + description: + name: fl_chart + sha256: "7ca9a40f4eb85949190e54087be8b4d6ac09dc4c54238d782a34cf1f7c011de9" + url: "https://pub.dev" + source: hosted + version: "1.1.1" flex_seed_scheme: dependency: "direct main" description: @@ -1173,4 +1181,4 @@ packages: version: "3.1.3" sdks: dart: ">=3.8.0 <4.0.0" - flutter: ">=3.27.0" + flutter: ">=3.27.4" diff --git a/pubspec.yaml b/pubspec.yaml index 568cd53..ab07a74 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -70,6 +70,7 @@ dependencies: sdk: flutter marquee: ^2.3.0 json_annotation: ^4.9.0 + fl_chart: ^1.1.1 dev_dependencies: flutter_test: From d95bcbceb98d332e79a9977be15113c06dbacff8 Mon Sep 17 00:00:00 2001 From: PaulGD03 Date: Thu, 16 Oct 2025 22:24:10 +0200 Subject: [PATCH 38/44] feat(settings): add Raw Force Sensor toggle to developer settings and remove Beta Testing revert UI Load overrideRawForceSensorValues from OrionConfig in initState and persist changes when toggled. Also remove the Beta Testing "Revert to NanoDLP HMI" section and its invocation to clean up developer UI. --- lib/settings/general_screen.dart | 90 ++++++-------------------------- 1 file changed, 17 insertions(+), 73 deletions(-) diff --git a/lib/settings/general_screen.dart b/lib/settings/general_screen.dart index c60029a..f95418b 100644 --- a/lib/settings/general_screen.dart +++ b/lib/settings/general_screen.dart @@ -51,6 +51,7 @@ class GeneralCfgScreenState extends State { late bool developerMode; late bool releaseOverride; late bool overrideUpdateCheck; + late bool overrideRawForceSensorValues; late String overrideRelease; late bool verboseLogging; late bool selfDestructMode; @@ -91,6 +92,8 @@ class GeneralCfgScreenState extends State { releaseOverride = config.getFlag('releaseOverride', category: 'developer'); overrideUpdateCheck = config.getFlag('overrideUpdateCheck', category: 'developer'); + overrideRawForceSensorValues = + config.getFlag('overrideRawForceSensorValues', category: 'developer'); overrideRelease = config.getString('overrideRelease', category: 'developer'); verboseLogging = config.getFlag('verboseLogging', category: 'developer'); @@ -102,77 +105,6 @@ class GeneralCfgScreenState extends State { machineName = config.getString('machineName', category: 'machine'); } - GlassCard _buildBetaTestingSection() { - return GlassCard( - outlined: true, - elevation: 1, - child: Padding( - padding: const EdgeInsets.all(16.0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const Text( - 'Beta Testing', - style: TextStyle( - fontSize: 28.0, - ), - ), - const SizedBox(height: 12.0), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 8.0), - child: SizedBox( - height: 48, - child: GlassButton( - style: ElevatedButton.styleFrom(elevation: 2), - onPressed: _isReverting - ? null - : () async { - final confirm = await showDialog( - context: context, - builder: (context) => GlassAlertDialog( - title: const Text('Confirm NanoDLP Revert'), - content: const Text( - 'This will revert from the Orion Beta to the NanoDLP HMI. Do you want to continue?\n\nRe-activating Orion later will require SSH access.\nRun "activate_orion" to re-enable Orion.'), - actions: [ - GlassButton( - onPressed: () => - Navigator.of(context).pop(false), - child: const Text('Cancel'), - ), - GlassButton( - onPressed: () => - Navigator.of(context).pop(true), - child: const Text('Run'), - ), - ], - ), - ); - if (confirm != true) return; - _runRevertOrion(); - }, - child: Row( - mainAxisSize: MainAxisSize.min, - children: [ - const Icon(Icons.restore, size: 20), - const SizedBox(width: 8), - _isReverting - ? const SizedBox( - width: 20, - height: 20, - child: CircularProgressIndicator(strokeWidth: 2), - ) - : const Text('Revert to NanoDLP HMI'), - ], - ), - ), - ), - ), - ], - ), - ), - ); - } - @override void didChangeDependencies() { super.didChangeDependencies(); @@ -592,8 +524,6 @@ class GeneralCfgScreenState extends State { /// Developer Section for build overrides. if (developerMode) _buildDeveloperSection(), - if (developerMode) const SizedBox(height: 12.0), - if (developerMode) _buildBetaTestingSection(), ], ), ), @@ -738,6 +668,20 @@ class GeneralCfgScreenState extends State { }); }, ), + const SizedBox(height: 20.0), + OrionListTile( + title: 'Raw Force Sensor Values', + icon: PhosphorIcons.scales(), + value: overrideRawForceSensorValues, + onChanged: (bool value) { + setState(() { + overrideRawForceSensorValues = value; + config.setFlag('overrideRawForceSensorValues', + overrideRawForceSensorValues, + category: 'developer'); + }); + }, + ), ], ), ), From 04f20d6e7404135e4f682cafdcc528785880e996 Mon Sep 17 00:00:00 2001 From: PaulGD03 Date: Thu, 16 Oct 2025 22:24:50 +0200 Subject: [PATCH 39/44] feat(glasser): add margin prop to GlassButton and tweak glass visuals - expose EdgeInsetsGeometry? margin on GlassButton and internal _GlassmorphicButton and apply it to the outer container so callers can control spacing without extra wrappers - simplify fill opacity handling (remove intermediate effectiveFillOpacity and call GlassPlatformConfig.surfaceOpacity directly) - reduce disabled content opacity from 0.6 to 0.4 for a more muted disabled state - minor formatting/cleanup around tint blending and parameter ordering --- lib/glasser/src/widgets/glass_button.dart | 31 +++++++++++++---------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/lib/glasser/src/widgets/glass_button.dart b/lib/glasser/src/widgets/glass_button.dart index 8869ab2..abeb55e 100644 --- a/lib/glasser/src/widgets/glass_button.dart +++ b/lib/glasser/src/widgets/glass_button.dart @@ -64,6 +64,7 @@ class GlassButton extends StatelessWidget { final ButtonStyle? style; final bool wantIcon; final GlassButtonTint tint; + final EdgeInsetsGeometry? margin; const GlassButton({ super.key, @@ -72,6 +73,7 @@ class GlassButton extends StatelessWidget { this.style, this.wantIcon = false, this.tint = GlassButtonTint.none, + this.margin, }); @override @@ -97,8 +99,9 @@ class GlassButton extends StatelessWidget { onPressed: onPressed, style: style, wantIcon: wantIcon, - tintPalette: tintPalette, - child: child, // Pass the wantIcon parameter + tintPalette: tintPalette, // Pass the wantIcon parameter + margin: margin, + child: child, ); } } @@ -110,6 +113,7 @@ class _GlassmorphicButton extends StatelessWidget { final ButtonStyle? style; final bool wantIcon; final _GlassButtonTintPalette? tintPalette; + final EdgeInsetsGeometry? margin; const _GlassmorphicButton({ required this.child, @@ -117,6 +121,7 @@ class _GlassmorphicButton extends StatelessWidget { this.style, this.wantIcon = true, this.tintPalette, + this.margin, }); @override @@ -144,21 +149,15 @@ class _GlassmorphicButton extends StatelessWidget { isEnabled ? 0.14 : 0.1, emphasize: isEnabled, ); - // When a tint is present we keep the white frosted base but make it a - // little more opaque so the tint's outline/text read better. We also - // blend a subtle tint over the white so the button keeps a frosted - // appearance while carrying semantic color. - final effectiveFillOpacity = - hasTint ? (fillOpacity + 0.06).clamp(0.0, 1.0) : fillOpacity; + Color? blendedFillColor; if (hasTint) { // Blend a low-opacity tint over white. Use alphaBlend so the result // keeps white highlights while adding color. - blendedFillColor = Color.alphaBlend( - tintColor!.withValues(alpha: 0.75), - Colors.white, - ); + blendedFillColor = + Color.alphaBlend(tintColor!.withValues(alpha: 0.75), Colors.white); } + final shadow = GlassPlatformConfig.interactiveShadow( enabled: isEnabled, blurRadius: isCircle ? 18 : 16, @@ -167,6 +166,7 @@ class _GlassmorphicButton extends StatelessWidget { ); Widget buttonChild = Container( + margin: margin ?? const EdgeInsets.all(0.0), decoration: BoxDecoration( borderRadius: borderRadius, boxShadow: shadow, @@ -174,7 +174,10 @@ class _GlassmorphicButton extends StatelessWidget { child: GlassEffect( borderRadius: borderRadius, sigma: glassBlurSigma, - opacity: effectiveFillOpacity, + opacity: GlassPlatformConfig.surfaceOpacity( + 0.12, + emphasize: isEnabled, + ), // Provide a subtle tinted white base when a tint is requested so the // control remains frosted but carries semantic color. color: blendedFillColor, @@ -206,7 +209,7 @@ class _GlassmorphicButton extends StatelessWidget { : Colors.white.withValues(alpha: 0.1)) : null, child: Opacity( - opacity: isEnabled ? 1.0 : 0.6, + opacity: isEnabled ? 1.0 : 0.4, child: Padding( padding: isCircle ? const EdgeInsets.all(0) From 7b65e2cccf45fe39ed9ae766bf05506b8ead66d1 Mon Sep 17 00:00:00 2001 From: PaulGD03 Date: Thu, 16 Oct 2025 22:26:48 +0200 Subject: [PATCH 40/44] style(settings): reduce vertical padding on UI settings screen Use symmetric padding (horizontal: 16, vertical: 6) for the settings body to tighten vertical spacing between cards. --- lib/settings/ui_screen.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/settings/ui_screen.dart b/lib/settings/ui_screen.dart index 8a43e59..22084e4 100644 --- a/lib/settings/ui_screen.dart +++ b/lib/settings/ui_screen.dart @@ -53,7 +53,8 @@ class _UIScreenState extends State { ), body: SingleChildScrollView( child: Padding( - padding: const EdgeInsets.all(16.0), + padding: + const EdgeInsets.symmetric(horizontal: 16.0, vertical: 6.0), child: Column( children: [ // Theme Mode Selector Card From 01001d33f57a0480fc7acab106e0fda5c4dcd754 Mon Sep 17 00:00:00 2001 From: PaulGD03 Date: Thu, 16 Oct 2025 22:27:40 +0200 Subject: [PATCH 41/44] perf(backend_service): increase analytics polling frequency to 15 Hz Bump AnalyticsProvider.pollIntervalHertz from 10 to 15 to sample pressure data at 15 Hz. --- lib/backend_service/providers/analytics_provider.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/backend_service/providers/analytics_provider.dart b/lib/backend_service/providers/analytics_provider.dart index b4493bc..8955337 100644 --- a/lib/backend_service/providers/analytics_provider.dart +++ b/lib/backend_service/providers/analytics_provider.dart @@ -31,7 +31,7 @@ class AnalyticsProvider extends ChangeNotifier { List> get pressureSeries => List.unmodifiable(_pressureSeries); - int pollIntervalHertz = 10; // 10 Hz + int pollIntervalHertz = 15; // 15 Hz double get pollIntervalMilliseonds => 1000.0 / pollIntervalHertz; int get _maxPressureSamples => (60 * pollIntervalHertz); // 1 minute From 1c917daf6e10f40d8427cdae47b3cc2012c55e75 Mon Sep 17 00:00:00 2001 From: PaulGD03 Date: Thu, 16 Oct 2025 22:28:37 +0200 Subject: [PATCH 42/44] feat(backend_service): add tareForceSensor API and manual tare support - Add tareForceSensor to BackendClient and forward in BackendService - Expose manualTareForceSensor on ManualProvider (calls backend.tareForceSensor) - Implement NanoDlpHttpClient.manualCommand (POST /gcode) and implement tareForceSensor to send a PressureWrite command - Add tareForceSensor stub to OdysseyHttpClient - Enhance NanoDlpSimulatedClient.getAnalyticValue to return a smooth, decaying oscillation with noise for more realistic simulated analytics; add a tareForceSensor placeholder (UnimplementedError) --- lib/backend_service/backend_client.dart | 4 ++ lib/backend_service/backend_service.dart | 3 ++ .../helpers/nano_simulated_client.dart | 35 +++++++++++++++- .../nanodlp/nanodlp_http_client.dart | 41 ++++++++++++++++++- .../odyssey/odyssey_http_client.dart | 6 +++ .../providers/manual_provider.dart | 20 +++++++++ 6 files changed, 105 insertions(+), 4 deletions(-) diff --git a/lib/backend_service/backend_client.dart b/lib/backend_service/backend_client.dart index 5c4e25b..7e1fe97 100644 --- a/lib/backend_service/backend_client.dart +++ b/lib/backend_service/backend_client.dart @@ -98,4 +98,8 @@ abstract class BackendClient { /// Fetch a single analytic value by metric id (e.g. /analytic/value/6). /// Returns the raw value (number or string) or null on failure. Future getAnalyticValue(int id); + + /// Tare the force sensor if supported by the backend. + /// Returns a boolean indicating success or failure. + Future tareForceSensor(); } diff --git a/lib/backend_service/backend_service.dart b/lib/backend_service/backend_service.dart index be14cac..19bb8e8 100644 --- a/lib/backend_service/backend_service.dart +++ b/lib/backend_service/backend_service.dart @@ -154,4 +154,7 @@ class BackendService implements BackendClient { @override Future getAnalyticValue(int id) => _delegate.getAnalyticValue(id); + + @override + Future tareForceSensor() => _delegate.tareForceSensor(); } diff --git a/lib/backend_service/nanodlp/helpers/nano_simulated_client.dart b/lib/backend_service/nanodlp/helpers/nano_simulated_client.dart index d220844..e9ee9ef 100644 --- a/lib/backend_service/nanodlp/helpers/nano_simulated_client.dart +++ b/lib/backend_service/nanodlp/helpers/nano_simulated_client.dart @@ -8,6 +8,7 @@ */ import 'dart:async'; +import 'dart:math'; import 'dart:typed_data'; import 'dart:math' as math; @@ -203,8 +204,32 @@ class NanoDlpSimulatedClient implements BackendClient { @override Future getAnalyticValue(int id) async { - // Simulated client does not provide scalar analytic values. - return null; + // Smoothly ramp to a large peak after restart instead of an instant jump. + final now = DateTime.now().millisecondsSinceEpoch / 1000.0; + const period = 60.0; // restart every 40 seconds + final elapsed = now % period; + + const maxAmp = 6000.0; // target peak amplitude + const decayTime = 30.0; // seconds to decay back down + final decay = math.log(30.0) / decayTime; + final envelope = math.exp(-decay * elapsed); + + // ramp up over the first few seconds after a restart to avoid an immediate jump + const rampUpTime = 2.0; // seconds to reach full amplitude + final ramp = (elapsed >= rampUpTime) ? 1.0 : (elapsed / rampUpTime); + + // use cosine for oscillation, scaled by ramp and decay envelope + final raw = + math.cos(2 * math.pi * (elapsed / 3.0)) * maxAmp * ramp * envelope; + + // small random noise in [-5,5] + final noise = (Random().nextDouble() * 10.0) - 5.0; + + // once the oscillation has decayed below ±5, return only the small random noise + if (raw.abs() < 5.0) return noise; + + // otherwise return the oscillation with a little jitter + return raw + noise * 0.2; } @override @@ -260,4 +285,10 @@ class NanoDlpSimulatedClient implements BackendClient { _tickTimer?.cancel(); _statusController.close(); } + + @override + Future tareForceSensor() { + // TODO: implement tareForceSensor + throw UnimplementedError(); + } } diff --git a/lib/backend_service/nanodlp/nanodlp_http_client.dart b/lib/backend_service/nanodlp/nanodlp_http_client.dart index b2fd88a..0e3fdb9 100644 --- a/lib/backend_service/nanodlp/nanodlp_http_client.dart +++ b/lib/backend_service/nanodlp/nanodlp_http_client.dart @@ -756,8 +756,35 @@ class NanoDlpHttpClient implements BackendClient { } @override - Future> manualCommand(String command) async => - throw UnimplementedError('NanoDLP manualCommand not implemented'); + Future> manualCommand(String command) async { + try { + final baseNoSlash = apiUrl.replaceAll(RegExp(r'/+$'), ''); + final uri = Uri.parse('$baseNoSlash/gcode'); + _log.info('NanoDLP manualCommand($command) request -> POST /gcode: $uri'); + final client = _createClient(); + try { + final resp = await client.post(uri, body: {'gcode': command}); + if (resp.statusCode != 200) { + _log.warning( + 'NanoDLP manualCommand($command) failed: ${resp.statusCode} ${resp.body}'); + throw Exception( + 'NanoDLP manualCommand($command) failed: ${resp.statusCode}'); + } + try { + final decoded = json.decode(resp.body); + final nm = NanoManualResult.fromDynamic(decoded); + return nm.toMap(); + } catch (_) { + return NanoManualResult(ok: true).toMap(); + } + } finally { + client.close(); + } + } catch (e, st) { + _log.warning('NanoDLP manualCommand($command) error', e, st); + throw Exception('NanoDLP manualCommand($command) failed: $e'); + } + } @override Future> manualCure(bool cure) async { @@ -1260,6 +1287,16 @@ class NanoDlpHttpClient implements BackendClient { return (400, 400); } } + + @override + Future tareForceSensor() async { + try { + manualCommand('[[PressureWrite 1]]'); + } catch (e, st) { + _log.warning('NanoDLP tareForceSensor error', e, st); + rethrow; + } + } } class _TimeoutHttpClient extends http.BaseClient { diff --git a/lib/backend_service/odyssey/odyssey_http_client.dart b/lib/backend_service/odyssey/odyssey_http_client.dart index 2594387..260e13a 100644 --- a/lib/backend_service/odyssey/odyssey_http_client.dart +++ b/lib/backend_service/odyssey/odyssey_http_client.dart @@ -359,6 +359,12 @@ class OdysseyHttpClient implements BackendClient { // TODO: implement disableNotification throw UnimplementedError(); } + + @override + Future tareForceSensor() { + // TODO: implement tareForceSensor + throw UnimplementedError(); + } } class _TimeoutHttpClient extends http.BaseClient { diff --git a/lib/backend_service/providers/manual_provider.dart b/lib/backend_service/providers/manual_provider.dart index caf5c04..7920e1a 100644 --- a/lib/backend_service/providers/manual_provider.dart +++ b/lib/backend_service/providers/manual_provider.dart @@ -233,4 +233,24 @@ class ManualProvider extends ChangeNotifier { return false; } } + + Future manualTareForceSensor() async { + _log.info('tareForceSensor'); + if (_busy) return false; + _busy = true; + _error = null; + notifyListeners(); + try { + await _client.tareForceSensor(); + _busy = false; + notifyListeners(); + return true; + } catch (e, st) { + _log.severe('tareForceSensor failed', e, st); + _error = e; + _busy = false; + notifyListeners(); + return true; // Return true even on error to avoid blocking UI + } + } } From 7c460509e02123738d91af7e5e1165da25a36e77 Mon Sep 17 00:00:00 2001 From: PaulGD03 Date: Thu, 16 Oct 2025 22:29:03 +0200 Subject: [PATCH 43/44] feat(force_screen): integrate manual tare via ManualProvider; add dev raw-force formatting; refine chart window/scale, pause behavior and UI spacing --- lib/tools/force_screen.dart | 275 ++++++++++++++++++++---------------- 1 file changed, 151 insertions(+), 124 deletions(-) diff --git a/lib/tools/force_screen.dart b/lib/tools/force_screen.dart index 5a8cb9d..5149dea 100644 --- a/lib/tools/force_screen.dart +++ b/lib/tools/force_screen.dart @@ -19,7 +19,10 @@ import 'dart:math'; import 'package:fl_chart/fl_chart.dart'; import 'package:flutter/material.dart'; +import 'package:orion/backend_service/providers/manual_provider.dart'; import 'package:orion/glasser/glasser.dart'; +import 'package:orion/util/error_handling/error_dialog.dart'; +import 'package:orion/util/orion_config.dart'; import 'package:phosphor_flutter/phosphor_flutter.dart'; import 'package:provider/provider.dart'; import 'package:orion/backend_service/providers/analytics_provider.dart'; @@ -56,96 +59,133 @@ class ForceSensorScreenState extends State { @override Widget build(BuildContext context) { - final prov = Provider.of(context); + // Use listen: false to prevent automatic rebuilds - we control it via _listener + final prov = Provider.of(context, listen: false); + final manual = Provider.of(context, listen: false); final series = prov.pressureSeries.isNotEmpty ? prov.pressureSeries : prov.getSeriesForKey('Pressure'); bool isLandscape = MediaQuery.of(context).orientation == Orientation.landscape; void togglePause() { - setState(() { - _isPaused = !_isPaused; - }); + setState( + () { + _isPaused = !_isPaused; + }, + ); } - void doTare() { - // Tare to the latest sample value if available - final values = series - .map((m) { - final vRaw = m['v']; - if (vRaw is num) return vRaw.toDouble(); - return double.tryParse(vRaw?.toString() ?? ''); - }) - .where((v) => v != null) - .cast() - .toList(growable: false); - setState(() { - _tareOffset = values.isNotEmpty ? values.last : 0.0; - }); + void doTare() async { + try { + await manual.manualTareForceSensor(); + } catch (_) { + showErrorDialog(context, 'BLUE-BANANA'); + } } return Scaffold( - body: Padding( - padding: - const EdgeInsets.only(left: 12.0, right: 12.0, bottom: 6, top: 6), - child: isLandscape - ? buildLandscapeLayout(context, series, - isPaused: _isPaused, - onPauseToggle: togglePause, - onTare: doTare, - tareOffset: _tareOffset) - : buildPortraitLayout(context, series, - isPaused: _isPaused, - onPauseToggle: togglePause, - onTare: doTare, - tareOffset: _tareOffset), - ), + body: isLandscape + ? buildLandscapeLayout( + context, + series, + isPaused: _isPaused, + onPauseToggle: togglePause, + onTare: doTare, + tareOffset: _tareOffset, + ) + : buildPortraitLayout( + context, + series, + isPaused: _isPaused, + onPauseToggle: togglePause, + onTare: doTare, + tareOffset: _tareOffset, + ), ); } } Widget buildStatsCard(String label, String value) { return GlassCard( + margin: const EdgeInsets.only( + left: 12.0, + right: 0.0, + top: 6.0, + bottom: 6.0, + ), child: Padding( - padding: const EdgeInsets.all(16.0), - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Center( - child: Text( - label, - style: const TextStyle( - fontSize: 16, - color: Colors.white70, + padding: const EdgeInsets.all(8.0), + child: Center( + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Center( + child: Text( + label, + style: const TextStyle( + fontSize: 18, + ), ), ), - ), - const SizedBox(height: 8), - Center( - child: Text( - value, - style: const TextStyle( - fontSize: 19, - fontWeight: FontWeight.bold, - color: Colors.white, + const SizedBox(height: 8), + Center( + child: Text( + value, + style: const TextStyle( + fontSize: 22, + fontWeight: FontWeight.bold, + ), ), ), - ), - ], + ], + ), ), ), ); } +OrionConfig config = OrionConfig(); + String _formatMass(double grams) { - // Show in kg when >= 1000 g, otherwise show in g. - if (grams.abs() >= 1000.0) { - final kg = grams / 1000.0; - // Show kilograms with two decimal places (x.xx kg) - return '${kg.toStringAsFixed(2)} kg'; + if (config.getFlag('overrideRawForceSensorValues', category: 'developer')) { + final negative = grams.isNegative; + final absVal = grams.abs(); + + String withCommas(String intPart) { + final buffer = StringBuffer(); + int count = 0; + for (int i = intPart.length - 1; i >= 0; i--) { + buffer.write(intPart[i]); + count++; + if (count % 3 == 0 && i != 0) buffer.write(','); + } + return buffer.toString().split('').reversed.join(); + } + + if (absVal >= 1000.0) { + // For 1,000 g and above, show whole grams without decimal places. + final rounded = absVal.round(); + final intWithCommas = withCommas(rounded.toString()); + return '${negative ? '-' : ''}$intWithCommas'; + } else { + // Below 1,000 g show one decimal place. + final fixed = absVal.toStringAsFixed(2); // e.g. "999.99" + final parts = fixed.split('.'); + final intPart = parts[0]; + final decPart = parts.length > 1 ? parts[1] : '0'; + final intWithCommas = withCommas(intPart); + return '${negative ? '-' : ''}$intWithCommas.$decPart'; + } + } else { + // Show in kg when >= 1000 g, otherwise show in g. + if (grams.abs() >= 1000.0) { + final kg = grams / 1000.0; + // Show kilograms with two decimal places (x.xx kg) + return '${kg.toStringAsFixed(2)} kg'; + } + return '${grams.toStringAsFixed(0)} g'; } - return '${grams.toStringAsFixed(0)} g'; } Widget buildControlButtons(BuildContext context, @@ -155,14 +195,6 @@ Widget buildControlButtons(BuildContext context, final theme = Theme.of(context).copyWith( elevatedButtonTheme: ElevatedButtonThemeData( style: ButtonStyle( - shape: WidgetStateProperty.resolveWith(( - Set states, - ) { - return RoundedRectangleBorder( - borderRadius: BorderRadius.circular(15), - side: const BorderSide(color: Colors.transparent), - ); - }), minimumSize: WidgetStateProperty.resolveWith(( Set states, ) { @@ -177,6 +209,12 @@ Widget buildControlButtons(BuildContext context, children: [ Expanded( child: GlassButton( + margin: const EdgeInsets.only( + left: 0.0, + right: 12.0, + top: 4.0, + bottom: 6.0, + ), tint: !isPaused ? GlassButtonTint.none : GlassButtonTint.positive, onPressed: onPauseToggle, style: theme.elevatedButtonTheme.style, @@ -189,17 +227,24 @@ Widget buildControlButtons(BuildContext context, : const PhosphorIcon(PhosphorIconsFill.pause, size: 40), const SizedBox( height: 8), // Add some space between icon and label - Text(isPaused ? 'Resume' : 'Pause', - style: const TextStyle(fontSize: 22)), + Text( + isPaused ? 'Resume' : 'Pause', + style: const TextStyle(fontSize: 22), + ), ], ), ), ), - const SizedBox(height: 16), Expanded( child: GlassButton( + margin: const EdgeInsets.only( + left: 0.0, + right: 12.0, + top: 6.0, + bottom: 4.0, + ), tint: GlassButtonTint.none, - onPressed: onTare, + onPressed: isPaused ? null : onTare, style: theme.elevatedButtonTheme.style, child: const Column( mainAxisSize: MainAxisSize.min, @@ -207,7 +252,10 @@ Widget buildControlButtons(BuildContext context, children: [ PhosphorIcon(PhosphorIconsFill.scales, size: 40), SizedBox(height: 8), // Add some space between icon and label - Text('Tare', style: TextStyle(fontSize: 24)), + Text( + 'Tare', + style: TextStyle(fontSize: 22), + ), ], ), ), @@ -229,9 +277,11 @@ Widget buildPortraitLayout( children: [ Expanded( child: GlassCard( + margin: const EdgeInsets.all(0.0), child: Padding( padding: const EdgeInsets.all(16.0), - child: _PressureLineChart(series: series, tareOffset: tareOffset), + child: _PressureLineChart( + series: series, tareOffset: tareOffset, isPaused: isPaused), ), ), ), @@ -272,35 +322,33 @@ Widget buildLandscapeLayout( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ SizedBox( - width: 130, + width: 140, child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Expanded( child: SizedBox( - width: 130, + width: 140, child: buildStatsCard( - 'Current', - _formatMass(currentVal), + 'Maximum', + _formatMass(maxVal), ), ), ), - const SizedBox(height: 12), Expanded( child: SizedBox( - width: 130, + width: 140, child: buildStatsCard( - 'Max', - _formatMass(maxVal), + 'Current', + _formatMass(currentVal), ), ), ), - const SizedBox(height: 12), Expanded( child: SizedBox( - width: 130, + width: 140, child: buildStatsCard( - 'Min', + 'Minimum', _formatMass(minVal), ), ), @@ -308,19 +356,15 @@ Widget buildLandscapeLayout( ], ), ), - const SizedBox(width: 12), Expanded( flex: 3, child: GlassCard( - child: Padding( - padding: const EdgeInsets.all(2.0), - child: _PressureLineChart(series: series, tareOffset: tareOffset), - ), + margin: const EdgeInsets.symmetric(vertical: 4.0, horizontal: 12.0), + child: _PressureLineChart(series: series, tareOffset: tareOffset), ), ), - const SizedBox(width: 12), SizedBox( - width: 130, + width: 140, child: buildControlButtons(context, isPaused: isPaused, onPauseToggle: onPauseToggle, onTare: onTare), ), @@ -331,14 +375,16 @@ Widget buildLandscapeLayout( class _PressureLineChart extends StatefulWidget { final List> series; final double tareOffset; - const _PressureLineChart({required this.series, this.tareOffset = 0.0}); + final bool isPaused; + const _PressureLineChart( + {required this.series, this.tareOffset = 0.0, this.isPaused = false}); @override State<_PressureLineChart> createState() => _PressureLineChartState(); } class _PressureLineChartState extends State<_PressureLineChart> { - static const int _windowSize = 600; // stable X-axis window + static const int _windowSize = 900; // stable X-axis window, 15Hz * 60s double? _displayMin; double? _displayMax; double _windowMaxX = 0.0; @@ -463,25 +509,10 @@ class _PressureLineChartState extends State<_PressureLineChart> { void didUpdateWidget(covariant _PressureLineChart oldWidget) { super.didUpdateWidget(oldWidget); final spots = _toSpots(widget.series); - _updateDisplayRange(spots); - } - - Widget leftTitleWidgets(double value, TitleMeta meta) { - const style = TextStyle( - fontSize: 20, - ); - String text; - if (value == 0) { - text = '0'; - } else if (value == _displayMin) { - text = _displayMin!.toStringAsFixed(0); - } else if (value == _displayMax) { - text = _displayMax!.toStringAsFixed(0); - } else { - return const SizedBox.shrink(); + // Only update display range when not paused + if (!widget.isPaused) { + _updateDisplayRange(spots); } - - return Text(text, style: style, textAlign: TextAlign.left); } @override @@ -489,7 +520,10 @@ class _PressureLineChartState extends State<_PressureLineChart> { final spots = _toSpots(widget.series); if (spots.isEmpty) return const Center(child: Text('No data')); - _updateDisplayRange(spots); + // Only update display range when not paused + if (!widget.isPaused) { + _updateDisplayRange(spots); + } final displayMin = _displayMin ?? spots.map((s) => s.y).reduce(min) - 1.0; final displayMax = _displayMax ?? spots.map((s) => s.y).reduce(max) + 1.0; @@ -503,13 +537,6 @@ class _PressureLineChartState extends State<_PressureLineChart> { ), gridData: FlGridData(show: true), titlesData: FlTitlesData( - /*leftTitles: AxisTitles( - sideTitles: SideTitles( - showTitles: true, - reservedSize: 60, - getTitlesWidget: leftTitleWidgets, - ), - ),*/ leftTitles: AxisTitles(sideTitles: SideTitles(showTitles: false)), topTitles: AxisTitles(sideTitles: SideTitles(showTitles: false)), rightTitles: AxisTitles(sideTitles: SideTitles(showTitles: false)), @@ -519,8 +546,8 @@ class _PressureLineChartState extends State<_PressureLineChart> { maxY: displayMax, // Fixed screen range so the grid remains stationary while the data // moves underneath. X runs from 0 to _windowSize-1. - maxX: (_windowSize - 1).toDouble(), - minX: 0.0, + maxX: (_windowSize + 10.0).toDouble(), + minX: -10.0, lineBarsData: [ LineChartBarData( spots: spots, @@ -536,7 +563,7 @@ class _PressureLineChartState extends State<_PressureLineChart> { isStrokeCapRound: true, dotData: FlDotData(show: false), color: Theme.of(context).colorScheme.primary, - barWidth: 2, + barWidth: 1.5, ) ], ), From 9773d515fc80a75d548a5ea31227a93efdbbdfc1 Mon Sep 17 00:00:00 2001 From: Paul_GD Date: Tue, 21 Oct 2025 13:07:19 +0200 Subject: [PATCH 44/44] feat: Startup Screen (#38) * feat(assets): add dark mode logo for Open Resin Alliance * feat(home): add StartupGate widget to manage initial app content loading * feat(status): enhance initial connection handling and status response tracking - no need to increase backoff drastically while waiting for API to be ready after boot. * feat(util): ConnectionErrorWatcher: add initial startup state * feat(home): add StartupScreen for initial app loading overlay --- assets/images/COPYRIGHT_NOTICE | 12 + .../open_resin_alliance_logo_darkmode.png | Bin 0 -> 633111 bytes .../providers/status_provider.dart | 26 +- lib/home/startup_gate.dart | 87 ++++++ lib/home/startup_screen.dart | 295 ++++++++++++++++++ lib/main.dart | 14 +- .../connection_error_watcher.dart | 19 ++ pubspec.yaml | 1 + 8 files changed, 447 insertions(+), 7 deletions(-) create mode 100644 assets/images/COPYRIGHT_NOTICE create mode 100644 assets/images/open_resin_alliance_logo_darkmode.png create mode 100644 lib/home/startup_gate.dart create mode 100644 lib/home/startup_screen.dart diff --git a/assets/images/COPYRIGHT_NOTICE b/assets/images/COPYRIGHT_NOTICE new file mode 100644 index 0000000..dab975d --- /dev/null +++ b/assets/images/COPYRIGHT_NOTICE @@ -0,0 +1,12 @@ +ORA Logos Copyright Notice + +The ORA logos (including, but not limited to, "open_resin_alliance_logo_darkmode.png") are NOT covered by the Apache License, Version 2.0 that applies to this project. The logos are protected by copyright and may also be protected as trademarks. All rights are reserved by Ada Phillips. + +You MAY NOT copy, distribute, modify, publish, display, or otherwise use the logos except as explicitly permitted in writing by the copyright/trademark owner. + +Repository source code and other content are licensed under the Apache License, Version 2.0 unless otherwise stated. This notice applies only to the logo artwork referenced above. + +To request permission to use the ORA logos, contact the project maintainers or: +contact@openresin.org + +© 2025 Open Resin Alliance. All rights reserved. diff --git a/assets/images/open_resin_alliance_logo_darkmode.png b/assets/images/open_resin_alliance_logo_darkmode.png new file mode 100644 index 0000000000000000000000000000000000000000..af00aa24902f63c5d27b82cb4d24ea6a2db3751b GIT binary patch literal 633111 zcmeFYWn7z2vp*bYDFs?66m5%?BE^EcTZ_8|x8M#zik4C+P^5TqDDG|nQrx9T&_Iiq z;O_iG`@8RR&U4Or{%@Zb&x_=fy=Hf^GdnXo^WD8dRg~U7#(stk0017#%1EgJ02uRk zpN9`nPx!bM%mIM=!`2!)ZaRtz0%nf(KofIEQ!voe-U&qq0E9$6olMMZ!ERKhU`uNU zVd`BdjGD^YT$oy$TaiuCNfK;jE%VL=to}|(!|a`{8NWHTs0g-@rvQq9J=o2J%G2J? z!BxOhnEDT20o3oi$E?&;f4aEY3RCMSs!&Nfx`3&;f!shgY7uNIAs2HC0X3;N{|rX8 zgsH9E+?)hhSv@>FfF7JcM;A+0c7A?-RyGb+4h|Mn4;EK12R9Q>76;c?cP#$$kOI4! zxmY{7SvxvV-SIRrb%eMHQ&XepRR1ssds_bocL&#h#78ND^^U^I4rF8f&)wauE&iA8 zca;Cu-O0+)&C%7$(dpj;{FlG@H~GH}M5*t89^z@@^gnf0RQ!MMZg2lz#BgC z#`gapgZ@{tq@$gqi#p1%z{1o#+}xbpe@5PEP(aq+#1gD+ZSH3EpLqTUMFH$!`QJ%* zv$TWUEwiSBHA*gy|KO+dA2eZVPBu1H_Wz)P{%6|1S4H5@JQW?yQPbr7GweS|vXYW2 zE{+z~b|{*Zw1NVa3I{I-r<63xlu@!#{X=7x;`x_eP%A2cVr6aNC1v7<8pOfI!Og

R>xl;+DMkp!@$XL6&Il6fLdGyx@ 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�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 K$d=M!ZyZ_JS<)tnbd-zmR(|SXZjmV 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≫=4y!26xv}2u4%|6bj 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

Jhp!8a2`}9c3`U8v>j@RxxP#= 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 z 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 z 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

GPSICd-1jpRIkmh2XJ)x5jKa4IIrlT&{ZC@R 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
nG1@qrp4? zxCZ_^THhot>q#r*o2r+|HEF}PshuQH){+Xkh*alID=+p9NM`0!{3+=4<5e=83ro71 zFxa-&N3$6kKbkz_JDRllAg!7Hu+Fr8%O{_2H{BsJc0HCZL*1ykPkwrO-D|LU8^|HU zHHK00hqTRCx9$XyC$GaxRjS3)D&$bShF7OlnB_G=;QMlX3)CM?_%`AU05GGwhV6uT z(`?X2bU@5aAm6wnW-|RIM9piomu~w}eIE|}Y(q-E$*T{8-+La9Ipg#>QgtX|XAC|8 z)=@&qA%IvT^QS8d+tys%%MJ%x7A>WE9FpJnnS1IA8${Fy{G#h5m2Z7`PI?Sf-+T&+ ztEX?L>MHdE%}Uw$GYPo_Y^|8e<5W_mxyMSvWk2PMG#2$3e3k*4%6{GMgV}})&ip~P z=wGIb@o!`(wfS9RVbz8b&~RMHPXW*qHg1>lX;u_KnWrmjU!X_xd(yUnaX@J&h@)4HIgjFzZ`{Z zR6)$mN?c>9YXRikoLj)kmSm7Z-}9v3IvzUE@vvi*U&C*&Z$vxshmby1lg2Y$RiH+G zFmH75v$1t6mWjHG`A?t0{sT4!1H=ls=G(X?<+kPg;CGdH-6|Egcx|ukd>kXuSF`J{ z3c#W4`?$ybi>w|t9Wh|y=^rGC_a%F4qoHd@_H8J(PjO+JVl@M3%d%6+&$9k_7~x5o zTf)GB!voS_ne0M1P~$-%=oMY!@4HJ7?{ED>y@q6K{oi)(z-=&ypEzLUzns`21LY9*pKF z-UzNYu6YyJl+M?30aA71lVSz{NWb9i1+$4;5^Au|^jIf}y4r8bi9E`db^NNc6Boy6 z#*Fw{lrmDk9mvh7F=Di-F^Fsl=k}zU9(xl|!Mb7|5GTXX{V8yV6$@O@Np()>NmZ^$Lf5&YR^kV1H}aJPjpGl$rkf;g zB-LN-7r_jf2mm4Ba@VA#F{r3OSI5!=v_5N4F}8-j$UteuA6=~NWt13~9n(1SGwcL~ z_v{PCJ5L`E;jNC$h9>1zL31aTnM|bnv0qUIpBK23cVJEI&BfcSL=Q%dQ@T&inb|4icsHcQ%5$rQTLof*Q`M64sO0r6%MqBeB6lDvR4~%9G-Nh230yY00cE z<=4LL(kFvbuS~ael4&%!d+;Ztt%>w3pZ!B+s_pqvzpR^(0t?i6l}{$hDMkta(0ifH zW4%5w(J+3_2VQcP_!2s!KgB2XHPC=?JX5U{Q}+Z)Hu}>l`{=^nQ`t{%07qu`BZ|Sr-`;V) zw-c%mf}Le3iBMHP9IcMSX0Jza%K9sL%^R!Y*FPlp^FL&)l-qH#CY&t*k5iij1%c`< zw>UA-Z4u|k)_wH|YA?e++yc}=B_DGKpMV3(Cohi-VG-!?$6y0o!!u8} zc>`LI>?G4hV!liyR6E*Xr+)hrX$1VgB|%wuB_MZ`4PV78=>=J*$9{LH2L*#vV#LWH zk$>7o;|;c>@szY!&p!{qAD5A+i}}?CZlkbWx5dj2JiSLdc^YLiFg;yW_V!Ejts|Kf zHmH!W)HV4WCxQRnTXcA;PFiBbSD7=nN^g;ZNSr3szUC+XT$_U^oWT?v!*_PHDuJgr ziYUMiqnqpqwD-{(0MMRzfv!*1c;48pWLTc@CrfB5d`7FRCUIluV1#%A36#xPCI7Gv z?pB5dyMFSo_(3~<3umi%g@-Qdr+TdkE3Tdor z;xIDqMJddFluIS)&xKI|Cp?JHq}K~~ZF?wIIctm?6iC^8J({*)YtMqvl_BKT9Td|3 z=(!xh4lqjW^1QNFwf^;)8~K@SLI8lkA_@2x?^%KJSA+6B;VH&E{XyBIxXI_>QZJCB z&W>!;sl|RCy5qpvnzKDiu|F|NH`hpZMk_toI#3256Jl;%N5G^djfbFc1usn`y-gi2 z!oUkoXV<8?#WrSawajVty7r}VHj_>5`bDkBOa|F1<+HUGT@=Hjb8&LpnVRNN3>n< zeE>;JkGdppeM(jI_8Uk+`^{|#$XzJD8P>s%rH9a2W?_+Kx*TRIP~@gH-eW6e{`Z3B z`P4hS;Vsrtc6u{C?vnwWQkt-Vh}IW_)v$$UQ_?{w72jld5nn~$*Z5RxnrGbj`kHow zf}za*T=@Qo6pB< z-m=v>CN5MEgU7kcM7LpO4JB|o});8DDhl-WP zSzqhtnvhsB0H7EMcU42|dGjw=-P4BAZL#FH~l-04#5jDp!gAWm7IYtQDTe<3$sgmBUBS9zIm-?Kqaqn>~11 z1pGV`&*vIETl-VO`AgBPO5*J65uUl~bSxh3B+lc~q_bng?1}@0(B1$$XSPY+w{}7( zp~KY`MJKEv9aMkNqv?hC%!Sa|83>o-qjK9DA7+@_KVKkeLU-sLF>*r_s~RA1mVGrWakF~;NYlG{ zWv)zDafoD_m1kaiQ|(q;b0Buir0ipeV& zXq`5L#sz$_oAS$2p0M$H@GttKzMr+cVX}gp{q-Wx3z#>H7tyqa!k^A-F*?yYsJF~M zOa$$hZyCic@vONE%C5=o`~gzc~!qcKSl zpH%E+b*7I)A%SGqWFGVIddEsubc8-Va^%lM@wC$|}HY7o~J$nXQ zZaT+g4jpdj%|DjrqgnvK@lLnwmM5Ca-57`sS~2=^!~*@K$JA7?;BQO)Yt3G0$M5xo zUm-R4_+UsrzVlLA8Bgp8rfa62_~`!~X?t0vhqRwOTk0-ceMb(#Zs%ARyJ#PvU^kP6 z#uPKX;h|W;s!?5f6fzIc2=Y;#4{o6sKqgEZq=0*Y5wX^$>vIGWu znWph?OfC)ssV@16N0T@Iuf1>oXR?p~-+gy*cdOiYDJh5CIV7RTA*a$wb4a2bH~!q)g5nhb;$P_`Tsl@}$BO-H}2+p+BJWo=hkruHH**PdxWcE{H=}36 z@fF-4t<331;l4flA^z7@?xG?!Wjt&qk+km&`Lk(+qn4>!hp(N{ zX>9lHXGKEc?q#!&D%qDaFRy+Bu%Xj#|Lt7*x0SMPi5i&BaAVoB*$XyQ)hc_YONwc# zlw84`_WKrmrD?C&~)`F3Wv6(gv?wXh>UVfz&Z{tg=svpUz z6}4_;-3X;}qBt3Chv!_XId4fZvZF<#O^+>bG51YMkVCe}^8&~{PTy6d|5jl9HVJ5Y zya{dX(a8BI?WC<+mX)?zt8%RA>s>U&*ND_54Elullisec+Q_ny{8+pZHt0T>1a8Rz z0x&4%`QrO^BNk4QuZW~8dq~)H* zJ$5h^8_3Ap(J{dJ$_6!fM(<&&9PDg)VBYtwVOi}O8B7$;>a#O@T2`tj0uTr~2y|Y3 zBv-rGxPC+1-M8Zv--^NBaPqzY7ffQR{PJP!IpBDW zU@IS7;}D|&NN8relYgjGH9_cycwD-O{xo;*r(Hku`9ys4(`0u6@WJ0&DzNxeHqZi8&6rW z|9uT25ByrRkqHR&a-a2+g5AQB*FYAYrFA-W3AnK-jZU4$6-&~#Wdf!Pa9U+?$*jaimg+yYN;V)(g_vbc4{Zo7pZXw=eUKfo* zJP*Q-A*>o~%nhzq*JYlY{>y+3=L_Q}t7N>8H;QbV#(9EcKlg&_2wS$>hCeLrfi5_? zMCgO4p2o}0DIqYfva)`Lp_zqgFZ6pNg?6M@Z4Y}IGzxp*gYHatk2ce6^>YkkZrD(l zJ01fl)5|BMLrzi!Oxn=FW#?)8A=8V$P}BPMT1p0|{~?f;Q^}EPBlyF6uH;6IhzvT% zxamuYb`5&p2K~D);xj9bw*7VOWqWqlvQZ{g`^5T({Q~5S2I0pM!TK+InF?MEVCU}E zS$~3@4pi9jdl=Rc&yd}y=cb}yw^X7O$@WB!PXH?|rP_A+v6V%GHOA#h)zHXSAFXOY z@&h>o5PY#^+f$3mXTUcl5$zqk*61%5!riX5{itsVGkoaL+9bgn>(ay1%4I$`J_%1L z{85KS{k-4K@gU^=Nl?`53-D69WOeNDa39R$dRK?cEahK5<*X7v7(8EmZi&#&iC}ZK zgGQW=i3^w$LFrz^KU4A$7Mi&j6J|ff(6IyGiRZl?{@AsibjFh`4aHGCWObH3@JE7R=mG|9$qQOhsf zQ4Rh8ke{&EYqi3ARZHs6iMY-Md|L579sZ&wtiG%3WpvZ#>S^%i#QtJM%Cbu%knSjN znX9LzJkF57QtULee1iRH#5y`w$Gc8j14b;9(T%45FMZbAD_5S4#mCS&HYOL5- zUxErw676=PO1?llKR)fnNpYm43OxwfMYelEpuiSdt3Y+HyDd>OyUd$HI>q7M<=P*c zAPu-T`2IWl+s253>Xmw};86YckNc%eR`zDboiEBfS=-@VaKpJ7^F<5%%lt}?h1wF= zd{e}1-k-XJP;Q!i#|1Lif5ch!Z;CNLWPBFfFy8scUX9I$9x|@T{9d)=L%(-ry2k7D zlXaf!9L>%!34&K8^G^CmjAEc-Zr96tF%;>6ct7c|3p-q-?~Ihg+Yep29}O4&USJoT z_;*NsU4!~w)=9SGQ>q?)EhTtp5>6*O{4oT(eG=R?)_ zj{r{g;z1DNS!c^}cwFD1kUbbWkcmBOEJiVuCUN02km5!;jomcbx5XprFTNZ-W~P`d zj)#;Qb#*Nu?~9Tjn#MC|!d;RR6RQh43R8t|`JCHGQ#j7IJkJn<>d1=wT}XmBGUf)D z!STR!n^ms{Co2R+0!{3q8z#T*ga3WPP-t-KQt?jkQc`;tBQgnpocS4rwu4o>vj0gw zHy=~1=t_wb90G;N{nwRdcGO-+gqL;Ld9xoBp;QR4h#mLd=GVbY4^j>0ac)f)h3Wk%a<;au(WXQ&So}_SKkD+} zN$iWqu+3%ocalbhRUU!s&Yb*JSO08FPBIeApl6fbvR_kO>63Wa^Fe4<;LnC0>FofiS+Jnhq&pGE5^qEto!vB97E;4H!p0 zKyF~xfczz4l;BD|KlqqfD7qsbg6KnB9o1LI3S?1akuT$c+$HpKxIiE&lkz60zAda5 zk!p2r1CR{4i`gPLrMnrkCzpy2s6(*cmW@)Ce{z_96;i*ND1}0) z;ihhR`$TF%cxn4o;(WAX{p`XuvwO#At>g}(kEPJPwO1YBcI|s=OTGh3OW^HZY0=Wl zStc|#KE3pO=^_S7=@kHG3>MF_>|KOCU%vmb<2&7f)ooG_Z7Taf~&aR z?UtvBc;*hCMHO^{dEl~pH4UG?-m<a@P%jH!m8%Q%r+FAksyW zJZR)|IMZeN>tt8tksa^W25YWl&Xz!Z4@H(v>*KD)q%l3eSIspC)!fw9dX%-tG2!Qa z^;>S?Kv2`{O9!~?>md-AljB8rmgPrecM9W&5+%4Mckt~=8?3xL58S&ZiMg$=q?=YzMm5~lEhPt{YdNY|cw zSS?jz8YnA6& zF$ZUXqeD({lX|y?m$*2yFS3&S(qHm#>6xdW{5z1UU?qw6#pPzn_q2<-GqoyZ=xs|PeO&D0 zn72|R?JY=04OpN2bTtLap;?3}*J;&#^IA zbCcLEDY4{#a!@b^{W0WIpy2muNbAu7vzx#BGzMPRQH^Ma`1t2*gFuxQ75)a7JtLjX ze9F3uJF&YH>ddM*cMInEPOdyUi@SKvePWPM>+1~|t>wono0hEM7L3_v#lL!E~ z+DrTNAgIZEnX95W_ZN_P(BS5(dF99G#pc)vSG*%@VVPR4|H-Tu7M*?TN)augmsPtv zk_cNcqkGM$Z!;s}6luH>y2jd1b-Y4qcEp!PtF-TP+5U2z1(7pCl9*lLUcfA{7G@R_ z)vlc*_2Nc>j7VOb5xtot97&(bLwLJ}-FY4>H^VqJz^Uzu6i{v!Kr_);1dNE_y@8LB zEaMj+;>6x=AV+e+t`;6R)nJxBxQTuwQjT8h_jr)H4xTc}v)1a9W zd^Xd|p1wF<5m2gZz3UTVbN5NMk1s6T&R+&p*}D}V4f=LT9cEnZ<%3ZpjXp*bI=Z+= zF_~|>n$lkEg5)flMElQ$;ttQfnSP!`!0NwJ@4w?T)AGz+DxT}MIjH*;IE(3lfM!UO z%UN1`?6cQMp+hx=4y{e_hp6iWWn%j7pP}qXbtX&^YbYzH@#*AAQvc9=SSnRd6p2nk zsmf2j{-NS;K^uSR-H!4xA*daAhiPH9pW!pQg+f%E}fq~xLr||U|OW+6e-czkrTv)kRP$-Eg$f%doBgR#JJ8t6IP{LZ8|Y<8A&6# z4XL<~!%oS@Fd5$Otj3wYT12n$TyACe&NW6+O7uGj#=7BT^5PuArioJuvvuG6A@t=& zuTV8uIT}EaFb7b*kh;ukSN&xt$E#X!AN|R1S&?oQkSX0Bf7efXqif5mrOnoJ!L)F} zm&|P-4=lr=#|<+PaJPOAy-aIoPCVA9seHGDt#B@|?#7Gs^+U@&UFFis`6+tXrI`=L zXM=i*U$2efA;D#&`2{?6DurcYaXu7hT7tpl zObO@Rzz@Pz2=#`2>!~q=z8(KMlII-INav4h5!uN-dH}F<2kFc(HB!Vz);wmq5@aOc zEc}tdj5*oPFm)%%2K02jl<rq4_J6KNc*Jyur0x1HP=Ej63^gxq<&$hIDh3 z9#0DNPA4txH;`N;LlpnABxu&r5nu$ic@||cnWF7Jkn^ZUTW(9u_s3ZT$=R)Dw1>7^ zZ%Om2R+)TtpH6VWbd>uQA1CM)%!PBdG2~}c`t;k;nL~{9+^UF^*roM@zR2>rB|UZ0 zizl#OqzW>$!a7!wLV9kY`QUh4Z}Z}eh+9{h3Ru!EaS55kjt~xB*^^=1rR6+lNGYMv zAKI1n9c)=C0r(C5)e{7VVrc;Q;e=!K)m&G?@VSB0wDyNznpK>rfxe+M(H>p=c#-

5K54l1Z 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 literal 0 HcmV?d00001 diff --git a/lib/backend_service/providers/status_provider.dart b/lib/backend_service/providers/status_provider.dart index 89e25a5..cd9b6bc 100644 --- a/lib/backend_service/providers/status_provider.dart +++ b/lib/backend_service/providers/status_provider.dart @@ -135,6 +135,19 @@ class StatusProvider extends ChangeNotifier { // int _sseConsecutiveErrors = 0; // reserved for future use bool _fetchInFlight = false; bool _disposed = false; + // True while the provider is attempting the first initial connection. + // This is used by the UI to show a startup/splash screen until the + // first status refresh completes (success or failure). + bool _initialAttemptInProgress = true; + + bool get initialAttemptInProgress => _initialAttemptInProgress; + + // True once we've received at least one successful status response. Used + // by the startup gate and connection error handling logic to differentiate + // between initial startup and post-startup connection loss. + bool _everHadSuccessfulStatus = false; + + bool get hasEverConnected => _everHadSuccessfulStatus; // SSE (Server-Sent Events) client state. When streaming is active we // rely on incoming events instead of the periodic polling loop. @@ -595,6 +608,7 @@ class StatusProvider extends ChangeNotifier { _status = parsed; _error = null; _loading = false; + _everHadSuccessfulStatus = true; // Successful refresh -> shorten polling interval _pollIntervalSeconds = _minPollIntervalSeconds; @@ -667,8 +681,12 @@ class StatusProvider extends ChangeNotifier { _loading = false; // On failure, increase consecutive error count and back off polling _consecutiveErrors = min(_consecutiveErrors + 1, _maxReconnectAttempts); + // Keep backoff short until we've ever seen a successful status so the + // startup experience remains responsive. After the first success we + // revert to the normal ramp-to-60s behavior for subsequent failures. + final maxBackoff = _everHadSuccessfulStatus ? _maxPollIntervalSeconds : 5; final backoff = _computeBackoff(_consecutiveErrors, - base: _minPollIntervalSeconds, max: _maxPollIntervalSeconds); + base: _minPollIntervalSeconds, max: maxBackoff); _pollIntervalSeconds = backoff; _nextPollRetryAt = DateTime.now().add(Duration(seconds: backoff)); // Clear timestamp when timer expires @@ -684,6 +702,12 @@ class StatusProvider extends ChangeNotifier { 'Status refresh failed after $elapsedStr; backing off polling for ${_pollIntervalSeconds}s (attempt $_consecutiveErrors)'); } finally { _fetchInFlight = false; + // The initial attempt is finished once we've done at least one fetch + // (success or failure). Clear the flag so UI can dismiss any startup + // overlay. + if (_initialAttemptInProgress) { + _initialAttemptInProgress = false; + } if (!_disposed) { // Only notify listeners if one of the meaningful observable fields // actually changed. This avoids spamming watchers with identical diff --git a/lib/home/startup_gate.dart b/lib/home/startup_gate.dart new file mode 100644 index 0000000..6e158f1 --- /dev/null +++ b/lib/home/startup_gate.dart @@ -0,0 +1,87 @@ +/* +* Orion - Startup Gate +* Copyright (C) 2025 Open Resin Alliance +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:orion/backend_service/providers/status_provider.dart'; +import 'package:orion/home/onboarding_screen.dart'; +import 'package:orion/home/home_screen.dart'; +import 'package:orion/home/startup_screen.dart'; +import 'package:orion/util/orion_config.dart'; + +/// Blocks initial app content until the backend reports a successful +/// initial connection. While waiting, shows the branded [StartupScreen]. +class StartupGate extends StatefulWidget { + const StartupGate({super.key}); + + @override + State createState() => _StartupGateState(); +} + +class _StartupGateState extends State { + late StatusProvider _statusProv; + + @override + void didChangeDependencies() { + super.didChangeDependencies(); + _statusProv = Provider.of(context, listen: false); + // Listen for changes so we can rebuild when status becomes available. + _statusProv.addListener(_onStatusChange); + } + + void _onStatusChange() { + // Rebuild whenever provider updates + if (mounted) setState(() {}); + } + + @override + void dispose() { + try { + _statusProv.removeListener(_onStatusChange); + } catch (_) {} + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final prov = Provider.of(context, listen: false); + // Choose the child widget depending on whether we've ever connected. + // We use keys so AnimatedSwitcher can correctly cross-fade between + // the startup overlay and the main app content. + final Widget child; + if (!prov.hasEverConnected) { + child = const StartupScreen(key: ValueKey('startup')); + } else { + final cfg = OrionConfig(); + final showOnboarding = cfg.getFlag('firstRun', category: 'machine'); + child = showOnboarding + ? const OnboardingScreen(key: ValueKey('onboarding')) + : const HomeScreen(key: ValueKey('home')); + } + + return AnimatedSwitcher( + duration: const Duration(milliseconds: 600), + switchInCurve: Curves.easeOut, + switchOutCurve: Curves.easeIn, + transitionBuilder: (widget, animation) => FadeTransition( + opacity: animation, + child: widget, + ), + child: child, + ); + } +} diff --git a/lib/home/startup_screen.dart b/lib/home/startup_screen.dart new file mode 100644 index 0000000..73be558 --- /dev/null +++ b/lib/home/startup_screen.dart @@ -0,0 +1,295 @@ +/* +* Orion - Startup Screen +* Copyright (C) 2025 Open Resin Alliance +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +import 'dart:async'; +import 'dart:ui' as ui; + +import 'package:flutter/material.dart'; +import 'package:orion/backend_service/providers/status_provider.dart'; +import 'package:orion/glasser/src/gradient_utils.dart'; +import 'package:orion/util/providers/theme_provider.dart'; +import 'package:orion/util/orion_config.dart'; +import 'package:provider/provider.dart'; + +/// Blocking startup overlay shown while the app awaits the initial backend +/// connection. Displayed by [StartupGate] until +/// [StatusProvider.hasEverConnected] becomes true. +class StartupScreen extends StatefulWidget { + const StartupScreen({super.key}); + + @override + State createState() => _StartupScreenState(); +} + +class _StartupScreenState extends State + with TickerProviderStateMixin { + late final AnimationController _logoController; + late final AnimationController _loaderController; + late final AnimationController _logoMoveController; + late final AnimationController _backgroundController; + late final Animation _logoOpacity; + late final Animation _logoMove; + late final Animation _loaderOpacity; + late final Animation _backgroundOpacity; + late final String _printerName; + List _gradientColors = const []; + Color _backgroundColor = Colors.black; + + @override + void initState() { + super.initState(); + + _logoController = AnimationController( + vsync: this, + duration: const Duration(milliseconds: 600), + ); + _logoMoveController = AnimationController( + vsync: this, + duration: const Duration(milliseconds: 800), + ); + final config = OrionConfig(); + final rawPrinterName = + config.getString('machineName', category: 'machine').trim(); + _printerName = rawPrinterName.isEmpty ? '3D Printer' : rawPrinterName; + _loaderController = AnimationController( + vsync: this, + duration: const Duration(milliseconds: 1200), + ); + _backgroundController = AnimationController( + vsync: this, + duration: const Duration(milliseconds: 1800), + ); + _logoOpacity = + CurvedAnimation(parent: _logoController, curve: Curves.easeInOut); + _logoMove = CurvedAnimation( + parent: _logoMoveController, curve: Curves.easeInOutSine); + _loaderOpacity = + CurvedAnimation(parent: _loaderController, curve: Curves.easeInOut); + _backgroundOpacity = + CurvedAnimation(parent: _backgroundController, curve: Curves.easeInOut); + + // Stage animations: logo after 1s, background after 4s with a slower fade. + Future.delayed(const Duration(seconds: 1), () { + if (mounted) _logoController.forward(); + }); + Future.delayed(const Duration(seconds: 2), () { + if (mounted) _logoMoveController.forward(); + }); + Future.delayed(const Duration(seconds: 3), () { + if (mounted) _loaderController.forward(); + }); + Future.delayed(const Duration(seconds: 4), () { + if (mounted) _backgroundController.forward(); + }); + } + + @override + void didChangeDependencies() { + super.didChangeDependencies(); + final baseBackground = Theme.of(context).scaffoldBackgroundColor; + _backgroundColor = + Color.lerp(baseBackground, Colors.black, 0.6) ?? Colors.black; + try { + final themeProvider = Provider.of(context, listen: false); + if (themeProvider.isGlassTheme) { + // Use the same gradient resolution as the rest of the app so + // brightness and color stops match GlassApp. + final gradient = GlassGradientUtils.resolveGradient( + themeProvider: themeProvider, + ); + _gradientColors = gradient.isNotEmpty ? gradient : const []; + } else { + // For non-glass themes, prefer the theme's scaffold background color + // as a solid background. We already computed a blended _backgroundColor + // above; slightly darken it so the startup overlay reads well over + // light/dark backgrounds. + _gradientColors = const []; + _backgroundColor = Color.lerp(Theme.of(context).scaffoldBackgroundColor, + Colors.black, 0.35) ?? + _backgroundColor; + } + } catch (_) { + _gradientColors = const []; + } + } + + @override + void dispose() { + _logoController.dispose(); + _loaderController.dispose(); + _logoMoveController.dispose(); + _backgroundController.dispose(); + super.dispose(); + } + + // Interpolates between a greyscale color matrix (t=0) and the identity + // color matrix (t=1). We drive this with the loader animation so the + // logo is greyscale initially and transitions back to color as the + // loader/text are revealed. + List _colorMatrixFor(double t) { + const List grey = [ + 0.2126, 0.7152, 0.0722, 0, 0, // R + 0.2126, 0.7152, 0.0722, 0, 0, // G + 0.2126, 0.7152, 0.0722, 0, 0, // B + 0, 0, 0, 1, 0, // A + ]; + const List identity = [ + 1, 0, 0, 0, 0, // R + 0, 1, 0, 0, 0, // G + 0, 0, 1, 0, 0, // B + 0, 0, 0, 1, 0, // A + ]; + // t==0 => grey, t==1 => identity + return List.generate( + 20, + (i) => grey[i] + (identity[i] - grey[i]) * t, + growable: false, + ); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.black, + body: Stack( + fit: StackFit.expand, + children: [ + Container(color: Colors.black), + FadeTransition( + opacity: _backgroundOpacity, + child: _gradientColors.length >= 2 + ? Container( + decoration: BoxDecoration( + gradient: LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: _gradientColors, + ), + ), + // Match GlassApp: overlay a semi-transparent black layer on + // top of the gradient to achieve the same perceived + // brightness. + child: Container( + decoration: BoxDecoration( + color: Colors.black.withValues(alpha: 0.5), + ), + ), + ) + : DecoratedBox( + decoration: BoxDecoration( + color: _backgroundColor.withValues(alpha: 1.0), + ), + ), + ), + Center( + child: FadeTransition( + opacity: _logoOpacity, + child: AnimatedBuilder( + animation: _logoMove, + builder: (context, _) { + final dy = -30.0 * _logoMove.value; + final matrix = _colorMatrixFor(_logoMove.value); + return Transform.translate( + offset: Offset(0, dy - 10), + child: Stack( + alignment: Alignment.center, + children: [ + // Slightly upscaled blurred black copy (halo) + Transform.scale( + scale: 1.07, + child: ImageFiltered( + imageFilter: + ui.ImageFilter.blur(sigmaX: 12, sigmaY: 12), + child: ColorFiltered( + colorFilter: ColorFilter.mode( + Colors.black.withValues(alpha: 0.5), + BlendMode.srcIn), + child: Padding( + padding: const EdgeInsets.all(8), + child: Image.asset( + 'assets/images/open_resin_alliance_logo_darkmode.png', + width: 220, + height: 220, + ), + ), + ), + ), + ), + // Foreground logo which receives the greyscale->color + // matrix animation. + Padding( + padding: const EdgeInsets.all(8), + child: ColorFiltered( + colorFilter: ColorFilter.matrix(matrix), + child: Image.asset( + 'assets/images/open_resin_alliance_logo_darkmode.png', + width: 220, + height: 220, + ), + ), + ), + ], + ), + ); + }, + ), + ), + ), + // Full-width indeterminate progress bar at the bottom edge. Kept + // separate from the centered content so it doesn't affect layout. + Positioned( + left: 20, + right: 20, + bottom: 30, + child: FadeTransition( + opacity: _loaderOpacity, + child: Text( + 'Starting up $_printerName', + textAlign: TextAlign.center, + style: const TextStyle( + fontFamily: 'AtkinsonHyperlegible', + fontSize: 24, + color: Colors.white70, + ), + ), + ), + ), + Positioned( + left: 40, + right: 40, + bottom: 90, + child: FadeTransition( + opacity: _loaderOpacity, + child: SizedBox( + height: 14, + child: ClipRRect( + borderRadius: BorderRadius.circular(7), + child: LinearProgressIndicator( + // Use theme primary color for the indicator to match app theming. + valueColor: AlwaysStoppedAnimation( + Theme.of(context).colorScheme.primary), + backgroundColor: Colors.black.withValues(alpha: 0.3), + ), + ), + ), + ), + ), + ], + ), + ); + } +} diff --git a/lib/main.dart b/lib/main.dart index 6254fda..a3f8048 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -33,7 +33,7 @@ import 'package:orion/files/files_screen.dart'; import 'package:orion/files/grid_files_screen.dart'; import 'package:orion/glasser/glasser.dart'; import 'package:orion/home/home_screen.dart'; -import 'package:orion/home/onboarding_screen.dart'; +import 'package:orion/home/startup_gate.dart'; import 'package:orion/l10n/generated/app_localizations.dart'; import 'package:orion/settings/about_screen.dart'; import 'package:orion/settings/settings_screen.dart'; @@ -215,9 +215,10 @@ class OrionMainAppState extends State { GoRoute( path: '/', builder: (BuildContext context, GoRouterState state) { - return initialSetupTrigger() - ? const OnboardingScreen() - : const HomeScreen(); + // Let the StartupGate decide whether to show the startup overlay + // while the initial backend connection attempt completes. It will + // render the onboarding screen or the HomeScreen once connected. + return const StartupGate(); }, routes: [ GoRoute( @@ -305,6 +306,7 @@ class OrionMainAppState extends State { WidgetsBinding.instance.addPostFrameCallback((_) { try { final navCtx = _navKey.currentContext; + // Startup gating is handled by the root route's StartupGate. if (_connWatcher == null && navCtx != null) { _connWatcher = ConnectionErrorWatcher.install(navCtx); } @@ -323,8 +325,8 @@ class OrionMainAppState extends State { final active = (s?.isPrinting == true) || (s?.isPaused == true); if (active && !_wasPrinting) { - // Only navigate if not already on /status - // Navigate to status on transition to active print. + // Only navigate if not already on /status. Navigate + // to status on transition to active print. try { final navState = _navKey.currentState; final sModel = statusProv.status; diff --git a/lib/util/error_handling/connection_error_watcher.dart b/lib/util/error_handling/connection_error_watcher.dart index 2a40c53..6b1876a 100644 --- a/lib/util/error_handling/connection_error_watcher.dart +++ b/lib/util/error_handling/connection_error_watcher.dart @@ -58,6 +58,10 @@ class ConnectionErrorWatcher { final log = Logger('ConnErrorWatcher'); try { final hasError = _provider.error != null; + final everHadSuccess = _provider.hasEverConnected; + // If the provider is still performing its initial attempt, don't + // surface the connection error dialog yet; the startup gate will + // show a blocking startup UI while initialAttemptInProgress is true. // Only log transitions or when there's something noteworthy to report final providerError = _provider.error; final shouldLog = (providerError != _lastProviderError) || @@ -70,6 +74,21 @@ class ConnectionErrorWatcher { _lastProviderError = providerError; _lastDialogVisible = _dialogVisible; } + // Suppress the dialog while initial startup is still in progress or we + // have never seen a successful status. StartupGate presents the blocking + // overlay in that phase, so surfacing an additional dialog would be + // redundant. After we have connected successfully at least once, allow + // the dialog to appear for any subsequent connection interruptions. + if (_provider.initialAttemptInProgress || !everHadSuccess) { + if (_dialogVisible) { + try { + Navigator.of(_context, rootNavigator: true).maybePop(); + } catch (_) {} + _dialogVisible = false; + } + return; + } + if (hasError && !_dialogVisible) { _dialogVisible = true; // Show the dialog; this Future completes when the dialog is dismissed diff --git a/pubspec.yaml b/pubspec.yaml index ab07a74..83ce37c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -103,6 +103,7 @@ flutter: - assets/images/opensource.svg - assets/images/placeholder.png - assets/images/bsod.png + - assets/images/open_resin_alliance_logo_darkmode.png - assets/scripts/set_orion_config.sh - README.md - CHANGELOG.md

=j*Vx#OVhuY;YK7F#M3uGrmouv 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%0A=PlEg~7)YKMbvTy> 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