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
+57 -18
View File
@@ -55,33 +55,56 @@ CHARSET = 0
CHARSET_SPACED = True
LINE_Y = (0, 9)
# 10 Zeichen zu 6 px -- mit "probe.py pitch 6" am Geraet entschieden (2026-07-27).
# 6 px pro Zeichenzelle -- mit "probe.py pitch 6" am Geraet gemessen (2026-07-27).
#
# Die Messung stellt den Auto-Vorschub der Anzeige gegen feste Pixelabstaende und
# hat beides zugleich gezeigt:
# - Auto-Vorschub der Sperrschrift ESC z ist 7 px. Eine Zeile aus einem Stueck
# bricht deshalb nach 9 Zeichen um (9*7 = 63 von 64 px). Daher stand hier
# frueher 9 -- das war der Vorschub, nicht die Zellenbreite.
# - Die Zeichenmatrix selbst ist aber nur 6 px breit: zehn Ziffern, einzeln auf
# bricht deshalb nach 9 Zeichen um (9*7 = 63 von 64 px). Frueher stand hier
# darum 9 -- das war der Vorschub, nicht die Zellenbreite.
# - Die Zeichenmatrix selbst ist nur 6 px breit: zehn Ziffern, einzeln auf
# x = i*6 gesetzt, stehen sauber und getrennt nebeneinander (60 von 64 px).
#
# Deshalb positioniert display._emit_line jedes Zeichen selbst, statt den
# Auto-Vorschub laufen zu lassen. So passen 10 Zeichen, und die DEC-Form bekommt
# ihr abschliessendes " (siehe coords.format_dec).
CHARS_PER_LINE = 10
CELL_WIDTH = 6 # Pixel pro Zeichenzelle bei fester Positionierung
# Auto-Vorschub laufen zu lassen.
CELL_WIDTH = 6 # Pixel pro Zeichenzelle
DISPLAY_WIDTH = 64 # Pixelbreite der Anzeige
# Zeilen mittig setzen statt linksbuendig. Wirkt auf zwei Ebenen:
# - LINE_X rueckt den ganzen Zeichenblock in die Mitte: 10*6 = 60 px belegen
# nicht die vollen 64, das laesst je 2 px Rand.
# - Kuerzere Texte werden in _emit_line beidseitig mit Leerzeichen aufgefuellt,
# z.B. die 7 Zeichen von "+38°47'" bei Niedrigpraezision.
# Der Block bleibt dabei immer gleich breit und an derselben Stelle -- er
# ueberschreibt so bei jedem Durchlauf denselben Bereich, ohne Reste der vorigen
# Anzeige stehen zu lassen. Ein pixelgenau mitwandernder Offset koennte das nicht.
CENTER_LINES = True
LINE_X = (DISPLAY_WIDTH - CHARS_PER_LINE * CELL_WIDTH) // 2
# Obergrenze in *Zeichen*. Die harte Grenze ist DISPLAY_WIDTH in Pixeln: Seit
# schmale Zeichen weniger Platz brauchen (CELL_NARROW), haengt die Breite einer
# Zeile davon ab, welche Zeichen darin stehen. 11 gehen nur auf, wenn mindestens
# eines schmal ist -- "RA:18h51.0m" braucht mit seinem Dezimalpunkt 63 der 64 px,
# "DE:+38°47'" waere als 11 volle Zellen dagegen 66 px und damit zu breit.
# display._aufbereiten schneidet deshalb nach Pixeln ab, nicht nach Zeichen.
CHARS_PER_LINE = 11
# Breite, die die Anzeige beim Schreiben eines Zeichens tatsaechlich bemalt --
# mehr als CELL_WIDTH. Daher auch der Auto-Vorschub von 7 px. Wichtig fuer das
# Nachfuehren einzelner Zellen: Ein neu geschriebenes Zeichen loescht die erste
# Pixelspalte seines rechten Nachbarn, der muss also mitgeschrieben werden
# (siehe display._zelle_faellig).
GLYPH_WIDTH = 7
# Zeichen, die weniger Platz brauchen als eine volle Zelle -- in der Sperrschrift
# stehen sie sonst sehr luftig zwischen den Ziffern. Je 3 px am Geraet
# ausprobiert (2026-07-27); weil jedes Zeichen ohnehin einzeln positioniert wird,
# kostet das nichts.
# "." Dezimalpunkt der Zehntelminuten (RA 18h37.1m)
# " " Abstand zwischen Beschriftung und Wert (RA 18h37.1m)
# Achtung: Das gilt auch fuer die Leerzeichen, mit denen eine Zeile aufgefuellt
# wird. display._aufbereiten rechnet beim Auffuellen darum bewusst mit der vollen
# Zellenbreite -- sonst reichte die letzte Zelle ueber den Rand hinaus.
CELL_NARROW = {".": 3, " ": 3}
# Alle Zeilen beginnen linksbuendig bei LINE_X. Bis 2026-07-27 gab es einen
# Schalter zum Zentrieren; er ist entfallen, weil die Zeilen seit den schmalen
# Zeichen (CELL_NARROW) unterschiedlich breit sind und zentriert um wenige Pixel
# gegeneinander versetzt standen. Mit der Beschriftung "RA:" / "DE:" sollen sie
# buendig untereinander beginnen.
#
# LINE_X = 0, ganz am Rand: Die RA-Zeile braucht mit der Minutenangabe am Ende
# ("RA:18h51.0m") 63 der 64 Pixel -- fuer einen Rand ist da kein Platz mehr.
LINE_X = 0
COLOR = migra.RED # einfarbig rote Anzeige
BACKGROUND = migra.BLACK
@@ -112,6 +135,22 @@ POLL_INTERVAL = 1.0 # Sekunden zwischen zwei Koordinatenabfragen
# True = Hochpraezision (Montierung mit ":U#" umgestellt): RA/DEC mit Sekunden.
HIGH_PRECISION = False
# Beschriftung der beiden Zeilen:
#
# RA 18h37.1m
# DE +38°47'
#
# Der Abstand ist ein Leerzeichen, das ueber CELL_NARROW nur 3 px breit gesetzt
# wird -- ein Doppelpunkt stand hier zwischenzeitlich, wirkte in Zeichensatz 0
# aber zu wuchtig (2026-07-27).
#
# Die Beschriftung gibt es nur bei Niedrigpraezision: Dort liefert die Montierung
# ohnehin nur Zehntelminuten und ganze Bogenminuten, das laesst den Platz. Bei
# Hochpraezision braucht die Deklination alle Zellen (+38°47'01") -- dann
# entfaellt sie.
LABEL_RA = "RA "
LABEL_DEC = "DE "
# Anzeige, wenn die Montierung (noch) nicht erreichbar ist.
# Achtung: hoechstens CHARS_PER_LINE Zeichen, sonst wird abgeschnitten --
# "MONTIERUNG" stand hier zuerst und erschien am Geraet als "MONTIERUN".