diff --git a/CamperMonitor/Views/DashboardView.swift b/CamperMonitor/Views/DashboardView.swift index aa5e6bd..b22655b 100644 --- a/CamperMonitor/Views/DashboardView.swift +++ b/CamperMonitor/Views/DashboardView.swift @@ -6,6 +6,7 @@ struct DashboardView: View { @State private var isAddingDevice = false @State private var isManagingProfiles = false + @State private var isShowingSettings = false private let columns = [GridItem(.adaptive(minimum: 300), spacing: 16)] @@ -55,6 +56,9 @@ struct DashboardView: View { .sheet(isPresented: $isManagingProfiles) { ProfilesView() } + .sheet(isPresented: $isShowingSettings) { + SettingsView() + } } } @@ -74,9 +78,12 @@ struct DashboardView: View { } } Divider() - Button("Fahrzeuge verwalten…", systemImage: "gearshape") { + Button("Fahrzeuge verwalten…", systemImage: "car.2") { isManagingProfiles = true } + Button("Einstellungen…", systemImage: "gearshape") { + isShowingSettings = true + } } label: { Label(store.activeProfile?.name ?? "Fahrzeug", systemImage: store.activeProfile?.symbol ?? "box.truck") diff --git a/CamperMonitor/Views/DeviceDetailView.swift b/CamperMonitor/Views/DeviceDetailView.swift index cab3f63..e80575b 100644 --- a/CamperMonitor/Views/DeviceDetailView.swift +++ b/CamperMonitor/Views/DeviceDetailView.swift @@ -11,6 +11,20 @@ struct DeviceDetailView: View { @State private var editedName = "" @State private var keyInput = "" @State private var showDeleteConfirmation = false + @AppStorage(AppSettings.showDiagnosticsKey) private var showDiagnostics = false + + /// Ob die technischen Angaben eingeblendet werden. + /// + /// Im Alltag stören sie nur. Meldet ein Gerät aber einen Fehler oder fehlt + /// der Schlüssel, sind sie genau das, was weiterhilft – dann werden sie + /// unabhängig von der Einstellung gezeigt. + private var showsTechnicalDetails: Bool { + if showDiagnostics { return true } + switch linkState { + case .failed, .needsKey: return true + default: return false + } + } /// Immer der aktuelle Stand aus dem Speicher – `device` ist die /// Momentaufnahme beim Öffnen und veraltet nach jeder Änderung. @@ -88,8 +102,8 @@ struct DeviceDetailView: View { if currentDevice.role.transport == .advertisement { keySection - diagnosticsSection - } else { + if showsTechnicalDetails { diagnosticsSection } + } else if showsTechnicalDetails { bmsDiagnosticsSection } diff --git a/CamperMonitor/Views/SettingsView.swift b/CamperMonitor/Views/SettingsView.swift new file mode 100644 index 0000000..f3c63c3 --- /dev/null +++ b/CamperMonitor/Views/SettingsView.swift @@ -0,0 +1,38 @@ +import SwiftUI + +/// App-weite Einstellungen. Bewusst knapp gehalten – was ein einzelnes Gerät +/// betrifft, steht bei diesem Gerät. +struct SettingsView: View { + @AppStorage(AppSettings.showDiagnosticsKey) private var showDiagnostics = false + @Environment(\.dismiss) private var dismiss + + var body: some View { + NavigationStack { + List { + Section { + Toggle("Diagnose anzeigen", isOn: $showDiagnostics) + } header: { + Text("Fehlersuche") + } footer: { + Text("Zeigt bei jedem Gerät die technischen Angaben: erkanntes " + + "Protokoll, Bluetooth-Merkmale, gesendete Befehle und die " + + "Rohdaten der letzten Antwort. Für den Alltag nicht nötig – " + + "hilfreich, wenn ein Gerät sich nicht wie erwartet verhält.\n\n" + + "Meldet ein Gerät einen Fehler, werden die Angaben ohnehin " + + "eingeblendet, auch wenn das hier ausgeschaltet ist.") + } + } + .navigationTitle("Einstellungen") + .navigationBarTitleDisplayMode(.inline) + .toolbar { + ToolbarItem(placement: .confirmationAction) { + Button("Fertig") { dismiss() } + } + } + } + } +} + +enum AppSettings { + static let showDiagnosticsKey = "showDiagnostics" +} diff --git a/README.md b/README.md index 6717b9c..4865809 100644 --- a/README.md +++ b/README.md @@ -185,6 +185,18 @@ damit exakt: 2,0° Querneigung bei 2,00 m Spurweite ergeben 7,0 cm unter die tieferstehende Seite. Die Maße stehen im Fahrzeugprofil, erreichbar über das ⓘ in der Fahrzeugliste. +## Diagnose + +Im Alltag zeigt die App nur Messwerte und Bedienelemente. Die technischen +Angaben – erkanntes Protokoll, Bluetooth-Merkmale, gesendete Befehle, Rohdaten +der letzten Antwort – sind ausgeblendet und lassen sich unter *Einstellungen → +Diagnose anzeigen* einschalten. Die Einstellungen sitzen im Fahrzeugmenü oben +links im Dashboard. + +Meldet ein Gerät einen Fehler oder fehlt ein Victron-Schlüssel, werden die +Angaben unabhängig davon eingeblendet – dann sind sie genau das, was +weiterhilft. + ## Mehrere Fahrzeuge Oben links im Dashboard sitzt der Fahrzeugwechsel. Jedes Profil hat seinen @@ -249,6 +261,7 @@ CamperMonitor/ ├── LevelView.swift Libelle und Kalibrierung ├── AlignmentAssistantView.swift Ausrichtungs-Assistent fürs Rangieren ├── VehicleTiltView.swift Neigung am Fahrzeug dargestellt + ├── SettingsView.swift App-Einstellungen └── AddDeviceView.swift Scannen und Einrichten ```