<changeLog>

<changedVersionNumber>1.263</changedVersionNumber>
<date>2025-06-08</date>
<description>Airscout communication and Loginname</description>
<added> nothing </added>
<changed> The shema of AS-calculation messages from KST4Contest to Airscout had been changed due to some reports of Mats Helgöstam and other nice OMs who wasn´t able to track AP by the button. Before: EACH entry of the userlist had been sent to AirScout for AS plane path calculation in 12s intervals. EACH entry of the userlist had been added to the AirScout map. New in v1.263: Only entries of the userlist with a QRB lower than the setted max-QRB will be sent to AirScout for AS plane path calculation in 60s intervals. Only entries of the userlist with a QRB lower than the setted max-QRB will be added to the AS map. </changed>
<fixed> First: By changing the AS communication there is a huge decrease of the amount of messages which have to be queued by AS and also a huge decrease of the calculation operations of AS. That most likely will speed up also the issue of the very laggy "track in AS"-button. And also it will save a lot of computing power. The new 1min interval seems to be enough. Second: Name in chat is now saveable, whoohoo! Third: Some beauty fixes before and after login (visibiity of fields) 4th: Fixed issue which 9A2HM / Kreso told me. The name of the AS client had been hard wired to "KST" and the AS servers name had been hard wired to "AS", which results out of a time where I never mentioned to publish this client. It´s now fixed, so that the name-preferences will have a real effect.... 73 / DO5AMF </fixed>
<removed/>
</changeLog>
<changeLog>
<changedVersionNumber>1.262</changedVersionNumber>
<date>2025-05-21</date>
<description>Freezes caused by getting messages before user login should be fixed now</description>
<added> nothing </added>
<changed> nothing </changed>
<fixed> ON4KST is delivering messages of stations which are not logged in already. That caused an error at the message processing engine which now should be fixed. </fixed>
<removed/>
</changeLog>
<changeLog>
<changedVersionNumber>1.26</changedVersionNumber>
<date>2025-05</date>
<description>Login to multiple Channels via single signon / spend some colors</description>
<added> 1. UI: There is a dark mode, now. Switch in "Window -> use dark mode" 2. Usage of two Chatcategories at the same time. 3. opposite station multi-callsign login-tagging 73 / DO5AMF </added>
<changed> - coloring mechanic of the software. Modify colors via css by yourself... </changed>
<fixed> - Station tagging fixed completely </fixed>
<removed/>
</changeLog>
<changeLog>
<changedVersionNumber>1.251</changedVersionNumber>
<date>2025-02</date>
<description>BUGFIX of 1.25, tnx Steve Clements!</description>
<added> - Steve spotted a problem in udp broadcast spot info reading, it´s now fixed! 73 / DO5AMF </added>
<changed> </changed>
<fixed> - Station tagging </fixed>
<removed/>
</changeLog>
<changeLog>
<changedVersionNumber>1.25</changedVersionNumber>
<date>2025-02</date>
<description>Wishlist-time</description>
<added> - New configuration Tab: Messagehandling You can find options to wether auto-answering all messages which arriving or answer your CQ qrg automatically if someone asks you for it. - New configuration Tab: Messagehandling There you can configure the default userinfo-window message filter [for my friend Gianluca :-)] - There is a big amount of planned new features during april. Stay tuned! 73 / DO5AMF </added>
- Added coloured lines: new personal message rows will appear in red and changes its colours every 30 seconds as they get older, rainbow like via yellow to white (tnx Gianluca, good idea)
<changed> </changed>
<fixed> - Users with suffixes like "-2 and -70" had not been marked as worked. These will now be ignored and the stations will be marked correctly </fixed>
<removed/>
</changeLog>
<changeLog>
<changedVersionNumber>1.24</changedVersionNumber>
<date>2024-11</date>
<description>Wishlist-time</description>
<added> - Button to show qrz.com profile of a selected station - Button to show qrzcq.com profile of a selected station </added>
- Added coloured lines: new personal message rows will appear in red and changes its colours every 30 seconds as they get older, rainbow like via yellow to white (tnx Gianluca, good idea)
<changed> </changed>
<fixed> - Users with suffixes like "-2 and -70" had not been marked as worked. These will now be ignored and the stations will be marked correctly </fixed>
<removed/>
</changeLog>
<changeLog>
<changedVersionNumber>1.23</changedVersionNumber>
<date>2024-10</date>
<description>DXCluster Server is now implemented</description>
<added>- DXCluster Server (tnx OMAAO): KST4Contest inhibts a DXCluster server now. It generates a DXCluster message to feed your log client with station-reachable warnings. As a default, the dxcluster warnings will only be sent if a chatter writes to another and due to this is most likely pointing it´s antenna to your direction. For correct spot processing of your log program, you must use another spotters callsign than your contest callsign. Otherwise the filter will not work. </added>
<changed> </changed>
<fixed> </fixed>
<removed/>
</changeLog>
<changeLog>
<changedVersionNumber>1.22</changedVersionNumber>
<date>2024-05</date>
<description>Increase usability, fixed AS button</description>
<added>- Variables (tnx OMAAO): * MYLOCATORSHORT * MYQRGSHORT * QRZNAME </added>
<changed>- Sendtext-field focus Focus is now on the text field when clicking on the list of people in the chat to avoid double clicking. You can just begin to type after clicking a callsign. </changed>
<fixed>- Worked-station-filter (tnx Gianluca) Filter is now live, if you activate the worked-filter, the worked(and user tagged not-qrv-for-this-band) will disappear without manually reactivating the filter - Chatters list sorting by QRB (tnx Alessandro) Fixed sorting, was lexicographically, now it´s handled as numbers - Airscout-showpath-button The button inhibits an arrow, directed to the selected station in the chatmembers list. A click to this button will now maximize AirScout which then shows the path and the airplanes which are reflectable to reach the selected station </fixed>
<removed/>
</changeLog>
<changeLog>
<changedVersionNumber>1.21</changedVersionNumber>
<date>2024-04</date>
<description>Increase usability</description>
<added> </added>
<changed> - GUI-behaviour After a click to the save button, the sizes of all windows will be stored in the configfile and restored at the next startup of the client. Also the dividers of the splitpanels will be stored and restored. On problems delete config-file! Further the filters section is now a flowpane to make the software viewable at lower resolutions. </changed>
<fixed> </fixed>
<removed/>
</changeLog>
<changeLog>
<changedVersionNumber>1.2</changedVersionNumber>
<date>2024-04</date>
<description>Increase usability</description>
<added> - Selectable bands Its now possible to select which bands you want to activate. Please select your bands and click save and restart the software. There will only appear buttonds and field which are related to the bands which you have choosen. - Unworkable tags for each callsign. It´s now possible to set NOT-QRV tags for each station for each band. If an OM tells you for example, that he is not QRV at 144 MHz, you can set the "unworkable" flag for him and able to filter his callsign out of the chatmember-list - QTF-Arrow The button "show path in AS" now got an arrow which shows the QTF of the selected station while the button is still out of function (will work that out some time) </added>
<changed> </changed>
<fixed/>
<removed/>
</changeLog>
This commit is contained in:
Marc Froehlich
2025-07-16 12:56:57 +02:00
parent 5cca2923c2
commit ee5ee535bb
30 changed files with 20699 additions and 862 deletions

View File

@@ -1,3 +1,2 @@
DF7KF dr2x
G4KUX oe3cin
ha2np

15832
bugsept24.txt Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -9,11 +9,14 @@ public class ApplicationConstants {
/** /**
* Name of file to store preferences in. * Name of file to store preferences in.
*/ */
public static final double APPLICATION_CURRENTVERSIONNUMBER = 1.22; public static final double APPLICATION_CURRENTVERSIONNUMBER = 1.263;
public static final String VERSIONINFOURLFORUPDATES_KST4CONTEST = "https://do5amf.funkerportal.de/kst4ContestVersionInfo.xml"; public static final String VERSIONINFOURLFORUPDATES_KST4CONTEST = "https://do5amf.funkerportal.de/kst4ContestVersionInfo.xml";
public static final String VERSIONINFDOWNLOADEDLOCALFILE = "kst4ContestVersionInfo.xml"; public static final String VERSIONINFDOWNLOADEDLOCALFILE = "kst4ContestVersionInfo.xml";
public static final String STYLECSSFILE_DEFAULT_DAYLIGHT = "KST4ContestDefaultDay.css";
public static final String STYLECSSFILE_DEFAULT_EVENING = "KST4ContestDefaultEvening.css";
public static final String DISCSTRING_DISCONNECT_AND_CLOSE = "CLOSEALL"; public static final String DISCSTRING_DISCONNECT_AND_CLOSE = "CLOSEALL";
public static final String DISCSTRING_DISCONNECT_DUE_PAWWORDERROR = "JUSTDSICCAUSEPWWRONG"; public static final String DISCSTRING_DISCONNECT_DUE_PAWWORDERROR = "JUSTDSICCAUSEPWWRONG";
public static final String DISCSTRING_DISCONNECTONLY = "ONLYDISCONNECT"; public static final String DISCSTRING_DISCONNECTONLY = "ONLYDISCONNECT";

View File

@@ -11,6 +11,7 @@ import java.net.UnknownHostException;
import java.util.TimerTask; import java.util.TimerTask;
import javafx.collections.ObservableList; import javafx.collections.ObservableList;
import kst4contest.locatorUtils.Location;
import kst4contest.model.ChatMember; import kst4contest.model.ChatMember;
@@ -29,23 +30,29 @@ public class AirScoutPeriodicalAPReflectionInquirerTask extends TimerTask {
Thread.currentThread().setName("AirscoutPeriodicalReflectionInquirierTask"); Thread.currentThread().setName("AirscoutPeriodicalReflectionInquirierTask");
String KSTClientsNameForQuery = this.client.getChatPreferences().getAirScout_asClientNameString();
String ASServerNameStringForAnswer = this.client.getChatPreferences().getAirScout_asServerNameString();
//TODO: Manage prefixes kst and as via preferences file and instance //TODO: Manage prefixes kst and as via preferences file and instance
//TODO: Check if locator is changeable via the preferences object, need to be correct if it changes //TODO: Check if locator is changeable via the preferences object, need to be correct if it changes
DatagramSocket dsocket; DatagramSocket dsocket;
String prefix_asSetpath ="ASSETPATH: \"KST\" \"AS\" "; // String prefix_asSetpath ="ASSETPATH: \"KST\" \"AS\" "; //working original
String prefix_asWatchList = "ASWATCHLIST: \"KST\" \"AS\" "; // String prefix_asWatchList = "ASWATCHLIST: \"KST\" \"AS\" "; //working original
String prefix_asSetpath ="ASSETPATH: \"" + this.client.getChatPreferences().getAirScout_asClientNameString() + "\" \"" + this.client.getChatPreferences().getAirScout_asServerNameString() + "\" ";
String prefix_asWatchList = "ASWATCHLIST:\" "+ this.client.getChatPreferences().getAirScout_asClientNameString()+ "\" \"" + this.client.getChatPreferences().getAirScout_asServerNameString() + "\" ";
String bandString = "1440000"; String bandString = "1440000";
String myCallAndMyLocString = this.client.getChatPreferences().getLoginCallSign() + "," + this.client.getChatPreferences().getLoginLocator(); String myCallAndMyLocString = this.client.getChatPreferences().getStn_loginCallSign() + "," + this.client.getChatPreferences().getStn_loginLocatorMainCat();
String suffix = ""; //"FOREIGNCALL,FOREIGNLOC " -- dont forget the space at the end!!! String suffix = ""; //"FOREIGNCALL,FOREIGNLOC " -- dont forget the space at the end!!!
String asWatchListString = prefix_asWatchList + bandString + "," + myCallAndMyLocString; String asWatchListString = prefix_asWatchList + bandString + "," + myCallAndMyLocString;
String asWatchListStringSuffix = asWatchListString; String asWatchListStringSuffix = asWatchListString;
String host = "255.255.255.255"; String host = "255.255.255.255";
// int port = 9872; // int port = 9872;
int port = client.getChatPreferences().getAirScout_asCommunicationPort();
// System.out.println("<<<<<<<<<<<<<<<<<<<<ASPERI: " + port);
int port = client.getChatPreferences().getAirScout_asCommunicationPort();
// byte[] message = "ASSETPATH: \"KST\" \"AS\" 1440000,DO5AMF,JN49GL,OK1MZM,JN89IW ".getBytes(); Original, ging // byte[] message = "ASSETPATH: \"KST\" \"AS\" 1440000,DO5AMF,JN49GL,OK1MZM,JN89IW ".getBytes(); Original, ging
InetAddress address; InetAddress address;
@@ -63,8 +70,13 @@ public class AirScoutPeriodicalAPReflectionInquirerTask extends TimerTask {
for (ChatMember i : ary_threadSafeChatMemberArray) { for (ChatMember i : ary_threadSafeChatMemberArray) {
if (i.getQrb() < this.client.getChatPreferences().getStn_maxQRBDefault())
//Here: check if maximum distance to the chatmember is reached, only ask AS if distance is lower!
{
suffix = i.getCallSign() + "," + i.getQra() + " "; suffix = i.getCallSign() + "," + i.getQra() + " ";
//
String queryStringToAirScout = ""; String queryStringToAirScout = "";
queryStringToAirScout += prefix_asSetpath + bandString + "," + myCallAndMyLocString + "," + suffix; queryStringToAirScout += prefix_asSetpath + bandString + "," + myCallAndMyLocString + "," + suffix;
@@ -79,95 +91,19 @@ public class AirScoutPeriodicalAPReflectionInquirerTask extends TimerTask {
dsocket.send(packet); dsocket.send(packet);
dsocket.close(); dsocket.close();
} catch (UnknownHostException e1) { } catch (UnknownHostException e1) {
// TODO Auto-generated catch block
e1.printStackTrace(); e1.printStackTrace();
} catch (NoRouteToHostException e) { } catch (NoRouteToHostException e) {
e.printStackTrace(); e.printStackTrace();
} } catch (SocketException e) {
catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace(); e.printStackTrace();
} catch (IOException e) { } catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace(); e.printStackTrace();
} }
// System.out.println("[ASUDPTask, info:] sent query " + queryStringToAirScout); // System.out.println("[ASUDPTask, info:] sent query " + queryStringToAirScout);
asWatchListStringSuffix += "," + i.getCallSign() + "," + i.getQra(); asWatchListStringSuffix += "," + i.getCallSign() + "," + i.getQra();
} }
}
// for (Iterator iterator = praktiKSTActiveUserList.iterator(); iterator.hasNext();) {
// ChatMember chatMember = (ChatMember) iterator.next();
//
// suffix = chatMember.getCallSign() + "," + chatMember.getQra() + " ";
//
// String queryStringToAirScout = "";
//
// queryStringToAirScout += prefix_asSetpath + bandString + "," + myCallAndMyLocString + "," + suffix;
//
// byte[] queryStringToAirScoutMSG = queryStringToAirScout.getBytes();
//
// try {
// address = InetAddress.getByName("255.255.255.255");
// DatagramPacket packet = new DatagramPacket(queryStringToAirScoutMSG, queryStringToAirScoutMSG.length, address, port);
// dsocket = new DatagramSocket();
// dsocket.setBroadcast(true);
// dsocket.send(packet);
// dsocket.close();
// } catch (UnknownHostException e1) {
// // TODO Auto-generated catch block
// e1.printStackTrace();
// } catch (SocketException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// } catch (IOException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
//
//// System.out.println("[ASUDPTask, info:] sent query " + queryStringToAirScout);
//
// asWatchListStringSuffix += "," + chatMember.getCallSign() + "," + chatMember.getQra();
//
// }}
// for (Iterator iterator = praktiKSTActiveUserList.iterator(); iterator.hasNext();) {
// ChatMember chatMember = (ChatMember) iterator.next();
//
// suffix = chatMember.getCallSign() + "," + chatMember.getQra() + " ";
//
// String queryStringToAirScout = "";
//
// queryStringToAirScout += prefix_asSetpath + bandString + "," + myCallAndMyLocString + "," + suffix;
//
// byte[] queryStringToAirScoutMSG = queryStringToAirScout.getBytes();
//
// try {
// address = InetAddress.getByName("255.255.255.255");
// DatagramPacket packet = new DatagramPacket(queryStringToAirScoutMSG, queryStringToAirScoutMSG.length, address, port);
// dsocket = new DatagramSocket();
// dsocket.setBroadcast(true);
// dsocket.send(packet);
// dsocket.close();
// } catch (UnknownHostException e1) {
// // TODO Auto-generated catch block
// e1.printStackTrace();
// } catch (SocketException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// } catch (IOException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
//
//// System.out.println("[ASUDPTask, info:] sent query " + queryStringToAirScout);
//
// asWatchListStringSuffix += "," + chatMember.getCallSign() + "," + chatMember.getQra();
//
// }
/** /**
* As next we will set the ASWatchlist. All stations in chat will be watched by airscout causing following code.\n\n * As next we will set the ASWatchlist. All stations in chat will be watched by airscout causing following code.\n\n
@@ -185,14 +121,7 @@ public class AirScoutPeriodicalAPReflectionInquirerTask extends TimerTask {
dsocket.setBroadcast(true); dsocket.setBroadcast(true);
dsocket.send(packet); dsocket.send(packet);
dsocket.close(); dsocket.close();
} catch (UnknownHostException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) { } catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace(); e.printStackTrace();
} }

View File

@@ -33,30 +33,74 @@ public class BeaconTask extends TimerTask {
ChatMessage beaconMSG = new ChatMessage(); ChatMessage beaconMSG = new ChatMessage();
String replaceVariables = this.chatController.getChatPreferences().getBcn_beaconText(); String replaceVariables = this.chatController.getChatPreferences().getBcn_beaconTextMainCat();
// replaceVariables = bcn_beaconText;
replaceVariables = replaceVariables.replaceAll("MYQRG", this.chatController.getChatPreferences().getMYQRG().getValue()); replaceVariables = replaceVariables.replaceAll("MYQRG", this.chatController.getChatPreferences().getMYQRGFirstCat().getValue());
replaceVariables = replaceVariables.replaceAll("MYCALL", this.chatController.getChatPreferences().getLoginCallSign()); replaceVariables = replaceVariables.replaceAll("MYCALL", this.chatController.getChatPreferences().getStn_loginCallSign());
replaceVariables = replaceVariables.replaceAll("MYLOCATOR", this.chatController.getChatPreferences().getLoginLocator()); replaceVariables = replaceVariables.replaceAll("MYLOCATOR", this.chatController.getChatPreferences().getStn_loginLocatorMainCat());
replaceVariables = replaceVariables.replaceAll("MYQTF", this.chatController.getChatPreferences().getActualQTF().getValue() + ""); replaceVariables = replaceVariables.replaceAll("MYQTF", this.chatController.getChatPreferences().getActualQTF().getValue() + "");
replaceVariables = replaceVariables.replaceAll("SECONDQRG", this.chatController.getChatPreferences().getActualQTF().getValue() + "");
beaconMSG.setMessageText( beaconMSG.setMessageText(
"MSG|" + this.chatController.getChatPreferences().getLoginChatCategory().getCategoryNumber() + "|0|" + replaceVariables + "|0|"); "MSG|" + this.chatController.getChatPreferences().getLoginChatCategoryMain().getCategoryNumber() + "|0|" + replaceVariables + "|0|");
beaconMSG.setMessageDirectedToServer(true); beaconMSG.setMessageDirectedToServer(true);
// System.out.println("########### " + replaceVariables);
if (this.chatController.getChatPreferences().isBcn_beaconsEnabled() ) {
ChatMessage beaconMSG2 = new ChatMessage();
String replaceVariables2 = this.chatController.getChatPreferences().getBcn_beaconTextSecondCat();
replaceVariables2 = replaceVariables2.replaceAll("MYQRG", this.chatController.getChatPreferences().getMYQRGFirstCat().getValue());
replaceVariables2 = replaceVariables2.replaceAll("MYCALL", this.chatController.getChatPreferences().getStn_loginCallSign());
replaceVariables2 = replaceVariables2.replaceAll("MYLOCATOR", this.chatController.getChatPreferences().getStn_loginLocatorMainCat());
replaceVariables2 = replaceVariables2.replaceAll("MYQTF", this.chatController.getChatPreferences().getActualQTF().getValue() + "");
replaceVariables2 = replaceVariables2.replaceAll("SECONDQRG", this.chatController.getChatPreferences().getMYQRGSecondCat().getValue() + "");
beaconMSG2.setMessageText(
"MSG|" + this.chatController.getChatPreferences().getLoginChatCategorySecond().getCategoryNumber() + "|0|" + replaceVariables + "|0|");
beaconMSG2.setMessageDirectedToServer(true);
/**
* beacon 1st Chatcategory
*/
if (this.chatController.getChatPreferences().isBcn_beaconsEnabledMainCat() ) {
System.out.println(new Utils4KST().time_generateCurrentMMDDhhmmTimeString() System.out.println(new Utils4KST().time_generateCurrentMMDDhhmmTimeString()
+ " [BeaconTask, Info]: Sending CQ: " + beaconMSG.getMessageText()); + " [BeaconTask, Info]: Sending CQ: " + beaconMSG.getMessageText());
this.chatController.getMessageTXBus().add(beaconMSG); this.chatController.getMessageTXBus().add(beaconMSG);
} else { } else {
//do nothing, CQ is disabled //do nothing, CQ is disabled
} }
/**
* beacon 2nd Chatcategory
*/
if (this.chatController.getChatPreferences().isLoginToSecondChatEnabled()) { //only send if 2nd cat enabled
if (this.chatController.getChatPreferences().isBcn_beaconsEnabledSecondCat()) {
beaconMSG2.setMessageText(
"MSG|" + this.chatController.getChatPreferences().getLoginChatCategorySecond().getCategoryNumber() + "|0|" + replaceVariables2 + "|0|");
beaconMSG2.setMessageDirectedToServer(true);
System.out.println(new Utils4KST().time_generateCurrentMMDDhhmmTimeString()
+ " [BeaconTask, Info]: Sending CQ 2nd Cat: " + beaconMSG2.getMessageText());
this.chatController.getMessageTXBus().add(beaconMSG2);
} else {
//do nothing, CQ is disabled
}
}
} }

View File

