RA in Zehntelminuten mit Beschriftung: "RA 18h36.9m" / "DE +38°47'"

Die GM4000 liefert im Auslieferzustand keine Sekunden, sondern Zehntelminuten.
Bisher wurde daraus eine Sekundenanzeige gerechnet -- die sprang in
6-Sekunden-Schritten, weil die Rohdaten sie gar nicht hergeben. Die Zehntelform
ist ehrlicher und kuerzer, und der gewonnene Platz traegt die Beschriftung:

    RA 18h36.9m
    DE +38°47'

Bei Hochpraezision entfaellt die Beschriftung, dort braucht die Deklination mit
+38°47'01" alle Zellen.

Der Mock konnte das gar nicht nachstellen -- er sendete immer das
Hochpraezisionsformat. Neu: "mount_mock.py --low" bildet den Auslieferzustand ab
(RA als HH:MM.T, DEC ohne Bogensekunden). Vorgabe bleibt hoch, damit die
bestehenden Tests mit ihren festen Erwartungen unveraendert durchlaufen.

Zur Darstellung, alles am Geraet ausprobiert:

- **Schmale Zeichen** (config.CELL_NARROW): Dezimalpunkt und der Abstand
  zwischen Beschriftung und Wert bekommen 3 statt 6 px -- in der Sperrschrift
  standen sie sonst sehr luftig. Fuer die Leerzeichen am Zeilenende gilt das
  nicht, die sollen den Rest der Zeile ueberschreiben.
- Damit entscheidet die **Pixelbreite** ueber das Abschneiden, nicht mehr die
  Zeichenzahl: "RA 18h36.9m" sind 11 Zeichen und trotzdem nur 60 px.
- **Linksbuendig ab LINE_X = 0**, der Schalter zum Zentrieren ist entfallen.
  Zentriert standen die Zeilen um wenige Pixel gegeneinander versetzt, weil die
  RA-Zeile mit ihrem schmalen Punkt kuerzer ist als die DEC-Zeile.

Ein Zwischenschritt, der wieder verworfen wurde und als Warnung im Code steht:
Ein Doppelpunkt als Trenner ("RA:18h36.9m") sah in Zeichensatz 0 zu wuchtig aus;
der aus Zeichensatz 1 ist schlanker, steht aber mitten in der obersten Zeile --
und jeder Zeichensatzwechsel zerstoert die Home-Zelle. Das erste Zeichen danach
noch einmal zu schreiben machte es schlimmer: Das nachgezogene Zeichen bemalt
GLYPH_WIDTH Pixel und frisst die linke Spalte seines rechten Nachbarn. Deshalb
steht in der obersten Zeile jetzt bewusst kein Sonderzeichen.

161 Tests gruen, am Geraet bestaetigt.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-27 18:23:07 +02:00
parent dae7694a07
commit 433c53aabd
10 changed files with 468 additions and 140 deletions
+43 -12
View File
@@ -75,22 +75,53 @@ def _fit(candidates, width):
return candidates[-1][:width]
def format_ra(value, width=None, high_precision=None):
"""Rektaszension formatieren, immer mit Sekunden (HHhMMmSSs).
def _to_tenths(h, m, s):
"""(h, m, s) in (Stunden, Minuten, Zehntelminuten) umrechnen.
Bei Niedrigpraezision liefert die Montierung nur Zehntel-Minuten; die
Sekunden kommen dann in 6-Sekunden-Schritten. Das Format ist dasselbe wie
bei Hochpraezision -- der Unterschied steckt allein in der Aufloesung der
Rohdaten, nicht in der Darstellung. high_precision wird daher fuer RA nicht
ausgewertet (nur bei DEC relevant, siehe format_dec).
Ganzzahlig gerechnet, damit es unter MicroPython keine Float-Ueberraschungen
gibt. Der Uebertrag ist wichtig: 18:36:57 sind 36,95 Minuten und werden zu
18:37.0, nicht zu 18:36.10.
"""
zehntel = ((h * 3600 + m * 60 + s) * 10 + 30) // 60 # kaufmaennisch runden
minuten, t = divmod(zehntel, 10)
h, m = divmod(minuten, 60)
return h % 24, m, t
def format_ra(value, width=None, high_precision=None):
"""Rektaszension formatieren.
Die Darstellung folgt dem, was die Montierung wirklich liefert:
Niedrigpraezision (Vorgabe): **HHhMM.T** mit Zehntelminuten -- genau die
Aufloesung, die die GM4000 in diesem Modus sendet. Sieben Zeichen, das laesst
Platz fuer die Beschriftung "RA:" auf der Anzeige (siehe
displayloop.format_coordinates). Das "h" statt eines Doppelpunkts ist
Nutzerwunsch -- der Doppelpunkt wirkt in der Sperrschrift zu wuchtig.
Hochpraezision: HHhMMmSSs mit echten Sekunden.
Bis 2026-07-27 wurde auch bei Niedrigpraezision mit Sekunden angezeigt. Die
sprangen dort in 6-Sekunden-Schritten, weil die Rohdaten sie gar nicht
hergeben -- die Zehntelform ist ehrlicher und kuerzer.
"""
width = config.CHARS_PER_LINE if width is None else width
high = config.HIGH_PRECISION if high_precision is None else high_precision
h, m, s = parse_ra(value)
return _fit([
"%02dh%02dm%02ds" % (h, m, s),
"%02d:%02d:%02d" % (h, m, s),
"%02dh%02dm" % (h, m),
], width)
if high:
candidates = [
"%02dh%02dm%02ds" % (h, m, s),
"%02d:%02d:%02d" % (h, m, s),
"%02dh%02dm" % (h, m),
]
else:
h, m, t = _to_tenths(h, m, s)
candidates = [
"%02dh%02d.%dm" % (h, m, t), # 8: 18h36.9m
"%02dh%02d.%d" % (h, m, t), # 7: ohne Minutenzeichen
"%02dh%02dm" % (h, m), # 6: ohne Zehntel
]
return _fit(candidates, width)
def format_dec(value, width=None, high_precision=None):