IOLog PSK - Amateurfunk-Station DK1IO

Direkt zum Seiteninhalt

Hauptmenü

IOLog PSK

Programme

Mein umfangreichstes Programm ist 'Log DK1IO PSK', ein Programm für Empfang und Senden in PSK mit Transceiversteuerung.
Die QSOs werden in einer SQLite-Datenbank gespeichert.
Warum ein eigenes Logprogramm, wenn es doch zahlreiche fertige Programme gibt?
Nun, gerade das Attribut "fertig" spricht für eine eigene Software, die eigentlich nie fertig ist, und die Änderungen entspringen eigenen Wünschen und Vorstellungen und kommen verzögerungsfrei zur Wirkung.
Und genauso wie der Bau eigener Hardware ist die Entwicklung eigener Software mit einem Zufriedenheitsfaktor verbunden.

PSKCore.DLL

Die PSK-Funktionen sind in der Datei 'PSKCore.DLL' von AE4JY enthalten.
In einem exzellenten Handbuch (PSKCoreDLL.pdf) werden alle Funktionen erklärt (Englisch).

Programmcode
Der PureBasic-Quellcode kann von der Downloadseite heruntergeladen werden.

RX-Modus


Die Bedienoberfläche

Aufbau, Zusammensetzung und Aussehen wurden schon mehrfach umgestaltet. Sie sind Ausdruck meiner derzeitigen Vorstellungen und können jederzeit geändert werden.
Die als Buttons verwendeten Elemente sind gar keine Buttons, sondern einfache Anzeigelemente. Diese haben den Vorteil, dass Vorder- und Hintergrundfarbe beliebig gewählt werden können, wovon ich auch Gebrauch mache.


Grundlegende Erläuterungen zur Funktion des Programms

Bedienung
Die Bedienung erfolgt über zwei Bereiche: die sichtbare Oberfläche und die Menüs.
Die gelben
Felder auf der Bedienoberfläche sind Eingabefelder, die blauen sind Anzeigeelemente.
Die Anzeigelemente Band, Leistung und Mode dienen über das Mausrad auch zur Einstellung.

Alle anderen sind Buttons, die über Mausklicks per CAT den Transceiver bzw. den Programmablauf steuern.
Grundsätzlich kann gesagt werden, dass Bedienungen, die wärend eines QSOs erforderlich sind, über Buttons vorgenommen werden.
Die anderen werden über Menüs oder das Mausrad ausgewählt.

Speichertext

Rechts oben befinden sich die Buttons zum Abruf der Speichertexte.
Nach Klick wird der jeweilige Button bis zum Ende der Textausgabe mit rotem Hintergrund dargestellt.
Durch Klick auf den RX-Button kann die Ausgabe jederzeit abgebrochen werden.
Bis auf wenige Ausnahmen wird nach Ausgabe des Textes auf Empfang umgeschaltet.
Der Speichertext erscheint im RX-Fenster in roter Schrift.

Die Speichertexte selbst sind in einer Datenbanktabelle untergebracht. Das hat den Vorteil, dass bei Änderungen der Quelltext nicht neu kompiliert werden muss.
Texte jenseits von CQ und Anruf sind auf Deutsch und Englisch vorhanden. Die Auswahl erfolgt programmgesteuert.
Bei Stationen aus DL und OE wird der Sprache-Button uaf "D" gesetzt, bei allen anderen bleibt er auf "E".
Stellt sich im Verlauf des QSOs heraus, dass die Station deutschprachig ist, kann der Button durch Klick auf "D" gestellt werden.

TX-Modus Speichertext


Manueller Text
Nach Klick auf den TX-Button wird das RX-Fenster durch das Engabefenster für den Text überlagert. Der TX-Button wird mit rotem Hintergrund dargestellt.
Der Transceiver verbleibt solange im Sendebetrieb, bis der RX-Button geklickt wird.

TX-Modus manuelle Texteingabe



Wasserfall
Der Wasserfall hat eine Breite von 640 und eine Höhe von 90 Pixeln. Damit werden 2500 Hz dargestellt. Welche Frequenz ausgewählt ist, zeigen zwei grüne Pfeile ober- und unterhalb des Wasserfalls an.
Durch Rechtsklick auf eine beliebige Stelle im Wasserfall wird der Splitmodus eingeschaltet; die TX-Frequenz wird dann durch rote Pfeile angezeigt.
Die vertikalen Buttons rechts neben dem Wassefall gestatten das Verändern der Transceiverfrequenz um jeweils 2 KHz. Das ist praktisch, wenn z. B. bei einem Contest ein größerer Frequenzbereich belegt ist als im Normalbetrieb.

