mirror of
https://github.com/praktimarc/kst4contest.git
synced 2026-03-30 04:31:04 +02:00
<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:
@@ -1,3 +1,2 @@
|
||||
DF7KF
|
||||
G4KUX
|
||||
ha2np
|
||||
dr2x
|
||||
oe3cin
|
||||
15832
bugsept24.txt
Normal file
15832
bugsept24.txt
Normal file
File diff suppressed because it is too large
Load Diff
@@ -9,11 +9,14 @@ public class ApplicationConstants {
|
||||
/**
|
||||
* 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 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_DUE_PAWWORDERROR = "JUSTDSICCAUSEPWWRONG";
|
||||
public static final String DISCSTRING_DISCONNECTONLY = "ONLYDISCONNECT";
|
||||
|
||||
@@ -11,6 +11,7 @@ import java.net.UnknownHostException;
|
||||
import java.util.TimerTask;
|
||||
|
||||
import javafx.collections.ObservableList;
|
||||
import kst4contest.locatorUtils.Location;
|
||||
import kst4contest.model.ChatMember;
|
||||
|
||||
|
||||
@@ -29,23 +30,29 @@ public class AirScoutPeriodicalAPReflectionInquirerTask extends TimerTask {
|
||||
|
||||
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: Check if locator is changeable via the preferences object, need to be correct if it changes
|
||||
DatagramSocket dsocket;
|
||||
|
||||
String prefix_asSetpath ="ASSETPATH: \"KST\" \"AS\" ";
|
||||
String prefix_asWatchList = "ASWATCHLIST: \"KST\" \"AS\" ";
|
||||
// String prefix_asSetpath ="ASSETPATH: \"KST\" \"AS\" "; //working original
|
||||
// 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 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 asWatchListString = prefix_asWatchList + bandString + "," + myCallAndMyLocString;
|
||||
String asWatchListStringSuffix = asWatchListString;
|
||||
|
||||
String host = "255.255.255.255";
|
||||
// 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
|
||||
InetAddress address;
|
||||
|
||||
@@ -63,112 +70,41 @@ public class AirScoutPeriodicalAPReflectionInquirerTask extends TimerTask {
|
||||
|
||||
for (ChatMember i : ary_threadSafeChatMemberArray) {
|
||||
|
||||
suffix = i.getCallSign() + "," + i.getQra() + " ";
|
||||
//
|
||||
String queryStringToAirScout = "";
|
||||
|
||||
queryStringToAirScout += prefix_asSetpath + bandString + "," + myCallAndMyLocString + "," + suffix;
|
||||
|
||||
byte[] queryStringToAirScoutMSG = queryStringToAirScout.getBytes();
|
||||
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() + " ";
|
||||
|
||||
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 (NoRouteToHostException e) {
|
||||
e.printStackTrace();
|
||||
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) {
|
||||
e1.printStackTrace();
|
||||
} catch (NoRouteToHostException e) {
|
||||
e.printStackTrace();
|
||||
} catch (SocketException e) {
|
||||
e.printStackTrace();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
// System.out.println("[ASUDPTask, info:] sent query " + queryStringToAirScout);
|
||||
|
||||
asWatchListStringSuffix += "," + i.getCallSign() + "," + i.getQra();
|
||||
}
|
||||
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 += "," + 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
|
||||
* ASWATCHLIST: "KST" "AS" 4320000,DO5AMF,JN49GL,DF9QX,JO42HD,DG2KBC,JN58MI,DJ0PY,JO32MF,DL1YDI,JO42FA,DL6BF,JO32QI,F1NZC,JN15MR,F4TXU,JN23CX,F5GHP,IN96LE,F6HTJ,JN12KQ,G0GGG,IO81VE,G0JCC,IO82MA,G0JDL,JO02SI,G0MBL,JO01QH,G4AEP,IO91MB,G4CLA,IO92JL,G4DCV,IO91OF,G4LOH,IO70JC,G4MKF,IO91HJ,G4TRA,IO81WN,G8GXP,IO93FQ,G8VHI,IO92FM,GW0RHC,IO71UN,HA4ND,JN97MJ,I5/HB9SJV/P,JN52JS,IW2DAL,JN45NN,OK1FPR,JO80CE,OK6M,JN99CR,OV3T,JO46CM,OZ2M,JO65FR,PA0V,JO33II,PA2RU,JO32LT,PA3DOL,JO22MT,PA9R,JO22JK,PE1EVX,JO22MP,S51AT,JN75GW,SM7KOJ,JO66ND,SP9TTG,JO90KW<4B>
|
||||
@@ -185,14 +121,7 @@ public class AirScoutPeriodicalAPReflectionInquirerTask extends TimerTask {
|
||||
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();
|
||||
}
|
||||
|
||||
|
||||
@@ -33,30 +33,74 @@ public class BeaconTask extends TimerTask {
|
||||
|
||||
ChatMessage beaconMSG = new ChatMessage();
|
||||
|
||||
String replaceVariables = this.chatController.getChatPreferences().getBcn_beaconText();
|
||||
// replaceVariables = bcn_beaconText;
|
||||
String replaceVariables = this.chatController.getChatPreferences().getBcn_beaconTextMainCat();
|
||||
|
||||
replaceVariables = replaceVariables.replaceAll("MYQRG", this.chatController.getChatPreferences().getMYQRG().getValue());
|
||||
replaceVariables = replaceVariables.replaceAll("MYCALL", this.chatController.getChatPreferences().getLoginCallSign());
|
||||
replaceVariables = replaceVariables.replaceAll("MYLOCATOR", this.chatController.getChatPreferences().getLoginLocator());
|
||||
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() + "");
|
||||
replaceVariables = replaceVariables.replaceAll("SECONDQRG", this.chatController.getChatPreferences().getActualQTF().getValue() + "");
|
||||
|
||||
|
||||
beaconMSG.setMessageText(
|
||||
"MSG|" + this.chatController.getChatPreferences().getLoginChatCategory().getCategoryNumber() + "|0|" + replaceVariables + "|0|");
|
||||
"MSG|" + this.chatController.getChatPreferences().getLoginChatCategoryMain().getCategoryNumber() + "|0|" + replaceVariables + "|0|");
|
||||
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()
|
||||
+ " [BeaconTask, Info]: Sending CQ: " + beaconMSG.getMessageText());
|
||||
this.chatController.getMessageTXBus().add(beaconMSG);
|
||||
|
||||
} else {
|
||||
//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
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -1,17 +1,15 @@
|
||||
package kst4contest.controller;
|
||||
|
||||
import java.net.*;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.channels.Selector;
|
||||
import java.sql.SQLException;
|
||||
import java.time.OffsetDateTime;
|
||||
import java.time.ZoneOffset;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.Timer;
|
||||
import java.util.TimerTask;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.LinkedBlockingQueue;
|
||||
|
||||
import javafx.beans.Observable;
|
||||
import javafx.collections.FXCollections;
|
||||
import javafx.collections.ObservableList;
|
||||
import javafx.collections.transformation.FilteredList;
|
||||
@@ -46,12 +44,14 @@ public class ChatController {
|
||||
private UpdateInformation updateInformation;
|
||||
private ChatPreferences chatPreferences;
|
||||
|
||||
private ChatCategory category;
|
||||
private ChatCategory chatCategoryMain;
|
||||
private ChatCategory chatCategorySecondChat;
|
||||
boolean connectedAndLoggedIn;
|
||||
boolean connectedAndNOTLoggedIn;
|
||||
boolean disconnected;
|
||||
boolean disconnectionPerformedByUser = false;
|
||||
|
||||
|
||||
public boolean isDisconnectionPerformedByUser() {
|
||||
return disconnectionPerformedByUser;
|
||||
}
|
||||
@@ -60,6 +60,15 @@ public class ChatController {
|
||||
this.disconnectionPerformedByUser = disconnectionPerformedByUser;
|
||||
}
|
||||
|
||||
|
||||
public ChatCategory getChatCategorySecondChat() {
|
||||
return chatCategorySecondChat;
|
||||
}
|
||||
|
||||
public void setChatCategorySecondChat(ChatCategory chatCategorySecondChat) {
|
||||
this.chatCategorySecondChat = chatCategorySecondChat;
|
||||
}
|
||||
|
||||
public UpdateInformation getUpdateInformation() {
|
||||
return updateInformation;
|
||||
}
|
||||
@@ -106,7 +115,7 @@ public class ChatController {
|
||||
|
||||
String prefix_asSetpath ="ASSHOWPATH: \"KST\" \"AS\" ";
|
||||
String bandString = "1440000";
|
||||
String myCallAndMyLocString = chatPreferences.getLoginCallSign() + "," + chatPreferences.getLoginLocator();
|
||||
String myCallAndMyLocString = chatPreferences.getStn_loginCallSign() + "," + chatPreferences.getStn_loginLocatorMainCat();
|
||||
String remoteCallAndLocString = remoteChatMember.getCallSign() +"," + remoteChatMember.getQra();
|
||||
|
||||
|
||||
@@ -160,6 +169,8 @@ public class ChatController {
|
||||
*/
|
||||
public void disconnect(String action) {
|
||||
|
||||
this.dxClusterServer.stop();
|
||||
|
||||
this.setDisconnectionPerformedByUser(true);
|
||||
|
||||
try {
|
||||
@@ -254,6 +265,7 @@ public class ChatController {
|
||||
|
||||
dbHandler.closeDBConnection();
|
||||
|
||||
dxClusterServer.stop();
|
||||
|
||||
try {
|
||||
|
||||
@@ -352,6 +364,8 @@ public class ChatController {
|
||||
private ChatController chatController;
|
||||
private MessageBusManagementThread messageProcessor;
|
||||
private ReadUDPbyAirScoutMessageThread airScoutUDPReaderThread;
|
||||
private DXClusterThreadPooledServer dxClusterServer;
|
||||
|
||||
|
||||
private PlayAudioUtils playAudioUtils = new PlayAudioUtils();
|
||||
|
||||
@@ -372,6 +386,9 @@ public class ChatController {
|
||||
private DBController dbHandler;
|
||||
|
||||
private Socket socket;
|
||||
private ServerSocket cluster_telnetServerSocket; // socket that accepts telnet client connects (cluster client)
|
||||
// private ServerSocketChannel cluster_telnetServerSocketChannel;
|
||||
|
||||
|
||||
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
|
||||
* 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();) {
|
||||
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
|
||||
// .println("MSGBUSHELPER: Found " + chatMember.getCallSign() + " at " + lst_chatMemberList.indexOf(chatMember));
|
||||
// .println("chtctrlr: Found raw " + chatMember.getCallSignRaw() + " // " + lookForThis.getCallSign());
|
||||
|
||||
return lst_chatMemberList.indexOf(chatMember);
|
||||
} else {
|
||||
@@ -617,7 +675,9 @@ public class ChatController {
|
||||
public ChatController() {
|
||||
|
||||
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.setCallSign(userName);
|
||||
ownChatMemberObject.setName(showedName);
|
||||
@@ -650,17 +710,17 @@ category = new ChatCategory(2);
|
||||
|
||||
try {
|
||||
|
||||
if (chatMessage.getReceiver().getCallSign().equals(getChatPreferences().getLoginCallSign())) {
|
||||
if (chatMessage.getReceiver().getCallSign().equals(getChatPreferences().getStn_loginCallSign())) {
|
||||
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)
|
||||
}
|
||||
|
||||
String ignoreCaseString = chatMessage.getMessageText();
|
||||
|
||||
if ((chatMessage.getMessageText().contains(chatPreferences.getLoginCallSign().toLowerCase()) || (chatMessage.getMessageText().contains(chatPreferences.getLoginCallSign().toUpperCase())))
|
||||
&& (!chatMessage.getSender().getCallSign().equals(getChatPreferences().getLoginCallSign()))) {
|
||||
if ((chatMessage.getMessageText().contains(chatPreferences.getStn_loginCallSign().toLowerCase()) || (chatMessage.getMessageText().contains(chatPreferences.getStn_loginCallSign().toUpperCase())))
|
||||
&& (!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...!
|
||||
}
|
||||
|
||||
@@ -699,8 +759,10 @@ category = new ChatCategory(2);
|
||||
@Override
|
||||
public boolean test(ChatMessage chatMessage) {
|
||||
try {
|
||||
if ((!chatMessage.getSender().getCallSign().equals(getChatPreferences().getLoginCallSign())) &&
|
||||
(!chatMessage.getReceiver().getCallSign().equals(getChatPreferences().getLoginCallSign()))) {
|
||||
if ((!chatMessage.getSender().getCallSign().equals(getChatPreferences().getStn_loginCallSign())) &&
|
||||
(!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;
|
||||
} else return false;
|
||||
|
||||
@@ -717,9 +779,10 @@ category = new ChatCategory(2);
|
||||
chatPreferences = new ChatPreferences();
|
||||
chatPreferences.readPreferencesFromXmlFile(); // set the praktikst Prefs by file or default if file is corrupted
|
||||
|
||||
category = chatPreferences.getLoginChatCategory();
|
||||
this.userName = chatPreferences.getLoginCallSign();
|
||||
this.password = chatPreferences.getLoginPassword();
|
||||
chatCategoryMain = chatPreferences.getLoginChatCategoryMain();
|
||||
chatCategorySecondChat = chatPreferences.getLoginChatCategorySecond();
|
||||
this.userName = chatPreferences.getStn_loginCallSign();
|
||||
this.password = chatPreferences.getStn_loginPassword();
|
||||
// category = setCategory;
|
||||
ownChatMemberObject = setOwnChatMemberObject;
|
||||
|
||||
@@ -758,6 +821,7 @@ category = new ChatCategory(2);
|
||||
return writeThread;
|
||||
}
|
||||
|
||||
|
||||
public void setWriteThread(WriteThread writeThread) {
|
||||
this.writeThread = writeThread;
|
||||
}
|
||||
@@ -770,15 +834,19 @@ category = new ChatCategory(2);
|
||||
this.readThread = readThread;
|
||||
}
|
||||
|
||||
public ChatCategory getCategory() {
|
||||
return category;
|
||||
public ChatCategory getChatCategoryMain() {
|
||||
return chatCategoryMain;
|
||||
}
|
||||
|
||||
public void setCategory(ChatCategory category) {
|
||||
this.category = category;
|
||||
public void setChatCategoryMain(ChatCategory chatCategoryMain) {
|
||||
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;
|
||||
// }
|
||||
//
|
||||
@@ -823,9 +891,14 @@ category = new ChatCategory(2);
|
||||
messageTXBus = new LinkedBlockingQueue<ChatMessage>();
|
||||
// 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());
|
||||
|
||||
// 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.start();
|
||||
|
||||
@@ -845,26 +918,29 @@ category = new ChatCategory(2);
|
||||
messageProcessor.setName("messagebusManagementThread");
|
||||
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.start();
|
||||
|
||||
|
||||
userActualizationtimer = new Timer();
|
||||
userActualizationtimer.schedule(new UserActualizationTask(this), 4000, 60000);// TODO: Temporary
|
||||
// userlistoutput
|
||||
// with
|
||||
// known qrgs
|
||||
userActualizationtimer.schedule(new UserActualizationTask(this), 4000, 60000);// TODO: Temporary userlistoutput known qrgs
|
||||
|
||||
keepAliveTimer = new Timer();
|
||||
keepAliveTimer.schedule(new keepAliveMessageSenderTask(this), 4000, 60000);// TODO: Temporary
|
||||
// userlistoutput
|
||||
// with
|
||||
keepAliveTimer.schedule(new keepAliveMessageSenderTask(this), 4000, 60000);//
|
||||
|
||||
// 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);
|
||||
|
||||
@@ -875,7 +951,7 @@ category = new ChatCategory(2);
|
||||
// Timer beaconTimer;
|
||||
beaconTimer = new Timer();
|
||||
beaconTimer.schedule(new BeaconTask(this), 10000,
|
||||
this.getChatPreferences().getBcn_beaconIntervalInMinutes() * 60000);
|
||||
this.getChatPreferences().getBcn_beaconIntervalInMinutesMainCat() * 60000);
|
||||
// 60000 * intervalInMinutes = IntervalInMillis
|
||||
|
||||
/**
|
||||
@@ -884,7 +960,7 @@ category = new ChatCategory(2);
|
||||
*/
|
||||
// Timer ASQueryTimer;
|
||||
ASQueryTimer = new Timer();
|
||||
ASQueryTimer.schedule(new AirScoutPeriodicalAPReflectionInquirerTask(this), 10000, 12000);
|
||||
ASQueryTimer.schedule(new AirScoutPeriodicalAPReflectionInquirerTask(this), 10000, 60000);
|
||||
// 60000 * intervalInMinutes = IntervalInMillis
|
||||
|
||||
/**
|
||||
@@ -896,7 +972,7 @@ category = new ChatCategory(2);
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
System.out.println("[Chatcontroller, info: ] periodical socketcheck");
|
||||
// System.out.println("[Chatcontroller, info: ] periodical socketcheck");
|
||||
|
||||
Thread.currentThread().setName("SocketcheckTimer");
|
||||
|
||||
@@ -955,8 +1031,6 @@ category = new ChatCategory(2);
|
||||
messageProcessor = new MessageBusManagementThread(chatController);
|
||||
messageProcessor.start();
|
||||
|
||||
// chatController.setMessageProcessor= new MessageBusManagementThread(chatController);
|
||||
// messageProcessor.start();
|
||||
System.out.println("[Chatcontroller, info: initialized new socket, is connected? ] "
|
||||
+ socket.isConnected() + " " + socket.isClosed());
|
||||
|
||||
@@ -1012,7 +1086,7 @@ category = new ChatCategory(2);
|
||||
|
||||
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;
|
||||
// System.out.println(millisecondsSinceEpoch);
|
||||
@@ -1023,7 +1097,7 @@ category = new ChatCategory(2);
|
||||
* Setting the initial parameters at the chat via port 23001 <br/>
|
||||
* <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/>
|
||||
*
|
||||
* @throws InterruptedException
|
||||
@@ -1043,8 +1117,8 @@ category = new ChatCategory(2);
|
||||
Thread.currentThread().setName("LoginStringTimer");
|
||||
|
||||
String loginString = "";
|
||||
loginString = "LOGINC|" + chatPreferences.getLoginCallSign() + "|" + chatPreferences.getLoginPassword()
|
||||
+ "|" + chatPreferences.getLoginChatCategory().getCategoryNumber() + "|praktiKST v" + ApplicationConstants.APPLICATION_CURRENTVERSIONNUMBER
|
||||
loginString = "LOGINC|" + chatPreferences.getStn_loginCallSign() + "|" + chatPreferences.getStn_loginPassword()
|
||||
+ "|" + chatPreferences.getLoginChatCategoryMain().getCategoryNumber() + "|praktiKST v" + ApplicationConstants.APPLICATION_CURRENTVERSIONNUMBER
|
||||
+ "|25|0|1|" + getCurrentEpochTime() + "|0|";
|
||||
|
||||
// System.out.println(loginString);
|
||||
@@ -1056,6 +1130,39 @@ category = new ChatCategory(2);
|
||||
}
|
||||
}, 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() {
|
||||
|
||||
@Override
|
||||
@@ -1063,7 +1170,7 @@ category = new ChatCategory(2);
|
||||
|
||||
Thread.currentThread().setName("SDONEStringTimer");
|
||||
ChatMessage message = new ChatMessage();
|
||||
message.setMessageText("SDONE|" + chatPreferences.getLoginChatCategory().getCategoryNumber() + "|\r");
|
||||
message.setMessageText("SDONE|" + chatPreferences.getLoginChatCategoryMain().getCategoryNumber() + "|\r");
|
||||
message.setMessageDirectedToServer(true);
|
||||
getMessageTXBus().add(message);
|
||||
|
||||
@@ -1076,11 +1183,10 @@ category = new ChatCategory(2);
|
||||
public void run() {
|
||||
Thread.currentThread().setName("SETLOCTIMER");
|
||||
ChatMessage message = new ChatMessage();
|
||||
message.setMessageText("MSG|" + chatPreferences.getLoginChatCategory().getCategoryNumber()
|
||||
+ "|0|/SETLOC " + chatPreferences.getLoginLocator() + "|0|\r");
|
||||
message.setMessageText("MSG|" + chatPreferences.getLoginChatCategoryMain().getCategoryNumber()
|
||||
+ "|0|/SETLOC " + chatPreferences.getStn_loginLocatorMainCat() + "|0|\r");
|
||||
message.setMessageDirectedToServer(true);
|
||||
getMessageTXBus().add(message);
|
||||
|
||||
}
|
||||
}, 4000);
|
||||
|
||||
@@ -1090,14 +1196,58 @@ category = new ChatCategory(2);
|
||||
public void run() {
|
||||
Thread.currentThread().setName("SETNAMETIMER");
|
||||
ChatMessage message = new ChatMessage();
|
||||
message.setMessageText("MSG|" + chatPreferences.getLoginChatCategory().getCategoryNumber()
|
||||
+ "|0|/SETNAME " + chatPreferences.getLoginName() + "|0|\r");
|
||||
message.setMessageText("MSG|" + chatPreferences.getLoginChatCategoryMain().getCategoryNumber()
|
||||
+ "|0|/SETNAME " + chatPreferences.getStn_loginNameMainCat() + "|0|\r");
|
||||
message.setMessageDirectedToServer(true);
|
||||
getMessageTXBus().add(message);
|
||||
|
||||
}
|
||||
}, 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() {
|
||||
HashMap<String, ChatMember> getWorkedDataFromDb;
|
||||
|
||||
@@ -1227,7 +1377,7 @@ category = new ChatCategory(2);
|
||||
//
|
||||
message = new ChatMessage();
|
||||
// message.setDirectedToServer(true);
|
||||
message.setMessageText(category + "");
|
||||
message.setMessageText(chatCategoryMain + "");
|
||||
this.getMessageTXBus().add(message);
|
||||
//
|
||||
message = new ChatMessage();
|
||||
|
||||
@@ -405,15 +405,10 @@ public class DBController {
|
||||
ResultSet rs = stmt
|
||||
.executeQuery("SELECT * FROM ChatMember where callsign = '" + checkForThis.getCallSign() + "' ;");
|
||||
|
||||
// ChatMember updateWkdData;
|
||||
|
||||
// if (!rs.isBeforeFirst()) { //if there are no data to update....
|
||||
// System.out.println("DBH stmt: " + rs.getStatement().toString());
|
||||
|
||||
while (rs.next()) {
|
||||
|
||||
// updateWkdData = new ChatMember();
|
||||
|
||||
// updateWkdData.setCallSign(rs.getString("callsign"));
|
||||
checkForThis.setWorked(helper_IntToBooleanConverter(rs.getInt("worked")));
|
||||
checkForThis.setWorked144(helper_IntToBooleanConverter(rs.getInt("worked144")));
|
||||
checkForThis.setWorked432(helper_IntToBooleanConverter(rs.getInt("worked432")));
|
||||
@@ -427,20 +422,22 @@ public class DBController {
|
||||
* v1.2 since here
|
||||
*/
|
||||
|
||||
checkForThis.setWorked144(helper_IntToBooleanConverter(rs.getInt("notQRV144")));
|
||||
checkForThis.setWorked432(helper_IntToBooleanConverter(rs.getInt("notQRV432")));
|
||||
checkForThis.setWorked1240(helper_IntToBooleanConverter(rs.getInt("notQRV1240")));
|
||||
checkForThis.setWorked2300(helper_IntToBooleanConverter(rs.getInt("notQRV2300")));
|
||||
checkForThis.setWorked3400(helper_IntToBooleanConverter(rs.getInt("notQRV3400")));
|
||||
checkForThis.setWorked5600(helper_IntToBooleanConverter(rs.getInt("notQRV5600")));
|
||||
checkForThis.setWorked10G(helper_IntToBooleanConverter(rs.getInt("notQRV10G")));
|
||||
checkForThis.setQrv144(!helper_IntToBooleanConverter(rs.getInt("notQRV144")));
|
||||
checkForThis.setQrv432(!helper_IntToBooleanConverter(rs.getInt("notQRV432")));
|
||||
checkForThis.setQrv1240(!helper_IntToBooleanConverter(rs.getInt("notQRV1240")));
|
||||
checkForThis.setQrv2300(!helper_IntToBooleanConverter(rs.getInt("notQRV2300")));
|
||||
checkForThis.setQrv3400(!helper_IntToBooleanConverter(rs.getInt("notQRV3400")));
|
||||
checkForThis.setQrv5600(!helper_IntToBooleanConverter(rs.getInt("notQRV5600")));
|
||||
checkForThis.setQrv10G(!helper_IntToBooleanConverter(rs.getInt("notQRV10G")));
|
||||
|
||||
System.out.println(
|
||||
"[DBH, Info:] providing callsign wkd info, wkd, 144, 432, ... for UA5 new chatmember : "
|
||||
+ checkForThis.toString());
|
||||
// System.out.println(
|
||||
// "[DBH, Info:] providing callsign wkd info, wkd, 144, 432, ....... for UA5 new chatmember : "
|
||||
// + checkForThis.toString());
|
||||
|
||||
}
|
||||
// }
|
||||
|
||||
// rs.gets
|
||||
|
||||
rs.close();
|
||||
stmt.close();
|
||||
|
||||
@@ -454,7 +451,7 @@ public class DBController {
|
||||
try {
|
||||
connection.close();
|
||||
} catch (SQLException e1) {
|
||||
// TODO Auto-generated catch block
|
||||
|
||||
e1.printStackTrace();
|
||||
}
|
||||
}
|
||||
@@ -704,9 +701,13 @@ public class DBController {
|
||||
|
||||
private boolean helper_IntToBooleanConverter(int valueFromDBField) {
|
||||
|
||||
// System.out.println(">>>>>>>>>>>>>>> DBC: " + valueFromDBField + " -> ");
|
||||
|
||||
if (valueFromDBField != 0) {
|
||||
System.out.println("true");
|
||||
return true;
|
||||
} else
|
||||
System.out.println("false");
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
196
src/main/java/kst4contest/controller/DXClusterController.java
Normal file
196
src/main/java/kst4contest/controller/DXClusterController.java
Normal 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;
|
||||
// }
|
||||
//}
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -43,7 +43,7 @@ public class InputReaderThread extends Thread {
|
||||
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());
|
||||
|
||||
|
||||
@@ -5,6 +5,7 @@ import java.io.PrintWriter;
|
||||
import java.sql.SQLException;
|
||||
//import java.net.Socket;
|
||||
//import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.Hashtable;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
@@ -14,12 +15,7 @@ import javafx.collections.ObservableList;
|
||||
import kst4contest.ApplicationConstants;
|
||||
import kst4contest.locatorUtils.DirectionUtils;
|
||||
import kst4contest.locatorUtils.Location;
|
||||
import kst4contest.model.AirPlaneReflectionInfo;
|
||||
import kst4contest.model.ChatMember;
|
||||
import kst4contest.model.ChatMessage;
|
||||
import kst4contest.model.ClusterMessage;
|
||||
import kst4contest.utils.PlayAudioUtils;
|
||||
import kst4contest.view.Kst4ContestApplication;
|
||||
import kst4contest.model.*;
|
||||
|
||||
/**
|
||||
*
|
||||
@@ -43,6 +39,7 @@ public class MessageBusManagementThread extends Thread {
|
||||
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_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;
|
||||
|
||||
// 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/>
|
||||
* <b>Updates userlist!</b>
|
||||
*
|
||||
* @param chatMessage
|
||||
*/
|
||||
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/>
|
||||
* <b>Updates userlist!</b>
|
||||
*
|
||||
* @param chatMessage
|
||||
* <b>This method updates the userlist!</b>
|
||||
*/
|
||||
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/>
|
||||
* <b>returns String = "" if no frequency found</b>
|
||||
*
|
||||
* @param chatMessage
|
||||
|
||||
*/
|
||||
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());
|
||||
String[] splittedQRGString;
|
||||
// splittedQRGString[0] = "0";
|
||||
|
||||
String stringAggregation = "";
|
||||
|
||||
// if (matcher.) {
|
||||
// stringAggregation = ""; //reset aggregated string
|
||||
// }
|
||||
|
||||
while (matcher.find()) {
|
||||
// System.out.println("QRG detected: "+ matcher.group() + " " + matcher.start());
|
||||
|
||||
// ChatMember member = new ChatMember();
|
||||
String matchedString = matcher.group();
|
||||
|
||||
// splittedQRGString = new String[0];
|
||||
splittedQRGString = matchedString.split(" ");
|
||||
|
||||
for (int i = 0; i < splittedQRGString.length; i++) {
|
||||
stringAggregation += splittedQRGString[i] + " ";
|
||||
}
|
||||
for (String s : splittedQRGString) {
|
||||
stringAggregation += s + " ";
|
||||
}
|
||||
|
||||
System.out.println("[MSGBUSMGT:] Processed qrg info: " + stringAggregation);
|
||||
|
||||
// if (member.getName().)
|
||||
|
||||
// System.out.println("Processed QRG Entry [" + this.client.getChatMemberTable().size() + "]: Call: "
|
||||
// + member.getCallSign() + ", QRA: " + member.getQra() + ", Name: " + member.getName());
|
||||
}
|
||||
@@ -214,7 +199,7 @@ public class MessageBusManagementThread extends Thread {
|
||||
messageToProcess.setMessageText(reduce);
|
||||
|
||||
if (messageToProcess.getMessageText().isEmpty()) {
|
||||
System.out.println("[MSGBUSMGTT:] ######################no processable data");
|
||||
// System.out.println("[MSGBUSMGTT:] ###################### no processable data");
|
||||
} else {
|
||||
|
||||
if (reduce.length() >= 14 && reduce.length() <= 40) {
|
||||
@@ -275,26 +260,35 @@ public class MessageBusManagementThread extends Thread {
|
||||
// System.out.println("[MsgBusMgr, ERROR:] ChecklistForChatMemberIndexByCallsign, not found: "
|
||||
// + 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++) {
|
||||
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
|
||||
// .println("MSGBUSHELBER: Found " + chatMember.getCallSign() + " at " + list.indexOf(chatMember));
|
||||
|
||||
return list.indexOf(list.get(i));
|
||||
if (list.get(i).getChatCategory().equals(lookForThis.getChatCategory())) { //new 1.26
|
||||
|
||||
return list.indexOf(list.get(i));
|
||||
} //new 1.26
|
||||
else {
|
||||
System.out.println("MSGBUSMGT, DEBUG: Category does not match");
|
||||
|
||||
}
|
||||
|
||||
// System.out.println("--------------------------- chatcategory of list.get(i) = " + list.get(i).getChatCategory().getCategoryNumber());
|
||||
System.out.println("--------------------------- chatcategory of lookforthisChatMember = " + lookForThis.getChatCategory().getCategoryNumber() );
|
||||
}
|
||||
// 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
|
||||
}
|
||||
|
||||
// for (Iterator iterator = list.iterator(); iterator.hasNext();) {
|
||||
// ChatMember chatMember = (ChatMember) iterator.next();
|
||||
// System.out.println(list.indexOf(lookForThis) + ": " + chatMember.getCallSign());
|
||||
// }
|
||||
|
||||
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_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()) {
|
||||
System.out.println("[MSGBUSMGTT:] ######################no processable data");
|
||||
|
||||
@@ -352,28 +362,32 @@ public class MessageBusManagementThread extends Thread {
|
||||
|
||||
/**
|
||||
* Initializes the Userlist if entry fits UA0
|
||||
* UA0|3|DL6SAQ|walter not qrv|JN58CK|1| <- RXed
|
||||
*
|
||||
*/
|
||||
if (splittedMessageLine[0].contains(INITIALUSERLISTENTRY)) {
|
||||
// System.out.println("MSGBUS: User detected");
|
||||
|
||||
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.setName(splittedMessageLine[3]);
|
||||
newMember.setQra(splittedMessageLine[4]);
|
||||
newMember.setState(Integer.parseInt(splittedMessageLine[5]));
|
||||
// newMember.setQTFdirection(LocatorUtils);
|
||||
newMember.setQrb(new Location().getDistanceKmByTwoLocatorStrings(client.getChatPreferences().getLoginLocator(), newMember.getQra()));
|
||||
newMember.setQTFdirection(new Location(client.getChatPreferences().getLoginLocator()).getBearing(new Location(newMember.getQra())));
|
||||
// newMember.setQTFdirection(LocatorUtils);
|
||||
newMember.setQrb(new Location().getDistanceKmByTwoLocatorStrings(client.getChatPreferences().getStn_loginLocatorMainCat(), 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.setActivityTimeLastInEpoch(new Utils4KST().time_generateCurrentEpochTime());
|
||||
|
||||
// this.client.getChatMemberTable().put(splittedMessageLine[2], newMember); //TODO: map -> 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);
|
||||
}
|
||||
|
||||
@@ -390,31 +404,36 @@ public class MessageBusManagementThread extends Thread {
|
||||
|
||||
/**
|
||||
* 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)) {
|
||||
// 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();
|
||||
|
||||
newMember.setAirPlaneReflectInfo(new AirPlaneReflectionInfo());
|
||||
|
||||
newMember.setChatCategory(util_getChatCategoryByCategoryNrString(splittedMessageLine[1]));
|
||||
|
||||
newMember.setCallSign(splittedMessageLine[2]);
|
||||
newMember.setName(splittedMessageLine[3]);
|
||||
newMember.setQra(splittedMessageLine[4]);
|
||||
newMember.setState(Integer.parseInt(splittedMessageLine[5]));
|
||||
newMember.setLastActivity(new Utils4KST().time_generateActualTimeInDateFormat());
|
||||
newMember.setActivityTimeLastInEpoch(new Utils4KST().time_generateCurrentEpochTime());
|
||||
newMember.setQrb(new Location().getDistanceKmByTwoLocatorStrings(client.getChatPreferences().getLoginLocator(), newMember.getQra()));
|
||||
newMember.setQTFdirection(new Location(client.getChatPreferences().getLoginLocator()).getBearing(new Location(newMember.getQra())));
|
||||
newMember.setQrb(new Location().getDistanceKmByTwoLocatorStrings(client.getChatPreferences().getStn_loginLocatorMainCat(), newMember.getQra()));
|
||||
newMember.setQTFdirection(new Location(client.getChatPreferences().getStn_loginLocatorMainCat()).getBearing(new Location(newMember.getQra())));
|
||||
|
||||
newMember = this.client.getDbHandler().fetchChatMemberWkdDataForOnlyOneCallsignFromDB(newMember);
|
||||
|
||||
this.client.getLst_chatMemberList().add(newMember);
|
||||
|
||||
this.client.getDbHandler().storeChatMember(newMember);
|
||||
}
|
||||
|
||||
@@ -433,9 +452,9 @@ public class MessageBusManagementThread extends Thread {
|
||||
|
||||
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 ["
|
||||
+ this.client.getLst_chatMemberList().size() + "] :" + newMember.getCallSign());
|
||||
@@ -443,6 +462,8 @@ public class MessageBusManagementThread extends Thread {
|
||||
this.client.getLst_chatMemberList().remove(
|
||||
checkListForChatMemberIndexByCallSign(this.client.getLst_chatMemberList(), newMember));
|
||||
|
||||
//TODO: since 1.26 new method design to detect chatcategory, too!
|
||||
|
||||
} catch (Exception e) {
|
||||
System.out.println("[MSGBUSMGT, EXC!, Error:] User sent left chat but had not been there ... ["
|
||||
+ 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|
|
||||
*/
|
||||
if (splittedMessageLine[0].contains(CHATCHANNELMESSAGE)) {
|
||||
// System.out.println("MSGBUS: User detected");
|
||||
|
||||
ChatMessage newMessage = new ChatMessage();
|
||||
newMessage.setChatCategory(this.client.getCategory());
|
||||
newMessage.setMessageGeneratedTime(splittedMessageLine[2]);
|
||||
//experimental 1.26: multi channel messages
|
||||
ChatMessage newMessageArrived = new ChatMessage();
|
||||
ChatCategory chategoryForMessageAndMessageSender;
|
||||
|
||||
newMessageArrived.setChatCategory(util_getChatCategoryByCategoryNrString(splittedMessageLine[1]));
|
||||
|
||||
chategoryForMessageAndMessageSender = newMessageArrived.getChatCategory();
|
||||
newMessageArrived.setMessageGeneratedTime(splittedMessageLine[2]);
|
||||
|
||||
if (splittedMessageLine[3].equals("SERVER")) {
|
||||
ChatMember dummy = new ChatMember();
|
||||
dummy.setCallSign("SERVER");
|
||||
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 {
|
||||
|
||||
ChatMember sender = new ChatMember();
|
||||
sender.setCallSign(splittedMessageLine[3]);
|
||||
sender.setChatCategory(chategoryForMessageAndMessageSender);
|
||||
|
||||
int index = checkListForChatMemberIndexByCallSign(this.client.getLst_chatMemberList(), sender);
|
||||
|
||||
//if the user had been found in the active users list
|
||||
|
||||
if (index != -1) {
|
||||
//user found in the chatmember list
|
||||
//user not found in the chatmember list
|
||||
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());
|
||||
} catch (Exception exc) {
|
||||
ChatMember aSenderDummy = new ChatMember();
|
||||
aSenderDummy.setCallSign(splittedMessageLine[3] + "[n/a]");
|
||||
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!");
|
||||
exc.printStackTrace();
|
||||
}
|
||||
// b4 init list
|
||||
} else {
|
||||
//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());
|
||||
// if someone sent a message without being in the userlist (cause
|
||||
// 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
|
||||
ChatMember dummy = new ChatMember();
|
||||
dummy.setCallSign("ALL");
|
||||
newMessage.setReceiver(dummy);
|
||||
newMessageArrived.setReceiver(dummy);
|
||||
|
||||
AirPlaneReflectionInfo preventNullpointerExc = new AirPlaneReflectionInfo();
|
||||
preventNullpointerExc.setAirPlanesReachableCntr(0);
|
||||
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]);
|
||||
newMessage.setMessageText(splittedMessageLine[6]);
|
||||
newMessageArrived.setMessageSenderName(splittedMessageLine[4]);
|
||||
newMessageArrived.setMessageText(splittedMessageLine[6]);
|
||||
|
||||
if (splittedMessageLine[7].equals("0")) {
|
||||
// message is not directed to anyone, move it to the cq messages!
|
||||
ChatMember dummy = new ChatMember();
|
||||
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, newMessage); // sdtout to all message-List //TODO: change, moved to globalmessagelist
|
||||
this.client.getLst_globalChatMessageList().add(0, newMessageArrived); // sdtout to all message-List
|
||||
|
||||
} else {
|
||||
//message is directed to another chatmember, process as such!
|
||||
|
||||
ChatMember receiver = new ChatMember();
|
||||
|
||||
receiver.setChatCategory(chategoryForMessageAndMessageSender); //got out of message itself
|
||||
|
||||
receiver.setCallSign(splittedMessageLine[7]);
|
||||
|
||||
int index = checkListForChatMemberIndexByCallSign(this.client.getLst_chatMemberList(), receiver);
|
||||
|
||||
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...
|
||||
} 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
|
||||
* 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.
|
||||
*/
|
||||
|
||||
receiver.setCallSign(client.getChatPreferences().getLoginCallSign());
|
||||
newMessage.setReceiver(receiver);
|
||||
receiver.setCallSign(client.getChatPreferences().getStn_loginCallSign());
|
||||
newMessageArrived.setReceiver(receiver);
|
||||
} else {
|
||||
//this are user which left chat but had been adressed by this message
|
||||
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 {
|
||||
/**
|
||||
* message is directed to me, will be put in the "to me" messagelist
|
||||
*/
|
||||
if (newMessage.getReceiver().getCallSign()
|
||||
.equals(this.client.getChatPreferences().getLoginCallSign())) {
|
||||
if (newMessageArrived.getReceiver().getCallSign()
|
||||
.equals(this.client.getChatPreferences().getStn_loginCallSign())) {
|
||||
|
||||
// this.client.getLst_toMeMessageList().add(0, newMessage); //TODO: change, moved to globalmessagelist, original
|
||||
this.client.getLst_globalChatMessageList().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, newMessageArrived); //TODO: change, moved to globalmessagelist, original
|
||||
|
||||
if (this.client.getChatPreferences().isNotify_playSimpleSounds()) {
|
||||
this.client.getPlayAudioUtils().playNoiseLauncher('P');
|
||||
}
|
||||
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()) {
|
||||
this.client.getPlayAudioUtils().playVoiceLauncher( "?" + newMessage.getSender().getCallSign().toUpperCase());
|
||||
this.client.getPlayAudioUtils().playVoiceLauncher( "?" + newMessageArrived.getSender().getCallSign().toUpperCase());
|
||||
}
|
||||
|
||||
if (this.client.getChatPreferences().isNotify_playSimpleSounds()) {
|
||||
if (newMessage.getMessageText().toUpperCase().contains("//BELL")) {
|
||||
if (newMessageArrived.getMessageText().toUpperCase().contains("//BELL")) {
|
||||
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()
|
||||
.equals(this.client.getChatPreferences().getLoginCallSign().toUpperCase())) {
|
||||
automaticAnswer.setSender(itsMe);
|
||||
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 from me will appear in the PM window, too, with (>CALLSIGN) before
|
||||
*/
|
||||
String originalMessage = newMessage.getMessageText();
|
||||
newMessage
|
||||
.setMessageText("(>" + newMessage.getReceiver().getCallSign() + ")" + originalMessage);
|
||||
// this.client.getLst_toMeMessageList().add(0, newMessage); //TODO: change, moved to globalmessagelist, original
|
||||
this.client.getLst_globalChatMessageList().add(0,newMessage);//TODO: change, moved to globalmessagelist
|
||||
String originalMessage = newMessageArrived.getMessageText();
|
||||
newMessageArrived
|
||||
.setMessageText("(>" + newMessageArrived.getReceiver().getCallSign() + ")" + originalMessage);
|
||||
this.client.getLst_globalChatMessageList().add(0,newMessageArrived);
|
||||
|
||||
// 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
|
||||
|
||||
} else {
|
||||
//message sent to other user
|
||||
// this.client.getLst_toOtherMessageList().add(0, newMessage); //TODO: change, moved to globalmessagelist, original
|
||||
if (DirectionUtils.isInAngleAndRange(client.getChatPreferences().getLoginLocator(),
|
||||
newMessage.getSender().getQra(),
|
||||
newMessage.getReceiver().getQra(),
|
||||
// this.client.getLst_toOtherMessageList().add(0, newMessageArrived); //TODO: change, moved to globalmessagelist, original
|
||||
if (DirectionUtils.isInAngleAndRange(client.getChatPreferences().getStn_loginLocatorMainCat(),
|
||||
newMessageArrived.getSender().getQra(),
|
||||
newMessageArrived.getReceiver().getQra(),
|
||||
client.getChatPreferences().getStn_maxQRBDefault(),
|
||||
client.getChatPreferences().getStn_antennaBeamWidthDeg())) {
|
||||
|
||||
if (this.client.getChatPreferences().isNotify_playSimpleSounds()) {
|
||||
//play only tick sound if the sender was not set directedtome before
|
||||
if (!newMessage.getSender().isInAngleAndRange()) {
|
||||
if (!newMessageArrived.getSender().isInAngleAndRange()) {
|
||||
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())));
|
||||
|
||||
newMessageArrived.getSender().setInAngleAndRange(true);
|
||||
|
||||
if (client.getChatPreferences().isNotify_dxClusterServerEnabled()) {
|
||||
try {
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
System.out.println(">>>>>>>>>> Anglewarning <<<<<<<<<< " + 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())));
|
||||
|
||||
} else {
|
||||
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())) +
|
||||
" ; sender bearing to me: " + new Location(newMessage.getSender().getQra()).getBearing(new Location(client.getChatPreferences().getLoginLocator())));
|
||||
newMessage.getSender().setInAngleAndRange(false);
|
||||
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, newMessage);
|
||||
// System.out.println("MSGBS bgfx: tx call = " + newMessage.getSender().getCallSign() + " / rx call = " + newMessage.getReceiver().getCallSign());
|
||||
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) {
|
||||
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
|
||||
|
||||
// newMessage.setReceiver(this.client.getChatMemberTable().get(splittedMessageLine[7])); // set sender
|
||||
// newMessageArrived.setReceiver(this.client.getChatMemberTable().get(splittedMessageLine[7])); // set sender
|
||||
// to the
|
||||
// member of
|
||||
// before
|
||||
@@ -662,11 +746,16 @@ public class MessageBusManagementThread extends Thread {
|
||||
// list
|
||||
}
|
||||
|
||||
// System.out.println("[MSGBUSMGT:] processed message: " + newMessage.getChatCategory().getCategoryNumber()
|
||||
// + " " + newMessage.getSender().getCallSign() + ", " + newMessage.getMessageSenderName() + " -> "
|
||||
// + newMessage.getReceiver().getCallSign() + ": " + newMessage.getMessageText());
|
||||
try {
|
||||
|
||||
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);
|
||||
|
||||
@@ -676,14 +765,10 @@ public class MessageBusManagementThread extends Thread {
|
||||
// no qrg found, nothing to do
|
||||
} else {
|
||||
|
||||
// String stringAggregation = "";
|
||||
//
|
||||
// for (int i = 0; i < locatedFrequencies.length; i++) {
|
||||
// stringAggregation += locatedFrequencies[i] + " ";
|
||||
// }
|
||||
|
||||
ChatMember temp3 = new ChatMember();
|
||||
temp3.setCallSign(splittedMessageLine[3]);
|
||||
temp3.setChatCategory(chategoryForMessageAndMessageSender);
|
||||
|
||||
int index = checkListForChatMemberIndexByCallSign(this.client.getLst_chatMemberList(), temp3);
|
||||
|
||||
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]
|
||||
+ " 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();
|
||||
|
||||
newMember.setCallSign(splittedMessageLine[3]);
|
||||
newMember.setName(splittedMessageLine[4]);
|
||||
newMember.setFrequency(qrg);
|
||||
// newMember.setFrequency(locatedFrequencies);
|
||||
// this.client.getLst_chatMemberList().add(newMember);
|
||||
|
||||
} else {
|
||||
/**
|
||||
@@ -709,6 +793,8 @@ public class MessageBusManagementThread extends Thread {
|
||||
this.client.getLst_chatMemberList().get(index).setFrequency(qrg);
|
||||
System.out.println("[MSGBUSMGT:] Frequency for " + splittedMessageLine[3] + " setted: "
|
||||
+ 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");
|
||||
|
||||
ChatMember temp4 = new ChatMember();
|
||||
temp4.setChatCategory(this.client.getChatCategoryMain()); //not really detectable and not really neccessarry to detect
|
||||
|
||||
temp4.setCallSign(splittedMessageLine[2]);
|
||||
temp4.setQra(splittedMessageLine[3]);
|
||||
temp4.setLastActivity(new Utils4KST().time_generateActualTimeInDateFormat());
|
||||
@@ -737,21 +825,20 @@ public class MessageBusManagementThread extends Thread {
|
||||
+ this.client.getLst_chatMemberList().get(index).getQra() + " new is: "
|
||||
+ 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])));
|
||||
ChatMember foundThisInChatMemberList = this.client.getLst_chatMemberList().get(index); //make less list accesses
|
||||
|
||||
// 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 {
|
||||
System.out.println("[MSGBUSMGT:] ERROR! Locator Change of ["
|
||||
+ (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
|
||||
@@ -873,6 +960,8 @@ public class MessageBusManagementThread extends Thread {
|
||||
|
||||
// System.out.println("[MSGBUSMGT:] DXCluster Message detected ");
|
||||
|
||||
stateChangeMember.setChatCategory(util_getChatCategoryByCategoryNrString(splittedMessageLine[1]));
|
||||
|
||||
int index = checkListForChatMemberIndexByCallSign(this.client.getLst_chatMemberList(),
|
||||
stateChangeMember);
|
||||
|
||||
@@ -892,13 +981,15 @@ public class MessageBusManagementThread extends Thread {
|
||||
|
||||
ChatMember stateChangeMember = new ChatMember();
|
||||
|
||||
stateChangeMember.setChatCategory(util_getChatCategoryByCategoryNrString(splittedMessageLine[1]));
|
||||
|
||||
stateChangeMember.setCallSign(splittedMessageLine[2]);
|
||||
stateChangeMember.setName(splittedMessageLine[3]);
|
||||
stateChangeMember.setQra(splittedMessageLine[4]);
|
||||
stateChangeMember.setState(Integer.parseInt(splittedMessageLine[5]));
|
||||
stateChangeMember.setLastActivity(new Utils4KST().time_generateActualTimeInDateFormat());
|
||||
stateChangeMember.setQrb(new Location().getDistanceKmByTwoLocatorStrings(client.getChatPreferences().getLoginLocator(), stateChangeMember.getQra()));
|
||||
stateChangeMember.setQTFdirection(new Location(client.getChatPreferences().getLoginLocator()).getBearing(new Location(stateChangeMember.getQra())));
|
||||
stateChangeMember.setQrb(new Location().getDistanceKmByTwoLocatorStrings(client.getChatPreferences().getStn_loginLocatorMainCat(), 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
|
||||
// upodate
|
||||
@@ -915,14 +1006,6 @@ public class MessageBusManagementThread extends Thread {
|
||||
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
|
||||
|
||||
/**
|
||||
@@ -961,7 +1044,7 @@ public class MessageBusManagementThread extends Thread {
|
||||
pwErrorMsg.setMessageText(splittedMessageLine[2]);
|
||||
|
||||
ChatMember receiverDummy = new ChatMember();
|
||||
receiverDummy.setCallSign(client.getChatPreferences().getLoginCallSign());
|
||||
receiverDummy.setCallSign(client.getChatPreferences().getStn_loginCallSign());
|
||||
receiverDummy.setQrb(0.);
|
||||
receiverDummy.setQTFdirection(0.);
|
||||
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
|
||||
public void interrupt() {
|
||||
super.interrupt();
|
||||
@@ -1118,10 +1223,10 @@ public class MessageBusManagementThread extends Thread {
|
||||
try {
|
||||
processRXMessage23001(messageTextRaw);
|
||||
} catch (IOException e) {
|
||||
// TODO Auto-generated catch block
|
||||
System.out.println("MsgBusMgt: process23001 went wrong / IO Error");
|
||||
e.printStackTrace();
|
||||
} catch (SQLException e) {
|
||||
// TODO Auto-generated catch block
|
||||
System.out.println("MsgBusMgt: process23001 went wrong / SQL Error");
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
@@ -1130,7 +1235,7 @@ public class MessageBusManagementThread extends Thread {
|
||||
this.interrupt();
|
||||
|
||||
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();
|
||||
}
|
||||
{
|
||||
|
||||
@@ -2,6 +2,7 @@ package kst4contest.controller;
|
||||
|
||||
import java.io.*;
|
||||
import java.net.*;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
|
||||
import kst4contest.model.ChatMessage;
|
||||
|
||||
@@ -39,7 +40,7 @@ public class ReadThread extends Thread {
|
||||
|
||||
try {
|
||||
input = socket.getInputStream();
|
||||
reader = new BufferedReader(new InputStreamReader(input));
|
||||
reader = new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8));
|
||||
|
||||
} catch (IOException ex) {
|
||||
System.out.println("Error getting input stream: " + ex.getMessage());
|
||||
|
||||
@@ -3,6 +3,7 @@ package kst4contest.controller;
|
||||
import java.io.*;
|
||||
import java.net.*;
|
||||
import java.sql.SQLException;
|
||||
import java.util.ArrayList;
|
||||
|
||||
import javax.xml.XMLConstants;
|
||||
import javax.xml.parsers.DocumentBuilder;
|
||||
@@ -195,8 +196,12 @@ public class ReadUDPbyUCXMessageThread extends Thread {
|
||||
// call = call.toLowerCase();
|
||||
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()
|
||||
+ "call: " + call + " / " + band);
|
||||
+ "call: " + call + " / " + band + " ----> " + points + " POINTS");
|
||||
|
||||
// client.getChatPreferences().setBcn_contestScoreSum(Long.parseLong(points));
|
||||
|
||||
ChatMember workedCall = new ChatMember();
|
||||
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:
|
||||
System.out.println("[ReadUDPFromUCX, Error:] unexpected band value: \"" + band + "\"");
|
||||
break;
|
||||
@@ -256,79 +299,150 @@ public class ReadUDPbyUCXMessageThread extends Thread {
|
||||
|
||||
// modifyThat = (ChatMember) client.getMap_ucxLogInfoWorkedCalls().get(call);
|
||||
|
||||
int indexOfChatMemberInTable = -1;
|
||||
indexOfChatMemberInTable = client.checkListForChatMemberIndexByCallSign(workedCall);
|
||||
// asd //TODO: Check if callsign and callsignraw is similar, then mark first and further via new checklistforchatmembermultiplemethod with array of indize
|
||||
|
||||
if (indexOfChatMemberInTable == -1) {
|
||||
// do nothing
|
||||
ArrayList<Integer> markTheseChattersAsWorked = client.checkListForChatMemberIndexesByCallSign(workedCall);
|
||||
|
||||
if (markTheseChattersAsWorked.isEmpty()) {
|
||||
//Worked call is not part of the chatmember list
|
||||
} else {
|
||||
modifyThat = client.getLst_chatMemberList().get(indexOfChatMemberInTable);
|
||||
// modifyThat.setWorked(true);
|
||||
for (int index : markTheseChattersAsWorked) {
|
||||
modifyThat = client.getLst_chatMemberList().get(index);
|
||||
|
||||
client.getLst_chatMemberList()
|
||||
.get(client.checkListForChatMemberIndexByCallSign(modifyThat)).setWorked(true);
|
||||
modifyThat.setWorked(true);
|
||||
// client.getLst_chatMemberList()
|
||||
// .get(client.checkListForChatMemberIndexByCallSign(modifyThat)).setWorked(true);
|
||||
|
||||
if (workedCall.isWorked144()) {
|
||||
modifyThat.setWorked144(true);
|
||||
client.getLst_chatMemberList()
|
||||
.get(client.checkListForChatMemberIndexByCallSign(modifyThat))
|
||||
.setWorked144(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.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.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.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.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.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);
|
||||
} 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{
|
||||
|
||||
try {
|
||||
|
||||
GuiUtils.triggerGUIFilteredChatMemberListChange(client); //not clean at all
|
||||
} catch (Exception IllegalStateException) {
|
||||
//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);
|
||||
// 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
|
||||
// station had not been stored. DBHandler will store the informations then.
|
||||
// station had not been stored. DBHandler will store the information then.
|
||||
if (!isInChat) {
|
||||
|
||||
workedCall.setName("unknown");
|
||||
@@ -348,7 +462,6 @@ public class ReadUDPbyUCXMessageThread extends Thread {
|
||||
fileWriterPersistUDPToFile = new FileWriter(logUDPMessageToThisFile, true);
|
||||
|
||||
} catch (IOException e1) {
|
||||
// TODO Auto-generated catch block
|
||||
e1.printStackTrace();
|
||||
}
|
||||
|
||||
@@ -424,7 +537,7 @@ public class ReadUDPbyUCXMessageThread extends Thread {
|
||||
// System.out.println("Radio Mode: " + mode);
|
||||
// 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);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -178,7 +178,7 @@ public class UpdateChecker {
|
||||
for (int i = 0; i < element.getChildNodes().getLength(); i++) {
|
||||
|
||||
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());
|
||||
aChangeLogEntry[childNodeCounter] = aChangeLogEntry[childNodeCounter] + element.getChildNodes().item(i).getTextContent();
|
||||
childNodeCounter++;
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
package kst4contest.controller;
|
||||
|
||||
import javafx.beans.property.SimpleStringProperty;
|
||||
|
||||
import java.text.DateFormat;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.time.OffsetDateTime;
|
||||
@@ -7,6 +9,8 @@ import java.time.ZoneOffset;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.Date;
|
||||
import java.util.TimeZone;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
public class Utils4KST {
|
||||
|
||||
@@ -20,6 +24,14 @@ public class Utils4KST {
|
||||
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() {
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -2,6 +2,8 @@ package kst4contest.controller;
|
||||
|
||||
import java.io.*;
|
||||
import java.net.*;
|
||||
import java.nio.charset.Charset;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
|
||||
import kst4contest.model.ChatMessage;
|
||||
|
||||
@@ -17,7 +19,7 @@ public class WriteThread extends Thread {
|
||||
private ChatController client;
|
||||
private OutputStream output;
|
||||
|
||||
private ChatMessage messageTextRaw;
|
||||
private ChatMessage messageToBeSend;
|
||||
|
||||
public WriteThread(Socket socket, ChatController client) throws InterruptedException {
|
||||
this.socket = socket;
|
||||
@@ -25,7 +27,9 @@ public class WriteThread extends Thread {
|
||||
|
||||
try {
|
||||
output = socket.getOutputStream();
|
||||
writer = new PrintWriter(output, true);
|
||||
|
||||
writer = new PrintWriter(output, true, StandardCharsets.UTF_8);
|
||||
|
||||
} catch (IOException ex) {
|
||||
System.out.println("Error getting output stream: " + ex.getMessage());
|
||||
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
|
||||
* 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
|
||||
* @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
|
||||
* 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 {
|
||||
|
||||
// writer.println(messageToServer.getMessageText());
|
||||
messageTextRaw = messageToServer;
|
||||
messageToBeSend = messageToServer;
|
||||
|
||||
try {
|
||||
|
||||
messageTextRaw = client.getMessageTXBus().take();
|
||||
messageToBeSend = client.getMessageTXBus().take();
|
||||
// this.client.getmesetChatsetServerready(true);
|
||||
|
||||
} catch (InterruptedException e) {
|
||||
// TODO Auto-generated catch block
|
||||
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
|
||||
* to the community
|
||||
*/
|
||||
|
||||
try {
|
||||
tx(messageTextRaw);
|
||||
System.out.println("BUS: tx: " + messageTextRaw.getMessageText());
|
||||
tx(messageToBeSend);
|
||||
System.out.println("BUS: tx: " + messageToBeSend.getMessageText());
|
||||
|
||||
} catch (InterruptedException e) {
|
||||
// TODO Auto-generated catch block
|
||||
@@ -95,8 +126,8 @@ public class WriteThread extends Thread {
|
||||
// ownMSG.setMessageText(
|
||||
// "MSG|" + this.client.getCategory().getCategoryNumber() + "|0|" + messageLine + "|0|");
|
||||
|
||||
ownMSG.setMessageText("MSG|" + this.client.getChatPreferences().getLoginChatCategory().getCategoryNumber()
|
||||
+ "|0|" + messageLine + "|0|");
|
||||
ownMSG.setMessageText("MSG|" + this.client.getChatPreferences().getLoginChatCategoryMain().getCategoryNumber()
|
||||
+ "|0|" + messageLine + "|0|"); //original before 1.26
|
||||
|
||||
try {
|
||||
tx(ownMSG);
|
||||
@@ -108,7 +139,7 @@ public class WriteThread extends Thread {
|
||||
}
|
||||
}
|
||||
|
||||
if (messageTextRaw.equals("/QUIT")) {
|
||||
if (messageToBeSend.equals("/QUIT")) {
|
||||
try {
|
||||
this.client.getReadThread().terminateConnection();
|
||||
this.client.getReadThread().interrupt();
|
||||
@@ -117,7 +148,6 @@ public class WriteThread extends Thread {
|
||||
this.interrupt();
|
||||
|
||||
} catch (IOException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
@@ -137,59 +167,62 @@ public class WriteThread extends Thread {
|
||||
|
||||
while (true) {
|
||||
try {
|
||||
messageTextRaw = client.getMessageTXBus().take();
|
||||
messageToBeSend = client.getMessageTXBus().take();
|
||||
|
||||
if (messageTextRaw.getMessageText().equals("POISONPILL_KILLTHREAD")
|
||||
&& messageTextRaw.getMessageSenderName().equals("POISONPILL_KILLTHREAD")) {
|
||||
if (messageToBeSend.getMessageText().equals("POISONPILL_KILLTHREAD")
|
||||
&& messageToBeSend.getMessageSenderName().equals("POISONPILL_KILLTHREAD")) {
|
||||
client.getMessageRXBus().clear();
|
||||
this.interrupt();
|
||||
break;
|
||||
} 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
|
||||
* to the community
|
||||
*/
|
||||
|
||||
try {
|
||||
tx(messageTextRaw);
|
||||
System.out.println("BUS: tx: " + messageTextRaw.getMessageText());
|
||||
tx(messageToBeSend);
|
||||
System.out.println("BUS: tx: " + messageToBeSend.getMessageText());
|
||||
|
||||
} catch (InterruptedException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
} else {
|
||||
} else { //message is not directed to the server, it´s directed to all or to a station
|
||||
|
||||
ChatMessage ownMSG = new ChatMessage();
|
||||
if (messageToBeSend.getChatCategory() == this.client.getChatCategoryMain() || messageToBeSend.getChatCategory() == this.client.getChatCategorySecondChat()) {
|
||||
|
||||
// ownMSG.setMessageText(
|
||||
// "MSG|" + this.client.getCategory().getCategoryNumber() + "|0|" + messageLine + "|0|");
|
||||
txByRxmsgCatOrigin(messageToBeSend);
|
||||
|
||||
ownMSG.setMessageText(
|
||||
"MSG|" + this.client.getChatPreferences().getLoginChatCategory().getCategoryNumber() + "|0|"
|
||||
+ messageLine + "|0|");
|
||||
} else { //default bhv if destination cat is not detectable
|
||||
|
||||
try {
|
||||
tx(ownMSG);
|
||||
System.out.println("BUS: tx: " + ownMSG.getMessageText());
|
||||
|
||||
} catch (InterruptedException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
ChatMessage ownMSG = new ChatMessage();
|
||||
|
||||
ownMSG.setMessageText(
|
||||
"MSG|" + this.client.getChatPreferences().getLoginChatCategoryMain().getCategoryNumber() + "|0|"
|
||||
+ messageLine + "|0|");
|
||||
|
||||
try {
|
||||
tx(ownMSG);
|
||||
System.out.println("WT: tx (raw): " + ownMSG.getMessageText());
|
||||
|
||||
} catch (InterruptedException e) {
|
||||
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);
|
||||
|
||||
} catch (InterruptedException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
client.getMessageTXBus().clear();
|
||||
}
|
||||
|
||||
@@ -53,28 +53,17 @@ public class ChatCategory {
|
||||
|
||||
public ChatCategory(int setThiscategoryNumber) {
|
||||
this.categoryNumber = setThiscategoryNumber;
|
||||
setCategoryNumber(setThiscategoryNumber);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
public int getCategoryNumber() {
|
||||
return categoryNumber;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
public void setCategoryNumber(int categoryNumber) {
|
||||
this.categoryNumber = categoryNumber;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Returns an Array of int with possible frequency prefixes, due to in the chat
|
||||
* normally the following format is used (not ever): <br/>
|
||||
|
||||
@@ -14,6 +14,9 @@ public class ChatMember {
|
||||
String callSign;
|
||||
String qra;
|
||||
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
|
||||
|
||||
@@ -22,7 +25,7 @@ public class ChatMember {
|
||||
StringProperty frequency = new SimpleStringProperty();
|
||||
|
||||
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
|
||||
|
||||
long activityTimeLastInEpoch; // time of last activity in epochtimesec
|
||||
@@ -312,10 +315,25 @@ public class ChatMember {
|
||||
|
||||
public void setWorked(boolean 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
|
||||
* for worked info, called by appcontroller
|
||||
@@ -352,9 +370,9 @@ public class ChatMember {
|
||||
public String toString() {
|
||||
String chatMemberSerialization = "";
|
||||
|
||||
chatMemberSerialization += callSign + ";" + name + ";" + qra + ";" + frequency + ";" + worked + ";" + worked144
|
||||
+ ";" + worked432 + ";" + worked1240 + ";" + worked2300 + ";" + worked3400 + ";" + worked5600 + ";"
|
||||
+ worked10G;
|
||||
chatMemberSerialization += callSign + ";" + name + ";" + qra + ";" + frequency + "; wkd " + worked + "; wkd144 " + worked144
|
||||
+ "; wkd432" + worked432 + "; wkd1240" + worked1240 + "; wkd2300" + worked2300 + "; wkd3400" + worked3400 + "; wkd5600" + worked5600 + "; wkd10G"
|
||||
+ worked10G + " ; " + chatCategory;
|
||||
|
||||
return chatMemberSerialization;
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -3,7 +3,7 @@ package kst4contest.model;
|
||||
import java.util.ArrayList;
|
||||
|
||||
public class UpdateInformation {
|
||||
double latestVersionNumberOnServer = 100; //dummy value to prevent nullpointerexc
|
||||
double latestVersionNumberOnServer = 1.26; //dummy value to prevent nullpointerexc
|
||||
String adminMessage ="";
|
||||
String majorChanges ="";
|
||||
String latestVersionPathOnWebserver="";
|
||||
|
||||
131
src/main/java/kst4contest/test/PatternMatcherTest.java
Normal file
131
src/main/java/kst4contest/test/PatternMatcherTest.java
Normal 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")));
|
||||
}
|
||||
}
|
||||
@@ -4,9 +4,12 @@ import kst4contest.controller.ChatController;
|
||||
import kst4contest.model.ChatMember;
|
||||
|
||||
import java.util.function.Predicate;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
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
|
||||
* 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.]+");
|
||||
}
|
||||
|
||||
/**
|
||||
* 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) {
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
154
src/main/resources/KST4ContestDefaultDay.css
Normal file
154
src/main/resources/KST4ContestDefaultDay.css
Normal 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;
|
||||
}
|
||||
192
src/main/resources/KST4ContestDefaultEvening.css
Normal file
192
src/main/resources/KST4ContestDefaultEvening.css
Normal 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;
|
||||
}
|
||||
125
src/main/resources/praktiKSTpreferences.old
Normal file
125
src/main/resources/praktiKSTpreferences.old
Normal 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>
|
||||
@@ -3,15 +3,18 @@
|
||||
<station>
|
||||
<LoginCallSign>DO5AMF</LoginCallSign>
|
||||
<LoginPassword>changeMe</LoginPassword>
|
||||
<LoginDisplayedName>KST4Contest</LoginDisplayedName>
|
||||
<LoginLocator>JO51IJ</LoginLocator>
|
||||
<LoginDisplayedName>KST4Contest1263</LoginDisplayedName>
|
||||
<stn_loginNameSecondCat>KST4Contest1263</stn_loginNameSecondCat>
|
||||
<LoginLocator>JO54ME</LoginLocator>
|
||||
<ChatCategory>2</ChatCategory>
|
||||
<stn_antennaBeamWidthDeg>50.0</stn_antennaBeamWidthDeg>
|
||||
<stn_maxQRBDefault>900.0</stn_maxQRBDefault>
|
||||
<ChatCategorySecond>3</ChatCategorySecond>
|
||||
<stn_secondCatEnabled>true</stn_secondCatEnabled>
|
||||
<stn_antennaBeamWidthDeg>60.0</stn_antennaBeamWidthDeg>
|
||||
<stn_maxQRBDefault>1333.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_bandActive1240>true</stn_bandActive1240>
|
||||
<stn_bandActive2300>false</stn_bandActive2300>
|
||||
<stn_bandActive3400>false</stn_bandActive3400>
|
||||
<stn_bandActive5600>false</stn_bandActive5600>
|
||||
@@ -26,11 +29,11 @@
|
||||
</logsynch>
|
||||
<trxSynchUCX>
|
||||
<trxSynch_ucxLogUDPListenerEnabled>true</trxSynch_ucxLogUDPListenerEnabled>
|
||||
<trxSynch_defaultMYQRGValue>144.374.50</trxSynch_defaultMYQRGValue>
|
||||
<trxSynch_defaultMYQRGValue>144.123.00</trxSynch_defaultMYQRGValue>
|
||||
</trxSynchUCX>
|
||||
<AirScoutQuerier>
|
||||
<asQry_airScoutCommunicationEnabled>true</asQry_airScoutCommunicationEnabled>
|
||||
<asQry_airScoutServerName>KST</asQry_airScoutServerName>
|
||||
<asQry_airScoutServerName>AS</asQry_airScoutServerName>
|
||||
<asQry_airScoutClientName>KST</asQry_airScoutClientName>
|
||||
<asQry_airScoutUDPPort>9872</asQry_airScoutUDPPort>
|
||||
<asQry_airScoutBandValue>1440000</asQry_airScoutBandValue>
|
||||
@@ -39,13 +42,17 @@
|
||||
<notify_SimpleAudioNotificationsEnabled>true</notify_SimpleAudioNotificationsEnabled>
|
||||
<notify_CWCallsignAudioNotificationsEnabled>true</notify_CWCallsignAudioNotificationsEnabled>
|
||||
<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>
|
||||
<shortCuts>
|
||||
<t>Hi OM,</t>
|
||||
<t>pse</t>
|
||||
<t>Hi OM, try Sked? FIRSTAP</t>
|
||||
<t>TNX qso, 73!</t>
|
||||
<t>turn</t>
|
||||
<t>ant</t>
|
||||
<t>my</t>
|
||||
<t>dir</t>
|
||||
<t>sked</t>
|
||||
<t>ssb</t>
|
||||
@@ -78,6 +85,7 @@
|
||||
<t>,</t>
|
||||
<t>/SETNAME MYQRG</t>
|
||||
<t>MYQRG</t>
|
||||
<t>SECONDQRG</t>
|
||||
</shortCuts>
|
||||
<textSnippets>
|
||||
<t>Hi QRZNAME, try sked 2m? Ur QRG?</t>
|
||||
@@ -101,9 +109,12 @@
|
||||
<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>
|
||||
<beaconCQText>_.~'"´"'~.__.~'´ CQ CQ CQ NAC de MYCALL, pse try 144.317 for JO54 `'~.__.~'"`"'~._</beaconCQText>
|
||||
<beaconCQIntervalMinutes>1</beaconCQIntervalMinutes>
|
||||
<beaconCQEnabled>false</beaconCQEnabled>
|
||||
<beaconCQTextSecondText>_.~'"´"'~.__.~'´ CQ CQ CQ de MYCALL, pse sked or SECONDQRG `'~.__.~'"`"'~._</beaconCQTextSecondText>
|
||||
<beaconCQIntervalMinutesSecondCat>3</beaconCQIntervalMinutesSecondCat>
|
||||
<beaconCQEnabledSecondCat>false</beaconCQEnabledSecondCat>
|
||||
</beaconCQ>
|
||||
<beaconUnworkedstations>
|
||||
<beaconUnworkedstationsText>Hi OM, pse Sked at MYQRG or your QRG</beaconUnworkedstationsText>
|
||||
@@ -111,15 +122,28 @@
|
||||
<beaconUnworkedstationsEnabled>false</beaconUnworkedstationsEnabled>
|
||||
<beaconUnworkedstationsPrefix>OE</beaconUnworkedstationsPrefix>
|
||||
</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>
|
||||
<GUIscn_ChatwindowMainSceneSizeHW>748.0;1544.800048828125</GUIscn_ChatwindowMainSceneSizeHW>
|
||||
<GUIclusterAndQSOMonStage_SceneSizeHW>765.5999755859375;467.20001220703125</GUIclusterAndQSOMonStage_SceneSizeHW>
|
||||
<GUIscn_ChatwindowMainSceneSizeHW>1080.800048828125;2048.0</GUIscn_ChatwindowMainSceneSizeHW>
|
||||
<GUIclusterAndQSOMonStage_SceneSizeHW>1196.800048828125;259.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>
|
||||
<GUIselectedCallSignSplitPane_dividerposition>0.5154494382022472</GUIselectedCallSignSplitPane_dividerposition>
|
||||
<GUImainWindowLeftSplitPane_dividerposition>0.45846364347146207</GUImainWindowLeftSplitPane_dividerposition>
|
||||
<GUImessageSectionSplitpane_dividerposition>0.5284522003034902;0.5853566009104704;0.6157056145675266</GUImessageSectionSplitpane_dividerposition>
|
||||
<GUImainWindowRightSplitPane_dividerposition>0.5749241274658573</GUImainWindowRightSplitPane_dividerposition>
|
||||
<GUIpnl_directedMSGWin_dividerpositionDefault>0.1754658301944221</GUIpnl_directedMSGWin_dividerpositionDefault>
|
||||
</guiOptions>
|
||||
</praktiKST>
|
||||
@@ -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
|
||||
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
|
||||
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
|
||||
Reference in New Issue
Block a user