Files
grossanzeige/run_display.py
T
admin 4cb8ea32d5 Helligkeitsregelung (LDR -> Stufe/Prozent) ergaenzt
- brightness.py: BrightnessController + CLI, portiert aus DoDimmen_V/main.h
  (gleitender Mittelwert, Hysterese). Schwellen 300/2500 aus altem Code,
  Prozente 5/15/50/100
- verallgemeinert auf 4 Stufen: 100% jetzt erreichbar (alter Code max 50%);
  neue obere Grenze HELL_MAX=3500 (anpassbar), Rest wie im Original
- run_display: --ldr bindet die Regelung in die Hauptschleife ein
  (sendet nur bei Stufenwechsel)
- test_brightness.py: Schwellen, Hysterese, Mittelung
- README dokumentiert die Regelung; .gitignore: Hardware/

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-18 09:13:02 +02:00

119 lines
4.7 KiB
Python

#!/usr/bin/env python3
"""Hauptprogramm Phase 2: Koordinaten von der Montierung pollen und anzeigen.
Fragt zyklisch RA/DEC von der 10Micron-Montierung ab und schreibt sie ueber die
Grossanzeige. Bei Verbindungsproblemen wird eine Hinweiszeile angezeigt und im
Hintergrund erneut verbunden.
python3 run_display.py # Montierung aus config.py
python3 run_display.py --host 10.0.0.42
python3 run_display.py --mock # lokalen Mock starten und nutzen
python3 run_display.py --mock --move --once # einmalig, mit laufender RA
"""
import argparse
import sys
import time
import config
import coords
import migra
from brightness import BrightnessController
from display import open_display
from mount_client import MountClient, MountError
def _format(ra_raw, dec_raw):
"""Rohstrings der Montierung fuer die Anzeige aufbereiten."""
return coords.format_ra(ra_raw), coords.format_dec(dec_raw)
def main(argv=None):
p = argparse.ArgumentParser(description=__doc__,
formatter_class=argparse.RawDescriptionHelpFormatter)
p.add_argument("--host", default=config.MOUNT_HOST)
p.add_argument("--port", type=int, default=config.MOUNT_PORT)
p.add_argument("--interval", type=float, default=config.POLL_INTERVAL)
p.add_argument("--once", action="store_true", help="nur eine Abfrage, dann Ende")
p.add_argument("--mock", action="store_true",
help="lokalen Mock starten und gegen ihn laufen")
p.add_argument("--move", action="store_true",
help="nur mit --mock: RA laeuft mit der Zeit")
p.add_argument("--dry-run", action="store_true",
help="Anzeige nur als Hex mitschreiben (keine serielle Hardware)")
p.add_argument("--ldr", type=int, default=None,
help="LDR-Rohwert fuer die Helligkeitsregelung (spaeter vom ADC)")
args = p.parse_args(argv)
host, port = args.host, args.port
mock = None
if args.mock:
from mount_mock import MountMock
mock = MountMock(host="127.0.0.1", port=0, move=args.move)
mock.start()
host, port = mock.host, mock.port
print("Mock-Montierung laeuft auf %s:%d" % (host, port))
d = open_display(fake=args.dry_run)
client = MountClient(host, port, timeout=config.MOUNT_TIMEOUT)
last_shown = None
# Helligkeitsregelung: derzeit ein fester LDR-Wert von der Kommandozeile;
# spaeter (ESP32) wird hier pro Durchlauf der ADC gelesen.
dimmer = BrightnessController() if args.ldr is not None else None
try:
while True:
try:
if not client.connected:
client.connect()
# Helligkeit nachfuehren (nur senden, wenn sich die Stufe aendert)
if dimmer is not None:
level, percent, changed = dimmer.update(args.ldr)
if changed:
d.set_brightness(percent)
print("LDR %d -> Helligkeit Stufe %d = %d %%"
% (args.ldr, level, percent))
ra_raw, dec_raw = client.get_coordinates()
ra_line, dec_line = _format(ra_raw, dec_raw)
if (ra_line, dec_line) != last_shown:
# Bei jeder Aenderung beide Zeilen neu zeichnen. Kein Vollbild-
# Loeschen (kein Flimmern); die umgekehrte Zeilenreihenfolge in
# show_lines schuetzt die Home-Zelle vor dem Gradzeichen-
# Zeichensatzwechsel, auch bei staendiger Aktualisierung.
first = last_shown is None or last_shown == config.NOLINK_LINES
d.show_lines(ra_line, dec_line, clear=first)
last_shown = (ra_line, dec_line)
print("RA %-11s DEC %-12s -> %s | %s"
% (ra_raw, dec_raw, ra_line, dec_line))
except migra.MigraError as e:
# Anzeige-/Antwortfehler (z.B. gestoerte Antwort): nicht abstuerzen,
# nur melden und beim naechsten Durchlauf neu zeichnen.
print("Anzeige: %s" % e, file=sys.stderr)
last_shown = None
except (MountError, ValueError) as e:
print("Montierung: %s" % e, file=sys.stderr)
client.close()
if config.NOLINK_LINES != last_shown:
d.show_lines(*config.NOLINK_LINES, clear=True)
last_shown = config.NOLINK_LINES
if args.once:
break
time.sleep(args.interval)
except KeyboardInterrupt:
print("\nbeendet")
finally:
client.close()
d.close()
if mock is not None:
mock.stop()
return 0
if __name__ == "__main__":
sys.exit(main())