Daneben befinden sich die Phasenanzeige sowie ein S-Meter.
Anfänglich benutzte ich zum Verschieben der Wasserfallzeilen die Pixel-Befehle von PureBasic. Das war aber entschieden zu langsam. Auch die Pixel-Befehle der Windows-API brachten keine wesentliche Verbesserung. Erst die Verwendung der BlockMove-Befehle von PureBasic brachte den Durchbruch. Dabei werden ganze Speicherbereiche von einem Quellbereich zu einem Zielbereich verschoben. Bei mir ist es der CopyMemory()-Befehl.
Stehen die Daten für eine neue Zeile bereit, wird der Bereich der Zeilen 0 bis 88 in den Bereich der Zeilen 1 bis 89 verschoben. Anschließend werden die neuen Daten in Zeile 0 geschrieben. Das ganze passiert etwa 4 mal pro Sekunde.

Sendeleistung

Die Sendeleistung wird durch das Mausrad gesteuert, wenn sich der Cursor auf der
Leistungsanzeige befindet. Die Schrittweite ist unterschiedlich und in einer Datenbanktabelle festgelegt.
Ab einer Ausgangsleitung von 50 W wird die PA zugeschaltet. Beim Programmstart wird eine Leistung von 25 W eingestellt.
Loggen

Durch Klick auf den Log-Button werden die QSO-Daten in die Log-Datenbanktabelle übernommen. Danach werden alle Eingabefelder gelöscht und die QSO-Nr. um 1 erhöht.
Anschließend werden die QSO-Daten im ADIF-Format auf den eQSL-Server geladen.
Hat eine Clubstation auch das persönliche Rufzeichen genannt, wird auch dafür ein QSO geloggt und auf eQSL übertragen.
Das Übertragen der QSO-Daten auf den eQSL-Server klappte nicht immer verzögerungsfrei. Dann war der Wasserfall "eingefroren". Deshalb habe ich zwischenzeitlich wöchentlich die aufgelaufenen QSOs "en bloc" hochgeladen. Jetzt bin ich wieder zum Hochladen der Einzel-QSOs zurückgekehrt, aber mit einer entscheidenden Veränderung. Das Hochladen ist jetzt in einem eigenen Thread untergebracht.. Ein Thread ist ein Teil eines Programms, der aber asynchron im Hintergrund ausgeführt wird. Das bedeutet, dass das Programm seinen Ablauf fortsetzen kann, während der Thread im Hintergrund mit dem Upload beschäftigt ist. Jetzt gibt es kein "Einfrieren" mehr.

Empfangstext

Durch Klicken auf Textteile können diese in die Eingabefelder übernommen werden. Ein Wort mit mindestens einer Ziffer wird als Rufzeichen gewertet.
Drei Ziffern werden als erhaltenes RST übernommen.

Linksklicken auf Alfatext bewirkt eine Übernahme als Name, Rechtklicken als QTH. Zwei Buchstaben, zwei Ziffern und zwei Buchstaben werden, wenn das Rufzeichenfeld noch leer ist, als Rufzeichen übernommen,
ansonsten als Locator.
Dieser wird dann ausgewertet  und Entfernung und Richtung angezeigt.
Zwei Buchstaben, Bindestrich und drei Ziffern gehen in das IOTA-Feld, wenn sie denn in das Kontinent-Muster passen.
Datenbank
Im Menü verbergen sich einige Funktionen mit Datenbankzugriff. So kann das gesamte Log nach verschiedenen Sortierkriterien angezeigt werden. Da bei den über 50.000 Einträgen bis zur Anzeige einige Sekunden verstreichen, ist eine Funktion integriert, bei der nur die letzten 100 QSOs angezeigt werden.
Hier ist die Anzeige sofort da.
Unter dem Menü 'Diplome' wird der aktuelle Punktestand für einige EPC-Diplome angezeigt.

Anzeige der letzten 100 QSOs


QSL-Druck
Die in einem Feld 'QSLPrt' makierten QSOs können auf A6-Blanko-Karteikarten gedruckt werden.
Das ist besonders dann vorteilhaft, wenn im Ausland gefunkt wurde oder Details bekanntgegeben werden sollen, die auf den Rückseiten üblicher QSL-Karten nicht vorgesehen sind.
Es können aber auch Druckerei-QSLs ausgefüllt werden.
Durch Klick auf den QSL-Button wird das aktuelle QSO für den Druck einer QSL vorgemerkt.
Als Drucker sollte ein Typ mit geradem Papiereinzug gewählt werden, weil sonst die Karten stark gewölbt werden. Dann ist einiger mechanischer Arbeitsaufwand erforderlich, um die Karten einigermaßen gerade zu bekommen.
QSO B4

Wenn ein Rufzeichen schon geloggt wurde, erscheint ein Fenster mit den QSOs. Dieses Fenster überlagert den Wasserfall.
Durch Mausklick wird wieder die Normalanzeige hergestellt.
Die QSO-Daten können editiert werden. Davon mache ich Gebrauch beim Eingeben eingegangener Papier-QSLs.

Anzeige QSO B4



