"""Autostart auf dem ESP32-C3. MicroPython fuehrt diese Datei nach boot.py bei jedem Reset selbst aus. Damit laeuft die Anzeige nach Stromausfall oder Watchdog-Neustart von allein wieder an, ohne dass jemand ein Notebook anschliessen muss. **Das Abbruchfenster ist kein Komfort, sondern die Notbremse.** Ohne es waere ein Geraet, dessen Programm beim Start haengt oder abstuerzt, nur noch durch Neuflashen erreichbar -- die Endlosschleife belegt die REPL sofort nach dem Reset. Deshalb wartet main.py erst config.AUTOSTART_DELAY Sekunden, in denen Ctrl-C zurueck an die REPL fuehrt: mpremote repl dann Ctrl-C druecken, solange "startet in ..." steht Danach: - Der **Watchdog** startet das Geraet neu, wenn die Poll-Schleife stehenbleibt (siehe run_esp32.make_watchdog). Das faengt Haenger, die keine Ausnahme werfen. - Eine **Ausnahme** faengt der Block unten ab und startet nach config.RESTART_DELAY neu, statt in die REPL zu fallen und die Anzeige einzufrieren. """ import sys import time import config def _startbar(): """Wartet das Abbruchfenster ab. False, wenn abgebrochen wurde.""" print("Grossanzeige startet in %.0f s -- Ctrl-C bricht ab." % config.AUTOSTART_DELAY) try: time.sleep(config.AUTOSTART_DELAY) except KeyboardInterrupt: print("Autostart abgebrochen, REPL ist frei.") return False return True def _neustart(grund): """Nach einem Absturz neu starten -- mit Pause und Abbruchmoeglichkeit.""" print("%s -- Neustart in %.0f s (Ctrl-C bricht ab)" % (grund, config.RESTART_DELAY)) try: time.sleep(config.RESTART_DELAY) except KeyboardInterrupt: print("Neustart abgebrochen, REPL ist frei.") return try: import machine machine.reset() except ImportError: sys.exit() def start(): if not _startbar(): return import run_esp32 # Nach einem Watchdog-Neustart ist das der einzige Hinweis darauf, dass # ueberhaupt etwas gehangen hat -- ohne ihn sieht ein Neustart aus wie ein # gewoehnlicher Stromausfall. try: import machine if machine.reset_cause() == machine.WDT_RESET: print("Vorheriger Lauf wurde vom Watchdog beendet.") except (ImportError, AttributeError): pass # log=print, damit im Startprotokoll steht, dass der Watchdog laeuft -- # sonst bliebe unsichtbar, ob er ueberhaupt angelegt wurde. feed = run_esp32.make_watchdog(log=print) try: run_esp32.main(with_ldr=True, feed=feed) except KeyboardInterrupt: # Von Hand beendet: nicht neu starten, sondern die REPL freigeben. # Der Watchdog laeuft allerdings weiter und startet das Geraet in # config.WDT_TIMEOUT Sekunden neu -- er laesst sich nicht abschalten. print("\nbeendet (Watchdog startet in %.0f s neu)" % config.WDT_TIMEOUT) except Exception as e: _neustart("Absturz: %s" % e) start()