10 Zeichen pro Zeile: Zellenbreite am Geraet gemessen, Zeilen zentriert

Die RS232-Strecke ESP32 -> MAX3232 -> Anzeige ist am Geraet bestaetigt; damit
war "probe.py pitch" moeglich und hat die offene Zeichenbreiten-Frage geklaert.

Das Ergebnis korrigiert eine Annahme: Bisher stand CHARS_PER_LINE = 9, abgezaehlt
am Zeilenumbruch. Gemessen wurde damit aber der Auto-Vorschub der Sperrschrift
(7 px), nicht die Zeichenbreite. Die Zeichenmatrix ist 6 px breit -- zehn Ziffern,
einzeln auf x = i*6 gesetzt, stehen sauber getrennt nebeneinander.

- display._emit_line positioniert jedes Zeichen selbst, statt den Auto-Vorschub
  laufen zu lassen. CHARS_PER_LINE = 10, CELL_WIDTH = 6.
- Die Deklination passt dadurch in voller Form: +38°47'01" statt +38°47'01.
- show_lines sendet ein Telegramm je Zeile. Mit Einzelpositionierung kaemen beide
  zusammen auf 224 der erlaubten 230 Bytes -- zu wenig Reserve fuer den
  Dauerbetrieb. Die Reihenfolge bleibt unten vor oben (Home-Zelle).
- Zeilen werden zentriert (CENTER_LINES, LINE_X). Der Zeichenblock bleibt dabei
  gleich breit und an derselben Stelle, damit keine Reste stehen bleiben.
- probe.py kommt mit aufs Geraet: Die Anzeige haengt jetzt am ESP32, nur von dort
  laesst sich die Geometrie noch ausmessen.

Die Tests pruefen nicht mehr auf zusammenhaengenden Text im Telegramm -- den gibt
es nicht mehr -- sondern rechnen ueber die Cursor-Sequenzen zurueck, was wirklich
auf welcher Zelle landet. 97 Tests gruen, Kette am Geraet im Sekundentakt bestaetigt.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-27 15:56:15 +02:00
parent 42fc7f52d4
commit 4f7375add3
8 changed files with 292 additions and 106 deletions
+27 -8
View File
@@ -55,14 +55,33 @@ CHARSET = 0
CHARSET_SPACED = True
LINE_Y = (0, 9)
# 9 Zeichen: am Geraet ausgemessen (2026-07-15). Die Anzeige ist 64 px breit;
# eine reine 5x7-Matrix mit 1 px Luecke waere 6 px pro Zelle und ergaebe 10
# Zeichen. Dass es nur 9 sind, passt zu 7 px pro Zelle -- die Sperrschrift
# sperrt eben, sie hat 2 px Luecke (9*7 = 63 von 64 px). Das ist die Erklaerung,
# nicht die Messung: "probe.py pitch 6" bzw. "pitch 7" entscheidet es direkt,
# indem es den Auto-Vorschub gegen feste Pixelabstaende stellt.
# Faende sich doch 6 px, passt die DEC-Form mit abschliessendem " (10 Zeichen).
CHARS_PER_LINE = 9
# 10 Zeichen zu 6 px -- mit "probe.py pitch 6" am Geraet entschieden (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
# 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
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
COLOR = migra.RED # einfarbig rote Anzeige
BACKGROUND = migra.BLACK