Schmales Filter
Durch Klick auf den Button links unterhalb des Wasserfalls wird das CW-Filter in den Empfangsweg eingeschaltet. Das ist dann vorteilhaft, wenn starke Signale den RX zustopfen.
PSKReporter
ist integriert und sendet die empfangenen Rufzeichen ins Internet.
SWL-Berichte
können verarbeitet werden, wenn das Rufzeichen der von mir gearbeiteten Station genannt wird.
In dem vom SWL geloggten QSO wird die Spalte "SWL" markiert. SWL-Rufzeichen, Datum und UTC werden in einer eigenen Tabelle abgespeichert.
Mehrere SWL-Berichte für das selbe QSO sind möglich.
Protokollierung der eingehenden Daten
Ab und zu erhalte ich eMails, dass ein QSO mit den Daten der von mir versandten éQSL nicht im Log vorhanden ist.
So etwas ärgert mich, denn ich sauge mir das ja nicht aus den Fingern.
Also habe ich vor einigen Jahren damit angefangen, den Text im Empfangsfenster, in dem ja auch der Sendetext angezeigt wird, in Textdateien abzuspeichern. Deren Namen ändern sich monatsweise, z. B. 2016_03.txt.
Jede Minute wird dann noch ein Datum/Uhrzeit-Zusatz eingefügt, so dass ein QSO leicht aufzufinden ist.
Eine eMail mit dem QSO-Text sorgt dann für Klarheit.

Einige Programmbesonderheiten
Wie bereits an anderer Stelle erwähnt, handelt es bei den Buttons um Text-Gadgets, bei Windows statische Elemente genannt. Diese reagieren normalerweise nicht auf Mausklicks. Durch die Angabe des Parameters #SS_Notify bei der Gadgeterstellung können sie aber dazu gebracht werden, auf Linksklicks zu reagieren. Diese werden in der PureBasic-Ereignisschleife ausgewertet.
Ich benötige aber auch Reaktionen auf Rechtsklicks. Nun, diese werden ja nicht ignoriert, sondern dem Ereignis
#WM_RBUTTONUP zugeordnet. Auch das kann in der Ereignisschleife abgefragt werden.
Um das entsprechende Gadget zu ermitteln, muss der Ort des Klicks festgestellt und dann nachgesehen werden, ob dieser Ort innerhalb eines Rechtsklick-Gadgets liegt.
Bei Auftreten des Ereignisses
#WM_RBUTTONUP  wird der Code innerhalb der Ereignisschleife ab Zeile 98 ausgeführt.
In Zeile
99 wird mit einer API-Funktion die augenblickliche Cursorposition ermittelt und in der Strukturvariablen pnt1 der Struktur POINT gespeichert.
In einer
For...Next-Schleife wird in Zeile 101 für jedes Gadge das Rect (Rechteck) ermittelt und in der Variablen rct1 der Struktur RECT abgelegt.
In Zeile
102 kommt die Überprüfung, ob pnt1 in rct1 liegt. Wenn ja, wird der Variablen GadgetNr der Wert R_ClkBtns(i) zugewiesen und die Schleife verlassen.
Ansonsten wird
GadgetNr auf #Btn_Dummy gesetzt, dem kein Code zugeordnet ist.
In der
Select-Anweisung wird der dem jeweiligen Gadget zugewiesene Code ausgeführt.

98        Case #WM_RBUTTONUP
99          GetCursorPos_(pnt1)
100        For i = 0 To 3
101            GetWindowRect_(GadgetID(R_ClkBtns(i)), rct1)
102            If PtInRect_(rct1, PeekQ(pnt1))
103              GadgetNr = R_ClkBtns(i)
104              Break
105            EndIf
106            GadgetNr = #Btn_Dummy
107          Next
108          Select GadgetNr
109            Case #Btn_Begr
110              If GetGadgetColor(#Btn_Tune, #PB_Gadget_BackColor) = #BtnCol And Not bContBut
111                SpTxtAusgPSK(GadgetNr, " E")
112              EndIf
113            Case #Btn_CQ
114              SpTxtAusgPSK(GadgetNr, " DX")
115            Case #Btn_FreqDn
116              WriteSerialPortString(#COM_K3, "RT1;") : WriteSerialPortString(#COM_K3, "RD;")
117            Case #Btn_FreqUp
118              WriteSerialPortString(#COM_K3, "RT1;") : WriteSerialPortString(#COM_K3, "RU;")
119          EndSelect

Die Änderungen des Bandes, der Leistung und der PSK-Betriebsart werden mit dem Mausrad vorgenommen. Jede Bewegung des Mausrades wird im Ereignis #WM_MOUSEWHEEL ausgewertet. Dabei wird anhand des aktuellen Zustands in je einer Datenbanktabelle die Zeile ermittelt. Je nach Drehrichtung des Mausrades wird +1/-1 addiert und aus der neuen Zeile die entsprechenden Daten übernommen. Der Cursor muss sich dabei in dem entsprechenden Anzeigefeld befinden.

 
Zurück zum Seiteninhalt | Zurück zum Hauptmenü