Dauerbetrieb: Autostart (main.py) und Watchdog
MicroPython fuehrt main.py nach jedem Reset selbst aus -- nach Stromausfall oder Watchdog-Neustart laeuft die Anzeige damit ohne Notebook wieder an. Bisher gab es die Datei bewusst nicht, weil am Aufbau gearbeitet wurde. **Das Abbruchfenster ist kein Komfort, sondern die Notbremse.** Ohne es waere ein Geraet, dessen Programm beim Start haengt, nur noch durch Neuflashen erreichbar: Die Endlosschleife belegt die REPL sofort nach dem Reset. main.py wartet deshalb erst AUTOSTART_DELAY (3 s), in denen Ctrl-C zurueck an die REPL fuehrt -- dann laeuft auch kein Watchdog. Watchdog (WDT_TIMEOUT = 120 s): startet das Geraet neu, wenn die Poll-Schleife stehenbleibt. Gefuettert wird zu Beginn *jedes* Durchlaufs, auch nach einem Fehler -- "KEIN LINK" ist kein Stillstand, die Schleife laeuft ja weiter. Der Wert muss ueber allem liegen, was regulaer blockieren darf (WLAN 20 s, Montierung 3 s, dazu ein MQTT-Versuch); knapper waere er eine Neustart-Schleife. Ein gestarteter Watchdog laesst sich nicht mehr abschalten. Deshalb legt ihn nur main.py an -- im Handbetrieb ueber die REPL startete das Geraet sonst neu, waehrend man nachdenkt. Weiteres: - Nach einem Watchdog-Neustart meldet main.py das beim Start (machine.reset_cause()), sonst saehe er aus wie ein Stromausfall. - Eine Ausnahme faengt main.py ab und startet nach RESTART_DELAY (10 s) neu, statt in die REPL zu fallen und die Anzeige einzufrieren. Die Pause verhindert eine Neustart-Schleife im Sekundentakt. - Autostart faehrt mit Helligkeitsregelung (with_ldr=True, Nutzerentscheidung). Am Geraet bestaetigt: Autostart nach Reset laeuft durch (Watchdog aktiv, WLAN, MQTT), ein absichtlich herbeigefuehrter Stillstand loest den Watchdog aus und das Geraet kommt von allein wieder hoch -- mit der Meldung "Vorheriger Lauf wurde vom Watchdog beendet". Ctrl-C im Startfenster gibt die REPL frei. Beim Geraetetest aufgefallen: make_watchdog wurde ohne log aufgerufen, im Startprotokoll stand also nichts vom Watchdog. Behoben und durch einen Test festgehalten. 178 Tests gruen (neu: test_main.py). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
+26
-1
@@ -95,8 +95,28 @@ def selftest(host=None, port=None, log=print):
|
||||
log("Selbsttest bestanden.")
|
||||
|
||||
|
||||
def make_watchdog(timeout=None, log=None):
|
||||
"""Watchdog starten und seine feed-Funktion liefern.
|
||||
|
||||
Liefert None, wenn es keinen gibt (CPython). **Ein gestarteter Watchdog
|
||||
laesst sich nicht mehr abschalten** -- deshalb ruft nur main.py das hier
|
||||
auf, nicht der Handbetrieb ueber die REPL: Sonst startet das Geraet mitten
|
||||
im Entwickeln neu, sobald man an der REPL nachdenkt.
|
||||
"""
|
||||
log = log or (lambda *a: None)
|
||||
try:
|
||||
from machine import WDT
|
||||
except ImportError:
|
||||
log("Watchdog: machine.WDT nicht verfuegbar")
|
||||
return None
|
||||
sekunden = config.WDT_TIMEOUT if timeout is None else timeout
|
||||
wdt = WDT(timeout=int(sekunden * 1000))
|
||||
log("Watchdog: aktiv, %d s" % sekunden)
|
||||
return wdt.feed
|
||||
|
||||
|
||||
def main(host=None, port=None, with_ldr=False, fake_display=False,
|
||||
once=False, with_mqtt=True, log=print):
|
||||
once=False, with_mqtt=True, feed=None, log=print):
|
||||
"""WLAN aufbauen, Anzeige oeffnen und die Poll-Schleife fahren.
|
||||
|
||||
host/port Montierung; Vorgabe aus config.py. Zum Testen gegen den Mock
|
||||
@@ -111,6 +131,10 @@ def main(host=None, port=None, with_ldr=False, fake_display=False,
|
||||
with_mqtt MQTT-Anbindung versuchen. Ohne mqtt_config.py passiert nichts,
|
||||
deshalb ist die Vorgabe an: fehlt die Datei, laeuft alles wie
|
||||
bisher weiter.
|
||||
feed Watchdog-Funktion aus make_watchdog(). Vorgabe None: Von Hand
|
||||
gestartet laeuft die Schleife ohne Watchdog, sonst wuerde das
|
||||
Geraet beim Nachdenken an der REPL neu starten. main.py legt
|
||||
ihn an.
|
||||
"""
|
||||
d = open_display(fake=fake_display)
|
||||
client = MountClient(config.MOUNT_HOST if host is None else host,
|
||||
@@ -165,6 +189,7 @@ def main(host=None, port=None, with_ldr=False, fake_display=False,
|
||||
dimmer=dimmer,
|
||||
ensure_link=lambda: wifi.ensure(log=log),
|
||||
bridge=bridge,
|
||||
feed=feed,
|
||||
log=log)
|
||||
except KeyboardInterrupt:
|
||||
log("\nbeendet")
|
||||
|
||||
Reference in New Issue
Block a user