Neigungsmesser: zurück auf den bewährten Firmware-Aufbau
Die überarbeitete Firmware liess sich prüfen und fehlerfrei übersetzen, blieb auf dem Gerät aber stumm - keine Werte, keine Ausgabe über die serielle Schnittstelle. Der Umbau war zu gross für das, was sich ohne Gerätezugriff absichern lässt: config und compile sagen nichts über das Laufzeitverhalten. Die Firmware setzt jetzt wieder auf dem bewährten Stand 1.0 auf und ändert daran nur zweierlei: die Kalibrierung über Bluetooth funktioniert (die Charakteristik war beschreibbar, hatte aber keine Aktion hinterlegt und tat nichts), und der ESP-NOW-Rest ist entfernt, der bei jedem Messwert ein "hallo" an eine feste MAC schickte. Kein notify, kein aktives Setzen der Werte, kein Zugriff auf den BLE-Server aus dem Boot-Ablauf heraus. In der App fällt damit ein Denkfehler auf: fehlende Kalibrier-Offsets galten als "nicht kalibriert" statt als "unbekannt". Bei Firmware, die sie nicht meldet, stünde dauerhaft eine Warnung, die sich nicht abstellen lässt. Gewarnt wird jetzt nur, wenn das Gerät ausdrücklich Nulloffsets meldet. Der Rücksetz-Knopf hing an derselben Bedingung und wäre sonst unerreichbar gewesen. Das Abfragen im Takt war bereits als Rückfallebene eingebaut und trägt diesen Aufbau ohne Änderung. Ausserdem nimmt die .gitignore jetzt virtuelle Python-Umgebungen aus. Eine solche war versehentlich mitversioniert worden - über 14000 Dateien, die maschinenabhängig sind und im Repo nichts zu suchen haben. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -61,12 +61,22 @@ struct LevelState: Equatable {
|
||||
|
||||
var hasReading: Bool { pitch != nil || roll != nil }
|
||||
|
||||
/// Als kalibriert gilt, wo ein Offset hinterlegt ist.
|
||||
var isCalibrated: Bool {
|
||||
guard let pitchOffset, let rollOffset else { return false }
|
||||
/// Ob kalibriert wurde – oder nil, wenn das Gerät es nicht verrät.
|
||||
///
|
||||
/// Nicht jede Firmware stellt die Offsets bereit. Fehlen sie, heisst das
|
||||
/// „unbekannt“ und nicht „nicht kalibriert“: eine Warnung, die sich nie
|
||||
/// abstellen lässt, ist schlimmer als keine.
|
||||
var calibrationState: Bool? {
|
||||
guard let pitchOffset, let rollOffset else { return nil }
|
||||
return abs(pitchOffset) > 0.001 || abs(rollOffset) > 0.001
|
||||
}
|
||||
|
||||
/// Nur wahr, wenn es auch belegt ist.
|
||||
var isCalibrated: Bool { calibrationState == true }
|
||||
|
||||
/// Nur wahr, wenn das Gerät ausdrücklich Nulloffsets meldet.
|
||||
var isKnownUncalibrated: Bool { calibrationState == false }
|
||||
|
||||
/// Bis hierhin gilt das Fahrzeug als eben genug.
|
||||
static let levelTolerance = 0.5
|
||||
|
||||
@@ -108,7 +118,7 @@ struct LevelState: Equatable {
|
||||
Metric("roll", "Querneigung", roll, unit: "°", precision: 1),
|
||||
]
|
||||
snapshot.state = instruction
|
||||
if !isCalibrated {
|
||||
if isKnownUncalibrated {
|
||||
snapshot.offReasons = ["Nicht kalibriert"]
|
||||
}
|
||||
return snapshot
|
||||
|
||||
@@ -135,7 +135,7 @@ struct LevelControls: View {
|
||||
Button("Auf aktuelle Lage kalibrieren", systemImage: "scope") {
|
||||
bluetooth.calibrateLevel(for: device.id)
|
||||
}
|
||||
if state.isCalibrated {
|
||||
if !state.isKnownUncalibrated {
|
||||
Button("Kalibrierung zurücksetzen", systemImage: "arrow.uturn.backward", role: .destructive) {
|
||||
showResetConfirmation = true
|
||||
}
|
||||
@@ -148,9 +148,13 @@ struct LevelControls: View {
|
||||
Text(String(format: "Nullpunkt liegt bei %.1f° längs und %.1f° quer. "
|
||||
+ "Zum Kalibrieren das Fahrzeug eben stellen und dann tippen.",
|
||||
pitchOffset, rollOffset))
|
||||
} else {
|
||||
} else if state.isKnownUncalibrated {
|
||||
Text("Noch nicht kalibriert – die Anzeige zeigt die Lage des Sensors, "
|
||||
+ "nicht die des Fahrzeugs. Fahrzeug eben stellen und dann kalibrieren.")
|
||||
} else {
|
||||
// Ältere Firmware gibt die Offsets nicht heraus.
|
||||
Text("Zum Kalibrieren das Fahrzeug eben stellen und dann tippen. "
|
||||
+ "Ob bereits kalibriert wurde, meldet dieses Gerät nicht zurück.")
|
||||
}
|
||||
}
|
||||
.confirmationDialog("Kalibrierung zurücksetzen?",
|
||||
|
||||
Reference in New Issue
Block a user