Wenn man auf der Frequenz einer DX Station sitzt und wartet dranzukommen (hier:KH8), kann schon mal Langeweile aufkommen. Glücklicherweise grinst mich an der Station immer der Raspberry Pi an, dem ich weiland einen gereinigten UV-3R und einen TNC-Pi verpasst hab. Dann lag da noch dieses kleine Adafruit LCD rum. Warum nicht mal versuchen, APRS Informationen auf dat Dingen zu bringen. Und gleich mal zu meinen Sprachkenntnissen rudimentäre Python Kentnisse hinzufügen. Gottseidank gehört Python zu den YAFPL Sprachen (Yet another f… Programming Language), sodass es nicht sehr schwer war, mal den Datenstrom, den axlisten liefert, ein bisschen zu parsen und auf das Display zu bringen. Das Python Programm selbst ist ein flotter 15Zeiler, welches das nebenstehende Ergebnis erzielt.
Das grösste Problem war das Fehlen eines Switch{ case:} Konstrukts in Python. Da Python offensichtlich von Listenfetischisten ersonnen wurde, hab ich mal nachgeschaut, ob es nicht eine Liste in der Art [Keyword:Function] gibt. Gibt es! Heisst ‚Assoziatives Array‘. Hier mal die Vorgehensweise am Beispiel der APRS Formate ‚Message‘ und ‚Position mit Zeitstempel‘ gezeigt. APRS Formate werden im UI Frame durch ein einzelnes Zeichen definiert. Messages beginnen mit dem Doppelpunkt und die Positionsmeldung mit Zeitstempel mit einem ‚@‘. Somit definiert man sich halt Funktionen für die Formate:
def Message(): print "Message" def Pos_NoTS() print "Pos_noTS"
damit hat man quasi seine ‚Case‘ Anweisungen erschlagen. Die Case Entscheidung selbst wird unsere assoziative Liste:
formats = { ":" : Message, "@" : Pos_noTS, }
Im Programm selbst befindet sich nur noch der Listenlookup, sauber von einer Abfangroutine bei unbekannten Formaten umrahmt
try: x = formats[line2[:1]]() except: x = "Nicht definiert"
Dem Ganzen kommt natürlich entgegen, dass axlisten die ax.25 Pakete zweizeilig raushaut. In der zweiten Zeile befindet sich die Payload des UI Paketes. Das erste Zeichen ist somit der Formatbezeicher. Alles weitere ist Schreibarbeit :-). Die etwas kryptische Anweisung ‚x = formats[line2[:1]]()‘ heisst in deutsch:
‚Nimm das erste Zeichen der Liste (eine Zeichenkette ist auch ne Liste…) line2 und suche in der Liste formats nach einer Übereinstimmung und weise das Ergebnis der Variablen X zu. Da die rechte Seite der assoziativen Liste der Name einer Funktion ist, wird halt das Ergebnis der Funktion in ‚x‘ gestöpselt. Da muss sogar der alte C-Crack zugeben, dass das fast so elegant ist wie Pointer auf Funktionen……
Um Platz im eigentlichen Programm zu sparen, steckt man die Format/Verarbeitungsliste natürlich in eine eigene Datei und fügt sie mit
‚from …… import formats
in sein Programm ein. Und mit KH8/DL6JGN und T88QX hats denn dann auch noch in CW geklappt…….