From 4acec81657073a592d640305646c88ab9505da81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Reinhard=20X=2E=20F=C3=BCrst?= Date: Thu, 16 Jul 2026 17:27:32 +0200 Subject: [PATCH] Antwortleitung (RX) verdrahtet und Flusskontrolle aktiviert - WANT_RESPONSE=True: Anzeige-Antworttelegramm als Handshake, Fehlercode wird ausgewertet (Rueckweg verifiziert: 02 80 81 80 30 03) - transport: Empfangspuffer vor jedem Senden leeren, damit read_response nur die frische Antwort sieht (Stoerbytes zwischen Telegrammen) - run_display: Anzeige-/Antwortfehler abfangen statt abzustuerzen - resp_test.py: Pruefwerkzeug fuer den Rueckkanal - PORT auf /dev/cu.usbserial-120 - .gitignore ergaenzt, __pycache__ aus der Versionierung entfernt Co-Authored-By: Claude Opus 4.8 (1M context) --- .gitignore | 10 +++ README.md | 32 ++++++--- __pycache__/config.cpython-313.pyc | Bin 1046 -> 0 bytes __pycache__/coords.cpython-313.pyc | Bin 4665 -> 0 bytes __pycache__/display.cpython-313.pyc | Bin 8747 -> 0 bytes __pycache__/lx200.cpython-313.pyc | Bin 2064 -> 0 bytes __pycache__/migra.cpython-313.pyc | Bin 9507 -> 0 bytes __pycache__/mount_client.cpython-313.pyc | Bin 5166 -> 0 bytes __pycache__/mount_mock.cpython-313.pyc | Bin 10435 -> 0 bytes __pycache__/test_lx200.cpython-313.pyc | Bin 8659 -> 0 bytes __pycache__/test_migra.cpython-313.pyc | Bin 18664 -> 0 bytes __pycache__/transport.cpython-313.pyc | Bin 6212 -> 0 bytes config.py | 11 ++- resp_test.py | 83 +++++++++++++++++++++++ run_display.py | 6 ++ transport.py | 4 ++ 16 files changed, 129 insertions(+), 17 deletions(-) create mode 100644 .gitignore delete mode 100644 __pycache__/config.cpython-313.pyc delete mode 100644 __pycache__/coords.cpython-313.pyc delete mode 100644 __pycache__/display.cpython-313.pyc delete mode 100644 __pycache__/lx200.cpython-313.pyc delete mode 100644 __pycache__/migra.cpython-313.pyc delete mode 100644 __pycache__/mount_client.cpython-313.pyc delete mode 100644 __pycache__/mount_mock.cpython-313.pyc delete mode 100644 __pycache__/test_lx200.cpython-313.pyc delete mode 100644 __pycache__/test_migra.cpython-313.pyc delete mode 100644 __pycache__/transport.cpython-313.pyc create mode 100644 resp_test.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5a4ff3e --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +# Python-Bytecode +__pycache__/ +*.py[cod] + +# Virtuelle Umgebungen +venv/ +.venv/ + +# Editor-/OS-Kram +.DS_Store diff --git a/README.md b/README.md index f3f6d74..2738469 100644 --- a/README.md +++ b/README.md @@ -85,14 +85,6 @@ selbst. ## Offene Punkte -- **Antworttelegramm-Pfad (RX) noch offen, absichtlich zurückgestellt.** - `WANT_RESPONSE = False` ist Default, der Normalbetrieb läuft ohne Rückkanal. - Diagnose 2026-07-15: Adapter-Loopback ok, aber über den MAX232 und am echten - Gerät kommt keine Antwort zurück → der Empfangszweig (Anzeige Pin 3 TxD → MAX232 - R_IN → R_OUT → Adapter RxD) leitet nicht. `loopback.py` hilft beim Eingrenzen. - Die Anzeige *antwortet* nachweislich (das alte MSP430-Programm nutzte die Antwort - als Handshake); es ist reine Verdrahtung. Wird der RX-Pfad fertig, `WANT_RESPONSE` - in `config.py` auf True stellen. - **Echte Montierungs-IP:** In `config.py` steht `MOUNT_HOST` noch als Platzhalter. Sobald die GM4000 im Netz erreichbar ist, dort die IP eintragen (Port 3490 ist Vorgabe). Bis dahin läuft alles gegen den Mock (`run_display.py --mock`). @@ -127,12 +119,30 @@ diese Zelle überschreibt. `CHARS_PER_LINE` aufgefüllt werden, sonst bricht das Füll-Leerzeichen um und beschädigt die andere Zeile. +## Antwortleitung (RX) + +Der Rückkanal ist verdrahtet und verifiziert (2026-07-16): Anzeige Pin 3 (TxD) → +MAX232-Empfängereingang (R_IN) → R_OUT → Adapter RxD. Die Anzeige quittiert jedes +Telegramm mit `02 80 81 80 30 03` (Fehlercode `0` = kein Fehler). `WANT_RESPONSE = True` +ist damit aktiv: Nach der Antwort darf sofort das nächste Telegramm folgen, der +Fehlercode wird ausgewertet. `resp_test.py` prüft den Rückweg (sendet mit Antwort- +Anforderung und zeigt die empfangenen Antworten). + +Wichtig: `SerialTransport.write` leert vor jedem Senden den Empfangspuffer, damit +`read_response` nur die frische Antwort sieht (sonst können Störbytes zwischen den +Telegrammen das Parsen stören). `run_display` fängt Anzeige-Fehler ab und zeichnet +beim nächsten Durchlauf neu, statt abzustürzen. + +Diagnose-Historie: Der Rückweg war anfangs falsch verdrahtet — Pin 3 lag an einem +MAX232-*Sender*ausgang statt einem Empfängereingang; zwei Ausgänge trieben +gegeneinander (verschliffener ~3-V-Pegel am Oszi). `loopback.py` grenzt so etwas ein. + ## Erledigt -- **Phase 1 + 2 am Gerät bestätigt (2026-07-15):** Koordinaten erscheinen korrekt, +- **Phase 1 + 2 am Gerät bestätigt (2026-07-15/16):** Koordinaten erscheinen korrekt, inkl. echtem Gradzeichen; im `run_display`-Betrieb aktualisieren beide Zeilen - laufend, sauber und ohne Flimmern. Protokoll, 19200 8E1, Zeichensatz und - Zeilengeometrie stimmen. + laufend, sauber und ohne Flimmern, mit Antwort-Handshake der Anzeige. Protokoll, + 19200 8E1, Zeichensatz und Zeilengeometrie stimmen. - Schrift: Sperrschrift (`ESC z`, `CHARSET_SPACED = True`), 10 Zeichen/Zeile. Die schmale `1` wirkt dadurch etwas luftig — Font-Eigenschaft, nur per eigenem Font (microSYST-PC-Software) änderbar. diff --git a/__pycache__/config.cpython-313.pyc b/__pycache__/config.cpython-313.pyc deleted file mode 100644 index e391fe877fdb61612b20d66dac3394cc68fbc5a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1046 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 diff --git a/__pycache__/display.cpython-313.pyc b/__pycache__/display.cpython-313.pyc deleted file mode 100644 index f4b0c122222efe83666b5a39bed1e67003bfa6cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8747 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 diff --git a/__pycache__/migra.cpython-313.pyc b/__pycache__/migra.cpython-313.pyc deleted file mode 100644 index 29860ca216b4b70485f530f98caa1785d378768c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9507 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 W|M}th@e3!vV5@I46x*P!=)VAzJpg+E diff --git a/__pycache__/test_lx200.cpython-313.pyc b/__pycache__/test_lx200.cpython-313.pyc deleted file mode 100644 index 1fd1d4dc7f6d3300c1d622102aa66af0727bad93..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8659 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 diff --git a/__pycache__/transport.cpython-313.pyc b/__pycache__/transport.cpython-313.pyc deleted file mode 100644 index a8574c115ee694f746b9c1982c880c0469abd5d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6212 zcmeHL+jA4w89zt6E3GcR+u#ef7cdtk_yU2X7>7hjAjA|yy;jB@Cso(d+Fp=X>e*GW zHIod(L&k2B0h%(9HZwSFrom55GMTooO#cB~hl#RrJDq7C%A2vt&^9mqzO#}n$&i`! zvD0s)Z_l3lez)Iu&U#f`e1lG`ewRC1^ zNoDUTE#7g$ktgK44eLD}+(7M2||D02Uys0%%iGQKw$CE9O(Z zs9)8`{F8Fn@6@PVDIK+a(nI-O>$F7t1%E1ZgXazsrBP2*j0#aH>Qz05y-|`Z&NKSsWO2+S z2@6BnuHp_S^r@uXucVE%Vwje#C6mS7hrN!7Qg`HWEt6oH4f-3OwROwL>W(+9F~bIR zSavEsZrGONLk*`gc35(}t^qrt;f#s3#~4d7$LmVakz($wvBChKBZ5avFw`TfMOKfj z4p{@TMqm~SP;rT&03A6NGfcyd#hm5}-SiY%+Hv3junS}*ST}!krM}~K=dtDb zR?=`${u?dPqDGZRje?j|Nd?zZ$Rt^$Lt%k6Ll;Ln4;s)NX(E}irWQR64bl-4nyp#5 zSw-PuVx3ssR4E}o_AzL(x`16EIXQGGFdz6rZeEg`uQz@!ca+uKky~9c6x;{~aS?Da z^g%6{aj~tiVGvBI*l-LG`n*ZUiXU3&ZF(Lu1MLS}&|W1dE(p7oG>n!|K^tyk3Q=Ki zzBK_mIR&9C>KO(ntE8wP0|tjZc}I*VQ%cj%uursx39fDmT26|3pl2{JKVn4}f$$U#qEH+^<%SP3iDQNb^ zVu@5d7GrI&5Dx@wKbG8m#bOZe0gz*wZ8Kv$1GWfVG0bwIxzPiCfFZ-^Vxd{RNxl>h ztcgKMS!?x3ZEJE+YW=#EN^R~a>>G!Fkx<@9>rVpP47`x)`4M){Qh;9sUM~k;p9+Z_ zz^@GOD})11Ra9g42KYV$b7ha9(QN|X(nJYTsFFmfcOyIM8H$%i4ooGuO?<}pxB<40 z24vNv3Mx^>9>Mf)#4-fo(RVR=M5VDJEChTP>AhrbhGz^kd2;O#E!f#o zW&}l)e-7F#8yJL_V9ophNBN`6_0QZ6J@ePLZ43Kv9$aebn+vSCP+!-QYiM6;*p;hm zS!vvQ-M7&7UiEV0o_j%WePGVJT1`UL^G9=S?UxVEe?J$jDwbE8TCVR|YTCE(GBC^! za?PFJnjQ4RmcC1XDa{TxLd;2+#r56o_?@W6GH7oo7YYaVm$7FfuuZ^zNAB1h5>d0< z{QnQ+APJyCsE@ko2gv-}fP9F%RUU@fZWzz~fuSQau0BjcSQr_mTl|)~$6w5F!};7;uvpv)FIOm zcqwW+{((u|)MwJ{sI$9VLmWGM29l{bxYW^}V!s*K1&7nSptIZCk9?Z=xNc$h&HcZ5 z?9;@*xaKd`H&V!>;Isz;OiQQXfW>}jyuVm0YmqQvap?l~CQ~UDq3KG{4upwEf5@iRJA_mRpY82@R|YB(%k~ zjZ&dvncD`Y@{h8OuKdx4G7Wld3c`4NaN5c@Tn0{A=wP8=!p3VFF1<1T#%;O%TlOMC z*QM~v-OZym@U{dc&LMi_p`jlR@`NG7NNb_z zzDe$R1WCRh5T${&kRUz17NAnc*Ip{QmqEODxQgM;l8fj~P;!DVP2LxfhX ziUO_wN~~Lz1zP)Oaoega(gRa3^g~11b9klHp0rp^!?xEZ65nvBSXcMhk zBf$Q-`nre64G?2!eXgqR;&EJ{{+rc6zOojq@8SzsS^Lduh{#*8=YcQl_Fo*t$^-wl v&~fL)h(O-)M(W7VYa^ZHmLNx}g Adapter RxD) noch nicht verdrahtet ist. Ist der RX-Pfad -# fertig, hier wieder auf True stellen -- dann wird der Fehlercode ausgewertet und -# ohne feste Pause gesendet. -WANT_RESPONSE = False +# Antworttelegramm als Flusskontrolle: Rueckweg verdrahtet und verifiziert +# (2026-07-16), Anzeige liefert 02 80 81 80 30 03. Nach Erhalt der Antwort darf +# sofort das naechste Telegramm folgen; der Fehlercode wird ausgewertet. +WANT_RESPONSE = True RESPONSE_TIMEOUT = 1.0 # Sekunden (nur relevant, wenn WANT_RESPONSE = True) QUIET_TIME = 0.4 # Pause zwischen Telegrammen, wenn ohne Antwort gefahren wird diff --git a/resp_test.py b/resp_test.py new file mode 100644 index 0000000..7bfb466 --- /dev/null +++ b/resp_test.py @@ -0,0 +1,83 @@ +#!/usr/bin/env python3 +"""Antwortleitung testen: Telegramme MIT Antwort-Anforderung senden. + +Sendet im 1-Sekunden-Takt ein festes Telegramm mit gesetztem Antwort-Bit +(FC = 0x81). Nach jedem Empfang muss die Anzeige auf Pin 3 ihr Antworttelegramm +senden (erwartet: 02 80 81 80 30 03). Bricht bei ausbleibender Antwort NICHT ab, +damit man am Oszi in Ruhe messen kann; liest eine evtl. eintreffende Antwort mit +und zeigt sie als Hex. + + python3 resp_test.py # 60 s, 1 s Takt + python3 resp_test.py --seconds 120 +""" + +import argparse +import sys +import time + +import config +import migra +from transport import SerialTransport + + +def main(argv=None): + p = argparse.ArgumentParser(description=__doc__, + formatter_class=argparse.RawDescriptionHelpFormatter) + p.add_argument("--seconds", type=float, default=60.0) + p.add_argument("--interval", type=float, default=1.0) + p.add_argument("--port", default=config.PORT) + args = p.parse_args(argv) + + du = migra.DataUnit().fill(config.BACKGROUND).charset(0, spaced=True) + du.cursor(0, 0); du.text("RESP TEST") + frame = migra.build_telegram(du, dest=config.DISPLAY_ADDR, src=config.HOST_ADDR, + checksum=False, response=True) # FC-Bit0 = 1 + + t = SerialTransport(port=args.port, baudrate=config.BAUDRATE, parity=config.PARITY, + bytesize=config.BYTESIZE, stopbits=config.STOPBITS, timeout=0.5) + + print("Port :", args.port) + print("TX (%d B): %s" % (len(frame), " ".join("%02X" % b for b in frame))) + print("FC : 0x%02X (Bit0=1 -> Antwort anfordern)" % frame[3]) + print("Erwartete Antwort auf Pin 3: 02 80 81 80 30 03") + print("Laufzeit %.0f s, Takt %.1f s. Abbruch mit Ctrl-C.\n" % (args.seconds, args.interval)) + + deadline = time.monotonic() + args.seconds + n = 0 + got = 0 + try: + while time.monotonic() < deadline: + n += 1 + t._port.reset_input_buffer() + t.write(frame) + # kurz auf eine Antwort lauschen (blockiert das Oszi nicht) + end = time.monotonic() + 0.4 + buf = bytearray() + while time.monotonic() < end: + c = t._port.read(1) + if c: + buf.extend(c) + if c[0] == migra.ETX: + break + elif buf: + break + if buf: + got += 1 + print("#%02d RX: %s" % (n, " ".join("%02X" % b for b in buf))) + else: + print("#%02d RX: (nichts empfangen)" % n) + # bis zum naechsten Sekundentakt warten + rest = args.interval - 0.4 + if rest > 0: + time.sleep(rest) + except KeyboardInterrupt: + print("\nabgebrochen") + finally: + t.close() + + print("\n%d Telegramme gesendet, %d Antworten empfangen." % (n, got)) + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/run_display.py b/run_display.py index 6a33d8c..3acd8de 100644 --- a/run_display.py +++ b/run_display.py @@ -17,6 +17,7 @@ import time import config import coords +import migra from display import open_display from mount_client import MountClient, MountError @@ -72,6 +73,11 @@ def main(argv=None): 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() diff --git a/transport.py b/transport.py index d315c10..4577ef1 100644 --- a/transport.py +++ b/transport.py @@ -40,6 +40,10 @@ class SerialTransport: self._timeout = timeout def write(self, data): + # Empfangspuffer vor dem Senden leeren: eventuelle Stoerbytes zwischen + # den Telegrammen verwerfen, damit read_response nur die frische Antwort + # auf DIESES Telegramm sieht. + self._port.reset_input_buffer() self._port.write(data) self._port.flush()