chore: simplify external battery mode#20554
Conversation
|
damit nimmst du das frühe Setzen vor dem Kontrol-Intervall raus; der Watchdog wird aber nie wieder gestartet, weil der Timer nie einen Reset erhält und nie wieder Zero ist. Der eigentliche Watchdog läuft jetzt im separaten Thread, der auch requiredBatteryMode aufruft. Was ich meine: der Watchdog hat keine Aufgabe mehr ... Darum hab ich die andere Alternative vorgeschlagen... müsste einen sauberen roten Faden haben... |
Da läuft gar kein Watchdog sondern es wird einfach wieder der interne Batteriemodus hergestellt. Oder ich verstehe Deine Begrifflichkeiten nicht. |
| // start watchdog if not running | ||
| if !disable && site.batteryModeExternalTimer.IsZero() { | ||
| go func() { | ||
| for range time.Tick(time.Second) { | ||
| if site.batteryModeWatchdogExpired() { | ||
| return | ||
| } | ||
| }() | ||
| } | ||
| } | ||
| }() |
There was a problem hiding this comment.
Das ist der Code, der wg. der Bedingung nur einmal ausgeführt werden wird und jetzt nutzlos ist. Die Logik wird vom requireBatteryMode-Thread übernommen, der batteryModeWatchdogExpired regelmäßig ruft und für die Zurücksetzung sorgt
Folgendes wirkt postiv auf das UI, das eine Änderung (=! unknown) sofort anzeigt - der interne Modus wird sofort umgesetzt. Das würde ich beibehalten:
if !disable {
site.setBatteryMode(mode)
}
aus batteryModeWatchdogExpired - da setzt du ja jetzt den externen Modus zurück:
...
if elapsed > time.Minute && !site.batteryModeExternalTimer.IsZero() {
site.SetBatteryModeExternal(api.BatteryUnknown)
return true
}
...
Das geht natürlich, hattest du aber vorher zugunsten des go-Threads (watchdog) mal aus einem vorherigen Entwurf verworfen.
Fazit: nicht site.setBatteryMode sollte weg, sondern die parallele go-Routine - das ändert nichts am Verhalten
There was a problem hiding this comment.
ich dreh' mich den ganzen Tag und such' ... du hast den Reset des expiration-Timers in SetBatteryMode eingebaut?
if site.batteryModeExternal == api.BatteryUnknown {
site.batteryModeExternalTimer = time.Time{}
}
Das Snippet hab ich vermisst und erklärt, warum ich obiges angenommen hab...
There was a problem hiding this comment.
Genau. Der WD ist dann schon geendet, der Timer zeigt aber an dass noch kein Reset des internen Modus passiert ist.
Follow-up to #20455