forked from fritob/Camper-Monitor
solar-integration (aus dem separaten VanAligneiOS-Repo) und dev_watch haben unabhängige Git-Historien, decken aber überlappende und sich ergänzende Funktionen ab. Übernommen aus solar-integration: Votronic- Solar-ESP-Anbindung samt Geräterolle, die Live-Activity/Widget-Extension fürs Sperrbildschirm/Dynamic-Island/CarPlay, das Querformat-Layout für Libelle/Fahrzeug-Ansicht und Ausrichtungs-Assistent, sowie die mehreren Fahrzeuggrafik-Stile (Vanster/California). Beibehalten aus dev_watch: alle zusätzlichen Geräteprotokolle (Daly-/JBD-BMS, Alpicool- Kühlbox, WattCycle, Victron), die dort zwischenzeitlich entstanden. Die Xcode-Projektdatei wurde von Hand um die neue Widget-Extension samt SharedActivity-Gruppe erweitert (Datei-synchronisierte Gruppen, kein App-Group-Entitlement nötig). Build für App, Watch und Widget-Extension geprüft (Debug und Release). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
31 lines
1.3 KiB
Swift
31 lines
1.3 KiB
Swift
import Foundation
|
||
|
||
/// Formatiert Neigungswerte mit vorangestelltem Richtungsbuchstaben statt
|
||
/// Vorzeichen – "H 1.8°" statt "1.8°", "L 0.9°" statt "-0.9°".
|
||
///
|
||
/// Gemeinsam für App und Live-Activity-Widget, deshalb hier statt in
|
||
/// `Shared/`, das die Extension nicht mitkompiliert (siehe
|
||
/// `LevelActivityAttributes.swift`).
|
||
enum LevelDirectionFormatting {
|
||
/// "1.8°" – Betrag ohne Vorzeichen, für Stellen, die die Richtung schon
|
||
/// im Wort oder Buchstaben ausdrücken.
|
||
static func magnitude(_ value: Double?) -> String {
|
||
guard let value else { return "–" }
|
||
return String(format: "%.1f°", abs(value))
|
||
}
|
||
|
||
/// Längsneigung als Kachel: positiv (Heck höher) → "H", negativ (Front
|
||
/// höher) → "F". Muss zum Vorzeichen von `LevelState.pitch` passen.
|
||
static func pitchTile(_ value: Double?) -> String {
|
||
guard let value else { return "–" }
|
||
return "\(value >= 0 ? "H" : "F") \(magnitude(value))"
|
||
}
|
||
|
||
/// Querneigung als Kachel: positiv (rechts höher) → "R", negativ (links
|
||
/// höher) → "L". Muss zum Vorzeichen von `LevelState.roll` passen.
|
||
static func rollTile(_ value: Double?) -> String {
|
||
guard let value else { return "–" }
|
||
return "\(value >= 0 ? "R" : "L") \(magnitude(value))"
|
||
}
|
||
}
|