@@ -1,17 +1,15 @@
package kst4contest.controller; package kst4contest.controller;
import java.net.*; import java.net.*;
import java.nio.ByteBuffer;
import java.nio.channels.Selector;
import java.sql.SQLException; import java.sql.SQLException;
import java.time.OffsetDateTime; import java.time.OffsetDateTime;
import java.time.ZoneOffset; import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.HashMap; import java.util.*;
import java.util.Iterator;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.LinkedBlockingQueue;
import javafx.beans.Observable;
import javafx.collections.FXCollections; import javafx.collections.FXCollections;
import javafx.collections.ObservableList; import javafx.collections.ObservableList;
import javafx.collections.transformation.FilteredList; import javafx.collections.transformation.FilteredList;
@@ -46,12 +44,14 @@ public class ChatController {
private UpdateInformation updateInformation; private UpdateInformation updateInformation;
private ChatPreferences chatPreferences; private ChatPreferences chatPreferences;
private ChatCategory category; private ChatCategory chatCategoryMain;
private ChatCategory chatCategorySecondChat;
boolean connectedAndLoggedIn; boolean connectedAndLoggedIn;
boolean connectedAndNOTLoggedIn; boolean connectedAndNOTLoggedIn;
boolean disconnected; boolean disconnected;
boolean disconnectionPerformedByUser = false; boolean disconnectionPerformedByUser = false;
public boolean isDisconnectionPerformedByUser() { public boolean isDisconnectionPerformedByUser() {
return disconnectionPerformedByUser; return disconnectionPerformedByUser;
} }
@@ -60,6 +60,15 @@ public class ChatController {
this.disconnectionPerformedByUser = disconnectionPerformedByUser; this.disconnectionPerformedByUser = disconnectionPerformedByUser;
} }
public ChatCategory getChatCategorySecondChat() {
return chatCategorySecondChat;
}
public void setChatCategorySecondChat(ChatCategory chatCategorySecondChat) {
this.chatCategorySecondChat = chatCategorySecondChat;
}
public UpdateInformation getUpdateInformation() { public UpdateInformation getUpdateInformation() {
return updateInformation; return updateInformation;
} }
@@ -106,7 +115,7 @@ public class ChatController {
String prefix_asSetpath ="ASSHOWPATH: \"KST\" \"AS\" "; String prefix_asSetpath ="ASSHOWPATH: \"KST\" \"AS\" ";
String bandString = "1440000"; String bandString = "1440000";
String myCallAndMyLocString = chatPreferences.getLoginCallSign() + "," + chatPreferences.getLoginLocator(); String myCallAndMyLocString = chatPreferences.getStn_loginCallSign() + "," + chatPreferences.getStn_loginLocatorMainCat();
String remoteCallAndLocString = remoteChatMember.getCallSign() +"," + remoteChatMember.getQra(); String remoteCallAndLocString = remoteChatMember.getCallSign() +"," + remoteChatMember.getQra();
@@ -160,6 +169,8 @@ public class ChatController {
*/ */
public void disconnect(String action) { public void disconnect(String action) {
this.dxClusterServer.stop();
this.setDisconnectionPerformedByUser(true); this.setDisconnectionPerformedByUser(true);
try { try {
@@ -254,6 +265,7 @@ public class ChatController {
dbHandler.closeDBConnection(); dbHandler.closeDBConnection();
dxClusterServer.stop();
try { try {
@@ -352,6 +364,8 @@ public class ChatController {
private ChatController chatController; private ChatController chatController;
private MessageBusManagementThread messageProcessor; private MessageBusManagementThread messageProcessor;
private ReadUDPbyAirScoutMessageThread airScoutUDPReaderThread; private ReadUDPbyAirScoutMessageThread airScoutUDPReaderThread;
private DXClusterThreadPooledServer dxClusterServer;
private PlayAudioUtils playAudioUtils = new PlayAudioUtils(); private PlayAudioUtils playAudioUtils = new PlayAudioUtils();
@@ -372,6 +386,9 @@ public class ChatController {
private DBController dbHandler; private DBController dbHandler;
private Socket socket; private Socket socket;
private ServerSocket cluster_telnetServerSocket; // socket that accepts telnet client connects (cluster client)
// private ServerSocketChannel cluster_telnetServerSocketChannel;
private Timer userActualizationtimer; private Timer userActualizationtimer;
@@ -424,6 +441,46 @@ public class ChatController {
// ****************************************************************************************************************************************** // ******************************************************************************************************************************************
/**
* checks if the callsign-String of a given chatmember instance and a given list
* instance is in the list (multiple entries are possible to find by this method! <br/>
* If yes, returns an Array of int with the list indexes <b>if not, returns empty array</b>
* <br/>
* <br/>Also gives back indexes for callsign-70 or callsign-2 etc.<br/>
*
* @param lookForThis
* @return int[]
*/
public ArrayList<Integer> checkListForChatMemberIndexesByCallSign(ChatMember lookForThis) {
ArrayList<Integer> resultingIndexes = new ArrayList<Integer>();
if (lookForThis == null) {
// System.out.println("[ChatCtrl] ERROR: null Value for Chatmember detected! Member cannot be in the list!");
return resultingIndexes;
} else if (lookForThis.getCallSign() == null) {
System.out.println("[ChatCtrl] ERROR: null Value in Callsign detected! Member cannot be in the list!");
return resultingIndexes;
}
for (Iterator iterator = lst_chatMemberList.iterator(); iterator.hasNext();) {
ChatMember chatMember = (ChatMember) iterator.next();
if (chatMember.getCallSignRaw().equals(lookForThis.getCallSignRaw())) { //Change for stations with -2 or -70 in logincallsign
System.out
.println("chtctrlr: Found raw " + chatMember.getCallSignRaw() + " // " + lookForThis.getCallSign());
resultingIndexes.add(lst_chatMemberList.indexOf(chatMember));
} else {
}
}
return resultingIndexes;
}
/** /**
* checks if the callsign-String of a given chatmember instance and a given list * checks if the callsign-String of a given chatmember instance and a given list
* instance is in the list. If yes, returns the index in the List, <b>if not, * instance is in the list. If yes, returns the index in the List, <b>if not,
@@ -445,9 +502,10 @@ public class ChatController {
for (Iterator iterator = lst_chatMemberList.iterator(); iterator.hasNext();) { for (Iterator iterator = lst_chatMemberList.iterator(); iterator.hasNext();) {
ChatMember chatMember = (ChatMember) iterator.next(); ChatMember chatMember = (ChatMember) iterator.next();
if (chatMember.getCallSign().equals(lookForThis.getCallSign())) { // if (chatMember.getCallSign().equals(lookForThis.getCallSign())) {
if (chatMember.getCallSignRaw().equals(lookForThis.getCallSignRaw())) { //TODO: Change for stations with -2 or -70 in logincallsign
// System.out // System.out
// .println("MSGBUSHELPER: Found " + chatMember.getCallSign() + " at " + lst_chatMemberList.indexOf(chatMember)); // .println("chtctrlr: Found raw " + chatMember.getCallSignRaw() + " // " + lookForThis.getCallSign());
return lst_chatMemberList.indexOf(chatMember); return lst_chatMemberList.indexOf(chatMember);
} else { } else {
@@ -617,7 +675,9 @@ public class ChatController {
public ChatController() { public ChatController() {
super(); super();
category = new ChatCategory(2); chatCategoryMain = new ChatCategory(2);//Todo: selectable chatcategory, switched by user
chatCategorySecondChat = new ChatCategory(3); //Todo: selectable chatcategory, switched by user
ownChatMemberObject = new ChatMember(); ownChatMemberObject = new ChatMember();
ownChatMemberObject.setCallSign(userName); ownChatMemberObject.setCallSign(userName);
ownChatMemberObject.setName(showedName); ownChatMemberObject.setName(showedName);
@@ -650,17 +710,17 @@ category = new ChatCategory(2);
try { try {
if (chatMessage.getReceiver().getCallSign().equals(getChatPreferences().getLoginCallSign())) { if (chatMessage.getReceiver().getCallSign().equals(getChatPreferences().getStn_loginCallSign())) {
return true; //messages addressed to you return true; //messages addressed to you
} }
if ((chatMessage.getSender().getCallSign().equals(getChatPreferences().getLoginCallSign())) && (!chatMessage.getReceiver().getCallSign().equals("ALL"))){ if ((chatMessage.getSender().getCallSign().equals(getChatPreferences().getStn_loginCallSign())) && (!chatMessage.getReceiver().getCallSign().equals("ALL"))){
return true; //your own echo except texts to all (CQ) return true; //your own echo except texts to all (CQ)
} }
String ignoreCaseString = chatMessage.getMessageText(); String ignoreCaseString = chatMessage.getMessageText();
if ((chatMessage.getMessageText().contains(chatPreferences.getLoginCallSign().toLowerCase()) || (chatMessage.getMessageText().contains(chatPreferences.getLoginCallSign().toUpperCase()))) if ((chatMessage.getMessageText().contains(chatPreferences.getStn_loginCallSign().toLowerCase()) || (chatMessage.getMessageText().contains(chatPreferences.getStn_loginCallSign().toUpperCase())))
&& (!chatMessage.getSender().getCallSign().equals(getChatPreferences().getLoginCallSign()))) { && (!chatMessage.getSender().getCallSign().equals(getChatPreferences().getStn_loginCallSign()))) {
return true; //if someone writes about you, you will get the mail, too, except you are the sender...! return true; //if someone writes about you, you will get the mail, too, except you are the sender...!
} }
@@ -699,8 +759,10 @@ category = new ChatCategory(2);
@Override @Override
public boolean test(ChatMessage chatMessage) { public boolean test(ChatMessage chatMessage) {
try { try {
if ((!chatMessage.getSender().getCallSign().equals(getChatPreferences().getLoginCallSign())) && if ((!chatMessage.getSender().getCallSign().equals(getChatPreferences().getStn_loginCallSign())) &&
(!chatMessage.getReceiver().getCallSign().equals(getChatPreferences().getLoginCallSign()))) { (!chatMessage.getReceiver().getCallSign().equals(getChatPreferences().getStn_loginCallSign())) && (!chatMessage.getReceiver().getCallSign().equals("ALL")) )
//RX not own callsign and TX not own callsign and callsign is not "ALL" (that means, directed to public)
{
return true; return true;
} else return false; } else return false;
@@ -717,9 +779,10 @@ category = new ChatCategory(2);
chatPreferences = new ChatPreferences(); chatPreferences = new ChatPreferences();
chatPreferences.readPreferencesFromXmlFile(); // set the praktikst Prefs by file or default if file is corrupted chatPreferences.readPreferencesFromXmlFile(); // set the praktikst Prefs by file or default if file is corrupted
category = chatPreferences.getLoginChatCategory(); chatCategoryMain = chatPreferences.getLoginChatCategoryMain();
this.userName = chatPreferences.getLoginCallSign(); chatCategorySecondChat = chatPreferences.getLoginChatCategorySecond();
this.password = chatPreferences.getLoginPassword(); this.userName = chatPreferences.getStn_loginCallSign();
this.password = chatPreferences.getStn_loginPassword();
// category = setCategory; // category = setCategory;
ownChatMemberObject = setOwnChatMemberObject; ownChatMemberObject = setOwnChatMemberObject;
@@ -758,6 +821,7 @@ category = new ChatCategory(2);
return writeThread; return writeThread;
} }
public void setWriteThread(WriteThread writeThread) { public void setWriteThread(WriteThread writeThread) {
this.writeThread = writeThread; this.writeThread = writeThread;
} }
@@ -770,15 +834,19 @@ category = new ChatCategory(2);
this.readThread = readThread; this.readThread = readThread;
} }
public ChatCategory getCategory() { public ChatCategory getChatCategoryMain() {
return category; return chatCategoryMain;
} }
public void setCategory(ChatCategory category) { public void setChatCategoryMain(ChatCategory chatCategoryMain) {
this.category = category; this.chatCategoryMain = chatCategoryMain;
} }
// public void setChatMemberTable(Hashtable<String, ChatMember> chatMemberTable) { public DXClusterThreadPooledServer getDxClusterServer() {
return dxClusterServer;
}
// public void setChatMemberTable(Hashtable<String, ChatMember> chatMemberTable) {
// this.chatMemberTable = chatMemberTable; // this.chatMemberTable = chatMemberTable;
// } // }
// //
@@ -823,9 +891,14 @@ category = new ChatCategory(2);
messageTXBus = new LinkedBlockingQueue<ChatMessage>(); messageTXBus = new LinkedBlockingQueue<ChatMessage>();
// messageBus.add(""); // messageBus.add("");
socket = new Socket(hostname, port); socket = new Socket(hostname, port);//socket for the on4kst chat server
System.out.println("Connected to the chat server: " + socket.isConnected()); System.out.println("Connected to the chat server: " + socket.isConnected());
// cluster_telnetServerSocket = new ServerSocket(8000); //TODO: Port customization have do be made
ByteBuffer buffer = ByteBuffer.allocate(1024);
Selector selector = Selector.open();
// consoleReader = new InputReaderThread(this); // consoleReader = new InputReaderThread(this);
// consoleReader.start(); // consoleReader.start();
@@ -845,26 +918,29 @@ category = new ChatCategory(2);
messageProcessor.setName("messagebusManagementThread"); messageProcessor.setName("messagebusManagementThread");
messageProcessor.start(); messageProcessor.start();
airScoutUDPReaderThread = new ReadUDPbyAirScoutMessageThread(chatPreferences.getAirScout_asCommunicationPort(), this, "AS", "KST"); // airScoutUDPReaderThread = new ReadUDPbyAirScoutMessageThread(chatPreferences.getAirScout_asCommunicationPort(), this, "AS", "KST"); //working original
airScoutUDPReaderThread = new ReadUDPbyAirScoutMessageThread(chatPreferences.getAirScout_asCommunicationPort(), this, this.getChatPreferences().getAirScout_asServerNameString(), this.getChatPreferences().getAirScout_asServerNameString()); //working original
airScoutUDPReaderThread.setName("airscoutudpreaderThread"); airScoutUDPReaderThread.setName("airscoutudpreaderThread");
airScoutUDPReaderThread.start(); airScoutUDPReaderThread.start();
userActualizationtimer = new Timer(); userActualizationtimer = new Timer();
userActualizationtimer.schedule(new UserActualizationTask(this), 4000, 60000);// TODO: Temporary userActualizationtimer.schedule(new UserActualizationTask(this), 4000, 60000);// TODO: Temporary userlistoutput known qrgs
// userlistoutput
// with
// known qrgs
keepAliveTimer = new Timer(); keepAliveTimer = new Timer();
keepAliveTimer.schedule(new keepAliveMessageSenderTask(this), 4000, 60000);// TODO: Temporary keepAliveTimer.schedule(new keepAliveMessageSenderTask(this), 4000, 60000);//
// userlistoutput
// with
// keepAliveMessageSenderTask = new keepAliveMessageSenderTask(this);
// keepAliveMessageSenderTask.run();
// userActualizationTask = new UserActualizationTask(this); // kst4contest.test 4 23001 /**
// userActualizationTask.run();// kst4contest.test 4 23001 * Since here: DX cluster service running config
*/
dxClusterServer = new DXClusterThreadPooledServer(this.getChatPreferences().getNotify_dxclusterServerPort(), this);
new Thread(dxClusterServer).start();
/**
* Till here: DX cluster service running config
*/
this.setConnectedAndLoggedIn(true); this.setConnectedAndLoggedIn(true);
@@ -875,7 +951,7 @@ category = new ChatCategory(2);
// Timer beaconTimer; // Timer beaconTimer;
beaconTimer = new Timer(); beaconTimer = new Timer();
beaconTimer.schedule(new BeaconTask(this), 10000, beaconTimer.schedule(new BeaconTask(this), 10000,
this.getChatPreferences().getBcn_beaconIntervalInMinutes() * 60000); this.getChatPreferences().getBcn_beaconIntervalInMinutesMainCat() * 60000);
// 60000 * intervalInMinutes = IntervalInMillis // 60000 * intervalInMinutes = IntervalInMillis
/** /**
@@ -884,7 +960,7 @@ category = new ChatCategory(2);
*/ */
// Timer ASQueryTimer; // Timer ASQueryTimer;
ASQueryTimer = new Timer(); ASQueryTimer = new Timer();
ASQueryTimer.schedule(new AirScoutPeriodicalAPReflectionInquirerTask(this), 10000, 12000); ASQueryTimer.schedule(new AirScoutPeriodicalAPReflectionInquirerTask(this), 10000, 60000);
// 60000 * intervalInMinutes = IntervalInMillis // 60000 * intervalInMinutes = IntervalInMillis
/** /**
@@ -896,7 +972,7 @@ category = new ChatCategory(2);
@Override @Override
public void run() { public void run() {
System.out.println("[Chatcontroller, info: ] periodical socketcheck"); // System.out.println("[Chatcontroller, info: ] periodical socketcheck");
Thread.currentThread().setName("SocketcheckTimer"); Thread.currentThread().setName("SocketcheckTimer");
@@ -955,8 +1031,6 @@ category = new ChatCategory(2);
messageProcessor = new MessageBusManagementThread(chatController); messageProcessor = new MessageBusManagementThread(chatController);
messageProcessor.start(); messageProcessor.start();
// chatController.setMessageProcessor= new MessageBusManagementThread(chatController);
// messageProcessor.start();
System.out.println("[Chatcontroller, info: initialized new socket, is connected? ] " System.out.println("[Chatcontroller, info: initialized new socket, is connected? ] "
+ socket.isConnected() + " " + socket.isClosed()); + socket.isConnected() + " " + socket.isClosed());
@@ -1012,7 +1086,7 @@ category = new ChatCategory(2);
OffsetDateTime currentTimeInUtc = OffsetDateTime.now(ZoneOffset.UTC); OffsetDateTime currentTimeInUtc = OffsetDateTime.now(ZoneOffset.UTC);
System.out.println(currentTimeInUtc.format(DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm X"))); // System.out.println(currentTimeInUtc.format(DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm X")));
long millisecondsSinceEpoch = currentTimeInUtc.toInstant().toEpochMilli() / 1000; long millisecondsSinceEpoch = currentTimeInUtc.toInstant().toEpochMilli() / 1000;
// System.out.println(millisecondsSinceEpoch); // System.out.println(millisecondsSinceEpoch);
@@ -1023,7 +1097,7 @@ category = new ChatCategory(2);
* Setting the initial parameters at the chat via port 23001 <br/> * Setting the initial parameters at the chat via port 23001 <br/>
* <br/> * <br/>
* <b>Login parameter format is like that: </b><br/> * <b>Login parameter format is like that: </b><br/>
* LOGINC|do5amf|uxskezcj|2|wtKST 3.1.4.6|25|0|1|1663879818|0| <br/> * LOGINC|do5amf|password|2|kst4contest1251|25|0|1|1663879818|0| <br/>
* SDONE|2| <br/> * SDONE|2| <br/>
* *
* @throws InterruptedException * @throws InterruptedException
@@ -1043,8 +1117,8 @@ category = new ChatCategory(2);
Thread.currentThread().setName("LoginStringTimer"); Thread.currentThread().setName("LoginStringTimer");
String loginString = ""; String loginString = "";
loginString = "LOGINC|" + chatPreferences.getLoginCallSign() + "|" + chatPreferences.getLoginPassword() loginString = "LOGINC|" + chatPreferences.getStn_loginCallSign() + "|" + chatPreferences.getStn_loginPassword()
+ "|" + chatPreferences.getLoginChatCategory().getCategoryNumber() + "|praktiKST v" + ApplicationConstants.APPLICATION_CURRENTVERSIONNUMBER + "|" + chatPreferences.getLoginChatCategoryMain().getCategoryNumber() + "|praktiKST v" + ApplicationConstants.APPLICATION_CURRENTVERSIONNUMBER
+ "|25|0|1|" + getCurrentEpochTime() + "|0|"; + "|25|0|1|" + getCurrentEpochTime() + "|0|";
// System.out.println(loginString); // System.out.println(loginString);
@@ -1056,6 +1130,39 @@ category = new ChatCategory(2);
} }
}, 2000); }, 2000);
/**
* Entering second chat
*
* ACHAT|chat id|past messages number|past dx/map number|users list/update flags|last Unix timestamp for messages|last Unix timestamp for dx/map|
*/
if (this.chatController.getChatPreferences().isLoginToSecondChatEnabled()) { //only login to second if wished
new Timer().schedule(new TimerTask() {
@Override
public void run() { //test second chat
Thread.currentThread().setName("LoginStringTimerSecond");
String loginString = "";
loginString = "ACHAT|" + chatController.getChatPreferences().getLoginChatCategorySecond().getCategoryNumber() + "|" + "25"
+ "|" + "10" + "|2|" + getCurrentEpochTime() + "|" + getCurrentEpochTime();
// System.out.println(loginString);
ChatMessage message = new ChatMessage();
message.setMessageText(loginString);
message.setMessageDirectedToServer(true);
getMessageTXBus().add(message);
}
}, 5000);
}
/**
* end testing second chat
*
*/
new Timer().schedule(new TimerTask() { new Timer().schedule(new TimerTask() {
@Override @Override
@@ -1063,7 +1170,7 @@ category = new ChatCategory(2);
Thread.currentThread().setName("SDONEStringTimer"); Thread.currentThread().setName("SDONEStringTimer");
ChatMessage message = new ChatMessage(); ChatMessage message = new ChatMessage();
message.setMessageText("SDONE|" + chatPreferences.getLoginChatCategory().getCategoryNumber() + "|\r"); message.setMessageText("SDONE|" + chatPreferences.getLoginChatCategoryMain().getCategoryNumber() + "|\r");
message.setMessageDirectedToServer(true); message.setMessageDirectedToServer(true);
getMessageTXBus().add(message); getMessageTXBus().add(message);
@@ -1076,11 +1183,10 @@ category = new ChatCategory(2);
public void run() { public void run() {
Thread.currentThread().setName("SETLOCTIMER"); Thread.currentThread().setName("SETLOCTIMER");
ChatMessage message = new ChatMessage(); ChatMessage message = new ChatMessage();
message.setMessageText("MSG|" + chatPreferences.getLoginChatCategory().getCategoryNumber() message.setMessageText("MSG|" + chatPreferences.getLoginChatCategoryMain().getCategoryNumber()
+ "|0|/SETLOC " + chatPreferences.getLoginLocator() + "|0|\r"); + "|0|/SETLOC " + chatPreferences.getStn_loginLocatorMainCat() + "|0|\r");
message.setMessageDirectedToServer(true); message.setMessageDirectedToServer(true);
getMessageTXBus().add(message); getMessageTXBus().add(message);
} }
}, 4000); }, 4000);
@@ -1090,14 +1196,58 @@ category = new ChatCategory(2);
public void run() { public void run() {
Thread.currentThread().setName("SETNAMETIMER"); Thread.currentThread().setName("SETNAMETIMER");
ChatMessage message = new ChatMessage(); ChatMessage message = new ChatMessage();
message.setMessageText("MSG|" + chatPreferences.getLoginChatCategory().getCategoryNumber() message.setMessageText("MSG|" + chatPreferences.getLoginChatCategoryMain().getCategoryNumber()
+ "|0|/SETNAME " + chatPreferences.getLoginName() + "|0|\r"); + "|0|/SETNAME " + chatPreferences.getStn_loginNameMainCat() + "|0|\r");
message.setMessageDirectedToServer(true); message.setMessageDirectedToServer(true);
getMessageTXBus().add(message); getMessageTXBus().add(message);
} }
}, 5000); }, 5000);
new Timer().schedule(new TimerTask() {
@Override
public void run() {
Thread.currentThread().setName("SETHereTimerMain");
ChatMessage message = new ChatMessage();
message.setMessageText("MSG|" + chatPreferences.getLoginChatCategoryMain().getCategoryNumber()
+ "|0|/BACK" + "|0|\r");
message.setMessageDirectedToServer(true);
getMessageTXBus().add(message);
}
}, 6500);
if (chatPreferences.isLoginToSecondChatEnabled()) { //only if second category had been enabled
new Timer().schedule(new TimerTask() {
@Override
public void run() {
Thread.currentThread().setName("SETNAMETIMER2nd");
ChatMessage message = new ChatMessage();
message.setMessageText("MSG|" + chatPreferences.getLoginChatCategorySecond().getCategoryNumber()
+ "|0|/SETNAME " + chatPreferences.getStn_loginNameSecondCat() + "|0|\r");
message.setMessageDirectedToServer(true);
getMessageTXBus().add(message);
}
}, 5500);
new Timer().schedule(new TimerTask() {
@Override
public void run() {
Thread.currentThread().setName("SETHereTimerSecond");
ChatMessage message = new ChatMessage();
message.setMessageText("MSG|" + chatPreferences.getLoginChatCategorySecond().getCategoryNumber()
+ "|0|/BACK" + "|0|\r");
message.setMessageDirectedToServer(true);
getMessageTXBus().add(message);
}
}, 7000);
}
new Timer().schedule(new TimerTask() { new Timer().schedule(new TimerTask() {
HashMap<String, ChatMember> getWorkedDataFromDb; HashMap<String, ChatMember> getWorkedDataFromDb;
@@ -1227,7 +1377,7 @@ category = new ChatCategory(2);
// //
message = new ChatMessage(); message = new ChatMessage();
// message.setDirectedToServer(true); // message.setDirectedToServer(true);
message.setMessageText(category + ""); message.setMessageText(chatCategoryMain + "");
this.getMessageTXBus().add(message); this.getMessageTXBus().add(message);
// //
message = new ChatMessage(); message = new ChatMessage();

View File

@@ -405,15 +405,10 @@ public class DBController {
ResultSet rs = stmt ResultSet rs = stmt
.executeQuery("SELECT * FROM ChatMember where callsign = '" + checkForThis.getCallSign() + "' ;"); .executeQuery("SELECT * FROM ChatMember where callsign = '" + checkForThis.getCallSign() + "' ;");
// ChatMember updateWkdData; // System.out.println("DBH stmt: " + rs.getStatement().toString());
// if (!rs.isBeforeFirst()) { //if there are no data to update....
while (rs.next()) { while (rs.next()) {
// updateWkdData = new ChatMember();
// updateWkdData.setCallSign(rs.getString("callsign"));
checkForThis.setWorked(helper_IntToBooleanConverter(rs.getInt("worked"))); checkForThis.setWorked(helper_IntToBooleanConverter(rs.getInt("worked")));
checkForThis.setWorked144(helper_IntToBooleanConverter(rs.getInt("worked144"))); checkForThis.setWorked144(helper_IntToBooleanConverter(rs.getInt("worked144")));
checkForThis.setWorked432(helper_IntToBooleanConverter(rs.getInt("worked432"))); checkForThis.setWorked432(helper_IntToBooleanConverter(rs.getInt("worked432")));
@@ -427,20 +422,22 @@ public class DBController {
* v1.2 since here * v1.2 since here
*/ */
checkForThis.setWorked144(helper_IntToBooleanConverter(rs.getInt("notQRV144"))); checkForThis.setQrv144(!helper_IntToBooleanConverter(rs.getInt("notQRV144")));
checkForThis.setWorked432(helper_IntToBooleanConverter(rs.getInt("notQRV432"))); checkForThis.setQrv432(!helper_IntToBooleanConverter(rs.getInt("notQRV432")));
checkForThis.setWorked1240(helper_IntToBooleanConverter(rs.getInt("notQRV1240"))); checkForThis.setQrv1240(!helper_IntToBooleanConverter(rs.getInt("notQRV1240")));
checkForThis.setWorked2300(helper_IntToBooleanConverter(rs.getInt("notQRV2300"))); checkForThis.setQrv2300(!helper_IntToBooleanConverter(rs.getInt("notQRV2300")));
checkForThis.setWorked3400(helper_IntToBooleanConverter(rs.getInt("notQRV3400"))); checkForThis.setQrv3400(!helper_IntToBooleanConverter(rs.getInt("notQRV3400")));
checkForThis.setWorked5600(helper_IntToBooleanConverter(rs.getInt("notQRV5600"))); checkForThis.setQrv5600(!helper_IntToBooleanConverter(rs.getInt("notQRV5600")));
checkForThis.setWorked10G(helper_IntToBooleanConverter(rs.getInt("notQRV10G"))); checkForThis.setQrv10G(!helper_IntToBooleanConverter(rs.getInt("notQRV10G")));
System.out.println( // System.out.println(
"[DBH, Info:] providing callsign wkd info, wkd, 144, 432, ... for UA5 new chatmember : " // "[DBH, Info:] providing callsign wkd info, wkd, 144, 432, ....... for UA5 new chatmember : "
+ checkForThis.toString()); // + checkForThis.toString());
} }
// }
// rs.gets
rs.close(); rs.close();
stmt.close(); stmt.close();
@@ -454,7 +451,7 @@ public class DBController {
try { try {
connection.close(); connection.close();
} catch (SQLException e1) { } catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace(); e1.printStackTrace();
} }
} }
@@ -704,9 +701,13 @@ public class DBController {
private boolean helper_IntToBooleanConverter(int valueFromDBField) { private boolean helper_IntToBooleanConverter(int valueFromDBField) {
// System.out.println(">>>>>>>>>>>>>>> DBC: " + valueFromDBField + " -> ");
if (valueFromDBField != 0) { if (valueFromDBField != 0) {
System.out.println("true");
return true; return true;
} else } else
System.out.println("false");
return false; return false;
} }

View File

@@ -0,0 +1,196 @@
//package kst4contest.controller;
//
//import kst4contest.model.ChatMember;
//import kst4contest.model.ChatMessage;
//
//import java.io.*;
//import java.net.ServerSocket;
//import java.net.Socket;
//import java.nio.channels.ServerSocketChannel;
//import java.nio.channels.SocketChannel;
//import java.time.Instant;
//
///**
// * This thread is responsible for providing DXCluster messages for a connected log program.
// *
// *
// */
////public class DXClusterController extends Thread {
// PrintWriter outTelnet;
// BufferedReader inTelnet;
// private Socket socket;
// private ChatController client;
//// private OutputStream output;
//// private InputStream input;
//
// private ChatMessage messageTextRaw;
//
// private static final int PORT = 23;
// private static final String USERNAME = "user";
// private static final String PASSWORD = "pass";
// private Socket clientSocket;
//
//
//
//
//// public DXClusterController(Socket clientSocket, ChatController client) throws InterruptedException {
////
//// this.client = client;
////
//// try {
//// outTelnet = new PrintWriter(clientSocket.getOutputStream(), true);
//// inTelnet = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
//// } catch (IOException e) {
//// throw new RuntimeException(e);
//// }
//// System.out.println("defcons");
//// this.clientSocket = clientSocket;
////
//// }
//
// public DXClusterController(Socket clientSocket, ChatController chatController) {
//
// try {
// socket = clientSocket;
// } catch (Exception e) {
// throw new RuntimeException(e);
// }
// this.client = chatController;
//
// try {
// outTelnet = new PrintWriter(socket.getOutputStream(), true);
// inTelnet = new BufferedReader(new InputStreamReader(socket.getInputStream()));
// } catch (IOException e) {
// throw new RuntimeException(e);
// }
// System.out.println("[DXCCtrl, info:] DXCluster Controller created!");
// this.clientSocket = socket;
// }
//
// public DXClusterController(Socket clientSocket, ObjectOutputStream objectout, ChatController chatController) {
//
// try {
// socket = clientSocket;
// } catch (Exception e) {
// throw new RuntimeException(e);
// }
// this.client = chatController;
//
// try {
// outTelnet = new PrintWriter(socket.getOutputStream(), true);
// inTelnet = new BufferedReader(new InputStreamReader(socket.getInputStream()));
// } catch (IOException e) {
// throw new RuntimeException(e);
// }
// System.out.println("[DXCCtrl, info:] DXCluster Controller created!");
// this.clientSocket = socket;
// }
//
//// public DXClusterController(ServerSocket clientSocket, ChatController client) throws InterruptedException {
//// //TODO: GOT FROM https://stackoverflow.com/questions/15541804/creating-the-serversocket-in-a-separate-thread
//// try {
//// socket = clientSocket.accept(2);
//// } catch (IOException e) {
//// throw new RuntimeException(e);
//// }
//// this.client = client;
////
//// try {
//// outTelnet = new PrintWriter(socket.getOutputStream(), true);
//// inTelnet = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//// } catch (IOException e) {
//// throw new RuntimeException(e);
//// }
//// System.out.println("defcons");
//// this.clientSocket = socket;
////
//// }
//
//// public DXClusterController(ServerSocketChannel serverSocketChannel, ChatController client) throws InterruptedException {
////
//// this.client = client;
////
////// clientSocketChannel.ac
////
//// try {
////
//// serverSocketChannel.accept();
//// serverSocketChannel.rea
////
//// outTelnet = new PrintWriter(clientSocket.getOutputStream(), true);
//// inTelnet = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
//// } catch (IOException e) {
//// throw new RuntimeException(e);
//// }
//// System.out.println("defcons");
//// this.clientSocket = clientSocket;
////
//// }
//
// public boolean terminateConnection() throws IOException {
//
//// this.output.close();
// this.socket.close();
//
// return true;
// }
//
// public void sendLocalClusterMessage() {
//
// }
//
// public void run() {
//// try (
//// PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
//// BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())))
//// {
//
//// out.println("Welcome to the Telnet Server");
// outTelnet.print("login: ");
// outTelnet.flush();
// try {
// String user = inTelnet.readLine();
// } catch (IOException ex) {
// throw new RuntimeException(ex);
// }
//// finally {
//// try {
//// clientSocket.close();
//// } catch (Exception e) {
//// System.out.println("Error closing client socket: " + e.getMessage());
//// }
//// }
//
//
//// for (int i = 0; i < 10; i++) {
////
//// outTelnet.println("DX de DM5M: 144222.0 DO5AMF JN49FL 2250Z\n");
//// }
//
//
//
// }
//
// /**
// * Sends a DX cluster message to the connected log programs via telnet, returns true if sent
// *
// * @param aChatMember
// * @return
// */
// public boolean propagateSingleDXClusterEntry(ChatMember aChatMember) {
//
// String singleDXClusterMessage = "DX de ";
//
// singleDXClusterMessage += client.getChatPreferences().getLoginCallSign() + " ";
// singleDXClusterMessage += aChatMember.getFrequency().getValue() + " ";
// singleDXClusterMessage += aChatMember.getCallSign().toUpperCase() + " ";
// singleDXClusterMessage += aChatMember.getQra().toUpperCase() + " ";
// singleDXClusterMessage += new Utils4KST().time_generateCurrenthhmmZTimeStringForClusterMessage() + "\n";
//
// outTelnet.println(singleDXClusterMessage);
// outTelnet.flush();
// return true;
// }
//}

View File

@@ -0,0 +1,215 @@
package kst4contest.controller;
import kst4contest.model.ChatMember;
import kst4contest.model.ChatPreferences;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class DXClusterThreadPooledServer implements Runnable{
private List<Socket> clientSockets = Collections.synchronizedList(new ArrayList<>()); //list of all connected clients
ChatController chatController = null;
protected int serverPort = 8080;
protected ServerSocket serverSocket = null;
protected boolean isStopped = false;
protected Thread runningThread= null;
protected ExecutorService threadPool =
Executors.newFixedThreadPool(10);
Socket clientSocket;
public DXClusterThreadPooledServer(int port, ChatController chatController){
this.serverPort = port;
this.chatController = chatController;
}
public void run(){
synchronized(this){
this.runningThread = Thread.currentThread();
runningThread.setName("DXCluster-thread-pooled-server");
}
openServerSocket();
while(! isStopped()){
clientSocket = null;
try {
clientSocket = this.serverSocket.accept();
synchronized(clientSockets) {
clientSockets.add(clientSocket); // add dx cluster client to the "clients list" for broadcasting
}
} catch (IOException e) {
if(isStopped()) {
System.out.println("Server Stopped.") ;
break;
}
throw new RuntimeException(
"Error accepting client connection", e);
}
DXClusterServerWorkerRunnable worker = new DXClusterServerWorkerRunnable(clientSocket, "Thread Pooled DXCluster Server ", chatController, clientSockets);
this.threadPool.execute(worker);
}
this.threadPool.shutdown();
System.out.println("Server Stopped.") ;
}
private synchronized boolean isStopped() {
return this.isStopped;
}
public synchronized void stop(){
this.isStopped = true;
try {
this.serverSocket.close();
synchronized(clientSockets) {
for (Socket socket : clientSockets) {
socket.close(); // close all client connections
}
}
} catch (IOException e) {
throw new RuntimeException("DXCCSERVER Error closing server", e);
}
}
private void openServerSocket() {
try {
this.serverSocket = new ServerSocket(this.serverPort);
} catch (IOException e) {
throw new RuntimeException("DXCCSERVER Cannot open port ", e);
}
}
/**
* Sends a DX cluster message to ALL connected log programs via telnet, returns true if sent
*
* @param aChatMember
* @return boolean true if message had been sent
*/
public boolean broadcastSingleDXClusterEntryToLoggers(ChatMember aChatMember) {
synchronized(clientSockets) {
System.out.println("DXClusterSrvr: broadcasting message to clients: " + clientSockets.size());
try {
System.out.println("-------------> ORIGINALEE VAL: " + aChatMember.getFrequency().getValue());
System.out.println("-------------> NORMALIZED VAL: " + Utils4KST.normalizeFrequencyString(aChatMember.getFrequency().getValue(), chatController.getChatPreferences().getNotify_optionalFrequencyPrefix()) + " ");
} catch (Exception e) {
System.out.println("DXCThPooledServer: Error accessing value in chatmember object: " + e.getMessage());
// e.printStackTrace();
}
for (Socket socket : clientSockets) {
try {
OutputStream output = socket.getOutputStream();
String singleDXClusterMessage = "DX de ";
// singleDXClusterMessage += chatController.getChatPreferences().getLoginCallSign() + ": ";
singleDXClusterMessage += this.chatController.getChatPreferences().getNotify_DXCSrv_SpottersCallSign().getValue() + ": ";
singleDXClusterMessage += Utils4KST.normalizeFrequencyString(aChatMember.getFrequency().getValue(), chatController.getChatPreferences().getNotify_optionalFrequencyPrefix()) + " ";
singleDXClusterMessage += aChatMember.getCallSign().toUpperCase() + " "; //we need such an amount of spaces for n1mm to work, otherwise bullshit happens
singleDXClusterMessage += aChatMember.getQra().toUpperCase() + " ";
singleDXClusterMessage += new Utils4KST().time_generateCurrenthhmmZTimeStringForClusterMessage() + ((char)7) + ((char)7) + "\r\n";
// singleDXClusterMessage += chatController.getChatPreferences().getLoginCallSign() + ": ";
// singleDXClusterMessage += Utils4KST.normalizeFrequencyString(aChatMember.getFrequency().getValue(), chatController.getChatPreferences().getNotify_optionalFrequencyPrefix()) + " ";
// singleDXClusterMessage += aChatMember.getCallSign().toUpperCase() + " ";
// singleDXClusterMessage += aChatMember.getQra().toUpperCase() + " ";
// singleDXClusterMessage += new Utils4KST().time_generateCurrenthhmmZTimeStringForClusterMessage() + ((char)7) + ((char)7) + "\r\n";
output.write((singleDXClusterMessage).getBytes());
} catch (IOException e) {
e.printStackTrace();
System.out.println("[DXClusterSrvr, Error:] broadcasting DXC-message to clients went wrong!");
return false;
}
}
}
return true; //if message had been sent, return true for "ok"
}
}
class DXClusterServerWorkerRunnable implements Runnable{
protected Socket clientSocket = null;
protected String serverText = null;
private ChatController client = null;
private List<Socket> dxClusterClientSocketsConnectedList;
public DXClusterServerWorkerRunnable(Socket clientSocket, String serverText, ChatController chatController, List<Socket> clientSockets) {
this.clientSocket = clientSocket;
this.serverText = serverText;
this.client = chatController;
this.dxClusterClientSocketsConnectedList = clientSockets;
}
public void run() {
try {
OutputStream output = clientSocket.getOutputStream();
dxClusterClientSocketsConnectedList.add(clientSocket);
Timer dXCkeepAliveTimer = new Timer();
dXCkeepAliveTimer.schedule(new TimerTask() {
@Override
public void run() {
for (Socket socket : dxClusterClientSocketsConnectedList) {
try {
OutputStream output = socket.getOutputStream();
output.write(("\r\n").getBytes());
} catch (IOException e) {
e.printStackTrace();
System.out.println("[DXClusterSrvr, Error:] broadcasting DXC-message to clients went wrong!");
dXCkeepAliveTimer.purge();
try {
socket.close();
} catch (IOException ex) {
ex.printStackTrace();
}
finally {
this.cancel();
}
dxClusterClientSocketsConnectedList.remove(socket); //if socket is closed by client, remove it from the broadcast list and close it
}
}
}
}, 30000, 30000);
output.write(("login: ").getBytes()); //say hello to the client, it will answer with a callsign
System.out.println("[DXClusterThreadPooledServer, Info:] New cluster client connected! "); //TODO: maybe integrate non blocking reader for client identification
} catch (IOException e) {
e.printStackTrace();
} finally {
synchronized(dxClusterClientSocketsConnectedList) {
dxClusterClientSocketsConnectedList.remove(clientSocket); // Entferne den Client nach Verarbeitung
}
}
}
}

View File

@@ -0,0 +1,44 @@
package kst4contest.controller;
import javafx.beans.property.SimpleStringProperty;
import kst4contest.model.ChatMember;
import kst4contest.model.ChatPreferences;
public class DXClusterThreadPooledServerTest {
public static void main(String[] args) {
ChatController client = new ChatController();
ChatPreferences testPreferences = new ChatPreferences();
testPreferences.setStn_loginCallSign("DM5M");
client.setChatPreferences(testPreferences);
DXClusterThreadPooledServer dxClusterServer = new DXClusterThreadPooledServer(8000, client);
new Thread(dxClusterServer).start();
try {
Thread.sleep(10 * 1000);
System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>ready.....go!");
} catch (InterruptedException e) {
e.printStackTrace();
}
ChatMember test = new ChatMember();
test.setCallSign("DL5ASG");
test.setQra("JO51HK");
test.setFrequency(new SimpleStringProperty("144776.0"));
dxClusterServer.broadcastSingleDXClusterEntryToLoggers(test);
// try {
// Thread.sleep(20 * 3333);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
// System.out.println("Stopping Server");
// server.stop();
}
}

View File

@@ -43,7 +43,7 @@ public class InputReaderThread extends Thread {
e.printStackTrace(); e.printStackTrace();
} }
ownMSG.setMessageText("MSG|" + this.client.getCategory().getCategoryNumber() + "|0|" + sendThisMessage23001 + "|0|"); ownMSG.setMessageText("MSG|" + this.client.getChatCategoryMain().getCategoryNumber() + "|0|" + sendThisMessage23001 + "|0|");
// System.out.println("inreader " + ownMSG.getMessage() + client.getMessageTXBus().size()); // System.out.println("inreader " + ownMSG.getMessage() + client.getMessageTXBus().size());

View File

@@ -5,6 +5,7 @@ import java.io.PrintWriter;
import java.sql.SQLException; import java.sql.SQLException;
//import java.net.Socket; //import java.net.Socket;
//import java.util.ArrayList; //import java.util.ArrayList;
import java.util.HashSet;
import java.util.Hashtable; import java.util.Hashtable;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
@@ -14,12 +15,7 @@ import javafx.collections.ObservableList;
import kst4contest.ApplicationConstants; import kst4contest.ApplicationConstants;
import kst4contest.locatorUtils.DirectionUtils; import kst4contest.locatorUtils.DirectionUtils;
import kst4contest.locatorUtils.Location; import kst4contest.locatorUtils.Location;
import kst4contest.model.AirPlaneReflectionInfo; import kst4contest.model.*;
import kst4contest.model.ChatMember;
import kst4contest.model.ChatMessage;
import kst4contest.model.ClusterMessage;
import kst4contest.utils.PlayAudioUtils;
import kst4contest.view.Kst4ContestApplication;
/** /**
* *
@@ -43,6 +39,7 @@ public class MessageBusManagementThread extends Thread {
private Hashtable<String, ChatMember> chatMemberTable; private Hashtable<String, ChatMember> chatMemberTable;
private final String PTRN_USERLISTENTRY = "([a-zA-Z0-9]{2}/{1})?([a-zA-Z0-9]{1,3}[0-9][a-zA-Z0-9]{0,3}[a-zA-Z]{0,3})(/p)? [a-zA-Z]{2}[0-9]{2}[a-zA-Z]{2} [ -~]{1,20}"; private final String PTRN_USERLISTENTRY = "([a-zA-Z0-9]{2}/{1})?([a-zA-Z0-9]{1,3}[0-9][a-zA-Z0-9]{0,3}[a-zA-Z]{0,3})(/p)? [a-zA-Z]{2}[0-9]{2}[a-zA-Z]{2} [ -~]{1,20}";
private final String PTRN_QRG_CAT2 = "(([0-9]{3,4}[\\.|,| ]?[0-9]{3})([\\.|,][\\d]{1,2})?)|(([a-zA-Z][0-4]{1}[\\d]{2}\\b)([\\.|,][\\d]{1,2}\\b)?)|((\\b[0-4]{1}[\\d]{2}\\b)([\\.|,][\\d]{1,2}\\b)?)"; private final String PTRN_QRG_CAT2 = "(([0-9]{3,4}[\\.|,| ]?[0-9]{3})([\\.|,][\\d]{1,2})?)|(([a-zA-Z][0-4]{1}[\\d]{2}\\b)([\\.|,][\\d]{1,2}\\b)?)|((\\b[0-4]{1}[\\d]{2}\\b)([\\.|,][\\d]{1,2}\\b)?)";
private final String PTRN_QRG_CAT3 = "(([0-9]{3,5}[\\.|,| ]?[0-9]{3})([\\.|,][\\d]{1,2})?)|(([a-zA-Z][0-4]{1}[\\d]{2}\\b)([\\.|,][\\d]{1,2}\\b)?)|((\\b[0-4]{1}[\\d]{2}\\b)([\\.|,][\\d]{1,2}\\b)?)";
// BufferedWriter bufwrtrDBGMSGOut; // BufferedWriter bufwrtrDBGMSGOut;
// private String text; // private String text;
@@ -73,7 +70,6 @@ public class MessageBusManagementThread extends Thread {
* check if a chatmessage is part of the userlist via telnet 23000 port<br/> * check if a chatmessage is part of the userlist via telnet 23000 port<br/>
* <b>Updates userlist!</b> * <b>Updates userlist!</b>
* *
* @param chatMessage
*/ */
private void checkIfItsUserListEntry(ChatMessage messageToProcess) { private void checkIfItsUserListEntry(ChatMessage messageToProcess) {
@@ -114,9 +110,7 @@ public class MessageBusManagementThread extends Thread {
/** /**
* check if a chatmessage is part of the userlist via telnet 23000 port<br/> * check if a chatmessage is part of the userlist via telnet 23000 port<br/>
* <b>Updates userlist!</b> * <b>This method updates the userlist!</b>
*
* @param chatMessage
*/ */
private void checkIfItsUserListEntry23001(ChatMessage messageToProcess) { private void checkIfItsUserListEntry23001(ChatMessage messageToProcess) {
@@ -159,38 +153,29 @@ public class MessageBusManagementThread extends Thread {
* check if a chatmessage or a name of a chatmember contains a frequency<br/> * check if a chatmessage or a name of a chatmember contains a frequency<br/>
* <b>returns String = "" if no frequency found</b> * <b>returns String = "" if no frequency found</b>
* *
* @param chatMessage
*/ */
private String checkIfMessageInhibitsFrequency(ChatMessage messageToProcess) { private String checkIfMessageInhibitsFrequency(ChatMessage messageToProcess) {
Pattern pattern = Pattern.compile(PTRN_QRG_CAT2); // TODO: PTRN should depend to category-selection of own stn Pattern pattern = Pattern.compile(PTRN_QRG_CAT2); // TODO: PTRN should depend to category-selection of own stn, it´s not the case now
Matcher matcher = pattern.matcher(messageToProcess.getMessageText()); Matcher matcher = pattern.matcher(messageToProcess.getMessageText());
String[] splittedQRGString; String[] splittedQRGString;
// splittedQRGString[0] = "0"; // splittedQRGString[0] = "0";
String stringAggregation = ""; String stringAggregation = "";
// if (matcher.) {
// stringAggregation = ""; //reset aggregated string
// }
while (matcher.find()) { while (matcher.find()) {
// System.out.println("QRG detected: "+ matcher.group() + " " + matcher.start());
// ChatMember member = new ChatMember();
String matchedString = matcher.group(); String matchedString = matcher.group();
// splittedQRGString = new String[0];
splittedQRGString = matchedString.split(" "); splittedQRGString = matchedString.split(" ");
for (int i = 0; i < splittedQRGString.length; i++) { for (String s : splittedQRGString) {
stringAggregation += splittedQRGString[i] + " "; stringAggregation += s + " ";
} }
System.out.println("[MSGBUSMGT:] Processed qrg info: " + stringAggregation); System.out.println("[MSGBUSMGT:] Processed qrg info: " + stringAggregation);
// if (member.getName().)
// System.out.println("Processed QRG Entry [" + this.client.getChatMemberTable().size() + "]: Call: " // System.out.println("Processed QRG Entry [" + this.client.getChatMemberTable().size() + "]: Call: "
// + member.getCallSign() + ", QRA: " + member.getQra() + ", Name: " + member.getName()); // + member.getCallSign() + ", QRA: " + member.getQra() + ", Name: " + member.getName());
} }
@@ -214,7 +199,7 @@ public class MessageBusManagementThread extends Thread {
messageToProcess.setMessageText(reduce); messageToProcess.setMessageText(reduce);
if (messageToProcess.getMessageText().isEmpty()) { if (messageToProcess.getMessageText().isEmpty()) {
System.out.println("[MSGBUSMGTT:] ######################no processable data"); // System.out.println("[MSGBUSMGTT:] ###################### no processable data");
} else { } else {
if (reduce.length() >= 14 && reduce.length() <= 40) { if (reduce.length() >= 14 && reduce.length() <= 40) {
@@ -275,26 +260,35 @@ public class MessageBusManagementThread extends Thread {
// System.out.println("[MsgBusMgr, ERROR:] ChecklistForChatMemberIndexByCallsign, not found: " // System.out.println("[MsgBusMgr, ERROR:] ChecklistForChatMemberIndexByCallsign, not found: "
// + lookForThis.getCallSign() + "\n "); // + lookForThis.getCallSign() + "\n ");
/*** /***
* Old mechanic for index search,new one implemented due concurrentmodificationexcm which works - end * /Old mechanic for index search,new one implemented due concurrentmodificationexc which works - end
* *
*/ */
for (int i = 0; i < list.size(); i++) { for (int i = 0; i < list.size(); i++) {
if (list.get(i).getCallSign().equals(lookForThis.getCallSign())) { if (list.get(i).getCallSign().equals(lookForThis.getCallSign())) {
//TODO: New since 1.26! Check against category!
System.out.println("MSGBUSMGT, DEBUG: Checking Chatcategories of found list member " + list.get(i).getCallSign() + " / " + list.get(i).getChatCategory() + " against " + lookForThis.getCallSign() + " / " + lookForThis.getChatCategory());
// System.out // System.out
// .println("MSGBUSHELBER: Found " + chatMember.getCallSign() + " at " + list.indexOf(chatMember)); // .println("MSGBUSHELBER: Found " + chatMember.getCallSign() + " at " + list.indexOf(chatMember));
if (list.get(i).getChatCategory().equals(lookForThis.getChatCategory())) { //new 1.26
return list.indexOf(list.get(i)); return list.indexOf(list.get(i));
} } //new 1.26
else {
System.out.println("MSGBUSMGT, DEBUG: Category does not match");
} }
// for (Iterator iterator = list.iterator(); iterator.hasNext();) { // System.out.println("--------------------------- chatcategory of list.get(i) = " + list.get(i).getChatCategory().getCategoryNumber());
// ChatMember chatMember = (ChatMember) iterator.next(); System.out.println("--------------------------- chatcategory of lookforthisChatMember = " + lookForThis.getChatCategory().getCategoryNumber() );
// System.out.println(list.indexOf(lookForThis) + ": " + chatMember.getCallSign()); }
// } // return list.indexOf(list.get(i)); //if no category found, return entry //TODO: ERROR detected here! Should work now, needs some proof
// return -1; //if category dont match, return: member not found
}
return -1; // if it´s not found, the method will always end here and return -1 return -1; // if it´s not found, the method will always end here and return -1
} }
/** /**
@@ -332,6 +326,22 @@ public class MessageBusManagementThread extends Thread {
final String SRVR_LOGINWRONGCALLSYNTAX = "103"; final String SRVR_LOGINWRONGCALLSYNTAX = "103";
final String SRVR_LOGINWRONGCALLUNKNOWN = "101"; final String SRVR_LOGINWRONGCALLUNKNOWN = "101";
/**
* here we have a helper Set for identifying questions for my qrg which can be autoanswered later // TODO: move to an extra method
*/
final HashSet<String> qrgQuestionTexts = new HashSet<String>();
// final ArrayList<String> qrgQuestionTexts = new ArrayList<String>();
qrgQuestionTexts.add("ur qrg?");
qrgQuestionTexts.add("your qrg?");
qrgQuestionTexts.add("qrg?");
qrgQuestionTexts.add("freq?");
qrgQuestionTexts.add("pse QRG");
/**
* here we have a helper list for identifying questions for my qrg which can be autoanswered later
*/
if (messageToProcess.getMessageText().isEmpty()) { if (messageToProcess.getMessageText().isEmpty()) {
System.out.println("[MSGBUSMGTT:] ######################no processable data"); System.out.println("[MSGBUSMGTT:] ######################no processable data");
@@ -352,28 +362,32 @@ public class MessageBusManagementThread extends Thread {
/** /**
* Initializes the Userlist if entry fits UA0 * Initializes the Userlist if entry fits UA0
* UA0|3|DL6SAQ|walter not qrv|JN58CK|1| <- RXed
*
*/ */
if (splittedMessageLine[0].contains(INITIALUSERLISTENTRY)) { if (splittedMessageLine[0].contains(INITIALUSERLISTENTRY)) {
// System.out.println("MSGBUS: User detected"); // System.out.println("MSGBUS: User detected");
ChatMember newMember = new ChatMember(); ChatMember newMember = new ChatMember();
newMember.setAirPlaneReflectInfo(new AirPlaneReflectionInfo()); // TODO: Only bugfix, check newMember.setAirPlaneReflectInfo(new AirPlaneReflectionInfo());
newMember.setChatCategory(util_getChatCategoryByCategoryNrString(splittedMessageLine[1]));
newMember.setCallSign(splittedMessageLine[2]); newMember.setCallSign(splittedMessageLine[2]);
newMember.setName(splittedMessageLine[3]); newMember.setName(splittedMessageLine[3]);
newMember.setQra(splittedMessageLine[4]); newMember.setQra(splittedMessageLine[4]);
newMember.setState(Integer.parseInt(splittedMessageLine[5])); newMember.setState(Integer.parseInt(splittedMessageLine[5]));
// newMember.setQTFdirection(LocatorUtils); // newMember.setQTFdirection(LocatorUtils);
newMember.setQrb(new Location().getDistanceKmByTwoLocatorStrings(client.getChatPreferences().getLoginLocator(), newMember.getQra())); newMember.setQrb(new Location().getDistanceKmByTwoLocatorStrings(client.getChatPreferences().getStn_loginLocatorMainCat(), newMember.getQra()));
newMember.setQTFdirection(new Location(client.getChatPreferences().getLoginLocator()).getBearing(new Location(newMember.getQra()))); newMember.setQTFdirection(new Location(client.getChatPreferences().getStn_loginLocatorMainCat()).getBearing(new Location(newMember.getQra())));
newMember.setLastActivity(new Utils4KST().time_generateActualTimeInDateFormat());//TODO evt obsolete! newMember.setLastActivity(new Utils4KST().time_generateActualTimeInDateFormat());//TODO evt obsolete!
newMember.setActivityTimeLastInEpoch(new Utils4KST().time_generateCurrentEpochTime()); newMember.setActivityTimeLastInEpoch(new Utils4KST().time_generateCurrentEpochTime());
// this.client.getChatMemberTable().put(splittedMessageLine[2], newMember); //TODO: map -> List // this.client.getChatMemberTable().put(splittedMessageLine[2], newMember); //TODO: map -> List
//the own call will not be in the list //the own call will not be in the list
if (!client.getChatPreferences().getLoginCallSign().equals(newMember.getCallSign())) { if (!client.getChatPreferences().getStn_loginCallSign().equals(newMember.getCallSign())) {
this.client.getLst_chatMemberList().add(newMember); this.client.getLst_chatMemberList().add(newMember);
} }
@@ -390,31 +404,36 @@ public class MessageBusManagementThread extends Thread {
/** /**
* Actualize Userlist, add new entry UA5 or UA2 * Actualize Userlist, add new entry UA5 or UA2
*
* UA5|2|IU4CHE|Giorgio 2-70-23|JN64GB|2|
* UA2|2|W5ADD|Parker|EM40WL|2|
*
*/ */
if (splittedMessageLine[0].contains(USERENTEREDCHAT) || splittedMessageLine[0].contains(USERENTEREDCHAT2)) { if (splittedMessageLine[0].contains(USERENTEREDCHAT) || splittedMessageLine[0].contains(USERENTEREDCHAT2)) {
// System.out.println("MSGBUS: User detected"); // System.out.println("MSGBUS: User detected");
/**
* The own callsign will not be hold in the userlist any more
*/
if (!client.getChatPreferences().getLoginCallSign().equals(splittedMessageLine[2])) {
if (!client.getChatPreferences().getStn_loginCallSign().equals(splittedMessageLine[2])) { //own call ignore
ChatMember newMember = new ChatMember(); ChatMember newMember = new ChatMember();
newMember.setAirPlaneReflectInfo(new AirPlaneReflectionInfo()); newMember.setAirPlaneReflectInfo(new AirPlaneReflectionInfo());
newMember.setChatCategory(util_getChatCategoryByCategoryNrString(splittedMessageLine[1]));
newMember.setCallSign(splittedMessageLine[2]); newMember.setCallSign(splittedMessageLine[2]);
newMember.setName(splittedMessageLine[3]); newMember.setName(splittedMessageLine[3]);
newMember.setQra(splittedMessageLine[4]); newMember.setQra(splittedMessageLine[4]);
newMember.setState(Integer.parseInt(splittedMessageLine[5])); newMember.setState(Integer.parseInt(splittedMessageLine[5]));
newMember.setLastActivity(new Utils4KST().time_generateActualTimeInDateFormat()); newMember.setLastActivity(new Utils4KST().time_generateActualTimeInDateFormat());
newMember.setActivityTimeLastInEpoch(new Utils4KST().time_generateCurrentEpochTime()); newMember.setActivityTimeLastInEpoch(new Utils4KST().time_generateCurrentEpochTime());
newMember.setQrb(new Location().getDistanceKmByTwoLocatorStrings(client.getChatPreferences().getLoginLocator(), newMember.getQra())); newMember.setQrb(new Location().getDistanceKmByTwoLocatorStrings(client.getChatPreferences().getStn_loginLocatorMainCat(), newMember.getQra()));
newMember.setQTFdirection(new Location(client.getChatPreferences().getLoginLocator()).getBearing(new Location(newMember.getQra()))); newMember.setQTFdirection(new Location(client.getChatPreferences().getStn_loginLocatorMainCat()).getBearing(new Location(newMember.getQra())));
newMember = this.client.getDbHandler().fetchChatMemberWkdDataForOnlyOneCallsignFromDB(newMember); newMember = this.client.getDbHandler().fetchChatMemberWkdDataForOnlyOneCallsignFromDB(newMember);
this.client.getLst_chatMemberList().add(newMember); this.client.getLst_chatMemberList().add(newMember);
this.client.getDbHandler().storeChatMember(newMember); this.client.getDbHandler().storeChatMember(newMember);
} }
@@ -433,9 +452,9 @@ public class MessageBusManagementThread extends Thread {
ChatMember newMember = new ChatMember(); ChatMember newMember = new ChatMember();
newMember.setCallSign(splittedMessageLine[2]); newMember.setChatCategory(util_getChatCategoryByCategoryNrString(splittedMessageLine[1]));
// this.client.getChatMemberTable().remove(newMember.getCallSign()); newMember.setCallSign(splittedMessageLine[2]);
System.out.println("[MSGBUSMGT, Info:] User left Chat and will be removed from list [" System.out.println("[MSGBUSMGT, Info:] User left Chat and will be removed from list ["
+ this.client.getLst_chatMemberList().size() + "] :" + newMember.getCallSign()); + this.client.getLst_chatMemberList().size() + "] :" + newMember.getCallSign());
@@ -443,6 +462,8 @@ public class MessageBusManagementThread extends Thread {
this.client.getLst_chatMemberList().remove( this.client.getLst_chatMemberList().remove(
checkListForChatMemberIndexByCallSign(this.client.getLst_chatMemberList(), newMember)); checkListForChatMemberIndexByCallSign(this.client.getLst_chatMemberList(), newMember));
//TODO: since 1.26 new method design to detect chatcategory, too!
} catch (Exception e) { } catch (Exception e) {
System.out.println("[MSGBUSMGT, EXC!, Error:] User sent left chat but had not been there ... [" System.out.println("[MSGBUSMGT, EXC!, Error:] User sent left chat but had not been there ... ["
+ this.client.getLst_chatMemberList().size() + "] :" + newMember.getCallSign() + "\n" + this.client.getLst_chatMemberList().size() + "] :" + newMember.getCallSign() + "\n"
@@ -472,43 +493,51 @@ public class MessageBusManagementThread extends Thread {
* CH|2|1663966535|DM5M|dm5m-team|0|kst4contest.test|0| * CH|2|1663966535|DM5M|dm5m-team|0|kst4contest.test|0|
*/ */
if (splittedMessageLine[0].contains(CHATCHANNELMESSAGE)) { if (splittedMessageLine[0].contains(CHATCHANNELMESSAGE)) {
// System.out.println("MSGBUS: User detected");
ChatMessage newMessage = new ChatMessage(); //experimental 1.26: multi channel messages
newMessage.setChatCategory(this.client.getCategory()); ChatMessage newMessageArrived = new ChatMessage();
newMessage.setMessageGeneratedTime(splittedMessageLine[2]); ChatCategory chategoryForMessageAndMessageSender;
newMessageArrived.setChatCategory(util_getChatCategoryByCategoryNrString(splittedMessageLine[1]));
chategoryForMessageAndMessageSender = newMessageArrived.getChatCategory();
newMessageArrived.setMessageGeneratedTime(splittedMessageLine[2]);
if (splittedMessageLine[3].equals("SERVER")) { if (splittedMessageLine[3].equals("SERVER")) {
ChatMember dummy = new ChatMember(); ChatMember dummy = new ChatMember();
dummy.setCallSign("SERVER"); dummy.setCallSign("SERVER");
dummy.setName("Sysop"); dummy.setName("Sysop");
newMessage.setSender(dummy); newMessageArrived.setSender(dummy);
newMessageArrived.setChatCategory(util_getChatCategoryByCategoryNrString(splittedMessageLine[1]));
dummy.setChatCategory(util_getChatCategoryByCategoryNrString(splittedMessageLine[1]));
// System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> servers cat " + newMessageArrived.getChatCategory());
} else { } else {
ChatMember sender = new ChatMember(); ChatMember sender = new ChatMember();
sender.setCallSign(splittedMessageLine[3]); sender.setCallSign(splittedMessageLine[3]);
sender.setChatCategory(chategoryForMessageAndMessageSender);
int index = checkListForChatMemberIndexByCallSign(this.client.getLst_chatMemberList(), sender); int index = checkListForChatMemberIndexByCallSign(this.client.getLst_chatMemberList(), sender);
//if the user had been found in the active users list
if (index != -1) { if (index != -1) {
//user found in the chatmember list //user not found in the chatmember list
try { try {
newMessage.setSender(this.client.getLst_chatMemberList().get(index)); // set sender to member of newMessageArrived.setSender(this.client.getLst_chatMemberList().get(index)); // set sender to member of
this.client.getLst_chatMemberList().get(index).setActivityTimeLastInEpoch(new Utils4KST().time_generateCurrentEpochTime()); this.client.getLst_chatMemberList().get(index).setActivityTimeLastInEpoch(new Utils4KST().time_generateCurrentEpochTime());
} catch (Exception exc) { } catch (Exception exc) {
ChatMember aSenderDummy = new ChatMember(); ChatMember aSenderDummy = new ChatMember();
aSenderDummy.setCallSign(splittedMessageLine[3] + "[n/a]"); aSenderDummy.setCallSign(splittedMessageLine[3] + "[n/a]");
aSenderDummy.setAirPlaneReflectInfo(new AirPlaneReflectionInfo()); aSenderDummy.setAirPlaneReflectInfo(new AirPlaneReflectionInfo());
newMessage.setSender(aSenderDummy); newMessageArrived.setSender(aSenderDummy);
System.out.println("MsgBusmgtT: Catched Error! " + exc.getMessage() + " // " + splittedMessageLine[3] + " is not in the list! Faking sender!"); System.out.println("MsgBusmgtT: Catched Error! " + exc.getMessage() + " // " + splittedMessageLine[3] + " is not in the list! Faking sender!");
exc.printStackTrace(); exc.printStackTrace();
} }
// b4 init list // b4 init list
} else { } else {
//user not found in chatmember list, mark it, sender can not be set //user not found in chatmember list, mark it, sender can not be set
if (!sender.getCallSign().equals(this.client.getChatPreferences().getLoginCallSign().toUpperCase())) { if (!sender.getCallSign().equals(this.client.getChatPreferences().getStn_loginCallSign().toUpperCase())) {
sender.setCallSign("[n/a]" + sender.getCallSign()); sender.setCallSign("[n/a]" + sender.getCallSign());
// if someone sent a message without being in the userlist (cause // if someone sent a message without being in the userlist (cause
// on4kst missed implementing....), callsign will be marked // on4kst missed implementing....), callsign will be marked
@@ -516,45 +545,47 @@ public class MessageBusManagementThread extends Thread {
//that means, message was by own station, broadcasted to all other //that means, message was by own station, broadcasted to all other
ChatMember dummy = new ChatMember(); ChatMember dummy = new ChatMember();
dummy.setCallSign("ALL"); dummy.setCallSign("ALL");
newMessage.setReceiver(dummy); newMessageArrived.setReceiver(dummy);
AirPlaneReflectionInfo preventNullpointerExc = new AirPlaneReflectionInfo(); AirPlaneReflectionInfo preventNullpointerExc = new AirPlaneReflectionInfo();
preventNullpointerExc.setAirPlanesReachableCntr(0); preventNullpointerExc.setAirPlanesReachableCntr(0);
sender.setAirPlaneReflectInfo(preventNullpointerExc); sender.setAirPlaneReflectInfo(preventNullpointerExc);
newMessage.setSender(sender); //my own call is the sender newMessageArrived.setSender(sender); //my own call is the sender
} }
} }
// newMessage.setSender(this.client.getChatMemberTable().get(splittedMessageLine[3])); // newMessageArrived.setSender(this.client.getChatMemberTable().get(splittedMessageLine[3]));
} }
newMessage.setMessageSenderName(splittedMessageLine[4]); newMessageArrived.setMessageSenderName(splittedMessageLine[4]);
newMessage.setMessageText(splittedMessageLine[6]); newMessageArrived.setMessageText(splittedMessageLine[6]);
if (splittedMessageLine[7].equals("0")) { if (splittedMessageLine[7].equals("0")) {
// message is not directed to anyone, move it to the cq messages! // message is not directed to anyone, move it to the cq messages!
ChatMember dummy = new ChatMember(); ChatMember dummy = new ChatMember();
dummy.setCallSign("ALL"); dummy.setCallSign("ALL");
newMessage.setReceiver(dummy); newMessageArrived.setReceiver(dummy);
// this.client.getLst_toAllMessageList().add(0, newMessage); // sdtout to all message-List //TODO: change, moved to globalmessagelist - original this.client.getLst_globalChatMessageList().add(0, newMessageArrived); // sdtout to all message-List
this.client.getLst_globalChatMessageList().add(0, newMessage); // sdtout to all message-List //TODO: change, moved to globalmessagelist
} else { } else {
//message is directed to another chatmember, process as such! //message is directed to another chatmember, process as such!
ChatMember receiver = new ChatMember(); ChatMember receiver = new ChatMember();
receiver.setChatCategory(chategoryForMessageAndMessageSender); //got out of message itself
receiver.setCallSign(splittedMessageLine[7]); receiver.setCallSign(splittedMessageLine[7]);
int index = checkListForChatMemberIndexByCallSign(this.client.getLst_chatMemberList(), receiver); int index = checkListForChatMemberIndexByCallSign(this.client.getLst_chatMemberList(), receiver);
if (index != -1) { if (index != -1) {
newMessage.setReceiver(this.client.getLst_chatMemberList().get(index));// -1: Member left Chat newMessageArrived.setReceiver(this.client.getLst_chatMemberList().get(index));// -1: Member left Chat
// before... // before...
} else { //found in active member list } else { //found in active member list
if (receiver.getCallSign().equals(client.getChatPreferences().getLoginCallSign())) { if (receiver.getCallSign().equals(client.getChatPreferences().getStn_loginCallSign())) {
/** /**
* If mycallsign sent a message to the server, server will publish that message and * If mycallsign sent a message to the server, server will publish that message and
* send it to all chatmember including me. * send it to all chatmember including me.
@@ -562,90 +593,143 @@ public class MessageBusManagementThread extends Thread {
* it in the next case (marking left user, just for information). But I want an echo. * it in the next case (marking left user, just for information). But I want an echo.
*/ */
receiver.setCallSign(client.getChatPreferences().getLoginCallSign()); receiver.setCallSign(client.getChatPreferences().getStn_loginCallSign());
newMessage.setReceiver(receiver); newMessageArrived.setReceiver(receiver);
} else { } else {
//this are user which left chat but had been adressed by this message //this are user which left chat but had been adressed by this message
receiver.setCallSign(receiver.getCallSign() + "(left)"); receiver.setCallSign(receiver.getCallSign() + "(left)");
newMessage.setReceiver(receiver); newMessageArrived.setReceiver(receiver);
} }
} }
// System.out.println("message directed to: " + newMessage.getReceiver().getCallSign() + ". EQ?: " + this.client.getownChatMemberObject().getCallSign() + " sent by: " + newMessage.getSender().getCallSign().toUpperCase() + " -> EQ?: "+ this.client.getChatPreferences().getLoginCallSign().toUpperCase()); // System.out.println("message directed to: " + newMessageArrived.getReceiver().getCallSign() + ". EQ?: " + this.client.getownChatMemberObject().getCallSign() + " sent by: " + newMessageArrived.getSender().getCallSign().toUpperCase() + " -> EQ?: "+ this.client.getChatPreferences().getLoginCallSign().toUpperCase());
try { try {
/** /**
* message is directed to me, will be put in the "to me" messagelist * message is directed to me, will be put in the "to me" messagelist
*/ */
if (newMessage.getReceiver().getCallSign() if (newMessageArrived.getReceiver().getCallSign()
.equals(this.client.getChatPreferences().getLoginCallSign())) { .equals(this.client.getChatPreferences().getStn_loginCallSign())) {
// this.client.getLst_toMeMessageList().add(0, newMessage); //TODO: change, moved to globalmessagelist, original // this.client.getLst_toMeMessageList().add(0, newMessageArrived); //TODO: change, moved to globalmessagelist, original
this.client.getLst_globalChatMessageList().add(0, newMessage); //TODO: change, moved to globalmessagelist, original this.client.getLst_globalChatMessageList().add(0, newMessageArrived); //TODO: change, moved to globalmessagelist, original
if (this.client.getChatPreferences().isNotify_playSimpleSounds()) { if (this.client.getChatPreferences().isNotify_playSimpleSounds()) {
this.client.getPlayAudioUtils().playNoiseLauncher('P'); this.client.getPlayAudioUtils().playNoiseLauncher('P');
} }
if (this.client.getChatPreferences().isNotify_playCWCallsignsOnRxedPMs()) { if (this.client.getChatPreferences().isNotify_playCWCallsignsOnRxedPMs()) {
this.client.getPlayAudioUtils().playCWLauncher(" " + " " + newMessage.getSender().getCallSign().toUpperCase()); this.client.getPlayAudioUtils().playCWLauncher(" " + " " + newMessageArrived.getSender().getCallSign().toUpperCase());
} }
if (this.client.getChatPreferences().isNotify_playVoiceCallsignsOnRxedPMs()) { if (this.client.getChatPreferences().isNotify_playVoiceCallsignsOnRxedPMs()) {
this.client.getPlayAudioUtils().playVoiceLauncher( "?" + newMessage.getSender().getCallSign().toUpperCase()); this.client.getPlayAudioUtils().playVoiceLauncher( "?" + newMessageArrived.getSender().getCallSign().toUpperCase());
} }
if (this.client.getChatPreferences().isNotify_playSimpleSounds()) { if (this.client.getChatPreferences().isNotify_playSimpleSounds()) {
if (newMessage.getMessageText().toUpperCase().contains("//BELL")) { if (newMessageArrived.getMessageText().toUpperCase().contains("//BELL")) {
this.client.getPlayAudioUtils().playVoiceLauncher("!"); this.client.getPlayAudioUtils().playVoiceLauncher("!");
} }
} }
if (this.client.getChatPreferences().isMsgHandling_autoAnswerEnabled()) {
System.out.println("message directed to me: " + newMessage.getReceiver().getCallSign() + "."); ChatMessage automaticAnswer = new ChatMessage();
ChatMember itsMe = new ChatMember();
itsMe.setCallSign(this.client.getChatPreferences().getStn_loginCallSign());
} else if (newMessage.getSender().getCallSign().toUpperCase() automaticAnswer.setSender(itsMe);
.equals(this.client.getChatPreferences().getLoginCallSign().toUpperCase())) { automaticAnswer.setReceiver(newMessageArrived.getSender());
automaticAnswer.setMessageText("/CQ " + newMessageArrived.getSender().getCallSign() + " " + this.client.getChatPreferences().getMessageHandling_autoAnswerTextMainCat());
this.client.getMessageTXBus().add(automaticAnswer);
}
/**
* auto reply/answer to QRG requests is here
*/
if (this.client.getChatPreferences().isMessageHandling_autoAnswerToQRGRequestEnabled()) {
for (String lookForQRGString : qrgQuestionTexts) {
if (newMessageArrived.getMessageText().contains(lookForQRGString)) {
ChatMessage automaticAnswer = new ChatMessage();
ChatMember itsMe = new ChatMember();
itsMe.setCallSign(this.client.getChatPreferences().getStn_loginCallSign());
automaticAnswer.setSender(itsMe);
automaticAnswer.setReceiver(newMessageArrived.getSender());
automaticAnswer.setMessageText("/CQ " + newMessageArrived.getSender().getCallSign() + " KST4Contest Auto: QRG is: " + this.client.getChatPreferences().getMYQRGFirstCat().getValue());
if (this.client.getChatPreferences().isLoginToSecondChatEnabled()) {
automaticAnswer.setMessageText("/CQ " + newMessageArrived.getSender().getCallSign() + " KST4Contest Auto: QRGs: " + this.client.getChatPreferences().getMYQRGFirstCat().getValue() + " / " + this.client.getChatPreferences().getMYQRGSecondCat().getValue());
} else {
automaticAnswer.setMessageText("/CQ " + newMessageArrived.getSender().getCallSign() + " KST4Contest Auto: QRG is: " + this.client.getChatPreferences().getMYQRGFirstCat().getValue());
}
this.client.getMessageTXBus().add(automaticAnswer);
}
}
}
System.out.println("message directed to me: " + newMessageArrived.getReceiver().getCallSign() + ".");
} else if (newMessageArrived.getSender().getCallSign().toUpperCase()
.equals(this.client.getChatPreferences().getStn_loginCallSign().toUpperCase())) {
/** /**
* message sent by me! * message sent by me!
* message from me will appear in the PM window, too, with (>CALLSIGN) before * message from me will appear in the PM window, too, with (>CALLSIGN) before
*/ */
String originalMessage = newMessage.getMessageText(); String originalMessage = newMessageArrived.getMessageText();
newMessage newMessageArrived
.setMessageText("(>" + newMessage.getReceiver().getCallSign() + ")" + originalMessage); .setMessageText("(>" + newMessageArrived.getReceiver().getCallSign() + ")" + originalMessage);
// this.client.getLst_toMeMessageList().add(0, newMessage); //TODO: change, moved to globalmessagelist, original this.client.getLst_globalChatMessageList().add(0,newMessageArrived);
this.client.getLst_globalChatMessageList().add(0,newMessage);//TODO: change, moved to globalmessagelist
// if you sent the message to another station, it will be sorted in to // if you sent the message to another station, it will be sorted in to
// the "to me message list" with modified messagetext, added rxers callsign // the "to me message list" with modified messagetext, added rxers callsign
} else { } else {
//message sent to other user //message sent to other user
// this.client.getLst_toOtherMessageList().add(0, newMessage); //TODO: change, moved to globalmessagelist, original // this.client.getLst_toOtherMessageList().add(0, newMessageArrived); //TODO: change, moved to globalmessagelist, original
if (DirectionUtils.isInAngleAndRange(client.getChatPreferences().getLoginLocator(), if (DirectionUtils.isInAngleAndRange(client.getChatPreferences().getStn_loginLocatorMainCat(),
newMessage.getSender().getQra(), newMessageArrived.getSender().getQra(),
newMessage.getReceiver().getQra(), newMessageArrived.getReceiver().getQra(),
client.getChatPreferences().getStn_maxQRBDefault(), client.getChatPreferences().getStn_maxQRBDefault(),
client.getChatPreferences().getStn_antennaBeamWidthDeg())) { client.getChatPreferences().getStn_antennaBeamWidthDeg())) {
if (this.client.getChatPreferences().isNotify_playSimpleSounds()) { if (this.client.getChatPreferences().isNotify_playSimpleSounds()) {
//play only tick sound if the sender was not set directedtome before //play only tick sound if the sender was not set directedtome before
if (!newMessage.getSender().isInAngleAndRange()) { if (!newMessageArrived.getSender().isInAngleAndRange()) {
this.client.getPlayAudioUtils().playNoiseLauncher('-'); this.client.getPlayAudioUtils().playNoiseLauncher('-');
} }
} }
newMessage.getSender().setInAngleAndRange(true);
System.out.println(">>>>>>>>>> Anglewarning <<<<<<<<<< " + newMessage.getSender().getCallSign() + ", " + newMessage.getSender().getQra() + " -> " + newMessage.getReceiver().getCallSign() + ", " + newMessage.getReceiver().getQra() + " = " +
new Location(newMessage.getSender().getQra()).getBearing(new Location(newMessage.getReceiver().getQra())) +
" / sender bearing to me: " + new Location(newMessage.getSender().getQra()).getBearing(new Location(client.getChatPreferences().getLoginLocator())));
} else { newMessageArrived.getSender().setInAngleAndRange(true);
System.out.println("-notinangle- " + newMessage.getSender().getCallSign() + ", " + newMessage.getSender().getQra() + " -> " + newMessage.getReceiver().getCallSign() + ", " + newMessage.getReceiver().getQra() + " = " +
new Location(newMessage.getSender().getQra()).getBearing(new Location(newMessage.getReceiver().getQra())) + if (client.getChatPreferences().isNotify_dxClusterServerEnabled()) {
" ; sender bearing to me: " + new Location(newMessage.getSender().getQra()).getBearing(new Location(client.getChatPreferences().getLoginLocator()))); try {
newMessage.getSender().setInAngleAndRange(false); if (newMessageArrived.getSender().getFrequency() != null) {
this.client.getDxClusterServer().broadcastSingleDXClusterEntryToLoggers(newMessageArrived.getSender()); //tells the DXCluster server to send a DXC message for this member to the logbook software
}
} catch (Exception exception) {
System.out.println("[MSGBUSMGT, ERROR:] DXCluster messageserver error while processing spot for 0" + newMessageArrived.getSender().getCallSign() + " // " + exception.getMessage());
exception.printStackTrace();
}
} }
this.client.getLst_globalChatMessageList().add(0, newMessage); System.out.println(">>>>>>>>>> Anglewarning <<<<<<<<<< " + newMessageArrived.getSender().getCallSign() + ", " + newMessageArrived.getSender().getQra() + " -> " + newMessageArrived.getReceiver().getCallSign() + ", " + newMessageArrived.getReceiver().getQra() + " = " +
// System.out.println("MSGBS bgfx: tx call = " + newMessage.getSender().getCallSign() + " / rx call = " + newMessage.getReceiver().getCallSign()); new Location(newMessageArrived.getSender().getQra()).getBearing(new Location(newMessageArrived.getReceiver().getQra())) +
" / sender bearing to me: " + new Location(newMessageArrived.getSender().getQra()).getBearing(new Location(client.getChatPreferences().getStn_loginLocatorMainCat())));
} else {
System.out.println("-notinangle- " + newMessageArrived.getSender().getCallSign() + ", " + newMessageArrived.getSender().getQra() + " -> " + newMessageArrived.getReceiver().getCallSign() + ", " + newMessageArrived.getReceiver().getQra() + " = " +
new Location(newMessageArrived.getSender().getQra()).getBearing(new Location(newMessageArrived.getReceiver().getQra())) +
" ; sender bearing to me: " + new Location(newMessageArrived.getSender().getQra()).getBearing(new Location(client.getChatPreferences().getStn_loginLocatorMainCat())));
newMessageArrived.getSender().setInAngleAndRange(false);
}
this.client.getLst_globalChatMessageList().add(0, newMessageArrived);
// System.out.println("MSGBS bgfx: tx call = " + newMessageArrived.getSender().getCallSign() + " / rx call = " + newMessageArrived.getReceiver().getCallSign());
} }
} catch (NullPointerException referenceDeletedByUserLeftChatDuringMessageprocessing) { } catch (NullPointerException referenceDeletedByUserLeftChatDuringMessageprocessing) {
System.out.println("MSGBS bgfx, <<<catched error>>>: referenced user left the chat during messageprocessing or message got before user entered chat message: " + referenceDeletedByUserLeftChatDuringMessageprocessing.getStackTrace()); System.out.println("MSGBS bgfx, <<<catched error>>>: referenced user left the chat during messageprocessing or message got before user entered chat message: " + referenceDeletedByUserLeftChatDuringMessageprocessing.getStackTrace());
@@ -654,7 +738,7 @@ public class MessageBusManagementThread extends Thread {
// sdtout to me message-List // sdtout to me message-List
// newMessage.setReceiver(this.client.getChatMemberTable().get(splittedMessageLine[7])); // set sender // newMessageArrived.setReceiver(this.client.getChatMemberTable().get(splittedMessageLine[7])); // set sender
// to the // to the
// member of // member of
// before // before
@@ -662,11 +746,16 @@ public class MessageBusManagementThread extends Thread {
// list // list
} }
// System.out.println("[MSGBUSMGT:] processed message: " + newMessage.getChatCategory().getCategoryNumber() try {
// + " " + newMessage.getSender().getCallSign() + ", " + newMessage.getMessageSenderName() + " -> "
// + newMessage.getReceiver().getCallSign() + ": " + newMessage.getMessageText());
String locatedFrequencies = checkIfMessageInhibitsFrequency(newMessage); System.out.println("[MSGBUSMGT:] processed message: " + newMessageArrived.getChatCategory().getCategoryNumber()
+ " " + newMessageArrived.getSender().getCallSign() + ", " + newMessageArrived.getMessageSenderName() + " -> "
+ newMessageArrived.getReceiver().getCallSign() + ": " + newMessageArrived.getMessageText());
} catch (Exception exceptionOccured) {
System.out.println("[MSGMgtBus: ERROR CHATCHED ON MAYBE NULL ISSUE]: " + exceptionOccured.getMessage() + "\n" + exceptionOccured.getStackTrace());
}
String locatedFrequencies = checkIfMessageInhibitsFrequency(newMessageArrived);
SimpleStringProperty qrg = new SimpleStringProperty(locatedFrequencies); SimpleStringProperty qrg = new SimpleStringProperty(locatedFrequencies);
@@ -676,14 +765,10 @@ public class MessageBusManagementThread extends Thread {
// no qrg found, nothing to do // no qrg found, nothing to do
} else { } else {
// String stringAggregation = "";
//
// for (int i = 0; i < locatedFrequencies.length; i++) {
// stringAggregation += locatedFrequencies[i] + " ";
// }
ChatMember temp3 = new ChatMember(); ChatMember temp3 = new ChatMember();
temp3.setCallSign(splittedMessageLine[3]); temp3.setCallSign(splittedMessageLine[3]);
temp3.setChatCategory(chategoryForMessageAndMessageSender);
int index = checkListForChatMemberIndexByCallSign(this.client.getLst_chatMemberList(), temp3); int index = checkListForChatMemberIndexByCallSign(this.client.getLst_chatMemberList(), temp3);
if (index == -1) { // user is not in the userlist but sent message... if (index == -1) { // user is not in the userlist but sent message...
@@ -694,13 +779,12 @@ public class MessageBusManagementThread extends Thread {
System.out.println("[MSGBUSMGT <<<catched ERROR>>>]:, Frequency for " + splittedMessageLine[3] System.out.println("[MSGBUSMGT <<<catched ERROR>>>]:, Frequency for " + splittedMessageLine[3]
+ " is not settable, Callsign is not in the Member-list!"); + " is not settable, Callsign is not in the Member-list!");
//create dummy user to display the message but it wont be hit the user object //create dummy user to display the message but it wont be hit an existing user object
ChatMember newMember = new ChatMember(); ChatMember newMember = new ChatMember();
newMember.setCallSign(splittedMessageLine[3]); newMember.setCallSign(splittedMessageLine[3]);
newMember.setName(splittedMessageLine[4]); newMember.setName(splittedMessageLine[4]);
newMember.setFrequency(qrg); newMember.setFrequency(qrg);
// newMember.setFrequency(locatedFrequencies);
// this.client.getLst_chatMemberList().add(newMember);
} else { } else {
/** /**
@@ -709,6 +793,8 @@ public class MessageBusManagementThread extends Thread {
this.client.getLst_chatMemberList().get(index).setFrequency(qrg); this.client.getLst_chatMemberList().get(index).setFrequency(qrg);
System.out.println("[MSGBUSMGT:] Frequency for " + splittedMessageLine[3] + " setted: " System.out.println("[MSGBUSMGT:] Frequency for " + splittedMessageLine[3] + " setted: "
+ locatedFrequencies); + locatedFrequencies);
// this.client.getDxClusterServer().broadcastSingleDXClusterEntryToLoggers(this.client.getLst_chatMemberList().get(index)); //tells the DXCluster server to send a DXC message for this member to the logbook software
} }
} }
@@ -725,6 +811,8 @@ public class MessageBusManagementThread extends Thread {
// System.out.println("MSGBUS: User detected"); // System.out.println("MSGBUS: User detected");
ChatMember temp4 = new ChatMember(); ChatMember temp4 = new ChatMember();
temp4.setChatCategory(this.client.getChatCategoryMain()); //not really detectable and not really neccessarry to detect
temp4.setCallSign(splittedMessageLine[2]); temp4.setCallSign(splittedMessageLine[2]);
temp4.setQra(splittedMessageLine[3]); temp4.setQra(splittedMessageLine[3]);
temp4.setLastActivity(new Utils4KST().time_generateActualTimeInDateFormat()); temp4.setLastActivity(new Utils4KST().time_generateActualTimeInDateFormat());
@@ -737,21 +825,20 @@ public class MessageBusManagementThread extends Thread {
+ this.client.getLst_chatMemberList().get(index).getQra() + " new is: " + this.client.getLst_chatMemberList().get(index).getQra() + " new is: "
+ splittedMessageLine[3])); + splittedMessageLine[3]));
this.client.getLst_chatMemberList().get(index).setQra(splittedMessageLine[3]); ChatMember foundThisInChatMemberList = this.client.getLst_chatMemberList().get(index); //make less list accesses
this.client.getLst_chatMemberList().get(index).setQrb(new Location().getDistanceKmByTwoLocatorStrings(client.getChatPreferences().getLoginLocator(), splittedMessageLine[3]));
this.client.getLst_chatMemberList().get(index).setQTFdirection(new Location(client.getChatPreferences().getLoginLocator()).getBearing(new Location(splittedMessageLine[3])));
// this.client.getLst_chatMemberList().get(index).setQra(splittedMessageLine[3]);
// this.client.getLst_chatMemberList().get(index).setQrb(new Location().getDistanceKmByTwoLocatorStrings(client.getChatPreferences().getLoginLocator(), splittedMessageLine[3]));
// this.client.getLst_chatMemberList().get(index).setQTFdirection(new Location(client.getChatPreferences().getLoginLocator()).getBearing(new Location(splittedMessageLine[3])));
foundThisInChatMemberList.setQra(splittedMessageLine[3]);
foundThisInChatMemberList.setQrb(new Location().getDistanceKmByTwoLocatorStrings(client.getChatPreferences().getStn_loginLocatorMainCat(), splittedMessageLine[3]));
foundThisInChatMemberList.setQTFdirection(new Location(client.getChatPreferences().getStn_loginLocatorMainCat()).getBearing(new Location(splittedMessageLine[3])));
} else { } else {
System.out.println("[MSGBUSMGT:] ERROR! Locator Change of [" System.out.println("[MSGBUSMGT:] ERROR! Locator Change of ["
+ (splittedMessageLine[2] + "] is not possible, user is not in the Table!")); + (splittedMessageLine[2] + "] is not possible, user is not in the Table!"));
// ChatMember newMember = new ChatMember();
// newMember.setCallSign(splittedMessageLine[2]);
// newMember.setQra(splittedMessageLine[3]);
// this.client.getChatMemberTable().put(newMember.getCallSign(), newMember);
// this.client.getLst_chatMemberList().add(temp4);
} }
this.client.getDbHandler().storeChatMember(temp4); // TODO thats a bit unclean, its less an insert but a this.client.getDbHandler().storeChatMember(temp4); // TODO thats a bit unclean, its less an insert but a
@@ -873,6 +960,8 @@ public class MessageBusManagementThread extends Thread {
// System.out.println("[MSGBUSMGT:] DXCluster Message detected "); // System.out.println("[MSGBUSMGT:] DXCluster Message detected ");
stateChangeMember.setChatCategory(util_getChatCategoryByCategoryNrString(splittedMessageLine[1]));
int index = checkListForChatMemberIndexByCallSign(this.client.getLst_chatMemberList(), int index = checkListForChatMemberIndexByCallSign(this.client.getLst_chatMemberList(),
stateChangeMember); stateChangeMember);
@@ -892,13 +981,15 @@ public class MessageBusManagementThread extends Thread {
ChatMember stateChangeMember = new ChatMember(); ChatMember stateChangeMember = new ChatMember();
stateChangeMember.setChatCategory(util_getChatCategoryByCategoryNrString(splittedMessageLine[1]));
stateChangeMember.setCallSign(splittedMessageLine[2]); stateChangeMember.setCallSign(splittedMessageLine[2]);
stateChangeMember.setName(splittedMessageLine[3]); stateChangeMember.setName(splittedMessageLine[3]);
stateChangeMember.setQra(splittedMessageLine[4]); stateChangeMember.setQra(splittedMessageLine[4]);
stateChangeMember.setState(Integer.parseInt(splittedMessageLine[5])); stateChangeMember.setState(Integer.parseInt(splittedMessageLine[5]));
stateChangeMember.setLastActivity(new Utils4KST().time_generateActualTimeInDateFormat()); stateChangeMember.setLastActivity(new Utils4KST().time_generateActualTimeInDateFormat());
stateChangeMember.setQrb(new Location().getDistanceKmByTwoLocatorStrings(client.getChatPreferences().getLoginLocator(), stateChangeMember.getQra())); stateChangeMember.setQrb(new Location().getDistanceKmByTwoLocatorStrings(client.getChatPreferences().getStn_loginLocatorMainCat(), stateChangeMember.getQra()));
stateChangeMember.setQTFdirection(new Location(client.getChatPreferences().getLoginLocator()).getBearing(new Location(stateChangeMember.getQra()))); stateChangeMember.setQTFdirection(new Location(client.getChatPreferences().getStn_loginLocatorMainCat()).getBearing(new Location(stateChangeMember.getQra())));
this.client.getDbHandler().storeChatMember(stateChangeMember); // TODO: not clean, it should be an this.client.getDbHandler().storeChatMember(stateChangeMember); // TODO: not clean, it should be an
// upodate // upodate
@@ -915,14 +1006,6 @@ public class MessageBusManagementThread extends Thread {
this.client.getLst_chatMemberList().get(index).setState(stateChangeMember.getState()); this.client.getLst_chatMemberList().get(index).setState(stateChangeMember.getState());
} }
// this.client.getChatMemberTable().get(stateChangeMember.getCallSign())
// .setName(stateChangeMember.getName());
// this.client.getChatMemberTable().get(stateChangeMember.getCallSign())
// .setQra(stateChangeMember.getQra());
// this.client.getChatMemberTable().get(stateChangeMember.getCallSign())
// .setState(stateChangeMember.getState());
} else } else
/** /**
@@ -961,7 +1044,7 @@ public class MessageBusManagementThread extends Thread {
pwErrorMsg.setMessageText(splittedMessageLine[2]); pwErrorMsg.setMessageText(splittedMessageLine[2]);
ChatMember receiverDummy = new ChatMember(); ChatMember receiverDummy = new ChatMember();
receiverDummy.setCallSign(client.getChatPreferences().getLoginCallSign()); receiverDummy.setCallSign(client.getChatPreferences().getStn_loginCallSign());
receiverDummy.setQrb(0.); receiverDummy.setQrb(0.);
receiverDummy.setQTFdirection(0.); receiverDummy.setQTFdirection(0.);
pwErrorMsg.setReceiver(receiverDummy); pwErrorMsg.setReceiver(receiverDummy);
@@ -1008,6 +1091,28 @@ public class MessageBusManagementThread extends Thread {
} }
} }
/**
* Method gets a String with a messagecategory-number and returns out of which of the existing categories
* (chat channels) this message/user had written from
*
* @param categoryNumber
* @return used Chatcategory (instance of singletons)
*/
private ChatCategory util_getChatCategoryByCategoryNrString(String categoryNumber) {
// System.out.println("MSGBSMGT Debug: >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> try to find out category for a member; category is " + categoryNumber + " // 1st is " + this.client.getChatCategoryMain().getCategoryNumber() + " // 2nd is " + this.client.getChatCategorySecondChat().getCategoryNumber());
if (categoryNumber.equals(this.client.getChatCategoryMain().getCategoryNumber() + "")) {
return this.client.getChatCategoryMain();
} else if (categoryNumber.equals(this.client.getChatCategorySecondChat().getCategoryNumber() + "")) {
return this.client.getChatCategorySecondChat();
} else {
System.out.println("Msgbusmgt: ERROR!!! -> category for this message does not exist!");
return this.client.getChatCategoryMain(); //Chatcategory default decision
}
}
@Override @Override
public void interrupt() { public void interrupt() {
super.interrupt(); super.interrupt();
@@ -1118,10 +1223,10 @@ public class MessageBusManagementThread extends Thread {
try { try {
processRXMessage23001(messageTextRaw); processRXMessage23001(messageTextRaw);
} catch (IOException e) { } catch (IOException e) {
// TODO Auto-generated catch block System.out.println("MsgBusMgt: process23001 went wrong / IO Error");
e.printStackTrace(); e.printStackTrace();
} catch (SQLException e) { } catch (SQLException e) {
// TODO Auto-generated catch block System.out.println("MsgBusMgt: process23001 went wrong / SQL Error");
e.printStackTrace(); e.printStackTrace();
} }
} }
@@ -1130,7 +1235,7 @@ public class MessageBusManagementThread extends Thread {
this.interrupt(); this.interrupt();
e1.printStackTrace(); e1.printStackTrace();
break;// TODO Change at may24, avoid uncloability. Check if this could lead to further errors on instable link! break;// TODO Change at may24, avoid uncloadability. Check if this could lead to further errors on instable link!
// client.getMessageRXBus().clear(); // client.getMessageRXBus().clear();
} }
{ {

View File

@@ -2,6 +2,7 @@ package kst4contest.controller;
import java.io.*; import java.io.*;
import java.net.*; import java.net.*;
import java.nio.charset.StandardCharsets;
import kst4contest.model.ChatMessage; import kst4contest.model.ChatMessage;
@@ -39,7 +40,7 @@ public class ReadThread extends Thread {
try { try {
input = socket.getInputStream(); input = socket.getInputStream();
reader = new BufferedReader(new InputStreamReader(input)); reader = new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8));
} catch (IOException ex) { } catch (IOException ex) {
System.out.println("Error getting input stream: " + ex.getMessage()); System.out.println("Error getting input stream: " + ex.getMessage());

View File

@@ -3,6 +3,7 @@ package kst4contest.controller;
import java.io.*; import java.io.*;
import java.net.*; import java.net.*;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.ArrayList;
import javax.xml.XMLConstants; import javax.xml.XMLConstants;
import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilder;
@@ -195,8 +196,12 @@ public class ReadUDPbyUCXMessageThread extends Thread {
// call = call.toLowerCase(); // call = call.toLowerCase();
String band = element.getElementsByTagName("band").item(0).getTextContent(); String band = element.getElementsByTagName("band").item(0).getTextContent();
String points = element.getElementsByTagName("points").item(0).getTextContent();
System.out.println("[Readudp, info ]: received Current Element :" + node.getNodeName() System.out.println("[Readudp, info ]: received Current Element :" + node.getNodeName()
+ "call: " + call + " / " + band); + "call: " + call + " / " + band + " ----> " + points + " POINTS");
// client.getChatPreferences().setBcn_contestScoreSum(Long.parseLong(points));
ChatMember workedCall = new ChatMember(); ChatMember workedCall = new ChatMember();
workedCall.setCallSign(call); workedCall.setCallSign(call);
@@ -238,6 +243,44 @@ public class ReadUDPbyUCXMessageThread extends Thread {
} }
/**
* cases hotfix for MINOS logger, which tells band like "2m", not "144"
*/
case "2m": {
workedCall.setWorked144(true);
break;
}
case "70cm": {
workedCall.setWorked432(true);
break;
}
case "23cm": {
workedCall.setWorked1240(true);
break;
}
case "13cm": {
workedCall.setWorked2300(true);
break;
}
case "9cm": {
workedCall.setWorked3400(true);
break;
}
case "6cm": {
workedCall.setWorked5600(true);
break;
}
case "3cm": {
workedCall.setWorked10G(true);
}
default: default:
System.out.println("[ReadUDPFromUCX, Error:] unexpected band value: \"" + band + "\""); System.out.println("[ReadUDPFromUCX, Error:] unexpected band value: \"" + band + "\"");
break; break;
@@ -256,79 +299,150 @@ public class ReadUDPbyUCXMessageThread extends Thread {
// modifyThat = (ChatMember) client.getMap_ucxLogInfoWorkedCalls().get(call); // modifyThat = (ChatMember) client.getMap_ucxLogInfoWorkedCalls().get(call);
int indexOfChatMemberInTable = -1; // asd //TODO: Check if callsign and callsignraw is similar, then mark first and further via new checklistforchatmembermultiplemethod with array of indize
indexOfChatMemberInTable = client.checkListForChatMemberIndexByCallSign(workedCall);
if (indexOfChatMemberInTable == -1) { ArrayList<Integer> markTheseChattersAsWorked = client.checkListForChatMemberIndexesByCallSign(workedCall);
// do nothing
if (markTheseChattersAsWorked.isEmpty()) {
//Worked call is not part of the chatmember list
} else { } else {
modifyThat = client.getLst_chatMemberList().get(indexOfChatMemberInTable); for (int index : markTheseChattersAsWorked) {
// modifyThat.setWorked(true); modifyThat = client.getLst_chatMemberList().get(index);
client.getLst_chatMemberList() modifyThat.setWorked(true);
.get(client.checkListForChatMemberIndexByCallSign(modifyThat)).setWorked(true); // client.getLst_chatMemberList()
// .get(client.checkListForChatMemberIndexByCallSign(modifyThat)).setWorked(true);
if (workedCall.isWorked144()) { if (workedCall.isWorked144()) {
modifyThat.setWorked144(true); modifyThat.setWorked144(true);
client.getLst_chatMemberList() // client.getLst_chatMemberList()
.get(client.checkListForChatMemberIndexByCallSign(modifyThat)) // .get(client.checkListForChatMemberIndexByCallSign(modifyThat))
.setWorked144(true); // .setWorked144(true);
} else if (workedCall.isWorked432()) { } else if (workedCall.isWorked432()) {
modifyThat.setWorked432(true); modifyThat.setWorked432(true);
client.getLst_chatMemberList() // client.getLst_chatMemberList()
.get(client.checkListForChatMemberIndexByCallSign(modifyThat)) // .get(client.checkListForChatMemberIndexByCallSign(modifyThat))
.setWorked432(true); // .setWorked432(true);
} else if (workedCall.isWorked1240()) { } else if (workedCall.isWorked1240()) {
modifyThat.setWorked1240(true); modifyThat.setWorked1240(true);
client.getLst_chatMemberList() // client.getLst_chatMemberList()
.get(client.checkListForChatMemberIndexByCallSign(modifyThat)) // .get(client.checkListForChatMemberIndexByCallSign(modifyThat))
.setWorked1240(true); // .setWorked1240(true);
} else if (workedCall.isWorked2300()) { } else if (workedCall.isWorked2300()) {
modifyThat.setWorked2300(true); modifyThat.setWorked2300(true);
client.getLst_chatMemberList() // client.getLst_chatMemberList()
.get(client.checkListForChatMemberIndexByCallSign(modifyThat)) // .get(client.checkListForChatMemberIndexByCallSign(modifyThat))
.setWorked2300(true); // .setWorked2300(true);
} else if (workedCall.isWorked3400()) { } else if (workedCall.isWorked3400()) {
modifyThat.setWorked3400(true); modifyThat.setWorked3400(true);
client.getLst_chatMemberList() // client.getLst_chatMemberList()
.get(client.checkListForChatMemberIndexByCallSign(modifyThat)) // .get(client.checkListForChatMemberIndexByCallSign(modifyThat))
.setWorked3400(true); // .setWorked3400(true);
} else if (workedCall.isWorked5600()) { } else if (workedCall.isWorked5600()) {
modifyThat.setWorked5600(true); modifyThat.setWorked5600(true);
client.getLst_chatMemberList() // client.getLst_chatMemberList()
.get(client.checkListForChatMemberIndexByCallSign(modifyThat)) // .get(client.checkListForChatMemberIndexByCallSign(modifyThat))
.setWorked5600(true); // .setWorked5600(true);
} else if (workedCall.isWorked10G()) { } else if (workedCall.isWorked10G()) {
modifyThat.setWorked10G(true); modifyThat.setWorked10G(true);
client.getLst_chatMemberList() // client.getLst_chatMemberList()
.get(client.checkListForChatMemberIndexByCallSign(modifyThat)) // .get(client.checkListForChatMemberIndexByCallSign(modifyThat))
.setWorked10G(true); // .setWorked10G(true);
} }
/** }
* //TODO: following line is a quick fix to making disappear worked chatmembers of the list
* Thats uncomfortable due to this also causes selection changes, try {
* Better way is to change all worked and qrv values to observables and then trigger the underlying
* list to fire an invalidationevent. Really Todo!
*/
try{
GuiUtils.triggerGUIFilteredChatMemberListChange(client); //not clean at all GuiUtils.triggerGUIFilteredChatMemberListChange(client); //not clean at all
} catch (Exception IllegalStateException) { } catch (Exception IllegalStateException) {
//do nothing, as it works... //do nothing, as it works...
} }
} }
/**
* old mechanic to markup worked stations in the chatmember table
*/
// int indexOfChatMemberInTable = -1; //chatmember not in table
// indexOfChatMemberInTable = client.checkListForChatMemberIndexByCallSign(workedCall);
//
// if (indexOfChatMemberInTable == -1) {
// // do nothing
// } else {
// modifyThat = client.getLst_chatMemberList().get(indexOfChatMemberInTable);
//
// client.getLst_chatMemberList()
// .get(client.checkListForChatMemberIndexByCallSign(modifyThat)).setWorked(true);
//
// if (workedCall.isWorked144()) {
// modifyThat.setWorked144(true);
// client.getLst_chatMemberList()
// .get(client.checkListForChatMemberIndexByCallSign(modifyThat))
// .setWorked144(true);
//
// } else if (workedCall.isWorked432()) {
// modifyThat.setWorked432(true);
// client.getLst_chatMemberList()
// .get(client.checkListForChatMemberIndexByCallSign(modifyThat))
// .setWorked432(true);
//
// } else if (workedCall.isWorked1240()) {
// modifyThat.setWorked1240(true);
// client.getLst_chatMemberList()
// .get(client.checkListForChatMemberIndexByCallSign(modifyThat))
// .setWorked1240(true);
//
// } else if (workedCall.isWorked2300()) {
// modifyThat.setWorked2300(true);
// client.getLst_chatMemberList()
// .get(client.checkListForChatMemberIndexByCallSign(modifyThat))
// .setWorked2300(true);
//
// } else if (workedCall.isWorked3400()) {
// modifyThat.setWorked3400(true);
// client.getLst_chatMemberList()
// .get(client.checkListForChatMemberIndexByCallSign(modifyThat))
// .setWorked3400(true);
//
// } else if (workedCall.isWorked5600()) {
// modifyThat.setWorked5600(true);
// client.getLst_chatMemberList()
// .get(client.checkListForChatMemberIndexByCallSign(modifyThat))
// .setWorked5600(true);
//
// } else if (workedCall.isWorked10G()) {
// modifyThat.setWorked10G(true);
// client.getLst_chatMemberList()
// .get(client.checkListForChatMemberIndexByCallSign(modifyThat))
// .setWorked10G(true);
// }
/**
* //TODO: following line is a quick fix to making disappear worked chatmembers of the list
* Thats uncomfortable due to this also causes selection changes,
* Better way is to change all worked and qrv values to observables and then trigger the underlying
* list to fire an invalidationevent. Really Todo!
*/
// try{
//
// GuiUtils.triggerGUIFilteredChatMemberListChange(client); //not clean at all
// } catch (Exception IllegalStateException) {
// //do nothing, as it works...
// }
// }
/**
* end -> old mechanic to markup worked stations in the chatmember table
*/
} }
boolean isInChat = this.client.getDbHandler().updateWkdInfoOnChatMember(workedCall); boolean isInChat = this.client.getDbHandler().updateWkdInfoOnChatMember(workedCall);
// This will update the worked info on a worked chatmember. DBHandler will // This will update the worked info on a worked chatmember. DBHandler will
// check, if an entry at the db had been modified. If not, then the worked // check, if an entry at the db had been modified. If not, then the worked
// station had not been stored. DBHandler will store the informations then. // station had not been stored. DBHandler will store the information then.
if (!isInChat) { if (!isInChat) {
workedCall.setName("unknown"); workedCall.setName("unknown");
@@ -348,7 +462,6 @@ public class ReadUDPbyUCXMessageThread extends Thread {
fileWriterPersistUDPToFile = new FileWriter(logUDPMessageToThisFile, true); fileWriterPersistUDPToFile = new FileWriter(logUDPMessageToThisFile, true);
} catch (IOException e1) { } catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace(); e1.printStackTrace();
} }
@@ -424,7 +537,7 @@ public class ReadUDPbyUCXMessageThread extends Thread {
// System.out.println("Radio Mode: " + mode); // System.out.println("Radio Mode: " + mode);
// System.out.println("[ReadUDPFromUCX, Info:] Setted QRG pref to: \"" + qrg + "\"" ); // System.out.println("[ReadUDPFromUCX, Info:] Setted QRG pref to: \"" + qrg + "\"" );
this.client.getChatPreferences().getMYQRG().set(formattedQRG); this.client.getChatPreferences().getMYQRGFirstCat().set(formattedQRG);
System.out.println("[ReadUDPbyUCXTh: ] Radioinfo processed: " + formattedQRG); System.out.println("[ReadUDPbyUCXTh: ] Radioinfo processed: " + formattedQRG);
} }

View File

@@ -0,0 +1,65 @@
package kst4contest.controller;
import kst4contest.model.ChatMessage;
import java.util.TimerTask;
/**
* This class is updateing the scoreboard at https://slovhf.net/claimed/. Gets scores of all bands out of the
* preferences which is updated via ReadUdpByUCXLog Thread.
*
* api description: https://slovhf.net/claimed-score-api/
*
* <br/><br/>
* The task will be runned out of the singleton ChatController instance in an
* intervall as specified by the Chatpreferences-instance (typically as
* configured in the xml file.
*
*
* @author prakt
*
*/
public class ScoreboardUpdateTask extends TimerTask {
private ChatController chatController;
public ScoreboardUpdateTask(ChatController client) {
this.chatController = client;
}
@Override
public void run() {
Thread.currentThread().setName("BeaconTask");
ChatMessage beaconMSG = new ChatMessage();
String replaceVariables = this.chatController.getChatPreferences().getBcn_beaconTextMainCat();
// replaceVariables = bcn_beaconText;
replaceVariables = replaceVariables.replaceAll("MYQRG", this.chatController.getChatPreferences().getMYQRGFirstCat().getValue());
replaceVariables = replaceVariables.replaceAll("MYCALL", this.chatController.getChatPreferences().getStn_loginCallSign());
replaceVariables = replaceVariables.replaceAll("MYLOCATOR", this.chatController.getChatPreferences().getStn_loginLocatorMainCat());
replaceVariables = replaceVariables.replaceAll("MYQTF", this.chatController.getChatPreferences().getActualQTF().getValue() + "");
beaconMSG.setMessageText(
"MSG|" + this.chatController.getChatPreferences().getLoginChatCategoryMain().getCategoryNumber() + "|0|" + replaceVariables + "|0|");
beaconMSG.setMessageDirectedToServer(true);
// System.out.println("########### " + replaceVariables);
if (this.chatController.getChatPreferences().isBcn_beaconsEnabledMainCat() ) {
System.out.println(new Utils4KST().time_generateCurrentMMDDhhmmTimeString()
+ " [BeaconTask, Info]: Sending CQ: " + beaconMSG.getMessageText());
this.chatController.getMessageTXBus().add(beaconMSG);
} else {
//do nothing, CQ is disabled
}
}
}

View File

@@ -178,7 +178,7 @@ public class UpdateChecker {
for (int i = 0; i < element.getChildNodes().getLength(); i++) { for (int i = 0; i < element.getChildNodes().getLength(); i++) {
if (element.getChildNodes().item(i).getNodeType() == Node.ELEMENT_NODE) { if (element.getChildNodes().item(i).getNodeType() == Node.ELEMENT_NODE) {
System.out.println(element.getChildNodes().item(i).getTextContent() + " <<<<<<<<<<<<<<<<<< " + i + " / " + childNodeCounter); // System.out.println(element.getChildNodes().item(i).getTextContent() + " <<<<<<<<<<<<<<<<<< " + i + " / " + childNodeCounter);
// System.out.println(element.getChildNodes().item(i).getNodeName()); // System.out.println(element.getChildNodes().item(i).getNodeName());
aChangeLogEntry[childNodeCounter] = aChangeLogEntry[childNodeCounter] + element.getChildNodes().item(i).getTextContent(); aChangeLogEntry[childNodeCounter] = aChangeLogEntry[childNodeCounter] + element.getChildNodes().item(i).getTextContent();
childNodeCounter++; childNodeCounter++;

View File

@@ -1,5 +1,7 @@
package kst4contest.controller; package kst4contest.controller;
import javafx.beans.property.SimpleStringProperty;
import java.text.DateFormat; import java.text.DateFormat;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.time.OffsetDateTime; import java.time.OffsetDateTime;
@@ -7,6 +9,8 @@ import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.Date; import java.util.Date;
import java.util.TimeZone; import java.util.TimeZone;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Utils4KST { public class Utils4KST {
@@ -20,6 +24,14 @@ public class Utils4KST {
return millisecondsSinceEpoch; return millisecondsSinceEpoch;
} }
public String time_generateCurrenthhmmZTimeStringForClusterMessage() {
OffsetDateTime currentTimeInUtc = OffsetDateTime.now(ZoneOffset.UTC);
System.out.println("Utils generated current time " + currentTimeInUtc + " --> " + currentTimeInUtc.format(DateTimeFormatter.ofPattern("HHmm"))+"Z");
return currentTimeInUtc.format(DateTimeFormatter.ofPattern("HHmm"))+"Z";
}
public String time_generateCurrentMMDDhhmmTimeString() { public String time_generateCurrentMMDDhhmmTimeString() {
OffsetDateTime currentTimeInUtc = OffsetDateTime.now(ZoneOffset.UTC); OffsetDateTime currentTimeInUtc = OffsetDateTime.now(ZoneOffset.UTC);
@@ -71,4 +83,119 @@ public class Utils4KST {
} }
/**
* This method tests a regexp-pattern against a given string
*
* @param testString: check if this string matches a given pattern
* @param regExPattern: pattern which should be checked
* @return true if match, else false
*/
private static boolean testPattern(String testString, String regExPattern) {
Pattern pattern = Pattern.compile(regExPattern);
Matcher matcher = pattern.matcher(testString);
return matcher.find();
}
/**
* Normalizes a chatmembers frequency-string for cluster usage<br/>
* <b>returns a frequency String in KHz like = "144300" or "144300.0" to match DXC protocol needs</b>
*
* @param optionalPrefix: if there is a value like ".300", it have to be decided, wich ".300": 144.300, 432.300, 1296.300 .... prefix means for example "144."
*/
public static String normalizeFrequencyString(String qrgString, SimpleStringProperty optionalPrefix) {
// final String PTRN_QRG_CAT2 = "(([0-9]{3,4}[\\.|,| ]?[0-9]{3})([\\.|,][\\d]{1,2})?)|(([a-zA-Z][0-4]{1}[\\d]{2}\\b)([\\.|,][\\d]{1,2}\\b)?)|((\\b[0-4]{1}[\\d]{2}\\b)([\\.|,][\\d]{1,2}\\b)?)";
try {
qrgString = qrgString.replace(" ","");
} catch (Exception e) {
System.out.println("UTILS: QRG NULL, nothing to convert");
// e.printStackTrace();
}
final String PTRN_QRG_CAT2_wholeQRGMHz4Digits = "(([0-9]{4}[\\.|,| ]?[0-9]{3})([\\.|,][\\d]{1,2})?)"; //1296.300.3 etc
final String PTRN_QRG_CAT2_wholeQRGMHz3Digits = "(([0-9]{3}[\\.|,| ]?[0-9]{3})([\\.][\\d]{1,2})?)"; //144.300.3 etc
final String PTRN_QRG_CAT2_QRGwithoutPrefix = "((\\b[0-4]{1}[\\d]{2}\\b)([\\.|,][\\d]{1,2}\\b)?)"; //144.300.3 etc
String stringAggregation = "";
if (testPattern(qrgString, PTRN_QRG_CAT2_wholeQRGMHz4Digits)) {//case 1296.200 or 1296.200.2 etc.
stringAggregation = qrgString;
stringAggregation = stringAggregation.replace(".","");
stringAggregation = stringAggregation.replace(",","");
stringAggregation = stringAggregation.replace(" ", "");
if (stringAggregation.length() == 8) {
String stringAggregationNew = stringAggregation.substring(0, stringAggregation.length()-1) + "." + stringAggregation.substring(stringAggregation.length()-1, stringAggregation.length());
stringAggregation = stringAggregationNew + ".0";
return stringAggregation;
} else if (stringAggregation.length() == 9) {
String stringAggregationNew = stringAggregation.substring(0, stringAggregation.length()-2) + "." + stringAggregation.substring(stringAggregation.length()-2, stringAggregation.length());
stringAggregation = stringAggregationNew;
return stringAggregation;
}
} else
if (testPattern(qrgString, PTRN_QRG_CAT2_wholeQRGMHz3Digits)) { //case 144.300 or 144.300.2
stringAggregation = qrgString;
stringAggregation = stringAggregation.replace(".","");
stringAggregation = stringAggregation.replace(",","");
stringAggregation = stringAggregation.replace(" ", "");
if (stringAggregation.length() == 6) {
stringAggregation = stringAggregation + ".0";
return stringAggregation;
}
if (stringAggregation.length() == 7) {
String stringAggregationNew = stringAggregation.substring(0, stringAggregation.length()-1) + "." + stringAggregation.substring(stringAggregation.length()-1, stringAggregation.length());
stringAggregation = stringAggregationNew + ".0";
return stringAggregation;
} else if (stringAggregation.length() == 8) {
String stringAggregationNew = stringAggregation.substring(0, stringAggregation.length()-2) + "." + stringAggregation.substring(stringAggregation.length()-2, stringAggregation.length());
stringAggregation = stringAggregationNew;
return stringAggregation;
}
}
else
if (testPattern(qrgString, PTRN_QRG_CAT2_QRGwithoutPrefix)) { //case ".050 or .300 or something like that"
stringAggregation = qrgString;
stringAggregation = stringAggregation.replace(".", "");
stringAggregation = stringAggregation.replace(",", "");
stringAggregation = stringAggregation.replace(" ", "");
if (stringAggregation.length() == 3) { // like 050 or 300
String stringAggregationNew = optionalPrefix.getValue() + stringAggregation;
stringAggregation = stringAggregationNew + ".0";
return stringAggregation;
} else if (stringAggregation.length() == 4) { //like 050.2 --> 0502
stringAggregation = optionalPrefix.getValue() + stringAggregation;
String stringAggregationNew = stringAggregation.substring(0, stringAggregation.length() - 1) + "." + stringAggregation.substring(stringAggregation.length() - 1, stringAggregation.length());
stringAggregation = stringAggregationNew;
return stringAggregation;
} else if (stringAggregation.length() == 5) { //like 050.20 --> 05020
stringAggregation = optionalPrefix.getValue() + stringAggregation;
String stringAggregationNew = stringAggregation.substring(0, stringAggregation.length() - 2) + "." + stringAggregation.substring(stringAggregation.length() - 2, stringAggregation.length());
stringAggregation = stringAggregationNew;
return stringAggregation;
}
}
return stringAggregation; //if nothing else helps
}
} }

View File

@@ -2,6 +2,8 @@ package kst4contest.controller;
import java.io.*; import java.io.*;
import java.net.*; import java.net.*;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import kst4contest.model.ChatMessage; import kst4contest.model.ChatMessage;
@@ -17,7 +19,7 @@ public class WriteThread extends Thread {
private ChatController client; private ChatController client;
private OutputStream output; private OutputStream output;
private ChatMessage messageTextRaw; private ChatMessage messageToBeSend;
public WriteThread(Socket socket, ChatController client) throws InterruptedException { public WriteThread(Socket socket, ChatController client) throws InterruptedException {
this.socket = socket; this.socket = socket;
@@ -25,7 +27,9 @@ public class WriteThread extends Thread {
try { try {
output = socket.getOutputStream(); output = socket.getOutputStream();
writer = new PrintWriter(output, true);
writer = new PrintWriter(output, true, StandardCharsets.UTF_8);
} catch (IOException ex) { } catch (IOException ex) {
System.out.println("Error getting output stream: " + ex.getMessage()); System.out.println("Error getting output stream: " + ex.getMessage());
ex.printStackTrace(); ex.printStackTrace();
@@ -34,7 +38,8 @@ public class WriteThread extends Thread {
/** /**
* This method is used to send a message to the server, raw formatted. E.g. for * This method is used to send a message to the server, raw formatted. E.g. for
* the keepalive message. * the keepalive message. This method sends only in the main message-Category. To send it in a category
* "defined by Chatmessage", use txByRxmsgCatOrigin(Chatmessage "toBeSend")
* *
* @param messageToServer * @param messageToServer
* @throws InterruptedException * @throws InterruptedException
@@ -48,6 +53,33 @@ public class WriteThread extends Thread {
} }
/**
* This method is used to send a message directly to a receiver in a special chatcategory. The receivers category
* will be read out of the Chatmessage.getChatCategory method. <b> The message text will be modified to fit kst
* messageformat</b>
*
* @param messageToServer
* @throws InterruptedException
*/
public void txByRxmsgCatOrigin(ChatMessage messageToServer) throws InterruptedException {
// writer.println(messageToServer.getMessage()); //kst4contest.test 4 23001
// writer.flush(); //kst4contest.test 4 23001
String originalMessageText = messageToServer.getMessageText() + "";
String newMessageText = "";
newMessageText = ("MSG|" + messageToServer.getChatCategory().getCategoryNumber()
+ "|0|" + originalMessageText + "|0|"); //original before 1.26
System.out.println(newMessageText + "< sended to the writer (DIRECTED REPLY)");
writer.println(newMessageText);
}
/** /**
* This method gets a textmessage to the chat and adds some characters to hit * This method gets a textmessage to the chat and adds some characters to hit
* the neccessarry format to send a message in the on4kst chat either to another * the neccessarry format to send a message in the on4kst chat either to another
@@ -59,29 +91,28 @@ public class WriteThread extends Thread {
public void txKSTFormatted(ChatMessage messageToServer) throws InterruptedException { public void txKSTFormatted(ChatMessage messageToServer) throws InterruptedException {
// writer.println(messageToServer.getMessageText()); // writer.println(messageToServer.getMessageText());
messageTextRaw = messageToServer; messageToBeSend = messageToServer;
try { try {
messageTextRaw = client.getMessageTXBus().take(); messageToBeSend = client.getMessageTXBus().take();
// this.client.getmesetChatsetServerready(true); // this.client.getmesetChatsetServerready(true);
} catch (InterruptedException e) { } catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace(); e.printStackTrace();
} }
String messageLine = messageTextRaw.getMessageText(); String messageLine = messageToBeSend.getMessageText();
if (messageTextRaw.isMessageDirectedToServer()) { if (messageToBeSend.isMessageDirectedToServer()) {
/** /**
* We have to check if we only commands the server (keepalive) or want do talk * We have to check if we only commands the server (keepalive) or want do talk
* to the community * to the community
*/ */
try { try {
tx(messageTextRaw); tx(messageToBeSend);
System.out.println("BUS: tx: " + messageTextRaw.getMessageText()); System.out.println("BUS: tx: " + messageToBeSend.getMessageText());
} catch (InterruptedException e) { } catch (InterruptedException e) {
// TODO Auto-generated catch block // TODO Auto-generated catch block
@@ -95,8 +126,8 @@ public class WriteThread extends Thread {
// ownMSG.setMessageText( // ownMSG.setMessageText(
// "MSG|" + this.client.getCategory().getCategoryNumber() + "|0|" + messageLine + "|0|"); // "MSG|" + this.client.getCategory().getCategoryNumber() + "|0|" + messageLine + "|0|");
ownMSG.setMessageText("MSG|" + this.client.getChatPreferences().getLoginChatCategory().getCategoryNumber() ownMSG.setMessageText("MSG|" + this.client.getChatPreferences().getLoginChatCategoryMain().getCategoryNumber()
+ "|0|" + messageLine + "|0|"); + "|0|" + messageLine + "|0|"); //original before 1.26
try { try {
tx(ownMSG); tx(ownMSG);
@@ -108,7 +139,7 @@ public class WriteThread extends Thread {
} }
} }
if (messageTextRaw.equals("/QUIT")) { if (messageToBeSend.equals("/QUIT")) {
try { try {
this.client.getReadThread().terminateConnection(); this.client.getReadThread().terminateConnection();
this.client.getReadThread().interrupt(); this.client.getReadThread().interrupt();
@@ -117,7 +148,6 @@ public class WriteThread extends Thread {
this.interrupt(); this.interrupt();
} catch (IOException e) { } catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace(); e.printStackTrace();
} }
} }
@@ -137,59 +167,62 @@ public class WriteThread extends Thread {
while (true) { while (true) {
try { try {
messageTextRaw = client.getMessageTXBus().take(); messageToBeSend = client.getMessageTXBus().take();
if (messageTextRaw.getMessageText().equals("POISONPILL_KILLTHREAD") if (messageToBeSend.getMessageText().equals("POISONPILL_KILLTHREAD")
&& messageTextRaw.getMessageSenderName().equals("POISONPILL_KILLTHREAD")) { && messageToBeSend.getMessageSenderName().equals("POISONPILL_KILLTHREAD")) {
client.getMessageRXBus().clear(); client.getMessageRXBus().clear();
this.interrupt(); this.interrupt();
break; break;
} else { } else {
String messageLine = messageTextRaw.getMessageText(); String messageLine = messageToBeSend.getMessageText();
if (messageTextRaw.isMessageDirectedToServer()) { if (messageToBeSend.isMessageDirectedToServer()) {
/** /**
* We have to check if we only commands the server (keepalive) or want do talk * We have to check if we only commands the server (keepalive) or want do talk
* to the community * to the community
*/ */
try { try {
tx(messageTextRaw); tx(messageToBeSend);
System.out.println("BUS: tx: " + messageTextRaw.getMessageText()); System.out.println("BUS: tx: " + messageToBeSend.getMessageText());
} catch (InterruptedException e) { } catch (InterruptedException e) {
// TODO Auto-generated catch block // TODO Auto-generated catch block
e.printStackTrace(); e.printStackTrace();
} }
} else { } else { //message is not directed to the server, it´s directed to all or to a station
if (messageToBeSend.getChatCategory() == this.client.getChatCategoryMain() || messageToBeSend.getChatCategory() == this.client.getChatCategorySecondChat()) {
txByRxmsgCatOrigin(messageToBeSend);
} else { //default bhv if destination cat is not detectable
ChatMessage ownMSG = new ChatMessage(); ChatMessage ownMSG = new ChatMessage();
// ownMSG.setMessageText(
// "MSG|" + this.client.getCategory().getCategoryNumber() + "|0|" + messageLine + "|0|");
ownMSG.setMessageText( ownMSG.setMessageText(
"MSG|" + this.client.getChatPreferences().getLoginChatCategory().getCategoryNumber() + "|0|" "MSG|" + this.client.getChatPreferences().getLoginChatCategoryMain().getCategoryNumber() + "|0|"
+ messageLine + "|0|"); + messageLine + "|0|");
try { try {
tx(ownMSG); tx(ownMSG);
System.out.println("BUS: tx: " + ownMSG.getMessageText()); System.out.println("WT: tx (raw): " + ownMSG.getMessageText());
} catch (InterruptedException e) { } catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace(); e.printStackTrace();
} }
} }
} }
}
System.out.println("WritheTh: got message out of the queue: " + messageTextRaw.getMessageText()); System.out.println("WritheTh: got message out of the queue: " + messageToBeSend.getMessageText());
// this.client.getmesetChatsetServerready(true); // this.client.getmesetChatsetServerready(true);
} catch (InterruptedException e) { } catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace(); e.printStackTrace();
client.getMessageTXBus().clear(); client.getMessageTXBus().clear();
} }

View File

@@ -53,28 +53,17 @@ public class ChatCategory {
public ChatCategory(int setThiscategoryNumber) { public ChatCategory(int setThiscategoryNumber) {
this.categoryNumber = setThiscategoryNumber; this.categoryNumber = setThiscategoryNumber;
setCategoryNumber(setThiscategoryNumber);
} }
public int getCategoryNumber() { public int getCategoryNumber() {
return categoryNumber; return categoryNumber;
} }
public void setCategoryNumber(int categoryNumber) { public void setCategoryNumber(int categoryNumber) {
this.categoryNumber = categoryNumber; this.categoryNumber = categoryNumber;
} }
/** /**
* Returns an Array of int with possible frequency prefixes, due to in the chat * Returns an Array of int with possible frequency prefixes, due to in the chat
* normally the following format is used (not ever): <br/> * normally the following format is used (not ever): <br/>

View File

@@ -14,6 +14,9 @@ public class ChatMember {
String callSign; String callSign;
String qra; String qra;
String name; String name;
String callSignRaw; //without -2 or -70 etc.
boolean isInAngleAndRange; //if he tries a sked in my dir, he is in range, will process that in the messages boolean isInAngleAndRange; //if he tries a sked in my dir, he is in range, will process that in the messages
@@ -22,7 +25,7 @@ public class ChatMember {
StringProperty frequency = new SimpleStringProperty(); StringProperty frequency = new SimpleStringProperty();
String password; // only used by own instance of the chatmember instance to login to the chat String password; // only used by own instance of the chatmember instance to login to the chat
ChatCategory chatCategory; // only used by own instance of the chatmember instance to login to the chat ChatCategory chatCategory; //Source category
// ChatCategory chatCategory;//only used by own instance of the chatmember instance to login to the chat // ChatCategory chatCategory;//only used by own instance of the chatmember instance to login to the chat
long activityTimeLastInEpoch; // time of last activity in epochtimesec long activityTimeLastInEpoch; // time of last activity in epochtimesec
@@ -312,10 +315,25 @@ public class ChatMember {
public void setWorked(boolean worked) { public void setWorked(boolean worked) {
this.worked = worked; this.worked = worked;
// this.workedInfoChangeFireListEventTriggerProperty().setValue(true);
// this.workedInfoChangeFireListEventTriggerProperty().setValue(false);
} }
/**
*
* @return String (callsign) without -2 or -70 etc.
*/
public String getCallSignRaw() {
String raw = "";
try {
return this.getCallSign().split("-")[0]; //e.g. OK2M-70, returns only ok2m
} catch (Exception e) {
return getCallSign();
}
}
/** /**
* Sets all worked information of this object to false. Scope: GUI, Reset Button * Sets all worked information of this object to false. Scope: GUI, Reset Button
* for worked info, called by appcontroller * for worked info, called by appcontroller
@@ -352,9 +370,9 @@ public class ChatMember {
public String toString() { public String toString() {
String chatMemberSerialization = ""; String chatMemberSerialization = "";
chatMemberSerialization += callSign + ";" + name + ";" + qra + ";" + frequency + ";" + worked + ";" + worked144 chatMemberSerialization += callSign + ";" + name + ";" + qra + ";" + frequency + "; wkd " + worked + "; wkd144 " + worked144
+ ";" + worked432 + ";" + worked1240 + ";" + worked2300 + ";" + worked3400 + ";" + worked5600 + ";" + "; wkd432" + worked432 + "; wkd1240" + worked1240 + "; wkd2300" + worked2300 + "; wkd3400" + worked3400 + "; wkd5600" + worked5600 + "; wkd10G"
+ worked10G; + worked10G + " ; " + chatCategory;
return chatMemberSerialization; return chatMemberSerialization;
} }

File diff suppressed because it is too large Load Diff

View File

@@ -3,7 +3,7 @@ package kst4contest.model;
import java.util.ArrayList; import java.util.ArrayList;
public class UpdateInformation { public class UpdateInformation {
double latestVersionNumberOnServer = 100; //dummy value to prevent nullpointerexc double latestVersionNumberOnServer = 1.26; //dummy value to prevent nullpointerexc
String adminMessage =""; String adminMessage ="";
String majorChanges =""; String majorChanges ="";
String latestVersionPathOnWebserver=""; String latestVersionPathOnWebserver="";

View File

@@ -0,0 +1,131 @@
package kst4contest.test;
import javafx.beans.property.SimpleStringProperty;
import kst4contest.controller.Utils4KST;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class PatternMatcherTest {
/**
* Tests if pattern matches with the given String.
*
* @param testString
* @param regExPattern
* @return true if match, else false
*/
private static boolean testPattern(String testString, String regExPattern) {
Pattern pattern = Pattern.compile(regExPattern);
Matcher matcher = pattern.matcher(testString);
return matcher.find();
}
/**
* Normalizes a chatmembers frequency-string for cluster usage<br/>
* <b>returns a frequency String in KHz like = "144300" or "144300.0" to match DXC protocol needs</b>
*
* @param optionalPrefix: if there is a value like ".300", it have to be decided, wich ".300": 144.300, 432.300, 1296.300 .... prefix means for example "144."
*/
private static String normalizeFrequencyString(String qrgString, String optionalPrefix) {
// final String PTRN_QRG_CAT2 = "(([0-9]{3,4}[\\.|,| ]?[0-9]{3})([\\.|,][\\d]{1,2})?)|(([a-zA-Z][0-4]{1}[\\d]{2}\\b)([\\.|,][\\d]{1,2}\\b)?)|((\\b[0-4]{1}[\\d]{2}\\b)([\\.|,][\\d]{1,2}\\b)?)";
final String PTRN_QRG_CAT2_wholeQRGMHz4Digits = "(([0-9]{4}[\\.|,| ]?[0-9]{3})([\\.|,][\\d]{1,2})?)"; //1296.300.3 etc
final String PTRN_QRG_CAT2_wholeQRGMHz3Digits = "(([0-9]{3}[\\.|,| ]?[0-9]{3})([\\.][\\d]{1,2})?)"; //144.300.3 etc
final String PTRN_QRG_CAT2_QRGwithoutPrefix = "((\\b[0-4]{1}[\\d]{2}\\b)([\\.|,][\\d]{1,2}\\b)?)"; //144.300.3 etc
String predefinedPrefixInMHz = optionalPrefix;
String stringAggregation = "";
if (testPattern(qrgString, PTRN_QRG_CAT2_wholeQRGMHz4Digits)) {
System.out.print("yep: ");
stringAggregation = qrgString;
stringAggregation = stringAggregation.replace(".","");
stringAggregation = stringAggregation.replace(",","");
if (stringAggregation.length() == 8) {
String stringAggregationNew = stringAggregation.substring(0, stringAggregation.length()-1) + "." + stringAggregation.substring(stringAggregation.length()-1, stringAggregation.length());
stringAggregation = stringAggregationNew;
} else if (stringAggregation.length() == 9) {
String stringAggregationNew = stringAggregation.substring(0, stringAggregation.length()-2) + "." + stringAggregation.substring(stringAggregation.length()-2, stringAggregation.length());
stringAggregation = stringAggregationNew;
}
} else
if (testPattern(qrgString, PTRN_QRG_CAT2_wholeQRGMHz3Digits)) {
System.out.print("yep: ");
stringAggregation = qrgString;
stringAggregation = stringAggregation.replace(".","");
stringAggregation = stringAggregation.replace(",","");
if (stringAggregation.length() == 7) {
String stringAggregationNew = stringAggregation.substring(0, stringAggregation.length()-1) + "." + stringAggregation.substring(stringAggregation.length()-1, stringAggregation.length());
stringAggregation = stringAggregationNew;
} else if (stringAggregation.length() == 8) {
String stringAggregationNew = stringAggregation.substring(0, stringAggregation.length()-2) + "." + stringAggregation.substring(stringAggregation.length()-2, stringAggregation.length());
stringAggregation = stringAggregationNew;
}
}
else
if (testPattern(qrgString, PTRN_QRG_CAT2_QRGwithoutPrefix)) { //case ".050 or .300 or something like that"
System.out.print("yep: ");
stringAggregation = qrgString;
stringAggregation = stringAggregation.replace(".", "");
stringAggregation = stringAggregation.replace(",", "");
if (stringAggregation.length() == 3) { // like 050 or 300
String stringAggregationNew = optionalPrefix + stringAggregation;
stringAggregation = stringAggregationNew;
return stringAggregation;
} else if (stringAggregation.length() == 4) { //like 050.2 --> 0502
stringAggregation = optionalPrefix + stringAggregation;
String stringAggregationNew = stringAggregation.substring(0, stringAggregation.length() - 1) + "." + stringAggregation.substring(stringAggregation.length() - 1, stringAggregation.length());
stringAggregation = stringAggregationNew;
return stringAggregation;
} else if (stringAggregation.length() == 5) { //like 050.20 --> 05020
stringAggregation = optionalPrefix + stringAggregation;
String stringAggregationNew = stringAggregation.substring(0, stringAggregation.length() - 2) + "." + stringAggregation.substring(stringAggregation.length() - 2, stringAggregation.length());
stringAggregation = stringAggregationNew;
return stringAggregation;
}
}
return qrgString;
}
public static void main(String[] args) {
int i = 0;
System.out.println(i++ + ": " + Utils4KST.normalizeFrequencyString("144.775", new SimpleStringProperty("144")));
System.out.println(i++ + ": " + Utils4KST.normalizeFrequencyString("144.300.2", new SimpleStringProperty("144")));
System.out.println(i++ + ": " + Utils4KST.normalizeFrequencyString("144,300.2", new SimpleStringProperty("144")));
System.out.println(i++ + ": " + Utils4KST.normalizeFrequencyString("144300.2", new SimpleStringProperty("144")));
System.out.println(i++ + ": " + Utils4KST.normalizeFrequencyString("144300,2", new SimpleStringProperty("144")));
System.out.println(i++ + ": " + Utils4KST.normalizeFrequencyString("144.300", new SimpleStringProperty("144")));
System.out.println(i++ + ": " + Utils4KST.normalizeFrequencyString("144.300.20", new SimpleStringProperty("144")));
System.out.println(i++ + ": " + Utils4KST.normalizeFrequencyString("300", new SimpleStringProperty("144")));
System.out.println(i++ + ": " + Utils4KST.normalizeFrequencyString(".300", new SimpleStringProperty("144")));
System.out.println(i++ + ": " + Utils4KST.normalizeFrequencyString(".300.2", new SimpleStringProperty("144")));
System.out.println(i++ + ": " + Utils4KST.normalizeFrequencyString(".300.20", new SimpleStringProperty("144")));
System.out.println(i++ + ": " + Utils4KST.normalizeFrequencyString("1296.300", new SimpleStringProperty("144")));
System.out.println(i++ + ": " + Utils4KST.normalizeFrequencyString("1296,300", new SimpleStringProperty("144")));
System.out.println(i++ + ": " + Utils4KST.normalizeFrequencyString("1296.300.2", new SimpleStringProperty("144")));
System.out.println(i++ + ": " + Utils4KST.normalizeFrequencyString("1296.300.20", new SimpleStringProperty("144")));
System.out.println(i++ + ": " + Utils4KST.normalizeFrequencyString("1296,300,2", new SimpleStringProperty("144")));
System.out.println(i++ + ": " + Utils4KST.normalizeFrequencyString("1296,300,20", new SimpleStringProperty("144")));
System.out.println(i++ + ": " + Utils4KST.normalizeFrequencyString("1296.300,2", new SimpleStringProperty("144")));
System.out.println(i++ + ": " + Utils4KST.normalizeFrequencyString("1296,300.2", new SimpleStringProperty("144")));
System.out.println(i++ + ": " + Utils4KST.normalizeFrequencyString("q305", new SimpleStringProperty("144")));
}
}

View File

@@ -4,9 +4,12 @@ import kst4contest.controller.ChatController;
import kst4contest.model.ChatMember; import kst4contest.model.ChatMember;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class GuiUtils { public class GuiUtils {
private static final String PTRN_CALLSIGNSYNTAX = "^(?:[A-Z]{1,2}[0-9]|[0-9][A-Z])[0-9A-Z]{1,3}$";
/** /**
* Checks wheter the input value of the String is numeric or not, true if yes * Checks wheter the input value of the String is numeric or not, true if yes
* TODO: Move to a utils class for checking input values by user... * TODO: Move to a utils class for checking input values by user...
@@ -17,6 +20,27 @@ public class GuiUtils {
return str != null && str.matches("[0-9.]+"); return str != null && str.matches("[0-9.]+");
} }
/**
* Checks wheter the given String has a HAM radio callsign syntax or not
* @param maybeCallSignValue
* @return true if yes
*/
static boolean isCallSignSyntax(String maybeCallSignValue) {
Pattern pattern = Pattern.compile(PTRN_CALLSIGNSYNTAX, Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(maybeCallSignValue);
try {
if (matcher.find()) {
return true;
}
else return false;
} catch (Exception exc) {
return false;
}
}
public static void triggerGUIFilteredChatMemberListChange(ChatController chatController) { public static void triggerGUIFilteredChatMemberListChange(ChatController chatController) {

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,154 @@
.button:pressed {
-fx-border-color: #ff0000;
}
.button:hover {
-fx-border-color: #ff7777;
}
.toggle-button:selected {
-fx-background-color:linear-gradient(#f0ff35, #a9ff00),
radial-gradient(center 50% -40%, radius 200%, #b8ee36 45%, #80c800 50%);
-fx-background-radius: 6, 5;
-fx-background-insets: 0, 1;
-fx-effect: dropshadow( three-pass-box , rgba(0,0,0,0.4) , 5, 0.0 , 0 , 1 );
-fx-text-fill: #395306;
}
.text-field {
-fx-prompt-text-fill: black;
}
.text-field .text {
-fx-fill: linear-gradient(from 0% 0% to 100% 200%, green 0%, lightgreen 100%);
-fx-stroke: green;
-fx-stroke-width: 0.2;
-fx-font-size: 25px;
}
.text-input-MYQRG1 {
-fx-text-fill: linear-gradient(from 0% 0% to 100% 200%, orange 0%, red 100%);
-fx-font-weight: 300;
}
.button{
-fx-focus-traversable: false;
}
.button:hover{
-fx-text-fill: linear-gradient(from 0% 0% to 100% 200%, blue 0%, red 100%);
}
.button:hover {
-fx-background-color:linear-gradient(#f0ff35, #a9ff00),
radial-gradient(center 50% -40%, radius 200%, lightblue 45%, orange 50%);
-fx-background-radius: 6, 5;
-fx-background-insets: 0, 1;
-fx-effect: dropshadow( three-pass-box , rgba(0,0,0,0.4) , 5, 0.0 , 0 , 1 );
-fx-text-fill: #395306;
}
.buttonMyQrg1 {
-fx-background-color: linear-gradient(from 0% 0% to 100% 200%, #00ffff 0%, #ff99ff 100%);
-fx-background-radius: 6, 5;
-fx-background-insets: 0, 1;
-fx-effect: dropshadow( three-pass-box , rgba(0,0,0,0.4) , 5, 0.0 , 0 , 1 );
-fx-text-fill: #395306;
}
.toggle-button:selected {
-fx-background-color: linear-gradient(from 0% 0% to 100% 200%, #00ffff 0%, #ff99ff 100%);
-fx-background-radius: 6, 5;
-fx-background-insets: 0, 1;
-fx-effect: dropshadow( three-pass-box , rgba(0,0,0,0.4) , 5, 0.0 , 0 , 1 );
-fx-text-fill: #395306;
}
.table-view .column-header .text {
-fx-fill: linear-gradient(from 0% 0% to 100% 200%, repeat, black 0%, red 50%);
-fx-stroke: black;
-fx-stroke-width: 0.3;
}
.table-view .column-header .label{
-fx-alignment: CENTER_LEFT;
-fx-font-weight: none;
}
.table-row-cell > .defaultText-column {
-fx-text-fill: black;
-fx-background-insets: 0 0 1 0px;
-fx-selection-bar-non-focused: derive(-fx-base, 50%);
}
.table-row-cell > .messageToMe-column {
-fx-text-fill: green;
-fx-background-insets: 0 0 1 0px;
-fx-selection-bar-non-focused: derive(-fx-base, 50%);
}
.messageHighlightOwn-column { /*PM own message*/
-fx-background-color: #00ffff;
-fx-background-insets: 0 0 1 0px;
-fx-text-fill: black;
-fx-selection-bar-non-focused: derive(-fx-base, 50%);
}
.messageHighlight30-column { /*PM for 30 sec: works*/
-fx-text-fill: black;
-fx-background-color: #33cc33;
-fx-selection-bar-non-focused: derive(-fx-base, 50%);
}
.messageHighlight60-column { /*PM for 30 sec: works*/
-fx-text-fill: black;
-fx-background-color: #40bf40;
-fx-selection-bar-non-focused: derive(-fx-base, 50%);
}
.messageHighlight90-column { /*PM for 30 sec: works*/
-fx-text-fill: black;
-fx-background-color: #4db34d;
-fx-selection-bar-non-focused: derive(-fx-base, 50%);
}
.messageHighlight120-column { /*PM for 30 sec: works*/
-fx-text-fill: black;
-fx-background-color: #59a659;
-fx-selection-bar-non-focused: derive(-fx-base, 50%);
}
.messageHighlight180-column { /*PM for 30 sec: works*/
-fx-text-fill: black;
-fx-background-color: #669966;
-fx-selection-bar-non-focused: derive(-fx-base, 50%);
}
.messageHighlight300-column { /*PM for 30 sec: works*/
-fx-text-fill: black;
-fx-background-color: #738c73;
-fx-selection-bar-non-focused: derive(-fx-base, 50%);
}
.table-cell-bold {
-fx-font-weight: bold;
}
.table-cell-inAngleAndRange {
-fx-text-fill: green;
-fx-font-weight: bold;
}
.table-cell-100PercentAP { /*GEHT*/
-fx-text-fill: linear-gradient(from 0% 0% to 100% 200%, #f98aff 0%, #f98aff 100%); /*purple*/;
-fx-font-weight: bold;
}
.table-cell-75PercentAP { /*GEHT*/
-fx-text-fill: #fa6666;
-fx-font-weight: bold;
}
.table-cell-50PercentAP {
-fx-text-fill: #fa9f66;
-fx-font-weight: bold;
}

View File

@@ -0,0 +1,192 @@
.root {
-fx-accent: #1e74c6;
-fx-focus-color: -fx-accent;
-fx-base: #373e43;
-fx-control-inner-background: derive(-fx-base, 35%);
-fx-control-inner-background-alt: -fx-control-inner-background ;
}
.label{
-fx-text-fill: lightgray;
}
.label-callSignChatCatDescriptor {
-fx-font-family: "Arial";
-fx-font-size: 18px;
-fx-text-fill: linear-gradient(from 0% 0% to 100% 200%, green 0%, lightgreen 100%);
-fx-alignment: center;
}
.text-field {
-fx-prompt-text-fill: gray;
}
.text-field .text {
-fx-fill: linear-gradient(from 0% 0% to 100% 200%, green 0%, lightgreen 100%);
-fx-stroke: green;
-fx-stroke-width: 0.2;
-fx-font-size: 25px;
}
.text-input-MYQRG1 {
-fx-text-fill: linear-gradient(from 0% 0% to 100% 200%, #f98aff 0%, #f98aff 100%); /*purple*/
}
.titulo{
-fx-font-weight: bold;
-fx-font-size: 18px;
}
.button{
-fx-focus-traversable: false;
}
.button:hover{
-fx-text-fill: white;
}
.separator *.line {
-fx-background-color: #3C3C3C;
-fx-border-style: solid;
-fx-border-width: 1px;
}
.scroll-bar{
-fx-background-color: derive(-fx-base,45%)
}
.button:default {
-fx-base: -fx-accent ;
-fx-font-weight: bold;
}
.button:pressed {
-fx-border-color: #ff0000;
}
.button:hover {
-fx-background-color:linear-gradient(#f0ff35, #a9ff00),
radial-gradient(center 50% -40%, radius 200%, #b8ee36 45%, #80c800 50%);
-fx-background-radius: 6, 5;
-fx-background-insets: 0, 1;
-fx-effect: dropshadow( three-pass-box , rgba(0,0,0,0.4) , 5, 0.0 , 0 , 1 );
-fx-text-fill: #395306;
}
.buttonMyQrg1 {
-fx-background-color: linear-gradient(from 0% 0% to 100% 200%, green 0%, lightgreen 100%);
-fx-background-radius: 6, 5;
-fx-background-insets: 0, 1;
-fx-effect: dropshadow( three-pass-box , rgba(0,0,0,0.4) , 5, 0.0 , 0 , 1 );
-fx-text-fill: #395306;
}
.toggle-button:selected {
-fx-background-color:linear-gradient(#f0ff35, #a9ff00),
radial-gradient(center 50% -40%, radius 200%, #b8ee36 45%, #80c800 50%);
-fx-background-radius: 6, 5;
-fx-background-insets: 0, 1;
-fx-effect: dropshadow( three-pass-box , rgba(0,0,0,0.4) , 5, 0.0 , 0 , 1 );
-fx-text-fill: #395306;
}
.table-view .column-header {
-fx-background-color: linear-gradient(to right, #373838, #373838);
}
.table-view .column-header .text {
-fx-fill: linear-gradient(from 0% 0% to 100% 200%, repeat, green 0%, lightgreen 50%);
-fx-stroke: green;
-fx-stroke-width: 0.2;
}
.table-view{
/*-fx-background-color: derive(-fx-base, 10%);*/
-fx-selection-bar-non-focused: derive(-fx-base, 50%);
}
.table-view .column-header .label{
-fx-alignment: CENTER_LEFT;
-fx-font-weight: none;
}
.table-row-cell > .defaultText-column {
-fx-text-fill: white;
-fx-background-insets: 0 0 1 0px;
-fx-selection-bar-non-focused: derive(-fx-base, 50%);
}
.table-row-cell > .messageToMe-column {
-fx-text-fill: lightgreen;
-fx-background-insets: 0 0 1 0px;
-fx-selection-bar-non-focused: derive(-fx-base, 50%);
}
.messageHighlightOwn-column { /*PM own message*/
-fx-background-color: #4674b9;
-fx-background-insets: 0 0 1 0px;
-fx-text-fill: white;
-fx-selection-bar-non-focused: derive(-fx-base, 50%);
}
.messageHighlight30-column { /*PM for 30 sec: works*/
-fx-text-fill: white;
-fx-background-color: #33cc33;
-fx-selection-bar-non-focused: derive(-fx-base, 50%);
}
.messageHighlight60-column { /*PM for 30 sec: works*/
-fx-text-fill: white;
-fx-background-color: #40bf40;
-fx-selection-bar-non-focused: derive(-fx-base, 50%);
}
.messageHighlight90-column { /*PM for 30 sec: works*/
-fx-text-fill: white;
-fx-background-color: #4db34d;
-fx-selection-bar-non-focused: derive(-fx-base, 50%);
}
.messageHighlight120-column { /*PM for 30 sec: works*/
-fx-text-fill: white;
-fx-background-color: #59a659;
-fx-selection-bar-non-focused: derive(-fx-base, 50%);
}
.messageHighlight180-column { /*PM for 30 sec: works*/
-fx-text-fill: white;
-fx-background-color: #669966;
-fx-selection-bar-non-focused: derive(-fx-base, 50%);
}
.messageHighlight300-column { /*PM for 30 sec: works*/
-fx-text-fill: white;
-fx-background-color: #738c73;
-fx-selection-bar-non-focused: derive(-fx-base, 50%);
}
.table-cell-bold {
-fx-font-weight: bold;
}
.table-cell-inAngleAndRange {
-fx-text-fill: lightgreen;
-fx-font-weight: bold;
}
.table-cell-100PercentAP { /*GEHT*/
-fx-text-fill: linear-gradient(from 0% 0% to 100% 200%, #f98aff 0%, #f98aff 100%); /*purple*/;
-fx-font-weight: bold;
}
.table-cell-75PercentAP { /*GEHT*/
-fx-text-fill: #fa6666;
-fx-font-weight: bold;
}
.table-cell-50PercentAP {
-fx-text-fill: #fa9f66;
-fx-font-weight: bold;
}

View File

@@ -0,0 +1,125 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<praktiKST>
<station>
<LoginCallSign>DO5AMF</LoginCallSign>
<LoginPassword>changeMe</LoginPassword>
<LoginDisplayedName>KST4Contest</LoginDisplayedName>
<LoginLocator>JO51IJ</LoginLocator>
<ChatCategory>2</ChatCategory>
<stn_antennaBeamWidthDeg>50.0</stn_antennaBeamWidthDeg>
<stn_maxQRBDefault>900.0</stn_maxQRBDefault>
<stn_qtfDefault>135.0</stn_qtfDefault>
<stn_bandActive144>true</stn_bandActive144>
<stn_bandActive432>true</stn_bandActive432>
<stn_bandActive1240>false</stn_bandActive1240>
<stn_bandActive2300>false</stn_bandActive2300>
<stn_bandActive3400>false</stn_bandActive3400>
<stn_bandActive5600>false</stn_bandActive5600>
<stn_bandActive10G>false</stn_bandActive10G>
</station>
<logsynch>
<logsynch_fileBasedWkdCallInterpreterFileNameReadOnly>SimpleLogFile.txt</logsynch_fileBasedWkdCallInterpreterFileNameReadOnly>
<logsynch_storeWorkedCallSignsFileNameUDPMessageBackup>udpReaderBackup.txt</logsynch_storeWorkedCallSignsFileNameUDPMessageBackup>
<logsynch_fileBasedWkdCallInterpreterEnabled>true</logsynch_fileBasedWkdCallInterpreterEnabled>
<logsynch_ucxUDPWkdCallListenerPort>12060</logsynch_ucxUDPWkdCallListenerPort>
<logsynch_ucxUDPWkdCallListenerEnabled>true</logsynch_ucxUDPWkdCallListenerEnabled>
</logsynch>
<trxSynchUCX>
<trxSynch_ucxLogUDPListenerEnabled>true</trxSynch_ucxLogUDPListenerEnabled>
<trxSynch_defaultMYQRGValue>144.374.50</trxSynch_defaultMYQRGValue>
</trxSynchUCX>
<AirScoutQuerier>
<asQry_airScoutCommunicationEnabled>true</asQry_airScoutCommunicationEnabled>
<asQry_airScoutServerName>KST</asQry_airScoutServerName>
<asQry_airScoutClientName>KST</asQry_airScoutClientName>
<asQry_airScoutUDPPort>9872</asQry_airScoutUDPPort>
<asQry_airScoutBandValue>1440000</asQry_airScoutBandValue>
</AirScoutQuerier>
<notifications>
<notify_SimpleAudioNotificationsEnabled>true</notify_SimpleAudioNotificationsEnabled>
<notify_CWCallsignAudioNotificationsEnabled>true</notify_CWCallsignAudioNotificationsEnabled>
<notify_VoiceCallsignAudioNotificationsEnabled>true</notify_VoiceCallsignAudioNotificationsEnabled>
</notifications>
<shortCuts>
<t>Hi OM,</t>
<t>pse</t>
<t>turn</t>
<t>ant</t>
<t>my</t>
<t>dir</t>
<t>sked</t>
<t>ssb</t>
<t>cw</t>
<t>try</t>
<t>agn</t>
<t>nw</t>
<t>qrg</t>
<t>beaming</t>
<t>calling</t>
<t>lsn to</t>
<t>qsb</t>
<t>rpt</t>
<t>nr</t>
<t>ur</t>
<t>I</t>
<t>hear</t>
<t>you</t>
<t>weak</t>
<t>nil, sry</t>
<t>maybe</t>
<t>later</t>
<t>tmw</t>
<t>rrr</t>
<t>tnx</t>
<t>qso</t>
<t>73</t>
<t>?</t>
<t>!</t>
<t>,</t>
<t>/SETNAME MYQRG</t>
<t>MYQRG</t>
</shortCuts>
<textSnippets>
<t>Hi QRZNAME, try sked 2m? Ur QRG?</t>
<t>try? FIRSTAP, pse lsn MYQRGSHORT</t>
<t>maybe we need AP. FIRSTAP SECONDAP</t>
<t>I am calling cq to ur dir, pse lsn to MYLOCATOR at MYQRG</t>
<t>pse ur qrg?</t>
<t>rrr, I move to your qrg nw, pse ant dir MYLOCATOR</t>
<t>Hrd you but many qrm here, pse agn</t>
<t>I turn my ant to you now</t>
<t>Sry, strong qrm by local station, may try MYQRG</t>
<t>Sry, in qso nw, pse qrx, I will meep you</t>
<t>Ur ant my dir MYLOCATOR nw?</t>
<t>QRZNAME pse ant dir MYLOCATORSHORT</t>
<t>No cw op here, pse can we use ssb?</t>
<t>No chance in ssb, can we use cw?</t>
<t>Nil till now, are you calling?</t>
<t>Nil here, tnx try, maybe later!</t>
<t>Nil, I will look for an ap and meep you then</t>
<t>There will be an AP in </t>
<t>Tnx fb qso, all ok, 73 es gl!</t>
</textSnippets>
<beaconCQ>
<beaconCQText>_.~'"´"'~.__.~'´ CQ CQ CQ de MYCALL, pse call us at MYQRG `'~.__.~'"`"'~._</beaconCQText>
<beaconCQIntervalMinutes>5</beaconCQIntervalMinutes>
<beaconCQEnabled>false</beaconCQEnabled>
</beaconCQ>
<beaconUnworkedstations>
<beaconUnworkedstationsText>Hi OM, pse Sked at MYQRG or your QRG</beaconUnworkedstationsText>
<beaconUnworkedstationsIntervalMinutes>20</beaconUnworkedstationsIntervalMinutes>
<beaconUnworkedstationsEnabled>false</beaconUnworkedstationsEnabled>
<beaconUnworkedstationsPrefix>OE</beaconUnworkedstationsPrefix>
</beaconUnworkedstations>
<guiOptions>
<GUIscn_ChatwindowMainSceneSizeHW>748.0;1544.800048828125</GUIscn_ChatwindowMainSceneSizeHW>
<GUIclusterAndQSOMonStage_SceneSizeHW>765.5999755859375;467.20001220703125</GUIclusterAndQSOMonStage_SceneSizeHW>
<GUIstage_updateStage_SceneSizeHW>640.0;480.0</GUIstage_updateStage_SceneSizeHW>
<GUIsettingsStageSceneSizeHW>720.0;768.0</GUIsettingsStageSceneSizeHW>
<GUIselectedCallSignSplitPane_dividerposition>0.5120192307692308</GUIselectedCallSignSplitPane_dividerposition>
<GUImainWindowLeftSplitPane_dividerposition>0.5046632124352332</GUImainWindowLeftSplitPane_dividerposition>
<GUImessageSectionSplitpane_dividerposition>0.5102549889135255;0.5934035476718403;0.6377494456762749</GUImessageSectionSplitpane_dividerposition>
<GUImainWindowRightSplitPane_dividerposition>0.74029933481153</GUImainWindowRightSplitPane_dividerposition>
<GUIpnl_directedMSGWin_dividerpositionDefault>0.09707903525548366</GUIpnl_directedMSGWin_dividerpositionDefault>
</guiOptions>
</praktiKST>

View File

@@ -3,15 +3,18 @@
<station> <station>
<LoginCallSign>DO5AMF</LoginCallSign> <LoginCallSign>DO5AMF</LoginCallSign>
<LoginPassword>changeMe</LoginPassword> <LoginPassword>changeMe</LoginPassword>
<LoginDisplayedName>KST4Contest</LoginDisplayedName> <LoginDisplayedName>KST4Contest1263</LoginDisplayedName>
<LoginLocator>JO51IJ</LoginLocator> <stn_loginNameSecondCat>KST4Contest1263</stn_loginNameSecondCat>
<LoginLocator>JO54ME</LoginLocator>
<ChatCategory>2</ChatCategory> <ChatCategory>2</ChatCategory>
<stn_antennaBeamWidthDeg>50.0</stn_antennaBeamWidthDeg> <ChatCategorySecond>3</ChatCategorySecond>
<stn_maxQRBDefault>900.0</stn_maxQRBDefault> <stn_secondCatEnabled>true</stn_secondCatEnabled>
<stn_antennaBeamWidthDeg>60.0</stn_antennaBeamWidthDeg>
<stn_maxQRBDefault>1333.0</stn_maxQRBDefault>
<stn_qtfDefault>135.0</stn_qtfDefault> <stn_qtfDefault>135.0</stn_qtfDefault>
<stn_bandActive144>true</stn_bandActive144> <stn_bandActive144>true</stn_bandActive144>
<stn_bandActive432>true</stn_bandActive432> <stn_bandActive432>true</stn_bandActive432>
<stn_bandActive1240>false</stn_bandActive1240> <stn_bandActive1240>true</stn_bandActive1240>
<stn_bandActive2300>false</stn_bandActive2300> <stn_bandActive2300>false</stn_bandActive2300>
<stn_bandActive3400>false</stn_bandActive3400> <stn_bandActive3400>false</stn_bandActive3400>
<stn_bandActive5600>false</stn_bandActive5600> <stn_bandActive5600>false</stn_bandActive5600>
@@ -26,11 +29,11 @@
</logsynch> </logsynch>
<trxSynchUCX> <trxSynchUCX>
<trxSynch_ucxLogUDPListenerEnabled>true</trxSynch_ucxLogUDPListenerEnabled> <trxSynch_ucxLogUDPListenerEnabled>true</trxSynch_ucxLogUDPListenerEnabled>
<trxSynch_defaultMYQRGValue>144.374.50</trxSynch_defaultMYQRGValue> <trxSynch_defaultMYQRGValue>144.123.00</trxSynch_defaultMYQRGValue>
</trxSynchUCX> </trxSynchUCX>
<AirScoutQuerier> <AirScoutQuerier>
<asQry_airScoutCommunicationEnabled>true</asQry_airScoutCommunicationEnabled> <asQry_airScoutCommunicationEnabled>true</asQry_airScoutCommunicationEnabled>
<asQry_airScoutServerName>KST</asQry_airScoutServerName> <asQry_airScoutServerName>AS</asQry_airScoutServerName>
<asQry_airScoutClientName>KST</asQry_airScoutClientName> <asQry_airScoutClientName>KST</asQry_airScoutClientName>
<asQry_airScoutUDPPort>9872</asQry_airScoutUDPPort> <asQry_airScoutUDPPort>9872</asQry_airScoutUDPPort>
<asQry_airScoutBandValue>1440000</asQry_airScoutBandValue> <asQry_airScoutBandValue>1440000</asQry_airScoutBandValue>
@@ -39,13 +42,17 @@
<notify_SimpleAudioNotificationsEnabled>true</notify_SimpleAudioNotificationsEnabled> <notify_SimpleAudioNotificationsEnabled>true</notify_SimpleAudioNotificationsEnabled>
<notify_CWCallsignAudioNotificationsEnabled>true</notify_CWCallsignAudioNotificationsEnabled> <notify_CWCallsignAudioNotificationsEnabled>true</notify_CWCallsignAudioNotificationsEnabled>
<notify_VoiceCallsignAudioNotificationsEnabled>true</notify_VoiceCallsignAudioNotificationsEnabled> <notify_VoiceCallsignAudioNotificationsEnabled>true</notify_VoiceCallsignAudioNotificationsEnabled>
<notify_dxClusterServerEnabled>true</notify_dxClusterServerEnabled>
<notify_DXClusterServerTriggerBearing>false</notify_DXClusterServerTriggerBearing>
<notify_DXClusterServerTriggerOnQRGDetect>false</notify_DXClusterServerTriggerOnQRGDetect>
<notify_dxclusterServerPort>8000</notify_dxclusterServerPort>
<notify_optionalFrequencyPrefix>432</notify_optionalFrequencyPrefix>
<notify_DXCSrv_SpottersCallSign>DO5AMF</notify_DXCSrv_SpottersCallSign>
</notifications> </notifications>
<shortCuts> <shortCuts>
<t>Hi OM,</t> <t>Hi OM, try Sked? FIRSTAP</t>
<t>pse</t> <t>TNX qso, 73!</t>
<t>turn</t> <t>turn</t>
<t>ant</t>
<t>my</t>
<t>dir</t> <t>dir</t>
<t>sked</t> <t>sked</t>
<t>ssb</t> <t>ssb</t>
@@ -78,6 +85,7 @@
<t>,</t> <t>,</t>
<t>/SETNAME MYQRG</t> <t>/SETNAME MYQRG</t>
<t>MYQRG</t> <t>MYQRG</t>
<t>SECONDQRG</t>
</shortCuts> </shortCuts>
<textSnippets> <textSnippets>
<t>Hi QRZNAME, try sked 2m? Ur QRG?</t> <t>Hi QRZNAME, try sked 2m? Ur QRG?</t>
@@ -101,9 +109,12 @@
<t>Tnx fb qso, all ok, 73 es gl!</t> <t>Tnx fb qso, all ok, 73 es gl!</t>
</textSnippets> </textSnippets>
<beaconCQ> <beaconCQ>
<beaconCQText>_.~'"´"'~.__.~'´ CQ CQ CQ de MYCALL, pse call us at MYQRG `'~.__.~'"`"'~._</beaconCQText> <beaconCQText>_.~'"´"'~.__.~'´ CQ CQ CQ NAC de MYCALL, pse try 144.317 for JO54 `'~.__.~'"`"'~._</beaconCQText>
<beaconCQIntervalMinutes>5</beaconCQIntervalMinutes> <beaconCQIntervalMinutes>1</beaconCQIntervalMinutes>
<beaconCQEnabled>false</beaconCQEnabled> <beaconCQEnabled>false</beaconCQEnabled>
<beaconCQTextSecondText>_.~'"´"'~.__.~'´ CQ CQ CQ de MYCALL, pse sked or SECONDQRG `'~.__.~'"`"'~._</beaconCQTextSecondText>
<beaconCQIntervalMinutesSecondCat>3</beaconCQIntervalMinutesSecondCat>
<beaconCQEnabledSecondCat>false</beaconCQEnabledSecondCat>
</beaconCQ> </beaconCQ>
<beaconUnworkedstations> <beaconUnworkedstations>
<beaconUnworkedstationsText>Hi OM, pse Sked at MYQRG or your QRG</beaconUnworkedstationsText> <beaconUnworkedstationsText>Hi OM, pse Sked at MYQRG or your QRG</beaconUnworkedstationsText>
@@ -111,15 +122,28 @@
<beaconUnworkedstationsEnabled>false</beaconUnworkedstationsEnabled> <beaconUnworkedstationsEnabled>false</beaconUnworkedstationsEnabled>
<beaconUnworkedstationsPrefix>OE</beaconUnworkedstationsPrefix> <beaconUnworkedstationsPrefix>OE</beaconUnworkedstationsPrefix>
</beaconUnworkedstations> </beaconUnworkedstations>
<messageHandling>
<autoAnswerText>Hi, sry I am not qrv, just testing new features of KST4Contest 1.25</autoAnswerText>
<autoAnswerEnabled>false</autoAnswerEnabled>
<autoAnswerTextSecondCat>Hi, sry I am not qrv, just testing new features of KST4Contest 1.251</autoAnswerTextSecondCat>
<autoAnswerEnabledSecondCat>false</autoAnswerEnabledSecondCat>
<autoAnswerToQrgRequestEnabled>true</autoAnswerToQrgRequestEnabled>
</messageHandling>
<guiSaveableOptions>
<guiOptions_defaultFilterNothing>false</guiOptions_defaultFilterNothing>
<guiOptions_defaultFilterPmToMe>true</guiOptions_defaultFilterPmToMe>
<guiOptions_defaultFilterPmToOther>false</guiOptions_defaultFilterPmToOther>
<guiOptions_defaultFilterPublicMsgs>false</guiOptions_defaultFilterPublicMsgs>
</guiSaveableOptions>
<guiOptions> <guiOptions>
<GUIscn_ChatwindowMainSceneSizeHW>748.0;1544.800048828125</GUIscn_ChatwindowMainSceneSizeHW> <GUIscn_ChatwindowMainSceneSizeHW>1080.800048828125;2048.0</GUIscn_ChatwindowMainSceneSizeHW>
<GUIclusterAndQSOMonStage_SceneSizeHW>765.5999755859375;467.20001220703125</GUIclusterAndQSOMonStage_SceneSizeHW> <GUIclusterAndQSOMonStage_SceneSizeHW>1196.800048828125;259.20001220703125</GUIclusterAndQSOMonStage_SceneSizeHW>
<GUIstage_updateStage_SceneSizeHW>640.0;480.0</GUIstage_updateStage_SceneSizeHW> <GUIstage_updateStage_SceneSizeHW>640.0;480.0</GUIstage_updateStage_SceneSizeHW>
<GUIsettingsStageSceneSizeHW>720.0;768.0</GUIsettingsStageSceneSizeHW> <GUIsettingsStageSceneSizeHW>720.0;768.0</GUIsettingsStageSceneSizeHW>
<GUIselectedCallSignSplitPane_dividerposition>0.5120192307692308</GUIselectedCallSignSplitPane_dividerposition> <GUIselectedCallSignSplitPane_dividerposition>0.5154494382022472</GUIselectedCallSignSplitPane_dividerposition>
<GUImainWindowLeftSplitPane_dividerposition>0.5046632124352332</GUImainWindowLeftSplitPane_dividerposition> <GUImainWindowLeftSplitPane_dividerposition>0.45846364347146207</GUImainWindowLeftSplitPane_dividerposition>
<GUImessageSectionSplitpane_dividerposition>0.5102549889135255;0.5934035476718403;0.6377494456762749</GUImessageSectionSplitpane_dividerposition> <GUImessageSectionSplitpane_dividerposition>0.5284522003034902;0.5853566009104704;0.6157056145675266</GUImessageSectionSplitpane_dividerposition>
<GUImainWindowRightSplitPane_dividerposition>0.74029933481153</GUImainWindowRightSplitPane_dividerposition> <GUImainWindowRightSplitPane_dividerposition>0.5749241274658573</GUImainWindowRightSplitPane_dividerposition>
<GUIpnl_directedMSGWin_dividerpositionDefault>0.09707903525548366</GUIpnl_directedMSGWin_dividerpositionDefault> <GUIpnl_directedMSGWin_dividerpositionDefault>0.1754658301944221</GUIpnl_directedMSGWin_dividerpositionDefault>
</guiOptions> </guiOptions>
</praktiKST> </praktiKST>

View File

@@ -1117,3 +1117,667 @@ F1GTU;Daniel - 2M/70CM;JN05IE;StringProperty [value: null];true;true;false;false
IZ5EME;Marco 10elm QRO;JN52NS;StringProperty [value: null];true;true;false;false;false;false;false;false IZ5EME;Marco 10elm QRO;JN52NS;StringProperty [value: null];true;true;false;false;false;false;false;false
OV3T;Thomas;JO46CM;StringProperty [value: null];true;true;false;false;false;false;false;false OV3T;Thomas;JO46CM;StringProperty [value: null];true;true;false;false;false;false;false;false
F5ICN;Alex QRV 2/70/23;JN03BF;StringProperty [value: null];true;true;false;false;false;false;false;false F5ICN;Alex QRV 2/70/23;JN03BF;StringProperty [value: null];true;true;false;false;false;false;false;false
DO5AMF;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL5ASG;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
G3M;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DM8AK;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DK2BO;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DK1FS;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL8LR;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DK1KC/P;Mike 144,163;JN58QH;StringProperty [value: null];true;true;false;false;false;false;false;false
OE5JSL;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DG2SER;Carsten 2m;JN58OH;StringProperty [value: null];true;true;false;false;false;false;false;false
DL2AKT;Jens;JO50NV;StringProperty [value: null];true;true;false;false;false;false;false;false
DF0SB/P;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DO1SRX;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DH1AKY/P;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DB7AD;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
ON4KHG;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL1SE;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL5ZK;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DK5KT;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DC8RI;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL5HQ;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DH1DX;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL6ZEJ;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DB3DY;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DH1WM;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DK5AJ;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL3LAR/P;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL0DLE;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL1EHG;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
ON8TT/P;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DF0RI;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
F4KIY/P;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DF2FA;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL0UM;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL2FQ;Tzetzo;JN49EW;StringProperty [value: null];true;true;false;false;false;false;false;false
DP6T;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DN4DI;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL1FKB;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DF7JU;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DH8GHH;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DK0ED;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL0SAT;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL4MW;Ralf 2m;JO50KQ;StringProperty [value: 292 ];true;true;false;false;false;false;false;false
OK5W;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL2NDL;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL2YDS;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DB1FLO;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DD6YR;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DJ2AX;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DF1ASG;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
HB9CLN;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
OK7O;144;JN69OU;StringProperty [value: 144.374 ];true;true;false;false;false;false;false;false
DM5B;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
OE5MRM/3;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DK6TW;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DJ2IE;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
OK1KCR;Big gun;JN79VS;StringProperty [value: 144.162 ];true;true;false;false;false;false;false;false
DK0CO;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DG7BBP;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
5P5T;Team;JO64GX;StringProperty [value: 265 ];true;true;false;false;false;false;false;false
OL9W;club 2m 1teh;JN99CL;StringProperty [value: 238 ];true;true;false;false;false;false;false;false
OE1W;TEAM 2M;JN77TX;StringProperty [value: 144333 ];true;true;false;false;false;false;false;false
DR7C;team 2m;JO50WB;StringProperty [value: 195 ];true;true;false;false;false;false;false;false
OK1KPA;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
OK4C;Klondajk;JO60LJ;StringProperty [value: 144.397 ];true;true;false;false;false;false;false;false
OL7M;QRO 1100asl;JO80FG;StringProperty [value: 144377 ];true;true;false;false;false;false;false;false
OL1C;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
OL3Z;QRO 2m;JN79FX;StringProperty [value: 144.286 ];true;true;false;false;false;false;false;false
DK0NA;144280.0;JO50TI;StringProperty [value: 280 ];true;true;false;false;false;false;false;false
S50C;Menina;JN76JG;StringProperty [value: 144.241 ];true;true;false;false;false;false;false;false
IO2V;Team 144;JN54WE;StringProperty [value: 144.219,9 ];true;true;false;false;false;false;false;false
OL4A;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
OL4N;club 2m;JO60VR;StringProperty [value: 144.213 ];true;true;false;false;false;false;false;false
DK0CWC;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
OK1KKD;Petr;JO60WD;StringProperty [value: null];true;true;false;false;false;false;false;false
ON5WU;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL8QS;Heiko;JO43KH;StringProperty [value: 322 ];true;true;false;false;false;false;false;false
ON6LL/P;La Louvière;JO20BL;StringProperty [value: 344 ];true;true;false;false;false;false;false;false
OK1RDO;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL3EAZ;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
PD1AHM;Hans (144 ssb);JO21WF;StringProperty [value: null];true;true;false;false;false;false;false;false
DL6NEJ;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL2MS;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DO7SBR;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DJ1OK;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DO1AYJ;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL6GCK;Konrad;JN47NR;StringProperty [value: 241 ];true;true;false;false;false;false;false;false
DK5TA;Thomas;JN68GI;StringProperty [value: null];true;true;false;false;false;false;false;false
DL0NF;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL1SUZ;Uwe 2m;JO53UN;StringProperty [value: null];true;true;false;false;false;false;false;false
DO7AGN;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
F4BIT;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DG3RAP;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DG0ONW;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
OK1RDO;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL9NDP/P;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL1RWO;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
F6KFH;radioclub;JN39UN;StringProperty [value: null];true;true;false;false;false;false;false;false
HB9IAB/P;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DK0BC;Team;JN48RN;StringProperty [value: null];true;true;false;false;false;false;false;false
DR5I;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DC6GF/P;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
OK1UEI;Aleksandar;JN79FV;StringProperty [value: 320 ];true;true;false;false;false;false;false;false
OL7K;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
S59DEM;RC Proteus;JN75DS;StringProperty [value: 144.328 ];true;true;false;false;false;false;false;false
DR9A;144.392;JN48EQ;StringProperty [value: 144392 ];true;true;false;false;false;false;false;false
S53O;ljubo 2m;JN86AT;StringProperty [value: 399 ];true;true;false;false;false;false;false;false
HB9GF;Funkclub;JN47BC;StringProperty [value: 385 ];true;true;false;false;false;false;false;false
OK2PVF;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DM5D;DM5D 2m-Team;JO61OC;StringProperty [value: 144.360 ];true;true;false;false;false;false;false;false
DF0WF;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL0HAL;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DH6DAO;Ray;JO41CN;StringProperty [value: null];true;true;false;false;false;false;false;false
DL6ZXG;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
OE5LJM/3;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL9MKA;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DM2BHG;Heinz;JO51MW;StringProperty [value: null];true;true;false;false;false;false;false;false
DJ2KP;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DG6ME;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DJ1OB;Olli - 2m;JN48UG;StringProperty [value: null];true;true;false;false;false;false;false;false
DK5IR;Jochen;JN49IC;StringProperty [value: 306 ];true;true;false;false;false;false;false;false
DL8SCQ;Ebi 2m 2x9;JN48RV;StringProperty [value: null];true;true;false;false;false;false;false;false
DF8KVK;Kurt 2m only;JN57MT;StringProperty [value: null];true;true;false;false;false;false;false;false
SP3PWL;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DN5PW/P;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL0GM;Team G07;JO31UB;StringProperty [value: 347 ];true;true;false;false;false;false;false;false
DL4DAW;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
OK1DCI;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL0TWK/P;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL0TWK/P;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL0WO;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL0AC;Weisser Stein 2m;JO30EJ;StringProperty [value: null];true;true;false;false;false;false;false;false
DL6SH;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DM7A;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DK2CB;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DK2LB;Torsten;JO53LQ;StringProperty [value: null];true;true;false;false;false;false;false;false
OE3FKS/P;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL0MA;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DK2TN;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL6CNG;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL8SYL/P;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL8SYL/P;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL6AA;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL3ZAE/P;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DB6JG;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
SP6CPF;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL9GRE;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL4ASK;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
SP2IPK;Edward;JO93LR;StringProperty [value: null];true;true;false;false;false;false;false;false
DF6LH/P;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
SP2FRY;Andrzej;JO83WR;StringProperty [value: 327,83 ];true;true;false;false;false;false;false;false
DJ8JA/P;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL5MO/P;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL0MOL;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DM7D;Ronald;JO62LI;StringProperty [value: null];true;true;false;false;false;false;false;false
DL2OCH;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL7ZN;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DD6OM;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DF4HA;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL2LBK;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DF2FQ;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DG0OGJ;Ragna 2m;JO50KQ;StringProperty [value: null];true;true;false;false;false;false;false;false
OK1RMR;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DG0OJO;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL7QX;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DH1PAL;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DK2TX;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DK1PZ;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL0VX/P;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL5SBY;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL4APJ;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DM7EE;Christian;JO52JJ;StringProperty [value: 144,063 ];true;true;false;false;false;false;false;false
DL0FT;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL2RM;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DO3BST;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DR5Y;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DF8V;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DJ5TM;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DJ6QS;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL8RB;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
F4JXS/P;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL5RGA;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DH2PA;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL4JC;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
IQ8BI;2m Test;JN63NJ;StringProperty [value: 075 ];true;true;false;false;false;false;false;false
DD3SF;Florian;JN39LF;StringProperty [value: null];true;true;false;false;false;false;false;false
DJ9MC;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DF0PU;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
HB9TTY;3x11Y 400W;JN37XG;StringProperty [value: null];true;true;false;false;false;false;false;false
DK0A;Club (1140m asl);JN48CO;StringProperty [value: null];true;true;false;false;false;false;false;false
OE5DIN;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
OK1GK;2m 17ele 500W;JO70FA;StringProperty [value: 372 ];true;true;false;false;false;false;false;false
DG0FE;Lothar;JO62UN;StringProperty [value: null];true;true;false;false;false;false;false;false
9A1AAY;RKNG;JN85PJ;StringProperty [value: 144.340 ];true;true;false;false;false;false;false;false
OM3CQF;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL3YDP;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
IU3CQP;Manu 4X9;JN65DM;StringProperty [value: 181 ];true;true;false;false;false;false;false;false
DK1LJ;Janin-2m;JN57MT;StringProperty [value: null];true;true;false;false;false;false;false;false
DG5DJ;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
HB9FAP;Fabio;JN47PH;StringProperty [value: 162 ];true;true;false;false;false;false;false;false
DL7MY/P;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DJ6OL;Ralf 2m-13cm/6cm;JO52AP;StringProperty [value: 210 ];true;true;false;false;false;false;false;false
OE5D;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
OR6T;Contest;JO20KV;StringProperty [value: 206 ];true;true;false;false;false;false;false;false
DL6DVU;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DF0LU;DF0LU;JO43UA;StringProperty [value: null];true;true;false;false;false;false;false;false
PA0WMX;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
IQ3XL;Club Ladinia;JN56UO;StringProperty [value: 285 ];true;true;false;false;false;false;false;false
DK5TI;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL1NUX;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
OL3Y;Club 2M;JN69KK;StringProperty [value: 200 ];true;true;false;false;false;false;false;false
DL7QX;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DK5EZ;George 70m only;JO31NH;StringProperty [value: 144.368 ];true;true;false;false;false;false;false;false
DP9X;Pom 144SSB;JO50MM;StringProperty [value: null];true;true;false;false;false;false;false;false
OK1MWW;Jiri 2m/70cm;JN89DW;StringProperty [value: 144.260 ];true;true;false;false;false;false;false;false
OK2KRT;Club 2m;JN99BK;StringProperty [value: 193 ];true;true;false;false;false;false;false;false
OK2L;Team 2m;JN99BN;StringProperty [value: 293 ];true;true;false;false;false;false;false;false
OK1KKI;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
OK2KCN;Club, 2m only;JN89OI;StringProperty [value: null];true;true;false;false;false;false;false;false
OK2BMJ;Milan only 2m;JN89UI;StringProperty [value: null];true;true;false;false;false;false;false;false
DK7NB;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DF0XX;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
SP3JZX;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DR1T;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
OK1KCB;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DM5F;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
OE3TFA;Thomas;JN78UQ;StringProperty [value: null];true;true;false;false;false;false;false;false
DF6FQ;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL1FAR;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL5SKH;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DD5JK;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL4YDR;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DF7QF;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
F1PHB;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DJ3ZF;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DJ3SN;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DF0HM;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DH6AD;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
F8CND/P;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DK0FC;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
PC5T;Crew;JO23KE;StringProperty [value: 237 ];true;true;false;false;false;false;false;false
OK1VSJ;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
OE2M;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL5DWF;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
SP1KZE;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
F4KJP/P;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL250CDF;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
F5JNX;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DF7DX;Daniel;JO42HJ;StringProperty [value: null];true;true;false;false;false;false;false;false
DL9DBF;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
G4PIQ;Andy .328 1kW 17;JO02OD;StringProperty [value: 164 ];true;true;false;false;false;false;false;false
TM6T;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL3ABL;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DR1H;144380;JN59OP;StringProperty [value: 144380 ];true;true;false;false;false;false;false;false
DO3HTV;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DB3LO;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
F4KLS;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
F4KLS;stef 2/70/23;JN25JU;StringProperty [value: null];true;true;false;false;false;false;false;false
DL1MWG;Markus 23cm;JN58VD;StringProperty [value: null];true;true;false;false;false;false;false;false
DR0X;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
F1TRE;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL0SWG;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
OE3CIN;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
S51IV;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DR5T;Marek;JN47KW;StringProperty [value: null];true;true;false;false;false;false;false;false
DL6KDS/P;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL1HSF;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
TM5R;Didier;JN19BQ;StringProperty [value: null];true;true;false;false;false;false;false;false
9A5Y;144.340.00;JN85RO;StringProperty [value: 340 ];true;true;false;false;false;false;false;false
IQ5NN;Monte Nerone;JN63GN;StringProperty [value: 144.097 ];true;true;false;false;false;false;false;false
DH1TW;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
OE5FPL;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL6MHW;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
9A2RD;Mario 432mhz;JN65TF;StringProperty [value: null];true;true;false;false;false;false;false;false
OK2O;club;JN89IW;StringProperty [value: 144344.9 ];true;true;false;false;false;false;false;false
DL0HTW;2m;JO60QU;StringProperty [value: null];true;true;false;false;false;false;false;false
OK1IME;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL5DCN;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
OM3KII;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DJ3AK;Detlef;JO52IJ;StringProperty [value: null];true;true;false;false;false;false;false;false
DO2LNJ;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
OM2Y;Jan;JN88RS;StringProperty [value: 144.169 ];true;true;false;false;false;false;false;false
SN7L;Team 144.180;JO70UR;StringProperty [value: 144.180 ];true;true;false;false;false;false;false;false
OK1KUO;club;JO80FF;StringProperty [value: null];true;true;false;false;false;false;false;false
DL4M;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
9A0BB;144320 BB Team;JN85EI;StringProperty [value: 144320 ];true;true;false;false;false;false;false;false
OL1R;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
SQ2SAT;2x9 QRO;JO83XG;StringProperty [value: 228 ];true;true;false;false;false;false;false;false
S59P;144.306;JN86AO;StringProperty [value: 144306,0 ];true;true;false;false;false;false;false;false
OK2KEA;Club 2m only;JN89EJ;StringProperty [value: 305.3 ];true;true;false;false;false;false;false;false
DL2LSM;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
OM6DN;2x12ele 950asl;JN99FI;StringProperty [value: 144.399 ];true;true;false;false;false;false;false;false
OK1NPF;Roman 2m SSB100W;JO70UK;StringProperty [value: 144.324 ];true;true;false;false;false;false;false;false
G2N;273;JO02QV;StringProperty [value: 082 ];true;true;false;false;false;false;false;false
S57GM;.;JN76CC;StringProperty [value: 360 ];true;true;false;false;false;false;false;false
OE5BGN;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
S54W;144.262;JN86DT;StringProperty [value: 144262 ];true;true;false;false;false;false;false;false
OK1AME;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
HA2R;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL0RN/P;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL1C;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
IK4GNG;Gibo;JN64FB;StringProperty [value: 222 ];true;true;false;false;false;false;false;false
OM3W;Club 2m;JN99CH;StringProperty [value: 144.059 ];true;true;false;false;false;false;false;false
OK1DT;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
TM9A;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DF0YY;club;JO62GD;StringProperty [value: 057 ];true;true;false;false;false;false;false;false
S53XX;Slavko;JN76GI;StringProperty [value: 093 ];true;true;false;false;false;false;false;false
OK2KYZ;Club 2 m;JO80NB;StringProperty [value: 144.188 ];true;true;false;false;false;false;false;false
IQ4KD;Monghidoro C.T 1;JN54PF;StringProperty [value: 144.105 ];true;true;false;false;false;false;false;false
F8KID;Club;JN38AT;StringProperty [value: 060 ];true;true;false;false;false;false;false;false
OK1KKP;Club 144.198;JO70DG;StringProperty [value: 042 ];true;true;false;false;false;false;false;false
DD5DX;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
OM2DT;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL2AAZ;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL2TXT;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
OK1KEL;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DJ8MS;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL3OCA;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DF1MM;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL2FFW;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL2BXC;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL4WK;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
OE5NNN/P;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
OK1ZDA;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL8SAM;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DG4MH;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DF3VM;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DK0XT/P;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DK0BN;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DK5WMA;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL6CWM;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DG9KB;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
PA3C;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL2AAK;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DG1HTQ;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DR5W;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL1HTL;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DO6NI;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
OK1RDO;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DG1RW;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL4SKF;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
OK1LN;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DJ9MH;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL9AAA/P;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
HB9AG;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DG9FBA;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DG1MH;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DG6OG;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL2HXE;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL2AQI/P;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
OK1KN;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL9FB;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL2BRW;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
OK1TRW;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DO1CS;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
OK1DEK;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
SM7EYW;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DH2UHE;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
OK1TN;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DM6AT;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DM1JS;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DM6EE;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DM2DXG;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL5HF;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL1ATI;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
OZ1JMN;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL7UDA;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL2BQC;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DM2EUN;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
SA7W;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DK0GUB;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL6MRA;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DO1JKO;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL5AWE;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL0HG;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL8MFL;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
F5JFU/P;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
F6GYH;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
F4JXX/P;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
F1DBE;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
HB9AHD;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DJ7GX;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
F6GTH;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL0TX;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DM3DG;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DJ6VX;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DO1XRK;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DK2PZ;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DF7WL;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL0MI;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL3IS;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL8FBX;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL6OA;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DA0FF;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
F6HMQ;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DO9PL;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL1DBR;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DK5WN;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
ON6LL/P;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL5FBC/P;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
OK2RAS;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DF5GO/P;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DO5NW;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DO1GPP;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DF8OI;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DM2BKB;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL1YEG;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DK5XL;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DB7SH;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DB0DH;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DF2BR;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DG8AB;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
SN1I;Team 2m;JO84CE;StringProperty [value: 305 ];true;true;false;false;false;false;false;false
SQ6POB;Marek;JO73XP;StringProperty [value: null];true;true;false;false;false;false;false;false
SP2AWJ;Wojtek;JO83XD;StringProperty [value: null];true;true;false;false;false;false;false;false
DF0TEC;Contest Crew;JO73CE;StringProperty [value: 305 ];true;true;false;false;false;false;false;false
DL5DRG;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DG5BRE;Ronny 2m-9cm;JO62VM;StringProperty [value: n273 ];true;true;false;false;false;false;false;false
SP7VVB;Maciek;JO91VQ;StringProperty [value: 163 ];true;true;false;false;false;false;false;false
DK7AM;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DF1DT;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DH8KV;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DF0AP;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
OL1Z;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
OK1PGS;Franta 2m;JN69RS;StringProperty [value: 194 ];true;true;false;false;false;false;false;false
DG4VW;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL2CBQ/P;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
G4ODA;Keith 144.217;IO92WS;StringProperty [value: 325 ];true;true;false;false;false;false;false;false
DF8XC;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DK9TF;Juergen .157;JO31NF;StringProperty [value: null];true;true;false;false;false;false;false;false
DK7AW;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL5JS;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL0WB;Club OV P36;JN48HH;StringProperty [value: null];true;true;false;false;false;false;false;false
DF0VK/P;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL2DBR;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL1BFR;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DF3TE;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL4MN;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DK5PD;Lothar 2m;JN39VV;StringProperty [value: null];true;true;false;false;false;false;false;false
DK0IL/P;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
OE9MON;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
HB9CQL;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DF4WO;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DK2WF;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL3BH;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DK6AC;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL2RZ;Volker;JO43WG;StringProperty [value: null];true;true;false;false;false;false;false;false
DM2VV;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL5ME;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL6AUI;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DR7B;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DG8LG;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DH3NAN;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DO1FDK;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DN3SY;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DR3K;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DG0LFG;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DG1YBN;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL4YR;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DK6QW;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
IN3BJX;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL7YS;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
SN6J;Club .253;JO71SA;StringProperty [value: null];true;true;false;false;false;false;false;false
OK2R;23-3 cm;JN89JM;StringProperty [value: null];true;true;false;false;false;false;false;false
DC5IMM;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
OL7C;Club 2m;JO60JJ;StringProperty [value: 144.207 ];true;true;false;false;false;false;false;false
OL2J;RK Jihlava;JN79TI;StringProperty [value: 144.087 ];true;true;false;false;false;false;false;false
OK1KKL;Club;JO70PO;StringProperty [value: 306 ];true;true;false;false;false;false;false;false
SP3YDE;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
OK1KEP;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
OM8A;Team;JN87WV;StringProperty [value: null];true;true;false;false;false;false;false;false
SP3QDM;Tom 2/70/23cm;JO82EF;StringProperty [value: null];true;true;false;false;false;false;false;false
HA6W;Contest group;KN08FB;StringProperty [value: 315 ];true;true;false;false;false;false;false;false
DF1ASG;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false
DL1NGS;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false
DA2T;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false
DK0NA;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false
DK0NA;unknown;unknown;StringProperty [value: null];true;false;false;true;false;false;false;false
DL9TU;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false
DG2SER;Carsten 2m;JN58OH;StringProperty [value: null];true;false;true;false;false;false;false;false
DD2D;Barney 70cm;JO50DO;StringProperty [value: null];true;false;true;false;false;false;false;false
DM5D;70cm-Team;JO61OC;StringProperty [value: null];true;false;true;false;false;false;false;false
DG0VOG;ONLY 432 !!!;JO60QU;StringProperty [value: 205 ];true;false;true;false;false;false;false;false
DR1T;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false
DK5AJ;unknown;unknown;StringProperty [value: null];true;false;false;true;false;false;false;false
DQ8N;unknown;unknown;StringProperty [value: null];true;false;false;true;false;false;false;false
DO1AYJ;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false
DR7B;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false
DK5AJ;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false
DM2CF;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false
DK4VW;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false
DL4MN;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false
DL6ZDS/P;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false
DJ9WJ/P;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false
DG6ME;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false
DR4M;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false
DF0WF;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false
OL1C;70cm QRO;JO60UQ;StringProperty [value: 265 ];true;false;true;false;false;false;false;false
DQ8N;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false
OK4C;Klondajk;JN79BU;StringProperty [value: 432.347 ];true;false;true;false;false;false;false;false
DL1SE;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false
DL6CWM;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false
OK2OAS;Club LP 70cm;JN89DO;StringProperty [value: 355 ];true;false;true;false;false;false;false;false
OK1KIY;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false
DL3ZAE/P;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false
DL0DLE;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false
DG5BRE;Ronny 2m-9cm;JO62VM;StringProperty [value: 432.250 ];true;false;true;false;false;false;false;false
DL3LAR;unknown;unknown;StringProperty [value: null];true;false;false;true;false;false;false;false
DD6ZJ;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false
DL3HXS;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false
OM6A;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false
S50C;Menina;JN76JG;StringProperty [value: 432.295 ];true;false;true;false;false;false;false;false
DL4ASK;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false
DD5DX;ALEX 2m;JO61CA;StringProperty [value: null];true;false;true;false;false;false;false;false
OK2L;Klubova;JN99BN;StringProperty [value: 245 ];true;false;true;false;false;false;false;false
DM5B;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false
DL5ZK;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false
DL7AFB;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false
OK5P;RC NOVA PAKA 70;JO70UK;StringProperty [value: 432.226 ];true;false;true;false;false;false;false;false
DA0M;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false
OK5Y;CLUB 70cm;JN79FV;StringProperty [value: 307 ];true;false;true;false;false;false;false;false
DL6AA;Sven 432 MHz;JO43JH;StringProperty [value: 303 ];true;false;true;false;false;false;false;false
OK2C;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false
DL3LAR;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false
DL9MKA;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false
DK5II;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false
DL2FFW;Frank 70cm;JO50LQ;StringProperty [value: null];true;false;true;false;false;false;false;false
OK1KAD;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false
DK5II;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false
DR7C;23cm;JO50WB;StringProperty [value: null];true;false;false;true;false;false;false;false
DR7C;23cm;JO50WB;StringProperty [value: null];true;false;false;true;false;false;false;false
DL5CAT;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false
DO1MLH;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false
DJ6JJ;Helmut(exDG9YIH);JO32OH;StringProperty [value: null];true;false;true;false;false;false;false;false
DK0TUI;unknown;unknown;StringProperty [value: null];true;false;false;true;false;false;false;false
DG0PF/P;unknown;unknown;StringProperty [value: null];true;false;false;true;false;false;false;false
DK5II;unknown;unknown;StringProperty [value: null];true;false;false;true;false;false;false;false
DF2AP;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false
DM5D;70cm-Team;JO61OC;StringProperty [value: null];true;false;true;true;false;false;false;false
DL6ON;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false
DB3LO;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false
DJ6QS;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false
DH2UAK;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false
DJ2NR;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false
DG0PF/P;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false
DG0LAD;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false
DR7C;23cm;JO50WB;StringProperty [value: 170 ];true;false;false;true;false;false;false;false
DR7C;23cm;JO50WB;StringProperty [value: 170 ];true;false;false;true;false;false;false;false
DR7C;23cm;JO50WB;StringProperty [value: 170 ];true;false;false;true;false;false;false;false
DR7C;23cm;JO50WB;StringProperty [value: 170 ];true;false;false;true;false;false;false;false
DK0OG;70cm 23el 500w;JN68GI;StringProperty [value: 432.365 ];true;false;true;false;false;false;false;false
OE3JPC;Hannes 70-23-13;JN87EW;StringProperty [value: 432365 ];true;false;true;false;false;false;false;false
DL2FQ;Tzetzo;JN49EW;StringProperty [value: 320 ];true;false;true;false;false;false;false;false
DG5NFF;unknown;unknown;StringProperty [value: null];true;false;false;true;false;false;false;false
OK2C;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false
OM3W;Club 70cm;JN99CH;StringProperty [value: 432.280 ];true;false;true;false;false;false;false;false
DL1AVF;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false
DM2EUN;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false
DL0HAL;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false
DL8NAS;Sigi-70cm;JN59LE;StringProperty [value: 265 ];true;false;true;false;false;false;false;false
DL2NBU;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false
DK2R;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false
DR7C;23cm;JO50WB;StringProperty [value: 170 ];true;false;true;true;false;false;false;false
OK1OPT;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false
DH1AKY/P;unknown;unknown;StringProperty [value: null];true;false;false;true;false;false;false;false
DR1T;unknown;unknown;StringProperty [value: null];true;false;false;true;false;false;false;false
DL5MO;Thomas 23-9;JO50JP;StringProperty [value: null];true;false;true;false;false;false;false;false
DL2LSM;Guenter;JO61GH;StringProperty [value: 180 ];true;false;true;false;false;false;false;false
DA0M;unknown;unknown;StringProperty [value: null];true;false;false;true;false;false;false;false
DO6NI;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false
OK1NI;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false
DF2FQ;Holger;JN58UB;StringProperty [value: 285 ];true;false;true;false;false;false;false;false
;unknown;unknown;StringProperty [value: null];true;false;false;true;false;false;false;false
OL3Z;QRO 70cm;JN79FX;StringProperty [value: 432210 ];true;false;true;false;false;false;false;false
OK1KCB;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false
DN5PW/P;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false
HB9P;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false
DL8LR;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false
DK5DQ;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false
DL4ZBG;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false
G3M;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false
DL0GM;Team G07;JO31UB;StringProperty [value: 432.215 ];true;false;true;false;false;false;false;false
DL8QS;Heiko;JO43KH;StringProperty [value: 175 ];true;false;true;false;false;false;false;false
DF4ZL;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false
OK1RDO;2m;JN69KL;StringProperty [value: null];true;false;true;false;false;false;false;false
OK6M;Martin;JN99CR;StringProperty [value: 325 ];true;false;true;false;false;false;false;false
DF0YY;Berlin.240;JO62GD;StringProperty [value: 240 ];true;false;true;false;false;false;false;false
VE3NNT;unknown;unknown;StringProperty [value: null];true;false;false;false;false;false;false;false
DD0VF;Steffen 2m/70/23;JO61TB;StringProperty [value: null];true;true;false;false;false;false;false;false
9A1I;Radio club;JN85FS;StringProperty [value: 360 ];true;true;false;false;false;false;false;false
F6HTJ;Michel;JN12KQ;StringProperty [value: null];true;true;false;false;false;false;false;false
F1NZC;Jean-Louis JN15;JN15MR;StringProperty [value: 263 ];true;true;false;false;false;false;false;false
F6CIS;Sylvain upto13cm;IN94WL;StringProperty [value: null];true;false;true;false;false;false;false;false
F6HZZ;Ric 2/70/23;JN23CP;StringProperty [value: 220 234 ];true;false;true;false;false;false;false;false
IK3SSG-432;Graziano;JN55XH;StringProperty [value: null];true;false;true;false;false;false;false;false
DF7KF;Dithmar;JO30FK;StringProperty [value: null];true;true;false;false;false;false;false;false
DL8YE;Chris;JO32TC;StringProperty [value: null];true;true;false;false;false;false;false;false
;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DL8YE;Chris;JO32TC;StringProperty [value: null];true;true;false;false;false;false;false;false
DM2M;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
F1NZC;Jean-Louis JN15;JN15MR;StringProperty [value: null];true;true;false;false;false;false;false;false
DF0BG;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DF0BG;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
DO5AMF;Marc;JN49FK;StringProperty [value: null];true;true;false;false;false;false;false;false
SM0KAK;Lasse;JO89XK;StringProperty [value: null];true;false;true;false;false;false;false;false
F5DYD;JLouis 144 only;IN86XW;StringProperty [value: null];true;true;false;false;false;false;false;false
F5DYD;JLouis 23/3;IN86XW;StringProperty [value: null];false;true;false;false;false;false;false;false
F6HTJ;Michel 23>3cm;JN12KQ;StringProperty [value: null];false;true;false;false;false;false;false;false
DF5DF;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false
F5DYD;JLouis 23/3;IN86XW;StringProperty [value: null];true;true;false;false;false;false;false;false
F5DYD;JLouis 23/3;IN86XW;StringProperty [value: null];true;true;true;false;false;false;false;false
F5DYD;JLouis 23/3;IN86XW;StringProperty [value: null];true;true;true;true;false;false;false;false
DF0GEB;23 onlysked;JO51JL;StringProperty [value: null];true;true;false;false;false;false;false;false ; 2: 144/432 MHz
DO5AMF;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false ; null
DF0GEB;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false ; null
DR2X;Team 144.355;JO40QL;StringProperty [value: null]; wkd true; wkd144 true; wkd432false; wkd1240false; wkd2300false; wkd3400false; wkd5600false; wkd10Gfalse ; 2: 144/432 MHz
DJ7YP;unknown;unknown;StringProperty [value: null]; wkd true; wkd144 true; wkd432false; wkd1240false; wkd2300false; wkd3400false; wkd5600false; wkd10Gfalse ; null
HB9XC;unknown;unknown;StringProperty [value: null]; wkd true; wkd144 true; wkd432false; wkd1240false; wkd2300false; wkd3400false; wkd5600false; wkd10Gfalse ; null
OK4C-7;Klondajk 70cm;JN79BU;StringProperty [value: 432.285 ]; wkd true; wkd144 true; wkd432false; wkd1240false; wkd2300false; wkd3400false; wkd5600false; wkd10Gfalse ; 2: 144/432 MHz
DM5M;KST4Contest2nd;JO51IJ;StringProperty [value: 144.315.00 ]; wkd true; wkd144 true; wkd432false; wkd1240false; wkd2300false; wkd3400false; wkd5600false; wkd10Gfalse ; 2: 144/432 MHz
DL6MK;unknown;unknown;StringProperty [value: null]; wkd true; wkd144 true; wkd432false; wkd1240false; wkd2300false; wkd3400false; wkd5600false; wkd10Gfalse ; null
OE1W;Team;JN77TX;StringProperty [value: 263 ]; wkd true; wkd144 true; wkd432false; wkd1240false; wkd2300false; wkd3400false; wkd5600false; wkd10Gfalse ; 2: 144/432 MHz
OK2A;Lada 70cm;JO60JJ;StringProperty [value: 432.175 ]; wkd true; wkd144 false; wkd432false; wkd1240false; wkd2300false; wkd3400false; wkd5600false; wkd10Gfalse ; 2: 144/432 MHz
OK2A;Lada 70cm;JO60JJ;StringProperty [value: 432.175 ]; wkd true; wkd144 false; wkd432true; wkd1240false; wkd2300false; wkd3400false; wkd5600false; wkd10Gfalse ; 2: 144/432 MHz
;unknown;unknown;StringProperty [value: null]; wkd true; wkd144 false; wkd432false; wkd1240false; wkd2300false; wkd3400false; wkd5600false; wkd10Gfalse ; null
DL2GBG;unknown;unknown;StringProperty [value: null]; wkd true; wkd144 true; wkd432false; wkd1240false; wkd2300false; wkd3400false; wkd5600false; wkd10Gfalse ; null
DJ2IE;unknown;unknown;StringProperty [value: null]; wkd true; wkd144 true; wkd432false; wkd1240false; wkd2300false; wkd3400false; wkd5600false; wkd10Gfalse ; null
OL7C;Radio Club;JO60JJ;StringProperty [value: null]; wkd true; wkd144 true; wkd432false; wkd1240false; wkd2300false; wkd3400false; wkd5600false; wkd10Gfalse ; 2: 144/432 MHz
OL1C;unknown;unknown;StringProperty [value: null]; wkd true; wkd144 true; wkd432false; wkd1240false; wkd2300false; wkd3400false; wkd5600false; wkd10Gfalse ; null
DL5CAT;unknown;unknown;StringProperty [value: null]; wkd true; wkd144 false; wkd432true; wkd1240false; wkd2300false; wkd3400false; wkd5600false; wkd10Gfalse ; null
HB9GT;unknown;unknown;StringProperty [value: null]; wkd true; wkd144 true; wkd432false; wkd1240false; wkd2300false; wkd3400false; wkd5600false; wkd10Gfalse ; null
OL4N;Club;JO60VR;StringProperty [value: 144.209 ]; wkd true; wkd144 true; wkd432false; wkd1240false; wkd2300false; wkd3400false; wkd5600false; wkd10Gfalse ; 2: 144/432 MHz
OK1KCR;Big gun 2m;JN79VS;StringProperty [value: 144.162 ]; wkd true; wkd144 true; wkd432false; wkd1240false; wkd2300false; wkd3400false; wkd5600false; wkd10Gfalse ; 2: 144/432 MHz
OK1DEZ;unknown;unknown;StringProperty [value: null]; wkd true; wkd144 true; wkd432false; wkd1240false; wkd2300false; wkd3400false; wkd5600false; wkd10Gfalse ; null
OK1GK;2m 17ele 500W;JO70FA;StringProperty [value: 144.326,4 ]; wkd true; wkd144 true; wkd432false; wkd1240false; wkd2300false; wkd3400false; wkd5600false; wkd10Gfalse ; 2: 144/432 MHz
OE5D;unknown;unknown;StringProperty [value: null]; wkd true; wkd144 true; wkd432false; wkd1240false; wkd2300false; wkd3400false; wkd5600false; wkd10Gfalse ; null
OK2PVF;unknown;unknown;StringProperty [value: null]; wkd true; wkd144 true; wkd432false; wkd1240false; wkd2300false; wkd3400false; wkd5600false; wkd10Gfalse ; null
OK6R;unknown;unknown;StringProperty [value: null]; wkd true; wkd144 true; wkd432false; wkd1240false; wkd2300false; wkd3400false; wkd5600false; wkd10Gfalse ; null
OL7M;unknown;unknown;StringProperty [value: null]; wkd true; wkd144 true; wkd432false; wkd1240false; wkd2300false; wkd3400false; wkd5600false; wkd10Gfalse ; null
OK5P;unknown;unknown;StringProperty [value: null]; wkd true; wkd144 true; wkd432false; wkd1240false; wkd2300false; wkd3400false; wkd5600false; wkd10Gfalse ; null
OK1NPF;unknown;unknown;StringProperty [value: null]; wkd true; wkd144 true; wkd432false; wkd1240false; wkd2300false; wkd3400false; wkd5600false; wkd10Gfalse ; null
DF9PX;unknown;unknown;StringProperty [value: null]; wkd true; wkd144 true; wkd432false; wkd1240false; wkd2300false; wkd3400false; wkd5600false; wkd10Gfalse ; null
DL8RH;unknown;unknown;StringProperty [value: null]; wkd true; wkd144 true; wkd432false; wkd1240false; wkd2300false; wkd3400false; wkd5600false; wkd10Gfalse ; null
ON4EI/P;Oli 2m 4x4+2x7;JO20EP;StringProperty [value: 366 ]; wkd true; wkd144 true; wkd432false; wkd1240false; wkd2300false; wkd3400false; wkd5600false; wkd10Gfalse ; 2: 144/432 MHz
TM5R;Didier;JN19BQ;StringProperty [value: null]; wkd true; wkd144 true; wkd432false; wkd1240false; wkd2300false; wkd3400false; wkd5600false; wkd10Gfalse ; 2: 144/432 MHz
PA1T;unknown;unknown;StringProperty [value: null]; wkd true; wkd144 true; wkd432false; wkd1240false; wkd2300false; wkd3400false; wkd5600false; wkd10Gfalse ; null
DK0B;unknown;unknown;StringProperty [value: null]; wkd true; wkd144 true; wkd432false; wkd1240false; wkd2300false; wkd3400false; wkd5600false; wkd10Gfalse ; null
DF0LU;unknown;unknown;StringProperty [value: null]; wkd true; wkd144 true; wkd432false; wkd1240false; wkd2300false; wkd3400false; wkd5600false; wkd10Gfalse ; null
DF8V;unknown;unknown;StringProperty [value: null]; wkd true; wkd144 true; wkd432false; wkd1240false; wkd2300false; wkd3400false; wkd5600false; wkd10Gfalse ; null
DF5RF;unknown;unknown;StringProperty [value: null]; wkd true; wkd144 true; wkd432false; wkd1240false; wkd2300false; wkd3400false; wkd5600false; wkd10Gfalse ; null
DL0BBK;unknown;unknown;StringProperty [value: null]; wkd true; wkd144 true; wkd432false; wkd1240false; wkd2300false; wkd3400false; wkd5600false; wkd10Gfalse ; null
DL5AI;unknown;unknown;StringProperty [value: null]; wkd true; wkd144 true; wkd432false; wkd1240false; wkd2300false; wkd3400false; wkd5600false; wkd10Gfalse ; null
DB0DH;unknown;unknown;StringProperty [value: null]; wkd true; wkd144 true; wkd432false; wkd1240false; wkd2300false; wkd3400false; wkd5600false; wkd10Gfalse ; null
DJ5NE;unknown;unknown;StringProperty [value: null]; wkd true; wkd144 true; wkd432false; wkd1240false; wkd2300false; wkd3400false; wkd5600false; wkd10Gfalse ; null
DK5PD;Lothar 2m;JN39VV;StringProperty [value: null]; wkd true; wkd144 true; wkd432false; wkd1240false; wkd2300false; wkd3400false; wkd5600false; wkd10Gfalse ; 2: 144/432 MHz
DL4M-70;Club 70cm;JO31QX;StringProperty [value: 432.278 ]; wkd true; wkd144 true; wkd432false; wkd1240false; wkd2300false; wkd3400false; wkd5600false; wkd10Gfalse ; 2: 144/432 MHz
DJ5KW/P;unknown;unknown;StringProperty [value: null]; wkd true; wkd144 true; wkd432false; wkd1240false; wkd2300false; wkd3400false; wkd5600false; wkd10Gfalse ; null
DP4D;unknown;unknown;StringProperty [value: null]; wkd true; wkd144 true; wkd432false; wkd1240false; wkd2300false; wkd3400false; wkd5600false; wkd10Gfalse ; null
DK6WT;unknown;unknown;StringProperty [value: null]; wkd true; wkd144 true; wkd432false; wkd1240false; wkd2300false; wkd3400false; wkd5600false; wkd10Gfalse ; null
OK4C-7;Klondajk 70cm;JN79BU;StringProperty [value: t127 432.310 ]; wkd true; wkd144 false; wkd432true; wkd1240false; wkd2300false; wkd3400false; wkd5600false; wkd10Gfalse ; 2: 144/432 MHz
DL8NAS;Sigi-70cm;JN59LE;StringProperty [value: 432.230 ]; wkd true; wkd144 false; wkd432true; wkd1240false; wkd2300false; wkd3400false; wkd5600false; wkd10Gfalse ; 2: 144/432 MHz
OL70KEA;70/23CM;JN89EJ;StringProperty [value: 144.389 ]; wkd true; wkd144 true; wkd432false; wkd1240false; wkd2300false; wkd3400false; wkd5600false; wkd10Gfalse ; 2: 144/432 MHz
SN7L;144.180;JO70SS;StringProperty [value: 144.180 ]; wkd true; wkd144 true; wkd432false; wkd1240false; wkd2300false; wkd3400false; wkd5600false; wkd10Gfalse ; 2: 144/432 MHz
DL2L;2m;JN68DT;StringProperty [value: 365 ]; wkd true; wkd144 true; wkd432false; wkd1240false; wkd2300false; wkd3400false; wkd5600false; wkd10Gfalse ; 2: 144/432 MHz