forked from fritob/Camper-Monitor
* Demo-Modus-Abschnitt an den tatsächlichen Code angeglichen: Schalter in den Einstellungen (für lokal installierte Builds ohne Xcode) und Umgebungsvariable, beide dokumentiert. * Quelle für den Votronic-Solarregler ergänzt (syssi/esphome-votronic), eigener Abschnitt analog zu Kühlbox/WattCycle. * Persönlichen Pfad aus der Bauanleitung entfernt (open VanControl.xcodeproj statt eines lokalen Nutzerpfads); Beispiel-Bundle-ID im Demo-Modus-Befehl durch Platzhalter ersetzt. Zusätzlich: Symbolliste für Fahrzeugprofile auf Wunsch exakt auf die aus solar-integration zurückgesetzt (car, car.side, suv.side, truck.pickup.side, box.truck, bus), statt sie mit dev_watchs Liste zusammenzuführen. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
53 lines
2.0 KiB
Swift
53 lines
2.0 KiB
Swift
import Foundation
|
||
|
||
/// Ein Fahrzeug. Jedes Profil hat seinen eigenen Satz Geräte; die App zeigt und
|
||
/// funkt immer nur für das gerade gewählte.
|
||
struct Profile: Identifiable, Codable, Hashable, Sendable {
|
||
var id: UUID
|
||
var name: String
|
||
/// SF-Symbol für die Auswahl im Dashboard.
|
||
var symbol: String
|
||
|
||
/// Spurweite in Metern – für die Berechnung der Auffahrkeile quer.
|
||
var trackWidth: Double?
|
||
/// Radstand in Metern – dasselbe längs.
|
||
var wheelbase: Double?
|
||
|
||
init(id: UUID = UUID(),
|
||
name: String,
|
||
symbol: String = "suv.side",
|
||
trackWidth: Double? = nil,
|
||
wheelbase: Double? = nil) {
|
||
self.id = id
|
||
self.name = name
|
||
self.symbol = symbol
|
||
self.trackWidth = trackWidth
|
||
self.wheelbase = wheelbase
|
||
}
|
||
|
||
/// Profile aus der Zeit vor den Fahrzeugmassen haben noch keine.
|
||
init(from decoder: Decoder) throws {
|
||
let container = try decoder.container(keyedBy: CodingKeys.self)
|
||
id = try container.decode(UUID.self, forKey: .id)
|
||
name = try container.decode(String.self, forKey: .name)
|
||
symbol = try container.decode(String.self, forKey: .symbol)
|
||
trackWidth = try container.decodeIfPresent(Double.self, forKey: .trackWidth)
|
||
wheelbase = try container.decodeIfPresent(Double.self, forKey: .wheelbase)
|
||
}
|
||
|
||
/// Profil, dem Geräte aus der Zeit vor der Profilverwaltung zugeordnet
|
||
/// werden. Feste Kennung, damit die Zuordnung beim Update erhalten bleibt.
|
||
static let defaultID = UUID(uuidString: "00000000-0000-0000-0000-00000000C001")!
|
||
|
||
static var initial: Profile {
|
||
Profile(id: defaultID, name: "Mein Camper")
|
||
}
|
||
|
||
/// Auswahl für die Profilbearbeitung.
|
||
/// Alle Namen gegen NSImage(systemSymbolName:) geprüft – ein nicht
|
||
/// existierendes Symbol lässt SwiftUI stillschweigend auf Text zurückfallen.
|
||
static let symbols = [
|
||
"car", "car.side", "suv.side", "truck.pickup.side", "box.truck", "bus",
|
||
]
|
||
}
|