From 699793704816d9aeb7fa7c2dbd3523cdae8f188c Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Mon, 1 Apr 2019 11:01:39 +0100 Subject: [PATCH 001/159] UDP message client accepts any sender id on incoming datagrams This is a defect repair as it was intended that the message id is the sender identification but the erroneous implementation enforced it to be the receiver identification as sent with previous outgoing messages. --- MessageClient.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MessageClient.cpp b/MessageClient.cpp index 873ba1fd4..5bf23294b 100644 --- a/MessageClient.cpp +++ b/MessageClient.cpp @@ -152,7 +152,7 @@ void MessageClient::impl::parse_message (QByteArray const& msg) // message format is described in NetworkMessage.hpp // NetworkMessage::Reader in {msg}; - if (OK == check_status (in) && id_ == in.id ()) // OK and for us + if (OK == check_status (in)) { if (schema_ < in.schema ()) // one time record of server's // negotiated schema From 6b575d002921a6e826f3997cb6b72beedec759a1 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Fri, 5 Apr 2019 11:38:45 +0100 Subject: [PATCH 002/159] Latest AD1C cty.dat - BIG.CTY 27 March 2019 version --- cty.dat | 85 +++++++++++++++++++++++++++++---------------------------- 1 file changed, 43 insertions(+), 42 deletions(-) diff --git a/cty.dat b/cty.dat index 1f533072f..8da4e07fe 100644 --- a/cty.dat +++ b/cty.dat @@ -32,7 +32,7 @@ Vietnam: 26: 49: AS: 15.80: -107.90: -7.0: 3W: Guinea: 35: 46: AF: 11.00: 10.68: 0.0: 3X: 3X; Bouvet: 38: 67: AF: -54.42: -3.38: -1.0: 3Y/b: - =3Y/ZS6GCM,=3Y0C,=3Y0E; + =3Y/ZS6GCM,=3Y0C,=3Y0E,=3Y0I; Peter 1 Island: 12: 72: SA: -68.77: 90.58: 4.0: 3Y/p: =3Y0X; Azerbaijan: 21: 29: AS: 40.45: -47.37: -4.0: 4J: @@ -588,7 +588,7 @@ Cuba: 08: 11: NA: 21.50: 80.00: 5.0: CM: Morocco: 33: 37: AF: 32.00: 5.00: 0.0: CN: 5C,5D,5E,5F,5G,CN; Bolivia: 10: 12: SA: -17.00: 65.00: 4.0: CP: - CP,=VERSION, + CP, CP2[14], CP3[14], CP4[14], @@ -676,7 +676,8 @@ Spain: 14: 37: EU: 40.37: 4.88: -1.0: EA: =AO08CIK/H,=AO08CVV/Z,=AO08CXK/H,=AO08CYL/H,=AO08DI/Z,=AO08EIE/Z,=AO08HV/Z,=AO08ICA/Z,=AO08ID/Z, =AO08KJ/Z,=AO08KV/Z,=AO08OK/H,=AO08PB/Z,=AO08RKO/H,=AO08VK/Z,=AO2016DSS/LH,=EA2/ON7RU/LH, =EA2CRX/LH,=EA2EZ/P,=EA2SPS/LH,=EA2URI/O,=EA6SK/2,=EA9CP/2,=EG90IARU/2, - =EA3ESZ/Z,=EA3EVR/R,=EA3HSD/P,=EA3LD/D,=EA3RCV/PAZ,=EA8TL/3,=EA9CI/3,=EA9CP/3,=EG90IARU/3, + =EA3ESZ/Z,=EA3EVR/R,=EA3HSD/P,=EA3LD/D,=EA3RCV/PAZ,=EA6LU/3,=EA8TL/3,=EA9CI/3,=EA9CP/3, + =EG90IARU/3, =EA4AAQ/O,=EA4RCH/CIE,=EA6AFU/4,=EA6RC/4,=EA8BFH/4,=EA8BY/4,=EA9CI/4,=EA9CP/4,=EG8AOP/4, =EG90IARU/4, =EA5ADM/P,=EA5CC/P,=EA5EQ/N,=EA5EZ/P,=EA5FL/LH,=EA5GVT/AVW,=EA5HCC/P,=EA5IKT/P,=EA5KB/LH,=EA5ND/D, @@ -2245,7 +2246,7 @@ Cote d'Ivoire: 35: 46: AF: 7.58: 5.80: 0.0: TU: Benin: 35: 46: AF: 9.87: -2.25: -1.0: TY: TY; Mali: 35: 46: AF: 18.00: 2.58: 0.0: TZ: - TZ; + TZ,=VERSION; European Russia: 16: 29: EU: 53.65: -41.37: -4.0: UA: R,U,=R0CAF/1,=R25EMW(17)[19],=R7AB/M,=R7AB/P,=R80PSP,=R80UPOL,=R8CT/4/P,=R8FF/3/M,=R90DOSAAF, =R9AV/6,=R9FAZ/6/M,=R9FCH/6,=R9JI/1,=R9KC/6/M,=R9WR/1,=R9XAU/6,=RA0AM/6,=RA0BM/6,=RA0ZZ/3, @@ -2262,8 +2263,8 @@ European Russia: 16: 29: EU: 53.65: -41.37: -4.0: UA: =RN85AM,=RN85KN,=RT9T/1,=RU2FB/1,=RU9YT/1,=RU9YT/1/P,=RV1CC/M,=RW1AI/ANT,=RW8W/1,=RW9QA/1, =RX3AMI/1/LH,=UA1ADQ/ANT,=UA1BJ/ANT,=UA1JJ/ANT,=UA2FFX/1,=UA9B/1,=UA9KG/1,=UA9KGH/1,=UA9KK/1, =UA9UDX/1,=UB9YUW/1,=UE21A,=UE21B,=UE21M,=UE22A,=UE25AC,=UE25AQ,=UE2AT/1, - =R0XAC/1,=R900DM,=R90LPU,=R9JNO/1,=RA0FU/1,=RA9FNV/1,=RU9MU/1,=RV0CA/1,=RV2FW/1,=RV9JD/1,=RX9TN/1, - =UA0BDS/1,=UA0SIK/1,=UA1CDA/LH,=UA1CIO/LH,=UA9MQR/1,=UB5O/1, + =R0XAC/1,=R900DM,=R90LPU,=R9JNO/1,=RA0FU/1,=RA9FNV/1,=RN9N/1,=RU9MU/1,=RV0CA/1,=RV2FW/1,=RV9JD/1, + =RX9TN/1,=UA0BDS/1,=UA0SIK/1,=UA1CDA/LH,=UA1CIO/LH,=UA9MQR/1,=UB5O/1, R1N[19],RA1N[19],RC1N[19],RD1N[19],RE1N[19],RF1N[19],RG1N[19],RJ1N[19],RK1N[19],RL1N[19],RM1N[19], RN1N[19],RO1N[19],RQ1N[19],RT1N[19],RU1N[19],RV1N[19],RW1N[19],RX1N[19],RY1N[19],RZ1N[19],U1N[19], UA1N[19],UB1N[19],UC1N[19],UD1N[19],UE1N[19],UF1N[19],UG1N[19],UH1N[19],UI1N[19],=R01DTV/1[19], @@ -2317,8 +2318,8 @@ European Russia: 16: 29: EU: 53.65: -41.37: -4.0: UA: =R110A/P,=R80PVB, =RA9XF/3,=RC80KEDR,=RD0L/3,=RK0BWW/3,=RN80KEDR,=RW9XC/3/M,=RX3XX/N,=UA0KBA/3/P,=UA9SIV/3, =UE0ZOO/3, - =R100WWS,=R85WTA,=R8FF/3/P,=R98KPM,=R99KPM,=RA3YV/ANT,=RK0UT/3,=RW0LX/3,=UA3YH/ANT,=UA9KZ/3, - =UB8JAF/3,=UE91L,=UE95K,=UE95RA, + =R85WTA,=R8FF/3/P,=R98KPM,=R99KPM,=RA3YV/ANT,=RK0UT/3,=RW0LX/3,=UA3YH/ANT,=UA9KZ/3,=UB8JAF/3, + =UE91L,=UE95K,=UE95RA, =R3ZK/FF,=RA3ZZ/ANT,=RA9AK/3,=RA9KD/3,=RU3ZK/FF,=RW0BG/3,=UA0QBC/3, =RA07DR,=RA9ODR/4/M,=RC4AF/FF,=RN4ACA/FF,=RU9CK/6/M,=UA4ASE/FF,=UA4ATL/FF,=UA8WAA/6,=UA9FGR/4, =UE00S,=UE00S/P,=UE09VG,=UE80RWW, @@ -2503,15 +2504,15 @@ Asiatic Russia: 17: 30: AS: 55.88: -84.08: -7.0: UA9: RU9J[20],RV8J[20],RV9J[20],RW8J[20],RW9J[20],RX8J[20],RX9J[20],RY8J[20],RY9J[20],RZ8J[20], RZ9J[20],U8J[20],U9J[20],UA8J[20],UA9J[20],UB8J[20],UB9J[20],UC8J[20],UC9J[20],UD8J[20],UD9J[20], UE8J[20],UE9J[20],UF8J[20],UF9J[20],UG8J[20],UG9J[20],UH8J[20],UH9J[20],UI8J[20],UI9J[20], - =R120RJ[20],=R123JDR[20],=R15UGRA[20],=R16UGRA[20],=R18KSA[20],=R25ARCK/8[20],=R2AEA/9[20], - =R4YAC/9[20],=R8JAJ/M[20],=RA/UR8IF[20],=RA/UT2LA[20],=RA1QBH/9[20],=RA3ARS/9[20],=RA3ARS/9/M[20], - =RA3QQI/8[20],=RA4FCJ/9[20],=RA4HRM/9[20],=RA9WN/9[20],=RD4HM/9[20],=RJ9J[20],=RK4PA/9[20], - =RK6ANP/9[20],=RK6YM/8[20],=RK6YM/9[20],=RP67GS[20],=RP68GS[20],=RP68J[20],=RP68LK[20], - =RP69GS[20],=RP69SF[20],=RP70GS[20],=RP70LF[20],=RP70SF[20],=RP70SU[20],=RP70YF[20],=RP71GS[20], - =RP71LF[20],=RP71SF[20],=RP72DS[20],=RP72GS[20],=RP72SF[20],=RP72YF[20],=RP73GS[20],=RP73SF[20], - =RQ0C/8[20],=RU6YD/9[20],=RV6YM/9[20],=RW4HOH/9[20],=RW4LX/9[20],=RW6AHV/9[20],=RW9WX/9[20], - =RX3BP/9[20],=RX3BP/9/MM[20],=RZ5D/8[20],=RZ9WF/8[20],=RZ9WF/9[20],=UA3ZAF/9[20],=UA6WIO/9[20], - =UA9JFN/M[20], + =R11UND[20],=R120RJ[20],=R123JDR[20],=R15UGRA[20],=R16UGRA[20],=R18KSA[20],=R25ARCK/8[20], + =R2AEA/9[20],=R4YAC/9[20],=R8JAJ/M[20],=RA/UR8IF[20],=RA/UT2LA[20],=RA1QBH/9[20],=RA3ARS/9[20], + =RA3ARS/9/M[20],=RA3QQI/8[20],=RA4FCJ/9[20],=RA4HRM/9[20],=RA9WN/9[20],=RD4HM/9[20],=RJ9J[20], + =RK4PA/9[20],=RK6ANP/9[20],=RK6YM/8[20],=RK6YM/9[20],=RP67GS[20],=RP68GS[20],=RP68J[20], + =RP68LK[20],=RP69GS[20],=RP69SF[20],=RP70GS[20],=RP70LF[20],=RP70SF[20],=RP70SU[20],=RP70YF[20], + =RP71GS[20],=RP71LF[20],=RP71SF[20],=RP72DS[20],=RP72GS[20],=RP72SF[20],=RP72YF[20],=RP73GS[20], + =RP73SF[20],=RQ0C/8[20],=RU6YD/9[20],=RV6YM/9[20],=RW4HOH/9[20],=RW4LX/9[20],=RW6AHV/9[20], + =RW9WX/9[20],=RX3BP/9[20],=RX3BP/9/MM[20],=RZ5D/8[20],=RZ9WF/8[20],=RZ9WF/9[20],=UA3ZAF/9[20], + =UA6WIO/9[20],=UA9JFN/M[20], R8K[20],R9K[20],RA8K[20],RA9K[20],RC8K[20],RC9K[20],RD8K[20],RD9K[20],RE8K[20],RE9K[20],RF8K[20], RF9K[20],RG8K[20],RG9K[20],RI9K[20],RJ8K[20],RJ9K[20],RK8K[20],RK9K[20],RL8K[20],RL9K[20], RM8K[20],RM9K[20],RN8K[20],RN9K[20],RO8K[20],RO9K[20],RQ8K[20],RQ9K[20],RT8K[20],RT9K[20], @@ -2616,30 +2617,30 @@ Asiatic Russia: 17: 30: AS: 55.88: -84.08: -7.0: UA9: =RP69KM(18)[31],=RP70KM(18)[31],=RP70NM(18)[31],=RP70UK(18)[31],=RP70ZF(18)[31],=RP71KM(18)[31], =RP72KM(18)[31],=RP72NM(18)[31],=RP73KM(18)[31],=RP73NZ(18)[31],=RP73ZF(18)[31],=RT22UA(18)[31], =RT77VV(18)[31],=RW4CG/9(18)[31],=RZ5D/9(18)[31],=UA9JFE/9/P(18)[31],=UE3ATV/9(18)[31], - R100W(16),R8W(16),R9W(16),RA8W(16),RA9W(16),RC8W(16),RC9W(16),RD8W(16),RD9W(16),RE8W(16),RE9W(16), - RF8W(16),RF9W(16),RG8W(16),RG9W(16),RJ8W(16),RJ9W(16),RK8W(16),RK9W(16),RL8W(16),RL9W(16), - RM8W(16),RM9W(16),RN8W(16),RN9W(16),RO8W(16),RO9W(16),RQ8W(16),RQ9W(16),RT8W(16),RT9W(16), - RU8W(16),RU9W(16),RV8W(16),RV9W(16),RW8W(16),RW9W(16),RX8W(16),RX9W(16),RY8W(16),RY9W(16), - RZ8W(16),RZ9W(16),U8W(16),U9W(16),UA8W(16),UA9W(16),UB8W(16),UB9W(16),UC8W(16),UC9W(16),UD8W(16), - UD9W(16),UE8W(16),UE9W(16),UF8W(16),UF9W(16),UG8W(16),UG9W(16),UH8W(16),UH9W(16),UI8W(16), - UI9W(16),=R100W(16),=R10RTRS/9(16),=R18KDR/4(16),=R2013CG(16),=R2015AS(16),=R2015DS(16), - =R2015KM(16),=R2017F/P(16),=R20BIS(16),=R20UFA(16),=R25ARCK/4(16),=R25MSB(16),=R25WPW(16), - =R27UFA(16),=R3XX/9(16),=R44WFF(16),=R7378TM(16),=R8JAJ/4(16),=R8JAJ/9(16),=R90WGM(16), - =R90WJV(16),=R90WOB(16),=R90WXK(16),=R9LY/4(16),=RA0R/4(16),=RA1ZPC/9(16),=RA3AUU/9(16), - =RA4POX/9(16),=RA9KDX/8/M(16),=RF9W(16),=RG5A/8(16),=RK3PWJ/9(16),=RK6YYA/9/M(16),=RK9KWI/9(16), - =RK9KWI/9/P(16),=RL3DX/9(16),=RM90WF(16),=RM9RZ/9/P(16),=RN9WWW/9/M(16),=RN9WWW/P(16),=RO17CW(16), - =RP67GI(16),=RP67MG(16),=RP67NG(16),=RP67RK(16),=RP67SW(16),=RP67UF(16),=RP68GM(16),=RP68NK(16), - =RP68UF(16),=RP69GI(16),=RP69PW(16),=RP69UF(16),=RP70GI(16),=RP70GM(16),=RP70LS(16),=RP70NK(16), - =RP70UF(16),=RP70ZO(16),=RP71GI(16),=RP71GM(16),=RP71UF(16),=RP72AR(16),=RP72GI(16),=RP72GM(16), - =RP72UF(16),=RP72WU(16),=RP73AR(16),=RP73GI(16),=RP73UF(16),=RP73WU(16),=RT22WF(16),=RT2F/4(16), - =RT2F/4/M(16),=RT2F/9/M(16),=RT73EA(16),=RT73EL(16),=RT8A/4(16),=RT9W(16),=RT9W/P(16), - =RU110RAEM(16),=RU20WC(16),=RU22WZ(16),=RU27WB(16),=RU27WF(16),=RU27WN(16),=RU27WO(16), - =RU3HD/9/P(16),=RU90WZ(16),=RU9KC/4/M(16),=RU9SO/4(16),=RU9SO/4/P(16),=RV22WB(16),=RV2FZ/9(16), - =RV90WB(16),=RV9CHB/4(16),=RW3SN/9(16),=RW3XX/9(16),=RW4WA/9/P(16),=RW90WC(16),=RW9FWR/9/M(16), - =RW9JZ/4(16),=RW9JZ/9(16),=RX22WN(16),=RZ16WF(16),=RZ90W(16),=RZ90WU(16),=UA0AZA/9(16), - =UA1AAE/9(16),=UA1ZPC/9(16),=UA4LU/9/P(16),=UA4PIE/9(16),=UA4PIE/9/M(16),=UA4PIE/9/P(16), - =UA4PJM/9(16),=UA4PJM/9/M(16),=UA4PJM/9/P(16),=UA4PXR/9/M(16),=UA9KAA/4(16),=UA9KAA/9(16), - =UB5O/4/M(16),=UE10RFF/4(16),=UE90W(16), + R8W(16),R9W(16),RA8W(16),RA9W(16),RC8W(16),RC9W(16),RD8W(16),RD9W(16),RE8W(16),RE9W(16),RF8W(16), + RF9W(16),RG8W(16),RG9W(16),RJ8W(16),RJ9W(16),RK8W(16),RK9W(16),RL8W(16),RL9W(16),RM8W(16), + RM9W(16),RN8W(16),RN9W(16),RO8W(16),RO9W(16),RQ8W(16),RQ9W(16),RT8W(16),RT9W(16),RU8W(16), + RU9W(16),RV8W(16),RV9W(16),RW8W(16),RW9W(16),RX8W(16),RX9W(16),RY8W(16),RY9W(16),RZ8W(16), + RZ9W(16),U8W(16),U9W(16),UA8W(16),UA9W(16),UB8W(16),UB9W(16),UC8W(16),UC9W(16),UD8W(16),UD9W(16), + UE8W(16),UE9W(16),UF8W(16),UF9W(16),UG8W(16),UG9W(16),UH8W(16),UH9W(16),UI8W(16),UI9W(16), + =R100W(16),=R10RTRS/9(16),=R18KDR/4(16),=R2013CG(16),=R2015AS(16),=R2015DS(16),=R2015KM(16), + =R2017F/P(16),=R20BIS(16),=R20UFA(16),=R25ARCK/4(16),=R25MSB(16),=R25WPW(16),=R27UFA(16), + =R3XX/9(16),=R44WFF(16),=R7378TM(16),=R8JAJ/4(16),=R8JAJ/9(16),=R90WGM(16),=R90WJV(16), + =R90WOB(16),=R90WXK(16),=R9LY/4(16),=RA0R/4(16),=RA1ZPC/9(16),=RA3AUU/9(16),=RA4POX/9(16), + =RA9KDX/8/M(16),=RF9W(16),=RG5A/8(16),=RK3PWJ/9(16),=RK6YYA/9/M(16),=RK9KWI/9(16),=RK9KWI/9/P(16), + =RL3DX/9(16),=RM90WF(16),=RM9RZ/9/P(16),=RN9WWW/9/M(16),=RN9WWW/P(16),=RO17CW(16),=RP67GI(16), + =RP67MG(16),=RP67NG(16),=RP67RK(16),=RP67SW(16),=RP67UF(16),=RP68GM(16),=RP68NK(16),=RP68UF(16), + =RP69GI(16),=RP69PW(16),=RP69UF(16),=RP70GI(16),=RP70GM(16),=RP70LS(16),=RP70NK(16),=RP70UF(16), + =RP70ZO(16),=RP71GI(16),=RP71GM(16),=RP71UF(16),=RP72AR(16),=RP72GI(16),=RP72GM(16),=RP72UF(16), + =RP72WU(16),=RP73AR(16),=RP73GI(16),=RP73UF(16),=RP73WU(16),=RT22WF(16),=RT2F/4(16),=RT2F/4/M(16), + =RT2F/9/M(16),=RT73EA(16),=RT73EL(16),=RT8A/4(16),=RT9W(16),=RT9W/P(16),=RU110RAEM(16), + =RU20WC(16),=RU22WZ(16),=RU27WB(16),=RU27WF(16),=RU27WN(16),=RU27WO(16),=RU3HD/9/P(16), + =RU90WZ(16),=RU9KC/4/M(16),=RU9SO/4(16),=RU9SO/4/P(16),=RV22WB(16),=RV2FZ/9(16),=RV90WB(16), + =RV9CHB/4(16),=RW3SN/9(16),=RW3XX/9(16),=RW4WA/9/P(16),=RW90WC(16),=RW9FWR/9/M(16),=RW9JZ/4(16), + =RW9JZ/9(16),=RX22WN(16),=RZ16WF(16),=RZ90W(16),=RZ90WU(16),=UA0AZA/9(16),=UA1AAE/9(16), + =UA1ZPC/9(16),=UA4LU/9/P(16),=UA4PIE/9(16),=UA4PIE/9/M(16),=UA4PIE/9/P(16),=UA4PJM/9(16), + =UA4PJM/9/M(16),=UA4PJM/9/P(16),=UA4PXR/9/M(16),=UA9KAA/4(16),=UA9KAA/9(16),=UB5O/4/M(16), + =UE10RFF/4(16),=UE90W(16), R8Y(18)[31],R9Y(18)[31],RA8Y(18)[31],RA9Y(18)[31],RC8Y(18)[31],RC9Y(18)[31],RD8Y(18)[31], RD9Y(18)[31],RE8Y(18)[31],RE9Y(18)[31],RF8Y(18)[31],RF9Y(18)[31],RG8Y(18)[31],RG9Y(18)[31], RJ8Y(18)[31],RJ9Y(18)[31],RK8Y(18)[31],RK9Y(18)[31],RL8Y(18)[31],RL9Y(18)[31],RM8Y(18)[31], @@ -2914,7 +2915,7 @@ Marshall Islands: 31: 65: OC: 9.08: -167.33: -12.0: V7: Brunei Darussalam: 28: 54: OC: 4.50: -114.60: -8.0: V8: V8; Canada: 05: 09: NA: 44.35: 78.75: 5.0: VE: - CF,CG,CJ,CK,VA,VB,VC,VE,VG,VX,VY9,XL,XM,=VE2EM/M,=VER20190319, + CF,CG,CJ,CK,VA,VB,VC,VE,VG,VX,VY9,XL,XM,=VE2EM/M,=VER20190327, =CF7AAW/1,=CK7IG/1,=VA3QSL/1,=VA3WR/1,=VE1REC/LH,=VE1REC/M/LH,=VE3RSA/1,=VE7IG/1, CF2[4],CG2[4],CJ2[4],CK2[4],VA2[4],VB2[4],VC2[4],VE2[4],VG2[4],VX2[4],XL2[4],XM2[4],=4Y1CAO[4], =CY2ZT/2[4],=VA3ELE/2[4],=VA3MPM/2[4],=VA7AQ/P[4],=VE2/G3ZAY/P[4],=VE2/M0BLF/P[4],=VE2FK[9], From 964c1487940f8830c29877291f0ae0f4928d1c7f Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Sun, 7 Apr 2019 13:36:29 -0400 Subject: [PATCH 003/159] Fix the UTC displayed at left of waterfall in FT4 mode. --- widgets/plotter.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/widgets/plotter.cpp b/widgets/plotter.cpp index 60f0892c3..38e5027a9 100644 --- a/widgets/plotter.cpp +++ b/widgets/plotter.cpp @@ -241,7 +241,6 @@ void CPlotter::draw(float swide[], bool bScroll, bool bRed) QString t; qint64 ms = QDateTime::currentMSecsSinceEpoch() % 86400000; int n=(ms/1000) % m_TRperiod; - if(m_mode=="FT4") n=0; QDateTime t1=QDateTime::currentDateTimeUtc().addSecs(-n); if(m_TRperiod < 60 or m_mode=="FT4") { t=t1.toString("hh:mm:ss") + " " + m_rxBand; From ec97d0410e641f475da8729807fa0f25adf9d492 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Sun, 7 Apr 2019 21:08:38 -0400 Subject: [PATCH 004/159] Possibly temporary: add a "Call Best" button for S+P use in FT4 mode. --- widgets/mainwindow.cpp | 2 ++ widgets/mainwindow.ui | 7 +++++++ 2 files changed, 9 insertions(+) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 22b95f68e..beec545a3 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -979,6 +979,7 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple, QTimer::singleShot (0, this, SLOT (not_GA_warning_message ())); } + ui->pbCallBest->setVisible(m_mode=="FT4"); if(!ui->cbMenus->isChecked()) { ui->cbMenus->setChecked(true); ui->cbMenus->setChecked(false); @@ -5574,6 +5575,7 @@ void MainWindow::displayWidgets(qint64 n) if(i==32) ui->cbCQonly->setVisible(b); j=j>>1; } + ui->pbCallBest->setVisible(m_mode=="FT4"); b=SpecOp::EU_VHF==m_config.special_op_id() or (SpecOp::RTTY==m_config.special_op_id() and (m_config.RTTY_Exchange()=="DX" or m_config.RTTY_Exchange()=="SCC")); ui->sbSerialNumber->setVisible(b); diff --git a/widgets/mainwindow.ui b/widgets/mainwindow.ui index a779cb413..8ae8d17ca 100644 --- a/widgets/mainwindow.ui +++ b/widgets/mainwindow.ui @@ -1338,6 +1338,13 @@ QPushButton[state="ok"] { + + + + Call Best + + + From b6032277d08a782b96cf1ef9e86e5486f93da787 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 8 Apr 2019 12:36:05 -0400 Subject: [PATCH 005/159] The "Best S+P" button is now functional. Needs testing! --- models/models.pri | 6 ++++-- widgets/displaytext.cpp | 3 +++ widgets/displaytext.h | 2 ++ widgets/mainwindow.cpp | 40 ++++++++++++++++++++++++++++++++++------ widgets/mainwindow.h | 3 +++ widgets/mainwindow.ui | 4 ++-- 6 files changed, 48 insertions(+), 10 deletions(-) diff --git a/models/models.pri b/models/models.pri index e0c69e81e..5b3d038bb 100644 --- a/models/models.pri +++ b/models/models.pri @@ -5,7 +5,8 @@ SOURCES += \ models/Modes.cpp \ models/IARURegions.cpp \ models/FoxLog.cpp \ - models/CabrilloLog.cpp + models/CabrilloLog.cpp \ + models/DecodeHighlightingModel.cpp HEADERS += \ models/Bands.hpp \ @@ -15,4 +16,5 @@ HEADERS += \ models/IARURegions.hpp \ models/FoxLog.hpp \ models/CabrilloLog.hpp \ - models/FontOverrideModel.hpp + models/FontOverrideModel.hpp \ + models/DecodeHighlightingModel.hpp diff --git a/widgets/displaytext.cpp b/widgets/displaytext.cpp index eca4dd4f5..c0bcd4129 100644 --- a/widgets/displaytext.cpp +++ b/widgets/displaytext.cpp @@ -374,6 +374,7 @@ QString DisplayText::appendWorkedB4 (QString message, QString call, QString cons appendage += countryName; } } + m_CQPriority=DecodeHighlightingModel::highlight_name(top_highlight); // use a nbsp to save the start of appended text so we can find // it again later, align appended data at a fixed column if @@ -423,6 +424,7 @@ void DisplayText::displayDecodedText(DecodedText const& decodedText, QString con QRegularExpression grid_regexp {"\\A(?![Rr]{2}73)[A-Ra-r]{2}[0-9]{2}([A-Xa-x]{2}){0,1}\\z"}; if(!dxGrid.contains(grid_regexp)) dxGrid=""; message = message.left (message.indexOf (QChar::Nbsp)); // strip appended info + m_CQPriority=""; if (CQcall) { if (displayDXCCEntity) @@ -447,6 +449,7 @@ void DisplayText::displayDecodedText(DecodedText const& decodedText, QString con set_colours (m_config, &bg, &fg, types); } } + appendText (message.trimmed (), bg, fg, decodedText.call (), dxCall); } diff --git a/widgets/displaytext.h b/widgets/displaytext.h index cd3426af9..7f308bef8 100644 --- a/widgets/displaytext.h +++ b/widgets/displaytext.h @@ -35,6 +35,7 @@ public: void displayQSY(QString text); void displayFoxToBeCalled(QString t, QColor bg = QColor {}, QColor fg = QColor {}); void new_period (); + QString CQPriority(){return m_CQPriority;}; Q_SIGNAL void selectCallsign (Qt::KeyboardModifiers); Q_SIGNAL void erased (); @@ -51,6 +52,7 @@ private: Configuration const * m_config; bool m_bPrincipalPrefix; + QString m_CQPriority; QString appendWorkedB4(QString message, QString callsign , QString const& grid, QColor * bg, QColor * fg , LogBook const& logBook, QString const& currentBand diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index beec545a3..c6c2f082e 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -979,7 +979,7 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple, QTimer::singleShot (0, this, SLOT (not_GA_warning_message ())); } - ui->pbCallBest->setVisible(m_mode=="FT4"); + ui->pbBestSP->setVisible(m_mode=="FT4"); if(!ui->cbMenus->isChecked()) { ui->cbMenus->setChecked(true); ui->cbMenus->setChecked(false); @@ -2885,7 +2885,10 @@ void MainWindow::decode() //decode() if(m_mode=="FT8") dec_data.params.lft8apon = ui->actionEnable_AP_FT8->isVisible () && ui->actionEnable_AP_FT8->isChecked (); if(m_mode=="FT8") dec_data.params.napwid=50; - if(m_mode=="FT4") dec_data.params.nmode=5; + if(m_mode=="FT4") { + dec_data.params.nmode=5; + m_BestCQpriority=""; + } dec_data.params.ntrperiod=m_TRperiod; dec_data.params.nsubmode=m_nSubMode; if(m_mode=="QRA64") dec_data.params.nsubmode=100 + m_nSubMode; @@ -3104,6 +3107,17 @@ void MainWindow::readFromStdout() //readFromStdout ui->decodedTextBrowser->displayDecodedText(decodedtext0,m_baseCall,m_mode,m_config.DXCC(), m_logBook,m_currentBand,m_config.ppfx(), (ui->cbCQonly->isVisible() and ui->cbCQonly->isChecked())); + if(m_bBestSPArmed and m_mode=="FT4") { + QString messagePriority=ui->decodedTextBrowser->CQPriority(); + if(messagePriority!="") { + if(messagePriority=="New Call on Band" + and m_BestCQpriority!="New Call on Band" + and m_BestCQpriority!="New Multiplier") { + m_BestCQpriority="New Call on Band"; + processMessage(decodedtext0); + } + } + } } } @@ -3135,9 +3149,10 @@ void MainWindow::readFromStdout() //readFromStdout if (bDisplayRight) { // This msg is within 10 hertz of our tuned frequency, or a JT4 or JT65 avg, // or contains MyCall - ui->decodedTextBrowser2->displayDecodedText(decodedtext0,m_baseCall,m_mode,m_config.DXCC(), - m_logBook,m_currentBand,m_config.ppfx()); - + if(!m_bBestSPArmed or m_mode!="FT4") { + ui->decodedTextBrowser2->displayDecodedText(decodedtext0,m_baseCall,m_mode,m_config.DXCC(), + m_logBook,m_currentBand,m_config.ppfx()); + } if(m_mode!="JT4") { bool b65=decodedtext.isJT65(); if(b65 and m_modeTx!="JT65") on_pbTxMode_clicked(); @@ -3614,6 +3629,13 @@ void MainWindow::guiUpdate() m_ntx=1; ui->txrb1->setChecked(true); } + + if(m_mode=="FT4" and m_bBestSPArmed) { + m_BestCQpriority=""; + m_bBestSPArmed=false; + ui->pbBestSP->setStyleSheet (""); + } + if(m_ntx == 1) ba=ui->tx1->text().toLocal8Bit(); if(m_ntx == 2) ba=ui->tx2->text().toLocal8Bit(); if(m_ntx == 3) ba=ui->tx3->text().toLocal8Bit(); @@ -5575,7 +5597,7 @@ void MainWindow::displayWidgets(qint64 n) if(i==32) ui->cbCQonly->setVisible(b); j=j>>1; } - ui->pbCallBest->setVisible(m_mode=="FT4"); + ui->pbBestSP->setVisible(m_mode=="FT4"); b=SpecOp::EU_VHF==m_config.special_op_id() or (SpecOp::RTTY==m_config.special_op_id() and (m_config.RTTY_Exchange()=="DX" or m_config.RTTY_Exchange()=="SCC")); ui->sbSerialNumber->setVisible(b); @@ -8671,3 +8693,9 @@ void MainWindow::chkFT4() on_contest_log_action_triggered(); } } + +void MainWindow::on_pbBestSP_clicked() +{ + ui->pbBestSP->setStyleSheet ("QPushButton{color:red}"); + m_bBestSPArmed=true; +} diff --git a/widgets/mainwindow.h b/widgets/mainwindow.h index 6bce17978..13720e092 100644 --- a/widgets/mainwindow.h +++ b/widgets/mainwindow.h @@ -312,6 +312,7 @@ private slots: void on_comboBoxHoundSort_activated (int index); void not_GA_warning_message (); void checkMSK144ContestType(); + void on_pbBestSP_clicked(); int setTxMsg(int n); bool stdCall(QString const& w); @@ -520,6 +521,7 @@ private: bool m_bCheckedContest; bool m_bWarnedSplit=false; bool m_bTUmsg; + bool m_bBestSPArmed=false; enum { @@ -615,6 +617,7 @@ private: QString m_nextGrid; QString m_fileDateTime; QString m_inQSOwith; + QString m_BestCQpriority; QSet m_pfx; QSet m_sfx; diff --git a/widgets/mainwindow.ui b/widgets/mainwindow.ui index 8ae8d17ca..bb5fe2ffa 100644 --- a/widgets/mainwindow.ui +++ b/widgets/mainwindow.ui @@ -1339,9 +1339,9 @@ QPushButton[state="ok"] { - + - Call Best + Best S+P From 6e1d5ea1d82619bf923e0a8537aa7495449d1ccb Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 8 Apr 2019 12:52:23 -0400 Subject: [PATCH 006/159] BestSP calls New DXCC as well as New Call on Band. --- widgets/mainwindow.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index c6c2f082e..a1fccb23d 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -3116,6 +3116,12 @@ void MainWindow::readFromStdout() //readFromStdout m_BestCQpriority="New Call on Band"; processMessage(decodedtext0); } + if(messagePriority=="New DXCC" + and m_BestCQpriority!="New DXCC" + and m_BestCQpriority!="New Multiplier") { + m_BestCQpriority="New DXCC"; + processMessage(decodedtext0); + } } } } From 20bed3832320099ae74ff7fe58fc034f75c21628 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 8 Apr 2019 13:18:30 -0400 Subject: [PATCH 007/159] Best S+P activates only when not transmitting. --- widgets/mainwindow.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index a1fccb23d..5dd5ed60e 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -8702,6 +8702,8 @@ void MainWindow::chkFT4() void MainWindow::on_pbBestSP_clicked() { - ui->pbBestSP->setStyleSheet ("QPushButton{color:red}"); - m_bBestSPArmed=true; + if(!m_transmitting) { + ui->pbBestSP->setStyleSheet ("QPushButton{color:red}"); + m_bBestSPArmed=true; + } } From 2b42650a73ec1e4d82c68c68941aefba7a440b7e Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Tue, 9 Apr 2019 08:48:13 -0400 Subject: [PATCH 008/159] Make the "Best S+P" button red when activated. --- widgets/mainwindow.cpp | 13 ++++--------- widgets/mainwindow.ui | 14 ++++++++++++++ 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 5dd5ed60e..fdefd8edb 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -1997,11 +1997,6 @@ void MainWindow::keyPressEvent (QKeyEvent * e) on_stopTxButton_clicked(); abortQSO(); return; - case Qt::Key_X: - if(e->modifiers() & Qt::AltModifier) { -// foxTest(); - return; - } case Qt::Key_E: if((e->modifiers() & Qt::ShiftModifier) and SpecOp::FOX > m_config.special_op_id()) { ui->txFirstCheckBox->setChecked(false); @@ -8702,8 +8697,8 @@ void MainWindow::chkFT4() void MainWindow::on_pbBestSP_clicked() { - if(!m_transmitting) { - ui->pbBestSP->setStyleSheet ("QPushButton{color:red}"); - m_bBestSPArmed=true; - } + m_bBestSPArmed = !m_bBestSPArmed; + ui->pbBestSP->setChecked(m_bBestSPArmed); +// if(m_bBestSPArmed and !m_transmitting) ui->pbBestSP->setStyleSheet ("QPushButton{color:red}"); +// if(!m_bBestSPArmed) ui->pbBestSP->setStyleSheet (""); } diff --git a/widgets/mainwindow.ui b/widgets/mainwindow.ui index bb5fe2ffa..8b7980742 100644 --- a/widgets/mainwindow.ui +++ b/widgets/mainwindow.ui @@ -1340,9 +1340,23 @@ QPushButton[state="ok"] { + + QPushButton:checked { + background-color: red; + border-style: outset; + border-width: 1px; + border-radius: 5px; + border-color: black; + min-width: 5em; + padding: 3px; +} + Best S+P + + true + From b74b1d6ea3e8f0ee0a237cf5aacc029b4b4949f9 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Tue, 9 Apr 2019 22:50:32 +0100 Subject: [PATCH 009/159] RC4 --- Versions.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Versions.cmake b/Versions.cmake index f3eec78ee..8f0591243 100644 --- a/Versions.cmake +++ b/Versions.cmake @@ -2,5 +2,5 @@ set (WSJTX_VERSION_MAJOR 2) set (WSJTX_VERSION_MINOR 1) set (WSJTX_VERSION_PATCH 0) -set (WSJTX_RC 3) # release candidate number, comment out or zero for development versions +set (WSJTX_RC 4) # release candidate number, comment out or zero for development versions set (WSJTX_VERSION_IS_RELEASE 0) # set to 1 for final release build From 2633f6fb6dce9decfea38385aac72e73eead431a Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Tue, 9 Apr 2019 20:12:48 -0400 Subject: [PATCH 010/159] Make the label red, not the whole button. --- widgets/mainwindow.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index fdefd8edb..a9c45e1b5 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -8698,7 +8698,8 @@ void MainWindow::chkFT4() void MainWindow::on_pbBestSP_clicked() { m_bBestSPArmed = !m_bBestSPArmed; - ui->pbBestSP->setChecked(m_bBestSPArmed); -// if(m_bBestSPArmed and !m_transmitting) ui->pbBestSP->setStyleSheet ("QPushButton{color:red}"); -// if(!m_bBestSPArmed) ui->pbBestSP->setStyleSheet (""); +// ui->pbBestSP->setChecked(m_bBestSPArmed); + qDebug() << "aa" << m_bBestSPArmed; + if(m_bBestSPArmed and !m_transmitting) ui->pbBestSP->setStyleSheet ("QPushButton{color:red}"); + if(!m_bBestSPArmed) ui->pbBestSP->setStyleSheet (""); } From 56c1aacbc2ca8d959eb9a7697cd6cfcbcaf9ebde Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Tue, 9 Apr 2019 22:03:59 -0400 Subject: [PATCH 011/159] Remove a diagnostic qDebug(). --- widgets/mainwindow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index a9c45e1b5..e9c0fa031 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -8699,7 +8699,7 @@ void MainWindow::on_pbBestSP_clicked() { m_bBestSPArmed = !m_bBestSPArmed; // ui->pbBestSP->setChecked(m_bBestSPArmed); - qDebug() << "aa" << m_bBestSPArmed; +// qDebug() << "aa" << m_bBestSPArmed; if(m_bBestSPArmed and !m_transmitting) ui->pbBestSP->setStyleSheet ("QPushButton{color:red}"); if(!m_bBestSPArmed) ui->pbBestSP->setStyleSheet (""); } From cd8ea16f4076b9adb6d95f04b122a1b20323696a Mon Sep 17 00:00:00 2001 From: Steve Franke Date: Fri, 12 Apr 2019 17:11:26 -0500 Subject: [PATCH 012/159] FT8: Use GFSK waveform with BT=4.0 as reference for subtraction, for now. May want to change to BT=2.0 before v2.1 release? --- lib/ft8/ft8sim_gfsk.f90 | 3 ++- lib/ft8/gen_ft8wave.f90 | 13 ++++++------- lib/ft8/subtractft8.f90 | 12 +++++++++--- widgets/mainwindow.cpp | 5 +++-- 4 files changed, 20 insertions(+), 13 deletions(-) diff --git a/lib/ft8/ft8sim_gfsk.f90 b/lib/ft8/ft8sim_gfsk.f90 index aba046cef..4cca67e48 100644 --- a/lib/ft8/ft8sim_gfsk.f90 +++ b/lib/ft8/ft8sim_gfsk.f90 @@ -57,6 +57,7 @@ program ft8sim_gfsk baud=1.0/tt !Keying rate (baud) bw=8*baud !Occupied bandwidth (Hz) txt=NZ*dt !Transmission length (s) + bt=2.0 bandwidth_ratio=2500.0/(fs/2.0) sig=sqrt(2*bandwidth_ratio) * 10.0**(0.05*snrdb) if(snrdb.gt.90.0) sig=1.0 @@ -67,7 +68,7 @@ program ft8sim_gfsk n3=-1 call pack77(msg37,i3,n3,c77) call genft8(msg37,i3,n3,msgsent37,msgbits,itone) - call gen_ft8wave(itone,NN,NSPS,fs,f0,cwave,xjunk,1,NWAVE) !Generate complex cwave + call gen_ft8wave(itone,NN,NSPS,bt,fs,f0,cwave,xjunk,1,NWAVE) !Generate complex cwave write(*,*) write(*,'(a23,a37,3x,a7,i1,a1,i1)') 'New Style FT8 Message: ',msgsent37,'i3.n3: ',i3,'.',n3 diff --git a/lib/ft8/gen_ft8wave.f90 b/lib/ft8/gen_ft8wave.f90 index d4b58a426..9dc25812c 100644 --- a/lib/ft8/gen_ft8wave.f90 +++ b/lib/ft8/gen_ft8wave.f90 @@ -1,4 +1,4 @@ -subroutine gen_ft8wave(itone,nsym,nsps,fsample,f0,cwave,wave,icmplx,nwave) +subroutine gen_ft8wave(itone,nsym,nsps,bt,fsample,f0,cwave,wave,icmplx,nwave) ! ! generate ft8 waveform using Gaussian-filtered frequency pulses. ! @@ -9,21 +9,20 @@ subroutine gen_ft8wave(itone,nsym,nsps,fsample,f0,cwave,wave,icmplx,nwave) real pulse(23040) real dphi(0:(nsym+2)*nsps-1) integer itone(nsym) - logical first - data first/.true./ - save pulse,first,twopi,dt,hmod + data first/.true./,ibt0/0/ + save pulse,twopi,dt,hmod,ibt0 - if(first) then + ibt=nint(10*bt) + if(ibt0.ne.ibt) then twopi=8.0*atan(1.0) dt=1.0/fsample hmod=1.0 - bt=2.0 ! Compute the frequency-smoothing pulse do i=1,3*nsps tt=(i-1.5*nsps)/real(nsps) pulse(i)=gfsk_pulse(bt,tt) enddo - first=.false. + ibt0=nint(10*bt) endif ! Compute the smoothed frequency waveform. diff --git a/lib/ft8/subtractft8.f90 b/lib/ft8/subtractft8.f90 index 1031cf2b7..200139a2b 100644 --- a/lib/ft8/subtractft8.f90 +++ b/lib/ft8/subtractft8.f90 @@ -11,16 +11,22 @@ subroutine subtractft8(dd,itone,f0,dt) parameter (NMAX=15*12000,NFRAME=1920*79) parameter (NFFT=NMAX,NFILT=1400) - real*4 dd(NMAX), window(-NFILT/2:NFILT/2) + real*4 dd(NMAX), window(-NFILT/2:NFILT/2), xjunk complex cref,camp,cfilt,cw integer itone(79) logical first data first/.true./ - common/heap8/cref(NFRAME),camp(NMAX),cfilt(NMAX),cw(NMAX) + common/heap8/cref(NFRAME),camp(NMAX),cfilt(NMAX),cw(NMAX),xjunk(NFRAME) save first nstart=dt*12000+1 - call genft8refsig(itone,cref,f0) +! call genft8refsig(itone,cref,f0) + nsym=79 + nsps=1920 + fs=12000.0 + icmplx=1 + bt=4.0 ! Temporary compromise? + call gen_ft8wave(itone,nsym,nsps,bt,fs,f0,cref,xjunk,icmplx,NFRAME) camp=0. do i=1,nframe id=nstart-1+i diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index e9c0fa031..8aec20d19 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -102,7 +102,7 @@ extern "C" { void genft4_(char* msg, int* ichk, char* msgsent, int itone[], fortran_charlen_t, fortran_charlen_t); - void gen_ft8wave_(int itone[], int* nsym, int* nsps, float* fsample, float* f0, + void gen_ft8wave_(int itone[], int* nsym, int* nsps, float* bt, float* fsample, float* f0, float xjunk[], float wave[], int* icmplx, int* nwave); void gen_ft4wave_(int itone[], int* nsym, int* nsps, float* fsample, float* f0, @@ -3701,10 +3701,11 @@ void MainWindow::guiUpdate() int nsym=79; int nsps=4*1920; float fsample=48000.0; + float bt=2.0; float f0=ui->TxFreqSpinBox->value() - m_XIT; int icmplx=0; int nwave=nsym*nsps; - gen_ft8wave_(const_cast(itone),&nsym,&nsps,&fsample,&f0,foxcom_.wave, + gen_ft8wave_(const_cast(itone),&nsym,&nsps,&bt,&fsample,&f0,foxcom_.wave, foxcom_.wave,&icmplx,&nwave); if(SpecOp::FOX == m_config.special_op_id()) { From f296e37630036c7a52dc02e31363f278b2f4d305 Mon Sep 17 00:00:00 2001 From: Steve Franke Date: Fri, 12 Apr 2019 18:54:33 -0500 Subject: [PATCH 013/159] Fix a bug that didn't show up when I compiled on the Mac. --- lib/ft8/gen_ft8wave.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ft8/gen_ft8wave.f90 b/lib/ft8/gen_ft8wave.f90 index 9dc25812c..550011301 100644 --- a/lib/ft8/gen_ft8wave.f90 +++ b/lib/ft8/gen_ft8wave.f90 @@ -9,7 +9,7 @@ subroutine gen_ft8wave(itone,nsym,nsps,bt,fsample,f0,cwave,wave,icmplx,nwave) real pulse(23040) real dphi(0:(nsym+2)*nsps-1) integer itone(nsym) - data first/.true./,ibt0/0/ + data ibt0/0/ save pulse,twopi,dt,hmod,ibt0 ibt=nint(10*bt) From b43d91240d6d367142043d2390ba4d551512888b Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 15 Apr 2019 16:26:41 -0400 Subject: [PATCH 014/159] New end-of-QSO sequencing logic (possibly temporary) for CQing FT4 station. When RR73 is received we log the QSO, turn "Call 1st" OFF, and call CQ again. Also, allow Alt+C and F6 (the latter only if altenrate F1-F6 bindings are active) to toggle "Call 1st" ON/OFF. --- Configuration.ui | 12 +++++------ shortcuts.txt | 2 +- widgets/mainwindow.cpp | 49 ++++++++++++++++++++++++++---------------- widgets/mainwindow.ui | 3 --- 4 files changed, 37 insertions(+), 29 deletions(-) diff --git a/Configuration.ui b/Configuration.ui index a8f36797c..a576304c7 100644 --- a/Configuration.ui +++ b/Configuration.ui @@ -457,7 +457,7 @@ quiet period when decoding is done. - Alternate F1-F5 bindings + Alternate F1-F6 bindings @@ -3078,13 +3078,13 @@ Right click for insert and delete options. - + + + - - - - + + diff --git a/shortcuts.txt b/shortcuts.txt index e50278d0f..24460a82b 100644 --- a/shortcuts.txt +++ b/shortcuts.txt @@ -8,7 +8,7 @@ F4 Clear DX Call, DX Grid, Tx messages 1-4 (Alt: transmit Tx4) Alt+F4 Exit program F5 Display special mouse commands (Alt: transmit Tx5) - F6 Open next file in directory + F6 Open next file in directory (Alt: toggle Call 11t) Shift+F6 Decode all remaining files in directrory F7 Display Message Averaging window F11 Move Rx frequency down 1 Hz diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 8aec20d19..bfa82cca4 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -994,9 +994,9 @@ void MainWindow::not_GA_warning_message () "

" "This is a pre-release version of WSJT-X 2.1.0 made " "available for testing purposes. It will become nonfunctional " - "after May 1, 2019."); + "after June 1, 2019."); QDateTime now=QDateTime::currentDateTime(); - QDateTime timeout=QDateTime(QDate(2019,5,1)); + QDateTime timeout=QDateTime(QDate(2019,6,1)); if(now.daysTo(timeout) < 0) Q_EMIT finished(); } @@ -1892,9 +1892,15 @@ void MainWindow::keyPressEvent (QKeyEvent * e) } int n; - bool bAltF1F5=m_config.alternate_bindings(); + bool bAltF1F6=m_config.alternate_bindings(); switch(e->key()) { + case Qt::Key_C: + if(m_mode=="FT4" && e->modifiers() & Qt::AltModifier) { + bool b=ui->cbFirst->isChecked(); + ui->cbFirst->setChecked(!b); + } + return; case Qt::Key_D: if(m_mode != "WSPR" && e->modifiers() & Qt::ShiftModifier) { if(!m_decoderBusy) { @@ -1906,7 +1912,7 @@ void MainWindow::keyPressEvent (QKeyEvent * e) } break; case Qt::Key_F1: - if(bAltF1F5) { + if(bAltF1F6) { auto_tx_mode(true); on_txb6_clicked(); return; @@ -1915,7 +1921,7 @@ void MainWindow::keyPressEvent (QKeyEvent * e) return; } case Qt::Key_F2: - if(bAltF1F5) { + if(bAltF1F6) { auto_tx_mode(true); on_txb2_clicked(); return; @@ -1924,7 +1930,7 @@ void MainWindow::keyPressEvent (QKeyEvent * e) return; } case Qt::Key_F3: - if(bAltF1F5) { + if(bAltF1F6) { auto_tx_mode(true); on_txb3_clicked(); return; @@ -1933,7 +1939,7 @@ void MainWindow::keyPressEvent (QKeyEvent * e) return; } case Qt::Key_F4: - if(bAltF1F5) { + if(bAltF1F6) { auto_tx_mode(true); on_txb4_clicked(); return; @@ -1943,7 +1949,7 @@ void MainWindow::keyPressEvent (QKeyEvent * e) return; } case Qt::Key_F5: - if(bAltF1F5) { + if(bAltF1F6) { auto_tx_mode(true); on_txb5_clicked(); return; @@ -1952,8 +1958,16 @@ void MainWindow::keyPressEvent (QKeyEvent * e) return; } case Qt::Key_F6: - if(e->modifiers() & Qt::ShiftModifier) { - on_actionDecode_remaining_files_in_directory_triggered(); + if(bAltF1F6) { + bool b=ui->cbFirst->isChecked(); + ui->cbFirst->setChecked(!b); + return; + } else { + if(e->modifiers() & Qt::ShiftModifier) { + on_actionDecode_remaining_files_in_directory_triggered(); + } else { + on_actionOpen_triggered(); + } return; } on_actionOpen_next_in_directory_triggered(); @@ -4576,11 +4590,11 @@ void MainWindow::processMessage (DecodedText const& message, Qt::KeyboardModifie ui->tx3->setText(t); m_bTUmsg=true; } else { -// if(SpecOp::RTTY == m_config.special_op_id()) { - if(false) { + if(SpecOp::RTTY == m_config.special_op_id()) { logQSOTimer.start(0); m_ntx=6; ui->txrb6->setChecked(true); + ui->cbFirst->setChecked(false); } else { m_ntx=5; ui->txrb5->setChecked(true); @@ -5001,7 +5015,6 @@ void MainWindow::genStdMsgs(QString rpt, bool unconditional) QDateTime now=QDateTime::currentDateTimeUtc(); int sinceTx3 = m_dateTimeSentTx3.secsTo(now); int sinceRR73 = m_dateTimeRcvdRR73.secsTo(now); -// qDebug() << "aa" << m_bDoubleClicked << sinceTx3 << sinceRR73; if(m_bDoubleClicked and (sinceTx3 < 15) and (sinceRR73 < 3)) { t="TU; " + ui->tx3->text(); ui->tx3->setText(t); @@ -5150,10 +5163,9 @@ void MainWindow::TxAgain() void MainWindow::clearDX () { set_dateTimeQSO (-1); - if (m_QSOProgress != CALLING) - { - auto_tx_mode (false); - } + if (m_QSOProgress != CALLING) { + auto_tx_mode (false); + } ui->dxCallEntry->clear (); ui->dxGridEntry->clear (); m_lastCallsign.clear (); @@ -5525,7 +5537,7 @@ void MainWindow::acceptQSO (QDateTime const& QSO_date_off, QString const& call, } } - if (m_config.clear_DX () and SpecOp::HOUND != m_config.special_op_id()) clearDX (); + if(m_config.clear_DX () and SpecOp::HOUND != m_config.special_op_id()) clearDX (); m_dateTimeQSOOn = QDateTime {}; auto special_op = m_config.special_op_id (); if (SpecOp::NONE < special_op && special_op < SpecOp::FOX && @@ -8700,7 +8712,6 @@ void MainWindow::on_pbBestSP_clicked() { m_bBestSPArmed = !m_bBestSPArmed; // ui->pbBestSP->setChecked(m_bBestSPArmed); -// qDebug() << "aa" << m_bBestSPArmed; if(m_bBestSPArmed and !m_transmitting) ui->pbBestSP->setStyleSheet ("QPushButton{color:red}"); if(!m_bBestSPArmed) ui->pbBestSP->setStyleSheet (""); } diff --git a/widgets/mainwindow.ui b/widgets/mainwindow.ui index 8b7980742..0942dc750 100644 --- a/widgets/mainwindow.ui +++ b/widgets/mainwindow.ui @@ -2813,9 +2813,6 @@ list. The list can be maintained in Settings (F2). Open next in directory - - F6 - From 5826aefedc1cb7fa3251bcf5634a66fa7379935b Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Tue, 16 Apr 2019 13:21:45 -0400 Subject: [PATCH 015/159] Let "Best S+P" status time out after 2 minutes. Update the keyboard shortcuts.txt file. --- shortcuts.txt | 4 +++- widgets/mainwindow.cpp | 12 ++++++++---- widgets/mainwindow.h | 1 + 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/shortcuts.txt b/shortcuts.txt index 24460a82b..4356664c0 100644 --- a/shortcuts.txt +++ b/shortcuts.txt @@ -8,7 +8,7 @@ F4 Clear DX Call, DX Grid, Tx messages 1-4 (Alt: transmit Tx4) Alt+F4 Exit program F5 Display special mouse commands (Alt: transmit Tx5) - F6 Open next file in directory (Alt: toggle Call 11t) + F6 Open next file in directory (Alt: toggle "Call 1st") Shift+F6 Decode all remaining files in directrory F7 Display Message Averaging window F11 Move Rx frequency down 1 Hz @@ -21,6 +21,8 @@ Ctrl+Shift+F12 Move dial frequency up 2000 Hz Alt+1-6 Set now transmission to this number on Tab 1 Ctl+1-6 Set next transmission to this number on Tab 1 + Alt+B Toggle "Best S+P" status + Alt+C Toggle "Call 1st" checkbox Alt+D Decode again at QSO frequency Shift+D Full decode (both windows) Ctrl+E Turn on TX even/1st diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index bfa82cca4..3c790f043 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -1895,6 +1895,11 @@ void MainWindow::keyPressEvent (QKeyEvent * e) bool bAltF1F6=m_config.alternate_bindings(); switch(e->key()) { + case Qt::Key_B: + if(m_mode=="FT4" && e->modifiers() & Qt::AltModifier) { + on_pbBestSP_clicked(); + } + return; case Qt::Key_C: if(m_mode=="FT4" && e->modifiers() & Qt::AltModifier) { bool b=ui->cbFirst->isChecked(); @@ -4024,9 +4029,8 @@ void MainWindow::guiUpdate() QString utc = t.date().toString("yyyy MMM dd") + "\n " + t.time().toString() + " "; ui->labUTC->setText(utc); - if(!m_monitoring and !m_diskData) { - ui->signal_meter_widget->setValue(0,0); - } + if(m_bBestSPArmed and (m_dateTimeBestSP.secsTo(t) >= 120)) on_pbBestSP_clicked(); //BestSP timeout + if(!m_monitoring and !m_diskData) ui->signal_meter_widget->setValue(0,0); m_sec0=nsec; displayDialFrequency (); } @@ -8711,7 +8715,7 @@ void MainWindow::chkFT4() void MainWindow::on_pbBestSP_clicked() { m_bBestSPArmed = !m_bBestSPArmed; -// ui->pbBestSP->setChecked(m_bBestSPArmed); if(m_bBestSPArmed and !m_transmitting) ui->pbBestSP->setStyleSheet ("QPushButton{color:red}"); if(!m_bBestSPArmed) ui->pbBestSP->setStyleSheet (""); + if(m_bBestSPArmed) m_dateTimeBestSP=QDateTime::currentDateTimeUtc(); } diff --git a/widgets/mainwindow.h b/widgets/mainwindow.h index 13720e092..eada752bc 100644 --- a/widgets/mainwindow.h +++ b/widgets/mainwindow.h @@ -653,6 +653,7 @@ private: QDateTime m_dateTimeLastTX; QDateTime m_dateTimeSentTx3; QDateTime m_dateTimeRcvdRR73; + QDateTime m_dateTimeBestSP; QSharedMemory *mem_jt9; QString m_QSOText; From 81907e841abdf119a4ce4144e8ffe135d65c2c8d Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Wed, 17 Apr 2019 01:29:16 +0100 Subject: [PATCH 016/159] Update macOS Info.plist to include mic privacy request string for latest SDK on 10.14 --- Darwin/Info.plist.in | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Darwin/Info.plist.in b/Darwin/Info.plist.in index 830975da5..d2e943fe5 100644 --- a/Darwin/Info.plist.in +++ b/Darwin/Info.plist.in @@ -38,5 +38,7 @@ True NSRequiresAquaSystemAppearance + NSMicrophoneUsageDescription + This app requires microphone access to receive signals. From 655e0029fd503320186c3c51671266cfc91bf5e3 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Wed, 17 Apr 2019 14:03:27 -0400 Subject: [PATCH 017/159] Define the expected file length for FT4 data. --- lib/jt9.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jt9.f90 b/lib/jt9.f90 index 7b3b0181e..aff2844ef 100644 --- a/lib/jt9.f90 +++ b/lib/jt9.f90 @@ -224,7 +224,7 @@ program jt9 endif shared_data%id2=0 !??? Why is this necessary ??? - + if(mode.eq.5) npts=62208 do iblk=1,npts/kstep k=iblk*kstep if(mode.eq.8 .and. k.gt.179712) exit From f7b0e24e708ae0f60bf7141024ede1fd3fb15b36 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Wed, 17 Apr 2019 14:53:20 -0400 Subject: [PATCH 018/159] Correct a flaw in recently modified actions for key F6. --- widgets/mainwindow.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 3c790f043..5d59abb6a 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -1966,16 +1966,13 @@ void MainWindow::keyPressEvent (QKeyEvent * e) if(bAltF1F6) { bool b=ui->cbFirst->isChecked(); ui->cbFirst->setChecked(!b); - return; } else { if(e->modifiers() & Qt::ShiftModifier) { on_actionDecode_remaining_files_in_directory_triggered(); } else { - on_actionOpen_triggered(); + on_actionOpen_next_in_directory_triggered(); } - return; } - on_actionOpen_next_in_directory_triggered(); return; case Qt::Key_F11: if((e->modifiers() & Qt::ControlModifier) and (e->modifiers() & Qt::ShiftModifier)) { From be724611429037e6e8ef7f53e7030de5bdd29f24 Mon Sep 17 00:00:00 2001 From: Steve Franke Date: Thu, 18 Apr 2019 14:15:24 -0500 Subject: [PATCH 019/159] FT4: Some groundwork for subtraction. --- CMakeLists.txt | 1 + lib/ft4/ft4sim_mult.f90 | 4 ++- lib/ft4/gen_ft4wave.f90 | 28 ++++++++++++----- lib/ft4/subtractft4.f90 | 66 +++++++++++++++++++++++++++++++++++++++++ lib/ft8/gen_ft8wave.f90 | 1 + widgets/mainwindow.cpp | 6 ++-- 6 files changed, 96 insertions(+), 10 deletions(-) create mode 100644 lib/ft4/subtractft4.f90 diff --git a/CMakeLists.txt b/CMakeLists.txt index 5d39c437d..3fbb879dc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -555,6 +555,7 @@ set (wsjt_FSRCS lib/stdmsg.f90 lib/subtract65.f90 lib/ft8/subtractft8.f90 + lib/ft4/subtractft4.f90 lib/sun.f90 lib/symspec.f90 lib/symspec2.f90 diff --git a/lib/ft4/ft4sim_mult.f90 b/lib/ft4/ft4sim_mult.f90 index 065b2a76b..5acfaccef 100644 --- a/lib/ft4/ft4sim_mult.f90 +++ b/lib/ft4/ft4sim_mult.f90 @@ -10,6 +10,7 @@ program ft4sim_mult type(hdr) h !Header for .wav file character arg*12,fname*17,cjunk*4 character msg37*37,msgsent37*37,c77*77 + complex cwave0((NN+2)*NSPS) real wave0((NN+2)*NSPS) real wave(NZZ) real tmp(NZZ) @@ -63,7 +64,8 @@ program ft4sim_mult call pack77(msg37,i3,n3,c77) call genft4(msg37,0,msgsent37,itone) nwave0=(NN+2)*NSPS - call gen_ft4wave(itone,NN,NSPS,12000.0,f0,wave0,nwave0) + icmplx=0 + call gen_ft4wave(itone,NN,NSPS,12000.0,f0,cwave0,wave0,icmplx,nwave0) k0=nint((xdt+0.5)/dt) if(k0.lt.1) k0=1 diff --git a/lib/ft4/gen_ft4wave.f90 b/lib/ft4/gen_ft4wave.f90 index 305310e68..aa4174645 100644 --- a/lib/ft4/gen_ft4wave.f90 +++ b/lib/ft4/gen_ft4wave.f90 @@ -1,6 +1,7 @@ -subroutine gen_ft4wave(itone,nsym,nsps,fsample,f0,wave,nwave) +subroutine gen_ft4wave(itone,nsym,nsps,fsample,f0,cwave,wave,icmplx,nwave) real wave(nwave) + complex cwave(nwave) real pulse(6144) !512*4*3 real dphi(0:240000-1) integer itone(nsym) @@ -34,19 +35,32 @@ subroutine gen_ft4wave(itone,nsym,nsps,fsample,f0,wave,nwave) phi=0.0 dphi = dphi + twopi*f0*dt !Shift frequency up by f0 wave=0. + cwave=0. k=0 do j=0,nwave-1 k=k+1 - wave(k)=sin(phi) + if(icmplx.eq.0) then + wave(k)=sin(phi) + else + cwave(k)=cmplx(cos(phi),sin(phi)) + endif phi=mod(phi+dphi(j),twopi) enddo ! Compute the ramp-up and ramp-down symbols - wave(1:nsps)=wave(1:nsps) * & - (1.0-cos(twopi*(/(i,i=0,nsps-1)/)/(2.0*nsps)))/2.0 - k1=(nsym+1)*nsps+1 - wave(k1:k1+nsps-1)=wave(k1:k1+nsps-1) * & - (1.0+cos(twopi*(/(i,i=0,nsps-1)/)/(2.0*nsps)))/2.0 + if(icmplx.eq.0) then + wave(1:nsps)=wave(1:nsps) * & + (1.0-cos(twopi*(/(i,i=0,nsps-1)/)/(2.0*nsps)))/2.0 + k1=(nsym+1)*nsps+1 + wave(k1:k1+nsps-1)=wave(k1:k1+nsps-1) * & + (1.0+cos(twopi*(/(i,i=0,nsps-1)/)/(2.0*nsps)))/2.0 + else + cwave(1:nsps)=cwave(1:nsps) * & + (1.0-cos(twopi*(/(i,i=0,nsps-1)/)/(2.0*nsps)))/2.0 + k1=(nsym+1)*nsps+1 + cwave(k1:k1+nsps-1)=cwave(k1:k1+nsps-1) * & + (1.0+cos(twopi*(/(i,i=0,nsps-1)/)/(2.0*nsps)))/2.0 + endif return end subroutine gen_ft4wave diff --git a/lib/ft4/subtractft4.f90 b/lib/ft4/subtractft4.f90 new file mode 100644 index 000000000..16e3b9e7f --- /dev/null +++ b/lib/ft4/subtractft4.f90 @@ -0,0 +1,66 @@ +subroutine subtractft4(dd,itone,f0,dt) + +! Subtract an ft4 signal +! +! Measured signal : dd(t) = a(t)cos(2*pi*f0*t+theta(t)) +! Reference signal : cref(t) = exp( j*(2*pi*f0*t+phi(t)) ) +! Complex amp : cfilt(t) = LPF[ dd(t)*CONJG(cref(t)) ] +! Subtract : dd(t) = dd(t) - 2*REAL{cref*cfilt} + + use timer_module, only: timer + + parameter (NMAX=6*12000,NFRAME=(103+2)*79) + parameter (NFFT=NMAX,NFILT=1400) + real*4 dd(NMAX), window(-NFILT/2:NFILT/2), xjunk + complex cref,camp,cfilt,cw + integer itone(79) + logical first + data first/.true./ + common/heap8/cref(NFRAME),camp(NMAX),cfilt(NMAX),cw(NMAX),xjunk(NFRAME) + save first + + nstart=dt*12000+1 + nsym=79 + nsps=1920 + fs=12000.0 + icmplx=1 + bt=1.0 ! Temporary compromise? + call gen_ft4wave(itone,nsym,nsps,fs,f0,cref,xjunk,icmplx,NFRAME) + camp=0. + do i=1,nframe + id=nstart-1+i + if(id.ge.1.and.id.le.NMAX) camp(i)=dd(id)*conjg(cref(i)) + enddo + + if(first) then +! Create and normalize the filter + pi=4.0*atan(1.0) + fac=1.0/float(nfft) + sum=0.0 + do j=-NFILT/2,NFILT/2 + window(j)=cos(pi*j/NFILT)**2 + sum=sum+window(j) + enddo + cw=0. + cw(1:NFILT+1)=window/sum + cw=cshift(cw,NFILT/2+1) + call four2a(cw,nfft,1,-1,1) + cw=cw*fac + first=.false. + endif + + cfilt=0.0 + cfilt(1:nframe)=camp(1:nframe) + call four2a(cfilt,nfft,1,-1,1) + cfilt(1:nfft)=cfilt(1:nfft)*cw(1:nfft) + call four2a(cfilt,nfft,1,1,1) + +! Subtract the reconstructed signal + do i=1,nframe + j=nstart+i-1 + if(j.ge.1 .and. j.le.NMAX) dd(j)=dd(j)-2*REAL(cfilt(i)*cref(i)) + enddo + + return +end subroutine subtractft4 + diff --git a/lib/ft8/gen_ft8wave.f90 b/lib/ft8/gen_ft8wave.f90 index 550011301..37f3b0cbe 100644 --- a/lib/ft8/gen_ft8wave.f90 +++ b/lib/ft8/gen_ft8wave.f90 @@ -42,6 +42,7 @@ subroutine gen_ft8wave(itone,nsym,nsps,bt,fsample,f0,cwave,wave,icmplx,nwave) phi=0.0 dphi = dphi + twopi*f0*dt !Shift frequency up by f0 wave=0. + cwave=0. k=0 do j=nsps,nsps+nwave-1 !Don't include dummy symbols k=k+1 diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 5d59abb6a..a78b12a7f 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -106,7 +106,7 @@ extern "C" { float xjunk[], float wave[], int* icmplx, int* nwave); void gen_ft4wave_(int itone[], int* nsym, int* nsps, float* fsample, float* f0, - float wave[], int* nwave); + float xjunk[], float wave[], int* icmplx, int* nwave); void gen4_(char* msg, int* ichk, char* msgsent, int itone[], int* itext, fortran_charlen_t, fortran_charlen_t); @@ -3745,7 +3745,9 @@ void MainWindow::guiUpdate() float fsample=48000.0; float f0=ui->TxFreqSpinBox->value() - m_XIT; int nwave=(nsym+2)*nsps; - gen_ft4wave_(const_cast(itone),&nsym,&nsps,&fsample,&f0,foxcom_.wave,&nwave); + int icmplx=0; + gen_ft4wave_(const_cast(itone),&nsym,&nsps,&fsample,&f0,foxcom_.wave, + foxcom_.wave,&icmplx,&nwave); } if(SpecOp::EU_VHF==m_config.special_op_id()) { From e8d17a98989739641ab95008ce1ed6cd9f14bdc5 Mon Sep 17 00:00:00 2001 From: Steve Franke Date: Thu, 18 Apr 2019 14:16:39 -0500 Subject: [PATCH 020/159] FT4: Subtraction is basically working. --- lib/ft4/ft4_downsample.f90 | 8 +- lib/ft4/ft4_params.f90 | 2 +- lib/ft4/ft4sim.f90 | 2 +- lib/ft4/ft4sim_mult.f90 | 3 +- lib/ft4/genft4.f90 | 14 +- lib/ft4/getcandidates4.f90 | 6 +- lib/ft4/subtractft4.f90 | 13 +- lib/ft4_decode.f90 | 867 +++++++++++++++++++------------------ lib/ft8/ft8b.f90 | 2 +- lib/ft8/genft8.f90 | 2 +- widgets/mainwindow.cpp | 6 +- 11 files changed, 472 insertions(+), 453 deletions(-) diff --git a/lib/ft4/ft4_downsample.f90 b/lib/ft4/ft4_downsample.f90 index ff0595629..819b10fbc 100644 --- a/lib/ft4/ft4_downsample.f90 +++ b/lib/ft4/ft4_downsample.f90 @@ -1,11 +1,11 @@ -subroutine ft4_downsample(iwave,newdata,f0,c) +subroutine ft4_downsample(dd,newdata,f0,c) -! Input: i*2 data in iwave() at sample rate 12000 Hz +! Input: real data in dd() at sample rate 12000 Hz ! Output: Complex data in c(), sampled at 1200 Hz include 'ft4_params.f90' parameter (NFFT2=NMAX/16) - integer*2 iwave(NMAX) + real dd(NMAX) complex c(0:NMAX/NDOWN-1) complex c1(0:NFFT2-1) complex cx(0:NMAX/2) @@ -33,7 +33,7 @@ subroutine ft4_downsample(iwave,newdata,f0,c) endif if(newdata) then - x=iwave + x=dd call four2a(x,NMAX,1,-1,0) !r2c FFT to freq domain endif i0=nint(f0/df) diff --git a/lib/ft4/ft4_params.f90 b/lib/ft4/ft4_params.f90 index 02d9de655..46630cc25 100644 --- a/lib/ft4/ft4_params.f90 +++ b/lib/ft4/ft4_params.f90 @@ -9,7 +9,7 @@ parameter (NN2=NS+ND+2) !Total channel symbols (105) parameter (NSPS=512) !Samples per symbol at 12000 S/s parameter (NZ=NSPS*NN) !Sync and Data samples (52736) parameter (NZ2=NSPS*NN2) !Total samples in shaped waveform (53760) -parameter (NMAX=5*12000) !Samples in iwave (60,000) +parameter (NMAX=18*3456) !Samples in iwave parameter (NFFT1=2048, NH1=NFFT1/2) !Length of FFTs for symbol spectra parameter (NSTEP=NSPS) !Coarse time-sync step size parameter (NHSYM=(NMAX-NFFT1)/NSTEP) !Number of symbol spectra (1/4-sym steps) diff --git a/lib/ft4/ft4sim.f90 b/lib/ft4/ft4sim.f90 index 6b5d01599..94ab8218f 100644 --- a/lib/ft4/ft4sim.f90 +++ b/lib/ft4/ft4sim.f90 @@ -63,7 +63,7 @@ program ft4sim n3=-1 call pack77(msg37,i3,n3,c77) read(c77,'(77i1)') msgbits - call genft4(msg37,0,msgsent37,itone) + call genft4(msg37,0,msgsent37,msgbits,itone) write(*,*) write(*,'(a9,a37,3x,a7,i1,a1,i1)') 'Message: ',msgsent37,'i3.n3: ',i3,'.',n3 write(*,1000) f0,xdt,txt,snrdb diff --git a/lib/ft4/ft4sim_mult.f90 b/lib/ft4/ft4sim_mult.f90 index 5acfaccef..313093289 100644 --- a/lib/ft4/ft4sim_mult.f90 +++ b/lib/ft4/ft4sim_mult.f90 @@ -15,6 +15,7 @@ program ft4sim_mult real wave(NZZ) real tmp(NZZ) integer itone(NN) + integer*1 msgbits(77) integer*2 iwave(NZZ) !Generated full-length waveform integer icos4(4) data icos4/0,1,3,2/ @@ -62,7 +63,7 @@ program ft4sim_mult i3=-1 n3=-1 call pack77(msg37,i3,n3,c77) - call genft4(msg37,0,msgsent37,itone) + call genft4(msg37,0,msgsent37,msgbits,itone) nwave0=(NN+2)*NSPS icmplx=0 call gen_ft4wave(itone,NN,NSPS,12000.0,f0,cwave0,wave0,icmplx,nwave0) diff --git a/lib/ft4/genft4.f90 b/lib/ft4/genft4.f90 index 3c6b8ead1..f57ca59aa 100644 --- a/lib/ft4/genft4.f90 +++ b/lib/ft4/genft4.f90 @@ -1,4 +1,4 @@ -subroutine genft4(msg0,ichk,msgsent,i4tone) +subroutine genft4(msg0,ichk,msgsent,msgbits,i4tone) ! Encode an FT4 message ! Input: @@ -52,8 +52,16 @@ subroutine genft4(msg0,ichk,msgsent,i4tone) call unpack77(c77,0,msgsent,unpk77_success) !Unpack to get msgsent if(ichk.eq.1) go to 999 - read(c77,"(77i1)") msgbits - msgbits=mod(msgbits+rvec,2) + read(c77,'(77i1)',err=1) msgbits + if(unpk77_success) go to 2 +1 msgbits=0 + itone=0 + msgsent='*** bad message *** ' + go to 999 + +entry get_ft4_tones_from_77bits(msgbits,i4tone) + +2 msgbits=mod(msgbits+rvec,2) call encode174_91(msgbits,codeword) ! Grayscale mapping: diff --git a/lib/ft4/getcandidates4.f90 b/lib/ft4/getcandidates4.f90 index bf62abfa7..5d42ca740 100644 --- a/lib/ft4/getcandidates4.f90 +++ b/lib/ft4/getcandidates4.f90 @@ -1,4 +1,4 @@ -subroutine getcandidates4(id,fa,fb,syncmin,nfqso,maxcand,savg,candidate, & +subroutine getcandidates4(dd,fa,fb,syncmin,nfqso,maxcand,savg,candidate, & ncand,sbase) include 'ft4_params.f90' @@ -9,7 +9,7 @@ subroutine getcandidates4(id,fa,fb,syncmin,nfqso,maxcand,savg,candidate, & real window(NFFT1) complex cx(0:NH1) real candidate(3,maxcand) - integer*2 id(NMAX) + real dd(NMAX) integer indx(NH1) integer ipk(1) equivalence (x,cx) @@ -33,7 +33,7 @@ subroutine getcandidates4(id,fa,fb,syncmin,nfqso,maxcand,savg,candidate, & ia=(j-1)*NSTEP + 1 ib=ia+NFFT1-1 if(ib.gt.NMAX) exit - x=fac*id(ia:ib)*window + x=fac*dd(ia:ib)*window call four2a(x,NFFT1,1,-1,0) !r2c FFT do i=1,NH1 s(i,j)=real(cx(i))**2 + aimag(cx(i))**2 diff --git a/lib/ft4/subtractft4.f90 b/lib/ft4/subtractft4.f90 index 16e3b9e7f..cb9f2626a 100644 --- a/lib/ft4/subtractft4.f90 +++ b/lib/ft4/subtractft4.f90 @@ -9,22 +9,23 @@ subroutine subtractft4(dd,itone,f0,dt) use timer_module, only: timer - parameter (NMAX=6*12000,NFRAME=(103+2)*79) + parameter (NMAX=18*3456,NFRAME=(103+2)*512) parameter (NFFT=NMAX,NFILT=1400) +! parameter (NFFT=NMAX,NFILT=400) real*4 dd(NMAX), window(-NFILT/2:NFILT/2), xjunk complex cref,camp,cfilt,cw - integer itone(79) + integer itone(103) logical first data first/.true./ common/heap8/cref(NFRAME),camp(NMAX),cfilt(NMAX),cw(NMAX),xjunk(NFRAME) save first - nstart=dt*12000+1 - nsym=79 - nsps=1920 + nstart=dt*12000+1-512 + nsym=103 + nsps=512 fs=12000.0 icmplx=1 - bt=1.0 ! Temporary compromise? + bt=1.0 call gen_ft4wave(itone,nsym,nsps,fs,f0,cref,xjunk,icmplx,NFRAME) camp=0. do i=1,nframe diff --git a/lib/ft4_decode.f90 b/lib/ft4_decode.f90 index 500cdd081..491782a91 100644 --- a/lib/ft4_decode.f90 +++ b/lib/ft4_decode.f90 @@ -1,128 +1,130 @@ module ft4_decode - - type :: ft4_decoder - procedure(ft4_decode_callback), pointer :: callback - contains - procedure :: decode - end type ft4_decoder - abstract interface - subroutine ft4_decode_callback (this,sync,snr,dt,freq,decoded,nap,qual) - import ft4_decoder - implicit none - class(ft4_decoder), intent(inout) :: this - real, intent(in) :: sync - integer, intent(in) :: snr - real, intent(in) :: dt - real, intent(in) :: freq - character(len=37), intent(in) :: decoded - integer, intent(in) :: nap - real, intent(in) :: qual - end subroutine ft4_decode_callback - end interface + type :: ft4_decoder + procedure(ft4_decode_callback), pointer :: callback + contains + procedure :: decode + end type ft4_decoder + + abstract interface + subroutine ft4_decode_callback (this,sync,snr,dt,freq,decoded,nap,qual) + import ft4_decoder + implicit none + class(ft4_decoder), intent(inout) :: this + real, intent(in) :: sync + integer, intent(in) :: snr + real, intent(in) :: dt + real, intent(in) :: freq + character(len=37), intent(in) :: decoded + integer, intent(in) :: nap + real, intent(in) :: qual + end subroutine ft4_decode_callback + end interface contains - subroutine decode(this,callback,iwave,nQSOProgress,nfqso, & - nutc,nfa,nfb,ndepth,ncontest,mycall,hiscall) - use timer_module, only: timer - use packjt77 - include 'ft4/ft4_params.f90' - class(ft4_decoder), intent(inout) :: this - procedure(ft4_decode_callback) :: callback - parameter (NSS=NSPS/NDOWN) - parameter (NZZ=18*3456) - character message*37,msgsent*37,msg0*37 - character c77*77 - character*37 decodes(100) - character*512 data_dir,fname - character*17 cdatetime0 - character*12 mycall,hiscall - character*12 mycall0,hiscall0 - character*6 hhmmss - character*4 cqstr,cqstr0 + subroutine decode(this,callback,iwave,nQSOProgress,nfqso, & + nutc,nfa,nfb,ndepth,ncontest,mycall,hiscall) + use timer_module, only: timer + use packjt77 + include 'ft4/ft4_params.f90' + class(ft4_decoder), intent(inout) :: this + procedure(ft4_decode_callback) :: callback + parameter (NSS=NSPS/NDOWN) + parameter (NZZ=18*3456) + character message*37,msgsent*37,msg0*37 + character c77*77 + character*37 decodes(100) + character*512 data_dir,fname + character*17 cdatetime0 + character*12 mycall,hiscall + character*12 mycall0,hiscall0 + character*6 hhmmss + character*4 cqstr,cqstr0 - complex cd2(0:NZZ/NDOWN-1) !Complex waveform - complex cb(0:NZZ/NDOWN-1+NN*NSS) - complex cd(0:NN*NSS-1) !Complex waveform - complex ctwk(2*NSS),ctwk2(2*NSS,-16:16) - complex csymb(NSS) - complex cs(0:3,NN) - real s4(0:3,NN) + complex cd2(0:NZZ/NDOWN-1) !Complex waveform + complex cb(0:NZZ/NDOWN-1+NN*NSS) + complex cd(0:NN*NSS-1) !Complex waveform + complex ctwk(2*NSS),ctwk2(2*NSS,-16:16) + complex csymb(NSS) + complex cs(0:3,NN) + real s4(0:3,NN) - real bmeta(2*NN),bmetb(2*NN),bmetc(2*NN) - real a(5) - real llr(2*ND),llra(2*ND),llrb(2*ND),llrc(2*ND),llrd(2*ND) - real s2(0:255) - real candidate(3,100) - real savg(NH1),sbase(NH1) + real bmeta(2*NN),bmetb(2*NN),bmetc(2*NN) + real a(5) + real dd(NZZ) + real llr(2*ND),llra(2*ND),llrb(2*ND),llrc(2*ND),llrd(2*ND) + real s2(0:255) + real candidate(3,100) + real savg(NH1),sbase(NH1) - integer apbits(2*ND) - integer apmy_ru(28),aphis_fd(28) - integer icos4a(0:3),icos4b(0:3),icos4c(0:3),icos4d(0:3) - integer*2 iwave(NZZ) !Raw received data - integer*1 message77(77),rvec(77),apmask(2*ND),cw(2*ND) - integer*1 hbits(2*NN) - integer graymap(0:3) - integer ip(1) - integer nappasses(0:5) ! # of decoding passes for QSO States 0-5 - integer naptypes(0:5,4) ! nQSOProgress, decoding pass - integer mcq(29) - integer mrrr(19),m73(19),mrr73(19) + integer apbits(2*ND) + integer apmy_ru(28),aphis_fd(28) + integer icos4a(0:3),icos4b(0:3),icos4c(0:3),icos4d(0:3) + integer*2 iwave(NZZ) !Raw received data + integer*1 message77(77),rvec(77),apmask(2*ND),cw(2*ND) + integer*1 hbits(2*NN) + integer graymap(0:3) + integer i4tone(103) + integer ip(1) + integer nappasses(0:5) ! # of decoding passes for QSO States 0-5 + integer naptypes(0:5,4) ! nQSOProgress, decoding pass + integer mcq(29) + integer mrrr(19),m73(19),mrr73(19) - logical nohiscall,unpk77_success - logical one(0:255,0:7) ! 256 4-symbol sequences, 8 bits - logical first, dobigfft + logical nohiscall,unpk77_success + logical one(0:255,0:7) ! 256 4-symbol sequences, 8 bits + logical first, dobigfft - data icos4a/0,1,3,2/ - data icos4b/1,0,2,3/ - data icos4c/2,3,1,0/ - data icos4d/3,2,0,1/ - data graymap/0,1,3,2/ - data msg0/' '/ - data first/.true./ - data mcq/0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0/ - data mrrr/0,1,1,1,1,1,1,0,1,0,0,1,0,0,1,0,0,0,1/ - data m73/0,1,1,1,1,1,1,0,1,0,0,1,0,1,0,0,0,0,1/ - data mrr73/0,1,1,1,1,1,1,0,0,1,1,1,0,1,0,1,0,0,1/ - data rvec/0,1,0,0,1,0,1,0,0,1,0,1,1,1,1,0,1,0,0,0,1,0,0,1,1,0,1,1,0, & - 1,0,0,1,0,1,1,0,0,0,0,1,0,0,0,1,0,1,0,0,1,1,1,1,0,0,1,0,1, & - 0,1,0,1,0,1,1,0,1,1,1,1,1,0,0,0,1,0,1/ - save fs,dt,tt,txt,twopi,h,one,first,apbits,nappasses,naptypes, & - mycall0,hiscall0,msg0,cqstr0,ctwk2 + data icos4a/0,1,3,2/ + data icos4b/1,0,2,3/ + data icos4c/2,3,1,0/ + data icos4d/3,2,0,1/ + data graymap/0,1,3,2/ + data msg0/' '/ + data first/.true./ + data mcq/0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0/ + data mrrr/0,1,1,1,1,1,1,0,1,0,0,1,0,0,1,0,0,0,1/ + data m73/0,1,1,1,1,1,1,0,1,0,0,1,0,1,0,0,0,0,1/ + data mrr73/0,1,1,1,1,1,1,0,0,1,1,1,0,1,0,1,0,0,1/ + data rvec/0,1,0,0,1,0,1,0,0,1,0,1,1,1,1,0,1,0,0,0,1,0,0,1,1,0,1,1,0, & + 1,0,0,1,0,1,1,0,0,0,0,1,0,0,0,1,0,1,0,0,1,1,1,1,0,0,1,0,1, & + 0,1,0,1,0,1,1,0,1,1,1,1,1,0,0,0,1,0,1/ + save fs,dt,tt,txt,twopi,h,one,first,apbits,nappasses,naptypes, & + mycall0,hiscall0,msg0,cqstr0,ctwk2 - this%callback => callback - hhmmss=cdatetime0(8:13) - if(first) then - fs=12000.0/NDOWN !Sample rate after downsampling - dt=1/fs !Sample interval after downsample (s) - tt=NSPS*dt !Duration of "itone" symbols (s) - txt=NZ*dt !Transmission length (s) without ramp up/down - twopi=8.0*atan(1.0) - h=1.0 - one=.false. - do i=0,255 - do j=0,7 - if(iand(i,2**j).ne.0) one(i,j)=.true. + this%callback => callback + hhmmss=cdatetime0(8:13) + if(first) then + fs=12000.0/NDOWN !Sample rate after downsampling + dt=1/fs !Sample interval after downsample (s) + tt=NSPS*dt !Duration of "itone" symbols (s) + txt=NZ*dt !Transmission length (s) without ramp up/down + twopi=8.0*atan(1.0) + h=1.0 + one=.false. + do i=0,255 + do j=0,7 + if(iand(i,2**j).ne.0) one(i,j)=.true. + enddo enddo - enddo - do idf=-16,16 - a=0. - a(1)=real(idf) - ctwk=1. - call twkfreq1(ctwk,2*NSS,fs/2.0,a,ctwk2(:,idf)) - enddo + do idf=-16,16 + a=0. + a(1)=real(idf) + ctwk=1. + call twkfreq1(ctwk,2*NSS,fs/2.0,a,ctwk2(:,idf)) + enddo - mrrr=2*mod(mrrr+rvec(59:77),2)-1 - m73=2*mod(m73+rvec(59:77),2)-1 - mrr73=2*mod(mrr73+rvec(59:77),2)-1 - nappasses(0)=2 - nappasses(1)=2 - nappasses(2)=2 - nappasses(3)=2 - nappasses(4)=2 - nappasses(5)=3 + mrrr=2*mod(mrrr+rvec(59:77),2)-1 + m73=2*mod(m73+rvec(59:77),2)-1 + mrr73=2*mod(mrr73+rvec(59:77),2)-1 + nappasses(0)=2 + nappasses(1)=2 + nappasses(2)=2 + nappasses(3)=2 + nappasses(4)=2 + nappasses(5)=3 ! iaptype !------------------------ @@ -133,257 +135,257 @@ contains ! 5 MyCall DxCall 73 (77 ap bits) ! 6 MyCall DxCall RR73 (77 ap bits) !******** - naptypes(0,1:4)=(/1,2,0,0/) ! Tx6 selected (CQ) - naptypes(1,1:4)=(/2,3,0,0/) ! Tx1 - naptypes(2,1:4)=(/2,3,0,0/) ! Tx2 - naptypes(3,1:4)=(/3,6,0,0/) ! Tx3 - naptypes(4,1:4)=(/3,6,0,0/) ! Tx4 - naptypes(5,1:4)=(/3,1,2,0/) ! Tx5 + naptypes(0,1:4)=(/1,2,0,0/) ! Tx6 selected (CQ) + naptypes(1,1:4)=(/2,3,0,0/) ! Tx1 + naptypes(2,1:4)=(/2,3,0,0/) ! Tx2 + naptypes(3,1:4)=(/3,6,0,0/) ! Tx3 + naptypes(4,1:4)=(/3,6,0,0/) ! Tx4 + naptypes(5,1:4)=(/3,1,2,0/) ! Tx5 - mycall0='' - hiscall0='' - cqstr0='' - first=.false. - endif - - if(cqstr.ne.cqstr0) then - i0=index(cqstr,' ') - if(i0.le.1) then - message='CQ A1AA AA01' - else - message='CQ '//cqstr(1:i0-1)//' A1AA AA01' + mycall0='' + hiscall0='' + cqstr0='' + first=.false. endif - i3=-1 - n3=-1 - call pack77(message,i3,n3,c77) - call unpack77(c77,1,msgsent,unpk77_success) - read(c77,'(29i1)') mcq - mcq=2*mod(mcq+rvec(1:29),2)-1 - cqstr0=cqstr - endif - l1=index(mycall,char(0)) - if(l1.ne.0) mycall(l1:)=" " - l1=index(hiscall,char(0)) - if(l1.ne.0) hiscall(l1:)=" " - if(mycall.ne.mycall0 .or. hiscall.ne.hiscall0) then - apbits=0 - apbits(1)=99 - apbits(30)=99 - apmy_ru=0 - aphis_fd=0 - - if(len(trim(mycall)) .lt. 3) go to 10 - - nohiscall=.false. - hiscall0=hiscall - if(len(trim(hiscall0)).lt.3) then - hiscall0=mycall ! use mycall for dummy hiscall - mycall won't be hashed. - nohiscall=.true. - endif - message=trim(mycall)//' '//trim(hiscall0)//' RR73' - i3=-1 - n3=-1 - call pack77(message,i3,n3,c77) - call unpack77(c77,1,msgsent,unpk77_success) - if(i3.ne.1 .or. (message.ne.msgsent) .or. .not.unpk77_success) go to 10 - read(c77,'(77i1)') message77 - apmy_ru=2*mod(message77(1:28)+rvec(2:29),2)-1 - aphis_fd=2*mod(message77(30:57)+rvec(29:56),2)-1 - message77=mod(message77+rvec,2) - call encode174_91(message77,cw) - apbits=2*cw-1 - if(nohiscall) apbits(30)=99 - -10 continue - mycall0=mycall - hiscall0=hiscall - endif - candidate=0.0 - ncand=0 - syncmin=1.2 - maxcand=100 - - fa=nfa - fb=nfb - call timer('getcand4',0) - call getcandidates4(iwave,fa,fb,syncmin,nfqso,maxcand,savg,candidate, & - ncand,sbase) - call timer('getcand4',1) - - ndecodes=0 - dobigfft=.true. - do icand=1,ncand - f0=candidate(1,icand) - snr=candidate(3,icand)-1.0 - call timer('ft4_down',0) - call ft4_downsample(iwave,dobigfft,f0,cd2) !Downsample to 32 Sam/Sym - call timer('ft4_down',1) - if(dobigfft) dobigfft=.false. - sum2=sum(cd2*conjg(cd2))/(real(NZZ)/real(NDOWN)) - if(sum2.gt.0.0) cd2=cd2/sqrt(sum2) -! Sample rate is now 12000/16 = 750 samples/second - do isync=1,2 - if(isync.eq.1) then - idfmin=-12 - idfmax=12 - idfstp=3 - ibmin=0 - ibmax=800 - ibstp=4 + if(cqstr.ne.cqstr0) then + i0=index(cqstr,' ') + if(i0.le.1) then + message='CQ A1AA AA01' else - idfmin=idfbest-4 - idfmax=idfbest+4 - idfstp=1 - ibmin=max(0,ibest-5) - ibmax=min(ibest+5,NZZ/NDOWN-1) - ibstp=1 + message='CQ '//cqstr(1:i0-1)//' A1AA AA01' endif - ibest=-1 - smax=-99. - idfbest=0 - call timer('sync4d ',0) - do idf=idfmin,idfmax,idfstp - do istart=ibmin,ibmax,ibstp - call sync4d(cd2,istart,ctwk2(:,idf),1,sync) !Find sync power - if(sync.gt.smax) then - smax=sync - ibest=istart - idfbest=idf + i3=-1 + n3=-1 + call pack77(message,i3,n3,c77) + call unpack77(c77,1,msgsent,unpk77_success) + read(c77,'(29i1)') mcq + mcq=2*mod(mcq+rvec(1:29),2)-1 + cqstr0=cqstr + endif + + l1=index(mycall,char(0)) + if(l1.ne.0) mycall(l1:)=" " + l1=index(hiscall,char(0)) + if(l1.ne.0) hiscall(l1:)=" " + if(mycall.ne.mycall0 .or. hiscall.ne.hiscall0) then + apbits=0 + apbits(1)=99 + apbits(30)=99 + apmy_ru=0 + aphis_fd=0 + + if(len(trim(mycall)) .lt. 3) go to 10 + + nohiscall=.false. + hiscall0=hiscall + if(len(trim(hiscall0)).lt.3) then + hiscall0=mycall ! use mycall for dummy hiscall - mycall won't be hashed. + nohiscall=.true. + endif + message=trim(mycall)//' '//trim(hiscall0)//' RR73' + i3=-1 + n3=-1 + call pack77(message,i3,n3,c77) + call unpack77(c77,1,msgsent,unpk77_success) + if(i3.ne.1 .or. (message.ne.msgsent) .or. .not.unpk77_success) go to 10 + read(c77,'(77i1)') message77 + apmy_ru=2*mod(message77(1:28)+rvec(2:29),2)-1 + aphis_fd=2*mod(message77(30:57)+rvec(29:56),2)-1 + message77=mod(message77+rvec,2) + call encode174_91(message77,cw) + apbits=2*cw-1 + if(nohiscall) apbits(30)=99 + +10 continue + mycall0=mycall + hiscall0=hiscall + endif + syncmin=1.2 + maxcand=100 + ndecodes=0 + decodes=' ' + fa=nfa + fb=nfb + dd=iwave + + do isp = 1,2 + candidate=0.0 + ncand=0 + call timer('getcand4',0) + call getcandidates4(dd,fa,fb,syncmin,nfqso,maxcand,savg,candidate, & + ncand,sbase) + call timer('getcand4',1) + dobigfft=.true. + do icand=1,ncand + f0=candidate(1,icand) + snr=candidate(3,icand)-1.0 + call timer('ft4_down',0) + call ft4_downsample(dd,dobigfft,f0,cd2) !Downsample to 32 Sam/Sym + call timer('ft4_down',1) + if(dobigfft) dobigfft=.false. + sum2=sum(cd2*conjg(cd2))/(real(NZZ)/real(NDOWN)) + if(sum2.gt.0.0) cd2=cd2/sqrt(sum2) +! Sample rate is now 12000/16 = 750 samples/second + do isync=1,2 + if(isync.eq.1) then + idfmin=-12 + idfmax=12 + idfstp=3 + ibmin=0 + ibmax=800 + ibstp=4 + else + idfmin=idfbest-4 + idfmax=idfbest+4 + idfstp=1 + ibmin=max(0,ibest-5) + ibmax=min(ibest+5,NZZ/NDOWN-1) + ibstp=1 endif + ibest=-1 + smax=-99. + idfbest=0 + call timer('sync4d ',0) + do idf=idfmin,idfmax,idfstp + do istart=ibmin,ibmax,ibstp + call sync4d(cd2,istart,ctwk2(:,idf),1,sync) !Find sync power + if(sync.gt.smax) then + smax=sync + ibest=istart + idfbest=idf + endif + enddo + enddo + call timer('sync4d ',1) enddo - enddo - call timer('sync4d ',1) - enddo - f0=f0+real(idfbest) - if( f0.le.10.0 .or. f0.ge.4990.0 ) cycle -! write(*,3002) smax,ibest/750.0,f0 -!3002 format('b',3f8.2) - call timer('ft4down ',0) - call ft4_downsample(iwave,dobigfft,f0,cb) !Final downsample, corrected f0 - call timer('ft4down ',1) - sum2=sum(abs(cb)**2)/(real(NSS)*NN) - if(sum2.gt.0.0) cb=cb/sqrt(sum2) - cd=cb(ibest:ibest+NN*NSS-1) - call timer('four2a ',0) - do k=1,NN - i1=(k-1)*NSS - csymb=cd(i1:i1+NSS-1) - call four2a(csymb,NSS,1,-1,1) - cs(0:3,k)=csymb(1:4) - s4(0:3,k)=abs(csymb(1:4)) - enddo - call timer('four2a ',1) + f0=f0+real(idfbest) + if( f0.le.10.0 .or. f0.ge.4990.0 ) cycle + call timer('ft4down ',0) + call ft4_downsample(dd,dobigfft,f0,cb) !Final downsample, corrected f0 + call timer('ft4down ',1) + sum2=sum(abs(cb)**2)/(real(NSS)*NN) + if(sum2.gt.0.0) cb=cb/sqrt(sum2) + cd=cb(ibest:ibest+NN*NSS-1) + call timer('four2a ',0) + do k=1,NN + i1=(k-1)*NSS + csymb=cd(i1:i1+NSS-1) + call four2a(csymb,NSS,1,-1,1) + cs(0:3,k)=csymb(1:4) + s4(0:3,k)=abs(csymb(1:4)) + enddo + call timer('four2a ',1) ! Sync quality check - is1=0 - is2=0 - is3=0 - is4=0 - do k=1,4 - ip=maxloc(s4(:,k)) - if(icos4a(k-1).eq.(ip(1)-1)) is1=is1+1 - ip=maxloc(s4(:,k+33)) - if(icos4b(k-1).eq.(ip(1)-1)) is2=is2+1 - ip=maxloc(s4(:,k+66)) - if(icos4c(k-1).eq.(ip(1)-1)) is3=is3+1 - ip=maxloc(s4(:,k+99)) - if(icos4d(k-1).eq.(ip(1)-1)) is4=is4+1 - enddo - nsync=is1+is2+is3+is4 !Number of correct hard sync symbols, 0-16 - if(smax .lt. 0.7 .or. nsync .lt. 8) cycle - - do nseq=1,3 !Try coherent sequences of 1, 2, and 4 symbols - if(nseq.eq.1) nsym=1 - if(nseq.eq.2) nsym=2 - if(nseq.eq.3) nsym=4 - nt=2**(2*nsym) - do ks=1,NN-nsym+1,nsym !87+16=103 symbols. - amax=-1.0 - do i=0,nt-1 - i1=i/64 - i2=iand(i,63)/16 - i3=iand(i,15)/4 - i4=iand(i,3) - if(nsym.eq.1) then - s2(i)=abs(cs(graymap(i4),ks)) - elseif(nsym.eq.2) then - s2(i)=abs(cs(graymap(i3),ks)+cs(graymap(i4),ks+1)) - elseif(nsym.eq.4) then - s2(i)=abs(cs(graymap(i1),ks ) + & - cs(graymap(i2),ks+1) + & - cs(graymap(i3),ks+2) + & - cs(graymap(i4),ks+3) & - ) - else - print*,"Error - nsym must be 1, 2, or 4." - endif + is1=0 + is2=0 + is3=0 + is4=0 + do k=1,4 + ip=maxloc(s4(:,k)) + if(icos4a(k-1).eq.(ip(1)-1)) is1=is1+1 + ip=maxloc(s4(:,k+33)) + if(icos4b(k-1).eq.(ip(1)-1)) is2=is2+1 + ip=maxloc(s4(:,k+66)) + if(icos4c(k-1).eq.(ip(1)-1)) is3=is3+1 + ip=maxloc(s4(:,k+99)) + if(icos4d(k-1).eq.(ip(1)-1)) is4=is4+1 enddo - ipt=1+(ks-1)*2 - if(nsym.eq.1) ibmax=1 - if(nsym.eq.2) ibmax=3 - if(nsym.eq.4) ibmax=7 - do ib=0,ibmax - bm=maxval(s2(0:nt-1),one(0:nt-1,ibmax-ib)) - & - maxval(s2(0:nt-1),.not.one(0:nt-1,ibmax-ib)) - if(ipt+ib.gt.2*NN) cycle - if(nsym.eq.1) then - bmeta(ipt+ib)=bm - elseif(nsym.eq.2) then - bmetb(ipt+ib)=bm - elseif(nsym.eq.4) then - bmetc(ipt+ib)=bm - endif + nsync=is1+is2+is3+is4 !Number of correct hard sync symbols, 0-16 + if(smax .lt. 0.7 .or. nsync .lt. 8) cycle + + do nseq=1,3 !Try coherent sequences of 1, 2, and 4 symbols + if(nseq.eq.1) nsym=1 + if(nseq.eq.2) nsym=2 + if(nseq.eq.3) nsym=4 + nt=2**(2*nsym) + do ks=1,NN-nsym+1,nsym !87+16=103 symbols. + amax=-1.0 + do i=0,nt-1 + i1=i/64 + i2=iand(i,63)/16 + i3=iand(i,15)/4 + i4=iand(i,3) + if(nsym.eq.1) then + s2(i)=abs(cs(graymap(i4),ks)) + elseif(nsym.eq.2) then + s2(i)=abs(cs(graymap(i3),ks)+cs(graymap(i4),ks+1)) + elseif(nsym.eq.4) then + s2(i)=abs(cs(graymap(i1),ks ) + & + cs(graymap(i2),ks+1) + & + cs(graymap(i3),ks+2) + & + cs(graymap(i4),ks+3) & + ) + else + print*,"Error - nsym must be 1, 2, or 4." + endif + enddo + ipt=1+(ks-1)*2 + if(nsym.eq.1) ibmax=1 + if(nsym.eq.2) ibmax=3 + if(nsym.eq.4) ibmax=7 + do ib=0,ibmax + bm=maxval(s2(0:nt-1),one(0:nt-1,ibmax-ib)) - & + maxval(s2(0:nt-1),.not.one(0:nt-1,ibmax-ib)) + if(ipt+ib.gt.2*NN) cycle + if(nsym.eq.1) then + bmeta(ipt+ib)=bm + elseif(nsym.eq.2) then + bmetb(ipt+ib)=bm + elseif(nsym.eq.4) then + bmetc(ipt+ib)=bm + endif + enddo + enddo enddo - enddo - enddo - bmetb(205:206)=bmeta(205:206) - bmetc(201:204)=bmetb(201:204) - bmetc(205:206)=bmeta(205:206) + bmetb(205:206)=bmeta(205:206) + bmetc(201:204)=bmetb(201:204) + bmetc(205:206)=bmeta(205:206) - call normalizebmet(bmeta,2*NN) - call normalizebmet(bmetb,2*NN) - call normalizebmet(bmetc,2*NN) + call normalizebmet(bmeta,2*NN) + call normalizebmet(bmetb,2*NN) + call normalizebmet(bmetc,2*NN) - hbits=0 - where(bmeta.ge.0) hbits=1 - ns1=count(hbits( 1: 8).eq.(/0,0,0,1,1,0,1,1/)) - ns2=count(hbits( 67: 74).eq.(/0,1,0,0,1,1,1,0/)) - ns3=count(hbits(133:140).eq.(/1,1,1,0,0,1,0,0/)) - ns4=count(hbits(199:206).eq.(/1,0,1,1,0,0,0,1/)) - nsync_qual=ns1+ns2+ns3+ns4 - if(nsync_qual.lt. 20) cycle + hbits=0 + where(bmeta.ge.0) hbits=1 + ns1=count(hbits( 1: 8).eq.(/0,0,0,1,1,0,1,1/)) + ns2=count(hbits( 67: 74).eq.(/0,1,0,0,1,1,1,0/)) + ns3=count(hbits(133:140).eq.(/1,1,1,0,0,1,0,0/)) + ns4=count(hbits(199:206).eq.(/1,0,1,1,0,0,0,1/)) + nsync_qual=ns1+ns2+ns3+ns4 + if(nsync_qual.lt. 20) cycle - scalefac=2.83 - llra( 1: 58)=bmeta( 9: 66) - llra( 59:116)=bmeta( 75:132) - llra(117:174)=bmeta(141:198) - llra=scalefac*llra - llrb( 1: 58)=bmetb( 9: 66) - llrb( 59:116)=bmetb( 75:132) - llrb(117:174)=bmetb(141:198) - llrb=scalefac*llrb - llrc( 1: 58)=bmetc( 9: 66) - llrc( 59:116)=bmetc( 75:132) - llrc(117:174)=bmetc(141:198) - llrc=scalefac*llrc + scalefac=2.83 + llra( 1: 58)=bmeta( 9: 66) + llra( 59:116)=bmeta( 75:132) + llra(117:174)=bmeta(141:198) + llra=scalefac*llra + llrb( 1: 58)=bmetb( 9: 66) + llrb( 59:116)=bmetb( 75:132) + llrb(117:174)=bmetb(141:198) + llrb=scalefac*llrb + llrc( 1: 58)=bmetc( 9: 66) + llrc( 59:116)=bmetc( 75:132) + llrc(117:174)=bmetc(141:198) + llrc=scalefac*llrc - apmag=maxval(abs(llra))*1.1 - npasses=3+nappasses(nQSOProgress) - if(ncontest.ge.5) npasses=3 ! Don't support Fox and Hound - do ipass=1,npasses - if(ipass.eq.1) llr=llra - if(ipass.eq.2) llr=llrb - if(ipass.eq.3) llr=llrc - if(ipass.le.3) then - apmask=0 - iaptype=0 - endif + apmag=maxval(abs(llra))*1.1 + npasses=3+nappasses(nQSOProgress) + if(ncontest.ge.5) npasses=3 ! Don't support Fox and Hound + do ipass=1,npasses + if(ipass.eq.1) llr=llra + if(ipass.eq.2) llr=llrb + if(ipass.eq.3) llr=llrc + if(ipass.le.3) then + apmask=0 + iaptype=0 + endif - if(ipass .gt. 3) then - llrd=llrc - iaptype=naptypes(nQSOProgress,ipass-3) + if(ipass .gt. 3) then + llrd=llrc + iaptype=naptypes(nQSOProgress,ipass-3) ! ncontest=0 : NONE ! 1 : NA_VHF @@ -394,94 +396,99 @@ contains ! 6 : HOUND ! ! Conditions that cause us to bail out of AP decoding - napwid=50 - if(ncontest.le.4 .and. iaptype.ge.3 .and. (abs(f0-nfqso).gt.napwid) ) cycle - if(iaptype.ge.2 .and. apbits(1).gt.1) cycle ! No, or nonstandard, mycall - if(iaptype.ge.3 .and. apbits(30).gt.1) cycle ! No, or nonstandard, dxcall + napwid=50 + if(ncontest.le.4 .and. iaptype.ge.3 .and. (abs(f0-nfqso).gt.napwid) ) cycle + if(iaptype.ge.2 .and. apbits(1).gt.1) cycle ! No, or nonstandard, mycall + if(iaptype.ge.3 .and. apbits(30).gt.1) cycle ! No, or nonstandard, dxcall - if(iaptype.eq.1) then ! CQ or CQ TEST or CQ FD or CQ RU or CQ SCC - apmask=0 - apmask(1:29)=1 - llrd(1:29)=apmag*mcq(1:29) - endif + if(iaptype.eq.1) then ! CQ or CQ TEST or CQ FD or CQ RU or CQ SCC + apmask=0 + apmask(1:29)=1 + llrd(1:29)=apmag*mcq(1:29) + endif - if(iaptype.eq.2) then ! MyCall,???,??? - apmask=0 - if(ncontest.eq.0.or.ncontest.eq.1) then - apmask(1:29)=1 - llrd(1:29)=apmag*apbits(1:29) - else if(ncontest.eq.2) then - apmask(1:28)=1 - llrd(1:28)=apmag*apbits(1:28) - else if(ncontest.eq.3) then - apmask(1:28)=1 - llrd(1:28)=apmag*apbits(1:28) - else if(ncontest.eq.4) then - apmask(2:29)=1 - llrd(2:29)=apmag*apmy_ru(1:28) + if(iaptype.eq.2) then ! MyCall,???,??? + apmask=0 + if(ncontest.eq.0.or.ncontest.eq.1) then + apmask(1:29)=1 + llrd(1:29)=apmag*apbits(1:29) + else if(ncontest.eq.2) then + apmask(1:28)=1 + llrd(1:28)=apmag*apbits(1:28) + else if(ncontest.eq.3) then + apmask(1:28)=1 + llrd(1:28)=apmag*apbits(1:28) + else if(ncontest.eq.4) then + apmask(2:29)=1 + llrd(2:29)=apmag*apmy_ru(1:28) + endif + endif + + if(iaptype.eq.3) then ! MyCall,DxCall,??? + apmask=0 + if(ncontest.eq.0.or.ncontest.eq.1.or.ncontest.eq.2) then + apmask(1:58)=1 + llrd(1:58)=apmag*apbits(1:58) + else if(ncontest.eq.3) then ! Field Day + apmask(1:56)=1 + llrd(1:28)=apmag*apbits(1:28) + llrd(29:56)=apmag*aphis_fd(1:28) + else if(ncontest.eq.4) then ! RTTY RU + apmask(2:57)=1 + llrd(2:29)=apmag*apmy_ru(1:28) + llrd(30:57)=apmag*apbits(30:57) + endif + endif + + if(iaptype.eq.4 .or. iaptype.eq.5 .or. iaptype.eq.6) then + apmask=0 + if(ncontest.le.4) then + apmask(1:91)=1 ! mycall, hiscall, RRR|73|RR73 + if(iaptype.eq.6) llrd(1:91)=apmag*apbits(1:91) + endif + endif + + llr=llrd endif - endif - - if(iaptype.eq.3) then ! MyCall,DxCall,??? - apmask=0 - if(ncontest.eq.0.or.ncontest.eq.1.or.ncontest.eq.2) then - apmask(1:58)=1 - llrd(1:58)=apmag*apbits(1:58) - else if(ncontest.eq.3) then ! Field Day - apmask(1:56)=1 - llrd(1:28)=apmag*apbits(1:28) - llrd(29:56)=apmag*aphis_fd(1:28) - else if(ncontest.eq.4) then ! RTTY RU - apmask(2:57)=1 - llrd(2:29)=apmag*apmy_ru(1:28) - llrd(30:57)=apmag*apbits(30:57) + max_iterations=40 + message77=0 + call timer('bpdec174',0) + call bpdecode174_91(llr,apmask,max_iterations,message77, & + cw,nharderror,niterations) + call timer('bpdec174',1) + if(sum(message77).eq.0) cycle + if( nharderror.ge.0 ) then + message77=mod(message77+rvec,2) ! remove rvec scrambling + write(c77,'(77i1)') message77(1:77) + call unpack77(c77,1,message,unpk77_success) + if(unpk77_success) then + call get_ft4_tones_from_77bits(message77,i4tone) + dt=real(ibest)/750.0 + call subtractft4(dd,i4tone,f0,dt) + endif + idupe=0 + do i=1,ndecodes + if(decodes(i).eq.message) idupe=1 + enddo + if(ibest.le.10 .and. message.eq.msg0) idupe=1 !Already decoded + if(idupe.eq.1) exit + ndecodes=ndecodes+1 + decodes(ndecodes)=message + if(snr.gt.0.0) then + xsnr=10*log10(snr)-14.0 + else + xsnr=-20.0 + endif + nsnr=nint(max(-20.0,xsnr)) + xdt=ibest/750.0 - 0.5 + call this%callback(sync,nsnr,xdt,f0,message,iaptype,qual) + if(ibest.ge.ibmax-15) msg0=message !Possible dupe candidate + exit endif - endif - - if(iaptype.eq.4 .or. iaptype.eq.5 .or. iaptype.eq.6) then - apmask=0 - if(ncontest.le.4) then - apmask(1:91)=1 ! mycall, hiscall, RRR|73|RR73 - if(iaptype.eq.6) llrd(1:91)=apmag*apbits(1:91) - endif - endif - - llr=llrd - endif - max_iterations=40 - message77=0 - call timer('bpdec174',0) - call bpdecode174_91(llr,apmask,max_iterations,message77, & - cw,nharderror,niterations) - call timer('bpdec174',1) - if(sum(message77).eq.0) cycle - if( nharderror.ge.0 ) then - message77=mod(message77+rvec,2) ! remove rvec scrambling - write(c77,'(77i1)') message77(1:77) - call unpack77(c77,1,message,unpk77_success) - idupe=0 - do i=1,ndecodes - if(decodes(i).eq.message) idupe=1 - enddo - if(ibest.le.10 .and. message.eq.msg0) idupe=1 !Already decoded - if(idupe.eq.1) exit - ndecodes=ndecodes+1 - decodes(ndecodes)=message - if(snr.gt.0.0) then - xsnr=10*log10(snr)-14.0 - else - xsnr=-20.0 - endif - nsnr=nint(max(-20.0,xsnr)) - xdt=ibest/750.0 - 0.5 - call this%callback(sync,nsnr,xdt,f0,message,iaptype,qual) - if(ibest.ge.ibmax-15) msg0=message !Possible dupe candidate - exit - endif - enddo !Sequence estimation - enddo !Candidate list - - return - end subroutine decode + enddo !Sequence estimation + enddo !Candidate list + enddo !Subtraction loop + return + end subroutine decode end module ft4_decode diff --git a/lib/ft8/ft8b.f90 b/lib/ft8/ft8b.f90 index 6fbb03685..0376311f2 100644 --- a/lib/ft8/ft8b.f90 +++ b/lib/ft8/ft8b.f90 @@ -396,7 +396,7 @@ subroutine ft8b(dd0,newdat,nQSOProgress,nfqso,nftx,ndepth,lapon,lapcqonly, & cycle endif nbadcrc=0 ! If we get this far: valid codeword, valid (i3,n3), nonquirky message. - call get_tones_from_77bits(message77,itone) + call get_ft8_tones_from_77bits(message77,itone) if(lsubtract) call subtractft8(dd0,itone,f1,xdt) xsig=0.0 xnoi=0.0 diff --git a/lib/ft8/genft8.f90 b/lib/ft8/genft8.f90 index 41ff546c3..a03c3e587 100644 --- a/lib/ft8/genft8.f90 +++ b/lib/ft8/genft8.f90 @@ -25,7 +25,7 @@ subroutine genft8(msg,i3,n3,msgsent,msgbits,itone) msgsent='*** bad message *** ' go to 900 -entry get_tones_from_77bits(msgbits,itone) +entry get_ft8_tones_from_77bits(msgbits,itone) 2 call encode174_91(msgbits,codeword) !Encode the test message diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index a78b12a7f..d50520946 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -99,7 +99,7 @@ extern "C" { void genft8_(char* msg, int* i3, int* n3, char* msgsent, char ft8msgbits[], int itone[], fortran_charlen_t, fortran_charlen_t); - void genft4_(char* msg, int* ichk, char* msgsent, int itone[], + void genft4_(char* msg, int* ichk, char* msgsent, char ft4msgbits[], int itone[], fortran_charlen_t, fortran_charlen_t); void gen_ft8wave_(int itone[], int* nsym, int* nsps, float* bt, float* fsample, float* f0, @@ -3739,7 +3739,9 @@ void MainWindow::guiUpdate() } if(m_modeTx=="FT4") { int ichk=0; - genft4_(message, &ichk, msgsent, const_cast(itone), 37, 37); + char ft4msgbits[77]; + genft4_(message, &ichk, msgsent, const_cast (ft4msgbits), + const_cast(itone), 37, 37); int nsym=103; int nsps=4*512; float fsample=48000.0; From 274633875768c3e31f797c363574109533eb41fc Mon Sep 17 00:00:00 2001 From: Steve Franke Date: Thu, 18 Apr 2019 17:19:56 -0500 Subject: [PATCH 021/159] Measure time spent in subtract4.f90. --- lib/ft4/subtractft4.f90 | 1 - lib/ft4_decode.f90 | 2 ++ 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/ft4/subtractft4.f90 b/lib/ft4/subtractft4.f90 index cb9f2626a..83470d7ea 100644 --- a/lib/ft4/subtractft4.f90 +++ b/lib/ft4/subtractft4.f90 @@ -11,7 +11,6 @@ subroutine subtractft4(dd,itone,f0,dt) parameter (NMAX=18*3456,NFRAME=(103+2)*512) parameter (NFFT=NMAX,NFILT=1400) -! parameter (NFFT=NMAX,NFILT=400) real*4 dd(NMAX), window(-NFILT/2:NFILT/2), xjunk complex cref,camp,cfilt,cw integer itone(103) diff --git a/lib/ft4_decode.f90 b/lib/ft4_decode.f90 index 491782a91..b505762e4 100644 --- a/lib/ft4_decode.f90 +++ b/lib/ft4_decode.f90 @@ -464,7 +464,9 @@ contains if(unpk77_success) then call get_ft4_tones_from_77bits(message77,i4tone) dt=real(ibest)/750.0 + call timer('subtract',0) call subtractft4(dd,i4tone,f0,dt) + call timer('subtract',1) endif idupe=0 do i=1,ndecodes From 8d8c4f43db1a5bfe7bc810291022584e681a75ca Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Fri, 19 Apr 2019 08:58:56 -0400 Subject: [PATCH 022/159] Change label "ARRL RTTY Roundup" to "RTTY Roundup messages". --- Configuration.ui | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Configuration.ui b/Configuration.ui index a576304c7..c92774d9f 100644 --- a/Configuration.ui +++ b/Configuration.ui @@ -2556,7 +2556,7 @@ Right click for insert and delete options. <html><head/><body><p>ARRL RTTY Roundup and similar contests. Exchange is US state, Canadian province, or &quot;DX&quot;.</p></body></html> - ARRL RTTY Roundup + RTTY Roundup rules special_op_activity_button_group From e1f054d8bfc714745803345a31bb72b291d652f0 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Fri, 19 Apr 2019 15:32:00 -0400 Subject: [PATCH 023/159] Use a slightly more generic label "RTTY Roundup messages". --- Configuration.ui | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Configuration.ui b/Configuration.ui index c92774d9f..36a96d66f 100644 --- a/Configuration.ui +++ b/Configuration.ui @@ -2556,7 +2556,7 @@ Right click for insert and delete options. <html><head/><body><p>ARRL RTTY Roundup and similar contests. Exchange is US state, Canadian province, or &quot;DX&quot;.</p></body></html> - RTTY Roundup rules + RTTY Roundup messages special_op_activity_button_group From 5814887770c5ef008e645383920fe271721e3114 Mon Sep 17 00:00:00 2001 From: Steve Franke Date: Fri, 19 Apr 2019 14:38:54 -0500 Subject: [PATCH 024/159] FT4: Wire up Fast/Normal/Deep. --- lib/ft4_decode.f90 | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/lib/ft4_decode.f90 b/lib/ft4_decode.f90 index b505762e4..b217dbb23 100644 --- a/lib/ft4_decode.f90 +++ b/lib/ft4_decode.f90 @@ -32,7 +32,7 @@ contains procedure(ft4_decode_callback) :: callback parameter (NSS=NSPS/NDOWN) parameter (NZZ=18*3456) - character message*37,msgsent*37,msg0*37 + character message*37,msgsent*37 character c77*77 character*37 decodes(100) character*512 data_dir,fname @@ -75,13 +75,13 @@ contains logical nohiscall,unpk77_success logical one(0:255,0:7) ! 256 4-symbol sequences, 8 bits logical first, dobigfft + logical dosubtract data icos4a/0,1,3,2/ data icos4b/1,0,2,3/ data icos4c/2,3,1,0/ data icos4d/3,2,0,1/ data graymap/0,1,3,2/ - data msg0/' '/ data first/.true./ data mcq/0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0/ data mrrr/0,1,1,1,1,1,1,0,1,0,0,1,0,0,1,0,0,0,1/ @@ -91,7 +91,7 @@ contains 1,0,0,1,0,1,1,0,0,0,0,1,0,0,0,1,0,1,0,0,1,1,1,1,0,0,1,0,1, & 0,1,0,1,0,1,1,0,1,1,1,1,1,0,0,0,1,0,1/ save fs,dt,tt,txt,twopi,h,one,first,apbits,nappasses,naptypes, & - mycall0,hiscall0,msg0,cqstr0,ctwk2 + mycall0,hiscall0,cqstr0,ctwk2 this%callback => callback hhmmss=cdatetime0(8:13) @@ -201,7 +201,6 @@ contains mycall0=mycall hiscall0=hiscall endif - syncmin=1.2 maxcand=100 ndecodes=0 decodes=' ' @@ -209,7 +208,21 @@ contains fb=nfb dd=iwave - do isp = 1,2 +! ndepth=3: 2 passes, subtract on each pass +! ndepth=2: 1 pass, no subtraction +! ndepth=1: 1 pass, no subtraction, fewer candidates + + max_iterations=40 + syncmin=1.2 + dosubtract=.true. + nsp=2 + if(ndepth.lt.3) then + nsp=1 + dosubtract=.false. + endif + if(ndepth.eq.1) syncmin=2.0 + + do isp = 1,nsp candidate=0.0 ncand=0 call timer('getcand4',0) @@ -373,6 +386,7 @@ contains apmag=maxval(abs(llra))*1.1 npasses=3+nappasses(nQSOProgress) + if(ndepth.eq.1) npasses=3 if(ncontest.ge.5) npasses=3 ! Don't support Fox and Hound do ipass=1,npasses if(ipass.eq.1) llr=llra @@ -384,7 +398,7 @@ contains endif if(ipass .gt. 3) then - llrd=llrc + llrd=llra iaptype=naptypes(nQSOProgress,ipass-3) ! ncontest=0 : NONE @@ -450,7 +464,6 @@ contains llr=llrd endif - max_iterations=40 message77=0 call timer('bpdec174',0) call bpdecode174_91(llr,apmask,max_iterations,message77, & @@ -461,7 +474,7 @@ contains message77=mod(message77+rvec,2) ! remove rvec scrambling write(c77,'(77i1)') message77(1:77) call unpack77(c77,1,message,unpk77_success) - if(unpk77_success) then + if(unpk77_success.and.dosubtract) then call get_ft4_tones_from_77bits(message77,i4tone) dt=real(ibest)/750.0 call timer('subtract',0) @@ -472,7 +485,6 @@ contains do i=1,ndecodes if(decodes(i).eq.message) idupe=1 enddo - if(ibest.le.10 .and. message.eq.msg0) idupe=1 !Already decoded if(idupe.eq.1) exit ndecodes=ndecodes+1 decodes(ndecodes)=message @@ -484,7 +496,6 @@ contains nsnr=nint(max(-20.0,xsnr)) xdt=ibest/750.0 - 0.5 call this%callback(sync,nsnr,xdt,f0,message,iaptype,qual) - if(ibest.ge.ibmax-15) msg0=message !Possible dupe candidate exit endif enddo !Sequence estimation From 5b3a15ce0b6f966e98c7c407a7df872c0f9b020c Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Fri, 19 Apr 2019 15:41:24 -0400 Subject: [PATCH 025/159] Insert new, tentative, default dial frequencies for FT4. --- models/FrequencyList.cpp | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/models/FrequencyList.cpp b/models/FrequencyList.cpp index d080f76cf..2e0cdb45e 100644 --- a/models/FrequencyList.cpp +++ b/models/FrequencyList.cpp @@ -60,48 +60,52 @@ namespace {3570000, Modes::JT65, IARURegions::ALL}, // JA compatible {3572000, Modes::JT9, IARURegions::ALL}, - {3573000, Modes::FT8, IARURegions::ALL}, // above as below JT65 - // is out of DM allocation - {3568600, Modes::WSPR, IARURegions::ALL}, // needs guard marker - // and lock out + {3573000, Modes::FT8, IARURegions::ALL}, // above as below JT65 is out of DM allocation + {3568600, Modes::WSPR, IARURegions::ALL}, // needs guard marker and lock out + {3595000, Modes::FT4, IARURegions::ALL}, {7038600, Modes::WSPR, IARURegions::ALL}, {7074000, Modes::FT8, IARURegions::ALL}, {7076000, Modes::JT65, IARURegions::ALL}, - {7078000, Modes::FT4, IARURegions::ALL}, {7078000, Modes::JT9, IARURegions::ALL}, + {7090000, Modes::FT4, IARURegions::ALL}, {10136000, Modes::FT8, IARURegions::ALL}, {10138000, Modes::JT65, IARURegions::ALL}, {10138700, Modes::WSPR, IARURegions::ALL}, {10140000, Modes::JT9, IARURegions::ALL}, - + {10140000, Modes::FT4, IARURegions::ALL}, + {14095600, Modes::WSPR, IARURegions::ALL}, {14074000, Modes::FT8, IARURegions::ALL}, {14076000, Modes::JT65, IARURegions::ALL}, - {14078000, Modes::FT4, IARURegions::ALL}, {14078000, Modes::JT9, IARURegions::ALL}, + {14140000, Modes::FT4, IARURegions::ALL}, {18100000, Modes::FT8, IARURegions::ALL}, {18102000, Modes::JT65, IARURegions::ALL}, {18104000, Modes::JT9, IARURegions::ALL}, + {18104000, Modes::FT4, IARURegions::ALL}, {18104600, Modes::WSPR, IARURegions::ALL}, {21074000, Modes::FT8, IARURegions::ALL}, {21076000, Modes::JT65, IARURegions::ALL}, {21078000, Modes::JT9, IARURegions::ALL}, {21094600, Modes::WSPR, IARURegions::ALL}, - + {21140000, Modes::FT4, IARURegions::ALL}, + {24915000, Modes::FT8, IARURegions::ALL}, {24917000, Modes::JT65, IARURegions::ALL}, {24919000, Modes::JT9, IARURegions::ALL}, + {24919000, Modes::FT4, IARURegions::ALL}, {24924600, Modes::WSPR, IARURegions::ALL}, {28074000, Modes::FT8, IARURegions::ALL}, {28076000, Modes::JT65, IARURegions::ALL}, {28078000, Modes::JT9, IARURegions::ALL}, {28124600, Modes::WSPR, IARURegions::ALL}, - + {28180000, Modes::FT4, IARURegions::ALL}, + {50200000, Modes::Echo, IARURegions::ALL}, {50276000, Modes::JT65, IARURegions::R2}, {50276000, Modes::JT65, IARURegions::R3}, @@ -113,6 +117,7 @@ namespace {50310000, Modes::JT65, IARURegions::ALL}, {50312000, Modes::JT9, IARURegions::ALL}, {50313000, Modes::FT8, IARURegions::ALL}, + {50318000, Modes::FT4, IARURegions::ALL}, {50323000, Modes::FT8, IARURegions::ALL}, {70100000, Modes::FT8, IARURegions::R1}, @@ -123,6 +128,7 @@ namespace {144120000, Modes::JT65, IARURegions::ALL}, {144120000, Modes::Echo, IARURegions::ALL}, + {144170000, Modes::FT4, IARURegions::ALL}, {144174000, Modes::FT8, IARURegions::ALL}, {144360000, Modes::MSK144, IARURegions::R1}, {144150000, Modes::MSK144, IARURegions::R2}, From f78a9ec7dffe5a3aada1a3b7f3c4023af385faf9 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Fri, 19 Apr 2019 15:42:37 -0400 Subject: [PATCH 026/159] Insert June 7 timeout date. --- widgets/mainwindow.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index d50520946..13910ca53 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -994,9 +994,9 @@ void MainWindow::not_GA_warning_message () "

" "This is a pre-release version of WSJT-X 2.1.0 made " "available for testing purposes. It will become nonfunctional " - "after June 1, 2019."); + "after June 7, 2019."); QDateTime now=QDateTime::currentDateTime(); - QDateTime timeout=QDateTime(QDate(2019,6,1)); + QDateTime timeout=QDateTime(QDate(2019,6,7)); if(now.daysTo(timeout) < 0) Q_EMIT finished(); } From 25d07fd57445d06f177caa1f0d3de5e27d53d3c2 Mon Sep 17 00:00:00 2001 From: Steve Franke Date: Fri, 19 Apr 2019 15:14:08 -0500 Subject: [PATCH 027/159] FT4: Hide AP Enable menu pick --- AP is always enabled, for now. --- widgets/mainwindow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index d50520946..067b3f4e6 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -5655,7 +5655,7 @@ void MainWindow::on_actionFT4_triggered() ui->label_7->setText("Rx Frequency"); ui->label_6->setText("Band Activity"); ui->decodedTextLabel->setText( " UTC dB DT Freq Message"); - displayWidgets(nWidgets("111010000100111000010000100110001")); + displayWidgets(nWidgets("111010000100111000010000000110001")); ui->txrb2->setEnabled(true); ui->txrb4->setEnabled(true); ui->txrb5->setEnabled(true); From cf2219173a1a1d77e039212581978e9168daa084 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Sat, 20 Apr 2019 01:14:23 +0100 Subject: [PATCH 028/159] Squash a SEGV --- lib/ft8/gen_ft8wave.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ft8/gen_ft8wave.f90 b/lib/ft8/gen_ft8wave.f90 index 37f3b0cbe..10edc994e 100644 --- a/lib/ft8/gen_ft8wave.f90 +++ b/lib/ft8/gen_ft8wave.f90 @@ -42,7 +42,7 @@ subroutine gen_ft8wave(itone,nsym,nsps,bt,fsample,f0,cwave,wave,icmplx,nwave) phi=0.0 dphi = dphi + twopi*f0*dt !Shift frequency up by f0 wave=0. - cwave=0. + if (icmplx .ne. 0) cwave=0. ! avoid writing to memory we may not have access to k=0 do j=nsps,nsps+nwave-1 !Don't include dummy symbols k=k+1 From 561af7f411bfaf3973dd9ddb6565d8c0db23943c Mon Sep 17 00:00:00 2001 From: Steve Franke Date: Sat, 20 Apr 2019 09:37:36 -0500 Subject: [PATCH 029/159] Avoid zeroing cwave when it is not going to be used. --- lib/ft4/gen_ft4wave.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ft4/gen_ft4wave.f90 b/lib/ft4/gen_ft4wave.f90 index aa4174645..410e83401 100644 --- a/lib/ft4/gen_ft4wave.f90 +++ b/lib/ft4/gen_ft4wave.f90 @@ -35,7 +35,7 @@ subroutine gen_ft4wave(itone,nsym,nsps,fsample,f0,cwave,wave,icmplx,nwave) phi=0.0 dphi = dphi + twopi*f0*dt !Shift frequency up by f0 wave=0. - cwave=0. + if(icmplx.eq.1) cwave=0. k=0 do j=0,nwave-1 k=k+1 From eaf567747c7e0395df3ef67935b17516cfecb24b Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 22 Apr 2019 09:42:28 -0400 Subject: [PATCH 030/159] Fix the "Tx2 for Tx3" bug when using RTTY RU messages. Needs further testing! --- widgets/mainwindow.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 132aa6cb1..cab69d38d 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -4533,7 +4533,8 @@ void MainWindow::processMessage (DecodedText const& message, Qt::KeyboardModifie if(message_words.size () > 3 // enough fields for a normal message && (message_words.at(1).contains(m_baseCall) || "DE" == message_words.at(1)) // && (message_words.at(2).contains(qso_partner_base_call) or bEU_VHF_w2)) { - && (message_words.at(2).contains(qso_partner_base_call) or m_bDoubleClicked or bEU_VHF_w2)) { + && (message_words.at(2).contains(qso_partner_base_call) or m_bDoubleClicked + or bEU_VHF_w2 or (m_QSOProgress==CALLING))) { if(message_words.at(3).contains(grid_regexp) and SpecOp::EU_VHF!=m_config.special_op_id()) { if(SpecOp::NA_VHF==m_config.special_op_id()){ @@ -4660,7 +4661,7 @@ void MainWindow::processMessage (DecodedText const& message, Qt::KeyboardModifie } m_QSOProgress = SIGNOFF; } - else if (!(m_bAutoReply && m_QSOProgress > CALLING)) { + else if (!(m_bAutoReply && (m_QSOProgress > CALLING))) { if ((message_words.size () > 4 && message_words.at (1).contains (m_baseCall) && message_words.at (4) == "OOO")) { // EME short code report or MSK144/FT8 contest mode reply, send back Tx3 From dc627cb48c9017fbb5a823c539104959529abfe7 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Tue, 23 Apr 2019 14:16:55 -0400 Subject: [PATCH 031/159] Enable QSO types other than RTTY RU in FT4 mode. --- widgets/mainwindow.cpp | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index cab69d38d..7da40dfcb 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -4433,7 +4433,6 @@ void MainWindow::processMessage (DecodedText const& message, Qt::KeyboardModifie return; } - // only allow automatic mode changes between JT9 and JT65, and when not transmitting if (!m_transmitting and m_mode == "JT9+JT65") { if (message.isJT9()) @@ -4529,7 +4528,6 @@ void MainWindow::processMessage (DecodedText const& message, Qt::KeyboardModifie // ### Should be in RTTY contest mode ??? ### MessageBox::information_message (this, tr ("Should you switch to RTTY contest mode?")); } - if(message_words.size () > 3 // enough fields for a normal message && (message_words.at(1).contains(m_baseCall) || "DE" == message_words.at(1)) // && (message_words.at(2).contains(qso_partner_base_call) or bEU_VHF_w2)) { @@ -8684,18 +8682,10 @@ void MainWindow::write_all(QString txRx, QString message) void MainWindow::chkFT4() { if(m_mode!="FT4") return; - if(m_config.special_op_id()==SpecOp::RTTY or m_config.special_op_id()==SpecOp::NA_VHF) { - ui->cbAutoSeq->setEnabled(true); - ui->cbFirst->setEnabled(true); - ui->labDXped->setVisible(true); - } else { - ui->cbAutoSeq->setChecked(false); - ui->cbAutoSeq->setEnabled(false); - ui->cbFirst->setChecked(false); - ui->cbFirst->setEnabled(false); - ui->cbFirst->setVisible(false); - ui->labDXped->setVisible(false); - } + ui->cbAutoSeq->setEnabled(true); + ui->cbFirst->setVisible(true); + ui->cbFirst->setEnabled(true); + ui->labDXped->setVisible(m_config.special_op_id()!=SpecOp::NONE); ui->cbFirst->setVisible(ui->cbAutoSeq->isChecked()); if (SpecOp::NONE < m_config.special_op_id () && SpecOp::FOX > m_config.special_op_id ()) { From f308d5246ec890c78abb4bed01edec19adfc0944 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Tue, 23 Apr 2019 20:20:45 -0400 Subject: [PATCH 032/159] Make the contest serial number spinner visible, where it should be. --- widgets/mainwindow.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 7da40dfcb..67f9132d4 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -1751,6 +1751,7 @@ void MainWindow::on_actionSettings_triggered() //Setup Dialog bool b = vhf && (m_mode=="JT4" or m_mode=="JT65" or m_mode=="ISCAT" or m_mode=="JT9" or m_mode=="MSK144" or m_mode=="QRA64"); if(b) VHF_features_enabled(b); + if(m_mode=="FT4") on_actionFT8_triggered(); if(m_mode=="FT8") on_actionFT8_triggered(); if(m_mode=="JT4") on_actionJT4_triggered(); if(m_mode=="JT9") on_actionJT9_triggered(); @@ -5616,8 +5617,13 @@ void MainWindow::displayWidgets(qint64 n) j=j>>1; } ui->pbBestSP->setVisible(m_mode=="FT4"); + b=false; + if(m_mode=="FT4" or m_mode=="FT8") { b=SpecOp::EU_VHF==m_config.special_op_id() or (SpecOp::RTTY==m_config.special_op_id() and - (m_config.RTTY_Exchange()=="DX" or m_config.RTTY_Exchange()=="SCC")); + (m_config.RTTY_Exchange()=="DX" or m_config.RTTY_Exchange()=="#" or + m_config.RTTY_Exchange()=="SCC")); + } + if(m_mode=="MSK144") b=SpecOp::EU_VHF==m_config.special_op_id() ui->sbSerialNumber->setVisible(b); m_lastCallsign.clear (); // ensures Tx5 is updated for new modes genStdMsgs (m_rpt, true); From a19d82e3621fd8ded9c43bc6c8a8d780692ddbd7 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Wed, 24 Apr 2019 09:30:02 -0400 Subject: [PATCH 033/159] Fix a typo. --- widgets/mainwindow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 67f9132d4..cc20c9ce4 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -5623,7 +5623,7 @@ void MainWindow::displayWidgets(qint64 n) (m_config.RTTY_Exchange()=="DX" or m_config.RTTY_Exchange()=="#" or m_config.RTTY_Exchange()=="SCC")); } - if(m_mode=="MSK144") b=SpecOp::EU_VHF==m_config.special_op_id() + if(m_mode=="MSK144") b=SpecOp::EU_VHF==m_config.special_op_id(); ui->sbSerialNumber->setVisible(b); m_lastCallsign.clear (); // ensures Tx5 is updated for new modes genStdMsgs (m_rpt, true); From 50eb2914af474cfde6f5b5532616615c867fa956 Mon Sep 17 00:00:00 2001 From: Steve Franke Date: Fri, 26 Apr 2019 16:44:09 -0500 Subject: [PATCH 034/159] Change FT4 mode symbol to plus (+). --- lib/decoder.f90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/decoder.f90 b/lib/decoder.f90 index 37ca5b1bd..8ca7e3161 100644 --- a/lib/decoder.f90 +++ b/lib/decoder.f90 @@ -604,9 +604,9 @@ contains endif write(*,1001) params%nutc,snr,dt,nint(freq),decoded0,annot -1001 format(i6.6,i4,f5.1,i5,' ~ ',1x,a37,1x,a2) +1001 format(i6.6,i4,f5.1,i5,' + ',1x,a37,1x,a2) write(13,1002) params%nutc,nint(sync),snr,dt,freq,0,decoded0 -1002 format(i6.6,i4,i5,f6.1,f8.0,i4,3x,a37,' FT8') +1002 format(i6.6,i4,i5,f6.1,f8.0,i4,3x,a37,' FT4') call flush(6) call flush(13) From dc66304a654e5503ca6a902e29fe1739baac1795 Mon Sep 17 00:00:00 2001 From: Steve Franke Date: Fri, 26 Apr 2019 20:06:32 -0500 Subject: [PATCH 035/159] Improve ALL.TXT formatting for JT9/JT65. Thank you to Sandro, IW3RAB, for submitting this fix. --- widgets/mainwindow.cpp | 34 +++++++++++++++++++++++++++------- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index cc20c9ce4..bbd84463b 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -8656,24 +8656,44 @@ void MainWindow::write_all(QString txRx, QString message) { QString line; QString t; - QString msg=message.mid(6,-1); + QString msg; + QString mode_string; + + if (message[4]==' ') { + msg=message.mid(4,-1); + } else { + msg=message.mid(6,-1); + } + + if (message[19]=='#') { + mode_string="JT65 "; + } else if (message[19]=='@') { + mode_string="JT9 "; + } else { + mode_string=m_mode.leftJustified(6,' '); + } + msg=msg.mid(0,15) + msg.mid(18,-1); t.sprintf("%5d",ui->TxFreqSpinBox->value()); - if(txRx=="Tx") msg=" 0 0.0" + t + " " + message; + if (txRx=="Tx") msg=" 0 0.0" + t + " " + message; auto time = QDateTime::currentDateTimeUtc (); time = time.addSecs(-(time.time().second() % m_TRperiod)); t.sprintf("%10.3f ",m_freqNominal/1.e6); - if(m_diskData) { - line=m_fileDateTime + t + txRx + " " + m_mode.leftJustified(6,' ') + msg; + if (m_diskData) { + if (m_fileDateTime.size()==11) { + line=m_fileDateTime + " " + t + txRx + " " + mode_string + msg; + } else { + line=m_fileDateTime + t + txRx + " " + mode_string + msg; + } } else { - line=time.toString("yyMMdd_hhmmss") + t + txRx + " " + m_mode.leftJustified(6,' ') + msg; + line=time.toString("yyMMdd_hhmmss") + t + txRx + " " + mode_string + msg; } QString file_name="ALL.TXT"; - if(m_mode=="WSPR") file_name="ALL_WSPR.TXT"; + if (m_mode=="WSPR") file_name="ALL_WSPR.TXT"; QFile f{m_config.writeable_data_dir().absoluteFilePath(file_name)}; - if(f.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Append)) { + if (f.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Append)) { QTextStream out(&f); out << line << endl; f.close(); From 3b8b871a7c18cf5ced8f5a28c4c10da012ea9523 Mon Sep 17 00:00:00 2001 From: Steve Franke Date: Sat, 27 Apr 2019 16:38:19 -0500 Subject: [PATCH 036/159] Disable AP for mycall if more than 5 minutes since last Tx. Used to be 10 minutes. --- widgets/mainwindow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index bbd84463b..b96240cba 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -2811,7 +2811,7 @@ void MainWindow::decode() //decode() QDateTime now = QDateTime::currentDateTimeUtc (); if( m_dateTimeLastTX.isValid () ) { qint64 isecs_since_tx = m_dateTimeLastTX.secsTo(now); - dec_data.params.lapcqonly= (isecs_since_tx > 600); + dec_data.params.lapcqonly= (isecs_since_tx > 300); // QTextStream(stdout) << "last tx " << isecs_since_tx << endl; } else { m_dateTimeLastTX = now.addSecs(-900); From c5a591f30c102b72c931138c10c2b0d54492772c Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Sun, 28 Apr 2019 22:06:52 +0100 Subject: [PATCH 037/159] Bump release candidate number --- Versions.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Versions.cmake b/Versions.cmake index 8f0591243..59af33460 100644 --- a/Versions.cmake +++ b/Versions.cmake @@ -2,5 +2,5 @@ set (WSJTX_VERSION_MAJOR 2) set (WSJTX_VERSION_MINOR 1) set (WSJTX_VERSION_PATCH 0) -set (WSJTX_RC 4) # release candidate number, comment out or zero for development versions +set (WSJTX_RC 5) # release candidate number, comment out or zero for development versions set (WSJTX_VERSION_IS_RELEASE 0) # set to 1 for final release build From a28402c52737855c734c230b4fe9cbb64c5821e5 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Sun, 28 Apr 2019 22:20:24 +0100 Subject: [PATCH 038/159] Avoid a crash when Rx samples arrive before wide graph plotter is ready --- widgets/plotter.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/widgets/plotter.cpp b/widgets/plotter.cpp index 38e5027a9..98c1af168 100644 --- a/widgets/plotter.cpp +++ b/widgets/plotter.cpp @@ -123,6 +123,7 @@ void CPlotter::paintEvent(QPaintEvent *) // paint void CPlotter::draw(float swide[], bool bScroll, bool bRed) { + if (!m_TRperiod) return; // not ready to plot yet int j,j0; static int ktop=0; float y,y2,ymin; From 3b6ece8bc6333279f9910023df5c9a22c664c340 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Mon, 29 Apr 2019 03:08:59 +0100 Subject: [PATCH 039/159] Add some band plan annotation with some proposed FT4 working frequency suggestions --- models/FrequencyList.cpp | 172 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 167 insertions(+), 5 deletions(-) diff --git a/models/FrequencyList.cpp b/models/FrequencyList.cpp index 2e0cdb45e..eddc6e1f7 100644 --- a/models/FrequencyList.cpp +++ b/models/FrequencyList.cpp @@ -57,31 +57,193 @@ namespace {1838000, Modes::JT65, IARURegions::ALL}, // squeezed allocations {1839000, Modes::JT9, IARURegions::ALL}, {1840000, Modes::FT8, IARURegions::ALL}, - + + // Band plans (all USB dial unless stated otherwise) + // + // R1: 3570 - 3580 DM NB(<200Hz) + // 3580 - 3600 DM NB(<500Hz) with 3590 - 3600 ACDS + // + // 3577.75 OLIVIA, Contestia, etc. + // 3580 PSK31 + // 3583.25 OLIVIA, Contestia, etc. + // + // R2: 3570 - 3580 DM NB(<200Hz) + // 3580 - 3600 DM NB(<500Hz) with 3590 - 3600 ACDS + // + // 3577.75 OLIVIA, Contestia, etc. + // 3580 PSK31 + // 3583.25 OLIVIA, Contestia, etc. + // 3590 RTTY DX + // 3596 W1AW DM QST + // + // R3: 3535 - 3580 DM NB(<2000Hz) + // + // 3520 - 3575 DM NB(<2000Hz) JA 3535 - 3575 shared with all modes + // + // 3522 OLIVIA, Contestia, etc. + // 3535 JA LSB EMCOMM + // 3580 PSK31 + // 3600 LSB EMCOMM + // {3570000, Modes::JT65, IARURegions::ALL}, // JA compatible {3572000, Modes::JT9, IARURegions::ALL}, {3573000, Modes::FT8, IARURegions::ALL}, // above as below JT65 is out of DM allocation {3568600, Modes::WSPR, IARURegions::ALL}, // needs guard marker and lock out - {3595000, Modes::FT4, IARURegions::ALL}, - + {3595000, Modes::FT4, IARURegions::ALL}, // G4WJS: band + // planners prefer + // below 3590 but JA + // must be below 3575, + // how about 3586 with + // an R3 alternative + // of 3568. + + // Band plans (all USB dial unless stated otherwise) + // + // R1: 7040 - 7050 DM NB(<500Hz) with 7047 - 7050 ACDS + // 7050 - 7060 DM WB(<2700Hz) with 7050 - 7053 ACDS + // + // 7040 PSK31 + // 7043.25 OLIVIA, Contestia, etc. (main QRQ) + // 7070 PSK31 + // 7073.25 OLIVIA, Contestia, etc. (main QRQ) + // 7090 LSB QRP CoA + // + // R2: 7040 - 7050 DM NB(<500Hz) with 7047 - 7050 ACDS + // 7050 - 7053 DM WB(<2700Hz) ACDS shared with all modes + // + // 7040 RTTY DX + // 7043.25 OLIVIA, Contestia, etc. (main QRQ) + // 7070 PSK31 (also LSB EMCOMM) + // 7073.25 OLIVIA, Contestia, etc. (main QRQ) + // 7080 - 7125 RTTY/Data + // 7090 LSB QRP CoA + // + // R3: 7030 - 7060 DM NB(<2000Hz) with 7040 - 7060 NB DX all shared with phone + // + // 7030 - 7100 DM WB(<3000Hz) JA 7045 - 7100 shared with all modes + // + // 7026.25 OLIVIA, Contestia, etc. (main QRQ) + // 7035 PSK31 + // 7050 JA LSB EMCOMM + // 7090 LSB QRP CoA + // 7110 LSB EMCOMM + // {7038600, Modes::WSPR, IARURegions::ALL}, {7074000, Modes::FT8, IARURegions::ALL}, {7076000, Modes::JT65, IARURegions::ALL}, {7078000, Modes::JT9, IARURegions::ALL}, - {7090000, Modes::FT4, IARURegions::ALL}, + {7090000, Modes::FT4, IARURegions::ALL}, // G4WJS: band planners + // prefer below 7050, + // how about 7047 all + // regions although + // clashes with JA + // EMCOMM. + // Band plans (all USB dial unless stated otherwise) + // + // R1: 10130 - 10150 DM NB(<500Hz) with 10120 - 10140 shared with phone in southern Africa + // + // 10139.25 OLIVIA, Contestia, etc. + // 10142 PSK31 + // 10142.25 OLIVIA, Contestia, etc. + // 10143.25 OLIVIA, Contestia, etc. (main QRQ) + // + // R2: 10130 - 10140 DM NB(<500Hz) shared with ACDS + // 10140 - 10150 DM WB(<2700Hz) + // + // 10130 - 10140 RTTY + // 10139.25 OLIVIA, Contestia, etc. + // 10140 - 10150 Packet + // 10142 PSK31 + // 10142.25 OLIVIA, Contestia, etc. + // 10143.25 OLIVIA, Contestia, etc. (main QRQ) + // + // R3: 10130 - 10150 DM NB(<2000Hz) + // + // 10139.25 OLIVIA, Contestia, etc. + // 10142 PSK31 + // 10142.25 OLIVIA, Contestia, etc. + // 10143.25 OLIVIA, Contestia, etc. (main QRQ) + // {10136000, Modes::FT8, IARURegions::ALL}, {10138000, Modes::JT65, IARURegions::ALL}, {10138700, Modes::WSPR, IARURegions::ALL}, {10140000, Modes::JT9, IARURegions::ALL}, {10140000, Modes::FT4, IARURegions::ALL}, + // Band plans (all USB dial unless stated otherwise) + // + // R1: 14070 - 14099 DM NB(<500Hz) with 14089 - 14099 ACDS + // 14101 - 14112 DM NB(<2700Hz) ACDS + // + // 14070 PSK31 + // 14074.4 OLIVIA, Contestia, etc. + // 14075.4 OLIVIA, Contestia, etc. (main QRG) + // 14078.4 OLIVIA, Contestia, etc. + // 14100 NCDXF beacons + // 14105.5 OLIVIA 1000 + // 14106.5 OLIVIA 1000 (main QRG) + // + // R2: 14070 - 14099 DM NB(<500Hz) with 14089 - 14099 ACDS + // 14101 - 14112 DM NB(<2700Hz) ACDS + // + // 14070 - 14095 RTTY + // 14070 PSK31 + // 14074.4 OLIVIA, Contestia, etc. + // 14075.4 OLIVIA, Contestia, etc. (main QRG) + // 14078.4 OLIVIA, Contestia, etc. + // 14095 - 14099.5 Packet + // 14100 NCDXF beacons + // 14100.5 - 14112 Packet + // 14105.5 OLIVIA 1000 + // 14106.5 OLIVIA 1000 (main QRG) + // + // R3: 14070 - 14112 DM NB(<2000Hz) with ±500Hz IBP guard band at 14100 + // + // 14070 PSK31 + // 14074.4 OLIVIA, Contestia, etc. + // 14075.4 OLIVIA, Contestia, etc. (main QRG) + // 14078.4 OLIVIA, Contestia, etc. + // 14100 NCDXF beacons + // 14105.5 OLIVIA 1000 + // 14106.5 OLIVIA 1000 (main QRG) + // {14095600, Modes::WSPR, IARURegions::ALL}, {14074000, Modes::FT8, IARURegions::ALL}, {14076000, Modes::JT65, IARURegions::ALL}, {14078000, Modes::JT9, IARURegions::ALL}, - {14140000, Modes::FT4, IARURegions::ALL}, + {14140000, Modes::FT4, IARURegions::ALL}, // G4WJS: band + // planners prefer + // below 14099, how + // about 14080. + // Band plans (all USB dial unless stated otherwise) + // + // R1: 18095 - 18109 DM NB(<500Hz) with 18105 - 18109 ACDS + // 18111 - 18120 DM NB(<2700Hz) ACDS + // + // 18100 PSK31 + // 18103.4 OLIVIA, Contestia, etc. (main QRG) + // 18104.4 OLIVIA, Contestia, etc. + // 18110 NCDXF beacons + // + // R2: 18095 - 18109 DM NB(<500Hz) with 18105 - 18109 ACDS + // 18111 - 18120 DM NB(<2700Hz) ACDS + // + // 18100 - 18105 RTTY + // 18100 PSK31 + // 18103.4 OLIVIA, Contestia, etc. (main QRG) + // 18104.4 OLIVIA, Contestia, etc. + // 18105 - 18110 Packet + // 18110 NCDXF beacons + // + // R3: 18095 - 18120 DM NB(<2000Hz) with ±500Hz IBP guard band at 18110 + // + // 18100 PSK31 + // 18103.4 OLIVIA, Contestia, etc. (main QRG) + // 18104.4 OLIVIA, Contestia, etc. + // 18110 NCDXF beacons + // {18100000, Modes::FT8, IARURegions::ALL}, {18102000, Modes::JT65, IARURegions::ALL}, {18104000, Modes::JT9, IARURegions::ALL}, From e6c3cb33cfd761265f4a93330760b03cb68f37a5 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Mon, 29 Apr 2019 16:23:58 +0100 Subject: [PATCH 040/159] Second iteration of proposed FT4 working frequencies --- models/FrequencyList.cpp | 29 ++++++++--------------------- 1 file changed, 8 insertions(+), 21 deletions(-) diff --git a/models/FrequencyList.cpp b/models/FrequencyList.cpp index eddc6e1f7..b135a512a 100644 --- a/models/FrequencyList.cpp +++ b/models/FrequencyList.cpp @@ -89,13 +89,8 @@ namespace {3572000, Modes::JT9, IARURegions::ALL}, {3573000, Modes::FT8, IARURegions::ALL}, // above as below JT65 is out of DM allocation {3568600, Modes::WSPR, IARURegions::ALL}, // needs guard marker and lock out - {3595000, Modes::FT4, IARURegions::ALL}, // G4WJS: band - // planners prefer - // below 3590 but JA - // must be below 3575, - // how about 3586 with - // an R3 alternative - // of 3568. + {3575000, Modes::FT4, IARURegions::ALL}, // provisional + {3568000, Modes::FT4, IARURegions::R3}, // provisional // Band plans (all USB dial unless stated otherwise) // @@ -132,12 +127,7 @@ namespace {7074000, Modes::FT8, IARURegions::ALL}, {7076000, Modes::JT65, IARURegions::ALL}, {7078000, Modes::JT9, IARURegions::ALL}, - {7090000, Modes::FT4, IARURegions::ALL}, // G4WJS: band planners - // prefer below 7050, - // how about 7047 all - // regions although - // clashes with JA - // EMCOMM. + {7047000, Modes::FT4, IARURegions::ALL}, // provisional // Band plans (all USB dial unless stated otherwise) // @@ -169,7 +159,7 @@ namespace {10138000, Modes::JT65, IARURegions::ALL}, {10138700, Modes::WSPR, IARURegions::ALL}, {10140000, Modes::JT9, IARURegions::ALL}, - {10140000, Modes::FT4, IARURegions::ALL}, + {10140000, Modes::FT4, IARURegions::ALL}, // provisional // Band plans (all USB dial unless stated otherwise) // @@ -212,10 +202,7 @@ namespace {14074000, Modes::FT8, IARURegions::ALL}, {14076000, Modes::JT65, IARURegions::ALL}, {14078000, Modes::JT9, IARURegions::ALL}, - {14140000, Modes::FT4, IARURegions::ALL}, // G4WJS: band - // planners prefer - // below 14099, how - // about 14080. + {14080000, Modes::FT4, IARURegions::ALL}, // provisional // Band plans (all USB dial unless stated otherwise) // @@ -247,7 +234,7 @@ namespace {18100000, Modes::FT8, IARURegions::ALL}, {18102000, Modes::JT65, IARURegions::ALL}, {18104000, Modes::JT9, IARURegions::ALL}, - {18104000, Modes::FT4, IARURegions::ALL}, + {18104000, Modes::FT4, IARURegions::ALL}, // provisional {18104600, Modes::WSPR, IARURegions::ALL}, {21074000, Modes::FT8, IARURegions::ALL}, @@ -259,7 +246,7 @@ namespace {24915000, Modes::FT8, IARURegions::ALL}, {24917000, Modes::JT65, IARURegions::ALL}, {24919000, Modes::JT9, IARURegions::ALL}, - {24919000, Modes::FT4, IARURegions::ALL}, + {24919000, Modes::FT4, IARURegions::ALL}, // provisional {24924600, Modes::WSPR, IARURegions::ALL}, {28074000, Modes::FT8, IARURegions::ALL}, @@ -279,7 +266,7 @@ namespace {50310000, Modes::JT65, IARURegions::ALL}, {50312000, Modes::JT9, IARURegions::ALL}, {50313000, Modes::FT8, IARURegions::ALL}, - {50318000, Modes::FT4, IARURegions::ALL}, + {50318000, Modes::FT4, IARURegions::ALL}, // provisional {50323000, Modes::FT8, IARURegions::ALL}, {70100000, Modes::FT8, IARURegions::R1}, From ce1c4f08ad59e945a439f044d78d92bf7d2f7c72 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Mon, 29 Apr 2019 16:25:43 +0100 Subject: [PATCH 041/159] Updated CTY.DAT - Big CTY.DAT dated 16th April 2019 --- cty.dat | 854 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 430 insertions(+), 424 deletions(-) diff --git a/cty.dat b/cty.dat index 8da4e07fe..3e12eaf9a 100644 --- a/cty.dat +++ b/cty.dat @@ -32,7 +32,7 @@ Vietnam: 26: 49: AS: 15.80: -107.90: -7.0: 3W: Guinea: 35: 46: AF: 11.00: 10.68: 0.0: 3X: 3X; Bouvet: 38: 67: AF: -54.42: -3.38: -1.0: 3Y/b: - =3Y/ZS6GCM,=3Y0C,=3Y0E,=3Y0I; + =3Y/ZS6GCM,=3Y0C,=3Y0E; Peter 1 Island: 12: 72: SA: -68.77: 90.58: 4.0: 3Y/p: =3Y0X; Azerbaijan: 21: 29: AS: 40.45: -47.37: -4.0: 4J: @@ -119,11 +119,11 @@ West Malaysia: 28: 54: AS: 3.95: -102.23: -8.0: 9M2: =9W6MAN/2; East Malaysia: 28: 54: OC: 2.68: -113.32: -8.0: 9M6: 9M6,9M8,9W6,9W8,=9M1CSQ,=9M1CSS,=9M2/G3TMA/6,=9M2/PG5M/6,=9M2/R6AF/6,=9M2GCN/6,=9M2MDX/6, - =9M4ARD/6,=9M4CBP,=9M4CCB,=9M4CHQ,=9M4CJN,=9M4CMY,=9M4CPB,=9M4CRB,=9M4CRP,=9M4CSR,=9M4CWS,=9M4GCW, - =9M4JSE,=9M4LHM,=9M4LHS,=9M4LTW,=9M4RSA,=9M4SAB,=9M4SEB,=9M4SHQ,=9M4SJE,=9M4SJO,=9M4SJQ,=9M4SJS, - =9M4SJSA,=9M4SJSB,=9M4SJSD,=9M4SJSL,=9M4SJSP,=9M4SJST,=9M4SJSW,=9M4SJX,=9M4SMO,=9M4SMS,=9M4SMY, - =9M4STA,=9M4SWK,=9M50IARU/6,=9M50IARU/8,=9M50MQ,=9M50MS,=9M51GW,=9M51SB,=9M53QA,=9M57MS,=9M57MW, - =9M58MS,=9M58MW,=9M59MS,=9M59MW,=9M9/7M2VPR,=9M9/CCL,=9W2RCR/6,=9W2VVH/6; + =9M4ARD/6,=9M4CBP,=9M4CCB,=9M4CHQ,=9M4CJN,=9M4CKT,=9M4CMY,=9M4CPB,=9M4CRB,=9M4CRP,=9M4CSR,=9M4CWS, + =9M4GCW,=9M4JSE,=9M4LHM,=9M4LHS,=9M4LTW,=9M4RSA,=9M4SAB,=9M4SEB,=9M4SHQ,=9M4SJE,=9M4SJO,=9M4SJQ, + =9M4SJS,=9M4SJSA,=9M4SJSB,=9M4SJSD,=9M4SJSL,=9M4SJSP,=9M4SJST,=9M4SJSW,=9M4SJX,=9M4SMO,=9M4SMS, + =9M4SMY,=9M4STA,=9M4SWK,=9M50IARU/6,=9M50IARU/8,=9M50MQ,=9M50MS,=9M51GW,=9M51SB,=9M53QA,=9M57MS, + =9M57MW,=9M58MS,=9M58MW,=9M59MS,=9M59MW,=9M9/7M2VPR,=9M9/CCL,=9W2RCR/6,=9W2VVH/6; Nepal: 22: 42: AS: 27.70: -85.33: -5.75: 9N: 9N; Dem. Rep. of the Congo: 36: 52: AF: -3.12: -23.03: -1.0: 9Q: @@ -486,7 +486,7 @@ Nauru: 31: 65: OC: -0.52: -166.92: -12.0: C2: Andorra: 14: 27: EU: 42.58: -1.62: -1.0: C3: C3; The Gambia: 35: 46: AF: 13.40: 16.38: 0.0: C5: - C5,=C56W/BI; + C5,=C56W/BI,=VERSION; Bahamas: 08: 11: NA: 24.25: 76.00: 5.0: C6: C6,=WK2G/C6A/LH; Mozambique: 37: 53: AF: -18.25: -35.00: -2.0: C9: @@ -654,8 +654,8 @@ Palestine: 20: 39: AS: 31.28: -34.27: -2.0: E4: E4; North Cook Islands: 32: 62: OC: -10.02: 161.08: 10.0: E5/n: =E51LYC,=E51QMA,=E51TUG, - =E51AMF,=E51AUZ,=E51GC,=E51M,=E51MAN,=E51MBX,=E51MKW,=E51MQT,=E51NPQ,=E51PT,=E51QQQ,=E51UFF, - =E51WWB,=ZK1HCC,=ZK1MA,=ZK1NCF,=ZK1NCI,=ZK1TTG, + =E51AMF,=E51GC,=E51M,=E51MAN,=E51MBX,=E51MKW,=E51MQT,=E51PT,=E51QQQ,=E51UFF,=E51WWB,=ZK1HCC, + =ZK1MA,=ZK1NCF,=ZK1NCI,=ZK1TTG, =E50W[63],=E51PDX[63],=E51PEN[63],=E51WL[63],=ZK1/AC4LN/N[63],=ZK1KDN[63],=ZK1NCP[63],=ZK1NDK[63], =ZK1NJC[63],=ZK1QMA[63],=ZK1TUG[63],=ZK1WL[63]; South Cook Islands: 32: 63: OC: -21.90: 157.93: 10.0: E5/s: @@ -670,14 +670,13 @@ Spain: 14: 37: EU: 40.37: 4.88: -1.0: EA: =AM1TDH/LH,=EA1APV/LH,=EA1BEY/Y,=EA1EEY/L,=EA1EEY/LGT,=EA1EEY/LH,=EA1EK/ZAP,=EA1FGS/LH,=EA1HLW/YL, =EA1RCG/CPV,=EA1RCG/SEU,=EA1RCG/YOA,=EA1RCI/CA,=EA1RCI/CR,=EA1RCI/CVG,=EA1RCI/ESM,=EA1RCI/IA, =EA1RCI/ICA,=EA1RCI/JBN,=EA1RCI/PAZ,=EA1RCI/PCV,=EA1RCI/RSM,=EA1RCI/YOA,=EA1URL/CVL,=EA1URO/D, - =EA5AER/P,=EA6QB/1,=EA8BFH/1,=EA8CZT/1,=EA8FC/1,=EA8RV/P,=EA9CD/1,=EA9CI/1,=EA9CP/1,=EA9PD/1, - =EB1DH/LH,=ED1IRM/LH,=EG1ILW/LH,=EG1LWC/LH,=EG1LWI/LH,=EG1LWN/LH,=EG1TDH/LH,=EG90IARU/1, + =EA3HSD/P,=EA5AER/P,=EA6QB/1,=EA8BFH/1,=EA8CZT/1,=EA8FC/1,=EA8RV/P,=EA9CD/1,=EA9CI/1,=EA9CP/1, + =EA9PD/1,=EB1DH/LH,=ED1IRM/LH,=EG1ILW/LH,=EG1LWC/LH,=EG1LWI/LH,=EG1LWN/LH,=EG1TDH/LH,=EG90IARU/1, =AM08ATU/H,=AM08CAZ/H,=AM08CYQ/H,=AM08EIE/Z,=AM08FAC/H,=AN08ADE/H,=AO08BQH/Z,=AO08BTM/Z, =AO08CIK/H,=AO08CVV/Z,=AO08CXK/H,=AO08CYL/H,=AO08DI/Z,=AO08EIE/Z,=AO08HV/Z,=AO08ICA/Z,=AO08ID/Z, =AO08KJ/Z,=AO08KV/Z,=AO08OK/H,=AO08PB/Z,=AO08RKO/H,=AO08VK/Z,=AO2016DSS/LH,=EA2/ON7RU/LH, =EA2CRX/LH,=EA2EZ/P,=EA2SPS/LH,=EA2URI/O,=EA6SK/2,=EA9CP/2,=EG90IARU/2, - =EA3ESZ/Z,=EA3EVR/R,=EA3HSD/P,=EA3LD/D,=EA3RCV/PAZ,=EA6LU/3,=EA8TL/3,=EA9CI/3,=EA9CP/3, - =EG90IARU/3, + =EA3ESZ/Z,=EA3EVR/R,=EA3LD/D,=EA3RCV/PAZ,=EA6LU/3,=EA8TL/3,=EA9CI/3,=EA9CP/3,=EG90IARU/3, =EA4AAQ/O,=EA4RCH/CIE,=EA6AFU/4,=EA6RC/4,=EA8BFH/4,=EA8BY/4,=EA9CI/4,=EA9CP/4,=EG8AOP/4, =EG90IARU/4, =EA5ADM/P,=EA5CC/P,=EA5EQ/N,=EA5EZ/P,=EA5FL/LH,=EA5GVT/AVW,=EA5HCC/P,=EA5IKT/P,=EA5KB/LH,=EA5ND/D, @@ -690,27 +689,29 @@ Spain: 14: 37: EU: 40.37: 4.88: -1.0: EA: =EA9CP/7,=EA9FN/7,=EA9HU,=EA9HU/7,=EA9JS/7,=EA9LZ/7,=EA9PD/7,=EA9QD/7,=EA9UL/7,=EA9UV/7,=EB9PH/7, =EC7DZZ/LH,=EG90IARU/7; Balearic Islands: 14: 37: EU: 39.60: -2.95: -1.0: EA6: - AM6,AN6,AO6,EA6,EB6,EC6,ED6,EE6,EF6,EG6,EH6,=EA1QE/6,=EA1YO/6,=EA2EZ/6,=EA2SG/6,=EA2TW/6,=EA3BT/6, - =EA3CBH/6,=EA3ERT/6,=EA3HSD/6,=EA3HUX/6,=EA3HZX/6,=EA3HZX/P,=EA4LO/6,=EA5ADM/6,=EA5BB/6,=EA5BK/6, - =EA5BTL/6,=EA5EOR/6,=EA5ER/6,=EA5EZ/6,=EA5FL/P,=EA5HCC/6,=EA5IIG/6,=EA5IKT/6,=EA5RKB/6, - =EA6/DJ7AO/LH,=EA6/G0SGB/LH,=EA6HP/J,=EA6LU/P,=EA6URI/PAZ,=EA6URL/IF,=EA7DUT/6,=EA9CI/6,=EA9CP/6, - =EB1BRH/6,=EB2GKK/6,=EB3CW/6,=EC5AC/6,=EC5BME/6,=EC5EA/P,=EC5EC/6,=EC6TV/N,=EC7AT/6,=ED4SHF/6, - =ED5ON/6,=EH90IARU/6; + AM6,AN6,AO6,EA6,EB6,EC6,ED6,EE6,EF6,EG6,EH6,=AM70URE/6,=EA1QE/6,=EA1YO/6,=EA2EZ/6,=EA2SG/6, + =EA2TW/6,=EA3BT/6,=EA3CBH/6,=EA3ERT/6,=EA3HSD/6,=EA3HUX/6,=EA3HZX/6,=EA3HZX/P,=EA4LO/6,=EA5ADM/6, + =EA5BB/6,=EA5BK/6,=EA5BTL/6,=EA5EOR/6,=EA5ER/6,=EA5EZ/6,=EA5FL/P,=EA5HCC/6,=EA5IIG/6,=EA5IKT/6, + =EA5RKB/6,=EA6/DJ7AO/LH,=EA6/G0SGB/LH,=EA6HP/J,=EA6LU/P,=EA6URI/PAZ,=EA6URL/IF,=EA7DUT/6,=EA9CI/6, + =EA9CP/6,=EB1BRH/6,=EB2GKK/6,=EB3CW/6,=EC5AC/6,=EC5BME/6,=EC5EA/P,=EC5EC/6,=EC6TV/N,=EC7AT/6, + =ED4SHF/6,=ED5ON/6,=EH90IARU/6; Canary Islands: 33: 36: AF: 28.32: 15.85: 0.0: EA8: - AM8,AN8,AO8,EA8,EB8,EC8,ED8,EE8,EF8,EG8,EH8,=AN400L,=AN400U,=AO150ITU/8,=AO150U,=AO4AAA/8, - =EA1AK/8,=EA1AP/8,=EA1EHW/8,=EA1YO/8,=EA3RKB/8,=EA4BQ/8,=EA4ESI/8,=EA4SV/8,=EA4WT/8,=EA4ZK/8, - =EA5BK/8,=EA5HCC/8,=EA5RKL/8,=EA7JR/8,=EA8/DJ5AA/LH,=EA8AKG/F,=EA8AKG/G,=EA8DO/LP,=EA8EE/L, - =EA8TH/LP,=EA8URE/YOTA,=EA8URL/LH,=EA8URL/P/SBI,=EA9CI/8,=EA9CP/8,=EB2EMH/8,=EC1KR/8,=EC8AFM/LH, - =ED4R/8,=ED5RKL/8,=ED8BTM/C,=ED8BTM/E,=ED8BTM/J,=ED8BTM/L,=ED8BTM/S,=ED8GSA/J,=ED8LIB/C,=ED8LIB/D, - =ED8LIB/E,=ED8LIB/F,=ED8LIB/G,=ED8LIB/H,=ED8LIB/I,=ED8LIB/J,=ED8LIB/K,=ED8LIB/N,=ED8LIB/O, - =ED8LIB/Q,=ED8LPA/L,=ED8MCC/LH,=ED8OTA/D,=ED8OTA/H,=ED8PDC/E,=ED8PDC/K,=ED8PDC/LP,=ED8PDC/O, - =EF8LIB/N,=EG8LIB/C,=EG8LIB/D,=EG8LIB/E,=EG8LIB/F,=EG8LIB/G,=EG8LIB/H,=EG8LIB/I,=EG8LIB/L, - =EG8LIB/M,=EG8LIB/N,=EG8LIB/O,=EG8LIB/P,=EG8LIB/Q,=EG8LP/YL,=EH8FLH/LH,=EH90IARU/8, + AM8,AN8,AO8,EA8,EB8,EC8,ED8,EE8,EF8,EG8,EH8,=AM70URE/8,=AN400L,=AN400U,=AO150ITU/8,=AO150U, + =AO4AAA/8,=EA1AK/8,=EA1AP/8,=EA1EHW/8,=EA1YO/8,=EA3RKB/8,=EA4BQ/8,=EA4ESI/8,=EA4SV/8,=EA4WT/8, + =EA4ZK/8,=EA5BK/8,=EA5HCC/8,=EA5RKL/8,=EA7JR/8,=EA8/DJ5AA/LH,=EA8AKG/F,=EA8AKG/G,=EA8DO/LP, + =EA8EE/L,=EA8TH/LP,=EA8URE/YOTA,=EA8URL/LH,=EA8URL/P/SBI,=EA9CI/8,=EA9CP/8,=EB2EMH/8,=EC1KR/8, + =EC8AFM/LH,=ED4R/8,=ED5RKL/8,=ED8BTM/C,=ED8BTM/E,=ED8BTM/J,=ED8BTM/L,=ED8BTM/S,=ED8GSA/J, + =ED8LIB/C,=ED8LIB/D,=ED8LIB/E,=ED8LIB/F,=ED8LIB/G,=ED8LIB/H,=ED8LIB/I,=ED8LIB/J,=ED8LIB/K, + =ED8LIB/N,=ED8LIB/O,=ED8LIB/Q,=ED8LPA/L,=ED8MCC/LH,=ED8OTA/D,=ED8OTA/H,=ED8PDC/E,=ED8PDC/K, + =ED8PDC/LP,=ED8PDC/O,=EF8LIB/N,=EG8LIB/C,=EG8LIB/D,=EG8LIB/E,=EG8LIB/F,=EG8LIB/G,=EG8LIB/H, + =EG8LIB/I,=EG8LIB/L,=EG8LIB/M,=EG8LIB/N,=EG8LIB/O,=EG8LIB/P,=EG8LIB/Q,=EG8LP/YL,=EH8FLH/LH, + =EH90IARU/8, =EA2TW/8,=EA3FNZ/8,=EA5EZ/8, =AO3MWC/8,=EA2SG/8,=EA4BFH/8,=EA4DE/8,=EA5RKB/8,=EA8BFH/P; Ceuta & Melilla: 33: 37: AF: 35.90: 5.27: -1.0: EA9: - AM9,AN9,AO9,EA9,EB9,EC9,ED9,EE9,EF9,EG9,EH9,=EA4URE/9,=EA7URM/9,=EA9CE/C,=EA9CE/D,=EA9CE/E, - =EA9CE/F,=EA9CE/G,=EA9CE/H,=EA9CE/I,=EA9URC/PAZ,=EC7DZZ/9,=ED3AFR/9,=ED9CE/D,=ED9CE/E,=ED9CE/F, + AM9,AN9,AO9,EA9,EB9,EC9,ED9,EE9,EF9,EG9,EH9,=AM70URE/9,=EA4URE/9,=EA7URM/9,=EA9CE/C,=EA9CE/D, + =EA9CE/E,=EA9CE/F,=EA9CE/G,=EA9CE/H,=EA9CE/I,=EA9URC/PAZ,=EC7DZZ/9,=ED3AFR/9,=ED9CE/D,=ED9CE/E, + =ED9CE/F, =EA3EGB/9,=EA5RKB/9,=EA7UV/P,=EA9CD/M,=EA9CD/P,=EB9PH/P,=EC5ALJ/9, =EA5DCL/9,=EA7JTF/9,=EA9PD/M,=EA9PD/P,=EC7DRS/9; Ireland: 14: 27: EU: 53.13: 8.02: 0.0: EI: @@ -871,20 +872,20 @@ Scotland: 14: 27: EU: 56.82: 4.18: 0.0: GM: =2Q0YCG,=2Q1MIC,=2Q1SJB,=2R0BOO,=2R0BSE,=2R0BXN,=2R0BZB,=2R0DES,=2R0DXR,=2R0FYG,=2R0GLI,=2R0HJS, =2R0IMP,=2R0IOB,=2R0ISM,=2R0JVR,=2R0KAU,=2R0KAU/P,=2R0NCM,=2R0OXX,=2R0YCG,=2R0ZPS,=2R1MIC,=2R1SJB, =2V0GUL,=2V0IVG,=2V0JCH,=2V0KAU,=2V0TAX,=2V1HFE,=2V1MIC,=2V1SJB,=G0FBJ,=GA6NX/LH,=GB0AYR,=GB0BAJ, - =GB0BCG,=GB0BCK,=GB0BD,=GB0BDC,=GB0BL,=GB0BNA,=GB0BNC,=GB0BOL,=GB0BSS,=GB0BWT,=GB0CCF,=GB0CHL, - =GB0CLH,=GB0CML,=GB0CNL,=GB0CWF,=GB0CWS,=GB0DBS,=GB0DHL,=GB0DPK,=GB0EPC,=GB0FFS,=GB0FSG,=GB0GDS, - =GB0GDS/J,=GB0GGR,=GB0GRN,=GB0HHW,=GB0HLD,=GB0JOG,=GB0KEY,=GB0KGS,=GB0KKS,=GB0KLT,=GB0LCS,=GB0LCW, - =GB0LTM,=GB0MLH,=GB0MLM,=GB0MOG,=GB0MOL,=GB0MSL,=GB0MUL,=GB0NGG,=GB0NHL,=GB0NHL/LH,=GB0NRL, - =GB0OYT,=GB0PLS,=GB0POS,=GB0PPE,=GB0PSW,=GB0RGC,=GB0SAA,=GB0SBC,=GB0SCD,=GB0SFM,=GB0SHP,=GB0SI, - =GB0SK,=GB0SKG,=GB0SKY,=GB0SRC,=GB0SSB,=GB0TH,=GB0THL,=GB0TNL,=GB0TTS,=GB0WRH,=GB100MAS,=GB100MUC, - =GB100ZET,=GB10SP,=GB150NRL,=GB18FIFA,=GB19CGM,=GB19CS,=GB1AJ,=GB1ASC,=GB1ASH,=GB1BD,=GB1BOL, - =GB1CFL,=GB1DHL,=GB1FB,=GB1FRS,=GB1FS,=GB1FVS,=GB1FVT,=GB1GEO,=GB1HRS,=GB1KGG,=GB1KLD,=GB1LAY, - =GB1LGG,=GB1LL,=GB1MAY,=GB1NHL,=GB1OL,=GB1OL/LH,=GB1PC,=GB1RB,=GB1RHU,=GB1SLH,=GB1TAY,=GB1WLG, - =GB250RB,=GB2AES,=GB2AGG,=GB2AL,=GB2AST,=GB2ATC,=GB2AYR,=GB2BAJ,=GB2BHM,=GB2BHS,=GB2BMJ,=GB2BOL, - =GB2CAS,=GB2CHC,=GB2CM,=GB2CMA,=GB2CVL,=GB2DAS,=GB2DHS,=GB2DL,=GB2DRC,=GB2DT,=GB2DTM,=GB2ELH, - =GB2ELH/LH,=GB2EPC,=GB2FBM,=GB2FSM,=GB2FSW,=GB2GEO,=GB2GKR,=GB2GNL,=GB2GNL/LH,=GB2GTM,=GB2HLB, - =GB2HMC,=GB2HRH,=GB2IGB,=GB2IGS,=GB2IMG,=GB2IMM,=GB2INV,=GB2IOT,=GB2JCM,=GB2KDR,=GB2KGB,=GB2KW, - =GB2LBN,=GB2LBN/LH,=GB2LCL,=GB2LCP,=GB2LCT,=GB2LDG,=GB2LG,=GB2LGB,=GB2LHI,=GB2LK,=GB2LK/LH, + =GB0BCG,=GB0BCK,=GB0BD,=GB0BDC,=GB0BL,=GB0BNA,=GB0BNC,=GB0BOC,=GB0BOL,=GB0BSS,=GB0BWT,=GB0CCF, + =GB0CHL,=GB0CLH,=GB0CML,=GB0CNL,=GB0CWF,=GB0CWS,=GB0DBS,=GB0DHL,=GB0DPK,=GB0EPC,=GB0FFS,=GB0FSG, + =GB0GDS,=GB0GDS/J,=GB0GGR,=GB0GRN,=GB0HHW,=GB0HLD,=GB0JOG,=GB0KEY,=GB0KGS,=GB0KKS,=GB0KLT,=GB0LCS, + =GB0LCW,=GB0LTM,=GB0MLH,=GB0MLM,=GB0MOG,=GB0MOL,=GB0MSL,=GB0MUL,=GB0NGG,=GB0NHL,=GB0NHL/LH, + =GB0NRL,=GB0OYT,=GB0PLS,=GB0POS,=GB0PPE,=GB0PSW,=GB0RGC,=GB0SAA,=GB0SBC,=GB0SCD,=GB0SFM,=GB0SHP, + =GB0SI,=GB0SK,=GB0SKG,=GB0SKY,=GB0SRC,=GB0SSB,=GB0TH,=GB0THL,=GB0TNL,=GB0TTS,=GB0WRH,=GB100MAS, + =GB100MUC,=GB100ZET,=GB10SP,=GB150NRL,=GB18FIFA,=GB19CGM,=GB19CS,=GB1AJ,=GB1ASC,=GB1ASH,=GB1BD, + =GB1BOL,=GB1CFL,=GB1DHL,=GB1FB,=GB1FRS,=GB1FS,=GB1FVS,=GB1FVT,=GB1GEO,=GB1HRS,=GB1KGG,=GB1KLD, + =GB1LAY,=GB1LGG,=GB1LL,=GB1MAY,=GB1NHL,=GB1OL,=GB1OL/LH,=GB1PC,=GB1RB,=GB1RHU,=GB1SLH,=GB1TAY, + =GB1WLG,=GB250RB,=GB2AES,=GB2AGG,=GB2AL,=GB2AST,=GB2ATC,=GB2AYR,=GB2BAJ,=GB2BHM,=GB2BHS,=GB2BMJ, + =GB2BOL,=GB2CAS,=GB2CHC,=GB2CM,=GB2CMA,=GB2CVL,=GB2DAS,=GB2DHS,=GB2DL,=GB2DRC,=GB2DT,=GB2DTM, + =GB2ELH,=GB2ELH/LH,=GB2EPC,=GB2FBM,=GB2FSM,=GB2FSW,=GB2GEO,=GB2GKR,=GB2GNL,=GB2GNL/LH,=GB2GTM, + =GB2HLB,=GB2HMC,=GB2HRH,=GB2IGB,=GB2IGS,=GB2IMG,=GB2IMM,=GB2INV,=GB2IOT,=GB2JCM,=GB2KDR,=GB2KGB, + =GB2KW,=GB2LBN,=GB2LBN/LH,=GB2LCL,=GB2LCP,=GB2LCT,=GB2LDG,=GB2LG,=GB2LGB,=GB2LHI,=GB2LK,=GB2LK/LH, =GB2LMG,=GB2LP,=GB2LS,=GB2LS/LH,=GB2LSS,=GB2LT,=GB2LT/LH,=GB2LXX,=GB2M,=GB2MAS,=GB2MBB,=GB2MDG, =GB2MN,=GB2MOF,=GB2MSL,=GB2MUC,=GB2MUL,=GB2NBC,=GB2NEF,=GB2NL,=GB2OL,=GB2OWM,=GB2PBF,=GB2PG, =GB2QM,=GB2RB,=GB2RDR,=GB2RRL,=GB2RWW,=GB2SAA,=GB2SAM,=GB2SAS,=GB2SB,=GB2SBG,=GB2SHL/LH,=GB2SKG, @@ -1170,7 +1171,7 @@ United States: 05: 08: NA: 37.53: 91.67: 5.0: K: =WH9AAH(4)[7],=WL0JF(4)[7],=WL1ON(4)[7],=WL7AEC(4)[7],=WL7AJA(4)[7],=WL7ANY(4)[7],=WL7ATK(4)[7], =WL7BT(4)[7],=WL7CEG(4)[7],=WL7CLI(4)[7],=WL7CPW(4)[7],=WL7CQF(4)[7],=WL7CRT(4)[7],=WL7CY(4)[7], =WL7JB(4)[7],=WL7LZ(4)[7],=WL7LZ/M(4)[7],=WL7RV(4)[7],=WL7YM(4)[7],=WP2B/0(4)[7],=WP3QH(4)[7], - =WP3Y(4)[7],=WP4BTQ(4)[7],=WP4GQR(4)[7],=WP4HRK(4)[7],=WP4LC(4)[7],=WP4NPV(4)[7], + =WP3Y(4)[7],=WP4BTQ(4)[7],=WP4GQR(4)[7],=WP4LC(4)[7],=WP4NPV(4)[7], =AH2V(5)[8],=AH2W(5)[8],=AH6BV(5)[8],=AL0A(5)[8],=AL1O(5)[8],=AL4V(5)[8],=AL6L(5)[8],=AL6M(5)[8], =AL7EL(5)[8],=AL7LV(5)[8],=AL7QS(5)[8],=AL8E(5)[8],=KH2AB(5)[8],=KH2EH(5)[8],=KH6GR(5)[8], =KH6HZ(5)[8],=KH6IKI(5)[8],=KH6JKQ(5)[8],=KH6JUK(5)[8],=KH6RF(5)[8],=KH6RF/1(5)[8],=KH6RF/M(5)[8], @@ -1179,15 +1180,16 @@ United States: 05: 08: NA: 37.53: 91.67: 5.0: K: =KL7IXX(5)[8],=KL7JHM(5)[8],=KL7JJN(5)[8],=KL7JR/1(5)[8],=KL7JT(5)[8],=KL7LK(5)[8], =KL7USI/1(5)[8],=KL8DX(5)[8],=KP4ANG(5)[8],=KP4BLS(5)[8],=KP4BPR(5)[8],=KP4DGF(5)[8], =KP4EC/1(5)[8],=KP4G(5)[8],=KP4GVT(5)[8],=KP4MR(5)[8],=KP4NPL(5)[8],=KP4NW(5)[8],=KP4R(5)[8], - =KP4RCD(5)[8],=NH0H(5)[8],=NH6IH(5)[8],=NH6XW(5)[8],=NH6ZB(5)[8],=NL7FJ(5)[8],=NL7MO(5)[8], - =NL7NJ(5)[8],=NL7OI(5)[8],=NL7OT(5)[8],=NL9H(5)[8],=NP2FZ(5)[8],=NP2FZ/1(5)[8],=NP2GG(5)[8], - =NP2PN(5)[8],=NP3IV(5)[8],=NP3LN(5)[8],=NP4AO(5)[8],=NP4AZ(5)[8],=NP4ER(5)[8],=VE1BES/M(5)[8], - =VE3CMB/M(5)[8],=VE4CCN/M(5)[8],=WH0EWX(5)[8],=WH2B(5)[8],=WH6CT(5)[8],=WH6DSN(5)[8],=WH6EI(5)[8], - =WH6FBH(5)[8],=WH6MY(5)[8],=WH6SW(5)[8],=WH6SW/1(5)[8],=WH7TP(5)[8],=WL1B(5)[8],=WL7B(5)[8], - =WL7CC(5)[8],=WL7CUP(5)[8],=WL7CVD(5)[8],=WL7WO(5)[8],=WL7WO/1(5)[8],=WL7Z/1(5)[8],=WP2MG(5)[8], - =WP3NN(5)[8],=WP3QV(5)[8],=WP3QV/1(5)[8],=WP3WV(5)[8],=WP4AKE(5)[8],=WP4AZJ(5)[8],=WP4BC(5)[8], - =WP4BF(5)[8],=WP4CJH(5)[8],=WP4JF(5)[8],=WP4KQ(5)[8],=WP4MKJ(5)[8],=WP4MMV(5)[8],=WP4MOC(5)[8], - =WP4NKW(5)[8],=WP4NUV(5)[8],=WP4NYY(5)[8],=WP4OIG(5)[8],=WP4OJK(5)[8], + =KP4RCD(5)[8],=KP4ZEM(5)[8],=NH0H(5)[8],=NH6IH(5)[8],=NH6XW(5)[8],=NH6ZB(5)[8],=NL7AK(5)[8], + =NL7FJ(5)[8],=NL7MO(5)[8],=NL7NJ(5)[8],=NL7OI(5)[8],=NL7OT(5)[8],=NL9H(5)[8],=NP2FZ(5)[8], + =NP2FZ/1(5)[8],=NP2GG(5)[8],=NP2PN(5)[8],=NP3IV(5)[8],=NP3LN(5)[8],=NP4AO(5)[8],=NP4AZ(5)[8], + =NP4ER(5)[8],=VE1BES/M(5)[8],=VE3CMB/M(5)[8],=VE4CCN/M(5)[8],=WH0EWX(5)[8],=WH2B(5)[8], + =WH6CT(5)[8],=WH6DSN(5)[8],=WH6EI(5)[8],=WH6FBH(5)[8],=WH6MY(5)[8],=WH6SW(5)[8],=WH6SW/1(5)[8], + =WH7TP(5)[8],=WL1B(5)[8],=WL7B(5)[8],=WL7CC(5)[8],=WL7CUP(5)[8],=WL7CVD(5)[8],=WL7WO(5)[8], + =WL7WO/1(5)[8],=WL7Z/1(5)[8],=WP2MG(5)[8],=WP3NN(5)[8],=WP3QV(5)[8],=WP3QV/1(5)[8],=WP3WV(5)[8], + =WP4AKE(5)[8],=WP4AZJ(5)[8],=WP4BC(5)[8],=WP4BF(5)[8],=WP4CJH(5)[8],=WP4JF(5)[8],=WP4KQ(5)[8], + =WP4MKJ(5)[8],=WP4MMV(5)[8],=WP4MOC(5)[8],=WP4NKW(5)[8],=WP4NUV(5)[8],=WP4NYY(5)[8],=WP4OIG(5)[8], + =WP4OJK(5)[8], =AH0BR(5)[8],=AH2AL(5)[8],=AH2O(5)[8],=AH6K(5)[8],=AL0Q(5)[8],=AL0Y(5)[8],=AL2O(5)[8], =AL7RG(5)[8],=KH2CW(5)[8],=KH2P(5)[8],=KH2R(5)[8],=KH4AG(5)[8],=KH6ALN(5)[8],=KH6HO(5)[8], =KH7GA(5)[8],=KH7JO(5)[8],=KH7JO/2(5)[8],=KH7MX(5)[8],=KH7NE(5)[8],=KH8ZK(5)[8],=KL0WV(5)[8], @@ -1201,7 +1203,7 @@ United States: 05: 08: NA: 37.53: 91.67: 5.0: K: =WP3MD(5)[8],=WP3VU(5)[8],=WP3WZ(5)[8],=WP4AR(5)[8],=WP4BMU(5)[8],=WP4BNI(5)[8],=WP4BZ(5)[8], =WP4CB(5)[8],=WP4DME(5)[8],=WP4DWH(5)[8],=WP4EHY(5)[8],=WP4EYW(5)[8],=WP4HLY(5)[8],=WP4HXS(5)[8], =WP4KXX(5)[8],=WP4LYI(5)[8],=WP4MQN(5)[8],=WP4MRB(5)[8],=WP4MUJ(5)[8],=WP4MYM(5)[8],=WP4MZO(5)[8], - =WP4NBS(5)[8],=WP4OCO(5)[8],=WP4OPY(5)[8],=WP4PZB(5)[8],=WP4R(5)[8],=XL3TUV/M(5)[8], + =WP4NBS(5)[8],=WP4NZF(5)[8],=WP4OCO(5)[8],=WP4OPY(5)[8],=WP4PZB(5)[8],=WP4R(5)[8],=XL3TUV/M(5)[8], =XM3CMB/M(5)[8], =4U1WB(5)[8],=AH6AX(5)[8],=AH6FF/3(5)[8],=AH6R(5)[8],=AH6Z(5)[8],=AH7J(5)[8],=AH8P(5)[8], =AL1B(5)[8],=AL1B/M(5)[8],=AL7AB(5)[8],=AL7NN(5)[8],=AL7NN/3(5)[8],=AL7RS(5)[8],=KH2GM(5)[8], @@ -1210,16 +1212,16 @@ United States: 05: 08: NA: 37.53: 91.67: 5.0: K: =KL7FD(5)[8],=KL7GLK/3(5)[8],=KL7HR/3(5)[8],=KL7JO(5)[8],=KL7OF/3(5)[8],=KL7OQ(5)[8], =KL9A/3(5)[8],=KP3M(5)[8],=KP4CAM(5)[8],=KP4FCF(5)[8],=KP4GB/3(5)[8],=KP4IP(5)[8],=KP4JB(5)[8], =KP4N(5)[8],=KP4N/3(5)[8],=KP4PRI(5)[8],=KP4UV(5)[8],=KP4WR(5)[8],=KP4XO(5)[8],=KP4XX(5)[8], - =KP4YH(5)[8],=NH2CW(5)[8],=NH6BD(5)[8],=NH6BK(5)[8],=NH7C(5)[8],=NH7CC(5)[8],=NH7YK(5)[8], - =NL7CK(5)[8],=NL7PJ(5)[8],=NL7V/3(5)[8],=NL7XM(5)[8],=NL7XM/B(5)[8],=NP2EP(5)[8],=NP2G(5)[8], - =NP2NC(5)[8],=NP3ES(5)[8],=NP3IP(5)[8],=NP3YN(5)[8],=NP4RH(5)[8],=NP4YZ(5)[8],=WH6ADS(5)[8], - =WH6AWO(5)[8],=WH6AZN(5)[8],=WH6CE(5)[8],=WH6CTO(5)[8],=WH6DOA(5)[8],=WH6ECO(5)[8],=WH6EEL(5)[8], - =WH6EEN(5)[8],=WH6EIJ(5)[8],=WH6IO(5)[8],=WH6OB(5)[8],=WH7F(5)[8],=WH7USA(5)[8],=WL7AF(5)[8], - =WL7L(5)[8],=WP2XX(5)[8],=WP3BX(5)[8],=WP3CC(5)[8],=WP3EC(5)[8],=WP3FK(5)[8],=WP4DA(5)[8], - =WP4DCK(5)[8],=WP4EDM(5)[8],=WP4GJL(5)[8],=WP4HSZ(5)[8],=WP4KDN(5)[8],=WP4KKX(5)[8],=WP4LEM(5)[8], - =WP4LNP(5)[8],=WP4MNV(5)[8],=WP4MSX(5)[8],=WP4MYN(5)[8],=WP4OSQ(5)[8],=WP4PPH(5)[8],=WP4PQN(5)[8], - =WP4PUR(5)[8],=WP4PYL(5)[8],=WP4PYM(5)[8],=WP4PYN(5)[8],=WP4PYT(5)[8],=WP4PYU(5)[8],=WP4PYV(5)[8], - =WP4PYZ(5)[8],=WP4PZA(5)[8], + =KP4YH(5)[8],=NH2CW(5)[8],=NH2LA(5)[8],=NH6BD(5)[8],=NH6BK(5)[8],=NH7C(5)[8],=NH7CC(5)[8], + =NH7YK(5)[8],=NL7CK(5)[8],=NL7PJ(5)[8],=NL7V/3(5)[8],=NL7XM(5)[8],=NL7XM/B(5)[8],=NP2EP(5)[8], + =NP2G(5)[8],=NP2NC(5)[8],=NP3ES(5)[8],=NP3IP(5)[8],=NP3YN(5)[8],=NP4RH(5)[8],=NP4YZ(5)[8], + =WH6ADS(5)[8],=WH6AWO(5)[8],=WH6AZN(5)[8],=WH6CE(5)[8],=WH6CTO(5)[8],=WH6DOA(5)[8],=WH6ECO(5)[8], + =WH6EEL(5)[8],=WH6EEN(5)[8],=WH6EIJ(5)[8],=WH6IO(5)[8],=WH6OB(5)[8],=WH7F(5)[8],=WH7USA(5)[8], + =WL7AF(5)[8],=WL7L(5)[8],=WP2XX(5)[8],=WP3BX(5)[8],=WP3CC(5)[8],=WP3EC(5)[8],=WP3FK(5)[8], + =WP4DA(5)[8],=WP4DCK(5)[8],=WP4EDM(5)[8],=WP4GJL(5)[8],=WP4HRK(5)[8],=WP4HSZ(5)[8],=WP4KDN(5)[8], + =WP4KKX(5)[8],=WP4LEM(5)[8],=WP4LNP(5)[8],=WP4MNV(5)[8],=WP4MSX(5)[8],=WP4MYN(5)[8],=WP4OSQ(5)[8], + =WP4PPH(5)[8],=WP4PQN(5)[8],=WP4PUR(5)[8],=WP4PYL(5)[8],=WP4PYM(5)[8],=WP4PYN(5)[8],=WP4PYT(5)[8], + =WP4PYU(5)[8],=WP4PYV(5)[8],=WP4PYZ(5)[8],=WP4PZA(5)[8], =AH0BV(5)[8],=AH0BZ(5)[8],=AH0G(5)[8],=AH2AJ(5)[8],=AH2AM(5)[8],=AH2AV/4(5)[8],=AH2DF(5)[8], =AH2EB(5)[8],=AH2X(5)[8],=AH3B(5)[8],=AH6AL(5)[8],=AH6AT(5)[8],=AH6AU(5)[8],=AH6BJ(5)[8], =AH6C(5)[8],=AH6EZ/4(5)[8],=AH6FX(5)[8],=AH6FX/4(5)[8],=AH6IC(5)[8],=AH6IJ(5)[8],=AH6IW(5)[8], @@ -1234,69 +1236,70 @@ United States: 05: 08: NA: 37.53: 91.67: 5.0: K: =KH2N(5)[8],=KH2NC(5)[8],=KH2PM(5)[8],=KH2RL(5)[8],=KH2TI(5)[8],=KH2UV(5)[8],=KH2VM(5)[8], =KH3AC(5)[8],=KH3AG(5)[8],=KH6AME(5)[8],=KH6CG(5)[8],=KH6CG/4(5)[8],=KH6CT(5)[8],=KH6ED(5)[8], =KH6HHS(5)[8],=KH6HHS/4(5)[8],=KH6HOW(5)[8],=KH6ILR(5)[8],=KH6ILR/4(5)[8],=KH6ITI(5)[8], - =KH6JAU(5)[8],=KH6JIM(5)[8],=KH6JJD(5)[8],=KH6JUA(5)[8],=KH6M(5)[8],=KH6M/4(5)[8],=KH6M/M(5)[8], - =KH6MT(5)[8],=KH6MT/4(5)[8],=KH6NC(5)[8],=KH6NI(5)[8],=KH6OU(5)[8],=KH6POI(5)[8],=KH6PU(5)[8], - =KH6RP(5)[8],=KH6TY(5)[8],=KH6TY/R(5)[8],=KH6UN(5)[8],=KH6XH(5)[8],=KH7DM(5)[8],=KH7DY(5)[8], - =KH7FC(5)[8],=KH7GZ(5)[8],=KH7HJ/4(5)[8],=KH7OC(5)[8],=KH7OV(5)[8],=KH7WK(5)[8],=KH7XS/4(5)[8], - =KH7XT(5)[8],=KH7ZC(5)[8],=KH8BB(5)[8],=KH8DO(5)[8],=KL0AG(5)[8],=KL0IP(5)[8],=KL0KC(5)[8], - =KL0KE/4(5)[8],=KL0L(5)[8],=KL0MG(5)[8],=KL0MP(5)[8],=KL0S(5)[8],=KL0SS(5)[8],=KL0TY(5)[8], - =KL0VU(5)[8],=KL0WF(5)[8],=KL1KP(5)[8],=KL1NK(5)[8],=KL1NS(5)[8],=KL1OK(5)[8],=KL1PA(5)[8], - =KL1SS(5)[8],=KL2AK(5)[8],=KL2CX(5)[8],=KL2EY(5)[8],=KL2GG(5)[8],=KL2GP(5)[8],=KL2HV(5)[8], - =KL2MQ(5)[8],=KL2UQ(5)[8],=KL2XI(5)[8],=KL3EV(5)[8],=KL3HG(5)[8],=KL3IA(5)[8],=KL3KB(5)[8], - =KL3KG(5)[8],=KL3NR(5)[8],=KL3WM(5)[8],=KL3X(5)[8],=KL3XB(5)[8],=KL4CO(5)[8],=KL4DD(5)[8], - =KL4H(5)[8],=KL4J(5)[8],=KL5X(5)[8],=KL5YJ(5)[8],=KL7A(5)[8],=KL7DA(5)[8],=KL7DA/4(5)[8], - =KL7FO(5)[8],=KL7GLL(5)[8],=KL7H(5)[8],=KL7HIM(5)[8],=KL7HNY(5)[8],=KL7HOT(5)[8],=KL7HQW(5)[8], - =KL7HX(5)[8],=KL7IEK(5)[8],=KL7IKZ(5)[8],=KL7IV(5)[8],=KL7IVY(5)[8],=KL7IWF(5)[8],=KL7JR(5)[8], - =KL7LS(5)[8],=KL7MJ(5)[8],=KL7NCO(5)[8],=KL7NL(5)[8],=KL7NL/4(5)[8],=KL7NT(5)[8],=KL7P/4(5)[8], - =KL7QH(5)[8],=KL7QU(5)[8],=KL7SR(5)[8],=KL7USI/4(5)[8],=KL7XA(5)[8],=KL9A/1(5)[8],=KP2AF(5)[8], - =KP2AV(5)[8],=KP2AV/4(5)[8],=KP2CH(5)[8],=KP2CR(5)[8],=KP2L(5)[8],=KP2L/4(5)[8],=KP2N(5)[8], - =KP2R(5)[8],=KP2U(5)[8],=KP2US(5)[8],=KP2V(5)[8],=KP3AMG(5)[8],=KP3BL(5)[8],=KP3BP(5)[8], - =KP3J(5)[8],=KP3SK(5)[8],=KP3U(5)[8],=KP4AD(5)[8],=KP4AOD(5)[8],=KP4AOD/4(5)[8],=KP4BEC(5)[8], - =KP4BM(5)[8],=KP4BOB(5)[8],=KP4CBP(5)[8],=KP4CEL(5)[8],=KP4CH(5)[8],=KP4CPP(5)[8],=KP4CSJ(5)[8], - =KP4CSZ(5)[8],=KP4CW(5)[8],=KP4CZ(5)[8],=KP4DAC(5)[8],=KP4DDS(5)[8],=KP4DPQ(5)[8],=KP4DQS(5)[8], - =KP4EIA(5)[8],=KP4EMY(5)[8],=KP4ENK(5)[8],=KP4EOR(5)[8],=KP4EOR/4(5)[8],=KP4ERT(5)[8], - =KP4ESC(5)[8],=KP4FBS(5)[8],=KP4FGI(5)[8],=KP4FIR(5)[8],=KP4FJE(5)[8],=KP4FLP(5)[8],=KP4FOF(5)[8], - =KP4HE(5)[8],=KP4HF(5)[8],=KP4HN(5)[8],=KP4II(5)[8],=KP4IRI(5)[8],=KP4IT(5)[8],=KP4JC(5)[8], - =KP4JCC(5)[8],=KP4JWR(5)[8],=KP4KA(5)[8],=KP4KD(5)[8],=KP4KD/4(5)[8],=KP4KE/4(5)[8],=KP4LEU(5)[8], - =KP4LF(5)[8],=KP4LUV(5)[8],=KP4LX(5)[8],=KP4MA(5)[8],=KP4MPR(5)[8],=KP4MSP(5)[8],=KP4NI(5)[8], - =KP4OO(5)[8],=KP4PC(5)[8],=KP4PF(5)[8],=KP4PMD(5)[8],=KP4Q(5)[8],=KP4QT(5)[8],=KP4QT/4(5)[8], - =KP4REY(5)[8],=KP4RGT(5)[8],=KP4ROP(5)[8],=KP4RRC(5)[8],=KP4RT(5)[8],=KP4RZ(5)[8],=KP4SU(5)[8], - =KP4TL(5)[8],=KP4TR(5)[8],=KP4UFO(5)[8],=KP4USA(5)[8],=KP4WK(5)[8],=KP4WW(5)[8],=KP4WY(5)[8], - =KP4XP(5)[8],=KP4Y(5)[8],=KP4YLV(5)[8],=KP4ZV(5)[8],=KP4ZX(5)[8],=NH2A(5)[8],=NH2BQ(5)[8], - =NH2DB(5)[8],=NH2F(5)[8],=NH6AU(5)[8],=NH6BD/4(5)[8],=NH6E(5)[8],=NH6GE(5)[8],=NH6GR(5)[8], - =NH6HX(5)[8],=NH6HX/4(5)[8],=NH6JX(5)[8],=NH6KI(5)[8],=NH6QR(5)[8],=NH6SR(5)[8],=NH6T(5)[8], - =NH6TL(5)[8],=NH7AA(5)[8],=NH7AQ(5)[8],=NH7AR(5)[8],=NH7FG(5)[8],=NH7OI(5)[8],=NH7T/4(5)[8], - =NH7UN(5)[8],=NH7XN(5)[8],=NL5L(5)[8],=NL7AJ(5)[8],=NL7AU(5)[8],=NL7AU/4(5)[8],=NL7BV(5)[8], - =NL7KX(5)[8],=NL7LO(5)[8],=NL7LR(5)[8],=NL7LY(5)[8],=NL7MD(5)[8],=NL7MR(5)[8],=NL7OB(5)[8], - =NL7OS(5)[8],=NL7P(5)[8],=NL7PV(5)[8],=NL7U(5)[8],=NL7VV(5)[8],=NL7VX(5)[8],=NL7VX/4(5)[8], - =NL7VX/M(5)[8],=NL7YZ(5)[8],=NP2B(5)[8],=NP2B/4(5)[8],=NP2BB(5)[8],=NP2BW(5)[8],=NP2C(5)[8], - =NP2C/4(5)[8],=NP2CB(5)[8],=NP2D(5)[8],=NP2DJ(5)[8],=NP2EI(5)[8],=NP2FT(5)[8],=NP2GN(5)[8], - =NP2GW(5)[8],=NP2HQ(5)[8],=NP2HS(5)[8],=NP2HW(5)[8],=NP2IE(5)[8],=NP2IF(5)[8],=NP2IJ(5)[8], - =NP2IS(5)[8],=NP2IW(5)[8],=NP2IX(5)[8],=NP2JA(5)[8],=NP2JS(5)[8],=NP2LC(5)[8],=NP2MM(5)[8], - =NP2MN(5)[8],=NP2MP(5)[8],=NP2MR(5)[8],=NP2MR/4(5)[8],=NP2O(5)[8],=NP2OL(5)[8],=NP2OO(5)[8], - =NP2OR(5)[8],=NP2PA(5)[8],=NP2R(5)[8],=NP2T(5)[8],=NP2W(5)[8],=NP3AX(5)[8],=NP3BL(5)[8], - =NP3CC(5)[8],=NP3CI(5)[8],=NP3CM(5)[8],=NP3CT(5)[8],=NP3FR(5)[8],=NP3G(5)[8],=NP3HD(5)[8], - =NP3HG(5)[8],=NP3HN(5)[8],=NP3HP(5)[8],=NP3HU(5)[8],=NP3IL(5)[8],=NP3IU(5)[8],=NP3K(5)[8], - =NP3KM(5)[8],=NP3MM(5)[8],=NP3MX(5)[8],=NP3NC(5)[8],=NP3OW(5)[8],=NP3QT(5)[8],=NP3R(5)[8], - =NP3ST(5)[8],=NP3TM(5)[8],=NP3UM(5)[8],=NP3VJ(5)[8],=NP4AS(5)[8],=NP4AV(5)[8],=NP4CC(5)[8], - =NP4CK(5)[8],=NP4CV(5)[8],=NP4DM(5)[8],=NP4EM(5)[8],=NP4GH(5)[8],=NP4GW(5)[8],=NP4J(5)[8], - =NP4JL(5)[8],=NP4JU(5)[8],=NP4KV(5)[8],=NP4M(5)[8],=NP4ND(5)[8],=NP4PF(5)[8],=NP4RJ(5)[8], - =NP4SY(5)[8],=NP4TR(5)[8],=NP4WT(5)[8],=NP4XB(5)[8],=WH2AAT(5)[8],=WH2ABJ(5)[8],=WH2G(5)[8], - =WH6A(5)[8],=WH6ACF(5)[8],=WH6AJS(5)[8],=WH6AQ(5)[8],=WH6AVU(5)[8],=WH6AX(5)[8],=WH6BRQ(5)[8], - =WH6CMT(5)[8],=WH6CNC(5)[8],=WH6CTC(5)[8],=WH6CXA(5)[8],=WH6CXT(5)[8],=WH6DBX(5)[8],=WH6DMJ(5)[8], - =WH6DNF(5)[8],=WH6DOL(5)[8],=WH6DUJ(5)[8],=WH6DXT(5)[8],=WH6EFI(5)[8],=WH6EIK(5)[8],=WH6EKW(5)[8], - =WH6ELG(5)[8],=WH6ELM(5)[8],=WH6ETE(5)[8],=WH6ETF(5)[8],=WH6FCP(5)[8],=WH6FGK(5)[8],=WH6HA(5)[8], - =WH6IF(5)[8],=WH6IZ(5)[8],=WH6J(5)[8],=WH6L(5)[8],=WH6LE(5)[8],=WH6LE/4(5)[8],=WH6LE/M(5)[8], - =WH6LE/P(5)[8],=WH6NE(5)[8],=WH6WX(5)[8],=WH6YH(5)[8],=WH6YH/4(5)[8],=WH6YM(5)[8],=WH6ZF(5)[8], - =WH7GD(5)[8],=WH7HX(5)[8],=WH7NI(5)[8],=WH7XK(5)[8],=WH7XU(5)[8],=WH7YL(5)[8],=WH7YV(5)[8], - =WH7ZM(5)[8],=WH9AAF(5)[8],=WL7AUL(5)[8],=WL7AX(5)[8],=WL7BAL(5)[8],=WL7CHA(5)[8],=WL7CIB(5)[8], - =WL7CKJ(5)[8],=WL7COL(5)[8],=WL7CQT(5)[8],=WL7CUY(5)[8],=WL7E/4(5)[8],=WL7GV(5)[8],=WL7SR(5)[8], - =WL7UN(5)[8],=WL7WN(5)[8],=WL7YX(5)[8],=WP2AGD(5)[8],=WP2AGO(5)[8],=WP2AHC(5)[8],=WP2AIG(5)[8], - =WP2BB(5)[8],=WP2C(5)[8],=WP2L(5)[8],=WP2MA(5)[8],=WP2P(5)[8],=WP3AY(5)[8],=WP3BC(5)[8], - =WP3JQ(5)[8],=WP3JU(5)[8],=WP3K(5)[8],=WP3LE(5)[8],=WP3MB(5)[8],=WP3ME(5)[8],=WP3NIS(5)[8], - =WP3O(5)[8],=WP3TQ(5)[8],=WP3ZA(5)[8],=WP3ZP(5)[8],=WP4AIE(5)[8],=WP4AIL(5)[8],=WP4AIZ(5)[8], - =WP4ALH(5)[8],=WP4AQK(5)[8],=WP4B(5)[8],=WP4BFP(5)[8],=WP4BGM(5)[8],=WP4BIN(5)[8],=WP4BJS(5)[8], - =WP4BK(5)[8],=WP4BQV(5)[8],=WP4BXS(5)[8],=WP4CKW(5)[8],=WP4CLS(5)[8],=WP4CMH(5)[8],=WP4DC(5)[8], + =KH6JAU(5)[8],=KH6JIM(5)[8],=KH6JJD(5)[8],=KH6JNW(5)[8],=KH6JUA(5)[8],=KH6M(5)[8],=KH6M/4(5)[8], + =KH6M/M(5)[8],=KH6MT(5)[8],=KH6MT/4(5)[8],=KH6NC(5)[8],=KH6NI(5)[8],=KH6OU(5)[8],=KH6POI(5)[8], + =KH6PU(5)[8],=KH6RP(5)[8],=KH6TY(5)[8],=KH6TY/R(5)[8],=KH6UN(5)[8],=KH6XH(5)[8],=KH7DM(5)[8], + =KH7DY(5)[8],=KH7FC(5)[8],=KH7GZ(5)[8],=KH7HJ/4(5)[8],=KH7OC(5)[8],=KH7OV(5)[8],=KH7WK(5)[8], + =KH7XS/4(5)[8],=KH7XT(5)[8],=KH7ZC(5)[8],=KH8BB(5)[8],=KH8DO(5)[8],=KL0AG(5)[8],=KL0IP(5)[8], + =KL0KC(5)[8],=KL0KE/4(5)[8],=KL0L(5)[8],=KL0MG(5)[8],=KL0MP(5)[8],=KL0S(5)[8],=KL0SS(5)[8], + =KL0TY(5)[8],=KL0VU(5)[8],=KL0WF(5)[8],=KL1KP(5)[8],=KL1NK(5)[8],=KL1NS(5)[8],=KL1OK(5)[8], + =KL1PA(5)[8],=KL1SS(5)[8],=KL2AK(5)[8],=KL2CX(5)[8],=KL2EY(5)[8],=KL2GG(5)[8],=KL2GP(5)[8], + =KL2HV(5)[8],=KL2MQ(5)[8],=KL2UQ(5)[8],=KL2XI(5)[8],=KL3EV(5)[8],=KL3HG(5)[8],=KL3IA(5)[8], + =KL3KB(5)[8],=KL3KG(5)[8],=KL3NR(5)[8],=KL3WM(5)[8],=KL3X(5)[8],=KL3XB(5)[8],=KL4CO(5)[8], + =KL4DD(5)[8],=KL4H(5)[8],=KL4J(5)[8],=KL5X(5)[8],=KL5YJ(5)[8],=KL7A(5)[8],=KL7DA(5)[8], + =KL7DA/4(5)[8],=KL7FO(5)[8],=KL7GLL(5)[8],=KL7H(5)[8],=KL7HIM(5)[8],=KL7HNY(5)[8],=KL7HOT(5)[8], + =KL7HQW(5)[8],=KL7HX(5)[8],=KL7IEK(5)[8],=KL7IKZ(5)[8],=KL7IV(5)[8],=KL7IVY(5)[8],=KL7IWF(5)[8], + =KL7JDS(5)[8],=KL7JR(5)[8],=KL7LS(5)[8],=KL7MJ(5)[8],=KL7NCO(5)[8],=KL7NL(5)[8],=KL7NL/4(5)[8], + =KL7NT(5)[8],=KL7P/4(5)[8],=KL7QH(5)[8],=KL7QU(5)[8],=KL7SR(5)[8],=KL7USI/4(5)[8],=KL7XA(5)[8], + =KL9A/1(5)[8],=KP2AF(5)[8],=KP2AV(5)[8],=KP2AV/4(5)[8],=KP2CH(5)[8],=KP2CR(5)[8],=KP2L(5)[8], + =KP2L/4(5)[8],=KP2N(5)[8],=KP2R(5)[8],=KP2U(5)[8],=KP2US(5)[8],=KP2V(5)[8],=KP3AMG(5)[8], + =KP3BL(5)[8],=KP3BP(5)[8],=KP3J(5)[8],=KP3SK(5)[8],=KP3U(5)[8],=KP4AD(5)[8],=KP4AOD(5)[8], + =KP4AOD/4(5)[8],=KP4BEC(5)[8],=KP4BM(5)[8],=KP4BOB(5)[8],=KP4CBP(5)[8],=KP4CEL(5)[8],=KP4CH(5)[8], + =KP4CPP(5)[8],=KP4CSJ(5)[8],=KP4CSZ(5)[8],=KP4CW(5)[8],=KP4CZ(5)[8],=KP4DAC(5)[8],=KP4DDS(5)[8], + =KP4DPQ(5)[8],=KP4DQS(5)[8],=KP4EDL(5)[8],=KP4EIA(5)[8],=KP4EMY(5)[8],=KP4ENK(5)[8],=KP4EOR(5)[8], + =KP4EOR/4(5)[8],=KP4ERT(5)[8],=KP4ESC(5)[8],=KP4FBS(5)[8],=KP4FGI(5)[8],=KP4FIR(5)[8], + =KP4FJE(5)[8],=KP4FLP(5)[8],=KP4FOF(5)[8],=KP4HE(5)[8],=KP4HF(5)[8],=KP4HN(5)[8],=KP4II(5)[8], + =KP4IRI(5)[8],=KP4IT(5)[8],=KP4JC(5)[8],=KP4JCC(5)[8],=KP4JOS(5)[8],=KP4JWR(5)[8],=KP4KA(5)[8], + =KP4KD(5)[8],=KP4KD/4(5)[8],=KP4KE/4(5)[8],=KP4LEU(5)[8],=KP4LF(5)[8],=KP4LUV(5)[8],=KP4LX(5)[8], + =KP4MA(5)[8],=KP4MPR(5)[8],=KP4MSP(5)[8],=KP4NI(5)[8],=KP4OO(5)[8],=KP4PC(5)[8],=KP4PF(5)[8], + =KP4PMD(5)[8],=KP4Q(5)[8],=KP4QT(5)[8],=KP4QT/4(5)[8],=KP4REY(5)[8],=KP4RGT(5)[8],=KP4ROP(5)[8], + =KP4RRC(5)[8],=KP4RT(5)[8],=KP4RZ(5)[8],=KP4SU(5)[8],=KP4TL(5)[8],=KP4TR(5)[8],=KP4UFO(5)[8], + =KP4USA(5)[8],=KP4WK(5)[8],=KP4WW(5)[8],=KP4WY(5)[8],=KP4XP(5)[8],=KP4Y(5)[8],=KP4YLV(5)[8], + =KP4ZV(5)[8],=KP4ZX(5)[8],=NH2A(5)[8],=NH2BQ(5)[8],=NH2DB(5)[8],=NH2F(5)[8],=NH6AU(5)[8], + =NH6BD/4(5)[8],=NH6E(5)[8],=NH6GE(5)[8],=NH6GR(5)[8],=NH6HX(5)[8],=NH6HX/4(5)[8],=NH6JX(5)[8], + =NH6KI(5)[8],=NH6QR(5)[8],=NH6SR(5)[8],=NH6T(5)[8],=NH6TL(5)[8],=NH7AA(5)[8],=NH7AQ(5)[8], + =NH7AR(5)[8],=NH7FG(5)[8],=NH7OI(5)[8],=NH7T/4(5)[8],=NH7UN(5)[8],=NH7XN(5)[8],=NL5L(5)[8], + =NL7AJ(5)[8],=NL7AU(5)[8],=NL7AU/4(5)[8],=NL7BV(5)[8],=NL7KX(5)[8],=NL7LO(5)[8],=NL7LR(5)[8], + =NL7LY(5)[8],=NL7MD(5)[8],=NL7MR(5)[8],=NL7OB(5)[8],=NL7OS(5)[8],=NL7P(5)[8],=NL7PV(5)[8], + =NL7U(5)[8],=NL7VV(5)[8],=NL7VX(5)[8],=NL7VX/4(5)[8],=NL7VX/M(5)[8],=NL7YZ(5)[8],=NP2B(5)[8], + =NP2B/4(5)[8],=NP2BB(5)[8],=NP2BW(5)[8],=NP2C(5)[8],=NP2C/4(5)[8],=NP2CB(5)[8],=NP2D(5)[8], + =NP2DJ(5)[8],=NP2EI(5)[8],=NP2FT(5)[8],=NP2GN(5)[8],=NP2GW(5)[8],=NP2HQ(5)[8],=NP2HS(5)[8], + =NP2HW(5)[8],=NP2IE(5)[8],=NP2IF(5)[8],=NP2IJ(5)[8],=NP2IS(5)[8],=NP2IW(5)[8],=NP2IX(5)[8], + =NP2JA(5)[8],=NP2JS(5)[8],=NP2L(5)[8],=NP2LC(5)[8],=NP2MM(5)[8],=NP2MN(5)[8],=NP2MP(5)[8], + =NP2MR(5)[8],=NP2MR/4(5)[8],=NP2O(5)[8],=NP2OL(5)[8],=NP2OO(5)[8],=NP2OR(5)[8],=NP2PA(5)[8], + =NP2R(5)[8],=NP2T(5)[8],=NP2W(5)[8],=NP3AX(5)[8],=NP3BL(5)[8],=NP3CC(5)[8],=NP3CI(5)[8], + =NP3CM(5)[8],=NP3CT(5)[8],=NP3FR(5)[8],=NP3G(5)[8],=NP3HD(5)[8],=NP3HG(5)[8],=NP3HN(5)[8], + =NP3HP(5)[8],=NP3HU(5)[8],=NP3IL(5)[8],=NP3IU(5)[8],=NP3K(5)[8],=NP3KM(5)[8],=NP3MM(5)[8], + =NP3MX(5)[8],=NP3NC(5)[8],=NP3OW(5)[8],=NP3QT(5)[8],=NP3R(5)[8],=NP3ST(5)[8],=NP3TM(5)[8], + =NP3UM(5)[8],=NP3VJ(5)[8],=NP4AS(5)[8],=NP4AV(5)[8],=NP4CC(5)[8],=NP4CK(5)[8],=NP4CV(5)[8], + =NP4DM(5)[8],=NP4EM(5)[8],=NP4GH(5)[8],=NP4GW(5)[8],=NP4J(5)[8],=NP4JL(5)[8],=NP4JU(5)[8], + =NP4KV(5)[8],=NP4M(5)[8],=NP4ND(5)[8],=NP4PF(5)[8],=NP4RJ(5)[8],=NP4SY(5)[8],=NP4TR(5)[8], + =NP4WT(5)[8],=NP4XB(5)[8],=WH2AAT(5)[8],=WH2ABJ(5)[8],=WH2G(5)[8],=WH6A(5)[8],=WH6ACF(5)[8], + =WH6AJS(5)[8],=WH6AQ(5)[8],=WH6AVU(5)[8],=WH6AX(5)[8],=WH6BRQ(5)[8],=WH6CEF(5)[8],=WH6CMT(5)[8], + =WH6CNC(5)[8],=WH6CTC(5)[8],=WH6CXA(5)[8],=WH6CXT(5)[8],=WH6DBX(5)[8],=WH6DMJ(5)[8],=WH6DNF(5)[8], + =WH6DOL(5)[8],=WH6DUJ(5)[8],=WH6DXT(5)[8],=WH6EFI(5)[8],=WH6EIK(5)[8],=WH6EKW(5)[8],=WH6ELG(5)[8], + =WH6ELM(5)[8],=WH6ETE(5)[8],=WH6ETF(5)[8],=WH6FCP(5)[8],=WH6FGK(5)[8],=WH6HA(5)[8],=WH6IF(5)[8], + =WH6IZ(5)[8],=WH6J(5)[8],=WH6L(5)[8],=WH6LE(5)[8],=WH6LE/4(5)[8],=WH6LE/M(5)[8],=WH6LE/P(5)[8], + =WH6NE(5)[8],=WH6WX(5)[8],=WH6YH(5)[8],=WH6YH/4(5)[8],=WH6YM(5)[8],=WH6ZF(5)[8],=WH7GD(5)[8], + =WH7HX(5)[8],=WH7NI(5)[8],=WH7XK(5)[8],=WH7XU(5)[8],=WH7YL(5)[8],=WH7YV(5)[8],=WH7ZM(5)[8], + =WH9AAF(5)[8],=WL7AUL(5)[8],=WL7AX(5)[8],=WL7BAL(5)[8],=WL7CHA(5)[8],=WL7CIB(5)[8],=WL7CKJ(5)[8], + =WL7COL(5)[8],=WL7CQT(5)[8],=WL7CUY(5)[8],=WL7E/4(5)[8],=WL7GV(5)[8],=WL7SR(5)[8],=WL7UN(5)[8], + =WL7WN(5)[8],=WL7YX(5)[8],=WP2AGD(5)[8],=WP2AGO(5)[8],=WP2AHC(5)[8],=WP2AIG(5)[8],=WP2BB(5)[8], + =WP2C(5)[8],=WP2L(5)[8],=WP2MA(5)[8],=WP2P(5)[8],=WP3AY(5)[8],=WP3BC(5)[8],=WP3JQ(5)[8], + =WP3JU(5)[8],=WP3K(5)[8],=WP3LE(5)[8],=WP3MB(5)[8],=WP3ME(5)[8],=WP3NIS(5)[8],=WP3O(5)[8], + =WP3TQ(5)[8],=WP3ZA(5)[8],=WP3ZP(5)[8],=WP4AIE(5)[8],=WP4AIL(5)[8],=WP4AIZ(5)[8],=WP4ALH(5)[8], + =WP4AQK(5)[8],=WP4B(5)[8],=WP4BFP(5)[8],=WP4BGM(5)[8],=WP4BIN(5)[8],=WP4BJS(5)[8],=WP4BK(5)[8], + =WP4BOC(5)[8],=WP4BQV(5)[8],=WP4BXS(5)[8],=WP4CKW(5)[8],=WP4CLS(5)[8],=WP4CMH(5)[8],=WP4DC(5)[8], =WP4DCB(5)[8],=WP4DFK(5)[8],=WP4DNE(5)[8],=WP4DPX(5)[8],=WP4ENX(5)[8],=WP4EXH(5)[8],=WP4FEI(5)[8], =WP4FRK(5)[8],=WP4FS(5)[8],=WP4GAK(5)[8],=WP4GFH(5)[8],=WP4GX(5)[8],=WP4GYA(5)[8],=WP4HFZ(5)[8], =WP4HNN(5)[8],=WP4HOX(5)[8],=WP4IF(5)[8],=WP4IJ(5)[8],=WP4JKO(5)[8],=WP4JQJ(5)[8],=WP4JSR(5)[8], @@ -1319,47 +1322,47 @@ United States: 05: 08: NA: 37.53: 91.67: 5.0: K: WQ5(4)[7],WR5(4)[7],WS5(4)[7],WT5(4)[7],WU5(4)[7],WV5(4)[7],WW5(4)[7],WX5(4)[7],WY5(4)[7], WZ5(4)[7],=AH2AQ(4)[7],=AH2AQ/5(4)[7],=AH2DG(4)[7],=AH2EH(4)[7],=AH2H(4)[7],=AH2T(4)[7], =AH6AF(4)[7],=AH6DZ(4)[7],=AH6FV(4)[7],=AH6HT(4)[7],=AH6OU(4)[7],=AH6RB(4)[7],=AH6TD(4)[7], - =AH6UD(4)[7],=AH8O(4)[7],=AH9B(4)[7],=AL2K(4)[7],=AL2S(4)[7],=AL4F(4)[7],=AL5J(4)[7],=AL7C(4)[7], - =AL7CJ(4)[7],=AL7CQ(4)[7],=AL7DF(4)[7],=AL7DR(4)[7],=AL7GY(4)[7],=AL7HH(4)[7],=AL7HU(4)[7], - =AL7II/5(4)[7],=AL7IM(4)[7],=AL7J(4)[7],=AL7JP(4)[7],=AL7L/5(4)[7],=AL7PB(4)[7],=AL7RD(4)[7], - =AL7RI(4)[7],=KH0BZ(4)[7],=KH0CE(4)[7],=KH0CU(4)[7],=KH0DW(4)[7],=KH2AI(4)[7],=KH2BH(4)[7], - =KH2DF(4)[7],=KH2DF/5(4)[7],=KH2TB(4)[7],=KH2XD(4)[7],=KH2XO(4)[7],=KH2YO(4)[7],=KH6ABA(4)[7], - =KH6DAN(4)[7],=KH6GGC(4)[7],=KH6HPQ(4)[7],=KH6II(4)[7],=KH6ITY/M(4)[7],=KH6JIQ(4)[7], - =KH6JTM(4)[7],=KH6JVL(4)[7],=KH6KG/5(4)[7],=KH6LX(4)[7],=KH6MB/5(4)[7],=KH6SP/5(4)[7], - =KH6SZ(4)[7],=KH6UW(4)[7],=KH7CF(4)[7],=KH7FB(4)[7],=KH7IC(4)[7],=KH7JE(4)[7],=KH7QL(4)[7], - =KH7QO(4)[7],=KH8CG(4)[7],=KH9AE(4)[7],=KL0EX(4)[7],=KL0HU(4)[7],=KL0PG(4)[7],=KL1DA(4)[7], - =KL1DJ(4)[7],=KL1RX(4)[7],=KL1TS(4)[7],=KL1UR(4)[7],=KL1WG(4)[7],=KL1WO(4)[7],=KL1XK(4)[7], - =KL1Y(4)[7],=KL1ZW(4)[7],=KL2AX(4)[7],=KL2AX/5(4)[7],=KL2CD(4)[7],=KL2HC(4)[7],=KL2HN(4)[7], - =KL2MI(4)[7],=KL2NN(4)[7],=KL2RA(4)[7],=KL2RB(4)[7],=KL2TV(4)[7],=KL2VA(4)[7],=KL3DB(4)[7], - =KL3DP(4)[7],=KL3HK(4)[7],=KL3HZ(4)[7],=KL3JL(4)[7],=KL3KH(4)[7],=KL3KI(4)[7],=KL3TB(4)[7], - =KL4JQ(4)[7],=KL5L(4)[7],=KL5Z(4)[7],=KL7AH(4)[7],=KL7AU(4)[7],=KL7AX(4)[7],=KL7BCD(4)[7], - =KL7BL(4)[7],=KL7BX(4)[7],=KL7BZ/5(4)[7],=KL7BZL(4)[7],=KL7CD(4)[7],=KL7DB(4)[7],=KL7EBE(4)[7], - =KL7EMH(4)[7],=KL7EMH/M(4)[7],=KL7EQQ(4)[7],=KL7F(4)[7],=KL7FB(4)[7],=KL7FHX(4)[7],=KL7FLY(4)[7], - =KL7FQR(4)[7],=KL7GNW(4)[7],=KL7HH(4)[7],=KL7IDM(4)[7],=KL7IK(4)[7],=KL7ITF(4)[7],=KL7IWU(4)[7], - =KL7IZW(4)[7],=KL7JAR(4)[7],=KL7JEX(4)[7],=KL7JIU(4)[7],=KL7JR/5(4)[7],=KL7JW(4)[7],=KL7LJ(4)[7], - =KL7LY(4)[7],=KL7MA(4)[7],=KL7ME(4)[7],=KL7ML(4)[7],=KL7NE(4)[7],=KL7NI(4)[7],=KL7OI(4)[7], - =KL7PZ(4)[7],=KL7QC(4)[7],=KL7SG(4)[7],=KL7TN/5(4)[7],=KL7UHF(4)[7],=KL7USI/5(4)[7],=KL7XP(4)[7], - =KL7XS(4)[7],=KL7YY/5(4)[7],=KP2AZ(4)[7],=KP4CV(4)[7],=KP4DJT(4)[7],=KP4FF(4)[7],=KP4FFW(4)[7], - =KP4GMC(4)[7],=KP4JE(4)[7],=KP4JG(4)[7],=KP4JY(4)[7],=KP4YP(4)[7],=NH0V/5(4)[7],=NH2LA(4)[7], + =AH6UD(4)[7],=AH8O(4)[7],=AH9B(4)[7],=AL1F(4)[7],=AL2K(4)[7],=AL2S(4)[7],=AL4F(4)[7],=AL5J(4)[7], + =AL7C(4)[7],=AL7CJ(4)[7],=AL7CQ(4)[7],=AL7DF(4)[7],=AL7DR(4)[7],=AL7GY(4)[7],=AL7HH(4)[7], + =AL7HU(4)[7],=AL7II/5(4)[7],=AL7IM(4)[7],=AL7J(4)[7],=AL7JP(4)[7],=AL7L/5(4)[7],=AL7PB(4)[7], + =AL7RD(4)[7],=AL7RI(4)[7],=KH0BZ(4)[7],=KH0CE(4)[7],=KH0CU(4)[7],=KH0DW(4)[7],=KH2AI(4)[7], + =KH2BH(4)[7],=KH2DF(4)[7],=KH2DF/5(4)[7],=KH2TB(4)[7],=KH2XD(4)[7],=KH2XO(4)[7],=KH2YO(4)[7], + =KH6ABA(4)[7],=KH6DAN(4)[7],=KH6GGC(4)[7],=KH6HPQ(4)[7],=KH6II(4)[7],=KH6ITY/M(4)[7], + =KH6JIQ(4)[7],=KH6JTM(4)[7],=KH6JVL(4)[7],=KH6KG/5(4)[7],=KH6LL(4)[7],=KH6LX(4)[7],=KH6MB/5(4)[7], + =KH6SP/5(4)[7],=KH6SZ(4)[7],=KH6UW(4)[7],=KH7CF(4)[7],=KH7FB(4)[7],=KH7IC(4)[7],=KH7JE(4)[7], + =KH7QL(4)[7],=KH7QO(4)[7],=KH8CG(4)[7],=KH9AE(4)[7],=KL0EX(4)[7],=KL0HU(4)[7],=KL0PG(4)[7], + =KL1DA(4)[7],=KL1DJ(4)[7],=KL1RX(4)[7],=KL1TS(4)[7],=KL1UR(4)[7],=KL1WG(4)[7],=KL1WO(4)[7], + =KL1XK(4)[7],=KL1Y(4)[7],=KL1ZW(4)[7],=KL2AX(4)[7],=KL2AX/5(4)[7],=KL2CD(4)[7],=KL2HC(4)[7], + =KL2HN(4)[7],=KL2MI(4)[7],=KL2NN(4)[7],=KL2RA(4)[7],=KL2RB(4)[7],=KL2TV(4)[7],=KL2VA(4)[7], + =KL3DB(4)[7],=KL3DP(4)[7],=KL3HK(4)[7],=KL3HZ(4)[7],=KL3JL(4)[7],=KL3KH(4)[7],=KL3KI(4)[7], + =KL3TB(4)[7],=KL4JQ(4)[7],=KL5L(4)[7],=KL5Z(4)[7],=KL7AH(4)[7],=KL7AU(4)[7],=KL7AX(4)[7], + =KL7BCD(4)[7],=KL7BL(4)[7],=KL7BX(4)[7],=KL7BZ/5(4)[7],=KL7BZL(4)[7],=KL7CD(4)[7],=KL7DB(4)[7], + =KL7EBE(4)[7],=KL7EMH(4)[7],=KL7EMH/M(4)[7],=KL7EQQ(4)[7],=KL7F(4)[7],=KL7FB(4)[7],=KL7FHX(4)[7], + =KL7FLY(4)[7],=KL7FQR(4)[7],=KL7GNW(4)[7],=KL7HH(4)[7],=KL7IDM(4)[7],=KL7IK(4)[7],=KL7ITF(4)[7], + =KL7IWU(4)[7],=KL7IZW(4)[7],=KL7JAR(4)[7],=KL7JEX(4)[7],=KL7JIU(4)[7],=KL7JR/5(4)[7],=KL7JW(4)[7], + =KL7LJ(4)[7],=KL7LY(4)[7],=KL7MA(4)[7],=KL7ME(4)[7],=KL7ML(4)[7],=KL7NE(4)[7],=KL7NI(4)[7], + =KL7OI(4)[7],=KL7PZ(4)[7],=KL7QC(4)[7],=KL7SG(4)[7],=KL7TN/5(4)[7],=KL7UHF(4)[7],=KL7USI/5(4)[7], + =KL7XP(4)[7],=KL7XS(4)[7],=KL7YY/5(4)[7],=KP2AZ(4)[7],=KP4CV(4)[7],=KP4DJT(4)[7],=KP4FF(4)[7], + =KP4FFW(4)[7],=KP4GMC(4)[7],=KP4JE(4)[7],=KP4JG(4)[7],=KP4JY(4)[7],=KP4YP(4)[7],=NH0V/5(4)[7], =NH2LP(4)[7],=NH6AZ(4)[7],=NH6CJ(4)[7],=NH6EF(4)[7],=NH6FA(4)[7],=NH6L(4)[7],=NH6VB(4)[7], - =NH6VJ(4)[7],=NH6WL(4)[7],=NH6WL/5(4)[7],=NH7FO(4)[7],=NH7MV(4)[7],=NH7PZ(4)[7],=NH7RO(4)[7], - =NH7RO/5(4)[7],=NH7TR(4)[7],=NH7VA(4)[7],=NL5J(4)[7],=NL7AX(4)[7],=NL7C(4)[7],=NL7CO(4)[7], - =NL7CO/5(4)[7],=NL7CO/M(4)[7],=NL7DC(4)[7],=NL7HB(4)[7],=NL7IE(4)[7],=NL7JH(4)[7],=NL7JI(4)[7], - =NL7K/5(4)[7],=NL7KB(4)[7],=NL7NP(4)[7],=NL7OM(4)[7],=NL7PD(4)[7],=NL7RQ(4)[7],=NL7RQ/5(4)[7], - =NL7TO(4)[7],=NL7ZL(4)[7],=NP2EE(4)[7],=NP2PR(4)[7],=NP2RA(4)[7],=NP3BA(4)[7],=NP3CV(4)[7], - =NP3NT(4)[7],=NP3PG(4)[7],=NP3RG(4)[7],=NP3SU(4)[7],=NP3TY(4)[7],=NP4EA(4)[7],=NP4NQ(4)[7], - =NP4NQ/5(4)[7],=NP4RW(4)[7],=NP4RZ(4)[7],=WH2ACT(4)[7],=WH2ACT/5(4)[7],=WH6ARN(4)[7], + =NH6VJ(4)[7],=NH6WL(4)[7],=NH6WL/5(4)[7],=NH7FO(4)[7],=NH7MV(4)[7],=NH7PZ(4)[7],=NH7R(4)[7], + =NH7RO(4)[7],=NH7RO/5(4)[7],=NH7TR(4)[7],=NH7VA(4)[7],=NL5J(4)[7],=NL7AX(4)[7],=NL7C(4)[7], + =NL7CO(4)[7],=NL7CO/5(4)[7],=NL7CO/M(4)[7],=NL7DC(4)[7],=NL7HB(4)[7],=NL7IE(4)[7],=NL7JH(4)[7], + =NL7JI(4)[7],=NL7K/5(4)[7],=NL7KB(4)[7],=NL7NP(4)[7],=NL7OM(4)[7],=NL7PD(4)[7],=NL7RQ(4)[7], + =NL7RQ/5(4)[7],=NL7TO(4)[7],=NL7ZL(4)[7],=NP2EE(4)[7],=NP2PR(4)[7],=NP2RA(4)[7],=NP3BA(4)[7], + =NP3CV(4)[7],=NP3NT(4)[7],=NP3PG(4)[7],=NP3RG(4)[7],=NP3SU(4)[7],=NP3TY(4)[7],=NP4EA(4)[7], + =NP4NQ(4)[7],=NP4NQ/5(4)[7],=NP4RW(4)[7],=NP4RZ(4)[7],=WH2ACT(4)[7],=WH2ACT/5(4)[7],=WH6ARN(4)[7], =WH6BYJ(4)[7],=WH6BYP(4)[7],=WH6CDU(4)[7],=WH6CUL(4)[7],=WH6DZU(4)[7],=WH6ECJ(4)[7],=WH6EMW(4)[7], =WH6EOF(4)[7],=WH6ERS(4)[7],=WH6EUA(4)[7],=WH6EXQ(4)[7],=WH6FAD(4)[7],=WH6FGM(4)[7], - =WH6FZ/5(4)[7],=WH6L/5(4)[7],=WH6ZR(4)[7],=WH7DC(4)[7],=WH7DW(4)[7],=WH7OK(4)[7],=WH7R(4)[7], - =WH7YQ(4)[7],=WH7YR(4)[7],=WL3WX(4)[7],=WL5H(4)[7],=WL7AIU(4)[7],=WL7AWC(4)[7],=WL7BBV(4)[7], - =WL7BKF(4)[7],=WL7BPY(4)[7],=WL7CA(4)[7],=WL7CJA(4)[7],=WL7CJC(4)[7],=WL7CQE(4)[7],=WL7CTP(4)[7], - =WL7CTQ(4)[7],=WL7D(4)[7],=WL7FT(4)[7],=WL7FT/5(4)[7],=WL7K/5(4)[7],=WL7ME(4)[7],=WL7MQ/5(4)[7], - =WL7OP(4)[7],=WL7OU(4)[7],=WL7SG(4)[7],=WL7W(4)[7],=WL7XI(4)[7],=WL7XR(4)[7],=WP2AHG(4)[7], - =WP2WP(4)[7],=WP3AL(4)[7],=WP4A(4)[7],=WP4ADA(4)[7],=WP4APJ(4)[7],=WP4BAB(4)[7],=WP4BAT(4)[7], - =WP4CJY(4)[7],=WP4EVA(4)[7],=WP4EVL(4)[7],=WP4KSP(4)[7],=WP4KTF(4)[7],=WP4KUW(4)[7],=WP4LKA(4)[7], - =WP4MJP(4)[7],=WP4MWS(4)[7],=WP4MYI(4)[7],=WP4MZR(4)[7],=WP4NAK(4)[7],=WP4NEP(4)[7],=WP4NQL(4)[7], - =WP4OUE(4)[7],=WP4RON(4)[7], + =WH6FZ/5(4)[7],=WH6L/5(4)[7],=WH7DC(4)[7],=WH7DW(4)[7],=WH7OK(4)[7],=WH7R(4)[7],=WH7YQ(4)[7], + =WH7YR(4)[7],=WL3WX(4)[7],=WL5H(4)[7],=WL7AIU(4)[7],=WL7AWC(4)[7],=WL7BBV(4)[7],=WL7BKF(4)[7], + =WL7BPY(4)[7],=WL7CA(4)[7],=WL7CJA(4)[7],=WL7CJC(4)[7],=WL7CQE(4)[7],=WL7CTP(4)[7],=WL7CTQ(4)[7], + =WL7D(4)[7],=WL7FT(4)[7],=WL7FT/5(4)[7],=WL7K/5(4)[7],=WL7ME(4)[7],=WL7MQ/5(4)[7],=WL7OP(4)[7], + =WL7OU(4)[7],=WL7SG(4)[7],=WL7W(4)[7],=WL7XI(4)[7],=WL7XR(4)[7],=WP2AHG(4)[7],=WP2WP(4)[7], + =WP3AL(4)[7],=WP4A(4)[7],=WP4ADA(4)[7],=WP4APJ(4)[7],=WP4BAB(4)[7],=WP4BAT(4)[7],=WP4CJY(4)[7], + =WP4EVA(4)[7],=WP4EVL(4)[7],=WP4KSP(4)[7],=WP4KTF(4)[7],=WP4KUW(4)[7],=WP4LKA(4)[7],=WP4MJP(4)[7], + =WP4MWS(4)[7],=WP4MYI(4)[7],=WP4MZR(4)[7],=WP4NAK(4)[7],=WP4NEP(4)[7],=WP4NQL(4)[7],=WP4OUE(4)[7], + =WP4RON(4)[7], AA6(3)[6],AB6(3)[6],AC6(3)[6],AD6(3)[6],AE6(3)[6],AF6(3)[6],AG6(3)[6],AI6(3)[6],AJ6(3)[6], AK6(3)[6],K6(3)[6],KA6(3)[6],KB6(3)[6],KC6(3)[6],KD6(3)[6],KE6(3)[6],KF6(3)[6],KG6(3)[6], KI6(3)[6],KJ6(3)[6],KK6(3)[6],KM6(3)[6],KN6(3)[6],KO6(3)[6],KQ6(3)[6],KR6(3)[6],KS6(3)[6], @@ -1383,39 +1386,40 @@ United States: 05: 08: NA: 37.53: 91.67: 5.0: K: =KH6DX/M6(3)[6],=KH6DZ(3)[6],=KH6EHF(3)[6],=KH6FH(3)[6],=KH6FL(3)[6],=KH6FOX(3)[6],=KH6FQR(3)[6], =KH6FQY(3)[6],=KH6GBQ(3)[6],=KH6GC(3)[6],=KH6GJV(3)[6],=KH6GJV/6(3)[6],=KH6GK(3)[6],=KH6GKR(3)[6], =KH6HJE(3)[6],=KH6HOU(3)[6],=KH6IKH(3)[6],=KH6IKL(3)[6],=KH6IP(3)[6],=KH6IPJ(3)[6],=KH6JCT(3)[6], - =KH6JGD(3)[6],=KH6JJN(3)[6],=KH6JJN/P(3)[6],=KH6JN(3)[6],=KH6JRB(3)[6],=KH6JRC(3)[6],=KH6JS(3)[6], - =KH6JUZ(3)[6],=KH6JVS(3)[6],=KH6JWG(3)[6],=KH6KT(3)[6],=KH6LO(3)[6],=KH6MV(3)[6],=KH6N(3)[6], - =KH6NG(3)[6],=KH6O(3)[6],=KH6PGA/6(3)[6],=KH6PM(3)[6],=KH6PW(3)[6],=KH6SC(3)[6],=KH6TO(3)[6], - =KH6UQ(3)[6],=KH6USA(3)[6],=KH6VC(3)[6],=KH6VC/6(3)[6],=KH6VZ(3)[6],=KH6WL(3)[6],=KH6WZ(3)[6], - =KH7CD/6(3)[6],=KH7CO(3)[6],=KH7CS(3)[6],=KH7EM(3)[6],=KH7I(3)[6],=KH7IZ(3)[6],=KH7JR(3)[6], - =KH7NS(3)[6],=KH7QS(3)[6],=KH7QU(3)[6],=KH7RB(3)[6],=KH7TJ(3)[6],=KH7TJ/6(3)[6],=KH7XX/6(3)[6], - =KH7Y(3)[6],=KH7Y/6(3)[6],=KH8A(3)[6],=KH8AF(3)[6],=KH8FL(3)[6],=KL0AA(3)[6],=KL0AF(3)[6], - =KL0AL(3)[6],=KL0HZ(3)[6],=KL0IF(3)[6],=KL1WE/6(3)[6],=KL2CQ(3)[6],=KL3JY/6(3)[6],=KL3YH(3)[6], - =KL4GW(3)[6],=KL4LV(3)[6],=KL4NZ(3)[6],=KL4QW(3)[6],=KL7AK(3)[6],=KL7CE/6(3)[6],=KL7CM(3)[6], - =KL7CN(3)[6],=KL7CW/6(3)[6],=KL7CX(3)[6],=KL7DJ(3)[6],=KL7EAE(3)[6],=KL7EAL(3)[6],=KL7HQR(3)[6], - =KL7HQR/6(3)[6],=KL7HSY(3)[6],=KL7ID(3)[6],=KL7IDY/6(3)[6],=KL7ISN(3)[6],=KL7JBE(3)[6], - =KL7KNP(3)[6],=KL7KX(3)[6],=KL7MF(3)[6],=KL7MF/6(3)[6],=KL7MF/M(3)[6],=KL7OO(3)[6],=KL7RT(3)[6], - =KL7SL(3)[6],=KL7SY(3)[6],=KL7VU(3)[6],=KL7VU/6(3)[6],=KP2BK(3)[6],=KP3BN(3)[6],=KP3YL(3)[6], - =KP4BR(3)[6],=KP4DSO(3)[6],=KP4DX/6(3)[6],=KP4ENM(3)[6],=KP4ERR(3)[6],=KP4FBT(3)[6],=KP4MD(3)[6], - =KP4UB(3)[6],=NH0C(3)[6],=NH0X(3)[6],=NH2AR(3)[6],=NH2BD(3)[6],=NH2BV(3)[6],=NH2CM(3)[6], - =NH2FT(3)[6],=NH2FX(3)[6],=NH2R(3)[6],=NH2S(3)[6],=NH6AC(3)[6],=NH6AE(3)[6],=NH6FV(3)[6], - =NH6FX(3)[6],=NH6NG(3)[6],=NH6RG(3)[6],=NH6WR(3)[6],=NH7AG(3)[6],=NH7EM(3)[6],=NH7FW(3)[6], - =NH7G(3)[6],=NH7IG(3)[6],=NH7IH(3)[6],=NH7PM(3)[6],=NH7QV(3)[6],=NH7RT(3)[6],=NH7ST(3)[6], - =NH7SU(3)[6],=NH7WE(3)[6],=NH7WG(3)[6],=NH7ZE(3)[6],=NL7GE(3)[6],=NL7IB(3)[6],=NL7OP(3)[6], - =NL7RO(3)[6],=NL7YB(3)[6],=NP2KY(3)[6],=NP4AI/6(3)[6],=NP4IW(3)[6],=NP4IW/6(3)[6],=NP4MV(3)[6], - =NP4XE(3)[6],=WH0AAZ(3)[6],=WH0M(3)[6],=WH2ABS(3)[6],=WH2ALN(3)[6],=WH6AAJ(3)[6],=WH6AFM(3)[6], - =WH6ANA(3)[6],=WH6ASW/M(3)[6],=WH6BYT(3)[6],=WH6CIL(3)[6],=WH6CK(3)[6],=WH6CO(3)[6],=WH6CPO(3)[6], - =WH6CPT(3)[6],=WH6CRE(3)[6],=WH6CSG(3)[6],=WH6CUF(3)[6],=WH6CUU(3)[6],=WH6CUX(3)[6],=WH6CVJ(3)[6], - =WH6CWS(3)[6],=WH6CZF(3)[6],=WH6CZH(3)[6],=WH6DHN(3)[6],=WH6DSK(3)[6],=WH6DVM(3)[6],=WH6DVN(3)[6], - =WH6DVX(3)[6],=WH6DYA(3)[6],=WH6DZV(3)[6],=WH6DZY(3)[6],=WH6EAR(3)[6],=WH6EEZ(3)[6],=WH6EHY(3)[6], - =WH6EKB(3)[6],=WH6ENG(3)[6],=WH6EUH(3)[6],=WH6EZW(3)[6],=WH6JO(3)[6],=WH6LZ(3)[6],=WH6OI(3)[6], - =WH6PX(3)[6],=WH6QA(3)[6],=WH6RF(3)[6],=WH6TD(3)[6],=WH6TK(3)[6],=WH6USA(3)[6],=WH6VM(3)[6], - =WH6VN(3)[6],=WH6XI(3)[6],=WH6XX(3)[6],=WH6YJ(3)[6],=WH7DG(3)[6],=WH7DH(3)[6],=WH7HQ(3)[6], - =WH7IN(3)[6],=WH7IV(3)[6],=WH7IZ(3)[6],=WH7LP(3)[6],=WH7OO(3)[6],=WH7PM(3)[6],=WH7QC(3)[6], - =WH7RU(3)[6],=WH7TT(3)[6],=WH7VM(3)[6],=WH7XR(3)[6],=WL3AF(3)[6],=WL3DZ(3)[6],=WL4JC(3)[6], - =WL7ACO(3)[6],=WL7BA(3)[6],=WL7BGF(3)[6],=WL7CPL(3)[6],=WL7CSD(3)[6],=WL7DN/6(3)[6],=WL7EA(3)[6], - =WL7EKK(3)[6],=WL7RA(3)[6],=WL7SE(3)[6],=WL7TG(3)[6],=WL7WL(3)[6],=WL7YQ(3)[6],=WL7YQ/6(3)[6], - =WP2N(3)[6],=WP4CUJ(3)[6],=WP4CW(3)[6],=WP4KSU(3)[6],=WP4MVE(3)[6], + =KH6JGD(3)[6],=KH6JJN(3)[6],=KH6JJN/P(3)[6],=KH6JN(3)[6],=KH6JR(3)[6],=KH6JRB(3)[6],=KH6JRC(3)[6], + =KH6JS(3)[6],=KH6JUZ(3)[6],=KH6JVS(3)[6],=KH6JWG(3)[6],=KH6KT(3)[6],=KH6LO(3)[6],=KH6MV(3)[6], + =KH6N(3)[6],=KH6NG(3)[6],=KH6O(3)[6],=KH6PGA/6(3)[6],=KH6PM(3)[6],=KH6PW(3)[6],=KH6SC(3)[6], + =KH6TO(3)[6],=KH6UQ(3)[6],=KH6USA(3)[6],=KH6VC(3)[6],=KH6VC/6(3)[6],=KH6VZ(3)[6],=KH6WL(3)[6], + =KH6WZ(3)[6],=KH7CD/6(3)[6],=KH7CO(3)[6],=KH7CS(3)[6],=KH7EM(3)[6],=KH7I(3)[6],=KH7IZ(3)[6], + =KH7JR(3)[6],=KH7NS(3)[6],=KH7QS(3)[6],=KH7QU(3)[6],=KH7RB(3)[6],=KH7TJ(3)[6],=KH7TJ/6(3)[6], + =KH7XX/6(3)[6],=KH7Y(3)[6],=KH7Y/6(3)[6],=KH8A(3)[6],=KH8AF(3)[6],=KH8FL(3)[6],=KL0AA(3)[6], + =KL0AF(3)[6],=KL0AL(3)[6],=KL0HZ(3)[6],=KL0IF(3)[6],=KL1WE/6(3)[6],=KL2CQ(3)[6],=KL3JY/6(3)[6], + =KL3YH(3)[6],=KL4GW(3)[6],=KL4LV(3)[6],=KL4NZ(3)[6],=KL4QW(3)[6],=KL4UZ(3)[6],=KL7AK(3)[6], + =KL7CE/6(3)[6],=KL7CM(3)[6],=KL7CN(3)[6],=KL7CW/6(3)[6],=KL7CX(3)[6],=KL7DJ(3)[6],=KL7EAE(3)[6], + =KL7EAL(3)[6],=KL7HQR(3)[6],=KL7HQR/6(3)[6],=KL7HSY(3)[6],=KL7ID(3)[6],=KL7IDY/6(3)[6], + =KL7ISN(3)[6],=KL7JBE(3)[6],=KL7KNP(3)[6],=KL7KX(3)[6],=KL7MF(3)[6],=KL7MF/6(3)[6],=KL7MF/M(3)[6], + =KL7OO(3)[6],=KL7RT(3)[6],=KL7SL(3)[6],=KL7SY(3)[6],=KL7VU(3)[6],=KL7VU/6(3)[6],=KP2BK(3)[6], + =KP3BN(3)[6],=KP3YL(3)[6],=KP4BR(3)[6],=KP4DSO(3)[6],=KP4DX/6(3)[6],=KP4ENM(3)[6],=KP4ERR(3)[6], + =KP4FBT(3)[6],=KP4MD(3)[6],=KP4UB(3)[6],=NH0C(3)[6],=NH0X(3)[6],=NH2AR(3)[6],=NH2BD(3)[6], + =NH2BV(3)[6],=NH2CM(3)[6],=NH2FT(3)[6],=NH2FX(3)[6],=NH2R(3)[6],=NH2S(3)[6],=NH6AC(3)[6], + =NH6AE(3)[6],=NH6FV(3)[6],=NH6FX(3)[6],=NH6NG(3)[6],=NH6RG(3)[6],=NH6WR(3)[6],=NH7AG(3)[6], + =NH7EM(3)[6],=NH7FW(3)[6],=NH7G(3)[6],=NH7IG(3)[6],=NH7IH(3)[6],=NH7PM(3)[6],=NH7QV(3)[6], + =NH7RT(3)[6],=NH7ST(3)[6],=NH7SU(3)[6],=NH7WE(3)[6],=NH7WG(3)[6],=NH7ZE(3)[6],=NL7GE(3)[6], + =NL7IB(3)[6],=NL7OP(3)[6],=NL7RO(3)[6],=NL7YB(3)[6],=NP2KY(3)[6],=NP4AB(3)[6],=NP4AI/6(3)[6], + =NP4IW(3)[6],=NP4IW/6(3)[6],=NP4MV(3)[6],=NP4XE(3)[6],=WH0AAZ(3)[6],=WH0M(3)[6],=WH2ABS(3)[6], + =WH2ALN(3)[6],=WH6AAJ(3)[6],=WH6AFM(3)[6],=WH6ANA(3)[6],=WH6ASW/M(3)[6],=WH6BYT(3)[6], + =WH6CIL(3)[6],=WH6CK(3)[6],=WH6CO(3)[6],=WH6CPO(3)[6],=WH6CPT(3)[6],=WH6CRE(3)[6],=WH6CSG(3)[6], + =WH6CUF(3)[6],=WH6CUU(3)[6],=WH6CUX(3)[6],=WH6CVJ(3)[6],=WH6CWS(3)[6],=WH6CZF(3)[6],=WH6CZH(3)[6], + =WH6DHN(3)[6],=WH6DSK(3)[6],=WH6DVM(3)[6],=WH6DVN(3)[6],=WH6DVX(3)[6],=WH6DYA(3)[6],=WH6DZV(3)[6], + =WH6DZY(3)[6],=WH6EAR(3)[6],=WH6EEZ(3)[6],=WH6EHY(3)[6],=WH6EKB(3)[6],=WH6ENG(3)[6],=WH6EUH(3)[6], + =WH6EZW(3)[6],=WH6JO(3)[6],=WH6LZ(3)[6],=WH6OI(3)[6],=WH6PX(3)[6],=WH6QA(3)[6],=WH6RF(3)[6], + =WH6TD(3)[6],=WH6TK(3)[6],=WH6USA(3)[6],=WH6VM(3)[6],=WH6VN(3)[6],=WH6XI(3)[6],=WH6XX(3)[6], + =WH6YJ(3)[6],=WH7DG(3)[6],=WH7DH(3)[6],=WH7HQ(3)[6],=WH7IN(3)[6],=WH7IV(3)[6],=WH7IZ(3)[6], + =WH7LP(3)[6],=WH7OO(3)[6],=WH7PM(3)[6],=WH7QC(3)[6],=WH7RU(3)[6],=WH7TT(3)[6],=WH7VM(3)[6], + =WH7XR(3)[6],=WL3AF(3)[6],=WL3DZ(3)[6],=WL4JC(3)[6],=WL7ACO(3)[6],=WL7BA(3)[6],=WL7BGF(3)[6], + =WL7CPL(3)[6],=WL7CSD(3)[6],=WL7DN/6(3)[6],=WL7EA(3)[6],=WL7EKK(3)[6],=WL7RA(3)[6],=WL7SE(3)[6], + =WL7TG(3)[6],=WL7WL(3)[6],=WL7YQ(3)[6],=WL7YQ/6(3)[6],=WP2N(3)[6],=WP4CUJ(3)[6],=WP4CW(3)[6], + =WP4KSU(3)[6],=WP4MVE(3)[6],=WP4OBB(3)[6], AA7(3)[6],AB7(3)[6],AC7(3)[6],AD7(3)[6],AE7(3)[6],AF7(3)[6],AG7(3)[6],AI7(3)[6],AJ7(3)[6], AK7(3)[6],K7(3)[6],KA7(3)[6],KB7(3)[6],KC7(3)[6],KD7(3)[6],KE7(3)[6],KF7(3)[6],KG7(3)[6], KI7(3)[6],KJ7(3)[6],KK7(3)[6],KM7(3)[6],KN7(3)[6],KO7(3)[6],KQ7(3)[6],KR7(3)[6],KS7(3)[6], @@ -1438,91 +1442,92 @@ United States: 05: 08: NA: 37.53: 91.67: 5.0: K: =AL7D/7(3)[6],=AL7D/P(3)[6],=AL7D/R(3)[6],=AL7DD(3)[6],=AL7DU(3)[6],=AL7EI(3)[6],=AL7EJ(3)[6], =AL7FA(3)[6],=AL7FB(3)[6],=AL7HS(3)[6],=AL7HY(3)[6],=AL7IG(3)[6],=AL7IT(3)[6],=AL7JF(3)[6], =AL7JJ(3)[6],=AL7JS(3)[6],=AL7JW(3)[6],=AL7JY(3)[6],=AL7KE(3)[6],=AL7KF(3)[6],=AL7KG(3)[6], - =AL7KK(3)[6],=AL7KL(3)[6],=AL7KV(3)[6],=AL7L/7(3)[6],=AL7LL(3)[6],=AL7MH(3)[6],=AL7MQ(3)[6], - =AL7ND(3)[6],=AL7NK(3)[6],=AL7NZ(3)[6],=AL7OK(3)[6],=AL7OW(3)[6],=AL7PR(3)[6],=AL7PV(3)[6], - =AL7QL(3)[6],=AL7R(3)[6],=AL7R/7(3)[6],=AL7RF(3)[6],=AL7RF/7(3)[6],=AL7RM(3)[6],=AL7RR(3)[6], - =AL7W(3)[6],=G4KHG/M(3)[6],=KH0AS(3)[6],=KH0H(3)[6],=KH0K(3)[6],=KH0SH(3)[6],=KH0TL(3)[6], - =KH0X(3)[6],=KH2CH(3)[6],=KH2G(3)[6],=KH2GG(3)[6],=KH2JA(3)[6],=KH2QH(3)[6],=KH2RK(3)[6], - =KH2SK(3)[6],=KH2SR(3)[6],=KH2TJ/7(3)[6],=KH2TJ/P(3)[6],=KH2XP(3)[6],=KH2YL(3)[6],=KH3AD(3)[6], - =KH6AB(3)[6],=KH6AHQ(3)[6],=KH6BXZ(3)[6],=KH6CN(3)[6],=KH6CN/7(3)[6],=KH6COY(3)[6],=KH6CQG(3)[6], - =KH6CQH(3)[6],=KH6CQH/7(3)[6],=KH6DB(3)[6],=KH6DE(3)[6],=KH6DOT(3)[6],=KH6DUT(3)[6],=KH6EE(3)[6], - =KH6EE/7(3)[6],=KH6FKA/7(3)[6],=KH6FU(3)[6],=KH6GB(3)[6],=KH6GDN(3)[6],=KH6HU(3)[6],=KH6HWK(3)[6], - =KH6IA(3)[6],=KH6ICQ(3)[6],=KH6IKC(3)[6],=KH6IMN(3)[6],=KH6IQX(3)[6],=KH6ITY(3)[6],=KH6JFL(3)[6], - =KH6JIM/7(3)[6],=KH6JJS(3)[6],=KH6JPJ(3)[6],=KH6JPO(3)[6],=KH6JRW(3)[6],=KH6JT(3)[6], - =KH6JUQ(3)[6],=KH6KS(3)[6],=KH6KW(3)[6],=KH6LEM(3)[6],=KH6ME(3)[6],=KH6MF(3)[6],=KH6NA(3)[6], - =KH6NO/7(3)[6],=KH6NO/M(3)[6],=KH6NU(3)[6],=KH6OV(3)[6],=KH6PG(3)[6],=KH6PR(3)[6],=KH6QAI(3)[6], - =KH6QAI/7(3)[6],=KH6QAJ(3)[6],=KH6RW(3)[6],=KH6RY(3)[6],=KH6SAT(3)[6],=KH6SS(3)[6],=KH6TG(3)[6], - =KH6TX(3)[6],=KH6VM(3)[6],=KH6VM/7(3)[6],=KH6VT(3)[6],=KH6WX(3)[6],=KH6XG(3)[6],=KH6XS(3)[6], - =KH6XT(3)[6],=KH6YL(3)[6],=KH7AL(3)[6],=KH7AR(3)[6],=KH7AX(3)[6],=KH7CB(3)[6],=KH7CM(3)[6], - =KH7CZ(3)[6],=KH7FJ(3)[6],=KH7FR(3)[6],=KH7HH(3)[6],=KH7HWK(3)[6],=KH7IP(3)[6],=KH7LE(3)[6], - =KH7ME(3)[6],=KH7MR(3)[6],=KH7NP(3)[6],=KH7R(3)[6],=KH7RD(3)[6],=KH7RT(3)[6],=KH7SQ(3)[6], - =KH7SR(3)[6],=KH7WW(3)[6],=KH7WW/7(3)[6],=KH7X/7(3)[6],=KH7YD(3)[6],=KH7YD/7(3)[6],=KH8AB(3)[6], - =KH8AH(3)[6],=KH8AZ(3)[6],=KH8BG(3)[6],=KH8D(3)[6],=KH8E(3)[6],=KH8K(3)[6],=KH9AA(3)[6], - =KL0AI(3)[6],=KL0AN(3)[6],=KL0AP(3)[6],=KL0CA(3)[6],=KL0CM(3)[6],=KL0CW(3)[6],=KL0DF(3)[6], - =KL0DG(3)[6],=KL0DR(3)[6],=KL0DT(3)[6],=KL0IR(3)[6],=KL0IS(3)[6],=KL0IW(3)[6],=KL0IX(3)[6], - =KL0LF(3)[6],=KL0MO(3)[6],=KL0NM(3)[6],=KL0NP(3)[6],=KL0PP(3)[6],=KL0QD(3)[6],=KL0RA(3)[6], - =KL0SZ(3)[6],=KL0TR(3)[6],=KL0TU(3)[6],=KL1AA(3)[6],=KL1AE(3)[6],=KL1DO(3)[6],=KL1DW(3)[6], - =KL1ED(3)[6],=KL1JF(3)[6],=KL1K(3)[6],=KL1LE(3)[6],=KL1LZ(3)[6],=KL1MF(3)[6],=KL1OH(3)[6], - =KL1QL(3)[6],=KL1RH(3)[6],=KL1RV(3)[6],=KL1SF/7(3)[6],=KL1SO(3)[6],=KL1U(3)[6],=KL1UA(3)[6], - =KL1UM(3)[6],=KL1XI(3)[6],=KL1YO(3)[6],=KL1YY/7(3)[6],=KL1ZP(3)[6],=KL1ZR(3)[6],=KL2A/7(3)[6], - =KL2BG(3)[6],=KL2BO(3)[6],=KL2BW(3)[6],=KL2BY(3)[6],=KL2BZ(3)[6],=KL2FD(3)[6],=KL2FL(3)[6], - =KL2JY(3)[6],=KL2K(3)[6],=KL2KY(3)[6],=KL2LA(3)[6],=KL2LN(3)[6],=KL2LT(3)[6],=KL2MP(3)[6], - =KL2NJ(3)[6],=KL2NU(3)[6],=KL2NW(3)[6],=KL2OH(3)[6],=KL2OJ(3)[6],=KL2P(3)[6],=KL2QE(3)[6], - =KL2VK(3)[6],=KL2YH(3)[6],=KL3EZ(3)[6],=KL3FE(3)[6],=KL3IC(3)[6],=KL3IO(3)[6],=KL3IW(3)[6], - =KL3MZ(3)[6],=KL3NE(3)[6],=KL3NO(3)[6],=KL3OQ(3)[6],=KL3PD(3)[6],=KL3TW(3)[6],=KL3TY(3)[6], - =KL3VJ(3)[6],=KL3XS(3)[6],=KL4BS(3)[6],=KL4E(3)[6],=KL4RKH(3)[6],=KL4YFD(3)[6],=KL7AB(3)[6], - =KL7AD(3)[6],=KL7AW(3)[6],=KL7BD(3)[6],=KL7BDC(3)[6],=KL7BH(3)[6],=KL7BR(3)[6],=KL7BS(3)[6], - =KL7BT(3)[6],=KL7BUR(3)[6],=KL7BXP(3)[6],=KL7C(3)[6],=KL7CPO(3)[6],=KL7CT(3)[6],=KL7CY(3)[6], - =KL7DC(3)[6],=KL7DF(3)[6],=KL7DI(3)[6],=KL7DK(3)[6],=KL7DLG(3)[6],=KL7EF(3)[6],=KL7EFL(3)[6], - =KL7EH(3)[6],=KL7EIN(3)[6],=KL7EU(3)[6],=KL7FDQ(3)[6],=KL7FDQ/7(3)[6],=KL7FOZ(3)[6],=KL7FRQ(3)[6], - =KL7FS(3)[6],=KL7GA(3)[6],=KL7GCS(3)[6],=KL7GKY(3)[6],=KL7GRF(3)[6],=KL7GT(3)[6],=KL7HB(3)[6], - =KL7HBV(3)[6],=KL7HFI/7(3)[6],=KL7HFV(3)[6],=KL7HI(3)[6],=KL7HJR(3)[6],=KL7HLF(3)[6],=KL7HM(3)[6], - =KL7HMK(3)[6],=KL7HQL(3)[6],=KL7HSR(3)[6],=KL7IAL(3)[6],=KL7IBT(3)[6],=KL7IDY(3)[6],=KL7IEI(3)[6], - =KL7IFK(3)[6],=KL7IGB(3)[6],=KL7IHK(3)[6],=KL7IIK(3)[6],=KL7IKV(3)[6],=KL7IL(3)[6],=KL7IME(3)[6], - =KL7IPV(3)[6],=KL7ISE(3)[6],=KL7IUX(3)[6],=KL7IWC/7(3)[6],=KL7IZC(3)[6],=KL7IZH(3)[6], - =KL7JBB(3)[6],=KL7JDQ(3)[6],=KL7JES(3)[6],=KL7JIJ(3)[6],=KL7JJE(3)[6],=KL7JKV(3)[6],=KL7KA(3)[6], - =KL7KG/7(3)[6],=KL7LG(3)[6],=KL7LI(3)[6],=KL7LX(3)[6],=KL7LZ(3)[6],=KL7M(3)[6],=KL7MY(3)[6], - =KL7MZ(3)[6],=KL7NA(3)[6],=KL7NP(3)[6],=KL7NP/7(3)[6],=KL7OA(3)[6],=KL7OF(3)[6],=KL7OL(3)[6], - =KL7OR(3)[6],=KL7OR/7(3)[6],=KL7OS(3)[6],=KL7OY(3)[6],=KL7PO(3)[6],=KL7QA(3)[6],=KL7QK(3)[6], - =KL7QK/140(3)[6],=KL7QK/7(3)[6],=KL7QR(3)[6],=KL7QR/7(3)[6],=KL7R(3)[6],=KL7RC(3)[6],=KL7RK(3)[6], - =KL7RM(3)[6],=KL7RS(3)[6],=KL7S(3)[6],=KL7SK(3)[6],=KL7SP(3)[6],=KL7T(3)[6],=KL7TU(3)[6], - =KL7UP(3)[6],=KL7UT(3)[6],=KL7VK(3)[6],=KL7VL(3)[6],=KL7VN(3)[6],=KL7VQ(3)[6],=KL7W(3)[6], - =KL7WM(3)[6],=KL7WN(3)[6],=KL7WP(3)[6],=KL7WP/7(3)[6],=KL7WT(3)[6],=KL7YJ(3)[6],=KL7YQ(3)[6], - =KL7YY/M(3)[6],=KL7ZH(3)[6],=KL7ZW(3)[6],=KL8RV(3)[6],=KL8SU(3)[6],=KL9PC(3)[6],=KP2BX(3)[6], - =KP2CB(3)[6],=KP2CT(3)[6],=KP2X(3)[6],=KP2Y(3)[6],=KP4BBN(3)[6],=KP4EFZ(3)[6],=KP4ND(3)[6], - =KP4UZ(3)[6],=KP4X(3)[6],=NH0F(3)[6],=NH0K(3)[6],=NH2DM(3)[6],=NH2JE(3)[6],=NH2KR(3)[6], - =NH6B(3)[6],=NH6BF(3)[6],=NH6CI(3)[6],=NH6DQ(3)[6],=NH6DX(3)[6],=NH6FF(3)[6],=NH6GZ(3)[6], - =NH6HE(3)[6],=NH6HZ(3)[6],=NH6LM(3)[6],=NH6NS(3)[6],=NH6U(3)[6],=NH6XN(3)[6],=NH6XP(3)[6], - =NH6Z(3)[6],=NH6ZA(3)[6],=NH6ZE(3)[6],=NH7FZ(3)[6],=NH7L(3)[6],=NH7M(3)[6],=NH7MY(3)[6], - =NH7N(3)[6],=NH7ND(3)[6],=NH7NJ/7(3)[6],=NH7OC(3)[6],=NH7PL(3)[6],=NH7RS(3)[6],=NH7S(3)[6], - =NH7SH(3)[6],=NH7TG(3)[6],=NH7VZ(3)[6],=NH7W(3)[6],=NH7WT(3)[6],=NH7WU(3)[6],=NH7YE(3)[6], - =NH7YI(3)[6],=NL7AH(3)[6],=NL7AR(3)[6],=NL7AZ(3)[6],=NL7CH(3)[6],=NL7D(3)[6],=NL7D/7(3)[6], - =NL7DH(3)[6],=NL7DY(3)[6],=NL7EO(3)[6],=NL7FQ(3)[6],=NL7FX(3)[6],=NL7GM(3)[6],=NL7GO(3)[6], - =NL7GW(3)[6],=NL7HH(3)[6],=NL7HK(3)[6],=NL7HQ(3)[6],=NL7HU(3)[6],=NL7IN(3)[6],=NL7JJ(3)[6], - =NL7JN(3)[6],=NL7KV(3)[6],=NL7LI(3)[6],=NL7MS(3)[6],=NL7MT(3)[6],=NL7NL(3)[6],=NL7OF(3)[6], - =NL7PN(3)[6],=NL7QI(3)[6],=NL7RL(3)[6],=NL7TK(3)[6],=NL7UE(3)[6],=NL7US(3)[6],=NL7WD(3)[6], - =NL7WJ(3)[6],=NL7XX(3)[6],=NL7ZM(3)[6],=NL7ZN(3)[6],=NL7ZP(3)[6],=NP2CT(3)[6],=NP2X/7(3)[6], - =NP3PH(3)[6],=NP4AI/M(3)[6],=NP4ES(3)[6],=NP4FP(3)[6],=NP4I(3)[6],=NP4JV(3)[6],=NP4JV/7(3)[6], - =VA2GLB/P(3)[6],=WH0AAM(3)[6],=WH0J(3)[6],=WH2ACV(3)[6],=WH2AJF(3)[6],=WH6ARU(3)[6],=WH6ASB(3)[6], - =WH6B(3)[6],=WH6BDR(3)[6],=WH6BLM(3)[6],=WH6BPU(3)[6],=WH6CF(3)[6],=WH6CMS(3)[6],=WH6CN(3)[6], - =WH6CUS(3)[6],=WH6CWD(3)[6],=WH6CXB(3)[6],=WH6CXE(3)[6],=WH6CXN(3)[6],=WH6CYB(3)[6],=WH6CZ(3)[6], - =WH6DAY(3)[6],=WH6DJO(3)[6],=WH6DKC(3)[6],=WH6DLQ(3)[6],=WH6DMP(3)[6],=WH6DQ(3)[6],=WH6DST(3)[6], - =WH6EEC(3)[6],=WH6EEG(3)[6],=WH6EGM(3)[6],=WH6EHW(3)[6],=WH6EJV(3)[6],=WH6EQB(3)[6],=WH6ESS(3)[6], - =WH6ETO(3)[6],=WH6EWE(3)[6],=WH6FCT(3)[6],=WH6FEU(3)[6],=WH6FL(3)[6],=WH6FOJ(3)[6],=WH6OL(3)[6], - =WH6OY(3)[6],=WH6QV(3)[6],=WH6SD(3)[6],=WH6SR(3)[6],=WH6TI(3)[6],=WH6U(3)[6],=WH6XV(3)[6], - =WH6YT(3)[6],=WH6ZV(3)[6],=WH7A(3)[6],=WH7CY(3)[6],=WH7DB(3)[6],=WH7DE(3)[6],=WH7G(3)[6], - =WH7GC(3)[6],=WH7GY(3)[6],=WH7HU(3)[6],=WH7LB(3)[6],=WH7NS(3)[6],=WH7P(3)[6],=WH7RG(3)[6], - =WH7TC(3)[6],=WH7UP(3)[6],=WH7WP(3)[6],=WH7WT(3)[6],=WH7XP(3)[6],=WL7AAW(3)[6],=WL7AL(3)[6], - =WL7AP(3)[6],=WL7AUY(3)[6],=WL7AZG(3)[6],=WL7AZL(3)[6],=WL7BCR(3)[6],=WL7BHR(3)[6],=WL7BLM(3)[6], - =WL7BM(3)[6],=WL7BNQ(3)[6],=WL7BON(3)[6],=WL7BOO(3)[6],=WL7BSW(3)[6],=WL7BUI(3)[6],=WL7BVN(3)[6], - =WL7BVS(3)[6],=WL7CAZ(3)[6],=WL7CBF(3)[6],=WL7CES(3)[6],=WL7COQ(3)[6],=WL7CPE(3)[6],=WL7CPI(3)[6], - =WL7CQX(3)[6],=WL7CRJ(3)[6],=WL7CSL(3)[6],=WL7CTB(3)[6],=WL7CTC(3)[6],=WL7CTE(3)[6],=WL7DD(3)[6], - =WL7FA(3)[6],=WL7FU(3)[6],=WL7H(3)[6],=WL7HE(3)[6],=WL7HK(3)[6],=WL7HL(3)[6],=WL7IQ(3)[6], - =WL7IS(3)[6],=WL7JM(3)[6],=WL7K(3)[6],=WL7K/7(3)[6],=WL7K/M(3)[6],=WL7LB(3)[6],=WL7LK(3)[6], - =WL7OA(3)[6],=WL7P(3)[6],=WL7PJ(3)[6],=WL7QC(3)[6],=WL7QX(3)[6],=WL7RV/140(3)[6],=WL7SD(3)[6], - =WL7SO(3)[6],=WL7SV(3)[6],=WL7T(3)[6],=WL7VK(3)[6],=WL7WB(3)[6],=WL7WF(3)[6],=WL7WG(3)[6], - =WL7WU(3)[6],=WL7XE(3)[6],=WL7XJ(3)[6],=WL7XN(3)[6],=WL7XW(3)[6],=WL7Z(3)[6],=WL7ZM(3)[6], - =WP2ADG(3)[6],=WP4BZG(3)[6],=WP4DYP(3)[6],=WP4NBP(3)[6], + =AL7KK(3)[6],=AL7KL(3)[6],=AL7KV(3)[6],=AL7L/7(3)[6],=AL7LI(3)[6],=AL7LL(3)[6],=AL7MH(3)[6], + =AL7MQ(3)[6],=AL7ND(3)[6],=AL7NK(3)[6],=AL7NZ(3)[6],=AL7OK(3)[6],=AL7OW(3)[6],=AL7PR(3)[6], + =AL7PV(3)[6],=AL7QL(3)[6],=AL7R(3)[6],=AL7R/7(3)[6],=AL7RF(3)[6],=AL7RF/7(3)[6],=AL7RM(3)[6], + =AL7RR(3)[6],=AL7W(3)[6],=G4KHG/M(3)[6],=KH0AS(3)[6],=KH0H(3)[6],=KH0K(3)[6],=KH0SH(3)[6], + =KH0TL(3)[6],=KH0X(3)[6],=KH2CH(3)[6],=KH2G(3)[6],=KH2GG(3)[6],=KH2JA(3)[6],=KH2QH(3)[6], + =KH2RK(3)[6],=KH2SK(3)[6],=KH2SR(3)[6],=KH2TJ/7(3)[6],=KH2TJ/P(3)[6],=KH2XP(3)[6],=KH2YL(3)[6], + =KH3AD(3)[6],=KH6AB(3)[6],=KH6AHQ(3)[6],=KH6BXZ(3)[6],=KH6CN(3)[6],=KH6CN/7(3)[6],=KH6COY(3)[6], + =KH6CQG(3)[6],=KH6CQH(3)[6],=KH6CQH/7(3)[6],=KH6DB(3)[6],=KH6DE(3)[6],=KH6DOT(3)[6],=KH6DUT(3)[6], + =KH6EE(3)[6],=KH6EE/7(3)[6],=KH6FKA/7(3)[6],=KH6FU(3)[6],=KH6GB(3)[6],=KH6GDN(3)[6],=KH6HU(3)[6], + =KH6HWK(3)[6],=KH6IA(3)[6],=KH6ICQ(3)[6],=KH6IKC(3)[6],=KH6IMN(3)[6],=KH6IQX(3)[6],=KH6ITY(3)[6], + =KH6JFL(3)[6],=KH6JIM/7(3)[6],=KH6JJS(3)[6],=KH6JPJ(3)[6],=KH6JPO(3)[6],=KH6JRW(3)[6], + =KH6JT(3)[6],=KH6JUQ(3)[6],=KH6KS(3)[6],=KH6KW(3)[6],=KH6LEM(3)[6],=KH6ME(3)[6],=KH6MF(3)[6], + =KH6NA(3)[6],=KH6NO/7(3)[6],=KH6NO/M(3)[6],=KH6NU(3)[6],=KH6OV(3)[6],=KH6PG(3)[6],=KH6PR(3)[6], + =KH6QAI(3)[6],=KH6QAI/7(3)[6],=KH6QAJ(3)[6],=KH6RW(3)[6],=KH6RY(3)[6],=KH6SAT(3)[6],=KH6SS(3)[6], + =KH6TG(3)[6],=KH6TX(3)[6],=KH6VM(3)[6],=KH6VM/7(3)[6],=KH6VT(3)[6],=KH6WX(3)[6],=KH6XG(3)[6], + =KH6XS(3)[6],=KH6XT(3)[6],=KH6YL(3)[6],=KH7AL(3)[6],=KH7AR(3)[6],=KH7AX(3)[6],=KH7CB(3)[6], + =KH7CM(3)[6],=KH7CZ(3)[6],=KH7FJ(3)[6],=KH7FR(3)[6],=KH7HH(3)[6],=KH7HWK(3)[6],=KH7IP(3)[6], + =KH7LE(3)[6],=KH7ME(3)[6],=KH7MR(3)[6],=KH7NP(3)[6],=KH7R(3)[6],=KH7RD(3)[6],=KH7RT(3)[6], + =KH7SQ(3)[6],=KH7SR(3)[6],=KH7WW(3)[6],=KH7WW/7(3)[6],=KH7X/7(3)[6],=KH7YD(3)[6],=KH7YD/7(3)[6], + =KH8AB(3)[6],=KH8AH(3)[6],=KH8AZ(3)[6],=KH8BG(3)[6],=KH8D(3)[6],=KH8E(3)[6],=KH8K(3)[6], + =KH9AA(3)[6],=KL0AI(3)[6],=KL0AN(3)[6],=KL0AP(3)[6],=KL0CA(3)[6],=KL0CM(3)[6],=KL0CW(3)[6], + =KL0DF(3)[6],=KL0DG(3)[6],=KL0DR(3)[6],=KL0DT(3)[6],=KL0EU(3)[6],=KL0IR(3)[6],=KL0IS(3)[6], + =KL0IW(3)[6],=KL0IX(3)[6],=KL0LF(3)[6],=KL0MO(3)[6],=KL0NM(3)[6],=KL0NP(3)[6],=KL0PP(3)[6], + =KL0QD(3)[6],=KL0RA(3)[6],=KL0SZ(3)[6],=KL0TR(3)[6],=KL0TU(3)[6],=KL1AA(3)[6],=KL1AE(3)[6], + =KL1DO(3)[6],=KL1DW(3)[6],=KL1ED(3)[6],=KL1JF(3)[6],=KL1K(3)[6],=KL1LE(3)[6],=KL1LZ(3)[6], + =KL1MF(3)[6],=KL1OH(3)[6],=KL1QL(3)[6],=KL1RH(3)[6],=KL1RV(3)[6],=KL1SF/7(3)[6],=KL1SO(3)[6], + =KL1U(3)[6],=KL1UA(3)[6],=KL1UM(3)[6],=KL1XI(3)[6],=KL1YO(3)[6],=KL1YY/7(3)[6],=KL1ZN(3)[6], + =KL1ZP(3)[6],=KL1ZR(3)[6],=KL2A/7(3)[6],=KL2BG(3)[6],=KL2BO(3)[6],=KL2BW(3)[6],=KL2BY(3)[6], + =KL2BZ(3)[6],=KL2FD(3)[6],=KL2FL(3)[6],=KL2JY(3)[6],=KL2K(3)[6],=KL2KY(3)[6],=KL2LA(3)[6], + =KL2LN(3)[6],=KL2LT(3)[6],=KL2MA(3)[6],=KL2MP(3)[6],=KL2NJ(3)[6],=KL2NU(3)[6],=KL2NW(3)[6], + =KL2OH(3)[6],=KL2OJ(3)[6],=KL2P(3)[6],=KL2QE(3)[6],=KL2VK(3)[6],=KL2YH(3)[6],=KL3EZ(3)[6], + =KL3FE(3)[6],=KL3IC(3)[6],=KL3IO(3)[6],=KL3IW(3)[6],=KL3MZ(3)[6],=KL3NE(3)[6],=KL3NO(3)[6], + =KL3OQ(3)[6],=KL3PD(3)[6],=KL3TW(3)[6],=KL3TY(3)[6],=KL3VJ(3)[6],=KL3XS(3)[6],=KL4BS(3)[6], + =KL4E(3)[6],=KL4RKH(3)[6],=KL4YFD(3)[6],=KL7AB(3)[6],=KL7AD(3)[6],=KL7AW(3)[6],=KL7BD(3)[6], + =KL7BDC(3)[6],=KL7BH(3)[6],=KL7BR(3)[6],=KL7BS(3)[6],=KL7BT(3)[6],=KL7BUR(3)[6],=KL7BXP(3)[6], + =KL7C(3)[6],=KL7CPO(3)[6],=KL7CT(3)[6],=KL7CY(3)[6],=KL7DC(3)[6],=KL7DF(3)[6],=KL7DI(3)[6], + =KL7DK(3)[6],=KL7DLG(3)[6],=KL7EF(3)[6],=KL7EFL(3)[6],=KL7EH(3)[6],=KL7EIN(3)[6],=KL7EU(3)[6], + =KL7FDQ(3)[6],=KL7FDQ/7(3)[6],=KL7FOZ(3)[6],=KL7FRQ(3)[6],=KL7FS(3)[6],=KL7GA(3)[6],=KL7GCS(3)[6], + =KL7GKY(3)[6],=KL7GRF(3)[6],=KL7GT(3)[6],=KL7HB(3)[6],=KL7HBV(3)[6],=KL7HFI/7(3)[6],=KL7HFV(3)[6], + =KL7HI(3)[6],=KL7HJR(3)[6],=KL7HLF(3)[6],=KL7HM(3)[6],=KL7HMK(3)[6],=KL7HQL(3)[6],=KL7HSR(3)[6], + =KL7IAL(3)[6],=KL7IBT(3)[6],=KL7IDY(3)[6],=KL7IEI(3)[6],=KL7IFK(3)[6],=KL7IGB(3)[6],=KL7IHK(3)[6], + =KL7IIK(3)[6],=KL7IKV(3)[6],=KL7IL(3)[6],=KL7IME(3)[6],=KL7IPV(3)[6],=KL7ISE(3)[6],=KL7IUX(3)[6], + =KL7IWC/7(3)[6],=KL7IZC(3)[6],=KL7IZH(3)[6],=KL7JBB(3)[6],=KL7JDQ(3)[6],=KL7JES(3)[6], + =KL7JIJ(3)[6],=KL7JJE(3)[6],=KL7JKV(3)[6],=KL7KA(3)[6],=KL7KG/7(3)[6],=KL7LG(3)[6],=KL7LI(3)[6], + =KL7LX(3)[6],=KL7LZ(3)[6],=KL7M(3)[6],=KL7MY(3)[6],=KL7MZ(3)[6],=KL7NA(3)[6],=KL7NP(3)[6], + =KL7NP/7(3)[6],=KL7OA(3)[6],=KL7OF(3)[6],=KL7OL(3)[6],=KL7OR(3)[6],=KL7OR/7(3)[6],=KL7OS(3)[6], + =KL7OY(3)[6],=KL7PO(3)[6],=KL7QA(3)[6],=KL7QK(3)[6],=KL7QK/140(3)[6],=KL7QK/7(3)[6],=KL7QR(3)[6], + =KL7QR/7(3)[6],=KL7R(3)[6],=KL7RC(3)[6],=KL7RK(3)[6],=KL7RM(3)[6],=KL7RS(3)[6],=KL7S(3)[6], + =KL7SK(3)[6],=KL7SP(3)[6],=KL7T(3)[6],=KL7TU(3)[6],=KL7UP(3)[6],=KL7UT(3)[6],=KL7VK(3)[6], + =KL7VL(3)[6],=KL7VN(3)[6],=KL7VQ(3)[6],=KL7W(3)[6],=KL7WC(3)[6],=KL7WM(3)[6],=KL7WN(3)[6], + =KL7WP(3)[6],=KL7WP/7(3)[6],=KL7WT(3)[6],=KL7YJ(3)[6],=KL7YQ(3)[6],=KL7YY/M(3)[6],=KL7ZH(3)[6], + =KL7ZW(3)[6],=KL8RV(3)[6],=KL8SU(3)[6],=KL9PC(3)[6],=KP2BX(3)[6],=KP2CB(3)[6],=KP2CT(3)[6], + =KP2X(3)[6],=KP2Y(3)[6],=KP4BBN(3)[6],=KP4EFZ(3)[6],=KP4ND(3)[6],=KP4UZ(3)[6],=KP4X(3)[6], + =NH0F(3)[6],=NH0K(3)[6],=NH2DM(3)[6],=NH2JE(3)[6],=NH2KR(3)[6],=NH6B(3)[6],=NH6BF(3)[6], + =NH6CI(3)[6],=NH6DQ(3)[6],=NH6DX(3)[6],=NH6FF(3)[6],=NH6GZ(3)[6],=NH6HE(3)[6],=NH6HZ(3)[6], + =NH6LM(3)[6],=NH6NS(3)[6],=NH6U(3)[6],=NH6XN(3)[6],=NH6XP(3)[6],=NH6Z(3)[6],=NH6ZA(3)[6], + =NH6ZE(3)[6],=NH7FZ(3)[6],=NH7L(3)[6],=NH7M(3)[6],=NH7MY(3)[6],=NH7N(3)[6],=NH7ND(3)[6], + =NH7NJ/7(3)[6],=NH7OC(3)[6],=NH7PL(3)[6],=NH7RS(3)[6],=NH7S(3)[6],=NH7SH(3)[6],=NH7TG(3)[6], + =NH7VZ(3)[6],=NH7W(3)[6],=NH7WT(3)[6],=NH7WU(3)[6],=NH7YE(3)[6],=NH7YI(3)[6],=NL7AH(3)[6], + =NL7AR(3)[6],=NL7AZ(3)[6],=NL7CH(3)[6],=NL7D(3)[6],=NL7D/7(3)[6],=NL7DH(3)[6],=NL7DY(3)[6], + =NL7EO(3)[6],=NL7FQ(3)[6],=NL7FX(3)[6],=NL7GM(3)[6],=NL7GO(3)[6],=NL7GW(3)[6],=NL7HH(3)[6], + =NL7HK(3)[6],=NL7HQ(3)[6],=NL7HU(3)[6],=NL7IN(3)[6],=NL7JJ(3)[6],=NL7JN(3)[6],=NL7KV(3)[6], + =NL7LI(3)[6],=NL7MS(3)[6],=NL7MT(3)[6],=NL7NL(3)[6],=NL7OF(3)[6],=NL7PN(3)[6],=NL7QI(3)[6], + =NL7RL(3)[6],=NL7TK(3)[6],=NL7UE(3)[6],=NL7US(3)[6],=NL7WD(3)[6],=NL7WJ(3)[6],=NL7XX(3)[6], + =NL7ZM(3)[6],=NL7ZN(3)[6],=NL7ZP(3)[6],=NP2CT(3)[6],=NP2X/7(3)[6],=NP3PH(3)[6],=NP4AI/M(3)[6], + =NP4ES(3)[6],=NP4FP(3)[6],=NP4I(3)[6],=NP4JV(3)[6],=NP4JV/7(3)[6],=VA2GLB/P(3)[6],=WH0AAM(3)[6], + =WH0J(3)[6],=WH2ACV(3)[6],=WH2AJF(3)[6],=WH6ARU(3)[6],=WH6ASB(3)[6],=WH6B(3)[6],=WH6BDR(3)[6], + =WH6BLM(3)[6],=WH6BPU(3)[6],=WH6CF(3)[6],=WH6CMS(3)[6],=WH6CN(3)[6],=WH6CUS(3)[6],=WH6CWD(3)[6], + =WH6CXB(3)[6],=WH6CXE(3)[6],=WH6CXN(3)[6],=WH6CYB(3)[6],=WH6CZ(3)[6],=WH6DAY(3)[6],=WH6DJO(3)[6], + =WH6DKC(3)[6],=WH6DLQ(3)[6],=WH6DMP(3)[6],=WH6DQ(3)[6],=WH6DST(3)[6],=WH6EEC(3)[6],=WH6EEG(3)[6], + =WH6EGM(3)[6],=WH6EHW(3)[6],=WH6EJV(3)[6],=WH6EQB(3)[6],=WH6ESS(3)[6],=WH6ETO(3)[6],=WH6EWE(3)[6], + =WH6FCT(3)[6],=WH6FEU(3)[6],=WH6FL(3)[6],=WH6FOJ(3)[6],=WH6OL(3)[6],=WH6OY(3)[6],=WH6QV(3)[6], + =WH6SD(3)[6],=WH6SR(3)[6],=WH6TI(3)[6],=WH6U(3)[6],=WH6XV(3)[6],=WH6YT(3)[6],=WH6ZR(3)[6], + =WH6ZV(3)[6],=WH7A(3)[6],=WH7CY(3)[6],=WH7DB(3)[6],=WH7DE(3)[6],=WH7G(3)[6],=WH7GC(3)[6], + =WH7GY(3)[6],=WH7HU(3)[6],=WH7LB(3)[6],=WH7NS(3)[6],=WH7P(3)[6],=WH7RG(3)[6],=WH7TC(3)[6], + =WH7UP(3)[6],=WH7WP(3)[6],=WH7WT(3)[6],=WH7XP(3)[6],=WL7AAW(3)[6],=WL7AL(3)[6],=WL7AP(3)[6], + =WL7AUY(3)[6],=WL7AZG(3)[6],=WL7AZL(3)[6],=WL7BCR(3)[6],=WL7BHR(3)[6],=WL7BLM(3)[6],=WL7BM(3)[6], + =WL7BNQ(3)[6],=WL7BON(3)[6],=WL7BOO(3)[6],=WL7BSW(3)[6],=WL7BUI(3)[6],=WL7BVN(3)[6],=WL7BVS(3)[6], + =WL7CAZ(3)[6],=WL7CBF(3)[6],=WL7CES(3)[6],=WL7COQ(3)[6],=WL7CPE(3)[6],=WL7CPI(3)[6],=WL7CQX(3)[6], + =WL7CRJ(3)[6],=WL7CSL(3)[6],=WL7CTB(3)[6],=WL7CTC(3)[6],=WL7CTE(3)[6],=WL7DD(3)[6],=WL7FA(3)[6], + =WL7FU(3)[6],=WL7H(3)[6],=WL7HE(3)[6],=WL7HK(3)[6],=WL7HL(3)[6],=WL7IQ(3)[6],=WL7IS(3)[6], + =WL7JM(3)[6],=WL7K(3)[6],=WL7K/7(3)[6],=WL7K/M(3)[6],=WL7LB(3)[6],=WL7LK(3)[6],=WL7OA(3)[6], + =WL7P(3)[6],=WL7PJ(3)[6],=WL7QC(3)[6],=WL7QX(3)[6],=WL7RV/140(3)[6],=WL7SD(3)[6],=WL7SO(3)[6], + =WL7SV(3)[6],=WL7T(3)[6],=WL7VK(3)[6],=WL7WB(3)[6],=WL7WF(3)[6],=WL7WG(3)[6],=WL7WU(3)[6], + =WL7XE(3)[6],=WL7XJ(3)[6],=WL7XN(3)[6],=WL7XW(3)[6],=WL7Z(3)[6],=WL7ZM(3)[6],=WP2ADG(3)[6], + =WP4BZG(3)[6],=WP4DYP(3)[6],=WP4NBP(3)[6], AA8(4)[8],AB8(4)[8],AC8(4)[8],AD8(4)[8],AE8(4)[8],AF8(4)[8],AG8(4)[8],AI8(4)[8],AJ8(4)[8], AK8(4)[8],K8(4)[8],KA8(4)[8],KB8(4)[8],KC8(4)[8],KD8(4)[8],KE8(4)[8],KF8(4)[8],KG8(4)[8], KI8(4)[8],KJ8(4)[8],KK8(4)[8],KM8(4)[8],KN8(4)[8],KO8(4)[8],KQ8(4)[8],KR8(4)[8],KS8(4)[8], @@ -1554,17 +1559,17 @@ United States: 05: 08: NA: 37.53: 91.67: 5.0: K: WQ9(4)[8],WR9(4)[8],WS9(4)[8],WT9(4)[8],WU9(4)[8],WV9(4)[8],WW9(4)[8],WX9(4)[8],WY9(4)[8], WZ9(4)[8],=AH0AJ(4)[8],=AH6DA(4)[8],=AH6EZ/9(4)[8],=AH6OM(4)[8],=AL1CE(4)[8],=AL7AK(4)[8], =AL7AK/9(4)[8],=AL7BT(4)[8],=AL7CV(4)[8],=AL7DS(4)[8],=AL7II/9(4)[8],=AL7OL(4)[8],=AL7PM(4)[8], - =KH0BE(4)[8],=KH6JNY(4)[8],=KH6KI(4)[8],=KH6UX(4)[8],=KH7DR(4)[8],=KH7EI(4)[8],=KL0LB(4)[8], - =KL0NY(4)[8],=KL1NO(4)[8],=KL1QN(4)[8],=KL2A/9(4)[8],=KL2KP(4)[8],=KL2NQ(4)[8],=KL2YD(4)[8], - =KL2ZL(4)[8],=KL4CX(4)[8],=KL7AL(4)[8],=KL7AL/9(4)[8],=KL7BGR(4)[8],=KL7CE(4)[8],=KL7CE/9(4)[8], - =KL7IBV(4)[8],=KL7IPS(4)[8],=KL7IVK(4)[8],=KL7JAB(4)[8],=KL7MU(4)[8],=KL7TD(4)[8],=KP3JOS(4)[8], - =KP3VA/M(4)[8],=KP4CI(4)[8],=KP4GE/9(4)[8],=KP4SL(4)[8],=KP4WG(4)[8],=NH2W(4)[8],=NH2W/9(4)[8], - =NH6R(4)[8],=NH7TK(4)[8],=NL7CM(4)[8],=NL7KD(4)[8],=NL7NK(4)[8],=NL7QC(4)[8],=NL7QC/9(4)[8], - =NL7RC(4)[8],=NL7UH(4)[8],=NL7YI(4)[8],=NP2AV(4)[8],=NP2GM(4)[8],=NP2L/9(4)[8],=NP2MU(4)[8], - =NP3QC(4)[8],=NP4ZI(4)[8],=WH0AI(4)[8],=WH2T(4)[8],=WH6FBA(4)[8],=WH6SB(4)[8],=WL7AHP(4)[8], - =WL7AIT(4)[8],=WL7BEV(4)[8],=WL7CTA(4)[8],=WL7FJ(4)[8],=WL7JAN(4)[8],=WL7NP(4)[8],=WL7UU(4)[8], - =WP2B(4)[8],=WP4JSP(4)[8],=WP4KGF(4)[8],=WP4LKY(4)[8],=WP4LSQ(4)[8],=WP4MQX(4)[8],=WP4MSD(4)[8], - =WP4MTN(4)[8],=WP4MVQ(4)[8],=WP4MYL(4)[8],=WP4OCZ(4)[8], + =KH0BE(4)[8],=KH2RP(4)[8],=KH6JNY(4)[8],=KH6KI(4)[8],=KH6UX(4)[8],=KH7DR(4)[8],=KH7EI(4)[8], + =KL0LB(4)[8],=KL0NY(4)[8],=KL1NO(4)[8],=KL1QN(4)[8],=KL2A/9(4)[8],=KL2KP(4)[8],=KL2NQ(4)[8], + =KL2YD(4)[8],=KL2ZL(4)[8],=KL4CX(4)[8],=KL7AL(4)[8],=KL7AL/9(4)[8],=KL7BGR(4)[8],=KL7CE(4)[8], + =KL7CE/9(4)[8],=KL7IBV(4)[8],=KL7IPS(4)[8],=KL7IVK(4)[8],=KL7JAB(4)[8],=KL7MU(4)[8],=KL7TD(4)[8], + =KP2XX(4)[8],=KP3JOS(4)[8],=KP3VA/M(4)[8],=KP4CI(4)[8],=KP4GE/9(4)[8],=KP4SL(4)[8],=KP4WG(4)[8], + =NH2W(4)[8],=NH2W/9(4)[8],=NH6R(4)[8],=NH7TK(4)[8],=NL7CM(4)[8],=NL7KD(4)[8],=NL7NK(4)[8], + =NL7QC(4)[8],=NL7QC/9(4)[8],=NL7RC(4)[8],=NL7UH(4)[8],=NL7YI(4)[8],=NP2AV(4)[8],=NP2GM(4)[8], + =NP2L/9(4)[8],=NP2MU(4)[8],=NP3QC(4)[8],=NP4ZI(4)[8],=WH0AI(4)[8],=WH2T(4)[8],=WH6FBA(4)[8], + =WH6SB(4)[8],=WL7AHP(4)[8],=WL7AIT(4)[8],=WL7BEV(4)[8],=WL7CTA(4)[8],=WL7FJ(4)[8],=WL7JAN(4)[8], + =WL7NP(4)[8],=WL7UU(4)[8],=WP2B(4)[8],=WP4JSP(4)[8],=WP4KGF(4)[8],=WP4LKY(4)[8],=WP4LSQ(4)[8], + =WP4MQX(4)[8],=WP4MSD(4)[8],=WP4MTN(4)[8],=WP4MVQ(4)[8],=WP4MYL(4)[8],=WP4OCZ(4)[8], =AH2BG(4)[8],=AH6ES(4)[8],=AH6FF(4)[8],=AH6HR(4)[8],=AH6HR/4(4)[8],=AH6KB(4)[8],=AL0P(4)[8], =AL2C(4)[8],=AL2F(4)[8],=AL2F/4(4)[8],=AL4B(4)[8],=AL7CX(4)[8],=AL7EU(4)[8],=AL7KN(4)[8], =AL7MR(4)[8],=AL7QO(4)[8],=KH0UN(4)[8],=KH2AR(4)[8],=KH2AR/4(4)[8],=KH2DN(4)[8],=KH4AF(4)[8], @@ -1591,15 +1596,15 @@ Guantanamo Bay: 08: 11: NA: 20.00: 75.00: 5.0: KG4: =KG4SC,=KG4SS,=KG4WH,=KG4WV,=KG4XP,=KG4ZK,=W1AW/KG4; Mariana Islands: 27: 64: OC: 15.18: -145.72: -10.0: KH0: AH0,KH0,NH0,WH0,=AB2HV,=AB2QH,=AB9HF,=AB9OQ,=AC8CP,=AD5KT,=AD6YP,=AE6OG,=AF4IN,=AF4KH,=AF6EO, - =AH2U,=AJ6K,=AK1JA,=K8KH,=K8RN,=KB5UAB,=KB9LQG,=KC2WIK,=KC5SPG,=KC7SDC,=KC9GQX,=KD7GJX,=KG2QH, - =KG6GQ,=KG6SB,=KG7DCN,=KH0EN/KT,=KH2GV,=KH2O,=KH2VL,=KL7QOL,=KW2X,=N0J,=N3QD,=N6EAX,=N7NVX,=N8CS, - =NA1M,=NH2B,=NH2FG,=NU2A,=W1FPU,=W3FM,=W3NL,=W3STX,=W7KFS,=WA6AC,=WE1J,=WH6ZW,=WO2G; + =AH2U,=AJ6K,=AK1JA,=K0FRI,=K8KH,=K8RN,=KB5UAB,=KB9LQG,=KC2WIK,=KC5SPG,=KC7SDC,=KC9GQX,=KD7GJX, + =KG2QH,=KG6GQ,=KG6SB,=KG7DCN,=KH0EN/KT,=KH2GV,=KH2O,=KH2VL,=KL7QOL,=KW2X,=N0J,=N3QD,=N6EAX,=N7NVX, + =N8CS,=NA1M,=NH2B,=NH2FG,=NU2A,=W1FPU,=W3FM,=W3NL,=W3STX,=W7KFS,=WA6AC,=WE1J,=WH6ZW,=WO2G; Baker & Howland Islands: 31: 61: OC: 0.00: 176.00: 12.0: KH1: AH1,KH1,NH1,WH1; Guam: 27: 64: OC: 13.37: -144.70: -10.0: KH2: AH2,KH2,NH2,WH2,=AB2AB,=AB8EW,=AC0FG,=AE6QZ,=AH0AX,=AH0F,=AH0FM,=AH0S,=AI6ID,=K1IWD,=K2QGC,=K5GUA, - =K5GUM,=KA0RU,=KA6BEG,=KB7OVT,=KB7PQU,=KC2OOX,=KD7IRV,=KE4YSP,=KE6ATM,=KE7GMC,=KE7IPG,=KF4UFC, - =KF5ULC,=KF7BMU,=KG4BKW,=KG6AGT,=KG6ARL,=KG6DX,=KG6FJG,=KG6JDX,=KG6JKR,=KG6JKT,=KG6TEZ,=KG6TWZ, + =K5GUM,=KA0RU,=KA6BEG,=KB5OXR,=KB7OVT,=KB7PQU,=KC2OOX,=KD7IRV,=KE4YSP,=KE6ATM,=KE7GMC,=KE7IPG, + =KF4UFC,=KF5ULC,=KF7BMU,=KG4BKW,=KG6AGT,=KG6ARL,=KG6DX,=KG6FJG,=KG6JDX,=KG6JKR,=KG6JKT,=KG6TWZ, =KH0C,=KH0DX,=KH0ES,=KH0TF,=KH0UM,=KH6KK,=KI4KKH,=KI4KKI,=KI7SSW,=KJ6KCJ,=KK6GVF,=KK7AV,=KM4NVB, =N2MI,=NH0A,=NH0B,=NH7TL,=NH7WC,=NP3EZ,=W5LFA,=W6KV,=W7GVC,=W9MRE,=WA3KNB,=WB7AXZ,=WD6DGS,=WH0AC; Johnston Island: 31: 61: OC: 16.72: 169.53: 10.0: KH3: @@ -1610,45 +1615,45 @@ Palmyra & Jarvis Islands: 31: 61: OC: 5.87: 162.07: 11.0: KH5: AH5,KH5,NH5,WH5; Hawaii: 31: 61: OC: 21.12: 157.48: 10.0: KH6: AH6,AH7,KH6,KH7,NH6,NH7,WH6,WH7,=AA7LE,=AA8JA,=AB0JM,=AB3WS,=AB6AP,=AB8VQ,=AC4PJ,=AC4TJ,=AC7LR, - =AC7N,=AC9PT,=AE3TT,=AE5AB,=AE5LR,=AG4FH,=AH0A,=AH0AG,=AH2CN,=AJ0M,=AJ8HT,=AK0P,=AK2J,=AL3U, - =AL7RQ,=K0BAD,=K0LAS,=K0LIH,=K0LUC,=K0OUS,=K1ENT,=K1HZM,=K1OWL,=K1RJ,=K1VAN,=K2FFT,=K2GT,=K3NW, - =K3QHP,=K3UNS,=K4EVR,=K4RAC,=K4UAI,=K4UHL,=K4XS,=K4XSS,=K4XV,=K5HQM,=K5ZAI,=K5ZYO,=K6AMA,=K6APP, - =K6ATF,=K6CEE,=K6GJS,=K6GUY,=K6HI,=K6JAE,=K6MIO,=K6NLF,=K6RSB,=K7ASH,=K7FAR,=K7FR,=K7NRJ,=K7QAS, - =K8EUT,=K9AGI,=K9FD,=K9UBS,=KA0FOR,=KA0VHP,=KA1ICJ,=KA1YJ,=KA2IXG,=KA2WXU,=KA3HIZ,=KA3TUA,=KA4INK, - =KA6QOD,=KA7APU,=KA7RKW,=KA8EBL,=KA8KND,=KA9DMP,=KB0DJR,=KB0PXK,=KB0ZKZ,=KB1EUJ,=KB1GC,=KB1PCX, - =KB2MRY,=KB3DMT,=KB3IOC,=KB3OXU,=KB3PJS,=KB3SEV,=KB4NGN,=KB5NNY,=KB5OWT,=KB6CNU,=KB6EGA,=KB6INB, - =KB6PKF,=KB7AKH,=KB7DDX,=KB7EA,=KB7G,=KB7JB,=KB7MEU,=KB7QKJ,=KB7UQH,=KB7UVR,=KB7WDC,=KB7WUP, - =KB8SKX,=KC0WQU,=KC0YIH,=KC0ZER,=KC1DBY,=KC2GSU,=KC2HL,=KC2MIU,=KC2PGW,=KC2SRW,=KC2YL,=KC2ZSG, - =KC2ZSH,=KC2ZSI,=KC3GZT,=KC4HHS,=KC5GAX,=KC6HOX,=KC6QQI,=KC6RYQ,=KC6SHT,=KC6SWR,=KC6YIO,=KC7ASJ, - =KC7AXX,=KC7DUT,=KC7EJC,=KC7HNC,=KC7KAT,=KC7KAW,=KC7KBA,=KC7KHW,=KC7KJT,=KC7LFM,=KC7NZ,=KC7PLG, - =KC7USA,=KC7VHF,=KC7VWU,=KC7YXO,=KC8EFI,=KC8EJ,=KC9AUA,=KC9EQS,=KC9KEX,=KC9NJG,=KC9SBG,=KD0QLQ, - =KD0QLR,=KD0RPD,=KD0WVZ,=KD0ZSP,=KD3FZ,=KD4GW,=KD4ML,=KD4QWO,=KD5ACN,=KD5BSK,=KD5HDA,=KD5HX, - =KD5TBQ,=KD6CVU,=KD6CWF,=KD6EPD,=KD6IPX,=KD6LRA,=KD6VTU,=KD7HTG,=KD7LMP,=KD7SME,=KD7SMV,=KD7TZ, - =KD7UV,=KD7UZG,=KD7WJM,=KD8GVO,=KE0TU,=KE2CX,=KE4DYE,=KE4RNU,=KE4UXQ,=KE4ZXQ,=KE5CGA,=KE5FJM, - =KE5UZN,=KE6AXN,=KE6AXP,=KE6AYZ,=KE6CQE,=KE6EDJ,=KE6EVT,=KE6JXO,=KE6RAW,=KE6TFR,=KE6TIS,=KE6TKQ, - =KE7FJA,=KE7FSK,=KE7HEW,=KE7IZS,=KE7JTX,=KE7KRQ,=KE7LWN,=KE7MW,=KE7PEQ,=KE7PIZ,=KE7QML,=KE7RCT, - =KE7UAJ,=KE7UV,=KE7UW,=KF4DWA,=KF4FQR,=KF4IBW,=KF4JLZ,=KF4OOB,=KF4URD,=KF4VHS,=KF5AHW,=KF5LBQ, - =KF5MXM,=KF5MXP,=KF6BS,=KF6FDG,=KF6IVV,=KF6LWN,=KF6LYU,=KF6MQT,=KF6OSA,=KF6PJ,=KF6PQE,=KF6QZD, - =KF6RLP,=KF6YZR,=KF6ZAL,=KF7GNP,=KF7IJL,=KF7LRS,=KF7OJR,=KF7TUU,=KF7VUK,=KG0XR,=KG4HZF,=KG4SGC, - =KG4SGV,=KG6DV,=KG6EFD,=KG6HRX,=KG6IGY,=KG6JJP,=KG6LFX,=KG6MZJ,=KG6NNF,=KG6NQI,=KG6OOB,=KG6RJI, - =KG6SDD,=KG6TFI,=KG6WZD,=KG7AYU,=KG7CJI,=KG7CVR,=KG7EUP,=KH0AI,=KH0HL,=KH0WJ,=KH2MD,=KH2TD,=KH2TE, - =KH2YI,=KH3AE,=KH3AE/M,=KH3AF,=KH8Z,=KI4CAU,=KI4HCZ,=KI4NOH,=KI4YAF,=KI4YOG,=KI6CRL,=KI6DVJ, - =KI6EFY,=KI6FTE,=KI6HBZ,=KI6JEC,=KI6LPT,=KI6NOC,=KI6QDQ,=KI6QQJ,=KI6SNP,=KI6VYB,=KI6WOJ,=KI6ZRV, - =KI7EZG,=KI7FJW,=KI7FJX,=KI7FUT,=KI7OS,=KI7QZQ,=KJ4BHO,=KJ4EYV,=KJ4KND,=KJ4WOI,=KJ6GYD,=KJ6LAW, - =KJ6LAX,=KJ6LBI,=KJ6NZH,=KJ6QQT,=KJ6RGW,=KJ6SKC,=KJ6TJZ,=KK4EEC,=KK6BRW,=KK6EJ,=KK6GM,=KK6OMX, - =KK6PGA,=KK6QAI,=KK6VJN,=KK6ZQ,=KK6ZZE,=KK7WR,=KL1TP,=KL3FN,=KL7PN,=KL7UB,=KM6BOQ,=KM6IK,=KM6RM, - =KN6BE,=KN6ZU,=KN8AQR,=KO6KW,=KO6QT,=KQ6CD,=KQ6M,=KU4OY,=KW4JC,=KY1I,=N0CAN,=N0DQD,=N0PJV,=N0RMC, - =N0ZSJ,=N1CBF,=N1CFD,=N1CNQ,=N1IDP,=N1SHV,=N1TEE,=N1TLE,=N1VOP,=N1YLH,=N2AL,=N2KJU,=N2KLQ,=N3DJT, - =N3FUR,=N3GWR,=N3HQW,=N3RWD,=N3VDM,=N3ZFY,=N4ERA,=N4ZIW,=N5IWF,=N5JKJ,=N6AI,=N6CGA,=N6DXW,=N6GOZ, - =N6IKX,=N6KB,=N6NCT,=N6PJQ,=N6QBK,=N6ZAB,=N7AMY,=N7BLC,=N7KZB,=N7NYY,=N7ODC,=N7TSV,=N7WBX,=N9CRQ, - =N9GFL,=N9SBL,=NB6R,=NE7SO,=NG1T,=NH2CC,=NH2CD,=NH2CF,=NH2CQ,=NH2CR,=NH2IB,=NH2IF,=NH2II,=NH2IJ, - =NH2IO,=NH2JO,=NH2KF,=NH2KH,=NH2YL,=NH2Z,=NI1J,=NL7UW,=NM2B,=NO0H,=NT0DA,=NT4AA,=NZ2F,=W0UNX, - =W1BMB,=W2UNS,=W3ZRT,=W4YQS,=W5FJG,=W6AUS,=W6CAG,=W6CWJ,=W6KEV,=W6KIT,=W6KPI,=W6MQB,=W6MRJ,=W6NBK, - =W6ROM,=W6SHH,=W6UNX,=W7EHP,=W7NVQ,=W7NX,=W7OO,=W7RCR,=W7UEA,=W8AYD,=W8JAY,=W8WH,=WA0FUR,=WA0NHD, - =WA2AUI,=WA3ZEM,=WA6ECX,=WA6IIQ,=WA6JDA,=WA6JJQ,=WA6QDQ,=WA6UVF,=WA7ESE,=WA7HEO,=WA7TFE,=WA7ZK, - =WA8JQP,=WB0RUA,=WB0TZQ,=WB2AHM,=WB2SQW,=WB4JTT,=WB4MNF,=WB5ZDH,=WB5ZOV,=WB6CVJ,=WB6PIO,=WB6PJT, - =WB6SAA,=WB8NCD,=WB9SMM,=WC6B,=WD0FTF,=WD0LFN,=WD6EZL,=WD6GHJ,=WD8LIB,=WD8OBO,=WH2Y,=WH7K,=WU0H, - =WV0Z,=WV6K,=WX7G; + =AC7N,=AC9PT,=AE3TT,=AE5AB,=AE5LR,=AG4FH,=AH0A,=AH0AG,=AH2CN,=AJ0M,=AJ6JF,=AJ8HT,=AK0P,=AK2J, + =AL3U,=AL7RQ,=K0BAD,=K0LAS,=K0LIH,=K0LUC,=K0OUS,=K1ENT,=K1HZM,=K1OSP,=K1OWL,=K1RJ,=K1VAN,=K2FFT, + =K2GT,=K3NW,=K3QHP,=K3UNS,=K4EVR,=K4RAC,=K4UAI,=K4UHL,=K4XS,=K4XSS,=K4XV,=K5HQM,=K5UN,=K5ZAI, + =K5ZYO,=K6AMA,=K6APP,=K6ATF,=K6CEE,=K6GJS,=K6GUY,=K6HI,=K6JAE,=K6MIO,=K6NLF,=K6RSB,=K7ALH,=K7ASH, + =K7FAR,=K7FR,=K7NRJ,=K7QAS,=K8EUT,=K9AGI,=K9FD,=K9UBS,=KA0FOR,=KA0VHP,=KA1ICJ,=KA1YJ,=KA2IXG, + =KA2WXU,=KA3HIZ,=KA3TUA,=KA4INK,=KA6QOD,=KA7APU,=KA7RKW,=KA8EBL,=KA8KND,=KA9DMP,=KB0DJR,=KB0PXK, + =KB0ZKZ,=KB1EUJ,=KB1GC,=KB1PCX,=KB1UHL,=KB2MRY,=KB3DMT,=KB3IOC,=KB3OXU,=KB3PJS,=KB3SEV,=KB4NGN, + =KB5HVJ,=KB5NNY,=KB5OWT,=KB6CNU,=KB6EGA,=KB6INB,=KB6PKF,=KB7AKH,=KB7DDX,=KB7EA,=KB7G,=KB7JB, + =KB7MEU,=KB7QKJ,=KB7UQH,=KB7UVR,=KB7WDC,=KB7WUP,=KB8SKX,=KC0WQU,=KC0YIH,=KC0ZER,=KC1DBY,=KC2GSU, + =KC2HL,=KC2MIU,=KC2PGW,=KC2SRW,=KC2YL,=KC2ZSG,=KC2ZSH,=KC2ZSI,=KC3GZT,=KC4HHS,=KC5GAX,=KC6HOX, + =KC6QQI,=KC6RYQ,=KC6SHT,=KC6SWR,=KC6YIO,=KC7ASJ,=KC7AXX,=KC7DUT,=KC7EJC,=KC7HNC,=KC7KAT,=KC7KAW, + =KC7KBA,=KC7KHW,=KC7KJT,=KC7LFM,=KC7NZ,=KC7PLG,=KC7USA,=KC7VHF,=KC7VWU,=KC7YXO,=KC8EFI,=KC8EJ, + =KC9AUA,=KC9EQS,=KC9KEX,=KC9NJG,=KC9SBG,=KD0QLQ,=KD0QLR,=KD0RPD,=KD0WVZ,=KD0ZSP,=KD3FZ,=KD4GW, + =KD4ML,=KD4QWO,=KD5ACN,=KD5BSK,=KD5HDA,=KD5HX,=KD5TBQ,=KD6CVU,=KD6CWF,=KD6EPD,=KD6IPX,=KD6LRA, + =KD6VTU,=KD7GWM,=KD7HTG,=KD7LMP,=KD7SME,=KD7SMV,=KD7TZ,=KD7UV,=KD7UZG,=KD7WJM,=KD8GVO,=KE0TU, + =KE2CX,=KE4DYE,=KE4RNU,=KE4UXQ,=KE4ZXQ,=KE5CGA,=KE5FJM,=KE5UZN,=KE6AXN,=KE6AXP,=KE6AYZ,=KE6CQE, + =KE6EDJ,=KE6EVT,=KE6JXO,=KE6RAW,=KE6TFR,=KE6TIS,=KE6TKQ,=KE7FJA,=KE7FSK,=KE7HEW,=KE7IZS,=KE7JTX, + =KE7KRQ,=KE7LWN,=KE7MW,=KE7PEQ,=KE7PIZ,=KE7QML,=KE7RCT,=KE7UAJ,=KE7UV,=KE7UW,=KF4DWA,=KF4FQR, + =KF4IBW,=KF4JLZ,=KF4OOB,=KF4URD,=KF4VHS,=KF5AHW,=KF5LBQ,=KF5MXM,=KF5MXP,=KF6BS,=KF6FDG,=KF6IVV, + =KF6LWN,=KF6LYU,=KF6MQT,=KF6OSA,=KF6PJ,=KF6PQE,=KF6QZD,=KF6RLP,=KF6YZR,=KF6ZAL,=KF6ZVS,=KF7GNP, + =KF7IJL,=KF7LRS,=KF7OJR,=KF7TUU,=KF7VUK,=KG0XR,=KG4HZF,=KG4SGC,=KG4SGV,=KG6DV,=KG6EFD,=KG6HRX, + =KG6IGY,=KG6JJP,=KG6LFX,=KG6MZJ,=KG6NNF,=KG6NQI,=KG6OOB,=KG6RJI,=KG6SDD,=KG6TFI,=KG6WZD,=KG7AYU, + =KG7CJI,=KG7CVR,=KG7EUP,=KH0AI,=KH0HL,=KH0WJ,=KH2MD,=KH2TD,=KH2TE,=KH2YI,=KH3AE,=KH3AE/M,=KH3AF, + =KH8Z,=KI4CAU,=KI4HCZ,=KI4NOH,=KI4YAF,=KI4YOG,=KI6CRL,=KI6DVJ,=KI6EFY,=KI6FTE,=KI6HBZ,=KI6JEC, + =KI6LPT,=KI6NOC,=KI6QDQ,=KI6QQJ,=KI6SNP,=KI6VYB,=KI6WOJ,=KI6ZRV,=KI7EZG,=KI7FJW,=KI7FJX,=KI7FUT, + =KI7OS,=KI7QZQ,=KJ4BHO,=KJ4EYV,=KJ4KND,=KJ4WOI,=KJ6GYD,=KJ6LAW,=KJ6LAX,=KJ6LBI,=KJ6NZH,=KJ6QQT, + =KJ6RGW,=KJ6SKC,=KJ6TJZ,=KK4EEC,=KK6BRW,=KK6EJ,=KK6GM,=KK6OMX,=KK6PGA,=KK6QAI,=KK6VJN,=KK6ZQ, + =KK6ZZE,=KK7WR,=KL1TP,=KL3FN,=KL7PN,=KL7UB,=KM6BOQ,=KM6IK,=KM6RM,=KN6BE,=KN6ZU,=KN8AQR,=KO6KW, + =KO6QT,=KQ6CD,=KQ6M,=KU4OY,=KW4JC,=KY1I,=N0CAN,=N0DQD,=N0PJV,=N0RMC,=N0ZSJ,=N1CBF,=N1CFD,=N1CNQ, + =N1IDP,=N1SHV,=N1TEE,=N1TLE,=N1VOP,=N1YLH,=N2AL,=N2KJU,=N2KLQ,=N3DJT,=N3FUR,=N3GWR,=N3HQW,=N3RWD, + =N3VDM,=N3ZFY,=N4ERA,=N4ZIW,=N5IWF,=N5JKJ,=N6AI,=N6CGA,=N6DXW,=N6GOZ,=N6IKX,=N6KB,=N6NCT,=N6PJQ, + =N6QBK,=N6ZAB,=N7AMY,=N7BLC,=N7KZB,=N7NYY,=N7ODC,=N7TSV,=N7WBX,=N9CRQ,=N9GFL,=N9SBL,=NB6R,=NE7SO, + =NG1T,=NH2CC,=NH2CD,=NH2CF,=NH2CQ,=NH2CR,=NH2IB,=NH2IF,=NH2II,=NH2IJ,=NH2IO,=NH2JO,=NH2KF,=NH2KH, + =NH2YL,=NH2Z,=NI1J,=NL7UW,=NM2B,=NO0H,=NT0DA,=NT4AA,=NZ2F,=W0UNX,=W1BMB,=W2UNS,=W3ZRT,=W4YQS, + =W5FJG,=W6AUS,=W6CAG,=W6CWJ,=W6KEV,=W6KIT,=W6KPI,=W6MQB,=W6MRJ,=W6NBK,=W6ROM,=W6SHH,=W6UNX,=W7EHP, + =W7NVQ,=W7NX,=W7OO,=W7RCR,=W7UEA,=W8AYD,=W8JAY,=W8WH,=WA0FUR,=WA0NHD,=WA2AUI,=WA3ZEM,=WA6ECX, + =WA6IIQ,=WA6JDA,=WA6JJQ,=WA6QDQ,=WA6UVF,=WA7ESE,=WA7HEO,=WA7TFE,=WA7ZK,=WA8JQP,=WB0RUA,=WB0TZQ, + =WB2AHM,=WB2SQW,=WB4JTT,=WB4MNF,=WB5ZDH,=WB5ZOV,=WB6CVJ,=WB6PIO,=WB6PJT,=WB6SAA,=WB8NCD,=WB9SMM, + =WC6B,=WD0FTF,=WD0LFN,=WD6EZL,=WD6GHJ,=WD8LIB,=WD8OBO,=WH2Y,=WH7K,=WU0H,=WV0Z,=WV6K,=WX7G,=WY6F; Kure Island: 31: 61: OC: 29.00: 178.00: 10.0: KH7K: AH7K,KH7K,NH7K,WH7K; American Samoa: 32: 62: OC: -14.32: 170.78: 11.0: KH8: @@ -1660,47 +1665,47 @@ Wake Island: 31: 65: OC: 19.28: -166.63: -12.0: KH9: Alaska: 01: 01: NA: 61.40: 148.87: 8.0: KL: AL,KL,NL,WL,=AA0NN,=AA8FY,=AB0IC,=AB0WK,=AB5JB,=AB7YB,=AB7YO,=AB8XX,=AB9OM,=AC0CW,=AC9QX,=AD0DK, =AD0FQ,=AD0ZL,=AD3BJ,=AD6GC,=AD7MF,=AD7VV,=AE1DJ,=AE4QH,=AE5CP,=AE5EX,=AE5FN,=AE5IR,=AE7ES,=AE7KS, - =AE7SB,=AF7FV,=AG5LN,=AG5OF,=AH0AH,=AH0H,=AJ4ZI,=K0AZZ,=K0BHC,=K1BZD,=K1MAT,=K2ICW,=K2NPS,=K3JMI, - =K4ETC,=K4HOE,=K4RND,=K4WPK,=K5DOW,=K5HL,=K5RD,=K5RSO,=K5RZW,=K5TDN,=K5UBS,=K6ANE,=K6GKW,=K7EJM, - =K7GRW,=K7LOP,=K7MVX,=K7OCL,=K7RDR,=K7SGA,=K7UNX,=K7ZOA,=K8IEL,=K8OUA,=K9DUG,=K9WUV,=KA0SIM, - =KA0YPV,=KA1NCN,=KA2TJZ,=KA2ZSD,=KA6UGT,=KA7ETQ,=KA7HOX,=KA7JOR,=KA7TMU,=KA7TOM,=KA7UKN,=KA7VCR, - =KA7YEY,=KA9GYQ,=KB0APK,=KB0LOW,=KB0TSU,=KB0UGE,=KB0UVK,=KB1CRT,=KB1FCX,=KB1KLH,=KB1PHP,=KB1QCD, - =KB1QCE,=KB1SYV,=KB1WQL,=KB2JWV,=KB2ZME,=KB3CYB,=KB3JFK,=KB3NCR,=KB4DX,=KB5DNT,=KB5HEV,=KB5UWU, - =KB6DKJ,=KB7AMA,=KB7BNG,=KB7DEL,=KB7FXJ,=KB7IBI,=KB7JA,=KB7LJZ,=KB7LON,=KB7PHT,=KB7QLB,=KB7RXZ, - =KB7SIQ,=KB7UBH,=KB7VFZ,=KB7YEC,=KB7ZVZ,=KB8QKR,=KB8SBG,=KB8TEW,=KB8VYJ,=KB9MWG,=KB9RWE,=KB9RWJ, - =KB9YGR,=KC0ATI,=KC0CWG,=KC0CYR,=KC0EF,=KC0GHH,=KC0NSV,=KC0OKQ,=KC0PSZ,=KC0TK,=KC0TZL,=KC0UYK, - =KC0VDN,=KC0WSG,=KC0YSW,=KC1DL,=KC2BYX,=KC2GVS,=KC2HRV,=KC2KMU,=KC2OJP,=KC2PCV,=KC2PIO,=KC3DBK, - =KC4MXQ,=KC4MXR,=KC5BNN,=KC5CHO,=KC5DJA,=KC5KIG,=KC5LKF,=KC5LKG,=KC5QPJ,=KC5THY,=KC5YIB,=KC5YOX, - =KC5ZAA,=KC6RJW,=KC7BUL,=KC7COW,=KC7ENM,=KC7FWK,=KC7GSO,=KC7HJM,=KC7HPF,=KC7IKE,=KC7IKF,=KC7INC, - =KC7MIJ,=KC7MPY,=KC7MRO,=KC7OQZ,=KC7PLJ,=KC7PLQ,=KC7RCP,=KC7TYT,=KC7UZY,=KC7WOA,=KC7YZR,=KC8BKP, - =KC8GKK,=KC8NMN,=KC8NOY,=KC8WWS,=KC8YIV,=KC9CMY,=KC9HIK,=KC9VLD,=KD0CLU,=KD0CZC,=KD0DHU,=KD0FJG, - =KD0JJB,=KD0NSG,=KD0VAK,=KD0VAL,=KD0VGF,=KD0ZOD,=KD2CTE,=KD2GKT,=KD4EYW,=KD4MEY,=KD4QJL,=KD5DNA, - =KD5DWV,=KD5GAL,=KD5QPD,=KD5RVD,=KD5WCF,=KD5WEV,=KD6DLB,=KD6RVY,=KD6YKS,=KD7APU,=KD7AWK,=KD7BBX, - =KD7BGP,=KD7DIG,=KD7DUQ,=KD7FGL,=KD7FUL,=KD7GFG,=KD7HXF,=KD7KRK,=KD7MGO,=KD7QAR,=KD7SIX,=KD7TWB, - =KD7UAG,=KD7VOI,=KD7VXE,=KD7ZTJ,=KD8BVD,=KD8DDY,=KD8GEL,=KD8GMS,=KD8JOU,=KD8LNA,=KD8WMX,=KD9TK, - =KE0DYM,=KE0KKI,=KE4DGR,=KE4MQD,=KE4YEI,=KE4YLG,=KE5CVD,=KE5CVT,=KE5DQV,=KE5FOC,=KE5GEB,=KE5HHR, - =KE5JHS,=KE5JTB,=KE5NLG,=KE5QDI,=KE5QDJ,=KE5QDK,=KE5VPO,=KE5ZRK,=KE5ZUM,=KE6DLM,=KE6DUJ,=KE6DXH, - =KE6IPM,=KE6SYD,=KE6TCE,=KE6VUB,=KE7DFO,=KE7ELL,=KE7EOP,=KE7EPZ,=KE7FNC,=KE7FXM,=KE7GOE,=KE7HMJ, - =KE7KYU,=KE7TRX,=KE8RO,=KF4JET,=KF4PLR,=KF4TBD,=KF4YFD,=KF5CVM,=KF5FJQ,=KF5HFB,=KF5HJC,=KF5NDT, - =KF5NHR,=KF5YYK,=KF6AWG,=KF6AXS,=KF6BMF,=KF6BOV,=KF6EJR,=KF6GNM,=KF6IAO,=KF6ILC,=KF6IOT,=KF6LGK, - =KF6MFK,=KF6QOJ,=KF6RMG,=KF6RPC,=KF6SHS,=KF6TGR,=KF6UWT,=KF7GKY,=KF7LEX,=KF7LUA,=KF7PCJ,=KF7PFT, - =KF7PSS,=KF7PUQ,=KF7UFY,=KF7VBO,=KF8ZB,=KG2IA,=KG4BBX,=KG4NBL/P,=KG4TJS,=KG4WNZ,=KG5EQN,=KG5GDF, - =KG5GTD,=KG5JQC,=KG5MIB,=KG6DTI,=KG6MBC,=KG6RJE,=KG6TAL,=KG7CUR,=KG7DVI,=KG7GJL,=KG7JVJ,=KG7OQC, - =KG7SEQ,=KG7TGE,=KH0NF,=KH0NG,=KH0RF,=KH2YN,=KH7BW,=KH7DA,=KI4COG,=KI4ERC,=KI4GAG,=KI4GCF,=KI4GDI, - =KI4NGY,=KI4NVI,=KI4SET,=KI4SOM,=KI6BGR,=KI6DES,=KI6HGW,=KI7COR,=KI7PZ,=KI8JT,=KJ4HEW,=KJ4IAQ, - =KJ4PSV,=KJ4WDI,=KJ4WIQ,=KJ4ZWI,=KJ6KRG,=KJ6ZSX,=KJ7IR,=KK4AMV,=KK4CLS,=KK4LRE,=KK4QXE,=KK4RYG, - =KK4WWH,=KK4WWI,=KK6IUY,=KK6PGV,=KK7I,=KK7IV,=KK7STL,=KL7D/M,=KL7NC/IMD,=KM4AGL,=KM4KWS,=KM4KX, - =KM4NIC,=KM4OE,=KM4PJH,=KM4TJI,=KN8IVE,=KR4WV,=KV3X,=KW1W,=KY7J,=KZ6HJC,=N0GDT,=N0GDU,=N0GLI, - =N0HJT,=N0HYI,=N0HZF,=N0JEN,=N0LHN,=N0SN,=N0SUB,=N0WXJ,=N0XKY,=N0XS,=N0ZKV,=N1HUT,=N1KDQ,=N1KTI, - =N1NDA,=N1NJS,=N1QFE,=N1TX,=N2CXH,=N2SHO,=N2TJY,=N2YZW,=N3QEH,=N4AVX,=N4CM,=N4HCJ,=N4HZU,=N4NAV, - =N5CSO,=N5UKX,=N5WPR,=N6BSC,=N6CVV,=N6CZU,=N6JM,=N7BUO,=N7DBN,=N7FCT,=N7HER,=N7HQK,=N7IA,=N7JUX, - =N7MGT,=N7MTG,=N7PHB,=N7QAN,=N7TBU,=N7UTV,=N7UWT,=N7XNM,=N7YKY,=N7YQS,=N7ZYS,=N8DDY,=N8EX,=N8JKB, - =N8KCJ,=N8SUG,=N9AIG,=N9FB,=N9YD,=NA7WM,=NC4OI,=NE7EK,=NH2GZ,=NH7UO,=NJ7H,=NN4NN,=NP4FU,=NW4G, - =NW7F,=W0EZM,=W0FJN,=W0RWS,=W0UZJ,=W1LYD,=W1RSC,=W1ZKA,=W2DLS,=W2KRZ,=W3JPN,=W4AUL,=W4BMR,=W4LS, - =W4RSB,=W5JKT,=W6DDP,=W6GTE,=W6ROW,=W7APM,=W7DDG,=W7EIK,=W7JMR,=W7PWA,=W7RAZ,=W7ROS,=W7WEZ,=W7ZWT, - =W8MDD,=W8PVZ,=W8TCX,=W9ITU,=W9JMC,=WA0JS,=WA1FVJ,=WA2BGL,=WA2BIW,=WA6GFS,=WA7B,=WA7PXH,=WA7USX, - =WA7YXF,=WB0CMZ,=WB1GZL,=WB1ILS,=WB6COP,=WB7TYK,=WB9JZL,=WD6CET,=WH6CYY,=WH6DPL,=WH6DX,=WH7AK, - =WJ8M,=WP4IYI,=WT5T,=WX1NCC; + =AE7SB,=AF7FV,=AG5LN,=AG5OF,=AH0AH,=AH0H,=AJ4ZI,=K0AZZ,=K0BHC,=K1BZD,=K1KAO,=K1MAT,=K2ICW,=K2NPS, + =K3JMI,=K4DRC,=K4ETC,=K4HOE,=K4RND,=K4WPK,=K5DOW,=K5HL,=K5RD,=K5RSO,=K5RZW,=K5TDN,=K5UBS,=K6ANE, + =K6GKW,=K7EJM,=K7GRW,=K7LOP,=K7MVX,=K7OCL,=K7RDR,=K7SGA,=K7UNX,=K7ZOA,=K8IEL,=K8OUA,=K9DUG,=K9WUV, + =KA0SIM,=KA0YPV,=KA1NCN,=KA2TJZ,=KA2ZSD,=KA6UGT,=KA7ETQ,=KA7HOX,=KA7JOR,=KA7TMU,=KA7TOM,=KA7UKN, + =KA7VCR,=KA7YEY,=KA9GYQ,=KB0APK,=KB0LOW,=KB0TSU,=KB0UGE,=KB0UVK,=KB1CRT,=KB1FCX,=KB1KLH,=KB1PHP, + =KB1QCD,=KB1QCE,=KB1SYV,=KB1WQL,=KB2JWV,=KB2ZME,=KB3CYB,=KB3JFK,=KB3NCR,=KB3VQE,=KB4DX,=KB5DNT, + =KB5HEV,=KB5UWU,=KB6DKJ,=KB7AMA,=KB7BNG,=KB7DEL,=KB7FXJ,=KB7IBI,=KB7JA,=KB7LJZ,=KB7LON,=KB7PHT, + =KB7QLB,=KB7RXZ,=KB7SIQ,=KB7UBH,=KB7VFZ,=KB7YEC,=KB7ZVZ,=KB8QKR,=KB8SBG,=KB8TEW,=KB8VYJ,=KB9MWG, + =KB9RWE,=KB9RWJ,=KB9YGR,=KC0ATI,=KC0CWG,=KC0CYR,=KC0EF,=KC0GHH,=KC0LLL,=KC0NSV,=KC0OKQ,=KC0PSZ, + =KC0TK,=KC0TZL,=KC0UYK,=KC0VDN,=KC0WSG,=KC0YSW,=KC1DL,=KC2BYX,=KC2GVS,=KC2HRV,=KC2KMU,=KC2OJP, + =KC2PCV,=KC2PIO,=KC3DBK,=KC4MXQ,=KC4MXR,=KC5BNN,=KC5CHO,=KC5DJA,=KC5KIG,=KC5LKF,=KC5LKG,=KC5QPJ, + =KC5THY,=KC5YIB,=KC5YOX,=KC5ZAA,=KC6RJW,=KC7BUL,=KC7COW,=KC7ENM,=KC7FWK,=KC7GSO,=KC7HJM,=KC7HPF, + =KC7IKE,=KC7IKF,=KC7INC,=KC7MIJ,=KC7MPY,=KC7MRO,=KC7OQZ,=KC7PLJ,=KC7PLQ,=KC7RCP,=KC7TYT,=KC7UZY, + =KC7WOA,=KC7YZR,=KC8GKK,=KC8NMN,=KC8NOY,=KC8WWS,=KC8YIV,=KC9CMY,=KC9HIK,=KC9VLD,=KD0CLU,=KD0CZC, + =KD0DHU,=KD0FJG,=KD0JJB,=KD0NSG,=KD0VAK,=KD0VAL,=KD0VGF,=KD0ZOD,=KD2CTE,=KD2GKT,=KD4EYW,=KD4MEY, + =KD4QJL,=KD5DNA,=KD5DWV,=KD5GAL,=KD5QPD,=KD5RVD,=KD5WCF,=KD5WEV,=KD5WYP,=KD6DLB,=KD6RVY,=KD6YKS, + =KD7APU,=KD7AWK,=KD7BBX,=KD7BGP,=KD7DIG,=KD7DUQ,=KD7FGL,=KD7FUL,=KD7GFG,=KD7HXF,=KD7KRK,=KD7MGO, + =KD7QAR,=KD7SIX,=KD7TWB,=KD7UAG,=KD7VOI,=KD7VXE,=KD7ZTJ,=KD8BVD,=KD8DDY,=KD8GEL,=KD8GMS,=KD8JOU, + =KD8LNA,=KD8WMX,=KD9TK,=KE0DYM,=KE0KKI,=KE4DGR,=KE4MQD,=KE4YEI,=KE4YLG,=KE5CVD,=KE5CVT,=KE5DQV, + =KE5FOC,=KE5GEB,=KE5HHR,=KE5JHS,=KE5JTB,=KE5NLG,=KE5QDI,=KE5QDJ,=KE5QDK,=KE5VPO,=KE5ZRK,=KE5ZUM, + =KE6DLM,=KE6DUJ,=KE6DXH,=KE6IPM,=KE6SYD,=KE6TCE,=KE6VUB,=KE7DFO,=KE7ELL,=KE7EOP,=KE7EPZ,=KE7FNC, + =KE7FXM,=KE7GOE,=KE7HMJ,=KE7KYU,=KE7TRX,=KE8RO,=KF4JET,=KF4PLR,=KF4TBD,=KF4YFD,=KF5CVM,=KF5FJQ, + =KF5HFB,=KF5HJC,=KF5NDT,=KF5NHR,=KF5YYK,=KF6AWG,=KF6AXS,=KF6BMF,=KF6BOV,=KF6EJR,=KF6GNM,=KF6IAO, + =KF6ILC,=KF6IOT,=KF6LGK,=KF6MFK,=KF6QOJ,=KF6RMG,=KF6RPC,=KF6SHS,=KF6TGR,=KF6UWT,=KF7GKY,=KF7LEX, + =KF7LUA,=KF7PCJ,=KF7PFT,=KF7PSS,=KF7PUQ,=KF7UFY,=KF7VBO,=KF8ZB,=KG2IA,=KG4BBX,=KG4NBL/P,=KG4TJS, + =KG4WNZ,=KG5EQN,=KG5GDF,=KG5GTD,=KG5JQC,=KG5MIB,=KG6DTI,=KG6MBC,=KG6RJE,=KG6TAL,=KG7CUR,=KG7DVI, + =KG7GJL,=KG7JVJ,=KG7OQC,=KG7SEQ,=KG7TGE,=KH0NF,=KH0NG,=KH0RF,=KH2YN,=KH7BW,=KH7DA,=KI4COG,=KI4ERC, + =KI4GAG,=KI4GCF,=KI4GDI,=KI4NGY,=KI4NVI,=KI4SET,=KI4SOM,=KI6BGR,=KI6DES,=KI6HGW,=KI6YXZ,=KI7COR, + =KI7PZ,=KI8JT,=KJ4HEW,=KJ4IAQ,=KJ4PSV,=KJ4WDI,=KJ4WIQ,=KJ4ZWI,=KJ6KRG,=KJ6ZSX,=KJ7IR,=KK4AMV, + =KK4CLS,=KK4LRE,=KK4QXE,=KK4RYG,=KK4WWH,=KK4WWI,=KK6IUY,=KK6PGV,=KK7I,=KK7IV,=KK7STL,=KL7D/M, + =KL7NC/IMD,=KM4AGL,=KM4KWS,=KM4KX,=KM4NIC,=KM4OE,=KM4PJH,=KM4TJI,=KN8IVE,=KR4WV,=KV3X,=KW1W,=KY7J, + =KZ6HJC,=N0GDT,=N0GDU,=N0GLI,=N0HJT,=N0HYI,=N0HZF,=N0JEN,=N0LHN,=N0SN,=N0SUB,=N0WXJ,=N0XKY,=N0XS, + =N0ZKV,=N1HEN,=N1HUT,=N1KDQ,=N1KTI,=N1NDA,=N1NJS,=N1QFE,=N1TX,=N2CXH,=N2SHO,=N2TJY,=N2YZW,=N3QEH, + =N4AVX,=N4CM,=N4HCJ,=N4HZU,=N4NAV,=N5CSO,=N5UKX,=N5WPR,=N6BSC,=N6CVV,=N6CZU,=N6JM,=N7BUO,=N7DBN, + =N7FCT,=N7HER,=N7HQK,=N7IA,=N7JUX,=N7MGT,=N7MTG,=N7PHB,=N7QAN,=N7TBU,=N7UTV,=N7UWT,=N7XNM,=N7YKY, + =N7YQS,=N7ZYS,=N8DDY,=N8EX,=N8JKB,=N8KCJ,=N8SUG,=N9AIG,=N9FB,=N9YD,=NA7WM,=NC4OI,=NE7EK,=NH2GZ, + =NH7UO,=NJ7H,=NM0H,=NN4NN,=NP4FU,=NW4G,=NW7F,=W0EZM,=W0FJN,=W0RWS,=W0UZJ,=W1LYD,=W1RSC,=W1ZKA, + =W2DLS,=W2KRZ,=W3JPN,=W4AUL,=W4BMR,=W4LS,=W4RSB,=W5JKT,=W6DDP,=W6GTE,=W6ROW,=W7APM,=W7DDG,=W7EIK, + =W7JMR,=W7PWA,=W7RAZ,=W7ROS,=W7WEZ,=W7ZWT,=W8MDD,=W8PVZ,=W8TCX,=W9ITU,=W9JMC,=WA0JS,=WA1FVJ, + =WA2BGL,=WA2BIW,=WA6GFS,=WA7B,=WA7PXH,=WA7USX,=WA7YXF,=WB0CMZ,=WB1GZL,=WB1ILS,=WB6COP,=WB7TYK, + =WB9JZL,=WD6CET,=WH6CYY,=WH6DPL,=WH6DX,=WH7AK,=WJ8M,=WP4IYI,=WT5T,=WX1NCC; Navassa Island: 08: 11: NA: 18.40: 75.00: 5.0: KP1: KP1,NP1,WP1; US Virgin Islands: 08: 11: NA: 17.73: 64.80: 4.0: KP2: @@ -1714,18 +1719,18 @@ Puerto Rico: 08: 11: NA: 18.18: 66.55: 4.0: KP4: =K5YJR,=K6BOT,=K9JOS,=KA2GNG,=KA2MBR,=KA2YGB,=KA3ZGQ,=KA7URH,=KA9UTY,=KB0AQB,=KB0TEP,=KB1IJU, =KB1KDP,=KB1RUQ,=KB1TUA,=KB1UEK,=KB1UZV,=KB1ZKF,=KB2ALR,=KB2CIE,=KB2KWB,=KB2MMX,=KB2NMT,=KB2NYN, =KB2OIF,=KB2OMN,=KB2OPM,=KB2RYP,=KB2TID,=KB2VHY,=KB2WKT,=KB2YKJ,=KB3BPK,=KB3BTN,=KB3LUV,=KB3SBO, - =KB8ZVP,=KB9OWX,=KB9RZD,=KB9YVE,=KB9YVF,=KC1CRV,=KC1CUF,=KC1DRV,=KC1IHB,=KC1IHO,=KC1JLY,=KC2BZZ, - =KC2CJL,=KC2CTM,=KC2EMM,=KC2ERU,=KC2JNE,=KC2LET,=KC2TE,=KC2UXP,=KC2VCR,=KC3GEO,=KC5DKT,=KC8BFN, - =KC8IRI,=KD2KPC,=KD2VQ,=KD4TVS,=KD5DVV,=KD5PKH,=KD9GIZ,=KE0AYJ,=KE0GFK,=KE0SH,=KE1MA,=KE3WW, - =KE4GGD,=KE4GYA,=KE4SKH,=KE4THL,=KE4WUE,=KE5LNG,=KF4KPO,=KF4ZDB,=KF6OGJ,=KG4GYO,=KG4IRC,=KG4IVO, - =KG4VCC,=KG5AFY,=KH2RU,=KH4AA,=KI4LRJ,=KI4WOA,=KI4WOB,=KJ4LOZ,=KJ4UPN,=KJ6OV,=KK4AOZ,=KK4DCX, - =KK4EBE,=KK4PHB,=KM4VDZ,=KM4WGI,=KM4YBN,=KM4YSR,=KM4ZJW,=KM6CTO,=KN4AWH,=KN4GNO,=KN4IBD,=KN4IDV, - =KN4IGP,=KN4ILO,=KN4INP,=KN4JCC,=KN4KPX,=KN4KPY,=KN4MNT,=KN4NLZ,=KN4ODN,=KN4QBT,=KN4QZZ,=KN4REC, - =KN4SKZ,=KP2H,=KP2Z,=KP3CW/SKP,=KP3RE/LGT,=KP3RE/LH,=KP3RE/LT,=KP4ES/L,=KP4ES/LGT,=KP4ES/LH, - =KP4FD/IARU,=KP4FRD/LH,=KP4MD/P,=KP4VP/LH,=N0XAR,=N1CN,=N1HRV,=N1JFL,=N1QVU,=N1SCD,=N1SZM,=N1VCW, - =N1YAY,=N1ZJC,=N2KKN,=N2KUE,=N2PGO,=N3JAM,=N3VIJ,=N3YUB,=N3ZII,=N4CIE,=N4JZD,=N4LER,=N4UK,=N6NVD, - =N6RHF,=NB0G,=NP3M/LH,=NP4VO/LH,=W1AW/PR,=W6WAW,=W9JS,=WA2RVA,=WB2HMY,=WB5YOF,=WB7ADC,=WB7VVV, - =WD4LOL,=WP4L/TP,=WR8Z; + =KB8ZVP,=KB9OWX,=KB9RZD,=KB9YVE,=KB9YVF,=KC1CRV,=KC1CUF,=KC1DRV,=KC1IHB,=KC1IHO,=KC1JLY,=KC1KZI, + =KC2BZZ,=KC2CJL,=KC2CTM,=KC2EMM,=KC2ERU,=KC2JNE,=KC2LET,=KC2TE,=KC2UXP,=KC2VCR,=KC3GEO,=KC5DKT, + =KC8BFN,=KC8IRI,=KD2KPC,=KD2VQ,=KD4TVS,=KD5DVV,=KD5PKH,=KD9GIZ,=KE0AYJ,=KE0GFK,=KE0SH,=KE1MA, + =KE3WW,=KE4GGD,=KE4GYA,=KE4SKH,=KE4THL,=KE4WUE,=KE5LNG,=KF4KPO,=KF4ZDB,=KF6OGJ,=KG4GYO,=KG4IRC, + =KG4IVO,=KG4VCC,=KG5AFY,=KH2RU,=KH4AA,=KI4LRJ,=KI4WOA,=KI4WOB,=KJ4LOZ,=KJ4UPN,=KJ6OV,=KK4AOZ, + =KK4DCX,=KK4EBE,=KK4PHB,=KM4VDZ,=KM4WGI,=KM4YBN,=KM4YSR,=KM4ZJW,=KM6CTO,=KN4AWH,=KN4GNO,=KN4IBD, + =KN4IDV,=KN4IGP,=KN4ILO,=KN4INP,=KN4JCC,=KN4KPX,=KN4KPY,=KN4MNT,=KN4NLZ,=KN4ODN,=KN4QBT,=KN4QZZ, + =KN4REC,=KN4SKZ,=KP2H,=KP2Z,=KP3CW/SKP,=KP3RE/LGT,=KP3RE/LH,=KP3RE/LT,=KP4ES/L,=KP4ES/LGT, + =KP4ES/LH,=KP4FD/IARU,=KP4FRD/LH,=KP4MD/P,=KP4VP/LH,=N0XAR,=N1CN,=N1HRV,=N1JFL,=N1QVU,=N1SCD, + =N1SZM,=N1VCW,=N1YAY,=N1ZJC,=N2KKN,=N2KUE,=N2PGO,=N3JAM,=N3VIJ,=N3YUB,=N3ZII,=N4CIE,=N4JZD,=N4LER, + =N4UK,=N6NVD,=N6RHF,=NB0G,=NP3M/LH,=NP4VO/LH,=W1AW/PR,=W6WAW,=W9JS,=WA2RVA,=WB2HMY,=WB5YOF, + =WB7ADC,=WB7VVV,=WD4LOL,=WP4L/TP,=WR8Z; Desecheo Island: 08: 11: NA: 18.08: 67.88: 4.0: KP5: KP5,NP5,WP5; Norway: 14: 18: EU: 61.00: -9.00: -1.0: LA: @@ -1799,7 +1804,7 @@ Argentina: 13: 14: SA: -34.80: 65.92: 3.0: LU: =LW2DET/D,=LW2DJM/D,=LW2DNC/D,=LW2DOD/D,=LW2DOM/D,=LW2DSM/D,=LW2DX/E,=LW2DYA/D,=LW2ECK/D, =LW2ECM/D,=LW2EFS/D,=LW2EHD/D,=LW2ENB/D,=LW2EQS/D,=LW2EUA/D,=LW3DAB/D,=LW3DBM/D,=LW3DC/D, =LW3DED/D,=LW3DER/D,=LW3DFP/D,=LW3DG/D,=LW3DGC/D,=LW3DJC/D,=LW3DKC/D,=LW3DKC/E,=LW3DKO/D, - =LW3DKO/E,=LW3DN/D,=LW3DRW/D,=LW3DSR/D,=LW3DTD/D,=LW3EIH/D,=LW3EMP/D,=LW4DAF/D,=LW4DBE/D, + =LW3DKO/E,=LW3DN/D,=LW3DRW/D,=LW3DSR/D,=LW3DTD/D,=LW3EIH/D,=LW3EK/D,=LW3EMP/D,=LW4DAF/D,=LW4DBE/D, =LW4DBM/D,=LW4DCV/D,=LW4DKI/D,=LW4DOR/D,=LW4DRH/D,=LW4DRH/E,=LW4DRV/D,=LW4DTM/D,=LW4DTR/D, =LW4DWV/D,=LW4DXH/D,=LW4ECV/D,=LW4EIN/D,=LW4EM/D,=LW4EM/E,=LW4EM/LH,=LW4ERO/D,=LW4ESY/D,=LW4ETG/D, =LW4EZT/D,=LW4HCL/D,=LW5DAD/D,=LW5DD/D,=LW5DFR/D,=LW5DHG/D,=LW5DIE/D,=LW5DLY/D,=LW5DNN/D, @@ -1841,8 +1846,8 @@ Argentina: 13: 14: SA: -34.80: 65.92: 3.0: LU: =LU7JMS/J,=LU7JR/J,=LU7JRM/J,=LU8JOP/J,=LU9JLV/J,=LU9JMG/J,=LU9JPR/J,=LU9YB/J,=LW2DRJ/J,=LW3EMP/J, =LU1KWC/K,=LU2KLC/K,=LU4KC/K,=LU5OM/K,=LU6KAQ/K,=LU7KHB/K,=LU7KT/K,=LU8KE/K,=LW1EVO/K,=LW3DFP/K, =LU1AAS/L,=LU1DZ/L,=LU1LAA/L,=LU1LT/L,=LU1LTL/L,=LU2LDB/L,=LU3AYE/L,=LU4AGC/L,=LU4EFC/L,=LU4LAD/L, - =LU4LBU/L,=LU4LMA/L,=LU5FZ/L,=LU5ILA/L,=LU5LAE/L,=LU5LBV/L,=LU6JRA/L,=LU8IEZ/L,=LU8LFV/L,=LU9JX/L, - =LU9LEW/L,=LU9LZY/L,=LU9LZZ/L,=LU9XPA/L,=LW3EMP/L,=LW8DTO/L, + =LU4LBU/L,=LU4LMA/L,=LU5FZ/L,=LU5ILA/L,=LU5LAE/L,=LU5LBV/L,=LU6JRA/L,=LU8IEZ/L,=LU8LFV/L, + =LU9GOY/L,=LU9JX/L,=LU9LEW/L,=LU9LZY/L,=LU9LZZ/L,=LU9XPA/L,=LW3EMP/L,=LW8DTO/L, =LU3PCJ/MA,=LW4DBE/MA, =LU2DSV/N,=LU3AAL/N,=LU5BE/N,=LU5FZ/N,=LU8EFF/N,=LW5DR/N, =LU1HZY/O,=LU1XS/O,=LU2HON/O,=LU3HL/O,=LU4AA/O,=LU5BOJ/O,=LU5OD/O,=LU6FEC/O,=LU6HWT/O,=LU8OAH/O, @@ -2246,19 +2251,18 @@ Cote d'Ivoire: 35: 46: AF: 7.58: 5.80: 0.0: TU: Benin: 35: 46: AF: 9.87: -2.25: -1.0: TY: TY; Mali: 35: 46: AF: 18.00: 2.58: 0.0: TZ: - TZ,=VERSION; + TZ; European Russia: 16: 29: EU: 53.65: -41.37: -4.0: UA: R,U,=R0CAF/1,=R25EMW(17)[19],=R7AB/M,=R7AB/P,=R80PSP,=R80UPOL,=R8CT/4/P,=R8FF/3/M,=R90DOSAAF, =R9AV/6,=R9FAZ/6/M,=R9FCH/6,=R9JI/1,=R9KC/6/M,=R9WR/1,=R9XAU/6,=RA0AM/6,=RA0BM/6,=RA0ZZ/3, - =RA2FDX/3,=RA3CQ/9/M(17)[20],=RA80SP,=RA9JR/3,=RA9JX/3,=RA9P/4,=RA9RT/3,=RA9UUY/6,=RA9YA/6, - =RC80SP,=RG0F/5,=RG50P(17),=RG50P/9(17)[30],=RJ80SP,=RK80X(17)[19],=RK8O/4,=RL9AA/6,=RM80SP, - =RM8A/4/M,=RM94AE,=RN9M/4,=RN9OI/3,=RO80RO,=RP61XX(17)[19],=RP62X(17)[19],=RP63X(17)[19], - =RP63XO(17)[19],=RP64X(17)[19],=RP65FPP(17)[30],=RP8X(17)[30],=RQ80SP,=RU0ZW/6,=RU2FB/3, - =RU2FB/3/P,=RU4SS/9(17)[30],=RU4WA/9(17)[30],=RV9LM/3,=RV9XX/3,=RW0IM/1,=RW0QE/6,=RW2F/6,=RW9FF/3, - =RW9W/3,=RW9W/4,=RX2FS/3,=RX9TC/1,=RX9UL/1,=RZ9AWN/6,=UA0AK/3,=UA0FQ/6,=UA0KBG/3,=UA0KBG/6, - =UA0KCX/3/P,=UA0KT/4,=UA0QNE/3,=UA0QNU/3,=UA0QQJ/3,=UA0UV/6,=UA0XAK/3,=UA0XAK/6,=UA0ZL/6, - =UA9CCO/6,=UA9CTT/3,=UA9CTT/6,=UA9FFS/1/MM,=UE23DKA,=UE6MAC/9(17),=UE95AE,=UE95E,=UE95ME,=UE96ME, - =UE99PS, + =RA3CQ/9/M(17)[20],=RA80SP,=RA9JR/3,=RA9JX/3,=RA9P/4,=RA9RT/3,=RA9UUY/6,=RA9YA/6,=RC80SP,=RG0F/5, + =RG50P(17),=RG50P/9(17)[30],=RJ80SP,=RK80X(17)[19],=RK8O/4,=RL9AA/6,=RM80SP,=RM8A/4/M,=RM94AE, + =RN9M/4,=RN9OI/3,=RO80RO,=RP61XX(17)[19],=RP62X(17)[19],=RP63X(17)[19],=RP63XO(17)[19], + =RP64X(17)[19],=RP65FPP(17)[30],=RP8X(17)[30],=RQ80SP,=RU0ZW/6,=RU2FB/3,=RU2FB/3/P, + =RU4SS/9(17)[30],=RU4WA/9(17)[30],=RV9LM/3,=RV9XX/3,=RW0IM/1,=RW0QE/6,=RW2F/6,=RW9FF/3,=RW9W/3, + =RW9W/4,=RX2FS/3,=RX9TC/1,=RX9UL/1,=RZ9AWN/6,=UA0AK/3,=UA0FQ/6,=UA0KBG/3,=UA0KBG/6,=UA0KCX/3/P, + =UA0KT/4,=UA0QNE/3,=UA0QNU/3,=UA0QQJ/3,=UA0UV/6,=UA0XAK/3,=UA0XAK/6,=UA0ZL/6,=UA9CCO/6,=UA9CTT/3, + =UA9CTT/6,=UA9FFS/1/MM,=UE23DKA,=UE6MAC/9(17),=UE95AE,=UE95E,=UE95ME,=UE96ME,=UE99PS, =R900BL,=R9J/1,=RA2FN/1,=RA9KU/1,=RA9KU/1/M,=RA9MC/1,=RA9SGI/1,=RK9XWV/1,=RL1O,=RM0L/1,=RM80DZ, =RN85AM,=RN85KN,=RT9T/1,=RU2FB/1,=RU9YT/1,=RU9YT/1/P,=RV1CC/M,=RW1AI/ANT,=RW8W/1,=RW9QA/1, =RX3AMI/1/LH,=UA1ADQ/ANT,=UA1BJ/ANT,=UA1JJ/ANT,=UA2FFX/1,=UA9B/1,=UA9KG/1,=UA9KGH/1,=UA9KK/1, @@ -2291,16 +2295,16 @@ European Russia: 16: 29: EU: 53.65: -41.37: -4.0: UA: UA1Z[19],UB1Z[19],UC1Z[19],UD1Z[19],UE1Z[19],UF1Z[19],UG1Z[19],UH1Z[19],UI1Z[19],=R25RRA[19], =RA9CFH/1[19],=RA9CFH/1/P[19],=RK21Z[19],=RK3DZJ/1/LH[19],=RM9WN/1[19],=RP72MU[19],=RP73MU[19], =RP73ZP[19],=RU1ZC/ANT[19],=RW1ZQ/LH[19],=RY83HN[19],=UB1ZBD/N[19], - =R01DTV/3,=R85PAR,=R870B,=R870C,=R870K,=R870M,=R870O,=R9FM/3,=RA2AT,=RA9CO/3,=RA9USU/3,=RC85MP, - =RL3AB/FF,=RT2F/3/M,=RT9K/3,=RW0LF/3,=RX9UL/3,=RX9WN/3,=RZ9UA/3,=UA0KCX/3,=UA3AV/ANT,=UA8AA/3, - =UA8AA/5,=UA9KHD/3,=UA9MDU/3,=UA9MRX/3,=UA9QCP/3,=UA9UAX/3,=UE24SU, + =R01DTV/3,=R85PAR,=R870B,=R870C,=R870K,=R870M,=R870O,=R9FM/3,=RA2AT,=RA2FDX/3,=RA9CO/3,=RA9USU/3, + =RC85MP,=RL3AB/FF,=RT2F/3/M,=RT9K/3,=RW0LF/3,=RX9UL/3,=RX9WN/3,=RZ9UA/3,=UA0KCX/3,=UA3AV/ANT, + =UA8AA/3,=UA8AA/5,=UA9KHD/3,=UA9MDU/3,=UA9MRX/3,=UA9QCP/3,=UA9UAX/3,=UB5O/M,=UE24SU, =R85QMR,=R85WDW,=R8B,=R8FF/3,=R90DNF,=R99FSB,=RA0BY/3,=RA80KEDR,=RA9KV/3,=RA9SB/3,=RA9XY/3, =RK3DSW/ANT,=RK3DWA/3/N,=RN9MD/3,=RT80KEDR,=RU0LM/3,=RU2FA/3,=RU3HD/ANT,=RV0AO/3,=RV9LM/3/P, =RW0IM/3,=RW3DU/N,=RW9UEW/3,=RX9SN/3,=RZ9SZ/3,=RZ9W/3,=UA0JAD/3,=UA0KCL/3,=UA0ZAZ/3,=UA9AJ/3/M, =UA9DD/3,=UA9HSI/3,=UA9ONJ/3,=UA9XGD/3,=UA9XMC/3,=UE23DSA,=UE25FO,=UE95GA,=UE96WS, =R80ORL,=UA0QGM/3,=UE80O,=UE80OL, =R0CAF/3,=R3GO/FF,=RM0L/3,=RN3GL/FF,=RN3GW/FF,=RT5G/P/FF,=RW0IW/3,=UA3GM/ANT,=UE90FL, - =RA9KT/3,=RZ9SZ/3/M,=UA0FHC/3,=UF2F/3/M, + =R0WX/P,=RA9KT/3,=RZ9SZ/3/M,=UA0FHC/3,=UF2F/3/M, =R0IA/3,=R863LC,=R863LK,=R863LX,=R875R,=R9XZ/3,=RG80KEDR,=RL80KEDR,=RN0CF/3,=RU9QRP/3,=RZ90W/3, =UA9JFM/3,=UA9XZ/3,=UE80G,=UE80V,=UE80YG, =RK3MXT/FF,=RV9AZ/3,=UA0AD/3, @@ -2376,7 +2380,7 @@ European Russia: 16: 29: EU: 53.65: -41.37: -4.0: UA: =R8FF/6,=R9DA/6,=RU9CK/6/P,=RV9CX/6/P,=UA9CES/6,=UA9FGR/6,=UA9WQK/6, =RU9CK/7/M,=RU9CK/7/P,=RV9CX/7/P,=UA9JFN/6/M, =RT9K/7/P,=RZ7G/6/FF, - =R01DTV/6,=RV9AB/6,=UB5O/M, + =R01DTV/6,=RV9AB/6, =R9MJ/6,=R9OM/5/P,=R9XT/6,=RA9KD/6,=RN9N/6,=RT9T/6,=RT9T/6/M,=RU2FB/5,=RU9WW/5/M,=RW9AW/5, =UA0LLM/5,=UA8WAA/5,=UA9CDC/6,=UA9UAX/5,=UE2KR,=UE98PW, =R8AEU/6,=R9MJ/6/M,=RN9N/6/M,=UB8ADI/5,=UB8ADI/6,=UE2SE, @@ -2402,10 +2406,10 @@ European Russia: 16: 29: EU: 53.65: -41.37: -4.0: UA: =R2014WOG(17)[30],=R20PRM(17)[30],=R2AG/9(17)[30],=R34CZF(17)[30],=R6DAB/9(17)[30], =R8CZ/4(17)[30],=R8CZ/4/M(17)[30],=R8CZ/M(17)[30],=R95FR(17)[30],=R9CZ/4(17)[30], =R9CZ/4/M(17)[30],=R9KC/4/M(17)[30],=R9KC/8/M(17)[30],=RA27FM(17)[30],=RA9XAI/4(17)[30], - =RC20FM(17)[30],=RD4M/9(17)[30],=RG50P/M(17)[30],=RP70PK(17)[30],=RP9FKU(17)[30],=RP9FTK(17)[30], - =RU27FQ(17)[30],=RU27FW(17)[30],=RU4W/9(17)[30],=RV22PM(17)[30],=RX9TX/9(17)[30],=RZ16FM(17)[30], - =RZ9WM/9(17)[30],=UA1ZQO/9(17)[30],=UA4NF/4/M(17)[30],=UA4WA/9(17)[30],=UA9CGL/4/M(17)[30], - =UA9CUA/4/M(17)[30],=UA9UAX/4(17)[30],=UE16SA(17)[30],=UE55PM(17)[30], + =RC20FM(17)[30],=RD4M/9(17)[30],=RG50P/M(17)[30],=RN9N/4(17)[30],=RP70PK(17)[30],=RP9FKU(17)[30], + =RP9FTK(17)[30],=RU27FQ(17)[30],=RU27FW(17)[30],=RU4W/9(17)[30],=RV22PM(17)[30],=RX9TX/9(17)[30], + =RZ16FM(17)[30],=RZ9WM/9(17)[30],=UA1ZQO/9(17)[30],=UA4NF/4/M(17)[30],=UA4WA/9(17)[30], + =UA9CGL/4/M(17)[30],=UA9CUA/4/M(17)[30],=UA9UAX/4(17)[30],=UE16SA(17)[30],=UE55PM(17)[30], =RW3TN/9(17)[30],=UE10SK(17)[30], R8X(17)[20],R9X(17)[20],RA8X(17)[20],RA9X(17)[20],RC8X(17)[20],RC9X(17)[20],RD8X(17)[20], RD9X(17)[20],RE8X(17)[20],RE9X(17)[20],RF8X(17)[20],RF9X(17)[20],RG8X(17)[20],RG9X(17)[20], @@ -2455,7 +2459,7 @@ Asiatic Russia: 17: 30: AS: 55.88: -84.08: -7.0: UA9: =RA4AAJ/9(18),=RD17CW(19),=RD1AL/0(40)[75],=RD3ARX/0/P(19),=RI18POL(40)[75],=RJ17WG,=RL19WF, =RM17NY,=RM19WF(18),=RN17CW,=RO19WF(19),=RQ17CW(18),=RQ17WG,=RQ4D/9(18),=RU17NY(18),=RV3PZ/9, =RW1AI/0(19),=RW55YG,=RX17WG(19),=RX55YG(18),=RX80SP(18),=RY1AAB/0/M(19),=RY80SP(19),=RZ17NY(19), - =RZ6A/9,=RZ9YI/9,=UA0ZDA/MM(29),=UA3DND/8,=UA3TT/8,=UE18M,=UE18U(18),=UE18Z(19), + =RZ6A/9,=RZ9YI/9,=UA0ZDA/MM(29),=UA3DND/8,=UA3TT/8,=UD6AOP/0(19),=UE18M,=UE18U(18),=UE18Z(19), =R100RG,=R120RG,=R2014Y,=R2015TL,=R20UFO,=R22SKE,=R280A,=R280B,=R3HD/9,=R3RRC/8,=R55TV,=R6RA/9, =R70PW,=R70PW/P,=R9SRR,=RA1AIP/9/P,=RA1AR/9,=RA1QR/9,=RA3WJ/9,=RA3XBN/9,=RA3ZM/8,=RA4FSC/9, =RA4HGN/9,=RA9SC/9,=RA9WJV/8/P,=RC20AB,=RC20AC,=RD3BN/9,=RD4CAQ/9,=RG110RAEM,=RJ17CW,=RK9SZZ/9, @@ -2654,8 +2658,8 @@ Asiatic Russia: 17: 30: AS: 55.88: -84.08: -7.0: UA9: =RA/IK5MIC/M(18)[31],=RA0CCJ/9(18)[31],=RA50VT(18)[31],=RK1B/9(18)[31],=RP68BP(18)[31], =RP68TZ(18)[31],=RP70AF(18)[31],=RP70BP(18)[31],=RP70GA(18)[31],=RP71BP(18)[31],=RP72BP(18)[31], =RP73BP(18)[31],=RP9Y(18)[31],=RP9YAF(18)[31],=RP9YTZ(18)[31],=RT73GM(18)[31],=RW22WG(18)[31], - =RX6AY/9(18)[31],=UA0LLW/9(18)[31],=UA0ZDY/9(18)[31],=UA9MA/M(18)[31],=UA9UAX/9/P(18)[31], - =UE0ZOO/9(18)[31],=UE44R/9(18)[31],=UE80AL(18)[31], + =RX6AY/9(18)[31],=UA0LLW/9(18)[31],=UA0ZDY/9(18)[31],=UA9UAX/9/P(18)[31],=UE0ZOO/9(18)[31], + =UE44R/9(18)[31],=UE80AL(18)[31], R8Z(18)[31],R9Z(18)[31],RA8Z(18)[31],RA9Z(18)[31],RC8Z(18)[31],RC9Z(18)[31],RD8Z(18)[31], RD9Z(18)[31],RE8Z(18)[31],RE9Z(18)[31],RF8Z(18)[31],RF9Z(18)[31],RG8Z(18)[31],RG9Z(18)[31], RJ8Z(18)[31],RJ9Z(18)[31],RK8Z(18)[31],RK9Z(18)[31],RL8Z(18)[31],RL9Z(18)[31],RM8Z(18)[31], @@ -2665,7 +2669,8 @@ Asiatic Russia: 17: 30: AS: 55.88: -84.08: -7.0: UA9: U8Z(18)[31],U9Z(18)[31],UA8Z(18)[31],UA9Z(18)[31],UB8Z(18)[31],UB9Z(18)[31],UC8Z(18)[31], UC9Z(18)[31],UD8Z(18)[31],UD9Z(18)[31],UE8Z(18)[31],UE9Z(18)[31],UF8Z(18)[31],UF9Z(18)[31], UG8Z(18)[31],UG9Z(18)[31],UH8Z(18)[31],UH9Z(18)[31],UI8Z(18)[31],UI9Z(18)[31], - =RA/IK5MIC/P(18)[31],=RC9YA/9/M(18)[31],=RW9MD/9/P(18)[31],=UA0KBG/9/P(18)[31],=UA9MAC/9(18)[31], + =RA/IK5MIC/P(18)[31],=RC9YA/9/M(18)[31],=RW9MD/9/P(18)[31],=UA0KBG/9/P(18)[31],=UA9MA/M(18)[31], + =UA9MAC/9(18)[31], R0A(18)[32],R0B(18)[32],R0H(18)[32],RA0A(18)[32],RA0B(18)[32],RA0H(18)[32],RC0A(18)[32], RC0B(18)[32],RC0H(18)[32],RD0A(18)[32],RD0B(18)[32],RD0H(18)[32],RE0A(18)[32],RE0B(18)[32], RE0H(18)[32],RF0A(18)[32],RF0B(18)[32],RF0H(18)[32],RG0A(18)[32],RG0B(18)[32],RG0H(18)[32], @@ -2723,11 +2728,12 @@ Asiatic Russia: 17: 30: AS: 55.88: -84.08: -7.0: UA9: RZ0F(19)[34],U0E(19)[34],U0F(19)[34],UA0E(19)[34],UA0F(19)[34],UB0E(19)[34],UB0F(19)[34], UC0E(19)[34],UC0F(19)[34],UD0E(19)[34],UD0F(19)[34],UE0E(19)[34],UE0F(19)[34],UF0E(19)[34], UF0F(19)[34],UG0E(19)[34],UG0F(19)[34],UH0E(19)[34],UH0F(19)[34],UI0E(19)[34],UI0F(19)[34], - =R10RLHA/0(19)[34],=R7AA/0(19)[34],=R7LP/0(19)[34],=R7MR/0(19)[34],=RA/KE5JA(19)[34], - =RA/OG2K(19)[34],=RA0SS/0(19)[34],=RA1ALA/0(19)[34],=RA4HKM/0(19)[34],=RA4HKM/0/P(19)[34], - =RA6ABC/0(19)[34],=RM0F(19)[34],=RN0F(19)[34],=RN1CR/0(19)[34],=RS0F(19)[34],=RT6A/0(19)[34], - =RV1CC/0(19)[34],=RZ3DW/0(19)[34],=RZ4HD/0(19)[34],=RZ55YG(19)[34],=RZ9ODD/0(19)[34], - =RZ9OWE/0(19)[34],=UA1ANA/0(19)[34],=UA3EDP/0(19)[34],=UB40FSU(19)[34],=UE1AAA/0(19)[34], + =R10RLHA/0(19)[34],=R26RRC(19)[34],=R7AA/0(19)[34],=R7LP/0(19)[34],=R7MR/0(19)[34], + =RA/KE5JA(19)[34],=RA/OG2K(19)[34],=RA0SS/0(19)[34],=RA1ALA/0(19)[34],=RA4HKM/0(19)[34], + =RA4HKM/0/P(19)[34],=RA6ABC/0(19)[34],=RM0F(19)[34],=RN0F(19)[34],=RN1CR/0(19)[34],=RS0F(19)[34], + =RT6A/0(19)[34],=RV1CC/0(19)[34],=RZ3DW/0(19)[34],=RZ4HD/0(19)[34],=RZ55YG(19)[34], + =RZ9ODD/0(19)[34],=RZ9OWE/0(19)[34],=UA1ANA/0(19)[34],=UA3EDP/0(19)[34],=UB40FSU(19)[34], + =UE1AAA/0(19)[34], =RV9WP/0(18)[22],=U0H/UA0AGQ(18)[22], R0I(19)[24],RA0I(19)[24],RC0I(19)[24],RD0I(19)[24],RE0I(19)[24],RF0I(19)[24],RG0I(19)[24], RI0I(19)[24],RJ0I(19)[24],RK0I(19)[24],RL0I(19)[24],RM0I(19)[24],RN0I(19)[24],RO0I(19)[24], @@ -2915,7 +2921,7 @@ Marshall Islands: 31: 65: OC: 9.08: -167.33: -12.0: V7: Brunei Darussalam: 28: 54: OC: 4.50: -114.60: -8.0: V8: V8; Canada: 05: 09: NA: 44.35: 78.75: 5.0: VE: - CF,CG,CJ,CK,VA,VB,VC,VE,VG,VX,VY9,XL,XM,=VE2EM/M,=VER20190327, + CF,CG,CJ,CK,VA,VB,VC,VE,VG,VX,VY9,XL,XM,=VE2EM/M,=VER20190416, =CF7AAW/1,=CK7IG/1,=VA3QSL/1,=VA3WR/1,=VE1REC/LH,=VE1REC/M/LH,=VE3RSA/1,=VE7IG/1, CF2[4],CG2[4],CJ2[4],CK2[4],VA2[4],VB2[4],VC2[4],VE2[4],VG2[4],VX2[4],XL2[4],XM2[4],=4Y1CAO[4], =CY2ZT/2[4],=VA3ELE/2[4],=VA3MPM/2[4],=VA7AQ/P[4],=VE2/G3ZAY/P[4],=VE2/M0BLF/P[4],=VE2FK[9], From 7de974a7ee2b237a86cea140c733815ecfa0a94f Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Mon, 29 Apr 2019 19:53:59 +0100 Subject: [PATCH 042/159] Fix settings acceptance jumping from FT8 to FT4 mode --- widgets/mainwindow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index b96240cba..7cb7ed2be 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -1751,7 +1751,7 @@ void MainWindow::on_actionSettings_triggered() //Setup Dialog bool b = vhf && (m_mode=="JT4" or m_mode=="JT65" or m_mode=="ISCAT" or m_mode=="JT9" or m_mode=="MSK144" or m_mode=="QRA64"); if(b) VHF_features_enabled(b); - if(m_mode=="FT4") on_actionFT8_triggered(); + if(m_mode=="FT4") on_actionFT4_triggered(); if(m_mode=="FT8") on_actionFT8_triggered(); if(m_mode=="JT4") on_actionJT4_triggered(); if(m_mode=="JT9") on_actionJT9_triggered(); From a8a1d8d0a7701610061e2e3e98c543e198aae981 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Tue, 30 Apr 2019 04:47:30 +0100 Subject: [PATCH 043/159] Add background colour to Log QSO buttons as stronger visual cue --- widgets/logqso.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/widgets/logqso.cpp b/widgets/logqso.cpp index eae82aacc..75ded8bca 100644 --- a/widgets/logqso.cpp +++ b/widgets/logqso.cpp @@ -41,6 +41,8 @@ LogQSO::LogQSO(QString const& programTitle, QSettings * settings ok_->setAutoDefault (false); ok_->setFocusPolicy (Qt::ClickFocus); + ok_->setStyleSheet ("background-color: green"); + cancel_->setStyleSheet ("background-color: red"); cancel_->setAutoDefault (false); ui->button_layout->addStretch (); ui->button_layout->addWidget (ok_); From 00d15d019e3188bb7e6527fbae92ff66cceddcd4 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Tue, 30 Apr 2019 07:48:47 -0400 Subject: [PATCH 044/159] Tweak label on Advanced tab to include FT4. --- Configuration.ui | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Configuration.ui b/Configuration.ui index 36a96d66f..9701fb633 100644 --- a/Configuration.ui +++ b/Configuration.ui @@ -2469,7 +2469,7 @@ Right click for insert and delete options. - Special operating activity: Generation of FT8 and MSK144 messages + Special operating activity: Generation of FT4, FT8, and MSK144 messages true @@ -3078,13 +3078,13 @@ Right click for insert and delete options. - - - - - + + + + + From 1347f523decb643e0104f7ad6a8f60fa5e7e0488 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Tue, 30 Apr 2019 09:17:34 -0400 Subject: [PATCH 045/159] Allow RRR message in Tx4, in FT4 mode, if not using contest-style messages. --- widgets/mainwindow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 7cb7ed2be..e27f6b881 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -4219,7 +4219,7 @@ void MainWindow::on_txrb4_doubleClicked () auto const& my_callsign = m_config.my_callsign (); auto is_compound = my_callsign != m_baseCall; m_send_RR73 = !((is_compound && !shortList (my_callsign)) || m_send_RR73); - if(m_mode=="FT4") m_send_RR73=true; + if(m_mode=="FT4" and (m_config.special_op_id()==SpecOp::RTTY)) m_send_RR73=true; genStdMsgs (m_rpt); } From b2d6238b63975f47f0d77907d0d05e16a171d113 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Tue, 30 Apr 2019 09:38:20 -0400 Subject: [PATCH 046/159] Fix a bug that caused FT4 to do WSPR band-hopping. --- widgets/mainwindow.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index e27f6b881..28823dab8 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -4108,8 +4108,7 @@ void MainWindow::stopTx2() on_stopTxButton_clicked (); m_nTx73 = 0; } - if(((m_mode.startsWith("WSPR") and m_ntr==-1) or m_mode=="FT4") and - !m_tuneup) { + if((m_mode.startsWith("WSPR") and m_ntr==-1) and !m_tuneup) { m_wideGraph->setWSPRtransmitted(); WSPR_scheduling (); m_ntr=0; From 0a12b34ec5554b62370c1fdfdc6c0e7b10390cd2 Mon Sep 17 00:00:00 2001 From: Steve Franke Date: Tue, 30 Apr 2019 08:54:42 -0500 Subject: [PATCH 047/159] Avoid a potential out-of-bounds error. --- lib/ft4/ft4_downsample.f90 | 2 +- lib/ft4/getcandidates4.f90 | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/ft4/ft4_downsample.f90 b/lib/ft4/ft4_downsample.f90 index 819b10fbc..d3760a506 100644 --- a/lib/ft4/ft4_downsample.f90 +++ b/lib/ft4/ft4_downsample.f90 @@ -38,7 +38,7 @@ subroutine ft4_downsample(dd,newdata,f0,c) endif i0=nint(f0/df) c1=0. - c1(0)=cx(i0) + if(i0.ge.0 .and. i0.le.NMAX/2) c1(0)=cx(i0) do i=1,NFFT2/2 if(i0+i.le.NMAX/2) c1(i)=cx(i0+i) if(i0-i.ge.0) c1(NFFT2-i)=cx(i0-i) diff --git a/lib/ft4/getcandidates4.f90 b/lib/ft4/getcandidates4.f90 index 5d42ca740..badbbcfb5 100644 --- a/lib/ft4/getcandidates4.f90 +++ b/lib/ft4/getcandidates4.f90 @@ -69,6 +69,7 @@ subroutine getcandidates4(dd,fa,fb,syncmin,nfqso,maxcand,savg,candidate, & del=0. if(den.ne.0.0) del=0.5*(savsm(i-1)-savsm(i+1))/den fpeak=(i+del)*df+f_offset + if(fpeak.lt.0.0 .or. fpeak.gt.4910.0) cycle speak=savsm(i) - 0.25*(savsm(i-1)-savsm(i+1))*del ncand=ncand+1 if(ncand.gt.maxcand) then From b29a6d14eae9de8a3f8a8996cf44b2dee3b98611 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Tue, 30 Apr 2019 15:13:26 +0100 Subject: [PATCH 048/159] Workaround for a crash on macOS when compiling with gfortran 8.3 --- lib/azdist.f90 | 11 +++-------- widgets/mainwindow.cpp | 4 ++-- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/lib/azdist.f90 b/lib/azdist.f90 index 2fd26c3d7..41a8fc5bc 100644 --- a/lib/azdist.f90 +++ b/lib/azdist.f90 @@ -1,7 +1,7 @@ -subroutine azdist(grid1,grid2,utch,nAz,nEl,nDmiles,nDkm,nHotAz,nHotABetter) +subroutine azdist(MyGrid,HisGrid,utch,nAz,nEl,nDmiles,nDkm,nHotAz,nHotABetter) - character*(*) grid1,grid2 - character*6 MyGrid,HisGrid,mygrid0,hisgrid0 + character(len=*) :: MyGrid,HisGrid + character*6 mygrid0,hisgrid0 real*8 utch,utch0 logical HotABetter,IamEast real eltab(22),daztab(22) @@ -12,11 +12,6 @@ subroutine azdist(grid1,grid2,utch,nAz,nEl,nDmiles,nDkm,nHotAz,nHotABetter) data mygrid0/" "/,hisgrid0/" "/,utch0/-999.d0/ save - MyGrid=grid1//' ' - HisGrid=grid2//' ' - if(ichar(MyGrid(5:5)).eq.0) MyGrid(5:6)=' ' - if(ichar(HisGrid(5:5)).eq.0) HisGrid(5:6)=' ' - if(MyGrid.eq.HisGrid) then naz=0 nel=0 diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 7cb7ed2be..98768c4d2 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -7550,8 +7550,8 @@ void MainWindow::p1ReadFromStdout() //p1readFromStdout if(grid!="") { double utch=0.0; int nAz,nEl,nDmiles,nDkm,nHotAz,nHotABetter; - azdist_(const_cast (m_config.my_grid ().toLatin1().constData()), - const_cast (grid.toLatin1().constData()),&utch, + azdist_(const_cast ((m_config.my_grid () + " ").left (6).toLatin1 ().constData ()), + const_cast ((grid + " ").left (6).toLatin1 ().constData ()),&utch, &nAz,&nEl,&nDmiles,&nDkm,&nHotAz,&nHotABetter,6,6); QString t1; if(m_config.miles()) { From b9e194b74f68cca2d9061d3d4a4d19409c45204e Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Tue, 30 Apr 2019 15:33:01 +0100 Subject: [PATCH 049/159] Revert to colouring just the OK Log QSO button to help with colour-blindness accessibility --- widgets/logqso.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/widgets/logqso.cpp b/widgets/logqso.cpp index 75ded8bca..b4b936d75 100644 --- a/widgets/logqso.cpp +++ b/widgets/logqso.cpp @@ -42,7 +42,6 @@ LogQSO::LogQSO(QString const& programTitle, QSettings * settings ok_->setAutoDefault (false); ok_->setFocusPolicy (Qt::ClickFocus); ok_->setStyleSheet ("background-color: green"); - cancel_->setStyleSheet ("background-color: red"); cancel_->setAutoDefault (false); ui->button_layout->addStretch (); ui->button_layout->addWidget (ok_); From c7a388f740825eeca316d53eac1185425de0e63d Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Tue, 30 Apr 2019 16:02:26 -0400 Subject: [PATCH 050/159] Send FT4 audio frequency to PSK Reporter. --- widgets/mainwindow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 28823dab8..c4e71aea8 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -3341,7 +3341,7 @@ void MainWindow::pskPost (DecodedText const& decodedtext) QString grid; decodedtext.deCallAndGrid(/*out*/deCall,grid); int audioFrequency = decodedtext.frequencyOffset(); - if(m_mode=="FT8" or m_mode=="MSK144") { + if(m_mode=="FT8" or m_mode=="MSK144" or m_mode=="FT4") { audioFrequency=decodedtext.string().mid(16,4).toInt(); } int snr = decodedtext.snr(); From 7f523d37f982715bb94e10cbec5fec80b4866db5 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Tue, 30 Apr 2019 23:05:54 +0100 Subject: [PATCH 051/159] Bump RC number --- Versions.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Versions.cmake b/Versions.cmake index 59af33460..f07339063 100644 --- a/Versions.cmake +++ b/Versions.cmake @@ -2,5 +2,5 @@ set (WSJTX_VERSION_MAJOR 2) set (WSJTX_VERSION_MINOR 1) set (WSJTX_VERSION_PATCH 0) -set (WSJTX_RC 5) # release candidate number, comment out or zero for development versions +set (WSJTX_RC 6) # release candidate number, comment out or zero for development versions set (WSJTX_VERSION_IS_RELEASE 0) # set to 1 for final release build From b5f0cc7ea7830790c5226a82f128b783dec44a26 Mon Sep 17 00:00:00 2001 From: Steve Franke Date: Tue, 30 Apr 2019 20:02:42 -0500 Subject: [PATCH 052/159] Add a third decoding pass. --- lib/ft4_decode.f90 | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/lib/ft4_decode.f90 b/lib/ft4_decode.f90 index b217dbb23..687a4ecc7 100644 --- a/lib/ft4_decode.f90 +++ b/lib/ft4_decode.f90 @@ -215,7 +215,7 @@ contains max_iterations=40 syncmin=1.2 dosubtract=.true. - nsp=2 + nsp=3 if(ndepth.lt.3) then nsp=1 dosubtract=.false. @@ -223,6 +223,14 @@ contains if(ndepth.eq.1) syncmin=2.0 do isp = 1,nsp + if(isp.eq.2) then + if(ndecodes.eq.0) exit + nd1=ndecodes + elseif(isp.eq.3) then + nd2=ndecodes-nd1 + if(nd2.eq.0) exit + endif + candidate=0.0 ncand=0 call timer('getcand4',0) @@ -495,6 +503,7 @@ contains endif nsnr=nint(max(-20.0,xsnr)) xdt=ibest/750.0 - 0.5 +!write(21,'(i6.6,i5,2x,f4.1,i6,2x,a37,2x,f4.1,3i3)') nutc,nsnr,xdt,nint(f0),message,sync,iaptype,ipass,isp call this%callback(sync,nsnr,xdt,f0,message,iaptype,qual) exit endif From fd3fb106d4bec8ccf6087224316eb2e305314504 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Wed, 1 May 2019 12:27:55 +0100 Subject: [PATCH 053/159] User Guide updates for 64-bit Windows --- doc/common/links.adoc | 1 + doc/user_guide/en/install-windows.adoc | 25 +++++++++++++++---------- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/doc/common/links.adoc b/doc/common/links.adoc index 85fdb1064..e886f551f 100644 --- a/doc/common/links.adoc +++ b/doc/common/links.adoc @@ -92,6 +92,7 @@ d). Edit lines as needed. Keeping them in alphabetic order help see dupes. :ubuntu_sdk: https://launchpad.net/~ubuntu-sdk-team/+archive/ppa[Ubuntu SDK Notice] :win_openssl_packages: https://slproweb.com/products/Win32OpenSSL.html[Windows OpenSSL Packages] :win32_openssl: https://slproweb.com/download/Win32OpenSSL_Light-1_0_2r.exe[Win32 OpenSSL Lite Package] +:win64_openssl: https://slproweb.com/download/Win64OpenSSL_Light-1_0_2r.exe[Win64 OpenSSL Lite Package] :writelog: https://writelog.com/[Writelog] :wsjt_yahoo_group: https://groups.yahoo.com/neo/groups/wsjtgroup/info[WSJT Group] :wsjtx: http://physics.princeton.edu/pulsar/K1JT/wsjtx.html[WSJT-X] diff --git a/doc/user_guide/en/install-windows.adoc b/doc/user_guide/en/install-windows.adoc index e3f75858c..5b8e06834 100644 --- a/doc/user_guide/en/install-windows.adoc +++ b/doc/user_guide/en/install-windows.adoc @@ -29,26 +29,31 @@ TIP: Your computer may be configured so that this directory is [[OPENSSL]] -* image:LoTW_TLS_error.png[_WSJT-X_ LoTW download TLS error, role="right"] - From this version onward _WSJT-X_ requires the _OpenSSL_ libraries - to be installed. Suitable libraries may already be installed on your +* image:LoTW_TLS_error.png[_WSJT-X_ LoTW download TLS error, + role="right"] _WSJT-X_ requires the _OpenSSL_ libraries to be + installed. Suitable libraries may already be installed on your system, if they are not you will see this error shortly after startup. To fix this you need to install the _OpenSSL_ libraries. ** You can download a suitable _OpenSSL_ package for from - {win_openssl_packages}, you need the latest *Win32 v1.0.2 Lite* - version (Note it is the Win32 package even if you are using a - 64-bit Windows operating system) which at the time of writing was - {win32_openssl}. + {win_openssl_packages}, you need the latest *Windows v1.0.2 Lite* + version. For the 32-bit _WSJT-X_ build use the Win32 version of the + _OpenSSL_ libraries, for the 64-bit _WSJT-X_ use the Win64 version + of the _OpenSSL_ libraries (Note it is OK to install both versions + on a 64-bit system) which at the time of writing were + {win32_openssl} and {win64_openssl} respectively. ** Install the package and accept the default options, including the - option to copy the _OpenSSL_ DLLs to the Windows system directory - (this is important). + + option to copy the _OpenSSL_ DLLs to the Windows system + directory. There is no obligation to donate to the _OpenSSL_ + project, un-check all the donation options if desired. + NOTE: If you still get the same network error after installing the _OpenSSL_ libraries then you also need to install the {msvcpp_redist} component. From the download page select - `vcredist_x86.exe` and run it to install. + `vcredist_x86.exe` for use with the 32-bit _WSJT-X_ build or + `vcredist_x64.exe` with the 64-bit build, then run it to + install. TIP: If you cannot install the _OpenSSL_ libraries or do not have an Internet connection on the computer used to run From 156f62d2fe55b349704c59a733e23234028d19db Mon Sep 17 00:00:00 2001 From: Steve Franke Date: Thu, 2 May 2019 11:39:18 -0500 Subject: [PATCH 054/159] 1. Fix array bounds mismatch in subroutine call that was the likely cause of Fortran crashes, and 2. open up DT search range to +/- 0.77s --- lib/ft4_decode.f90 | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/lib/ft4_decode.f90 b/lib/ft4_decode.f90 index 687a4ecc7..dc08df1b3 100644 --- a/lib/ft4_decode.f90 +++ b/lib/ft4_decode.f90 @@ -30,8 +30,7 @@ contains include 'ft4/ft4_params.f90' class(ft4_decoder), intent(inout) :: this procedure(ft4_decode_callback) :: callback - parameter (NSS=NSPS/NDOWN) - parameter (NZZ=18*3456) + parameter (NSS=NSPS/NDOWN,NDMAX=NMAX/NDOWN) character message*37,msgsent*37 character c77*77 character*37 decodes(100) @@ -42,8 +41,8 @@ contains character*6 hhmmss character*4 cqstr,cqstr0 - complex cd2(0:NZZ/NDOWN-1) !Complex waveform - complex cb(0:NZZ/NDOWN-1+NN*NSS) + complex cd2(0:NDMAX-1) !Complex waveform + complex cb(0:NDMAX-1) complex cd(0:NN*NSS-1) !Complex waveform complex ctwk(2*NSS),ctwk2(2*NSS,-16:16) complex csymb(NSS) @@ -52,7 +51,7 @@ contains real bmeta(2*NN),bmetb(2*NN),bmetc(2*NN) real a(5) - real dd(NZZ) + real dd(NMAX) real llr(2*ND),llra(2*ND),llrb(2*ND),llrc(2*ND),llrd(2*ND) real s2(0:255) real candidate(3,100) @@ -61,7 +60,7 @@ contains integer apbits(2*ND) integer apmy_ru(28),aphis_fd(28) integer icos4a(0:3),icos4b(0:3),icos4c(0:3),icos4d(0:3) - integer*2 iwave(NZZ) !Raw received data + integer*2 iwave(NMAX) !Raw received data integer*1 message77(77),rvec(77),apmask(2*ND),cw(2*ND) integer*1 hbits(2*NN) integer graymap(0:3) @@ -245,7 +244,7 @@ contains call ft4_downsample(dd,dobigfft,f0,cd2) !Downsample to 32 Sam/Sym call timer('ft4_down',1) if(dobigfft) dobigfft=.false. - sum2=sum(cd2*conjg(cd2))/(real(NZZ)/real(NDOWN)) + sum2=sum(cd2*conjg(cd2))/(real(NMAX)/real(NDOWN)) if(sum2.gt.0.0) cd2=cd2/sqrt(sum2) ! Sample rate is now 12000/16 = 750 samples/second do isync=1,2 @@ -253,15 +252,15 @@ contains idfmin=-12 idfmax=12 idfstp=3 - ibmin=0 - ibmax=800 + ibmin=-200 + ibmax=950 ibstp=4 else idfmin=idfbest-4 idfmax=idfbest+4 idfstp=1 ibmin=max(0,ibest-5) - ibmax=min(ibest+5,NZZ/NDOWN-1) + ibmax=min(ibest+5,NDMAX-1) ibstp=1 endif ibest=-1 @@ -287,7 +286,14 @@ contains call timer('ft4down ',1) sum2=sum(abs(cb)**2)/(real(NSS)*NN) if(sum2.gt.0.0) cb=cb/sqrt(sum2) - cd=cb(ibest:ibest+NN*NSS-1) + cd=0. + if(ibest.ge.0) then + it=min(NDMAX-1,ibest+NN*NSS-1) + np=it-ibest+1 + cd(0:np-1)=cb(ibest:it) + else + cd(-ibest:ibest+NN*NSS-1)=cb(0:NN*NSS+2*ibest-1) + endif call timer('four2a ',0) do k=1,NN i1=(k-1)*NSS From 45a1841eec2512b518c49130ba16824a29376a8d Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Thu, 2 May 2019 22:01:31 +0100 Subject: [PATCH 055/159] Fix another grid variable length to suit new azdist API --- lib/decoder.f90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/decoder.f90 b/lib/decoder.f90 index 8ca7e3161..174b75115 100644 --- a/lib/decoder.f90 +++ b/lib/decoder.f90 @@ -133,8 +133,8 @@ subroutine multimode_decoder(ss,id2,params,nfsample) n30fox(j)=n m=n30max-n if(len(trim(g2fox(j))).eq.4) then - call azdist(mygrid,g2fox(j),0.d0,nAz,nEl,nDmiles,nDkm, & - nHotAz,nHotABetter) + call azdist(mygrid,g2fox(j)//' ',0.d0,nAz,nEl,nDmiles, & + nDkm,nHotAz,nHotABetter) else nDkm=9999 endif From b79cf0df99725d9a7ef680a915cfac614ce92acc Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Fri, 3 May 2019 10:21:50 +0100 Subject: [PATCH 056/159] Improvements to accessibiity Where tool tips are defined in rich text, equivalent pain test accessible descriptions have been added so that screen readers do not announce HTML tags. Refactored date time delegates to use a simpler default editor via a default item editor factory for QDateTime values, the editor is a standard QDateTimeEdit with a format that includes seconds and renders assuming the time is UTC. Modified the Cabrillo log and Fox log database table models to provide QDateTime items for the edit role of date time fields, and formated date time strings including seconds and assumed as UTC for the display role. --- MetaDataRegistry.cpp | 4 + .../DateTimeAsSecsSinceEpochDelegate.hpp | 67 --------- item_delegates/item_delegates.pri | 3 +- models/CabrilloLog.cpp | 17 +++ models/FoxLog.cpp | 17 +++ widgets/CabrilloLogWindow.cpp | 2 - widgets/CabrilloLogWindow.ui | 3 + widgets/FoxLogWindow.cpp | 2 - widgets/mainwindow.ui | 128 ++++++++++++++++-- widgets/widgets.pri | 3 +- 10 files changed, 162 insertions(+), 84 deletions(-) delete mode 100644 item_delegates/DateTimeAsSecsSinceEpochDelegate.hpp diff --git a/MetaDataRegistry.cpp b/MetaDataRegistry.cpp index bf2aab5d4..6ce9a7f92 100644 --- a/MetaDataRegistry.cpp +++ b/MetaDataRegistry.cpp @@ -15,6 +15,7 @@ #include "models/IARURegions.hpp" #include "models/DecodeHighlightingModel.hpp" #include "widgets/FrequencyLineEdit.hpp" +#include "widgets/DateTimeEdit.hpp" QItemEditorFactory * item_editor_factory () { @@ -34,6 +35,9 @@ void register_types () item_editor_factory ()->registerEditor (qMetaTypeId (), new QStandardItemEditorCreator ()); //auto frequency_delta_type_id = qRegisterMetaType ("FrequencyDelta"); item_editor_factory ()->registerEditor (qMetaTypeId (), new QStandardItemEditorCreator ()); + auto factory = new QItemEditorFactory; + factory->registerEditor (qMetaTypeId (), new QStandardItemEditorCreator ()); + QItemEditorFactory::setDefaultFactory (factory); // Frequency list model qRegisterMetaTypeStreamOperators ("Item_v2"); diff --git a/item_delegates/DateTimeAsSecsSinceEpochDelegate.hpp b/item_delegates/DateTimeAsSecsSinceEpochDelegate.hpp deleted file mode 100644 index a666ed323..000000000 --- a/item_delegates/DateTimeAsSecsSinceEpochDelegate.hpp +++ /dev/null @@ -1,67 +0,0 @@ -#ifndef DATE_TIME_AS_SECS_SINCE_EPOCH_DELEGATE_HPP_ -#define DATE_TIME_AS_SECS_SINCE_EPOCH_DELEGATE_HPP_ - -#include -#include -#include -#include -#include -#include -#include - -class DateTimeAsSecsSinceEpochDelegate final - : public QStyledItemDelegate -{ -public: - DateTimeAsSecsSinceEpochDelegate (QObject * parent = nullptr) - : QStyledItemDelegate {parent} - { - } - - static QVariant to_secs_since_epoch (QDateTime const& date_time) - { - return date_time.toMSecsSinceEpoch () / 1000ull; - } - - static QDateTime to_date_time (QModelIndex const& index, int role = Qt::DisplayRole) - { - return to_date_time (index.model ()->data (index, role)); - } - - static QDateTime to_date_time (QVariant const& value) - { - return QDateTime::fromMSecsSinceEpoch (value.toULongLong () * 1000ull, Qt::UTC); - } - - QString displayText (QVariant const& value, QLocale const& locale) const override - { - return locale.toString (to_date_time (value), locale.dateFormat (QLocale::ShortFormat) + " hh:mm:ss"); - } - - QWidget * createEditor (QWidget * parent, QStyleOptionViewItem const& /*option*/, QModelIndex const& /*index*/) const override - { - std::unique_ptr editor {new QDateTimeEdit {parent}}; - editor->setDisplayFormat (parent->locale ().dateFormat (QLocale::ShortFormat) + " hh:mm:ss"); - editor->setTimeSpec (Qt::UTC); // needed because it ignores time - // spec of the QDateTime that it is - // set from - return editor.release (); - } - - void setEditorData (QWidget * editor, QModelIndex const& index) const override - { - static_cast (editor)->setDateTime (to_date_time (index, Qt::EditRole)); - } - - void setModelData (QWidget * editor, QAbstractItemModel * model, QModelIndex const& index) const override - { - model->setData (index, to_secs_since_epoch (static_cast (editor)->dateTime ())); - } - - void updateEditorGeometry (QWidget * editor, QStyleOptionViewItem const& option, QModelIndex const& /*index*/) const override - { - editor->setGeometry (option.rect); - } -}; - -#endif diff --git a/item_delegates/item_delegates.pri b/item_delegates/item_delegates.pri index 153ad4271..026e1ca57 100644 --- a/item_delegates/item_delegates.pri +++ b/item_delegates/item_delegates.pri @@ -8,5 +8,4 @@ HEADERS += \ item_delegates/ForeignKeyDelegate.hpp \ item_delegates/FrequencyItemDelegate.hpp \ item_delegates/CallsignDelegate.hpp \ - item_delegates/MaidenheadLocatorDelegate.hpp \ - item_delegates/DateTimeAsSecsSinceEpochDelegate.hpp + item_delegates/MaidenheadLocatorDelegate.hpp diff --git a/models/CabrilloLog.cpp b/models/CabrilloLog.cpp index 1fee9b148..6849cdd61 100644 --- a/models/CabrilloLog.cpp +++ b/models/CabrilloLog.cpp @@ -21,6 +21,23 @@ class CabrilloLog::impl final public: impl (Configuration const *); + QVariant data (QModelIndex const& index, int role) const + { + auto value = QSqlTableModel::data (index, role); + if (index.column () == fieldIndex ("when") + && (Qt::DisplayRole == role || Qt::EditRole == role)) + { + auto t = QDateTime::fromMSecsSinceEpoch (value.toULongLong () * 1000ull, Qt::UTC); + if (Qt::DisplayRole == role) + { + QLocale locale; + return locale.toString (t, locale.dateFormat (QLocale::ShortFormat) + " hh:mm:ss"); + } + value = t; + } + return value; + } + QString cabrillo_frequency_string (Radio::Frequency frequency) const; Configuration const * configuration_; diff --git a/models/FoxLog.cpp b/models/FoxLog.cpp index 773a5308f..debb08afc 100644 --- a/models/FoxLog.cpp +++ b/models/FoxLog.cpp @@ -21,6 +21,23 @@ class FoxLog::impl final public: impl (Configuration const * configuration); + QVariant data (QModelIndex const& index, int role) const + { + auto value = QSqlTableModel::data (index, role); + if (index.column () == fieldIndex ("when") + && (Qt::DisplayRole == role || Qt::EditRole == role)) + { + auto t = QDateTime::fromMSecsSinceEpoch (value.toULongLong () * 1000ull, Qt::UTC); + if (Qt::DisplayRole == role) + { + QLocale locale; + return locale.toString (t, locale.dateFormat (QLocale::ShortFormat) + " hh:mm:ss"); + } + value = t; + } + return value; + } + Configuration const * configuration_; QSqlQuery mutable dupe_query_; QSqlQuery mutable export_query_; diff --git a/widgets/CabrilloLogWindow.cpp b/widgets/CabrilloLogWindow.cpp index 44a52cc6b..2f7b44d4a 100644 --- a/widgets/CabrilloLogWindow.cpp +++ b/widgets/CabrilloLogWindow.cpp @@ -6,7 +6,6 @@ #include "Configuration.hpp" #include "models/Bands.hpp" #include "item_delegates/ForeignKeyDelegate.hpp" -#include "item_delegates/DateTimeAsSecsSinceEpochDelegate.hpp" #include "item_delegates/CallsignDelegate.hpp" #include "pimpl_impl.hpp" @@ -64,7 +63,6 @@ CabrilloLogWindow::CabrilloLogWindow (QSettings * settings, Configuration const m_->format_model_.setSourceModel (m_->log_model_); m_->ui_.log_table_view->setModel (&m_->format_model_); set_log_view (m_->ui_.log_table_view); - m_->ui_.log_table_view->setItemDelegateForColumn (2, new DateTimeAsSecsSinceEpochDelegate {this}); m_->ui_.log_table_view->setItemDelegateForColumn (3, new CallsignDelegate {this}); m_->ui_.log_table_view->setItemDelegateForColumn (6, new ForeignKeyDelegate {configuration->bands (), 0, this}); auto h_header = m_->ui_.log_table_view->horizontalHeader (); diff --git a/widgets/CabrilloLogWindow.ui b/widgets/CabrilloLogWindow.ui index efefe5d3c..35b4d597d 100644 --- a/widgets/CabrilloLogWindow.ui +++ b/widgets/CabrilloLogWindow.ui @@ -19,6 +19,9 @@ <html><head/><body><p>Right-click here for available actions.</p></body></html> + + Right-click here for available actions. + true diff --git a/widgets/FoxLogWindow.cpp b/widgets/FoxLogWindow.cpp index 36f20b85b..9c29a30ad 100644 --- a/widgets/FoxLogWindow.cpp +++ b/widgets/FoxLogWindow.cpp @@ -13,7 +13,6 @@ #include "models/Bands.hpp" #include "models/FoxLog.hpp" #include "item_delegates/ForeignKeyDelegate.hpp" -#include "item_delegates/DateTimeAsSecsSinceEpochDelegate.hpp" #include "item_delegates/CallsignDelegate.hpp" #include "item_delegates/MaidenheadLocatorDelegate.hpp" #include "pimpl_impl.hpp" @@ -42,7 +41,6 @@ FoxLogWindow::FoxLogWindow (QSettings * settings, Configuration const * configur m_->ui_.setupUi (this); m_->ui_.log_table_view->setModel (m_->log_->model ()); set_log_view (m_->ui_.log_table_view); - m_->ui_.log_table_view->setItemDelegateForColumn (1, new DateTimeAsSecsSinceEpochDelegate {this}); m_->ui_.log_table_view->setItemDelegateForColumn (2, new CallsignDelegate {this}); m_->ui_.log_table_view->setItemDelegateForColumn (3, new MaidenheadLocatorDelegate {this}); m_->ui_.log_table_view->setItemDelegateForColumn (6, new ForeignKeyDelegate {configuration->bands (), 0, this}); diff --git a/widgets/mainwindow.ui b/widgets/mainwindow.ui index 0942dc750..75be401d0 100644 --- a/widgets/mainwindow.ui +++ b/widgets/mainwindow.ui @@ -340,7 +340,7 @@ - <html><head/><body><p>Enter this QSO in log</p></body></html> + Enter this QSO in log Log &QSO @@ -372,7 +372,7 @@ - <html><head/><body><p>Toggle monitoring On/Off</p></body></html> + Toggle monitoring On/Off QPushButton:checked { @@ -407,6 +407,9 @@ <html><head/><body><p>Erase right window. Double-click to erase both windows.</p></body></html> + + Erase right window. Double-click to erase both windows. + &Erase @@ -420,6 +423,9 @@ <html><head/><body><p>Clear the accumulating message average.</p></body></html> + + Clear the accumulating message average. + Clear Avg @@ -436,6 +442,9 @@ <html><head/><body><p>Decode most recent Rx period at QSO Frequency</p></body></html> + + Decode most recent Rx period at QSO Frequency + QPushButton:checked { background-color: cyan; @@ -466,6 +475,9 @@ <html><head/><body><p>Toggle Auto-Tx On/Off</p></body></html> + + Toggle Auto-Tx On/Off + QPushButton:checked { background-color: red; @@ -506,6 +518,9 @@ <html><head/><body><p>Toggle a pure Tx tone On/Off</p></body></html> + + Toggle a pure Tx tone On/Off + QPushButton:checked { background-color: red; @@ -590,6 +605,15 @@ QLabel[oob="true"] { <html><head/><body><p>30dB recommended when only noise present<br/>Green when good<br/>Red when clipping may occur<br/>Yellow when too low</p></body></html> + + Rx Signal + + + 30dB recommended when only noise present +Green when good +Red when clipping may occur +Yellow when too low + QFrame::Panel @@ -706,6 +730,9 @@ QLabel[oob="true"] { 2 + + dxCallEntry + @@ -795,6 +822,9 @@ QLabel[oob="true"] { 2 + + dxGridEntry + @@ -883,6 +913,9 @@ QLabel[oob="true"] { <html><head/><body><p>If orange or red there has been a rig control failure, click to reset and read the dial frequency. S implies split mode.</p></body></html> + + If orange or red there has been a rig control failure, click to reset and read the dial frequency. S implies split mode. + QPushButton { font-family: helvetica; @@ -947,6 +980,12 @@ QPushButton[state="ok"] { <html><head/><body><p>Select operating band or enter frequency in MHz or enter kHz increment followed by k.</p></body></html> + + Frequncy entry + + + Select operating band or enter frequency in MHz or enter kHz increment followed by k. + true @@ -1038,6 +1077,9 @@ QPushButton[state="ok"] { <html><head/><body><p>Check to keep Tx frequency fixed when double-clicking on decoded text.</p></body></html> + + Check to keep Tx frequency fixed when double-clicking on decoded text. + Hold Tx Freq @@ -1155,6 +1197,9 @@ QPushButton[state="ok"] { <html><head/><body><p>Synchronizing threshold. Lower numbers accept weaker sync signals.</p></body></html> + + Synchronizing threshold. Lower numbers accept weaker sync signals. + Qt::AlignCenter @@ -1179,6 +1224,9 @@ QPushButton[state="ok"] { <html><head/><body><p>Check to use short-format messages.</p></body></html> + + Check to use short-format messages. + Sh @@ -1189,6 +1237,9 @@ QPushButton[state="ok"] { <html><head/><body><p>Check to enable JT9 fast modes</p></body></html> + + Check to enable JT9 fast modes + Fast @@ -1199,6 +1250,9 @@ QPushButton[state="ok"] { <html><head/><body><p>Check to enable automatic sequencing of Tx messages based on received messages.</p></body></html> + + Check to enable automatic sequencing of Tx messages based on received messages. + Auto Seq @@ -1209,6 +1263,9 @@ QPushButton[state="ok"] { <html><head/><body><p>Check to call the first decoded responder to my CQ.</p></body></html> + + Check to call the first decoded responder to my CQ. + Call 1st @@ -1234,6 +1291,9 @@ QPushButton[state="ok"] { <html><head/><body><p>Check to Tx in even-numbered minutes or sequences, starting at 0; uncheck for odd sequences.</p></body></html> + + Check to Tx in even-numbered minutes or sequences, starting at 0; uncheck for odd sequences. + Tx even/1st @@ -1249,6 +1309,9 @@ QPushButton[state="ok"] { <html><head/><body><p>Frequency to call CQ on in kHz above the current MHz</p></body></html> + + Frequency to call CQ on in kHz above the current MHz + Tx CQ @@ -1271,6 +1334,10 @@ QPushButton[state="ok"] { <html><head/><body><p>Check this to call CQ on the &quot;Tx CQ&quot; frequency. Rx will be on the current frequency and the CQ message wiill include the current Rx frequency so callers know which frequency to reply on.</p><p>Not available to nonstandard callsign holders.</p></body></html> + + Check this to call CQ on the "Tx CQ" frequency. Rx will be on the current frequency and the CQ message wiill include the current Rx frequency so callers know which frequency to reply on. +Not available to nonstandard callsign holders. + @@ -1290,6 +1357,9 @@ QPushButton[state="ok"] { <html><head/><body><p>Submode determines tone spacing; A is narrowest.</p></body></html> + + Submode determines tone spacing; A is narrowest. + Qt::AlignCenter @@ -1333,6 +1403,9 @@ QPushButton[state="ok"] { <html><head/><body><p>Check to monitor Sh messages.</p></body></html> + + Check to monitor Sh messages. + SWL @@ -1364,6 +1437,11 @@ QPushButton[state="ok"] { <html><head/><body><p>Check this to start recording calibration data.<br/>While measuring calibration correction is disabled.<br/>When not checked you can view the calibration results.</p></body></html> + + Check this to start recording calibration data. +While measuring calibration correction is disabled. +When not checked you can view the calibration results. + Measure @@ -1376,6 +1454,9 @@ QPushButton[state="ok"] { <html><head/><body><p>Signal report: Signal-to-noise ratio in 2500 Hz reference bandwidth (dB).</p></body></html> + + Signal report: Signal-to-noise ratio in 2500 Hz reference bandwidth (dB). + Qt::AlignCenter @@ -1398,6 +1479,9 @@ QPushButton[state="ok"] { <html><head/><body><p>Tx/Rx or Frequency calibration sequence length</p></body></html> + + Tx/Rx or Frequency calibration sequence length + Qt::AlignCenter @@ -1496,6 +1580,9 @@ QPushButton[state="ok"] { <html><head/><body><p>Double-click on another caller to queue that call for your next QSO.</p></body></html> + + Double-click on another caller to queue that call for your next QSO. + Next Call @@ -1551,6 +1638,10 @@ QPushButton[state="ok"] { <html><head/><body><p>Send this message in next Tx interval</p><p>Double click to toggle the use of the Tx1 message to start a QSO with a station (not allowed for type 1 compound call holders)</p></body></html> + + Send this message in next Tx interval +Double click to toggle the use of the Tx1 message to start a QSO with a station (not allowed for type 1 compound call holders) + margin-left: 10%; margin-right: 0% @@ -1586,6 +1677,10 @@ QPushButton[state="ok"] { <html><head/><body><p>Switch to this Tx message NOW</p><p>Double click to toggle the use of the Tx1 message to start a QSO with a station (not allowed for type 1 compound call holders)</p></body></html> + + Switch to this Tx message NOW +Double click to toggle the use of the Tx1 message to start a QSO with a station (not allowed for type 1 compound call holders) + Qt::LeftToRight @@ -1627,6 +1722,10 @@ QPushButton[state="ok"] { <html><head/><body><p>Send this message in next Tx interval</p><p>Double-click to reset to the standard 73 message</p></body></html> + + Send this message in next Tx interval +Double-click to reset to the standard 73 message + margin-left: 10%; margin-right: 0% @@ -1675,6 +1774,11 @@ QPushButton[state="ok"] { <html><head/><body><p>Send this message in next Tx interval</p><p>Double-click to toggle between RRR and RR73 messages in Tx4 (not allowed for type 2 compound call holders)</p><p>RR73 messages should only be used when you are reasonably confident that no message repetitions will be required</p></body></html> + + Send this message in next Tx interval +Double-click to toggle between RRR and RR73 messages in Tx4 (not allowed for type 2 compound call holders) +RR73 messages should only be used when you are reasonably confident that no message repetitions will be required + margin-left: 10%; margin-right: 0% @@ -1691,6 +1795,11 @@ QPushButton[state="ok"] { <html><head/><body><p>Switch to this Tx message NOW</p><p>Double-click to toggle between RRR and RR73 messages in Tx4 (not allowed for type2 compound call holders)</p><p>RR73 messages should only be used when you are reasonably confident that no message repetitions will be required</p></body></html> + + Switch to this Tx message NOW +Double-click to toggle between RRR and RR73 messages in Tx4 (not allowed for type2 compound call holders) +RR73 messages should only be used when you are reasonably confident that no message repetitions will be required + padding-left: 15%; padding-right: 15%; padding-top: 3%; padding-bottom: 3% @@ -1707,6 +1816,10 @@ QPushButton[state="ok"] { <html><head/><body><p>Switch to this Tx message NOW</p><p>Double-click to reset to the standard 73 message</p></body></html> + + Switch to this Tx message NOW +Double-click to reset to the standard 73 message + padding-left: 15%; padding-right: 15%; padding-top: 3%; padding-bottom: 3% @@ -2524,6 +2637,9 @@ list. The list can be maintained in Settings (F2). <html><head/><body><p>6 digit locators cause 2 different mesages to be sent, the second contains the full locator but only a hashed callsign, other stations must have decoded the first once before they can decode your call in the second. Check this option to only send 4 digit locators if it will avoid the two message protocol.</p></body></html> + + 6 digit locators cause 2 different mesages to be sent, the second contains the full locator but only a hashed callsign, other stations must have decoded the first once before they can decode your call in the second. Check this option to only send 4 digit locators if it will avoid the two message protocol. + Prefer type 1 messages @@ -3306,14 +3422,6 @@ list. The list can be maintained in Settings (F2). Fox log - - - Reset Fox log ... - - - <html><head/><body><p>Ths will erase the file FoxQSO.txt and delete the Fox log file which is used for dupe detection.</p></body></html> - - FT8 DXpedition Mode User Guide diff --git a/widgets/widgets.pri b/widgets/widgets.pri index 24ddd5a3c..eef0c7857 100644 --- a/widgets/widgets.pri +++ b/widgets/widgets.pri @@ -19,7 +19,8 @@ HEADERS += \ widgets/echoplot.h widgets/echograph.h widgets/fastgraph.h \ widgets/fastplot.h widgets/MessageBox.hpp widgets/colorhighlighting.h \ widgets/ExportCabrillo.h widgets/AbstractLogWindow.hpp \ - widgets/FoxLogWindow.hpp widgets/CabrilloLogWindow.hpp + widgets/FoxLogWindow.hpp widgets/CabrilloLogWindow.hpp \ + widgets/DateTimeEdit.hpp FORMS += \ widgets/mainwindow.ui widgets/about.ui \ From ab282fae78cf720a8a8d007e4f1ad62299014146 Mon Sep 17 00:00:00 2001 From: Steve Franke Date: Fri, 3 May 2019 09:01:18 -0500 Subject: [PATCH 057/159] Add bLowSidelobes argument to the call to symspec. It is initialized to FALSE. --- lib/jt9.f90 | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/jt9.f90 b/lib/jt9.f90 index aff2844ef..a0ffcda31 100644 --- a/lib/jt9.f90 +++ b/lib/jt9.f90 @@ -22,7 +22,8 @@ program jt9 !### ndepth was defined as 60001. Why??? integer :: arglen,stat,offset,remain,mode=0,flow=200,fsplit=2700, & fhigh=4000,nrxfreq=1500,ntrperiod=1,ndepth=1,nexp_decode=0 - logical :: read_files = .true., tx9 = .false., display_help = .false. + logical :: read_files = .true., tx9 = .false., display_help = .false., & + bLowSidelobes = .false. type (option) :: long_options(26) = [ & option ('help', .false., 'h', 'Display this help message', ''), & option ('shmem',.true.,'s','Use shared memory for sample data','KEY'), & @@ -242,7 +243,7 @@ program jt9 ingain=0 call timer('symspec ',0) nminw=1 - call symspec(shared_data,k,ntrperiod,nsps,ingain,nminw,pxdb, & + call symspec(shared_data,k,ntrperiod,nsps,ingain,bLowSidelobes,nminw,pxdb, & s,df3,ihsym,npts8,pxdbmax) call timer('symspec ',1) endif From 3611be8ba011392cf35f0bb29a49030e7b7adb59 Mon Sep 17 00:00:00 2001 From: Steve Franke Date: Fri, 3 May 2019 10:51:45 -0500 Subject: [PATCH 058/159] Try to avoid an array bounds error that has been reported by a user. Cause unknown. --- lib/ft8/sync8.f90 | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/ft8/sync8.f90 b/lib/ft8/sync8.f90 index 3924f1bad..219c6ebf1 100644 --- a/lib/ft8/sync8.f90 +++ b/lib/ft8/sync8.f90 @@ -89,7 +89,12 @@ subroutine sync8(dd,nfa,nfb,syncmin,nfqso,maxcand,s,candidate, & enddo iz=ib-ia+1 call indexx(red(ia:ib),iz,indx) - ibase=indx(nint(0.40*iz)) - 1 + ia + npctile=nint(0.40*iz) + if(npctile.lt.1) then ! something is wrong; bail out + ncand=0 + return; + endif + ibase=indx(npctile) - 1 + ia if(ibase.lt.1) ibase=1 if(ibase.gt.nh1) ibase=nh1 base=red(ibase) From bd07a6e7555c3f66c586962762d7805ad68e0dd7 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Sat, 4 May 2019 01:02:16 +0100 Subject: [PATCH 059/159] Add default QDateTime delegate editor --- widgets/DateTimeEdit.hpp | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 widgets/DateTimeEdit.hpp diff --git a/widgets/DateTimeEdit.hpp b/widgets/DateTimeEdit.hpp new file mode 100644 index 000000000..ad767a551 --- /dev/null +++ b/widgets/DateTimeEdit.hpp @@ -0,0 +1,23 @@ +#ifndef DATE_TIME_EDIT_HPP_ +#define DATE_TIME_EDIT_HPP_ + +#include + +class QWidget; + +// +// DateTimeEdit - format includes seconds +// +class DateTimeEdit final + : public QDateTimeEdit +{ +public: + explicit DateTimeEdit (QWidget * parent = nullptr) + : QDateTimeEdit {parent} + { + setDisplayFormat (locale ().dateFormat (QLocale::ShortFormat) + " hh:mm:ss"); + setTimeSpec (Qt::UTC); + } +}; + +#endif From 0795651f0fe06d24b96e8d9d2c72647370331341 Mon Sep 17 00:00:00 2001 From: Steve Franke Date: Sat, 4 May 2019 08:05:28 -0500 Subject: [PATCH 060/159] FT4: Initialize mycall13 and dxcall13 for unpack77. --- lib/ft4_decode.f90 | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/ft4_decode.f90 b/lib/ft4_decode.f90 index dc08df1b3..fa53f57be 100644 --- a/lib/ft4_decode.f90 +++ b/lib/ft4_decode.f90 @@ -94,6 +94,9 @@ contains this%callback => callback hhmmss=cdatetime0(8:13) + dxcall13=hiscall + mycall13=mycall + if(first) then fs=12000.0/NDOWN !Sample rate after downsampling dt=1/fs !Sample interval after downsample (s) From 0d1b438b91f541de0a5d9cb8f836e142c262b07c Mon Sep 17 00:00:00 2001 From: Steve Franke Date: Sat, 4 May 2019 09:33:53 -0500 Subject: [PATCH 061/159] FT4: Fix generation of Tx5 when one callsign is nonstandard. --- widgets/mainwindow.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 813b163ce..88fe0016e 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -5065,7 +5065,7 @@ void MainWindow::genStdMsgs(QString rpt, bool unconditional) msgtype(t, ui->tx4); t=t0 + "73"; - if((m_mode=="MSK144" and !m_bShMsgs) or m_mode=="FT8") { + if((m_mode=="MSK144" and !m_bShMsgs) or m_mode=="FT8" or m_mode=="FT4") { if(!bHisCall and bMyCall) t=hisCall + " <" + my_callsign + "> 73"; if(bHisCall and !bMyCall) t="<" + hisCall + "> " + my_callsign + " 73"; } @@ -5081,7 +5081,7 @@ void MainWindow::genStdMsgs(QString rpt, bool unconditional) } } - if(m_mode=="FT8" or m_mode=="MSK144") return; + if(m_mode=="FT8" or m_mode=="FT4" or m_mode=="MSK144") return; if (is_compound) { if (is_type_one) { From 27a0182ab7a6643db95cf065ad741a1018e1fb0e Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Mon, 6 May 2019 22:24:51 +0100 Subject: [PATCH 062/159] Revert "Revert to colouring just the OK Log QSO button to help with colour-blindness accessibility" This reverts commit b9e194b74f68cca2d9061d3d4a4d19409c45204e. --- widgets/logqso.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/widgets/logqso.cpp b/widgets/logqso.cpp index b4b936d75..75ded8bca 100644 --- a/widgets/logqso.cpp +++ b/widgets/logqso.cpp @@ -42,6 +42,7 @@ LogQSO::LogQSO(QString const& programTitle, QSettings * settings ok_->setAutoDefault (false); ok_->setFocusPolicy (Qt::ClickFocus); ok_->setStyleSheet ("background-color: green"); + cancel_->setStyleSheet ("background-color: red"); cancel_->setAutoDefault (false); ui->button_layout->addStretch (); ui->button_layout->addWidget (ok_); From 1a914e980b9039d4671681f917f916a60cb569e6 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Mon, 6 May 2019 22:25:01 +0100 Subject: [PATCH 063/159] Revert "Add background colour to Log QSO buttons as stronger visual cue" This reverts commit a8a1d8d0a7701610061e2e3e98c543e198aae981. --- widgets/logqso.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/widgets/logqso.cpp b/widgets/logqso.cpp index 75ded8bca..eae82aacc 100644 --- a/widgets/logqso.cpp +++ b/widgets/logqso.cpp @@ -41,8 +41,6 @@ LogQSO::LogQSO(QString const& programTitle, QSettings * settings ok_->setAutoDefault (false); ok_->setFocusPolicy (Qt::ClickFocus); - ok_->setStyleSheet ("background-color: green"); - cancel_->setStyleSheet ("background-color: red"); cancel_->setAutoDefault (false); ui->button_layout->addStretch (); ui->button_layout->addWidget (ok_); From 1c3b5543845d6bb6b284315dfb235ad8ddb9a80c Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Mon, 6 May 2019 22:25:06 +0100 Subject: [PATCH 064/159] Revert "Log buttons" This reverts commit 9e75b5c2b5d9827e14ef0d92470e56455edcec7f. --- widgets/logqso.cpp | 45 ++------------------------------------------- widgets/logqso.h | 3 --- widgets/logqso.ui | 44 ++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 44 insertions(+), 48 deletions(-) diff --git a/widgets/logqso.cpp b/widgets/logqso.cpp index eae82aacc..acbb340bc 100644 --- a/widgets/logqso.cpp +++ b/widgets/logqso.cpp @@ -1,12 +1,9 @@ #include "logqso.h" -#include -#include #include #include #include #include -#include #include "logbook/logbook.h" #include "MessageBox.hpp" @@ -18,40 +15,17 @@ #include "ui_logqso.h" #include "moc_logqso.cpp" -namespace -{ - using dist_type = std::uniform_int_distribution; - std::random_device rd; - std::mt19937 twister (rd ()); - dist_type int_distribution; -} - LogQSO::LogQSO(QString const& programTitle, QSettings * settings , Configuration const * config, QWidget *parent) : QDialog {parent, Qt::WindowStaysOnTopHint | Qt::WindowTitleHint | Qt::WindowSystemMenuHint} , ui(new Ui::LogQSO) - , ok_ {new QPushButton {"OK", this}} - , cancel_ {new QPushButton {"Cancel", this}} , m_settings (settings) , m_config {config} { ui->setupUi(this); setWindowTitle(programTitle + " - Log QSO"); - ui->grid->setValidator (new MaidenheadLocatorValidator {this}); - - ok_->setAutoDefault (false); - ok_->setFocusPolicy (Qt::ClickFocus); - cancel_->setAutoDefault (false); - ui->button_layout->addStretch (); - ui->button_layout->addWidget (ok_); - ui->button_layout->addStretch (); - ui->button_layout->addWidget (cancel_); - ui->button_layout->addStretch (); - loadSettings (); - - connect (ok_, &QAbstractButton::clicked, [this] (bool) {accept ();}); - connect (cancel_, &QAbstractButton::clicked, [this] (bool) {reject ();}); + ui->grid->setValidator (new MaidenheadLocatorValidator {this}); } LogQSO::~LogQSO () @@ -139,22 +113,7 @@ void LogQSO::initLogQSO(QString const& hisCall, QString const& hisGrid, QString } else { - // randomize accessible name of buttons - ok_->setAccessibleName (QString::number (int_distribution (twister))); - cancel_->setAccessibleName (QString::number (int_distribution (twister))); - // random sibling order of buttons - if (int_distribution (twister, dist_type::param_type {0, 1})) ok_->stackUnder (cancel_); else cancel_->stackUnder (ok_); - // random shuffle of layout items - for (int item = ui->button_layout->count () - 1; item > 0; --item) - { - auto other_item = int_distribution (twister, dist_type::param_type {0, item}); - if (item != other_item) - { - ui->button_layout->insertItem (other_item, ui->button_layout->takeAt (item)); - ui->button_layout->insertItem (item, ui->button_layout->takeAt (other_item + 1)); - } - } - show (); + show(); } } diff --git a/widgets/logqso.h b/widgets/logqso.h index 5cbb2044d..82a75b7bd 100644 --- a/widgets/logqso.h +++ b/widgets/logqso.h @@ -18,7 +18,6 @@ class QSettings; class Configuration; class QByteArray; class CabrilloLog; -class QPushButton; class LogQSO : public QDialog { @@ -53,8 +52,6 @@ private: void storeSettings () const; QScopedPointer ui; - QPushButton * ok_; - QPushButton * cancel_; QSettings * m_settings; Configuration const * m_config; QString m_txPower; diff --git a/widgets/logqso.ui b/widgets/logqso.ui index 7d249677d..a03a3028a 100644 --- a/widgets/logqso.ui +++ b/widgets/logqso.ui @@ -461,7 +461,14 @@ - + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + @@ -481,5 +488,38 @@ cbComments - + + + buttonBox + accepted() + LogQSO + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + LogQSO + reject() + + + 316 + 260 + + + 286 + 274 + + + + From 0668c4fce05ecd4b30e34a1be97bcdb6122a13b7 Mon Sep 17 00:00:00 2001 From: Steve Franke Date: Wed, 8 May 2019 11:34:16 -0500 Subject: [PATCH 065/159] Improve sync at large DT. --- lib/ft4/gen_ft4wave.f90 | 2 +- lib/ft4/sync4d.f90 | 23 ++++++++++++++++++++--- lib/ft4_decode.f90 | 4 ++-- 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/lib/ft4/gen_ft4wave.f90 b/lib/ft4/gen_ft4wave.f90 index 410e83401..c4cd2eafb 100644 --- a/lib/ft4/gen_ft4wave.f90 +++ b/lib/ft4/gen_ft4wave.f90 @@ -13,7 +13,7 @@ subroutine gen_ft4wave(itone,nsym,nsps,fsample,f0,cwave,wave,icmplx,nwave) twopi=8.0*atan(1.0) dt=1.0/fsample hmod=1.0 -! Compute the frequency-smoothing pulse +! Compute the smoothed frequency-deviation pulse do i=1,3*nsps tt=(i-1.5*nsps)/real(nsps) pulse(i)=gfsk_pulse(1.0,tt) diff --git a/lib/ft4/sync4d.f90 b/lib/ft4/sync4d.f90 index bda7ed4a2..28cb10b99 100644 --- a/lib/ft4/sync4d.f90 +++ b/lib/ft4/sync4d.f90 @@ -60,7 +60,16 @@ subroutine sync4d(cd0,i0,ctwk,itwk,sync) z4=0. if(itwk.eq.1) csync2=ctwk*csynca !Tweak the frequency - if(i1.ge.0 .and. i1+4*NSS-1.le.NP-1) z1=sum(cd0(i1:i1+4*NSS-1:2)*conjg(csync2)) + if(i1.ge.0 .and. i1+4*NSS-1.le.NP-1) then + z1=sum(cd0(i1:i1+4*NSS-1:2)*conjg(csync2)) + elseif( i1.lt.0 ) then + npts=(i1+4*NSS-1)/2 + if(npts.le.8) then + z1=0. + else + z1=sum(cd0(0:i1+4*NSS-1:2)*conjg(csync2(2*NSS-npts:))) + endif + endif if(itwk.eq.1) csync2=ctwk*csyncb !Tweak the frequency if(i2.ge.0 .and. i2+4*NSS-1.le.NP-1) z2=sum(cd0(i2:i2+4*NSS-1:2)*conjg(csync2)) @@ -69,8 +78,16 @@ subroutine sync4d(cd0,i0,ctwk,itwk,sync) if(i3.ge.0 .and. i3+4*NSS-1.le.NP-1) z3=sum(cd0(i3:i3+4*NSS-1:2)*conjg(csync2)) if(itwk.eq.1) csync2=ctwk*csyncd !Tweak the frequency - if(i4.ge.0 .and. i4+4*NSS-1.le.NP-1) z4=sum(cd0(i4:i4+4*NSS-1:2)*conjg(csync2)) - + if(i4.ge.0 .and. i4+4*NSS-1.le.NP-1) then + z4=sum(cd0(i4:i4+4*NSS-1:2)*conjg(csync2)) + elseif( i4+4*NSS-1.gt.NP-1 ) then + npts=(NP-1-i4+1)/2 + if(npts.le.8) then + z4=0. + else + z4=sum(cd0(i4:i4+2*npts-1:2)*conjg(csync2(1:npts))) + endif + endif sync = p(z1) + p(z2) + p(z3) + p(z4) return diff --git a/lib/ft4_decode.f90 b/lib/ft4_decode.f90 index fa53f57be..aa27387ce 100644 --- a/lib/ft4_decode.f90 +++ b/lib/ft4_decode.f90 @@ -262,8 +262,8 @@ contains idfmin=idfbest-4 idfmax=idfbest+4 idfstp=1 - ibmin=max(0,ibest-5) - ibmax=min(ibest+5,NDMAX-1) + ibmin=ibest-5 + ibmax=ibest+5 ibstp=1 endif ibest=-1 From 3a3af42cc6fd0a7b56428afa8a49437e40b29379 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Fri, 10 May 2019 17:27:52 +0100 Subject: [PATCH 066/159] Tool to exercise QAudioInput The tool record_time_signal is designed to measure the performance of QAudioInput. The intended use is to record a short period of live audio from an on-air time signal of known good quaility, the basic required parameters are an audio input device, an output file name (.WAV), a start second in a minute, and a duration in seconds. So for example to record the time signal ticks and fast data at the top of the minute: $ record_time_signal -o wwv.wav -s 55 -d 15 will record 15s of audio at 48000Hz sample rate, stereo, from the default audio input device, starting at second 55. This will use a separate timer to stop the recording which is likely to leave the output file a little short due to buffer latency. The buffer size can be adjusted using the '-b ' option. The tool also supoorts a different mechanism to time the recording which uses the audio progress via a notify signal. This should ensure at least the requested duration is recorded The shorter the notify interval the closer teh final size shoould be to the requested duration. Use the '-d ' option to adjust the notify interval. $ record_time_signal -o wwv.wav -s 55 -d 15 -n 100 Non-default audio devices can be selected, use the '-I' option to list the available input devices with an index number that can be used to select the device using the 'R ' option. Other options are available, use '-h' for details. --- Audio/tools/record_time_signal.cpp | 231 +++++++++++++++++++++++++++++ CMakeLists.txt | 3 + 2 files changed, 234 insertions(+) create mode 100644 Audio/tools/record_time_signal.cpp diff --git a/Audio/tools/record_time_signal.cpp b/Audio/tools/record_time_signal.cpp new file mode 100644 index 000000000..4958c5743 --- /dev/null +++ b/Audio/tools/record_time_signal.cpp @@ -0,0 +1,231 @@ +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "revision_utils.hpp" +#include "Audio/BWFFile.hpp" + +namespace +{ + QTextStream qtout {stdout}; +} + +class Recorder final + : public QObject +{ + Q_OBJECT; + +public: + Recorder (int start, int duration, QString const& output, QAudioDeviceInfo const& source_device, QAudioFormat const& format, int notify_interval, int buffer_size) + : source_ {source_device, format} + , notify_interval_ {notify_interval} + , output_ {format, output} + , duration_ {duration} + { + if (!output_.open (BWFFile::WriteOnly)) throw std::invalid_argument {QString {"cannot open output file \"%1\""}.arg (output).toStdString ()}; + + if (buffer_size) source_.setBufferSize (format.bytesForFrames (buffer_size)); + if (notify_interval_) + { + source_.setNotifyInterval (notify_interval); + connect (&source_, &QAudioInput::notify, this, &Recorder::notify); + } + + QTimer::singleShot (int ((((start - (QDateTime::currentMSecsSinceEpoch () / 1000) % 60) + 60) % 60) * 1000), Qt::PreciseTimer, this, &Recorder::start); + } + + Q_SIGNAL void done (); + +private: + Q_SLOT void start () + { + qtout << "started recording at " << QDateTime::currentDateTimeUtc ().toString ("hh:mm:ss.zzz UTC") << endl; + source_.start (&output_); + if (!notify_interval_) QTimer::singleShot (duration_ * 1000, Qt::PreciseTimer, this, &Recorder::stop); + qtout << QString {"buffer size used is: %1"}.arg (source_.bufferSize ()) << endl; + } + + Q_SLOT void notify () + { + auto length = source_.elapsedUSecs (); + qtout << QString {"%1 US recorded\r"}.arg (length) << flush; + if (length >= duration_ * 1000 * 1000) stop (); + } + + Q_SLOT void stop () + { + auto length = source_.elapsedUSecs (); + source_.stop (); + qtout << QString {"%1 uS recorded "}.arg (length) << '(' << source_.format ().framesForBytes (output_.size ()) << " frames recorded)\n"; + qtout << "stopped recording at " << QDateTime::currentDateTimeUtc ().toString ("hh:mm:ss.zzz UTC") << endl; + Q_EMIT done (); + } + + QAudioInput source_; + int notify_interval_; + BWFFile output_; + int duration_; +}; + +#include "record_time_signal.moc" + +int main(int argc, char *argv[]) +{ + QCoreApplication app {argc, argv}; + try + { + ::setlocale (LC_NUMERIC, "C"); // ensure number forms are in + // consistent format, do this + // after instantiating + // QApplication so that Qt has + // correct l18n + + // Override programs executable basename as application name. + app.setApplicationName ("WSJT-X Record Time Signal"); + app.setApplicationVersion (version ()); + + QCommandLineParser parser; + parser.setApplicationDescription ( + "\nTool to determine and experiment with QAudioInput latencies\n\n" + "\tUse the -I option to list available recording device numbers\n" + ); + auto help_option = parser.addHelpOption (); + auto version_option = parser.addVersionOption (); + + parser.addOptions ({ + {{"I", "list-audio-inputs"}, + app.translate ("main", "List the available audio input devices")}, + {{"s", "start-time"}, + app.translate ("main", "Record from seconds"), + app.translate ("main", "start-time")}, + {{"d", "duration"}, + app.translate ("main", "Recording seconds"), + app.translate ("main", "duration")}, + {{"o", "output"}, + app.translate ("main", "Save output as "), + app.translate ("main", "output-file")}, + {{"f", "force"}, + app.translate ("main", "Overwrite existing file")}, + {{"r", "sample-rate"}, + app.translate ("main", "Record at "), + app.translate ("main", "sample-rate")}, + {{"c", "num-channels"}, + app.translate ("main", "Record channels"), + app.translate ("main", "num")}, + {{"R", "recording-device-number"}, + app.translate ("main", "Record from "), + app.translate ("main", "device-number")}, + {{"n", "notify-interval"}, + app.translate ("main", "use notify signals every milliseconds, zero to use a timer"), + app.translate ("main", "interval")}, + {{"b", "buffer-size"}, + app.translate ("main", "audio buffer size "), + app.translate ("main", "frames")}, + }); + parser.process (app); + + auto input_devices = QAudioDeviceInfo::availableDevices (QAudio::AudioInput); + if (parser.isSet ("I")) + { + int n {0}; + for (auto const& device : input_devices) + { + qtout << ++n << " - [" << device.deviceName () << ']' << endl; + } + return 0; + } + + bool ok; + int start = parser.value ("s").toInt (&ok); + if (!ok) throw std::invalid_argument {"start time not a number"}; + int duration = parser.value ("d").toInt (&ok); + if (!ok) throw std::invalid_argument {"duration not a number"}; + int sample_rate {48000}; + if (parser.isSet ("r")) + { + sample_rate = parser.value ("r").toInt (&ok); + if (!ok) throw std::invalid_argument {"sample rate not a number"}; + } + int num_channels {2}; + if (parser.isSet ("c")) + { + num_channels = parser.value ("c").toInt (&ok); + if (!ok) throw std::invalid_argument {"channel count not a number"}; + } + int notify_interval {0}; + if (parser.isSet ("n")) + { + notify_interval = parser.value ("n").toInt (&ok); + if (!ok) throw std::invalid_argument {"notify interval not a number"}; + } + int buffer_size {0}; + if (parser.isSet ("b")) + { + buffer_size = parser.value ("b").toInt (&ok); + if (!ok) throw std::invalid_argument {"buffer size not a number"}; + } + int input_device {0}; + if (parser.isSet ("R")) + { + input_device = parser.value ("R").toInt (&ok); + if (!ok || 0 >= input_device || input_device > input_devices.size ()) + { + throw std::invalid_argument {"invalid recording device"}; + } + } + if (!parser.isSet ("o")) throw std::invalid_argument {"output file required"}; + QFileInfo ofi {parser.value ("o")}; + if (!ofi.suffix ().size () && ofi.fileName ()[ofi.fileName ().size () - 1] != QChar {'.'}) + { + ofi.setFile (ofi.filePath () + ".wav"); + } + if (!parser.isSet ("f") && ofi.isFile ()) + { + throw std::invalid_argument {"set the `-force' option to overwrite an existing output file"}; + } + + QAudioFormat audio_format; + audio_format.setSampleRate (sample_rate); + audio_format.setChannelCount (num_channels); + audio_format.setSampleSize (16); + audio_format.setSampleType (QAudioFormat::SignedInt); + audio_format.setCodec ("audio/pcm"); + + auto source = input_device ? input_devices[input_device] : QAudioDeviceInfo::defaultInputDevice (); + if (!source.isFormatSupported (audio_format)) + { + qtout << "warning, requested format not supported, using nearest" << endl; + audio_format = source.nearestFormat (audio_format); + } + + // run the application + Recorder record {start, duration, ofi.filePath (), source, audio_format, notify_interval, buffer_size}; + QObject::connect (&record, &Recorder::done, &app, &QCoreApplication::quit); + return app.exec(); + } + catch (std::exception const& e) + { + std::cerr << "Error: " << e.what () << '\n'; + } + catch (...) + { + std::cerr << "Unexpected fatal error\n"; + throw; // hoping the runtime might tell us more about the exception + } + return -1; +} diff --git a/CMakeLists.txt b/CMakeLists.txt index 3fbb879dc..eb8ece5ac 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1289,6 +1289,9 @@ target_link_libraries (ft4sim_mult wsjt_fort wsjt_cxx) add_executable (ft4d lib/ft4/ft4d.f90 wsjtx.rc) target_link_libraries (ft4d wsjt_fort wsjt_cxx) +add_executable (record_time_signal Audio/tools/record_time_signal.cpp) +target_link_libraries (record_time_signal wsjt_cxx wsjt_qtmm wsjt_qt) + endif(WSJT_BUILD_UTILS) # build the main application From 994a490cddd036782fbf0c48905e4530ee5c9701 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Fri, 10 May 2019 13:58:01 -0400 Subject: [PATCH 067/159] Change output sound buffer to 200 ms (was 2000 ms). --- robots/go | 2 ++ robots/robo.f90 | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ soundout.cpp | 3 +++ 3 files changed, 53 insertions(+) create mode 100644 robots/go create mode 100644 robots/robo.f90 diff --git a/robots/go b/robots/go new file mode 100644 index 000000000..9a7c9f3dd --- /dev/null +++ b/robots/go @@ -0,0 +1,2 @@ +curl https://pskreporter.info/cgi-bin/robot.pl > robo.dat +robo | sort -nr -k2 diff --git a/robots/robo.f90 b/robots/robo.f90 new file mode 100644 index 000000000..69650a149 --- /dev/null +++ b/robots/robo.f90 @@ -0,0 +1,48 @@ +program robo + +! Examine spots from PSK Reporter for past week to identify probable robots + +! In a bash shell, from command line: +! $ curl https://pskreporter.info/cgi-bin/robot.pl > robo.dat +! $ robo | sort -nr -k2 + + parameter (NCHARS=20000) + parameter (NMAX=100) + + character*1 c + character*20000 blob + character*12 callsign(0:NMAX) + integer*1 ic1 + + open(10,file='robo.dat',status='old',access='stream') + callsign=' ' + + do ichar=1,NCHARS + read(10,end=10) ic1 + ic=ic1 + if(ic.lt.0) ic=ic+256 + c=char(ic) + blob(ichar:ichar)=c + enddo +10 continue + + do icall=1,NMAX + i1=index(blob,'":{"median_minutes":')-1 + do i=i1,i1-10,-1 + if(i1.lt.1) go to 20 + if(blob(i:i).eq.'"') exit + enddo + i0=i+1 + callsign(icall)=blob(i0:i1) + i2=index(blob,',')-1 + read(blob(i1+21:i2),*) median_minutes + i3=index(blob,'median_hours')+14 + i4=index(blob,'}')-1 + read(blob(i3:i4),*) median_hours + write(*,3001) median_minutes,median_hours,trim(callsign(icall)) +3001 format(2i5,2x,a) + blob=blob(i4+3:) + enddo + +20 continue +end program robo diff --git a/soundout.cpp b/soundout.cpp index b21675b3a..0264ad91e 100644 --- a/soundout.cpp +++ b/soundout.cpp @@ -9,11 +9,14 @@ #include "moc_soundout.cpp" +/* #if defined (WIN32) # define MS_BUFFERED 1000u #else # define MS_BUFFERED 2000u #endif +*/ +# define MS_BUFFERED 200u bool SoundOutput::audioError () const { From c227c8d143afda4c5ecc8755cfbe143d843794fe Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Fri, 10 May 2019 19:33:12 +0100 Subject: [PATCH 068/159] Export restriction --- .gitattributes | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitattributes b/.gitattributes index 93434826f..b1e1bbf70 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,3 +1,5 @@ .gitattributes export-ignore /samples export-ignore /lib/fsk4hf export-ignore +/lib/fsk4hf export-ignore +/robots export-ignore From 62f9b3275855a518e88b5cf1c97b52a69fe6ea85 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Fri, 10 May 2019 19:38:04 +0100 Subject: [PATCH 069/159] Added playback to record_time_signal tool The tool may be started with either '-o ' to record or with '-i ', where file-path is an existing .WAV file, to playback audio. Audio output devices may be listed with the '-O' option and selected by index number using the '-P ' option. No format conversions are done for playback by the tool so the output device must support the format of the input .WAV file. The playback duration is the duration of the input .WAV file. The tool '-s ' option is now optional, without it recording or playback starts immediately. So to playback a .WAV file: $ record_time_signal -i wwv.wav To play back the same file stating at second 55 in the minute: $ record_time_signal -i wwv.wav -s 55 Use the '-h' option for more help. --- Audio/tools/record_time_signal.cpp | 244 +++++++++++++++++++++++------ 1 file changed, 197 insertions(+), 47 deletions(-) diff --git a/Audio/tools/record_time_signal.cpp b/Audio/tools/record_time_signal.cpp index 4958c5743..f63f8dbdc 100644 --- a/Audio/tools/record_time_signal.cpp +++ b/Audio/tools/record_time_signal.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include @@ -14,6 +15,7 @@ #include #include #include +#include #include #include @@ -25,63 +27,151 @@ namespace QTextStream qtout {stdout}; } -class Recorder final +class Record final : public QObject { Q_OBJECT; public: - Recorder (int start, int duration, QString const& output, QAudioDeviceInfo const& source_device, QAudioFormat const& format, int notify_interval, int buffer_size) - : source_ {source_device, format} + Record (int start, int duration, QAudioDeviceInfo const& source_device, BWFFile * output, int notify_interval, int buffer_size) + : source_ {source_device, output->format ()} , notify_interval_ {notify_interval} - , output_ {format, output} + , output_ {output} , duration_ {duration} { - if (!output_.open (BWFFile::WriteOnly)) throw std::invalid_argument {QString {"cannot open output file \"%1\""}.arg (output).toStdString ()}; - - if (buffer_size) source_.setBufferSize (format.bytesForFrames (buffer_size)); + if (buffer_size) source_.setBufferSize (output_->format ().bytesForFrames (buffer_size)); if (notify_interval_) { source_.setNotifyInterval (notify_interval); - connect (&source_, &QAudioInput::notify, this, &Recorder::notify); + connect (&source_, &QAudioInput::notify, this, &Record::notify); } - QTimer::singleShot (int ((((start - (QDateTime::currentMSecsSinceEpoch () / 1000) % 60) + 60) % 60) * 1000), Qt::PreciseTimer, this, &Recorder::start); + if (start == -1) + { + start_recording (); + } + else + { + QTimer::singleShot (int ((((start - (QDateTime::currentMSecsSinceEpoch () / 1000) % 60) + 60) % 60) * 1000), Qt::PreciseTimer, this, &Record::start_recording); + } } Q_SIGNAL void done (); private: - Q_SLOT void start () + Q_SLOT void start_recording () { qtout << "started recording at " << QDateTime::currentDateTimeUtc ().toString ("hh:mm:ss.zzz UTC") << endl; - source_.start (&output_); - if (!notify_interval_) QTimer::singleShot (duration_ * 1000, Qt::PreciseTimer, this, &Recorder::stop); + source_.start (output_); + if (!notify_interval_) QTimer::singleShot (duration_ * 1000, Qt::PreciseTimer, this, &Record::stop_recording); qtout << QString {"buffer size used is: %1"}.arg (source_.bufferSize ()) << endl; } Q_SLOT void notify () { auto length = source_.elapsedUSecs (); - qtout << QString {"%1 US recorded\r"}.arg (length) << flush; - if (length >= duration_ * 1000 * 1000) stop (); + qtout << QString {"%1 μs recorded\r"}.arg (length) << flush; + if (length >= duration_ * 1000 * 1000) stop_recording (); } - Q_SLOT void stop () + Q_SLOT void stop_recording () { auto length = source_.elapsedUSecs (); source_.stop (); - qtout << QString {"%1 uS recorded "}.arg (length) << '(' << source_.format ().framesForBytes (output_.size ()) << " frames recorded)\n"; + qtout << QString {"%1 μs recorded "}.arg (length) << '(' << source_.format ().framesForBytes (output_->size ()) << " frames recorded)\n"; qtout << "stopped recording at " << QDateTime::currentDateTimeUtc ().toString ("hh:mm:ss.zzz UTC") << endl; Q_EMIT done (); } QAudioInput source_; int notify_interval_; - BWFFile output_; + BWFFile * output_; int duration_; }; +class Playback final + : public QObject +{ + Q_OBJECT; + +public: + Playback (int start, BWFFile * input, QAudioDeviceInfo const& sink_device, int notify_interval, int buffer_size) + : input_ {input} + , sink_ {sink_device, input->format ()} + , notify_interval_ {notify_interval} + { + if (buffer_size) sink_.setBufferSize (input_->format ().bytesForFrames (buffer_size)); + if (notify_interval_) + { + sink_.setNotifyInterval (notify_interval); + connect (&sink_, &QAudioOutput::notify, this, &Playback::notify); + } + if (start == -1) + { + start_playback (); + + } + else + { + QTimer::singleShot (int ((((start - (QDateTime::currentMSecsSinceEpoch () / 1000) % 60) + 60) % 60) * 1000), Qt::PreciseTimer, this, &Playback::start_playback); + } + } + + Q_SIGNAL void done (); + +private: + Q_SLOT void start_playback () + { + qtout << "started playback at " << QDateTime::currentDateTimeUtc ().toString ("hh:mm:ss.zzz UTC") << endl; + sink_.start (input_); + qtout << QString {"buffer size used is: %1 (%2 frames)"}.arg (sink_.bufferSize ()).arg (sink_.format ().framesForBytes (sink_.bufferSize ())) << endl; + connect (&sink_, &QAudioOutput::stateChanged, this, &Playback::sink_state_changed); + } + + Q_SLOT void notify () + { + auto length = sink_.elapsedUSecs (); + qtout << QString {"%1 μs rendered\r"}.arg (length) << flush; + } + + Q_SLOT void sink_state_changed (QAudio::State state) + { + switch (state) + { + case QAudio::ActiveState: + qtout << "\naudio output state changed to active\n"; + break; + case QAudio::SuspendedState: + qtout << "\naudio output state changed to suspended\n"; + break; + case QAudio::StoppedState: + qtout << "\naudio output state changed to stopped\n"; + break; + case QAudio::IdleState: + stop_playback (); + break; +#if QT_VERSION >= QT_VERSION_CHECK (5, 10, 0) + case QAudio::InterruptedState: + qtout << "\naudio output state changed to interrupted\n"; + break; +#endif + } + } + + Q_SLOT void stop_playback () + { + auto length = sink_.elapsedUSecs (); + sink_.stop (); + qtout << QString {"%1 μs rendered "}.arg (length) << '(' << sink_.format ().framesForBytes (input_->size ()) << " frames rendered)\n"; + qtout << "stopped playback at " << QDateTime::currentDateTimeUtc ().toString ("hh:mm:ss.zzz UTC") << endl; + Q_EMIT done (); + } + + BWFFile * input_; + QAudioOutput sink_; + int notify_interval_; +}; + #include "record_time_signal.moc" int main(int argc, char *argv[]) @@ -110,8 +200,10 @@ int main(int argc, char *argv[]) parser.addOptions ({ {{"I", "list-audio-inputs"}, app.translate ("main", "List the available audio input devices")}, + {{"O", "list-audio-outputs"}, + app.translate ("main", "List the available audio output devices")}, {{"s", "start-time"}, - app.translate ("main", "Record from seconds"), + app.translate ("main", "Record from seconds, default start immediately"), app.translate ("main", "start-time")}, {{"d", "duration"}, app.translate ("main", "Recording seconds"), @@ -119,17 +211,23 @@ int main(int argc, char *argv[]) {{"o", "output"}, app.translate ("main", "Save output as "), app.translate ("main", "output-file")}, + {{"i", "input"}, + app.translate ("main", "Playback "), + app.translate ("main", "input-file")}, {{"f", "force"}, app.translate ("main", "Overwrite existing file")}, {{"r", "sample-rate"}, - app.translate ("main", "Record at "), + app.translate ("main", "Record at , default 48000 Hz"), app.translate ("main", "sample-rate")}, {{"c", "num-channels"}, - app.translate ("main", "Record channels"), + app.translate ("main", "Record channels, default 2"), app.translate ("main", "num")}, {{"R", "recording-device-number"}, app.translate ("main", "Record from "), app.translate ("main", "device-number")}, + {{"P", "playback-device-number"}, + app.translate ("main", "Playback to "), + app.translate ("main", "device-number")}, {{"n", "notify-interval"}, app.translate ("main", "use notify signals every milliseconds, zero to use a timer"), app.translate ("main", "interval")}, @@ -150,11 +248,24 @@ int main(int argc, char *argv[]) return 0; } + auto output_devices = QAudioDeviceInfo::availableDevices (QAudio::AudioOutput); + if (parser.isSet ("O")) + { + int n {0}; + for (auto const& device : output_devices) + { + qtout << ++n << " - [" << device.deviceName () << ']' << endl; + } + return 0; + } + bool ok; - int start = parser.value ("s").toInt (&ok); - if (!ok) throw std::invalid_argument {"start time not a number"}; - int duration = parser.value ("d").toInt (&ok); - if (!ok) throw std::invalid_argument {"duration not a number"}; + int start {-1}; + if (parser.isSet ("s")) + { + start = parser.value ("s").toInt (&ok); + if (!ok) throw std::invalid_argument {"start time not a number"}; + } int sample_rate {48000}; if (parser.isSet ("r")) { @@ -188,35 +299,74 @@ int main(int argc, char *argv[]) throw std::invalid_argument {"invalid recording device"}; } } - if (!parser.isSet ("o")) throw std::invalid_argument {"output file required"}; - QFileInfo ofi {parser.value ("o")}; - if (!ofi.suffix ().size () && ofi.fileName ()[ofi.fileName ().size () - 1] != QChar {'.'}) + int output_device {0}; + if (parser.isSet ("P")) { - ofi.setFile (ofi.filePath () + ".wav"); - } - if (!parser.isSet ("f") && ofi.isFile ()) - { - throw std::invalid_argument {"set the `-force' option to overwrite an existing output file"}; + output_device = parser.value ("P").toInt (&ok); + if (!ok || 0 >= output_device || output_device > output_devices.size ()) + { + throw std::invalid_argument {"invalid playback device"}; + } } + if (!(parser.isSet ("o") || parser.isSet ("i"))) throw std::invalid_argument {"file required"}; + if (parser.isSet ("o") && parser.isSet ("i")) throw std::invalid_argument {"specify either input or output"}; QAudioFormat audio_format; - audio_format.setSampleRate (sample_rate); - audio_format.setChannelCount (num_channels); - audio_format.setSampleSize (16); - audio_format.setSampleType (QAudioFormat::SignedInt); - audio_format.setCodec ("audio/pcm"); - - auto source = input_device ? input_devices[input_device] : QAudioDeviceInfo::defaultInputDevice (); - if (!source.isFormatSupported (audio_format)) + if (parser.isSet ("o")) // Record { - qtout << "warning, requested format not supported, using nearest" << endl; - audio_format = source.nearestFormat (audio_format); - } + int duration = parser.value ("d").toInt (&ok); + if (!ok) throw std::invalid_argument {"duration not a number"}; - // run the application - Recorder record {start, duration, ofi.filePath (), source, audio_format, notify_interval, buffer_size}; - QObject::connect (&record, &Recorder::done, &app, &QCoreApplication::quit); - return app.exec(); + QFileInfo ofi {parser.value ("o")}; + if (!ofi.suffix ().size () && ofi.fileName ()[ofi.fileName ().size () - 1] != QChar {'.'}) + { + ofi.setFile (ofi.filePath () + ".wav"); + } + if (!parser.isSet ("f") && ofi.isFile ()) + { + throw std::invalid_argument {"set the `-force' option to overwrite an existing output file"}; + } + + audio_format.setSampleRate (sample_rate); + audio_format.setChannelCount (num_channels); + audio_format.setSampleSize (16); + audio_format.setSampleType (QAudioFormat::SignedInt); + audio_format.setCodec ("audio/pcm"); + + auto source = input_device ? input_devices[input_device] : QAudioDeviceInfo::defaultInputDevice (); + if (!source.isFormatSupported (audio_format)) + { + qtout << "warning, requested format not supported, using nearest" << endl; + audio_format = source.nearestFormat (audio_format); + } + BWFFile output_file {audio_format, ofi.filePath ()}; + if (!output_file.open (BWFFile::WriteOnly)) throw std::invalid_argument {QString {"cannot open output file \"%1\""}.arg (ofi.filePath ()).toStdString ()}; + + // run the application + Record record {start, duration, source, &output_file, notify_interval, buffer_size}; + QObject::connect (&record, &Record::done, &app, &QCoreApplication::quit); + return app.exec(); + } + else // Playback + { + QFileInfo ifi {parser.value ("i")}; + if (!ifi.isFile () && !ifi.suffix ().size () && ifi.fileName ()[ifi.fileName ().size () - 1] != QChar {'.'}) + { + ifi.setFile (ifi.filePath () + ".wav"); + } + BWFFile input_file {audio_format, ifi.filePath ()}; + if (!input_file.open (BWFFile::ReadOnly)) throw std::invalid_argument {QString {"cannot open input file \"%1\""}.arg (ifi.filePath ()).toStdString ()}; + auto sink = output_device ? output_devices[output_device] : QAudioDeviceInfo::defaultOutputDevice (); + if (!sink.isFormatSupported (input_file.format ())) + { + throw std::invalid_argument {"audio output device does not support input file audio format"}; + } + + // run the application + Playback play {start, &input_file, sink, notify_interval, buffer_size}; + QObject::connect (&play, &Playback::done, &app, &QCoreApplication::quit); + return app.exec(); + } } catch (std::exception const& e) { From 8d6c7649e0ca0ffe30c0fc343fc54f501b0363ce Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Fri, 10 May 2019 20:31:16 +0100 Subject: [PATCH 070/159] Repaired a defect in the calculation of delay before starting audio streams --- Audio/tools/record_time_signal.cpp | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/Audio/tools/record_time_signal.cpp b/Audio/tools/record_time_signal.cpp index f63f8dbdc..8cd4f8ee1 100644 --- a/Audio/tools/record_time_signal.cpp +++ b/Audio/tools/record_time_signal.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #include "revision_utils.hpp" #include "Audio/BWFFile.hpp" @@ -52,7 +53,12 @@ public: } else { - QTimer::singleShot (int ((((start - (QDateTime::currentMSecsSinceEpoch () / 1000) % 60) + 60) % 60) * 1000), Qt::PreciseTimer, this, &Record::start_recording); + auto now = QDateTime::currentDateTimeUtc (); + auto time = now.time (); + auto then = now; + then.setTime (QTime {time.hour (), time.minute (), start}); + auto delta_ms = (now.msecsTo (then) + (60 * 1000)) % (60 * 1000); + QTimer::singleShot (int (delta_ms), Qt::PreciseTimer, this, &Record::start_recording); } } @@ -113,7 +119,12 @@ public: } else { - QTimer::singleShot (int ((((start - (QDateTime::currentMSecsSinceEpoch () / 1000) % 60) + 60) % 60) * 1000), Qt::PreciseTimer, this, &Playback::start_playback); + auto now = QDateTime::currentDateTimeUtc (); + auto time = now.time (); + auto then = now; + then.setTime (QTime {time.hour (), time.minute (), start}); + auto delta_ms = (now.msecsTo (then) + (60 * 1000)) % (60 * 1000); + QTimer::singleShot (int (delta_ms), Qt::PreciseTimer, this, &Playback::start_playback); } } From c393740b0a8cba7edfd6032ec7165a496b7a91b8 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Sat, 11 May 2019 01:57:56 +0100 Subject: [PATCH 071/159] Fix an off by error --- Audio/tools/record_time_signal.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Audio/tools/record_time_signal.cpp b/Audio/tools/record_time_signal.cpp index 8cd4f8ee1..c128e34ff 100644 --- a/Audio/tools/record_time_signal.cpp +++ b/Audio/tools/record_time_signal.cpp @@ -112,10 +112,10 @@ public: sink_.setNotifyInterval (notify_interval); connect (&sink_, &QAudioOutput::notify, this, &Playback::notify); } + connect (&sink_, &QAudioOutput::stateChanged, this, &Playback::sink_state_changed); if (start == -1) { start_playback (); - } else { @@ -136,7 +136,6 @@ private: qtout << "started playback at " << QDateTime::currentDateTimeUtc ().toString ("hh:mm:ss.zzz UTC") << endl; sink_.start (input_); qtout << QString {"buffer size used is: %1 (%2 frames)"}.arg (sink_.bufferSize ()).arg (sink_.format ().framesForBytes (sink_.bufferSize ())) << endl; - connect (&sink_, &QAudioOutput::stateChanged, this, &Playback::sink_state_changed); } Q_SLOT void notify () @@ -160,6 +159,7 @@ private: break; case QAudio::IdleState: stop_playback (); + qtout << "\naudio output state changed to idle\n"; break; #if QT_VERSION >= QT_VERSION_CHECK (5, 10, 0) case QAudio::InterruptedState: @@ -276,6 +276,7 @@ int main(int argc, char *argv[]) { start = parser.value ("s").toInt (&ok); if (!ok) throw std::invalid_argument {"start time not a number"}; + if (0 > start || start > 59) throw std::invalid_argument {"0 > start > 59"}; } int sample_rate {48000}; if (parser.isSet ("r")) @@ -344,7 +345,7 @@ int main(int argc, char *argv[]) audio_format.setSampleType (QAudioFormat::SignedInt); audio_format.setCodec ("audio/pcm"); - auto source = input_device ? input_devices[input_device] : QAudioDeviceInfo::defaultInputDevice (); + auto source = input_device ? input_devices[input_device - 1] : QAudioDeviceInfo::defaultInputDevice (); if (!source.isFormatSupported (audio_format)) { qtout << "warning, requested format not supported, using nearest" << endl; @@ -367,7 +368,7 @@ int main(int argc, char *argv[]) } BWFFile input_file {audio_format, ifi.filePath ()}; if (!input_file.open (BWFFile::ReadOnly)) throw std::invalid_argument {QString {"cannot open input file \"%1\""}.arg (ifi.filePath ()).toStdString ()}; - auto sink = output_device ? output_devices[output_device] : QAudioDeviceInfo::defaultOutputDevice (); + auto sink = output_device ? output_devices[output_device - 1] : QAudioDeviceInfo::defaultOutputDevice (); if (!sink.isFormatSupported (input_file.format ())) { throw std::invalid_argument {"audio output device does not support input file audio format"}; From ab1454a24cc14fc320a43205b541023e199d7d1c Mon Sep 17 00:00:00 2001 From: Steven Franke Date: Sat, 11 May 2019 09:36:15 -0500 Subject: [PATCH 072/159] Try to avoid a crash in freqcal.f90 when data is all zeros. --- lib/freqcal.f90 | 48 ++++++++++++++++++++++++++++-------------------- 1 file changed, 28 insertions(+), 20 deletions(-) diff --git a/lib/freqcal.f90 b/lib/freqcal.f90 index 540237f6e..80ce90c66 100644 --- a/lib/freqcal.f90 +++ b/lib/freqcal.f90 @@ -41,6 +41,7 @@ subroutine freqcal(id2,k,nkhz,noffset,ntol,line) endif smax=0. s=0. + ipk=-99 do i=ia,ib s(i)=real(cx(i))**2 + aimag(cx(i))**2 if(s(i).gt.smax) then @@ -48,25 +49,32 @@ subroutine freqcal(id2,k,nkhz,noffset,ntol,line) ipk=i endif enddo - - call peakup(s(ipk-1),s(ipk),s(ipk+1),dx) - fpeak=df * (ipk+dx) - ap=(fpeak/fs+1.0/(2.0*NFFT)) - an=(fpeak/fs-1.0/(2.0*NFFT)) - sp=sum(id2((k-NFFT):k-1)*cmplx(cos(xi*ap),-sin(xi*ap))) - sn=sum(id2((k-NFFT):k-1)*cmplx(cos(xi*an),-sin(xi*an))) - fpeak=fpeak+fs*(abs(sp)-abs(sn))/(abs(sp)+abs(sn))/(2*NFFT) - xsum=0. - nsum=0 - do i=ia,ib - if(abs(i-ipk).gt.10) then - xsum=xsum+s(i) - nsum=nsum+1 - endif - enddo - ave=xsum/nsum - snr=db(smax/ave) - pave=db(ave) + 8.0 + + if(ipk.ge.1) then + call peakup(s(ipk-1),s(ipk),s(ipk+1),dx) + fpeak=df * (ipk+dx) + ap=(fpeak/fs+1.0/(2.0*NFFT)) + an=(fpeak/fs-1.0/(2.0*NFFT)) + sp=sum(id2((k-NFFT):k-1)*cmplx(cos(xi*ap),-sin(xi*ap))) + sn=sum(id2((k-NFFT):k-1)*cmplx(cos(xi*an),-sin(xi*an))) + fpeak=fpeak+fs*(abs(sp)-abs(sn))/(abs(sp)+abs(sn))/(2*NFFT) + xsum=0. + nsum=0 + do i=ia,ib + if(abs(i-ipk).gt.10) then + xsum=xsum+s(i) + nsum=nsum+1 + endif + enddo + ave=xsum/nsum + snr=db(smax/ave) + pave=db(ave) + 8.0 + else + snr=-99.9 + pave=-99.9 + fpeak=-99.9 + ferr=-99.9 + endif cflag=' ' if(snr.lt.20.0) cflag='*' n=n+1 @@ -77,7 +85,7 @@ subroutine freqcal(id2,k,nkhz,noffset,ntol,line) ncal=1 ferr=fpeak-noffset write(line,1100) nhr,nmin,nsec,nkhz,ncal,noffset,fpeak,ferr,pave, & - snr,cflag,char(0) + snr,cflag,char(0) 1100 format(i2.2,':',i2.2,':',i2.2,i7,i3,i6,2f10.3,2f7.1,2x,a1,a1) 900 return From 350391d66ef817444477b6408ce8defb0616d512 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Sat, 11 May 2019 16:43:48 +0100 Subject: [PATCH 073/159] AAdded audio o/p category to playback options --- Audio/tools/record_time_signal.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Audio/tools/record_time_signal.cpp b/Audio/tools/record_time_signal.cpp index c128e34ff..6a78a0a2c 100644 --- a/Audio/tools/record_time_signal.cpp +++ b/Audio/tools/record_time_signal.cpp @@ -101,12 +101,13 @@ class Playback final Q_OBJECT; public: - Playback (int start, BWFFile * input, QAudioDeviceInfo const& sink_device, int notify_interval, int buffer_size) + Playback (int start, BWFFile * input, QAudioDeviceInfo const& sink_device, int notify_interval, int buffer_size, QString const& category) : input_ {input} , sink_ {sink_device, input->format ()} , notify_interval_ {notify_interval} { if (buffer_size) sink_.setBufferSize (input_->format ().bytesForFrames (buffer_size)); + if (category.size ()) sink_.setCategory (category); if (notify_interval_) { sink_.setNotifyInterval (notify_interval); @@ -239,6 +240,9 @@ int main(int argc, char *argv[]) {{"P", "playback-device-number"}, app.translate ("main", "Playback to "), app.translate ("main", "device-number")}, + {{"C", "category"}, + app.translate ("main", "Playback "), + app.translate ("main", "category-name")}, {{"n", "notify-interval"}, app.translate ("main", "use notify signals every milliseconds, zero to use a timer"), app.translate ("main", "interval")}, @@ -375,7 +379,7 @@ int main(int argc, char *argv[]) } // run the application - Playback play {start, &input_file, sink, notify_interval, buffer_size}; + Playback play {start, &input_file, sink, notify_interval, buffer_size, parser.value ("category")}; QObject::connect (&play, &Playback::done, &app, &QCoreApplication::quit); return app.exec(); } From 2044b736dad8444272d3dd5f89cf63716ccbf073 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 20 May 2019 12:46:36 -0400 Subject: [PATCH 074/159] Fix a bug in calculation of S/N in JT4 mode. --- lib/jt4_decode.f90 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/jt4_decode.f90 b/lib/jt4_decode.f90 index da0fbda68..ff0b33c4d 100644 --- a/lib/jt4_decode.f90 +++ b/lib/jt4_decode.f90 @@ -156,7 +156,7 @@ contains nfreqz=nint(dfx) call timer('sync4 ',1) - nsnr=nint(snrx) + nsnr=-26 if(sync.lt.syncmin) then if (associated (this%decode_callback)) then call this%decode_callback(nsnr,dtxz,nfreqz,.false.,csync, & @@ -166,6 +166,7 @@ contains endif ! We have achieved sync + nsnr=nint(snrsync - 22.9) decoded=blank deepmsg=blank special=' ' From 10aaec90e3309b77a6965c41193839c72ced7a3e Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Tue, 21 May 2019 12:09:17 -0400 Subject: [PATCH 075/159] FT4 decodes using jt9 from command line now use ndepth=3. --- lib/jt9.f90 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/jt9.f90 b/lib/jt9.f90 index a0ffcda31..68984e33a 100644 --- a/lib/jt9.f90 +++ b/lib/jt9.f90 @@ -157,7 +157,7 @@ program jt9 end do go to 999 endif - + iret=fftwf_init_threads() !Initialize FFTW threading ! Default to 1 thread, but use nthreads for the big ones @@ -179,6 +179,7 @@ program jt9 go to 999 endif + if(mode.eq.5) ndepth=3 allocate(shared_data) nflatten=0 From 6507fedec3d3aa21e5f3921fcab8690d155f7915 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Wed, 22 May 2019 02:23:04 +0100 Subject: [PATCH 076/159] Correct FT4 mode designation for ADIF v3.1.0 and later FT4 -> MFSK FT4 When reading ADIF records FT4 is acceptable as well. --- logbook/WorkedBefore.cpp | 7 ++++++- logbook/logbook.cpp | 9 ++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/logbook/WorkedBefore.cpp b/logbook/WorkedBefore.cpp index daaf18fc7..31380b4c3 100644 --- a/logbook/WorkedBefore.cpp +++ b/logbook/WorkedBefore.cpp @@ -332,10 +332,15 @@ namespace // will parse a record { auto const& entity = prefixes->lookup (call); + auto mode = extractField (record, "MODE").toUpper (); + if (!mode.size () || "MFSK" == mode) + { + mode = extractField (record, "SUBMODE").toUpper (); + } worked.emplace (call.toUpper () , extractField (record, "GRIDSQUARE").left (4).toUpper () // not interested in 6-digit grids , extractField (record, "BAND").toUpper () - , extractField (record, "MODE").toUpper () + , mode , entity.entity_name , entity.continent , entity.CQ_zone diff --git a/logbook/logbook.cpp b/logbook/logbook.cpp index b84b65c1a..e4a04f64a 100644 --- a/logbook/logbook.cpp +++ b/logbook/logbook.cpp @@ -69,7 +69,14 @@ QByteArray LogBook::QSOToADIF (QString const& hisCall, QString const& hisGrid, Q QString t; t = "" + hisCall; t += " " + hisGrid; - t += " " + mode; + if (mode != "FT4") + { + t += " " + mode; + } + else + { + t += " MFSK " + mode; + } t += " " + rptSent; t += " " + rptRcvd; t += " " + dateTimeOn.date().toString("yyyyMMdd"); From 0d3be0128b1361bddf816279e08e4001f1c5d0a2 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Wed, 22 May 2019 12:44:28 -0400 Subject: [PATCH 077/159] Change m_TRperiod from qint32 to double. Functional, but needs more testing! --- Detector.cpp | 6 ++- Detector.hpp | 7 +-- Modulator.cpp | 19 ++++--- Modulator.hpp | 10 ++-- widgets/astro.cpp | 7 +-- widgets/astro.h | 2 +- widgets/fastgraph.cpp | 4 +- widgets/fastgraph.h | 6 +-- widgets/fastplot.cpp | 6 +-- widgets/fastplot.h | 4 +- widgets/mainwindow.cpp | 109 +++++++++++++++++++++-------------------- widgets/mainwindow.h | 2 +- widgets/plotter.cpp | 8 +-- widgets/plotter.h | 4 +- widgets/widegraph.cpp | 16 +++--- widgets/widegraph.h | 7 +-- 16 files changed, 113 insertions(+), 104 deletions(-) diff --git a/Detector.cpp b/Detector.cpp index 69a10f5e8..3bf5cf410 100644 --- a/Detector.cpp +++ b/Detector.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include "commons.h" #include "moc_Detector.cpp" @@ -10,7 +11,7 @@ extern "C" { void fil4_(qint16*, qint32*, qint16*, qint32*); } -Detector::Detector (unsigned frameRate, unsigned periodLengthInSeconds, +Detector::Detector (unsigned frameRate, double periodLengthInSeconds, unsigned downSampleFactor, QObject * parent) : AudioDevice (parent) , m_frameRate (frameRate) @@ -128,5 +129,6 @@ unsigned Detector::secondInPeriod () const qint64 now (QDateTime::currentMSecsSinceEpoch ()); unsigned secondInToday ((now % 86400000LL) / 1000); - return secondInToday % m_period; + unsigned secInPeriod = fmod(double(secondInToday),m_period); + return secInPeriod; } diff --git a/Detector.hpp b/Detector.hpp index d5e5b0a38..404951a90 100644 --- a/Detector.hpp +++ b/Detector.hpp @@ -22,9 +22,10 @@ public: // // the samplesPerFFT argument is the number after down sampling // - Detector (unsigned frameRate, unsigned periodLengthInSeconds, unsigned downSampleFactor = 4u, QObject * parent = 0); + Detector (unsigned frameRate, double periodLengthInSeconds, unsigned downSampleFactor = 4u, + QObject * parent = 0); - void setTRPeriod(unsigned p) {m_period=p;} + void setTRPeriod(double p) {m_period=p;} bool reset () override; Q_SIGNAL void framesWritten (qint64) const; @@ -43,7 +44,7 @@ private: unsigned secondInPeriod () const; unsigned m_frameRate; - unsigned m_period; + double m_period; unsigned m_downSampleFactor; qint32 m_samplesPerFFT; // after any down sampling qint32 m_ns; diff --git a/Modulator.cpp b/Modulator.cpp index 725de9e42..e5587120b 100644 --- a/Modulator.cpp +++ b/Modulator.cpp @@ -25,7 +25,7 @@ double constexpr Modulator::m_twoPi; // unsigned m_nspd=1.2*48000.0/wpm; // m_nspd=3072; //18.75 WPM -Modulator::Modulator (unsigned frameRate, unsigned periodLengthInSeconds, +Modulator::Modulator (unsigned frameRate, double periodLengthInSeconds, QObject * parent) : AudioDevice {parent} , m_quickClose {false} @@ -45,14 +45,13 @@ Modulator::Modulator (unsigned frameRate, unsigned periodLengthInSeconds, void Modulator::start (unsigned symbolsLength, double framesPerSymbol, double frequency, double toneSpacing, SoundOutput * stream, Channel channel, - bool synchronize, bool fastMode, double dBSNR, int TRperiod) + bool synchronize, bool fastMode, double dBSNR, double TRperiod) { Q_ASSERT (stream); // Time according to this computer which becomes our base time qint64 ms0 = QDateTime::currentMSecsSinceEpoch() % 86400000; -// qDebug() << "ModStart" << symbolsLength << framesPerSymbol -// << frequency << toneSpacing; +// qDebug() << "ModStart" << QDateTime::currentDateTimeUtc().toString("hh:mm:ss.sss"); if(m_state != Idle) stop (); @@ -78,7 +77,7 @@ void Modulator::start (unsigned symbolsLength, double framesPerSymbol, if (m_snr > 1.0) m_fac = 3000.0 / m_snr; } - unsigned mstr = ms0 % (1000 * m_period); // ms in period + unsigned mstr = ms0 % int(1000.0*m_period); // ms in period // round up to an exact portion of a second that allows for startup // delays @@ -183,12 +182,12 @@ qint64 Modulator::readData (char * data, qint64 maxSize) if(!m_tuning) isym=m_ic/(4.0*m_nsps); // Actual fsample=48000 bool slowCwId=((isym >= m_symbolsLength) && (icw[0] > 0)) && (!m_bFastMode); - if(m_TRperiod==3) slowCwId=false; + if(m_TRperiod==3.0) slowCwId=false; bool fastCwId=false; static bool bCwId=false; qint64 ms = QDateTime::currentMSecsSinceEpoch(); - float tsec=0.001*(ms % (1000*m_TRperiod)); - if(m_bFastMode and (icw[0]>0) and (tsec>(m_TRperiod-5.0))) fastCwId=true; + float tsec=0.001*(ms % int(1000*m_TRperiod)); + if(m_bFastMode and (icw[0]>0) and (tsec > (m_TRperiod-5.0))) fastCwId=true; if(!m_bFastMode) m_nspd=2560; // 22.5 WPM // qDebug() << "Mod A" << m_ic << isym << tsec; @@ -259,7 +258,7 @@ qint64 Modulator::readData (char * data, qint64 maxSize) i1= m_symbolsLength * 4.0 * m_nsps; } if(m_bFastMode and !m_tuning) { - i1=m_TRperiod*48000 - 24000; + i1=m_TRperiod*48000.0 - 24000.0; i0=i1-816; } @@ -267,7 +266,7 @@ qint64 Modulator::readData (char * data, qint64 maxSize) for (unsigned i = 0; i < numFrames && m_ic <= i1; ++i) { isym=0; - if(!m_tuning and m_TRperiod!=3) isym=m_ic/(4.0*m_nsps); //Actual fsample=48000 + if(!m_tuning and m_TRperiod!=3.0) isym=m_ic/(4.0*m_nsps); //Actual fsample=48000 if(m_bFastMode) isym=isym%m_symbolsLength; if (isym != m_isym0 || m_frequency != m_frequency0) { if(itone[0]>=100) { diff --git a/Modulator.hpp b/Modulator.hpp index e8df7f2dd..3371cbe5e 100644 --- a/Modulator.hpp +++ b/Modulator.hpp @@ -23,7 +23,7 @@ class Modulator public: enum ModulatorState {Synchronizing, Active, Idle}; - Modulator (unsigned frameRate, unsigned periodLengthInSeconds, QObject * parent = nullptr); + Modulator (unsigned frameRate, double periodLengthInSeconds, QObject * parent = nullptr); void close () override; @@ -31,14 +31,14 @@ public: double frequency () const {return m_frequency;} bool isActive () const {return m_state != Idle;} void setSpread(double s) {m_fSpread=s;} - void setTRPeriod(unsigned p) {m_period=p;} + void setTRPeriod(double p) {m_period=p;} void set_nsym(int n) {m_symbolsLength=n;} void set_ms0(qint64 ms) {m_ms0=ms;} Q_SLOT void start (unsigned symbolsLength, double framesPerSymbol, double frequency, double toneSpacing, SoundOutput *, Channel = Mono, bool synchronize = true, bool fastMode = false, - double dBSNR = 99., int TRperiod=60); + double dBSNR = 99., double TRperiod=60.0); Q_SLOT void stop (bool quick = false); Q_SLOT void tune (bool newState = true); Q_SLOT void setFrequency (double newFrequency) {m_frequency = newFrequency;} @@ -72,14 +72,14 @@ private: double m_fac; double m_toneSpacing; double m_fSpread; + double m_TRperiod; + double m_period; qint64 m_silentFrames; qint64 m_ms0; - qint32 m_TRperiod; qint16 m_ramp; unsigned m_frameRate; - unsigned m_period; ModulatorState volatile m_state; bool volatile m_tuning; diff --git a/widgets/astro.cpp b/widgets/astro.cpp index 4ee55da4a..c1eee0157 100644 --- a/widgets/astro.cpp +++ b/widgets/astro.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include "commons.h" #include "MessageBox.hpp" @@ -90,7 +91,7 @@ void Astro::write_settings () } auto Astro::astroUpdate(QDateTime const& t, QString const& mygrid, QString const& hisgrid, Frequency freq, - bool dx_is_self, bool bTx, bool no_tx_QSY, int TR_period) -> Correction + bool dx_is_self, bool bTx, bool no_tx_QSY, double TR_period) -> Correction { Frequency freq_moon {freq}; double azsun,elsun,azmoon,elmoon,azmoondx,elmoondx; @@ -211,8 +212,8 @@ auto Astro::astroUpdate(QDateTime const& t, QString const& mygrid, QString const // // use a base time of (secs-since-epoch + 2) so as to be sure // we do the next period if we calculate just before it starts - auto sec_since_epoch = t.toMSecsSinceEpoch () / 1000 + 2; - auto target_sec = sec_since_epoch - sec_since_epoch % TR_period + TR_period / 2; + auto sec_since_epoch = t.toMSecsSinceEpoch ()/1000 + 2; + auto target_sec = sec_since_epoch - fmod(double(sec_since_epoch),TR_period) + 0.5*TR_period; auto target_date_time = QDateTime::fromMSecsSinceEpoch (target_sec * 1000, Qt::UTC); QString date {target_date_time.date().toString("yyyy MMM dd").trimmed ()}; QString utc {target_date_time.time().toString().trimmed ()}; diff --git a/widgets/astro.h b/widgets/astro.h index 03d8c66c6..4f7f71d5b 100644 --- a/widgets/astro.h +++ b/widgets/astro.h @@ -44,7 +44,7 @@ public: bool dx_is_self, bool bTx, bool no_tx_QSY, - int TR_period); + double TR_period); bool doppler_tracking () const; Q_SLOT void nominal_frequency (Frequency rx, Frequency tx); diff --git a/widgets/fastgraph.cpp b/widgets/fastgraph.cpp index e599138f2..9efe5fc63 100644 --- a/widgets/fastgraph.cpp +++ b/widgets/fastgraph.cpp @@ -86,9 +86,9 @@ void FastGraph::on_greenZeroSlider_valueChanged(int value) ui->fastPlot->draw(); } -void FastGraph::setTRPeriod(int n) +void FastGraph::setTRPeriod(double p) { - m_TRperiod=n; + m_TRperiod=p; ui->fastPlot->setTRperiod(m_TRperiod); } diff --git a/widgets/fastgraph.h b/widgets/fastgraph.h index 7ed32671f..b5f7c0b8d 100644 --- a/widgets/fastgraph.h +++ b/widgets/fastgraph.h @@ -22,7 +22,7 @@ public: void plotSpec(bool diskData, int UTCdisk); void saveSettings(); - void setTRPeriod(int n); + void setTRPeriod(double p); void setMode(QString mode); signals: @@ -40,8 +40,8 @@ protected: private: QSettings * m_settings; - float m_ave; - qint32 m_TRperiod; + float m_ave; + double m_TRperiod; QScopedPointer ui; }; diff --git a/widgets/fastplot.cpp b/widgets/fastplot.cpp index 1437834d8..a388f0ac7 100644 --- a/widgets/fastplot.cpp +++ b/widgets/fastplot.cpp @@ -135,11 +135,11 @@ void FPlotter::setGreenZero(int n) m_bPaint2=true; } -void FPlotter::setTRperiod(int n) +void FPlotter::setTRperiod(double p) { - m_TRperiod=n; + m_TRperiod=p; m_pixPerSecond=12000.0/512.0; - if(m_TRperiod<30) m_pixPerSecond=12000.0/256.0; + if(m_TRperiod<30.0) m_pixPerSecond=12000.0/256.0; drawScale(); update(); } diff --git a/widgets/fastplot.h b/widgets/fastplot.h index b13913388..f24fcc24e 100644 --- a/widgets/fastplot.h +++ b/widgets/fastplot.h @@ -37,7 +37,7 @@ public: void setPlotZero(int plotZero); void setPlotGain(int plotGain); void setGreenZero(int n); - void setTRperiod(int n); + void setTRperiod(double p); void drawScale(); void setMode(QString mode); @@ -68,6 +68,7 @@ private: QString m_mode; double m_pixPerSecond; + double m_TRperiod; qint32 m_hdivs; qint32 m_h; @@ -75,7 +76,6 @@ private: qint32 m_h2; QPixmap m_HorizPixmap; qint32 m_jh0; - qint32 m_TRperiod; bool m_bPaint2; }; diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 88fe0016e..d40e0d1c9 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -246,7 +246,7 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple, m_logDlg (new LogQSO (program_title (), m_settings, &m_config, nullptr)), m_lastDialFreq {0}, m_dialFreqRxWSPR {0}, - m_detector {new Detector {RX_SAMPLE_RATE, NTMAX, downSampleFactor}}, + m_detector {new Detector {RX_SAMPLE_RATE, double(NTMAX), downSampleFactor}}, m_FFTSize {6192 / 2}, // conservative value to avoid buffer overruns m_soundInput {new SoundInput}, m_modulator {new Modulator {TX_SAMPLE_RATE, NTMAX}}, @@ -257,6 +257,7 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple, m_freqTxNominal {0}, m_s6 {0.}, m_tRemaining {0.}, + m_TRperiod {60.0}, m_DTtol {3.0}, m_waterfallAvg {1}, m_ntx {1}, @@ -268,7 +269,6 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple, m_nutc0 {999999}, m_ntr {0}, m_tx {0}, - m_TRperiod {60}, m_inGain {0}, m_secID {0}, m_idleMinutes {0}, @@ -877,7 +877,6 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple, connect (&m_wav_future_watcher, &QFutureWatcher::finished, this, &MainWindow::diskDat); connect(&watcher3, SIGNAL(finished()),this,SLOT(fast_decode_done())); -// Q_EMIT startAudioInputStream (m_config.audio_input_device (), m_framesAudioInputBuffered, &m_detector, m_downSampleFactor, m_config.audio_input_channel ()); Q_EMIT startAudioInputStream (m_config.audio_input_device (), m_framesAudioInputBuffered, m_detector, m_downSampleFactor, m_config.audio_input_channel ()); Q_EMIT initializeAudioOutputStream (m_config.audio_output_device (), AudioDevice::Mono == m_config.audio_output_channel () ? 1 : 2, m_msAudioOutputBuffered); Q_EMIT transmitFrequency (ui->TxFreqSpinBox->value () - m_XIT); @@ -1355,7 +1354,7 @@ void MainWindow::dataSink(qint64 frames) } // Get power, spectrum, and ihsym - int trmin=m_TRperiod/60; + int trmin=m_TRperiod/60.0; // int k (frames - 1); dec_data.params.nfa=m_wideGraph->nStartFreq(); dec_data.params.nfb=m_wideGraph->Fmax(); @@ -1452,14 +1451,15 @@ void MainWindow::dataSink(qint64 frames) if(!m_mode.startsWith ("WSPR")) decode(); //Start decoder if(!m_diskData) { //Always save; may delete later - if(m_mode=="FT8" or m_mode=="FT4") { - int n=now.time().second() % m_TRperiod; + int n=fmod(double(now.time().second()),m_TRperiod); if(n<(m_TRperiod/2)) n=n+m_TRperiod; auto const& period_start=now.addSecs(-n); m_fnameWE=m_config.save_directory().absoluteFilePath (period_start.toString("yyMMdd_hhmmss")); +// qDebug() << "datasink 2" << QDateTime::currentDateTimeUtc().toString("ss.zzz") +// << n << period_start.toString("ss.zzz"); } else { - auto const& period_start = now.addSecs (-(now.time ().minute () % (m_TRperiod / 60)) * 60); + auto const& period_start = now.addSecs (-(now.time ().minute () % (int(m_TRperiod) / 60)) * 60); m_fnameWE=m_config.save_directory ().absoluteFilePath (period_start.toString ("yyMMdd_hhmm")); } m_fileToSave.clear (); @@ -1589,7 +1589,7 @@ void MainWindow::fastSink(qint64 frames) int ihr=tnow.toString("hh").toInt(); int imin=tnow.toString("mm").toInt(); int isec=tnow.toString("ss").toInt(); - isec=isec - isec%m_TRperiod; + isec=isec - fmod(double(isec),m_TRperiod); int nutc0=10000*ihr + 100*imin + isec; if(m_diskData) nutc0=m_UTCdisk; char line[80]; @@ -1669,7 +1669,7 @@ void MainWindow::fastSink(qint64 frames) if(decodeNow or m_bFastDone) { if(!m_diskData) { QDateTime now {QDateTime::currentDateTimeUtc()}; - int n=now.time().second() % m_TRperiod; + int n=fmod(double(now.time().second()),m_TRperiod); if(n<(m_TRperiod/2)) n=n+m_TRperiod; auto const& period_start = now.addSecs (-n); m_fnameWE = m_config.save_directory ().absoluteFilePath (period_start.toString ("yyMMdd_hhmmss")); @@ -1679,11 +1679,11 @@ void MainWindow::fastSink(qint64 frames) // the following is potential a threading hazard - not a good // idea to pass pointer to be processed in another thread m_saveWAVWatcher.setFuture (QtConcurrent::run (std::bind (&MainWindow::save_wave_file, - this, m_fnameWE, &dec_data.d2[0], m_TRperiod*12000, m_config.my_callsign(), + this, m_fnameWE, &dec_data.d2[0], int(m_TRperiod*12000.0), m_config.my_callsign(), m_config.my_grid(), m_mode, m_nSubMode, m_freqNominal, m_hisCall, m_hisGrid))); } if(m_mode!="MSK144") { - killFileTimer.start (3*1000*m_TRperiod/4); //Kill 3/4 period from now + killFileTimer.start (int(750.0*m_TRperiod)); //Kill 3/4 period from now } } m_bFastDone=false; @@ -2218,7 +2218,6 @@ void MainWindow::createStatusBar() //createStatusBar statusBar()->addPermanentWidget(&progressBar); progressBar.setMinimumSize (QSize {150, 18}); - progressBar.setFormat ("%v/%m"); statusBar ()->addPermanentWidget (&watchdog_label); update_watchdog_label (); @@ -2631,7 +2630,8 @@ void MainWindow::read_wav_file (QString const& fname) bool ok=file.open (BWFFile::ReadOnly); if(ok) { auto bytes_per_frame = file.format ().bytesPerFrame (); - qint64 max_bytes = std::min (std::size_t (m_TRperiod * RX_SAMPLE_RATE), + int nsamples=m_TRperiod * RX_SAMPLE_RATE; + qint64 max_bytes = std::min (std::size_t (nsamples), sizeof (dec_data.d2) / sizeof (dec_data.d2[0]))* bytes_per_frame; auto n = file.read (reinterpret_cast (dec_data.d2), std::min (max_bytes, file.size ())); @@ -2822,7 +2822,7 @@ void MainWindow::decode() //decode() } m_msec0=QDateTime::currentMSecsSinceEpoch(); - if(!m_dataAvailable or m_TRperiod==0) return; + if(!m_dataAvailable or m_TRperiod==0.0) return; ui->DecodeButton->setChecked (true); if(!dec_data.params.nagain && m_diskData && !m_bFastMode && m_mode!="FT8" && m_mode!="FT4") { dec_data.params.nutc=dec_data.params.nutc/100; @@ -2832,14 +2832,16 @@ void MainWindow::decode() //decode() int imin=ms/60000; int ihr=imin/60; imin=imin % 60; - if(m_TRperiod>=60) imin=imin - (imin % (m_TRperiod/60)); + if(m_TRperiod>=60) imin=imin - (imin % (int(m_TRperiod)/60)); dec_data.params.nutc=100*ihr + imin; if(m_mode=="ISCAT" or m_mode=="MSK144" or m_bFast9 or m_mode=="FT8" or m_mode=="FT4") { - QDateTime t=QDateTime::currentDateTimeUtc().addSecs(2-m_TRperiod); + qint64 ms=1000.0*(2.0-m_TRperiod); + if(m_mode=="FT4") ms=1000.0*(3.0-m_TRperiod); + QDateTime t=QDateTime::currentDateTimeUtc().addMSecs(ms); ihr=t.toString("hh").toInt(); imin=t.toString("mm").toInt(); int isec=t.toString("ss").toInt(); - isec=isec - isec%m_TRperiod; + if(m_mode!="FT4") isec=isec - fmod(double(isec),m_TRperiod); dec_data.params.nutc=10000*ihr + 100*imin + isec; } } @@ -2849,7 +2851,7 @@ void MainWindow::decode() //decode() int ihr=t.toString("hh").toInt(); int imin=t.toString("mm").toInt(); int isec=t.toString("ss").toInt(); - isec=isec - isec%m_TRperiod; + isec=isec - fmod(double(isec),m_TRperiod); dec_data.params.nutc=10000*ihr + 100*imin + isec; } if(m_nPick==2) dec_data.params.nutc=m_nutc0; @@ -2948,8 +2950,8 @@ void MainWindow::decode() //decode() } static short int d2b[360000]; narg[0]=dec_data.params.nutc; - if(m_kdone>12000*m_TRperiod) { - m_kdone=12000*m_TRperiod; + if(m_kdone>int(12000.0*m_TRperiod)) { + m_kdone=int(12000.0*m_TRperiod); } narg[1]=m_kdone; narg[2]=m_nSubMode; @@ -2968,9 +2970,10 @@ void MainWindow::decode() //decode() narg[12]=0; narg[13]=-1; narg[14]=m_config.aggressive(); + int nTRperiod=m_TRperiod; memcpy(d2b,dec_data.d2,2*360000); watcher3.setFuture (QtConcurrent::run (std::bind (fast_decode_,&d2b[0], - &narg[0],&m_TRperiod,&m_msg[0][0], + &narg[0],&nTRperiod,&m_msg[0][0], dec_data.params.mycall,dec_data.params.hiscall,8000,12,12))); } else { memcpy(to, from, qMin(mem_jt9->size(), size)); @@ -3055,7 +3058,7 @@ void MainWindow::readFromStdout() //readFromStdout if(line_read.indexOf("") >= 0) { if(m_mode=="QRA64") m_wideGraph->drawRed(0,0); m_bDecoded = line_read.mid(20).trimmed().toInt() > 0; - int mswait=3*1000*m_TRperiod/4; + int mswait=750.0*m_TRperiod; if(!m_diskData) killFileTimer.start(mswait); //Kill in 3/4 period decodeDone (); m_startAnother=m_loopall; @@ -3081,7 +3084,7 @@ void MainWindow::readFromStdout() //readFromStdout write_all("Rx",line_read.trimmed()); if (m_config.insert_blank () && m_blankLine && SpecOp::FOX != m_config.special_op_id()) { QString band; - if((QDateTime::currentMSecsSinceEpoch() / 1000 - m_secBandChanged) > 4*m_TRperiod/4) { + if((QDateTime::currentMSecsSinceEpoch() / 1000 - m_secBandChanged) > 4*int(m_TRperiod)/4) { band = ' ' + m_config.bands ()->find (m_freqNominal); } ui->decodedTextBrowser->insertLineSpacer (band.rightJustified (40, '-')); @@ -3241,7 +3244,7 @@ void MainWindow::readFromStdout() //readFromStdout } // extract details and send to PSKreporter int nsec=QDateTime::currentMSecsSinceEpoch()/1000-m_secBandChanged; - bool okToPost=(nsec>(4*m_TRperiod)/5); + bool okToPost=(nsec > int(4*m_TRperiod)/5); if (stdMsg && okToPost) pskPost(decodedtext); if((m_mode=="JT4" or m_mode=="JT65" or m_mode=="QRA64") and m_msgAvgWidget!=NULL) { @@ -3421,7 +3424,7 @@ void MainWindow::guiUpdate() double txDuration; QString rt; - if(m_TRperiod==0) m_TRperiod=60; + if(m_TRperiod==0) m_TRperiod=60.0; txDuration=0.0; if(m_modeTx=="FT4") txDuration=0.35 + 105*512/12000.0; // FT4 if(m_modeTx=="FT8") txDuration=1.0 + 79*1920/12000.0; // FT8 @@ -3451,8 +3454,8 @@ void MainWindow::guiUpdate() double tsec=0.001*ms; double t2p=fmod(tsec,2*m_TRperiod); m_s6=fmod(tsec,6.0); - m_nseq = nsec % m_TRperiod; - m_tRemaining=m_TRperiod - fmod(tsec,double(m_TRperiod)); + m_nseq = fmod(double(nsec),m_TRperiod); + m_tRemaining=m_TRperiod - fmod(tsec,m_TRperiod); if(m_mode=="Echo") { txDuration=2.4; @@ -3495,8 +3498,7 @@ void MainWindow::guiUpdate() // Check for "txboth" (testing purposes only) QFile f(m_appDir + "/txboth"); - if(f.exists() and - fmod(tsec,m_TRperiod)<(1.0 + 85.0*m_nsps/12000.0)) m_bTxTime=true; + if(f.exists() and fmod(tsec,m_TRperiod) < (1.0 + 85.0*m_nsps/12000.0)) m_bTxTime=true; // Don't transmit another mode in the 30 m WSPR sub-band Frequency onAirFreq = m_freqNominal + ui->TxFreqSpinBox->value(); @@ -3539,7 +3541,7 @@ void MainWindow::guiUpdate() tx_watchdog (true); // disable transmit } - float fTR=float((ms%(1000*m_TRperiod)))/(1000*m_TRperiod); + float fTR=float((ms%int(1000.0*m_TRperiod)))/int(1000.0*m_TRperiod); QString txMsg; if(m_ntx == 1) txMsg=ui->tx1->text(); @@ -3959,17 +3961,21 @@ void MainWindow::guiUpdate() if(tHound >= 120 and m_ntx==1) auto_tx_mode(false); } -// progressBar.setVisible(!(m_mode=="FT4")); progressBar.setVisible(true); + progressBar.setFormat ("%v/%m"); if(m_auto and m_mode=="Echo" and m_bEchoTxOK) { - progressBar.setMaximum(6); + progressBar.setMaximum(3); progressBar.setValue(int(m_s6)); } -// if(m_mode!="Echo" and m_mode!="FT4") { if(m_mode!="Echo") { if(m_monitoring or m_transmitting) { progressBar.setMaximum(m_TRperiod); int isec=int(fmod(tsec,m_TRperiod)); + if(m_TRperiod-int(m_TRperiod)>0.0) { + QString progBarLabel; + progBarLabel.sprintf("%d/%3.1f",isec,m_TRperiod); + progressBar.setFormat (progBarLabel); + } progressBar.setValue(isec); } else { progressBar.setValue(0); @@ -4152,7 +4158,8 @@ void MainWindow::set_dateTimeQSO(int m_ntx) } else { // we also take of m_TRperiod/2 to allow for late clicks auto now = QDateTime::currentDateTimeUtc(); - m_dateTimeQSOOn = now.addSecs (-(m_ntx - 2) * m_TRperiod - (now.time ().second () % m_TRperiod)); + m_dateTimeQSOOn = now.addSecs (-(m_ntx - 2) * int(m_TRperiod) - + int(fmod(double(now.time().second()),m_TRperiod))); } } @@ -4405,7 +4412,7 @@ void MainWindow::processMessage (DecodedText const& message, Qt::KeyboardModifie } } - int nmod = message.timeInSeconds () % (2*m_TRperiod); + int nmod = fmod(double(message.timeInSeconds()),2.0*m_TRperiod); m_txFirst=(nmod!=0); if( SpecOp::HOUND == m_config.special_op_id() ) m_txFirst=false; //Hound must not transmit first if( SpecOp::FOX == m_config.special_op_id() ) m_txFirst=true; //Fox must always transmit first @@ -5632,7 +5639,7 @@ void MainWindow::on_actionFT4_triggered() { m_mode="FT4"; m_modeTx="FT4"; - m_TRperiod=6; + m_TRperiod=7.5; bool bVHF=m_config.enable_VHF_features(); m_bFast9=false; m_bFastMode=false; @@ -5693,7 +5700,7 @@ void MainWindow::on_actionFT8_triggered() m_wideGraph->setModeTx(m_modeTx); VHF_features_enabled(bVHF); ui->cbAutoSeq->setChecked(true); - m_TRperiod=15; + m_TRperiod=15.0; m_fastGraph->hide(); m_wideGraph->show(); ui->decodedTextLabel2->setText(" UTC dB DT Freq Message"); @@ -5782,7 +5789,7 @@ void MainWindow::on_actionJT4_triggered() WSPR_config(false); switch_mode (Modes::JT4); m_modeTx="JT4"; - m_TRperiod=60; + m_TRperiod=60.0; m_modulator->setTRPeriod(m_TRperiod); // TODO - not thread safe m_detector->setTRPeriod(m_TRperiod); // TODO - not thread safe m_nsps=6912; //For symspec only @@ -5855,7 +5862,7 @@ void MainWindow::on_actionJT9_triggered() ui->decodedTextLabel2->setText("UTC dB T Freq Message"); } else { ui->cbAutoSeq->setChecked(false); - m_TRperiod=60; + m_TRperiod=60.0; ui->decodedTextLabel->setText("UTC dB DT Freq Message"); ui->decodedTextLabel2->setText("UTC dB DT Freq Message"); } @@ -5884,7 +5891,7 @@ void MainWindow::on_actionJT9_JT65_triggered() m_modeTx="JT9"; } m_nSubMode=0; //Dual-mode always means JT9 and JT65A - m_TRperiod=60; + m_TRperiod=60.0; m_modulator->setTRPeriod(m_TRperiod); // TODO - not thread safe m_detector->setTRPeriod(m_TRperiod); // TODO - not thread safe m_nsps=6912; @@ -5926,7 +5933,7 @@ void MainWindow::on_actionJT65_triggered() WSPR_config(false); switch_mode (Modes::JT65); if(m_modeTx!="JT65") on_pbTxMode_clicked(); - m_TRperiod=60; + m_TRperiod=60.0; m_modulator->setTRPeriod(m_TRperiod); // TODO - not thread safe m_detector->setTRPeriod(m_TRperiod); // TODO - not thread safe m_nsps=6912; //For symspec only @@ -6102,7 +6109,7 @@ void MainWindow::on_actionWSPR_triggered() WSPR_config(true); switch_mode (Modes::WSPR); m_modeTx="WSPR"; - m_TRperiod=120; + m_TRperiod=120.0; m_modulator->setTRPeriod(m_TRperiod); // TODO - not thread safe m_detector->setTRPeriod(m_TRperiod); // TODO - not thread safe m_nsps=6912; //For symspec only @@ -6130,7 +6137,7 @@ void MainWindow::on_actionWSPR_LF_triggered() m_mode="WSPR-LF"; switch_mode (Modes::WSPR); m_modeTx="WSPR-LF"; - m_TRperiod=240; + m_TRperiod=240.0; m_modulator->setTRPeriod(m_TRperiod); // TODO - not thread safe m_detector->setTRPeriod(m_TRperiod); // TODO - not thread safe m_hsymStop=813; @@ -6146,7 +6153,7 @@ void MainWindow::on_actionEcho_triggered() on_actionJT4_triggered(); m_mode="Echo"; ui->actionEcho->setChecked(true); - m_TRperiod=3; + m_TRperiod=3.0; m_modulator->setTRPeriod(m_TRperiod); // TODO - not thread safe m_detector->setTRPeriod(m_TRperiod); // TODO - not thread safe m_nsps=6912; //For symspec only @@ -6425,7 +6432,6 @@ void MainWindow::on_bandComboBox_activated (int index) void MainWindow::band_changed (Frequency f) { -// bool monitor_off=!m_monitoring; // Set the attenuation value if options are checked QString curBand = ui->bandComboBox->currentText(); if (m_config.pwrBandTxMemory() && !m_tune) { @@ -6461,7 +6467,6 @@ void MainWindow::band_changed (Frequency f) if(r<0.9 or r>1.1) m_bVHFwarned=false; setRig (f); setXIT (ui->TxFreqSpinBox->value ()); -// if(monitor_off) monitor(false); } } @@ -7245,7 +7250,7 @@ void MainWindow::on_sbSubmode_valueChanged(int n) on_cbFast9_clicked(false); ui->cbFast9->setEnabled(false); ui->sbTR->setVisible(false); - m_TRperiod=60; + m_TRperiod=60.0; } else { ui->cbFast9->setEnabled(true); } @@ -7267,9 +7272,9 @@ void MainWindow::on_cbFast9_clicked(bool b) if(b) { m_TRperiod = ui->sbTR->value (); } else { - m_TRperiod=60; + m_TRperiod=60.0; } - progressBar.setMaximum(m_TRperiod); + progressBar.setMaximum(int(m_TRperiod)); m_wideGraph->setPeriod(m_TRperiod,m_nsps); fast_config(b); statusChanged (); @@ -7813,7 +7818,7 @@ void MainWindow::setRig (Frequency f) void MainWindow::fastPick(int x0, int x1, int y) { float pixPerSecond=12000.0/512.0; - if(m_TRperiod<30) pixPerSecond=12000.0/256.0; + if(m_TRperiod<30.0) pixPerSecond=12000.0/256.0; if(m_mode!="ISCAT" and m_mode!="MSK144") return; if(!m_decoderBusy) { dec_data.params.newdat=0; @@ -8014,7 +8019,7 @@ void MainWindow::write_transmit_entry (QString const& file_name) { QTextStream out(&f); auto time = QDateTime::currentDateTimeUtc (); - time = time.addSecs (-(time.time ().second () % m_TRperiod)); + time = time.addSecs (-fmod(double(time.time().second()),m_TRperiod)); out << time.toString("yyMMdd_hhmmss") << " Transmitting " << qSetRealNumberPrecision (12) << (m_freqNominal / 1.e6) << " MHz " << m_modeTx @@ -8677,7 +8682,7 @@ void MainWindow::write_all(QString txRx, QString message) t.sprintf("%5d",ui->TxFreqSpinBox->value()); if (txRx=="Tx") msg=" 0 0.0" + t + " " + message; auto time = QDateTime::currentDateTimeUtc (); - time = time.addSecs(-(time.time().second() % m_TRperiod)); + time = time.addSecs(-fmod(double(time.time().second()),m_TRperiod)); t.sprintf("%10.3f ",m_freqNominal/1.e6); if (m_diskData) { if (m_fileDateTime.size()==11) { diff --git a/widgets/mainwindow.h b/widgets/mainwindow.h index eada752bc..ffa71c1fe 100644 --- a/widgets/mainwindow.h +++ b/widgets/mainwindow.h @@ -406,6 +406,7 @@ private: double m_s6; double m_tRemaining; + double m_TRperiod; float m_DTtol; float m_t0; @@ -428,7 +429,6 @@ private: qint32 m_ntr; qint32 m_tx; qint32 m_hsym; - qint32 m_TRperiod; qint32 m_nsps; qint32 m_hsymStop; qint32 m_inGain; diff --git a/widgets/plotter.cpp b/widgets/plotter.cpp index 98c1af168..85c662a7a 100644 --- a/widgets/plotter.cpp +++ b/widgets/plotter.cpp @@ -241,9 +241,9 @@ void CPlotter::draw(float swide[], bool bScroll, bool bRed) painter1.setPen(Qt::white); QString t; qint64 ms = QDateTime::currentMSecsSinceEpoch() % 86400000; - int n=(ms/1000) % m_TRperiod; + int n = fmod(0.001*ms,m_TRperiod); QDateTime t1=QDateTime::currentDateTimeUtc().addSecs(-n); - if(m_TRperiod < 60 or m_mode=="FT4") { + if(m_TRperiod<60.0) { t=t1.toString("hh:mm:ss") + " " + m_rxBand; } else { t=t1.toString("hh:mm") + " " + m_rxBand; @@ -721,9 +721,9 @@ void CPlotter::mouseDoubleClickEvent (QMouseEvent * event) } } -void CPlotter::setNsps(int ntrperiod, int nsps) //setNsps +void CPlotter::setNsps(double trperiod, int nsps) //setNsps { - m_TRperiod=ntrperiod; + m_TRperiod=trperiod; m_nsps=nsps; m_fftBinWidth=1500.0/2048.0; if(m_nsps==15360) m_fftBinWidth=1500.0/2048.0; diff --git a/widgets/plotter.h b/widgets/plotter.h index e243c1777..2cbfd202b 100644 --- a/widgets/plotter.h +++ b/widgets/plotter.h @@ -56,7 +56,7 @@ public: void DrawOverlay(); int rxFreq(); void setFsample(int n); - void setNsps(int ntrperiod, int nsps); + void setNsps(double trperiod, int nsps); void setTxFreq(int n); void setMode(QString mode); void setSubMode(int n); @@ -145,6 +145,7 @@ private: double m_fftBinWidth; double m_dialFreq; double m_xOffset; + double m_TRperiod; float m_sum[2048]; @@ -161,7 +162,6 @@ private: qint32 m_h; qint32 m_h1; qint32 m_h2; - qint32 m_TRperiod; qint32 m_rxFreq; qint32 m_txFreq; qint32 m_fMin; diff --git a/widgets/widegraph.cpp b/widgets/widegraph.cpp index 1f3110cee..6234f731a 100644 --- a/widgets/widegraph.cpp +++ b/widgets/widegraph.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include "ui_widegraph.h" #include "commons.h" #include "Configuration.hpp" @@ -23,7 +24,7 @@ WideGraph::WideGraph(QSettings * settings, QWidget *parent) : ui(new Ui::WideGraph), m_settings (settings), m_palettes_path {":/Palettes"}, - m_ntr0 {0}, + m_tr0 {0.0}, m_n {0}, m_bHaveTransmitted {false} { @@ -186,9 +187,8 @@ void WideGraph::dataSink2(float s[], float df3, int ihsym, int ndiskdata) //dat // Time according to this computer qint64 ms = QDateTime::currentMSecsSinceEpoch() % 86400000; - int ntr = (ms/1000) % m_TRperiod; - if((ndiskdata && ihsym <= m_waterfallAvg) || (!ndiskdata && - (ntrwidePlot->draw(swide,true,false); } } @@ -278,11 +278,11 @@ int WideGraph::fSpan() return ui->widePlot->fSpan (); } -void WideGraph::setPeriod(int ntrperiod, int nsps) //SetPeriod +void WideGraph::setPeriod(double trperiod, int nsps) //SetPeriod { - m_TRperiod=ntrperiod; + m_TRperiod=trperiod; m_nsps=nsps; - ui->widePlot->setNsps(ntrperiod, nsps); + ui->widePlot->setNsps(trperiod, nsps); } void WideGraph::setTxFreq(int n) //setTxFreq diff --git a/widgets/widegraph.h b/widgets/widegraph.h index 2b172ef7d..c87bab050 100644 --- a/widgets/widegraph.h +++ b/widgets/widegraph.h @@ -35,7 +35,7 @@ public: int fSpan(); void saveSettings(); void setFsample(int n); - void setPeriod(int ntrperiod, int nsps); + void setPeriod(double trperiod, int nsps); void setTxFreq(int n); void setMode(QString mode); void setSubMode(int n); @@ -95,10 +95,11 @@ private: WFPalette m_userPalette; QHash m_fMinPerBand; + double m_tr0; + double m_TRperiod; + qint32 m_waterfallAvg; - qint32 m_TRperiod; qint32 m_nsps; - qint32 m_ntr0; qint32 m_fMax; qint32 m_nSubMode; qint32 m_nsmo; From 912e40876a6c58ee5be719121eeb27dc161636bc Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Wed, 22 May 2019 13:06:16 -0400 Subject: [PATCH 078/159] Disable the "not_GA_warning_message", for now. --- widgets/mainwindow.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index d40e0d1c9..b7a600bd8 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -989,6 +989,7 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple, void MainWindow::not_GA_warning_message () { + /* MessageBox::critical_message (this, "

" "This is a pre-release version of WSJT-X 2.1.0 made " @@ -997,6 +998,7 @@ void MainWindow::not_GA_warning_message () QDateTime now=QDateTime::currentDateTime(); QDateTime timeout=QDateTime(QDate(2019,6,7)); if(now.daysTo(timeout) < 0) Q_EMIT finished(); + */ } void MainWindow::initialize_fonts () @@ -3945,7 +3947,7 @@ void MainWindow::guiUpdate() //Once per second: if(nsec != m_sec0) { -// qDebug() << "cc onesec" << (SpecOp::RTTY == m_config.special_op_id()); +// qDebug() << "cc onesec" << m_bBestSPArmed; // if((!m_msgAvgWidget or (m_msgAvgWidget and !m_msgAvgWidget->isVisible())) // and (SpecOp::NONE < m_config.special_op_id()) and (SpecOp::HOUND > m_config.special_op_id())) on_actionFox_Log_triggered(); if(m_freqNominal!=0 and m_freqNominal<50000000 and m_config.enable_VHF_features()) { From 7bfbca4532a658042111411739b39c51bec2a3d7 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Wed, 22 May 2019 15:10:14 -0400 Subject: [PATCH 079/159] Increase the FT4 received record length to 21*3456 = 72576 ==> 6.048 s. --- widgets/mainwindow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index b7a600bd8..0242d570f 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -1466,7 +1466,7 @@ void MainWindow::dataSink(qint64 frames) } m_fileToSave.clear (); int samples=m_TRperiod*12000; - if(m_mode=="FT4") samples=18*3456; + if(m_mode=="FT4") samples=21*3456; // the following is potential a threading hazard - not a good // idea to pass pointer to be processed in another thread From 80307b64ad026070c0615d85428141747b263bb3 Mon Sep 17 00:00:00 2001 From: Steve Franke Date: Wed, 22 May 2019 17:01:06 -0500 Subject: [PATCH 080/159] Add a temporary research tool. --- CMakeLists.txt | 4 +++ lib/ft4/averaged_mf.f90 | 64 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+) create mode 100644 lib/ft4/averaged_mf.f90 diff --git a/CMakeLists.txt b/CMakeLists.txt index eb8ece5ac..787ac38e9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -383,6 +383,7 @@ set (wsjt_FSRCS lib/astro0.f90 lib/avecho.f90 lib/averms.f90 + lib/ft4/averaged_mf.f90 lib/azdist.f90 lib/badmsg.f90 lib/ft8/baseline.f90 @@ -1283,6 +1284,9 @@ target_link_libraries (msk144sim wsjt_fort wsjt_cxx) add_executable (ft4sim lib/ft4/ft4sim.f90 wsjtx.rc) target_link_libraries (ft4sim wsjt_fort wsjt_cxx) +add_executable (averaged_mf lib/ft4/averaged_mf.f90 wsjtx.rc) +target_link_libraries (averaged_mf wsjt_fort wsjt_cxx) + add_executable (ft4sim_mult lib/ft4/ft4sim_mult.f90 wsjtx.rc) target_link_libraries (ft4sim_mult wsjt_fort wsjt_cxx) diff --git a/lib/ft4/averaged_mf.f90 b/lib/ft4/averaged_mf.f90 new file mode 100644 index 000000000..2986572b3 --- /dev/null +++ b/lib/ft4/averaged_mf.f90 @@ -0,0 +1,64 @@ +program averaged_mf + + parameter (nsps=32) + complex cgfsk(3*nsps,64) + complex clin(3*nsps,64) + complex cavg(3*nsps,4) + complex cavl(3*nsps,4) + real pulse(3*nsps) + real dphi(3*nsps) + + do i=1,3*NSPS + t=(i-1.5*nsps)/real(nsps) + pulse(i)=gfsk_pulse(1.0,t) + enddo + + twopi=8.0*atan(1.0) + hmod=1.0 + dphi_peak=twopi*hmod/real(nsps) + + do iwf=1,64 + i0=mod((iwf-1)/16,4) + i1=mod((iwf-1)/4,4) + i2=mod(iwf-1,4) + dphi=0.0 + dphi(1:64)=dphi_peak*pulse(33:96)*i1 + dphi(1:96)=dphi(1:96)+dphi_peak*pulse(1:96)*i0 + dphi(33:96)=dphi(33:96)+dphi_peak*pulse(1:64)*i2 + phi=0.0 + do j=1,96 + cgfsk(j,iwf)=cmplx(cos(phi),sin(phi)) + phi=mod(phi+dphi(j),twopi) + enddo + cgfsk(:,iwf)=cgfsk(:,iwf)*conjg(cgfsk(48,iwf)) + enddo + + do iwf=1,64 + i0=mod((iwf-1)/16,4) + i1=mod((iwf-1)/4,4) + i2=mod(iwf-1,4) + dphi=0.0 + dphi(1:32)=dphi_peak*i1 + dphi(33:64)=dphi_peak*i0 + dphi(65:96)=dphi_peak*i2 + phi=0.0 + do j=1,96 + clin(j,iwf)=cmplx(cos(phi),sin(phi)) + phi=mod(phi+dphi(j),twopi) + enddo + enddo + + + do i=1,4 + ib=(i-1)*16+1 + ie=ib+15 + cavg(:,i)=sum(cgfsk(:,ib:ie),2)/16.0 + cavl(:,i)=sum(clin(:,ib:ie),2)/16.0 + do j=1,96 +write(*,*) j +write(21,*) i,j,real(cavg(j,i)),imag(cavg(j,i)),real(cavl(j,i)),imag(cavl(j,i)) + enddo + enddo + +end program averaged_mf + From a9623703b3ed1bdbe6c7ff06dd33f0d3d72bec57 Mon Sep 17 00:00:00 2001 From: Steve Franke Date: Wed, 22 May 2019 17:02:15 -0500 Subject: [PATCH 081/159] FT4: Change Fortran code to NSPS=576 and make necessary accompanying changes on the C++ side. Basically works except that Tx audio has incorrect DT and audio is truncated at the end. Also, command line decoding using JT9 is not as sensitive as decoding from within WSJT-X. --- Modulator.cpp | 4 ++-- lib/ft4/ft4_downsample.f90 | 2 +- lib/ft4/ft4_params.f90 | 12 ++++++------ lib/ft4/ft4sim.f90 | 5 ++--- lib/ft4/gen_ft4wave.f90 | 4 ++-- lib/ft4/getcandidates4.f90 | 2 +- lib/ft4/subtractft4.f90 | 10 +++++----- lib/ft4_decode.f90 | 12 ++++++------ widgets/mainwindow.cpp | 10 +++++----- widgets/plotter.cpp | 2 +- 10 files changed, 31 insertions(+), 32 deletions(-) diff --git a/Modulator.cpp b/Modulator.cpp index e5587120b..63c4e1ff0 100644 --- a/Modulator.cpp +++ b/Modulator.cpp @@ -91,8 +91,8 @@ void Modulator::start (unsigned symbolsLength, double framesPerSymbol, if (synchronize && !m_tuning && !m_bFastMode) { m_silentFrames = m_ic + m_frameRate / (1000 / delay_ms) - (mstr * (m_frameRate / 1000)); } - if(symbolsLength==105 and framesPerSymbol==512 - and (toneSpacing==12000.0/512.0 or toneSpacing==-2.0)) { + if(symbolsLength==105 and framesPerSymbol==576 + and (toneSpacing==12000.0/576.0 or toneSpacing==-2.0)) { //### FT4 parameters m_ic=0; m_silentFrames=0; diff --git a/lib/ft4/ft4_downsample.f90 b/lib/ft4/ft4_downsample.f90 index d3760a506..ed55fb9a0 100644 --- a/lib/ft4/ft4_downsample.f90 +++ b/lib/ft4/ft4_downsample.f90 @@ -4,7 +4,7 @@ subroutine ft4_downsample(dd,newdata,f0,c) ! Output: Complex data in c(), sampled at 1200 Hz include 'ft4_params.f90' - parameter (NFFT2=NMAX/16) + parameter (NFFT2=NMAX/NDOWN) real dd(NMAX) complex c(0:NMAX/NDOWN-1) complex c1(0:NFFT2-1) diff --git a/lib/ft4/ft4_params.f90 b/lib/ft4/ft4_params.f90 index 46630cc25..2914260d8 100644 --- a/lib/ft4/ft4_params.f90 +++ b/lib/ft4/ft4_params.f90 @@ -6,11 +6,11 @@ parameter (ND=87) !Data symbols parameter (NS=16) !Sync symbols parameter (NN=NS+ND) !Sync and data symbols (103) parameter (NN2=NS+ND+2) !Total channel symbols (105) -parameter (NSPS=512) !Samples per symbol at 12000 S/s -parameter (NZ=NSPS*NN) !Sync and Data samples (52736) -parameter (NZ2=NSPS*NN2) !Total samples in shaped waveform (53760) -parameter (NMAX=18*3456) !Samples in iwave -parameter (NFFT1=2048, NH1=NFFT1/2) !Length of FFTs for symbol spectra +parameter (NSPS=576) !Samples per symbol at 12000 S/s +parameter (NZ=NSPS*NN) !Sync and Data samples (59328) +parameter (NZ2=NSPS*NN2) !Total samples in shaped waveform (60480) +parameter (NMAX=21*3456) !Samples in iwave (72576) +parameter (NFFT1=2304, NH1=NFFT1/2) !Length of FFTs for symbol spectra parameter (NSTEP=NSPS) !Coarse time-sync step size parameter (NHSYM=(NMAX-NFFT1)/NSTEP) !Number of symbol spectra (1/4-sym steps) -parameter (NDOWN=16) !Downsample factor +parameter (NDOWN=18) !Downsample factor diff --git a/lib/ft4/ft4sim.f90 b/lib/ft4/ft4sim.f90 index 94ab8218f..e35e5ad8a 100644 --- a/lib/ft4/ft4sim.f90 +++ b/lib/ft4/ft4sim.f90 @@ -6,7 +6,7 @@ program ft4sim use packjt77 include 'ft4_params.f90' !Set various constants parameter (NWAVE=NN*NSPS) - parameter (NZZ=18*3456) !62208 + parameter (NZZ=21*3456) !72576 type(hdr) h !Header for .wav file character arg*12,fname*17 character msg37*37,msgsent37*37 @@ -51,12 +51,11 @@ program ft4sim hmod=1.0 !Modulation index (0.5 is MSK, 1.0 is FSK) tt=NSPS*dt !Duration of symbols (s) baud=1.0/tt !Keying rate (baud) - txt=NZ*dt !Transmission length (s) + txt=NZ2*dt !Transmission length (s) bandwidth_ratio=2500.0/(fs/2.0) sig=sqrt(2*bandwidth_ratio) * 10.0**(0.05*snrdb) if(snrdb.gt.90.0) sig=1.0 - txt=NN*NSPS/12000.0 ! Source-encode, then get itone() i3=-1 diff --git a/lib/ft4/gen_ft4wave.f90 b/lib/ft4/gen_ft4wave.f90 index c4cd2eafb..823993612 100644 --- a/lib/ft4/gen_ft4wave.f90 +++ b/lib/ft4/gen_ft4wave.f90 @@ -2,8 +2,8 @@ subroutine gen_ft4wave(itone,nsym,nsps,fsample,f0,cwave,wave,icmplx,nwave) real wave(nwave) complex cwave(nwave) - real pulse(6144) !512*4*3 - real dphi(0:240000-1) + real pulse(6912) !576*4*3 + real dphi(0:250000-1) integer itone(nsym) logical first data first/.true./ diff --git a/lib/ft4/getcandidates4.f90 b/lib/ft4/getcandidates4.f90 index badbbcfb5..97aeb54bf 100644 --- a/lib/ft4/getcandidates4.f90 +++ b/lib/ft4/getcandidates4.f90 @@ -61,7 +61,7 @@ subroutine getcandidates4(dd,fa,fb,syncmin,nfqso,maxcand,savg,candidate, & ! call ft4_baseline(savg,nfa,nfb,sbase) ! savsm=savsm/sbase - f_offset = -1.5*12000/512 + f_offset = -1.5*12000.0/NSPS do i=nfa+1,nfb-1 if(savsm(i).ge.savsm(i-1) .and. savsm(i).ge.savsm(i+1) .and. & savsm(i).ge.syncmin) then diff --git a/lib/ft4/subtractft4.f90 b/lib/ft4/subtractft4.f90 index 83470d7ea..ae104ddb3 100644 --- a/lib/ft4/subtractft4.f90 +++ b/lib/ft4/subtractft4.f90 @@ -9,8 +9,8 @@ subroutine subtractft4(dd,itone,f0,dt) use timer_module, only: timer - parameter (NMAX=18*3456,NFRAME=(103+2)*512) - parameter (NFFT=NMAX,NFILT=1400) + parameter (NMAX=21*3456,NSPS=576,NFFT=NMAX,NFILT=1400) + parameter (NFRAME=(103+2)*NSPS) real*4 dd(NMAX), window(-NFILT/2:NFILT/2), xjunk complex cref,camp,cfilt,cw integer itone(103) @@ -19,13 +19,13 @@ subroutine subtractft4(dd,itone,f0,dt) common/heap8/cref(NFRAME),camp(NMAX),cfilt(NMAX),cw(NMAX),xjunk(NFRAME) save first - nstart=dt*12000+1-512 + nstart=dt*12000+1-NSPS nsym=103 - nsps=512 fs=12000.0 icmplx=1 bt=1.0 - call gen_ft4wave(itone,nsym,nsps,fs,f0,cref,xjunk,icmplx,NFRAME) + nss=NSPS + call gen_ft4wave(itone,nsym,nss,fs,f0,cref,xjunk,icmplx,NFRAME) camp=0. do i=1,nframe id=nstart-1+i diff --git a/lib/ft4_decode.f90 b/lib/ft4_decode.f90 index aa27387ce..cf4acaab7 100644 --- a/lib/ft4_decode.f90 +++ b/lib/ft4_decode.f90 @@ -249,14 +249,14 @@ contains if(dobigfft) dobigfft=.false. sum2=sum(cd2*conjg(cd2))/(real(NMAX)/real(NDOWN)) if(sum2.gt.0.0) cd2=cd2/sqrt(sum2) -! Sample rate is now 12000/16 = 750 samples/second +! Sample rate is now 12000/18 = 666.67 samples/second do isync=1,2 if(isync.eq.1) then idfmin=-12 idfmax=12 idfstp=3 - ibmin=-200 - ibmax=950 + ibmin=-333 + ibmax=1000 ibstp=4 else idfmin=idfbest-4 @@ -493,7 +493,7 @@ contains call unpack77(c77,1,message,unpk77_success) if(unpk77_success.and.dosubtract) then call get_ft4_tones_from_77bits(message77,i4tone) - dt=real(ibest)/750.0 + dt=real(ibest)/666.67 call timer('subtract',0) call subtractft4(dd,i4tone,f0,dt) call timer('subtract',1) @@ -506,12 +506,12 @@ contains ndecodes=ndecodes+1 decodes(ndecodes)=message if(snr.gt.0.0) then - xsnr=10*log10(snr)-14.0 + xsnr=10*log10(snr)-14.8 else xsnr=-20.0 endif nsnr=nint(max(-20.0,xsnr)) - xdt=ibest/750.0 - 0.5 + xdt=ibest/666.67 - 0.5 !write(21,'(i6.6,i5,2x,f4.1,i6,2x,a37,2x,f4.1,3i3)') nutc,nsnr,xdt,nint(f0),message,sync,iaptype,ipass,isp call this%callback(sync,nsnr,xdt,f0,message,iaptype,qual) exit diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index b7a600bd8..0676e89be 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -1466,7 +1466,7 @@ void MainWindow::dataSink(qint64 frames) } m_fileToSave.clear (); int samples=m_TRperiod*12000; - if(m_mode=="FT4") samples=18*3456; + if(m_mode=="FT4") samples=21*3456; // the following is potential a threading hazard - not a good // idea to pass pointer to be processed in another thread @@ -3428,7 +3428,7 @@ void MainWindow::guiUpdate() if(m_TRperiod==0) m_TRperiod=60.0; txDuration=0.0; - if(m_modeTx=="FT4") txDuration=0.35 + 105*512/12000.0; // FT4 + if(m_modeTx=="FT4") txDuration=1.0 + 105*576/12000.0; // FT4 if(m_modeTx=="FT8") txDuration=1.0 + 79*1920/12000.0; // FT8 if(m_modeTx=="JT4") txDuration=1.0 + 207.0*2520/11025.0; // JT4 if(m_modeTx=="JT9") txDuration=1.0 + 85.0*m_nsps/12000.0; // JT9 @@ -3748,7 +3748,7 @@ void MainWindow::guiUpdate() genft4_(message, &ichk, msgsent, const_cast (ft4msgbits), const_cast(itone), 37, 37); int nsym=103; - int nsps=4*512; + int nsps=4*576; float fsample=48000.0; float f0=ui->TxFreqSpinBox->value() - m_XIT; int nwave=(nsym+2)*nsps; @@ -5652,7 +5652,7 @@ void MainWindow::on_actionFT4_triggered() Q_EMIT FFTSize (m_FFTSize); m_hsymStop=18; setup_status_bar (bVHF); - m_toneSpacing=12000.0/512.0; + m_toneSpacing=12000.0/576.0; ui->actionFT4->setChecked(true); m_wideGraph->setMode(m_mode); m_wideGraph->setModeTx(m_modeTx); @@ -6949,7 +6949,7 @@ void MainWindow::transmit (double snr) m_dateTimeSentTx3=QDateTime::currentDateTimeUtc(); toneSpacing=-2.0; //Transmit a pre-computed, filtered waveform. Q_EMIT sendMessage (NUM_FT4_SYMBOLS, - 512.0, ui->TxFreqSpinBox->value() - m_XIT, + 576.0, ui->TxFreqSpinBox->value() - m_XIT, toneSpacing, m_soundOutput, m_config.audio_output_channel(), true, false, snr, m_TRperiod); } diff --git a/widgets/plotter.cpp b/widgets/plotter.cpp index 85c662a7a..badeff57b 100644 --- a/widgets/plotter.cpp +++ b/widgets/plotter.cpp @@ -411,7 +411,7 @@ void CPlotter::DrawOverlay() //DrawOverlay() } float bw=9.0*12000.0/m_nsps; //JT9 - if(m_mode=="FT4") bw=3*12000.0/512.0; //FT4 ### (3x, or 4x???) ### + if(m_mode=="FT4") bw=3*12000.0/576.0; //FT4 ### (3x, or 4x???) ### if(m_mode=="FT8") bw=7*12000.0/1920.0; //FT8 if(m_mode=="JT4") { //JT4 From 8761ccef9b55d6dc3d7eb1c978a477c3c408d376 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Thu, 23 May 2019 09:23:58 -0400 Subject: [PATCH 082/159] Received data length for FT4 should be 21*3456 = 72576 samples = 6.048 s. --- widgets/mainwindow.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 0676e89be..494607fbf 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -1324,7 +1324,7 @@ void MainWindow::fixStop() } else if (m_mode=="FT8") { m_hsymStop=50; } else if (m_mode=="FT4") { - m_hsymStop=18; + m_hsymStop=21; } } @@ -5650,7 +5650,7 @@ void MainWindow::on_actionFT4_triggered() m_nsps=6912; m_FFTSize = m_nsps/2; Q_EMIT FFTSize (m_FFTSize); - m_hsymStop=18; + m_hsymStop=21; setup_status_bar (bVHF); m_toneSpacing=12000.0/576.0; ui->actionFT4->setChecked(true); From 53c6b50d900cde51973252170e8ac916f83d4dfa Mon Sep 17 00:00:00 2001 From: Steve Franke Date: Thu, 23 May 2019 09:17:00 -0500 Subject: [PATCH 083/159] FT4: change m_hsymStop from 18 to 21 --- widgets/mainwindow.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 0676e89be..494607fbf 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -1324,7 +1324,7 @@ void MainWindow::fixStop() } else if (m_mode=="FT8") { m_hsymStop=50; } else if (m_mode=="FT4") { - m_hsymStop=18; + m_hsymStop=21; } } @@ -5650,7 +5650,7 @@ void MainWindow::on_actionFT4_triggered() m_nsps=6912; m_FFTSize = m_nsps/2; Q_EMIT FFTSize (m_FFTSize); - m_hsymStop=18; + m_hsymStop=21; setup_status_bar (bVHF); m_toneSpacing=12000.0/576.0; ui->actionFT4->setChecked(true); From 932e100a2cba479a6b64e7c5b98948aab9a6e1ba Mon Sep 17 00:00:00 2001 From: Steve Franke Date: Thu, 23 May 2019 09:55:50 -0500 Subject: [PATCH 084/159] Update jt9.f90 to account for changes to FT4. --- lib/jt9.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jt9.f90 b/lib/jt9.f90 index 68984e33a..67e7ac319 100644 --- a/lib/jt9.f90 +++ b/lib/jt9.f90 @@ -226,7 +226,7 @@ program jt9 endif shared_data%id2=0 !??? Why is this necessary ??? - if(mode.eq.5) npts=62208 + if(mode.eq.5) npts=21*3456 do iblk=1,npts/kstep k=iblk*kstep if(mode.eq.8 .and. k.gt.179712) exit From dfedc40db1569aee2db441f93f18aa19e8518dee Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Thu, 23 May 2019 13:24:35 -0400 Subject: [PATCH 085/159] Fix some timing issues resulting from non-integral m_TRperiod for FT4. --- Detector.cpp | 21 ++++++--------------- Detector.hpp | 1 - Modulator.cpp | 37 +++++++++++++++---------------------- widgets/mainwindow.cpp | 8 ++++---- 4 files changed, 25 insertions(+), 42 deletions(-) diff --git a/Detector.cpp b/Detector.cpp index 3bf5cf410..05a631b13 100644 --- a/Detector.cpp +++ b/Detector.cpp @@ -55,12 +55,14 @@ void Detector::clear () qint64 Detector::writeData (char const * data, qint64 maxSize) { - int ns=secondInPeriod(); - if(ns < m_ns) { // When ns has wrapped around to zero, restart the buffers + static unsigned mstr0=999999; + qint64 ms0 = QDateTime::currentMSecsSinceEpoch() % 86400000; + unsigned mstr = ms0 % int(1000.0*m_period); // ms into the nominal Tx start time + if(mstr < mstr0) { //When mstr has wrapped around to 0, restart the buffer dec_data.params.kin = 0; m_bufferPos = 0; } - m_ns=ns; + mstr0=mstr; // no torn frames Q_ASSERT (!(maxSize % static_cast (bytesPerFrame ()))); @@ -73,7 +75,7 @@ qint64 Detector::writeData (char const * data, qint64 maxSize) if (framesAccepted < static_cast (maxSize / bytesPerFrame ())) { qDebug () << "dropped " << maxSize / bytesPerFrame () - framesAccepted << " frames of data on the floor!" - << dec_data.params.kin << ns; + << dec_data.params.kin << mstr; } for (unsigned remaining = framesAccepted; remaining; ) { @@ -121,14 +123,3 @@ qint64 Detector::writeData (char const * data, qint64 maxSize) return maxSize; // we drop any data past the end of the buffer on // the floor until the next period starts } - -unsigned Detector::secondInPeriod () const -{ - // we take the time of the data as the following assuming no latency - // delivering it to us (not true but close enough for us) - qint64 now (QDateTime::currentMSecsSinceEpoch ()); - - unsigned secondInToday ((now % 86400000LL) / 1000); - unsigned secInPeriod = fmod(double(secondInToday),m_period); - return secInPeriod; -} diff --git a/Detector.hpp b/Detector.hpp index 404951a90..4d584c130 100644 --- a/Detector.hpp +++ b/Detector.hpp @@ -41,7 +41,6 @@ protected: private: void clear (); // discard buffer contents - unsigned secondInPeriod () const; unsigned m_frameRate; double m_period; diff --git a/Modulator.cpp b/Modulator.cpp index 63c4e1ff0..4d0171770 100644 --- a/Modulator.cpp +++ b/Modulator.cpp @@ -32,8 +32,8 @@ Modulator::Modulator (unsigned frameRate, double periodLengthInSeconds, , m_phi {0.0} , m_toneSpacing {0.0} , m_fSpread {0.0} - , m_frameRate {frameRate} , m_period {periodLengthInSeconds} + , m_frameRate {frameRate} , m_state {Idle} , m_tuning {false} , m_cwLevel {false} @@ -50,13 +50,10 @@ void Modulator::start (unsigned symbolsLength, double framesPerSymbol, Q_ASSERT (stream); // Time according to this computer which becomes our base time qint64 ms0 = QDateTime::currentMSecsSinceEpoch() % 86400000; + unsigned mstr = ms0 % int(1000.0*m_period); // ms into the nominal Tx start time -// qDebug() << "ModStart" << QDateTime::currentDateTimeUtc().toString("hh:mm:ss.sss"); - - if(m_state != Idle) stop (); - + if(m_state != Idle) stop(); m_quickClose = false; - m_symbolsLength = symbolsLength; m_isym0 = std::numeric_limits::max (); // big number m_frequency0 = 0.; @@ -68,37 +65,33 @@ void Modulator::start (unsigned symbolsLength, double framesPerSymbol, m_toneSpacing = toneSpacing; m_bFastMode=fastMode; m_TRperiod=TRperiod; - unsigned delay_ms = 1920 == m_nsps && 15 == m_period ? 500 : 1000; + unsigned delay_ms=1000; + if(m_nsps==1920) delay_ms=500; //FT8 + if(m_nsps==576) delay_ms=300; //FT4 - // noise generator parameters +// noise generator parameters if (m_addNoise) { m_snr = qPow (10.0, 0.05 * (dBSNR - 6.0)); m_fac = 3000.0; if (m_snr > 1.0) m_fac = 3000.0 / m_snr; } - unsigned mstr = ms0 % int(1000.0*m_period); // ms in period - - // round up to an exact portion of a second that allows for startup - // delays +// round up to an exact portion of a second that allows for startup delays m_ic = (mstr / delay_ms) * m_frameRate * delay_ms / 1000; if(m_bFastMode) m_ic=0; m_silentFrames = 0; - // calculate number of silent frames to send, so that audio will start at - // the nominal time "delay_ms" into the Tx sequence. +// calculate number of silent frames to send, so that audio will start at +// the nominal time "delay_ms" into the Tx sequence. if (synchronize && !m_tuning && !m_bFastMode) { m_silentFrames = m_ic + m_frameRate / (1000 / delay_ms) - (mstr * (m_frameRate / 1000)); } - if(symbolsLength==105 and framesPerSymbol==576 - and (toneSpacing==12000.0/576.0 or toneSpacing==-2.0)) { -//### FT4 parameters - m_ic=0; - m_silentFrames=0; - } -// qDebug() << "Mod AA" << symbolsLength << framesPerSymbol << toneSpacing; -// qDebug() << "Mod AB" << delay_ms << mstr << m_ic << m_silentFrames; + +// qDebug() << "aa" << QDateTime::currentDateTimeUtc().toString("hh:mm:ss.zzz") +// << m_ic << m_silentFrames << m_silentFrames/48000.0 +// << mstr << fmod(double(ms0),1000.0*m_period); + initialize (QIODevice::ReadOnly, channel); Q_EMIT stateChanged ((m_state = (synchronize && m_silentFrames) ? diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 494607fbf..9b8a7b26a 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -2838,12 +2838,12 @@ void MainWindow::decode() //decode() dec_data.params.nutc=100*ihr + imin; if(m_mode=="ISCAT" or m_mode=="MSK144" or m_bFast9 or m_mode=="FT8" or m_mode=="FT4") { qint64 ms=1000.0*(2.0-m_TRperiod); - if(m_mode=="FT4") ms=1000.0*(3.0-m_TRperiod); + if(m_mode=="FT4") ms=1000.0*(2.0-m_TRperiod); QDateTime t=QDateTime::currentDateTimeUtc().addMSecs(ms); ihr=t.toString("hh").toInt(); imin=t.toString("mm").toInt(); int isec=t.toString("ss").toInt(); - if(m_mode!="FT4") isec=isec - fmod(double(isec),m_TRperiod); + isec=isec - fmod(double(isec),m_TRperiod); dec_data.params.nutc=10000*ihr + 100*imin + isec; } } @@ -3498,9 +3498,9 @@ void MainWindow::guiUpdate() if(m_transmitting or m_auto or m_tune) { m_dateTimeLastTX = QDateTime::currentDateTimeUtc (); -// Check for "txboth" (testing purposes only) +// Check for "txboth" (FT4 testing purposes only) QFile f(m_appDir + "/txboth"); - if(f.exists() and fmod(tsec,m_TRperiod) < (1.0 + 85.0*m_nsps/12000.0)) m_bTxTime=true; + if(f.exists() and fmod(tsec,m_TRperiod) < (0.5 + 105.0*576.0/12000.0)) m_bTxTime=true; // Don't transmit another mode in the 30 m WSPR sub-band Frequency onAirFreq = m_freqNominal + ui->TxFreqSpinBox->value(); From 2ab4b59d88959a4503dcdae27e2a0db0b3d05a88 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Thu, 23 May 2019 14:06:00 -0400 Subject: [PATCH 086/159] Fix ft4sim_mult for 7.5 s T/R sequences. --- lib/ft4/ft4sim_mult.f90 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/ft4/ft4sim_mult.f90 b/lib/ft4/ft4sim_mult.f90 index 313093289..582a48f77 100644 --- a/lib/ft4/ft4sim_mult.f90 +++ b/lib/ft4/ft4sim_mult.f90 @@ -6,7 +6,7 @@ program ft4sim_mult use packjt77 include 'ft4_params.f90' !FT4 protocol constants parameter (NWAVE=NN*NSPS) - parameter (NZZ=65760) !Length of .wav file (4.48+1.0)*12000 + parameter (NZZ=72576) !Length of .wav file (21*3456) type(hdr) h !Header for .wav file character arg*12,fname*17,cjunk*4 character msg37*37,msgsent37*37,c77*77 @@ -55,8 +55,8 @@ program ft4sim_mult read(10,1003,end=100) cjunk,isnr,xdt0,ifreq,msg37 1003 format(a4,30x,i3,f5.1,i5,1x,a37) if(cjunk.eq.'File') go to 100 - if(isnr.lt.-16) isnr=-16 - f0=ifreq*93.75/50.0 + if(isnr.lt.-17) isnr=-17 + f0=ifreq*960.0/576.0 call random_number(r) xdt=r-0.5 ! Source-encode, then get itone() From 7334ebb20b2f55dbdf045ac1e17cf861dc572fc3 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Thu, 23 May 2019 14:31:08 -0400 Subject: [PATCH 087/159] New user option: "Calling CQ forces Call 1st". --- Configuration.cpp | 6 +++ Configuration.hpp | 1 + Configuration.ui | 117 ++++++++++++++++++++++------------------- widgets/mainwindow.cpp | 3 +- 4 files changed, 71 insertions(+), 56 deletions(-) diff --git a/Configuration.cpp b/Configuration.cpp index cce8db23c..5526a1ec4 100644 --- a/Configuration.cpp +++ b/Configuration.cpp @@ -609,6 +609,7 @@ private: bool miles_; bool quick_call_; bool disable_TX_on_73_; + bool force_call_1st_; bool alternate_bindings_; int watchdog_; bool TX_messages_; @@ -705,6 +706,7 @@ bool Configuration::clear_DX () const {return m_->clear_DX_;} bool Configuration::miles () const {return m_->miles_;} bool Configuration::quick_call () const {return m_->quick_call_;} bool Configuration::disable_TX_on_73 () const {return m_->disable_TX_on_73_;} +bool Configuration::force_call_1st() const {return m_->force_call_1st_;} bool Configuration::alternate_bindings() const {return m_->alternate_bindings_;} int Configuration::watchdog () const {return m_->watchdog_;} bool Configuration::TX_messages () const {return m_->TX_messages_;} @@ -1242,6 +1244,7 @@ void Configuration::impl::initialize_models () ui_->miles_check_box->setChecked (miles_); ui_->quick_call_check_box->setChecked (quick_call_); ui_->disable_TX_on_73_check_box->setChecked (disable_TX_on_73_); + ui_->force_call_1st_check_box->setChecked (force_call_1st_); ui_->alternate_bindings_check_box->setChecked (alternate_bindings_); ui_->tx_watchdog_spin_box->setValue (watchdog_); ui_->TX_messages_check_box->setChecked (TX_messages_); @@ -1496,6 +1499,7 @@ void Configuration::impl::read_settings () miles_ = settings_->value ("Miles", false).toBool (); quick_call_ = settings_->value ("QuickCall", false).toBool (); disable_TX_on_73_ = settings_->value ("73TxDisable", false).toBool (); + force_call_1st_ = settings_->value ("ForceCallFirst", false).toBool (); alternate_bindings_ = settings_->value ("AlternateBindings", false).toBool (); watchdog_ = settings_->value ("TxWatchdog", 6).toInt (); TX_messages_ = settings_->value ("Tx2QSO", true).toBool (); @@ -1598,6 +1602,7 @@ void Configuration::impl::write_settings () settings_->setValue ("Miles", miles_); settings_->setValue ("QuickCall", quick_call_); settings_->setValue ("73TxDisable", disable_TX_on_73_); + settings_->setValue ("ForceCallFirst", force_call_1st_); settings_->setValue ("AlternateBindings", alternate_bindings_); settings_->setValue ("TxWatchdog", watchdog_); settings_->setValue ("Tx2QSO", TX_messages_); @@ -2042,6 +2047,7 @@ void Configuration::impl::accept () miles_ = ui_->miles_check_box->isChecked (); quick_call_ = ui_->quick_call_check_box->isChecked (); disable_TX_on_73_ = ui_->disable_TX_on_73_check_box->isChecked (); + force_call_1st_ = ui_->force_call_1st_check_box->isChecked (); alternate_bindings_ = ui_->alternate_bindings_check_box->isChecked (); watchdog_ = ui_->tx_watchdog_spin_box->value (); TX_messages_ = ui_->TX_messages_check_box->isChecked (); diff --git a/Configuration.hpp b/Configuration.hpp index 991e126fb..0ed7a4057 100644 --- a/Configuration.hpp +++ b/Configuration.hpp @@ -127,6 +127,7 @@ public: bool miles () const; bool quick_call () const; bool disable_TX_on_73 () const; + bool force_call_1st() const; bool alternate_bindings() const; int watchdog () const; bool TX_messages () const; diff --git a/Configuration.ui b/Configuration.ui index 9701fb633..9e36e7ee1 100644 --- a/Configuration.ui +++ b/Configuration.ui @@ -301,7 +301,14 @@ Behavior - + + + + Decode after EME delay + + + + @@ -347,10 +354,27 @@ - - + + - Decode after EME delay + Enable VHF/UHF/Microwave features + + + + + + + Single decode + + + + + + + <html><head/><body><p>Some rigs are not able to process CAT commands while transmitting. This means that if you are operating in split mode you may have to uncheck this option.</p></body></html> + + + Allow Tx frequency changes while transmitting @@ -367,31 +391,35 @@ - - - - Single decode - - - - - - - Enable VHF/UHF/Microwave features - - - - - + + - <html><head/><body><p>Some rigs are not able to process CAT commands while transmitting. This means that if you are operating in split mode you may have to uncheck this option.</p></body></html> + <html><head/><body><p>Check this if you wish to automatically return to the last monitored frequency when monitor is enabled, leave it unchecked if you wish to have the current rig frequency maintained.</p></body></html> - Allow Tx frequency changes while transmitting + Monitor returns to last used frequency - + + + + Alternate F1-F6 bindings + + + + + + + Turns off automatic transmissions after sending a 73 or any other free +text message. + + + Di&sable Tx after sending 73 + + + + @@ -444,34 +472,6 @@ quiet period when decoding is done. - - - - <html><head/><body><p>Check this if you wish to automatically return to the last monitored frequency when monitor is enabled, leave it unchecked if you wish to have the current rig frequency maintained.</p></body></html> - - - Monitor returns to last used frequency - - - - - - - Alternate F1-F6 bindings - - - - - - - Turns off automatic transmissions after sending a 73 or any other free -text message. - - - Di&sable Tx after sending 73 - - - @@ -482,6 +482,13 @@ text message. + + + + Calling CQ forces Call 1st + + + @@ -3078,13 +3085,13 @@ Right click for insert and delete options. + + - - - - + + diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 9b8a7b26a..23fa97772 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -3947,7 +3947,7 @@ void MainWindow::guiUpdate() //Once per second: if(nsec != m_sec0) { -// qDebug() << "cc onesec" << m_bBestSPArmed; +// qDebug() << "onesec" << m_config.force_call_1st(); // if((!m_msgAvgWidget or (m_msgAvgWidget and !m_msgAvgWidget->isVisible())) // and (SpecOp::NONE < m_config.special_op_id()) and (SpecOp::HOUND > m_config.special_op_id())) on_actionFox_Log_triggered(); if(m_freqNominal!=0 and m_freqNominal<50000000 and m_config.enable_VHF_features()) { @@ -4076,6 +4076,7 @@ void MainWindow::startTx2() t=ui->tx6->text(); if(t.mid(0,1)=="#") snr=t.mid(1,5).toDouble(); if(snr>0.0 or snr < -50.0) snr=99.0; + if((m_ntx==6 or m_ntx==7) and m_config.force_call_1st()) ui->cbFirst->setChecked(true); transmit (snr); ui->signal_meter_widget->setValue(0,0); if(m_mode=="Echo" and !m_tune) m_bTransmittedEcho=true; From 26f7fed8aa50f3b96b036622c0fc8378078a30ca Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Thu, 23 May 2019 14:50:17 -0400 Subject: [PATCH 088/159] New FT4 sample file. --- samples/FT4/000000_000002.wav | Bin 0 -> 145196 bytes samples/FT4/190106_000112.wav | Bin 131564 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 samples/FT4/000000_000002.wav delete mode 100644 samples/FT4/190106_000112.wav diff --git a/samples/FT4/000000_000002.wav b/samples/FT4/000000_000002.wav new file mode 100644 index 0000000000000000000000000000000000000000..e5cdc88040b477cad842d51c4dd8e5fb6fdbe803 GIT binary patch literal 145196 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 literal 0 HcmV?d00001 diff --git a/samples/FT4/190106_000112.wav b/samples/FT4/190106_000112.wav deleted file mode 100644 index 2c6e0a9d49a912b80878257a3a16d0577749f30f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 131564 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%0DZXk>CWQLI&1lzy=CE9hR1!&#int8)fU|>6Zm-27 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 aY$L@cEe0f>N7kKb(y8Iop8K7IU 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 From 637d4d04114a8b75c91a6ec2612c9b5c850bd2b4 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Fri, 24 May 2019 08:31:56 -0400 Subject: [PATCH 089/159] "Force Call 1st" must also force AutoSeq. --- widgets/mainwindow.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 23fa97772..54422a8b7 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -4076,7 +4076,10 @@ void MainWindow::startTx2() t=ui->tx6->text(); if(t.mid(0,1)=="#") snr=t.mid(1,5).toDouble(); if(snr>0.0 or snr < -50.0) snr=99.0; - if((m_ntx==6 or m_ntx==7) and m_config.force_call_1st()) ui->cbFirst->setChecked(true); + if((m_ntx==6 or m_ntx==7) and m_config.force_call_1st()) { + ui->cbAutoSeq->setChecked(true); + ui->cbFirst->setChecked(true); + } transmit (snr); ui->signal_meter_widget->setValue(0,0); if(m_mode=="Echo" and !m_tune) m_bTransmittedEcho=true; @@ -4608,7 +4611,6 @@ void MainWindow::processMessage (DecodedText const& message, Qt::KeyboardModifie logQSOTimer.start(0); m_ntx=6; ui->txrb6->setChecked(true); - ui->cbFirst->setChecked(false); } else { m_ntx=5; ui->txrb5->setChecked(true); From d5cd9db6961983576bf3e1475cea2b5356b52f48 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Fri, 24 May 2019 10:42:30 -0400 Subject: [PATCH 090/159] In FT4 mode, Shift+F11/F12 should move Tx freq by +/- 100 Hz. --- widgets/mainwindow.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 54422a8b7..60a331111 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -1986,7 +1986,7 @@ void MainWindow::keyPressEvent (QKeyEvent * e) if(e->modifiers() & Qt::ControlModifier) n+=100; if(e->modifiers() & Qt::ShiftModifier) { int offset=60; - if(m_mode=="FT4") offset=120; + if(m_mode=="FT4") offset=100; ui->TxFreqSpinBox->setValue(ui->TxFreqSpinBox->value()-offset); } else{ bumpFqso(n); @@ -2002,7 +2002,7 @@ void MainWindow::keyPressEvent (QKeyEvent * e) if(e->modifiers() & Qt::ControlModifier) n+=100; if(e->modifiers() & Qt::ShiftModifier) { int offset=60; - if(m_mode=="FT4") offset=120; + if(m_mode=="FT4") offset=100; ui->TxFreqSpinBox->setValue(ui->TxFreqSpinBox->value()+offset); } else { bumpFqso(n); From a521000775199f1e67036ea74867518c6d8ba8f7 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Fri, 24 May 2019 11:04:30 -0400 Subject: [PATCH 091/159] No need to test FT4 and FT8 messages for trailing "f" or "d" indicators. --- widgets/mainwindow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 60a331111..99bcc410d 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -3070,7 +3070,7 @@ void MainWindow::readFromStdout() //readFromStdout } return; } else { - if(m_mode=="JT4" or m_mode=="JT65" or m_mode=="QRA64" or m_mode=="FT8" or m_mode=="FT4") { + if(m_mode=="JT4" or m_mode=="JT65" or m_mode=="QRA64") { int n=line_read.indexOf("f"); if(n<0) n=line_read.indexOf("d"); if(n>0) { From 883c914d29693bca8c269339df2c6823187fb700 Mon Sep 17 00:00:00 2001 From: Steve Franke Date: Fri, 24 May 2019 20:09:00 -0500 Subject: [PATCH 092/159] Make DT=0 mean that the first full symbol starts at t=0.5s. Formerly DT=0 corresponded to the beginning of the ramp-up symbol. Fix a bug that caused signals with large DT to wrap around instead of truncating them. --- lib/ft4/ft4sim.f90 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/ft4/ft4sim.f90 b/lib/ft4/ft4sim.f90 index e35e5ad8a..959cf423c 100644 --- a/lib/ft4/ft4sim.f90 +++ b/lib/ft4/ft4sim.f90 @@ -110,8 +110,10 @@ program ft4sim c0((NN+1)*NSPS:(NN+2)*NSPS-1)=c0((NN+1)*NSPS:(NN+2)*NSPS-1)*(1.0+cos(twopi*(/(i,i=0,NSPS-1)/)/(2.0*NSPS) ))/2.0 c0((NN+2)*NSPS:)=0. - k=nint((xdt+0.5)/dt) + k=nint((xdt+0.5)/dt)-NSPS c0=cshift(c0,-k) + if(k.gt.0) c0(0:k-1)=0.0 + if(k.lt.0) c0(NZZ+k:NZZ-1)=0.0 do ifile=1,nfiles c=c0 From 6dbaa28a014fcb2a2a2293af2ec69d1e422a348d Mon Sep 17 00:00:00 2001 From: Steve Franke Date: Fri, 24 May 2019 20:11:20 -0500 Subject: [PATCH 093/159] Fix DT search range so that it includes DT= +/-1.0. --- lib/ft4_decode.f90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/ft4_decode.f90 b/lib/ft4_decode.f90 index cf4acaab7..001ee4c33 100644 --- a/lib/ft4_decode.f90 +++ b/lib/ft4_decode.f90 @@ -255,8 +255,8 @@ contains idfmin=-12 idfmax=12 idfstp=3 - ibmin=-333 - ibmax=1000 + ibmin=-344 + ibmax=1012 ibstp=4 else idfmin=idfbest-4 From 3bc5e538d29e97ca1fc1981af85094812fdde260 Mon Sep 17 00:00:00 2001 From: Steve Franke Date: Sat, 25 May 2019 10:58:04 -0500 Subject: [PATCH 094/159] FT4: Implement polynomial baseline fit. --- CMakeLists.txt | 1 + lib/ft4/ft4_baseline.f90 | 49 ++++++++++++++++++++++++++++++++++++++ lib/ft4/ft4sim_mult.f90 | 2 -- lib/ft4/getcandidates4.f90 | 21 +++++----------- 4 files changed, 56 insertions(+), 17 deletions(-) create mode 100644 lib/ft4/ft4_baseline.f90 diff --git a/CMakeLists.txt b/CMakeLists.txt index 787ac38e9..74f382421 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -387,6 +387,7 @@ set (wsjt_FSRCS lib/azdist.f90 lib/badmsg.f90 lib/ft8/baseline.f90 + lib/ft4/ft4_baseline.f90 lib/bpdecode40.f90 lib/bpdecode128_90.f90 lib/ft8/bpdecode174_91.f90 diff --git a/lib/ft4/ft4_baseline.f90 b/lib/ft4/ft4_baseline.f90 new file mode 100644 index 000000000..afdbeb5eb --- /dev/null +++ b/lib/ft4/ft4_baseline.f90 @@ -0,0 +1,49 @@ +subroutine ft4_baseline(s,nfa,nfb,sbase) + +! Fit baseline to spectrum (for FT8) +! Input: s(npts) Linear scale in power +! Output: sbase(npts) Baseline + + include 'ft4_params.f90' + implicit real*8 (a-h,o-z) + real*4 s(NH1) + real*4 sbase(NH1) + real*4 base + real*8 x(1000),y(1000),a(5) + data nseg/10/,npct/10/ + + df=12000.0/NFFT1 !5.21 Hz + ia=max(nint(200.0/df),nfa) + ib=min(NH1,nfb) + do i=ia,ib + s(i)=10.0*log10(s(i)) !Convert to dB scale + enddo + + nterms=5 + nlen=(ib-ia+1)/nseg !Length of test segment + i0=(ib-ia+1)/2 !Midpoint + k=0 + do n=1,nseg !Loop over all segments + ja=ia + (n-1)*nlen + jb=ja+nlen-1 + call pctile(s(ja),nlen,npct,base) !Find lowest npct of points + do i=ja,jb + if(s(i).le.base) then + if (k.lt.1000) k=k+1 !Save all "lower envelope" points + x(k)=i-i0 + y(k)=s(i) + endif + enddo + enddo + kz=k + a=0. + call polyfit(x,y,y,kz,nterms,0,a,chisqr) !Fit a low-order polynomial + do i=ia,ib + t=i-i0 + sbase(i)=a(1)+t*(a(2)+t*(a(3)+t*(a(4)+t*(a(5))))) + 0.65 +! write(51,3051) i*df,s(i),sbase(i) +!3051 format(3f12.3) + sbase(i)=10**(sbase(i)/10.0) + enddo + return +end subroutine ft4_baseline diff --git a/lib/ft4/ft4sim_mult.f90 b/lib/ft4/ft4sim_mult.f90 index 582a48f77..d93978e5f 100644 --- a/lib/ft4/ft4sim_mult.f90 +++ b/lib/ft4/ft4sim_mult.f90 @@ -17,8 +17,6 @@ program ft4sim_mult integer itone(NN) integer*1 msgbits(77) integer*2 iwave(NZZ) !Generated full-length waveform - integer icos4(4) - data icos4/0,1,3,2/ ! Get command-line argument(s) nargs=iargc() diff --git a/lib/ft4/getcandidates4.f90 b/lib/ft4/getcandidates4.f90 index 97aeb54bf..dd875336d 100644 --- a/lib/ft4/getcandidates4.f90 +++ b/lib/ft4/getcandidates4.f90 @@ -10,7 +10,6 @@ subroutine getcandidates4(dd,fa,fb,syncmin,nfqso,maxcand,savg,candidate, & complex cx(0:NH1) real candidate(3,maxcand) real dd(NMAX) - integer indx(NH1) integer ipk(1) equivalence (x,cx) logical first @@ -26,7 +25,6 @@ subroutine getcandidates4(dd,fa,fb,syncmin,nfqso,maxcand,savg,candidate, & ! Compute symbol spectra, stepping by NSTEP steps. savg=0. - tstep=NSTEP/12000.0 df=12000.0/NFFT1 fac=1.0/300.0 do j=1,NHSYM @@ -40,27 +38,20 @@ subroutine getcandidates4(dd,fa,fb,syncmin,nfqso,maxcand,savg,candidate, & enddo savg=savg + s(1:NH1,j) !Average spectrum enddo + savg=savg/NHSYM savsm=0. do i=8,NH1-7 savsm(i)=sum(savg(i-7:i+7))/15. enddo + nfa=fa/df - if(nfa.lt.1) nfa=1 + if(nfa.lt.8) nfa=8 nfb=fb/df if(nfb.gt.nint(5000.0/df)) nfb=nint(5000.0/df) - n300=300/df - n2500=2500/df -! np=nfb-nfa+1 - np=n2500-n300+1 - indx=0 - call indexx(savsm(n300:n2500),np,indx) - xn=savsm(n300+indx(nint(0.3*np))) ncand=0 - if(xn.le.1.e-8) return - savsm=savsm/xn -! call ft4_baseline(savg,nfa,nfb,sbase) -! savsm=savsm/sbase - + call ft4_baseline(savg,nfa,nfb,sbase) + if(any(sbase(nfa:nfb).le.0)) return + savsm(nfa:nfb)=savsm(nfa:nfb)/sbase(nfa:nfb) f_offset = -1.5*12000.0/NSPS do i=nfa+1,nfb-1 if(savsm(i).ge.savsm(i-1) .and. savsm(i).ge.savsm(i+1) .and. & From 7e4de9162683fc25b098657270dd3232d12e0781 Mon Sep 17 00:00:00 2001 From: Steve Franke Date: Sun, 26 May 2019 09:52:17 -0500 Subject: [PATCH 095/159] Fix a comment. --- lib/ft4/ft4_baseline.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ft4/ft4_baseline.f90 b/lib/ft4/ft4_baseline.f90 index afdbeb5eb..85a60d9ec 100644 --- a/lib/ft4/ft4_baseline.f90 +++ b/lib/ft4/ft4_baseline.f90 @@ -1,6 +1,6 @@ subroutine ft4_baseline(s,nfa,nfb,sbase) -! Fit baseline to spectrum (for FT8) +! Fit baseline to spectrum ! Input: s(npts) Linear scale in power ! Output: sbase(npts) Baseline From 8c371d7d66447cf62013264e7de4f4a4aa7dd85a Mon Sep 17 00:00:00 2001 From: Steve Franke Date: Sun, 26 May 2019 09:55:39 -0500 Subject: [PATCH 096/159] Remove an obsolete routine. --- lib/ft4/syncft4.f90 | 145 -------------------------------------------- 1 file changed, 145 deletions(-) delete mode 100644 lib/ft4/syncft4.f90 diff --git a/lib/ft4/syncft4.f90 b/lib/ft4/syncft4.f90 deleted file mode 100644 index 4841c560e..000000000 --- a/lib/ft4/syncft4.f90 +++ /dev/null @@ -1,145 +0,0 @@ -subroutine syncft4(iwave,nfa,nfb,syncmin,nfqso,maxcand,s,candidate, & - ncand,sbase) - - include 'ft4_params.f90' -! Search over +/- 2.5s relative to 0.5s TX start time. - parameter (JZ=20) - complex cx(0:NH1) - real s(NH1,NHSYM) - real savg(NH1) - real sbase(NH1) - real x(NFFT1) - real sync2d(NH1,-JZ:JZ) - real red(NH1) - real candidate0(3,maxcand) - real candidate(3,maxcand) - real dd(NMAX) - integer jpeak(NH1) - integer indx(NH1) - integer ii(1) - integer*2 iwave(NMAX) - integer icos4(0:3) - data icos4/0,1,3,2/ !Costas 4x4 tone pattern - equivalence (x,cx) - - dd=iwave/1e3 -! Compute symbol spectra, stepping by NSTEP steps. - savg=0. - tstep=NSTEP/12000.0 - df=12000.0/NFFT1 - fac=1.0/300.0 - do j=1,NHSYM - ia=(j-1)*NSTEP + 1 - ib=ia+NSPS-1 - x(1:NSPS)=fac*dd(ia:ib) - x(NSPS+1:)=0. - call four2a(x,NFFT1,1,-1,0) !r2c FFT - do i=1,NH1 - s(i,j)=real(cx(i))**2 + aimag(cx(i))**2 - enddo - savg=savg + s(1:NH1,j) !Average spectrum - enddo - - call baseline(savg,nfa,nfb,sbase) - - ia=max(1,nint(nfa/df)) - ib=nint(nfb/df) - nssy=NSPS/NSTEP ! # steps per symbol - nfos=NFFT1/NSPS ! # frequency bin oversampling factor - jstrt=0.25/tstep - candidate0=0. - k=0 - - do i=ia,ib - do j=-JZ,+JZ - ta=0. - tb=0. - tc=0. - t0a=0. - t0b=0. - t0c=0. - do n=0,3 - m=j+jstrt+nssy*n - if(m.ge.1.and.m.le.NHSYM) then - ta=ta + s(i+nfos*icos4(n),m) - t0a=t0a + sum(s(i:i+nfos*3:nfos,m)) - endif - tb=tb + s(i+nfos*icos4(n),m+nssy*36) - t0b=t0b + sum(s(i:i+nfos*3:nfos,m+nssy*36)) - if(m+nssy*72.le.NHSYM) then - tc=tc + s(i+nfos*icos4(n),m+nssy*72) - t0c=t0c + sum(s(i:i+nfos*3:nfos,m+nssy*72)) - endif - enddo - t=ta+tb+tc - t0=t0a+t0b+t0c - t0=(t0-t)/3.0 - sync_abc=t/t0 - t=tb+tc - t0=t0b+t0c - t0=(t0-t)/3.0 - sync_bc=t/t0 - sync2d(i,j)=max(sync_abc,sync_bc) - enddo - enddo - - red=0. - do i=ia,ib - ii=maxloc(sync2d(i,-JZ:JZ)) - 1 - JZ - j0=ii(1) - jpeak(i)=j0 - red(i)=sync2d(i,j0) - enddo - iz=ib-ia+1 - call indexx(red(ia:ib),iz,indx) - ibase=indx(nint(0.40*iz)) - 1 + ia - if(ibase.lt.1) ibase=1 - if(ibase.gt.nh1) ibase=nh1 - base=red(ibase) - red=red/base - do i=1,min(maxcand,iz) - n=ia + indx(iz+1-i) - 1 - if(red(n).lt.syncmin.or.isnan(red(n)).or.k.eq.maxcand) exit - k=k+1 -! candidate0(1,k)=n*df+37.5*1.5 - candidate0(1,k)=n*df - candidate0(2,k)=(jpeak(n)-1)*tstep - candidate0(3,k)=red(n) - enddo - ncand=k - -! Put nfqso at top of list, and save only the best of near-dupe freqs. - do i=1,ncand - if(abs(candidate0(1,i)-nfqso).lt.10.0) candidate0(1,i)=-candidate0(1,i) - if(i.ge.2) then - do j=1,i-1 - fdiff=abs(candidate0(1,i))-abs(candidate0(1,j)) - if(abs(fdiff).lt.4.0) then - if(candidate0(3,i).ge.candidate0(3,j)) candidate0(3,j)=0. - if(candidate0(3,i).lt.candidate0(3,j)) candidate0(3,i)=0. - endif - enddo - endif - enddo - - fac=20.0/maxval(s) - s=fac*s - -! Sort by sync -! call indexx(candidate0(3,1:ncand),ncand,indx) -! Sort by frequency - call indexx(candidate0(1,1:ncand),ncand,indx) - k=1 -! do i=ncand,1,-1 - do i=1,ncand - j=indx(i) -! if( candidate0(3,j) .ge. syncmin .and. candidate0(2,j).ge.-1.5 ) then - if( candidate0(3,j) .ge. syncmin ) then - candidate(2:3,k)=candidate0(2:3,j) - candidate(1,k)=abs(candidate0(1,j)) - k=k+1 - endif - enddo - ncand=k-1 - return -end subroutine syncft4 From a56960a19b9676fd37ee7e0bfeec2e3fcacef576 Mon Sep 17 00:00:00 2001 From: Steve Franke Date: Sun, 26 May 2019 10:06:59 -0500 Subject: [PATCH 097/159] Remove syncft4.f90 from CMakeLists.txt. --- CMakeLists.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 74f382421..a8093b100 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -566,7 +566,6 @@ set (wsjt_FSRCS lib/sync64.f90 lib/sync65.f90 lib/ft4/getcandidates4.f90 - lib/ft4/syncft4.f90 lib/ft8/sync8.f90 lib/ft8/sync8d.f90 lib/ft4/sync4d.f90 From 11065c349c3683c0a52f6196de5b32c71038c380 Mon Sep 17 00:00:00 2001 From: Steve Franke Date: Sun, 26 May 2019 12:08:07 -0500 Subject: [PATCH 098/159] Call OSD if Deep decoding is selected. --- lib/ft4_decode.f90 | 34 +++++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/lib/ft4_decode.f90 b/lib/ft4_decode.f90 index 001ee4c33..5b36ed8dd 100644 --- a/lib/ft4_decode.f90 +++ b/lib/ft4_decode.f90 @@ -74,7 +74,7 @@ contains logical nohiscall,unpk77_success logical one(0:255,0:7) ! 256 4-symbol sequences, 8 bits logical first, dobigfft - logical dosubtract + logical dosubtract,doosd data icos4a/0,1,3,2/ data icos4b/1,0,2,3/ @@ -210,19 +210,23 @@ contains fb=nfb dd=iwave -! ndepth=3: 2 passes, subtract on each pass -! ndepth=2: 1 pass, no subtraction -! ndepth=1: 1 pass, no subtraction, fewer candidates +! ndepth=3: 3 passes, bp+osd +! ndepth=2: 3 passes, bp only +! ndepth=1: 1 pass, no subtraction max_iterations=40 syncmin=1.2 dosubtract=.true. + doosd=.true. nsp=3 - if(ndepth.lt.3) then + if(ndepth.eq.2) then + doosd=.false. + endif + if(ndepth.eq.1) then nsp=1 dosubtract=.false. + doosd=.false. endif - if(ndepth.eq.1) syncmin=2.0 do isp = 1,nsp if(isp.eq.2) then @@ -482,10 +486,22 @@ contains llr=llrd endif message77=0 + dmin=0.0 call timer('bpdec174',0) call bpdecode174_91(llr,apmask,max_iterations,message77, & cw,nharderror,niterations) call timer('bpdec174',1) + + if(doosd .and. nharderror.lt.0) then + ndeep=3 + if(abs(nfqso-f1).le.napwid) then + ndeep=4 + endif + call timer('osd174_91 ',0) + call osd174_91(llr,apmask,ndeep,message77,cw,nharderror,dmin) + call timer('osd174_91 ',1) + endif + if(sum(message77).eq.0) cycle if( nharderror.ge.0 ) then message77=mod(message77+rvec,2) ! remove rvec scrambling @@ -508,11 +524,11 @@ contains if(snr.gt.0.0) then xsnr=10*log10(snr)-14.8 else - xsnr=-20.0 + xsnr=-21.0 endif - nsnr=nint(max(-20.0,xsnr)) + nsnr=nint(max(-21.0,xsnr)) xdt=ibest/666.67 - 0.5 -!write(21,'(i6.6,i5,2x,f4.1,i6,2x,a37,2x,f4.1,3i3)') nutc,nsnr,xdt,nint(f0),message,sync,iaptype,ipass,isp +!write(21,'(i6.6,i5,2x,f4.1,i6,2x,a37,2x,f4.1,3i3,f5.1)') nutc,nsnr,xdt,nint(f0),message,sync,iaptype,ipass,isp,dmin call this%callback(sync,nsnr,xdt,f0,message,iaptype,qual) exit endif From f00bcebb9c462e369aa503b4cf5b2b86e3ec4d4a Mon Sep 17 00:00:00 2001 From: Steve Franke Date: Sun, 26 May 2019 13:25:36 -0500 Subject: [PATCH 099/159] Enable lapcqonly for FT4. This disables AP for all but CQ messages if 5 minutes or more have elapsed since the last Tx. --- lib/decoder.f90 | 4 ++-- lib/ft4_decode.f90 | 5 ++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/lib/decoder.f90 b/lib/decoder.f90 index 174b75115..d3f1153f4 100644 --- a/lib/decoder.f90 +++ b/lib/decoder.f90 @@ -152,8 +152,8 @@ subroutine multimode_decoder(ss,id2,params,nfsample) if(params%nmode.eq.5) then call timer('decft4 ',0) call my_ft4%decode(ft4_decoded,id2,params%nQSOProgress,params%nfqso, & - params%nutc,params%nfa,params%nfb,params%ndepth,ncontest, & - mycall,hiscall) + params%nutc,params%nfa,params%nfb,params%ndepth, & + logical(params%lapcqonly),ncontest,mycall,hiscall) call timer('decft4 ',1) go to 800 endif diff --git a/lib/ft4_decode.f90 b/lib/ft4_decode.f90 index 5b36ed8dd..50c9fa47d 100644 --- a/lib/ft4_decode.f90 +++ b/lib/ft4_decode.f90 @@ -24,7 +24,7 @@ module ft4_decode contains subroutine decode(this,callback,iwave,nQSOProgress,nfqso, & - nutc,nfa,nfb,ndepth,ncontest,mycall,hiscall) + nutc,nfa,nfb,ndepth,lapcqonly,ncontest,mycall,hiscall) use timer_module, only: timer use packjt77 include 'ft4/ft4_params.f90' @@ -75,6 +75,7 @@ contains logical one(0:255,0:7) ! 256 4-symbol sequences, 8 bits logical first, dobigfft logical dosubtract,doosd + logical, intent(in) :: lapcqonly data icos4a/0,1,3,2/ data icos4b/1,0,2,3/ @@ -407,6 +408,7 @@ contains apmag=maxval(abs(llra))*1.1 npasses=3+nappasses(nQSOProgress) + if(lapcqonly) npasses=4 if(ndepth.eq.1) npasses=3 if(ncontest.ge.5) npasses=3 ! Don't support Fox and Hound do ipass=1,npasses @@ -421,6 +423,7 @@ contains if(ipass .gt. 3) then llrd=llra iaptype=naptypes(nQSOProgress,ipass-3) + if(lapcqonly) iaptype=1 ! ncontest=0 : NONE ! 1 : NA_VHF From cc43e6b954813fe97a26dfbb80f687783145f25d Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 27 May 2019 15:28:14 -0400 Subject: [PATCH 100/159] Tweaks to robo-detector. --- robots/go | 2 +- robots/robo.f90 | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) mode change 100644 => 100755 robots/go diff --git a/robots/go b/robots/go old mode 100644 new mode 100755 index 9a7c9f3dd..f7bf846fc --- a/robots/go +++ b/robots/go @@ -1,2 +1,2 @@ curl https://pskreporter.info/cgi-bin/robot.pl > robo.dat -robo | sort -nr -k2 +robo | sort -nr -k2 -k1 diff --git a/robots/robo.f90 b/robots/robo.f90 index 69650a149..1f748378c 100644 --- a/robots/robo.f90 +++ b/robots/robo.f90 @@ -14,7 +14,7 @@ program robo character*12 callsign(0:NMAX) integer*1 ic1 - open(10,file='robo.dat',status='old',access='stream') + open(10,file='/tmp/robo.dat',status='old',access='stream') callsign=' ' do ichar=1,NCHARS From fc4dcc6d8817675a408b9ba3e86d388c020de62c Mon Sep 17 00:00:00 2001 From: Steve Franke Date: Mon, 27 May 2019 16:34:53 -0500 Subject: [PATCH 101/159] Fix a bug that caused FT4 decoding to fail when widegraph Start freq was less than 200 Hz. --- lib/ft4/getcandidates4.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ft4/getcandidates4.f90 b/lib/ft4/getcandidates4.f90 index dd875336d..f7cef02ef 100644 --- a/lib/ft4/getcandidates4.f90 +++ b/lib/ft4/getcandidates4.f90 @@ -45,7 +45,7 @@ subroutine getcandidates4(dd,fa,fb,syncmin,nfqso,maxcand,savg,candidate, & enddo nfa=fa/df - if(nfa.lt.8) nfa=8 + if(nfa.lt.nint(200.0/df)) nfa=nint(200.0/df) nfb=fb/df if(nfb.gt.nint(5000.0/df)) nfb=nint(5000.0/df) ncand=0 From 0a02ad75e032d1ed4f35485416fc4ed049a46771 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Tue, 28 May 2019 11:25:28 +0100 Subject: [PATCH 102/159] Remove references to N1MM on the Settings dialog as it now uses the WSJT-X UDP messages The second UDP server and port are noted as deprecated since that channel is no longer used for its original purpose, namely N1MM Logger+ consumption of ADIF logged QSO records. This has been marked as deprecated rather than removing since other applications have unilaterally chosen to use this feed rather than the documented WSJT-X UDP message protocol which contains the same information and more. Expect this UDP channel to be removed in some future WSJT-X release. --- Configuration.ui | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/Configuration.ui b/Configuration.ui index 9e36e7ee1..e32f4a198 100644 --- a/Configuration.ui +++ b/Configuration.ui @@ -7,7 +7,7 @@ 0 0 546 - 536 + 553 @@ -1919,7 +1919,7 @@ for assessing propagation and system performance. - N1MM Logger+ Broadcasts + Secondary UDP Server (deprecated) @@ -1935,7 +1935,7 @@ for assessing propagation and system performance. - <html><head/><body><p>N1MM Server name or IP address:</p></body></html> + Server name or IP address: n1mm_server_name_line_edit @@ -1952,7 +1952,7 @@ for assessing propagation and system performance. - <html><head/><body><p>N1MM Server port number:</p></body></html> + Server port number: n1mm_server_port_spin_box @@ -3085,13 +3085,13 @@ Right click for insert and delete options. - - - - - - + + + + + + From 67ab7c7b8b8f4f199ecbb441cfa90eb2587b1286 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Tue, 28 May 2019 12:18:54 +0100 Subject: [PATCH 103/159] Add Alt+O hotkey to change the operator quickly without going to the Settings dialog Thanks to Jim, W2JC, for suggesting this enhancement. --- Configuration.cpp | 1 + Configuration.hpp | 1 + shortcuts.txt | 1 + widgets/mainwindow.cpp | 10 ++++++++++ 4 files changed, 13 insertions(+) diff --git a/Configuration.cpp b/Configuration.cpp index 5526a1ec4..d1cc8d172 100644 --- a/Configuration.cpp +++ b/Configuration.cpp @@ -718,6 +718,7 @@ bool Configuration::x2ToneSpacing() const {return m_->x2ToneSpacing_;} bool Configuration::x4ToneSpacing() const {return m_->x4ToneSpacing_;} bool Configuration::split_mode () const {return m_->split_mode ();} QString Configuration::opCall() const {return m_->opCall_;} +void Configuration::opCall (QString const& call) {m_->opCall_ = call;} QString Configuration::udp_server_name () const {return m_->udp_server_name_;} auto Configuration::udp_server_port () const -> port_type {return m_->udp_server_port_;} bool Configuration::accept_udp_requests () const {return m_->accept_udp_requests_;} diff --git a/Configuration.hpp b/Configuration.hpp index 0ed7a4057..9535605d9 100644 --- a/Configuration.hpp +++ b/Configuration.hpp @@ -148,6 +148,7 @@ public: bool EMEonly() const; bool post_decodes () const; QString opCall() const; + void opCall (QString const&); QString udp_server_name () const; port_type udp_server_port () const; QString n1mm_server_name () const; diff --git a/shortcuts.txt b/shortcuts.txt index 4356664c0..10276a269 100644 --- a/shortcuts.txt +++ b/shortcuts.txt @@ -35,6 +35,7 @@ Alt+M Monitor Alt+N Enable Tx Ctrl+O Open a .wav file + Alt+O Change operator Alt+Q Log QSO Alt+S Stop monitoring Alt+T Tune diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 99bcc410d..2d3281760 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -37,6 +37,7 @@ #include #include #include +#include #include "revision_utils.hpp" #include "qt_helpers.hpp" @@ -2062,6 +2063,15 @@ void MainWindow::keyPressEvent (QKeyEvent * e) on_actionOpen_triggered(); return; } + else if(e->modifiers() & Qt::AltModifier) { + bool ok; + auto call = QInputDialog::getText (this, tr ("Change Operator"), tr ("New operator:"), + QLineEdit::Normal, m_config.opCall (), &ok); + if (ok) { + m_config.opCall (call); + } + return; + } break; case Qt::Key_V: if(e->modifiers() & Qt::AltModifier) { From abd7847922528fb4f9b03567bda7009f74295162 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Tue, 28 May 2019 12:54:57 +0100 Subject: [PATCH 104/159] Update ADIF header in UDP message "Logged ADIF"(12) to v3.1.0 --- MessageClient.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MessageClient.cpp b/MessageClient.cpp index 5bf23294b..6e2ea7955 100644 --- a/MessageClient.cpp +++ b/MessageClient.cpp @@ -527,7 +527,7 @@ void MessageClient::logged_ADIF (QByteArray const& ADIF_record) { QByteArray message; NetworkMessage::Builder out {&message, NetworkMessage::LoggedADIF, m_->id_, m_->schema_}; - QByteArray ADIF {"\n3.0.7\nWSJT-X\n\n" + ADIF_record + " "}; + QByteArray ADIF {"\n3.1.0\nWSJT-X\n\n" + ADIF_record + " "}; out << ADIF; TRACE_UDP ("ADIF:" << ADIF); m_->send_message (out, message); From 946a2504371519168126b7e4a803ca82efeef88d Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Tue, 28 May 2019 11:19:12 -0400 Subject: [PATCH 105/159] Update the Release Notes in preparation for v2.1-rc6 --- Release_Notes.txt | 129 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 129 insertions(+) diff --git a/Release_Notes.txt b/Release_Notes.txt index c59ffafca..efc7bb42c 100644 --- a/Release_Notes.txt +++ b/Release_Notes.txt @@ -12,6 +12,135 @@ Copyright 2001 - 2019 by Joe Taylor, K1JT. + Release: WSJT-X 2.1.0-rc6 + May 30, 2019 + ------------------------- + +Changes and bug fixes since WSJT-X 2.1.0-rc5: + +IMPORTANT CHANGES TO THE FT4 PROTOCOL, NOT BACKWARD COMPATIBLE + - T/R sequence length increased from 6.0 to 7.5 seconds + - Symbol rate decreased from 23.4375 to 20.8333 baud. + - Bandwidth decreased from 90 Hz to 80 Hz + +OTHER IMPROVEMENTS + - Allowable FT4 time offsets -1.0 < DT < +1.0 s + - Allow RRR Tx4 message in FT4 mode, if not using contest messages + - Send FT4 audio frequency to PSK Reporter + - Add a third decoding pass + - Add ordered statistics decoding + - Improved sensitivity: threshold S/N is now -17.5 dB + - Improvements to accessibility + - Updates to the User Guide (not yet complete, however) + - New user option: "Calling CQ forces Call 1st" + - In FT4 mode, Shift+F11/F12 moves Tx freq by +/- 100 Hz + - Improved S/N calculation for FT4 mode + - N1MM Logger+ now uses the standard WSJT-X UDP messages + - OK/Cancel buttons on Log QSO window maintain fixed positions + +BUG FIXES + - Fix generation of Tx5 message when one callsign is nonstandard + - Fix a bug that prevented use on macOS + - Fix a bug that caused mode switch from FT4 to FT8 + - Fix a bug that caused FT4 to do WSPR-style band hopping + - Fix a bug that caused a Fortran bounds error + + + Release: WSJT-X 2.1.0-rc5 + April 29, 2019 + ------------------------- + +WSJT-X 2.1.0 fifth release candidate is a minor release including the +following. + + - Repairs a defect that stopped messages from UDP servers being accepted. + - Improved message sequencing a QSO end for CQing FT4 stations. + - "Best S+P" action times out after two minutes waiting for a candidate. + - Updated macOS Info.plist to comply with latest mic. privacy controls. + - Multi-pass decoding for FT4 inc. prior decode subtraction. + - Fast/Normal/Deep options for the FT4 decoder. + - Proposed suggested working frequencies for the new FT4 mode. + - Repair a defect in RTTY RU where sequencer fails to advance to Tx3. + - Fix a defect where the contest serial # spin box was incorrectly hidden. + - Fix defects in ALL.TXT formatting for JT65 and JT9. + - Reduce timeout for AP decoding with own call from 10 mins to 5 mins. + + + Release: WSJT-X 2.1.0-rc4 + April 10, 2019 + ------------------------- + +WSJT-X 2.1.0 fourth release candidate is a minor release including the +following. + + - New "Call Best" button for FT4 mode to select the best reply to a + CQ call based on neediness. + - Fixed UTC display on FT4 waterfall. + +This release is made by invitation only to selected testers to trial +the FT4 mode in semi-realistic contest simulations and to elicit +feedback to guide future development. + +*Note* this release is not for general public release and we request + that it is not distributed. + + + Release: WSJT-X 2.1.0-rc3 + April 5, 2019 + ------------------------- + +WSJT-X 2.1.0 third release candidate is an enhancement release to +change the implementation of the new FT4 mode to a synchronous T/R +period of 6 seconds. + +This release is made by invitation only to selected testers to trial +the FT4 mode in semi-realistic contest simulations and to elicit +feedback to guide future development. + +*Note* this release is not for general public release and we request + that it is not distributed. + + + Release: WSJT-X 2.1.0-rc2 + March 29, 2019 + ------------------------- + +WSJT-X 2.1.0 second release candidate is a bug fix release to repair +some usability issues with FT4 contest mode. The following new +features are also included. + + - Better options for QSO flow by clicking Tx# buttons to transmit + - A 64-bit package for Windows 64-bit systems + - Improved FT4 sync detection speed + +This release is made by invitation only to selected testers to trial +the FT4 mode in semi-realistic contest simulations and to elicit +feedback to guide future development. + +*Note* this release is not for general public release and we request +that it is not distributed. + + Release: WSJT-X 2.1.0-rc1 + March 25, 2019 + ------------------------- + +WSJT-X 2.1.0 first release candidate is a preview alpha quality +release containing the following new features. + + - FT4 mode, a new mode targeted at HF digital contesting + - GMSK modulation for FT4 and FT8 + - New waterfall option to select between raw sensitivity or a + filtered signal representation for best visualization of signal + quality + +This release is made by invitation only to selected testers to trial +the FT4 mode in semi-realistic contest simulations and to elicit +feedback to guide future development. + +*Note* this release is not for general public release and we request +that it is not distributed. + + Release: WSJT-X 2.0.1 February 25, 2019 --------------------- From dce016f6ebf4eb305e71b18391f94940c341bb89 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Tue, 28 May 2019 12:09:34 -0400 Subject: [PATCH 106/159] Disable RC6 during ARRL June VHF contest, Field Day, and after July 21, 2019. --- widgets/mainwindow.cpp | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 2d3281760..06f9106e3 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -990,16 +990,23 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple, void MainWindow::not_GA_warning_message () { - /* MessageBox::critical_message (this, "

" "This is a pre-release version of WSJT-X 2.1.0 made " - "available for testing purposes. It will become nonfunctional " - "after June 7, 2019."); - QDateTime now=QDateTime::currentDateTime(); - QDateTime timeout=QDateTime(QDate(2019,6,7)); + "available for testing purposes. By design it will " + "be nonfunctional during the 2019 ARRL June VHF contest " + "(June 8-10) and Field Day (June 22-23) weekends. It " + "will be permanently nonfunctional after July 21, 2019."); + QDateTime now=QDateTime::currentDateTimeUtc(); + QDateTime t1(QDate(2019,6,8),QTime(18,0)); + QDateTime t2(QDate(2019,6,10),QTime(3,0)); + if(now.secsTo(t1)<0 and now.secsTo(t2)>0) Q_EMIT finished(); + t1=QDateTime(QDate(2019,6,22),QTime(18,0)); + t2=QDateTime(QDate(2019,6,23),QTime(21,0)); + if(now.secsTo(t1)<0 and now.secsTo(t2)>0) Q_EMIT finished(); + QDateTime timeout(QDate(2019,7,21),QTime(0,0)); if(now.daysTo(timeout) < 0) Q_EMIT finished(); - */ + } void MainWindow::initialize_fonts () From f4633809d385f46dcc5a9767fcf4fd6282c3c6b5 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Tue, 28 May 2019 18:28:12 +0100 Subject: [PATCH 107/159] Put EU VHF contest mode serial numbers into the ADIF SRX and STX fields --- logbook/logbook.cpp | 41 ++++++++++++++++++++++++++++++----------- 1 file changed, 30 insertions(+), 11 deletions(-) diff --git a/logbook/logbook.cpp b/logbook/logbook.cpp index e4a04f64a..0e855c88f 100644 --- a/logbook/logbook.cpp +++ b/logbook/logbook.cpp @@ -96,24 +96,43 @@ QByteArray LogBook::QSOToADIF (QString const& hisCall, QString const& hisGrid, Q auto words = xSent.split (' ', QString::SkipEmptyParts); if (words.size () > 1) { - bool ok; - auto sn = words.back ().toUInt (&ok); - if (ok && sn) + if (words.back ().toUInt ()) { // assume last word is a serial if there are at least // two words and if it is positive numeric - t += " ' + words.back (); + t += " ' + words.back (); + } + else + { + if (words.front ().toUInt () && words.front ().size () > 3) // EU VHF contest mode + { + auto sn_text = words.front ().mid (2); + // assume first word is report+serial if there are + // at least two words and if the first word less the + // first two characters is a positive numeric + t += " ' + sn_text; + } } } } if (xRcvd.size ()) { - QString t1=""; - if(xRcvd.split(" ").size()==2) t1=xRcvd.split(" ").at(1); - if(t1.toInt()>0) { - t += " " + t1; - } else { - t += " " + t1; - } + auto words = xRcvd.split (' ', QString::SkipEmptyParts); + if (words.size () == 2) + { + if (words.at (1).toUInt ()) + { + t += " " + words.at (1); + } + else if (words.at (0).toUInt () && words.at (0).size () > 3) // EU VHF contest exchange + { + // strip report and set SRX to serial + t += " " + words.at (0).mid (2); + } + else + { + t += " " + words.at (1); + } + } } return t.toLatin1(); } From 8035880c451dc4938d8e8380da10c97b5151cf0b Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Tue, 28 May 2019 19:00:13 +0100 Subject: [PATCH 108/159] CMake updates to remove warnings when using recent CMake versions --- CMake/Modules/Findhamlib.cmake | 7 +++++-- CMakeLists.txt | 4 ++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CMake/Modules/Findhamlib.cmake b/CMake/Modules/Findhamlib.cmake index 98419bda1..234083ae1 100644 --- a/CMake/Modules/Findhamlib.cmake +++ b/CMake/Modules/Findhamlib.cmake @@ -19,9 +19,12 @@ find_path (__hamlib_pc_path NAMES hamlib.pc PATH_SUFFIXES lib/pkgconfig lib64/pkgconfig ) if (__hamlib_pc_path) - set (ENV{PKG_CONFIG_PATH} "${__hamlib_pc_path}" "$ENV{PKG_CONFIG_PATH}") - unset (__hamlib_pc_path CACHE) + set (__pc_path $ENV{PKG_CONFIG_PATH}) + list (APPEND __pc_path "${__hamlib_pc_path}") + set (ENV{PKG_CONFIG_PATH} "${__pc_path}") + unset (__pc_path CACHE) endif () +unset (__hamlib_pc_path CACHE) # Use pkg-config to get hints about paths, libs and, flags unset (__pkg_config_checked_hamlib CACHE) diff --git a/CMakeLists.txt b/CMakeLists.txt index a8093b100..d5d18467c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -39,6 +39,10 @@ if (POLICY CMP0063) cmake_policy (SET CMP0063 NEW) # honour visibility properties for all library types endif (POLICY CMP0063) +if (POLICY CMP0071) + cmake_policy (SET CMP0071 NEW) # run automoc and autouic on generated sources +endif (POLICY CMP0071) + include (${PROJECT_SOURCE_DIR}/CMake/VersionCompute.cmake) message (STATUS "Building ${CMAKE_PROJECT_NAME}-${wsjtx_VERSION}") From a54140582ad2badb579df5546c8ea1ae025d339c Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Wed, 29 May 2019 20:47:11 +0100 Subject: [PATCH 109/159] Tidied up cut-off criteria --- widgets/mainwindow.cpp | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 06f9106e3..ef5dd616b 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -997,16 +997,13 @@ void MainWindow::not_GA_warning_message () "be nonfunctional during the 2019 ARRL June VHF contest " "(June 8-10) and Field Day (June 22-23) weekends. It " "will be permanently nonfunctional after July 21, 2019."); - QDateTime now=QDateTime::currentDateTimeUtc(); - QDateTime t1(QDate(2019,6,8),QTime(18,0)); - QDateTime t2(QDate(2019,6,10),QTime(3,0)); - if(now.secsTo(t1)<0 and now.secsTo(t2)>0) Q_EMIT finished(); - t1=QDateTime(QDate(2019,6,22),QTime(18,0)); - t2=QDateTime(QDate(2019,6,23),QTime(21,0)); - if(now.secsTo(t1)<0 and now.secsTo(t2)>0) Q_EMIT finished(); - QDateTime timeout(QDate(2019,7,21),QTime(0,0)); - if(now.daysTo(timeout) < 0) Q_EMIT finished(); - + auto now = QDateTime::currentDateTimeUtc (); + if ((QDateTime {{2019, 6, 8}, {18, 0}, Qt::UTC} <= now + && now < QDateTime {{2019, 6, 10}, {3, 0}, Qt::UTC}) + || now >= QDateTime {{2019, 7, 21}, {0, 0}, Qt::UTC}) + { + Q_EMIT finished (); + } } void MainWindow::initialize_fonts () From 381faca99aa8603f2e38125feab669c8148a0656 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Wed, 29 May 2019 23:35:18 +0100 Subject: [PATCH 110/159] Add option to include or exclude WAE extra entities in DXCC entity lookups Also refactored object relationships as a start to implementing contest multiplier highlighting. --- Configuration.cpp | 8 +++- Configuration.hpp | 1 + Configuration.ui | 83 ++++++++++++++++++++++++---------------- logbook/AD1CCty.cpp | 52 ++++++++++++++++--------- logbook/AD1CCty.hpp | 8 ++-- logbook/WorkedBefore.cpp | 9 +++-- logbook/WorkedBefore.hpp | 3 +- logbook/logbook.cpp | 24 ++++++++++++ logbook/logbook.h | 8 ++++ models/CabrilloLog.cpp | 13 +++++++ models/CabrilloLog.hpp | 5 ++- widgets/logqso.cpp | 9 ++--- widgets/logqso.h | 8 ++-- widgets/mainwindow.cpp | 28 ++++---------- widgets/mainwindow.h | 4 -- 15 files changed, 169 insertions(+), 94 deletions(-) diff --git a/Configuration.cpp b/Configuration.cpp index d1cc8d172..11c7be369 100644 --- a/Configuration.cpp +++ b/Configuration.cpp @@ -564,6 +564,7 @@ private: DecodeHighlightingModel decode_highlighing_model_; DecodeHighlightingModel next_decode_highlighing_model_; bool highlight_by_mode_; + bool include_WAE_entities_; int LotW_days_since_upload_; TransceiverFactory::ParameterPack rig_params_; @@ -745,6 +746,7 @@ bool Configuration::pwrBandTuneMemory () const {return m_->pwrBandTuneMemory_;} LotWUsers const& Configuration::lotw_users () const {return m_->lotw_users_;} DecodeHighlightingModel const& Configuration::decode_highlighting () const {return m_->decode_highlighing_model_;} bool Configuration::highlight_by_mode () const {return m_->highlight_by_mode_;} +bool Configuration::include_WAE_entities () const {return m_->include_WAE_entities_;} void Configuration::set_calibration (CalibrationParams params) { @@ -950,6 +952,7 @@ Configuration::impl::impl (Configuration * self, QNetworkAccessManager * network , station_insert_action_ {tr ("&Insert ..."), nullptr} , station_dialog_ {new StationDialog {&next_stations_, &bands_, this}} , highlight_by_mode_ {false} + , include_WAE_entities_ {false} , LotW_days_since_upload_ {0} , last_port_type_ {TransceiverFactory::Capabilities::none} , rig_is_dummy_ {false} @@ -1319,6 +1322,7 @@ void Configuration::impl::initialize_models () next_decode_highlighing_model_.items (decode_highlighing_model_.items ()); ui_->highlight_by_mode_check_box->setChecked (highlight_by_mode_); + ui_->include_WAE_check_box->setChecked (include_WAE_entities_); ui_->LotW_days_since_upload_spin_box->setValue (LotW_days_since_upload_); set_rig_invariants (); @@ -1467,6 +1471,7 @@ void Configuration::impl::read_settings () if (!highlight_items.size ()) highlight_items = DecodeHighlightingModel::default_items (); decode_highlighing_model_.items (highlight_items); highlight_by_mode_ = settings_->value("HighlightByMode", false).toBool (); + include_WAE_entities_ = settings_->value("IncludeWAEEntities", false).toBool (); LotW_days_since_upload_ = settings_->value ("LotWDaysSinceLastUpload", 365).toInt (); lotw_users_.set_age_constraint (LotW_days_since_upload_); @@ -1579,7 +1584,7 @@ void Configuration::impl::write_settings () settings_->setValue ("FrequenciesForRegionModes", QVariant::fromValue (frequencies_.frequency_list ())); settings_->setValue ("stations", QVariant::fromValue (stations_.station_list ())); settings_->setValue ("DecodeHighlighting", QVariant::fromValue (decode_highlighing_model_.items ())); - settings_->setValue ("HighlightByMode", highlight_by_mode_); + settings_->setValue ("IncludeWAEEntities", include_WAE_entities_); settings_->setValue ("LotWDaysSinceLastUpload", LotW_days_since_upload_); settings_->setValue ("toRTTY", log_as_RTTY_); settings_->setValue ("dBtoComments", report_in_comments_); @@ -2116,6 +2121,7 @@ void Configuration::impl::accept () Q_EMIT self_->decode_highlighting_changed (decode_highlighing_model_); } highlight_by_mode_ = ui_->highlight_by_mode_check_box->isChecked (); + include_WAE_entities_ = ui_->include_WAE_check_box->isChecked (); LotW_days_since_upload_ = ui_->LotW_days_since_upload_spin_box->value (); lotw_users_.set_age_constraint (LotW_days_since_upload_); diff --git a/Configuration.hpp b/Configuration.hpp index 9535605d9..80f5a5cd1 100644 --- a/Configuration.hpp +++ b/Configuration.hpp @@ -177,6 +177,7 @@ public: LotWUsers const& lotw_users () const; DecodeHighlightingModel const& decode_highlighting () const; bool highlight_by_mode () const; + bool include_WAE_entities () const; enum class SpecialOperatingActivity {NONE, NA_VHF, EU_VHF, FIELD_DAY, RTTY, FOX, HOUND}; SpecialOperatingActivity special_op_id () const; diff --git a/Configuration.ui b/Configuration.ui index e32f4a198..a9fe51d45 100644 --- a/Configuration.ui +++ b/Configuration.ui @@ -2294,6 +2294,23 @@ Right click for insert and delete options. + + + + + + + + + Include extra WAE entities + + + include_WAE_check_box + + + + + @@ -2306,35 +2323,6 @@ Right click for insert and delete options. Logbook of the World User Validation - - - - Age of last upload less than: - - - LotW_days_since_upload_spin_box - - - - - - - <html><head/><body><p>Adjust this spin box to set the age threshold of LotW user's last upload date that is accepted as a current LotW user.</p></body></html> - - - days - - - 0 - - - 9999 - - - 365 - - - @@ -2369,6 +2357,35 @@ Right click for insert and delete options. + + + + Age of last upload less than: + + + LotW_days_since_upload_spin_box + + + + + + + <html><head/><body><p>Adjust this spin box to set the age threshold of LotW user's last upload date that is accepted as a current LotW user.</p></body></html> + + + days + + + 0 + + + 9999 + + + 365 + + + @@ -3085,13 +3102,13 @@ Right click for insert and delete options. - + - - + - + + diff --git a/logbook/AD1CCty.cpp b/logbook/AD1CCty.cpp index 58ed375f6..23d34fb43 100644 --- a/logbook/AD1CCty.cpp +++ b/logbook/AD1CCty.cpp @@ -16,6 +16,7 @@ #include #include #include +#include "Configuration.hpp" #include "Radio.hpp" #include "pimpl_impl.hpp" @@ -155,14 +156,16 @@ typedef multi_index_container< class AD1CCty::impl final { public: - explicit impl () + using entity_by_id = entities_type::index::type; + + explicit impl (Configuration const * configuration) + : configuration_ {configuration} { } - Record fixup (QString call, prefix const& p) const + entity_by_id::iterator lookup_entity (QString call, prefix const& p) const { call = call.toUpper (); - using entity_by_id = entities_type::index::type; entity_by_id::iterator e; // iterator into entity set // @@ -171,23 +174,26 @@ public: if (call.startsWith ("KG4") && call.size () != 5 && call.size () != 3) { // KG4 2x1 and 2x3 calls that map to Gitmo are mainland US not Gitmo - e = entities_.project (entities_.get ().find ("K")); + return entities_.project (entities_.get ().find ("K")); } else { - e = entities_.get ().find (p.entity_id_); + return entities_.get ().find (p.entity_id_); } - + } + + Record fixup (prefix const& p, entity const& e) const + { Record result; - result.continent = e->continent_; - result.CQ_zone = e->CQ_zone_; - result.ITU_zone = e->ITU_zone_; - result.entity_name = e->name_; - result.WAE_only = e->WAE_only_; - result.latitude = e->lat_; - result.longtitude = e->long_; - result.UTC_offset = e->UTC_offset_; - result.primary_prefix = e->primary_prefix_; + result.continent = e.continent_; + result.CQ_zone = e.CQ_zone_; + result.ITU_zone = e.ITU_zone_; + result.entity_name = e.name_; + result.WAE_only = e.WAE_only_; + result.latitude = e.lat_; + result.longtitude = e.long_; + result.UTC_offset = e.UTC_offset_; + result.primary_prefix = e.primary_prefix_; // check for overrides bool ok1 {true}, ok2 {true}, ok3 {true}, ok4 {true}, ok5 {true}; @@ -220,6 +226,7 @@ public: return false; } + Configuration const * configuration_; QString path_; entities_type entities_; prefixes_type prefixes_; @@ -307,8 +314,13 @@ char const * AD1CCty::continent (Continent c) } } -AD1CCty::AD1CCty () +AD1CCty::AD1CCty (Configuration const * configuration) + : m_ {configuration} { + Q_ASSERT (configuration); + // TODO: G4WJS - consider doing the following asynchronously to + // speed up startup. Not urgent as it takes less than 1s on a Core + // i7 reading BIG CTY.DAT. QDir dataPath {QStandardPaths::writableLocation (QStandardPaths::DataLocation)}; m_->path_ = dataPath.exists (file_name) ? dataPath.absoluteFilePath (file_name) // user override @@ -389,7 +401,7 @@ auto AD1CCty::lookup (QString const& call) const -> Record auto p = m_->prefixes_.find (exact_search); if (p != m_->prefixes_.end () && p->exact_) { - return m_->fixup (call, *p); + return m_->fixup (*p, *m_->lookup_entity (call, *p)); } } while (search_prefix.size ()) @@ -397,9 +409,11 @@ auto AD1CCty::lookup (QString const& call) const -> Record auto p = m_->prefixes_.find (search_prefix); if (p != m_->prefixes_.end ()) { - if (!p->exact_ || call.size () == search_prefix.size ()) + impl::entity_by_id::iterator e = m_->lookup_entity (call, *p); + if ((m_->configuration_->include_WAE_entities () || !e->WAE_only_) + && (!p->exact_ || call.size () == search_prefix.size ())) { - return m_->fixup (call, *p); + return m_->fixup (*p, *e); } } search_prefix = search_prefix.left (search_prefix.size () - 1); diff --git a/logbook/AD1CCty.hpp b/logbook/AD1CCty.hpp index 37cada3e9..4a485afa9 100644 --- a/logbook/AD1CCty.hpp +++ b/logbook/AD1CCty.hpp @@ -1,17 +1,19 @@ #ifndef AD1C_CTY_HPP_ #define AD1C_CTY_HPP_ -#include #include +#include #include "pimpl_h.hpp" +class QString; +class Configuration; + // // AD1CCty - Fast access database of Jim Reisert, AD1C's, cty.dat // entity and entity override information file. // class AD1CCty final : public QObject - , private boost::noncopyable { Q_OBJECT @@ -39,7 +41,7 @@ public: QString primary_prefix; }; - explicit AD1CCty (); + explicit AD1CCty (Configuration const *); ~AD1CCty (); Record lookup (QString const& call) const; diff --git a/logbook/WorkedBefore.cpp b/logbook/WorkedBefore.cpp index 31380b4c3..5edc51d3e 100644 --- a/logbook/WorkedBefore.cpp +++ b/logbook/WorkedBefore.cpp @@ -18,7 +18,7 @@ #include #include #include - +#include "Configuration.hpp" #include "qt_helpers.hpp" #include "pimpl_impl.hpp" @@ -361,8 +361,9 @@ namespace class WorkedBefore::impl final { public: - impl () + impl (Configuration const * configuration) : path_ {QDir {QStandardPaths::writableLocation (QStandardPaths::DataLocation)}.absoluteFilePath (logFileName)} + , prefixes_ {configuration} { } @@ -379,8 +380,10 @@ public: worked_before_database_type worked_; }; -WorkedBefore::WorkedBefore () +WorkedBefore::WorkedBefore (Configuration const * configuration) + : m_ {configuration} { + Q_ASSERT (configuration); connect (&m_->loader_watcher_, &QFutureWatcher::finished, [this] () { QString error; size_t n {0}; diff --git a/logbook/WorkedBefore.hpp b/logbook/WorkedBefore.hpp index 90a31813a..8b115351f 100644 --- a/logbook/WorkedBefore.hpp +++ b/logbook/WorkedBefore.hpp @@ -5,6 +5,7 @@ #include "AD1CCty.hpp" #include "pimpl_h.hpp" +class Configuration; class CountryDat; class QString; class QByteArray; @@ -17,7 +18,7 @@ class WorkedBefore final public: using Continent = AD1CCty::Continent; - explicit WorkedBefore (); + explicit WorkedBefore (Configuration const *); ~WorkedBefore (); Q_SLOT void reload (); diff --git a/logbook/logbook.cpp b/logbook/logbook.cpp index 0e855c88f..bde52228c 100644 --- a/logbook/logbook.cpp +++ b/logbook/logbook.cpp @@ -3,12 +3,16 @@ #include #include "Configuration.hpp" #include "AD1CCty.hpp" +#include "models/CabrilloLog.hpp" +#include "models/FoxLog.hpp" #include "moc_logbook.cpp" LogBook::LogBook (Configuration const * configuration) : config_ {configuration} + , worked_before_ {configuration} { + Q_ASSERT (configuration); connect (&worked_before_, &WorkedBefore::finished_loading, this, &LogBook::finished_loading); } @@ -136,3 +140,23 @@ QByteArray LogBook::QSOToADIF (QString const& hisCall, QString const& hisGrid, Q } return t.toLatin1(); } + +CabrilloLog * LogBook::contest_log () +{ + // lazy create of Cabrillo log object instance + if (!m_contest_log) + { + m_contest_log.reset (new CabrilloLog {config_}); + } + return m_contest_log.data (); +} + +FoxLog * LogBook::fox_log () +{ + // lazy create of Fox log object instance + if (!m_fox_log) + { + m_fox_log.reset (new FoxLog {config_}); + } + return m_fox_log.data (); +} diff --git a/logbook/logbook.h b/logbook/logbook.h index 1850aa01f..2fd73bd3b 100644 --- a/logbook/logbook.h +++ b/logbook/logbook.h @@ -8,12 +8,15 @@ #include #include +#include #include "WorkedBefore.hpp" class Configuration; class QByteArray; class QDateTime; +class CabrilloLog; +class FoxLog; class LogBook final : public QObject @@ -43,9 +46,14 @@ public: Q_SIGNAL void finished_loading (int worked_before_record_count, QString const& error) const; + CabrilloLog * contest_log (); + FoxLog * fox_log (); + private: Configuration const * config_; WorkedBefore worked_before_; + QScopedPointer m_contest_log; + QScopedPointer m_fox_log; }; #endif diff --git a/models/CabrilloLog.cpp b/models/CabrilloLog.cpp index 6849cdd61..6a637f07d 100644 --- a/models/CabrilloLog.cpp +++ b/models/CabrilloLog.cpp @@ -12,6 +12,7 @@ #include #include "Configuration.hpp" #include "Bands.hpp" +#include "logbook/AD1CCty.hpp" #include "qt_db_helpers.hpp" #include "pimpl_impl.hpp" @@ -232,3 +233,15 @@ void CabrilloLog::export_qsos (QTextStream& stream) const .arg (m_->export_query_.value (rcvd_index).toString (), -13); } } + +QSet CabrilloLog::unique_DXCC_entities (AD1CCty const& countries) const +{ + QSqlQuery q {"SELECT UNIQUE CALL FROM cabrillo_log"}; + auto call_index = q.record ().indexOf ("call"); + QSet entities; + while (q.next ()) + { + entities << countries.lookup (q.value(call_index).toString ()).primary_prefix; + } + return entities; +} diff --git a/models/CabrilloLog.hpp b/models/CabrilloLog.hpp index 43b9e8f94..ad0255297 100644 --- a/models/CabrilloLog.hpp +++ b/models/CabrilloLog.hpp @@ -2,14 +2,16 @@ #define CABRILLO_LOG_HPP_ #include +#include +#include #include "Radio.hpp" #include "pimpl_h.hpp" class Configuration; class QDateTime; -class QString; class QSqlTableModel; class QTextStream; +class AD1CCty; class CabrilloLog final : private boost::noncopyable @@ -28,6 +30,7 @@ public: QSqlTableModel * model (); void reset (); void export_qsos (QTextStream&) const; + QSet unique_DXCC_entities (AD1CCty const&) const; private: class impl; diff --git a/widgets/logqso.cpp b/widgets/logqso.cpp index acbb340bc..a9aa18341 100644 --- a/widgets/logqso.cpp +++ b/widgets/logqso.cpp @@ -16,11 +16,12 @@ #include "moc_logqso.cpp" LogQSO::LogQSO(QString const& programTitle, QSettings * settings - , Configuration const * config, QWidget *parent) + , Configuration const * config, LogBook * log, QWidget *parent) : QDialog {parent, Qt::WindowStaysOnTopHint | Qt::WindowTitleHint | Qt::WindowSystemMenuHint} , ui(new Ui::LogQSO) , m_settings (settings) , m_config {config} + , m_log {log} { ui->setupUi(this); setWindowTitle(programTitle + " - Log QSO"); @@ -57,8 +58,7 @@ void LogQSO::storeSettings () const void LogQSO::initLogQSO(QString const& hisCall, QString const& hisGrid, QString mode, QString const& rptSent, QString const& rptRcvd, QDateTime const& dateTimeOn, QDateTime const& dateTimeOff, - Radio::Frequency dialFreq, bool noSuffix, QString xSent, QString xRcvd, - CabrilloLog * cabrillo_log) + Radio::Frequency dialFreq, bool noSuffix, QString xSent, QString xRcvd) { if(!isHidden()) return; ui->call->setText (hisCall); @@ -100,7 +100,6 @@ void LogQSO::initLogQSO(QString const& hisCall, QString const& hisGrid, QString ui->loggedOperator->setText(m_config->opCall()); ui->exchSent->setText (xSent); ui->exchRcvd->setText (xRcvd); - m_cabrilloLog = cabrillo_log; using SpOp = Configuration::SpecialOperatingActivity; auto special_op = m_config->special_op_id (); @@ -158,7 +157,7 @@ void LogQSO::accept() return; // without accepting } - if (!m_cabrilloLog->add_QSO (m_dialFreq, dateTimeOff, hisCall, xsent, xrcvd)) + if (!m_log->contest_log ()->add_QSO (m_dialFreq, dateTimeOff, hisCall, xsent, xrcvd)) { show (); MessageBox::warning_message (this, tr ("Invalid QSO Data"), diff --git a/widgets/logqso.h b/widgets/logqso.h index 82a75b7bd..739a601f7 100644 --- a/widgets/logqso.h +++ b/widgets/logqso.h @@ -17,19 +17,19 @@ namespace Ui { class QSettings; class Configuration; class QByteArray; -class CabrilloLog; +class LogBook; class LogQSO : public QDialog { Q_OBJECT public: - explicit LogQSO(QString const& programTitle, QSettings *, Configuration const *, QWidget *parent = 0); + explicit LogQSO(QString const& programTitle, QSettings *, Configuration const *, LogBook *, QWidget *parent = 0); ~LogQSO(); void initLogQSO(QString const& hisCall, QString const& hisGrid, QString mode, QString const& rptSent, QString const& rptRcvd, QDateTime const& dateTimeOn, QDateTime const& dateTimeOff, Radio::Frequency dialFreq, - bool noSuffix, QString xSent, QString xRcvd, CabrilloLog *); + bool noSuffix, QString xSent, QString xRcvd); public slots: void accept(); @@ -54,12 +54,12 @@ private: QScopedPointer ui; QSettings * m_settings; Configuration const * m_config; + LogBook * m_log; QString m_txPower; QString m_comments; Radio::Frequency m_dialFreq; QString m_myCall; QString m_myGrid; - CabrilloLog * m_cabrilloLog; }; #endif // LogQSO_H diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index ef5dd616b..ef1ca5705 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -244,7 +244,7 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple, m_echoGraph (new EchoGraph(m_settings)), m_fastGraph (new FastGraph(m_settings)), // no parent so that it has a taskbar icon - m_logDlg (new LogQSO (program_title (), m_settings, &m_config, nullptr)), + m_logDlg (new LogQSO (program_title (), m_settings, &m_config, &m_logBook, nullptr)), m_lastDialFreq {0}, m_dialFreqRxWSPR {0}, m_detector {new Detector {RX_SAMPLE_RATE, double(NTMAX), downSampleFactor}}, @@ -2544,16 +2544,14 @@ void MainWindow::on_actionAstronomical_data_toggled (bool checked) void MainWindow::on_fox_log_action_triggered() { - if (!m_foxLog) m_foxLog.reset (new FoxLog {&m_config}); if (!m_foxLogWindow) { - m_foxLogWindow.reset (new FoxLogWindow {m_settings, &m_config, m_foxLog.data ()}); + m_foxLogWindow.reset (new FoxLogWindow {m_settings, &m_config, m_logBook.fox_log ()}); // Connect signals from fox log window connect (this, &MainWindow::finished, m_foxLogWindow.data (), &FoxLogWindow::close); connect (m_foxLogWindow.data (), &FoxLogWindow::reset_log_model, [this] () { - if (!m_foxLog) m_foxLog.reset (new FoxLog {&m_config}); - m_foxLog->reset (); + m_logBook.fox_log ()->reset (); }); } m_foxLogWindow->showNormal (); @@ -2563,10 +2561,9 @@ void MainWindow::on_fox_log_action_triggered() void MainWindow::on_contest_log_action_triggered() { - if (!m_cabrilloLog) m_cabrilloLog.reset (new CabrilloLog {&m_config}); if (!m_contestLogWindow) { - m_contestLogWindow.reset (new CabrilloLogWindow {m_settings, &m_config, m_cabrilloLog->model ()}); + m_contestLogWindow.reset (new CabrilloLogWindow {m_settings, &m_config, m_logBook.contest_log ()->model ()}); // Connect signals from contest log window connect (this, &MainWindow::finished, m_contestLogWindow.data (), &CabrilloLogWindow::close); @@ -5521,15 +5518,9 @@ void MainWindow::on_logQSOButton_clicked() //Log QSO button default: break; } - auto special_op = m_config.special_op_id (); - if (SpecOp::NONE < special_op && special_op < SpecOp::FOX) - { - if (!m_cabrilloLog) m_cabrilloLog.reset (new CabrilloLog {&m_config}); - } m_logDlg->initLogQSO (m_hisCall, grid, m_modeTx, m_rptSent, m_rptRcvd, m_dateTimeQSOOn, dateTimeQSOOff, m_freqNominal + - ui->TxFreqSpinBox->value(), m_noSuffix, m_xSent, m_xRcvd, - m_cabrilloLog.data ()); + ui->TxFreqSpinBox->value(), m_noSuffix, m_xSent, m_xRcvd); m_inQSOwith=""; } @@ -6369,15 +6360,13 @@ void MainWindow::on_reset_cabrillo_log_action_triggered () "for export in your Cabrillo log."))) { if(m_config.RTTY_Exchange()!="SCC") ui->sbSerialNumber->setValue(1); - if (!m_cabrilloLog) m_cabrilloLog.reset (new CabrilloLog {&m_config}); - m_cabrilloLog->reset (); + m_logBook.contest_log ()->reset (); } } void MainWindow::on_actionExport_Cabrillo_log_triggered() { - if (!m_cabrilloLog) m_cabrilloLog.reset (new CabrilloLog {&m_config}); - if (QDialog::Accepted == ExportCabrillo {m_settings, &m_config, m_cabrilloLog.data ()}.exec()) + if (QDialog::Accepted == ExportCabrillo {m_settings, &m_config, m_logBook.contest_log ()}.exec()) { MessageBox::information_message (this, tr ("Cabrillo Log saved")); } @@ -8459,9 +8448,8 @@ list2Done: m_hisGrid=m_foxQSO[hc1].grid; m_rptSent=m_foxQSO[hc1].sent; m_rptRcvd=m_foxQSO[hc1].rcvd; - if (!m_foxLog) m_foxLog.reset (new FoxLog {&m_config}); if (!m_foxLogWindow) on_fox_log_action_triggered (); - if (m_foxLog->add_QSO (QSO_time, m_hisCall, m_hisGrid, m_rptSent, m_rptRcvd, m_lastBand)) + if (m_logBook.fox_log ()->add_QSO (QSO_time, m_hisCall, m_hisGrid, m_rptSent, m_rptRcvd, m_lastBand)) { writeFoxQSO (QString {" Log: %1 %2 %3 %4 %5"}.arg (m_hisCall).arg (m_hisGrid) .arg (m_rptSent).arg (m_rptRcvd).arg (m_lastBand)); diff --git a/widgets/mainwindow.h b/widgets/mainwindow.h index ffa71c1fe..03d009a76 100644 --- a/widgets/mainwindow.h +++ b/widgets/mainwindow.h @@ -72,9 +72,7 @@ class WideGraph; class LogQSO; class Transceiver; class MessageAveraging; -class FoxLog; class FoxLogWindow; -class CabrilloLog; class CabrilloLogWindow; class ColorHighlighting; class MessageClient; @@ -376,9 +374,7 @@ private: QScopedPointer m_prefixes; QScopedPointer m_mouseCmnds; QScopedPointer m_msgAvgWidget; - QScopedPointer m_foxLog; QScopedPointer m_foxLogWindow; - QScopedPointer m_cabrilloLog; QScopedPointer m_contestLogWindow; QScopedPointer m_colorHighlighting; Transceiver::TransceiverState m_rigState; From 94b86c3b2991a490ff48f2204d140706d38514ba Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Thu, 30 May 2019 04:10:55 +0100 Subject: [PATCH 111/159] Finally fixed the default item delegate creation mechanism --- Configuration.cpp | 6 ------ MetaDataRegistry.cpp | 33 +++++++++++++++++++++++++-------- MetaDataRegistry.hpp | 3 --- 3 files changed, 25 insertions(+), 17 deletions(-) diff --git a/Configuration.cpp b/Configuration.cpp index 11c7be369..08ee2e9d3 100644 --- a/Configuration.cpp +++ b/Configuration.cpp @@ -1122,9 +1122,6 @@ Configuration::impl::impl (Configuration * self, QNetworkAccessManager * network ui_->frequencies_table_view->setColumnHidden (FrequencyList_v2::frequency_mhz_column, true); // delegates - auto frequencies_item_delegate = new QStyledItemDelegate {this}; - frequencies_item_delegate->setItemEditorFactory (item_editor_factory ()); - ui_->frequencies_table_view->setItemDelegate (frequencies_item_delegate); ui_->frequencies_table_view->setItemDelegateForColumn (FrequencyList_v2::region_column, new ForeignKeyDelegate {®ions_, 0, this}); ui_->frequencies_table_view->setItemDelegateForColumn (FrequencyList_v2::mode_column, new ForeignKeyDelegate {&modes_, 0, this}); @@ -1163,9 +1160,6 @@ Configuration::impl::impl (Configuration * self, QNetworkAccessManager * network ui_->stations_table_view->sortByColumn (StationList::band_column, Qt::AscendingOrder); // stations delegates - auto stations_item_delegate = new QStyledItemDelegate {this}; - stations_item_delegate->setItemEditorFactory (item_editor_factory ()); - ui_->stations_table_view->setItemDelegate (stations_item_delegate); ui_->stations_table_view->setItemDelegateForColumn (StationList::band_column, new ForeignKeyDelegate {&bands_, &next_stations_, 0, StationList::band_column, this}); // stations actions diff --git a/MetaDataRegistry.cpp b/MetaDataRegistry.cpp index 6ce9a7f92..32af71b4d 100644 --- a/MetaDataRegistry.cpp +++ b/MetaDataRegistry.cpp @@ -17,14 +17,33 @@ #include "widgets/FrequencyLineEdit.hpp" #include "widgets/DateTimeEdit.hpp" -QItemEditorFactory * item_editor_factory () +namespace { - static QItemEditorFactory * our_item_editor_factory = new QItemEditorFactory; - return our_item_editor_factory; + class ItemEditorFactory final + : public QItemEditorFactory + { + public: + ItemEditorFactory () + : default_factory_ {QItemEditorFactory::defaultFactory ()} + { + } + + QWidget * createEditor (int user_type, QWidget * parent) const override + { + auto editor = QItemEditorFactory::createEditor (user_type, parent); + return editor ? editor : default_factory_->createEditor (user_type, parent); + } + + private: + QItemEditorFactory const * default_factory_; + }; } void register_types () { + auto item_editor_factory = new ItemEditorFactory; + QItemEditorFactory::setDefaultFactory (item_editor_factory); + // types in Radio.hpp are registered in their own translation unit // as they are needed in the wsjtx_udp shared library too @@ -32,12 +51,10 @@ void register_types () // used as signal/slot connection arguments since the new Qt 5.5 // Q_ENUM macro only seems to register the unqualified name - item_editor_factory ()->registerEditor (qMetaTypeId (), new QStandardItemEditorCreator ()); + item_editor_factory->registerEditor (qMetaTypeId (), new QStandardItemEditorCreator ()); //auto frequency_delta_type_id = qRegisterMetaType ("FrequencyDelta"); - item_editor_factory ()->registerEditor (qMetaTypeId (), new QStandardItemEditorCreator ()); - auto factory = new QItemEditorFactory; - factory->registerEditor (qMetaTypeId (), new QStandardItemEditorCreator ()); - QItemEditorFactory::setDefaultFactory (factory); + item_editor_factory->registerEditor (qMetaTypeId (), new QStandardItemEditorCreator ()); + item_editor_factory->registerEditor (qMetaTypeId (), new QStandardItemEditorCreator ()); // Frequency list model qRegisterMetaTypeStreamOperators ("Item_v2"); diff --git a/MetaDataRegistry.hpp b/MetaDataRegistry.hpp index 43000d201..8bf3c80dc 100644 --- a/MetaDataRegistry.hpp +++ b/MetaDataRegistry.hpp @@ -1,9 +1,6 @@ #ifndef META_DATA_REGISTRY_HPP__ #define META_DATA_REGISTRY_HPP__ -class QItemEditorFactory; - -QItemEditorFactory * item_editor_factory (); void register_types (); #endif From 425b0e89a8ace7fa461bcb588b4d0209cb09fb88 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Thu, 30 May 2019 21:30:48 +0100 Subject: [PATCH 112/159] Move 40m FT4 frequency up 500 Hz to clear W1AW code practice QRG This is still provisional but by zero beating W1AW we should avoid most QRM to W1AW. --- models/FrequencyList.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/models/FrequencyList.cpp b/models/FrequencyList.cpp index b135a512a..c0170a499 100644 --- a/models/FrequencyList.cpp +++ b/models/FrequencyList.cpp @@ -127,7 +127,9 @@ namespace {7074000, Modes::FT8, IARURegions::ALL}, {7076000, Modes::JT65, IARURegions::ALL}, {7078000, Modes::JT9, IARURegions::ALL}, - {7047000, Modes::FT4, IARURegions::ALL}, // provisional + {7047500, Modes::FT4, IARURegions::ALL}, // provisional - moved + // up 500Hz to clear + // W1AW code practice QRG // Band plans (all USB dial unless stated otherwise) // From 19c46774b494f29360f179d8c66acb199da3801e Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Thu, 30 May 2019 22:20:09 +0100 Subject: [PATCH 113/159] Moving toward multiplier and dupe detection for contest modes There's not much to show for this so far but some of the necessary infrastructure is in place. --- CMakeLists.txt | 4 + Configuration.cpp | 5 + MetaDataRegistry.cpp | 4 - Radio.cpp | 8 +- Radio.hpp | 4 +- item_delegates/FrequencyDelegate.cpp | 27 ++++ item_delegates/FrequencyDelegate.hpp | 21 +++ item_delegates/FrequencyDeltaDelegate.cpp | 26 +++ item_delegates/FrequencyDeltaDelegate.hpp | 21 +++ item_delegates/item_delegates.pri | 6 +- logbook/Multiplier.cpp | 45 ++++++ logbook/Multiplier.hpp | 30 ++++ logbook/WorkedBefore.cpp | 4 +- logbook/WorkedBefore.hpp | 2 +- logbook/logbook.cpp | 35 ++++- logbook/logbook.h | 10 +- logbook/logbook.pri | 6 +- main.cpp | 2 + models/CabrilloLog.cpp | 183 ++++++++++++++++------ models/CabrilloLog.hpp | 17 +- qt_db_helpers.hpp | 1 + widgets/CabrilloLogWindow.cpp | 10 +- widgets/FrequencyDeltaLineEdit.cpp | 54 +++++++ widgets/FrequencyDeltaLineEdit.hpp | 29 ++++ widgets/FrequencyLineEdit.cpp | 18 --- widgets/FrequencyLineEdit.hpp | 18 +-- widgets/displaytext.cpp | 2 +- widgets/displaytext.h | 2 - widgets/logqso.cpp | 2 +- widgets/mainwindow.cpp | 2 +- widgets/widgets.pri | 3 +- 31 files changed, 473 insertions(+), 128 deletions(-) create mode 100644 item_delegates/FrequencyDelegate.cpp create mode 100644 item_delegates/FrequencyDelegate.hpp create mode 100644 item_delegates/FrequencyDeltaDelegate.cpp create mode 100644 item_delegates/FrequencyDeltaDelegate.hpp create mode 100644 logbook/Multiplier.cpp create mode 100644 logbook/Multiplier.hpp create mode 100644 widgets/FrequencyDeltaLineEdit.cpp create mode 100644 widgets/FrequencyDeltaLineEdit.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index d5d18467c..a2d6dd396 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -237,6 +237,7 @@ set (wsjt_qt_CXXSRCS models/FrequencyList.cpp models/StationList.cpp widgets/FrequencyLineEdit.cpp + widgets/FrequencyDeltaLineEdit.cpp item_delegates/CandidateKeyFilter.cpp item_delegates/ForeignKeyDelegate.cpp validators/LiveFrequencyValidator.cpp @@ -279,9 +280,12 @@ set (wsjt_qt_CXXSRCS widgets/CabrilloLogWindow.cpp item_delegates/CallsignDelegate.cpp item_delegates/MaidenheadLocatorDelegate.cpp + item_delegates/FrequencyDelegate.cpp + item_delegates/FrequencyDeltaDelegate.cpp models/CabrilloLog.cpp logbook/AD1CCty.cpp logbook/WorkedBefore.cpp + logbook/Multiplier.cpp ) set (wsjt_qtmm_CXXSRCS diff --git a/Configuration.cpp b/Configuration.cpp index 08ee2e9d3..b78739d11 100644 --- a/Configuration.cpp +++ b/Configuration.cpp @@ -167,8 +167,11 @@ #include "MetaDataRegistry.hpp" #include "SettingsGroup.hpp" #include "widgets/FrequencyLineEdit.hpp" +#include "widgets/FrequencyDeltaLineEdit.hpp" #include "item_delegates/CandidateKeyFilter.hpp" #include "item_delegates/ForeignKeyDelegate.hpp" +#include "item_delegates/FrequencyDelegate.hpp" +#include "item_delegates/FrequencyDeltaDelegate.hpp" #include "TransceiverFactory.hpp" #include "Transceiver.hpp" #include "models/Bands.hpp" @@ -1122,6 +1125,7 @@ Configuration::impl::impl (Configuration * self, QNetworkAccessManager * network ui_->frequencies_table_view->setColumnHidden (FrequencyList_v2::frequency_mhz_column, true); // delegates + ui_->frequencies_table_view->setItemDelegateForColumn (FrequencyList_v2::frequency_column, new FrequencyDelegate {this}); ui_->frequencies_table_view->setItemDelegateForColumn (FrequencyList_v2::region_column, new ForeignKeyDelegate {®ions_, 0, this}); ui_->frequencies_table_view->setItemDelegateForColumn (FrequencyList_v2::mode_column, new ForeignKeyDelegate {&modes_, 0, this}); @@ -1160,6 +1164,7 @@ Configuration::impl::impl (Configuration * self, QNetworkAccessManager * network ui_->stations_table_view->sortByColumn (StationList::band_column, Qt::AscendingOrder); // stations delegates + ui_->stations_table_view->setItemDelegateForColumn (StationList::offset_column, new FrequencyDeltaDelegate {this}); ui_->stations_table_view->setItemDelegateForColumn (StationList::band_column, new ForeignKeyDelegate {&bands_, &next_stations_, 0, StationList::band_column, this}); // stations actions diff --git a/MetaDataRegistry.cpp b/MetaDataRegistry.cpp index 32af71b4d..e66a43008 100644 --- a/MetaDataRegistry.cpp +++ b/MetaDataRegistry.cpp @@ -14,7 +14,6 @@ #include "WFPalette.hpp" #include "models/IARURegions.hpp" #include "models/DecodeHighlightingModel.hpp" -#include "widgets/FrequencyLineEdit.hpp" #include "widgets/DateTimeEdit.hpp" namespace @@ -51,9 +50,6 @@ void register_types () // used as signal/slot connection arguments since the new Qt 5.5 // Q_ENUM macro only seems to register the unqualified name - item_editor_factory->registerEditor (qMetaTypeId (), new QStandardItemEditorCreator ()); - //auto frequency_delta_type_id = qRegisterMetaType ("FrequencyDelta"); - item_editor_factory->registerEditor (qMetaTypeId (), new QStandardItemEditorCreator ()); item_editor_factory->registerEditor (qMetaTypeId (), new QStandardItemEditorCreator ()); // Frequency list model diff --git a/Radio.cpp b/Radio.cpp index 3940815f4..e5b34c35d 100644 --- a/Radio.cpp +++ b/Radio.cpp @@ -74,14 +74,14 @@ namespace Radio } - QString frequency_MHz_string (Frequency f, QLocale const& locale) + QString frequency_MHz_string (Frequency f, int precision, QLocale const& locale) { - return locale.toString (f / MHz_factor, 'f', frequency_precsion); + return locale.toString (f / MHz_factor, 'f', precision); } - QString frequency_MHz_string (FrequencyDelta d, QLocale const& locale) + QString frequency_MHz_string (FrequencyDelta d, int precision, QLocale const& locale) { - return locale.toString (d / MHz_factor, 'f', frequency_precsion); + return locale.toString (d / MHz_factor, 'f', precision); } QString pretty_frequency_MHz_string (Frequency f, QLocale const& locale) diff --git a/Radio.hpp b/Radio.hpp index 7f8b0a0f4..e63abf4b8 100644 --- a/Radio.hpp +++ b/Radio.hpp @@ -42,8 +42,8 @@ namespace Radio // // Frequency type formatting // - QString UDP_EXPORT frequency_MHz_string (Frequency, QLocale const& = QLocale ()); - QString UDP_EXPORT frequency_MHz_string (FrequencyDelta, QLocale const& = QLocale ()); + QString UDP_EXPORT frequency_MHz_string (Frequency, int precision = 6, QLocale const& = QLocale ()); + QString UDP_EXPORT frequency_MHz_string (FrequencyDelta, int precision = 6, QLocale const& = QLocale ()); QString UDP_EXPORT pretty_frequency_MHz_string (Frequency, QLocale const& = QLocale ()); QString UDP_EXPORT pretty_frequency_MHz_string (double, int scale, QLocale const& = QLocale ()); QString UDP_EXPORT pretty_frequency_MHz_string (FrequencyDelta, QLocale const& = QLocale ()); diff --git a/item_delegates/FrequencyDelegate.cpp b/item_delegates/FrequencyDelegate.cpp new file mode 100644 index 000000000..b899c0563 --- /dev/null +++ b/item_delegates/FrequencyDelegate.cpp @@ -0,0 +1,27 @@ +#include "FrequencyDelegate.hpp" + +#include "widgets/FrequencyLineEdit.hpp" + +FrequencyDelegate::FrequencyDelegate (QObject * parent) + : QStyledItemDelegate {parent} +{ +} + +QWidget * FrequencyDelegate::createEditor (QWidget * parent, QStyleOptionViewItem const& + , QModelIndex const&) const +{ + auto * editor = new FrequencyLineEdit {parent}; + editor->setFrame (false); + return editor; +} + +void FrequencyDelegate::setEditorData (QWidget * editor, QModelIndex const& index) const +{ + static_cast (editor)->frequency (index.model ()->data (index, Qt::EditRole).value ()); +} + +void FrequencyDelegate::setModelData (QWidget * editor, QAbstractItemModel * model, QModelIndex const& index) const +{ + model->setData (index, static_cast (editor)->frequency (), Qt::EditRole); +} + diff --git a/item_delegates/FrequencyDelegate.hpp b/item_delegates/FrequencyDelegate.hpp new file mode 100644 index 000000000..76fc5545d --- /dev/null +++ b/item_delegates/FrequencyDelegate.hpp @@ -0,0 +1,21 @@ +#ifndef FREQUENCY_DELEGATE_HPP_ +#define FREQUENCY_DELEGATE_HPP_ + +#include + +// +// Class FrequencyDelegate +// +// Item delegate for editing a frequency in Hertz but displayed in MHz +// +class FrequencyDelegate final + : public QStyledItemDelegate +{ +public: + explicit FrequencyDelegate (QObject * parent = nullptr); + QWidget * createEditor (QWidget * parent, QStyleOptionViewItem const&, QModelIndex const&) const override; + void setEditorData (QWidget * editor, QModelIndex const&) const override; + void setModelData (QWidget * editor, QAbstractItemModel *, QModelIndex const&) const override; +}; + +#endif diff --git a/item_delegates/FrequencyDeltaDelegate.cpp b/item_delegates/FrequencyDeltaDelegate.cpp new file mode 100644 index 000000000..40d90dc58 --- /dev/null +++ b/item_delegates/FrequencyDeltaDelegate.cpp @@ -0,0 +1,26 @@ +#include "FrequencyDeltaDelegate.hpp" + +#include "widgets/FrequencyDeltaLineEdit.hpp" + +FrequencyDeltaDelegate::FrequencyDeltaDelegate (QObject * parent) + : QStyledItemDelegate {parent} +{ +} + +QWidget * FrequencyDeltaDelegate::createEditor (QWidget * parent, QStyleOptionViewItem const& + , QModelIndex const&) const +{ + auto * editor = new FrequencyDeltaLineEdit {parent}; + editor->setFrame (false); + return editor; +} + +void FrequencyDeltaDelegate::setEditorData (QWidget * editor, QModelIndex const& index) const +{ + static_cast (editor)->frequency_delta (index.model ()->data (index, Qt::EditRole).value ()); +} + +void FrequencyDeltaDelegate::setModelData (QWidget * editor, QAbstractItemModel * model, QModelIndex const& index) const +{ + model->setData (index, static_cast (editor)->frequency_delta (), Qt::EditRole); +} diff --git a/item_delegates/FrequencyDeltaDelegate.hpp b/item_delegates/FrequencyDeltaDelegate.hpp new file mode 100644 index 000000000..121bc3d94 --- /dev/null +++ b/item_delegates/FrequencyDeltaDelegate.hpp @@ -0,0 +1,21 @@ +#ifndef FREQUENCY_DELTA_DELEGATE_HPP_ +#define FREQUENCY_DELTA_DELEGATE_HPP_ + +#include + +// +// Class FrequencyDeltaDelegate +// +// Item delegate for editing a frequency delta in Hertz but displayed in MHz +// +class FrequencyDeltaDelegate final + : public QStyledItemDelegate +{ +public: + explicit FrequencyDeltaDelegate (QObject * parent = nullptr); + QWidget * createEditor (QWidget * parent, QStyleOptionViewItem const&, QModelIndex const&) const override; + void setEditorData (QWidget * editor, QModelIndex const&) const override; + void setModelData (QWidget * editor, QAbstractItemModel *, QModelIndex const&) const override; +}; + +#endif diff --git a/item_delegates/item_delegates.pri b/item_delegates/item_delegates.pri index 026e1ca57..819cb2e0c 100644 --- a/item_delegates/item_delegates.pri +++ b/item_delegates/item_delegates.pri @@ -1,11 +1,13 @@ SOURCES += \ item_delegates/ForeignKeyDelegate.cpp \ - item_delegates/FrequencyItemDelegate.cpp \ + item_delegates/FrequencyDelegate.cpp \ + item_delegates/FrequencyDeltaDelegate.cpp \ item_delegates/CallsignDelegate.cpp \ item_delegates/MaidenheadLocatorItemDelegate.cpp HEADERS += \ item_delegates/ForeignKeyDelegate.hpp \ - item_delegates/FrequencyItemDelegate.hpp \ + item_delegates/FrequencyDelegate.hpp \ + item_delegates/FrequencyDeltaDelegate.hpp \ item_delegates/CallsignDelegate.hpp \ item_delegates/MaidenheadLocatorDelegate.hpp diff --git a/logbook/Multiplier.cpp b/logbook/Multiplier.cpp new file mode 100644 index 000000000..64f6cc6f3 --- /dev/null +++ b/logbook/Multiplier.cpp @@ -0,0 +1,45 @@ +#include "Multiplier.hpp" + +#include +#include +#include +#include "models/CabrilloLog.hpp" +#include "pimpl_impl.hpp" + +class Multiplier::impl +{ +public: + impl (AD1CCty const * countries) + : countries_ {countries} + { + } + + AD1CCty const * countries_; + worked_set entities_worked_; + worked_set grids_worked_; +}; + +Multiplier::Multiplier (AD1CCty const * countries) + : m_ {countries} +{ +} + +Multiplier::~Multiplier () +{ +} + +void Multiplier::reload (CabrilloLog const * log) +{ + m_->entities_worked_ = log->unique_DXCC_entities (m_->countries_); + qDebug () << "Entities worked:" << m_->entities_worked_; +} + +auto Multiplier::entities_worked () const -> worked_set const& +{ + return m_->entities_worked_; +} + +auto Multiplier::grids_worked () const -> worked_set const& +{ + return m_->grids_worked_; +} diff --git a/logbook/Multiplier.hpp b/logbook/Multiplier.hpp new file mode 100644 index 000000000..2271dd775 --- /dev/null +++ b/logbook/Multiplier.hpp @@ -0,0 +1,30 @@ +#ifndef MULTIPLIER_HPP_ +#define MULTIPLIER_HPP_ + +#include +#include +#include "pimpl_h.hpp" + +class QString; +class AD1CCty; +class CabrilloLog; + +class Multiplier final + : private boost::noncopyable +{ +public: + using worked_item = QPair; + using worked_set = QSet; + + explicit Multiplier (AD1CCty const *); + ~Multiplier (); + void reload (CabrilloLog const *); + worked_set const& entities_worked () const; + worked_set const& grids_worked () const; + +private: + class impl; + pimpl m_; +}; + +#endif diff --git a/logbook/WorkedBefore.cpp b/logbook/WorkedBefore.cpp index 5edc51d3e..aa65ab651 100644 --- a/logbook/WorkedBefore.cpp +++ b/logbook/WorkedBefore.cpp @@ -415,9 +415,9 @@ QString const& WorkedBefore::path () const return m_->path_; } -AD1CCty const& WorkedBefore::countries () const +AD1CCty const * WorkedBefore::countries () const { - return m_->prefixes_; + return &m_->prefixes_; } bool WorkedBefore::add (QString const& call diff --git a/logbook/WorkedBefore.hpp b/logbook/WorkedBefore.hpp index 8b115351f..1aae1aca4 100644 --- a/logbook/WorkedBefore.hpp +++ b/logbook/WorkedBefore.hpp @@ -29,7 +29,7 @@ public: , QByteArray const& ADIF_record); QString const& path () const; - AD1CCty const& countries () const; + AD1CCty const * countries () const; bool country_worked (QString const& call, QString const& mode, QString const& band) const; bool grid_worked (QString const& grid, QString const& mode, QString const& band) const; bool call_worked (QString const& call, QString const& mode, QString const& band) const; diff --git a/logbook/logbook.cpp b/logbook/logbook.cpp index bde52228c..a154664d5 100644 --- a/logbook/logbook.cpp +++ b/logbook/logbook.cpp @@ -3,6 +3,8 @@ #include #include "Configuration.hpp" #include "AD1CCty.hpp" +#include "Multiplier.hpp" +#include "logbook/AD1CCty.hpp" #include "models/CabrilloLog.hpp" #include "models/FoxLog.hpp" @@ -16,6 +18,10 @@ LogBook::LogBook (Configuration const * configuration) connect (&worked_before_, &WorkedBefore::finished_loading, this, &LogBook::finished_loading); } +LogBook::~LogBook () +{ +} + void LogBook::match (QString const& call, QString const& mode, QString const& grid, AD1CCty::Record const& looked_up, bool& callB4, @@ -144,19 +150,36 @@ QByteArray LogBook::QSOToADIF (QString const& hisCall, QString const& hisGrid, Q CabrilloLog * LogBook::contest_log () { // lazy create of Cabrillo log object instance - if (!m_contest_log) + if (!contest_log_) { - m_contest_log.reset (new CabrilloLog {config_}); + contest_log_.reset (new CabrilloLog {config_}); + if (!multiplier_) + { + multiplier_.reset (new Multiplier {countries ()}); + } + connect (contest_log_.data (), &CabrilloLog::data_changed, [this] () { + multiplier_->reload (contest_log_.data ()); + }); } - return m_contest_log.data (); + return contest_log_.data (); +} + +Multiplier const * LogBook::multiplier () const +{ + // lazy create of Multiplier object instance + if (!multiplier_) + { + multiplier_.reset (new Multiplier {countries ()}); + } + return multiplier_.data (); } FoxLog * LogBook::fox_log () { // lazy create of Fox log object instance - if (!m_fox_log) + if (!fox_log_) { - m_fox_log.reset (new FoxLog {config_}); + fox_log_.reset (new FoxLog {config_}); } - return m_fox_log.data (); + return fox_log_.data (); } diff --git a/logbook/logbook.h b/logbook/logbook.h index 2fd73bd3b..c87009e48 100644 --- a/logbook/logbook.h +++ b/logbook/logbook.h @@ -16,6 +16,7 @@ class Configuration; class QByteArray; class QDateTime; class CabrilloLog; +class Multiplier; class FoxLog; class LogBook final @@ -25,13 +26,14 @@ class LogBook final public: LogBook (Configuration const *); + ~LogBook (); QString const& path () const {return worked_before_.path ();} bool add (QString const& call , QString const& grid , QString const& band , QString const& mode , QByteArray const& ADIF_record); - AD1CCty const& countries () const {return worked_before_.countries ();} + AD1CCty const * countries () const {return worked_before_.countries ();} void rescan (); void match (QString const& call, QString const& mode, QString const& grid, AD1CCty::Record const&, bool& callB4, bool& countryB4, @@ -47,13 +49,15 @@ public: Q_SIGNAL void finished_loading (int worked_before_record_count, QString const& error) const; CabrilloLog * contest_log (); + Multiplier const * multiplier () const; FoxLog * fox_log (); private: Configuration const * config_; WorkedBefore worked_before_; - QScopedPointer m_contest_log; - QScopedPointer m_fox_log; + QScopedPointer contest_log_; + QScopedPointer mutable multiplier_; + QScopedPointer fox_log_; }; #endif diff --git a/logbook/logbook.pri b/logbook/logbook.pri index fcac62524..e67cdebd3 100644 --- a/logbook/logbook.pri +++ b/logbook/logbook.pri @@ -2,10 +2,12 @@ SOURCES += \ logbook/countriesworked.cpp \ logbook/logbook.cpp \ logbook/AD1CCty.cpp \ - logbook/WorkedBefore.cpp + logbook/WorkedBefore.cpp \ + logbook/Multiplier.cpp HEADERS += \ logbook/WorkedBefore.hpp \ logbook/logbook.h \ logbook/countriesworked.h \ - logbook/AD1CCty.hpp + logbook/AD1CCty.hpp \ + logbook/Multiplier.hpp diff --git a/main.cpp b/main.cpp index 1ea0c6a49..9070ce33f 100644 --- a/main.cpp +++ b/main.cpp @@ -380,10 +380,12 @@ int main(int argc, char *argv[]) } catch (std::exception const& e) { + MessageBox::critical_message (nullptr, QApplication::translate ("main", "Fatal error"), e.what ()); std::cerr << "Error: " << e.what () << '\n'; } catch (...) { + MessageBox::critical_message (nullptr, QApplication::translate ("main", "Unexpected fatal error")); std::cerr << "Unexpected fatal error\n"; throw; // hoping the runtime might tell us more about the exception } diff --git a/models/CabrilloLog.cpp b/models/CabrilloLog.cpp index 6a637f07d..5c3b0ef5b 100644 --- a/models/CabrilloLog.cpp +++ b/models/CabrilloLog.cpp @@ -20,59 +20,122 @@ class CabrilloLog::impl final : public QSqlTableModel { public: - impl (Configuration const *); + impl (CabrilloLog *, Configuration const *); - QVariant data (QModelIndex const& index, int role) const + int columnCount (QModelIndex const& /*index */) const override { - auto value = QSqlTableModel::data (index, role); - if (index.column () == fieldIndex ("when") - && (Qt::DisplayRole == role || Qt::EditRole == role)) + return QSqlTableModel::columnCount () + 1; + } + + Qt::ItemFlags flags (QModelIndex const& index) const override + { + auto flags = QSqlTableModel::flags (index); + if (index.isValid () && index.column () == columnCount (index) - 1) { - auto t = QDateTime::fromMSecsSinceEpoch (value.toULongLong () * 1000ull, Qt::UTC); + flags = Qt::ItemIsEnabled; + } + return flags; + } + + QVariant data (QModelIndex const& model_index, int role) const override + { + QVariant value; + if (model_index.isValid () && model_index.column () == columnCount (model_index) - 1) + { // derive band column if (Qt::DisplayRole == role) { - QLocale locale; - return locale.toString (t, locale.dateFormat (QLocale::ShortFormat) + " hh:mm:ss"); + value = configuration_->bands ()->find (QSqlTableModel::data (index (model_index.row (), fieldIndex ("frequency"))).toULongLong ()); + } + } + else + { + value = QSqlTableModel::data (model_index, role); + if (model_index.column () == fieldIndex ("frequency") && Qt::DisplayRole == role) + { + value = Radio::frequency_MHz_string (value.value (), 3); // kHz precision + } + else if (model_index.column () == fieldIndex ("when") + && (Qt::DisplayRole == role || Qt::EditRole == role)) + { // adjust date/time to Qt format + auto t = QDateTime::fromMSecsSinceEpoch (value.toULongLong () * 1000ull, Qt::UTC); + if (Qt::DisplayRole == role) + { + QLocale locale; + return locale.toString (t, locale.dateFormat (QLocale::ShortFormat) + " hh:mm:ss"); + } + value = t; } - value = t; } return value; } QString cabrillo_frequency_string (Radio::Frequency frequency) const; + void create_table (); + CabrilloLog * self_; Configuration const * configuration_; QSqlQuery mutable dupe_query_; QSqlQuery mutable export_query_; + bool adding_row_; }; -CabrilloLog::impl::impl (Configuration const * configuration) - : QSqlTableModel {} +CabrilloLog::impl::impl (CabrilloLog * self, Configuration const * configuration) + : self_ {self} , configuration_ {configuration} + , adding_row_ {false} { if (!database ().tables ().contains ("cabrillo_log")) + { + create_table (); + } + + setEditStrategy (QSqlTableModel::OnFieldChange); + setTable ("cabrillo_log"); + if (-1 != fieldIndex ("band")) // schema out of date { QSqlQuery query; SQL_error_check (query, static_cast (&QSqlQuery::exec), - "CREATE TABLE cabrillo_log (" - " id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL," - " frequency INTEGER NOT NULL," - " \"when\" DATETIME NOT NULL," - " call VARCHAR(20) NOT NULL," - " exchange_sent VARCHAR(32) NOT NULL," - " exchange_rcvd VARCHAR(32) NOT NULL," - " band VARCHAR(6) NOT NULL" - ")"); + "DROP TABLE IF EXISTS cabrillo_log_backup"); + SQL_error_check (query, static_cast (&QSqlQuery::exec), + "CREATE TABLE cabrillo_log_backup AS SELECT * FROM cabrillo_log"); + SQL_error_check (query, static_cast (&QSqlQuery::exec), + "DROP TABLE cabrillo_log"); + create_table (); + setTable ("cabrillo_log"); } + setHeaderData (fieldIndex ("frequency"), Qt::Horizontal, tr ("Freq(MHz)")); + setHeaderData (fieldIndex ("mode"), Qt::Horizontal, tr ("Mode")); + setHeaderData (fieldIndex ("when"), Qt::Horizontal, tr ("Date & Time(UTC)")); + setHeaderData (fieldIndex ("call"), Qt::Horizontal, tr ("Call")); + setHeaderData (fieldIndex ("exchange_sent"), Qt::Horizontal, tr ("Sent")); + setHeaderData (fieldIndex ("exchange_rcvd"), Qt::Horizontal, tr ("Rcvd")); + setHeaderData (columnCount (QModelIndex {}) - 1, Qt::Horizontal, tr ("Band")); + + // This descending order by time is important, it makes the view + // place the latest row at the top, without this the model/view + // interactions are both sluggish and unhelpful. + setSort (fieldIndex ("when"), Qt::DescendingOrder); + + connect (this, &CabrilloLog::impl::modelReset, self_, &CabrilloLog::data_changed); + connect (this, &CabrilloLog::impl::dataChanged, [this] (QModelIndex const& tl, QModelIndex const& br) { + if (!adding_row_ && !(tl == br)) // ignore single cell changes + // as a another change for the + // whole row will follow + { + Q_EMIT self_->data_changed (); + } + }); + + SQL_error_check (*this, &QSqlTableModel::select); + SQL_error_check (dupe_query_, &QSqlQuery::prepare, "SELECT " - " COUNT(*) " + " frequency " " FROM " " cabrillo_log " " WHERE " - " call = :call " - " AND band = :band"); + " call = :call "); SQL_error_check (export_query_, &QSqlQuery::prepare, "SELECT " @@ -85,29 +148,28 @@ CabrilloLog::impl::impl (Configuration const * configuration) " cabrillo_log " " ORDER BY " " \"when\""); - - setEditStrategy (QSqlTableModel::OnFieldChange); - setTable ("cabrillo_log"); - setHeaderData (fieldIndex ("frequency"), Qt::Horizontal, tr ("Freq(kHz)")); - setHeaderData (fieldIndex ("when"), Qt::Horizontal, tr ("Date & Time(UTC)")); - setHeaderData (fieldIndex ("call"), Qt::Horizontal, tr ("Call")); - setHeaderData (fieldIndex ("exchange_sent"), Qt::Horizontal, tr ("Sent")); - setHeaderData (fieldIndex ("exchange_rcvd"), Qt::Horizontal, tr ("Rcvd")); - setHeaderData (fieldIndex ("band"), Qt::Horizontal, tr ("Band")); +} - // This descending order by time is important, it makes the view - // place the latest row at the top, without this the model/view - // interactions are both sluggish and unhelpful. - setSort (fieldIndex ("when"), Qt::DescendingOrder); - - SQL_error_check (*this, &QSqlTableModel::select); +void CabrilloLog::impl::create_table () +{ + QSqlQuery query; + SQL_error_check (query, static_cast (&QSqlQuery::exec), + "CREATE TABLE cabrillo_log (" + " id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL," + " frequency INTEGER NOT NULL," + " mode VARCHAR(6) NOT NULL," + " \"when\" DATETIME NOT NULL," + " call VARCHAR(20) NOT NULL," + " exchange_sent VARCHAR(32) NOT NULL," + " exchange_rcvd VARCHAR(32) NOT NULL" + ")"); } // frequency here is in kHz QString CabrilloLog::impl::cabrillo_frequency_string (Radio::Frequency frequency) const { QString result; - auto band = configuration_->bands ()->find (frequency * 1000ull); + auto band = configuration_->bands ()->find (frequency); if ("1mm" == band) result = "LIGHT"; else if ("2mm" == band) result = "241G"; else if ("2.5mm" == band) result = "134G"; @@ -125,12 +187,15 @@ QString CabrilloLog::impl::cabrillo_frequency_string (Radio::Frequency frequency else if ("2m" == band) result = "144"; else if ("4m" == band) result = "70"; else if ("6m" == band) result = "50"; - else result = QString::number (frequency); + else result = QString::number (frequency / 1000ull); return result; } -CabrilloLog::CabrilloLog (Configuration const * configuration) - : m_ {configuration} +#include "moc_CabrilloLog.cpp" + +CabrilloLog::CabrilloLog (Configuration const * configuration, QObject * parent) + : QObject {parent} + , m_ {this, configuration} { Q_ASSERT (configuration); } @@ -159,11 +224,12 @@ namespace } } -bool CabrilloLog::add_QSO (Frequency frequency, QDateTime const& when, QString const& call +bool CabrilloLog::add_QSO (Frequency frequency, QString const& mode, QDateTime const& when, QString const& call , QString const& exchange_sent, QString const& exchange_received) { auto record = m_->record (); - record.setValue ("frequency", frequency / 1000ull); // kHz + record.setValue ("frequency", frequency); + record.setValue ("mode", mode); if (!when.isNull ()) { record.setValue ("when", when.toMSecsSinceEpoch () / 1000ull); @@ -175,15 +241,16 @@ bool CabrilloLog::add_QSO (Frequency frequency, QDateTime const& when, QString c set_value_maybe_null (record, "call", call); set_value_maybe_null (record, "exchange_sent", exchange_sent); set_value_maybe_null (record, "exchange_rcvd", exchange_received); - set_value_maybe_null (record, "band", m_->configuration_->bands ()->find (frequency)); if (m_->isDirty ()) { m_->revert (); // discard any uncommitted changes } m_->setEditStrategy (QSqlTableModel::OnManualSubmit); ConditionalTransaction transaction {*m_}; + m_->adding_row_ = true; auto ok = m_->insertRecord (-1, record); transaction.submit (); + m_->adding_row_ = false; m_->setEditStrategy (QSqlTableModel::OnFieldChange); return ok; } @@ -191,10 +258,18 @@ bool CabrilloLog::add_QSO (Frequency frequency, QDateTime const& when, QString c bool CabrilloLog::dupe (Frequency frequency, QString const& call) const { m_->dupe_query_.bindValue (":call", call); - m_->dupe_query_.bindValue (":band", m_->configuration_->bands ()->find (frequency)); SQL_error_check (m_->dupe_query_, static_cast (&QSqlQuery::exec)); - m_->dupe_query_.next (); - return m_->dupe_query_.value (0).toInt (); + auto record = m_->dupe_query_.record (); + auto frequency_index = record.indexOf ("frequency"); + while (m_->dupe_query_.next ()) + { + if (m_->configuration_->bands ()->find (m_->dupe_query_.value (frequency_index).toULongLong ()) + == m_->configuration_->bands ()->find (frequency)) + { + return true; + } + } + return false; } void CabrilloLog::reset () @@ -209,6 +284,7 @@ void CabrilloLog::reset () transaction.submit (); m_->select (); // to refresh views m_->setEditStrategy (QSqlTableModel::OnFieldChange); + Q_EMIT data_changed (); } } @@ -217,6 +293,7 @@ void CabrilloLog::export_qsos (QTextStream& stream) const SQL_error_check (m_->export_query_, static_cast (&QSqlQuery::exec)); auto record = m_->export_query_.record (); auto frequency_index = record.indexOf ("frequency"); + // auto mode_index = record.indexOf ("mode"); auto when_index = record.indexOf ("when"); auto call_index = record.indexOf ("call"); auto sent_index = record.indexOf ("exchange_sent"); @@ -234,14 +311,16 @@ void CabrilloLog::export_qsos (QTextStream& stream) const } } -QSet CabrilloLog::unique_DXCC_entities (AD1CCty const& countries) const +auto CabrilloLog::unique_DXCC_entities (AD1CCty const * countries) const -> worked_set { - QSqlQuery q {"SELECT UNIQUE CALL FROM cabrillo_log"}; + QSqlQuery q {"SELECT DISTINCT BAND, CALL FROM cabrillo_log"}; + auto band_index = q.record ().indexOf ("band"); auto call_index = q.record ().indexOf ("call"); - QSet entities; + worked_set entities; while (q.next ()) { - entities << countries.lookup (q.value(call_index).toString ()).primary_prefix; + entities << worked_item {q.value (band_index).toString () + , countries->lookup (q.value (call_index).toString ()).primary_prefix}; } return entities; } diff --git a/models/CabrilloLog.hpp b/models/CabrilloLog.hpp index ad0255297..97d8f0d88 100644 --- a/models/CabrilloLog.hpp +++ b/models/CabrilloLog.hpp @@ -1,8 +1,9 @@ #ifndef CABRILLO_LOG_HPP_ #define CABRILLO_LOG_HPP_ -#include +#include #include +#include #include #include "Radio.hpp" #include "pimpl_h.hpp" @@ -14,23 +15,29 @@ class QTextStream; class AD1CCty; class CabrilloLog final - : private boost::noncopyable + : public QObject { + Q_OBJECT + public: using Frequency = Radio::Frequency; + using worked_item = QPair; + using worked_set = QSet; - explicit CabrilloLog (Configuration const *); + explicit CabrilloLog (Configuration const *, QObject * parent = nullptr); ~CabrilloLog (); // returns false if insert fails - bool add_QSO (Frequency, QDateTime const&, QString const& call + bool add_QSO (Frequency, QString const& mode, QDateTime const&, QString const& call , QString const& report_sent, QString const& report_received); bool dupe (Frequency, QString const& call) const; QSqlTableModel * model (); void reset (); void export_qsos (QTextStream&) const; - QSet unique_DXCC_entities (AD1CCty const&) const; + worked_set unique_DXCC_entities (AD1CCty const *) const; + + Q_SIGNAL void data_changed () const; private: class impl; diff --git a/qt_db_helpers.hpp b/qt_db_helpers.hpp index 49a082f72..dcf9d0333 100644 --- a/qt_db_helpers.hpp +++ b/qt_db_helpers.hpp @@ -6,6 +6,7 @@ #include #include #include +#include "boost/core/noncopyable.hpp" template void SQL_error_check (T&& object, Func func, Args&&... args) diff --git a/widgets/CabrilloLogWindow.cpp b/widgets/CabrilloLogWindow.cpp index 2f7b44d4a..6fd753136 100644 --- a/widgets/CabrilloLogWindow.cpp +++ b/widgets/CabrilloLogWindow.cpp @@ -1,10 +1,12 @@ #include "CabrilloLogWindow.hpp" +#include #include #include #include #include "Configuration.hpp" #include "models/Bands.hpp" +#include "item_delegates/FrequencyDelegate.hpp" #include "item_delegates/ForeignKeyDelegate.hpp" #include "item_delegates/CallsignDelegate.hpp" #include "pimpl_impl.hpp" @@ -29,7 +31,7 @@ namespace switch (index.column ()) { case 1: - case 6: + case 7: return Qt::AlignRight + Qt::AlignVCenter; default: break; @@ -63,10 +65,10 @@ CabrilloLogWindow::CabrilloLogWindow (QSettings * settings, Configuration const m_->format_model_.setSourceModel (m_->log_model_); m_->ui_.log_table_view->setModel (&m_->format_model_); set_log_view (m_->ui_.log_table_view); - m_->ui_.log_table_view->setItemDelegateForColumn (3, new CallsignDelegate {this}); - m_->ui_.log_table_view->setItemDelegateForColumn (6, new ForeignKeyDelegate {configuration->bands (), 0, this}); + m_->ui_.log_table_view->setItemDelegateForColumn (1, new FrequencyDelegate {this}); + m_->ui_.log_table_view->setItemDelegateForColumn (4, new CallsignDelegate {this}); auto h_header = m_->ui_.log_table_view->horizontalHeader (); - h_header->moveSection (6, 1); // band to first column + h_header->moveSection (7, 1); // band to first column } CabrilloLogWindow::~CabrilloLogWindow () diff --git a/widgets/FrequencyDeltaLineEdit.cpp b/widgets/FrequencyDeltaLineEdit.cpp new file mode 100644 index 000000000..b7ed144b6 --- /dev/null +++ b/widgets/FrequencyDeltaLineEdit.cpp @@ -0,0 +1,54 @@ +#include "FrequencyDeltaLineEdit.hpp" + +#include + +#include +#include +#include + +#include "moc_FrequencyDeltaLineEdit.cpp" + +namespace +{ + class MHzValidator + : public QDoubleValidator + { + public: + MHzValidator (double bottom, double top, QObject * parent = nullptr) + : QDoubleValidator {bottom, top, 6, parent} + { + } + + State validate (QString& input, int& pos) const override + { + State result = QDoubleValidator::validate (input, pos); + if (Acceptable == result) + { + bool ok; + (void)QLocale {}.toDouble (input, &ok); + if (!ok) + { + result = Intermediate; + } + } + return result; + } + }; +} + +FrequencyDeltaLineEdit::FrequencyDeltaLineEdit (QWidget * parent) + : QLineEdit (parent) +{ + setValidator (new MHzValidator {-std::numeric_limits::max () / 10.e6, + std::numeric_limits::max () / 10.e6, this}); +} + +auto FrequencyDeltaLineEdit::frequency_delta () const -> FrequencyDelta +{ + return Radio::frequency_delta (text (), 6); +} + +void FrequencyDeltaLineEdit::frequency_delta (FrequencyDelta d) +{ + setText (Radio::frequency_MHz_string (d)); +} diff --git a/widgets/FrequencyDeltaLineEdit.hpp b/widgets/FrequencyDeltaLineEdit.hpp new file mode 100644 index 000000000..caa00ecba --- /dev/null +++ b/widgets/FrequencyDeltaLineEdit.hpp @@ -0,0 +1,29 @@ +#ifndef FREQUENCY_DELTA_LINE_EDIT_HPP_ +#define FREQUENCY_DELTA_LINE_EDIT_HPP_ + +#include + +#include "Radio.hpp" + +class QWidget; + +// +// MHz frequency delta line edit with validation +// +class FrequencyDeltaLineEdit final + : public QLineEdit +{ + Q_OBJECT; + Q_PROPERTY (FrequencyDelta frequency_delta READ frequency_delta WRITE frequency_delta USER true); + +public: + using FrequencyDelta = Radio::FrequencyDelta; + + explicit FrequencyDeltaLineEdit (QWidget * parent = nullptr); + + // Property frequency_delta implementation + FrequencyDelta frequency_delta () const; + void frequency_delta (FrequencyDelta); +}; + +#endif diff --git a/widgets/FrequencyLineEdit.cpp b/widgets/FrequencyLineEdit.cpp index 78f8b2e1f..1ca2ba20b 100644 --- a/widgets/FrequencyLineEdit.cpp +++ b/widgets/FrequencyLineEdit.cpp @@ -51,21 +51,3 @@ void FrequencyLineEdit::frequency (Frequency f) { setText (Radio::frequency_MHz_string (f)); } - - -FrequencyDeltaLineEdit::FrequencyDeltaLineEdit (QWidget * parent) - : QLineEdit (parent) -{ - setValidator (new MHzValidator {-std::numeric_limits::max () / 10.e6, - std::numeric_limits::max () / 10.e6, this}); -} - -auto FrequencyDeltaLineEdit::frequency_delta () const -> FrequencyDelta -{ - return Radio::frequency_delta (text (), 6); -} - -void FrequencyDeltaLineEdit::frequency_delta (FrequencyDelta d) -{ - setText (Radio::frequency_MHz_string (d)); -} diff --git a/widgets/FrequencyLineEdit.hpp b/widgets/FrequencyLineEdit.hpp index dec0feb00..7e535f5a9 100644 --- a/widgets/FrequencyLineEdit.hpp +++ b/widgets/FrequencyLineEdit.hpp @@ -8,7 +8,7 @@ class QWidget; // -// MHz frequency line edits with validation +// MHz frequency line edit with validation // class FrequencyLineEdit final : public QLineEdit @@ -26,20 +26,4 @@ public: void frequency (Frequency); }; -class FrequencyDeltaLineEdit final - : public QLineEdit -{ - Q_OBJECT; - Q_PROPERTY (FrequencyDelta frequency_delta READ frequency_delta WRITE frequency_delta USER true); - -public: - using FrequencyDelta = Radio::FrequencyDelta; - - explicit FrequencyDeltaLineEdit (QWidget * parent = nullptr); - - // Property frequency_delta implementation - FrequencyDelta frequency_delta () const; - void frequency_delta (FrequencyDelta); -}; - #endif diff --git a/widgets/displaytext.cpp b/widgets/displaytext.cpp index c0bcd4129..53d7cd5cd 100644 --- a/widgets/displaytext.cpp +++ b/widgets/displaytext.cpp @@ -271,7 +271,7 @@ QString DisplayText::appendWorkedB4 (QString message, QString call, QString cons if(call.length()<3) return message; if(!call.contains(QRegExp("[0-9]|[A-Z]"))) return message; - auto const& looked_up = logBook.countries ().lookup (call); + auto const& looked_up = logBook.countries ()->lookup (call); logBook.match (call, currentMode, grid, looked_up, callB4, countryB4, gridB4, continentB4, CQZoneB4, ITUZoneB4); logBook.match (call, currentMode, grid, looked_up, callB4onBand, countryB4onBand, gridB4onBand, continentB4onBand, CQZoneB4onBand, ITUZoneB4onBand, currentBand); diff --git a/widgets/displaytext.h b/widgets/displaytext.h index 7f308bef8..8b580b8a2 100644 --- a/widgets/displaytext.h +++ b/widgets/displaytext.h @@ -65,6 +65,4 @@ private: int modified_vertical_scrollbar_max_; }; - extern QHash m_LoTW; - #endif // DISPLAYTEXT_H diff --git a/widgets/logqso.cpp b/widgets/logqso.cpp index a9aa18341..2eaedf116 100644 --- a/widgets/logqso.cpp +++ b/widgets/logqso.cpp @@ -157,7 +157,7 @@ void LogQSO::accept() return; // without accepting } - if (!m_log->contest_log ()->add_QSO (m_dialFreq, dateTimeOff, hisCall, xsent, xrcvd)) + if (!m_log->contest_log ()->add_QSO (m_dialFreq, mode, dateTimeOff, hisCall, xsent, xrcvd)) { show (); MessageBox::warning_message (this, tr ("Invalid QSO Data"), diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index ef1ca5705..277dbfdd7 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -8267,7 +8267,7 @@ void MainWindow::houndCallers() if(!ui->textBrowser4->toPlainText().contains(paddedHoundCall)) { if(m_loggedByFox[houndCall].contains(m_lastBand)) continue; //already logged on this band if(m_foxQSO.contains(houndCall)) continue; //still in the QSO map - auto const& entity = m_logBook.countries ().lookup (houndCall); + auto const& entity = m_logBook.countries ()->lookup (houndCall); auto const& continent = AD1CCty::continent (entity.continent); //If we are using a directed CQ, ignore Hound calls that do not comply. diff --git a/widgets/widgets.pri b/widgets/widgets.pri index eef0c7857..3c2cb2444 100644 --- a/widgets/widgets.pri +++ b/widgets/widgets.pri @@ -8,13 +8,14 @@ SOURCES += \ widgets/fastplot.cpp widgets/MessageBox.cpp \ widgets/colorhighlighting.cpp widgets/ExportCabrillo.cpp \ widgets/AbstractLogWindow.cpp \ + widgets/FrequencyLineEdit.cpp widgets/FrequencyDeltaLineEdit.cpp \ widgets/FoxLogWindow.cpp widgets/CabrilloLogWindow.cpp HEADERS += \ widgets/mainwindow.h widgets/plotter.h \ widgets/about.h widgets/widegraph.h \ widgets/displaytext.h widgets/logqso.h widgets/LettersSpinBox.hpp \ - widgets/FrequencyLineEdit.hpp widgets/signalmeter.h \ + widgets/FrequencyLineEdit.hpp widgets/FrequencyDeltaLineEdit.hpp widgets/signalmeter.h \ widgets/meterwidget.h widgets/messageaveraging.h \ widgets/echoplot.h widgets/echograph.h widgets/fastgraph.h \ widgets/fastplot.h widgets/MessageBox.hpp widgets/colorhighlighting.h \ From 80c819c326135eecc6fcf5cd6d5b6941c9566c6b Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Thu, 30 May 2019 23:29:46 +0100 Subject: [PATCH 114/159] Use a new name for the revised cabrillo_log(_v2) database table This avoids most backward compatibility issues but contest logs cannot be carried forward to v2.1.0. --- models/CabrilloLog.cpp | 25 ++++++------------------- 1 file changed, 6 insertions(+), 19 deletions(-) diff --git a/models/CabrilloLog.cpp b/models/CabrilloLog.cpp index 5c3b0ef5b..dfba3d439 100644 --- a/models/CabrilloLog.cpp +++ b/models/CabrilloLog.cpp @@ -84,26 +84,13 @@ CabrilloLog::impl::impl (CabrilloLog * self, Configuration const * configuration , configuration_ {configuration} , adding_row_ {false} { - if (!database ().tables ().contains ("cabrillo_log")) + if (!database ().tables ().contains ("cabrillo_log_v2")) { create_table (); } setEditStrategy (QSqlTableModel::OnFieldChange); - setTable ("cabrillo_log"); - if (-1 != fieldIndex ("band")) // schema out of date - { - QSqlQuery query; - SQL_error_check (query, static_cast (&QSqlQuery::exec), - "DROP TABLE IF EXISTS cabrillo_log_backup"); - SQL_error_check (query, static_cast (&QSqlQuery::exec), - "CREATE TABLE cabrillo_log_backup AS SELECT * FROM cabrillo_log"); - SQL_error_check (query, static_cast (&QSqlQuery::exec), - "DROP TABLE cabrillo_log"); - create_table (); - setTable ("cabrillo_log"); - } - + setTable ("cabrillo_log_v2"); setHeaderData (fieldIndex ("frequency"), Qt::Horizontal, tr ("Freq(MHz)")); setHeaderData (fieldIndex ("mode"), Qt::Horizontal, tr ("Mode")); setHeaderData (fieldIndex ("when"), Qt::Horizontal, tr ("Date & Time(UTC)")); @@ -133,7 +120,7 @@ CabrilloLog::impl::impl (CabrilloLog * self, Configuration const * configuration "SELECT " " frequency " " FROM " - " cabrillo_log " + " cabrillo_log_v2 " " WHERE " " call = :call "); @@ -145,7 +132,7 @@ CabrilloLog::impl::impl (CabrilloLog * self, Configuration const * configuration " , call" " , exchange_rcvd" " FROM " - " cabrillo_log " + " cabrillo_log_v2 " " ORDER BY " " \"when\""); } @@ -154,7 +141,7 @@ void CabrilloLog::impl::create_table () { QSqlQuery query; SQL_error_check (query, static_cast (&QSqlQuery::exec), - "CREATE TABLE cabrillo_log (" + "CREATE TABLE cabrillo_log_v2 (" " id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL," " frequency INTEGER NOT NULL," " mode VARCHAR(6) NOT NULL," @@ -313,7 +300,7 @@ void CabrilloLog::export_qsos (QTextStream& stream) const auto CabrilloLog::unique_DXCC_entities (AD1CCty const * countries) const -> worked_set { - QSqlQuery q {"SELECT DISTINCT BAND, CALL FROM cabrillo_log"}; + QSqlQuery q {"SELECT DISTINCT BAND, CALL FROM cabrillo_log_v2"}; auto band_index = q.record ().indexOf ("band"); auto call_index = q.record ().indexOf ("call"); worked_set entities; From a867a3ca18580469e593ebb572b3292121fe2887 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Tue, 28 May 2019 18:58:12 +0100 Subject: [PATCH 115/159] Updates to Omni-Rig interface in line with suggestions from Alex, VE3NEA Includes tidying up some old and obsolete code. --- DXLabSuiteCommanderTransceiver.cpp | 4 +- DXLabSuiteCommanderTransceiver.hpp | 2 +- HRDTransceiver.cpp | 2 +- HRDTransceiver.hpp | 2 +- HamlibTransceiver.cpp | 4 +- HamlibTransceiver.hpp | 2 +- OmniRigTransceiver.cpp | 303 ++++++++++++++++------------- OmniRigTransceiver.hpp | 7 +- PollingTransceiver.cpp | 70 +++---- PollingTransceiver.hpp | 4 +- TransceiverBase.cpp | 33 +++- TransceiverBase.hpp | 2 - 12 files changed, 239 insertions(+), 196 deletions(-) diff --git a/DXLabSuiteCommanderTransceiver.cpp b/DXLabSuiteCommanderTransceiver.cpp index 4e9270cfe..d745ec17f 100644 --- a/DXLabSuiteCommanderTransceiver.cpp +++ b/DXLabSuiteCommanderTransceiver.cpp @@ -127,7 +127,7 @@ int DXLabSuiteCommanderTransceiver::do_start () throw error {tr ("DX Lab Suite Commander didn't respond correctly reading frequency: ") + reply}; } - poll (); + do_poll (); return resolution; } @@ -247,7 +247,7 @@ void DXLabSuiteCommanderTransceiver::do_mode (MODE m) update_mode (m); } -void DXLabSuiteCommanderTransceiver::poll () +void DXLabSuiteCommanderTransceiver::do_poll () { #if WSJT_TRACE_CAT && WSJT_TRACE_CAT_POLLS bool quiet {false}; diff --git a/DXLabSuiteCommanderTransceiver.hpp b/DXLabSuiteCommanderTransceiver.hpp index b02fbef12..1196678b8 100644 --- a/DXLabSuiteCommanderTransceiver.hpp +++ b/DXLabSuiteCommanderTransceiver.hpp @@ -39,7 +39,7 @@ protected: void do_mode (MODE) override; void do_ptt (bool on) override; - void poll () override; + void do_poll () override; private: MODE get_mode (bool no_debug = false); diff --git a/HRDTransceiver.cpp b/HRDTransceiver.cpp index 3b9f90e23..c44914145 100644 --- a/HRDTransceiver.cpp +++ b/HRDTransceiver.cpp @@ -885,7 +885,7 @@ bool HRDTransceiver::is_button_checked (int button_index, bool no_debug) return "1" == reply; } -void HRDTransceiver::poll () +void HRDTransceiver::do_poll () { #if WSJT_TRACE_CAT && WSJT_TRACE_CAT_POLLS bool quiet {false}; diff --git a/HRDTransceiver.hpp b/HRDTransceiver.hpp index e17134d53..6ccd72d52 100644 --- a/HRDTransceiver.hpp +++ b/HRDTransceiver.hpp @@ -48,7 +48,7 @@ protected: void do_ptt (bool on) override; // Implement the PollingTransceiver interface. - void poll () override; + void do_poll () override; private: QString send_command (QString const&, bool no_debug = false, bool prepend_context = true, bool recurse = false); diff --git a/HamlibTransceiver.cpp b/HamlibTransceiver.cpp index f2e55bb4b..da0623e22 100644 --- a/HamlibTransceiver.cpp +++ b/HamlibTransceiver.cpp @@ -632,7 +632,7 @@ int HamlibTransceiver::do_start () resolution = -1; // best guess } - poll (); + do_poll (); TRACE_CAT ("HamlibTransceiver", "exit" << state () << "reversed =" << reversed_ << "resolution = " << resolution); return resolution; @@ -898,7 +898,7 @@ void HamlibTransceiver::do_mode (MODE mode) update_mode (mode); } -void HamlibTransceiver::poll () +void HamlibTransceiver::do_poll () { #if !WSJT_TRACE_CAT_POLLS #if defined (NDEBUG) diff --git a/HamlibTransceiver.hpp b/HamlibTransceiver.hpp index c8c0f74d7..17f1c28d3 100644 --- a/HamlibTransceiver.hpp +++ b/HamlibTransceiver.hpp @@ -40,7 +40,7 @@ class HamlibTransceiver final void do_mode (MODE) override; void do_ptt (bool) override; - void poll () override; + void do_poll () override; void error_check (int ret_code, QString const& doing) const; void set_conf (char const * item, char const * value); diff --git a/OmniRigTransceiver.cpp b/OmniRigTransceiver.cpp index 09f1e5cfa..4d3bbf1f8 100644 --- a/OmniRigTransceiver.cpp +++ b/OmniRigTransceiver.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include "qt_helpers.hpP" @@ -109,6 +110,15 @@ OmniRigTransceiver::OmniRigTransceiver (std::unique_ptr wrapped { } +// returns false on time out +bool OmniRigTransceiver::await_notification_with_timeout (int timeout) +{ + QEventLoop el; + connect (this, &OmniRigTransceiver::notified, &el, [&el] () {el.exit (1);}); + QTimer::singleShot (timeout, Qt::CoarseTimer, &el, [&el] () {el.exit (0);}); + return 1 == el.exec (); // wait for notify or timer +} + int OmniRigTransceiver::do_start () { TRACE_CAT ("OmniRigTransceiver", "starting"); @@ -182,101 +192,97 @@ int OmniRigTransceiver::do_start () .arg (readable_params_, 8, 16, QChar ('0')) .arg (writable_params_, 8, 16, QChar ('0')) .arg (rig_number_).toLocal8Bit ()); - - offline_timer_.reset (new QTimer); - offline_timer_->setSingleShot (true); - offline_timer_->setInterval (5 * 1000); - connect (&*offline_timer_, &QTimer::timeout, this, &OmniRigTransceiver::timeout_check); - - for (unsigned tries {0}; tries < 10; ++tries) + if (OmniRig::ST_ONLINE != rig_->Status ()) { - QThread::msleep (100); // wait until OmniRig polls the rig - auto f = rig_->GetRxFrequency (); - int resolution {0}; - if (f) + throw_qstring ("OmniRig: " + rig_->StatusStr ()); + } + await_notification_with_timeout (1000); + update_rx_frequency (rig_->GetRxFrequency ()); + qDebug () << "Initial state:" << state (); + int resolution {0}; + if (OmniRig::PM_UNKNOWN == rig_->Vfo () + && (writable_params_ & (OmniRig::PM_VFOA | OmniRig::PM_VFOB)) + == (OmniRig::PM_VFOA | OmniRig::PM_VFOB)) + { + // start with VFO A (probably MAIN) on rigs that we + // can't query VFO but can set explicitly + rig_->SetVfo (OmniRig::PM_VFOA); + } + auto f = state ().frequency (); + if (f % 10) return resolution; // 1Hz resolution + auto test_frequency = f - f % 100 + 55; + if (OmniRig::PM_FREQ & writable_params_) + { + rig_->SetFreq (test_frequency); + } + else if (reversed_ && (OmniRig::PM_FREQB & writable_params_)) + { + rig_->SetFreqB (test_frequency); + } + else if (!reversed_ && (OmniRig::PM_FREQA & writable_params_)) + { + rig_->SetFreqA (test_frequency); + } + else + { + throw_qstring (tr ("OmniRig: don't know how to set rig frequency")); + } + if (!await_notification_with_timeout (1000)) + { + TRACE_CAT ("OmniRigTransceiver", "do_start 1: wait timed out"); + throw_qstring (tr ("OmniRig: timeout waiting for update from rig")); + } + switch (rig_->GetRxFrequency () - test_frequency) + { + case -5: resolution = -1; break; // 10Hz truncated + case 5: resolution = 1; break; // 10Hz rounded + case -15: resolution = -2; break; // 20Hz truncated + case -55: resolution = -2; break; // 100Hz truncated + case 45: resolution = 2; break; // 100Hz rounded + } + if (1 == resolution) // may be 20Hz rounded + { + test_frequency = f - f % 100 + 51; + if (OmniRig::PM_FREQ & writable_params_) { - if (OmniRig::PM_UNKNOWN == rig_->Vfo () - && (writable_params_ & (OmniRig::PM_VFOA | OmniRig::PM_VFOB)) - == (OmniRig::PM_VFOA | OmniRig::PM_VFOB)) - { - // start with VFO A (probably MAIN) on rigs that we - // can't query VFO but can set explicitly - rig_->SetVfo (OmniRig::PM_VFOA); - } - if (f % 10) return resolution; // 1Hz resolution - auto test_frequency = f - f % 100 + 55; - if (OmniRig::PM_FREQ & writable_params_) - { - rig_->SetFreq (test_frequency); - } - else if (reversed_ && (OmniRig::PM_FREQB & writable_params_)) - { - rig_->SetFreqB (test_frequency); - } - else if (!reversed_ && (OmniRig::PM_FREQA & writable_params_)) - { - rig_->SetFreqA (test_frequency); - } - else - { - throw_qstring (tr ("OmniRig: don't know how to set rig frequency")); - } - switch (rig_->GetRxFrequency () - test_frequency) - { - case -5: resolution = -1; break; // 10Hz truncated - case 5: resolution = 1; break; // 10Hz rounded - case -15: resolution = -2; break; // 20Hz truncated - case -55: resolution = -2; break; // 100Hz truncated - case 45: resolution = 2; break; // 100Hz rounded - } - if (1 == resolution) // may be 20Hz rounded - { - test_frequency = f - f % 100 + 51; - if (OmniRig::PM_FREQ & writable_params_) - { - rig_->SetFreq (test_frequency); - } - else if (reversed_ && (OmniRig::PM_FREQB & writable_params_)) - { - rig_->SetFreqB (test_frequency); - } - else if (!reversed_ && (OmniRig::PM_FREQA & writable_params_)) - { - rig_->SetFreqA (test_frequency); - } - if (9 == rig_->GetRxFrequency () - test_frequency) - { - resolution = 2; // 20Hz rounded - } - } - if (OmniRig::PM_FREQ & writable_params_) - { - rig_->SetFreq (f); - } - else if (reversed_ && (OmniRig::PM_FREQB & writable_params_)) - { - rig_->SetFreqB (f); - } - else if (!reversed_ && (OmniRig::PM_FREQA & writable_params_)) - { - rig_->SetFreqA (f); - } - update_rx_frequency (f); - return resolution; + rig_->SetFreq (test_frequency); + } + else if (reversed_ && (OmniRig::PM_FREQB & writable_params_)) + { + rig_->SetFreqB (test_frequency); + } + else if (!reversed_ && (OmniRig::PM_FREQA & writable_params_)) + { + rig_->SetFreqA (test_frequency); + } + if (!await_notification_with_timeout (2000)) + { + TRACE_CAT ("OmniRigTransceiver", "do_start 2: wait timed out"); + throw_qstring (tr ("OmniRig: timeout waiting for update from rig")); + } + if (9 == rig_->GetRxFrequency () - test_frequency) + { + resolution = 2; // 20Hz rounded } } - throw_qstring (tr ("OmniRig: Initialization timed out")); - return 0; // keep compiler happy + if (OmniRig::PM_FREQ & writable_params_) + { + rig_->SetFreq (f); + } + else if (reversed_ && (OmniRig::PM_FREQB & writable_params_)) + { + rig_->SetFreqB (f); + } + else if (!reversed_ && (OmniRig::PM_FREQA & writable_params_)) + { + rig_->SetFreqA (f); + } + update_rx_frequency (f); + return resolution; } void OmniRigTransceiver::do_stop () { - if (offline_timer_) - { - offline_timer_->stop (); - offline_timer_.reset (); - } - QThread::msleep (200); // leave some time for pending // commands at the server end if (port_) @@ -300,17 +306,6 @@ void OmniRigTransceiver::do_stop () TRACE_CAT ("OmniRigTransceiver", "stopped"); } -void OmniRigTransceiver::do_sync (bool force_signal, bool /*no_poll*/) -{ - // nothing much we can do here, we just have to let OmniRig do its - // stuff and its first poll should send us and update that will - // trigger a update signal from us. Any attempt to query OmniRig - // leads to a whole mess of trouble since its internal state is - // garbage until it has done its first rig poll. - send_update_signal_ = force_signal; - update_complete (); -} - void OmniRigTransceiver::handle_COM_exception (int code, QString source, QString desc, QString help) { TRACE_CAT ("OmniRigTransceiver", QString::number (code) + " at " + source + ": " + desc + " (" + help + ')'); @@ -319,16 +314,20 @@ void OmniRigTransceiver::handle_COM_exception (int code, QString source, QString void OmniRigTransceiver::handle_visible_change () { + if (!omni_rig_ || omni_rig_->isNull ()) return; TRACE_CAT ("OmniRigTransceiver", "visibility change: visibility =" << omni_rig_->DialogVisible ()); } void OmniRigTransceiver::handle_rig_type_change (int rig_number) { + if (!omni_rig_ || omni_rig_->isNull ()) return; + TRACE_CAT ("OmniRigTransceiver", "rig type change: rig =" << rig_number); if (rig_number_ == rig_number) { + if (!rig_ || rig_->isNull ()) return; readable_params_ = rig_->ReadableParams (); writable_params_ = rig_->WriteableParams (); - TRACE_CAT ("OmniRigTransceiver", QString {"OmniRig rig type change to: %1 readable params = 0x%2 writable params = 0x%3 for rig %4"} + TRACE_CAT ("OmniRigTransceiver", QString {"rig type change to: %1 readable params = 0x%2 writable params = 0x%3 for rig %4"} .arg (rig_->RigType ()) .arg (readable_params_, 8, 16, QChar ('0')) .arg (writable_params_, 8, 16, QChar ('0')) @@ -338,48 +337,43 @@ void OmniRigTransceiver::handle_rig_type_change (int rig_number) void OmniRigTransceiver::handle_status_change (int rig_number) { + if (!omni_rig_ || omni_rig_->isNull ()) return; + TRACE_CAT ("OmniRigTransceiver", QString {"status change for rig %1"}.arg (rig_number).toLocal8Bit ()); if (rig_number_ == rig_number) { + if (!rig_ || rig_->isNull ()) return; auto const& status = rig_->StatusStr ().toLocal8Bit (); - TRACE_CAT ("OmniRigTransceiver", QString {"OmniRig status change: new status for rig %1 = "}.arg (rig_number).toLocal8Bit () << status); + TRACE_CAT ("OmniRigTransceiver", "OmniRig status change: new status = " << status); if (OmniRig::ST_ONLINE != rig_->Status ()) { - if (!offline_timer_->isActive ()) - { - offline_timer_->start (); // give OmniRig time to recover - } - } - else - { - offline_timer_->stop (); - update_rx_frequency (rig_->GetRxFrequency ()); - update_complete (); - TRACE_CAT ("OmniRigTransceiver", "OmniRig frequency:" << state ().frequency ()); + offline ("Rig went offline"); } + // else + // { + // update_rx_frequency (rig_->GetRxFrequency ()); + // update_complete (); + // TRACE_CAT ("OmniRigTransceiver", "frequency:" << state ().frequency ()); + // } } } -void OmniRigTransceiver::timeout_check () -{ - offline ("Rig went offline"); -} - void OmniRigTransceiver::handle_params_change (int rig_number, int params) { - if (rig_number_ == rig_number) - { - TRACE_CAT ("OmniRigTransceiver", QString {"OmniRig params change: params = 0x%1 for rig %2"} + if (!omni_rig_ || omni_rig_->isNull ()) return; + TRACE_CAT ("OmniRigTransceiver", QString {"params change: params = 0x%1 for rig %2"} .arg (params, 8, 16, QChar ('0')) .arg (rig_number).toLocal8Bit () << "state before:" << state ()); + if (rig_number_ == rig_number) + { + if (!rig_ || rig_->isNull ()) return; // starting_ = false; TransceiverState old_state {state ()}; auto need_frequency = false; - // state_.online = true; // sometimes we don't get an initial - // // OmniRig::ST_ONLINE status change - // // event + if (params & OmniRig::PM_VFOAA) { + TRACE_CAT ("OmniRigTransceiver", "VFOAA"); update_split (false); reversed_ = false; update_rx_frequency (rig_->FreqA ()); @@ -387,6 +381,7 @@ void OmniRigTransceiver::handle_params_change (int rig_number, int params) } if (params & OmniRig::PM_VFOAB) { + TRACE_CAT ("OmniRigTransceiver", "VFOAB"); update_split (true); reversed_ = false; update_rx_frequency (rig_->FreqA ()); @@ -394,6 +389,7 @@ void OmniRigTransceiver::handle_params_change (int rig_number, int params) } if (params & OmniRig::PM_VFOBA) { + TRACE_CAT ("OmniRigTransceiver", "VFOBA"); update_split (true); reversed_ = true; update_other_frequency (rig_->FreqA ()); @@ -401,6 +397,7 @@ void OmniRigTransceiver::handle_params_change (int rig_number, int params) } if (params & OmniRig::PM_VFOBB) { + TRACE_CAT ("OmniRigTransceiver", "VFOBB"); update_split (false); reversed_ = true; update_other_frequency (rig_->FreqA ()); @@ -408,64 +405,75 @@ void OmniRigTransceiver::handle_params_change (int rig_number, int params) } if (params & OmniRig::PM_VFOA) { + TRACE_CAT ("OmniRigTransceiver", "VFOA"); reversed_ = false; need_frequency = true; } if (params & OmniRig::PM_VFOB) { + TRACE_CAT ("OmniRigTransceiver", "VFOB"); reversed_ = true; need_frequency = true; } if (params & OmniRig::PM_FREQ) { + TRACE_CAT ("OmniRigTransceiver", "FREQ"); need_frequency = true; } if (params & OmniRig::PM_FREQA) { + auto f = rig_->FreqA (); + TRACE_CAT ("OmniRigTransceiver", "FREQA = " << f); if (reversed_) { - update_other_frequency (rig_->FreqA ()); + update_other_frequency (f); } else { - update_rx_frequency (rig_->FreqA ()); + update_rx_frequency (f); } } if (params & OmniRig::PM_FREQB) { + auto f = rig_->FreqB (); + TRACE_CAT ("OmniRigTransceiver", "FREQB = " << f); if (reversed_) { - update_rx_frequency (rig_->FreqB ()); + update_rx_frequency (f); } else { - update_other_frequency (rig_->FreqB ()); + update_other_frequency (f); } } if (need_frequency) { if (readable_params_ & OmniRig::PM_FREQA) { + auto f = rig_->FreqA (); + TRACE_CAT ("OmniRigTransceiver", "FREQA = " << f); if (reversed_) { - update_other_frequency (rig_->FreqA ()); + update_other_frequency (f); } else { - update_rx_frequency (rig_->FreqA ()); + update_rx_frequency (f); } need_frequency = false; } if (readable_params_ & OmniRig::PM_FREQB) { + auto f = rig_->FreqB (); + TRACE_CAT ("OmniRigTransceiver", "FREQB = " << f); if (reversed_) { - update_rx_frequency (rig_->FreqB ()); + update_rx_frequency (f); } else { - update_other_frequency (rig_->FreqB ()); + update_other_frequency (f); } need_frequency = false; } @@ -473,89 +481,113 @@ void OmniRigTransceiver::handle_params_change (int rig_number, int params) if (need_frequency && (readable_params_ & OmniRig::PM_FREQ) && !state ().ptt ()) { - update_rx_frequency (rig_->Freq ()); + auto f = rig_->Freq (); + TRACE_CAT ("OmniRigTransceiver", "FREQ = " << f); + update_rx_frequency (f); } if (params & OmniRig::PM_PITCH) { + TRACE_CAT ("OmniRigTransceiver", "PITCH"); } if (params & OmniRig::PM_RITOFFSET) { + TRACE_CAT ("OmniRigTransceiver", "RITOFFSET"); } if (params & OmniRig::PM_RIT0) { + TRACE_CAT ("OmniRigTransceiver", "RIT0"); } if (params & OmniRig::PM_VFOEQUAL) { auto f = readable_params_ & OmniRig::PM_FREQA ? rig_->FreqA () : rig_->Freq (); + auto m = map_mode (rig_->Mode ()); + TRACE_CAT ("OmniRigTransceiver", QString {"VFOEQUAL f=%1 m=%2"}.arg (f).arg (m)); update_rx_frequency (f); update_other_frequency (f); - update_mode (map_mode (rig_->Mode ())); + update_mode (m); } if (params & OmniRig::PM_VFOSWAP) { - auto temp = state ().tx_frequency (); + TRACE_CAT ("OmniRigTransceiver", "VFOSWAP"); + auto f = state ().tx_frequency (); update_other_frequency (state ().frequency ()); - update_rx_frequency (temp); + update_rx_frequency (f); update_mode (map_mode (rig_->Mode ())); } if (params & OmniRig::PM_SPLITON) { + TRACE_CAT ("OmniRigTransceiver", "SPLITON"); update_split (true); } if (params & OmniRig::PM_SPLITOFF) { + TRACE_CAT ("OmniRigTransceiver", "SPLITOFF"); update_split (false); } if (params & OmniRig::PM_RITON) { + TRACE_CAT ("OmniRigTransceiver", "RITON"); } if (params & OmniRig::PM_RITOFF) { + TRACE_CAT ("OmniRigTransceiver", "RITOFF"); } if (params & OmniRig::PM_XITON) { + TRACE_CAT ("OmniRigTransceiver", "XITON"); } if (params & OmniRig::PM_XITOFF) { + TRACE_CAT ("OmniRigTransceiver", "XITOFF"); } if (params & OmniRig::PM_RX) { + TRACE_CAT ("OmniRigTransceiver", "RX"); update_PTT (false); } if (params & OmniRig::PM_TX) { + TRACE_CAT ("OmniRigTransceiver", "TX"); update_PTT (); } if (params & OmniRig::PM_CW_U) { + TRACE_CAT ("OmniRigTransceiver", "CW-R"); update_mode (CW_R); } if (params & OmniRig::PM_CW_L) { + TRACE_CAT ("OmniRigTransceiver", "CW"); update_mode (CW); } if (params & OmniRig::PM_SSB_U) { + TRACE_CAT ("OmniRigTransceiver", "USB"); update_mode (USB); } if (params & OmniRig::PM_SSB_L) { + TRACE_CAT ("OmniRigTransceiver", "LSB"); update_mode (LSB); } if (params & OmniRig::PM_DIG_U) { + TRACE_CAT ("OmniRigTransceiver", "DATA-U"); update_mode (DIG_U); } if (params & OmniRig::PM_DIG_L) { + TRACE_CAT ("OmniRigTransceiver", "DATA-L"); update_mode (DIG_L); } if (params & OmniRig::PM_AM) { + TRACE_CAT ("OmniRigTransceiver", "AM"); update_mode (AM); } if (params & OmniRig::PM_FM) { + TRACE_CAT ("OmniRigTransceiver", "FM"); update_mode (FM); } @@ -566,6 +598,7 @@ void OmniRigTransceiver::handle_params_change (int rig_number, int params) } TRACE_CAT ("OmniRigTransceiver", "OmniRig params change: state after:" << state ()); } + Q_EMIT notified (); } void OmniRigTransceiver::handle_custom_reply (int rig_number, QVariant const& command, QVariant const& reply) @@ -573,8 +606,10 @@ void OmniRigTransceiver::handle_custom_reply (int rig_number, QVariant const& co (void)command; (void)reply; + if (!omni_rig_ || omni_rig_->isNull ()) return; if (rig_number_ == rig_number) { + if (!rig_ || rig_->isNull ()) return; TRACE_CAT ("OmniRigTransceiver", "custom command" << command.toString ().toLocal8Bit () << "with reply" << reply.toString ().toLocal8Bit () << QString ("for rig %1").arg (rig_number).toLocal8Bit ()); diff --git a/OmniRigTransceiver.hpp b/OmniRigTransceiver.hpp index c63266b69..2ba5fd4d3 100644 --- a/OmniRigTransceiver.hpp +++ b/OmniRigTransceiver.hpp @@ -38,10 +38,11 @@ public: void do_tx_frequency (Frequency, MODE, bool no_ignore) override; void do_mode (MODE) override; void do_ptt (bool on) override; - void do_sync (bool force_signal, bool no_poll) override; private: - Q_SLOT void timeout_check (); + bool await_notification_with_timeout (int timeout); + Q_SIGNAL void notified () const; + // Q_SLOT void timeout_check (); Q_SLOT void handle_COM_exception (int, QString, QString, QString); Q_SLOT void handle_visible_change (); Q_SLOT void handle_rig_type_change (int rig_number); @@ -62,7 +63,7 @@ private: QString rig_type_; int readable_params_; int writable_params_; - QScopedPointer offline_timer_; + // QScopedPointer offline_timer_; bool send_update_signal_; bool reversed_; // some rigs can reverse VFOs }; diff --git a/PollingTransceiver.cpp b/PollingTransceiver.cpp index b2bbab179..ed47144af 100644 --- a/PollingTransceiver.cpp +++ b/PollingTransceiver.cpp @@ -129,52 +129,46 @@ bool PollingTransceiver::do_pre_update () return true; } -void PollingTransceiver::do_sync (bool force_signal, bool no_poll) -{ - if (!no_poll) poll (); // tell sub-classes to update our state - - // Signal new state if it is directly requested or, what we expected - // or, hasn't become what we expected after polls_to_stabilize - // polls. Unsolicited changes will be signalled immediately unless - // they intervene in a expected sequence where they will be delayed. - if (retries_) - { - --retries_; - if (force_signal || state () == next_state_ || !retries_) - { - // our client wants a signal regardless - // or the expected state has arrived - // or there are no more retries - force_signal = true; - } - } - else if (force_signal || state () != last_signalled_state_) - { - // here is the normal passive polling path either our client has - // requested a state update regardless of change or state has - // changed asynchronously - force_signal = true; - } - - if (force_signal) - { - // reset everything, record and signal the current state - retries_ = 0; - next_state_ = state (); - last_signalled_state_ = state (); - update_complete (true); - } -} - void PollingTransceiver::handle_timeout () { QString message; + bool force_signal {false}; // we must catch all exceptions here since we are called by Qt and // inform our parent of the failure via the offline() message try { - do_sync (); + do_poll (); // tell sub-classes to update our state + + // Signal new state if it what we expected or, hasn't become + // what we expected after polls_to_stabilize polls. Unsolicited + // changes will be signalled immediately unless they intervene + // in a expected sequence where they will be delayed. + if (retries_) + { + --retries_; + if (state () == next_state_ || !retries_) + { + // the expected state has arrived or there are no more + // retries + force_signal = true; + } + } + else if (state () != last_signalled_state_) + { + // here is the normal passive polling path where state has + // changed asynchronously + force_signal = true; + } + + if (force_signal) + { + // reset everything, record and signal the current state + retries_ = 0; + next_state_ = state (); + last_signalled_state_ = state (); + update_complete (true); + } } catch (std::exception const& e) { diff --git a/PollingTransceiver.hpp b/PollingTransceiver.hpp index 0945c84ac..a9e639f9d 100644 --- a/PollingTransceiver.hpp +++ b/PollingTransceiver.hpp @@ -39,11 +39,9 @@ protected: QObject * parent); protected: - void do_sync (bool force_signal = false, bool no_poll = false) override final; - // Sub-classes implement this and fetch what they can from the rig // in a non-intrusive manner. - virtual void poll () = 0; + virtual void do_poll () = 0; void do_post_start () override final; void do_post_stop () override final; diff --git a/TransceiverBase.cpp b/TransceiverBase.cpp index ef77d51e4..43a88a4e1 100644 --- a/TransceiverBase.cpp +++ b/TransceiverBase.cpp @@ -19,10 +19,10 @@ void TransceiverBase::start (unsigned sequence_number) noexcept QString message; try { + last_sequence_number_ = sequence_number; may_update u {this, true}; shutdown (); startup (); - last_sequence_number_ = sequence_number; } catch (std::exception const& e) { @@ -46,6 +46,7 @@ void TransceiverBase::set (TransceiverState const& s, QString message; try { + last_sequence_number_ = sequence_number; may_update u {this, true}; bool was_online {requested_.online ()}; if (!s.online () && was_online) @@ -115,7 +116,6 @@ void TransceiverBase::set (TransceiverState const& s, // record what actually changed requested_.ptt (actual_.ptt ()); } - last_sequence_number_ = sequence_number; } catch (std::exception const& e) { @@ -133,10 +133,27 @@ void TransceiverBase::set (TransceiverState const& s, void TransceiverBase::startup () { - Q_EMIT resolution (do_start ()); - do_post_start (); - actual_.online (true); - requested_.online (true); + QString message; + try + { + actual_.online (true); + requested_.online (true); + auto res = do_start (); + do_post_start (); + Q_EMIT resolution (res); + } + catch (std::exception const& e) + { + message = e.what (); + } + catch (...) + { + message = unexpected; + } + if (!message.isEmpty ()) + { + offline (message); + } } void TransceiverBase::shutdown () @@ -163,8 +180,8 @@ void TransceiverBase::shutdown () } do_stop (); do_post_stop (); - actual_.online (false); - requested_.online (false); + actual_ = TransceiverState {}; + requested_ = TransceiverState {}; } void TransceiverBase::stop () noexcept diff --git a/TransceiverBase.hpp b/TransceiverBase.hpp index ea981d44b..7d43cc32e 100644 --- a/TransceiverBase.hpp +++ b/TransceiverBase.hpp @@ -112,8 +112,6 @@ protected: virtual void do_ptt (bool = true) = 0; virtual void do_post_ptt (bool = true) {} - virtual void do_sync (bool force_signal = false, bool no_poll = false) = 0; - virtual bool do_pre_update () {return true;} // sub classes report rig state changes with these methods From fef64fc0e094ef1ccb1c006f655f8146e999b396 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Thu, 30 May 2019 23:36:02 +0100 Subject: [PATCH 116/159] Remove a diagnostic --- logbook/Multiplier.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/logbook/Multiplier.cpp b/logbook/Multiplier.cpp index 64f6cc6f3..6323e4feb 100644 --- a/logbook/Multiplier.cpp +++ b/logbook/Multiplier.cpp @@ -31,7 +31,6 @@ Multiplier::~Multiplier () void Multiplier::reload (CabrilloLog const * log) { m_->entities_worked_ = log->unique_DXCC_entities (m_->countries_); - qDebug () << "Entities worked:" << m_->entities_worked_; } auto Multiplier::entities_worked () const -> worked_set const& From 42173f181616942ae7a6d691b7e9d49fe0fe8e34 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Fri, 31 May 2019 00:13:43 +0100 Subject: [PATCH 117/159] Minor release notes additions --- Release_Notes.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Release_Notes.txt b/Release_Notes.txt index efc7bb42c..60fa0aa20 100644 --- a/Release_Notes.txt +++ b/Release_Notes.txt @@ -37,6 +37,8 @@ OTHER IMPROVEMENTS - Improved S/N calculation for FT4 mode - N1MM Logger+ now uses the standard WSJT-X UDP messages - OK/Cancel buttons on Log QSO window maintain fixed positions + - Enhancements to the Omni-Rig CAT interface + - New setting option to include or exclude WAE entities BUG FIXES - Fix generation of Tx5 message when one callsign is nonstandard @@ -44,6 +46,7 @@ BUG FIXES - Fix a bug that caused mode switch from FT4 to FT8 - Fix a bug that caused FT4 to do WSPR-style band hopping - Fix a bug that caused a Fortran bounds error + - Repaired field editing in the Contest Log window Release: WSJT-X 2.1.0-rc5 From 3456bdb9498678f358486eb178ba41471cbd4a6a Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Fri, 31 May 2019 03:10:46 +0100 Subject: [PATCH 118/159] Update for new FT4 sample .WAV file --- samples/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/CMakeLists.txt b/samples/CMakeLists.txt index 6be6a6df2..271d2d3c4 100644 --- a/samples/CMakeLists.txt +++ b/samples/CMakeLists.txt @@ -1,5 +1,5 @@ set (SAMPLE_FILES - FT4/190106_000112.wav + FT4/000000_000002.wav FT8/181201_180245.wav ISCAT/ISCAT-A/VK7MO_110401_235515.wav ISCAT/ISCAT-B/K0AWU_100714_115000.wav From f61fc47efb34b0bb138b55c4016b250ce40efa58 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Fri, 31 May 2019 03:11:53 +0100 Subject: [PATCH 119/159] Bump RC number --- Versions.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Versions.cmake b/Versions.cmake index f07339063..45cd79820 100644 --- a/Versions.cmake +++ b/Versions.cmake @@ -2,5 +2,5 @@ set (WSJTX_VERSION_MAJOR 2) set (WSJTX_VERSION_MINOR 1) set (WSJTX_VERSION_PATCH 0) -set (WSJTX_RC 6) # release candidate number, comment out or zero for development versions +set (WSJTX_RC 7) # release candidate number, comment out or zero for development versions set (WSJTX_VERSION_IS_RELEASE 0) # set to 1 for final release build From ca41934b6821808810e225f4f5c7885ea4f6c19a Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Mon, 3 Jun 2019 00:35:20 +0100 Subject: [PATCH 120/159] Repair an object instance initialization order issue that causes crashes The background thread running the ADIF log load needs a valid configuration object as it now depends on the "Include WAE entities" option. --- widgets/mainwindow.cpp | 2 +- widgets/mainwindow.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 277dbfdd7..f5c5cff41 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -234,8 +234,8 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple, m_configurations_button {0}, m_settings {multi_settings->settings ()}, ui(new Ui::MainWindow), - m_logBook {&m_config}, m_config {&m_network_manager, temp_directory, m_settings, &m_logBook, this}, + m_logBook {&m_config}, m_WSPR_band_hopping {m_settings, &m_config, this}, m_WSPR_tx_next {false}, m_rigErrorMessageBox {MessageBox::Critical, tr ("Rig Control Error") diff --git a/widgets/mainwindow.h b/widgets/mainwindow.h index 03d009a76..ca545ec35 100644 --- a/widgets/mainwindow.h +++ b/widgets/mainwindow.h @@ -357,8 +357,8 @@ private: QSettings * m_settings; QScopedPointer ui; - LogBook m_logBook; // must be before Configuration construction Configuration m_config; + LogBook m_logBook; // must be after Configuration construction WSPRBandHopping m_WSPR_band_hopping; bool m_WSPR_tx_next; MessageBox m_rigErrorMessageBox; From 0e8433d1b0c69919fb666e6dc21479afadefbe6b Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 3 Jun 2019 08:26:32 -0400 Subject: [PATCH 121/159] Several edits to the Release Notes. --- Release_Notes.txt | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/Release_Notes.txt b/Release_Notes.txt index efc7bb42c..101e13d74 100644 --- a/Release_Notes.txt +++ b/Release_Notes.txt @@ -13,30 +13,33 @@ Copyright 2001 - 2019 by Joe Taylor, K1JT. Release: WSJT-X 2.1.0-rc6 - May 30, 2019 + June 2, 2019 ------------------------- - + Changes and bug fixes since WSJT-X 2.1.0-rc5: -IMPORTANT CHANGES TO THE FT4 PROTOCOL, NOT BACKWARD COMPATIBLE +IMPORTANT CHANGES TO THE FT4 PROTOCOL *** NOT BACKWARD COMPATIBLE *** - T/R sequence length increased from 6.0 to 7.5 seconds - - Symbol rate decreased from 23.4375 to 20.8333 baud. - - Bandwidth decreased from 90 Hz to 80 Hz + - Symbol rate decreased from 23.4375 to 20.8333 baud + - Signal bandwidth decreased from 90 Hz to 80 Hz -OTHER IMPROVEMENTS - - Allowable FT4 time offsets -1.0 < DT < +1.0 s - - Allow RRR Tx4 message in FT4 mode, if not using contest messages - - Send FT4 audio frequency to PSK Reporter +OTHER FT4 IMPROVEMENTS + - Allowable time offsets -1.0 < DT < +1.0 s + - Tx4 message with RRR now allowed, except in contest messages + - Audio frequency is now sent to PSK Reporter - Add a third decoding pass - Add ordered statistics decoding - Improved sensitivity: threshold S/N is now -17.5 dB + - Improved S/N calculation + - In FT4 mode, Shift+F11/F12 moves Tx freq by +/- 100 Hz + +OTHER IMPROVEMENTS - Improvements to accessibility - Updates to the User Guide (not yet complete, however) - New user option: "Calling CQ forces Call 1st" - - In FT4 mode, Shift+F11/F12 moves Tx freq by +/- 100 Hz - - Improved S/N calculation for FT4 mode - N1MM Logger+ now uses the standard WSJT-X UDP messages - OK/Cancel buttons on Log QSO window maintain fixed positions + - Put EU VHF contest serial numbers into the ADIF SRX and STX fields BUG FIXES - Fix generation of Tx5 message when one callsign is nonstandard @@ -45,6 +48,13 @@ BUG FIXES - Fix a bug that caused FT4 to do WSPR-style band hopping - Fix a bug that caused a Fortran bounds error +Release candidate WSJT-X 2.1.0-rc6 will be available for beta-testing +through July 21, 2019. It will be inoperable during the ARRL June VHF +QSO Party (June 8-10) or ARRL Field Day (June 22-23). It will +permanently cease to function after July 21, 2019. If all goes +according to plan, by that time there will be a General +Availability (GA) release of WSJT-X 2.1.0. + Release: WSJT-X 2.1.0-rc5 April 29, 2019 From 248742a3c6b96e83172acc34822d8c231d7f8b29 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Mon, 3 Jun 2019 16:35:27 +0100 Subject: [PATCH 122/159] Stability fixes for Omni-Rig and its clones --- OmniRigTransceiver.cpp | 74 +++++++++++++++++++++++++++--------------- TransceiverBase.cpp | 7 ++-- 2 files changed, 53 insertions(+), 28 deletions(-) diff --git a/OmniRigTransceiver.cpp b/OmniRigTransceiver.cpp index 4d3bbf1f8..de352fb5a 100644 --- a/OmniRigTransceiver.cpp +++ b/OmniRigTransceiver.cpp @@ -192,13 +192,25 @@ int OmniRigTransceiver::do_start () .arg (readable_params_, 8, 16, QChar ('0')) .arg (writable_params_, 8, 16, QChar ('0')) .arg (rig_number_).toLocal8Bit ()); + for (int i = 0; i < 5; ++i) + { + if (OmniRig::ST_ONLINE == rig_->Status ()) + { + break; + } + await_notification_with_timeout (1000); + } if (OmniRig::ST_ONLINE != rig_->Status ()) { throw_qstring ("OmniRig: " + rig_->StatusStr ()); } - await_notification_with_timeout (1000); - update_rx_frequency (rig_->GetRxFrequency ()); - qDebug () << "Initial state:" << state (); + auto f = rig_->GetRxFrequency (); + for (int i = 0; (f == 0) && (i < 5); ++i) + { + await_notification_with_timeout (1000); + f = rig_->GetRxFrequency (); + } + update_rx_frequency (f); int resolution {0}; if (OmniRig::PM_UNKNOWN == rig_->Vfo () && (writable_params_ & (OmniRig::PM_VFOA | OmniRig::PM_VFOB)) @@ -208,7 +220,7 @@ int OmniRigTransceiver::do_start () // can't query VFO but can set explicitly rig_->SetVfo (OmniRig::PM_VFOA); } - auto f = state ().frequency (); + f = state ().frequency (); if (f % 10) return resolution; // 1Hz resolution auto test_frequency = f - f % 100 + 55; if (OmniRig::PM_FREQ & writable_params_) @@ -348,6 +360,10 @@ void OmniRigTransceiver::handle_status_change (int rig_number) { offline ("Rig went offline"); } + else + { + Q_EMIT notified (); + } // else // { // update_rx_frequency (rig_->GetRxFrequency ()); @@ -452,39 +468,45 @@ void OmniRigTransceiver::handle_params_change (int rig_number, int params) if (readable_params_ & OmniRig::PM_FREQA) { auto f = rig_->FreqA (); - TRACE_CAT ("OmniRigTransceiver", "FREQA = " << f); - if (reversed_) + if (f) { - update_other_frequency (f); + TRACE_CAT ("OmniRigTransceiver", "FREQA = " << f); + if (reversed_) + { + update_other_frequency (f); + } + else + { + update_rx_frequency (f); + } } - else - { - update_rx_frequency (f); - } - need_frequency = false; } if (readable_params_ & OmniRig::PM_FREQB) { auto f = rig_->FreqB (); - TRACE_CAT ("OmniRigTransceiver", "FREQB = " << f); - if (reversed_) + if (f) { + TRACE_CAT ("OmniRigTransceiver", "FREQB = " << f); + if (reversed_) + { + update_rx_frequency (f); + } + else + { + update_other_frequency (f); + } + } + } + if (readable_params_ & OmniRig::PM_FREQ && !state ().ptt ()) + { + auto f = rig_->Freq (); + if (f) + { + TRACE_CAT ("OmniRigTransceiver", "FREQ = " << f); update_rx_frequency (f); } - else - { - update_other_frequency (f); - } - need_frequency = false; } } - if (need_frequency && (readable_params_ & OmniRig::PM_FREQ) - && !state ().ptt ()) - { - auto f = rig_->Freq (); - TRACE_CAT ("OmniRigTransceiver", "FREQ = " << f); - update_rx_frequency (f); - } if (params & OmniRig::PM_PITCH) { TRACE_CAT ("OmniRigTransceiver", "PITCH"); diff --git a/TransceiverBase.cpp b/TransceiverBase.cpp index 43a88a4e1..f1decb682 100644 --- a/TransceiverBase.cpp +++ b/TransceiverBase.cpp @@ -211,8 +211,11 @@ void TransceiverBase::stop () noexcept void TransceiverBase::update_rx_frequency (Frequency rx) { - actual_.frequency (rx); - requested_.frequency (rx); // track rig changes + if (rx) + { + actual_.frequency (rx); + requested_.frequency (rx); // track rig changes + } } void TransceiverBase::update_other_frequency (Frequency tx) From d03900d738593fe49af340bb8390b772ba4e3db1 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Mon, 3 Jun 2019 16:41:17 +0100 Subject: [PATCH 123/159] Updated AD1C cty.dat (Big CTY.DAT 20190523) --- cty.dat | 1246 ++++++++++++++++++++++++++++--------------------------- 1 file changed, 631 insertions(+), 615 deletions(-) diff --git a/cty.dat b/cty.dat index 3e12eaf9a..b1b8c2789 100644 --- a/cty.dat +++ b/cty.dat @@ -176,7 +176,7 @@ China: 24: 44: AS: 36.00: -102.00: -8.0: BY: BG,BG0(23)[42],BG9(23)[43],BH,BH0(23)[42],BH9(23)[43],BI,BI0(23)[42],BI9(23)[43],BJ,BJ0(23)[42], BJ9(23)[43],BL,BL0(23)[42],BL9(23)[43],BT,BT0(23)[42],BT9(23)[43],BY,BY0(23)[42],BY9(23)[43],BZ, BZ0(23)[42],BZ9(23)[43],XS,XS0(23)[42],XS9(23)[43],=B90IARU,=BD6KF/0(23)[42],=BD7MQ/9(23), - =BG6IFR/9(23),=BG9XD/4,=BG9XD/5,=BG9XD/7,=VO1AU/BY1RX,=VO1AU/BY1TTY,=W5FKX/BY1RX, + =BG6IFR/9(23),=BG9XD/4,=BG9XD/5,=BG9XD/7,=BH4CXY/9(23),=VO1AU/BY1RX,=VO1AU/BY1TTY,=W5FKX/BY1RX, =BA4DC/0(23)[42],=BD9BI/0(23)[42],=BG8FUL/0(23)[42], =BA4DT/0(23)[42],=BA4RF/0(23)[42],=BA7IO/0(23)[42],=BA7JS/0(23)[42],=BD1PTA/0(23)[42], =BD7IEE/0(23)[42],=BG1KIY/0(23)[42],=BG1LLB/0(23)[42],=BG1PIP/0(23)[42],=BG4WUA/0(23)[42], @@ -486,7 +486,7 @@ Nauru: 31: 65: OC: -0.52: -166.92: -12.0: C2: Andorra: 14: 27: EU: 42.58: -1.62: -1.0: C3: C3; The Gambia: 35: 46: AF: 13.40: 16.38: 0.0: C5: - C5,=C56W/BI,=VERSION; + C5,=C56W/BI; Bahamas: 08: 11: NA: 24.25: 76.00: 5.0: C6: C6,=WK2G/C6A/LH; Mozambique: 37: 53: AF: -18.25: -35.00: -2.0: C9: @@ -567,7 +567,7 @@ Antarctica: 13: 74: SA: -90.00: 0.00: 0.0: CE9: =LU/FT5YJ[73], =OR4TN(38)[67], =CE9/K2ARB(12), - =DH1HB/P(38)[67],=DH5CW(38)[67],=DP0/OJ1ABOA(38)[67],=DP0GVN(38)[67],=DP1POL(38)[67], + =DH1HB/P(38)[67],=DP0/OJ1ABOA(38)[67],=DP0GVN(38)[67],=DP1POL(38)[67], =FT5YJ/P[73], =R1ANR(38)[67],=RI1ANR(38)[67], =OH2FFP/P(38)[67], @@ -601,7 +601,7 @@ Portugal: 14: 37: EU: 39.50: 8.00: 0.0: CT: Madeira Islands: 33: 36: AF: 32.75: 16.95: 0.0: CT3: CQ2,CQ3,CQ9,CR3,CR9,CS3,CS9,CT3,CT9,=CT9500AEP/J; Azores: 14: 36: EU: 38.70: 27.23: 1.0: CU: - CQ1,CQ8,CR1,CR2,CR8,CS4,CS8,CT8,CU, + CQ1,CQ8,CR1,CR2,CR8,CS4,CS8,CT8,CU,=CU2JU/ND, =CQ8ARN/LH, =CU5/CU3EJ/LH, =CT8/DK6EA/LH; @@ -654,8 +654,8 @@ Palestine: 20: 39: AS: 31.28: -34.27: -2.0: E4: E4; North Cook Islands: 32: 62: OC: -10.02: 161.08: 10.0: E5/n: =E51LYC,=E51QMA,=E51TUG, - =E51AMF,=E51GC,=E51M,=E51MAN,=E51MBX,=E51MKW,=E51MQT,=E51PT,=E51QQQ,=E51UFF,=E51WWB,=ZK1HCC, - =ZK1MA,=ZK1NCF,=ZK1NCI,=ZK1TTG, + =E51AMF,=E51M,=E51MAN,=E51MBX,=E51MKW,=E51MQT,=E51PT,=E51QQQ,=E51UFF,=E51WWB,=ZK1HCC,=ZK1MA, + =ZK1NCF,=ZK1NCI,=ZK1TTG, =E50W[63],=E51PDX[63],=E51PEN[63],=E51WL[63],=ZK1/AC4LN/N[63],=ZK1KDN[63],=ZK1NCP[63],=ZK1NDK[63], =ZK1NJC[63],=ZK1QMA[63],=ZK1TUG[63],=ZK1WL[63]; South Cook Islands: 32: 63: OC: -21.90: 157.93: 10.0: E5/s: @@ -670,20 +670,21 @@ Spain: 14: 37: EU: 40.37: 4.88: -1.0: EA: =AM1TDH/LH,=EA1APV/LH,=EA1BEY/Y,=EA1EEY/L,=EA1EEY/LGT,=EA1EEY/LH,=EA1EK/ZAP,=EA1FGS/LH,=EA1HLW/YL, =EA1RCG/CPV,=EA1RCG/SEU,=EA1RCG/YOA,=EA1RCI/CA,=EA1RCI/CR,=EA1RCI/CVG,=EA1RCI/ESM,=EA1RCI/IA, =EA1RCI/ICA,=EA1RCI/JBN,=EA1RCI/PAZ,=EA1RCI/PCV,=EA1RCI/RSM,=EA1RCI/YOA,=EA1URL/CVL,=EA1URO/D, - =EA3HSD/P,=EA5AER/P,=EA6QB/1,=EA8BFH/1,=EA8CZT/1,=EA8FC/1,=EA8RV/P,=EA9CD/1,=EA9CI/1,=EA9CP/1, - =EA9PD/1,=EB1DH/LH,=ED1IRM/LH,=EG1ILW/LH,=EG1LWC/LH,=EG1LWI/LH,=EG1LWN/LH,=EG1TDH/LH,=EG90IARU/1, + =EA5AER/P,=EA6QB/1,=EA8BFH/1,=EA8CZT/1,=EA8FC/1,=EA8RV/P,=EA9CD/1,=EA9CI/1,=EA9CP/1,=EA9PD/1, + =EB1DH/LH,=ED1IRM/LH,=EG1ILW/LH,=EG1LWC/LH,=EG1LWI/LH,=EG1LWN/LH,=EG1TDH/LH,=EG90IARU/1, =AM08ATU/H,=AM08CAZ/H,=AM08CYQ/H,=AM08EIE/Z,=AM08FAC/H,=AN08ADE/H,=AO08BQH/Z,=AO08BTM/Z, =AO08CIK/H,=AO08CVV/Z,=AO08CXK/H,=AO08CYL/H,=AO08DI/Z,=AO08EIE/Z,=AO08HV/Z,=AO08ICA/Z,=AO08ID/Z, =AO08KJ/Z,=AO08KV/Z,=AO08OK/H,=AO08PB/Z,=AO08RKO/H,=AO08VK/Z,=AO2016DSS/LH,=EA2/ON7RU/LH, =EA2CRX/LH,=EA2EZ/P,=EA2SPS/LH,=EA2URI/O,=EA6SK/2,=EA9CP/2,=EG90IARU/2, - =EA3ESZ/Z,=EA3EVR/R,=EA3LD/D,=EA3RCV/PAZ,=EA6LU/3,=EA8TL/3,=EA9CI/3,=EA9CP/3,=EG90IARU/3, + =EA3ESZ/Z,=EA3EVR/R,=EA3HSD/P,=EA3LD/D,=EA3RCV/PAZ,=EA6LU/3,=EA8TL/3,=EA9CI/3,=EA9CP/3, + =EG90IARU/3, =EA4AAQ/O,=EA4RCH/CIE,=EA6AFU/4,=EA6RC/4,=EA8BFH/4,=EA8BY/4,=EA9CI/4,=EA9CP/4,=EG8AOP/4, =EG90IARU/4, - =EA5ADM/P,=EA5CC/P,=EA5EQ/N,=EA5EZ/P,=EA5FL/LH,=EA5GVT/AVW,=EA5HCC/P,=EA5IKT/P,=EA5KB/LH,=EA5ND/D, - =EA5RCK/CDI,=EA5RKD/PAZ,=EA5TOM/AVW,=EA5URE/IVA,=EA5URE/P,=EA5URM/C,=EA5URM/F,=EA5URM/G,=EA5URM/H, - =EA5URM/I,=EA5URM/L,=EA5URR/PAZ,=EA5URV/CAC,=EA6AKN/5,=EA8BFH/5,=EA8CWF/5,=EA9BLJ/5,=EA9CI/5, - =EA9CP/5,=EA9PD/5,=ED5MFP/C,=ED5MFP/G,=ED5MFP/H,=ED5MFP/I,=ED5MFP/K,=ED5MFP/Q,=ED5MFP/R,=ED5MFP/S, - =ED5URD/LH,=EG90IARU/5,=EH5FL/LH, + =EA5/ON4LO/LH,=EA5ADM/P,=EA5CC/P,=EA5EQ/N,=EA5EZ/P,=EA5FL/LH,=EA5GVT/AVW,=EA5HCC/P,=EA5IKT/P, + =EA5KB/LH,=EA5ND/D,=EA5RCK/CDI,=EA5RKD/PAZ,=EA5TOM/AVW,=EA5URE/IVA,=EA5URE/P,=EA5URM/C,=EA5URM/F, + =EA5URM/G,=EA5URM/H,=EA5URM/I,=EA5URM/L,=EA5URR/PAZ,=EA5URV/CAC,=EA6AKN/5,=EA8BFH/5,=EA8CWF/5, + =EA9BLJ/5,=EA9CI/5,=EA9CP/5,=EA9PD/5,=ED5MFP/C,=ED5MFP/G,=ED5MFP/H,=ED5MFP/I,=ED5MFP/K,=ED5MFP/Q, + =ED5MFP/R,=ED5MFP/S,=ED5URD/LH,=EG90IARU/5,=EH5FL/LH, =AO7WRD/MA,=EA6SK/7,=EA7CFU/U,=EA7FC/FCJ,=EA7HZ/F,=EA7OBH/LH,=EA7URA/GET,=EA7URA/PAZ,=EA7URA/SG, =EA7URA/YOTA,=EA7URE/PAZ,=EA7URF/PAZ,=EA7URI/MDL,=EA7URJ/CPM,=EA7URL/FSV,=EA7URM/PAZ,=EA7URP/LAI, =EA9CP/7,=EA9FN/7,=EA9HU,=EA9HU/7,=EA9JS/7,=EA9LZ/7,=EA9PD/7,=EA9QD/7,=EA9UL/7,=EA9UV/7,=EB9PH/7, @@ -771,7 +772,7 @@ Austral Islands: 32: 63: OC: -23.37: 149.48: 10.0: FO/a: =FO/AC4LN/A,=FO/DF6IC,=FO/DJ4OI,=FO/DL1AWI,=FO/DL1IAN,=FO/DL3APO,=FO/DL3GA,=FO/DL7FT,=FO/DL9AWI, =FO/F6CTL,=FO/F8CFU,=FO/G3BJ,=FO/HG9B,=FO/HG9B/P,=FO/IK2GNW,=FO/JA8BMK,=FO/K7AR,=FO/OH6KN, =FO/ON4AXU/A,=FO/UT6UD,=FO0CLA/A,=FO0ERI,=FO0FLA,=FO0FRY,=FO0HWU,=FO0MOT/P,=FO0SEV,=FO0WEG, - =FO0WII,=FO5FD,=TX0HF,=TX3D,=TX5BTY,=TX5D,=TX5RV,=TX5SPA,=TX5T,=TX5W,=TX5Z,=TX6G; + =FO0WII,=FO5FD,=TX0HF,=TX2A,=TX3D,=TX5BTY,=TX5D,=TX5RV,=TX5SPA,=TX5T,=TX5W,=TX5Z,=TX6G; Clipperton Island: 07: 10: NA: 10.28: 109.22: 8.0: FO/c: =FO0/F8UFT,=FO0AAA,=TX5C,=TX5K,=TX5P; Marquesas Islands: 31: 63: OC: -8.92: 140.07: 9.5: FO/m: @@ -887,10 +888,10 @@ Scotland: 14: 27: EU: 56.82: 4.18: 0.0: GM: =GB2HLB,=GB2HMC,=GB2HRH,=GB2IGB,=GB2IGS,=GB2IMG,=GB2IMM,=GB2INV,=GB2IOT,=GB2JCM,=GB2KDR,=GB2KGB, =GB2KW,=GB2LBN,=GB2LBN/LH,=GB2LCL,=GB2LCP,=GB2LCT,=GB2LDG,=GB2LG,=GB2LGB,=GB2LHI,=GB2LK,=GB2LK/LH, =GB2LMG,=GB2LP,=GB2LS,=GB2LS/LH,=GB2LSS,=GB2LT,=GB2LT/LH,=GB2LXX,=GB2M,=GB2MAS,=GB2MBB,=GB2MDG, - =GB2MN,=GB2MOF,=GB2MSL,=GB2MUC,=GB2MUL,=GB2NBC,=GB2NEF,=GB2NL,=GB2OL,=GB2OWM,=GB2PBF,=GB2PG, - =GB2QM,=GB2RB,=GB2RDR,=GB2RRL,=GB2RWW,=GB2SAA,=GB2SAM,=GB2SAS,=GB2SB,=GB2SBG,=GB2SHL/LH,=GB2SKG, - =GB2SLH,=GB2SMM,=GB2SOH,=GB2SQN,=GB2SR,=GB2SSB,=GB2SUM,=GB2SWF,=GB2TDS,=GB2THL,=GB2TNL,=GB2VCB, - =GB2VEF,=GB2WBF,=GB2WG,=GB2WLS,=GB2YLS,=GB2ZE,=GB3ANG,=GB3GKR,=GB3GM,=GB3LER,=GB3LER/B,=GB3ORK, + =GB2MN,=GB2MOF,=GB2MSL,=GB2MUC,=GB2MUL,=GB2NBC,=GB2NEF,=GB2NL,=GB2NMM,=GB2OL,=GB2OWM,=GB2PBF, + =GB2PG,=GB2QM,=GB2RB,=GB2RDR,=GB2RRL,=GB2RWW,=GB2SAA,=GB2SAM,=GB2SAS,=GB2SB,=GB2SBG,=GB2SHL/LH, + =GB2SKG,=GB2SLH,=GB2SMM,=GB2SOH,=GB2SQN,=GB2SR,=GB2SSB,=GB2SUM,=GB2SWF,=GB2TDS,=GB2THL,=GB2TNL, + =GB2VCB,=GB2VEF,=GB2WBF,=GB2WG,=GB2WLS,=GB2YLS,=GB2ZE,=GB3ANG,=GB3GKR,=GB3LER,=GB3LER/B,=GB3ORK, =GB3ORK/B,=GB3SWF,=GB3WOI,=GB4AAS,=GB4AST,=GB4BBR,=GB4BG,=GB4CGS,=GB4CMA,=GB4DAS,=GB4DHX,=GB4DTD, =GB4DUK,=GB4EPC,=GB4GD,=GB4GDS,=GB4GS,=GB4IE,=GB4JCM,=GB4JPJ,=GB4JYS,=GB4LER,=GB4MSE,=GB4NFE, =GB4OL,=GB4PAS,=GB4SK,=GB4SKO,=GB4SLH,=GB4SMM,=GB4SRO,=GB4SWF,=GB50FVS,=GB50GDS,=GB50JS,=GB50WAB, @@ -949,64 +950,65 @@ Wales: 14: 27: EU: 52.28: 3.73: 0.0: GW: =2R0BRR,=2R0CDY,=2R0CDZ,=2R0CSS,=2R0CVE,=2R0DRB,=2R0IDT,=2R0OJA,=2R0PHP,=2R0PJP,=2R0REX,=2R0RWF, =2R0TRR,=2R0TYG,=2R0XTP,=2R0YKK,=2R3SFC,=2V0CDY,=2V0CGM,=2V0CLJ,=2V0CVL,=2V0DAA,=2V0DUN,=2V0GME, =2V0GNG,=2V0KED,=2V0WDS,=2V1EPO,=GB0AAW,=GB0AD,=GB0AWE,=GB0AWS,=GB0BHR,=GB0BP,=GB0BRE,=GB0BTB, - =GB0BVL,=GB0BYL,=GB0CCE,=GB0CEW,=GB0CFD,=GB0CGG,=GB0CLC,=GB0CQD,=GB0CSA,=GB0CSR,=GB0CVA,=GB0DFD, - =GB0DMT,=GB0DS,=GB0DVP,=GB0FHD,=GB0FHI,=GB0GDD,=GB0GIW,=GB0GLV,=GB0GMD,=GB0GRM,=GB0HEL,=GB0HGC, - =GB0HLT,=GB0HMM,=GB0HMT,=GB0KF,=GB0L,=GB0LBG,=GB0LM,=GB0LVF,=GB0MFH,=GB0MIW,=GB0ML,=GB0MPA, - =GB0MUU,=GB0MWL,=GB0NAW,=GB0NEW,=GB0NG,=GB0NLC,=GB0PBR,=GB0PEM,=GB0PGG,=GB0PLB,=GB0PLL,=GB0PSG, - =GB0RME,=GB0ROC,=GB0RPO,=GB0RS,=GB0RSC,=GB0RSF,=GB0RWM,=GB0SDD,=GB0SGC,=GB0SH,=GB0SH/LH,=GB0SOA, - =GB0SPE,=GB0SPS,=GB0TD,=GB0TPR,=GB0TS,=GB0TTT,=GB0VCA,=GB0VK,=GB0WHH,=GB0WHR,=GB0WIW,=GB0WUL, - =GB0YG,=GB100AB,=GB100BP,=GB100CSW,=GB100GGC,=GB100GGM,=GB100HD,=GB100LB,=GB100LSG,=GB100MCV, - =GB100TMD,=GB10SOTA,=GB19CGW,=GB19CW,=GB19SG,=GB1AD,=GB1ATC,=GB1BAF,=GB1BGS,=GB1BPL,=GB1BSW, - =GB1BW,=GB1CCC,=GB1CDS,=GB1CPG,=GB1DS,=GB1FHS,=GB1HAS,=GB1HTW,=GB1JC,=GB1LSG,=GB1LW,=GB1OOC, - =GB1PCA,=GB1PCS,=GB1PD,=GB1PGW,=GB1PJ,=GB1PLL,=GB1SEA,=GB1SL,=GB1SPN,=GB1SSL,=GB1TDS,=GB1WAA, - =GB1WIW,=GB1WSM,=GB2000SET,=GB2003SET,=GB200HNT,=GB250TMB,=GB250TT,=GB2ADU,=GB2BEF,=GB2BGG, - =GB2BOM,=GB2BOW,=GB2BPM,=GB2BYF,=GB2CC,=GB2CI,=GB2COB,=GB2CR,=GB2CRS,=GB2DWR,=GB2EI,=GB2FC, - =GB2FLB,=GB2GGM,=GB2GLS,=GB2GOL,=GB2GSG,=GB2GVA,=GB2HDG,=GB2IMD,=GB2LBR,=GB2LM,=GB2LNP,=GB2LSA, - =GB2LSA/LH,=GB2LSH,=GB2MD,=GB2MGY,=GB2MIL,=GB2MMC,=GB2MOP,=GB2NF,=GB2NPH,=GB2NPL,=GB2OOA,=GB2PRC, - =GB2RFS,=GB2RTB,=GB2SAC,=GB2SCD,=GB2SCP,=GB2SFM,=GB2SIP,=GB2SLA,=GB2TD,=GB2TD/LH,=GB2TTA,=GB2VK, - =GB2WAA,=GB2WHO,=GB2WNA,=GB2WSF,=GB2WT,=GB3HLS,=GB3LMW,=GB4ADU,=GB4AFS,=GB4AOS,=GB4BB,=GB4BOJ, - =GB4BPL,=GB4BPL/LH,=GB4BPL/P,=GB4BPR,=GB4BRS/P,=GB4BSG,=GB4CI,=GB4CTC,=GB4EUL,=GB4FAA,=GB4GM, - =GB4GSS,=GB4HFH,=GB4HI,=GB4HLB,=GB4HMD,=GB4HMM,=GB4MBC,=GB4MD,=GB4MDH,=GB4MDI,=GB4MJS,=GB4MPI, - =GB4MUU,=GB4NDG,=GB4NPL,=GB4NTB,=GB4ON,=GB4OST,=GB4PAT,=GB4PCS,=GB4PD,=GB4POW,=GB4RC,=GB4RME, - =GB4RSL,=GB4SDD,=GB4SLC,=GB4SSP,=GB4SUB,=GB4TMS,=GB4UKG,=GB4VJD,=GB4WT,=GB4WWI,=GB4XT,=GB50ABS, - =GB50EVS,=GB50RSC,=GB50SGP,=GB5AC,=GB5FI,=GB5GEO,=GB5IMD,=GB5MD,=GB5ONG,=GB5PSJ,=GB5SIP,=GB5WT, - =GB60DITP,=GB60ER,=GB60PW,=GB60SPS,=GB60VLY,=GB65BTF,=GB6AC,=GB6BLB,=GB6CRI,=GB6GGM,=GB6OQA, - =GB6ORA,=GB6PLB,=GB6RNLI,=GB6SPD,=GB6TS,=GB6TSG,=GB6WT,=GB6WWT,=GB70BTF,=GB750CC,=GB75ATC,=GB75BB, - =GB8CCC,=GB8HI,=GB8MD,=GB8MG,=GB8OAE,=GB8OQE,=GB8RAF,=GB8WOW,=GB8WT,=GB90RSGB/62,=GB90RSGB/72, - =GB9GGM,=GC4BRS/LH,=GG100ACD,=GG100ANG,=GG100CPG,=GG100RGG,=GG100SG,=GO0DIV,=GO0EZQ,=GO0EZY, - =GO0JEQ,=GO0MNP,=GO0MNP/P,=GO0NPL,=GO0PLB,=GO0PNI,=GO0PUP,=GO0VKW,=GO0VML,=GO0VSW,=GO1DPL,=GO1IOT, - =GO1JFV,=GO1MVL,=GO1PKM,=GO3PLB,=GO3UOF,=GO3UOF/M,=GO3XJQ,=GO4BKG,=GO4BLE,=GO4CQZ,=GO4DTQ,=GO4GTI, - =GO4JKR,=GO4JUN,=GO4JUW,=GO4MVA,=GO4NOO,=GO4OKT,=GO4SUE,=GO4SUE/P,=GO4TNZ,=GO4WXM,=GO6IMS,=GO6NKG, - =GO6UKO,=GO7DWR,=GO7SBO,=GO7VJK,=GO7VQD,=GO8BQK,=GO8IQC,=GO8JOY,=GO8OKR,=GQ0ANA,=GQ0DIV,=GQ0JEQ, - =GQ0JRF,=GQ0MNO,=GQ0MNP,=GQ0NPL,=GQ0PUP,=GQ0RYT,=GQ0SLM,=GQ0TQM,=GQ0VKW,=GQ0VML,=GQ0VSW,=GQ0WVL, - =GQ1FKY,=GQ1FOA/P,=GQ1IOT,=GQ1JFV,=GQ1MVL,=GQ1NRS,=GQ1WRV,=GQ1ZKN,=GQ3IRK,=GQ3PLB,=GQ3SB,=GQ3UOF, - =GQ3VEN,=GQ3VKL,=GQ3WSU,=GQ3XJA,=GQ3XJQ,=GQ4BKG,=GQ4BLE,=GQ4CQZ,=GQ4EZW,=GQ4GSH,=GQ4GTI,=GQ4IIL, - =GQ4JKR,=GQ4JUN,=GQ4JUW,=GQ4LZP,=GQ4MVA,=GQ4NOO,=GQ4OKT,=GQ4SUE,=GQ4VNS,=GQ4VZJ,=GQ4WXM,=GQ4WXM/P, - =GQ6IMS,=GQ6ITJ,=GQ6NKG,=GQ6UKO,=GQ7BQK,=GQ7DWR,=GQ7FBV,=GQ7SBO,=GQ7UNJ,=GQ7UNV,=GQ7VJK,=GQ7VQD, - =GQ8BQK,=GQ8IQC,=GQ8JOY,=GQ8OKR,=GR0ANA,=GR0DIV,=GR0DSP,=GR0HUS,=GR0JEQ,=GR0MYY,=GR0NPL,=GR0PSV, - =GR0RYT,=GR0SYN,=GR0TKX,=GR0VKW,=GR0WGK,=GR1FJI,=GR1HNG,=GR1LFX,=GR1LHV,=GR1MCD,=GR1SGG,=GR1WVY, - =GR1YQM,=GR3SB,=GR3SFC,=GR3TKH,=GR3UOF,=GR3XJQ,=GR4BKG,=GR4BLE,=GR4CQZ,=GR4GNY,=GR4GTI,=GR4HZA, - =GR4JUN,=GR4JUW,=GR4OGO,=GR4SUE,=GR4VSS/P,=GR4XXJ,=GR4ZOM,=GR5PH,=GR6NKG,=GR6SIX,=GR6STK,=GR6UKO, - =GR6ZDH,=GR7AAV,=GR7HOC,=GR7NAU,=GR7TKZ,=GR7UNV,=GR7VQD,=GR8BQK,=GR8IQC,=GR8OGI,=GR8TRO,=GV0ANA, - =GV0DCK,=GV0DIV,=GV0EME,=GV0FRE,=GV0MNP,=GV0NPL,=GV1FKY,=GV1IOT,=GV1JFV,=GV1NBW,=GV1YQM,=GV3ATZ, - =GV3TJE/P,=GV3UOF,=GV3WEZ,=GV3XJQ,=GV4BKG,=GV4BRS,=GV4CQZ,=GV4JKR,=GV4JQP,=GV4NQJ,=GV4PUC,=GV6BRC, - =GV6JPC,=GV6NKG,=GV7UNV,=GV7VJK,=GV8IQC,=GW0AWT/2K,=GW0GEI/2K,=GW0GIH/2K,=GW0MNO/2K,=GW0VSW/2K, - =GW3JXN/2K,=GW3KJN/2K,=GW4IIL/2K,=GW4VHP/2K,=M2000Y/97A,=MO0AQZ,=MO0ATI,=MO0COE,=MO0CVT,=MO0EQL, - =MO0EZQ,=MO0GXE,=MO0HCX,=MO0IBZ,=MO0IML,=MO0KLW,=MO0LDJ,=MO0LLK,=MO0LUK,=MO0LZZ,=MO0MAU,=MO0MUM, - =MO0MWZ,=MO0OWW,=MO0SGD,=MO0SGR,=MO0TBB,=MO0TMI,=MO0TTU,=MO0UPH,=MO0VVO,=MO1CFA,=MO1CFN,=MO3DAO, - =MO3DQB,=MO3GKI,=MO3OJA,=MO3PUU,=MO3RNI,=MO3UEZ,=MO3WPH,=MO3YVO,=MO3ZCO,=MO6DVP,=MO6GWK,=MO6GWR, - =MO6GWR/P,=MO6MAU,=MO6PAM,=MO6PLC,=MO6PUT,=MO6SEF,=MO6TBD,=MO6TBP,=MO6WLB,=MQ0AQZ,=MQ0ATI,=MQ0AWW, - =MQ0CDO,=MQ0CNA,=MQ0CVT,=MQ0DHF,=MQ0EQL,=MQ0GXE,=MQ0GYV,=MQ0HCX,=MQ0IBZ,=MQ0IML,=MQ0LDJ,=MQ0LLK, - =MQ0LUK,=MQ0LZZ,=MQ0MAU,=MQ0MUM,=MQ0MWA,=MQ0MWZ,=MQ0OWW,=MQ0PAD,=MQ0RHD,=MQ0SGD,=MQ0SGR,=MQ0TBB, - =MQ0TMI,=MQ0TTU,=MQ0UPH,=MQ0UPH/P,=MQ0VVO,=MQ0XMC/P,=MQ1CFA,=MQ1CFN,=MQ1EYO/P,=MQ1LCR,=MQ3DAO, - =MQ3EPA,=MQ3GKI,=MQ3JAT,=MQ3NDB,=MQ3OJA,=MQ3USK,=MQ3WPH,=MQ3ZCB/P,=MQ5AND,=MQ5EPA,=MQ5VZW,=MQ6DVP, - =MQ6KLL,=MQ6MAU,=MQ6PAM,=MQ6PLC,=MQ6RHD,=MQ6SEF,=MQ6TBD,=MQ6TBP,=MR0AQZ,=MR0BXJ,=MR0CVT,=MR0GUK, - =MR0GXE,=MR0IDX,=MR0JGE,=MR0LAO,=MR0LDJ,=MR0MAU,=MR0RLD,=MR0TTR,=MR0TTU,=MR0YAD,=MR0ZAP,=MR1CFN, - =MR1EAA,=MR1LCR,=MR1MAJ/P,=MR1MDH,=MR3AVB,=MR3AVC,=MR3CBF,=MR3NYR,=MR3OBL,=MR3SET/P,=MR3UFN, - =MR3XZP,=MR3YKL,=MR3YLO,=MR3YVO,=MR3ZCB/P,=MR5HOC,=MR6ADZ,=MR6KDA,=MR6VHF,=MR6YDP,=MV0AEL,=MV0BLM, - =MV0EDX,=MV0GWT,=MV0GXE,=MV0HGY/P,=MV0IML,=MV0LLK,=MV0PJJ,=MV0PJJ/P,=MV0RRD,=MV0SGD,=MV0SGR, - =MV0TBB,=MV0TDQ,=MV0UAA,=MV0USK,=MV0VRQ,=MV0WYN,=MV1CFA,=MV1CFN,=MV1EYP/P,=MV3RNI,=MV6CQN,=MV6GWR, - =MV6GWR/P,=MV6URC,=MV6ZOL,=MW0CND/2K,=MW0DHF/LH,=MW5AAM/2K,=MW5GOL/LH; + =GB0BVL,=GB0BYL,=GB0CAC,=GB0CCE,=GB0CEW,=GB0CFD,=GB0CGG,=GB0CLC,=GB0CQD,=GB0CSA,=GB0CSR,=GB0CVA, + =GB0DFD,=GB0DMT,=GB0DS,=GB0DVP,=GB0FHD,=GB0FHI,=GB0GDD,=GB0GIW,=GB0GLV,=GB0GMD,=GB0GRM,=GB0HEL, + =GB0HGC,=GB0HLT,=GB0HMM,=GB0HMT,=GB0KF,=GB0L,=GB0LBG,=GB0LM,=GB0LVF,=GB0MFH,=GB0MIW,=GB0ML, + =GB0MPA,=GB0MUU,=GB0MWL,=GB0NAW,=GB0NEW,=GB0NG,=GB0NLC,=GB0PBR,=GB0PEM,=GB0PGG,=GB0PLB,=GB0PLL, + =GB0PSG,=GB0RME,=GB0ROC,=GB0RPO,=GB0RS,=GB0RSC,=GB0RSF,=GB0RWM,=GB0SDD,=GB0SGC,=GB0SH,=GB0SH/LH, + =GB0SOA,=GB0SPE,=GB0SPS,=GB0TD,=GB0TPR,=GB0TS,=GB0TTT,=GB0VCA,=GB0VK,=GB0WHH,=GB0WHR,=GB0WIW, + =GB0WUL,=GB0YG,=GB100AB,=GB100BP,=GB100CSW,=GB100GGC,=GB100GGM,=GB100HD,=GB100LB,=GB100LSG, + =GB100MCV,=GB100TMD,=GB10SOTA,=GB19CGW,=GB19CW,=GB19SG,=GB1AD,=GB1ATC,=GB1BAF,=GB1BGS,=GB1BPL, + =GB1BSW,=GB1BW,=GB1CCC,=GB1CDS,=GB1CPG,=GB1DS,=GB1FHS,=GB1HAS,=GB1HTW,=GB1JC,=GB1LSG,=GB1LW, + =GB1OOC,=GB1PCA,=GB1PCS,=GB1PD,=GB1PGW,=GB1PJ,=GB1PLL,=GB1SEA,=GB1SL,=GB1SPN,=GB1SSL,=GB1TDS, + =GB1WAA,=GB1WIW,=GB1WSM,=GB2000SET,=GB2003SET,=GB200HNT,=GB250TMB,=GB250TT,=GB2ADU,=GB2BEF, + =GB2BGG,=GB2BOM,=GB2BOW,=GB2BPM,=GB2BYF,=GB2CC,=GB2CI,=GB2COB,=GB2CR,=GB2CRS,=GB2DWR,=GB2EI, + =GB2FC,=GB2FLB,=GB2GGM,=GB2GLS,=GB2GOL,=GB2GSG,=GB2GVA,=GB2HDG,=GB2IMD,=GB2LBR,=GB2LM,=GB2LNP, + =GB2LSA,=GB2LSA/LH,=GB2LSH,=GB2MD,=GB2MGY,=GB2MIL,=GB2MLM,=GB2MMC,=GB2MOP,=GB2NF,=GB2NPH,=GB2NPL, + =GB2OOA,=GB2ORM,=GB2PRC,=GB2RFS,=GB2RTB,=GB2SAC,=GB2SCD,=GB2SCP,=GB2SFM,=GB2SIP,=GB2SLA,=GB2TD, + =GB2TD/LH,=GB2TTA,=GB2VK,=GB2WAA,=GB2WHO,=GB2WNA,=GB2WSF,=GB2WT,=GB3HLS,=GB3LMW,=GB4ADU,=GB4AFS, + =GB4AOS,=GB4BB,=GB4BOJ,=GB4BPL,=GB4BPL/LH,=GB4BPL/P,=GB4BPR,=GB4BRS/P,=GB4BSG,=GB4CI,=GB4CTC, + =GB4EUL,=GB4FAA,=GB4GM,=GB4GSS,=GB4HFH,=GB4HI,=GB4HLB,=GB4HMD,=GB4HMM,=GB4MBC,=GB4MD,=GB4MDH, + =GB4MDI,=GB4MJS,=GB4MPI,=GB4MUU,=GB4NDG,=GB4NPL,=GB4NTB,=GB4ON,=GB4OST,=GB4PAT,=GB4PCS,=GB4PD, + =GB4POW,=GB4RC,=GB4RME,=GB4RSL,=GB4SDD,=GB4SLC,=GB4SSP,=GB4SUB,=GB4TMS,=GB4UKG,=GB4VJD,=GB4WT, + =GB4WWI,=GB4XT,=GB50ABS,=GB50EVS,=GB50RSC,=GB50SGP,=GB5AC,=GB5FI,=GB5GEO,=GB5IMD,=GB5MD,=GB5ONG, + =GB5PSJ,=GB5SIP,=GB5WT,=GB60DITP,=GB60ER,=GB60PW,=GB60SPS,=GB60VLY,=GB65BTF,=GB6AC,=GB6BLB, + =GB6CRI,=GB6GGM,=GB6OQA,=GB6ORA,=GB6PLB,=GB6RNLI,=GB6SPD,=GB6TS,=GB6TSG,=GB6WT,=GB6WWT,=GB70BTF, + =GB750CC,=GB75ATC,=GB75BB,=GB8CCC,=GB8HI,=GB8MD,=GB8MG,=GB8ND,=GB8OAE,=GB8OQE,=GB8RAF,=GB8WOW, + =GB8WT,=GB90RSGB/62,=GB90RSGB/72,=GB9GGM,=GC4BRS/LH,=GG100ACD,=GG100ANG,=GG100CPG,=GG100RGG, + =GG100SG,=GO0DIV,=GO0EZQ,=GO0EZY,=GO0JEQ,=GO0MNP,=GO0MNP/P,=GO0NPL,=GO0PLB,=GO0PNI,=GO0PUP, + =GO0VKW,=GO0VML,=GO0VSW,=GO1DPL,=GO1IOT,=GO1JFV,=GO1MVL,=GO1PKM,=GO3PLB,=GO3UOF,=GO3UOF/M,=GO3XJQ, + =GO4BKG,=GO4BLE,=GO4CQZ,=GO4DTQ,=GO4GTI,=GO4JKR,=GO4JUN,=GO4JUW,=GO4MVA,=GO4NOO,=GO4OKT,=GO4SUE, + =GO4SUE/P,=GO4TNZ,=GO4WXM,=GO6IMS,=GO6NKG,=GO6UKO,=GO7DWR,=GO7SBO,=GO7VJK,=GO7VQD,=GO8BQK,=GO8IQC, + =GO8JOY,=GO8OKR,=GQ0ANA,=GQ0DIV,=GQ0JEQ,=GQ0JRF,=GQ0MNO,=GQ0MNP,=GQ0NPL,=GQ0PUP,=GQ0RYT,=GQ0SLM, + =GQ0TQM,=GQ0VKW,=GQ0VML,=GQ0VSW,=GQ0WVL,=GQ1FKY,=GQ1FOA/P,=GQ1IOT,=GQ1JFV,=GQ1MVL,=GQ1NRS,=GQ1WRV, + =GQ1ZKN,=GQ3IRK,=GQ3PLB,=GQ3SB,=GQ3UOF,=GQ3VEN,=GQ3VKL,=GQ3WSU,=GQ3XJA,=GQ3XJQ,=GQ4BKG,=GQ4BLE, + =GQ4CQZ,=GQ4EZW,=GQ4GSH,=GQ4GTI,=GQ4IIL,=GQ4JKR,=GQ4JUN,=GQ4JUW,=GQ4LZP,=GQ4MVA,=GQ4NOO,=GQ4OKT, + =GQ4SUE,=GQ4VNS,=GQ4VZJ,=GQ4WXM,=GQ4WXM/P,=GQ6IMS,=GQ6ITJ,=GQ6NKG,=GQ6UKO,=GQ7BQK,=GQ7DWR,=GQ7FBV, + =GQ7SBO,=GQ7UNJ,=GQ7UNV,=GQ7VJK,=GQ7VQD,=GQ8BQK,=GQ8IQC,=GQ8JOY,=GQ8OKR,=GR0ANA,=GR0DIV,=GR0DSP, + =GR0HUS,=GR0JEQ,=GR0MYY,=GR0NPL,=GR0PSV,=GR0RYT,=GR0SYN,=GR0TKX,=GR0VKW,=GR0WGK,=GR1FJI,=GR1HNG, + =GR1LFX,=GR1LHV,=GR1MCD,=GR1SGG,=GR1WVY,=GR1YQM,=GR3SB,=GR3SFC,=GR3TKH,=GR3UOF,=GR3XJQ,=GR4BKG, + =GR4BLE,=GR4CQZ,=GR4GNY,=GR4GTI,=GR4HZA,=GR4JUN,=GR4JUW,=GR4OGO,=GR4SUE,=GR4VSS/P,=GR4XXJ,=GR4ZOM, + =GR5PH,=GR6NKG,=GR6SIX,=GR6STK,=GR6UKO,=GR6ZDH,=GR7AAV,=GR7HOC,=GR7NAU,=GR7TKZ,=GR7UNV,=GR7VQD, + =GR8BQK,=GR8IQC,=GR8OGI,=GR8TRO,=GV0ANA,=GV0DCK,=GV0DIV,=GV0EME,=GV0FRE,=GV0MNP,=GV0NPL,=GV1FKY, + =GV1IOT,=GV1JFV,=GV1NBW,=GV1YQM,=GV3ATZ,=GV3TJE/P,=GV3UOF,=GV3WEZ,=GV3XJQ,=GV4BKG,=GV4BRS,=GV4CQZ, + =GV4JKR,=GV4JQP,=GV4NQJ,=GV4PUC,=GV6BRC,=GV6JPC,=GV6NKG,=GV7UNV,=GV7VJK,=GV8IQC,=GW0AWT/2K, + =GW0GEI/2K,=GW0GIH/2K,=GW0MNO/2K,=GW0VSW/2K,=GW3JXN/2K,=GW3KJN/2K,=GW4IIL/2K,=GW4VHP/2K, + =M2000Y/97A,=MO0AQZ,=MO0ATI,=MO0COE,=MO0CVT,=MO0EQL,=MO0EZQ,=MO0GXE,=MO0HCX,=MO0IBZ,=MO0IML, + =MO0KLW,=MO0LDJ,=MO0LLK,=MO0LUK,=MO0LZZ,=MO0MAU,=MO0MUM,=MO0MWZ,=MO0OWW,=MO0SGD,=MO0SGR,=MO0TBB, + =MO0TMI,=MO0TTU,=MO0UPH,=MO0VVO,=MO1CFA,=MO1CFN,=MO3DAO,=MO3DQB,=MO3GKI,=MO3OJA,=MO3PUU,=MO3RNI, + =MO3UEZ,=MO3WPH,=MO3YVO,=MO3ZCO,=MO6DVP,=MO6GWK,=MO6GWR,=MO6GWR/P,=MO6MAU,=MO6PAM,=MO6PLC,=MO6PUT, + =MO6SEF,=MO6TBD,=MO6TBP,=MO6WLB,=MQ0AQZ,=MQ0ATI,=MQ0AWW,=MQ0CDO,=MQ0CNA,=MQ0CVT,=MQ0DHF,=MQ0EQL, + =MQ0GXE,=MQ0GYV,=MQ0HCX,=MQ0IBZ,=MQ0IML,=MQ0LDJ,=MQ0LLK,=MQ0LUK,=MQ0LZZ,=MQ0MAU,=MQ0MUM,=MQ0MWA, + =MQ0MWZ,=MQ0OWW,=MQ0PAD,=MQ0RHD,=MQ0SGD,=MQ0SGR,=MQ0TBB,=MQ0TMI,=MQ0TTU,=MQ0UPH,=MQ0UPH/P,=MQ0VVO, + =MQ0XMC/P,=MQ1CFA,=MQ1CFN,=MQ1EYO/P,=MQ1LCR,=MQ3DAO,=MQ3EPA,=MQ3GKI,=MQ3JAT,=MQ3NDB,=MQ3OJA, + =MQ3USK,=MQ3WPH,=MQ3ZCB/P,=MQ5AND,=MQ5EPA,=MQ5VZW,=MQ6DVP,=MQ6KLL,=MQ6MAU,=MQ6PAM,=MQ6PLC,=MQ6RHD, + =MQ6SEF,=MQ6TBD,=MQ6TBP,=MR0AQZ,=MR0BXJ,=MR0CVT,=MR0GUK,=MR0GXE,=MR0IDX,=MR0JGE,=MR0LAO,=MR0LDJ, + =MR0MAU,=MR0RLD,=MR0TTR,=MR0TTU,=MR0YAD,=MR0ZAP,=MR1CFN,=MR1EAA,=MR1LCR,=MR1MAJ/P,=MR1MDH,=MR3AVB, + =MR3AVC,=MR3CBF,=MR3NYR,=MR3OBL,=MR3SET/P,=MR3UFN,=MR3XZP,=MR3YKL,=MR3YLO,=MR3YVO,=MR3ZCB/P, + =MR5HOC,=MR6ADZ,=MR6KDA,=MR6VHF,=MR6YDP,=MV0AEL,=MV0BLM,=MV0EDX,=MV0GWT,=MV0GXE,=MV0HGY/P,=MV0IML, + =MV0LLK,=MV0PJJ,=MV0PJJ/P,=MV0RRD,=MV0SGD,=MV0SGR,=MV0TBB,=MV0TDQ,=MV0UAA,=MV0USK,=MV0VRQ,=MV0WYN, + =MV1CFA,=MV1CFN,=MV1EYP/P,=MV3RNI,=MV6CQN,=MV6GWR,=MV6GWR/P,=MV6URC,=MV6ZOL,=MW0CND/2K,=MW0DHF/LH, + =MW5AAM/2K,=MW5GOL/LH; Solomon Islands: 28: 51: OC: -9.00: -160.00: -11.0: H4: H4,=H40/H44RK; Temotu Province: 32: 51: OC: -10.72: -165.80: -11.0: H40: @@ -1075,10 +1077,10 @@ Italy: 15: 28: EU: 42.82: -12.58: -1.0: I: =IQ6PS/LH,=IQ6SB/LGH,=IQ6SB/LGT,=IQ6SB/LH,=IQ6VP/J,=IZ6ASI/LH,=IZ6ASI/N,=IZ6CDI/O,=IZ6RWD/O, =IZ6TGS/LH,=IZ6TGS/N, =4U13FEB,=4U1GSC,=4U20B,=4U24OCT,=4U29MAY,=4U73B,=I7PXV/LH,=I7PXV/P/LH,=I7XUW/MI/224,=II7IAOI/N, - =II7PT/C,=II7PT/D,=II7PT/E,=II7PT/F,=II7PT/G,=II7PT/H,=II7PT/L,=II8ICN/NAVY,=IK7JWX/LH,=IQ7ML/J, - =IQ7ML/LH,=IQ7QK/LH,=IU7SCT/J,=IZ2DPX/7/LH,=IZ7DKA/YL,=IZ7KDX/LH,=IZ7LDC/LH, - =IK2RLS/8/LH,=IK8TEO/N,=IQ8OM/N,=IQ8PC/BWL,=IQ8XS/CEU,=IW8FFG/J,=IZ8AJQ/LGT,=IZ8AJQ/LH, - =IZ8DBJ/LGT,=IZ8DBJ/LH,=IZ8FMU/KR,=IZ8IZK/YL,=IZ8JPV/N,=IZ8QNX/N, + =II7PT/C,=II7PT/D,=II7PT/E,=II7PT/F,=II7PT/G,=II7PT/H,=II7PT/L,=II8ICN/NAVY,=IK7JWX/LH,=IK7SHC/MT, + =IQ7ML/J,=IQ7ML/LH,=IQ7QK/LH,=IU7SCT/J,=IZ2DPX/7/LH,=IZ7DKA/YL,=IZ7KDX/LH,=IZ7LDC/LH, + =IK2RLS/8/LH,=IK8IJN/I/US,=IK8TEO/N,=IQ8OM/N,=IQ8PC/BWL,=IQ8XS/CEU,=IU8CEU/8CZ,=IW8FFG/J, + =IZ8AJQ/LGT,=IZ8AJQ/LH,=IZ8DBJ/LGT,=IZ8DBJ/LH,=IZ8FMU/KR,=IZ8IZK/YL,=IZ8JPV/N,=IZ8QNX/N, =IA5/IW3ILP/L, =IC8/DJ5AA/LH, =IN3IKF/J,=IN3TJK/YL, @@ -1089,9 +1091,9 @@ Sardinia: 15: 28: EU: 40.15: -9.27: -1.0: IS: IM0,IS,IW0U,IW0V,IW0W,IW0X,IW0Y,IW0Z,=II0C,=II0EUDX,=II0FDR,=II0IAML,=II0ICH,=II0IDP,=II0M,=II0P, =II0PAX,=II0RSB,=II0SB,=II0SB/MM,=II0SRT/P,=II3EUDX,=IQ0AG,=IQ0AG/P,=IQ0AH,=IQ0AH/P,=IQ0AI, =IQ0AI/P,=IQ0AK,=IQ0AK/P,=IQ0AL,=IQ0AL/P,=IQ0AM,=IQ0AM/P,=IQ0EH,=IQ0EH/P,=IQ0HO,=IQ0ID,=IQ0ID/P, - =IQ0NU,=IQ0NU/P,=IQ0NV,=IQ0NV/P,=IQ0OG,=IQ0OH,=IQ0QP,=IQ0QP/LH,=IQ0QP/P,=IQ0QP/WW,=IQ0SS,=IQ0SS/P, - =IQ0US,=IQ0UT,=IQ0XP,=IR0EO,=IR0FOC,=IR0IDP,=IR0IDP/1,=IR0IDP/2,=IR0IDP/3,=IR0LVC,=IR0MDC, - =IS0/4Z5KJ/LH,=IS0ICE/N,=IS0IGV/N,=IS0PGF/N,=IS0SDX/N,=IW0HRI,=IY0GA,=IY0NV; + =IQ0NU,=IQ0NU/P,=IQ0NV,=IQ0NV/P,=IQ0OG,=IQ0OH,=IQ0QP,=IQ0QP/LH,=IQ0QP/P,=IQ0SS,=IQ0SS/P,=IQ0US, + =IQ0UT,=IQ0XP,=IR0EO,=IR0FOC,=IR0IDP,=IR0IDP/1,=IR0IDP/2,=IR0IDP/3,=IR0LVC,=IR0MDC,=IS0/4Z5KJ/LH, + =IS0/DL5SE/LH,=IS0ICE/N,=IS0IGV/N,=IS0PGF/N,=IS0SDX/N,=IW0HRI,=IY0GA,=IY0NV; Sicily: 15: 28: EU: 37.50: -14.00: -1.0: *IT9: IB9,ID9,IE9,IF9,II9,IJ9,IO9,IQ9,IR9,IT9,IU9,IW9,IY9,=IQ1QQ/9,=IT9CHU/J,=IT9CKA/CA,=IT9CLY/JZK, =IT9DSA/CA,=IT9DTU/N,=IT9GDS/WLK,=IT9HBS/LH,=IT9JZK/WLK,=IT9KKE/JZK,=IT9MRM/N,=IT9MRZ/LH, @@ -1116,12 +1118,11 @@ Japan: 25: 45: AS: 36.40: -138.38: -9.0: JA: =JD1BHH/6; Minami Torishima: 27: 90: OC: 24.28: -153.97: -10.0: JD/m: =8J1ZIU/JD1,=8N1AQ/JD1,=JA6GXK/JD1,=JD1/8J1ZIU,=JD1/8N1AQ,=JD1/JA6GXK,=JD1/JD1BIC,=JD1/JD1YAB, - =JD1/JE6XPF,=JD1/JF3CTR,=JD1/JF7MTO,=JD1/JF8HIQ,=JD1/JG1RHN,=JD1/JG8NQJ,=JD1/JH1EFP,=JD1/JI2AMA, - =JD1/JK1PCN,=JD1/JR8XXQ,=JD1BCK,=JD1BIC/JD1,=JD1BME,=JD1BMM,=JD1BND,=JD1M/JI2AMA,=JD1YAA, - =JD1YAB/JD1,=JD1YBJ,=JF3CTR/JD1,=JF7MTO/JD1,=JF8HIQ/JD1,=JG1RHN/JD1,=JG8NQJ/JD1,=JH1EFP/JD1, - =JI2AMA/JD1,=JK1PCN/JD1,=JR8XXQ/JD1; + =JD1/JE6XPF,=JD1/JF3CTR,=JD1/JF8HIQ,=JD1/JG1RHN,=JD1/JG8NQJ,=JD1/JH1EFP,=JD1/JI2AMA,=JD1/JK1PCN, + =JD1/JR8XXQ,=JD1BCK,=JD1BIC/JD1,=JD1BME,=JD1BMM,=JD1BND,=JD1M/JI2AMA,=JD1YAA,=JD1YAB/JD1,=JD1YBJ, + =JF3CTR/JD1,=JF8HIQ/JD1,=JG1RHN/JD1,=JG8NQJ/JD1,=JH1EFP/JD1,=JI2AMA/JD1,=JK1PCN/JD1,=JR8XXQ/JD1; Ogasawara: 27: 45: AS: 27.05: -142.20: -9.0: JD/o: - JD1,=8N1OGA; + JD1,=8N1OGA,=JR7ISY/JD1/CM; Mongolia: 23: 32: AS: 46.77: -102.17: -7.0: JT: JT,JU,JV, JT2[33],JU2[33],JV2[33], @@ -1129,7 +1130,7 @@ Mongolia: 23: 32: AS: 46.77: -102.17: -7.0: JT: Svalbard: 40: 18: EU: 78.00: -16.00: -1.0: JW: JW; Bear Island: 40: 18: EU: 74.43: -19.08: -1.0: *JW/b: - =JW0BEA,=JW1I,=JW2US,=JW2VOA,=JW3FL,=JW4GHA,=JW4JSA,=JW4LN,=JW5RIA,=JW7VW,=JW9JKA; + =JW/LB2PG,=JW0BEA,=JW1I,=JW2US,=JW2VOA,=JW3FL,=JW4GHA,=JW4JSA,=JW4LN,=JW5RIA,=JW7VW,=JW9JKA; Jan Mayen: 40: 18: EU: 71.05: 8.28: 1.0: JX: JX; Jordan: 20: 39: AS: 31.18: -36.42: -2.0: JY: @@ -1146,32 +1147,33 @@ United States: 05: 08: NA: 37.53: 91.67: 5.0: K: WE0(4)[7],WF0(4)[7],WG0(4)[7],WI0(4)[7],WJ0(4)[7],WK0(4)[7],WM0(4)[7],WN0(4)[7],WO0(4)[7], WQ0(4)[7],WR0(4)[7],WS0(4)[7],WT0(4)[7],WU0(4)[7],WV0(4)[7],WW0(4)[7],WX0(4)[7],WY0(4)[7], WZ0(4)[7],=AH2BW(4)[7],=AH2BY(4)[7],=AH6ES/0(4)[7],=AH6FY(4)[7],=AH6MD(4)[7],=AH6N(4)[7], - =AH6N/0(4)[7],=AH6O(4)[7],=AH6OS(4)[7],=AH6RS(4)[7],=AL0G(4)[7],=AL3E(4)[7],=AL6E(4)[7], - =AL7BX(4)[7],=AL7EK(4)[7],=AL7FU(4)[7],=AL7GQ(4)[7],=AL7NY(4)[7],=AL7O/0(4)[7],=AL7OC(4)[7], - =AL7QQ(4)[7],=AL7QQ/P(4)[7],=AL9DB(4)[7],=KH0EX(4)[7],=KH2CZ(4)[7],=KH2JK(4)[7],=KH2OP(4)[7], - =KH2OP/0(4)[7],=KH2SL(4)[7],=KH6DM(4)[7],=KH6GN(4)[7],=KH6HNL(4)[7],=KH6HTV/0(4)[7],=KH6JEM(4)[7], - =KH6JFH(4)[7],=KH6NM(4)[7],=KH6NR(4)[7],=KH6RON(4)[7],=KH6SB(4)[7],=KH6TL(4)[7],=KH6UC(4)[7], - =KH6VHF(4)[7],=KH6VO(4)[7],=KH7AL/M(4)[7],=KH7AL/P(4)[7],=KH7BU(4)[7],=KH7GF(4)[7],=KH7HA(4)[7], - =KH7HY(4)[7],=KH7QI(4)[7],=KH7QJ(4)[7],=KH7QT(4)[7],=KH8CW(4)[7],=KL0DW(4)[7],=KL0EQ(4)[7], - =KL0FOX(4)[7],=KL0GP(4)[7],=KL0GQ(4)[7],=KL0MW(4)[7],=KL0SV(4)[7],=KL0UP(4)[7],=KL0WIZ(4)[7], - =KL1HT(4)[7],=KL1IF(4)[7],=KL1IF/M(4)[7],=KL1J(4)[7],=KL1LD(4)[7],=KL1PV(4)[7],=KL1TU(4)[7], - =KL1V/M(4)[7],=KL1VN(4)[7],=KL2A/0(4)[7],=KL2FU(4)[7],=KL2GR(4)[7],=KL2QO(4)[7],=KL2SX(4)[7], - =KL3LY(4)[7],=KL3MA(4)[7],=KL3MB(4)[7],=KL3MC(4)[7],=KL3QS(4)[7],=KL3SM(4)[7],=KL3VN(4)[7], - =KL4IY(4)[7],=KL4JN(4)[7],=KL7DE(4)[7],=KL7DTJ(4)[7],=KL7ED(4)[7],=KL7EP(4)[7],=KL7EP/0(4)[7], - =KL7GKY/0(4)[7],=KL7GLK(4)[7],=KL7GLK/0(4)[7],=KL7GLK/B(4)[7],=KL7IXI(4)[7],=KL7JGJ(4)[7], - =KL7JIE(4)[7],=KL7JIM(4)[7],=KL7JR/0(4)[7],=KL7MH(4)[7],=KL7MV(4)[7],=KL7NW(4)[7],=KL7PE/M(4)[7], - =KL7QW(4)[7],=KL7QW/0(4)[7],=KL7RH(4)[7],=KL7RZ(4)[7],=KL7SB/0(4)[7],=KL7SFD(4)[7],=KL7UV(4)[7], - =KL7XH(4)[7],=KL7YL(4)[7],=KL7YY/0(4)[7],=KL7ZD(4)[7],=KL7ZT(4)[7],=KP4ATV(4)[7],=KP4MLF(4)[7], - =KP4XZ(4)[7],=NH2LH(4)[7],=NH6CF(4)[7],=NH6WF(4)[7],=NH7CY(4)[7],=NH7FI(4)[7],=NH7XM(4)[7], - =NH7ZH(4)[7],=NL7AS(4)[7],=NL7BU(4)[7],=NL7CQ(4)[7],=NL7CQ/0(4)[7],=NL7FF(4)[7],=NL7FU(4)[7], - =NL7XT(4)[7],=NL7XU(4)[7],=NP4AI(4)[7],=NP4AI/0(4)[7],=VE4AGT/M(4)[7],=VE4XC/M(4)[7],=WH2S(4)[7], - =WH6AKZ(4)[7],=WH6ANH(4)[7],=WH6BLT(4)[7],=WH6BUL(4)[7],=WH6BXD(4)[7],=WH6CTU(4)[7],=WH6CUE(4)[7], - =WH6CYM(4)[7],=WH6CZI(4)[7],=WH6CZU(4)[7],=WH6DCJ(4)[7],=WH6DUV(4)[7],=WH6EAE(4)[7],=WH6ENX(4)[7], - =WH6LR(4)[7],=WH6MS(4)[7],=WH6QS(4)[7],=WH7DA(4)[7],=WH7IR(4)[7],=WH7MZ(4)[7],=WH7PV(4)[7], - =WH9AAH(4)[7],=WL0JF(4)[7],=WL1ON(4)[7],=WL7AEC(4)[7],=WL7AJA(4)[7],=WL7ANY(4)[7],=WL7ATK(4)[7], - =WL7BT(4)[7],=WL7CEG(4)[7],=WL7CLI(4)[7],=WL7CPW(4)[7],=WL7CQF(4)[7],=WL7CRT(4)[7],=WL7CY(4)[7], - =WL7JB(4)[7],=WL7LZ(4)[7],=WL7LZ/M(4)[7],=WL7RV(4)[7],=WL7YM(4)[7],=WP2B/0(4)[7],=WP3QH(4)[7], - =WP3Y(4)[7],=WP4BTQ(4)[7],=WP4GQR(4)[7],=WP4LC(4)[7],=WP4NPV(4)[7], + =AH6N/0(4)[7],=AH6O(4)[7],=AH6OS(4)[7],=AH6PC(4)[7],=AH6RS(4)[7],=AL0G(4)[7],=AL3E(4)[7], + =AL6E(4)[7],=AL7BX(4)[7],=AL7EK(4)[7],=AL7FU(4)[7],=AL7GQ(4)[7],=AL7NY(4)[7],=AL7O/0(4)[7], + =AL7OC(4)[7],=AL7QQ(4)[7],=AL7QQ/P(4)[7],=AL9DB(4)[7],=KH0EX(4)[7],=KH2CZ(4)[7],=KH2JK(4)[7], + =KH2OP(4)[7],=KH2OP/0(4)[7],=KH2SL(4)[7],=KH6DM(4)[7],=KH6GN(4)[7],=KH6HNL(4)[7],=KH6HTV/0(4)[7], + =KH6JEM(4)[7],=KH6JFH(4)[7],=KH6NM(4)[7],=KH6NR(4)[7],=KH6RON(4)[7],=KH6SB(4)[7],=KH6TL(4)[7], + =KH6UC(4)[7],=KH6VHF(4)[7],=KH6VO(4)[7],=KH7AL/M(4)[7],=KH7AL/P(4)[7],=KH7BU(4)[7],=KH7GF(4)[7], + =KH7HA(4)[7],=KH7HY(4)[7],=KH7QI(4)[7],=KH7QJ(4)[7],=KH7QT(4)[7],=KH8CW(4)[7],=KL0DW(4)[7], + =KL0EQ(4)[7],=KL0FOX(4)[7],=KL0GP(4)[7],=KL0GQ(4)[7],=KL0MW(4)[7],=KL0N(4)[7],=KL0SV(4)[7], + =KL0UP(4)[7],=KL0WIZ(4)[7],=KL1HT(4)[7],=KL1IF(4)[7],=KL1IF/M(4)[7],=KL1J(4)[7],=KL1LD(4)[7], + =KL1PV(4)[7],=KL1TU(4)[7],=KL1V/M(4)[7],=KL1VN(4)[7],=KL2A/0(4)[7],=KL2FU(4)[7],=KL2GR(4)[7], + =KL2QO(4)[7],=KL2SX(4)[7],=KL3LY(4)[7],=KL3MA(4)[7],=KL3MB(4)[7],=KL3MC(4)[7],=KL3QS(4)[7], + =KL3SM(4)[7],=KL3VN(4)[7],=KL4IY(4)[7],=KL4JN(4)[7],=KL7DE(4)[7],=KL7DTJ(4)[7],=KL7ED(4)[7], + =KL7EP(4)[7],=KL7EP/0(4)[7],=KL7GKY/0(4)[7],=KL7GLK(4)[7],=KL7GLK/0(4)[7],=KL7GLK/B(4)[7], + =KL7IXI(4)[7],=KL7JGJ(4)[7],=KL7JIE(4)[7],=KL7JIM(4)[7],=KL7JR/0(4)[7],=KL7MH(4)[7],=KL7MV(4)[7], + =KL7NW(4)[7],=KL7PE/M(4)[7],=KL7QW(4)[7],=KL7QW/0(4)[7],=KL7RH(4)[7],=KL7RZ(4)[7],=KL7SB/0(4)[7], + =KL7SFD(4)[7],=KL7UV(4)[7],=KL7XH(4)[7],=KL7YL(4)[7],=KL7YY/0(4)[7],=KL7ZD(4)[7],=KL7ZT(4)[7], + =KP4ATV(4)[7],=KP4MLF(4)[7],=KP4XZ(4)[7],=NH2LH(4)[7],=NH6CF(4)[7],=NH6WF(4)[7],=NH7CY(4)[7], + =NH7FI(4)[7],=NH7XM(4)[7],=NH7ZH(4)[7],=NL7AS(4)[7],=NL7BU(4)[7],=NL7CQ(4)[7],=NL7CQ/0(4)[7], + =NL7FF(4)[7],=NL7FU(4)[7],=NL7XT(4)[7],=NL7XU(4)[7],=NP4AI(4)[7],=NP4AI/0(4)[7],=VE4AGT/M(4)[7], + =VE4XC/M(4)[7],=WH2S(4)[7],=WH6AKZ(4)[7],=WH6ANH(4)[7],=WH6BLT(4)[7],=WH6BUL(4)[7],=WH6BXD(4)[7], + =WH6CTU(4)[7],=WH6CUE(4)[7],=WH6CYM(4)[7],=WH6CZI(4)[7],=WH6CZU(4)[7],=WH6DCJ(4)[7],=WH6DUV(4)[7], + =WH6EAE(4)[7],=WH6ENX(4)[7],=WH6LR(4)[7],=WH6MS(4)[7],=WH6QS(4)[7],=WH7DA(4)[7],=WH7IR(4)[7], + =WH7MZ(4)[7],=WH7PV(4)[7],=WH9AAH(4)[7],=WL0JF(4)[7],=WL1ON(4)[7],=WL7AEC(4)[7],=WL7AJA(4)[7], + =WL7ANY(4)[7],=WL7ATK(4)[7],=WL7BRV(4)[7],=WL7BT(4)[7],=WL7CEG(4)[7],=WL7CLI(4)[7],=WL7CPW(4)[7], + =WL7CQF(4)[7],=WL7CRT(4)[7],=WL7CY(4)[7],=WL7JB(4)[7],=WL7LZ(4)[7],=WL7LZ/M(4)[7],=WL7RV(4)[7], + =WL7YM(4)[7],=WP2B/0(4)[7],=WP3QH(4)[7],=WP3Y(4)[7],=WP4BTQ(4)[7],=WP4GQR(4)[7],=WP4LC(4)[7], + =WP4NPV(4)[7], =AH2V(5)[8],=AH2W(5)[8],=AH6BV(5)[8],=AL0A(5)[8],=AL1O(5)[8],=AL4V(5)[8],=AL6L(5)[8],=AL6M(5)[8], =AL7EL(5)[8],=AL7LV(5)[8],=AL7QS(5)[8],=AL8E(5)[8],=KH2AB(5)[8],=KH2EH(5)[8],=KH6GR(5)[8], =KH6HZ(5)[8],=KH6IKI(5)[8],=KH6JKQ(5)[8],=KH6JUK(5)[8],=KH6RF(5)[8],=KH6RF/1(5)[8],=KH6RF/M(5)[8], @@ -1192,71 +1194,72 @@ United States: 05: 08: NA: 37.53: 91.67: 5.0: K: =WP4OJK(5)[8], =AH0BR(5)[8],=AH2AL(5)[8],=AH2O(5)[8],=AH6K(5)[8],=AL0Q(5)[8],=AL0Y(5)[8],=AL2O(5)[8], =AL7RG(5)[8],=KH2CW(5)[8],=KH2P(5)[8],=KH2R(5)[8],=KH4AG(5)[8],=KH6ALN(5)[8],=KH6HO(5)[8], - =KH7GA(5)[8],=KH7JO(5)[8],=KH7JO/2(5)[8],=KH7MX(5)[8],=KH7NE(5)[8],=KH8ZK(5)[8],=KL0WV(5)[8], - =KL1A/2(5)[8],=KL2A/2(5)[8],=KL2NP(5)[8],=KL3ET(5)[8],=KL3ZC(5)[8],=KL4T(5)[8],=KL7DL(5)[8], - =KL7GB(5)[8],=KL7JCQ(5)[8],=KL7NL/2(5)[8],=KL7TJZ(5)[8],=KL7USI/2(5)[8],=KL7WA(5)[8],=KL9ER(5)[8], - =KP2NP(5)[8],=KP3AK(5)[8],=KP3LM(5)[8],=KP3Y(5)[8],=KP4AK(5)[8],=KP4CML(5)[8],=KP4GEG(5)[8], - =KP4HR(5)[8],=KP4I(5)[8],=KP4JDR(5)[8],=KP4JMP(5)[8],=NH2DC(5)[8],=NH7NA(5)[8],=NH7TN(5)[8], - =NL7CC(5)[8],=NP2AQ(5)[8],=NP2GI(5)[8],=NP3D(5)[8],=NP3E(5)[8],=NP3EU(5)[8],=NP3I(5)[8], - =NP3KH(5)[8],=NP3KP(5)[8],=NP4H(5)[8],=NP4IR(5)[8],=NP4IT(5)[8],=NP4JQ(5)[8],=WH0W(5)[8], - =WH2C(5)[8],=WH6DLD(5)[8],=WH6DNT(5)[8],=WH6UO(5)[8],=WL2NAS(5)[8],=WL7OG(5)[8],=WP2AAO(5)[8], - =WP3MD(5)[8],=WP3VU(5)[8],=WP3WZ(5)[8],=WP4AR(5)[8],=WP4BMU(5)[8],=WP4BNI(5)[8],=WP4BZ(5)[8], - =WP4CB(5)[8],=WP4DME(5)[8],=WP4DWH(5)[8],=WP4EHY(5)[8],=WP4EYW(5)[8],=WP4HLY(5)[8],=WP4HXS(5)[8], - =WP4KXX(5)[8],=WP4LYI(5)[8],=WP4MQN(5)[8],=WP4MRB(5)[8],=WP4MUJ(5)[8],=WP4MYM(5)[8],=WP4MZO(5)[8], - =WP4NBS(5)[8],=WP4NZF(5)[8],=WP4OCO(5)[8],=WP4OPY(5)[8],=WP4PZB(5)[8],=WP4R(5)[8],=XL3TUV/M(5)[8], - =XM3CMB/M(5)[8], + =KH7GA(5)[8],=KH7JO(5)[8],=KH7JO/2(5)[8],=KH7MX(5)[8],=KH7NE(5)[8],=KH8ZK(5)[8],=KL0TV(5)[8], + =KL0WV(5)[8],=KL1A/2(5)[8],=KL2A/2(5)[8],=KL2NP(5)[8],=KL3ET(5)[8],=KL3ZC(5)[8],=KL4T(5)[8], + =KL7DL(5)[8],=KL7GB(5)[8],=KL7JCQ(5)[8],=KL7NL/2(5)[8],=KL7TJZ(5)[8],=KL7USI/2(5)[8],=KL7WA(5)[8], + =KL9ER(5)[8],=KP2NP(5)[8],=KP3AK(5)[8],=KP3LM(5)[8],=KP3Y(5)[8],=KP4AK(5)[8],=KP4CML(5)[8], + =KP4GEG(5)[8],=KP4HR(5)[8],=KP4I(5)[8],=KP4JDR(5)[8],=KP4JMP(5)[8],=NH2DC(5)[8],=NH7NA(5)[8], + =NH7TN(5)[8],=NL7CC(5)[8],=NP2AQ(5)[8],=NP2GI(5)[8],=NP3D(5)[8],=NP3E(5)[8],=NP3EU(5)[8], + =NP3I(5)[8],=NP3KH(5)[8],=NP3KP(5)[8],=NP4H(5)[8],=NP4IR(5)[8],=NP4IT(5)[8],=NP4JQ(5)[8], + =WH0W(5)[8],=WH2C(5)[8],=WH6DLD(5)[8],=WH6DNT(5)[8],=WH6UO(5)[8],=WL2NAS(5)[8],=WL7OG(5)[8], + =WP2AAO(5)[8],=WP3MD(5)[8],=WP3VU(5)[8],=WP3WZ(5)[8],=WP4AR(5)[8],=WP4BMU(5)[8],=WP4BNI(5)[8], + =WP4BZ(5)[8],=WP4CB(5)[8],=WP4DME(5)[8],=WP4DWH(5)[8],=WP4EHY(5)[8],=WP4EYW(5)[8],=WP4HLY(5)[8], + =WP4HXS(5)[8],=WP4KXX(5)[8],=WP4LYI(5)[8],=WP4MQN(5)[8],=WP4MRB(5)[8],=WP4MUJ(5)[8],=WP4MYM(5)[8], + =WP4MZO(5)[8],=WP4NBS(5)[8],=WP4NZF(5)[8],=WP4OCO(5)[8],=WP4OPY(5)[8],=WP4PZB(5)[8],=WP4R(5)[8], + =XL3TUV/M(5)[8],=XM3CMB/M(5)[8], =4U1WB(5)[8],=AH6AX(5)[8],=AH6FF/3(5)[8],=AH6R(5)[8],=AH6Z(5)[8],=AH7J(5)[8],=AH8P(5)[8], =AL1B(5)[8],=AL1B/M(5)[8],=AL7AB(5)[8],=AL7NN(5)[8],=AL7NN/3(5)[8],=AL7RS(5)[8],=KH2GM(5)[8], =KH2JX(5)[8],=KH2SX(5)[8],=KH6CUJ(5)[8],=KH6ILR/3(5)[8],=KH6JGA(5)[8],=KH6LDO(5)[8],=KH8CN(5)[8], =KL1HA(5)[8],=KL1KM(5)[8],=KL2A(5)[8],=KL2A/3(5)[8],=KL2BV(5)[8],=KL2XF(5)[8],=KL3JC(5)[8], =KL7FD(5)[8],=KL7GLK/3(5)[8],=KL7HR/3(5)[8],=KL7JO(5)[8],=KL7OF/3(5)[8],=KL7OQ(5)[8], - =KL9A/3(5)[8],=KP3M(5)[8],=KP4CAM(5)[8],=KP4FCF(5)[8],=KP4GB/3(5)[8],=KP4IP(5)[8],=KP4JB(5)[8], - =KP4N(5)[8],=KP4N/3(5)[8],=KP4PRI(5)[8],=KP4UV(5)[8],=KP4WR(5)[8],=KP4XO(5)[8],=KP4XX(5)[8], - =KP4YH(5)[8],=NH2CW(5)[8],=NH2LA(5)[8],=NH6BD(5)[8],=NH6BK(5)[8],=NH7C(5)[8],=NH7CC(5)[8], - =NH7YK(5)[8],=NL7CK(5)[8],=NL7PJ(5)[8],=NL7V/3(5)[8],=NL7XM(5)[8],=NL7XM/B(5)[8],=NP2EP(5)[8], - =NP2G(5)[8],=NP2NC(5)[8],=NP3ES(5)[8],=NP3IP(5)[8],=NP3YN(5)[8],=NP4RH(5)[8],=NP4YZ(5)[8], - =WH6ADS(5)[8],=WH6AWO(5)[8],=WH6AZN(5)[8],=WH6CE(5)[8],=WH6CTO(5)[8],=WH6DOA(5)[8],=WH6ECO(5)[8], - =WH6EEL(5)[8],=WH6EEN(5)[8],=WH6EIJ(5)[8],=WH6IO(5)[8],=WH6OB(5)[8],=WH7F(5)[8],=WH7USA(5)[8], - =WL7AF(5)[8],=WL7L(5)[8],=WP2XX(5)[8],=WP3BX(5)[8],=WP3CC(5)[8],=WP3EC(5)[8],=WP3FK(5)[8], - =WP4DA(5)[8],=WP4DCK(5)[8],=WP4EDM(5)[8],=WP4GJL(5)[8],=WP4HRK(5)[8],=WP4HSZ(5)[8],=WP4KDN(5)[8], - =WP4KKX(5)[8],=WP4LEM(5)[8],=WP4LNP(5)[8],=WP4MNV(5)[8],=WP4MSX(5)[8],=WP4MYN(5)[8],=WP4OSQ(5)[8], - =WP4PPH(5)[8],=WP4PQN(5)[8],=WP4PUR(5)[8],=WP4PYL(5)[8],=WP4PYM(5)[8],=WP4PYN(5)[8],=WP4PYT(5)[8], - =WP4PYU(5)[8],=WP4PYV(5)[8],=WP4PYZ(5)[8],=WP4PZA(5)[8], + =KL9A/3(5)[8],=KP3M(5)[8],=KP4BEP(5)[8],=KP4CAM(5)[8],=KP4FCF(5)[8],=KP4GB/3(5)[8],=KP4IP(5)[8], + =KP4JB(5)[8],=KP4N(5)[8],=KP4N/3(5)[8],=KP4PRI(5)[8],=KP4UV(5)[8],=KP4WR(5)[8],=KP4XO(5)[8], + =KP4XX(5)[8],=KP4YH(5)[8],=NH2CW(5)[8],=NH2LA(5)[8],=NH6BD(5)[8],=NH6BK(5)[8],=NH7C(5)[8], + =NH7CC(5)[8],=NH7YK(5)[8],=NL7CK(5)[8],=NL7PJ(5)[8],=NL7V/3(5)[8],=NL7XM(5)[8],=NL7XM/B(5)[8], + =NP2EP(5)[8],=NP2G(5)[8],=NP2NC(5)[8],=NP3ES(5)[8],=NP3IP(5)[8],=NP3YN(5)[8],=NP4RH(5)[8], + =NP4YZ(5)[8],=WH6ADS(5)[8],=WH6AWO(5)[8],=WH6AZN(5)[8],=WH6CE(5)[8],=WH6CTO(5)[8],=WH6DOA(5)[8], + =WH6ECO(5)[8],=WH6EEL(5)[8],=WH6EEN(5)[8],=WH6EIJ(5)[8],=WH6IO(5)[8],=WH6OB(5)[8],=WH7F(5)[8], + =WH7USA(5)[8],=WL7AF(5)[8],=WL7L(5)[8],=WP2XX(5)[8],=WP3BX(5)[8],=WP3CC(5)[8],=WP3EC(5)[8], + =WP3FK(5)[8],=WP4DA(5)[8],=WP4DCK(5)[8],=WP4EDM(5)[8],=WP4GJL(5)[8],=WP4HRK(5)[8],=WP4HSZ(5)[8], + =WP4KDN(5)[8],=WP4KKX(5)[8],=WP4LEM(5)[8],=WP4LNP(5)[8],=WP4MNV(5)[8],=WP4MSX(5)[8],=WP4MYN(5)[8], + =WP4OSQ(5)[8],=WP4PPH(5)[8],=WP4PQN(5)[8],=WP4PUR(5)[8],=WP4PYL(5)[8],=WP4PYM(5)[8],=WP4PYN(5)[8], + =WP4PYT(5)[8],=WP4PYU(5)[8],=WP4PYV(5)[8],=WP4PYZ(5)[8],=WP4PZA(5)[8], =AH0BV(5)[8],=AH0BZ(5)[8],=AH0G(5)[8],=AH2AJ(5)[8],=AH2AM(5)[8],=AH2AV/4(5)[8],=AH2DF(5)[8], =AH2EB(5)[8],=AH2X(5)[8],=AH3B(5)[8],=AH6AL(5)[8],=AH6AT(5)[8],=AH6AU(5)[8],=AH6BJ(5)[8], =AH6C(5)[8],=AH6EZ/4(5)[8],=AH6FX(5)[8],=AH6FX/4(5)[8],=AH6IC(5)[8],=AH6IJ(5)[8],=AH6IW(5)[8], =AH6JH(5)[8],=AH6JN/4(5)[8],=AH6JN/M(5)[8],=AH6KS(5)[8],=AH6KT(5)[8],=AH6KT/4(5)[8],=AH6LS(5)[8], - =AH6OB(5)[8],=AH6TI(5)[8],=AH7I/4(5)[8],=AH7MI(5)[8],=AH8B(5)[8],=AH8M(5)[8],=AH8M/M(5)[8], - =AH8T(5)[8],=AL0I(5)[8],=AL1A(5)[8],=AL3G(5)[8],=AL3M(5)[8],=AL4T(5)[8],=AL4T/4(5)[8],=AL4U(5)[8], - =AL4X(5)[8],=AL5A(5)[8],=AL7AL(5)[8],=AL7AM(5)[8],=AL7BA(5)[8],=AL7GF(5)[8],=AL7GK(5)[8], - =AL7HG(5)[8],=AL7HW(5)[8],=AL7HW/4(5)[8],=AL7IS(5)[8],=AL7KT(5)[8],=AL7LH(5)[8],=AL7NL(5)[8], - =AL7NM(5)[8],=AL7NS(5)[8],=AL7NS/140(5)[8],=AL7PL(5)[8],=AL7QI(5)[8],=AL7RE(5)[8],=AL7RL(5)[8], - =G8ERJ(5)[8],=GO4AZM(5)[8],=GQ4AZM(5)[8],=GR4AZM(5)[8],=KH0CW(5)[8],=KH0HR(5)[8],=KH0NI(5)[8], - =KH0ZZ(5)[8],=KH2BX(5)[8],=KH2D(5)[8],=KH2D/4(5)[8],=KH2GUM/P(5)[8],=KH2HB(5)[8],=KH2KD(5)[8], - =KH2N(5)[8],=KH2NC(5)[8],=KH2PM(5)[8],=KH2RL(5)[8],=KH2TI(5)[8],=KH2UV(5)[8],=KH2VM(5)[8], - =KH3AC(5)[8],=KH3AG(5)[8],=KH6AME(5)[8],=KH6CG(5)[8],=KH6CG/4(5)[8],=KH6CT(5)[8],=KH6ED(5)[8], - =KH6HHS(5)[8],=KH6HHS/4(5)[8],=KH6HOW(5)[8],=KH6ILR(5)[8],=KH6ILR/4(5)[8],=KH6ITI(5)[8], - =KH6JAU(5)[8],=KH6JIM(5)[8],=KH6JJD(5)[8],=KH6JNW(5)[8],=KH6JUA(5)[8],=KH6M(5)[8],=KH6M/4(5)[8], - =KH6M/M(5)[8],=KH6MT(5)[8],=KH6MT/4(5)[8],=KH6NC(5)[8],=KH6NI(5)[8],=KH6OU(5)[8],=KH6POI(5)[8], - =KH6PU(5)[8],=KH6RP(5)[8],=KH6TY(5)[8],=KH6TY/R(5)[8],=KH6UN(5)[8],=KH6XH(5)[8],=KH7DM(5)[8], - =KH7DY(5)[8],=KH7FC(5)[8],=KH7GZ(5)[8],=KH7HJ/4(5)[8],=KH7OC(5)[8],=KH7OV(5)[8],=KH7WK(5)[8], - =KH7XS/4(5)[8],=KH7XT(5)[8],=KH7ZC(5)[8],=KH8BB(5)[8],=KH8DO(5)[8],=KL0AG(5)[8],=KL0IP(5)[8], - =KL0KC(5)[8],=KL0KE/4(5)[8],=KL0L(5)[8],=KL0MG(5)[8],=KL0MP(5)[8],=KL0S(5)[8],=KL0SS(5)[8], - =KL0TY(5)[8],=KL0VU(5)[8],=KL0WF(5)[8],=KL1KP(5)[8],=KL1NK(5)[8],=KL1NS(5)[8],=KL1OK(5)[8], - =KL1PA(5)[8],=KL1SS(5)[8],=KL2AK(5)[8],=KL2CX(5)[8],=KL2EY(5)[8],=KL2GG(5)[8],=KL2GP(5)[8], - =KL2HV(5)[8],=KL2MQ(5)[8],=KL2UQ(5)[8],=KL2XI(5)[8],=KL3EV(5)[8],=KL3HG(5)[8],=KL3IA(5)[8], - =KL3KB(5)[8],=KL3KG(5)[8],=KL3NR(5)[8],=KL3WM(5)[8],=KL3X(5)[8],=KL3XB(5)[8],=KL4CO(5)[8], - =KL4DD(5)[8],=KL4H(5)[8],=KL4J(5)[8],=KL5X(5)[8],=KL5YJ(5)[8],=KL7A(5)[8],=KL7DA(5)[8], - =KL7DA/4(5)[8],=KL7FO(5)[8],=KL7GLL(5)[8],=KL7H(5)[8],=KL7HIM(5)[8],=KL7HNY(5)[8],=KL7HOT(5)[8], - =KL7HQW(5)[8],=KL7HX(5)[8],=KL7IEK(5)[8],=KL7IKZ(5)[8],=KL7IV(5)[8],=KL7IVY(5)[8],=KL7IWF(5)[8], - =KL7JDS(5)[8],=KL7JR(5)[8],=KL7LS(5)[8],=KL7MJ(5)[8],=KL7NCO(5)[8],=KL7NL(5)[8],=KL7NL/4(5)[8], - =KL7NT(5)[8],=KL7P/4(5)[8],=KL7QH(5)[8],=KL7QU(5)[8],=KL7SR(5)[8],=KL7USI/4(5)[8],=KL7XA(5)[8], - =KL9A/1(5)[8],=KP2AF(5)[8],=KP2AV(5)[8],=KP2AV/4(5)[8],=KP2CH(5)[8],=KP2CR(5)[8],=KP2L(5)[8], - =KP2L/4(5)[8],=KP2N(5)[8],=KP2R(5)[8],=KP2U(5)[8],=KP2US(5)[8],=KP2V(5)[8],=KP3AMG(5)[8], - =KP3BL(5)[8],=KP3BP(5)[8],=KP3J(5)[8],=KP3SK(5)[8],=KP3U(5)[8],=KP4AD(5)[8],=KP4AOD(5)[8], - =KP4AOD/4(5)[8],=KP4BEC(5)[8],=KP4BM(5)[8],=KP4BOB(5)[8],=KP4CBP(5)[8],=KP4CEL(5)[8],=KP4CH(5)[8], - =KP4CPP(5)[8],=KP4CSJ(5)[8],=KP4CSZ(5)[8],=KP4CW(5)[8],=KP4CZ(5)[8],=KP4DAC(5)[8],=KP4DDS(5)[8], - =KP4DPQ(5)[8],=KP4DQS(5)[8],=KP4EDL(5)[8],=KP4EIA(5)[8],=KP4EMY(5)[8],=KP4ENK(5)[8],=KP4EOR(5)[8], + =AH6OB(5)[8],=AH6TI(5)[8],=AH7I(5)[8],=AH7I/4(5)[8],=AH7MI(5)[8],=AH8B(5)[8],=AH8M(5)[8], + =AH8M/M(5)[8],=AH8T(5)[8],=AL0I(5)[8],=AL1A(5)[8],=AL3G(5)[8],=AL3M(5)[8],=AL4T(5)[8], + =AL4T/4(5)[8],=AL4U(5)[8],=AL4X(5)[8],=AL5A(5)[8],=AL7AL(5)[8],=AL7AM(5)[8],=AL7BA(5)[8], + =AL7GF(5)[8],=AL7GK(5)[8],=AL7HG(5)[8],=AL7HW(5)[8],=AL7HW/4(5)[8],=AL7IS(5)[8],=AL7KT(5)[8], + =AL7LH(5)[8],=AL7NL(5)[8],=AL7NM(5)[8],=AL7NS(5)[8],=AL7NS/140(5)[8],=AL7PL(5)[8],=AL7QI(5)[8], + =AL7RE(5)[8],=AL7RL(5)[8],=G8ERJ(5)[8],=GO4AZM(5)[8],=GQ4AZM(5)[8],=GR4AZM(5)[8],=KH0CW(5)[8], + =KH0HR(5)[8],=KH0NI(5)[8],=KH0ZZ(5)[8],=KH2BX(5)[8],=KH2D(5)[8],=KH2D/4(5)[8],=KH2GUM/P(5)[8], + =KH2HB(5)[8],=KH2KD(5)[8],=KH2N(5)[8],=KH2NC(5)[8],=KH2PM(5)[8],=KH2RL(5)[8],=KH2TI(5)[8], + =KH2UV(5)[8],=KH2VM(5)[8],=KH3AC(5)[8],=KH3AG(5)[8],=KH6AME(5)[8],=KH6CG(5)[8],=KH6CG/4(5)[8], + =KH6CT(5)[8],=KH6ED(5)[8],=KH6HHS(5)[8],=KH6HHS/4(5)[8],=KH6HOW(5)[8],=KH6ILR(5)[8], + =KH6ILR/4(5)[8],=KH6ITI(5)[8],=KH6JAU(5)[8],=KH6JIM(5)[8],=KH6JJD(5)[8],=KH6JNW(5)[8], + =KH6JUA(5)[8],=KH6KZ(5)[8],=KH6M(5)[8],=KH6M/4(5)[8],=KH6M/M(5)[8],=KH6MT(5)[8],=KH6MT/4(5)[8], + =KH6NC(5)[8],=KH6NI(5)[8],=KH6OU(5)[8],=KH6POI(5)[8],=KH6PU(5)[8],=KH6RP(5)[8],=KH6TY(5)[8], + =KH6TY/R(5)[8],=KH6UN(5)[8],=KH6XH(5)[8],=KH7DM(5)[8],=KH7DY(5)[8],=KH7FC(5)[8],=KH7GZ(5)[8], + =KH7HJ/4(5)[8],=KH7OC(5)[8],=KH7OV(5)[8],=KH7WK(5)[8],=KH7XS/4(5)[8],=KH7XT(5)[8],=KH7ZC(5)[8], + =KH8BB(5)[8],=KH8DO(5)[8],=KL0AG(5)[8],=KL0IP(5)[8],=KL0KC(5)[8],=KL0KE/4(5)[8],=KL0L(5)[8], + =KL0MG(5)[8],=KL0MP(5)[8],=KL0S(5)[8],=KL0SS(5)[8],=KL0TY(5)[8],=KL0VU(5)[8],=KL0WF(5)[8], + =KL1KP(5)[8],=KL1NK(5)[8],=KL1NS(5)[8],=KL1OK(5)[8],=KL1PA(5)[8],=KL1SS(5)[8],=KL2AK(5)[8], + =KL2CX(5)[8],=KL2EY(5)[8],=KL2GG(5)[8],=KL2GP(5)[8],=KL2HV(5)[8],=KL2MQ(5)[8],=KL2NN(5)[8], + =KL2UQ(5)[8],=KL2XI(5)[8],=KL3EV(5)[8],=KL3HG(5)[8],=KL3IA(5)[8],=KL3KB(5)[8],=KL3KG(5)[8], + =KL3NR(5)[8],=KL3WM(5)[8],=KL3X(5)[8],=KL3XB(5)[8],=KL4CO(5)[8],=KL4DD(5)[8],=KL4H(5)[8], + =KL4J(5)[8],=KL5X(5)[8],=KL5YJ(5)[8],=KL7A(5)[8],=KL7DA(5)[8],=KL7DA/4(5)[8],=KL7FO(5)[8], + =KL7GLL(5)[8],=KL7H(5)[8],=KL7HIM(5)[8],=KL7HNY(5)[8],=KL7HOT(5)[8],=KL7HQW(5)[8],=KL7HX(5)[8], + =KL7IEK(5)[8],=KL7IKZ(5)[8],=KL7IV(5)[8],=KL7IVY(5)[8],=KL7IWF(5)[8],=KL7JDS(5)[8],=KL7JR(5)[8], + =KL7LS(5)[8],=KL7MJ(5)[8],=KL7NCO(5)[8],=KL7NL(5)[8],=KL7NL/4(5)[8],=KL7NT(5)[8],=KL7P/4(5)[8], + =KL7QH(5)[8],=KL7QU(5)[8],=KL7SR(5)[8],=KL7USI/4(5)[8],=KL7XA(5)[8],=KL9A/1(5)[8],=KP2AF(5)[8], + =KP2AV(5)[8],=KP2AV/4(5)[8],=KP2CH(5)[8],=KP2CR(5)[8],=KP2L(5)[8],=KP2L/4(5)[8],=KP2N(5)[8], + =KP2R(5)[8],=KP2U(5)[8],=KP2US(5)[8],=KP2V(5)[8],=KP3AMG(5)[8],=KP3BL(5)[8],=KP3BP(5)[8], + =KP3J(5)[8],=KP3SK(5)[8],=KP3U(5)[8],=KP4AD(5)[8],=KP4AOD(5)[8],=KP4AOD/4(5)[8],=KP4BBN(5)[8], + =KP4BEC(5)[8],=KP4BM(5)[8],=KP4BOB(5)[8],=KP4CBP(5)[8],=KP4CEL(5)[8],=KP4CH(5)[8],=KP4CPP(5)[8], + =KP4CSJ(5)[8],=KP4CSZ(5)[8],=KP4CW(5)[8],=KP4CZ(5)[8],=KP4DAC(5)[8],=KP4DDS(5)[8],=KP4DPQ(5)[8], + =KP4DQS(5)[8],=KP4EDL(5)[8],=KP4EIA(5)[8],=KP4EMY(5)[8],=KP4ENK(5)[8],=KP4EOR(5)[8], =KP4EOR/4(5)[8],=KP4ERT(5)[8],=KP4ESC(5)[8],=KP4FBS(5)[8],=KP4FGI(5)[8],=KP4FIR(5)[8], =KP4FJE(5)[8],=KP4FLP(5)[8],=KP4FOF(5)[8],=KP4HE(5)[8],=KP4HF(5)[8],=KP4HN(5)[8],=KP4II(5)[8], =KP4IRI(5)[8],=KP4IT(5)[8],=KP4JC(5)[8],=KP4JCC(5)[8],=KP4JOS(5)[8],=KP4JWR(5)[8],=KP4KA(5)[8], @@ -1269,48 +1272,49 @@ United States: 05: 08: NA: 37.53: 91.67: 5.0: K: =NH6BD/4(5)[8],=NH6E(5)[8],=NH6GE(5)[8],=NH6GR(5)[8],=NH6HX(5)[8],=NH6HX/4(5)[8],=NH6JX(5)[8], =NH6KI(5)[8],=NH6QR(5)[8],=NH6SR(5)[8],=NH6T(5)[8],=NH6TL(5)[8],=NH7AA(5)[8],=NH7AQ(5)[8], =NH7AR(5)[8],=NH7FG(5)[8],=NH7OI(5)[8],=NH7T/4(5)[8],=NH7UN(5)[8],=NH7XN(5)[8],=NL5L(5)[8], - =NL7AJ(5)[8],=NL7AU(5)[8],=NL7AU/4(5)[8],=NL7BV(5)[8],=NL7KX(5)[8],=NL7LO(5)[8],=NL7LR(5)[8], - =NL7LY(5)[8],=NL7MD(5)[8],=NL7MR(5)[8],=NL7OB(5)[8],=NL7OS(5)[8],=NL7P(5)[8],=NL7PV(5)[8], - =NL7U(5)[8],=NL7VV(5)[8],=NL7VX(5)[8],=NL7VX/4(5)[8],=NL7VX/M(5)[8],=NL7YZ(5)[8],=NP2B(5)[8], - =NP2B/4(5)[8],=NP2BB(5)[8],=NP2BW(5)[8],=NP2C(5)[8],=NP2C/4(5)[8],=NP2CB(5)[8],=NP2D(5)[8], - =NP2DJ(5)[8],=NP2EI(5)[8],=NP2FT(5)[8],=NP2GN(5)[8],=NP2GW(5)[8],=NP2HQ(5)[8],=NP2HS(5)[8], - =NP2HW(5)[8],=NP2IE(5)[8],=NP2IF(5)[8],=NP2IJ(5)[8],=NP2IS(5)[8],=NP2IW(5)[8],=NP2IX(5)[8], - =NP2JA(5)[8],=NP2JS(5)[8],=NP2L(5)[8],=NP2LC(5)[8],=NP2MM(5)[8],=NP2MN(5)[8],=NP2MP(5)[8], - =NP2MR(5)[8],=NP2MR/4(5)[8],=NP2O(5)[8],=NP2OL(5)[8],=NP2OO(5)[8],=NP2OR(5)[8],=NP2PA(5)[8], - =NP2R(5)[8],=NP2T(5)[8],=NP2W(5)[8],=NP3AX(5)[8],=NP3BL(5)[8],=NP3CC(5)[8],=NP3CI(5)[8], - =NP3CM(5)[8],=NP3CT(5)[8],=NP3FR(5)[8],=NP3G(5)[8],=NP3HD(5)[8],=NP3HG(5)[8],=NP3HN(5)[8], - =NP3HP(5)[8],=NP3HU(5)[8],=NP3IL(5)[8],=NP3IU(5)[8],=NP3K(5)[8],=NP3KM(5)[8],=NP3MM(5)[8], - =NP3MX(5)[8],=NP3NC(5)[8],=NP3OW(5)[8],=NP3QT(5)[8],=NP3R(5)[8],=NP3ST(5)[8],=NP3TM(5)[8], - =NP3UM(5)[8],=NP3VJ(5)[8],=NP4AS(5)[8],=NP4AV(5)[8],=NP4CC(5)[8],=NP4CK(5)[8],=NP4CV(5)[8], - =NP4DM(5)[8],=NP4EM(5)[8],=NP4GH(5)[8],=NP4GW(5)[8],=NP4J(5)[8],=NP4JL(5)[8],=NP4JU(5)[8], - =NP4KV(5)[8],=NP4M(5)[8],=NP4ND(5)[8],=NP4PF(5)[8],=NP4RJ(5)[8],=NP4SY(5)[8],=NP4TR(5)[8], - =NP4WT(5)[8],=NP4XB(5)[8],=WH2AAT(5)[8],=WH2ABJ(5)[8],=WH2G(5)[8],=WH6A(5)[8],=WH6ACF(5)[8], - =WH6AJS(5)[8],=WH6AQ(5)[8],=WH6AVU(5)[8],=WH6AX(5)[8],=WH6BRQ(5)[8],=WH6CEF(5)[8],=WH6CMT(5)[8], - =WH6CNC(5)[8],=WH6CTC(5)[8],=WH6CXA(5)[8],=WH6CXT(5)[8],=WH6DBX(5)[8],=WH6DMJ(5)[8],=WH6DNF(5)[8], - =WH6DOL(5)[8],=WH6DUJ(5)[8],=WH6DXT(5)[8],=WH6EFI(5)[8],=WH6EIK(5)[8],=WH6EKW(5)[8],=WH6ELG(5)[8], - =WH6ELM(5)[8],=WH6ETE(5)[8],=WH6ETF(5)[8],=WH6FCP(5)[8],=WH6FGK(5)[8],=WH6HA(5)[8],=WH6IF(5)[8], - =WH6IZ(5)[8],=WH6J(5)[8],=WH6L(5)[8],=WH6LE(5)[8],=WH6LE/4(5)[8],=WH6LE/M(5)[8],=WH6LE/P(5)[8], - =WH6NE(5)[8],=WH6WX(5)[8],=WH6YH(5)[8],=WH6YH/4(5)[8],=WH6YM(5)[8],=WH6ZF(5)[8],=WH7GD(5)[8], - =WH7HX(5)[8],=WH7NI(5)[8],=WH7XK(5)[8],=WH7XU(5)[8],=WH7YL(5)[8],=WH7YV(5)[8],=WH7ZM(5)[8], - =WH9AAF(5)[8],=WL7AUL(5)[8],=WL7AX(5)[8],=WL7BAL(5)[8],=WL7CHA(5)[8],=WL7CIB(5)[8],=WL7CKJ(5)[8], - =WL7COL(5)[8],=WL7CQT(5)[8],=WL7CUY(5)[8],=WL7E/4(5)[8],=WL7GV(5)[8],=WL7SR(5)[8],=WL7UN(5)[8], - =WL7WN(5)[8],=WL7YX(5)[8],=WP2AGD(5)[8],=WP2AGO(5)[8],=WP2AHC(5)[8],=WP2AIG(5)[8],=WP2BB(5)[8], - =WP2C(5)[8],=WP2L(5)[8],=WP2MA(5)[8],=WP2P(5)[8],=WP3AY(5)[8],=WP3BC(5)[8],=WP3JQ(5)[8], - =WP3JU(5)[8],=WP3K(5)[8],=WP3LE(5)[8],=WP3MB(5)[8],=WP3ME(5)[8],=WP3NIS(5)[8],=WP3O(5)[8], - =WP3TQ(5)[8],=WP3ZA(5)[8],=WP3ZP(5)[8],=WP4AIE(5)[8],=WP4AIL(5)[8],=WP4AIZ(5)[8],=WP4ALH(5)[8], - =WP4AQK(5)[8],=WP4B(5)[8],=WP4BFP(5)[8],=WP4BGM(5)[8],=WP4BIN(5)[8],=WP4BJS(5)[8],=WP4BK(5)[8], - =WP4BOC(5)[8],=WP4BQV(5)[8],=WP4BXS(5)[8],=WP4CKW(5)[8],=WP4CLS(5)[8],=WP4CMH(5)[8],=WP4DC(5)[8], - =WP4DCB(5)[8],=WP4DFK(5)[8],=WP4DNE(5)[8],=WP4DPX(5)[8],=WP4ENX(5)[8],=WP4EXH(5)[8],=WP4FEI(5)[8], - =WP4FRK(5)[8],=WP4FS(5)[8],=WP4GAK(5)[8],=WP4GFH(5)[8],=WP4GX(5)[8],=WP4GYA(5)[8],=WP4HFZ(5)[8], - =WP4HNN(5)[8],=WP4HOX(5)[8],=WP4IF(5)[8],=WP4IJ(5)[8],=WP4JKO(5)[8],=WP4JQJ(5)[8],=WP4JSR(5)[8], - =WP4JT(5)[8],=WP4KCJ(5)[8],=WP4KDH(5)[8],=WP4KFP(5)[8],=WP4KGI(5)[8],=WP4KI(5)[8],=WP4KJV(5)[8], - =WP4KSK(5)[8],=WP4KTD(5)[8],=WP4LBK(5)[8],=WP4LDG(5)[8],=WP4LDL(5)[8],=WP4LDP(5)[8],=WP4LHA(5)[8], - =WP4MAE(5)[8],=WP4MD(5)[8],=WP4MO(5)[8],=WP4MQF(5)[8],=WP4MWE(5)[8],=WP4MXE(5)[8],=WP4MYG(5)[8], - =WP4MYK(5)[8],=WP4NAI(5)[8],=WP4NAQ(5)[8],=WP4NBF(5)[8],=WP4NBG(5)[8],=WP4NFU(5)[8],=WP4NKU(5)[8], - =WP4NLQ(5)[8],=WP4NQA(5)[8],=WP4NVL(5)[8],=WP4NWW(5)[8],=WP4O/4(5)[8],=WP4O/M(5)[8],=WP4ODR(5)[8], - =WP4OFA(5)[8],=WP4OHJ(5)[8],=WP4OLM(5)[8],=WP4OMG(5)[8],=WP4OMV(5)[8],=WP4ONR(5)[8],=WP4OOI(5)[8], - =WP4OPD(5)[8],=WP4OPF(5)[8],=WP4OPG(5)[8],=WP4OTP(5)[8],=WP4P(5)[8],=WP4PR(5)[8],=WP4PUV(5)[8], - =WP4PWV(5)[8],=WP4PXG(5)[8],=WP4QHU(5)[8],=WP4SW(5)[8],=WP4TD(5)[8],=WP4TX(5)[8],=WP4UM(5)[8], + =NL7AJ(5)[8],=NL7AU(5)[8],=NL7AU/4(5)[8],=NL7BV(5)[8],=NL7KL(5)[8],=NL7KX(5)[8],=NL7LO(5)[8], + =NL7LR(5)[8],=NL7LY(5)[8],=NL7MD(5)[8],=NL7MR(5)[8],=NL7OB(5)[8],=NL7OS(5)[8],=NL7P(5)[8], + =NL7PV(5)[8],=NL7U(5)[8],=NL7VV(5)[8],=NL7VX(5)[8],=NL7VX/4(5)[8],=NL7VX/M(5)[8],=NL7YZ(5)[8], + =NP2B(5)[8],=NP2B/4(5)[8],=NP2BB(5)[8],=NP2BW(5)[8],=NP2C(5)[8],=NP2C/4(5)[8],=NP2CB(5)[8], + =NP2D(5)[8],=NP2DJ(5)[8],=NP2EI(5)[8],=NP2FT(5)[8],=NP2GN(5)[8],=NP2GW(5)[8],=NP2HQ(5)[8], + =NP2HS(5)[8],=NP2HW(5)[8],=NP2IE(5)[8],=NP2IF(5)[8],=NP2IJ(5)[8],=NP2IS(5)[8],=NP2IW(5)[8], + =NP2IX(5)[8],=NP2JA(5)[8],=NP2JS(5)[8],=NP2L(5)[8],=NP2LC(5)[8],=NP2MM(5)[8],=NP2MN(5)[8], + =NP2MP(5)[8],=NP2MR(5)[8],=NP2MR/4(5)[8],=NP2O(5)[8],=NP2OL(5)[8],=NP2OO(5)[8],=NP2OR(5)[8], + =NP2PA(5)[8],=NP2R(5)[8],=NP2T(5)[8],=NP2W(5)[8],=NP3AX(5)[8],=NP3BL(5)[8],=NP3CC(5)[8], + =NP3CI(5)[8],=NP3CM(5)[8],=NP3CT(5)[8],=NP3FR(5)[8],=NP3G(5)[8],=NP3HD(5)[8],=NP3HG(5)[8], + =NP3HN(5)[8],=NP3HP(5)[8],=NP3HU(5)[8],=NP3IL(5)[8],=NP3IU(5)[8],=NP3K(5)[8],=NP3KM(5)[8], + =NP3MM(5)[8],=NP3MX(5)[8],=NP3NC(5)[8],=NP3OW(5)[8],=NP3QT(5)[8],=NP3R(5)[8],=NP3ST(5)[8], + =NP3TM(5)[8],=NP3UM(5)[8],=NP3VJ(5)[8],=NP3WX(5)[8],=NP4AS(5)[8],=NP4AV(5)[8],=NP4CC(5)[8], + =NP4CK(5)[8],=NP4CV(5)[8],=NP4DM(5)[8],=NP4EM(5)[8],=NP4GH(5)[8],=NP4GW(5)[8],=NP4J(5)[8], + =NP4JL(5)[8],=NP4JU(5)[8],=NP4KV(5)[8],=NP4M(5)[8],=NP4ND(5)[8],=NP4PF(5)[8],=NP4RJ(5)[8], + =NP4SY(5)[8],=NP4TR(5)[8],=NP4WT(5)[8],=NP4XB(5)[8],=WH2AAT(5)[8],=WH2ABJ(5)[8],=WH2G(5)[8], + =WH6A(5)[8],=WH6ACF(5)[8],=WH6AJS(5)[8],=WH6AQ(5)[8],=WH6AVU(5)[8],=WH6AX(5)[8],=WH6BRQ(5)[8], + =WH6CEF(5)[8],=WH6CMT(5)[8],=WH6CNC(5)[8],=WH6CTC(5)[8],=WH6CXA(5)[8],=WH6CXT(5)[8],=WH6DBX(5)[8], + =WH6DMJ(5)[8],=WH6DNF(5)[8],=WH6DOL(5)[8],=WH6DUJ(5)[8],=WH6DXT(5)[8],=WH6EFI(5)[8],=WH6EIK(5)[8], + =WH6EKW(5)[8],=WH6ELG(5)[8],=WH6ELM(5)[8],=WH6ETE(5)[8],=WH6ETF(5)[8],=WH6FCP(5)[8],=WH6FGK(5)[8], + =WH6HA(5)[8],=WH6IF(5)[8],=WH6IZ(5)[8],=WH6J(5)[8],=WH6L(5)[8],=WH6LE(5)[8],=WH6LE/4(5)[8], + =WH6LE/M(5)[8],=WH6LE/P(5)[8],=WH6NE(5)[8],=WH6WX(5)[8],=WH6YH(5)[8],=WH6YH/4(5)[8],=WH6YM(5)[8], + =WH6ZF(5)[8],=WH7GD(5)[8],=WH7HX(5)[8],=WH7NI(5)[8],=WH7XK(5)[8],=WH7XU(5)[8],=WH7YL(5)[8], + =WH7YV(5)[8],=WH7ZM(5)[8],=WH9AAF(5)[8],=WL7AUL(5)[8],=WL7AX(5)[8],=WL7BAL(5)[8],=WL7CHA(5)[8], + =WL7CIB(5)[8],=WL7CKJ(5)[8],=WL7COL(5)[8],=WL7CQT(5)[8],=WL7CUY(5)[8],=WL7E/4(5)[8],=WL7GV(5)[8], + =WL7SR(5)[8],=WL7UN(5)[8],=WL7WN(5)[8],=WL7YX(5)[8],=WP2AGD(5)[8],=WP2AGO(5)[8],=WP2AHC(5)[8], + =WP2AIG(5)[8],=WP2BB(5)[8],=WP2C(5)[8],=WP2L(5)[8],=WP2MA(5)[8],=WP2P(5)[8],=WP3AY(5)[8], + =WP3BC(5)[8],=WP3JE(5)[8],=WP3JQ(5)[8],=WP3JU(5)[8],=WP3K(5)[8],=WP3LE(5)[8],=WP3MB(5)[8], + =WP3ME(5)[8],=WP3NIS(5)[8],=WP3O(5)[8],=WP3TQ(5)[8],=WP3ZA(5)[8],=WP3ZP(5)[8],=WP4AIE(5)[8], + =WP4AIL(5)[8],=WP4AIZ(5)[8],=WP4ALH(5)[8],=WP4AQK(5)[8],=WP4B(5)[8],=WP4BFP(5)[8],=WP4BGM(5)[8], + =WP4BIN(5)[8],=WP4BJS(5)[8],=WP4BK(5)[8],=WP4BOC(5)[8],=WP4BQV(5)[8],=WP4BXS(5)[8],=WP4CKW(5)[8], + =WP4CLS(5)[8],=WP4CMH(5)[8],=WP4DC(5)[8],=WP4DCB(5)[8],=WP4DFK(5)[8],=WP4DNE(5)[8],=WP4DPX(5)[8], + =WP4ENX(5)[8],=WP4EXH(5)[8],=WP4FEI(5)[8],=WP4FRK(5)[8],=WP4FS(5)[8],=WP4GAK(5)[8],=WP4GFH(5)[8], + =WP4GX(5)[8],=WP4GYA(5)[8],=WP4HFZ(5)[8],=WP4HNN(5)[8],=WP4HOX(5)[8],=WP4IF(5)[8],=WP4IJ(5)[8], + =WP4JKO(5)[8],=WP4JQJ(5)[8],=WP4JSR(5)[8],=WP4JT(5)[8],=WP4KCJ(5)[8],=WP4KDH(5)[8],=WP4KFP(5)[8], + =WP4KGI(5)[8],=WP4KI(5)[8],=WP4KJV(5)[8],=WP4KSK(5)[8],=WP4KTD(5)[8],=WP4LBK(5)[8],=WP4LDG(5)[8], + =WP4LDL(5)[8],=WP4LDP(5)[8],=WP4LHA(5)[8],=WP4MAE(5)[8],=WP4MD(5)[8],=WP4MO(5)[8],=WP4MQF(5)[8], + =WP4MWE(5)[8],=WP4MXE(5)[8],=WP4MYG(5)[8],=WP4MYK(5)[8],=WP4NAI(5)[8],=WP4NAQ(5)[8],=WP4NBF(5)[8], + =WP4NBG(5)[8],=WP4NFU(5)[8],=WP4NKU(5)[8],=WP4NLQ(5)[8],=WP4NQA(5)[8],=WP4NVL(5)[8],=WP4NWW(5)[8], + =WP4O/4(5)[8],=WP4O/M(5)[8],=WP4ODR(5)[8],=WP4OFA(5)[8],=WP4OHJ(5)[8],=WP4OLM(5)[8],=WP4OMG(5)[8], + =WP4OMV(5)[8],=WP4ONR(5)[8],=WP4OOI(5)[8],=WP4OPD(5)[8],=WP4OPF(5)[8],=WP4OPG(5)[8],=WP4OTP(5)[8], + =WP4OXA(5)[8],=WP4P(5)[8],=WP4PR(5)[8],=WP4PUV(5)[8],=WP4PWV(5)[8],=WP4PXG(5)[8],=WP4QHU(5)[8], + =WP4SW(5)[8],=WP4TD(5)[8],=WP4TX(5)[8],=WP4UC(5)[8],=WP4UM(5)[8], AA5(4)[7],AB5(4)[7],AC5(4)[7],AD5(4)[7],AE5(4)[7],AF5(4)[7],AG5(4)[7],AI5(4)[7],AJ5(4)[7], AK5(4)[7],K5(4)[7],KA5(4)[7],KB5(4)[7],KC5(4)[7],KD5(4)[7],KE5(4)[7],KF5(4)[7],KG5(4)[7], KI5(4)[7],KJ5(4)[7],KK5(4)[7],KM5(4)[7],KN5(4)[7],KO5(4)[7],KQ5(4)[7],KR5(4)[7],KS5(4)[7], @@ -1320,49 +1324,49 @@ United States: 05: 08: NA: 37.53: 91.67: 5.0: K: NW5(4)[7],NX5(4)[7],NY5(4)[7],NZ5(4)[7],W5(4)[7],WA5(4)[7],WB5(4)[7],WC5(4)[7],WD5(4)[7], WE5(4)[7],WF5(4)[7],WG5(4)[7],WI5(4)[7],WJ5(4)[7],WK5(4)[7],WM5(4)[7],WN5(4)[7],WO5(4)[7], WQ5(4)[7],WR5(4)[7],WS5(4)[7],WT5(4)[7],WU5(4)[7],WV5(4)[7],WW5(4)[7],WX5(4)[7],WY5(4)[7], - WZ5(4)[7],=AH2AQ(4)[7],=AH2AQ/5(4)[7],=AH2DG(4)[7],=AH2EH(4)[7],=AH2H(4)[7],=AH2T(4)[7], - =AH6AF(4)[7],=AH6DZ(4)[7],=AH6FV(4)[7],=AH6HT(4)[7],=AH6OU(4)[7],=AH6RB(4)[7],=AH6TD(4)[7], - =AH6UD(4)[7],=AH8O(4)[7],=AH9B(4)[7],=AL1F(4)[7],=AL2K(4)[7],=AL2S(4)[7],=AL4F(4)[7],=AL5J(4)[7], - =AL7C(4)[7],=AL7CJ(4)[7],=AL7CQ(4)[7],=AL7DF(4)[7],=AL7DR(4)[7],=AL7GY(4)[7],=AL7HH(4)[7], - =AL7HU(4)[7],=AL7II/5(4)[7],=AL7IM(4)[7],=AL7J(4)[7],=AL7JP(4)[7],=AL7L/5(4)[7],=AL7PB(4)[7], - =AL7RD(4)[7],=AL7RI(4)[7],=KH0BZ(4)[7],=KH0CE(4)[7],=KH0CU(4)[7],=KH0DW(4)[7],=KH2AI(4)[7], - =KH2BH(4)[7],=KH2DF(4)[7],=KH2DF/5(4)[7],=KH2TB(4)[7],=KH2XD(4)[7],=KH2XO(4)[7],=KH2YO(4)[7], - =KH6ABA(4)[7],=KH6DAN(4)[7],=KH6GGC(4)[7],=KH6HPQ(4)[7],=KH6II(4)[7],=KH6ITY/M(4)[7], - =KH6JIQ(4)[7],=KH6JTM(4)[7],=KH6JVL(4)[7],=KH6KG/5(4)[7],=KH6LL(4)[7],=KH6LX(4)[7],=KH6MB/5(4)[7], - =KH6SP/5(4)[7],=KH6SZ(4)[7],=KH6UW(4)[7],=KH7CF(4)[7],=KH7FB(4)[7],=KH7IC(4)[7],=KH7JE(4)[7], - =KH7QL(4)[7],=KH7QO(4)[7],=KH8CG(4)[7],=KH9AE(4)[7],=KL0EX(4)[7],=KL0HU(4)[7],=KL0PG(4)[7], - =KL1DA(4)[7],=KL1DJ(4)[7],=KL1RX(4)[7],=KL1TS(4)[7],=KL1UR(4)[7],=KL1WG(4)[7],=KL1WO(4)[7], - =KL1XK(4)[7],=KL1Y(4)[7],=KL1ZW(4)[7],=KL2AX(4)[7],=KL2AX/5(4)[7],=KL2CD(4)[7],=KL2HC(4)[7], - =KL2HN(4)[7],=KL2MI(4)[7],=KL2NN(4)[7],=KL2RA(4)[7],=KL2RB(4)[7],=KL2TV(4)[7],=KL2VA(4)[7], - =KL3DB(4)[7],=KL3DP(4)[7],=KL3HK(4)[7],=KL3HZ(4)[7],=KL3JL(4)[7],=KL3KH(4)[7],=KL3KI(4)[7], - =KL3TB(4)[7],=KL4JQ(4)[7],=KL5L(4)[7],=KL5Z(4)[7],=KL7AH(4)[7],=KL7AU(4)[7],=KL7AX(4)[7], - =KL7BCD(4)[7],=KL7BL(4)[7],=KL7BX(4)[7],=KL7BZ/5(4)[7],=KL7BZL(4)[7],=KL7CD(4)[7],=KL7DB(4)[7], - =KL7EBE(4)[7],=KL7EMH(4)[7],=KL7EMH/M(4)[7],=KL7EQQ(4)[7],=KL7F(4)[7],=KL7FB(4)[7],=KL7FHX(4)[7], - =KL7FLY(4)[7],=KL7FQR(4)[7],=KL7GNW(4)[7],=KL7HH(4)[7],=KL7IDM(4)[7],=KL7IK(4)[7],=KL7ITF(4)[7], - =KL7IWU(4)[7],=KL7IZW(4)[7],=KL7JAR(4)[7],=KL7JEX(4)[7],=KL7JIU(4)[7],=KL7JR/5(4)[7],=KL7JW(4)[7], - =KL7LJ(4)[7],=KL7LY(4)[7],=KL7MA(4)[7],=KL7ME(4)[7],=KL7ML(4)[7],=KL7NE(4)[7],=KL7NI(4)[7], - =KL7OI(4)[7],=KL7PZ(4)[7],=KL7QC(4)[7],=KL7SG(4)[7],=KL7TN/5(4)[7],=KL7UHF(4)[7],=KL7USI/5(4)[7], - =KL7XP(4)[7],=KL7XS(4)[7],=KL7YY/5(4)[7],=KP2AZ(4)[7],=KP4CV(4)[7],=KP4DJT(4)[7],=KP4FF(4)[7], - =KP4FFW(4)[7],=KP4GMC(4)[7],=KP4JE(4)[7],=KP4JG(4)[7],=KP4JY(4)[7],=KP4YP(4)[7],=NH0V/5(4)[7], - =NH2LP(4)[7],=NH6AZ(4)[7],=NH6CJ(4)[7],=NH6EF(4)[7],=NH6FA(4)[7],=NH6L(4)[7],=NH6VB(4)[7], - =NH6VJ(4)[7],=NH6WL(4)[7],=NH6WL/5(4)[7],=NH7FO(4)[7],=NH7MV(4)[7],=NH7PZ(4)[7],=NH7R(4)[7], - =NH7RO(4)[7],=NH7RO/5(4)[7],=NH7TR(4)[7],=NH7VA(4)[7],=NL5J(4)[7],=NL7AX(4)[7],=NL7C(4)[7], - =NL7CO(4)[7],=NL7CO/5(4)[7],=NL7CO/M(4)[7],=NL7DC(4)[7],=NL7HB(4)[7],=NL7IE(4)[7],=NL7JH(4)[7], - =NL7JI(4)[7],=NL7K/5(4)[7],=NL7KB(4)[7],=NL7NP(4)[7],=NL7OM(4)[7],=NL7PD(4)[7],=NL7RQ(4)[7], - =NL7RQ/5(4)[7],=NL7TO(4)[7],=NL7ZL(4)[7],=NP2EE(4)[7],=NP2PR(4)[7],=NP2RA(4)[7],=NP3BA(4)[7], - =NP3CV(4)[7],=NP3NT(4)[7],=NP3PG(4)[7],=NP3RG(4)[7],=NP3SU(4)[7],=NP3TY(4)[7],=NP4EA(4)[7], - =NP4NQ(4)[7],=NP4NQ/5(4)[7],=NP4RW(4)[7],=NP4RZ(4)[7],=WH2ACT(4)[7],=WH2ACT/5(4)[7],=WH6ARN(4)[7], - =WH6BYJ(4)[7],=WH6BYP(4)[7],=WH6CDU(4)[7],=WH6CUL(4)[7],=WH6DZU(4)[7],=WH6ECJ(4)[7],=WH6EMW(4)[7], - =WH6EOF(4)[7],=WH6ERS(4)[7],=WH6EUA(4)[7],=WH6EXQ(4)[7],=WH6FAD(4)[7],=WH6FGM(4)[7], - =WH6FZ/5(4)[7],=WH6L/5(4)[7],=WH7DC(4)[7],=WH7DW(4)[7],=WH7OK(4)[7],=WH7R(4)[7],=WH7YQ(4)[7], - =WH7YR(4)[7],=WL3WX(4)[7],=WL5H(4)[7],=WL7AIU(4)[7],=WL7AWC(4)[7],=WL7BBV(4)[7],=WL7BKF(4)[7], - =WL7BPY(4)[7],=WL7CA(4)[7],=WL7CJA(4)[7],=WL7CJC(4)[7],=WL7CQE(4)[7],=WL7CTP(4)[7],=WL7CTQ(4)[7], - =WL7D(4)[7],=WL7FT(4)[7],=WL7FT/5(4)[7],=WL7K/5(4)[7],=WL7ME(4)[7],=WL7MQ/5(4)[7],=WL7OP(4)[7], - =WL7OU(4)[7],=WL7SG(4)[7],=WL7W(4)[7],=WL7XI(4)[7],=WL7XR(4)[7],=WP2AHG(4)[7],=WP2WP(4)[7], - =WP3AL(4)[7],=WP4A(4)[7],=WP4ADA(4)[7],=WP4APJ(4)[7],=WP4BAB(4)[7],=WP4BAT(4)[7],=WP4CJY(4)[7], - =WP4EVA(4)[7],=WP4EVL(4)[7],=WP4KSP(4)[7],=WP4KTF(4)[7],=WP4KUW(4)[7],=WP4LKA(4)[7],=WP4MJP(4)[7], - =WP4MWS(4)[7],=WP4MYI(4)[7],=WP4MZR(4)[7],=WP4NAK(4)[7],=WP4NEP(4)[7],=WP4NQL(4)[7],=WP4OUE(4)[7], - =WP4RON(4)[7], + WZ5(4)[7],=AH2AQ(4)[7],=AH2AQ/5(4)[7],=AH2DG(4)[7],=AH2DR(4)[7],=AH2EH(4)[7],=AH2H(4)[7], + =AH2T(4)[7],=AH6AF(4)[7],=AH6DZ(4)[7],=AH6FV(4)[7],=AH6HT(4)[7],=AH6OU(4)[7],=AH6RB(4)[7], + =AH6TD(4)[7],=AH6UD(4)[7],=AH8O(4)[7],=AH9B(4)[7],=AL1F(4)[7],=AL2K(4)[7],=AL2S(4)[7],=AL4F(4)[7], + =AL5J(4)[7],=AL7C(4)[7],=AL7CJ(4)[7],=AL7CQ(4)[7],=AL7DF(4)[7],=AL7DR(4)[7],=AL7GY(4)[7], + =AL7HH(4)[7],=AL7HU(4)[7],=AL7II/5(4)[7],=AL7IM(4)[7],=AL7J(4)[7],=AL7JP(4)[7],=AL7L/5(4)[7], + =AL7PB(4)[7],=AL7RD(4)[7],=AL7RI(4)[7],=AL7V(4)[7],=KH0BZ(4)[7],=KH0CE(4)[7],=KH0CU(4)[7], + =KH0DW(4)[7],=KH2AI(4)[7],=KH2BH(4)[7],=KH2DF(4)[7],=KH2DF/5(4)[7],=KH2TB(4)[7],=KH2XD(4)[7], + =KH2XO(4)[7],=KH2YO(4)[7],=KH6ABA(4)[7],=KH6DAN(4)[7],=KH6GGC(4)[7],=KH6HPQ(4)[7],=KH6II(4)[7], + =KH6ITY/M(4)[7],=KH6JIQ(4)[7],=KH6JTM(4)[7],=KH6JVL(4)[7],=KH6KG/5(4)[7],=KH6LL(4)[7], + =KH6LX(4)[7],=KH6MB/5(4)[7],=KH6SP/5(4)[7],=KH6SZ(4)[7],=KH6UW(4)[7],=KH7CF(4)[7],=KH7FB(4)[7], + =KH7IC(4)[7],=KH7JE(4)[7],=KH7QL(4)[7],=KH7QO(4)[7],=KH8CG(4)[7],=KH9AE(4)[7],=KL0EX(4)[7], + =KL0HU(4)[7],=KL0PG(4)[7],=KL1DA(4)[7],=KL1DJ(4)[7],=KL1RX(4)[7],=KL1TS(4)[7],=KL1UR(4)[7], + =KL1WG(4)[7],=KL1WO(4)[7],=KL1XK(4)[7],=KL1Y(4)[7],=KL1ZW(4)[7],=KL2AX(4)[7],=KL2AX/5(4)[7], + =KL2CD(4)[7],=KL2HC(4)[7],=KL2HN(4)[7],=KL2MI(4)[7],=KL2RA(4)[7],=KL2RB(4)[7],=KL2TV(4)[7], + =KL2VA(4)[7],=KL3DB(4)[7],=KL3DP(4)[7],=KL3HK(4)[7],=KL3HZ(4)[7],=KL3JL(4)[7],=KL3KH(4)[7], + =KL3KI(4)[7],=KL3TB(4)[7],=KL4JQ(4)[7],=KL5L(4)[7],=KL5Z(4)[7],=KL7AH(4)[7],=KL7AU(4)[7], + =KL7AX(4)[7],=KL7BCD(4)[7],=KL7BL(4)[7],=KL7BX(4)[7],=KL7BZ/5(4)[7],=KL7BZL(4)[7],=KL7CD(4)[7], + =KL7DB(4)[7],=KL7EBE(4)[7],=KL7EMH(4)[7],=KL7EMH/M(4)[7],=KL7EQQ(4)[7],=KL7F(4)[7],=KL7FB(4)[7], + =KL7FHX(4)[7],=KL7FLY(4)[7],=KL7FQR(4)[7],=KL7GNW(4)[7],=KL7HH(4)[7],=KL7HJZ(4)[7],=KL7IDM(4)[7], + =KL7IK(4)[7],=KL7ITF(4)[7],=KL7IWU(4)[7],=KL7IZW(4)[7],=KL7JAR(4)[7],=KL7JEX(4)[7],=KL7JIU(4)[7], + =KL7JR/5(4)[7],=KL7JW(4)[7],=KL7LJ(4)[7],=KL7LY(4)[7],=KL7MA(4)[7],=KL7ME(4)[7],=KL7ML(4)[7], + =KL7NE(4)[7],=KL7NI(4)[7],=KL7OI(4)[7],=KL7PZ(4)[7],=KL7QC(4)[7],=KL7SG(4)[7],=KL7TN/5(4)[7], + =KL7UHF(4)[7],=KL7USI/5(4)[7],=KL7XP(4)[7],=KL7XS(4)[7],=KL7YY/5(4)[7],=KP2AZ(4)[7],=KP4CV(4)[7], + =KP4DJT(4)[7],=KP4FF(4)[7],=KP4FFW(4)[7],=KP4GMC(4)[7],=KP4JE(4)[7],=KP4JG(4)[7],=KP4JY(4)[7], + =KP4YP(4)[7],=NH0V/5(4)[7],=NH2LP(4)[7],=NH6AZ(4)[7],=NH6CJ(4)[7],=NH6EF(4)[7],=NH6FA(4)[7], + =NH6L(4)[7],=NH6VB(4)[7],=NH6VJ(4)[7],=NH6WL(4)[7],=NH6WL/5(4)[7],=NH7FO(4)[7],=NH7MV(4)[7], + =NH7PZ(4)[7],=NH7R(4)[7],=NH7RO(4)[7],=NH7RO/5(4)[7],=NH7TR(4)[7],=NH7VA(4)[7],=NL5J(4)[7], + =NL7AX(4)[7],=NL7C(4)[7],=NL7CO(4)[7],=NL7CO/5(4)[7],=NL7CO/M(4)[7],=NL7DC(4)[7],=NL7HB(4)[7], + =NL7IE(4)[7],=NL7JH(4)[7],=NL7JI(4)[7],=NL7K/5(4)[7],=NL7KB(4)[7],=NL7NP(4)[7],=NL7OM(4)[7], + =NL7PD(4)[7],=NL7RQ(4)[7],=NL7RQ/5(4)[7],=NL7SI(4)[7],=NL7TO(4)[7],=NL7ZL(4)[7],=NP2EE(4)[7], + =NP2PR(4)[7],=NP2RA(4)[7],=NP3BA(4)[7],=NP3CV(4)[7],=NP3NT(4)[7],=NP3PG(4)[7],=NP3RG(4)[7], + =NP3SU(4)[7],=NP3TY(4)[7],=NP4EA(4)[7],=NP4NQ(4)[7],=NP4NQ/5(4)[7],=NP4RW(4)[7],=NP4RZ(4)[7], + =WH2ACT(4)[7],=WH2ACT/5(4)[7],=WH6ARN(4)[7],=WH6BYJ(4)[7],=WH6BYP(4)[7],=WH6CDU(4)[7], + =WH6CUL(4)[7],=WH6DZU(4)[7],=WH6ECJ(4)[7],=WH6EMW(4)[7],=WH6EOF(4)[7],=WH6ERS(4)[7],=WH6EUA(4)[7], + =WH6EXQ(4)[7],=WH6FAD(4)[7],=WH6FGM(4)[7],=WH6FZ/5(4)[7],=WH6L/5(4)[7],=WH7DC(4)[7],=WH7DW(4)[7], + =WH7OK(4)[7],=WH7R(4)[7],=WH7YQ(4)[7],=WH7YR(4)[7],=WL3WX(4)[7],=WL5H(4)[7],=WL7AIU(4)[7], + =WL7AWC(4)[7],=WL7BBV(4)[7],=WL7BKF(4)[7],=WL7BPY(4)[7],=WL7CA(4)[7],=WL7CJA(4)[7],=WL7CJC(4)[7], + =WL7CQE(4)[7],=WL7CTP(4)[7],=WL7CTQ(4)[7],=WL7D(4)[7],=WL7FE(4)[7],=WL7FT(4)[7],=WL7FT/5(4)[7], + =WL7K/5(4)[7],=WL7ME(4)[7],=WL7MQ/5(4)[7],=WL7OP(4)[7],=WL7OU(4)[7],=WL7SG(4)[7],=WL7W(4)[7], + =WL7XI(4)[7],=WL7XR(4)[7],=WP2AHG(4)[7],=WP2WP(4)[7],=WP3AL(4)[7],=WP4A(4)[7],=WP4ADA(4)[7], + =WP4APJ(4)[7],=WP4BAB(4)[7],=WP4BAT(4)[7],=WP4CJY(4)[7],=WP4EVA(4)[7],=WP4EVL(4)[7],=WP4KSP(4)[7], + =WP4KTF(4)[7],=WP4KUW(4)[7],=WP4LKA(4)[7],=WP4MJP(4)[7],=WP4MWS(4)[7],=WP4MYI(4)[7],=WP4MZR(4)[7], + =WP4NAK(4)[7],=WP4NEP(4)[7],=WP4NQL(4)[7],=WP4OUE(4)[7],=WP4RON(4)[7], AA6(3)[6],AB6(3)[6],AC6(3)[6],AD6(3)[6],AE6(3)[6],AF6(3)[6],AG6(3)[6],AI6(3)[6],AJ6(3)[6], AK6(3)[6],K6(3)[6],KA6(3)[6],KB6(3)[6],KC6(3)[6],KD6(3)[6],KE6(3)[6],KF6(3)[6],KG6(3)[6], KI6(3)[6],KJ6(3)[6],KK6(3)[6],KM6(3)[6],KN6(3)[6],KO6(3)[6],KQ6(3)[6],KR6(3)[6],KS6(3)[6], @@ -1372,54 +1376,55 @@ United States: 05: 08: NA: 37.53: 91.67: 5.0: K: NW6(3)[6],NX6(3)[6],NY6(3)[6],NZ6(3)[6],W6(3)[6],WA6(3)[6],WB6(3)[6],WC6(3)[6],WD6(3)[6], WE6(3)[6],WF6(3)[6],WG6(3)[6],WI6(3)[6],WJ6(3)[6],WK6(3)[6],WM6(3)[6],WN6(3)[6],WO6(3)[6], WQ6(3)[6],WR6(3)[6],WS6(3)[6],WT6(3)[6],WU6(3)[6],WV6(3)[6],WW6(3)[6],WX6(3)[6],WY6(3)[6], - WZ6(3)[6],=AH0CS(3)[6],=AH0U(3)[6],=AH0U/6(3)[6],=AH2AP(3)[6],=AH2DY(3)[6],=AH6BS(3)[6], - =AH6CY(3)[6],=AH6CY/P(3)[6],=AH6EI(3)[6],=AH6HE(3)[6],=AH6KG(3)[6],=AH6ML(3)[6],=AH6NL(3)[6], - =AH6NP(3)[6],=AH6PD(3)[6],=AH6RI(3)[6],=AH6S(3)[6],=AH6SU(3)[6],=AH6TX(3)[6],=AH6UN(3)[6], - =AH7A(3)[6],=AH7D(3)[6],=AH7F(3)[6],=AH8C(3)[6],=AL3A(3)[6],=AL5ET(3)[6],=AL6A(3)[6],=AL7DQ(3)[6], - =AL7EM(3)[6],=AL7EP(3)[6],=AL7EW(3)[6],=AL7FN(3)[6],=AL7GS(3)[6],=AL7HO/6(3)[6],=AL7L/6(3)[6], - =AL7PS(3)[6],=KH0BR(3)[6],=KH0BU(3)[6],=KH0CA(3)[6],=KH0CG(3)[6],=KH0DH(3)[6],=KH0DJ(3)[6], - =KH0HQ(3)[6],=KH0JJ(3)[6],=KH0V(3)[6],=KH0XD(3)[6],=KH2BD(3)[6],=KH2BI(3)[6],=KH2BR(3)[6], - =KH2BR/6(3)[6],=KH2C(3)[6],=KH2EE(3)[6],=KH2FI(3)[6],=KH2FI/6(3)[6],=KH2H(3)[6],=KH2IW(3)[6], - =KH2LU(3)[6],=KH2LW(3)[6],=KH2LZ(3)[6],=KH2OJ(3)[6],=KH2QE(3)[6],=KH2QL(3)[6],=KH2QY(3)[6], - =KH2TJ(3)[6],=KH2TJ/6(3)[6],=KH2XW(3)[6],=KH2YJ(3)[6],=KH2Z(3)[6],=KH2ZM(3)[6],=KH4AB(3)[6], - =KH6ARA(3)[6],=KH6AS(3)[6],=KH6BMD(3)[6],=KH6BRY(3)[6],=KH6COL(3)[6],=KH6DDW(3)[6],=KH6DX/M(3)[6], - =KH6DX/M6(3)[6],=KH6DZ(3)[6],=KH6EHF(3)[6],=KH6FH(3)[6],=KH6FL(3)[6],=KH6FOX(3)[6],=KH6FQR(3)[6], - =KH6FQY(3)[6],=KH6GBQ(3)[6],=KH6GC(3)[6],=KH6GJV(3)[6],=KH6GJV/6(3)[6],=KH6GK(3)[6],=KH6GKR(3)[6], - =KH6HJE(3)[6],=KH6HOU(3)[6],=KH6IKH(3)[6],=KH6IKL(3)[6],=KH6IP(3)[6],=KH6IPJ(3)[6],=KH6JCT(3)[6], - =KH6JGD(3)[6],=KH6JJN(3)[6],=KH6JJN/P(3)[6],=KH6JN(3)[6],=KH6JR(3)[6],=KH6JRB(3)[6],=KH6JRC(3)[6], - =KH6JS(3)[6],=KH6JUZ(3)[6],=KH6JVS(3)[6],=KH6JWG(3)[6],=KH6KT(3)[6],=KH6LO(3)[6],=KH6MV(3)[6], - =KH6N(3)[6],=KH6NG(3)[6],=KH6O(3)[6],=KH6PGA/6(3)[6],=KH6PM(3)[6],=KH6PW(3)[6],=KH6SC(3)[6], - =KH6TO(3)[6],=KH6UQ(3)[6],=KH6USA(3)[6],=KH6VC(3)[6],=KH6VC/6(3)[6],=KH6VZ(3)[6],=KH6WL(3)[6], - =KH6WZ(3)[6],=KH7CD/6(3)[6],=KH7CO(3)[6],=KH7CS(3)[6],=KH7EM(3)[6],=KH7I(3)[6],=KH7IZ(3)[6], - =KH7JR(3)[6],=KH7NS(3)[6],=KH7QS(3)[6],=KH7QU(3)[6],=KH7RB(3)[6],=KH7TJ(3)[6],=KH7TJ/6(3)[6], - =KH7XX/6(3)[6],=KH7Y(3)[6],=KH7Y/6(3)[6],=KH8A(3)[6],=KH8AF(3)[6],=KH8FL(3)[6],=KL0AA(3)[6], - =KL0AF(3)[6],=KL0AL(3)[6],=KL0HZ(3)[6],=KL0IF(3)[6],=KL1WE/6(3)[6],=KL2CQ(3)[6],=KL3JY/6(3)[6], - =KL3YH(3)[6],=KL4GW(3)[6],=KL4LV(3)[6],=KL4NZ(3)[6],=KL4QW(3)[6],=KL4UZ(3)[6],=KL7AK(3)[6], - =KL7CE/6(3)[6],=KL7CM(3)[6],=KL7CN(3)[6],=KL7CW/6(3)[6],=KL7CX(3)[6],=KL7DJ(3)[6],=KL7EAE(3)[6], - =KL7EAL(3)[6],=KL7HQR(3)[6],=KL7HQR/6(3)[6],=KL7HSY(3)[6],=KL7ID(3)[6],=KL7IDY/6(3)[6], - =KL7ISN(3)[6],=KL7JBE(3)[6],=KL7KNP(3)[6],=KL7KX(3)[6],=KL7MF(3)[6],=KL7MF/6(3)[6],=KL7MF/M(3)[6], - =KL7OO(3)[6],=KL7RT(3)[6],=KL7SL(3)[6],=KL7SY(3)[6],=KL7VU(3)[6],=KL7VU/6(3)[6],=KP2BK(3)[6], - =KP3BN(3)[6],=KP3YL(3)[6],=KP4BR(3)[6],=KP4DSO(3)[6],=KP4DX/6(3)[6],=KP4ENM(3)[6],=KP4ERR(3)[6], - =KP4FBT(3)[6],=KP4MD(3)[6],=KP4UB(3)[6],=NH0C(3)[6],=NH0X(3)[6],=NH2AR(3)[6],=NH2BD(3)[6], - =NH2BV(3)[6],=NH2CM(3)[6],=NH2FT(3)[6],=NH2FX(3)[6],=NH2R(3)[6],=NH2S(3)[6],=NH6AC(3)[6], - =NH6AE(3)[6],=NH6FV(3)[6],=NH6FX(3)[6],=NH6NG(3)[6],=NH6RG(3)[6],=NH6WR(3)[6],=NH7AG(3)[6], - =NH7EM(3)[6],=NH7FW(3)[6],=NH7G(3)[6],=NH7IG(3)[6],=NH7IH(3)[6],=NH7PM(3)[6],=NH7QV(3)[6], - =NH7RT(3)[6],=NH7ST(3)[6],=NH7SU(3)[6],=NH7WE(3)[6],=NH7WG(3)[6],=NH7ZE(3)[6],=NL7GE(3)[6], - =NL7IB(3)[6],=NL7OP(3)[6],=NL7RO(3)[6],=NL7YB(3)[6],=NP2KY(3)[6],=NP4AB(3)[6],=NP4AI/6(3)[6], - =NP4IW(3)[6],=NP4IW/6(3)[6],=NP4MV(3)[6],=NP4XE(3)[6],=WH0AAZ(3)[6],=WH0M(3)[6],=WH2ABS(3)[6], - =WH2ALN(3)[6],=WH6AAJ(3)[6],=WH6AFM(3)[6],=WH6ANA(3)[6],=WH6ASW/M(3)[6],=WH6BYT(3)[6], - =WH6CIL(3)[6],=WH6CK(3)[6],=WH6CO(3)[6],=WH6CPO(3)[6],=WH6CPT(3)[6],=WH6CRE(3)[6],=WH6CSG(3)[6], - =WH6CUF(3)[6],=WH6CUU(3)[6],=WH6CUX(3)[6],=WH6CVJ(3)[6],=WH6CWS(3)[6],=WH6CZF(3)[6],=WH6CZH(3)[6], - =WH6DHN(3)[6],=WH6DSK(3)[6],=WH6DVM(3)[6],=WH6DVN(3)[6],=WH6DVX(3)[6],=WH6DYA(3)[6],=WH6DZV(3)[6], - =WH6DZY(3)[6],=WH6EAR(3)[6],=WH6EEZ(3)[6],=WH6EHY(3)[6],=WH6EKB(3)[6],=WH6ENG(3)[6],=WH6EUH(3)[6], - =WH6EZW(3)[6],=WH6JO(3)[6],=WH6LZ(3)[6],=WH6OI(3)[6],=WH6PX(3)[6],=WH6QA(3)[6],=WH6RF(3)[6], - =WH6TD(3)[6],=WH6TK(3)[6],=WH6USA(3)[6],=WH6VM(3)[6],=WH6VN(3)[6],=WH6XI(3)[6],=WH6XX(3)[6], - =WH6YJ(3)[6],=WH7DG(3)[6],=WH7DH(3)[6],=WH7HQ(3)[6],=WH7IN(3)[6],=WH7IV(3)[6],=WH7IZ(3)[6], - =WH7LP(3)[6],=WH7OO(3)[6],=WH7PM(3)[6],=WH7QC(3)[6],=WH7RU(3)[6],=WH7TT(3)[6],=WH7VM(3)[6], - =WH7XR(3)[6],=WL3AF(3)[6],=WL3DZ(3)[6],=WL4JC(3)[6],=WL7ACO(3)[6],=WL7BA(3)[6],=WL7BGF(3)[6], - =WL7CPL(3)[6],=WL7CSD(3)[6],=WL7DN/6(3)[6],=WL7EA(3)[6],=WL7EKK(3)[6],=WL7RA(3)[6],=WL7SE(3)[6], - =WL7TG(3)[6],=WL7WL(3)[6],=WL7YQ(3)[6],=WL7YQ/6(3)[6],=WP2N(3)[6],=WP4CUJ(3)[6],=WP4CW(3)[6], - =WP4KSU(3)[6],=WP4MVE(3)[6],=WP4OBB(3)[6], + WZ6(3)[6],=AH0C(3)[6],=AH0CS(3)[6],=AH0U(3)[6],=AH0U/6(3)[6],=AH2AP(3)[6],=AH2DY(3)[6], + =AH6BS(3)[6],=AH6CY(3)[6],=AH6CY/P(3)[6],=AH6EI(3)[6],=AH6HE(3)[6],=AH6KG(3)[6],=AH6ML(3)[6], + =AH6NL(3)[6],=AH6NP(3)[6],=AH6PD(3)[6],=AH6RI(3)[6],=AH6S(3)[6],=AH6SU(3)[6],=AH6TX(3)[6], + =AH6UN(3)[6],=AH7A(3)[6],=AH7D(3)[6],=AH7F(3)[6],=AH8C(3)[6],=AL3A(3)[6],=AL5ET(3)[6],=AL6A(3)[6], + =AL7DQ(3)[6],=AL7EM(3)[6],=AL7EP(3)[6],=AL7EW(3)[6],=AL7FN(3)[6],=AL7GS(3)[6],=AL7HO/6(3)[6], + =AL7L/6(3)[6],=AL7PS(3)[6],=AL7QR(3)[6],=KH0BR(3)[6],=KH0BU(3)[6],=KH0CA(3)[6],=KH0CG(3)[6], + =KH0DH(3)[6],=KH0DJ(3)[6],=KH0HQ(3)[6],=KH0JJ(3)[6],=KH0V(3)[6],=KH0XD(3)[6],=KH2BD(3)[6], + =KH2BI(3)[6],=KH2BR(3)[6],=KH2BR/6(3)[6],=KH2C(3)[6],=KH2EE(3)[6],=KH2FI(3)[6],=KH2FI/6(3)[6], + =KH2H(3)[6],=KH2IW(3)[6],=KH2LU(3)[6],=KH2LW(3)[6],=KH2LZ(3)[6],=KH2OJ(3)[6],=KH2QE(3)[6], + =KH2QL(3)[6],=KH2QY(3)[6],=KH2TJ(3)[6],=KH2TJ/6(3)[6],=KH2XW(3)[6],=KH2YJ(3)[6],=KH2Z(3)[6], + =KH2ZM(3)[6],=KH4AB(3)[6],=KH6ARA(3)[6],=KH6AS(3)[6],=KH6BMD(3)[6],=KH6BRY(3)[6],=KH6COL(3)[6], + =KH6DDW(3)[6],=KH6DX/M(3)[6],=KH6DX/M6(3)[6],=KH6DZ(3)[6],=KH6EHF(3)[6],=KH6FH(3)[6],=KH6FL(3)[6], + =KH6FOX(3)[6],=KH6FQR(3)[6],=KH6FQY(3)[6],=KH6GBQ(3)[6],=KH6GC(3)[6],=KH6GJV(3)[6], + =KH6GJV/6(3)[6],=KH6GK(3)[6],=KH6GKR(3)[6],=KH6HJE(3)[6],=KH6HOU(3)[6],=KH6IKH(3)[6], + =KH6IKL(3)[6],=KH6IP(3)[6],=KH6IPJ(3)[6],=KH6JCT(3)[6],=KH6JGD(3)[6],=KH6JJN(3)[6], + =KH6JJN/P(3)[6],=KH6JN(3)[6],=KH6JR(3)[6],=KH6JRB(3)[6],=KH6JRC(3)[6],=KH6JS(3)[6],=KH6JUZ(3)[6], + =KH6JVS(3)[6],=KH6JWG(3)[6],=KH6KT(3)[6],=KH6LO(3)[6],=KH6MV(3)[6],=KH6N(3)[6],=KH6NG(3)[6], + =KH6O(3)[6],=KH6PGA/6(3)[6],=KH6PM(3)[6],=KH6PW(3)[6],=KH6SC(3)[6],=KH6TO(3)[6],=KH6UQ(3)[6], + =KH6USA(3)[6],=KH6VC(3)[6],=KH6VC/6(3)[6],=KH6VZ(3)[6],=KH6WL(3)[6],=KH6WZ(3)[6],=KH7CD/6(3)[6], + =KH7CO(3)[6],=KH7CS(3)[6],=KH7EM(3)[6],=KH7I(3)[6],=KH7IZ(3)[6],=KH7JR(3)[6],=KH7NS(3)[6], + =KH7QS(3)[6],=KH7QU(3)[6],=KH7RB(3)[6],=KH7TJ(3)[6],=KH7TJ/6(3)[6],=KH7TW(3)[6],=KH7XX/6(3)[6], + =KH7Y(3)[6],=KH7Y/6(3)[6],=KH8A(3)[6],=KH8AF(3)[6],=KH8FL(3)[6],=KL0AA(3)[6],=KL0AF(3)[6], + =KL0AL(3)[6],=KL0HZ(3)[6],=KL0IF(3)[6],=KL1WE/6(3)[6],=KL2CQ(3)[6],=KL3JY/6(3)[6],=KL3YH(3)[6], + =KL4GW(3)[6],=KL4LV(3)[6],=KL4NZ(3)[6],=KL4QW(3)[6],=KL4UZ(3)[6],=KL7AK(3)[6],=KL7CE/6(3)[6], + =KL7CM(3)[6],=KL7CN(3)[6],=KL7CW/6(3)[6],=KL7CX(3)[6],=KL7DJ(3)[6],=KL7EAE(3)[6],=KL7EAL(3)[6], + =KL7HQR(3)[6],=KL7HQR/6(3)[6],=KL7HSY(3)[6],=KL7ID(3)[6],=KL7IDY/6(3)[6],=KL7ISN(3)[6], + =KL7JBE(3)[6],=KL7KNP(3)[6],=KL7KX(3)[6],=KL7MF(3)[6],=KL7MF/6(3)[6],=KL7MF/M(3)[6],=KL7OO(3)[6], + =KL7RT(3)[6],=KL7SL(3)[6],=KL7SY(3)[6],=KL7VU(3)[6],=KL7VU/6(3)[6],=KP2BK(3)[6],=KP3BN(3)[6], + =KP3YL(3)[6],=KP4BR(3)[6],=KP4DSO(3)[6],=KP4DX/6(3)[6],=KP4ENM(3)[6],=KP4ERR(3)[6],=KP4FBT(3)[6], + =KP4MD(3)[6],=KP4UB(3)[6],=NH0C(3)[6],=NH0X(3)[6],=NH2AR(3)[6],=NH2BD(3)[6],=NH2BV(3)[6], + =NH2CM(3)[6],=NH2FT(3)[6],=NH2FX(3)[6],=NH2R(3)[6],=NH2S(3)[6],=NH6AC(3)[6],=NH6AE(3)[6], + =NH6AF(3)[6],=NH6FV(3)[6],=NH6FX(3)[6],=NH6NG(3)[6],=NH6RG(3)[6],=NH6ST(3)[6],=NH6WR(3)[6], + =NH7AG(3)[6],=NH7EM(3)[6],=NH7FW(3)[6],=NH7G(3)[6],=NH7IG(3)[6],=NH7IH(3)[6],=NH7PM(3)[6], + =NH7QV(3)[6],=NH7RT(3)[6],=NH7ST(3)[6],=NH7SU(3)[6],=NH7WE(3)[6],=NH7WG(3)[6],=NH7ZE(3)[6], + =NL7GE(3)[6],=NL7IB(3)[6],=NL7LC(3)[6],=NL7OP(3)[6],=NL7RO(3)[6],=NL7YB(3)[6],=NP2KY(3)[6], + =NP4AB(3)[6],=NP4AI/6(3)[6],=NP4IW(3)[6],=NP4IW/6(3)[6],=NP4MV(3)[6],=NP4XE(3)[6],=WH0AAZ(3)[6], + =WH0M(3)[6],=WH2ABS(3)[6],=WH2ALN(3)[6],=WH6AAJ(3)[6],=WH6AFM(3)[6],=WH6ANA(3)[6],=WH6ASW/M(3)[6], + =WH6BYT(3)[6],=WH6CIL(3)[6],=WH6CK(3)[6],=WH6CO(3)[6],=WH6CPO(3)[6],=WH6CPT(3)[6],=WH6CRE(3)[6], + =WH6CSG(3)[6],=WH6CUF(3)[6],=WH6CUU(3)[6],=WH6CUX(3)[6],=WH6CVJ(3)[6],=WH6CWS(3)[6],=WH6CZF(3)[6], + =WH6CZH(3)[6],=WH6DHN(3)[6],=WH6DSK(3)[6],=WH6DVM(3)[6],=WH6DVN(3)[6],=WH6DVX(3)[6],=WH6DYA(3)[6], + =WH6DZV(3)[6],=WH6DZY(3)[6],=WH6EAR(3)[6],=WH6EEZ(3)[6],=WH6EHY(3)[6],=WH6EKB(3)[6],=WH6ENG(3)[6], + =WH6EUH(3)[6],=WH6EZW(3)[6],=WH6JO(3)[6],=WH6LZ(3)[6],=WH6MC(3)[6],=WH6OI(3)[6],=WH6PX(3)[6], + =WH6QA(3)[6],=WH6RF(3)[6],=WH6TD(3)[6],=WH6TK(3)[6],=WH6USA(3)[6],=WH6VM(3)[6],=WH6VN(3)[6], + =WH6XI(3)[6],=WH6XX(3)[6],=WH6YJ(3)[6],=WH7DG(3)[6],=WH7DH(3)[6],=WH7HQ(3)[6],=WH7IN(3)[6], + =WH7IV(3)[6],=WH7IZ(3)[6],=WH7LP(3)[6],=WH7OO(3)[6],=WH7PM(3)[6],=WH7QC(3)[6],=WH7RU(3)[6], + =WH7TT(3)[6],=WH7VM(3)[6],=WH7XR(3)[6],=WL3AF(3)[6],=WL3DZ(3)[6],=WL4JC(3)[6],=WL7ACO(3)[6], + =WL7BA(3)[6],=WL7BGF(3)[6],=WL7CPL(3)[6],=WL7CSD(3)[6],=WL7DN/6(3)[6],=WL7EA(3)[6],=WL7EKK(3)[6], + =WL7RA(3)[6],=WL7SE(3)[6],=WL7TG(3)[6],=WL7WL(3)[6],=WL7YQ(3)[6],=WL7YQ/6(3)[6],=WP2N(3)[6], + =WP4CUJ(3)[6],=WP4CW(3)[6],=WP4KSU(3)[6],=WP4MVE(3)[6],=WP4OBB(3)[6], AA7(3)[6],AB7(3)[6],AC7(3)[6],AD7(3)[6],AE7(3)[6],AF7(3)[6],AG7(3)[6],AI7(3)[6],AJ7(3)[6], AK7(3)[6],K7(3)[6],KA7(3)[6],KB7(3)[6],KC7(3)[6],KD7(3)[6],KE7(3)[6],KF7(3)[6],KG7(3)[6], KI7(3)[6],KJ7(3)[6],KK7(3)[6],KM7(3)[6],KN7(3)[6],KO7(3)[6],KQ7(3)[6],KR7(3)[6],KS7(3)[6], @@ -1483,51 +1488,51 @@ United States: 05: 08: NA: 37.53: 91.67: 5.0: K: =KL7GKY(3)[6],=KL7GRF(3)[6],=KL7GT(3)[6],=KL7HB(3)[6],=KL7HBV(3)[6],=KL7HFI/7(3)[6],=KL7HFV(3)[6], =KL7HI(3)[6],=KL7HJR(3)[6],=KL7HLF(3)[6],=KL7HM(3)[6],=KL7HMK(3)[6],=KL7HQL(3)[6],=KL7HSR(3)[6], =KL7IAL(3)[6],=KL7IBT(3)[6],=KL7IDY(3)[6],=KL7IEI(3)[6],=KL7IFK(3)[6],=KL7IGB(3)[6],=KL7IHK(3)[6], - =KL7IIK(3)[6],=KL7IKV(3)[6],=KL7IL(3)[6],=KL7IME(3)[6],=KL7IPV(3)[6],=KL7ISE(3)[6],=KL7IUX(3)[6], - =KL7IWC/7(3)[6],=KL7IZC(3)[6],=KL7IZH(3)[6],=KL7JBB(3)[6],=KL7JDQ(3)[6],=KL7JES(3)[6], - =KL7JIJ(3)[6],=KL7JJE(3)[6],=KL7JKV(3)[6],=KL7KA(3)[6],=KL7KG/7(3)[6],=KL7LG(3)[6],=KL7LI(3)[6], - =KL7LX(3)[6],=KL7LZ(3)[6],=KL7M(3)[6],=KL7MY(3)[6],=KL7MZ(3)[6],=KL7NA(3)[6],=KL7NP(3)[6], - =KL7NP/7(3)[6],=KL7OA(3)[6],=KL7OF(3)[6],=KL7OL(3)[6],=KL7OR(3)[6],=KL7OR/7(3)[6],=KL7OS(3)[6], - =KL7OY(3)[6],=KL7PO(3)[6],=KL7QA(3)[6],=KL7QK(3)[6],=KL7QK/140(3)[6],=KL7QK/7(3)[6],=KL7QR(3)[6], - =KL7QR/7(3)[6],=KL7R(3)[6],=KL7RC(3)[6],=KL7RK(3)[6],=KL7RM(3)[6],=KL7RS(3)[6],=KL7S(3)[6], - =KL7SK(3)[6],=KL7SP(3)[6],=KL7T(3)[6],=KL7TU(3)[6],=KL7UP(3)[6],=KL7UT(3)[6],=KL7VK(3)[6], - =KL7VL(3)[6],=KL7VN(3)[6],=KL7VQ(3)[6],=KL7W(3)[6],=KL7WC(3)[6],=KL7WM(3)[6],=KL7WN(3)[6], - =KL7WP(3)[6],=KL7WP/7(3)[6],=KL7WT(3)[6],=KL7YJ(3)[6],=KL7YQ(3)[6],=KL7YY/M(3)[6],=KL7ZH(3)[6], - =KL7ZW(3)[6],=KL8RV(3)[6],=KL8SU(3)[6],=KL9PC(3)[6],=KP2BX(3)[6],=KP2CB(3)[6],=KP2CT(3)[6], - =KP2X(3)[6],=KP2Y(3)[6],=KP4BBN(3)[6],=KP4EFZ(3)[6],=KP4ND(3)[6],=KP4UZ(3)[6],=KP4X(3)[6], - =NH0F(3)[6],=NH0K(3)[6],=NH2DM(3)[6],=NH2JE(3)[6],=NH2KR(3)[6],=NH6B(3)[6],=NH6BF(3)[6], - =NH6CI(3)[6],=NH6DQ(3)[6],=NH6DX(3)[6],=NH6FF(3)[6],=NH6GZ(3)[6],=NH6HE(3)[6],=NH6HZ(3)[6], - =NH6LM(3)[6],=NH6NS(3)[6],=NH6U(3)[6],=NH6XN(3)[6],=NH6XP(3)[6],=NH6Z(3)[6],=NH6ZA(3)[6], - =NH6ZE(3)[6],=NH7FZ(3)[6],=NH7L(3)[6],=NH7M(3)[6],=NH7MY(3)[6],=NH7N(3)[6],=NH7ND(3)[6], - =NH7NJ/7(3)[6],=NH7OC(3)[6],=NH7PL(3)[6],=NH7RS(3)[6],=NH7S(3)[6],=NH7SH(3)[6],=NH7TG(3)[6], - =NH7VZ(3)[6],=NH7W(3)[6],=NH7WT(3)[6],=NH7WU(3)[6],=NH7YE(3)[6],=NH7YI(3)[6],=NL7AH(3)[6], - =NL7AR(3)[6],=NL7AZ(3)[6],=NL7CH(3)[6],=NL7D(3)[6],=NL7D/7(3)[6],=NL7DH(3)[6],=NL7DY(3)[6], - =NL7EO(3)[6],=NL7FQ(3)[6],=NL7FX(3)[6],=NL7GM(3)[6],=NL7GO(3)[6],=NL7GW(3)[6],=NL7HH(3)[6], - =NL7HK(3)[6],=NL7HQ(3)[6],=NL7HU(3)[6],=NL7IN(3)[6],=NL7JJ(3)[6],=NL7JN(3)[6],=NL7KV(3)[6], - =NL7LI(3)[6],=NL7MS(3)[6],=NL7MT(3)[6],=NL7NL(3)[6],=NL7OF(3)[6],=NL7PN(3)[6],=NL7QI(3)[6], - =NL7RL(3)[6],=NL7TK(3)[6],=NL7UE(3)[6],=NL7US(3)[6],=NL7WD(3)[6],=NL7WJ(3)[6],=NL7XX(3)[6], - =NL7ZM(3)[6],=NL7ZN(3)[6],=NL7ZP(3)[6],=NP2CT(3)[6],=NP2X/7(3)[6],=NP3PH(3)[6],=NP4AI/M(3)[6], - =NP4ES(3)[6],=NP4FP(3)[6],=NP4I(3)[6],=NP4JV(3)[6],=NP4JV/7(3)[6],=VA2GLB/P(3)[6],=WH0AAM(3)[6], - =WH0J(3)[6],=WH2ACV(3)[6],=WH2AJF(3)[6],=WH6ARU(3)[6],=WH6ASB(3)[6],=WH6B(3)[6],=WH6BDR(3)[6], - =WH6BLM(3)[6],=WH6BPU(3)[6],=WH6CF(3)[6],=WH6CMS(3)[6],=WH6CN(3)[6],=WH6CUS(3)[6],=WH6CWD(3)[6], - =WH6CXB(3)[6],=WH6CXE(3)[6],=WH6CXN(3)[6],=WH6CYB(3)[6],=WH6CZ(3)[6],=WH6DAY(3)[6],=WH6DJO(3)[6], - =WH6DKC(3)[6],=WH6DLQ(3)[6],=WH6DMP(3)[6],=WH6DQ(3)[6],=WH6DST(3)[6],=WH6EEC(3)[6],=WH6EEG(3)[6], - =WH6EGM(3)[6],=WH6EHW(3)[6],=WH6EJV(3)[6],=WH6EQB(3)[6],=WH6ESS(3)[6],=WH6ETO(3)[6],=WH6EWE(3)[6], - =WH6FCT(3)[6],=WH6FEU(3)[6],=WH6FL(3)[6],=WH6FOJ(3)[6],=WH6OL(3)[6],=WH6OY(3)[6],=WH6QV(3)[6], - =WH6SD(3)[6],=WH6SR(3)[6],=WH6TI(3)[6],=WH6U(3)[6],=WH6XV(3)[6],=WH6YT(3)[6],=WH6ZR(3)[6], - =WH6ZV(3)[6],=WH7A(3)[6],=WH7CY(3)[6],=WH7DB(3)[6],=WH7DE(3)[6],=WH7G(3)[6],=WH7GC(3)[6], - =WH7GY(3)[6],=WH7HU(3)[6],=WH7LB(3)[6],=WH7NS(3)[6],=WH7P(3)[6],=WH7RG(3)[6],=WH7TC(3)[6], - =WH7UP(3)[6],=WH7WP(3)[6],=WH7WT(3)[6],=WH7XP(3)[6],=WL7AAW(3)[6],=WL7AL(3)[6],=WL7AP(3)[6], - =WL7AUY(3)[6],=WL7AZG(3)[6],=WL7AZL(3)[6],=WL7BCR(3)[6],=WL7BHR(3)[6],=WL7BLM(3)[6],=WL7BM(3)[6], - =WL7BNQ(3)[6],=WL7BON(3)[6],=WL7BOO(3)[6],=WL7BSW(3)[6],=WL7BUI(3)[6],=WL7BVN(3)[6],=WL7BVS(3)[6], - =WL7CAZ(3)[6],=WL7CBF(3)[6],=WL7CES(3)[6],=WL7COQ(3)[6],=WL7CPE(3)[6],=WL7CPI(3)[6],=WL7CQX(3)[6], - =WL7CRJ(3)[6],=WL7CSL(3)[6],=WL7CTB(3)[6],=WL7CTC(3)[6],=WL7CTE(3)[6],=WL7DD(3)[6],=WL7FA(3)[6], - =WL7FU(3)[6],=WL7H(3)[6],=WL7HE(3)[6],=WL7HK(3)[6],=WL7HL(3)[6],=WL7IQ(3)[6],=WL7IS(3)[6], - =WL7JM(3)[6],=WL7K(3)[6],=WL7K/7(3)[6],=WL7K/M(3)[6],=WL7LB(3)[6],=WL7LK(3)[6],=WL7OA(3)[6], - =WL7P(3)[6],=WL7PJ(3)[6],=WL7QC(3)[6],=WL7QX(3)[6],=WL7RV/140(3)[6],=WL7SD(3)[6],=WL7SO(3)[6], - =WL7SV(3)[6],=WL7T(3)[6],=WL7VK(3)[6],=WL7WB(3)[6],=WL7WF(3)[6],=WL7WG(3)[6],=WL7WU(3)[6], - =WL7XE(3)[6],=WL7XJ(3)[6],=WL7XN(3)[6],=WL7XW(3)[6],=WL7Z(3)[6],=WL7ZM(3)[6],=WP2ADG(3)[6], - =WP4BZG(3)[6],=WP4DYP(3)[6],=WP4NBP(3)[6], + =KL7IIK(3)[6],=KL7IKV(3)[6],=KL7IL(3)[6],=KL7IME(3)[6],=KL7IOW(3)[6],=KL7IPV(3)[6],=KL7ISE(3)[6], + =KL7IUX(3)[6],=KL7IWC/7(3)[6],=KL7IZC(3)[6],=KL7IZH(3)[6],=KL7JBB(3)[6],=KL7JDQ(3)[6], + =KL7JES(3)[6],=KL7JIJ(3)[6],=KL7JJE(3)[6],=KL7JKV(3)[6],=KL7KA(3)[6],=KL7KG/7(3)[6],=KL7LG(3)[6], + =KL7LI(3)[6],=KL7LX(3)[6],=KL7LZ(3)[6],=KL7M(3)[6],=KL7MY(3)[6],=KL7MZ(3)[6],=KL7NA(3)[6], + =KL7NP(3)[6],=KL7NP/7(3)[6],=KL7OA(3)[6],=KL7OF(3)[6],=KL7OL(3)[6],=KL7OR(3)[6],=KL7OR/7(3)[6], + =KL7OS(3)[6],=KL7OY(3)[6],=KL7PO(3)[6],=KL7QA(3)[6],=KL7QK(3)[6],=KL7QK/140(3)[6],=KL7QK/7(3)[6], + =KL7QR(3)[6],=KL7QR/7(3)[6],=KL7R(3)[6],=KL7RC(3)[6],=KL7RK(3)[6],=KL7RM(3)[6],=KL7RS(3)[6], + =KL7S(3)[6],=KL7SK(3)[6],=KL7SP(3)[6],=KL7T(3)[6],=KL7TU(3)[6],=KL7UP(3)[6],=KL7UT(3)[6], + =KL7VK(3)[6],=KL7VL(3)[6],=KL7VN(3)[6],=KL7VQ(3)[6],=KL7W(3)[6],=KL7WC(3)[6],=KL7WM(3)[6], + =KL7WN(3)[6],=KL7WP(3)[6],=KL7WP/7(3)[6],=KL7WT(3)[6],=KL7YJ(3)[6],=KL7YQ(3)[6],=KL7YY/M(3)[6], + =KL7ZH(3)[6],=KL7ZW(3)[6],=KL8RV(3)[6],=KL8SU(3)[6],=KL9PC(3)[6],=KP2BX(3)[6],=KP2CB(3)[6], + =KP2CT(3)[6],=KP2X(3)[6],=KP2Y(3)[6],=KP4EFZ(3)[6],=KP4ND(3)[6],=KP4UZ(3)[6],=KP4X(3)[6], + =NH0F(3)[6],=NH0K(3)[6],=NH0O(3)[6],=NH2DM(3)[6],=NH2JE(3)[6],=NH2KR(3)[6],=NH6B(3)[6], + =NH6BF(3)[6],=NH6CI(3)[6],=NH6DQ(3)[6],=NH6DX(3)[6],=NH6FF(3)[6],=NH6GZ(3)[6],=NH6HE(3)[6], + =NH6HZ(3)[6],=NH6LF(3)[6],=NH6LM(3)[6],=NH6NS(3)[6],=NH6U(3)[6],=NH6XN(3)[6],=NH6XP(3)[6], + =NH6Z(3)[6],=NH6ZA(3)[6],=NH6ZE(3)[6],=NH7FZ(3)[6],=NH7L(3)[6],=NH7M(3)[6],=NH7MY(3)[6], + =NH7N(3)[6],=NH7ND(3)[6],=NH7NJ/7(3)[6],=NH7OC(3)[6],=NH7PL(3)[6],=NH7RS(3)[6],=NH7S(3)[6], + =NH7SH(3)[6],=NH7TG(3)[6],=NH7VZ(3)[6],=NH7W(3)[6],=NH7WT(3)[6],=NH7WU(3)[6],=NH7YE(3)[6], + =NH7YI(3)[6],=NL7AH(3)[6],=NL7AR(3)[6],=NL7AZ(3)[6],=NL7CH(3)[6],=NL7D(3)[6],=NL7D/7(3)[6], + =NL7DH(3)[6],=NL7DY(3)[6],=NL7EO(3)[6],=NL7FQ(3)[6],=NL7FX(3)[6],=NL7GM(3)[6],=NL7GO(3)[6], + =NL7GW(3)[6],=NL7HH(3)[6],=NL7HK(3)[6],=NL7HQ(3)[6],=NL7HU(3)[6],=NL7IN(3)[6],=NL7JJ(3)[6], + =NL7JN(3)[6],=NL7KV(3)[6],=NL7LI(3)[6],=NL7MS(3)[6],=NL7MT(3)[6],=NL7NL(3)[6],=NL7OF(3)[6], + =NL7PN(3)[6],=NL7QI(3)[6],=NL7RL(3)[6],=NL7TK(3)[6],=NL7UE(3)[6],=NL7US(3)[6],=NL7WD(3)[6], + =NL7WJ(3)[6],=NL7XX(3)[6],=NL7ZM(3)[6],=NL7ZN(3)[6],=NL7ZP(3)[6],=NP2CT(3)[6],=NP2X/7(3)[6], + =NP3PH(3)[6],=NP4AI/M(3)[6],=NP4ES(3)[6],=NP4FP(3)[6],=NP4I(3)[6],=NP4JV(3)[6],=NP4JV/7(3)[6], + =VA2GLB/P(3)[6],=WH0AAM(3)[6],=WH0J(3)[6],=WH2ACV(3)[6],=WH2AJF(3)[6],=WH6ARU(3)[6],=WH6ASB(3)[6], + =WH6B(3)[6],=WH6BDR(3)[6],=WH6BLM(3)[6],=WH6BPU(3)[6],=WH6CF(3)[6],=WH6CMS(3)[6],=WH6CN(3)[6], + =WH6CUS(3)[6],=WH6CWD(3)[6],=WH6CXB(3)[6],=WH6CXE(3)[6],=WH6CXN(3)[6],=WH6CYB(3)[6],=WH6CZ(3)[6], + =WH6DAY(3)[6],=WH6DJO(3)[6],=WH6DKC(3)[6],=WH6DLQ(3)[6],=WH6DMP(3)[6],=WH6DQ(3)[6],=WH6DST(3)[6], + =WH6EEC(3)[6],=WH6EEG(3)[6],=WH6EGM(3)[6],=WH6EHW(3)[6],=WH6EJV(3)[6],=WH6EQB(3)[6],=WH6ESS(3)[6], + =WH6ETO(3)[6],=WH6EWE(3)[6],=WH6FCT(3)[6],=WH6FEU(3)[6],=WH6FL(3)[6],=WH6FOJ(3)[6],=WH6OL(3)[6], + =WH6OY(3)[6],=WH6QV(3)[6],=WH6SD(3)[6],=WH6SR(3)[6],=WH6TI(3)[6],=WH6U(3)[6],=WH6XV(3)[6], + =WH6YT(3)[6],=WH6ZR(3)[6],=WH6ZV(3)[6],=WH7A(3)[6],=WH7CY(3)[6],=WH7DB(3)[6],=WH7DE(3)[6], + =WH7G(3)[6],=WH7GC(3)[6],=WH7GY(3)[6],=WH7HU(3)[6],=WH7LB(3)[6],=WH7NS(3)[6],=WH7P(3)[6], + =WH7RG(3)[6],=WH7TC(3)[6],=WH7U(3)[6],=WH7UP(3)[6],=WH7WP(3)[6],=WH7WT(3)[6],=WH7XP(3)[6], + =WL7AAW(3)[6],=WL7AL(3)[6],=WL7AP(3)[6],=WL7AUY(3)[6],=WL7AZG(3)[6],=WL7AZL(3)[6],=WL7BCR(3)[6], + =WL7BHR(3)[6],=WL7BLM(3)[6],=WL7BM(3)[6],=WL7BNQ(3)[6],=WL7BON(3)[6],=WL7BOO(3)[6],=WL7BSW(3)[6], + =WL7BUI(3)[6],=WL7BVN(3)[6],=WL7BVS(3)[6],=WL7CAZ(3)[6],=WL7CBF(3)[6],=WL7CES(3)[6],=WL7COQ(3)[6], + =WL7CPE(3)[6],=WL7CPI(3)[6],=WL7CQX(3)[6],=WL7CRJ(3)[6],=WL7CSL(3)[6],=WL7CTB(3)[6],=WL7CTC(3)[6], + =WL7CTE(3)[6],=WL7DD(3)[6],=WL7FA(3)[6],=WL7FR(3)[6],=WL7FU(3)[6],=WL7H(3)[6],=WL7HE(3)[6], + =WL7HK(3)[6],=WL7HL(3)[6],=WL7IQ(3)[6],=WL7IS(3)[6],=WL7JM(3)[6],=WL7K(3)[6],=WL7K/7(3)[6], + =WL7K/M(3)[6],=WL7LB(3)[6],=WL7LK(3)[6],=WL7OA(3)[6],=WL7P(3)[6],=WL7PJ(3)[6],=WL7QC(3)[6], + =WL7QX(3)[6],=WL7RV/140(3)[6],=WL7SD(3)[6],=WL7SO(3)[6],=WL7SV(3)[6],=WL7T(3)[6],=WL7VK(3)[6], + =WL7WB(3)[6],=WL7WF(3)[6],=WL7WG(3)[6],=WL7WU(3)[6],=WL7XE(3)[6],=WL7XJ(3)[6],=WL7XN(3)[6], + =WL7XW(3)[6],=WL7Z(3)[6],=WL7ZM(3)[6],=WP2ADG(3)[6],=WP4BZG(3)[6],=WP4DYP(3)[6],=WP4NBP(3)[6], AA8(4)[8],AB8(4)[8],AC8(4)[8],AD8(4)[8],AE8(4)[8],AF8(4)[8],AG8(4)[8],AI8(4)[8],AJ8(4)[8], AK8(4)[8],K8(4)[8],KA8(4)[8],KB8(4)[8],KC8(4)[8],KD8(4)[8],KE8(4)[8],KF8(4)[8],KG8(4)[8], KI8(4)[8],KJ8(4)[8],KK8(4)[8],KM8(4)[8],KN8(4)[8],KO8(4)[8],KQ8(4)[8],KR8(4)[8],KS8(4)[8], @@ -1566,10 +1571,10 @@ United States: 05: 08: NA: 37.53: 91.67: 5.0: K: =KP2XX(4)[8],=KP3JOS(4)[8],=KP3VA/M(4)[8],=KP4CI(4)[8],=KP4GE/9(4)[8],=KP4SL(4)[8],=KP4WG(4)[8], =NH2W(4)[8],=NH2W/9(4)[8],=NH6R(4)[8],=NH7TK(4)[8],=NL7CM(4)[8],=NL7KD(4)[8],=NL7NK(4)[8], =NL7QC(4)[8],=NL7QC/9(4)[8],=NL7RC(4)[8],=NL7UH(4)[8],=NL7YI(4)[8],=NP2AV(4)[8],=NP2GM(4)[8], - =NP2L/9(4)[8],=NP2MU(4)[8],=NP3QC(4)[8],=NP4ZI(4)[8],=WH0AI(4)[8],=WH2T(4)[8],=WH6FBA(4)[8], - =WH6SB(4)[8],=WL7AHP(4)[8],=WL7AIT(4)[8],=WL7BEV(4)[8],=WL7CTA(4)[8],=WL7FJ(4)[8],=WL7JAN(4)[8], - =WL7NP(4)[8],=WL7UU(4)[8],=WP2B(4)[8],=WP4JSP(4)[8],=WP4KGF(4)[8],=WP4LKY(4)[8],=WP4LSQ(4)[8], - =WP4MQX(4)[8],=WP4MSD(4)[8],=WP4MTN(4)[8],=WP4MVQ(4)[8],=WP4MYL(4)[8],=WP4OCZ(4)[8], + =NP2L/9(4)[8],=NP2MU(4)[8],=NP3QC(4)[8],=NP4ZI(4)[8],=WH0AI(4)[8],=WH2T(4)[8],=WH6ERQ(4)[8], + =WH6FBA(4)[8],=WH6SB(4)[8],=WL7AHP(4)[8],=WL7AIT(4)[8],=WL7BEV(4)[8],=WL7CTA(4)[8],=WL7FJ(4)[8], + =WL7JAN(4)[8],=WL7NP(4)[8],=WL7UU(4)[8],=WP2B(4)[8],=WP4JSP(4)[8],=WP4KGF(4)[8],=WP4LKY(4)[8], + =WP4LSQ(4)[8],=WP4MQX(4)[8],=WP4MSD(4)[8],=WP4MTN(4)[8],=WP4MVQ(4)[8],=WP4MYL(4)[8],=WP4OCZ(4)[8], =AH2BG(4)[8],=AH6ES(4)[8],=AH6FF(4)[8],=AH6HR(4)[8],=AH6HR/4(4)[8],=AH6KB(4)[8],=AL0P(4)[8], =AL2C(4)[8],=AL2F(4)[8],=AL2F/4(4)[8],=AL4B(4)[8],=AL7CX(4)[8],=AL7EU(4)[8],=AL7KN(4)[8], =AL7MR(4)[8],=AL7QO(4)[8],=KH0UN(4)[8],=KH2AR(4)[8],=KH2AR/4(4)[8],=KH2DN(4)[8],=KH4AF(4)[8], @@ -1577,19 +1582,20 @@ United States: 05: 08: NA: 37.53: 91.67: 5.0: K: =KH6SKY/4(4)[8],=KH7JM(4)[8],=KH7UB(4)[8],=KL0AH(4)[8],=KL0BX(4)[8],=KL0CP(4)[8],=KL0ET(4)[8], =KL0ET/M(4)[8],=KL0EY(4)[8],=KL0FF(4)[8],=KL0GI(4)[8],=KL0LN(4)[8],=KL0PM(4)[8],=KL0VH(4)[8], =KL1DN(4)[8],=KL1IG(4)[8],=KL1LV(4)[8],=KL1SE(4)[8],=KL1SE/4(4)[8],=KL1ZA(4)[8],=KL2GB(4)[8], - =KL2HK(4)[8],=KL2LK(4)[8],=KL2LU(4)[8],=KL2MU(4)[8],=KL2UC(4)[8],=KL3PG(4)[8],=KL4KA(4)[8], - =KL7DT/4(4)[8],=KL7FO/P(4)[8],=KL7GN/M(4)[8],=KL7IUQ(4)[8],=KL7JKC(4)[8],=KL7LT(4)[8], - =KL7WW(4)[8],=KL7YN(4)[8],=KL7YT(4)[8],=KL9MEK(4)[8],=KP3RC(4)[8],=KP4TOM(4)[8],=NH2E(4)[8], - =NH6T/4(4)[8],=NH7FK(4)[8],=NH7FL(4)[8],=NH7H(4)[8],=NL7OE(4)[8],=NL7YU(4)[8],=NP3FB(4)[8], - =NP4AC(4)[8],=NP4AC/4(4)[8],=WH6AUL(4)[8],=WH6BPL(4)[8],=WH6BPL/4(4)[8],=WH6DM(4)[8], - =WH6EOG(4)[8],=WH6FEJ(4)[8],=WH6LAK(4)[8],=WL4B(4)[8],=WL7BHI(4)[8],=WL7BHJ(4)[8],=WL7CQH(4)[8], - =WL7CQK(4)[8],=WL7IP(4)[8],=WL7PC(4)[8],=WL7SF(4)[8],=WL7TD(4)[8],=WL7XZ(4)[8],=WP4CNA(4)[8], + =KL2HK(4)[8],=KL2LK(4)[8],=KL2LU(4)[8],=KL2MU(4)[8],=KL2UC(4)[8],=KL3PG(4)[8],=KL3PV(4)[8], + =KL4KA(4)[8],=KL7DT/4(4)[8],=KL7FO/P(4)[8],=KL7GN/M(4)[8],=KL7IUQ(4)[8],=KL7JKC(4)[8], + =KL7LT(4)[8],=KL7WW(4)[8],=KL7YN(4)[8],=KL7YT(4)[8],=KL9MEK(4)[8],=KP3RC(4)[8],=KP4TOM(4)[8], + =NH2E(4)[8],=NH6T/4(4)[8],=NH7FK(4)[8],=NH7FL(4)[8],=NH7H(4)[8],=NL7OE(4)[8],=NL7YU(4)[8], + =NP3FB(4)[8],=NP4AC(4)[8],=NP4AC/4(4)[8],=WH6AUL(4)[8],=WH6BPL(4)[8],=WH6BPL/4(4)[8],=WH6DM(4)[8], + =WH6EOG(4)[8],=WH6EQW(4)[8],=WH6FEJ(4)[8],=WH6LAK(4)[8],=WL4B(4)[8],=WL7BHI(4)[8],=WL7BHJ(4)[8], + =WL7CQH(4)[8],=WL7CQK(4)[8],=WL7IP(4)[8],=WL7PC(4)[8],=WL7SF(4)[8],=WL7TD(4)[8],=WL7XZ(4)[8], + =WP4CNA(4)[8], =AL7AU(4)[7],=AL7NI(4)[7],=AL7RT(4)[7],=AL7RT/7(4)[7],=KH2BR/7(4)[7],=KH6JVF(4)[7],=KH6OZ(4)[7], - =KH7SS(4)[7],=KL0NT(4)[7],=KL0NV(4)[7],=KL0RN(4)[7],=KL1HE(4)[7],=KL1MW(4)[7],=KL1TV(4)[7], - =KL2NZ(4)[7],=KL7AR(4)[7],=KL7HF(4)[7],=KL7JGS(4)[7],=KL7JGS/M(4)[7],=KL7JM(4)[7],=KL7LH(4)[7], - =KL7MVX(4)[7],=KL7YY/7(4)[7],=KL9A(4)[7],=KL9A/7(4)[7],=NH0E(4)[7],=NH6HW(4)[7],=NL7IH(4)[7], - =NL7MW(4)[7],=WH2M(4)[7],=WH6COM(4)[7],=WH6ETU(4)[7],=WH6EVP(4)[7],=WL7A(4)[7],=WL7DP(4)[7], - =WL7HP/7(4)[7],=WL7I(4)[7], + =KH7SS(4)[7],=KL0NT(4)[7],=KL0NV(4)[7],=KL0RN(4)[7],=KL0TF(4)[7],=KL1HE(4)[7],=KL1MW(4)[7], + =KL1TV(4)[7],=KL2NZ(4)[7],=KL4CZ(4)[7],=KL7AR(4)[7],=KL7HF(4)[7],=KL7JGS(4)[7],=KL7JGS/M(4)[7], + =KL7JM(4)[7],=KL7JUL(4)[7],=KL7LH(4)[7],=KL7MVX(4)[7],=KL7YY/7(4)[7],=KL9A(4)[7],=KL9A/7(4)[7], + =NH0E(4)[7],=NH6HW(4)[7],=NL7IH(4)[7],=NL7MW(4)[7],=WH2M(4)[7],=WH6COM(4)[7],=WH6ETU(4)[7], + =WH6EVP(4)[7],=WL7A(4)[7],=WL7DP(4)[7],=WL7HP/7(4)[7],=WL7I(4)[7], =AL7LU(5)[8],=KL7JFR(5)[8],=WL7HC(5)[8],=WP4GR(5)[8]; Guantanamo Bay: 08: 11: NA: 20.00: 75.00: 5.0: KG4: KG4,=KG44WW,=KG4AC,=KG4AS,=KG4AW,=KG4AY,=KG4BP,=KG4DY,=KG4EM,=KG4EU,=KG4HF,=KG4HH,=KG4LA,=KG4LB, @@ -1598,15 +1604,16 @@ Mariana Islands: 27: 64: OC: 15.18: -145.72: -10.0: KH0: AH0,KH0,NH0,WH0,=AB2HV,=AB2QH,=AB9HF,=AB9OQ,=AC8CP,=AD5KT,=AD6YP,=AE6OG,=AF4IN,=AF4KH,=AF6EO, =AH2U,=AJ6K,=AK1JA,=K0FRI,=K8KH,=K8RN,=KB5UAB,=KB9LQG,=KC2WIK,=KC5SPG,=KC7SDC,=KC9GQX,=KD7GJX, =KG2QH,=KG6GQ,=KG6SB,=KG7DCN,=KH0EN/KT,=KH2GV,=KH2O,=KH2VL,=KL7QOL,=KW2X,=N0J,=N3QD,=N6EAX,=N7NVX, - =N8CS,=NA1M,=NH2B,=NH2FG,=NU2A,=W1FPU,=W3FM,=W3NL,=W3STX,=W7KFS,=WA6AC,=WE1J,=WH6ZW,=WO2G; + =N8CS,=NA1M,=NH2B,=NH2FG,=NO3V,=NU2A,=W1FPU,=W3FM,=W3NL,=W3STX,=W7KFS,=WA6AC,=WE1J,=WH6ZW,=WO2G; Baker & Howland Islands: 31: 61: OC: 0.00: 176.00: 12.0: KH1: AH1,KH1,NH1,WH1; Guam: 27: 64: OC: 13.37: -144.70: -10.0: KH2: - AH2,KH2,NH2,WH2,=AB2AB,=AB8EW,=AC0FG,=AE6QZ,=AH0AX,=AH0F,=AH0FM,=AH0S,=AI6ID,=K1IWD,=K2QGC,=K5GUA, - =K5GUM,=KA0RU,=KA6BEG,=KB5OXR,=KB7OVT,=KB7PQU,=KC2OOX,=KD7IRV,=KE4YSP,=KE6ATM,=KE7GMC,=KE7IPG, - =KF4UFC,=KF5ULC,=KF7BMU,=KG4BKW,=KG6AGT,=KG6ARL,=KG6DX,=KG6FJG,=KG6JDX,=KG6JKR,=KG6JKT,=KG6TWZ, - =KH0C,=KH0DX,=KH0ES,=KH0TF,=KH0UM,=KH6KK,=KI4KKH,=KI4KKI,=KI7SSW,=KJ6KCJ,=KK6GVF,=KK7AV,=KM4NVB, - =N2MI,=NH0A,=NH0B,=NH7TL,=NH7WC,=NP3EZ,=W5LFA,=W6KV,=W7GVC,=W9MRE,=WA3KNB,=WB7AXZ,=WD6DGS,=WH0AC; + AH2,KH2,NH2,WH2,=AB2AB,=AB8EW,=AC0FG,=AC7WL,=AE6QZ,=AH0AX,=AH0F,=AH0FM,=AH0S,=AI6ID,=AJ6JF,=K1IWD, + =K2QGC,=K5GUA,=K5GUM,=KA0RU,=KA1I,=KA6BEG,=KB5OXR,=KB7OVT,=KB7PQU,=KC2OOX,=KD7IRV,=KE4YSP,=KE6ATM, + =KE7GMC,=KE7IPG,=KF4UFC,=KF5ULC,=KF7BMU,=KG4BKW,=KG6AGT,=KG6ARL,=KG6DX,=KG6FJG,=KG6JDX,=KG6JKR, + =KG6JKT,=KG6TWZ,=KH0C,=KH0DX,=KH0ES,=KH0TF,=KH0UM,=KH6KK,=KI4KKH,=KI4KKI,=KI7SSW,=KJ6KCJ,=KK6GVF, + =KK7AV,=KM4NVB,=N2MI,=NH0A,=NH0B,=NH0Q,=NH7TL,=NH7WC,=NP3EZ,=W5LFA,=W6KV,=W7GVC,=W9MRE,=WA3KNB, + =WB7AXZ,=WD6DGS,=WH0AC; Johnston Island: 31: 61: OC: 16.72: 169.53: 10.0: KH3: AH3,KH3,NH3,WH3,=KJ6BZ; Midway Island: 31: 61: OC: 28.20: 177.37: 11.0: KH4: @@ -1615,10 +1622,10 @@ Palmyra & Jarvis Islands: 31: 61: OC: 5.87: 162.07: 11.0: KH5: AH5,KH5,NH5,WH5; Hawaii: 31: 61: OC: 21.12: 157.48: 10.0: KH6: AH6,AH7,KH6,KH7,NH6,NH7,WH6,WH7,=AA7LE,=AA8JA,=AB0JM,=AB3WS,=AB6AP,=AB8VQ,=AC4PJ,=AC4TJ,=AC7LR, - =AC7N,=AC9PT,=AE3TT,=AE5AB,=AE5LR,=AG4FH,=AH0A,=AH0AG,=AH2CN,=AJ0M,=AJ6JF,=AJ8HT,=AK0P,=AK2J, - =AL3U,=AL7RQ,=K0BAD,=K0LAS,=K0LIH,=K0LUC,=K0OUS,=K1ENT,=K1HZM,=K1OSP,=K1OWL,=K1RJ,=K1VAN,=K2FFT, - =K2GT,=K3NW,=K3QHP,=K3UNS,=K4EVR,=K4RAC,=K4UAI,=K4UHL,=K4XS,=K4XSS,=K4XV,=K5HQM,=K5UN,=K5ZAI, - =K5ZYO,=K6AMA,=K6APP,=K6ATF,=K6CEE,=K6GJS,=K6GUY,=K6HI,=K6JAE,=K6MIO,=K6NLF,=K6RSB,=K7ALH,=K7ASH, + =AC7N,=AC9PT,=AE3TT,=AE5AB,=AE5LR,=AG4FH,=AH0A,=AH0AG,=AH2CN,=AJ0M,=AJ8HT,=AK0P,=AK2J,=AL3U, + =AL7RQ,=K0BAD,=K0LAS,=K0LIH,=K0LUC,=K0OUS,=K1ENT,=K1HZM,=K1OSP,=K1OWL,=K1RJ,=K1VAN,=K2FFT,=K2GT, + =K3NW,=K3QHP,=K3UNS,=K4EVR,=K4RAC,=K4UAI,=K4UHL,=K4XS,=K4XSS,=K4XV,=K5HQM,=K5UN,=K5ZAI,=K5ZYO, + =K6AMA,=K6APP,=K6ATF,=K6BU,=K6CEE,=K6GJS,=K6GUY,=K6HI,=K6JAE,=K6MIO,=K6NLF,=K6RSB,=K7ALH,=K7ASH, =K7FAR,=K7FR,=K7NRJ,=K7QAS,=K8EUT,=K9AGI,=K9FD,=K9UBS,=KA0FOR,=KA0VHP,=KA1ICJ,=KA1YJ,=KA2IXG, =KA2WXU,=KA3HIZ,=KA3TUA,=KA4INK,=KA6QOD,=KA7APU,=KA7RKW,=KA8EBL,=KA8KND,=KA9DMP,=KB0DJR,=KB0PXK, =KB0ZKZ,=KB1EUJ,=KB1GC,=KB1PCX,=KB1UHL,=KB2MRY,=KB3DMT,=KB3IOC,=KB3OXU,=KB3PJS,=KB3SEV,=KB4NGN, @@ -1629,31 +1636,32 @@ Hawaii: 31: 61: OC: 21.12: 157.48: 10.0: KH6: =KC7KBA,=KC7KHW,=KC7KJT,=KC7LFM,=KC7NZ,=KC7PLG,=KC7USA,=KC7VHF,=KC7VWU,=KC7YXO,=KC8EFI,=KC8EJ, =KC9AUA,=KC9EQS,=KC9KEX,=KC9NJG,=KC9SBG,=KD0QLQ,=KD0QLR,=KD0RPD,=KD0WVZ,=KD0ZSP,=KD3FZ,=KD4GW, =KD4ML,=KD4QWO,=KD5ACN,=KD5BSK,=KD5HDA,=KD5HX,=KD5TBQ,=KD6CVU,=KD6CWF,=KD6EPD,=KD6IPX,=KD6LRA, - =KD6VTU,=KD7GWM,=KD7HTG,=KD7LMP,=KD7SME,=KD7SMV,=KD7TZ,=KD7UV,=KD7UZG,=KD7WJM,=KD8GVO,=KE0TU, - =KE2CX,=KE4DYE,=KE4RNU,=KE4UXQ,=KE4ZXQ,=KE5CGA,=KE5FJM,=KE5UZN,=KE6AXN,=KE6AXP,=KE6AYZ,=KE6CQE, - =KE6EDJ,=KE6EVT,=KE6JXO,=KE6RAW,=KE6TFR,=KE6TIS,=KE6TKQ,=KE7FJA,=KE7FSK,=KE7HEW,=KE7IZS,=KE7JTX, - =KE7KRQ,=KE7LWN,=KE7MW,=KE7PEQ,=KE7PIZ,=KE7QML,=KE7RCT,=KE7UAJ,=KE7UV,=KE7UW,=KF4DWA,=KF4FQR, - =KF4IBW,=KF4JLZ,=KF4OOB,=KF4URD,=KF4VHS,=KF5AHW,=KF5LBQ,=KF5MXM,=KF5MXP,=KF6BS,=KF6FDG,=KF6IVV, - =KF6LWN,=KF6LYU,=KF6MQT,=KF6OSA,=KF6PJ,=KF6PQE,=KF6QZD,=KF6RLP,=KF6YZR,=KF6ZAL,=KF6ZVS,=KF7GNP, - =KF7IJL,=KF7LRS,=KF7OJR,=KF7TUU,=KF7VUK,=KG0XR,=KG4HZF,=KG4SGC,=KG4SGV,=KG6DV,=KG6EFD,=KG6HRX, - =KG6IGY,=KG6JJP,=KG6LFX,=KG6MZJ,=KG6NNF,=KG6NQI,=KG6OOB,=KG6RJI,=KG6SDD,=KG6TFI,=KG6WZD,=KG7AYU, - =KG7CJI,=KG7CVR,=KG7EUP,=KH0AI,=KH0HL,=KH0WJ,=KH2MD,=KH2TD,=KH2TE,=KH2YI,=KH3AE,=KH3AE/M,=KH3AF, - =KH8Z,=KI4CAU,=KI4HCZ,=KI4NOH,=KI4YAF,=KI4YOG,=KI6CRL,=KI6DVJ,=KI6EFY,=KI6FTE,=KI6HBZ,=KI6JEC, - =KI6LPT,=KI6NOC,=KI6QDQ,=KI6QQJ,=KI6SNP,=KI6VYB,=KI6WOJ,=KI6ZRV,=KI7EZG,=KI7FJW,=KI7FJX,=KI7FUT, - =KI7OS,=KI7QZQ,=KJ4BHO,=KJ4EYV,=KJ4KND,=KJ4WOI,=KJ6GYD,=KJ6LAW,=KJ6LAX,=KJ6LBI,=KJ6NZH,=KJ6QQT, - =KJ6RGW,=KJ6SKC,=KJ6TJZ,=KK4EEC,=KK6BRW,=KK6EJ,=KK6GM,=KK6OMX,=KK6PGA,=KK6QAI,=KK6VJN,=KK6ZQ, - =KK6ZZE,=KK7WR,=KL1TP,=KL3FN,=KL7PN,=KL7UB,=KM6BOQ,=KM6IK,=KM6RM,=KN6BE,=KN6ZU,=KN8AQR,=KO6KW, - =KO6QT,=KQ6CD,=KQ6M,=KU4OY,=KW4JC,=KY1I,=N0CAN,=N0DQD,=N0PJV,=N0RMC,=N0ZSJ,=N1CBF,=N1CFD,=N1CNQ, - =N1IDP,=N1SHV,=N1TEE,=N1TLE,=N1VOP,=N1YLH,=N2AL,=N2KJU,=N2KLQ,=N3DJT,=N3FUR,=N3GWR,=N3HQW,=N3RWD, - =N3VDM,=N3ZFY,=N4ERA,=N4ZIW,=N5IWF,=N5JKJ,=N6AI,=N6CGA,=N6DXW,=N6GOZ,=N6IKX,=N6KB,=N6NCT,=N6PJQ, - =N6QBK,=N6ZAB,=N7AMY,=N7BLC,=N7KZB,=N7NYY,=N7ODC,=N7TSV,=N7WBX,=N9CRQ,=N9GFL,=N9SBL,=NB6R,=NE7SO, - =NG1T,=NH2CC,=NH2CD,=NH2CF,=NH2CQ,=NH2CR,=NH2IB,=NH2IF,=NH2II,=NH2IJ,=NH2IO,=NH2JO,=NH2KF,=NH2KH, - =NH2YL,=NH2Z,=NI1J,=NL7UW,=NM2B,=NO0H,=NT0DA,=NT4AA,=NZ2F,=W0UNX,=W1BMB,=W2UNS,=W3ZRT,=W4YQS, - =W5FJG,=W6AUS,=W6CAG,=W6CWJ,=W6KEV,=W6KIT,=W6KPI,=W6MQB,=W6MRJ,=W6NBK,=W6ROM,=W6SHH,=W6UNX,=W7EHP, - =W7NVQ,=W7NX,=W7OO,=W7RCR,=W7UEA,=W8AYD,=W8JAY,=W8WH,=WA0FUR,=WA0NHD,=WA2AUI,=WA3ZEM,=WA6ECX, - =WA6IIQ,=WA6JDA,=WA6JJQ,=WA6QDQ,=WA6UVF,=WA7ESE,=WA7HEO,=WA7TFE,=WA7ZK,=WA8JQP,=WB0RUA,=WB0TZQ, - =WB2AHM,=WB2SQW,=WB4JTT,=WB4MNF,=WB5ZDH,=WB5ZOV,=WB6CVJ,=WB6PIO,=WB6PJT,=WB6SAA,=WB8NCD,=WB9SMM, - =WC6B,=WD0FTF,=WD0LFN,=WD6EZL,=WD6GHJ,=WD8LIB,=WD8OBO,=WH2Y,=WH7K,=WU0H,=WV0Z,=WV6K,=WX7G,=WY6F; + =KD6NVX,=KD6VTU,=KD7GWM,=KD7HTG,=KD7KFT,=KD7LMP,=KD7SME,=KD7SMV,=KD7TZ,=KD7UV,=KD7UZG,=KD7WJM, + =KD8GVO,=KE0TU,=KE2CX,=KE4DYE,=KE4RNU,=KE4UXQ,=KE4ZXQ,=KE5CGA,=KE5FJM,=KE5UZN,=KE6AXN,=KE6AXP, + =KE6AYZ,=KE6CQE,=KE6EDJ,=KE6EVT,=KE6JXO,=KE6RAW,=KE6TFR,=KE6TIS,=KE6TKQ,=KE7FJA,=KE7FSK,=KE7HEW, + =KE7IZS,=KE7JTX,=KE7KRQ,=KE7LWN,=KE7MW,=KE7PEQ,=KE7PIZ,=KE7QML,=KE7RCT,=KE7UAJ,=KE7UV,=KE7UW, + =KF4DWA,=KF4FQR,=KF4IBW,=KF4JLZ,=KF4OOB,=KF4URD,=KF4VHS,=KF5AHW,=KF5LBQ,=KF5MXM,=KF5MXP,=KF6BS, + =KF6FDG,=KF6IVV,=KF6LWN,=KF6LYU,=KF6MQT,=KF6OSA,=KF6PJ,=KF6PQE,=KF6QZD,=KF6RLP,=KF6YZR,=KF6ZAL, + =KF6ZVS,=KF7GNP,=KF7IJL,=KF7LRS,=KF7OJR,=KF7TUU,=KF7VUK,=KG0XR,=KG4HZF,=KG4SGC,=KG4SGV,=KG6DV, + =KG6EFD,=KG6HRX,=KG6IGY,=KG6JJP,=KG6LFX,=KG6MZJ,=KG6NNF,=KG6NQI,=KG6OOB,=KG6RJI,=KG6SDD,=KG6TFI, + =KG6WZD,=KG7AYU,=KG7CJI,=KG7CVR,=KG7EUP,=KH0AI,=KH0HL,=KH0WJ,=KH2MD,=KH2TD,=KH2TE,=KH2YI,=KH3AE, + =KH3AE/M,=KH3AF,=KH8Z,=KI4CAU,=KI4HCZ,=KI4NOH,=KI4YAF,=KI4YOG,=KI6CRL,=KI6DVJ,=KI6EFY,=KI6FTE, + =KI6HBZ,=KI6JEC,=KI6LPT,=KI6NOC,=KI6QDQ,=KI6QQJ,=KI6SNP,=KI6VYB,=KI6WOJ,=KI6ZRV,=KI7EZG,=KI7FJW, + =KI7FJX,=KI7FUT,=KI7OS,=KI7QZQ,=KJ4BHO,=KJ4EYV,=KJ4KND,=KJ4WOI,=KJ6GYD,=KJ6LAW,=KJ6LAX,=KJ6LBI, + =KJ6NZH,=KJ6QQT,=KJ6RGW,=KJ6SKC,=KJ6TJZ,=KK4EEC,=KK6BRW,=KK6EJ,=KK6GM,=KK6OMX,=KK6PGA,=KK6QAI, + =KK6RM,=KK6VJN,=KK6ZQ,=KK6ZZE,=KK7WR,=KL0TK,=KL1TP,=KL3FN,=KL7PN,=KL7UB,=KM6BOQ,=KM6IK,=KM6RM, + =KN6BE,=KN6ZU,=KN8AQR,=KO6KW,=KO6QT,=KQ6CD,=KQ6M,=KU4OY,=KW4JC,=KY1I,=N0CAN,=N0DQD,=N0KXY,=N0PJV, + =N0RMC,=N0ZSJ,=N1CBF,=N1CFD,=N1CNQ,=N1IDP,=N1SHV,=N1TEE,=N1TLE,=N1VOP,=N1YLH,=N2AL,=N2KJU,=N2KLQ, + =N3DJT,=N3FUR,=N3GWR,=N3HQW,=N3RWD,=N3VDM,=N3ZFY,=N4ERA,=N4ZIW,=N5IWF,=N5JKJ,=N6AI,=N6CGA,=N6DXW, + =N6GOZ,=N6IKX,=N6KB,=N6NCT,=N6PJQ,=N6QBK,=N6ZAB,=N7AMY,=N7BLC,=N7KZB,=N7NYY,=N7ODC,=N7TSV,=N7WBX, + =N9CRQ,=N9GFL,=N9SBL,=NB6R,=NE7SO,=NG1T,=NH2CC,=NH2CD,=NH2CF,=NH2CQ,=NH2CR,=NH2IB,=NH2IF,=NH2II, + =NH2IJ,=NH2IO,=NH2JO,=NH2KF,=NH2KH,=NH2YL,=NH2Z,=NI1J,=NL7UW,=NM2B,=NO0H,=NT0DA,=NT4AA,=NZ2F, + =W0UNX,=W1BMB,=W2UNS,=W3ZRT,=W4YQS,=W5FJG,=W6AUS,=W6CAG,=W6CWJ,=W6KEV,=W6KIT,=W6KPI,=W6MQB,=W6MRJ, + =W6NBK,=W6ROM,=W6SHH,=W6UNX,=W7EHP,=W7NVQ,=W7NX,=W7OO,=W7RCR,=W7UEA,=W8AYD,=W8JAY,=W8WH,=WA0FUR, + =WA0NHD,=WA2AUI,=WA3ZEM,=WA6ECX,=WA6IIQ,=WA6JDA,=WA6JJQ,=WA6QDQ,=WA6UVF,=WA7ESE,=WA7HEO,=WA7TFE, + =WA7ZK,=WA8JQP,=WB0RUA,=WB0TZQ,=WB2AHM,=WB2SQW,=WB4JTT,=WB4MNF,=WB5ZDH,=WB5ZOV,=WB6CVJ,=WB6PIO, + =WB6PJT,=WB6SAA,=WB8NCD,=WB9SMM,=WC6B,=WD0FTF,=WD0LFN,=WD6EZL,=WD6GHJ,=WD8LIB,=WD8OBO,=WH2Y,=WH7K, + =WU0H,=WV0Z,=WV6K,=WX7G,=WY6F; Kure Island: 31: 61: OC: 29.00: 178.00: 10.0: KH7K: AH7K,KH7K,NH7K,WH7K; American Samoa: 32: 62: OC: -14.32: 170.78: 11.0: KH8: @@ -1666,8 +1674,8 @@ Alaska: 01: 01: NA: 61.40: 148.87: 8.0: KL: AL,KL,NL,WL,=AA0NN,=AA8FY,=AB0IC,=AB0WK,=AB5JB,=AB7YB,=AB7YO,=AB8XX,=AB9OM,=AC0CW,=AC9QX,=AD0DK, =AD0FQ,=AD0ZL,=AD3BJ,=AD6GC,=AD7MF,=AD7VV,=AE1DJ,=AE4QH,=AE5CP,=AE5EX,=AE5FN,=AE5IR,=AE7ES,=AE7KS, =AE7SB,=AF7FV,=AG5LN,=AG5OF,=AH0AH,=AH0H,=AJ4ZI,=K0AZZ,=K0BHC,=K1BZD,=K1KAO,=K1MAT,=K2ICW,=K2NPS, - =K3JMI,=K4DRC,=K4ETC,=K4HOE,=K4RND,=K4WPK,=K5DOW,=K5HL,=K5RD,=K5RSO,=K5RZW,=K5TDN,=K5UBS,=K6ANE, - =K6GKW,=K7EJM,=K7GRW,=K7LOP,=K7MVX,=K7OCL,=K7RDR,=K7SGA,=K7UNX,=K7ZOA,=K8IEL,=K8OUA,=K9DUG,=K9WUV, + =K3JMI,=K4DRC,=K4ETC,=K4HOE,=K4RND,=K4WPK,=K5DOW,=K5HL,=K5RD,=K5RSO,=K5RZW,=K5TDN,=K6ANE,=K6GKW, + =K7EJM,=K7GRW,=K7LOP,=K7MVX,=K7OCL,=K7RDR,=K7SGA,=K7UNX,=K7ZOA,=K8IEL,=K8OUA,=K9DUG,=K9WUV, =KA0SIM,=KA0YPV,=KA1NCN,=KA2TJZ,=KA2ZSD,=KA6UGT,=KA7ETQ,=KA7HOX,=KA7JOR,=KA7TMU,=KA7TOM,=KA7UKN, =KA7VCR,=KA7YEY,=KA9GYQ,=KB0APK,=KB0LOW,=KB0TSU,=KB0UGE,=KB0UVK,=KB1CRT,=KB1FCX,=KB1KLH,=KB1PHP, =KB1QCD,=KB1QCE,=KB1SYV,=KB1WQL,=KB2JWV,=KB2ZME,=KB3CYB,=KB3JFK,=KB3NCR,=KB3VQE,=KB4DX,=KB5DNT, @@ -1688,49 +1696,49 @@ Alaska: 01: 01: NA: 61.40: 148.87: 8.0: KL: =KE6DLM,=KE6DUJ,=KE6DXH,=KE6IPM,=KE6SYD,=KE6TCE,=KE6VUB,=KE7DFO,=KE7ELL,=KE7EOP,=KE7EPZ,=KE7FNC, =KE7FXM,=KE7GOE,=KE7HMJ,=KE7KYU,=KE7TRX,=KE8RO,=KF4JET,=KF4PLR,=KF4TBD,=KF4YFD,=KF5CVM,=KF5FJQ, =KF5HFB,=KF5HJC,=KF5NDT,=KF5NHR,=KF5YYK,=KF6AWG,=KF6AXS,=KF6BMF,=KF6BOV,=KF6EJR,=KF6GNM,=KF6IAO, - =KF6ILC,=KF6IOT,=KF6LGK,=KF6MFK,=KF6QOJ,=KF6RMG,=KF6RPC,=KF6SHS,=KF6TGR,=KF6UWT,=KF7GKY,=KF7LEX, - =KF7LUA,=KF7PCJ,=KF7PFT,=KF7PSS,=KF7PUQ,=KF7UFY,=KF7VBO,=KF8ZB,=KG2IA,=KG4BBX,=KG4NBL/P,=KG4TJS, - =KG4WNZ,=KG5EQN,=KG5GDF,=KG5GTD,=KG5JQC,=KG5MIB,=KG6DTI,=KG6MBC,=KG6RJE,=KG6TAL,=KG7CUR,=KG7DVI, - =KG7GJL,=KG7JVJ,=KG7OQC,=KG7SEQ,=KG7TGE,=KH0NF,=KH0NG,=KH0RF,=KH2YN,=KH7BW,=KH7DA,=KI4COG,=KI4ERC, - =KI4GAG,=KI4GCF,=KI4GDI,=KI4NGY,=KI4NVI,=KI4SET,=KI4SOM,=KI6BGR,=KI6DES,=KI6HGW,=KI6YXZ,=KI7COR, - =KI7PZ,=KI8JT,=KJ4HEW,=KJ4IAQ,=KJ4PSV,=KJ4WDI,=KJ4WIQ,=KJ4ZWI,=KJ6KRG,=KJ6ZSX,=KJ7IR,=KK4AMV, - =KK4CLS,=KK4LRE,=KK4QXE,=KK4RYG,=KK4WWH,=KK4WWI,=KK6IUY,=KK6PGV,=KK7I,=KK7IV,=KK7STL,=KL7D/M, - =KL7NC/IMD,=KM4AGL,=KM4KWS,=KM4KX,=KM4NIC,=KM4OE,=KM4PJH,=KM4TJI,=KN8IVE,=KR4WV,=KV3X,=KW1W,=KY7J, - =KZ6HJC,=N0GDT,=N0GDU,=N0GLI,=N0HJT,=N0HYI,=N0HZF,=N0JEN,=N0LHN,=N0SN,=N0SUB,=N0WXJ,=N0XKY,=N0XS, - =N0ZKV,=N1HEN,=N1HUT,=N1KDQ,=N1KTI,=N1NDA,=N1NJS,=N1QFE,=N1TX,=N2CXH,=N2SHO,=N2TJY,=N2YZW,=N3QEH, - =N4AVX,=N4CM,=N4HCJ,=N4HZU,=N4NAV,=N5CSO,=N5UKX,=N5WPR,=N6BSC,=N6CVV,=N6CZU,=N6JM,=N7BUO,=N7DBN, - =N7FCT,=N7HER,=N7HQK,=N7IA,=N7JUX,=N7MGT,=N7MTG,=N7PHB,=N7QAN,=N7TBU,=N7UTV,=N7UWT,=N7XNM,=N7YKY, - =N7YQS,=N7ZYS,=N8DDY,=N8EX,=N8JKB,=N8KCJ,=N8SUG,=N9AIG,=N9FB,=N9YD,=NA7WM,=NC4OI,=NE7EK,=NH2GZ, - =NH7UO,=NJ7H,=NM0H,=NN4NN,=NP4FU,=NW4G,=NW7F,=W0EZM,=W0FJN,=W0RWS,=W0UZJ,=W1LYD,=W1RSC,=W1ZKA, - =W2DLS,=W2KRZ,=W3JPN,=W4AUL,=W4BMR,=W4LS,=W4RSB,=W5JKT,=W6DDP,=W6GTE,=W6ROW,=W7APM,=W7DDG,=W7EIK, - =W7JMR,=W7PWA,=W7RAZ,=W7ROS,=W7WEZ,=W7ZWT,=W8MDD,=W8PVZ,=W8TCX,=W9ITU,=W9JMC,=WA0JS,=WA1FVJ, - =WA2BGL,=WA2BIW,=WA6GFS,=WA7B,=WA7PXH,=WA7USX,=WA7YXF,=WB0CMZ,=WB1GZL,=WB1ILS,=WB6COP,=WB7TYK, - =WB9JZL,=WD6CET,=WH6CYY,=WH6DPL,=WH6DX,=WH7AK,=WJ8M,=WP4IYI,=WT5T,=WX1NCC; + =KF6ILC,=KF6IOT,=KF6LGK,=KF6MFK,=KF6QOJ,=KF6RMG,=KF6RPC,=KF6SHS,=KF6TGR,=KF6UWT,=KF7CXJ,=KF7GKY, + =KF7LEX,=KF7LUA,=KF7PCJ,=KF7PFT,=KF7PSS,=KF7PUQ,=KF7UFY,=KF7VBO,=KF8ZB,=KG2IA,=KG4BBX,=KG4NBL/P, + =KG4TJS,=KG4WNZ,=KG5EQN,=KG5GDF,=KG5GTD,=KG5JQC,=KG5MIB,=KG5MIO,=KG6DTI,=KG6MBC,=KG6RJE,=KG6TAL, + =KG7CUR,=KG7DVI,=KG7GJL,=KG7JVJ,=KG7OQC,=KG7SEQ,=KG7TGE,=KH0NF,=KH0NG,=KH0RF,=KH2YN,=KH7BW,=KH7DA, + =KI4COG,=KI4ERC,=KI4GAG,=KI4GCF,=KI4GDI,=KI4NGY,=KI4NVI,=KI4SET,=KI4SOM,=KI6BGR,=KI6DES,=KI6HGW, + =KI6YXZ,=KI7COR,=KI7PZ,=KI8JT,=KJ4HEW,=KJ4IAQ,=KJ4PSV,=KJ4WDI,=KJ4WIQ,=KJ4ZWI,=KJ6DCH,=KJ6KRG, + =KJ6ZSX,=KJ7IR,=KK4AMV,=KK4CLS,=KK4LRE,=KK4QXE,=KK4RYG,=KK4WWH,=KK4WWI,=KK6IUY,=KK6PGV,=KK7I, + =KK7IV,=KK7STL,=KL7D/M,=KL7NC/IMD,=KM4AGL,=KM4KWS,=KM4KX,=KM4NIC,=KM4OE,=KM4PJH,=KM4TJI,=KN8IVE, + =KR4WV,=KV3X,=KW1W,=KY7J,=KZ6HJC,=N0GDT,=N0GDU,=N0GLI,=N0HJT,=N0HYI,=N0HZF,=N0JEN,=N0LHN,=N0SN, + =N0SUB,=N0WXJ,=N0XKY,=N0XS,=N0ZKV,=N1HEN,=N1HUT,=N1KDQ,=N1KTI,=N1NDA,=N1NJS,=N1QFE,=N1TX,=N2CXH, + =N2SHO,=N2TJY,=N2YZW,=N3QEH,=N4AVX,=N4CM,=N4HCJ,=N4HZU,=N4NAV,=N5CSO,=N5UKX,=N5WPR,=N6BSC,=N6CVV, + =N6CZU,=N6JM,=N6ZZX,=N7BUO,=N7DBN,=N7FCT,=N7HER,=N7HQK,=N7IA,=N7JUX,=N7MGT,=N7MTG,=N7PHB,=N7QAN, + =N7TBU,=N7UTV,=N7UWT,=N7XNM,=N7YKY,=N7YQS,=N8DDY,=N8EX,=N8JKB,=N8KCJ,=N8SUG,=N9AIG,=N9FB,=N9YD, + =NA7WM,=NC4OI,=NE7EK,=NH2GZ,=NH7UO,=NJ7H,=NM0H,=NN4NN,=NP4FU,=NW4G,=NW7F,=W0EZM,=W0FJN,=W0RWS, + =W0UZJ,=W1LYD,=W1RSC,=W1ZKA,=W2DLS,=W2KRZ,=W3JPN,=W3MKG,=W4AUL,=W4BMR,=W4RSB,=W5JKT,=W6DDP,=W6GTE, + =W6ROW,=W7APM,=W7DDG,=W7EIK,=W7JMR,=W7PWA,=W7RAZ,=W7ROS,=W7WEZ,=W7ZWT,=W8MDD,=W8PVZ,=W8TCX,=W9ITU, + =W9JMC,=WA0JS,=WA1FVJ,=WA2BGL,=WA2BIW,=WA6GFS,=WA7B,=WA7PXH,=WA7USX,=WA7YXF,=WB0CMZ,=WB1GZL, + =WB1ILS,=WB6COP,=WB7TYK,=WB9JZL,=WD6CET,=WH6CYY,=WH6DPL,=WH6DX,=WH7AK,=WJ8M,=WP4IYI,=WT5T,=WX1NCC; Navassa Island: 08: 11: NA: 18.40: 75.00: 5.0: KP1: KP1,NP1,WP1; US Virgin Islands: 08: 11: NA: 17.73: 64.80: 4.0: KP2: KP2,NP2,WP2,=AC7FX,=AJ2O,=K5KFL,=K5TP,=K8RF,=KA7KDU,=KB1MDZ,=KB1ZTY,=KB3ZUD,=KB9ALR,=KC9MCN, - =KD4SGB,=KD5QJN,=KF2HC,=KF4CGR,=KF4MSI,=KG4SZC,=KG5KHO,=KH2XQ,=KH2XR,=KI4FOE,=KI6BLD,=KJ6IR, - =KL7NZ,=KR7O/R,=KV4/W2KW,=KV4AD,=KV4BA,=KV4BT,=KV4BW,=KV4CF,=KV4CQ/P,=KV4DN,=KV4EY,=KV4FZ,=KV4HR, - =KV4IH,=KV4JC,=KV4KW,=N1TKK,=N1VKI,=W0AIH/KV4,=W0YNY,=W2AZK,=W2KW/KV4,=W3K/KD2CLB,=W4LIS,=WA4HLB, - =WB2KQW,=WB4WFU,=WD8AHQ,=WI7C; + =KD4SGB,=KD5QJN,=KF2HC,=KF4CGR,=KF4MSI,=KG4SZC,=KG5KHO,=KG6KVR,=KH2XQ,=KH2XR,=KI4FOE,=KI6BLD, + =KJ6IR,=KL7NZ,=KR7O/R,=KV4/W2KW,=KV4AD,=KV4BA,=KV4BT,=KV4BW,=KV4CF,=KV4CQ/P,=KV4DN,=KV4EY,=KV4FZ, + =KV4HR,=KV4IH,=KV4JC,=KV4KW,=N1TKK,=N1VKI,=W0AIH/KV4,=W0YNY,=W2AZK,=W2KW/KV4,=W3K/KD2CLB,=W4LIS, + =WA4HLB,=WB2KQW,=WB4WFU,=WD8AHQ,=WI7C; Puerto Rico: 08: 11: NA: 18.18: 66.55: 4.0: KP4: - KP3,KP4,NP3,NP4,WP3,WP4,=AA0WX,=AA2ZN,=AB2DR,=AF4OU,=AF5IZ,=AG4CD,=AI4EZ,=K1NDN,=K4C/LH,=K4PFH, - =K5YJR,=K6BOT,=K9JOS,=KA2GNG,=KA2MBR,=KA2YGB,=KA3ZGQ,=KA7URH,=KA9UTY,=KB0AQB,=KB0TEP,=KB1IJU, - =KB1KDP,=KB1RUQ,=KB1TUA,=KB1UEK,=KB1UZV,=KB1ZKF,=KB2ALR,=KB2CIE,=KB2KWB,=KB2MMX,=KB2NMT,=KB2NYN, - =KB2OIF,=KB2OMN,=KB2OPM,=KB2RYP,=KB2TID,=KB2VHY,=KB2WKT,=KB2YKJ,=KB3BPK,=KB3BTN,=KB3LUV,=KB3SBO, - =KB8ZVP,=KB9OWX,=KB9RZD,=KB9YVE,=KB9YVF,=KC1CRV,=KC1CUF,=KC1DRV,=KC1IHB,=KC1IHO,=KC1JLY,=KC1KZI, - =KC2BZZ,=KC2CJL,=KC2CTM,=KC2EMM,=KC2ERU,=KC2JNE,=KC2LET,=KC2TE,=KC2UXP,=KC2VCR,=KC3GEO,=KC5DKT, - =KC8BFN,=KC8IRI,=KD2KPC,=KD2VQ,=KD4TVS,=KD5DVV,=KD5PKH,=KD9GIZ,=KE0AYJ,=KE0GFK,=KE0SH,=KE1MA, - =KE3WW,=KE4GGD,=KE4GYA,=KE4SKH,=KE4THL,=KE4WUE,=KE5LNG,=KF4KPO,=KF4ZDB,=KF6OGJ,=KG4GYO,=KG4IRC, - =KG4IVO,=KG4VCC,=KG5AFY,=KH2RU,=KH4AA,=KI4LRJ,=KI4WOA,=KI4WOB,=KJ4LOZ,=KJ4UPN,=KJ6OV,=KK4AOZ, - =KK4DCX,=KK4EBE,=KK4PHB,=KM4VDZ,=KM4WGI,=KM4YBN,=KM4YSR,=KM4ZJW,=KM6CTO,=KN4AWH,=KN4GNO,=KN4IBD, - =KN4IDV,=KN4IGP,=KN4ILO,=KN4INP,=KN4JCC,=KN4KPX,=KN4KPY,=KN4MNT,=KN4NLZ,=KN4ODN,=KN4QBT,=KN4QZZ, - =KN4REC,=KN4SKZ,=KP2H,=KP2Z,=KP3CW/SKP,=KP3RE/LGT,=KP3RE/LH,=KP3RE/LT,=KP4ES/L,=KP4ES/LGT, - =KP4ES/LH,=KP4FD/IARU,=KP4FRD/LH,=KP4MD/P,=KP4VP/LH,=N0XAR,=N1CN,=N1HRV,=N1JFL,=N1QVU,=N1SCD, - =N1SZM,=N1VCW,=N1YAY,=N1ZJC,=N2KKN,=N2KUE,=N2PGO,=N3JAM,=N3VIJ,=N3YUB,=N3ZII,=N4CIE,=N4JZD,=N4LER, - =N4UK,=N6NVD,=N6RHF,=NB0G,=NP3M/LH,=NP4VO/LH,=W1AW/PR,=W6WAW,=W9JS,=WA2RVA,=WB2HMY,=WB5YOF, - =WB7ADC,=WB7VVV,=WD4LOL,=WP4L/TP,=WR8Z; + KP3,KP4,NP3,NP4,WP3,WP4,=AA0WX,=AA2ZN,=AB2DR,=AF4OU,=AF5IZ,=AG4CD,=AI4EZ,=K1NDN,=K4C/LH,=K4LCR, + =K4PFH,=K5YJR,=K6BOT,=K9JOS,=KA2GNG,=KA2MBR,=KA2YGB,=KA3ZGQ,=KA7URH,=KA9UTY,=KB0AQB,=KB0TEP, + =KB1IJU,=KB1KDP,=KB1RUQ,=KB1TUA,=KB1UEK,=KB1UZV,=KB1ZKF,=KB2ALR,=KB2CIE,=KB2KWB,=KB2MMX,=KB2NMT, + =KB2NYN,=KB2OIF,=KB2OMN,=KB2OPM,=KB2QQK,=KB2RYP,=KB2TID,=KB2VHY,=KB2WKT,=KB2YKJ,=KB3BPK,=KB3BTN, + =KB3LUV,=KB3SBO,=KB8ZVP,=KB9OWX,=KB9RZD,=KB9YVE,=KB9YVF,=KC1CRV,=KC1CUF,=KC1DRV,=KC1IHB,=KC1IHO, + =KC1JLY,=KC1KZI,=KC2BZZ,=KC2CJL,=KC2CTM,=KC2EMM,=KC2ERU,=KC2JNE,=KC2LET,=KC2TE,=KC2UXP,=KC2VCR, + =KC3GEO,=KC5DKT,=KC8BFN,=KC8IRI,=KD2KPC,=KD2VQ,=KD4TVS,=KD5DVV,=KD5PKH,=KD9GIZ,=KD9MRY,=KE0AYJ, + =KE0GFK,=KE0SH,=KE1MA,=KE3WW,=KE4GGD,=KE4GYA,=KE4SKH,=KE4THL,=KE4WUE,=KE5LNG,=KF4KPO,=KF4ZDB, + =KF6OGJ,=KG4GYO,=KG4IRC,=KG4IVO,=KG4VCC,=KG5AFY,=KH2RU,=KH4AA,=KI4LRJ,=KI4WOA,=KI4WOB,=KJ4KZN, + =KJ4LOZ,=KJ4UPN,=KJ6OV,=KK4AOZ,=KK4DCX,=KK4EBE,=KK4PHB,=KM4VDZ,=KM4WGI,=KM4YBN,=KM4YSR,=KM4ZJW, + =KM6CTO,=KN4AWH,=KN4GNO,=KN4IBD,=KN4IDV,=KN4IGP,=KN4ILO,=KN4INP,=KN4JCC,=KN4KPX,=KN4KPY,=KN4MNT, + =KN4NLZ,=KN4ODN,=KN4QBT,=KN4QZZ,=KN4REC,=KN4SKZ,=KN4TNC,=KN4UAN,=KP2H,=KP2Z,=KP3CW/SKP,=KP3RE/LGT, + =KP3RE/LH,=KP3RE/LT,=KP4ES/L,=KP4ES/LGT,=KP4ES/LH,=KP4FD/IARU,=KP4FRD/LH,=KP4MD/P,=KP4VP/LH, + =N0XAR,=N1CN,=N1HRV,=N1JFL,=N1QVU,=N1SCD,=N1SZM,=N1VCW,=N1YAY,=N1ZJC,=N2KKN,=N2KUE,=N2PGO,=N3JAM, + =N3VIJ,=N3YUB,=N3ZII,=N4CIE,=N4JZD,=N4LER,=N4UK,=N6NVD,=N6RHF,=NB0G,=NP3M/LH,=NP4VO/LH,=W1AW/PR, + =W6WAW,=W9JS,=WA2RVA,=WB2HMY,=WB5YOF,=WB7ADC,=WB7VVV,=WD4LOL,=WP4L/TP,=WR8Z; Desecheo Island: 08: 11: NA: 18.08: 67.88: 4.0: KP5: KP5,NP5,WP5; Norway: 14: 18: EU: 61.00: -9.00: -1.0: LA: @@ -1765,41 +1773,41 @@ Argentina: 13: 14: SA: -34.80: 65.92: 3.0: LU: =LU3DLF/D,=LU3DMZ/D,=LU3DO/D,=LU3DOC/D,=LU3DP/D,=LU3DPH/D,=LU3DQJ/D,=LU3DR/D,=LU3DRP/D,=LU3DRP/E, =LU3DXG/D,=LU3DXI/D,=LU3DY/D,=LU3DYN/D,=LU3DZO/D,=LU3EBS/D,=LU3ED/D,=LU3EDU/D,=LU3EFL/D,=LU3EJ/L, =LU3EJD/D,=LU3ELR/D,=LU3EMB/D,=LU3EOU/D,=LU3EP/D,=LU3ERU/D,=LU3ES/D,=LU3ESY/D,=LU3EZA/D,=LU3FCI/D, - =LU3HKA/D,=LU4AA/D,=LU4AAO/D,=LU4AAO/E,=LU4ACA/D,=LU4AJC/D,=LU4BAN/D,=LU4BR/D,=LU4CMF/D,=LU4DBL/D, - =LU4DBP/D,=LU4DBT/D,=LU4DBV/D,=LU4DCE/D,=LU4DCY/D,=LU4DGC/D,=LU4DHA/D,=LU4DHC/D,=LU4DHE/D, - =LU4DIS/D,=LU4DK/D,=LU4DLJ/D,=LU4DLL/D,=LU4DLN/D,=LU4DMI/D,=LU4DPB/D,=LU4DQ/D,=LU4DRC/D,=LU4DRH/D, - =LU4DRH/E,=LU4DVD/D,=LU4EAE/D,=LU4EET/D,=LU4EGP/D,=LU4EHP/D,=LU4EJ/D,=LU4EL/D,=LU4ELE/D,=LU4EOU/D, - =LU4ERS/D,=LU4ESP/D,=LU4ETD/D,=LU4ETN/D,=LU4EV/D,=LU4HSA/D,=LU4HTD/D,=LU4MA/D,=LU4UWZ/D,=LU4UZW/D, - =LU4VEN/D,=LU4VSD/D,=LU4WAP/D,=LU5AHN/D,=LU5ALS/D,=LU5AM/D,=LU5ANL/D,=LU5AQV/D,=LU5ARS/D, - =LU5ASA/D,=LU5AVD/D,=LU5BDS/D,=LU5BE/D,=LU5BTL/D,=LU5CBA/D,=LU5CRE/D,=LU5DA/D,=LU5DA/E,=LU5DAS/D, - =LU5DCO/D,=LU5DDH/D,=LU5DEM/D,=LU5DF/D,=LU5DFR/D,=LU5DFT/D,=LU5DGG/D,=LU5DGR/D,=LU5DHE/D, - =LU5DIT/D,=LU5DJE/D,=LU5DKE/D,=LU5DLH/D,=LU5DLT/D,=LU5DLZ/D,=LU5DMI/D,=LU5DMP/D,=LU5DMR/D, - =LU5DQ/D,=LU5DRV/D,=LU5DSH/D,=LU5DSM/D,=LU5DT/D,=LU5DTB/D,=LU5DTF/D,=LU5DUC/D,=LU5DVB/D,=LU5DWS/D, - =LU5DYT/D,=LU5EAO/D,=LU5EC/D,=LU5ED/D,=LU5EDS/D,=LU5EFG/D,=LU5EH/D,=LU5EHC/D,=LU5EJL/D,=LU5EM/D, - =LU5EP/D,=LU5EW/D,=LU5FZ/D,=LU5FZ/E,=LU5JAH/D,=LU5JIB/D,=LU5OD/D,=LU5VAS/D,=LU5VAT/D,=LU5XP/D, - =LU6AER/D,=LU6CN/D,=LU6DAX/D,=LU6DBL/D,=LU6DC/D,=LU6DCT/D,=LU6DDC/D,=LU6DG/D,=LU6DIE/D,=LU6DIO/D, - =LU6DKT/D,=LU6DL/D,=LU6DM/D,=LU6DO/D,=LU6DRD/D,=LU6DRD/E,=LU6DRN/D,=LU6DRR/D,=LU6DSA/D,=LU6DTB/D, - =LU6EAG/D,=LU6EC/D,=LU6EDC/D,=LU6EE/D,=LU6EEG/D,=LU6EGO/D,=LU6EI/D,=LU6EJJ/D,=LU6EKL/D,=LU6ELP/D, - =LU6EMM/D,=LU6ENA/D,=LU6EPE/D,=LU6EPR/D,=LU6EPR/E,=LU6EQV/D,=LU6EU/D,=LU6EVD/D,=LU6EWR/D, - =LU6EXD/D,=LU6HBB/D,=LU6JJ/D,=LU6UAL/D,=LU6UO/D,=LU6UVI/D,=LU6XQ/D,=LU7AA/D,=LU7AC/D,=LU7ADC/D, - =LU7ADN/D,=LU7ART/D,=LU7AVW/D,=LU7BSN/D,=LU7BTO/D,=LU7BTO/E,=LU7CAW/D,=LU7CP/D,=LU7DAC/D, - =LU7DAF/D,=LU7DAR/D,=LU7DBA/D,=LU7DBL/D,=LU7DCE/D,=LU7DD/D,=LU7DDC/D,=LU7DDO/D,=LU7DHG/D, - =LU7DJH/D,=LU7DLN/D,=LU7DNM/D,=LU7DOT/D,=LU7DP/D,=LU7DR/D,=LU7DS/D,=LU7DSC/D,=LU7DSS/D,=LU7DSU/D, - =LU7DSY/D,=LU7DTC/D,=LU7DZL/D,=LU7DZL/E,=LU7DZV/D,=LU7ECZ/D,=LU7EGY/D,=LU7EHL/D,=LU7EIA/D, - =LU7EJC/D,=LU7ELY/D,=LU7EMA/D,=LU7EMM/D,=LU7ENP/D,=LU7EO/D,=LU7EON/D,=LU7EPC/D,=LU7ETR/D, - =LU7HBL/D,=LU7HW/D,=LU7HZ/D,=LU7VCH/D,=LU8ABR/D,=LU8ACH/D,=LU8ADX/D,=LU8AE/D,=LU8ARI/D,=LU8ATM/D, - =LU8DAF/D,=LU8DCF/D,=LU8DCH/D,=LU8DCK/D,=LU8DCM/D,=LU8DIP/D,=LU8DIW/D,=LU8DJR/D,=LU8DLD/D, - =LU8DLT/D,=LU8DMD/D,=LU8DQ/D,=LU8DR/D,=LU8DRA/D,=LU8DRH/D,=LU8DRQ/D,=LU8DSJ/D,=LU8DTF/D,=LU8DUJ/D, - =LU8DVQ/D,=LU8DW/D,=LU8DWR/D,=LU8DX/D,=LU8DY/D,=LU8DZE/D,=LU8DZH/D,=LU8EAG/D,=LU8EAJ/D,=LU8EBJ/D, - =LU8EBJ/E,=LU8EBK/D,=LU8EBK/E,=LU8EC/D,=LU8ECF/D,=LU8ECF/E,=LU8EEM/D,=LU8EFF/D,=LU8EGC/D, - =LU8EGS/D,=LU8EHQ/D,=LU8EHQ/E,=LU8EHS/D,=LU8EHV/D,=LU8EKC/D,=LU8EMC/D,=LU8ERH/D,=LU8ETC/D, - =LU8EU/D,=LU8EXJ/D,=LU8EXN/D,=LU8FAU/D,=LU8VCC/D,=LU8VER/D,=LU9ACJ/D,=LU9AEA/D,=LU9AOS/D, - =LU9AUC/D,=LU9BRC/D,=LU9BSA/D,=LU9CGN/D,=LU9CLH/D,=LU9DA/D,=LU9DAA/D,=LU9DAD/D,=LU9DB/D,=LU9DE/D, - =LU9DEQ/D,=LU9DF/D,=LU9DGE/D,=LU9DKO/D,=LU9DMG/D,=LU9DO/D,=LU9DPD/D,=LU9DPI/D,=LU9DPZ/E,=LU9DSD/D, - =LU9DVO/D,=LU9EAG/D,=LU9ECE/D,=LU9EI/D,=LU9EIM/D,=LU9EJM/D,=LU9EJS/E,=LU9EJZ/D,=LU9ENH/D, - =LU9EOE/D,=LU9ERA/D,=LU9ESD/D,=LU9ESD/E,=LU9ESD/LH,=LU9EV/D,=LU9EV/E,=LU9EV/LH,=LU9EY/D,=LU9EYE/D, - =LU9EZX/D,=LU9HDR/D,=LU9HJV/D,=LU9HVR/D,=LU9USD/D,=LU9WM/D,=LV7E/D,=LW1DAL/D,=LW1DDX/D,=LW1DE/D, - =LW1DEN/D,=LW1DEW/D,=LW1DJ/D,=LW1DOG/D,=LW1DQQ/D,=LW1DVB/D,=LW1DXH/D,=LW1DXP/D,=LW1DYN/D, + =LU3HKA/D,=LU4AA/D,=LU4AAO/D,=LU4AAO/E,=LU4ACA/D,=LU4ADE/D,=LU4AJC/D,=LU4BAN/D,=LU4BR/D,=LU4CMF/D, + =LU4DBL/D,=LU4DBP/D,=LU4DBT/D,=LU4DBV/D,=LU4DCE/D,=LU4DCY/D,=LU4DGC/D,=LU4DHA/D,=LU4DHC/D, + =LU4DHE/D,=LU4DIS/D,=LU4DK/D,=LU4DLJ/D,=LU4DLL/D,=LU4DLN/D,=LU4DMI/D,=LU4DPB/D,=LU4DQ/D,=LU4DRC/D, + =LU4DRH/D,=LU4DRH/E,=LU4DVD/D,=LU4EAE/D,=LU4EET/D,=LU4EGP/D,=LU4EHP/D,=LU4EJ/D,=LU4EL/D,=LU4ELE/D, + =LU4EOU/D,=LU4ERS/D,=LU4ESP/D,=LU4ETD/D,=LU4ETN/D,=LU4EV/D,=LU4HSA/D,=LU4HTD/D,=LU4MA/D,=LU4UWZ/D, + =LU4UZW/D,=LU4VEN/D,=LU4VSD/D,=LU4WAP/D,=LU5AHN/D,=LU5ALS/D,=LU5AM/D,=LU5ANL/D,=LU5AQV/D, + =LU5ARS/D,=LU5ASA/D,=LU5AVD/D,=LU5BDS/D,=LU5BE/D,=LU5BTL/D,=LU5CBA/D,=LU5CRE/D,=LU5DA/D,=LU5DA/E, + =LU5DAS/D,=LU5DCO/D,=LU5DDH/D,=LU5DEM/D,=LU5DF/D,=LU5DFR/D,=LU5DFT/D,=LU5DGG/D,=LU5DGR/D, + =LU5DHE/D,=LU5DIT/D,=LU5DJE/D,=LU5DKE/D,=LU5DLH/D,=LU5DLT/D,=LU5DLZ/D,=LU5DMI/D,=LU5DMP/D, + =LU5DMR/D,=LU5DQ/D,=LU5DRV/D,=LU5DSH/D,=LU5DSM/D,=LU5DT/D,=LU5DTB/D,=LU5DTF/D,=LU5DUC/D,=LU5DVB/D, + =LU5DWS/D,=LU5DYT/D,=LU5EAO/D,=LU5EC/D,=LU5ED/D,=LU5EDS/D,=LU5EFG/D,=LU5EH/D,=LU5EHC/D,=LU5EJL/D, + =LU5EM/D,=LU5EP/D,=LU5EW/D,=LU5FZ/D,=LU5FZ/E,=LU5JAH/D,=LU5JIB/D,=LU5OD/D,=LU5VAS/D,=LU5VAT/D, + =LU5XP/D,=LU6AER/D,=LU6CN/D,=LU6DAX/D,=LU6DBL/D,=LU6DC/D,=LU6DCT/D,=LU6DDC/D,=LU6DG/D,=LU6DIE/D, + =LU6DIO/D,=LU6DKT/D,=LU6DL/D,=LU6DM/D,=LU6DO/D,=LU6DRD/D,=LU6DRD/E,=LU6DRN/D,=LU6DRR/D,=LU6DSA/D, + =LU6DTB/D,=LU6EAG/D,=LU6EC/D,=LU6EDC/D,=LU6EE/D,=LU6EEG/D,=LU6EGO/D,=LU6EI/D,=LU6EJJ/D,=LU6EKL/D, + =LU6ELP/D,=LU6EMM/D,=LU6ENA/D,=LU6EPE/D,=LU6EPR/D,=LU6EPR/E,=LU6EQV/D,=LU6EU/D,=LU6EVD/D, + =LU6EWR/D,=LU6EXD/D,=LU6HBB/D,=LU6JJ/D,=LU6UAL/D,=LU6UO/D,=LU6UVI/D,=LU6XQ/D,=LU7AA/D,=LU7AC/D, + =LU7ADC/D,=LU7ADN/D,=LU7ART/D,=LU7AVW/D,=LU7BSN/D,=LU7BTO/D,=LU7BTO/E,=LU7CAW/D,=LU7CP/D, + =LU7DAC/D,=LU7DAF/D,=LU7DAR/D,=LU7DBA/D,=LU7DBL/D,=LU7DCE/D,=LU7DD/D,=LU7DDC/D,=LU7DDO/D, + =LU7DHG/D,=LU7DJH/D,=LU7DLN/D,=LU7DNM/D,=LU7DOT/D,=LU7DP/D,=LU7DR/D,=LU7DS/D,=LU7DSC/D,=LU7DSS/D, + =LU7DSU/D,=LU7DSY/D,=LU7DTC/D,=LU7DZL/D,=LU7DZL/E,=LU7DZV/D,=LU7ECZ/D,=LU7EGY/D,=LU7EHL/D, + =LU7EIA/D,=LU7EJC/D,=LU7ELY/D,=LU7EMA/D,=LU7EMM/D,=LU7ENP/D,=LU7EO/D,=LU7EON/D,=LU7EPC/D, + =LU7ETR/D,=LU7HBL/D,=LU7HW/D,=LU7HZ/D,=LU7VCH/D,=LU8ABR/D,=LU8ACH/D,=LU8ADX/D,=LU8AE/D,=LU8ARI/D, + =LU8ATM/D,=LU8DAF/D,=LU8DCF/D,=LU8DCH/D,=LU8DCK/D,=LU8DCM/D,=LU8DIP/D,=LU8DIW/D,=LU8DJR/D, + =LU8DLD/D,=LU8DLT/D,=LU8DMD/D,=LU8DQ/D,=LU8DR/D,=LU8DRA/D,=LU8DRH/D,=LU8DRQ/D,=LU8DSJ/D,=LU8DTF/D, + =LU8DUJ/D,=LU8DVQ/D,=LU8DW/D,=LU8DWR/D,=LU8DX/D,=LU8DY/D,=LU8DZE/D,=LU8DZH/D,=LU8EAG/D,=LU8EAJ/D, + =LU8EBJ/D,=LU8EBJ/E,=LU8EBK/D,=LU8EBK/E,=LU8EC/D,=LU8ECF/D,=LU8ECF/E,=LU8EEM/D,=LU8EFF/D, + =LU8EGC/D,=LU8EGS/D,=LU8EHQ/D,=LU8EHQ/E,=LU8EHS/D,=LU8EHV/D,=LU8EKC/D,=LU8EMC/D,=LU8ERH/D, + =LU8ETC/D,=LU8EU/D,=LU8EXJ/D,=LU8EXN/D,=LU8FAU/D,=LU8VCC/D,=LU8VER/D,=LU9ACJ/D,=LU9AEA/D, + =LU9AOS/D,=LU9AUC/D,=LU9BRC/D,=LU9BSA/D,=LU9CGN/D,=LU9CLH/D,=LU9DA/D,=LU9DAA/D,=LU9DAD/D,=LU9DB/D, + =LU9DE/D,=LU9DEQ/D,=LU9DF/D,=LU9DGE/D,=LU9DKO/D,=LU9DMG/D,=LU9DO/D,=LU9DPD/D,=LU9DPI/D,=LU9DPZ/E, + =LU9DSD/D,=LU9DVO/D,=LU9EAG/D,=LU9ECE/D,=LU9EI/D,=LU9EIM/D,=LU9EJM/D,=LU9EJS/E,=LU9EJZ/D, + =LU9ENH/D,=LU9EOE/D,=LU9ERA/D,=LU9ESD/D,=LU9ESD/E,=LU9ESD/LH,=LU9EV/D,=LU9EV/E,=LU9EV/LH,=LU9EY/D, + =LU9EYE/D,=LU9EZX/D,=LU9HDR/D,=LU9HJV/D,=LU9HVR/D,=LU9USD/D,=LU9WM/D,=LV7E/D,=LW1DAL/D,=LW1DDX/D, + =LW1DE/D,=LW1DEN/D,=LW1DEW/D,=LW1DJ/D,=LW1DOG/D,=LW1DQQ/D,=LW1DVB/D,=LW1DXH/D,=LW1DXP/D,=LW1DYN/D, =LW1DYP/D,=LW1ECE/D,=LW1ECO/D,=LW1ELI/D,=LW1EQI/D,=LW1EQZ/D,=LW1EVO/D,=LW1EXU/D,=LW2DAW/D, =LW2DET/D,=LW2DJM/D,=LW2DNC/D,=LW2DOD/D,=LW2DOM/D,=LW2DSM/D,=LW2DX/E,=LW2DYA/D,=LW2ECK/D, =LW2ECM/D,=LW2EFS/D,=LW2EHD/D,=LW2ENB/D,=LW2EQS/D,=LW2EUA/D,=LW3DAB/D,=LW3DBM/D,=LW3DC/D, @@ -2054,7 +2062,7 @@ Denmark: 14: 18: EU: 56.00: -10.00: -1.0: OZ: =OZ2GBW/LH,=OZ2NYB/LGT,=OZ2NYB/LH,=OZ2ZB/LH,=OZ3EDR/LH,=OZ3EVA/LH,=OZ3FYN/LH,=OZ3TL/JOTA, =OZ4EL/LH,=OZ50RN/LH,=OZ5ESB/LH,=OZ7AEI/LH,=OZ7DAL/LH,=OZ7DAL/LS,=OZ7EA/YL,=OZ7HAM/LH,=OZ7LH/LH, =OZ7RJ/LGT,=OZ7RJ/LH,=OZ7SP/JOTA,=OZ7TOM/LH,=OZ8KV/LH,=OZ8SMA/LGT,=OZ8SMA/LH,=OZ9HBO/JOTA, - =OZ9HBO/LH,=OZ9WSR/J; + =OZ9HBO/LH,=OZ9WSR/J,=VERSION; Papua New Guinea: 28: 51: OC: -9.50: -147.12: -10.0: P2: P2; Aruba: 09: 11: SA: 12.53: 69.98: 4.0: P4: @@ -2069,18 +2077,19 @@ Netherlands: 14: 27: EU: 52.28: -5.47: -1.0: PA: =PA3CPI/JOTA,=PA3DEW/J,=PA3EEQ/LH,=PA3EFR/J,=PA3ESO/J,=PA3EWG/J,=PA3FBO/LH,=PA3FYE/J,=PA3GAG/LH, =PA3GQS/J,=PA3GWN/J,=PA3HFJ/J,=PA3WSK/JOTA,=PA40LAB/J,=PA4RVS/MILL,=PA4WK/J,=PA5CA/LH,=PA65DUIN/J, =PA65URK/LH,=PA6ADZ/MILL,=PA6ARC/LH,=PA6FUN/LGT,=PA6FUN/LH,=PA6FUN/LS,=PA6HOOP/MILL,=PA6HYG/J, - =PA6JAM/J,=PA6KMS/MILL,=PA6LH/LH,=PA6LL/LH,=PA6LST/LH,=PA6LST/LS,=PA6MZD/MILL,=PA6RCG/J,=PA6SB/L, - =PA6SB/LH,=PA6SCH/LH,=PA6SHB/J,=PA6SJB/J,=PA6SJS/J,=PA6STAR/MILL,=PA6URK/LH,=PA6VEN/LH,=PA6VLD/LH, - =PA6WAD/LGT,=PA70HYG/JOTA,=PA75SM/J,=PA7AL/LH,=PA7HPH/J,=PA7JWC/J,=PA99HYG/JOTA,=PA9M/LH,=PB6F/LH, - =PB6KW/LH,=PB88XYL/YL,=PB9ZR/J,=PC2D/LH,=PD0ARI/MILL,=PD0FSB/LH,=PD1JL/MILL,=PD1JSH/J,=PD2C/LH, - =PD2GCM/LH,=PD5CW/LH,=PD5MVH/P/LH,=PD7DX/J,=PE18KA/J,=PE1NCS/LGT,=PE1NCS/LH,=PE1NZJ/J,=PE1OPM/LH, - =PE1OXI/J,=PE1RBG/J,=PE1RBR/J,=PE2MC/J,=PE2MGA/J,=PF100ROVER/J,=PF18NAWAKA/J,=PF4R/LH,=PG150N/LH, - =PG6HK/LH,=PG6N/LH,=PH4RTM/MILL,=PH4RTM/WHE,=PH50GFB/J,=PH6BB/J,=PH6WAL/LH,=PH75S/J,=PH9GFB/J, - =PI4ADH/LGT,=PI4ADH/LH,=PI4ADH/LS,=PI4ALK/LH,=PI4AZL/J,=PI4BG/J,=PI4BOZ/LH,=PI4CQ/J,=PI4DHG/DM, - =PI4DHG/MILL,=PI4ET/MILL,=PI4ETL/MILL,=PI4F/LH,=PI4LDN/L,=PI4LDN/LH,=PI4RCK/LGT,=PI4RCK/LH, - =PI4RIS/J,=PI4S/J,=PI4SHV/J,=PI4SRN/LH,=PI4SRN/MILL,=PI4VNW/LGT,=PI4VNW/LH,=PI4VPO/LH,=PI4VPO/LT, - =PI4WAL/LGT,=PI4WAL/LH,=PI4WBR/LH,=PI4WFL/MILL,=PI4YLC/LH,=PI4ZHE/LH,=PI4ZHE/LS,=PI4ZHE/MILL, - =PI4ZVL/FD,=PI4ZVL/LGT,=PI4ZVL/LH,=PI9NHL/LH,=PI9SRS/LH,=PI9TP/J; + =PA6JAM/J,=PA6KMS/MILL,=PA6LH/LH,=PA6LL/LH,=PA6LST/LH,=PA6LST/LS,=PA6MZD/MILL,=PA6OP/MILL, + =PA6RCG/J,=PA6SB/L,=PA6SB/LH,=PA6SCH/LH,=PA6SHB/J,=PA6SJB/J,=PA6SJS/J,=PA6STAR/MILL,=PA6URK/LH, + =PA6VEN/LH,=PA6VLD/LH,=PA6WAD/LGT,=PA70HYG/JOTA,=PA75SM/J,=PA7AL/LH,=PA7HPH/J,=PA7JWC/J, + =PA99HYG/JOTA,=PA9M/LH,=PB6F/LH,=PB6KW/LH,=PB88XYL/YL,=PB9ZR/J,=PC2D/LH,=PD0ARI/MILL,=PD0FSB/LH, + =PD1JL/MILL,=PD1JSH/J,=PD2C/LH,=PD2GCM/LH,=PD5CW/LH,=PD5MVH/P/LH,=PD7DX/J,=PE18KA/J,=PE1NCS/LGT, + =PE1NCS/LH,=PE1NZJ/J,=PE1OPM/LH,=PE1OXI/J,=PE1RBG/J,=PE1RBR/J,=PE2MC/J,=PE2MGA/J,=PF100ROVER/J, + =PF18NAWAKA/J,=PF4R/LH,=PG150N/LH,=PG64HOOP/MIL,=PG6HK/LH,=PG6N/LH,=PH4RTM/MILL,=PH4RTM/WHE, + =PH50GFB/J,=PH6BB/J,=PH6WAL/LH,=PH75S/J,=PH9GFB/J,=PI4ADH/LGT,=PI4ADH/LH,=PI4ADH/LS,=PI4ALK/LH, + =PI4AZL/J,=PI4BG/J,=PI4BOZ/LH,=PI4CQ/J,=PI4DHG/DM,=PI4DHG/MILL,=PI4ET/MILL,=PI4ETL/MILL,=PI4F/LH, + =PI4LDN/L,=PI4LDN/LH,=PI4RCK/LGT,=PI4RCK/LH,=PI4RIS/J,=PI4S/J,=PI4SHV/J,=PI4SRN/LH,=PI4SRN/MILL, + =PI4VNW/LGT,=PI4VNW/LH,=PI4VPO/LH,=PI4VPO/LT,=PI4WAL/LGT,=PI4WAL/LH,=PI4WBR/LH,=PI4WFL/MILL, + =PI4YLC/LH,=PI4ZHE/LH,=PI4ZHE/LS,=PI4ZHE/MILL,=PI4ZVL/FD,=PI4ZVL/LGT,=PI4ZVL/LH,=PI4ZWN/MILL, + =PI9NHL/LH,=PI9SRS/LH,=PI9TP/J; Curacao: 09: 11: SA: 12.17: 69.00: 4.0: PJ2: PJ2; Bonaire: 09: 11: SA: 12.20: 68.25: 4.0: PJ4: @@ -2184,7 +2193,7 @@ Greece: 20: 28: EU: 39.78: -21.78: -2.0: SV: =SV5KJQ/8,=SV8/DJ5AA/LH,=SV8/LY1DF/LGT,=SV9GPM/8,=SW8SW/LH,=SX8DI/LH,=SZ8LES/LH,=SZ8XIO/J, =SZ8XIO/P/JOTA; Mount Athos: 20: 28: EU: 40.00: -24.00: -2.0: SV/a: - =SV2/SV1RP/T,=SV2ASP/A,=SV2RSG/A,=SY2A; + =SV2/SV1RP/T,=SV2ASP,=SV2ASP/A,=SV2ASP/P,=SV2RSG/A,=SY2A; Dodecanese: 20: 28: EU: 36.17: -27.93: -2.0: SV5: J45,SV5,SW5,SX5,SY5,SZ5,=J42004/SP5MXZ,=J45FRE/J,=SV0XAN/5,=SV0XBZ/5,=SV0XCA/5,=SV0XCA/P, =SV1ENJ/5,=SV1GSX/5,=SV5/DJ5AA/LH,=SV5/LY1DF/LGT,=SV5CJQ/LH,=SV9DJO/5,=SV9GPV/5,=SV9JI/5, @@ -2253,8 +2262,8 @@ Benin: 35: 46: AF: 9.87: -2.25: -1.0: TY: Mali: 35: 46: AF: 18.00: 2.58: 0.0: TZ: TZ; European Russia: 16: 29: EU: 53.65: -41.37: -4.0: UA: - R,U,=R0CAF/1,=R25EMW(17)[19],=R7AB/M,=R7AB/P,=R80PSP,=R80UPOL,=R8CT/4/P,=R8FF/3/M,=R90DOSAAF, - =R9AV/6,=R9FAZ/6/M,=R9FCH/6,=R9JI/1,=R9KC/6/M,=R9WR/1,=R9XAU/6,=RA0AM/6,=RA0BM/6,=RA0ZZ/3, + R,U,=R0CAF/1,=R25EMW(17)[19],=R7AB/M,=R80PSP,=R80UPOL,=R8CT/4/P,=R8FF/3/M,=R90DOSAAF,=R9AV/6, + =R9FAZ/6/M,=R9FCH/6,=R9JI/1,=R9KC/6/M,=R9WR/1,=R9XAU/6,=RA0AM/6,=RA0BM/6,=RA0ZZ/3, =RA3CQ/9/M(17)[20],=RA80SP,=RA9JR/3,=RA9JX/3,=RA9P/4,=RA9RT/3,=RA9UUY/6,=RA9YA/6,=RC80SP,=RG0F/5, =RG50P(17),=RG50P/9(17)[30],=RJ80SP,=RK80X(17)[19],=RK8O/4,=RL9AA/6,=RM80SP,=RM8A/4/M,=RM94AE, =RN9M/4,=RN9OI/3,=RO80RO,=RP61XX(17)[19],=RP62X(17)[19],=RP63X(17)[19],=RP63XO(17)[19], @@ -2264,23 +2273,23 @@ European Russia: 16: 29: EU: 53.65: -41.37: -4.0: UA: =UA0KT/4,=UA0QNE/3,=UA0QNU/3,=UA0QQJ/3,=UA0UV/6,=UA0XAK/3,=UA0XAK/6,=UA0ZL/6,=UA9CCO/6,=UA9CTT/3, =UA9CTT/6,=UA9FFS/1/MM,=UE23DKA,=UE6MAC/9(17),=UE95AE,=UE95E,=UE95ME,=UE96ME,=UE99PS, =R900BL,=R9J/1,=RA2FN/1,=RA9KU/1,=RA9KU/1/M,=RA9MC/1,=RA9SGI/1,=RK9XWV/1,=RL1O,=RM0L/1,=RM80DZ, - =RN85AM,=RN85KN,=RT9T/1,=RU2FB/1,=RU9YT/1,=RU9YT/1/P,=RV1CC/M,=RW1AI/ANT,=RW8W/1,=RW9QA/1, - =RX3AMI/1/LH,=UA1ADQ/ANT,=UA1BJ/ANT,=UA1JJ/ANT,=UA2FFX/1,=UA9B/1,=UA9KG/1,=UA9KGH/1,=UA9KK/1, - =UA9UDX/1,=UB9YUW/1,=UE21A,=UE21B,=UE21M,=UE22A,=UE25AC,=UE25AQ,=UE2AT/1, - =R0XAC/1,=R900DM,=R90LPU,=R9JNO/1,=RA0FU/1,=RA9FNV/1,=RN9N/1,=RU9MU/1,=RV0CA/1,=RV2FW/1,=RV9JD/1, - =RX9TN/1,=UA0BDS/1,=UA0SIK/1,=UA1CDA/LH,=UA1CIO/LH,=UA9MQR/1,=UB5O/1, + =RN85AM,=RN85KN,=RT9T/1,=RU2FB/1,=RU9YT/1,=RU9YT/1/P,=RW1AI/ANT,=RW8W/1,=RW9QA/1,=UA1ADQ/ANT, + =UA1BJ/ANT,=UA1JJ/ANT,=UA2FFX/1,=UA9B/1,=UA9KG/1,=UA9KGH/1,=UA9KK/1,=UA9UDX/1,=UB9YUW/1,=UE21A, + =UE21B,=UE21M,=UE22A,=UE25AC,=UE25AQ,=UE2AT/1, + =R0XAC/1,=R8XF/1,=R900DM,=R90LPU,=R9JNO/1,=RA0FU/1,=RA9FNV/1,=RN9N/1,=RU9MU/1,=RV0CA/1,=RV1CC/M, + =RV2FW/1,=RV9JD/1,=RX9TN/1,=UA0BDS/1,=UA0SIK/1,=UA1CDA/LH,=UA1CIO/LH,=UA9MQR/1,=UB5O/1, R1N[19],RA1N[19],RC1N[19],RD1N[19],RE1N[19],RF1N[19],RG1N[19],RJ1N[19],RK1N[19],RL1N[19],RM1N[19], RN1N[19],RO1N[19],RQ1N[19],RT1N[19],RU1N[19],RV1N[19],RW1N[19],RX1N[19],RY1N[19],RZ1N[19],U1N[19], UA1N[19],UB1N[19],UC1N[19],UD1N[19],UE1N[19],UF1N[19],UG1N[19],UH1N[19],UI1N[19],=R01DTV/1[19], =R85KFF[19],=R90K[19],=RN1NA/ANT[19],=RO25KL[19],=RP72PT[19],=RP72RK[19],=RP73PT[19],=RP73RK[19], - =RV1CC/1[19],=RV9JD/1/M[19], + =RP74PT[19],=RP74RK[19],=RV9JD/1/M[19],=RX3AMI/1/LH[19], R1O[19],RA1O[19],RC1O[19],RD1O[19],RE1O[19],RF1O[19],RG1O[19],RJ1O[19],RK1O[19],RL1O[19],RM1O[19], RN1O[19],RO1O[19],RQ1O[19],RT1O[19],RU1O[19],RV1O[19],RW1O[19],RX1O[19],RY1O[19],RZ1O[19],U1O[19], UA1O[19],UB1O[19],UC1O[19],UD1O[19],UE1O[19],UF1O[19],UG1O[19],UH1O[19],UI1O[19],=R0000O[19], =R100K[19],=R20ARRS[19],=R25ILIM[19],=R8FF/1[19],=R9LI/1[19],=R9MCM/1[19],=RA0NN/1[19], =RA9XA/1[19],=RA9XA/1/P[19],=RK0SE/1[19],=RM9X/1[19],=RO80KEDR[19],=RP72A[19],=RP73A[19], - =RP73AU[19],=UA1PAC/ANT[19],=UA9UAX/1[19],=UA9UAX/1/M[19],=UA9XK/1[19],=UA9XMC/1[19], - =UA9XRK/1[19],=UE25IK[19],=UE80AR[19],=UE80AR/M[19],=UE80AR/P[19], + =RP73AU[19],=RP74A[19],=RP74AU[19],=UA1PAC/ANT[19],=UA9UAX/1[19],=UA9UAX/1/M[19],=UA9XK/1[19], + =UA9XMC/1[19],=UA9XRK/1[19],=UE25IK[19],=UE80AR[19],=UE80AR/M[19],=UE80AR/P[19], R1P[20],RA1P[20],RC1P[20],RD1P[20],RE1P[20],RF1P[20],RG1P[20],RJ1P[20],RK1P[20],RL1P[20],RM1P[20], RN1P[20],RO1P[20],RQ1P[20],RT1P[20],RU1P[20],RV1P[20],RW1P[20],RX1P[20],RY1P[20],RZ1P[20],U1P[20], UA1P[20],UB1P[20],UC1P[20],UD1P[20],UE1P[20],UF1P[20],UG1P[20],UH1P[20],UI1P[20],=R8XW/1[20], @@ -2288,37 +2297,37 @@ European Russia: 16: 29: EU: 53.65: -41.37: -4.0: UA: =RK1PWA/ANT[20],=RL1P[20],=RN2FA/1[20],=UA1PAC/1/ANT[20],=UA9FOJ/1[20],=UA9MRY/1[20], =UA9XRP/1[20], =R9FM/1,=RA0BM/1,=RA0BM/1/P,=RA1QQ/LH,=RU9MX/1,=RW9XC/1,=UA1QV/ANT,=UA9XC/1,=UE80GS, - =R88EPC,=R95NRL,=RA9FBV/1,=RA9SC/1,=RA9XY/1,=RV2FW/1/M,=RZ0IWW/1,=UA9XF/1,=UE9WFF/1, + =R88EPC,=R95NRL,=RA9FBV/1,=RA9SC/1,=RA9XY/1,=RV1CC/1,=RV2FW/1/M,=RZ0IWW/1,=UA9XF/1,=UE9WFF/1, =RA0ZD/1,=RP9X/1,=RP9XWM/1,=UE25WDW,=UE9XBW/1,=UF2F/1/M, R1Z[19],RA1Z[19],RC1Z[19],RD1Z[19],RE1Z[19],RF1Z[19],RG1Z[19],RJ1Z[19],RK1Z[19],RL1Z[19],RM1Z[19], RN1Z[19],RO1Z[19],RQ1Z[19],RT1Z[19],RU1Z[19],RV1Z[19],RW1Z[19],RX1Z[19],RY1Z[19],RZ1Z[19],U1Z[19], UA1Z[19],UB1Z[19],UC1Z[19],UD1Z[19],UE1Z[19],UF1Z[19],UG1Z[19],UH1Z[19],UI1Z[19],=R25RRA[19], =RA9CFH/1[19],=RA9CFH/1/P[19],=RK21Z[19],=RK3DZJ/1/LH[19],=RM9WN/1[19],=RP72MU[19],=RP73MU[19], - =RP73ZP[19],=RU1ZC/ANT[19],=RW1ZQ/LH[19],=RY83HN[19],=UB1ZBD/N[19], - =R01DTV/3,=R85PAR,=R870B,=R870C,=R870K,=R870M,=R870O,=R9FM/3,=RA2AT,=RA2FDX/3,=RA9CO/3,=RA9USU/3, - =RC85MP,=RL3AB/FF,=RT2F/3/M,=RT9K/3,=RW0LF/3,=RX9UL/3,=RX9WN/3,=RZ9UA/3,=UA0KCX/3,=UA3AV/ANT, - =UA8AA/3,=UA8AA/5,=UA9KHD/3,=UA9MDU/3,=UA9MRX/3,=UA9QCP/3,=UA9UAX/3,=UB5O/M,=UE24SU, + =RP73ZP[19],=RP74ZP[19],=RU1ZC/ANT[19],=RW1ZQ/LH[19],=RY83HN[19],=UB1ZBD/N[19], + =R01DTV/3,=R1712M,=R85PAR,=R870B,=R870C,=R870K,=R870M,=R870O,=R9FM/3,=RA2AT,=RA2FDX/3,=RA9CO/3, + =RA9USU/3,=RC85MP,=RL3AB/FF,=RT2F/3/M,=RT9K/3,=RW0LF/3,=RX9UL/3,=RX9WN/3,=RZ9UA/3,=UA0KCX/3, + =UA3AV/ANT,=UA8AA/3,=UA8AA/5,=UA9KHD/3,=UA9MDU/3,=UA9MRX/3,=UA9QCP/3,=UA9UAX/3,=UE24SU, =R85QMR,=R85WDW,=R8B,=R8FF/3,=R90DNF,=R99FSB,=RA0BY/3,=RA80KEDR,=RA9KV/3,=RA9SB/3,=RA9XY/3, =RK3DSW/ANT,=RK3DWA/3/N,=RN9MD/3,=RT80KEDR,=RU0LM/3,=RU2FA/3,=RU3HD/ANT,=RV0AO/3,=RV9LM/3/P, =RW0IM/3,=RW3DU/N,=RW9UEW/3,=RX9SN/3,=RZ9SZ/3,=RZ9W/3,=UA0JAD/3,=UA0KCL/3,=UA0ZAZ/3,=UA9AJ/3/M, =UA9DD/3,=UA9HSI/3,=UA9ONJ/3,=UA9XGD/3,=UA9XMC/3,=UE23DSA,=UE25FO,=UE95GA,=UE96WS, =R80ORL,=UA0QGM/3,=UE80O,=UE80OL, =R0CAF/3,=R3GO/FF,=RM0L/3,=RN3GL/FF,=RN3GW/FF,=RT5G/P/FF,=RW0IW/3,=UA3GM/ANT,=UE90FL, - =R0WX/P,=RA9KT/3,=RZ9SZ/3/M,=UA0FHC/3,=UF2F/3/M, - =R0IA/3,=R863LC,=R863LK,=R863LX,=R875R,=R9XZ/3,=RG80KEDR,=RL80KEDR,=RN0CF/3,=RU9QRP/3,=RZ90W/3, - =UA9JFM/3,=UA9XZ/3,=UE80G,=UE80V,=UE80YG, + =RA9KT/3,=RZ9SZ/3/M,=UA0FHC/3,=UF2F/3/M, + =R0IA/3,=R17SMW,=R863LC,=R863LK,=R863LX,=R875R,=R9XZ/3,=RG80KEDR,=RL80KEDR,=RN0CF/3,=RU9QRP/3, + =RZ90W/3,=UA9JFM/3,=UA9XZ/3,=UE80G,=UE80V,=UE80YG, =RK3MXT/FF,=RV9AZ/3,=UA0AD/3, =R870T,=RT90PK,=RU0ZW/3,=RW0UM/3,=RW9JV/3, - =RA0CCV/3,=RA0QA/3,=RC9YA/3/P,=RM8X/3,=RV9LC/3,=UA0QJE/3,=UA0QQO/3,=UA9CGL/3,=UA9JLY/3,=UA9XLE/3, - =UB0AJJ/3,=UC0LAF/3,=UE25AFG,=UE25R,=UE27AFG,=UE28AFG,=UE96SN, - =R80RTL,=R90IARU,=R9CZ/3,=RU80TO,=RZ9HK/3/P, + =R17CWB,=RA0CCV/3,=RA0QA/3,=RC9YA/3/P,=RM8X/3,=RV9LC/3,=UA0QJE/3,=UA0QQO/3,=UA9CGL/3,=UA9JLY/3, + =UA9XLE/3,=UB0AJJ/3,=UB5O/M,=UC0LAF/3,=UE25AFG,=UE25R,=UE27AFG,=UE28AFG,=UE96SN, + =R17TCNY,=R80RTL,=R90IARU,=R9CZ/3,=RU80TO,=RZ9HK/3/P, =R920RZ,=R95DOD,=RA0QQ/3,=UA0KBA/3,=UE80S,=UE85NKN,=UE85WDW, =R3TT/FF,=R8FF/M,=R8TA/4/P,=R8TR/3,=R90NOR,=R9KW/3,=R9KW/4,=R9PA/4,=RA9AP/3,=RA9CKQ/4,=RA9KW/3, =RA9KW/3/M,=RA9ST/3/P,=RG9A/3/P,=RM9T/4/P,=RN0CT/4,=RT9S/3,=RT9S/3/P,=RT9S/4,=RU9LA/4,=RV9FQ/3, =RV9FQ/3/M,=RV9WB/4,=RV9WLE/3/P,=RV9WZ/3,=RW9KW/3,=RW9WA/3,=RX9SN/P,=UA0ADX/3,=UA0DM/4,=UA0S/4, =UA0SC/4,=UA9APA/3/P,=UA9CTT/4,=UA9PM/4,=UA9SSR/3,=UE200TARS,=UE25TF,=UE9FDA/3,=UE9FDA/3/M, =UE9WDA/3,=UI8W/3/P, - =R5VAJ/N,=R850G,=R850PN,=RT9T/3,=RU0BW/3,=RU9MU/3,=RV80KEDR,=RX9TL/3, + =R170VN,=R5VAJ/N,=R850G,=R850PN,=RT9T/3,=RU0BW/3,=RU9MU/3,=RV80KEDR,=RX9TL/3, =R110A/P,=R80PVB, =RA9XF/3,=RC80KEDR,=RD0L/3,=RK0BWW/3,=RN80KEDR,=RW9XC/3/M,=RX3XX/N,=UA0KBA/3/P,=UA9SIV/3, =UE0ZOO/3, @@ -2327,9 +2336,9 @@ European Russia: 16: 29: EU: 53.65: -41.37: -4.0: UA: =R3ZK/FF,=RA3ZZ/ANT,=RA9AK/3,=RA9KD/3,=RU3ZK/FF,=RW0BG/3,=UA0QBC/3, =RA07DR,=RA9ODR/4/M,=RC4AF/FF,=RN4ACA/FF,=RU9CK/6/M,=UA4ASE/FF,=UA4ATL/FF,=UA8WAA/6,=UA9FGR/4, =UE00S,=UE00S/P,=UE09VG,=UE80RWW, - =R4CDX/FF,=R8FF/4,=R8FR/4/M,=RA9KO/4,=RL96WS,=RL97WS,=RU80KEDR,=RU80KEDR/P,=RU9SO/4/M,=RV4CC/FF, - =RV9CX/4/M,=RW0UZ/4,=RW9AW/4/M,=RZ0SB/4,=UA0KAT/4,=UA8WAA/4,=UA9AGR/4/M,=UA9JPX/4,=UA9OC/4, - =UE23DZO,=UE95MS,=UE95WS,=UE98WS,=UE99PW, + =R1747PS,=R4CDX/FF,=R8FF/4,=R8FR/4/M,=RA9KO/4,=RL96WS,=RL97WS,=RU80KEDR,=RU80KEDR/P,=RU9SO/4/M, + =RV4CC/FF,=RV9CX/4/M,=RW0UZ/4,=RW9AW/4/M,=RZ0SB/4,=UA0KAT/4,=UA8WAA/4,=UA9AGR/4/M,=UA9JPX/4, + =UA9OC/4,=UE23DZO,=UE95MS,=UE95WS,=UE98WS,=UE99PW, =R9CMA/4,=R9JBN/4, R4H[30],R4I[30],RA4H[30],RA4I[30],RC4H[30],RC4I[30],RD4H[30],RD4I[30],RE4H[30],RE4I[30],RF4H[30], RF4I[30],RG4H[30],RG4I[30],RJ4H[30],RJ4I[30],RK4H[30],RK4I[30],RL4H[30],RL4I[30],RM4H[30], @@ -2342,11 +2351,12 @@ European Russia: 16: 29: EU: 53.65: -41.37: -4.0: UA: =R4IT[29],=R9DA/4[30],=RA4HL[29],=RA9FAA/4/M[30],=RA9SC/4[30],=RA9SC/4/P[30],=RC18SA[30], =RC20HZ[30],=RC4HT[29],=RC4I[29],=RC9YA/4/M[30],=RJ4I[29],=RK4HM[29],=RM4I[29],=RN4HFJ[29], =RN4HIF[29],=RN9S/M[30],=RP72AG[30],=RP72I[30],=RP72MF[30],=RP72WO[30],=RP73DD[30],=RP73I[30], - =RP73PM[30],=RT9K/4[30],=RU4HD[29],=RU4HP[29],=RU4I[29],=RU9CK/4/M[30],=RV9JD/4/M[30],=RW4HM[29], - =RW4HTK[29],=RW4HW[29],=RW4HZ[29],=RW9SW/4[30],=RW9TP/4[30],=RW9WJ/4[30],=RW9WJ/4/P[30], - =RW9WJ/P[30],=RZ4HWF/LH[30],=RZ4HZW/FF[30],=RZ9WU/4/M[30],=UA0KAO/4[30],=UA0QJA/4[30],=UA4H[29], - =UA4HBM[29],=UA4HGL[29],=UA4HIP[29],=UA4HIP/M[30],=UA4HRZ[29],=UA4HY[29],=UA9JGX/4[30], - =UA9LAO/4[30],=UA9SQG/4/P[30],=UA9SY/4[30],=UC4I[29],=UI4I[29], + =RP73PM[30],=RP74DD[30],=RP74I[30],=RT9K/4[30],=RU4HD[29],=RU4HP[29],=RU4I[29],=RU9CK/4/M[30], + =RV9JD/4/M[30],=RW4HM[29],=RW4HTK[29],=RW4HW[29],=RW4HZ[29],=RW9SW/4[30],=RW9TP/4[30], + =RW9WJ/4[30],=RW9WJ/4/P[30],=RW9WJ/P[30],=RZ4HWF/LH[30],=RZ4HZW/FF[30],=RZ9WU/4/M[30], + =UA0KAO/4[30],=UA0QJA/4[30],=UA4H[29],=UA4HBM[29],=UA4HGL[29],=UA4HIP[29],=UA4HIP/M[30], + =UA4HRZ[29],=UA4HY[29],=UA9JGX/4[30],=UA9LAO/4[30],=UA9SQG/4/P[30],=UA9SY/4[30],=UC4I[29], + =UI4I[29], =R01DTV/4,=R9XC/4,=RA9XAF/4,=UA4HIP/4,=UA9JFE/4, =R8XF/4,=RA4NCC[30],=RA9FR/4/P,=RA9XSM/4,=RD9CX/4,=RD9CX/4/P,=RU0LM/4,=RW9XC/4/M,=UA4NE/M, =UA4NF[30],=UA4NF/M,=UA9APA/4/P,=UA9FIT/4,=UA9XI/4,=UE9FDA/4,=UE9FDA/4/M,=UE9GDA/4, @@ -2360,7 +2370,8 @@ European Russia: 16: 29: EU: 53.65: -41.37: -4.0: UA: RN4W[30],RO4W[30],RQ4W[30],RT4W[30],RU4W[30],RV4W[30],RW4W[30],RX4W[30],RY4W[30],RZ4W[30],U4W[30], UA4W[30],UB4W[30],UC4W[30],UD4W[30],UE4W[30],UF4W[30],UG4W[30],UH4W[30],UI4W[30],=R0CM/4[30], =R9GM/4[30],=R9UT/4[30],=RA9FDR/4/P[30],=RA9KV/4/M[30],=RA9WU/4[30],=RA9WU/4/M[30],=RA9WU/4/P[30], - =RP72IZ[30],=RP73IZ[30],=RW9FWB/4[30],=RW9FWR/4[30],=RW9FWR/4/M[30],=RX9FW/4[30],=UA9UAX/4/M[30], + =RP72IZ[30],=RP73IZ[30],=RP74IZ[30],=RW9FWB/4[30],=RW9FWR/4[30],=RW9FWR/4/M[30],=RX9FW/4[30], + =UA9UAX/4/M[30], =RT9T/4,=RV9MD/4,=UA4PCM/M,=UE04YCS,=UE85AGN, =R01DTV,=R01DTV/7,=R0IT/6,=R80TV,=R8XW/6,=R9JO/6,=R9KD/6,=R9OM/6,=R9WGM/6/M,=RA0APW/6,=RA0FW/6, =RA0LIF/6,=RA0LLW/6,=RA0QR/6,=RA9ODR/6,=RA9ODR/6/M,=RA9SAS/6,=RA9UWD/6,=RA9WW/6,=RD9CX/6, @@ -2380,7 +2391,7 @@ European Russia: 16: 29: EU: 53.65: -41.37: -4.0: UA: =R8FF/6,=R9DA/6,=RU9CK/6/P,=RV9CX/6/P,=UA9CES/6,=UA9FGR/6,=UA9WQK/6, =RU9CK/7/M,=RU9CK/7/P,=RV9CX/7/P,=UA9JFN/6/M, =RT9K/7/P,=RZ7G/6/FF, - =R01DTV/6,=RV9AB/6, + =R01DTV/6,=R7AB/P,=RV9AB/6, =R9MJ/6,=R9OM/5/P,=R9XT/6,=RA9KD/6,=RN9N/6,=RT9T/6,=RT9T/6/M,=RU2FB/5,=RU9WW/5/M,=RW9AW/5, =UA0LLM/5,=UA8WAA/5,=UA9CDC/6,=UA9UAX/5,=UE2KR,=UE98PW, =R8AEU/6,=R9MJ/6/M,=RN9N/6/M,=UB8ADI/5,=UB8ADI/6,=UE2SE, @@ -2408,15 +2419,19 @@ European Russia: 16: 29: EU: 53.65: -41.37: -4.0: UA: =R9CZ/4/M(17)[30],=R9KC/4/M(17)[30],=R9KC/8/M(17)[30],=RA27FM(17)[30],=RA9XAI/4(17)[30], =RC20FM(17)[30],=RD4M/9(17)[30],=RG50P/M(17)[30],=RN9N/4(17)[30],=RP70PK(17)[30],=RP9FKU(17)[30], =RP9FTK(17)[30],=RU27FQ(17)[30],=RU27FW(17)[30],=RU4W/9(17)[30],=RV22PM(17)[30],=RX9TX/9(17)[30], - =RZ16FM(17)[30],=RZ9WM/9(17)[30],=UA1ZQO/9(17)[30],=UA4NF/4/M(17)[30],=UA4WA/9(17)[30], - =UA9CGL/4/M(17)[30],=UA9CUA/4/M(17)[30],=UA9UAX/4(17)[30],=UE16SA(17)[30],=UE55PM(17)[30], + =RZ16FM(17)[30],=RZ9WM/9(17)[30],=UA1ZQO/9(17)[30],=UA3FQ/4(17)[30],=UA3FQ/4/P(17)[30], + =UA4NF/4/M(17)[30],=UA4WA/9(17)[30],=UA9CGL/4/M(17)[30],=UA9CUA/4/M(17)[30],=UA9UAX/4(17)[30], + =UE16SA(17)[30],=UE55PM(17)[30], =RW3TN/9(17)[30],=UE10SK(17)[30], - R8X(17)[20],R9X(17)[20],RA8X(17)[20],RA9X(17)[20],RC8X(17)[20],RC9X(17)[20],RD8X(17)[20], - RD9X(17)[20],RE8X(17)[20],RE9X(17)[20],RF8X(17)[20],RF9X(17)[20],RG8X(17)[20],RG9X(17)[20], - RI8X(17)[20],RI9X(17)[20],RJ8X(17)[20],RJ9X(17)[20],RK8X(17)[20],RK9X(17)[20],RL8X(17)[20], - RL9X(17)[20],RM8X(17)[20],RM9X(17)[20],RN8X(17)[20],RN9X(17)[20],RO8X(17)[20],RO9X(17)[20], - RQ8X(17)[20],RQ9X(17)[20],RT8X(17)[20],RT9X(17)[20],RU8X(17)[20],RU9X(17)[20],RV8X(17)[20], - RV9X(17)[20],RW8X(17)[20],RW9X(17)[20],RX8X(17)[20],RX9X(17)[20],RY8X(17)[20],RY9X(17)[20], + R1I(17)[20],R8X(17)[20],R9X(17)[20],RA1I(17)[20],RA8X(17)[20],RA9X(17)[20],RC1I(17)[20], + RC8X(17)[20],RC9X(17)[20],RD1I(17)[20],RD8X(17)[20],RD9X(17)[20],RE1I(17)[20],RE8X(17)[20], + RE9X(17)[20],RF1I(17)[20],RF8X(17)[20],RF9X(17)[20],RG1I(17)[20],RG8X(17)[20],RG9X(17)[20], + RI8X(17)[20],RI9X(17)[20],RJ1I(17)[20],RJ8X(17)[20],RJ9X(17)[20],RK1I(17)[20],RK8X(17)[20], + RK9X(17)[20],RL1I(17)[20],RL8X(17)[20],RL9X(17)[20],RM1I(17)[20],RM8X(17)[20],RM9X(17)[20], + RN1I(17)[20],RN8X(17)[20],RN9X(17)[20],RO1I(17)[20],RO8X(17)[20],RO9X(17)[20],RQ1I(17)[20], + RQ8X(17)[20],RQ9X(17)[20],RT1I(17)[20],RT8X(17)[20],RT9X(17)[20],RU1I(17)[20],RU8X(17)[20], + RU9X(17)[20],RV1I(17)[20],RV8X(17)[20],RV9X(17)[20],RW1I(17)[20],RW8X(17)[20],RW9X(17)[20], + RX1I(17)[20],RX8X(17)[20],RX9X(17)[20],RY1I(17)[20],RY8X(17)[20],RY9X(17)[20],RZ1I(17)[20], RZ8X(17)[20],RZ9X(17)[20],U8X(17)[20],U9X(17)[20],UA8X(17)[20],UA9X(17)[20],UB8X(17)[20], UB9X(17)[20],UC8X(17)[20],UC9X(17)[20],UD8X(17)[20],UD9X(17)[20],UE8X(17)[20],UE9X(17)[20], UF8X(17)[20],UF9X(17)[20],UG8X(17)[20],UG9X(17)[20],UH8X(17)[20],UH9X(17)[20],UI8X(17)[20], @@ -2429,11 +2444,10 @@ European Russia: 16: 29: EU: 53.65: -41.37: -4.0: UA: =RA4NH/9(17)[20],=RA4NV/9(17)[20],=RA6ACI/9(17)[20],=RD4CBQ/9(17)[20],=RK1OWZ/9(17)[20], =RK1OWZ/9/M(17)[20],=RK6K/9(17)[20],=RK90DR(17)[20],=RN22OG(17)[20],=RN22OV(17)[20], =RN4ACZ/9(17)[20],=RO25KO(17)[20],=RP67KR(17)[20],=RP68KR(17)[20],=RP70KW(17)[20],=RP71KW(17)[20], - =RP72X(17)[20],=RP73X(17)[20],=RT73LF(17)[20],=RV3UI/9(17)[20],=RW1QN/9(17)[20], + =RP72X(17)[20],=RP73X(17)[20],=RP74X(17)[20],=RT73LF(17)[20],=RV3UI/9(17)[20],=RW1QN/9(17)[20], =RW1QN/9/M(17)[20],=RW1QN/9/P(17)[20],=RW4NJ/9/M(17)[20],=RY110RAEM(17)[20],=UA1OOX/9(17)[20], - =UA1QV/9(17)[20],=UA3FQ/4(17)[20],=UA4WP/9/M(17)[20],=UA6LTO/9(17)[20],=UB1OAD/1/P(17)[20], - =UB1OAD/9/P(17)[20],=UB5O/1/M(17)[20],=UE16ST(17)[20],=UE1RDA/9(17)[20],=UE85DRK(17)[20], - =UE90K(17)[20]; + =UA1QV/9(17)[20],=UA4WP/9/M(17)[20],=UA6LTO/9(17)[20],=UB1OAD/1/P(17)[20],=UB1OAD/9/P(17)[20], + =UB5O/1/M(17)[20],=UE16ST(17)[20],=UE1RDA/9(17)[20],=UE85DRK(17)[20],=UE90K(17)[20]; Kaliningrad: 15: 29: EU: 54.72: -20.52: -3.0: UA2: R2F,R2K,RA2,RC2F,RC2K,RD2F,RD2K,RE2F,RE2K,RF2F,RF2K,RG2F,RG2K,RJ2F,RJ2K,RK2F,RK2K,RL2F,RL2K,RM2F, RM2K,RN2F,RN2K,RO2F,RO2K,RQ2F,RQ2K,RT2F,RT2K,RU2F,RU2K,RV2F,RV2K,RW2F,RW2K,RX2F,RX2K,RY2F,RY2K, @@ -2464,10 +2478,11 @@ Asiatic Russia: 17: 30: AS: 55.88: -84.08: -7.0: UA9: =R70PW,=R70PW/P,=R9SRR,=RA1AIP/9/P,=RA1AR/9,=RA1QR/9,=RA3WJ/9,=RA3XBN/9,=RA3ZM/8,=RA4FSC/9, =RA4HGN/9,=RA9SC/9,=RA9WJV/8/P,=RC20AB,=RC20AC,=RD3BN/9,=RD4CAQ/9,=RG110RAEM,=RJ17CW,=RK9SZZ/9, =RL5G/8,=RL9AA/P,=RN4WA/9,=RN9O/8,=RP67TG,=RP68MZ,=RP70AZ,=RP70PM,=RP70TG,=RP71AZ,=RP71TG,=RP72AZ, - =RP72MS,=RP72TG,=RP73AZ,=RP73TG,=RP73U,=RQ4D/8,=RT60RT,=RT73AB,=RU22AZ,=RV1AQ/9,=RV1CC/8,=RV1CC/9, - =RV3BA/9,=RV9WB/9/M,=RV9WMZ/9/P,=RV9WMZ/P,=RX3RC/9,=RX9WN/9/M,=RZ0OO/9,=RZ6DR/9/M,=RZ9OO/9/M, - =UA0MF/9,=UA3AKO/8,=UA4RC/9,=UA6A/9,=UA6CW/9,=UA6YGY/8,=UA6YGY/9,=UA8WAA/9,=UA8WAA/9/P,=UA8WAA/M, - =UA9CGL/9/M,=UA9SG/9,=UA9TO/9/M,=UA9WMN/9/P,=UB5O/8,=UE45AWT,=UE70AAA,=UE9WDA/9, + =RP72MS,=RP72TG,=RP73AZ,=RP73TG,=RP73U,=RP74AZ,=RP74TG,=RP74U,=RQ4D/8,=RT60RT,=RT73AB,=RU22AZ, + =RV1AQ/9,=RV1CC/8,=RV1CC/9,=RV3BA/9,=RV9WB/9/M,=RV9WMZ/9/P,=RV9WMZ/P,=RX3RC/9,=RX9WN/9/M,=RZ0OO/9, + =RZ6DR/9/M,=RZ9OO/9/M,=UA0MF/9,=UA3AKO/8,=UA4RC/9,=UA6A/9,=UA6CW/9,=UA6YGY/8,=UA6YGY/9,=UA8WAA/9, + =UA8WAA/9/P,=UA8WAA/M,=UA9CGL/9/M,=UA9SG/9,=UA9TO/9/M,=UA9WMN/9/P,=UB5O/8,=UE45AWT,=UE70AAA, + =UE9WDA/9, =R01DTV/8,=R14CWC/8,=R14CWC/9,=R150DMP,=R155AP,=R15CWC/8,=R15CWC/8/QRP,=R160DMP,=R16SVK,=R170GS/8, =R2015BP,=R2015R,=R2016DR,=R20EKB,=R22SKJ,=R27EKB,=R30ZF,=R35CZF,=R375I,=R44YETI/8,=R4WAB/9/P, =R55EPC,=R55EPC/P,=R6UAE/9,=R70NIK,=R7LZ/8,=R8FF/8,=R9GM/8,=R9GM/8/M,=RA/DL6XK,=RA/US5ETV, @@ -2475,10 +2490,11 @@ Asiatic Russia: 17: 30: AS: 55.88: -84.08: -7.0: UA9: =RD0B/8,=RK9AD/9/M,=RK9DR/N,=RM0B/9,=RM19NY,=RN16CW,=RN3QBG/9,=RP68DT,=RP68RG,=RP68TG,=RP68TK, =RP69GR,=RP70DT,=RP70G,=RP70GB,=RP70GR,=RP70MA,=RP70SA,=RP70UH,=RP71DT,=RP71GA,=RP71GA/M,=RP71GB, =RP71GR,=RP71LT,=RP71MO,=RP71SA,=RP72DT,=RP72FI,=RP72GB,=RP72GR,=RP72IM,=RP72KB,=RP72SA,=RP73DT, - =RP73GB,=RP73GR,=RP73IM,=RP73SA,=RT4C/8,=RT4W/9,=RT73BR,=RT73EB,=RT73FL,=RT73HE,=RT73KB,=RT73SK, - =RU22CR,=RU5D/8,=RU5D/9,=RV6LGY/9,=RV6LGY/9/M,=RV6LGY/9/P,=RV6MD/9,=RW4NX/9,=RW9C[20],=RX0SD/9, - =RX3Q/9,=RX9UL/9,=RY9C/P,=RZ37ZF,=RZ38ZF,=RZ39ZF,=UA0BA/8,=UA3FQ/8,=UA3IHJ/8,=UA4WHX/9,=UA8WAA/8, - =UA9MW/9,=UA9UAX/8,=UA9UAX/8/M,=UE16SR,=UE25F,=UE40CZF,=UE4NFF/9,=UE56S,=UE64RWA,=UE70SL,=UE75DT, + =RP73GB,=RP73GR,=RP73IM,=RP73SA,=RP74DT,=RP74GB,=RP74GR,=RP74IM,=RT4C/8,=RT4W/9,=RT73BR,=RT73EB, + =RT73FL,=RT73HE,=RT73KB,=RT73SK,=RU22CR,=RU5D/8,=RU5D/9,=RV6LGY/9,=RV6LGY/9/M,=RV6LGY/9/P, + =RV6MD/9,=RW4NX/9,=RW9C[20],=RX0SD/9,=RX3Q/9,=RX9UL/9,=RY9C/P,=RZ37ZF,=RZ38ZF,=RZ39ZF,=UA0BA/8, + =UA3FQ/8,=UA3IHJ/8,=UA4WHX/9,=UA8WAA/8,=UA9MW/9,=UA9UAX/8,=UA9UAX/8/M,=UE16SR,=UE25F,=UE40CZF, + =UE4NFF/9,=UE56S,=UE64RWA,=UE70SL,=UE75DT, R8H(18)[31],R8I(18)[31],R9H(18)[31],R9I(18)[31],RA8H(18)[31],RA8I(18)[31],RA9H(18)[31], RA9I(18)[31],RC8H(18)[31],RC8I(18)[31],RC9H(18)[31],RC9I(18)[31],RD8H(18)[31],RD8I(18)[31], RD9H(18)[31],RD9I(18)[31],RE8H(18)[31],RE8I(18)[31],RE9H(18)[31],RE9I(18)[31],RF8H(18)[31], @@ -2502,21 +2518,21 @@ Asiatic Russia: 17: 30: AS: 55.88: -84.08: -7.0: UA9: =RQ9I(18)[31],=RU9AZ/9(18)[31],=RV3LO/9(18)[31],=RZ9HK/FF(18)[31],=RZ9HX/FF(18)[31], =UA9JFN/9/M(18)[31],=UA9MUY/9(18)[31],=UA9OAP/9/P(18)[31],=UA9UAX/9/M(18)[31],=UE14TS(18)[31], =UE9FDA/9(18)[31], - R8J[20],R9J[20],RA8J[20],RA9J[20],RC8J[20],RC9J[20],RD8J[20],RD9J[20],RE8J[20],RE9J[20],RF8J[20], - RF9J[20],RG8J[20],RG9J[20],RJ8J[20],RJ9J[20],RK8J[20],RK9J[20],RL8J[20],RL9J[20],RM8J[20], - RM9J[20],RN8J[20],RN9J[20],RO8J[20],RO9J[20],RQ8J[20],RQ9J[20],RT8J[20],RT9J[20],RU8J[20], - RU9J[20],RV8J[20],RV9J[20],RW8J[20],RW9J[20],RX8J[20],RX9J[20],RY8J[20],RY9J[20],RZ8J[20], - RZ9J[20],U8J[20],U9J[20],UA8J[20],UA9J[20],UB8J[20],UB9J[20],UC8J[20],UC9J[20],UD8J[20],UD9J[20], - UE8J[20],UE9J[20],UF8J[20],UF9J[20],UG8J[20],UG9J[20],UH8J[20],UH9J[20],UI8J[20],UI9J[20], - =R11UND[20],=R120RJ[20],=R123JDR[20],=R15UGRA[20],=R16UGRA[20],=R18KSA[20],=R25ARCK/8[20], - =R2AEA/9[20],=R4YAC/9[20],=R8JAJ/M[20],=RA/UR8IF[20],=RA/UT2LA[20],=RA1QBH/9[20],=RA3ARS/9[20], - =RA3ARS/9/M[20],=RA3QQI/8[20],=RA4FCJ/9[20],=RA4HRM/9[20],=RA9WN/9[20],=RD4HM/9[20],=RJ9J[20], - =RK4PA/9[20],=RK6ANP/9[20],=RK6YM/8[20],=RK6YM/9[20],=RP67GS[20],=RP68GS[20],=RP68J[20], - =RP68LK[20],=RP69GS[20],=RP69SF[20],=RP70GS[20],=RP70LF[20],=RP70SF[20],=RP70SU[20],=RP70YF[20], - =RP71GS[20],=RP71LF[20],=RP71SF[20],=RP72DS[20],=RP72GS[20],=RP72SF[20],=RP72YF[20],=RP73GS[20], - =RP73SF[20],=RQ0C/8[20],=RU6YD/9[20],=RV6YM/9[20],=RW4HOH/9[20],=RW4LX/9[20],=RW6AHV/9[20], - =RW9WX/9[20],=RX3BP/9[20],=RX3BP/9/MM[20],=RZ5D/8[20],=RZ9WF/8[20],=RZ9WF/9[20],=UA3ZAF/9[20], - =UA6WIO/9[20],=UA9JFN/M[20], + R17[20],R8J[20],R9J[20],RA8J[20],RA9J[20],RC8J[20],RC9J[20],RD8J[20],RD9J[20],RE8J[20],RE9J[20], + RF8J[20],RF9J[20],RG8J[20],RG9J[20],RJ8J[20],RJ9J[20],RK8J[20],RK9J[20],RL8J[20],RL9J[20], + RM8J[20],RM9J[20],RN8J[20],RN9J[20],RO8J[20],RO9J[20],RQ8J[20],RQ9J[20],RT8J[20],RT9J[20], + RU8J[20],RU9J[20],RV8J[20],RV9J[20],RW8J[20],RW9J[20],RX8J[20],RX9J[20],RY8J[20],RY9J[20], + RZ8J[20],RZ9J[20],U8J[20],U9J[20],UA8J[20],UA9J[20],UB8J[20],UB9J[20],UC8J[20],UC9J[20],UD8J[20], + UD9J[20],UE8J[20],UE9J[20],UF8J[20],UF9J[20],UG8J[20],UG9J[20],UH8J[20],UH9J[20],UI8J[20], + UI9J[20],=R11UND[20],=R120RJ[20],=R123JDR[20],=R15UGRA[20],=R16UGRA[20],=R18KSA[20], + =R25ARCK/8[20],=R2AEA/9[20],=R4YAC/9[20],=R8JAJ/M[20],=RA/UR8IF[20],=RA/UT2LA[20],=RA1QBH/9[20], + =RA3ARS/9[20],=RA3ARS/9/M[20],=RA3QQI/8[20],=RA4FCJ/9[20],=RA4HRM/9[20],=RA60PD[20],=RA9WN/9[20], + =RD4HM/9[20],=RJ9J[20],=RK4PA/9[20],=RK6ANP/9[20],=RK6YM/8[20],=RK6YM/9[20],=RP67GS[20], + =RP68GS[20],=RP68J[20],=RP68LK[20],=RP69GS[20],=RP69SF[20],=RP70GS[20],=RP70LF[20],=RP70SF[20], + =RP70SU[20],=RP70YF[20],=RP71GS[20],=RP71LF[20],=RP71SF[20],=RP72DS[20],=RP72GS[20],=RP72SF[20], + =RP72YF[20],=RP73GS[20],=RP73SF[20],=RP74GS[20],=RQ0C/8[20],=RU6YD/9[20],=RV6YM/9[20], + =RW4HOH/9[20],=RW4LX/9[20],=RW6AHV/9[20],=RW9WX/9[20],=RX3BP/9[20],=RX3BP/9/MM[20],=RZ5D/8[20], + =RZ9WF/8[20],=RZ9WF/9[20],=UA3ZAF/9[20],=UA6WIO/9[20],=UA9JFN/M[20], R8K[20],R9K[20],RA8K[20],RA9K[20],RC8K[20],RC9K[20],RD8K[20],RD9K[20],RE8K[20],RE9K[20],RF8K[20], RF9K[20],RG8K[20],RG9K[20],RI9K[20],RJ8K[20],RJ9K[20],RK8K[20],RK9K[20],RL8K[20],RL9K[20], RM8K[20],RM9K[20],RN8K[20],RN9K[20],RO8K[20],RO9K[20],RQ8K[20],RQ9K[20],RT8K[20],RT9K[20], @@ -2532,16 +2548,16 @@ Asiatic Russia: 17: 30: AS: 55.88: -84.08: -7.0: UA9: =UA1FBP/9[20],=UA1PBA/9[20],=UA1PBP/9[20],=UA3DFM/8[20],=UA3DFM/9[20],=UA3MGA/9[20],=UA6BTN/9[20], =UA9SUV/8[20], =R11QRP/8,=R11QRP/8/P,=R120RL,=R18POR,=R2015EP,=R2015LY,=R2015LY/8,=R22BIA,=R30STM,=R430LT, - =R4FAA/8,=R8MC/9,=R8MD/9,=RA/EW8ADX,=RA0UAC/8,=RA0UF/8,=RA3CW/9,=RA9JG/9,=RC1M/8/M,=RN9N/M, - =RO25TN,=RP67JH,=RP67LK,=RP67LL,=RP67TT,=RP68LS,=RP68TT,=RP69CM,=RP69DK,=RP69GP,=RP69LK,=RP69LL, - =RP69LS,=RP69MM,=RP69P,=RP69YN,=RP70GP,=RP70LL,=RP70LM,=RP70P,=RP70TM,=RP71GP,=RP71LL,=RP71P, - =RP72GP,=RP72LL,=RP72P,=RP72PJ,=RP73LL,=RP73P,=RR110RAEM,=RU22LR,=RW0QJ/9,=RX4W/8,=RX6DL/8, + =R4FAA/8,=R8MC/9,=R8MD/9,=RA/EW8ADX,=RA0UAC/8,=RA0UF/8,=RA3CW/9,=RA9JG/9,=RC1M/8/M,=RO25TN, + =RP67JH,=RP67LK,=RP67LL,=RP67TT,=RP68LS,=RP68TT,=RP69CM,=RP69DK,=RP69GP,=RP69LK,=RP69LL,=RP69LS, + =RP69MM,=RP69P,=RP69YN,=RP70GP,=RP70LL,=RP70LM,=RP70P,=RP70TM,=RP71GP,=RP71LL,=RP71P,=RP72GP, + =RP72LL,=RP72P,=RP72PJ,=RP73LL,=RP73P,=RP74LL,=RP74P,=RR110RAEM,=RU22LR,=RW0QJ/9,=RX4W/8,=RX6DL/8, =RX6DL/8/P,=RX6DL/8/P/QRP,=RX6DL/9/P,=RZ9MXM/9/M,=UB5O/8/P,=UE44Y/8,=UE9FDA/9/M,=UE9MDA/9, =R16CAN,=R1716K,=R1716M,=R1716O,=R1716S,=R9MJ/M,=RA22MX,=RA4CQ/9/M,=RA9MR/0,=RA9MX/P,=RC20MX, - =RK6YYA/9,=RN0SZ/9,=RN9N/9,=RP65MOH,=RP67MC,=RP67MD,=RP68MC,=RP68MD,=RP69MC,=RP69MD,=RP70GK, - =RP70MC,=RP70MD,=RP70OB,=RP70OF,=RP70OS,=RP71GK,=RP71MJ,=RP71OB,=RP72GK,=RP72MJ,=RP72OB,=RP72ZW, - =RP73GK,=RP73OB,=RP8M,=RT22MC,=RT22MD,=RV0SR/9,=RW22MW,=RY22MC,=UA1ZGD/9,=UA3AKO/9,=UA9UAX/M, - =UE55OM,=UE70KRM/9,=UE70KRM/9/M,=UE9OFF/9, + =RK6YYA/9,=RN0SZ/9,=RN9N/9,=RN9N/M,=RP65MOH,=RP67MC,=RP67MD,=RP68MC,=RP68MD,=RP69MC,=RP69MD, + =RP70GK,=RP70MC,=RP70MD,=RP70OB,=RP70OF,=RP70OS,=RP71GK,=RP71MJ,=RP71OB,=RP72GK,=RP72MJ,=RP72OB, + =RP72ZW,=RP73GK,=RP73OB,=RP74PO,=RP8M,=RT22MC,=RT22MD,=RV0SR/9,=RW22MW,=RY22MC,=UA1ZGD/9, + =UA3AKO/9,=UA9MA/M,=UE55OM,=UE70KRM/9,=UE70KRM/9/M,=UE9OFF/9, R8O(18)[31],R8P(18)[31],R9O(18)[31],R9P(18)[31],RA8O(18)[31],RA8P(18)[31],RA9O(18)[31], RA9P(18)[31],RC8O(18)[31],RC8P(18)[31],RC9O(18)[31],RC9P(18)[31],RD8O(18)[31],RD8P(18)[31], RD9O(18)[31],RD9P(18)[31],RE8O(18)[31],RE8P(18)[31],RE9O(18)[31],RE9P(18)[31],RF8O(18)[31], @@ -2568,10 +2584,10 @@ Asiatic Russia: 17: 30: AS: 55.88: -84.08: -7.0: UA9: =RA27OM(18)[31],=RA3DH/9(18)[31],=RA3ET/9(18)[31],=RA4FRH/0/P(18)[31],=RA9JJ/9/M(18)[31], =RA9MX/9(18)[31],=RC1M/9(18)[31],=RC1M/9/M(18)[31],=RG9O(18)[31],=RN9N/9/M(18)[31],=RO9O(18)[31], =RP67MP(18)[31],=RP68MP(18)[31],=RP70MP(18)[31],=RP71MP(18)[31],=RP72MP(18)[31],=RP73MP(18)[31], - =RP9OMP(18)[31],=RP9OW(18)[31],=RQ16CW(18)[31],=RR9O(18)[31],=RS9O(18)[31],=RU0ZM/9(18)[31], - =RU27OZ(18)[31],=RU6LA/9(18)[31],=RV0CJ/9(18)[31],=RW1AC/9(18)[31],=RW9MD/9/M(18)[31], - =RZ9MXM/9(18)[31],=UA0KDR/9(18)[31],=UA0ZAY/9(18)[31],=UA6WFO/9(18)[31],=UA9MA/9(18)[31], - =UA9MA/9/M(18)[31],=UA9MRA/9(18)[31],=UE80NSO(18)[31], + =RP74MP(18)[31],=RP9OMP(18)[31],=RP9OW(18)[31],=RQ16CW(18)[31],=RR9O(18)[31],=RS9O(18)[31], + =RU0ZM/9(18)[31],=RU27OZ(18)[31],=RU6LA/9(18)[31],=RV0CJ/9(18)[31],=RW1AC/9(18)[31], + =RW9MD/9/M(18)[31],=RZ9MXM/9(18)[31],=UA0KDR/9(18)[31],=UA0ZAY/9(18)[31],=UA6WFO/9(18)[31], + =UA9MA/9(18)[31],=UA9MA/9/M(18)[31],=UA9MRA/9(18)[31],=UE80NSO(18)[31], =R110RP,=R120RDP,=R120RZ,=R120TM,=R150RP,=R155RP,=R160RP,=R18URU,=RA22QF,=RC20QA,=RC20QC,=RC20QF, =RM20CC,=RM9RZ/A,=RM9RZ/P,=RP65R,=RP67KE,=RP67R,=RP68KE,=RP68R,=RP69KE,=RP69R,=RP70KE,=RP70R, =RP71R,=RP72KE,=RP72R,=RT73CW,=RT73JH,=RV3MN/9,=RW22QA,=RW22QA/8,=RW22QC,=RW22QC/8,=RW4NW/9, @@ -2619,8 +2635,9 @@ Asiatic Russia: 17: 30: AS: 55.88: -84.08: -7.0: UA9: =R22ULM(18)[31],=R400N(18)[31],=R70B(18)[31],=R9/EW1TM(18)[31],=R9UAG/N(18)[31],=RA4CQ/9(18)[31], =RC4W/9(18)[31],=RD0L/9(18)[31],=RK6CG/9(18)[31],=RP65UMF(18)[31],=RP67KM(18)[31],=RP68KM(18)[31], =RP69KM(18)[31],=RP70KM(18)[31],=RP70NM(18)[31],=RP70UK(18)[31],=RP70ZF(18)[31],=RP71KM(18)[31], - =RP72KM(18)[31],=RP72NM(18)[31],=RP73KM(18)[31],=RP73NZ(18)[31],=RP73ZF(18)[31],=RT22UA(18)[31], - =RT77VV(18)[31],=RW4CG/9(18)[31],=RZ5D/9(18)[31],=UA9JFE/9/P(18)[31],=UE3ATV/9(18)[31], + =RP72KM(18)[31],=RP72NM(18)[31],=RP73KM(18)[31],=RP73NZ(18)[31],=RP73ZF(18)[31],=RP74KM(18)[31], + =RT22UA(18)[31],=RT77VV(18)[31],=RW4CG/9(18)[31],=RZ5D/9(18)[31],=UA9JFE/9/P(18)[31], + =UA9UAX/M(18)[31],=UE3ATV/9(18)[31], R8W(16),R9W(16),RA8W(16),RA9W(16),RC8W(16),RC9W(16),RD8W(16),RD9W(16),RE8W(16),RE9W(16),RF8W(16), RF9W(16),RG8W(16),RG9W(16),RJ8W(16),RJ9W(16),RK8W(16),RK9W(16),RL8W(16),RL9W(16),RM8W(16), RM9W(16),RN8W(16),RN9W(16),RO8W(16),RO9W(16),RQ8W(16),RQ9W(16),RT8W(16),RT9W(16),RU8W(16), @@ -2636,15 +2653,15 @@ Asiatic Russia: 17: 30: AS: 55.88: -84.08: -7.0: UA9: =RP67MG(16),=RP67NG(16),=RP67RK(16),=RP67SW(16),=RP67UF(16),=RP68GM(16),=RP68NK(16),=RP68UF(16), =RP69GI(16),=RP69PW(16),=RP69UF(16),=RP70GI(16),=RP70GM(16),=RP70LS(16),=RP70NK(16),=RP70UF(16), =RP70ZO(16),=RP71GI(16),=RP71GM(16),=RP71UF(16),=RP72AR(16),=RP72GI(16),=RP72GM(16),=RP72UF(16), - =RP72WU(16),=RP73AR(16),=RP73GI(16),=RP73UF(16),=RP73WU(16),=RT22WF(16),=RT2F/4(16),=RT2F/4/M(16), - =RT2F/9/M(16),=RT73EA(16),=RT73EL(16),=RT8A/4(16),=RT9W(16),=RT9W/P(16),=RU110RAEM(16), - =RU20WC(16),=RU22WZ(16),=RU27WB(16),=RU27WF(16),=RU27WN(16),=RU27WO(16),=RU3HD/9/P(16), - =RU90WZ(16),=RU9KC/4/M(16),=RU9SO/4(16),=RU9SO/4/P(16),=RV22WB(16),=RV2FZ/9(16),=RV90WB(16), - =RV9CHB/4(16),=RW3SN/9(16),=RW3XX/9(16),=RW4WA/9/P(16),=RW90WC(16),=RW9FWR/9/M(16),=RW9JZ/4(16), - =RW9JZ/9(16),=RX22WN(16),=RZ16WF(16),=RZ90W(16),=RZ90WU(16),=UA0AZA/9(16),=UA1AAE/9(16), - =UA1ZPC/9(16),=UA4LU/9/P(16),=UA4PIE/9(16),=UA4PIE/9/M(16),=UA4PIE/9/P(16),=UA4PJM/9(16), - =UA4PJM/9/M(16),=UA4PJM/9/P(16),=UA4PXR/9/M(16),=UA9KAA/4(16),=UA9KAA/9(16),=UB5O/4/M(16), - =UE10RFF/4(16),=UE90W(16), + =RP72WU(16),=RP73AR(16),=RP73GI(16),=RP73UF(16),=RP73WU(16),=RP74GI(16),=RP74UF(16),=RT22WF(16), + =RT2F/4(16),=RT2F/4/M(16),=RT2F/9/M(16),=RT73EA(16),=RT73EL(16),=RT8A/4(16),=RT9W(16),=RT9W/P(16), + =RU110RAEM(16),=RU20WC(16),=RU22WZ(16),=RU27WB(16),=RU27WF(16),=RU27WN(16),=RU27WO(16), + =RU3HD/9/P(16),=RU90WZ(16),=RU9KC/4/M(16),=RU9SO/4(16),=RU9SO/4/P(16),=RV22WB(16),=RV2FZ/9(16), + =RV90WB(16),=RV9CHB/4(16),=RW3SN/9(16),=RW3XX/9(16),=RW4WA/9/P(16),=RW90WC(16),=RW9FWR/9/M(16), + =RW9JZ/4(16),=RW9JZ/9(16),=RX22WN(16),=RZ16WF(16),=RZ90W(16),=RZ90WU(16),=UA0AZA/9(16), + =UA1AAE/9(16),=UA1ZPC/9(16),=UA4LU/9/P(16),=UA4PIE/9(16),=UA4PIE/9/M(16),=UA4PIE/9/P(16), + =UA4PJM/9(16),=UA4PJM/9/M(16),=UA4PJM/9/P(16),=UA4PXR/9/M(16),=UA9KAA/4(16),=UA9KAA/9(16), + =UB5O/4/M(16),=UE10RFF/4(16),=UE90W(16), R8Y(18)[31],R9Y(18)[31],RA8Y(18)[31],RA9Y(18)[31],RC8Y(18)[31],RC9Y(18)[31],RD8Y(18)[31], RD9Y(18)[31],RE8Y(18)[31],RE9Y(18)[31],RF8Y(18)[31],RF9Y(18)[31],RG8Y(18)[31],RG9Y(18)[31], RJ8Y(18)[31],RJ9Y(18)[31],RK8Y(18)[31],RK9Y(18)[31],RL8Y(18)[31],RL9Y(18)[31],RM8Y(18)[31], @@ -2669,8 +2686,7 @@ Asiatic Russia: 17: 30: AS: 55.88: -84.08: -7.0: UA9: U8Z(18)[31],U9Z(18)[31],UA8Z(18)[31],UA9Z(18)[31],UB8Z(18)[31],UB9Z(18)[31],UC8Z(18)[31], UC9Z(18)[31],UD8Z(18)[31],UD9Z(18)[31],UE8Z(18)[31],UE9Z(18)[31],UF8Z(18)[31],UF9Z(18)[31], UG8Z(18)[31],UG9Z(18)[31],UH8Z(18)[31],UH9Z(18)[31],UI8Z(18)[31],UI9Z(18)[31], - =RA/IK5MIC/P(18)[31],=RC9YA/9/M(18)[31],=RW9MD/9/P(18)[31],=UA0KBG/9/P(18)[31],=UA9MA/M(18)[31], - =UA9MAC/9(18)[31], + =RA/IK5MIC/P(18)[31],=RC9YA/9/M(18)[31],=RW9MD/9/P(18)[31],=UA0KBG/9/P(18)[31],=UA9MAC/9(18)[31], R0A(18)[32],R0B(18)[32],R0H(18)[32],RA0A(18)[32],RA0B(18)[32],RA0H(18)[32],RC0A(18)[32], RC0B(18)[32],RC0H(18)[32],RD0A(18)[32],RD0B(18)[32],RD0H(18)[32],RE0A(18)[32],RE0B(18)[32], RE0H(18)[32],RF0A(18)[32],RF0B(18)[32],RF0H(18)[32],RG0A(18)[32],RG0B(18)[32],RG0H(18)[32], @@ -2692,13 +2708,13 @@ Asiatic Russia: 17: 30: AS: 55.88: -84.08: -7.0: UA9: =RAEM(18)[32],=RD110RAEM(18)[32],=RI0B(18)[32],=RI0BV/0(18)[32],=RK3DZJ/9(18)[32],=RK56GC(18)[32], =RK6BBM/9(18)[32],=RK80KEDR(18)[32],=RL5G/9(18)[32],=RM0A(18)[32],=RM2D/9(18)[32], =RM9RZ/0(18)[32],=RN0A(18)[32],=RN110RAEM(18)[32],=RN110RAEM/P(18)[32],=RP70KV(18)[32], - =RP70RS(18)[32],=RP73KT(18)[32],=RT22SA(18)[32],=RT9K/9(18)[32],=RU19NY(18)[32],=RU3FF/0(18)[32], - =RU4CO/0(18)[32],=RV3DHC/0(18)[32],=RV3DHC/0/P(18)[32],=RV9WP/9(18)[32],=RW3XN/0(18)[32], - =RW3YC/0(18)[32],=RW3YC/9(18)[32],=RY1AAB/9(18)[32],=RY1AAB/9/M(18)[32],=RZ3DSA/0(18)[32], - =RZ3DZS/0(18)[32],=RZ9ON/9(18)[32],=UA0ACG/0(18)[32],=UA0FCB/0(18)[32],=UA0FCB/0/P(18)[32], - =UA0WG/0(18)[32],=UA0WW/0(18)[32],=UA0WW/M(18)[32],=UA0WY/0(18)[32],=UA3ADN/0(18)[32], - =UA4LU/0(18)[32],=UA4PT/0(18)[32],=UA6BTN/0(18)[32],=UA9UAX/9(18)[32],=UA9WDK/0(18)[32], - =UB1AJQ/0(18)[32],=UE1WFF/0(18)[32], + =RP70RS(18)[32],=RP73KT(18)[32],=RP74KT(18)[32],=RT22SA(18)[32],=RT9K/9(18)[32],=RU19NY(18)[32], + =RU3FF/0(18)[32],=RU4CO/0(18)[32],=RV3DHC/0(18)[32],=RV3DHC/0/P(18)[32],=RV9WP/9(18)[32], + =RW3XN/0(18)[32],=RW3YC/0(18)[32],=RW3YC/9(18)[32],=RY1AAB/9(18)[32],=RY1AAB/9/M(18)[32], + =RZ3DSA/0(18)[32],=RZ3DZS/0(18)[32],=RZ9ON/9(18)[32],=UA0ACG/0(18)[32],=UA0FCB/0(18)[32], + =UA0FCB/0/P(18)[32],=UA0WG/0(18)[32],=UA0WW/0(18)[32],=UA0WW/M(18)[32],=UA0WY/0(18)[32], + =UA3ADN/0(18)[32],=UA4LU/0(18)[32],=UA4PT/0(18)[32],=UA6BTN/0(18)[32],=UA9UAX/9(18)[32], + =UA9WDK/0(18)[32],=UB1AJQ/0(18)[32],=UE1WFF/0(18)[32], =R100D(18)[22],=R100DI(18)[22],=R3CA/9(18)[22],=RA3XR/0(18)[22],=RA9LI/0(18)[22],=RI0BDI(18)[22], =RS0B(18)[22],=RS0B/P(18)[22],=RV3EFH/0(18)[22],=RW1AI/9(18)[22],=RW3GW/0(18)[22], =RX6LMQ/0(18)[22],=RZ9DX/0(18)[22],=RZ9DX/0/A(18)[22],=RZ9DX/0/P(18)[22],=RZ9DX/9(18)[22], @@ -2771,11 +2787,11 @@ Asiatic Russia: 17: 30: AS: 55.88: -84.08: -7.0: UA9: =RN1NS/0(19)[34],=RP0L(19)[34],=RP0LPK(19)[34],=RP60P(19)[34],=RP66V(19)[34],=RP67SD(19)[34], =RP67V(19)[34],=RP68SD(19)[34],=RP68V(19)[34],=RP69SD(19)[34],=RP69V(19)[34],=RP70DG(19)[34], =RP70SD(19)[34],=RP70V(19)[34],=RP71DG(19)[34],=RP71SD(19)[34],=RP71V(19)[34],=RP72DG(19)[34], - =RP72SD(19)[34],=RP72V(19)[34],=RP73DG(19)[34],=RP73SD(19)[34],=RP73V(19)[34],=RU3BY/0(19)[34], - =RU5D/0(19)[34],=RV1AW/0(19)[34],=RV3DSA/0(19)[34],=RW22GO(19)[34],=RW3LG/0(19)[34], - =RX15RX(19)[34],=UA0SDX/0(19)[34],=UA0SIK/0(19)[34],=UA3AHA/0(19)[34],=UA4SBZ/0(19)[34], - =UA6MF/0(19)[34],=UA7R/0(19)[34],=UB0LAP/P(19)[34],=UC0LAF/P(19)[34],=UE1RFF/0(19)[34], - =UE70MA(19)[34],=UE75L(19)[34], + =RP72SD(19)[34],=RP72V(19)[34],=RP73DG(19)[34],=RP73SD(19)[34],=RP73V(19)[34],=RP74DG(19)[34], + =RP74SD(19)[34],=RP74V(19)[34],=RU3BY/0(19)[34],=RU5D/0(19)[34],=RV1AW/0(19)[34], + =RV3DSA/0(19)[34],=RW22GO(19)[34],=RW3LG/0(19)[34],=RX15RX(19)[34],=UA0SDX/0(19)[34], + =UA0SIK/0(19)[34],=UA3AHA/0(19)[34],=UA4SBZ/0(19)[34],=UA6MF/0(19)[34],=UA7R/0(19)[34], + =UB0LAP/P(19)[34],=UC0LAF/P(19)[34],=UE1RFF/0(19)[34],=UE70MA(19)[34],=UE75L(19)[34], R0O(18)[32],RA0O(18)[32],RC0O(18)[32],RD0O(18)[32],RE0O(18)[32],RF0O(18)[32],RG0O(18)[32], RJ0O(18)[32],RK0O(18)[32],RL0O(18)[32],RM0O(18)[32],RN0O(18)[32],RO0O(18)[32],RQ0O(18)[32], RT0O(18)[32],RU0O(18)[32],RV0O(18)[32],RW0O(18)[32],RX0O(18)[32],RY0O(18)[32],RZ0O(18)[32], @@ -2813,7 +2829,7 @@ Asiatic Russia: 17: 30: AS: 55.88: -84.08: -7.0: UA9: =RA0SP/RP(18)[32],=RA0SR/RP(18)[32],=RA110RAEM(18)[32],=RA3TO/0(18)[32],=RA4CSX/0/P(18)[32], =RA9JG/0(18)[32],=RA9JG/0/P(18)[32],=RA9OBG/0(18)[32],=RA9USU/8(18)[32],=RD0L/0(18)[32], =RK17CW(18)[32],=RK9MZZ/0(18)[32],=RN4HIT/0(18)[32],=RP0S(18)[32],=RP0SXR(18)[32],=RP0SZZ(18)[32], - =RP67ST(18)[32],=RP70AB(18)[32],=RP72AB(18)[32],=RP73AB(18)[32],=RQ0C/9(18)[32], + =RP67ST(18)[32],=RP70AB(18)[32],=RP72AB(18)[32],=RP73AB(18)[32],=RP74AB(18)[32],=RQ0C/9(18)[32], =RV3ACA/0/M(18)[32],=RV6AJ/0(18)[32],=RV7AD/0(18)[32],=RV9JD/0(18)[32],=RW4YA/0(18)[32], =RW4YA/9(18)[32],=RX3AT/0(18)[32],=RX3DFH/0(18)[32],=RX9WN/0(18)[32],=RX9WN/0/M(18)[32], =RX9WN/0/P(18)[32],=RZ0SO/P(18)[32],=UA0KBG/0(18)[32],=UA0KBG/9(18)[32],=UA3EDQ/0(18)[32], @@ -2828,15 +2844,15 @@ Asiatic Russia: 17: 30: AS: 55.88: -84.08: -7.0: UA9: =RP0W(18)[31],=RP0W/P(18)[31],=RP0WWS(18)[31],=RP70SL(18)[31],=RP72SL(18)[31],=RV0AE/0/FF(18)[31], =RZ0AM/0(18)[31],=RZ22WW(18)[31],=UA0FCB/P(18)[31],=UA9UAX/0/M(18)[31],=UB5O/9(18)[31], =UE0ARD/0(18)[31],=UE10RFF/9(18)[31],=UE1RFF/0/P(18)[31],=UE9FDA/0(18)[31],=UE9FDA/0/M(18)[31], - =R23RRC(19)[25],=UA6HMC/0(19)[25], + =R205NEW(19)[25],=R23RRC(19)[25],=UA6HMC/0(19)[25], R0Y(23)[32],RA0Y(23)[32],RC0Y(23)[32],RD0Y(23)[32],RE0Y(23)[32],RF0Y(23)[32],RG0Y(23)[32], RJ0Y(23)[32],RK0Y(23)[32],RL0Y(23)[32],RM0Y(23)[32],RN0Y(23)[32],RO0Y(23)[32],RQ0Y(23)[32], RT0Y(23)[32],RU0Y(23)[32],RV0Y(23)[32],RW0Y(23)[32],RX0Y(23)[32],RY0Y(23)[32],RZ0Y(23)[32], U0Y(23)[32],UA0Y(23)[32],UB0Y(23)[32],UC0Y(23)[32],UD0Y(23)[32],UE0Y(23)[32],UF0Y(23)[32], - UG0Y(23)[32],UH0Y(23)[32],UI0Y(23)[32],=R3YAB/9/P(23)[32],=R9OOO/9/M(23)[32],=R9OOO/9/P(23)[32], - =R9OY/9/P(23)[32],=RA0AJ/0/P(23)[32],=RA0WA/0/P(23)[32],=RA9YME/0(23)[32],=RK3BY/0(23)[32], - =RP0Y(23)[32],=RX0AE/0(23)[32],=RX0AT/0/P(23)[32],=UA0ADU/0(23)[32],=UA0WGD/0(23)[32], - =UA9ZZ/0/P(23)[32],=UE0OFF/0(23)[32],=UE44Y/9(23)[32],=UE70Y(23)[32], + UG0Y(23)[32],UH0Y(23)[32],UI0Y(23)[32],=R0WX/P(23)[32],=R3YAB/9/P(23)[32],=R9OOO/9/M(23)[32], + =R9OOO/9/P(23)[32],=R9OY/9/P(23)[32],=RA0AJ/0/P(23)[32],=RA0WA/0/P(23)[32],=RA9YME/0(23)[32], + =RK3BY/0(23)[32],=RP0Y(23)[32],=RX0AE/0(23)[32],=RX0AT/0/P(23)[32],=UA0ADU/0(23)[32], + =UA0WGD/0(23)[32],=UA9ZZ/0/P(23)[32],=UE0OFF/0(23)[32],=UE44Y/9(23)[32],=UE70Y(23)[32], R0X(19)[35],R0Z(19)[35],RA0X(19)[35],RA0Z(19)[35],RC0X(19)[35],RC0Z(19)[35],RD0X(19)[35], RD0Z(19)[35],RE0X(19)[35],RE0Z(19)[35],RF0X(19)[35],RF0Z(19)[35],RG0X(19)[35],RG0Z(19)[35], RI0X(19)[35],RI0Z(19)[35],RJ0X(19)[35],RJ0Z(19)[35],RK0X(19)[35],RK0Z(19)[35],RL0X(19)[35], @@ -2921,12 +2937,12 @@ Marshall Islands: 31: 65: OC: 9.08: -167.33: -12.0: V7: Brunei Darussalam: 28: 54: OC: 4.50: -114.60: -8.0: V8: V8; Canada: 05: 09: NA: 44.35: 78.75: 5.0: VE: - CF,CG,CJ,CK,VA,VB,VC,VE,VG,VX,VY9,XL,XM,=VE2EM/M,=VER20190416, + CF,CG,CJ,CK,VA,VB,VC,VE,VG,VX,VY9,XL,XM,=VE2EM/M,=VER20190523, =CF7AAW/1,=CK7IG/1,=VA3QSL/1,=VA3WR/1,=VE1REC/LH,=VE1REC/M/LH,=VE3RSA/1,=VE7IG/1, CF2[4],CG2[4],CJ2[4],CK2[4],VA2[4],VB2[4],VC2[4],VE2[4],VG2[4],VX2[4],XL2[4],XM2[4],=4Y1CAO[4], - =CY2ZT/2[4],=VA3ELE/2[4],=VA3MPM/2[4],=VA7AQ/P[4],=VE2/G3ZAY/P[4],=VE2/M0BLF/P[4],=VE2FK[9], - =VE2HAY/P[4],=VE2MAM/P[4],=VE2OV/P[4],=VE3AP/2[4],=VE3EXY/2[4],=VE3GF/2[4],=VE3GNO/2[4], - =VE3IAC/2[4],=VE3ZZ/2[4],=VE6TC/2[4],=VE7IG/2[4],=XO0ICE/2[4], + =CY2ZT/2[4],=VA3MPM/2[4],=VA7AQ/P[4],=VE2/G3ZAY/P[4],=VE2/M0BLF/P[4],=VE2FK[9],=VE2HAY/P[4], + =VE2MAM/P[4],=VE2OV/P[4],=VE3AP/2[4],=VE3EXY/2[4],=VE3GF/2[4],=VE3GNO/2[4],=VE3IAC/2[4], + =VE3ZZ/2[4],=VE6TC/2[4],=VE7IG/2[4],=XO0ICE/2[4], CF3(4)[4],CG3(4)[4],CJ3(4)[4],CK3(4)[4],VA3(4)[4],VB3(4)[4],VC3(4)[4],VE3(4)[4],VG3(4)[4], VX3(4)[4],XL3(4)[4],XM3(4)[4],=CF7EWK/3(4)[4],=CI0XN/P(4)[4],=CJ7EWK/3(4)[4],=VA7EWK/3(4)[4], =VE1RM/3(4)[4],=VE2AEJ/3(4)[4],=VE2MAM/3(4)[4],=VE2PK/3(4)[4],=VE2QLF/3(4)[4],=VE2QV/3(4)[4], @@ -2956,17 +2972,17 @@ Canada: 05: 09: NA: 44.35: 78.75: 5.0: VE: =CF2RC(2)[4],=CF2VVV(2)[4],=CJ2BY(2)[4],=CJ2KCE(2)[4],=K3FMQ/VE2(2)[4],=K5YG/VE2(2)[4], =KD3RF/VE2(2)[4],=KD3TB/VE2(2)[4],=N5ZO/VE2(2)[4],=VA1CN/2(2)[4],=VA2BK(2)[4],=VA2BY(2)[4], =VA2KCE(2)[4],=VA2MCJ/VE2(2)[4],=VA2RAG(2)[4],=VA2RC(2)[4],=VA2VFT(2)[4],=VA2VVV(2)[4], - =VA3NA/2(2)[4],=VB2C(2)[4],=VB2R(2)[4],=VB2T(2)[4],=VB2V(2)[4],=VB2W(2)[4],=VC2C(2)[4], - =VC2EME(2)[4],=VC2Q(2)[4],=VC2R(2)[4],=VC2X(2)[4],=VC3W/2(2)[4],=VE2/JA8BMK(2)[4],=VE2/K5YG(2)[4], - =VE2/KD3RF(2)[4],=VE2/KD3RF/M(2)[4],=VE2/N1NK(2)[4],=VE2/UT3UA(2)[4],=VE2/W2NTJ(2)[4], - =VE2/W5GED(2)[4],=VE2A(2)[4],=VE2ACP/P(2)[4],=VE2AE(2)[4],=VE2CSI(2)[4],=VE2CVI(2)[4], - =VE2DXY(2)[4],=VE2EKA(2)[4],=VE2EW(2)[4],=VE2FDJ/2(2)[4],=VE2GHZ/2(2)[4],=VE2HRI(2)[4], - =VE2IDX(2)[4],=VE2III(2)[4],=VE2IM(2)[4],=VE2KK(2)[4],=VE2NN(2)[4],=VE2OTT(2)[4],=VE2PR(2)[4], - =VE2PRG(2)[4],=VE2QIP/2(2)[4],=VE2WDX(2)[4],=VE2XAA/2(2)[4],=VE2XB/2(2)[4],=VE2Z(2)[4], - =VE3AXC/2(2)[4],=VE3CWU/2(2)[4],=VE3EY/2(2)[4],=VE3FDX/2(2)[4],=VE3JM/2(2)[4],=VE3NE/2(2)[4], - =VE3NWA/2(2)[4],=VE3RHJ/2(2)[4],=VE3ZF/2(2)[4],=VE7ACN/VE2(2)[4],=VE7MID/VE2(2)[4],=VE8DX/2(2)[4], - =W0SD/VE2(2)[4],=W2NTJ/VE2(2)[4],=W4TMO/VE2(2)[4],=W5GED/VE2(2)[4],=WB8YTZ/VE2(2)[4], - =XM3NE/2(2)[4], + =VA3ELE/2(2)[4],=VA3NA/2(2)[4],=VA7XW/VE2(2)[4],=VB2C(2)[4],=VB2R(2)[4],=VB2T(2)[4],=VB2V(2)[4], + =VB2W(2)[4],=VC2C(2)[4],=VC2EME(2)[4],=VC2Q(2)[4],=VC2R(2)[4],=VC2X(2)[4],=VC3W/2(2)[4], + =VE2/JA8BMK(2)[4],=VE2/K5YG(2)[4],=VE2/KD3RF(2)[4],=VE2/KD3RF/M(2)[4],=VE2/N1NK(2)[4], + =VE2/UT3UA(2)[4],=VE2/W2NTJ(2)[4],=VE2/W5GED(2)[4],=VE2A(2)[4],=VE2ACP/P(2)[4],=VE2AE(2)[4], + =VE2CSI(2)[4],=VE2CVI(2)[4],=VE2DXY(2)[4],=VE2EKA(2)[4],=VE2EW(2)[4],=VE2FDJ/2(2)[4], + =VE2GHZ/2(2)[4],=VE2HRI(2)[4],=VE2IDX(2)[4],=VE2III(2)[4],=VE2IM(2)[4],=VE2KK(2)[4],=VE2NN(2)[4], + =VE2OTT(2)[4],=VE2PR(2)[4],=VE2PRG(2)[4],=VE2QIP/2(2)[4],=VE2TWO(2)[4],=VE2WDX(2)[4], + =VE2XAA/2(2)[4],=VE2XB/2(2)[4],=VE2Z(2)[4],=VE3AXC/2(2)[4],=VE3CWU/2(2)[4],=VE3EY/2(2)[4], + =VE3FDX/2(2)[4],=VE3JM/2(2)[4],=VE3NE/2(2)[4],=VE3NWA/2(2)[4],=VE3RHJ/2(2)[4],=VE3ZF/2(2)[4], + =VE7ACN/VE2(2)[4],=VE7MID/VE2(2)[4],=VE8DX/2(2)[4],=W0SD/VE2(2)[4],=W2NTJ/VE2(2)[4], + =W4TMO/VE2(2)[4],=W5GED/VE2(2)[4],=WB8YTZ/VE2(2)[4],=XM3NE/2(2)[4], =K8JJ/VY0(4)[4],=K9AJ/VY0(4)[4],=KD6WW/VY0(4)[4],=VY0A(4)[4],=VY0V(4)[4]; Australia: 30: 59: OC: -23.70: -132.33: -10.0: VK: AX,VH,VI,VJ,VK,VL,VM,VN,VZ,=VK9MAV, From b985d415916fb15387b0f8e111ea77541822461d Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Tue, 4 Jun 2019 14:47:35 +0100 Subject: [PATCH 124/159] Bump RC number --- Release_Notes.txt | 9 +++++++++ Versions.cmake | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/Release_Notes.txt b/Release_Notes.txt index 60fa0aa20..60b79de8e 100644 --- a/Release_Notes.txt +++ b/Release_Notes.txt @@ -12,6 +12,15 @@ Copyright 2001 - 2019 by Joe Taylor, K1JT. + Release: WSJT-X 2.1.0-rc7 + June 3, 2019 + ------------------------- + +This release is a bug fix only release addressing regressions in the +prior RC6 release. There are no functional changes other than an +updated AD1C CTY.DAT database. + + Release: WSJT-X 2.1.0-rc6 May 30, 2019 ------------------------- diff --git a/Versions.cmake b/Versions.cmake index 45cd79820..3e2fc87cd 100644 --- a/Versions.cmake +++ b/Versions.cmake @@ -2,5 +2,5 @@ set (WSJTX_VERSION_MAJOR 2) set (WSJTX_VERSION_MINOR 1) set (WSJTX_VERSION_PATCH 0) -set (WSJTX_RC 7) # release candidate number, comment out or zero for development versions +set (WSJTX_RC 8) # release candidate number, comment out or zero for development versions set (WSJTX_VERSION_IS_RELEASE 0) # set to 1 for final release build From d3121bfedd57038b8a66a33dbd8606a8e909e7f3 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Tue, 4 Jun 2019 10:19:35 -0400 Subject: [PATCH 125/159] Correct the open() statement in readwav.f90. --- lib/jt9.f90 | 4 ++-- lib/readwav.f90 | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/jt9.f90 b/lib/jt9.f90 index 67e7ac319..0e99a7592 100644 --- a/lib/jt9.f90 +++ b/lib/jt9.f90 @@ -139,7 +139,7 @@ program jt9 read (optarg(:arglen), *) nexp_decode end select end do - + if (display_help .or. stat .lt. 0 & .or. (.not. read_files .and. remain .gt. 0) & .or. (read_files .and. remain .lt. 1)) then @@ -234,7 +234,7 @@ program jt9 read(unit=wav%lun,end=3) shared_data%id2(k-kstep+1:k) go to 4 3 call timer('read_wav',1) - print*,'EOF on input file ',infile + print*,'EOF on input file ',trim(infile) exit 4 call timer('read_wav',1) nhsym=(k-2048)/kstep diff --git a/lib/readwav.f90 b/lib/readwav.f90 index ebc30c9a0..5cd866e68 100644 --- a/lib/readwav.f90 +++ b/lib/readwav.f90 @@ -53,7 +53,7 @@ contains type(riff_descriptor) :: desc character(len=4) :: riff_type - open (newunit=this%lun, file=filename, access='stream', form='unformatted', status='old') + open (unit=this%lun, file=filename, access='stream',status='old') read (unit=this%lun) desc,riff_type inquire (unit=this%lun, pos=filepos) do From 6a2ac44916d73ffaed3a57fb3c8bc7125231bac4 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Tue, 4 Jun 2019 10:39:43 -0400 Subject: [PATCH 126/159] Use LU=26 in readwav.f90. --- lib/readwav.f90 | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/readwav.f90 b/lib/readwav.f90 index 5cd866e68..253690496 100644 --- a/lib/readwav.f90 +++ b/lib/readwav.f90 @@ -53,6 +53,7 @@ contains type(riff_descriptor) :: desc character(len=4) :: riff_type + this%lun=26 open (unit=this%lun, file=filename, access='stream',status='old') read (unit=this%lun) desc,riff_type inquire (unit=this%lun, pos=filepos) @@ -67,5 +68,6 @@ contains end if filepos = filepos + (desc%size + 1) / 2 * 2 ! pad to even alignment end do + return end subroutine read end module readwav From 97be1b46b90c11312905c6e295a68c933eec8ee7 Mon Sep 17 00:00:00 2001 From: Steve Franke Date: Tue, 4 Jun 2019 14:53:45 -0500 Subject: [PATCH 127/159] Add more protection against the i0 crash that has occurred in getcandidates4.f90. --- lib/ft4/ft4_downsample.f90 | 4 ++-- lib/ft4/getcandidates4.f90 | 8 ++------ 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/lib/ft4/ft4_downsample.f90 b/lib/ft4/ft4_downsample.f90 index ed55fb9a0..f908c6c44 100644 --- a/lib/ft4/ft4_downsample.f90 +++ b/lib/ft4/ft4_downsample.f90 @@ -40,8 +40,8 @@ subroutine ft4_downsample(dd,newdata,f0,c) c1=0. if(i0.ge.0 .and. i0.le.NMAX/2) c1(0)=cx(i0) do i=1,NFFT2/2 - if(i0+i.le.NMAX/2) c1(i)=cx(i0+i) - if(i0-i.ge.0) c1(NFFT2-i)=cx(i0-i) + if(i0+i.ge.0 .and. i0+i.le.NMAX/2) c1(i)=cx(i0+i) + if(i0-i.ge.0 .and. i0-i.le.NMAX/2) c1(NFFT2-i)=cx(i0-i) enddo c1=c1*window/NFFT2 call four2a(c1,NFFT2,1,1,1) !c2c FFT back to time domain diff --git a/lib/ft4/getcandidates4.f90 b/lib/ft4/getcandidates4.f90 index f7cef02ef..951129915 100644 --- a/lib/ft4/getcandidates4.f90 +++ b/lib/ft4/getcandidates4.f90 @@ -47,7 +47,7 @@ subroutine getcandidates4(dd,fa,fb,syncmin,nfqso,maxcand,savg,candidate, & nfa=fa/df if(nfa.lt.nint(200.0/df)) nfa=nint(200.0/df) nfb=fb/df - if(nfb.gt.nint(5000.0/df)) nfb=nint(5000.0/df) + if(nfb.gt.nint(4910.0/df)) nfb=nint(4910.0/df) ncand=0 call ft4_baseline(savg,nfa,nfb,sbase) if(any(sbase(nfa:nfb).le.0)) return @@ -60,13 +60,9 @@ subroutine getcandidates4(dd,fa,fb,syncmin,nfqso,maxcand,savg,candidate, & del=0. if(den.ne.0.0) del=0.5*(savsm(i-1)-savsm(i+1))/den fpeak=(i+del)*df+f_offset - if(fpeak.lt.0.0 .or. fpeak.gt.4910.0) cycle + if(fpeak.lt.200.0 .or. fpeak.gt.4910.0) cycle speak=savsm(i) - 0.25*(savsm(i-1)-savsm(i+1))*del ncand=ncand+1 - if(ncand.gt.maxcand) then - ncand=maxcand - exit - endif candidate(1,ncand)=fpeak candidate(2,ncand)=-99.99 candidate(3,ncand)=speak From f9e9bc01a1bf0d22b04d0c8994c0c61803b6a183 Mon Sep 17 00:00:00 2001 From: Steve Franke Date: Wed, 5 Jun 2019 10:17:59 -0500 Subject: [PATCH 128/159] Update some comments, delete obsolete files. --- lib/ft4/ft4_downsample.f90 | 3 - lib/ft4/ft4_params.f90 | 2 +- lib/ft4/ft4b.f90 | 489 ------------------------------------- lib/ft4/ft4d.f90 | 83 ------- lib/ft4/genft4.f90 | 2 +- 5 files changed, 2 insertions(+), 577 deletions(-) delete mode 100644 lib/ft4/ft4b.f90 delete mode 100644 lib/ft4/ft4d.f90 diff --git a/lib/ft4/ft4_downsample.f90 b/lib/ft4/ft4_downsample.f90 index f908c6c44..bbe53a2a2 100644 --- a/lib/ft4/ft4_downsample.f90 +++ b/lib/ft4/ft4_downsample.f90 @@ -1,8 +1,5 @@ subroutine ft4_downsample(dd,newdata,f0,c) -! Input: real data in dd() at sample rate 12000 Hz -! Output: Complex data in c(), sampled at 1200 Hz - include 'ft4_params.f90' parameter (NFFT2=NMAX/NDOWN) real dd(NMAX) diff --git a/lib/ft4/ft4_params.f90 b/lib/ft4/ft4_params.f90 index 2914260d8..43abc573a 100644 --- a/lib/ft4/ft4_params.f90 +++ b/lib/ft4/ft4_params.f90 @@ -1,5 +1,5 @@ ! FT4 -! LDPC(174,91) code, four 4x4 Costas arrays for Sync +! LDPC(174,91) code, four 4x4 Costas arrays for sync, ramp-up and ramp-down symbols parameter (KK=91) !Information bits (77 + CRC14) parameter (ND=87) !Data symbols diff --git a/lib/ft4/ft4b.f90 b/lib/ft4/ft4b.f90 deleted file mode 100644 index d425277ef..000000000 --- a/lib/ft4/ft4b.f90 +++ /dev/null @@ -1,489 +0,0 @@ -subroutine ft4b(cdatetime0,tbuf,nfa,nfb,nQSOProgress,ncontest,nfqso, & - iwave,ndecodes,mycall,hiscall,cqstr,line,data_dir) - - use packjt77 - include 'ft4_params.f90' - parameter (NSS=NSPS/NDOWN) - - character message*37,msgsent*37,msg0*37 - character c77*77 - character*61 line,linex(100) - character*37 decodes(100) - character*512 data_dir,fname - character*17 cdatetime0 - character*12 mycall,hiscall - character*12 mycall0,hiscall0 - character*6 hhmmss - character*4 cqstr,cqstr0 - - complex cd2(0:NMAX/NDOWN-1) !Complex waveform - complex cb(0:NMAX/NDOWN-1) - complex cd(0:NN*NSS-1) !Complex waveform - complex ctwk(2*NSS),ctwk2(2*NSS,-16:16) - complex csymb(NSS) - complex cs(0:3,NN) - real s4(0:3,NN) - - real bmeta(2*NN),bmetb(2*NN),bmetc(2*NN) - real a(5) - real llr(2*ND),llra(2*ND),llrb(2*ND),llrc(2*ND),llrd(2*ND) - real s2(0:255) - real candidate(3,100) - real savg(NH1),sbase(NH1) - - integer apbits(2*ND) - integer apmy_ru(28),aphis_fd(28) - integer icos4a(0:3),icos4b(0:3),icos4c(0:3),icos4d(0:3) - integer*2 iwave(NMAX) !Raw received data - integer*1 message77(77),rvec(77),apmask(2*ND),cw(2*ND) - integer*1 hbits(2*NN) - integer graymap(0:3) - integer ip(1) - integer nappasses(0:5) ! # of decoding passes for QSO States 0-5 - integer naptypes(0:5,4) ! nQSOProgress, decoding pass - integer mcq(29) - integer mrrr(19),m73(19),mrr73(19) - - logical nohiscall,unpk77_success - logical one(0:255,0:7) ! 256 4-symbol sequences, 8 bits - logical first, dobigfft - - data icos4a/0,1,3,2/ - data icos4b/1,0,2,3/ - data icos4c/2,3,1,0/ - data icos4d/3,2,0,1/ - data graymap/0,1,3,2/ - data msg0/' '/ - data first/.true./ - data mcq/0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0/ - data mrrr/0,1,1,1,1,1,1,0,1,0,0,1,0,0,1,0,0,0,1/ - data m73/0,1,1,1,1,1,1,0,1,0,0,1,0,1,0,0,0,0,1/ - data mrr73/0,1,1,1,1,1,1,0,0,1,1,1,0,1,0,1,0,0,1/ - data rvec/0,1,0,0,1,0,1,0,0,1,0,1,1,1,1,0,1,0,0,0,1,0,0,1,1,0,1,1,0, & - 1,0,0,1,0,1,1,0,0,0,0,1,0,0,0,1,0,1,0,0,1,1,1,1,0,0,1,0,1, & - 0,1,0,1,0,1,1,0,1,1,1,1,1,0,0,0,1,0,1/ - save fs,dt,tt,txt,twopi,h,one,first,linex,apbits,nappasses,naptypes, & - mycall0,hiscall0,msg0,cqstr0,ctwk2 - - call clockit('ft4_deco',0) - hhmmss=cdatetime0(8:13) - - if(first) then - fs=12000.0/NDOWN !Sample rate after downsampling - dt=1/fs !Sample interval after downsample (s) - tt=NSPS*dt !Duration of "itone" symbols (s) - txt=NZ*dt !Transmission length (s) without ramp up/down - twopi=8.0*atan(1.0) - h=1.0 - one=.false. - do i=0,255 - do j=0,7 - if(iand(i,2**j).ne.0) one(i,j)=.true. - enddo - enddo - - do idf=-16,16 - a=0. - a(1)=real(idf) - ctwk=1. - call clockit('twkfreq1',0) - call twkfreq1(ctwk,2*NSS,fs/2.0,a,ctwk2(:,idf)) - call clockit('twkfreq1',1) - enddo - - mrrr=2*mod(mrrr+rvec(59:77),2)-1 - m73=2*mod(m73+rvec(59:77),2)-1 - mrr73=2*mod(mrr73+rvec(59:77),2)-1 - nappasses(0)=2 - nappasses(1)=2 - nappasses(2)=2 - nappasses(3)=2 - nappasses(4)=2 - nappasses(5)=3 - -! iaptype -!------------------------ -! 1 CQ ??? ??? (29 ap bits) -! 2 MyCall ??? ??? (29 ap bits) -! 3 MyCall DxCall ??? (58 ap bits) -! 4 MyCall DxCall RRR (77 ap bits) -! 5 MyCall DxCall 73 (77 ap bits) -! 6 MyCall DxCall RR73 (77 ap bits) -!******** - naptypes(0,1:4)=(/1,2,0,0/) ! Tx6 selected (CQ) - naptypes(1,1:4)=(/2,3,0,0/) ! Tx1 - naptypes(2,1:4)=(/2,3,0,0/) ! Tx2 - naptypes(3,1:4)=(/3,6,0,0/) ! Tx3 - naptypes(4,1:4)=(/3,6,0,0/) ! Tx4 - naptypes(5,1:4)=(/3,1,2,0/) ! Tx5 - - mycall0='' - hiscall0='' - cqstr0='' - first=.false. - endif - - if(cqstr.ne.cqstr0) then - i0=index(cqstr,' ') - if(i0.le.1) then - message='CQ A1AA AA01' - else - message='CQ '//cqstr(1:i0-1)//' A1AA AA01' - endif - i3=-1 - n3=-1 - call pack77(message,i3,n3,c77) - call unpack77(c77,1,msgsent,unpk77_success) - read(c77,'(29i1)') mcq - mcq=2*mod(mcq+rvec(1:29),2)-1 - cqstr0=cqstr - endif - - l1=index(mycall,char(0)) - if(l1.ne.0) mycall(l1:)=" " - l1=index(hiscall,char(0)) - if(l1.ne.0) hiscall(l1:)=" " - if(mycall.ne.mycall0 .or. hiscall.ne.hiscall0) then - apbits=0 - apbits(1)=99 - apbits(30)=99 - apmy_ru=0 - aphis_fd=0 - - if(len(trim(mycall)) .lt. 3) go to 10 - - nohiscall=.false. - hiscall0=hiscall - if(len(trim(hiscall0)).lt.3) then - hiscall0=mycall ! use mycall for dummy hiscall - mycall won't be hashed. - nohiscall=.true. - endif - message=trim(mycall)//' '//trim(hiscall0)//' RR73' - i3=-1 - n3=-1 - call pack77(message,i3,n3,c77) - call unpack77(c77,1,msgsent,unpk77_success) - if(i3.ne.1 .or. (message.ne.msgsent) .or. .not.unpk77_success) go to 10 - read(c77,'(77i1)') message77 - apmy_ru=2*mod(message77(1:28)+rvec(2:29),2)-1 - aphis_fd=2*mod(message77(30:57)+rvec(29:56),2)-1 - message77=mod(message77+rvec,2) - call encode174_91(message77,cw) - apbits=2*cw-1 - if(nohiscall) apbits(30)=99 - -10 continue - mycall0=mycall - hiscall0=hiscall - endif - candidate=0.0 - ncand=0 - syncmin=1.2 - maxcand=100 - - fa=nfa - fb=nfb - call clockit('getcand4',0) - call getcandidates4(iwave,fa,fb,syncmin,nfqso,maxcand,savg,candidate, & - ncand,sbase) - call clockit('getcand4',1) - - ndecodes=0 - dobigfft=.true. - do icand=1,ncand - f0=candidate(1,icand) - snr=candidate(3,icand)-1.0 - if( f0.le.10.0 .or. f0.ge.4990.0 ) cycle - call clockit('ft4_down',0) - call ft4_downsample(iwave,dobigfft,f0,cd2) !Downsample from 512 to 32 Sa/Symbol - if(dobigfft) dobigfft=.false. - call clockit('ft4_down',1) - - sum2=sum(cd2*conjg(cd2))/(real(NMAX)/real(NDOWN)) - if(sum2.gt.0.0) cd2=cd2/sqrt(sum2) -! Sample rate is now 12000/16 = 750 samples/second - do isync=1,2 - if(isync.eq.1) then - idfmin=-12 - idfmax=12 - idfstp=3 - ibmin=0 - ibmax=216 !Max DT = 216/750 = 0.288 s - ibstp=4 - else - idfmin=idfbest-4 - idfmax=idfbest+4 - idfstp=1 - ibmin=max(0,ibest-5) - ibmax=min(ibest+5,NMAX/NDOWN-1) - ibstp=1 - endif - ibest=-1 - smax=-99. - idfbest=0 - do idf=idfmin,idfmax,idfstp - - call clockit('sync4d ',0) - do istart=ibmin,ibmax,ibstp - call sync4d(cd2,istart,ctwk2(:,idf),1,sync) !Find sync power - if(sync.gt.smax) then - smax=sync - ibest=istart - idfbest=idf - endif - enddo - call clockit('sync4d ',1) - - enddo - enddo - f0=f0+real(idfbest) - if( f0.le.10.0 .or. f0.ge.4990.0 ) cycle - - call clockit('ft4down ',0) - call ft4_downsample(iwave,dobigfft,f0,cb) !Final downsample with corrected f0 - call clockit('ft4down ',1) - sum2=sum(abs(cb)**2)/(real(NSS)*NN) - if(sum2.gt.0.0) cb=cb/sqrt(sum2) - cd=cb(ibest:ibest+NN*NSS-1) - call clockit('four2a ',0) - do k=1,NN - i1=(k-1)*NSS - csymb=cd(i1:i1+NSS-1) - call four2a(csymb,NSS,1,-1,1) - cs(0:3,k)=csymb(1:4) - s4(0:3,k)=abs(csymb(1:4)) - enddo - call clockit('four2a ',1) - -! Sync quality check - is1=0 - is2=0 - is3=0 - is4=0 - do k=1,4 - ip=maxloc(s4(:,k)) - if(icos4a(k-1).eq.(ip(1)-1)) is1=is1+1 - ip=maxloc(s4(:,k+33)) - if(icos4b(k-1).eq.(ip(1)-1)) is2=is2+1 - ip=maxloc(s4(:,k+66)) - if(icos4c(k-1).eq.(ip(1)-1)) is3=is3+1 - ip=maxloc(s4(:,k+99)) - if(icos4d(k-1).eq.(ip(1)-1)) is4=is4+1 - enddo - nsync=is1+is2+is3+is4 !Number of correct hard sync symbols, 0-16 - if(smax .lt. 0.7 .or. nsync .lt. 8) cycle - - do nseq=1,3 !Try coherent sequences of 1, 2, and 4 symbols - if(nseq.eq.1) nsym=1 - if(nseq.eq.2) nsym=2 - if(nseq.eq.3) nsym=4 - nt=2**(2*nsym) - do ks=1,NN-nsym+1,nsym !87+16=103 symbols. - amax=-1.0 - do i=0,nt-1 - i1=i/64 - i2=iand(i,63)/16 - i3=iand(i,15)/4 - i4=iand(i,3) - if(nsym.eq.1) then - s2(i)=abs(cs(graymap(i4),ks)) - elseif(nsym.eq.2) then - s2(i)=abs(cs(graymap(i3),ks)+cs(graymap(i4),ks+1)) - elseif(nsym.eq.4) then - s2(i)=abs(cs(graymap(i1),ks ) + & - cs(graymap(i2),ks+1) + & - cs(graymap(i3),ks+2) + & - cs(graymap(i4),ks+3) & - ) - else - print*,"Error - nsym must be 1, 2, or 4." - endif - enddo - ipt=1+(ks-1)*2 - if(nsym.eq.1) ibmax=1 - if(nsym.eq.2) ibmax=3 - if(nsym.eq.4) ibmax=7 - do ib=0,ibmax - bm=maxval(s2(0:nt-1),one(0:nt-1,ibmax-ib)) - & - maxval(s2(0:nt-1),.not.one(0:nt-1,ibmax-ib)) - if(ipt+ib.gt.2*NN) cycle - if(nsym.eq.1) then - bmeta(ipt+ib)=bm - elseif(nsym.eq.2) then - bmetb(ipt+ib)=bm - elseif(nsym.eq.4) then - bmetc(ipt+ib)=bm - endif - enddo - enddo - enddo - - bmetb(205:206)=bmeta(205:206) - bmetc(201:204)=bmetb(201:204) - bmetc(205:206)=bmeta(205:206) - - call clockit('normaliz',0) - call normalizebmet(bmeta,2*NN) - call normalizebmet(bmetb,2*NN) - call normalizebmet(bmetc,2*NN) - call clockit('normaliz',1) - - hbits=0 - where(bmeta.ge.0) hbits=1 - ns1=count(hbits( 1: 8).eq.(/0,0,0,1,1,0,1,1/)) - ns2=count(hbits( 67: 74).eq.(/0,1,0,0,1,1,1,0/)) - ns3=count(hbits(133:140).eq.(/1,1,1,0,0,1,0,0/)) - ns4=count(hbits(199:206).eq.(/1,0,1,1,0,0,0,1/)) - nsync_qual=ns1+ns2+ns3+ns4 - if(nsync_qual.lt. 20) cycle - - scalefac=2.83 - llra( 1: 58)=bmeta( 9: 66) - llra( 59:116)=bmeta( 75:132) - llra(117:174)=bmeta(141:198) - llra=scalefac*llra - llrb( 1: 58)=bmetb( 9: 66) - llrb( 59:116)=bmetb( 75:132) - llrb(117:174)=bmetb(141:198) - llrb=scalefac*llrb - llrc( 1: 58)=bmetc( 9: 66) - llrc( 59:116)=bmetc( 75:132) - llrc(117:174)=bmetc(141:198) - llrc=scalefac*llrc - - apmag=maxval(abs(llra))*1.1 - npasses=3+nappasses(nQSOProgress) - if(ncontest.ge.5) npasses=3 ! Don't support Fox and Hound - do ipass=1,npasses - if(ipass.eq.1) llr=llra - if(ipass.eq.2) llr=llrb - if(ipass.eq.3) llr=llrc - if(ipass.le.3) then - apmask=0 - iaptype=0 - endif - - if(ipass .gt. 3) then - llrd=llrc - iaptype=naptypes(nQSOProgress,ipass-3) - -! ncontest=0 : NONE -! 1 : NA_VHF -! 2 : EU_VHF -! 3 : FIELD DAY -! 4 : RTTY -! 5 : FOX -! 6 : HOUND -! -! Conditions that cause us to bail out of AP decoding - napwid=50 - if(ncontest.le.4 .and. iaptype.ge.3 .and. (abs(f0-nfqso).gt.napwid) ) cycle - if(iaptype.ge.2 .and. apbits(1).gt.1) cycle ! No, or nonstandard, mycall - if(iaptype.ge.3 .and. apbits(30).gt.1) cycle ! No, or nonstandard, dxcall - - if(iaptype.eq.1) then ! CQ or CQ TEST or CQ FD or CQ RU or CQ SCC - apmask=0 - apmask(1:29)=1 - llrd(1:29)=apmag*mcq(1:29) - endif - - if(iaptype.eq.2) then ! MyCall,???,??? - apmask=0 - if(ncontest.eq.0.or.ncontest.eq.1) then - apmask(1:29)=1 - llrd(1:29)=apmag*apbits(1:29) - else if(ncontest.eq.2) then - apmask(1:28)=1 - llrd(1:28)=apmag*apbits(1:28) - else if(ncontest.eq.3) then - apmask(1:28)=1 - llrd(1:28)=apmag*apbits(1:28) - else if(ncontest.eq.4) then - apmask(2:29)=1 - llrd(2:29)=apmag*apmy_ru(1:28) - endif - endif - - if(iaptype.eq.3) then ! MyCall,DxCall,??? - apmask=0 - if(ncontest.eq.0.or.ncontest.eq.1.or.ncontest.eq.2) then - apmask(1:58)=1 - llrd(1:58)=apmag*apbits(1:58) - else if(ncontest.eq.3) then ! Field Day - apmask(1:56)=1 - llrd(1:28)=apmag*apbits(1:28) - llrd(29:56)=apmag*aphis_fd(1:28) - else if(ncontest.eq.4) then ! RTTY RU - apmask(2:57)=1 - llrd(2:29)=apmag*apmy_ru(1:28) - llrd(30:57)=apmag*apbits(30:57) - endif - endif - - if(iaptype.eq.4 .or. iaptype.eq.5 .or. iaptype.eq.6) then - apmask=0 - if(ncontest.le.4) then - apmask(1:91)=1 ! mycall, hiscall, RRR|73|RR73 - if(iaptype.eq.6) llrd(1:91)=apmag*apbits(1:91) - endif - endif - - llr=llrd - endif - max_iterations=40 - message77=0 - call clockit('bpdecode',0) - call bpdecode174_91(llr,apmask,max_iterations,message77, & - cw,nharderror,niterations) - call clockit('bpdecode',1) - if(sum(message77).eq.0) cycle - if( nharderror.ge.0 ) then - message77=mod(message77+rvec,2) ! remove rvec scrambling - write(c77,'(77i1)') message77(1:77) - call unpack77(c77,1,message,unpk77_success) - idupe=0 - do i=1,ndecodes - if(decodes(i).eq.message) idupe=1 - enddo - if(ibest.le.10 .and. message.eq.msg0) idupe=1 !Already decoded - if(idupe.eq.1) exit - ndecodes=ndecodes+1 - decodes(ndecodes)=message - if(snr.gt.0.0) then - xsnr=10*log10(snr)-14.0 - else - xsnr=-20.0 - endif - nsnr=nint(max(-20.0,xsnr)) - freq=f0 - tsig=mod(tbuf + ibest/750.0,100.0) - - write(line,1000) hhmmss,nsnr,tsig,nint(freq),message -1000 format(a6,i4,f5.1,i5,' + ',1x,a37) - l1=index(data_dir,char(0))-1 - if(l1.ge.1) data_dir(l1+1:l1+1)="/" - fname=data_dir(1:l1+1)//'all_ft4.txt' - open(24,file=trim(fname),status='unknown',position='append') - write(24,1002) cdatetime0,nsnr,tsig,nint(freq),message, & - nharderror,nsync_qual,ipass,niterations,iaptype,nsync - if(hhmmss.eq.' ') write(*,1002) cdatetime0,nsnr, & - tsig,nint(freq),message,nharderror,nsync_qual,ipass, & - niterations,iaptype -1002 format(a17,i4,f5.1,i5,' Rx ',a37,6i4) - close(24) - linex(ndecodes)=line - if(ibest.ge.ibmax-15) msg0=message !Possible dupe candidate - exit - endif - enddo !Sequence estimation - enddo !Candidate list - call clockit('ft4_deco',1) - call clockit2(data_dir) - call clockit('ft4_deco',101) - return - - entry get_ft4msg(idecode,line) - line=linex(idecode) - return - - end subroutine ft4b diff --git a/lib/ft4/ft4d.f90 b/lib/ft4/ft4d.f90 deleted file mode 100644 index a63e3e0a6..000000000 --- a/lib/ft4/ft4d.f90 +++ /dev/null @@ -1,83 +0,0 @@ -program ft4d - - include 'ft4_params.f90' - character*8 arg - character*17 cdatetime - character*512 data_dir - character*12 mycall - character*12 hiscall - character*80 infile - character*61 line - character*4 cqstr - real*8 fMHz - integer ihdr(11) - integer*2 iwave(240000) !20*12000 - - fs=12000.0/NDOWN !Sample rate - dt=1/fs !Sample interval after downsample (s) - tt=NSPS*dt !Duration of "itone" symbols (s) - baud=1.0/tt !Keying rate for "itone" symbols (baud) - txt=NZ*dt !Transmission length (s) - - nargs=iargc() - if(nargs.lt.1) then - print*,'Usage: ft4d [-a ] [-f fMHz] [-n nQSOProgress] file1 [file2 ...]' - go to 999 - endif - iarg=1 - data_dir="." - call getarg(iarg,arg) - if(arg(1:2).eq.'-a') then - call getarg(iarg+1,data_dir) - iarg=iarg+2 - endif - call getarg(iarg,arg) - if(arg(1:2).eq.'-f') then - call getarg(iarg+1,arg) - read(arg,*) fMHz - iarg=iarg+2 - endif - nQSOProgress=0 - if(arg(1:2).eq.'-n') then - call getarg(iarg+1,arg) - read(arg,*) nQSOProgress - iarg=iarg+2 - endif - nfa=10 - nfb=4990 - ndecodes=0 - nfqso=1500 - mycall="K9AN" - hiscall="K1JT" - ncontest=4 - cqstr="RU " - - do ifile=iarg,nargs - call getarg(ifile,infile) - open(10,file=infile,status='old',access='stream') - read(10) ihdr - npts=min(ihdr(11)/2,180000) - read(10) iwave(1:npts) - close(10) - cdatetime=infile - j2=index(infile,'.wav') - if(j2.ge.14) cdatetime=infile(j2-13:j2)//'000' - istep=3456 - nsteps=(npts-52800)/istep + 1 - do n=1,nsteps - i0=(n-1)*istep + 1 - tbuf=(i0-1)/12000.0 - call ft4b(cdatetime,tbuf,nfa,nfb,nQSOProgress,ncontest, & - nfqso,iwave(i0),ndecodes,mycall,hiscall,cqstr,line,data_dir) - do idecode=1,ndecodes - call get_ft4msg(idecode,line) - write(*,'(a61)') line - enddo - enddo !steps - enddo !files - - call four2a(xx,-1,1,-1,1) !Destroy FFTW plans to free their memory - -999 end program ft4d - - diff --git a/lib/ft4/genft4.f90 b/lib/ft4/genft4.f90 index f57ca59aa..66e70a612 100644 --- a/lib/ft4/genft4.f90 +++ b/lib/ft4/genft4.f90 @@ -11,7 +11,7 @@ subroutine genft4(msg0,ichk,msgsent,msgbits,i4tone) ! s16 + 87symbols + 2 ramp up/down = 105 total channel symbols ! r1 + s4 + d29 + s4 + d29 + s4 + d29 + s4 + r1 -! Message duration: TxT = 105*512/12000 = 4.48 s +! Message duration: TxT = 105*576/12000 = 5.04 s ! use iso_c_binding, only: c_loc,c_size_t From 1758e7266be4a327e94572e228284ccb6c7805d0 Mon Sep 17 00:00:00 2001 From: Steve Franke Date: Wed, 5 Jun 2019 10:19:40 -0500 Subject: [PATCH 129/159] Remove deleted files from CMakeLists.txt --- CMakeLists.txt | 4 ---- 1 file changed, 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a2d6dd396..0bd94174c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -528,7 +528,6 @@ set (wsjt_FSRCS lib/msk144sim.f90 lib/mskrtd.f90 lib/nuttal_window.f90 - lib/ft4/ft4b.f90 lib/ft4/ft4sim.f90 lib/ft4/ft4sim_mult.f90 lib/ft4/ft4_downsample.f90 @@ -1298,9 +1297,6 @@ target_link_libraries (averaged_mf wsjt_fort wsjt_cxx) add_executable (ft4sim_mult lib/ft4/ft4sim_mult.f90 wsjtx.rc) target_link_libraries (ft4sim_mult wsjt_fort wsjt_cxx) -add_executable (ft4d lib/ft4/ft4d.f90 wsjtx.rc) -target_link_libraries (ft4d wsjt_fort wsjt_cxx) - add_executable (record_time_signal Audio/tools/record_time_signal.cpp) target_link_libraries (record_time_signal wsjt_cxx wsjt_qtmm wsjt_qt) From 45b12e60283272be7f20b965b9921f8a0975f62a Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Thu, 6 Jun 2019 12:56:25 +0100 Subject: [PATCH 130/159] Preparation for UI i18n Re-enabling the WSJT-X i18n facilities. This allows translation files to be created for languages that are automatically used to lookup translatable strings. To enable a new language the language name must be added to the CMakeLists.txt LANGUAGES list variable in BCP47 format (i.e. en_US, en_GB, pt_PT, ...). Do one build with the CMake option UPDATE_TRANSLATIONS enabled (do not leave it enabled as there is a danger of loosing existing translated texts), that will create a fresh translations/wsjtx_.ts file which should be immediately checked in with the CMakeLists.txt change. The .ts should then be updated by the translator using the Qt Linguist tool to add translations. Check in the updated .ts file to complete the initial translation process for that language. To aid translators their WIP .ts file may be tested by releasing (using the lrelease tool or from the Linguist menu) a .qm file and placing that .qm file in the current directory before starting WSJT-X. The translations will be used if the system locale matches the file name. If the system locale does not match the file name; the language may be overridden by setting the LANG environment variable. For example if a wsjtx_pt_PT.qm file is in the current directory WSJT-X will use it for translation lookups, regardless of the current system locale setting, if the LANG variable is set to pt_PT or pt-PT. On MS Windows from a command prompt: set LANG=pt_PT C:\WSJT\wsjtx\bin\wsjtx elsewhere: LANG=pt_PT wsjtx --- CMakeLists.txt | 42 +- Configuration.cpp | 4 + EmulateSplitTransceiver.cpp | 2 + EmulateSplitTransceiver.hpp | 2 + HRDTransceiver.cpp | 2 + HRDTransceiver.hpp | 2 + HamlibTransceiver.hpp | 4 +- MultiSettings.cpp | 4 + WSPRBandHopping.cpp | 4 + commons.h | 3 +- main.cpp | 29 + models/Bands.cpp | 2 + models/Bands.hpp | 2 + models/FoxLog.cpp | 4 + models/IARURegions.cpp | 4 +- models/IARURegions.hpp | 1 + models/StationList.cpp | 5 + models/StationList.hpp | 2 + translations/wsjtx_en_GB.ts | 6007 ++++++++++++++++++++++++ translations/wsjtx_pt_PT.ts | 6007 ++++++++++++++++++++++++ widgets/AbstractLogWindow.cpp | 7 + widgets/AbstractLogWindow.hpp | 2 + widgets/DecodeHighlightingListView.cpp | 2 + widgets/DecodeHighlightingListView.hpp | 2 + widgets/ExportCabrillo.cpp | 1 + widgets/ExportCabrillo.h | 2 + widgets/HelpTextWindow.cpp | 2 + widgets/HelpTextWindow.hpp | 2 + widgets/messageaveraging.cpp | 2 + widgets/messageaveraging.h | 2 + 30 files changed, 12142 insertions(+), 14 deletions(-) create mode 100644 translations/wsjtx_en_GB.ts create mode 100644 translations/wsjtx_pt_PT.ts diff --git a/CMakeLists.txt b/CMakeLists.txt index a2d6dd396..5affce46a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -856,9 +856,6 @@ if (Boost_NO_SYSTEM_PATHS) set (BOOST_ROOT ${PROJECT_SOURCE_DIR}/boost) endif () find_package (Boost 1.63 REQUIRED) -if (Boost_FOUND) - include_directories (${Boost_INCLUDE_DIRS}) -endif () # # OpenMP @@ -889,10 +886,7 @@ message (STATUS "hamlib_LIBRARY_DIRS: ${hamlib_LIBRARY_DIRS}") # # Widgets finds its own dependencies. -find_package (Qt5Widgets 5 REQUIRED) -find_package (Qt5Multimedia 5 REQUIRED) -find_package (Qt5PrintSupport 5 REQUIRED) -find_package (Qt5Sql 5 REQUIRED) +find_package (Qt5 REQUIRED Widgets Multimedia PrintSupport Sql LinguistTools) if (WIN32) add_definitions (-DQT_NEEDS_QTMAIN) @@ -1098,11 +1092,41 @@ add_custom_target (ctags COMMAND ${CTAGS} -o ${CMAKE_SOURCE_DIR}/tags -R ${sourc add_custom_target (etags COMMAND ${ETAGS} -o ${CMAKE_SOURCE_DIR}/TAGS -R ${sources}) +# Qt i18n +set (LANGUAGES + en_GB + pt_PT + ) +foreach (lang_ ${LANGUAGES}) + file (TO_NATIVE_PATH translations/wsjtx_${lang_}.ts ts_) + list (APPEND TS_FILES ${ts_}) +endforeach () +if (UPDATE_TRANSLATIONS) + message (STATUS "UPDATE_TRANSLATIONS option is set.") + qt5_create_translation ( + QM_FILES ${wsjt_qt_UISRCS} ${wsjtx_UISRCS} ${wsjt_qt_CXXSRCS} ${wsjtx_CXXSRCS} + ${TS_FILES} + ) +else () + qt5_add_translation (QM_FILES ${TS_FILES}) +endif () +add_custom_target (translations DEPENDS ${QM_FILES}) +set_property (DIRECTORY PROPERTY CLEAN_NO_CUSTOM TRUE) +# do this after i18n to stop lupdate walking the boost tree which it +# chokes on +if (Boost_FOUND) + include_directories (${Boost_INCLUDE_DIRS}) +endif () + # embedded resources function (add_resources resources path) foreach (resource_file_ ${ARGN}) get_filename_component (name_ ${resource_file_} NAME) - file (TO_NATIVE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/${resource_file_} source_) + if (IS_ABSOLUTE "${resource_file_}") + file (TO_NATIVE_PATH ${resource_file_} source_) + else () + file (TO_NATIVE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/${resource_file_} source_) + endif () file (TO_NATIVE_PATH ${path}/${name_} dest_) set (resources_ "${resources_}\n ${source_}") set (${resources} ${${resources}}${resources_} PARENT_SCOPE) @@ -1111,6 +1135,7 @@ endfunction (add_resources resources path) add_resources (wsjtx_RESOURCES "" ${TOP_LEVEL_RESOURCES}) add_resources (wsjtx_RESOURCES /Palettes ${PALETTE_FILES}) +add_resources (wsjtx_RESOURCES /Translations ${QM_FILES}) configure_file (wsjtx.qrc.in wsjtx.qrc @ONLY) @@ -1131,7 +1156,6 @@ if (WIN32) wrap_ax_server (GENAXSRCS ${AXSERVERSRCS}) endif (WIN32) - # # targets # diff --git a/Configuration.cpp b/Configuration.cpp index b78739d11..b8c37184d 100644 --- a/Configuration.cpp +++ b/Configuration.cpp @@ -251,6 +251,8 @@ namespace class FrequencyDialog final : public QDialog { + Q_OBJECT + public: using Item = FrequencyList_v2::Item; @@ -297,6 +299,8 @@ private: class StationDialog final : public QDialog { + Q_OBJECT + public: explicit StationDialog (StationList const * stations, Bands * bands, QWidget * parent = nullptr) : QDialog {parent} diff --git a/EmulateSplitTransceiver.cpp b/EmulateSplitTransceiver.cpp index 7e84919e2..c42436db0 100644 --- a/EmulateSplitTransceiver.cpp +++ b/EmulateSplitTransceiver.cpp @@ -1,5 +1,7 @@ #include "EmulateSplitTransceiver.hpp" +#include "moc_EmulateSplitTransceiver.cpp" + EmulateSplitTransceiver::EmulateSplitTransceiver (std::unique_ptr wrapped, QObject * parent) : Transceiver {parent} , wrapped_ {std::move (wrapped)} diff --git a/EmulateSplitTransceiver.hpp b/EmulateSplitTransceiver.hpp index 210a37b71..d373c020e 100644 --- a/EmulateSplitTransceiver.hpp +++ b/EmulateSplitTransceiver.hpp @@ -27,6 +27,8 @@ class EmulateSplitTransceiver final : public Transceiver { + Q_OBJECT + public: // takes ownership of wrapped Transceiver explicit EmulateSplitTransceiver (std::unique_ptr wrapped, diff --git a/HRDTransceiver.cpp b/HRDTransceiver.cpp index c44914145..596f0ba27 100644 --- a/HRDTransceiver.cpp +++ b/HRDTransceiver.cpp @@ -19,6 +19,8 @@ namespace int constexpr yaesu_delay {250}; } +#include "moc_HRDTransceiver.cpp" + void HRDTransceiver::register_transceivers (TransceiverFactory::Transceivers * registry, int id) { (*registry)[HRD_transceiver_name] = TransceiverFactory::Capabilities (id, TransceiverFactory::Capabilities::network, true, true /* maybe */); diff --git a/HRDTransceiver.hpp b/HRDTransceiver.hpp index 6ccd72d52..2f563df6f 100644 --- a/HRDTransceiver.hpp +++ b/HRDTransceiver.hpp @@ -27,6 +27,8 @@ class QByteArray; class HRDTransceiver final : public PollingTransceiver { + Q_OBJECT + public: static void register_transceivers (TransceiverFactory::Transceivers *, int id); diff --git a/HamlibTransceiver.hpp b/HamlibTransceiver.hpp index 17f1c28d3..bcc040d23 100644 --- a/HamlibTransceiver.hpp +++ b/HamlibTransceiver.hpp @@ -21,9 +21,9 @@ extern "C" class HamlibTransceiver final : public PollingTransceiver { - Q_OBJECT; // for translation context + Q_OBJECT // for translation context - public: +public: static void register_transceivers (TransceiverFactory::Transceivers *); static void unregister_transceivers (); diff --git a/MultiSettings.cpp b/MultiSettings.cpp index f4798bc3f..c0db0ed67 100644 --- a/MultiSettings.cpp +++ b/MultiSettings.cpp @@ -65,6 +65,8 @@ namespace class NameDialog final : public QDialog { + Q_OBJECT + public: explicit NameDialog (QString const& current_name, QStringList const& current_names, @@ -112,6 +114,8 @@ namespace class ExistingNameDialog final : public QDialog { + Q_OBJECT + public: explicit ExistingNameDialog (QStringList const& current_names, QWidget * parent = nullptr) : QDialog {parent} diff --git a/WSPRBandHopping.cpp b/WSPRBandHopping.cpp index fd0167d51..e954d5433 100644 --- a/WSPRBandHopping.cpp +++ b/WSPRBandHopping.cpp @@ -44,6 +44,8 @@ namespace class Dialog : public QDialog { + Q_OBJECT + public: using BandList = QList; @@ -69,6 +71,8 @@ private: static int constexpr band_index_role {Qt::UserRole}; }; +#include "WSPRBandHopping.moc" + Dialog::Dialog (QSettings * settings, Configuration const * configuration, BandList const * WSPR_bands , QBitArray * bands, int * gray_line_duration, QWidget * parent) : QDialog {parent, Qt::Window | Qt::WindowTitleHint | Qt::WindowCloseButtonHint | Qt::WindowMinimizeButtonHint} diff --git a/commons.h b/commons.h index 7c202d26e..4083bb22f 100644 --- a/commons.h +++ b/commons.h @@ -8,7 +8,8 @@ #ifdef __cplusplus #include extern "C" { -#else +#endif +#ifndef __cplusplus #include #endif diff --git a/main.cpp b/main.cpp index 9070ce33f..fc791adec 100644 --- a/main.cpp +++ b/main.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -106,6 +107,34 @@ int main(int argc, char *argv[]) ExceptionCatchingApplication a(argc, argv); try { + // + // Enable i18n + // + QTranslator translator_from_resources; + // Default translations for releases use translations stored in + // the resources file system under the Translations + // directory. These are built by the CMake build system from .ts + // files in the translations source directory. New languages are + // added by enabling the UPDATE_TRANSLATIONS CMake option and + // building with the new language added to the LANGUAGES CMake + // list variable. UPDATE_TRANSLATIONS will preserve existing + // translations but should only be set when adding new + // languages. The resulting .ts files should be checked info + // source control for translators to access and update. + translator_from_resources.load (QLocale::system (), "wsjtx", "_", ":/Translations"); + a.installTranslator (&translator_from_resources); + + QTranslator translator_from_files; + // Load any matching translation from the current directory + // using the locale name. This allows translators to easily test + // their translations by releasing (lrelease) a .qm file into + // the current directory with a suitable name + // (e.g. wsjtx_en_GB.qm), then running wsjtx to view the + // results. Either the system locale setting or the environment + // variable LANG can be used to select the target language. + translator_from_files.load (QString {"wsjtx_"} + QLocale::system ().name ()); + a.installTranslator (&translator_from_files); + setlocale (LC_NUMERIC, "C"); // ensure number forms are in // consistent format, do this after // instantiating QApplication so diff --git a/models/Bands.cpp b/models/Bands.cpp index a70358fa3..e24d42965 100644 --- a/models/Bands.cpp +++ b/models/Bands.cpp @@ -55,6 +55,8 @@ namespace } } +#include "moc_Bands.cpp" + Bands::Bands (QObject * parent) : QAbstractTableModel {parent} { diff --git a/models/Bands.hpp b/models/Bands.hpp index ed625f2f1..170d4c756 100644 --- a/models/Bands.hpp +++ b/models/Bands.hpp @@ -29,6 +29,8 @@ class Bands final : public QAbstractTableModel { + Q_OBJECT + public: using Frequency = Radio::Frequency; diff --git a/models/FoxLog.cpp b/models/FoxLog.cpp index debb08afc..954090bd6 100644 --- a/models/FoxLog.cpp +++ b/models/FoxLog.cpp @@ -18,6 +18,8 @@ class FoxLog::impl final : public QSqlTableModel { + Q_OBJECT + public: impl (Configuration const * configuration); @@ -43,6 +45,8 @@ public: QSqlQuery mutable export_query_; }; +#include "FoxLog.moc" + FoxLog::impl::impl (Configuration const * configuration) : configuration_ {configuration} { diff --git a/models/IARURegions.cpp b/models/IARURegions.cpp index 25450ab47..dcdc94d43 100644 --- a/models/IARURegions.cpp +++ b/models/IARURegions.cpp @@ -7,8 +7,6 @@ #include #include -#include "moc_IARURegions.cpp" - namespace { // human readable strings for each Region enumeration value @@ -22,6 +20,8 @@ namespace std::size_t constexpr region_names_size = sizeof (region_names) / sizeof (region_names[0]); } +#include "moc_IARURegions.cpp" + IARURegions::IARURegions (QObject * parent) : QAbstractListModel {parent} { diff --git a/models/IARURegions.hpp b/models/IARURegions.hpp index d849d97b7..498846d34 100644 --- a/models/IARURegions.hpp +++ b/models/IARURegions.hpp @@ -29,6 +29,7 @@ class IARURegions final : public QAbstractListModel { Q_OBJECT + public: // // This enumeration contains the supported regions, to complement diff --git a/models/StationList.cpp b/models/StationList.cpp index eeeb4d607..202cac0e7 100644 --- a/models/StationList.cpp +++ b/models/StationList.cpp @@ -52,6 +52,8 @@ QDataStream& operator >> (QDataStream& is, StationList::Station& station) class StationList::impl final : public QAbstractTableModel { + Q_OBJECT + public: impl (Bands const * bands, Stations stations, QObject * parent) : QAbstractTableModel {parent} @@ -97,6 +99,9 @@ public: Stations stations_; }; +#include "StationList.moc" +#include "moc_StationList.cpp" + StationList::StationList (Bands const * bands, QObject * parent) : StationList {bands, {}, parent} { diff --git a/models/StationList.hpp b/models/StationList.hpp index 25bf428fc..3b0955c18 100644 --- a/models/StationList.hpp +++ b/models/StationList.hpp @@ -40,6 +40,8 @@ class Bands; class StationList final : public QSortFilterProxyModel { + Q_OBJECT + public: using Frequency = Radio::Frequency; using FrequencyDelta = Radio::FrequencyDelta; diff --git a/translations/wsjtx_en_GB.ts b/translations/wsjtx_en_GB.ts new file mode 100644 index 000000000..2e0570962 --- /dev/null +++ b/translations/wsjtx_en_GB.ts @@ -0,0 +1,6007 @@ + + + + + AbstractLogWindow + + + &Delete ... + + + + + AbstractLogWindow::impl + + + Confirm Delete + + + + + Are you sure you want to delete the %n selected QSO(s) from the log + + + + + + + + Astro + + + + Doppler tracking + + + + + <html><head/><body><p>One station does all Doppler shift correction, their QSO partner receives and transmits on the sked frequency.</p><p>If the rig does not accept CAT QSY commands while transmitting a single correction is applied for the whole transmit period.</p></body></html> + + + + + Full Doppler to DX Grid + + + + + <html><head/><body><p>Transmit takes place on sked frequency and receive frequency is corrected for own echoes. </p><p>This mode can be used for calling CQ, or when using Echo mode.</p></body></html> + + + + + Own Echo + + + + + <html><head/><body><p>Both stations correct for Doppler shift such that they would be heard on the moon at the sked frequency.</p><p>If the rig does not accept CAT QSY commands while transmitting a single correction is applied for the whole transmit period.</p><p>Use this option also for Echo mode.</p></body></html> + + + + + Constant frequency on Moon + + + + + <html><head/><body><p>DX station announces their TX Freq, which is entered as the Sked Freq. Correction applied to RX and TX so you appear on the DX's station's own echo Freq.</p><p>If the rig does not accept CAT QSY commands while transmitting a single correction is applied for the whole transmit period.</p></body></html> + + + + + On DX Echo + + + + + <html><head/><body><p>Tune radio manually and select this mode to put your echo on the same frequency.</p><p>If the rig does not accept CAT QSY commands while transmitting a single correction is applied for the whole transmit period.</p></body></html> + + + + + Call DX + + + + + <html><head/><body><p>No Doppler shift correction is applied. This may be used when the QSO partner does full Doppler correction to your grid square.</p></body></html> + + + + + None + + + + + Sked frequency + + + + + + 0 + + + + + Rx: + + + + + Tx: + + + + + <html><head/><body><p>Press and hold the CTRL key to adjust the sked frequency manually with the rig's VFO dial or enter frequency directly into the band entry field on the main window.</p></body></html> + + + + + Astro Data + + + + + Astronomical Data + + + + + Doppler Tracking Error + + + + + Split operating is required for Doppler tracking + + + + + Go to "Menu->File->Settings->Radio" to enable split operation + + + + + Bands + + + Band name + + + + + Lower frequency limit + + + + + Upper frequency limit + + + + + Band + + + + + Lower Limit + + + + + Upper Limit + + + + + CAboutDlg + + + About WSJT-X + + + + + OK + + + + + CPlotter + + + &Set Rx && Tx Offset + + + + + CabrilloLog + + + Freq(MHz) + + + + + Mode + + + + + Date & Time(UTC) + + + + + Call + + + + + Sent + + + + + Rcvd + + + + + Band + + + + + CabrilloLogWindow + + + Contest Log + + + + + <html><head/><body><p>Right-click here for available actions.</p></body></html> + + + + + Right-click here for available actions. + + + + + CallsignDialog + + + Callsign + + + + + ColorHighlighting + + + + + + + + + + + + + + + + + + K1ABC + + + + + CQ in message + + + + + My Call in message + + + + + Transmitted message + + + + + New DXCC + + + + + New Grid + + + + + New DXCC on Band + + + + + New Call + + + + + New Grid on Band + + + + + New Call on Band + + + + + Uploads to LotW + + + + + New Continent + + + + + New Continent on Band + + + + + New CQ Zone + + + + + New CQ Zone on Band + + + + + New ITU Zone + + + + + New ITU Zone on Band + + + + + Configuration::impl + + + + + &Delete + + + + + + &Insert ... + + + + + Failed to create save directory + + + + + path: "%1% + + + + + Failed to create samples directory + + + + + path: "%1" + + + + + &Load ... + + + + + &Save as ... + + + + + &Merge ... + + + + + &Reset + + + + + Serial Port: + + + + + Serial port used for CAT control + + + + + Network Server: + + + + + Optional hostname and port of network service. +Leave blank for a sensible default on this machine. +Formats: + hostname:port + IPv4-address:port + [IPv6-address]:port + + + + + USB Device: + + + + + Optional device identification. +Leave blank for a sensible default for the rig. +Format: + [VID[:PID[:VENDOR[:PRODUCT]]]] + + + + + Invalid audio input device + + + + + Invalid audio out device + + + + + Invalid PTT method + + + + + Invalid PTT port + + + + + + Invalid Contest Exchange + + + + + You must input a valid ARRL Field Day exchange + + + + + You must input a valid ARRL RTTY Roundup exchange + + + + + Reset Decode Highlighting + + + + + Reset all decode highlighting and priorities to default values + + + + + WSJT-X Decoded Text Font Chooser + + + + + Load Working Frequencies + + + + + + + Frequency files (*.qrg);;All files (*.*) + + + + + Replace Working Frequencies + + + + + Are you sure you want to discard your current working frequencies and replace them with the loaded ones? + + + + + Merge Working Frequencies + + + + + + + Not a valid frequencies file + + + + + Incorrect file magic + + + + + Version is too new + + + + + Contents corrupt + + + + + Save Working Frequencies + + + + + Only Save Selected Working Frequencies + + + + + Are you sure you want to save only the working frequencies that are currently selected? Click No to save all. + + + + + Reset Working Frequencies + + + + + Are you sure you want to discard your current working frequencies and replace them with default ones? + + + + + Save Directory + + + + + AzEl Directory + + + + + Rig control error + + + + + Failed to open connection to rig + + + + + Rig failure + + + + + DXLabSuiteCommanderTransceiver + + + Failed to connect to DX Lab Suite Commander + + + + + + DX Lab Suite Commander didn't respond correctly reading frequency: + + + + + DX Lab Suite Commander sent an unrecognised TX state: + + + + + DX Lab Suite Commander didn't respond correctly polling TX status: + + + + + DX Lab Suite Commander rig did not respond to PTT: + + + + + DX Lab Suite Commander didn't respond correctly polling frequency: + + + + + DX Lab Suite Commander didn't respond correctly polling TX frequency: + + + + + DX Lab Suite Commander sent an unrecognised split state: + + + + + DX Lab Suite Commander didn't respond correctly polling split status: + + + + + DX Lab Suite Commander sent an unrecognised mode: " + + + + + DX Lab Suite Commander didn't respond correctly polling mode: + + + + + DX Lab Suite Commander send command failed + + + + + + DX Lab Suite Commander failed to send command "%1": %2 + + + + + + DX Lab Suite Commander send command "%1" read reply failed: %2 + + + + + + DX Lab Suite Commander retries exhausted sending command "%1" + + + + + DX Lab Suite Commander sent an unrecognized frequency + + + + + DecodeHighlightingListView + + + &Foreground color ... + + + + + Choose %1 Foreground Color + + + + + &Unset foreground color + + + + + &Background color ... + + + + + Choose %1 Background Color + + + + + U&nset background color + + + + + &Reset this item to defaults + + + + + DecodeHighlightingModel + + + Highlight Type + + + + + Designer + + + &Delete + + + + + &Insert ... + + + + + Insert &after ... + + + + + Import Palette + + + + + + Palettes (*.pal) + + + + + Export Palette + + + + + Dialog + + + Gray time: + + + + + Directory + + + + URL Error + + + + + + Invalid URL: +"%1" + + + + + + + + + + + JSON Error + + + + + Contents file syntax error %1 at character offset %2 + + + + + Contents file top level must be a JSON array + + + + + File System Error + + + + + Failed to open "%1" +Error: %2 - %3 + + + + + Contents entries must be a JSON array + + + + + Contents entries must have a valid type + + + + + Contents entries must have a valid name + + + + + Contents entries must be JSON objects + + + + + Contents directories must be relative and within "%1" + + + + + Network Error + + + + + Authentication required + + + + + DisplayText + + + &Erase + + + + + EchoGraph + + + + Echo Graph + + + + + <html><head/><body><p>Compression factor for frequency scale</p></body></html> + + + + + Bins/Pixel + + + + + Gain + + + + + <html><head/><body><p>Echo spectrum gain</p></body></html> + + + + + Zero + + + + + <html><head/><body><p>Echo spectrum zero</p></body></html> + + + + + <html><head/><body><p>Smoothing of echo spectrum</p></body></html> + + + + + Smooth + + + + + <html><head/><body><p>Number of echo transmissions averaged</p></body></html> + + + + + N: 0 + + + + + <html><head/><body><p>Click to cycle through a sequence of colors and line widths.</p></body></html> + + + + + Colors + Colours + + + + EmulateSplitTransceiver + + + Emulated split mode requires rig to be in simplex mode + + + + + EqualizationToolsDialog::impl + + + Phase + + + + + + Freq (Hz) + + + + + Phase (Π) + + + + + Delay (ms) + + + + + Measured + + + + + Proposed + + + + + Current + + + + + Group Delay + + + + + Amplitude + + + + + Relative Power (dB) + + + + + Reference + + + + + Phase ... + + + + + Refresh + + + + + Discard Measured + + + + + ExistingNameDialog + + + Configuration to Clone From + + + + + &Source Configuration Name: + + + + + ExportCabrillo + + + Dialog + + + + + Location: + + + + + SNJ + + + + + Contest: + + + + + ARRL-RTTY + + + + + Callsign: + + + + + Category-Operator: + + + + + SINGLE-OP + + + + + Category-Transmitter: + + + + + ONE + + + + + Category-Power: + + + + + LOW + + + + + Category-Assisted: + + + + + NON-ASSISTED + + + + + Category-Band: + + + + + ALL + + + + + Claimed-Score: + + + + + Operators: + + + + + Club: + + + + + Name: + + + + + + Address: + + + + + Save Log File + + + + + Cabrillo Log (*.cbr) + + + + + Cannot open "%1" for writing: %2 + + + + + Export Cabrillo File Error + + + + + FastGraph + + + + Fast Graph + + + + + Waterfall gain + + + + + Waterfall zero + + + + + Spectrum zero + + + + + <html><head/><body><p>Set reasonable levels for gain and zero sliders.</p></body></html> + + + + + Auto Level + + + + + FoxLog::impl + + + Date & Time(UTC) + + + + + Call + + + + + Grid + + + + + Sent + + + + + Rcvd + + + + + Band + + + + + FoxLogWindow + + + Fox Log + + + + + <html><head/><body><p>Right-click here for available actions.</p></body></html> + + + + + Callers: + + + + + + + N + + + + + In progress: + + + + + Rate: + + + + + &Export ADIF ... + + + + + Export ADIF Log File + + + + + ADIF Log (*.adi) + + + + + Export ADIF File Error + + + + + Cannot open "%1" for writing: %2 + + + + + &Reset ... + + + + + Confirm Reset + + + + + Are you sure you want to erase file FoxQSO.txt and start a new Fox log? + + + + + FrequencyDialog + + + Add Frequency + + + + + IARU &Region: + + + + + &Mode: + + + + + &Frequency (MHz): + + + + + FrequencyList_v2 + + + + IARU Region + + + + + + Mode + + + + + + Frequency + + + + + + Frequency (MHz) + + + + + HRDTransceiver + + + + Failed to connect to Ham Radio Deluxe + + + + + + Failed to open file "%1": %2. + + + + + + Ham Radio Deluxe: no rig found + + + + + Ham Radio Deluxe: rig doesn't support mode + + + + + Ham Radio Deluxe: sent an unrecognised mode + + + + + Ham Radio Deluxe: item not found in %1 dropdown list + + + + + Ham Radio Deluxe: button not available + + + + + Ham Radio Deluxe didn't respond as expected + + + + + Ham Radio Deluxe: rig has disappeared or changed + + + + + Ham Radio Deluxe send command "%1" failed %2 + + + + + + + Ham Radio Deluxe: failed to write command "%1" + + + + + Ham Radio Deluxe sent an invalid reply to our command "%1" + + + + + Ham Radio Deluxe failed to reply to command "%1" %2 + + + + + + Ham Radio Deluxe retries exhausted sending command "%1" + + + + + Ham Radio Deluxe didn't respond to command "%1" as expected + + + + + HamlibTransceiver + + + + Hamlib initialisation error + + + + + Hamlib settings file error: %1 at character offset %2 + + + + + Hamlib settings file error: top level must be a JSON object + + + + + Hamlib settings file error: config must be a JSON object + + + + + Unsupported CAT type + + + + + Hamlib error: %1 while %2 + + + + + opening connection to rig + + + + + getting current frequency + + + + + getting current mode + + + + + + exchanging VFOs + + + + + + getting other VFO frequency + + + + + getting other VFO mode + + + + + setting current VFO + + + + + getting frequency + + + + + getting mode + + + + + + getting current VFO + + + + + + + + getting current VFO frequency + + + + + + + + + + setting frequency + + + + + + + + getting current VFO mode + + + + + + + + + setting current VFO mode + + + + + + setting/unsetting split mode + + + + + + setting split mode + + + + + setting split TX frequency and mode + + + + + setting split TX frequency + + + + + getting split TX VFO mode + + + + + setting split TX VFO mode + + + + + getting PTT state + + + + + setting PTT on + + + + + setting PTT off + + + + + setting a configuration item + + + + + getting a configuration item + + + + + HelpTextWindow + + + Help file error + + + + + Cannot open "%1" for reading + + + + + Error: %1 + + + + + IARURegions + + + + IARU Region + + + + + LogQSO + + + Click OK to confirm the following QSO: + + + + + Call + + + + + Start + + + + + + dd/MM/yyyy HH:mm:ss + + + + + End + + + + + Mode + + + + + Band + + + + + Rpt Sent + + + + + Rpt Rcvd + + + + + Grid + + + + + Name + + + + + Tx power + + + + + + Retain + + + + + Comments + + + + + Operator + + + + + Exch sent + + + + + Rcvd + + + + + + Invalid QSO Data + + + + + Check exchange sent and received + + + + + Check all fields + + + + + Log file error + + + + + Cannot open "%1" for append + + + + + Error: %1 + + + + + LotWUsers::impl + + + Network Error - SSL/TLS support not installed, cannot fetch: +'%1' + + + + + Network Error - Too many redirects: +'%1' + + + + + Network Error: +%1 + + + + + File System Error - Cannot commit changes to: +"%1" + + + + + File System Error - Cannot open file: +"%1" +Error(%2): %3 + + + + + File System Error - Cannot write to file: +"%1" +Error(%2): %3 + + + + + MainWindow + + + WSJT-X by K1JT + + + + + Band Activity + + + + + + UTC dB DT Freq Dr + + + + + Rx Frequency + + + + + CQ only + + + + + Enter this QSO in log + + + + + Log &QSO + + + + + Stop monitoring + + + + + &Stop + + + + + Toggle monitoring On/Off + + + + + &Monitor + + + + + <html><head/><body><p>Erase right window. Double-click to erase both windows.</p></body></html> + + + + + Erase right window. Double-click to erase both windows. + + + + + &Erase + + + + + <html><head/><body><p>Clear the accumulating message average.</p></body></html> + + + + + Clear the accumulating message average. + + + + + Clear Avg + + + + + <html><head/><body><p>Decode most recent Rx period at QSO Frequency</p></body></html> + + + + + Decode most recent Rx period at QSO Frequency + + + + + &Decode + + + + + <html><head/><body><p>Toggle Auto-Tx On/Off</p></body></html> + + + + + Toggle Auto-Tx On/Off + + + + + E&nable Tx + + + + + Stop transmitting immediately + + + + + &Halt Tx + + + + + <html><head/><body><p>Toggle a pure Tx tone On/Off</p></body></html> + + + + + Toggle a pure Tx tone On/Off + + + + + &Tune + + + + + Menus + + + + + USB dial frequency + + + + + 14.078 000 + + + + + <html><head/><body><p>30dB recommended when only noise present<br/>Green when good<br/>Red when clipping may occur<br/>Yellow when too low</p></body></html> + + + + + Rx Signal + + + + + 30dB recommended when only noise present +Green when good +Red when clipping may occur +Yellow when too low + + + + + DX Call + + + + + DX Grid + + + + + Callsign of station to be worked + + + + + Search for callsign in database + + + + + &Lookup + + + + + Locator of station to be worked + + + + + Az: 251 16553 km + + + + + Add callsign and locator to database + + + + + Add + + + + + Pwr + + + + + <html><head/><body><p>If orange or red there has been a rig control failure, click to reset and read the dial frequency. S implies split mode.</p></body></html> + + + + + If orange or red there has been a rig control failure, click to reset and read the dial frequency. S implies split mode. + + + + + ? + + + + + Adjust Tx audio level + + + + + <html><head/><body><p>Select operating band or enter frequency in MHz or enter kHz increment followed by k.</p></body></html> + + + + + Frequncy entry + + + + + Select operating band or enter frequency in MHz or enter kHz increment followed by k. + + + + + <html><head/><body><p align="center"> 2015 Jun 17 </p><p align="center"> 01:23:45 </p></body></html> + + + + + <html><head/><body><p>Check to keep Tx frequency fixed when double-clicking on decoded text.</p></body></html> + + + + + Check to keep Tx frequency fixed when double-clicking on decoded text. + + + + + Hold Tx Freq + + + + + Audio Rx frequency + + + + + + + Hz + + + + + Rx + + + + + Set Tx frequency to Rx Frequency + + + + + â–² + + + + + Frequency tolerance (Hz) + + + + + F Tol + + + + + Set Rx frequency to Tx Frequency + + + + + â–¼ + + + + + <html><head/><body><p>Synchronizing threshold. Lower numbers accept weaker sync signals.</p></body></html> + + + + + Synchronizing threshold. Lower numbers accept weaker sync signals. + + + + + Sync + + + + + <html><head/><body><p>Check to use short-format messages.</p></body></html> + + + + + Check to use short-format messages. + + + + + Sh + + + + + <html><head/><body><p>Check to enable JT9 fast modes</p></body></html> + + + + + Check to enable JT9 fast modes + + + + + + Fast + + + + + <html><head/><body><p>Check to enable automatic sequencing of Tx messages based on received messages.</p></body></html> + + + + + Check to enable automatic sequencing of Tx messages based on received messages. + + + + + Auto Seq + + + + + <html><head/><body><p>Check to call the first decoded responder to my CQ.</p></body></html> + + + + + Check to call the first decoded responder to my CQ. + + + + + Call 1st + + + + + Check to generate "@1250 (SEND MSGS)" in Tx6. + + + + + Tx6 + + + + + <html><head/><body><p>Check to Tx in even-numbered minutes or sequences, starting at 0; uncheck for odd sequences.</p></body></html> + + + + + Check to Tx in even-numbered minutes or sequences, starting at 0; uncheck for odd sequences. + + + + + Tx even/1st + + + + + <html><head/><body><p>Frequency to call CQ on in kHz above the current MHz</p></body></html> + + + + + Frequency to call CQ on in kHz above the current MHz + + + + + Tx CQ + + + + + <html><head/><body><p>Check this to call CQ on the &quot;Tx CQ&quot; frequency. Rx will be on the current frequency and the CQ message wiill include the current Rx frequency so callers know which frequency to reply on.</p><p>Not available to nonstandard callsign holders.</p></body></html> + + + + + Check this to call CQ on the "Tx CQ" frequency. Rx will be on the current frequency and the CQ message wiill include the current Rx frequency so callers know which frequency to reply on. +Not available to nonstandard callsign holders. + + + + + Rx All Freqs + + + + + <html><head/><body><p>Submode determines tone spacing; A is narrowest.</p></body></html> + + + + + Submode determines tone spacing; A is narrowest. + + + + + Submode + + + + + Fox + + + + + <html><head/><body><p>Check to monitor Sh messages.</p></body></html> + + + + + Check to monitor Sh messages. + + + + + SWL + + + + + Best S+P + + + + + <html><head/><body><p>Check this to start recording calibration data.<br/>While measuring calibration correction is disabled.<br/>When not checked you can view the calibration results.</p></body></html> + + + + + Check this to start recording calibration data. +While measuring calibration correction is disabled. +When not checked you can view the calibration results. + + + + + Measure + + + + + <html><head/><body><p>Signal report: Signal-to-noise ratio in 2500 Hz reference bandwidth (dB).</p></body></html> + + + + + Signal report: Signal-to-noise ratio in 2500 Hz reference bandwidth (dB). + + + + + Report + + + + + <html><head/><body><p>Tx/Rx or Frequency calibration sequence length</p></body></html> + + + + + Tx/Rx or Frequency calibration sequence length + + + + + s + + + + + T/R + + + + + Toggle Tx mode + + + + + Tx JT9 @ + + + + + Audio Tx frequency + + + + + + Tx + + + + + Tx# + + + + + <html><head/><body><p>Double-click on another caller to queue that call for your next QSO.</p></body></html> + + + + + Double-click on another caller to queue that call for your next QSO. + + + + + Next Call + + + + + 1 + + + + + + + Send this message in next Tx interval + + + + + Ctrl+2 + + + + + <html><head/><body><p>Send this message in next Tx interval</p><p>Double click to toggle the use of the Tx1 message to start a QSO with a station (not allowed for type 1 compound call holders)</p></body></html> + + + + + Send this message in next Tx interval +Double click to toggle the use of the Tx1 message to start a QSO with a station (not allowed for type 1 compound call holders) + + + + + Ctrl+1 + + + + + + + + Switch to this Tx message NOW + + + + + Tx &2 + + + + + Alt+2 + + + + + <html><head/><body><p>Switch to this Tx message NOW</p><p>Double click to toggle the use of the Tx1 message to start a QSO with a station (not allowed for type 1 compound call holders)</p></body></html> + + + + + Switch to this Tx message NOW +Double click to toggle the use of the Tx1 message to start a QSO with a station (not allowed for type 1 compound call holders) + + + + + Tx &1 + + + + + Alt+1 + + + + + Ctrl+6 + + + + + <html><head/><body><p>Send this message in next Tx interval</p><p>Double-click to reset to the standard 73 message</p></body></html> + + + + + Send this message in next Tx interval +Double-click to reset to the standard 73 message + + + + + Ctrl+5 + + + + + Ctrl+3 + + + + + Tx &3 + + + + + Alt+3 + + + + + <html><head/><body><p>Send this message in next Tx interval</p><p>Double-click to toggle between RRR and RR73 messages in Tx4 (not allowed for type 2 compound call holders)</p><p>RR73 messages should only be used when you are reasonably confident that no message repetitions will be required</p></body></html> + + + + + Send this message in next Tx interval +Double-click to toggle between RRR and RR73 messages in Tx4 (not allowed for type 2 compound call holders) +RR73 messages should only be used when you are reasonably confident that no message repetitions will be required + + + + + Ctrl+4 + + + + + <html><head/><body><p>Switch to this Tx message NOW</p><p>Double-click to toggle between RRR and RR73 messages in Tx4 (not allowed for type2 compound call holders)</p><p>RR73 messages should only be used when you are reasonably confident that no message repetitions will be required</p></body></html> + + + + + Switch to this Tx message NOW +Double-click to toggle between RRR and RR73 messages in Tx4 (not allowed for type2 compound call holders) +RR73 messages should only be used when you are reasonably confident that no message repetitions will be required + + + + + Tx &4 + + + + + Alt+4 + + + + + <html><head/><body><p>Switch to this Tx message NOW</p><p>Double-click to reset to the standard 73 message</p></body></html> + + + + + Switch to this Tx message NOW +Double-click to reset to the standard 73 message + + + + + Tx &5 + + + + + Alt+5 + + + + + Now + + + + + Generate standard messages for minimal QSO + + + + + Generate Std Msgs + + + + + Tx &6 + + + + + Alt+6 + + + + + + Enter a free text message (maximum 13 characters) +or select a predefined macro from the dropdown list. +Press ENTER to add the current text to the predefined +list. The list can be maintained in Settings (F2). + + + + + Queue up the next Tx message + + + + + Next + + + + + 2 + + + + + Calling CQ + + + + + Generate a CQ message + + + + + + + CQ + + + + + Generate message with RRR + + + + + RRR + + + + + Generate message with report + + + + + dB + + + + + Answering CQ + + + + + Generate message for replying to a CQ + + + + + + Grid + + + + + Generate message with R+report + + + + + R+dB + + + + + Generate message with 73 + + + + + 73 + + + + + Send this standard (generated) message + + + + + Gen msg + + + + + Send this free-text message (max 13 characters) + + + + + Free msg + + + + + 3 + + + + + Max dB + + + + + CQ AF + + + + + CQ AN + + + + + CQ AS + + + + + CQ EU + + + + + CQ NA + + + + + CQ OC + + + + + CQ SA + + + + + CQ 0 + + + + + CQ 1 + + + + + CQ 2 + + + + + CQ 3 + + + + + CQ 4 + + + + + CQ 5 + + + + + CQ 6 + + + + + CQ 7 + + + + + CQ 8 + + + + + CQ 9 + + + + + Reset + + + + + N List + + + + + N Slots + + + + + + Random + + + + + Call + + + + + S/N (dB) + + + + + Distance + + + + + More CQs + + + + + Percentage of 2-minute sequences devoted to transmitting. + + + + + % + + + + + Tx Pct + + + + + Band Hopping + + + + + Choose bands and times of day for band-hopping. + + + + + Schedule ... + + + + + Upload decoded messages to WSPRnet.org. + + + + + Upload spots + + + + + <html><head/><body><p>6 digit locators cause 2 different mesages to be sent, the second contains the full locator but only a hashed callsign, other stations must have decoded the first once before they can decode your call in the second. Check this option to only send 4 digit locators if it will avoid the two message protocol.</p></body></html> + + + + + 6 digit locators cause 2 different mesages to be sent, the second contains the full locator but only a hashed callsign, other stations must have decoded the first once before they can decode your call in the second. Check this option to only send 4 digit locators if it will avoid the two message protocol. + + + + + Prefer type 1 messages + + + + + No own call decodes + + + + + Transmit during the next 2-minute sequence. + + + + + Tx Next + + + + + Set Tx power in dBm (dB above 1 mW) as part of your WSPR message. + + + + + File + + + + + View + + + + + Decode + + + + + Save + + + + + Help + + + + + Mode + + + + + Configurations + + + + + Tools + + + + + Exit + + + + + Configuration + + + + + F2 + + + + + About WSJT-X + + + + + Waterfall + + + + + Open + + + + + Ctrl+O + + + + + Open next in directory + + + + + Decode remaining files in directory + + + + + Shift+F6 + + + + + Delete all *.wav && *.c2 files in SaveDir + + + + + None + + + + + Save all + + + + + Online User Guide + + + + + Keyboard shortcuts + + + + + Special mouse commands + + + + + JT9 + + + + + Save decoded + + + + + Normal + + + + + Deep + + + + + Monitor OFF at startup + + + + + Erase ALL.TXT + + + + + Erase wsjtx_log.adi + + + + + Convert mode to RTTY for logging + + + + + Log dB reports to Comments + + + + + Prompt me to log QSO + + + + + Blank line between decoding periods + + + + + Clear DX Call and Grid after logging + + + + + Display distance in miles + + + + + Double-click on call sets Tx Enable + + + + + + F7 + + + + + Tx disabled after sending 73 + + + + + Runaway Tx watchdog + + + + + Allow multiple instances + + + + + Tx freq locked to Rx freq + + + + + JT65 + + + + + JT9+JT65 + + + + + Tx messages to Rx Frequency window + + + + + Gray1 + + + + + Show DXCC entity and worked B4 status + + + + + Astronomical data + + + + + List of Type 1 prefixes and suffixes + + + + + Settings... + + + + + Local User Guide + + + + + Open log directory + + + + + JT4 + + + + + Message averaging + + + + + Enable averaging + + + + + Enable deep search + + + + + WSPR + + + + + Echo Graph + + + + + F8 + + + + + Echo + + + + + EME Echo mode + + + + + ISCAT + + + + + Fast Graph + + + + + F9 + + + + + &Download Samples ... + + + + + <html><head/><body><p>Download sample audio files demonstrating the various modes.</p></body></html> + + + + + MSK144 + + + + + QRA64 + + + + + Release Notes + + + + + Enable AP for DX Call + + + + + FreqCal + + + + + Measure reference spectrum + + + + + Measure phase response + + + + + Erase reference spectrum + + + + + Execute frequency calibration cycle + + + + + Equalization tools ... + + + + + WSPR-LF + + + + + Experimental LF/MF mode + + + + + FT8 + + + + + + Enable AP + + + + + Solve for calibration parameters + + + + + Copyright notice + + + + + Shift+F1 + + + + + Fox log + + + + + FT8 DXpedition Mode User Guide + + + + + Reset Cabrillo log ... + + + + + Color highlighting scheme + + + + + Contest Log + + + + + Export Cabrillo log ... + + + + + Quick-Start Guide to WSJT-X 2.0 + + + + + Contest log + + + + + Erase WSPR hashtable + + + + + FT4 + + + + + Rig Control Error + + + + + Do you want to reconfigure the radio interface? + + + + + Error Scanning ADIF Log + + + + + Scanned ADIF log, %1 worked before records created + + + + + Error Loading LotW Users Data + + + + + Error Writing WAV File + + + + + Configurations... + + + + + Error Killing jt9.exe Process + + + + + KillByName return code: %1 + + + + + Error removing "%1" + + + + + Click OK to retry + + + + + + Improper mode + + + + + + File Open Error + + + + + + + + + Cannot open "%1" for append: %2 + + + + + Error saving c2 file + + + + + Error in Sound Input + + + + + Error in Sound Output + + + + + Change Operator + + + + + New operator: + + + + + Status File Error + + + + + + Cannot open "%1" for writing: %2 + + + + + Subprocess Error + + + + + Subprocess failed with exit code %1 + + + + + + Running: %1 +%2 + + + + + Subprocess error + + + + + Reference spectrum saved + + + + + Invalid data in fmt.all at line %1 + + + + + Good Calibration Solution + + + + + <pre>%1%L2 ±%L3 ppm +%4%L5 ±%L6 Hz + +%7%L8 +%9%L10 Hz</pre> + + + + + Delete Calibration Measurements + + + + + The "fmt.all" file will be renamed as "fmt.bak" + + + + + If you make fair use of any part of WSJT-X under terms of the GNU General Public License, you must display the following copyright notice prominently in your derivative work: + +"The algorithms, source code, look-and-feel of WSJT-X and related programs, and protocol specifications for the modes FSK441, FT8, JT4, JT6M, JT9, JT65, JTMS, QRA64, ISCAT, MSK144 are Copyright (C) 2001-2019 by one or more of the following authors: Joseph Taylor, K1JT; Bill Somerville, G4WJS; Steven Franke, K9AN; Nico Palermo, IV3NWV; Greg Beam, KI7MT; Michael Black, W9MDB; Edson Pereira, PY2SDR; Philip Karn, KA9Q; and other members of the WSJT Development Group." + + + + + No data read from disk. Wrong file format? + + + + + Confirm Delete + + + + + Are you sure you want to delete all *.wav and *.c2 files in "%1"? + + + + + Keyboard Shortcuts + + + + + Special Mouse Commands + + + + + No more files to open. + + + + + Please choose another Tx frequency. WSJT-X will not knowingly transmit another mode in the WSPR sub-band on 30m. + + + + + WSPR Guard Band + + + + + Please choose another dial frequency. WSJT-X will not operate in Fox mode in the standard FT8 sub-bands. + + + + + Fox Mode warning + + + + + Should you switch to ARRL Field Day mode? + + + + + Should you switch to RTTY contest mode? + + + + + + + + Add to CALL3.TXT + + + + + Please enter a valid grid locator + + + + + Cannot open "%1" for read/write: %2 + + + + + %1 +is already in CALL3.TXT, do you wish to replace it? + + + + + Warning: DX Call field is empty. + + + + + Log file error + + + + + Cannot open "%1" + + + + + Error sending log to N1MM + + + + + Write returned "%1" + + + + + + + Confirm Erase + + + + + Are you sure you want to erase file ALL.TXT? + + + + + + Confirm Reset + + + + + Are you sure you want to erase your contest log? + + + + + Doing this will remove all QSO records for the current contest. They will be kept in the ADIF log file but will not be available for export in your Cabrillo log. + + + + + Cabrillo Log saved + + + + + Are you sure you want to erase file wsjtx_log.adi? + + + + + Are you sure you want to erase the WSPR hashtable? + + + + + VHF features warning + + + + + Tune digital gain + + + + + Transmit digital gain + + + + + Prefixes + + + + + Network Error + + + + + Error: %1 +UDP server %2:%3 + + + + + File Error + + + + + Phase Training Disabled + + + + + Phase Training Enabled + + + + + + Log File Error + + + + + Are you sure you want to clear the QSO queues? + + + + + MessageAveraging + + + + Message Averaging + + + + + UTC Sync DT Freq + + + + + Modes + + + + Mode + + + + + MultiSettings + + + Default + + + + + MultiSettings::impl + + + &Switch To + + + + + &Clone + + + + + Clone &Into ... + + + + + R&eset + + + + + &Rename ... + + + + + &Delete + + + + + Clone Into Configuration + + + + + Confirm overwrite of all values for configuration "%1" with values from "%2"? + + + + + Reset Configuration + + + + + Confirm reset to default values for configuration "%1"? + + + + + Delete Configuration + + + + + Confirm deletion of configuration "%1"? + + + + + NameDialog + + + New Configuration Name + + + + + Old name: + + + + + &New name: + + + + + OmniRigTransceiver + + + OmniRig: unrecognized mode + + + + + Failed to start OmniRig COM server + + + + + + OmniRig: don't know how to set rig frequency + + + + + + OmniRig: timeout waiting for update from rig + + + + + OmniRig COM/OLE error: %1 at %2: %3 (%4) + + + + + PollingTransceiver + + + Unexpected rig error + + + + + QObject + + + Invalid rig name - \ & / not allowed + + + + + User Defined + + + + + Failed to open LotW users CSV file: '%1' + + + + + OOB + + + + + Too many colours in palette. + + + + + Error reading waterfall palette file "%1:%2" too many colors. + + + + + Error reading waterfall palette file "%1:%2" invalid triplet. + + + + + Error reading waterfall palette file "%1:%2" invalid color. + + + + + Error opening waterfall palette file "%1": %2. + + + + + Error writing waterfall palette file "%1": %2. + + + + + RemoteFile + + + + + + + + File System Error + + + + + Cannot rename file: +"%1" +to: "%2" +Error(%3): %4 + + + + + Cannot delete file: +"%1" + + + + + + + Network Error + + + + + Too many redirects: %1 + + + + + Redirect not followed: %1 + + + + + Cannot commit changes to: +"%1" + + + + + Cannot open file: +"%1" +Error(%2): %3 + + + + + Cannot make path: +"%1" + + + + + Cannot write to file: +"%1" +Error(%2): %3 + + + + + SampleDownloader::impl + + + Download Samples + + + + + Input Error + + + + + Invalid URL format + + + + + SoundInput + + + An error opening the audio input device has occurred. + + + + + An error occurred during read from the audio input device. + + + + + Audio data not being fed to the audio input device fast enough. + + + + + Non-recoverable error, audio input device not usable at this time. + + + + + Requested input audio format is not valid. + + + + + Requested input audio format is not supported on device. + + + + + Failed to initialize audio sink device + + + + + Idle + + + + + Receiving + + + + + Suspended + + + + + Interrupted + + + + + Error + + + + + Stopped + + + + + SoundOutput + + + An error opening the audio output device has occurred. + + + + + An error occurred during write to the audio output device. + + + + + Audio data not being fed to the audio output device fast enough. + + + + + Non-recoverable error, audio output device not usable at this time. + + + + + Requested output audio format is not valid. + + + + + Requested output audio format is not supported on device. + + + + + Idle + + + + + Sending + + + + + Suspended + + + + + Interrupted + + + + + Error + + + + + Stopped + + + + + StationDialog + + + Add Station + + + + + &Band: + + + + + &Offset (MHz): + + + + + &Antenna: + + + + + StationList::impl + + + Band name + + + + + Frequency offset + + + + + Antenna description + + + + + Band + + + + + Offset + + + + + Antenna Description + + + + + TransceiverBase + + + Unexpected rig error + + + + + WideGraph + + + Dialog + + + + + Controls + + + + + Spectrum gain + + + + + Palette + + + + + <html><head/><body><p>Enter definition for a new color palette.</p></body></html> + + + + + Adjust... + + + + + Waterfall gain + + + + + <html><head/><body><p>Set fractional size of spectrum in this window.</p></body></html> + + + + + % + + + + + Spec + + + + + <html><head/><body><p>Flatten spectral baseline over the full displayed interval.</p></body></html> + + + + + Flatten + + + + + <html><head/><body><p>Compute and save a reference spectrum. (Not yet fully implemented.)</p></body></html> + + + + + Ref Spec + + + + + Smoothing of Linear Average spectrum + + + + + Smooth + + + + + Compression factor for frequency scale + + + + + Bins/Pixel + + + + + Select waterfall palette + + + + + <html><head/><body><p>Select data for spectral display</p></body></html> + + + + + Current + + + + + Cumulative + + + + + Linear Avg + + + + + Reference + + + + + <html><head/><body><p>Frequency at left edge of waterfall</p></body></html> + + + + + Hz + + + + + Start + + + + + <html><head/><body><p>Decode JT9 only above this frequency</p></body></html> + + + + + JT9 + + + + + JT65 + + + + + Number of FFTs averaged (controls waterfall scrolling rate) + + + + + N Avg + + + + + Waterfall zero + + + + + Spectrum zero + + + + + Wide Graph + + + + + + Read Palette + + + + + configuration_dialog + + + Settings + + + + + Genera&l + + + + + General station details and settings. + + + + + Station Details + + + + + My C&all: + + + + + Station callsign. + + + + + M&y Grid: + + + + + <html><head/><body><p>Maidenhead locator, preferably 6 characters.</p></body></html> + + + + + Check to allow grid changes from external programs + + + + + AutoGrid + + + + + IARU Region: + + + + + <html><head/><body><p>Select your IARU region.</p></body></html> + + + + + Message generation for type 2 compound callsign holders: + + + + + <html><head/><body><p>Type 2 compound callsigns are those with prefixes or suffixes not included in the allowed shortlist (See Help-&gt;Add-on prefixes and suffixes).</p><p>This option determines which generated messages should contain your full type 2 compound call sign rather than your base callsign. It only applies if you have a type 2 compound callsign.</p><p>This option controls the way the messages that are used to answer CQ calls are generated. Generated messages 6 (CQ) and 5 (73) will always contain your full callsign. The JT65 and JT9 protocols allow for some standard messages with your full call at the expense of another piece of information such as the DX call or your locator.</p><p>Choosing message 1 omits the DX callsign which may be an issue when replying to CQ calls. Choosing message 3 also omits the DX callsign and many versions of this and other software will not extract the report. Choosing neither means that your full callsign only goes in your message 5 (73) so your QSO partner may log the wrong callsign.</p><p>None of these options are perfect, message 3 is usually best but be aware your QSO partner may not log the report you send them.</p></body></html> + + + + + Full call in Tx1 + + + + + Full call in Tx3 + + + + + Full call in Tx5 only + + + + + Display + + + + + Show outgoing transmitted messages in the Rx frequency window. + + + + + &Tx messages to Rx frequency window + + + + + Show if decoded stations are new DXCC entities or worked before. + + + + + Show &DXCC, grid, and worked-before status + + + + + <html><head/><body><p>Check to have decodes for a new period start at the top of the Band Activity window and not scroll off the top when the window is full.</p><p>This is to aid selecting decodes to double-click while decoding is still in progress. Use the Band Activity vertical scroll bar to reveal decodes past the bottom of the window.</p></body></html> + + + + + Start new period decodes at top + + + + + Show principal prefix instead of country name + + + + + Set the font characteristics for the application. + + + + + Font... + + + + + Set the font characteristics for the Band Activity and Rx Frequency areas. + + + + + Decoded Text Font... + + + + + Include a separator line between periods in the band activity window. + + + + + &Blank line between decoding periods + + + + + Show distance to DX station in miles rather than kilometers. + + + + + Display dista&nce in miles + + + + + Behavior + + + + + Decode after EME delay + + + + + Tx watchdog: + + + + + <html><head/><body><p>Number of minutes before unattended transmissions are aborted</p></body></html> + + + + + Disabled + + + + + minutes + + + + + Enable VHF/UHF/Microwave features + + + + + Single decode + + + + + <html><head/><body><p>Some rigs are not able to process CAT commands while transmitting. This means that if you are operating in split mode you may have to uncheck this option.</p></body></html> + + + + + Allow Tx frequency changes while transmitting + + + + + Don't start decoding until the monitor button is clicked. + + + + + Mon&itor off at startup + + + + + <html><head/><body><p>Check this if you wish to automatically return to the last monitored frequency when monitor is enabled, leave it unchecked if you wish to have the current rig frequency maintained.</p></body></html> + + + + + Monitor returns to last used frequency + + + + + Alternate F1-F6 bindings + + + + + Turns off automatic transmissions after sending a 73 or any other free +text message. + + + + + Di&sable Tx after sending 73 + + + + + Send a CW ID after every 73 or free text message. + + + + + CW ID a&fter 73 + + + + + Periodic CW ID Inter&val: + + + + + Send a CW ID periodically every few minutes. +This might be required under your countries licence regulations. +It will not interfere with other users as it is always sent in the +quiet period when decoding is done. + + + + + Automatic transmission mode. + + + + + Doubl&e-click on call sets Tx enable + + + + + Calling CQ forces Call 1st + + + + + &Radio + + + + + Radio interface configuration settings. + + + + + Settings that control your CAT interface. + + + + + CAT Control + + + + + + Port: + + + + + Serial port used for CAT control. + + + + + Serial Port Parameters + + + + + Baud Rate: + + + + + Serial port data rate which must match the setting of your radio. + + + + + 1200 + + + + + 2400 + + + + + 4800 + + + + + 9600 + + + + + 19200 + + + + + 38400 + + + + + 57600 + + + + + 115200 + + + + + <html><head/><body><p>Number of data bits used to communicate with your radio's CAT interface (usually eight).</p></body></html> + + + + + Data Bits + + + + + D&efault + + + + + Se&ven + + + + + E&ight + + + + + <html><head/><body><p>Number of stop bits used when communicating with your radio's CAT interface</p><p>(consult you radio's manual for details).</p></body></html> + + + + + Stop Bits + + + + + + Default + + + + + On&e + + + + + T&wo + + + + + <html><head/><body><p>Flow control protocol used between this computer and your radio's CAT interface (usually &quot;None&quot; but some require &quot;Hardware&quot;).</p></body></html> + + + + + Handshake + + + + + &None + + + + + Software flow control (very rare on CAT interfaces). + + + + + XON/XOFF + + + + + Flow control using the RTS and CTS RS-232 control lines +not often used but some radios have it as an option and +a few, particularly some Kenwood rigs, require it). + + + + + &Hardware + + + + + Special control of CAT port control lines. + + + + + Force Control Lines + + + + + + High + + + + + + Low + + + + + DTR: + + + + + RTS: + + + + + How this program activates the PTT on your radio + + + + + PTT Method + + + + + <html><head/><body><p>No PTT activation, instead the radio's automatic VOX is used to key the transmitter.</p><p>Use this if you have no radio interface hardware.</p></body></html> + + + + + VO&X + + + + + <html><head/><body><p>Use the RS-232 DTR control line to toggle your radio's PTT, requires hardware to inteface the line.</p><p>Some commercial interface units also use this method.</p><p>The DTR control line of the CAT serial port may be used for this or a DTR control line on a different serial port may be used.</p></body></html> + + + + + &DTR + + + + + Some radios support PTT via CAT commands, +use this option if your radio supports it and you have no +other hardware interface for PTT. + + + + + C&AT + + + + + <html><head/><body><p>Use the RS-232 RTS control line to toggle your radio's PTT, requires hardware to inteface the line.</p><p>Some commercial interface units also use this method.</p><p>The RTS control line of the CAT serial port may be used for this or a RTS control line on a different serial port may be used. Note that this option is not available on the CAT serial port when hardware flow control is used.</p></body></html> + + + + + R&TS + + + + + <html><head/><body><p>Select the RS-232 serial port utilised for PTT control, this option is available when DTR or RTS is selected above as a transmit method.</p><p>This port can be the same one as the one used for CAT control.</p><p>For some interface types the special value CAT may be chosen, this is used for non-serial CAT interfaces that can control serial port control lines remotely (OmniRig for example).</p></body></html> + + + + + Modulation mode selected on radio. + + + + + Mode + + + + + <html><head/><body><p>USB is usually the correct modulation mode,</p><p>unless the radio has a special data or packet mode setting</p><p>for AFSK operation.</p></body></html> + + + + + US&B + + + + + Don't allow the program to set the radio mode +(not recommended but use if the wrong mode +or bandwidth is selected). + + + + + + None + + + + + If this is availabe then it is usually the correct mode for this program. + + + + + Data/P&kt + + + + + Some radios can select the audio input using a CAT command, +this setting allows you to select which audio input will be used +(if it is available then generally the Rear/Data option is best). + + + + + Transmit Audio Source + + + + + Rear&/Data + + + + + &Front/Mic + + + + + Rig: + + + + + Poll Interval: + + + + + <html><head/><body><p>Interval to poll rig for status. Longer intervals will mean that changes to the rig will take longer to be detected.</p></body></html> + + + + + s + + + + + <html><head/><body><p>Attempt to connect to the radio with these settings.</p><p>The button will turn green if the connection is successful or red if there is a problem.</p></body></html> + + + + + Test CAT + + + + + Attempt to activate the transmitter. +Click again to deactivate. Normally no power should be +output since there is no audio being generated at this time. +Check that any Tx indication on your radio and/or your +radio interface behave as expected. + + + + + Test PTT + + + + + Split Operation + + + + + Fake It + + + + + Rig + + + + + A&udio + + + + + Audio interface settings + + + + + Souncard + + + + + Soundcard + + + + + Select the audio CODEC to use for transmitting. +If this is your default device for system sounds then +ensure that all system sounds are disabled otherwise +you will broadcast any systems sounds generated during +transmitting periods. + + + + + Select the audio CODEC to use for receiving. + + + + + &Input: + + + + + Select the channel to use for receiving. + + + + + + Mono + + + + + + Left + + + + + + Right + + + + + + Both + + + + + Select the audio channel used for transmission. +Unless you have multiple radios connected on different +channels; then you will usually want to select mono or +both here. + + + + + Ou&tput: + + + + + + Save Directory + + + + + Loc&ation: + + + + + Path to which .WAV files are saved. + + + + + + TextLabel + + + + + Click to select a different save directory for .WAV files. + + + + + S&elect + + + + + + AzEl Directory + + + + + Location: + + + + + Select + + + + + Power Memory By Band + + + + + Remember power settings by band + + + + + Enable power memory during transmit + + + + + Transmit + + + + + Enable power memory during tuning + + + + + Tune + + + + + Tx &Macros + + + + + Canned free text messages setup + + + + + &Add + + + + + &Delete + + + + + Drag and drop items to rearrange order +Right click for item specific actions +Click, SHIFT+Click and, CRTL+Click to select items + + + + + Reportin&g + + + + + Reporting and logging settings + + + + + Logging + + + + + The program will pop up a partially completed Log QSO dialog when you send a 73 or free text message. + + + + + Promp&t me to log QSO + + + + + Op Call: + + + + + Some logging programs will not accept the type of reports +saved by this program. +Check this option to save the sent and received reports in the +comments field. + + + + + d&B reports to comments + + + + + Check this option to force the clearing of the DX Call +and DX Grid fields when a 73 or free text message is sent. + + + + + Clear &DX call and grid after logging + + + + + <html><head/><body><p>Some logging programs will not accept WSJT-X mode names.</p></body></html> + + + + + Con&vert mode to RTTY + + + + + <html><head/><body><p>The callsign of the operator, if different from the station callsign.</p></body></html> + + + + + <html><head/><body><p>Check to have QSOs logged automatically, when complete.</p></body></html> + + + + + Log automatically (contesting only) + + + + + Network Services + + + + + The program can send your station details and all +decoded signals as spots to the http://pskreporter.info web site. +This is used for reverse beacon analysis which is very useful +for assessing propagation and system performance. + + + + + Enable &PSK Reporter Spotting + + + + + UDP Server + + + + + UDP Server: + + + + + <html><head/><body><p>Optional hostname of network service to receive decodes.</p><p>Formats:</p><ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">hostname</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">IPv4 address</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">IPv6 address</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">IPv4 multicast group address</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">IPv6 multicast group address</li></ul><p>Clearing this field will disable the broadcasting of UDP status updates.</p></body></html> + + + + + UDP Server port number: + + + + + <html><head/><body><p>Enter the service port number of the UDP server that WSJT-X should send updates to. If this is zero no updates will be broadcast.</p></body></html> + + + + + <html><head/><body><p>With this enabled WSJT-X will accept certain requests back from a UDP server that receives decode messages.</p></body></html> + + + + + Accept UDP requests + + + + + <html><head/><body><p>Indicate acceptance of an incoming UDP request. The effect of this option varies depending on the operating system and window manager, its intent is to notify the acceptance of an incoming UDP request even if this application is minimized or hidden.</p></body></html> + + + + + Notify on accepted UDP request + + + + + <html><head/><body><p>Restore the window from minimized if an UDP request is accepted.</p></body></html> + + + + + Accepted UDP request restores window + + + + + Secondary UDP Server (deprecated) + + + + + <html><head/><body><p>When checked, WSJT-X will broadcast a logged contact in ADIF format to the configured hostname and port. </p></body></html> + + + + + Enable logged contact ADIF broadcast + + + + + Server name or IP address: + + + + + <html><head/><body><p>Optional host name of N1MM Logger+ program to receive ADIF UDP broadcasts. This is usually 'localhost' or ip address 127.0.0.1</p><p>Formats:</p><ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">hostname</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">IPv4 address</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">IPv6 address</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">IPv4 multicast group address</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">IPv6 multicast group address</li></ul><p>Clearing this field will disable broadcasting of ADIF information via UDP.</p></body></html> + + + + + Server port number: + + + + + <html><head/><body><p>Enter the port number that WSJT-X should use for UDP broadcasts of ADIF log information. For N1MM Logger+, this value should be 2333. If this is zero, no updates will be broadcast.</p></body></html> + + + + + Frequencies + + + + + Default frequencies and band specific station details setup + + + + + <html><head/><body><p>See &quot;Frequency Calibration&quot; in the WSJT-X User Guide for details of how to determine these parameters for your radio.</p></body></html> + + + + + Frequency Calibration + + + + + Slope: + + + + + ppm + + + + + Intercept: + + + + + Hz + + + + + Working Frequencies + + + + + <html><head/><body><p>Right click to maintain the working frequencies list.</p></body></html> + + + + + Station Information + + + + + Items may be edited. +Right click for insert and delete options. + + + + + Colors + Colours + + + + Decode Highlightling + + + + + <html><head/><body><p>Enable or disable using the check boxes and right-click an item to change or unset the foreground color, background color, or reset the item to default values. Drag and drop the items to change their priority, higher in the list is higher in priority.</p><p>Note that each foreground or background color may be either set or unset, unset means that it is not allocated for that item's type and lower priority items may apply.</p></body></html> + + + + + <html><head/><body><p>Push to reset all highlight items above to default values and priorities.</p></body></html> + + + + + Reset Highlighting + + + + + <html><head/><body><p>Check to indicate new DXCC entities, grid squares, and callsigns per mode.</p></body></html> + + + + + Highlight by Mode + + + + + <html><head/><body><p>Click to scan the wsjtx_log.adi ADIF file again for worked before information</p></body></html> + + + + + Rescan ADIF Log + + + + + Include extra WAE entities + + + + + <html><head/><body><p>Controls for Logbook of the World user lookup.</p></body></html> + + + + + Logbook of the World User Validation + + + + + Users CSV file URL: + + + + + <html><head/><body><p>URL of the ARRL LotW user's last upload dates and times data file which is used to highlight decodes from stations that are known to upload their log file to LotW.</p></body></html> + + + + + https://lotw.arrl.org/lotw-user-activity.csv + + + + + <html><head/><body><p>Push this button to fetch the latest LotW user's upload date and time data file.</p></body></html> + + + + + Fetch Now + + + + + Age of last upload less than: + + + + + <html><head/><body><p>Adjust this spin box to set the age threshold of LotW user's last upload date that is accepted as a current LotW user.</p></body></html> + + + + + days + + + + + Advanced + + + + + <html><head/><body><p>User-selectable parameters for JT65 VHF/UHF/Microwave decoding.</p></body></html> + + + + + JT65 VHF/UHF/Microwave decoding parameters + + + + + Random erasure patterns: + + + + + <html><head/><body><p>Maximum number of erasure patterns for stochastic soft-decision Reed Solomon decoder is 10^(n/2).</p></body></html> + + + + + Aggressive decoding level: + + + + + <html><head/><body><p>Higher levels will increase the probability of decoding, but will also increase probability of a false decode.</p></body></html> + + + + + Two-pass decoding + + + + + Special operating activity: Generation of FT4, FT8, and MSK144 messages + + + + + <html><head/><body><p>FT8 DXpedition mode: Hound operator calling the DX.</p></body></html> + + + + + Hound + + + + + <html><head/><body><p>North American VHF/UHF/Microwave contests and others in which a 4-character grid locator is the required exchange.</p></body></html> + + + + + NA VHF Contest + + + + + <html><head/><body><p>FT8 DXpedition mode: Fox (DXpedition) operator.</p></body></html> + + + + + Fox + + + + + <html><head/><body><p>European VHF+ contests requiring a signal report, serial number, and 6-character locator.</p></body></html> + + + + + EU VHF Contest + + + + + + <html><head/><body><p>ARRL RTTY Roundup and similar contests. Exchange is US state, Canadian province, or &quot;DX&quot;.</p></body></html> + + + + + RTTY Roundup messages + + + + + RTTY RU Exch: + + + + + NJ + + + + + + <html><head/><body><p>ARRL Field Day exchange: number of transmitters, Class, and ARRL/RAC section or &quot;DX&quot;.</p></body></html> + + + + + ARRL Field Day + + + + + FD Exch: + + + + + 6A SNJ + + + + + Miscellaneous + + + + + Degrade S/N of .wav file: + + + + + + For offline sensitivity tests + + + + + dB + + + + + Receiver bandwidth: + + + + + Hz + + + + + Tx delay: + + + + + Minimum delay between assertion of PTT and start of Tx audio. + + + + + s + + + + + Tone spacing + + + + + <html><head/><body><p>Generate Tx audio with twice the normal tone spacing. Intended for special LF/MF transmitters that use a divide-by-2 before generating RF.</p></body></html> + + + + + x 2 + + + + + <html><head/><body><p>Generate Tx audio with four times the normal tone spacing. Intended for special LF/MF transmitters that use a divide-by-4 before generating RF.</p></body></html> + + + + + x 4 + + + + + Waterfall spectra + + + + + Low sidelobes + + + + + Most sensitive + + + + + <html><head/><body><p>Discard (Cancel) or apply (OK) configuration changes including</p><p>resetting the radio interface and applying any soundcard changes</p></body></html> + + + + + main + + + + Fatal error + + + + + + Unexpected fatal error + + + + + Where <rig-name> is for multi-instance support. + + + + + rig-name + + + + + Where <configuration> is an existing one. + + + + + configuration + + + + + Writable files in test location. Use with caution, for testing only. + + + + + Command line error + + + + + Command line help + + + + + Application version + + + + + Another instance may be running + + + + + try to remove stale lock file? + + + + + Failed to create a temporary directory + + + + + + Path: "%1" + + + + + Failed to create a usable temporary directory + + + + + Another application may be locking the directory + + + + + Failed to create data directory + + + + + path: "%1" + + + + + Shared memory error + + + + + Unable to create shared memory segment + + + + + wf_palette_design_dialog + + + Palette Designer + + + + + <html><head/><body><p>Double click a color to edit it.</p><p>Right click to insert or delete colors.</p><p>Colors at the top represent weak signals</p><p>and colors at the bottom represent strong</p><p>signals. You can have up to 256 colors.</p></body></html> + + + + diff --git a/translations/wsjtx_pt_PT.ts b/translations/wsjtx_pt_PT.ts new file mode 100644 index 000000000..6167f5d8d --- /dev/null +++ b/translations/wsjtx_pt_PT.ts @@ -0,0 +1,6007 @@ + + + + + AbstractLogWindow + + + &Delete ... + + + + + AbstractLogWindow::impl + + + Confirm Delete + + + + + Are you sure you want to delete the %n selected QSO(s) from the log + + + + + + + + Astro + + + + Doppler tracking + + + + + <html><head/><body><p>One station does all Doppler shift correction, their QSO partner receives and transmits on the sked frequency.</p><p>If the rig does not accept CAT QSY commands while transmitting a single correction is applied for the whole transmit period.</p></body></html> + + + + + Full Doppler to DX Grid + + + + + <html><head/><body><p>Transmit takes place on sked frequency and receive frequency is corrected for own echoes. </p><p>This mode can be used for calling CQ, or when using Echo mode.</p></body></html> + + + + + Own Echo + + + + + <html><head/><body><p>Both stations correct for Doppler shift such that they would be heard on the moon at the sked frequency.</p><p>If the rig does not accept CAT QSY commands while transmitting a single correction is applied for the whole transmit period.</p><p>Use this option also for Echo mode.</p></body></html> + + + + + Constant frequency on Moon + + + + + <html><head/><body><p>DX station announces their TX Freq, which is entered as the Sked Freq. Correction applied to RX and TX so you appear on the DX's station's own echo Freq.</p><p>If the rig does not accept CAT QSY commands while transmitting a single correction is applied for the whole transmit period.</p></body></html> + + + + + On DX Echo + + + + + <html><head/><body><p>Tune radio manually and select this mode to put your echo on the same frequency.</p><p>If the rig does not accept CAT QSY commands while transmitting a single correction is applied for the whole transmit period.</p></body></html> + + + + + Call DX + + + + + <html><head/><body><p>No Doppler shift correction is applied. This may be used when the QSO partner does full Doppler correction to your grid square.</p></body></html> + + + + + None + + + + + Sked frequency + + + + + + 0 + + + + + Rx: + + + + + Tx: + + + + + <html><head/><body><p>Press and hold the CTRL key to adjust the sked frequency manually with the rig's VFO dial or enter frequency directly into the band entry field on the main window.</p></body></html> + + + + + Astro Data + + + + + Astronomical Data + + + + + Doppler Tracking Error + + + + + Split operating is required for Doppler tracking + + + + + Go to "Menu->File->Settings->Radio" to enable split operation + + + + + Bands + + + Band name + + + + + Lower frequency limit + + + + + Upper frequency limit + + + + + Band + + + + + Lower Limit + + + + + Upper Limit + + + + + CAboutDlg + + + About WSJT-X + + + + + OK + + + + + CPlotter + + + &Set Rx && Tx Offset + + + + + CabrilloLog + + + Freq(MHz) + + + + + Mode + + + + + Date & Time(UTC) + + + + + Call + + + + + Sent + + + + + Rcvd + + + + + Band + + + + + CabrilloLogWindow + + + Contest Log + + + + + <html><head/><body><p>Right-click here for available actions.</p></body></html> + + + + + Right-click here for available actions. + + + + + CallsignDialog + + + Callsign + + + + + ColorHighlighting + + + + + + + + + + + + + + + + + + K1ABC + + + + + CQ in message + + + + + My Call in message + + + + + Transmitted message + + + + + New DXCC + + + + + New Grid + + + + + New DXCC on Band + + + + + New Call + + + + + New Grid on Band + + + + + New Call on Band + + + + + Uploads to LotW + + + + + New Continent + + + + + New Continent on Band + + + + + New CQ Zone + + + + + New CQ Zone on Band + + + + + New ITU Zone + + + + + New ITU Zone on Band + + + + + Configuration::impl + + + + + &Delete + + + + + + &Insert ... + + + + + Failed to create save directory + + + + + path: "%1% + + + + + Failed to create samples directory + + + + + path: "%1" + + + + + &Load ... + + + + + &Save as ... + + + + + &Merge ... + + + + + &Reset + + + + + Serial Port: + + + + + Serial port used for CAT control + + + + + Network Server: + + + + + Optional hostname and port of network service. +Leave blank for a sensible default on this machine. +Formats: + hostname:port + IPv4-address:port + [IPv6-address]:port + + + + + USB Device: + + + + + Optional device identification. +Leave blank for a sensible default for the rig. +Format: + [VID[:PID[:VENDOR[:PRODUCT]]]] + + + + + Invalid audio input device + + + + + Invalid audio out device + + + + + Invalid PTT method + + + + + Invalid PTT port + + + + + + Invalid Contest Exchange + + + + + You must input a valid ARRL Field Day exchange + + + + + You must input a valid ARRL RTTY Roundup exchange + + + + + Reset Decode Highlighting + + + + + Reset all decode highlighting and priorities to default values + + + + + WSJT-X Decoded Text Font Chooser + + + + + Load Working Frequencies + + + + + + + Frequency files (*.qrg);;All files (*.*) + + + + + Replace Working Frequencies + + + + + Are you sure you want to discard your current working frequencies and replace them with the loaded ones? + + + + + Merge Working Frequencies + + + + + + + Not a valid frequencies file + + + + + Incorrect file magic + + + + + Version is too new + + + + + Contents corrupt + + + + + Save Working Frequencies + + + + + Only Save Selected Working Frequencies + + + + + Are you sure you want to save only the working frequencies that are currently selected? Click No to save all. + + + + + Reset Working Frequencies + + + + + Are you sure you want to discard your current working frequencies and replace them with default ones? + + + + + Save Directory + + + + + AzEl Directory + + + + + Rig control error + + + + + Failed to open connection to rig + + + + + Rig failure + + + + + DXLabSuiteCommanderTransceiver + + + Failed to connect to DX Lab Suite Commander + + + + + + DX Lab Suite Commander didn't respond correctly reading frequency: + + + + + DX Lab Suite Commander sent an unrecognised TX state: + + + + + DX Lab Suite Commander didn't respond correctly polling TX status: + + + + + DX Lab Suite Commander rig did not respond to PTT: + + + + + DX Lab Suite Commander didn't respond correctly polling frequency: + + + + + DX Lab Suite Commander didn't respond correctly polling TX frequency: + + + + + DX Lab Suite Commander sent an unrecognised split state: + + + + + DX Lab Suite Commander didn't respond correctly polling split status: + + + + + DX Lab Suite Commander sent an unrecognised mode: " + + + + + DX Lab Suite Commander didn't respond correctly polling mode: + + + + + DX Lab Suite Commander send command failed + + + + + + DX Lab Suite Commander failed to send command "%1": %2 + + + + + + DX Lab Suite Commander send command "%1" read reply failed: %2 + + + + + + DX Lab Suite Commander retries exhausted sending command "%1" + + + + + DX Lab Suite Commander sent an unrecognized frequency + + + + + DecodeHighlightingListView + + + &Foreground color ... + + + + + Choose %1 Foreground Color + + + + + &Unset foreground color + + + + + &Background color ... + + + + + Choose %1 Background Color + + + + + U&nset background color + + + + + &Reset this item to defaults + + + + + DecodeHighlightingModel + + + Highlight Type + + + + + Designer + + + &Delete + + + + + &Insert ... + + + + + Insert &after ... + + + + + Import Palette + + + + + + Palettes (*.pal) + + + + + Export Palette + + + + + Dialog + + + Gray time: + + + + + Directory + + + + URL Error + + + + + + Invalid URL: +"%1" + + + + + + + + + + + JSON Error + + + + + Contents file syntax error %1 at character offset %2 + + + + + Contents file top level must be a JSON array + + + + + File System Error + + + + + Failed to open "%1" +Error: %2 - %3 + + + + + Contents entries must be a JSON array + + + + + Contents entries must have a valid type + + + + + Contents entries must have a valid name + + + + + Contents entries must be JSON objects + + + + + Contents directories must be relative and within "%1" + + + + + Network Error + + + + + Authentication required + + + + + DisplayText + + + &Erase + + + + + EchoGraph + + + + Echo Graph + + + + + <html><head/><body><p>Compression factor for frequency scale</p></body></html> + + + + + Bins/Pixel + + + + + Gain + + + + + <html><head/><body><p>Echo spectrum gain</p></body></html> + + + + + Zero + + + + + <html><head/><body><p>Echo spectrum zero</p></body></html> + + + + + <html><head/><body><p>Smoothing of echo spectrum</p></body></html> + + + + + Smooth + + + + + <html><head/><body><p>Number of echo transmissions averaged</p></body></html> + + + + + N: 0 + + + + + <html><head/><body><p>Click to cycle through a sequence of colors and line widths.</p></body></html> + + + + + Colors + Cores + + + + EmulateSplitTransceiver + + + Emulated split mode requires rig to be in simplex mode + + + + + EqualizationToolsDialog::impl + + + Phase + + + + + + Freq (Hz) + + + + + Phase (Π) + + + + + Delay (ms) + + + + + Measured + + + + + Proposed + + + + + Current + + + + + Group Delay + + + + + Amplitude + + + + + Relative Power (dB) + + + + + Reference + + + + + Phase ... + + + + + Refresh + + + + + Discard Measured + + + + + ExistingNameDialog + + + Configuration to Clone From + + + + + &Source Configuration Name: + + + + + ExportCabrillo + + + Dialog + + + + + Location: + + + + + SNJ + + + + + Contest: + + + + + ARRL-RTTY + + + + + Callsign: + + + + + Category-Operator: + + + + + SINGLE-OP + + + + + Category-Transmitter: + + + + + ONE + + + + + Category-Power: + + + + + LOW + + + + + Category-Assisted: + + + + + NON-ASSISTED + + + + + Category-Band: + + + + + ALL + + + + + Claimed-Score: + + + + + Operators: + + + + + Club: + + + + + Name: + + + + + + Address: + + + + + Save Log File + + + + + Cabrillo Log (*.cbr) + + + + + Cannot open "%1" for writing: %2 + + + + + Export Cabrillo File Error + + + + + FastGraph + + + + Fast Graph + + + + + Waterfall gain + + + + + Waterfall zero + + + + + Spectrum zero + + + + + <html><head/><body><p>Set reasonable levels for gain and zero sliders.</p></body></html> + + + + + Auto Level + + + + + FoxLog::impl + + + Date & Time(UTC) + + + + + Call + + + + + Grid + + + + + Sent + + + + + Rcvd + + + + + Band + + + + + FoxLogWindow + + + Fox Log + + + + + <html><head/><body><p>Right-click here for available actions.</p></body></html> + + + + + Callers: + + + + + + + N + + + + + In progress: + + + + + Rate: + + + + + &Export ADIF ... + + + + + Export ADIF Log File + + + + + ADIF Log (*.adi) + + + + + Export ADIF File Error + + + + + Cannot open "%1" for writing: %2 + + + + + &Reset ... + + + + + Confirm Reset + + + + + Are you sure you want to erase file FoxQSO.txt and start a new Fox log? + + + + + FrequencyDialog + + + Add Frequency + + + + + IARU &Region: + + + + + &Mode: + + + + + &Frequency (MHz): + + + + + FrequencyList_v2 + + + + IARU Region + + + + + + Mode + + + + + + Frequency + + + + + + Frequency (MHz) + + + + + HRDTransceiver + + + + Failed to connect to Ham Radio Deluxe + + + + + + Failed to open file "%1": %2. + + + + + + Ham Radio Deluxe: no rig found + + + + + Ham Radio Deluxe: rig doesn't support mode + + + + + Ham Radio Deluxe: sent an unrecognised mode + + + + + Ham Radio Deluxe: item not found in %1 dropdown list + + + + + Ham Radio Deluxe: button not available + + + + + Ham Radio Deluxe didn't respond as expected + + + + + Ham Radio Deluxe: rig has disappeared or changed + + + + + Ham Radio Deluxe send command "%1" failed %2 + + + + + + + Ham Radio Deluxe: failed to write command "%1" + + + + + Ham Radio Deluxe sent an invalid reply to our command "%1" + + + + + Ham Radio Deluxe failed to reply to command "%1" %2 + + + + + + Ham Radio Deluxe retries exhausted sending command "%1" + + + + + Ham Radio Deluxe didn't respond to command "%1" as expected + + + + + HamlibTransceiver + + + + Hamlib initialisation error + + + + + Hamlib settings file error: %1 at character offset %2 + + + + + Hamlib settings file error: top level must be a JSON object + + + + + Hamlib settings file error: config must be a JSON object + + + + + Unsupported CAT type + + + + + Hamlib error: %1 while %2 + + + + + opening connection to rig + + + + + getting current frequency + + + + + getting current mode + + + + + + exchanging VFOs + + + + + + getting other VFO frequency + + + + + getting other VFO mode + + + + + setting current VFO + + + + + getting frequency + + + + + getting mode + + + + + + getting current VFO + + + + + + + + getting current VFO frequency + + + + + + + + + + setting frequency + + + + + + + + getting current VFO mode + + + + + + + + + setting current VFO mode + + + + + + setting/unsetting split mode + + + + + + setting split mode + + + + + setting split TX frequency and mode + + + + + setting split TX frequency + + + + + getting split TX VFO mode + + + + + setting split TX VFO mode + + + + + getting PTT state + + + + + setting PTT on + + + + + setting PTT off + + + + + setting a configuration item + + + + + getting a configuration item + + + + + HelpTextWindow + + + Help file error + + + + + Cannot open "%1" for reading + + + + + Error: %1 + + + + + IARURegions + + + + IARU Region + + + + + LogQSO + + + Click OK to confirm the following QSO: + + + + + Call + + + + + Start + + + + + + dd/MM/yyyy HH:mm:ss + + + + + End + + + + + Mode + + + + + Band + + + + + Rpt Sent + + + + + Rpt Rcvd + + + + + Grid + + + + + Name + + + + + Tx power + + + + + + Retain + + + + + Comments + + + + + Operator + + + + + Exch sent + + + + + Rcvd + + + + + + Invalid QSO Data + + + + + Check exchange sent and received + + + + + Check all fields + + + + + Log file error + + + + + Cannot open "%1" for append + + + + + Error: %1 + + + + + LotWUsers::impl + + + Network Error - SSL/TLS support not installed, cannot fetch: +'%1' + + + + + Network Error - Too many redirects: +'%1' + + + + + Network Error: +%1 + + + + + File System Error - Cannot commit changes to: +"%1" + + + + + File System Error - Cannot open file: +"%1" +Error(%2): %3 + + + + + File System Error - Cannot write to file: +"%1" +Error(%2): %3 + + + + + MainWindow + + + WSJT-X by K1JT + + + + + Band Activity + + + + + + UTC dB DT Freq Dr + + + + + Rx Frequency + + + + + CQ only + + + + + Enter this QSO in log + + + + + Log &QSO + + + + + Stop monitoring + + + + + &Stop + + + + + Toggle monitoring On/Off + + + + + &Monitor + + + + + <html><head/><body><p>Erase right window. Double-click to erase both windows.</p></body></html> + + + + + Erase right window. Double-click to erase both windows. + + + + + &Erase + + + + + <html><head/><body><p>Clear the accumulating message average.</p></body></html> + + + + + Clear the accumulating message average. + + + + + Clear Avg + + + + + <html><head/><body><p>Decode most recent Rx period at QSO Frequency</p></body></html> + + + + + Decode most recent Rx period at QSO Frequency + + + + + &Decode + + + + + <html><head/><body><p>Toggle Auto-Tx On/Off</p></body></html> + + + + + Toggle Auto-Tx On/Off + + + + + E&nable Tx + + + + + Stop transmitting immediately + + + + + &Halt Tx + + + + + <html><head/><body><p>Toggle a pure Tx tone On/Off</p></body></html> + + + + + Toggle a pure Tx tone On/Off + + + + + &Tune + + + + + Menus + + + + + USB dial frequency + + + + + 14.078 000 + + + + + <html><head/><body><p>30dB recommended when only noise present<br/>Green when good<br/>Red when clipping may occur<br/>Yellow when too low</p></body></html> + + + + + Rx Signal + + + + + 30dB recommended when only noise present +Green when good +Red when clipping may occur +Yellow when too low + + + + + DX Call + + + + + DX Grid + + + + + Callsign of station to be worked + + + + + Search for callsign in database + + + + + &Lookup + + + + + Locator of station to be worked + + + + + Az: 251 16553 km + + + + + Add callsign and locator to database + + + + + Add + + + + + Pwr + + + + + <html><head/><body><p>If orange or red there has been a rig control failure, click to reset and read the dial frequency. S implies split mode.</p></body></html> + + + + + If orange or red there has been a rig control failure, click to reset and read the dial frequency. S implies split mode. + + + + + ? + + + + + Adjust Tx audio level + + + + + <html><head/><body><p>Select operating band or enter frequency in MHz or enter kHz increment followed by k.</p></body></html> + + + + + Frequncy entry + + + + + Select operating band or enter frequency in MHz or enter kHz increment followed by k. + + + + + <html><head/><body><p align="center"> 2015 Jun 17 </p><p align="center"> 01:23:45 </p></body></html> + + + + + <html><head/><body><p>Check to keep Tx frequency fixed when double-clicking on decoded text.</p></body></html> + + + + + Check to keep Tx frequency fixed when double-clicking on decoded text. + + + + + Hold Tx Freq + + + + + Audio Rx frequency + + + + + + + Hz + + + + + Rx + + + + + Set Tx frequency to Rx Frequency + + + + + â–² + + + + + Frequency tolerance (Hz) + + + + + F Tol + + + + + Set Rx frequency to Tx Frequency + + + + + â–¼ + + + + + <html><head/><body><p>Synchronizing threshold. Lower numbers accept weaker sync signals.</p></body></html> + + + + + Synchronizing threshold. Lower numbers accept weaker sync signals. + + + + + Sync + + + + + <html><head/><body><p>Check to use short-format messages.</p></body></html> + + + + + Check to use short-format messages. + + + + + Sh + + + + + <html><head/><body><p>Check to enable JT9 fast modes</p></body></html> + + + + + Check to enable JT9 fast modes + + + + + + Fast + + + + + <html><head/><body><p>Check to enable automatic sequencing of Tx messages based on received messages.</p></body></html> + + + + + Check to enable automatic sequencing of Tx messages based on received messages. + + + + + Auto Seq + + + + + <html><head/><body><p>Check to call the first decoded responder to my CQ.</p></body></html> + + + + + Check to call the first decoded responder to my CQ. + + + + + Call 1st + + + + + Check to generate "@1250 (SEND MSGS)" in Tx6. + + + + + Tx6 + + + + + <html><head/><body><p>Check to Tx in even-numbered minutes or sequences, starting at 0; uncheck for odd sequences.</p></body></html> + + + + + Check to Tx in even-numbered minutes or sequences, starting at 0; uncheck for odd sequences. + + + + + Tx even/1st + + + + + <html><head/><body><p>Frequency to call CQ on in kHz above the current MHz</p></body></html> + + + + + Frequency to call CQ on in kHz above the current MHz + + + + + Tx CQ + + + + + <html><head/><body><p>Check this to call CQ on the &quot;Tx CQ&quot; frequency. Rx will be on the current frequency and the CQ message wiill include the current Rx frequency so callers know which frequency to reply on.</p><p>Not available to nonstandard callsign holders.</p></body></html> + + + + + Check this to call CQ on the "Tx CQ" frequency. Rx will be on the current frequency and the CQ message wiill include the current Rx frequency so callers know which frequency to reply on. +Not available to nonstandard callsign holders. + + + + + Rx All Freqs + + + + + <html><head/><body><p>Submode determines tone spacing; A is narrowest.</p></body></html> + + + + + Submode determines tone spacing; A is narrowest. + + + + + Submode + + + + + Fox + + + + + <html><head/><body><p>Check to monitor Sh messages.</p></body></html> + + + + + Check to monitor Sh messages. + + + + + SWL + + + + + Best S+P + + + + + <html><head/><body><p>Check this to start recording calibration data.<br/>While measuring calibration correction is disabled.<br/>When not checked you can view the calibration results.</p></body></html> + + + + + Check this to start recording calibration data. +While measuring calibration correction is disabled. +When not checked you can view the calibration results. + + + + + Measure + + + + + <html><head/><body><p>Signal report: Signal-to-noise ratio in 2500 Hz reference bandwidth (dB).</p></body></html> + + + + + Signal report: Signal-to-noise ratio in 2500 Hz reference bandwidth (dB). + + + + + Report + + + + + <html><head/><body><p>Tx/Rx or Frequency calibration sequence length</p></body></html> + + + + + Tx/Rx or Frequency calibration sequence length + + + + + s + + + + + T/R + + + + + Toggle Tx mode + + + + + Tx JT9 @ + + + + + Audio Tx frequency + + + + + + Tx + + + + + Tx# + + + + + <html><head/><body><p>Double-click on another caller to queue that call for your next QSO.</p></body></html> + + + + + Double-click on another caller to queue that call for your next QSO. + + + + + Next Call + + + + + 1 + + + + + + + Send this message in next Tx interval + + + + + Ctrl+2 + + + + + <html><head/><body><p>Send this message in next Tx interval</p><p>Double click to toggle the use of the Tx1 message to start a QSO with a station (not allowed for type 1 compound call holders)</p></body></html> + + + + + Send this message in next Tx interval +Double click to toggle the use of the Tx1 message to start a QSO with a station (not allowed for type 1 compound call holders) + + + + + Ctrl+1 + + + + + + + + Switch to this Tx message NOW + + + + + Tx &2 + + + + + Alt+2 + + + + + <html><head/><body><p>Switch to this Tx message NOW</p><p>Double click to toggle the use of the Tx1 message to start a QSO with a station (not allowed for type 1 compound call holders)</p></body></html> + + + + + Switch to this Tx message NOW +Double click to toggle the use of the Tx1 message to start a QSO with a station (not allowed for type 1 compound call holders) + + + + + Tx &1 + + + + + Alt+1 + + + + + Ctrl+6 + + + + + <html><head/><body><p>Send this message in next Tx interval</p><p>Double-click to reset to the standard 73 message</p></body></html> + + + + + Send this message in next Tx interval +Double-click to reset to the standard 73 message + + + + + Ctrl+5 + + + + + Ctrl+3 + + + + + Tx &3 + + + + + Alt+3 + + + + + <html><head/><body><p>Send this message in next Tx interval</p><p>Double-click to toggle between RRR and RR73 messages in Tx4 (not allowed for type 2 compound call holders)</p><p>RR73 messages should only be used when you are reasonably confident that no message repetitions will be required</p></body></html> + + + + + Send this message in next Tx interval +Double-click to toggle between RRR and RR73 messages in Tx4 (not allowed for type 2 compound call holders) +RR73 messages should only be used when you are reasonably confident that no message repetitions will be required + + + + + Ctrl+4 + + + + + <html><head/><body><p>Switch to this Tx message NOW</p><p>Double-click to toggle between RRR and RR73 messages in Tx4 (not allowed for type2 compound call holders)</p><p>RR73 messages should only be used when you are reasonably confident that no message repetitions will be required</p></body></html> + + + + + Switch to this Tx message NOW +Double-click to toggle between RRR and RR73 messages in Tx4 (not allowed for type2 compound call holders) +RR73 messages should only be used when you are reasonably confident that no message repetitions will be required + + + + + Tx &4 + + + + + Alt+4 + + + + + <html><head/><body><p>Switch to this Tx message NOW</p><p>Double-click to reset to the standard 73 message</p></body></html> + + + + + Switch to this Tx message NOW +Double-click to reset to the standard 73 message + + + + + Tx &5 + + + + + Alt+5 + + + + + Now + + + + + Generate standard messages for minimal QSO + + + + + Generate Std Msgs + + + + + Tx &6 + + + + + Alt+6 + + + + + + Enter a free text message (maximum 13 characters) +or select a predefined macro from the dropdown list. +Press ENTER to add the current text to the predefined +list. The list can be maintained in Settings (F2). + + + + + Queue up the next Tx message + + + + + Next + + + + + 2 + + + + + Calling CQ + + + + + Generate a CQ message + + + + + + + CQ + + + + + Generate message with RRR + + + + + RRR + + + + + Generate message with report + + + + + dB + + + + + Answering CQ + + + + + Generate message for replying to a CQ + + + + + + Grid + + + + + Generate message with R+report + + + + + R+dB + + + + + Generate message with 73 + + + + + 73 + + + + + Send this standard (generated) message + + + + + Gen msg + + + + + Send this free-text message (max 13 characters) + + + + + Free msg + + + + + 3 + + + + + Max dB + + + + + CQ AF + + + + + CQ AN + + + + + CQ AS + + + + + CQ EU + + + + + CQ NA + + + + + CQ OC + + + + + CQ SA + + + + + CQ 0 + + + + + CQ 1 + + + + + CQ 2 + + + + + CQ 3 + + + + + CQ 4 + + + + + CQ 5 + + + + + CQ 6 + + + + + CQ 7 + + + + + CQ 8 + + + + + CQ 9 + + + + + Reset + + + + + N List + + + + + N Slots + + + + + + Random + + + + + Call + + + + + S/N (dB) + + + + + Distance + + + + + More CQs + + + + + Percentage of 2-minute sequences devoted to transmitting. + + + + + % + + + + + Tx Pct + + + + + Band Hopping + + + + + Choose bands and times of day for band-hopping. + + + + + Schedule ... + + + + + Upload decoded messages to WSPRnet.org. + + + + + Upload spots + + + + + <html><head/><body><p>6 digit locators cause 2 different mesages to be sent, the second contains the full locator but only a hashed callsign, other stations must have decoded the first once before they can decode your call in the second. Check this option to only send 4 digit locators if it will avoid the two message protocol.</p></body></html> + + + + + 6 digit locators cause 2 different mesages to be sent, the second contains the full locator but only a hashed callsign, other stations must have decoded the first once before they can decode your call in the second. Check this option to only send 4 digit locators if it will avoid the two message protocol. + + + + + Prefer type 1 messages + + + + + No own call decodes + + + + + Transmit during the next 2-minute sequence. + + + + + Tx Next + + + + + Set Tx power in dBm (dB above 1 mW) as part of your WSPR message. + + + + + File + + + + + View + + + + + Decode + + + + + Save + + + + + Help + + + + + Mode + + + + + Configurations + + + + + Tools + + + + + Exit + + + + + Configuration + + + + + F2 + + + + + About WSJT-X + + + + + Waterfall + + + + + Open + + + + + Ctrl+O + + + + + Open next in directory + + + + + Decode remaining files in directory + + + + + Shift+F6 + + + + + Delete all *.wav && *.c2 files in SaveDir + + + + + None + + + + + Save all + + + + + Online User Guide + + + + + Keyboard shortcuts + + + + + Special mouse commands + + + + + JT9 + + + + + Save decoded + + + + + Normal + + + + + Deep + + + + + Monitor OFF at startup + + + + + Erase ALL.TXT + + + + + Erase wsjtx_log.adi + + + + + Convert mode to RTTY for logging + + + + + Log dB reports to Comments + + + + + Prompt me to log QSO + + + + + Blank line between decoding periods + + + + + Clear DX Call and Grid after logging + + + + + Display distance in miles + + + + + Double-click on call sets Tx Enable + + + + + + F7 + + + + + Tx disabled after sending 73 + + + + + Runaway Tx watchdog + + + + + Allow multiple instances + + + + + Tx freq locked to Rx freq + + + + + JT65 + + + + + JT9+JT65 + + + + + Tx messages to Rx Frequency window + + + + + Gray1 + + + + + Show DXCC entity and worked B4 status + + + + + Astronomical data + + + + + List of Type 1 prefixes and suffixes + + + + + Settings... + + + + + Local User Guide + + + + + Open log directory + + + + + JT4 + + + + + Message averaging + + + + + Enable averaging + + + + + Enable deep search + + + + + WSPR + + + + + Echo Graph + + + + + F8 + + + + + Echo + + + + + EME Echo mode + + + + + ISCAT + + + + + Fast Graph + + + + + F9 + + + + + &Download Samples ... + + + + + <html><head/><body><p>Download sample audio files demonstrating the various modes.</p></body></html> + + + + + MSK144 + + + + + QRA64 + + + + + Release Notes + + + + + Enable AP for DX Call + + + + + FreqCal + + + + + Measure reference spectrum + + + + + Measure phase response + + + + + Erase reference spectrum + + + + + Execute frequency calibration cycle + + + + + Equalization tools ... + + + + + WSPR-LF + + + + + Experimental LF/MF mode + + + + + FT8 + + + + + + Enable AP + + + + + Solve for calibration parameters + + + + + Copyright notice + + + + + Shift+F1 + + + + + Fox log + + + + + FT8 DXpedition Mode User Guide + + + + + Reset Cabrillo log ... + + + + + Color highlighting scheme + + + + + Contest Log + + + + + Export Cabrillo log ... + + + + + Quick-Start Guide to WSJT-X 2.0 + + + + + Contest log + + + + + Erase WSPR hashtable + + + + + FT4 + + + + + Rig Control Error + + + + + Do you want to reconfigure the radio interface? + + + + + Error Scanning ADIF Log + + + + + Scanned ADIF log, %1 worked before records created + + + + + Error Loading LotW Users Data + + + + + Error Writing WAV File + + + + + Configurations... + + + + + Error Killing jt9.exe Process + + + + + KillByName return code: %1 + + + + + Error removing "%1" + + + + + Click OK to retry + + + + + + Improper mode + + + + + + File Open Error + + + + + + + + + Cannot open "%1" for append: %2 + + + + + Error saving c2 file + + + + + Error in Sound Input + + + + + Error in Sound Output + + + + + Change Operator + + + + + New operator: + + + + + Status File Error + + + + + + Cannot open "%1" for writing: %2 + + + + + Subprocess Error + + + + + Subprocess failed with exit code %1 + + + + + + Running: %1 +%2 + + + + + Subprocess error + + + + + Reference spectrum saved + + + + + Invalid data in fmt.all at line %1 + + + + + Good Calibration Solution + + + + + <pre>%1%L2 ±%L3 ppm +%4%L5 ±%L6 Hz + +%7%L8 +%9%L10 Hz</pre> + + + + + Delete Calibration Measurements + + + + + The "fmt.all" file will be renamed as "fmt.bak" + + + + + If you make fair use of any part of WSJT-X under terms of the GNU General Public License, you must display the following copyright notice prominently in your derivative work: + +"The algorithms, source code, look-and-feel of WSJT-X and related programs, and protocol specifications for the modes FSK441, FT8, JT4, JT6M, JT9, JT65, JTMS, QRA64, ISCAT, MSK144 are Copyright (C) 2001-2019 by one or more of the following authors: Joseph Taylor, K1JT; Bill Somerville, G4WJS; Steven Franke, K9AN; Nico Palermo, IV3NWV; Greg Beam, KI7MT; Michael Black, W9MDB; Edson Pereira, PY2SDR; Philip Karn, KA9Q; and other members of the WSJT Development Group." + + + + + No data read from disk. Wrong file format? + + + + + Confirm Delete + + + + + Are you sure you want to delete all *.wav and *.c2 files in "%1"? + + + + + Keyboard Shortcuts + + + + + Special Mouse Commands + + + + + No more files to open. + + + + + Please choose another Tx frequency. WSJT-X will not knowingly transmit another mode in the WSPR sub-band on 30m. + + + + + WSPR Guard Band + + + + + Please choose another dial frequency. WSJT-X will not operate in Fox mode in the standard FT8 sub-bands. + + + + + Fox Mode warning + + + + + Should you switch to ARRL Field Day mode? + + + + + Should you switch to RTTY contest mode? + + + + + + + + Add to CALL3.TXT + + + + + Please enter a valid grid locator + + + + + Cannot open "%1" for read/write: %2 + + + + + %1 +is already in CALL3.TXT, do you wish to replace it? + + + + + Warning: DX Call field is empty. + + + + + Log file error + + + + + Cannot open "%1" + + + + + Error sending log to N1MM + + + + + Write returned "%1" + + + + + + + Confirm Erase + + + + + Are you sure you want to erase file ALL.TXT? + + + + + + Confirm Reset + + + + + Are you sure you want to erase your contest log? + + + + + Doing this will remove all QSO records for the current contest. They will be kept in the ADIF log file but will not be available for export in your Cabrillo log. + + + + + Cabrillo Log saved + + + + + Are you sure you want to erase file wsjtx_log.adi? + + + + + Are you sure you want to erase the WSPR hashtable? + + + + + VHF features warning + + + + + Tune digital gain + + + + + Transmit digital gain + + + + + Prefixes + + + + + Network Error + + + + + Error: %1 +UDP server %2:%3 + + + + + File Error + + + + + Phase Training Disabled + + + + + Phase Training Enabled + + + + + + Log File Error + + + + + Are you sure you want to clear the QSO queues? + + + + + MessageAveraging + + + + Message Averaging + + + + + UTC Sync DT Freq + + + + + Modes + + + + Mode + + + + + MultiSettings + + + Default + + + + + MultiSettings::impl + + + &Switch To + + + + + &Clone + + + + + Clone &Into ... + + + + + R&eset + + + + + &Rename ... + + + + + &Delete + + + + + Clone Into Configuration + + + + + Confirm overwrite of all values for configuration "%1" with values from "%2"? + + + + + Reset Configuration + + + + + Confirm reset to default values for configuration "%1"? + + + + + Delete Configuration + + + + + Confirm deletion of configuration "%1"? + + + + + NameDialog + + + New Configuration Name + + + + + Old name: + + + + + &New name: + + + + + OmniRigTransceiver + + + OmniRig: unrecognized mode + + + + + Failed to start OmniRig COM server + + + + + + OmniRig: don't know how to set rig frequency + + + + + + OmniRig: timeout waiting for update from rig + + + + + OmniRig COM/OLE error: %1 at %2: %3 (%4) + + + + + PollingTransceiver + + + Unexpected rig error + + + + + QObject + + + Invalid rig name - \ & / not allowed + + + + + User Defined + + + + + Failed to open LotW users CSV file: '%1' + + + + + OOB + + + + + Too many colours in palette. + + + + + Error reading waterfall palette file "%1:%2" too many colors. + + + + + Error reading waterfall palette file "%1:%2" invalid triplet. + + + + + Error reading waterfall palette file "%1:%2" invalid color. + + + + + Error opening waterfall palette file "%1": %2. + + + + + Error writing waterfall palette file "%1": %2. + + + + + RemoteFile + + + + + + + + File System Error + + + + + Cannot rename file: +"%1" +to: "%2" +Error(%3): %4 + + + + + Cannot delete file: +"%1" + + + + + + + Network Error + + + + + Too many redirects: %1 + + + + + Redirect not followed: %1 + + + + + Cannot commit changes to: +"%1" + + + + + Cannot open file: +"%1" +Error(%2): %3 + + + + + Cannot make path: +"%1" + + + + + Cannot write to file: +"%1" +Error(%2): %3 + + + + + SampleDownloader::impl + + + Download Samples + + + + + Input Error + + + + + Invalid URL format + + + + + SoundInput + + + An error opening the audio input device has occurred. + + + + + An error occurred during read from the audio input device. + + + + + Audio data not being fed to the audio input device fast enough. + + + + + Non-recoverable error, audio input device not usable at this time. + + + + + Requested input audio format is not valid. + + + + + Requested input audio format is not supported on device. + + + + + Failed to initialize audio sink device + + + + + Idle + + + + + Receiving + + + + + Suspended + + + + + Interrupted + + + + + Error + + + + + Stopped + + + + + SoundOutput + + + An error opening the audio output device has occurred. + + + + + An error occurred during write to the audio output device. + + + + + Audio data not being fed to the audio output device fast enough. + + + + + Non-recoverable error, audio output device not usable at this time. + + + + + Requested output audio format is not valid. + + + + + Requested output audio format is not supported on device. + + + + + Idle + + + + + Sending + + + + + Suspended + + + + + Interrupted + + + + + Error + + + + + Stopped + + + + + StationDialog + + + Add Station + + + + + &Band: + + + + + &Offset (MHz): + + + + + &Antenna: + + + + + StationList::impl + + + Band name + + + + + Frequency offset + + + + + Antenna description + + + + + Band + + + + + Offset + + + + + Antenna Description + + + + + TransceiverBase + + + Unexpected rig error + + + + + WideGraph + + + Dialog + + + + + Controls + + + + + Spectrum gain + + + + + Palette + + + + + <html><head/><body><p>Enter definition for a new color palette.</p></body></html> + + + + + Adjust... + + + + + Waterfall gain + + + + + <html><head/><body><p>Set fractional size of spectrum in this window.</p></body></html> + + + + + % + + + + + Spec + + + + + <html><head/><body><p>Flatten spectral baseline over the full displayed interval.</p></body></html> + + + + + Flatten + + + + + <html><head/><body><p>Compute and save a reference spectrum. (Not yet fully implemented.)</p></body></html> + + + + + Ref Spec + + + + + Smoothing of Linear Average spectrum + + + + + Smooth + + + + + Compression factor for frequency scale + + + + + Bins/Pixel + + + + + Select waterfall palette + + + + + <html><head/><body><p>Select data for spectral display</p></body></html> + + + + + Current + + + + + Cumulative + + + + + Linear Avg + + + + + Reference + + + + + <html><head/><body><p>Frequency at left edge of waterfall</p></body></html> + + + + + Hz + + + + + Start + + + + + <html><head/><body><p>Decode JT9 only above this frequency</p></body></html> + + + + + JT9 + + + + + JT65 + + + + + Number of FFTs averaged (controls waterfall scrolling rate) + + + + + N Avg + + + + + Waterfall zero + + + + + Spectrum zero + + + + + Wide Graph + + + + + + Read Palette + + + + + configuration_dialog + + + Settings + + + + + Genera&l + + + + + General station details and settings. + + + + + Station Details + + + + + My C&all: + + + + + Station callsign. + + + + + M&y Grid: + + + + + <html><head/><body><p>Maidenhead locator, preferably 6 characters.</p></body></html> + + + + + Check to allow grid changes from external programs + + + + + AutoGrid + + + + + IARU Region: + + + + + <html><head/><body><p>Select your IARU region.</p></body></html> + + + + + Message generation for type 2 compound callsign holders: + + + + + <html><head/><body><p>Type 2 compound callsigns are those with prefixes or suffixes not included in the allowed shortlist (See Help-&gt;Add-on prefixes and suffixes).</p><p>This option determines which generated messages should contain your full type 2 compound call sign rather than your base callsign. It only applies if you have a type 2 compound callsign.</p><p>This option controls the way the messages that are used to answer CQ calls are generated. Generated messages 6 (CQ) and 5 (73) will always contain your full callsign. The JT65 and JT9 protocols allow for some standard messages with your full call at the expense of another piece of information such as the DX call or your locator.</p><p>Choosing message 1 omits the DX callsign which may be an issue when replying to CQ calls. Choosing message 3 also omits the DX callsign and many versions of this and other software will not extract the report. Choosing neither means that your full callsign only goes in your message 5 (73) so your QSO partner may log the wrong callsign.</p><p>None of these options are perfect, message 3 is usually best but be aware your QSO partner may not log the report you send them.</p></body></html> + + + + + Full call in Tx1 + + + + + Full call in Tx3 + + + + + Full call in Tx5 only + + + + + Display + + + + + Show outgoing transmitted messages in the Rx frequency window. + + + + + &Tx messages to Rx frequency window + + + + + Show if decoded stations are new DXCC entities or worked before. + + + + + Show &DXCC, grid, and worked-before status + + + + + <html><head/><body><p>Check to have decodes for a new period start at the top of the Band Activity window and not scroll off the top when the window is full.</p><p>This is to aid selecting decodes to double-click while decoding is still in progress. Use the Band Activity vertical scroll bar to reveal decodes past the bottom of the window.</p></body></html> + + + + + Start new period decodes at top + + + + + Show principal prefix instead of country name + + + + + Set the font characteristics for the application. + + + + + Font... + + + + + Set the font characteristics for the Band Activity and Rx Frequency areas. + + + + + Decoded Text Font... + + + + + Include a separator line between periods in the band activity window. + + + + + &Blank line between decoding periods + + + + + Show distance to DX station in miles rather than kilometers. + + + + + Display dista&nce in miles + + + + + Behavior + + + + + Decode after EME delay + + + + + Tx watchdog: + + + + + <html><head/><body><p>Number of minutes before unattended transmissions are aborted</p></body></html> + + + + + Disabled + + + + + minutes + + + + + Enable VHF/UHF/Microwave features + + + + + Single decode + + + + + <html><head/><body><p>Some rigs are not able to process CAT commands while transmitting. This means that if you are operating in split mode you may have to uncheck this option.</p></body></html> + + + + + Allow Tx frequency changes while transmitting + + + + + Don't start decoding until the monitor button is clicked. + + + + + Mon&itor off at startup + + + + + <html><head/><body><p>Check this if you wish to automatically return to the last monitored frequency when monitor is enabled, leave it unchecked if you wish to have the current rig frequency maintained.</p></body></html> + + + + + Monitor returns to last used frequency + + + + + Alternate F1-F6 bindings + + + + + Turns off automatic transmissions after sending a 73 or any other free +text message. + + + + + Di&sable Tx after sending 73 + + + + + Send a CW ID after every 73 or free text message. + + + + + CW ID a&fter 73 + + + + + Periodic CW ID Inter&val: + + + + + Send a CW ID periodically every few minutes. +This might be required under your countries licence regulations. +It will not interfere with other users as it is always sent in the +quiet period when decoding is done. + + + + + Automatic transmission mode. + + + + + Doubl&e-click on call sets Tx enable + + + + + Calling CQ forces Call 1st + + + + + &Radio + + + + + Radio interface configuration settings. + + + + + Settings that control your CAT interface. + + + + + CAT Control + + + + + + Port: + + + + + Serial port used for CAT control. + + + + + Serial Port Parameters + + + + + Baud Rate: + + + + + Serial port data rate which must match the setting of your radio. + + + + + 1200 + + + + + 2400 + + + + + 4800 + + + + + 9600 + + + + + 19200 + + + + + 38400 + + + + + 57600 + + + + + 115200 + + + + + <html><head/><body><p>Number of data bits used to communicate with your radio's CAT interface (usually eight).</p></body></html> + + + + + Data Bits + + + + + D&efault + + + + + Se&ven + + + + + E&ight + + + + + <html><head/><body><p>Number of stop bits used when communicating with your radio's CAT interface</p><p>(consult you radio's manual for details).</p></body></html> + + + + + Stop Bits + + + + + + Default + + + + + On&e + + + + + T&wo + + + + + <html><head/><body><p>Flow control protocol used between this computer and your radio's CAT interface (usually &quot;None&quot; but some require &quot;Hardware&quot;).</p></body></html> + + + + + Handshake + + + + + &None + + + + + Software flow control (very rare on CAT interfaces). + + + + + XON/XOFF + + + + + Flow control using the RTS and CTS RS-232 control lines +not often used but some radios have it as an option and +a few, particularly some Kenwood rigs, require it). + + + + + &Hardware + + + + + Special control of CAT port control lines. + + + + + Force Control Lines + + + + + + High + + + + + + Low + + + + + DTR: + + + + + RTS: + + + + + How this program activates the PTT on your radio + + + + + PTT Method + + + + + <html><head/><body><p>No PTT activation, instead the radio's automatic VOX is used to key the transmitter.</p><p>Use this if you have no radio interface hardware.</p></body></html> + + + + + VO&X + + + + + <html><head/><body><p>Use the RS-232 DTR control line to toggle your radio's PTT, requires hardware to inteface the line.</p><p>Some commercial interface units also use this method.</p><p>The DTR control line of the CAT serial port may be used for this or a DTR control line on a different serial port may be used.</p></body></html> + + + + + &DTR + + + + + Some radios support PTT via CAT commands, +use this option if your radio supports it and you have no +other hardware interface for PTT. + + + + + C&AT + + + + + <html><head/><body><p>Use the RS-232 RTS control line to toggle your radio's PTT, requires hardware to inteface the line.</p><p>Some commercial interface units also use this method.</p><p>The RTS control line of the CAT serial port may be used for this or a RTS control line on a different serial port may be used. Note that this option is not available on the CAT serial port when hardware flow control is used.</p></body></html> + + + + + R&TS + + + + + <html><head/><body><p>Select the RS-232 serial port utilised for PTT control, this option is available when DTR or RTS is selected above as a transmit method.</p><p>This port can be the same one as the one used for CAT control.</p><p>For some interface types the special value CAT may be chosen, this is used for non-serial CAT interfaces that can control serial port control lines remotely (OmniRig for example).</p></body></html> + + + + + Modulation mode selected on radio. + + + + + Mode + + + + + <html><head/><body><p>USB is usually the correct modulation mode,</p><p>unless the radio has a special data or packet mode setting</p><p>for AFSK operation.</p></body></html> + + + + + US&B + + + + + Don't allow the program to set the radio mode +(not recommended but use if the wrong mode +or bandwidth is selected). + + + + + + None + + + + + If this is availabe then it is usually the correct mode for this program. + + + + + Data/P&kt + + + + + Some radios can select the audio input using a CAT command, +this setting allows you to select which audio input will be used +(if it is available then generally the Rear/Data option is best). + + + + + Transmit Audio Source + + + + + Rear&/Data + + + + + &Front/Mic + + + + + Rig: + + + + + Poll Interval: + + + + + <html><head/><body><p>Interval to poll rig for status. Longer intervals will mean that changes to the rig will take longer to be detected.</p></body></html> + + + + + s + + + + + <html><head/><body><p>Attempt to connect to the radio with these settings.</p><p>The button will turn green if the connection is successful or red if there is a problem.</p></body></html> + + + + + Test CAT + + + + + Attempt to activate the transmitter. +Click again to deactivate. Normally no power should be +output since there is no audio being generated at this time. +Check that any Tx indication on your radio and/or your +radio interface behave as expected. + + + + + Test PTT + + + + + Split Operation + + + + + Fake It + + + + + Rig + + + + + A&udio + + + + + Audio interface settings + + + + + Souncard + + + + + Soundcard + + + + + Select the audio CODEC to use for transmitting. +If this is your default device for system sounds then +ensure that all system sounds are disabled otherwise +you will broadcast any systems sounds generated during +transmitting periods. + + + + + Select the audio CODEC to use for receiving. + + + + + &Input: + + + + + Select the channel to use for receiving. + + + + + + Mono + + + + + + Left + + + + + + Right + + + + + + Both + + + + + Select the audio channel used for transmission. +Unless you have multiple radios connected on different +channels; then you will usually want to select mono or +both here. + + + + + Ou&tput: + + + + + + Save Directory + + + + + Loc&ation: + + + + + Path to which .WAV files are saved. + + + + + + TextLabel + + + + + Click to select a different save directory for .WAV files. + + + + + S&elect + + + + + + AzEl Directory + + + + + Location: + + + + + Select + + + + + Power Memory By Band + + + + + Remember power settings by band + + + + + Enable power memory during transmit + + + + + Transmit + + + + + Enable power memory during tuning + + + + + Tune + + + + + Tx &Macros + + + + + Canned free text messages setup + + + + + &Add + + + + + &Delete + + + + + Drag and drop items to rearrange order +Right click for item specific actions +Click, SHIFT+Click and, CRTL+Click to select items + + + + + Reportin&g + + + + + Reporting and logging settings + + + + + Logging + + + + + The program will pop up a partially completed Log QSO dialog when you send a 73 or free text message. + + + + + Promp&t me to log QSO + + + + + Op Call: + + + + + Some logging programs will not accept the type of reports +saved by this program. +Check this option to save the sent and received reports in the +comments field. + + + + + d&B reports to comments + + + + + Check this option to force the clearing of the DX Call +and DX Grid fields when a 73 or free text message is sent. + + + + + Clear &DX call and grid after logging + + + + + <html><head/><body><p>Some logging programs will not accept WSJT-X mode names.</p></body></html> + + + + + Con&vert mode to RTTY + + + + + <html><head/><body><p>The callsign of the operator, if different from the station callsign.</p></body></html> + + + + + <html><head/><body><p>Check to have QSOs logged automatically, when complete.</p></body></html> + + + + + Log automatically (contesting only) + + + + + Network Services + + + + + The program can send your station details and all +decoded signals as spots to the http://pskreporter.info web site. +This is used for reverse beacon analysis which is very useful +for assessing propagation and system performance. + + + + + Enable &PSK Reporter Spotting + + + + + UDP Server + + + + + UDP Server: + + + + + <html><head/><body><p>Optional hostname of network service to receive decodes.</p><p>Formats:</p><ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">hostname</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">IPv4 address</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">IPv6 address</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">IPv4 multicast group address</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">IPv6 multicast group address</li></ul><p>Clearing this field will disable the broadcasting of UDP status updates.</p></body></html> + + + + + UDP Server port number: + + + + + <html><head/><body><p>Enter the service port number of the UDP server that WSJT-X should send updates to. If this is zero no updates will be broadcast.</p></body></html> + + + + + <html><head/><body><p>With this enabled WSJT-X will accept certain requests back from a UDP server that receives decode messages.</p></body></html> + + + + + Accept UDP requests + + + + + <html><head/><body><p>Indicate acceptance of an incoming UDP request. The effect of this option varies depending on the operating system and window manager, its intent is to notify the acceptance of an incoming UDP request even if this application is minimized or hidden.</p></body></html> + + + + + Notify on accepted UDP request + + + + + <html><head/><body><p>Restore the window from minimized if an UDP request is accepted.</p></body></html> + + + + + Accepted UDP request restores window + + + + + Secondary UDP Server (deprecated) + + + + + <html><head/><body><p>When checked, WSJT-X will broadcast a logged contact in ADIF format to the configured hostname and port. </p></body></html> + + + + + Enable logged contact ADIF broadcast + + + + + Server name or IP address: + + + + + <html><head/><body><p>Optional host name of N1MM Logger+ program to receive ADIF UDP broadcasts. This is usually 'localhost' or ip address 127.0.0.1</p><p>Formats:</p><ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">hostname</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">IPv4 address</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">IPv6 address</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">IPv4 multicast group address</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">IPv6 multicast group address</li></ul><p>Clearing this field will disable broadcasting of ADIF information via UDP.</p></body></html> + + + + + Server port number: + + + + + <html><head/><body><p>Enter the port number that WSJT-X should use for UDP broadcasts of ADIF log information. For N1MM Logger+, this value should be 2333. If this is zero, no updates will be broadcast.</p></body></html> + + + + + Frequencies + + + + + Default frequencies and band specific station details setup + + + + + <html><head/><body><p>See &quot;Frequency Calibration&quot; in the WSJT-X User Guide for details of how to determine these parameters for your radio.</p></body></html> + + + + + Frequency Calibration + + + + + Slope: + + + + + ppm + + + + + Intercept: + + + + + Hz + + + + + Working Frequencies + + + + + <html><head/><body><p>Right click to maintain the working frequencies list.</p></body></html> + + + + + Station Information + + + + + Items may be edited. +Right click for insert and delete options. + + + + + Colors + Cores + + + + Decode Highlightling + + + + + <html><head/><body><p>Enable or disable using the check boxes and right-click an item to change or unset the foreground color, background color, or reset the item to default values. Drag and drop the items to change their priority, higher in the list is higher in priority.</p><p>Note that each foreground or background color may be either set or unset, unset means that it is not allocated for that item's type and lower priority items may apply.</p></body></html> + + + + + <html><head/><body><p>Push to reset all highlight items above to default values and priorities.</p></body></html> + + + + + Reset Highlighting + + + + + <html><head/><body><p>Check to indicate new DXCC entities, grid squares, and callsigns per mode.</p></body></html> + + + + + Highlight by Mode + + + + + <html><head/><body><p>Click to scan the wsjtx_log.adi ADIF file again for worked before information</p></body></html> + + + + + Rescan ADIF Log + + + + + Include extra WAE entities + + + + + <html><head/><body><p>Controls for Logbook of the World user lookup.</p></body></html> + + + + + Logbook of the World User Validation + + + + + Users CSV file URL: + + + + + <html><head/><body><p>URL of the ARRL LotW user's last upload dates and times data file which is used to highlight decodes from stations that are known to upload their log file to LotW.</p></body></html> + + + + + https://lotw.arrl.org/lotw-user-activity.csv + + + + + <html><head/><body><p>Push this button to fetch the latest LotW user's upload date and time data file.</p></body></html> + + + + + Fetch Now + + + + + Age of last upload less than: + + + + + <html><head/><body><p>Adjust this spin box to set the age threshold of LotW user's last upload date that is accepted as a current LotW user.</p></body></html> + + + + + days + + + + + Advanced + + + + + <html><head/><body><p>User-selectable parameters for JT65 VHF/UHF/Microwave decoding.</p></body></html> + + + + + JT65 VHF/UHF/Microwave decoding parameters + + + + + Random erasure patterns: + + + + + <html><head/><body><p>Maximum number of erasure patterns for stochastic soft-decision Reed Solomon decoder is 10^(n/2).</p></body></html> + + + + + Aggressive decoding level: + + + + + <html><head/><body><p>Higher levels will increase the probability of decoding, but will also increase probability of a false decode.</p></body></html> + + + + + Two-pass decoding + + + + + Special operating activity: Generation of FT4, FT8, and MSK144 messages + + + + + <html><head/><body><p>FT8 DXpedition mode: Hound operator calling the DX.</p></body></html> + + + + + Hound + + + + + <html><head/><body><p>North American VHF/UHF/Microwave contests and others in which a 4-character grid locator is the required exchange.</p></body></html> + + + + + NA VHF Contest + + + + + <html><head/><body><p>FT8 DXpedition mode: Fox (DXpedition) operator.</p></body></html> + + + + + Fox + + + + + <html><head/><body><p>European VHF+ contests requiring a signal report, serial number, and 6-character locator.</p></body></html> + + + + + EU VHF Contest + + + + + + <html><head/><body><p>ARRL RTTY Roundup and similar contests. Exchange is US state, Canadian province, or &quot;DX&quot;.</p></body></html> + + + + + RTTY Roundup messages + + + + + RTTY RU Exch: + + + + + NJ + + + + + + <html><head/><body><p>ARRL Field Day exchange: number of transmitters, Class, and ARRL/RAC section or &quot;DX&quot;.</p></body></html> + + + + + ARRL Field Day + + + + + FD Exch: + + + + + 6A SNJ + + + + + Miscellaneous + + + + + Degrade S/N of .wav file: + + + + + + For offline sensitivity tests + + + + + dB + + + + + Receiver bandwidth: + + + + + Hz + + + + + Tx delay: + + + + + Minimum delay between assertion of PTT and start of Tx audio. + + + + + s + + + + + Tone spacing + + + + + <html><head/><body><p>Generate Tx audio with twice the normal tone spacing. Intended for special LF/MF transmitters that use a divide-by-2 before generating RF.</p></body></html> + + + + + x 2 + + + + + <html><head/><body><p>Generate Tx audio with four times the normal tone spacing. Intended for special LF/MF transmitters that use a divide-by-4 before generating RF.</p></body></html> + + + + + x 4 + + + + + Waterfall spectra + + + + + Low sidelobes + + + + + Most sensitive + + + + + <html><head/><body><p>Discard (Cancel) or apply (OK) configuration changes including</p><p>resetting the radio interface and applying any soundcard changes</p></body></html> + + + + + main + + + + Fatal error + + + + + + Unexpected fatal error + + + + + Where <rig-name> is for multi-instance support. + + + + + rig-name + + + + + Where <configuration> is an existing one. + + + + + configuration + + + + + Writable files in test location. Use with caution, for testing only. + + + + + Command line error + + + + + Command line help + + + + + Application version + + + + + Another instance may be running + + + + + try to remove stale lock file? + + + + + Failed to create a temporary directory + + + + + + Path: "%1" + + + + + Failed to create a usable temporary directory + + + + + Another application may be locking the directory + + + + + Failed to create data directory + + + + + path: "%1" + + + + + Shared memory error + + + + + Unable to create shared memory segment + + + + + wf_palette_design_dialog + + + Palette Designer + + + + + <html><head/><body><p>Double click a color to edit it.</p><p>Right click to insert or delete colors.</p><p>Colors at the top represent weak signals</p><p>and colors at the bottom represent strong</p><p>signals. You can have up to 256 colors.</p></body></html> + + + + diff --git a/widgets/AbstractLogWindow.cpp b/widgets/AbstractLogWindow.cpp index efa1e60f1..bbe07a846 100644 --- a/widgets/AbstractLogWindow.cpp +++ b/widgets/AbstractLogWindow.cpp @@ -2,6 +2,7 @@ #include #include +#include #include #include #include @@ -16,7 +17,10 @@ #include "pimpl_impl.hpp" class AbstractLogWindow::impl final + : public QObject { + Q_OBJECT + public: impl (AbstractLogWindow * self, QString const& settings_key, QSettings * settings , Configuration const * configuration) @@ -38,6 +42,9 @@ public: FontOverrideModel model_; }; +#include "moc_AbstractLogWindow.cpp" +#include "AbstractLogWindow.moc" + namespace { bool row_is_higher (QModelIndex const& lhs, QModelIndex const& rhs) diff --git a/widgets/AbstractLogWindow.hpp b/widgets/AbstractLogWindow.hpp index 581212d82..476ff62f3 100644 --- a/widgets/AbstractLogWindow.hpp +++ b/widgets/AbstractLogWindow.hpp @@ -19,6 +19,8 @@ class QFont; class AbstractLogWindow : public QWidget { + Q_OBJECT + public: AbstractLogWindow (QString const& settings_key, QSettings * settings , Configuration const * configuration diff --git a/widgets/DecodeHighlightingListView.cpp b/widgets/DecodeHighlightingListView.cpp index cc5ea5d2e..cfb14fc5d 100644 --- a/widgets/DecodeHighlightingListView.cpp +++ b/widgets/DecodeHighlightingListView.cpp @@ -6,6 +6,8 @@ #include "models/DecodeHighlightingModel.hpp" #include "MessageBox.hpp" +#include "moc_DecodeHighlightingListView.cpp" + DecodeHighlightingListView::DecodeHighlightingListView (QWidget * parent) : QListView {parent} { diff --git a/widgets/DecodeHighlightingListView.hpp b/widgets/DecodeHighlightingListView.hpp index 86aa86f4f..76fd507b7 100644 --- a/widgets/DecodeHighlightingListView.hpp +++ b/widgets/DecodeHighlightingListView.hpp @@ -16,6 +16,8 @@ class QWidget; class DecodeHighlightingListView final : public QListView { + Q_OBJECT + public: explicit DecodeHighlightingListView (QWidget * parent = nullptr); diff --git a/widgets/ExportCabrillo.cpp b/widgets/ExportCabrillo.cpp index 0e61f0f08..5fb54c7dc 100644 --- a/widgets/ExportCabrillo.cpp +++ b/widgets/ExportCabrillo.cpp @@ -11,6 +11,7 @@ #include "models/CabrilloLog.hpp" #include "ui_ExportCabrillo.h" +#include "moc_ExportCabrillo.cpp" ExportCabrillo::ExportCabrillo (QSettings * settings, Configuration const * configuration , CabrilloLog const * log, QWidget * parent) diff --git a/widgets/ExportCabrillo.h b/widgets/ExportCabrillo.h index fbc9294cd..0dfbf6754 100644 --- a/widgets/ExportCabrillo.h +++ b/widgets/ExportCabrillo.h @@ -15,6 +15,8 @@ namespace Ui { class ExportCabrillo final : public QDialog { + Q_OBJECT + public: explicit ExportCabrillo (QSettings *, Configuration const * , CabrilloLog const *, QWidget * parent = nullptr); diff --git a/widgets/HelpTextWindow.cpp b/widgets/HelpTextWindow.cpp index 98c2b38e3..d24a87a51 100644 --- a/widgets/HelpTextWindow.cpp +++ b/widgets/HelpTextWindow.cpp @@ -9,6 +9,8 @@ #include "qt_helpers.hpp" #include "widgets/MessageBox.hpp" +#include "moc_HelpTextWindow.cpp" + HelpTextWindow::HelpTextWindow (QString const& title, QString const& file_name, QFont const& font, QWidget * parent) : QLabel {parent, Qt::WindowCloseButtonHint | Qt::WindowMinimizeButtonHint} { diff --git a/widgets/HelpTextWindow.hpp b/widgets/HelpTextWindow.hpp index c5793ae97..5cc5a6dca 100644 --- a/widgets/HelpTextWindow.hpp +++ b/widgets/HelpTextWindow.hpp @@ -9,6 +9,8 @@ class QString; class HelpTextWindow final : public QLabel { + Q_OBJECT + public: HelpTextWindow (QString const& title, QString const& file_name, QFont const& = QFont {}, QWidget * parent = nullptr); }; diff --git a/widgets/messageaveraging.cpp b/widgets/messageaveraging.cpp index fce022842..21f7b07ca 100644 --- a/widgets/messageaveraging.cpp +++ b/widgets/messageaveraging.cpp @@ -8,6 +8,8 @@ #include "qt_helpers.hpp" #include "ui_messageaveraging.h" +#include "moc_messageaveraging.cpp" + MessageAveraging::MessageAveraging(QSettings * settings, QFont const& font, QWidget *parent) : QWidget(parent), settings_ {settings}, diff --git a/widgets/messageaveraging.h b/widgets/messageaveraging.h index 4a8556b24..a5ed7b54d 100644 --- a/widgets/messageaveraging.h +++ b/widgets/messageaveraging.h @@ -14,6 +14,8 @@ namespace Ui { class MessageAveraging : public QWidget { + Q_OBJECT + public: explicit MessageAveraging(QSettings *, QFont const&, QWidget * parent = 0); ~MessageAveraging(); From f346d37fd6575ede541c0c5d8c07b83e03979458 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Thu, 6 Jun 2019 15:00:47 +0100 Subject: [PATCH 131/159] Modernize Fortran interfaces that are called from C/C++ Making Fortran interfaces called from other languages fully portable avoids issues with newer Fortran compilers. --- lib/astrosub.f90 | 134 ++++++++++++++++++++++++++++++---------------- widgets/astro.cpp | 65 +++++++++++----------- 2 files changed, 119 insertions(+), 80 deletions(-) diff --git a/lib/astrosub.f90 b/lib/astrosub.f90 index 49551ce3e..0670d66dc 100644 --- a/lib/astrosub.f90 +++ b/lib/astrosub.f90 @@ -1,55 +1,97 @@ -subroutine astrosub(nyear,month,nday,uth8,freq8,mygrid,hisgrid, & - AzSun8,ElSun8,AzMoon8,ElMoon8,AzMoonB8,ElMoonB8,ntsky,ndop,ndop00, & - RAMoon8,DecMoon8,Dgrd8,poloffset8,xnr8,techo8,width1,width2,bTx, & - AzElFileName,jpleph) +module astro_module + use, intrinsic :: iso_c_binding, only : c_int, c_double, c_bool, c_char, c_ptr, c_size_t, c_f_pointer + implicit none - implicit real*8 (a-h,o-z) - character*6 mygrid,hisgrid,c1*1 - character*6 AzElFileName*(*),jpleph*(*) - character*256 jpleph_file_name - logical*1 bTx - common/jplcom/jpleph_file_name + private + public :: astrosub - jpleph_file_name=jpleph +contains - call astro0(nyear,month,nday,uth8,freq8,mygrid,hisgrid, & - AzSun8,ElSun8,AzMoon8,ElMoon8,AzMoonB8,ElMoonB8,ntsky,ndop,ndop00, & - dbMoon8,RAMoon8,DecMoon8,HA8,Dgrd8,sd8,poloffset8,xnr8,dfdt,dfdt0, & - width1,width2,xlst8,techo8) + subroutine astrosub(nyear,month,nday,uth8,freq8,mygrid_cp,mygrid_len, & + hisgrid_cp,hisgrid_len,AzSun8,ElSun8,AzMoon8,ElMoon8,AzMoonB8,ElMoonB8, & + ntsky,ndop,ndop00,RAMoon8,DecMoon8,Dgrd8,poloffset8,xnr8,techo8,width1, & + width2,bTx,AzElFileName_cp,AzElFileName_len,jpleph_cp,jpleph_len) & + bind (C, name="astrosub") - if (len_trim(AzElFileName) .eq. 0) go to 999 - imin=60*uth8 - isec=3600*uth8 - ih=uth8 - im=mod(imin,60) - is=mod(isec,60) - open(15,file=AzElFileName,status='unknown',err=900) - c1='R' - nRx=1 - if(bTx) then - c1='T' - nRx=0 - endif - AzAux=0. - ElAux=0. - nfreq=freq8/1000000 - doppler=ndop - doppler00=ndop00 - write(15,1010,err=10) ih,im,is,AzMoon8,ElMoon8, & - ih,im,is,AzSun8,ElSun8, & - ih,im,is,AzAux,ElAux, & - nfreq,doppler,dfdt,doppler00,dfdt0,c1 -! TXFirst,TRPeriod,poloffset,Dgrd,xnr,ave,rms,nRx + integer, parameter :: dp = selected_real_kind(15, 50) + + integer(c_int), intent(in), value :: nyear, month, nday + real(c_double), intent(in), value :: uth8, freq8 + real(c_double), intent(out) :: AzSun8, ElSun8, AzMoon8, ElMoon8, AzMoonB8, & + ElMoonB8, Ramoon8, DecMoon8, Dgrd8, poloffset8, xnr8, techo8, width1, & + width2 + integer(c_int), intent(out) :: ntsky, ndop, ndop00 + logical(c_bool), intent(in), value :: bTx + type(c_ptr), intent(in), value :: mygrid_cp, hisgrid_cp, AzElFileName_cp, jpleph_cp + integer(c_size_t), intent(in), value :: mygrid_len, hisgrid_len, AzElFileName_len, jpleph_len + + character(len=6) :: mygrid, hisgrid + character(kind=c_char, len=:), allocatable :: AzElFileName + character(len=1) :: c1 + integer :: ih, im, imin, is, isec, nfreq, nRx + real(dp) :: AzAux, ElAux, dbMoon8, dfdt, dfdt0, doppler, doppler00, HA8, sd8, xlst8 + character*256 jpleph_file_name + common/jplcom/jpleph_file_name + + block + character(kind=c_char, len=mygrid_len), pointer :: mygrid_fp + character(kind=c_char, len=hisgrid_len), pointer :: hisgrid_fp + character(kind=c_char, len=AzElFileName_len), pointer :: AzElFileName_fp + character(kind=c_char, len=jpleph_len), pointer :: jpleph_fp + call c_f_pointer(cptr=mygrid_cp, fptr=mygrid_fp) + mygrid = mygrid_fp + mygrid_fp => null() + call c_f_pointer(cptr=hisgrid_cp, fptr=hisgrid_fp) + hisgrid = hisgrid_fp + hisgrid_fp => null() + call c_f_pointer(cptr=AzElFileName_cp, fptr=AzElFileName_fp) + AzElFileName = AzElFileName_fp + AzElFileName_fp => null() + call c_f_pointer(cptr=jpleph_cp, fptr=jpleph_fp) + jpleph_file_name = jpleph_fp + jpleph_fp => null() + end block + + call astro0(nyear,month,nday,uth8,freq8,mygrid,hisgrid, & + AzSun8,ElSun8,AzMoon8,ElMoon8,AzMoonB8,ElMoonB8,ntsky,ndop,ndop00, & + dbMoon8,RAMoon8,DecMoon8,HA8,Dgrd8,sd8,poloffset8,xnr8,dfdt,dfdt0, & + width1,width2,xlst8,techo8) + + if (len_trim(AzElFileName) .eq. 0) go to 999 + imin=60*uth8 + isec=3600*uth8 + ih=uth8 + im=mod(imin,60) + is=mod(isec,60) + open(15,file=AzElFileName,status='unknown',err=900) + c1='R' + nRx=1 + if(bTx) then + c1='T' + nRx=0 + endif + AzAux=0. + ElAux=0. + nfreq=freq8/1000000 + doppler=ndop + doppler00=ndop00 + write(15,1010,err=10) ih,im,is,AzMoon8,ElMoon8, & + ih,im,is,AzSun8,ElSun8, & + ih,im,is,AzAux,ElAux, & + nfreq,doppler,dfdt,doppler00,dfdt0,c1 + ! TXFirst,TRPeriod,poloffset,Dgrd,xnr,ave,rms,nRx 1010 format( & - i2.2,':',i2.2,':',i2.2,',',f5.1,',',f5.1,',Moon'/ & - i2.2,':',i2.2,':',i2.2,',',f5.1,',',f5.1,',Sun'/ & - i2.2,':',i2.2,':',i2.2,',',f5.1,',',f5.1,',Source'/ & - i5,',',f8.1,',',f8.2,',',f8.1,',',f8.2,',Doppler, ',a1) -! i1,',',i3,',',f8.1,','f8.1,',',f8.1,',',f12.3,',',f12.3,',',i1,',RPol') -10 close(15) - go to 999 + i2.2,':',i2.2,':',i2.2,',',f5.1,',',f5.1,',Moon'/ & + i2.2,':',i2.2,':',i2.2,',',f5.1,',',f5.1,',Sun'/ & + i2.2,':',i2.2,':',i2.2,',',f5.1,',',f5.1,',Source'/ & + i5,',',f8.1,',',f8.2,',',f8.1,',',f8.2,',Doppler, ',a1) + ! i1,',',i3,',',f8.1,','f8.1,',',f8.1,',',f12.3,',',f12.3,',',i1,',RPol') +10 close(15) + go to 999 900 print*,'Error opening azel.dat' 999 return -end subroutine astrosub + end subroutine astrosub + +end module astro_module diff --git a/widgets/astro.cpp b/widgets/astro.cpp index c1eee0157..8c083a89a 100644 --- a/widgets/astro.cpp +++ b/widgets/astro.cpp @@ -24,14 +24,14 @@ extern "C" { - void astrosub_(int* nyear, int* month, int* nday, double* uth, double* freqMoon, - const char* mygrid, const char* hisgrid, double* azsun, - double* elsun, double* azmoon, double* elmoon, double* azmoondx, - double* elmoondx, int* ntsky, int* ndop, int* ndop00, - double* ramoon, double* decmoon, double* dgrd, double* poloffset, - double* xnr, double* techo, double* width1, double* width2, - bool* bTx, const char* AzElFileName, const char* jpleph, - fortran_charlen_t, fortran_charlen_t, fortran_charlen_t, fortran_charlen_t); + void astrosub(int nyear, int month, int nday, double uth, double freqMoon, + const char * mygrid, size_t mygrid_len, const char * hisgrid, + size_t hisgrid_len, double * azsun, double * elsun, double * azmoon, + double * elmoon, double * azmoondx, double * elmoondx, int * ntsky, + int * ndop, int * ndop00, double * ramoon, double * decmoon, double * dgrd, + double * poloffset, double * xnr, double * techo, double * width1, + double * width2, bool bTx, const char * AzElFileName, size_t AzElFileName_len, + const char * jpleph, size_t jpleph_len); } Astro::Astro(QSettings * settings, Configuration const * configuration, QWidget * parent) @@ -76,8 +76,8 @@ void Astro::read_settings () case 1: ui_->rbFullTrack->setChecked (true); break; case 2: ui_->rbConstFreqOnMoon->setChecked (true); break; case 3: ui_->rbOwnEcho->setChecked (true); break; - case 4: ui_->rbOnDxEcho->setChecked (true); break; - case 5: ui_->rbCallDx->setChecked (true); break; + case 4: ui_->rbOnDxEcho->setChecked (true); break; + case 5: ui_->rbCallDx->setChecked (true); break; } move (settings_->value ("window/pos", pos ()).toPoint ()); } @@ -107,24 +107,20 @@ auto Astro::astroUpdate(QDateTime const& t, QString const& mygrid, QString const double sec {t.time().second() + 0.001*t.time().msec()}; double uth {nhr + nmin/60.0 + sec/3600.0}; if(freq_moon < 1) freq_moon = 144000000; - int nfreq {static_cast (freq_moon / 1000000u)}; - double freq8 {static_cast (freq_moon)}; auto const& AzElFileName = QDir::toNativeSeparators (configuration_->azel_directory ().absoluteFilePath ("azel.dat")); auto const& jpleph = configuration_->data_dir ().absoluteFilePath ("JPLEPH"); - - - - QString mygrid_padded {(mygrid + " ").left (6)}; - QString hisgrid_padded {(hisgrid + " ").left (6)}; - astrosub_(&nyear, &month, &nday, &uth, &freq8, mygrid_padded.toLatin1().constData(), - hisgrid_padded.toLatin1().constData(), &azsun, &elsun, &azmoon, &elmoon, - &azmoondx, &elmoondx, &ntsky, &m_dop, &m_dop00, &ramoon, &decmoon, - &dgrd, &poloffset, &xnr, &techo, &width1, &width2, &bTx, - AzElFileName.toLatin1().constData(), jpleph.toLatin1().constData(), 6, 6, - AzElFileName.length(), jpleph.length()); + astrosub(nyear, month, nday, uth, static_cast (freq_moon), + mygrid.toLatin1 ().constData (), mygrid.size (), + hisgrid.toLatin1().constData(), hisgrid.size (), + &azsun, &elsun, &azmoon, &elmoon, + &azmoondx, &elmoondx, &ntsky, &m_dop, &m_dop00, &ramoon, &decmoon, + &dgrd, &poloffset, &xnr, &techo, &width1, &width2, + bTx, + AzElFileName.toLatin1().constData(), AzElFileName.size (), + jpleph.toLatin1().constData(), jpleph.size ()); - if(hisgrid_padded==" ") { + if(!hisgrid.size ()) { azmoondx=0.0; elmoondx=0.0; m_dop=0; @@ -152,8 +148,8 @@ auto Astro::astroUpdate(QDateTime const& t, QString const& mygrid, QString const "Dec: " << decmoon << "\n" "SunAz: " << azsun << "\n" "SunEl: " << elsun << "\n" - "Freq: " << nfreq << "\n"; - if(nfreq>=50) { //Suppress data not relevant below VHF + "Freq: " << freq / 1.e6 << "\n"; + if(freq>=5000000ull) { //Suppress data not relevant below VHF out << "Tsky: " << ntsky << "\n" "Dpol: " << poloffset << "\n" "MNR: " << xnr << "\n" @@ -215,8 +211,6 @@ auto Astro::astroUpdate(QDateTime const& t, QString const& mygrid, QString const auto sec_since_epoch = t.toMSecsSinceEpoch ()/1000 + 2; auto target_sec = sec_since_epoch - fmod(double(sec_since_epoch),TR_period) + 0.5*TR_period; auto target_date_time = QDateTime::fromMSecsSinceEpoch (target_sec * 1000, Qt::UTC); - QString date {target_date_time.date().toString("yyyy MMM dd").trimmed ()}; - QString utc {target_date_time.time().toString().trimmed ()}; int nyear {target_date_time.date().year()}; int month {target_date_time.date().month()}; int nday {target_date_time.date().day()}; @@ -224,12 +218,15 @@ auto Astro::astroUpdate(QDateTime const& t, QString const& mygrid, QString const int nmin {target_date_time.time().minute()}; double sec {target_date_time.time().second() + 0.001*target_date_time.time().msec()}; double uth {nhr + nmin/60.0 + sec/3600.0}; - astrosub_(&nyear, &month, &nday, &uth, &freq8, mygrid_padded.toLatin1().constData(), - hisgrid_padded.toLatin1().constData(), &azsun, &elsun, &azmoon, &elmoon, + astrosub(nyear, month, nday, uth, static_cast (freq_moon), + mygrid.toLatin1 ().constData (), mygrid.size (), + hisgrid.toLatin1().constData(), hisgrid.size (), + &azsun, &elsun, &azmoon, &elmoon, &azmoondx, &elmoondx, &ntsky, &m_dop, &m_dop00, &ramoon, &decmoon, - &dgrd, &poloffset, &xnr, &techo, &width1, &width2, &bTx, - "", jpleph.toLatin1().constData(), 6, 6, - 0, jpleph.length()); + &dgrd, &poloffset, &xnr, &techo, &width1, &width2, + bTx, + AzElFileName.toLatin1().constData(), AzElFileName.size (), + jpleph.toLatin1().constData(), jpleph.size ()); FrequencyDelta offset {0}; switch (m_DopplerMethod) { @@ -255,7 +252,7 @@ auto Astro::astroUpdate(QDateTime const& t, QString const& mygrid, QString const } correction.tx = -offset; - qDebug () << "correction.tx (no tx qsy):" << correction.tx; + qDebug () << "correction.tx (no tx qsy):" << correction.tx; } } return correction; From d4a7a292c0e8da72b63f92fc1d1ca38d2be9b0e6 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Thu, 6 Jun 2019 10:29:58 -0400 Subject: [PATCH 132/159] Implement message type i3=5 (for WWROF contest exchange) in packjt77. --- lib/77bit/77bit.txt | 7 +--- lib/77bit/messages.txt | 13 ++++++- lib/77bit/packjt77.f90 | 87 ++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 97 insertions(+), 10 deletions(-) diff --git a/lib/77bit/77bit.txt b/lib/77bit/77bit.txt index ef370c111..89b481b6c 100644 --- a/lib/77bit/77bit.txt +++ b/lib/77bit/77bit.txt @@ -22,15 +22,10 @@ i3.n3 Example message Bits Total Purpose 2 PA3XYZ/P GM4ABC/P R JO22 28 1 28 1 1 15 74 EU VHF contest 3 TU; W9XYZ K1ABC R 579 MA 1 28 28 1 3 13 74 ARRL RTTY Roundup 4 PJ4/KA1ABC RR73 12 58 1 2 1 74 Nonstandard calls -5 ... tbd +5 TU; W9XYZ K1ABC R-07 FN 1 28 28 1 7 9 74 WWROF contest ? 6 ... tbd 7 ... tbd ---------------------------------------------------------------------------------- -In case we need them, later: - -5 TU; W9XYZ K1ABC R 579 8 MA 1 28 28 1 3 6 7 74 CQ WW RTTY -6 TU; W9XYZ K1ABC R 579 MA 1 28 28 1 3 13 74 CQ WPX RTTY ----------------------------------------------------------------------------------- NB: three 74-bit message types and two 71-bit message subtypes are still TBD. ---------------------------------------------------------------------------------- diff --git a/lib/77bit/messages.txt b/lib/77bit/messages.txt index 54fd44b05..aa4ab0789 100644 --- a/lib/77bit/messages.txt +++ b/lib/77bit/messages.txt @@ -72,7 +72,18 @@ CQ W9XYZ EN37 W9XYZ R-09 YW18FIFA RRR YW18FIFA 73 -10. Other stuff + +10. WWROF FT8/FT4 contest +----------------------------------------------------------- +CQ TEST K1ABC FN42 + K1ABC W9XYZ -16 EN +W9XYZ K1ABC R-07 FN + K1ABC W9XYZ RR73 + K1ABC G3AAA -11 IO +TU; G3AAA K1ABC R-09 FN + K1ABC G3AAA RR73 + +11. Other stuff ----------------------------------------------------------- TNX BOB 73 GL CQ YW18FIFA diff --git a/lib/77bit/packjt77.f90 b/lib/77bit/packjt77.f90 index 1ee37f5c1..1f9ed9a19 100644 --- a/lib/77bit/packjt77.f90 +++ b/lib/77bit/packjt77.f90 @@ -172,6 +172,10 @@ subroutine pack77(msg0,i3,n3,c77) call pack77_4(nwords,w,i3,n3,c77) if(i3.ge.0) go to 900 +! Check Type 5 (WWROF contest exchange) + call pack77_5(nwords,w,i3,n3,c77) + if(i3.ge.0) go to 900 + ! It defaults to free text 800 i3=0 n3=0 @@ -204,6 +208,7 @@ subroutine unpack77(c77,nrx,msg,unpk77_success) character*6 cexch,grid6 character*4 grid4,cserial character*3 csec(NSEC) + character*2 cfield character*38 c integer hashmy10,hashmy12,hashmy22,hashdx10,hashdx12,hashdx22 logical unpk28_success,unpk77_success @@ -491,8 +496,31 @@ subroutine unpack77(c77,nrx,msg,unpk77_success) else msg='CQ '//trim(call_2) endif + + else if(i3.eq.5) then +! 5 TU; W9XYZ K1ABC R-09 FN 1 28 28 1 7 9 74 WWROF contest + read(c77,1041) itu,n28a,n28b,ir,irpt,nexch,i3 +1041 format(b1,2b28.28,b1,b7.7,b9.9,b3.3) + call unpack28(n28a,call_1,unpk28_success) + if(.not.unpk28_success) unpk77_success=.false. + call unpack28(n28b,call_2,unpk28_success) + if(.not.unpk28_success) unpk77_success=.false. + write(crpt,'(i3.2)') irpt-35 + if(crpt(1:1).eq.' ') crpt(1:1)='+' + n1=nexch/18 + n2=nexch - 18*n1 + cfield(1:1)=char(ichar('A')+n1) + cfield(2:2)=char(ichar('A')+n2) + if(itu.eq.0 .and. ir.eq.0) msg=trim(call_1)//' '//trim(call_2)// & + ' '//crpt//' '//cfield + if(itu.eq.1 .and. ir.eq.0) msg='TU; '//trim(call_1)//' '//trim(call_2)// & + ' '//crpt//' '//cfield + if(itu.eq.0 .and. ir.eq.1) msg=trim(call_1)//' '//trim(call_2)// & + ' R'//crpt//' '//cfield + if(itu.eq.1 .and. ir.eq.1) msg='TU; '//trim(call_1)//' '//trim(call_2)// & + ' R'//crpt//' '//cfield endif - if(msg(1:4).eq.'CQ <') unpk77_success=.false. +! if(msg(1:4).eq.'CQ <') unpk77_success=.false. return end subroutine unpack77 @@ -1040,12 +1068,11 @@ subroutine pack77_3(nwords,w,i3,n3,c77) call chkcall(w(i1+1),bcall_2,ok2) if(.not.ok1 .or. .not.ok2) go to 900 crpt=w(nwords-1)(1:3) + if(index(crpt,'-').ge.1 .or. index(crpt,'+').ge.1) go to 900 if(crpt(1:1).eq.'5' .and. crpt(2:2).ge.'2' .and. crpt(2:2).le.'9' .and. & crpt(3:3).eq.'9') then nserial=0 read(w(nwords),*,err=1) nserial -!1 i3=3 -! n3=0 endif 1 mult=' ' imult=-1 @@ -1150,6 +1177,60 @@ subroutine pack77_4(nwords,w,i3,n3,c77) 900 return end subroutine pack77_4 +subroutine pack77_5(nwords,w,i3,n3,c77) +! Check Type 5 (WWROF contest exchange) + + character*13 w(19) + character*77 c77 + character*6 bcall_1,bcall_2 + character*3 mult + character crpt*4 + character c1*1,c2*2 + logical ok1,ok2 + + if(nwords.eq.4 .or. nwords.eq.5 .or. nwords.eq.6) then + i1=1 + if(trim(w(1)).eq.'TU;') i1=2 + call chkcall(w(i1),bcall_1,ok1) + call chkcall(w(i1+1),bcall_2,ok2) + if(.not.ok1 .or. .not.ok2) go to 900 + crpt=w(nwords-1)(1:4) + if(index(crpt,'-').lt.1 .and. index(crpt,'+').lt.1) go to 900 + + c1=crpt(1:1) + c2=crpt(1:2) + irpt=-1 + if(c1.eq.'+' .or. c1.eq.'-') then + ir=0 + read(w(nwords-1),*,err=900) irpt + irpt=irpt+35 + else if(c2.eq.'R+' .or. c2.eq.'R-') then + ir=1 + read(w(nwords-1)(2:),*) irpt + irpt=irpt+35 + endif + if(irpt.eq.-1 .or. len(trim(w(nwords))).ne.2) go to 900 + c2=w(nwords)(1:2) + n1=ichar(c2(1:1)) - ichar('A') + n2=ichar(c2(2:2)) - ichar('A') + if(n1.lt.0 .or. n1.gt.17) go to 900 + if(n2.lt.0 .or. n2.gt.17) go to 900 + nexch=18*n1 + n2 + i3=5 + n3=0 + itu=0 + if(trim(w(1)).eq.'TU;') itu=1 + call pack28(w(1+itu),n28a) + call pack28(w(2+itu),n28b) +! 5 TU; W9XYZ K1ABC R-09 FN 1 28 28 1 7 9 74 WWROF contest + write(c77,1010) itu,n28a,n28b,ir,irpt,nexch,i3 +1010 format(b1,2b28.28,b1,b7.7,b9.9,b3.3) + + end if + +900 return +end subroutine pack77_5 + subroutine packtext77(c13,c71) character*13 c13,w From 9c3c5d6b3c9c903e66d91323b6ee70e39fc34465 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Thu, 6 Jun 2019 11:58:52 -0400 Subject: [PATCH 133/159] Turn Tx Enable to OFF after logging a QSO, even if "Clear DX call and grid after logging" is not checked. --- widgets/mainwindow.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index f5c5cff41..7c0d178a8 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -5559,6 +5559,7 @@ void MainWindow::acceptQSO (QDateTime const& QSO_date_off, QString const& call, } if(m_config.clear_DX () and SpecOp::HOUND != m_config.special_op_id()) clearDX (); + auto_tx_mode (false); m_dateTimeQSOOn = QDateTime {}; auto special_op = m_config.special_op_id (); if (SpecOp::NONE < special_op && special_op < SpecOp::FOX && From e3c73def7ae4fbb947c72b1285979ccf97e6c6f1 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Thu, 6 Jun 2019 13:44:32 -0400 Subject: [PATCH 134/159] Updates to the User Guide, mostly related to addition of the FT4 mode. --- doc/common/links.adoc | 1 + doc/user_guide/en/install-windows.adoc | 7 +++-- doc/user_guide/en/introduction.adoc | 31 +++++++++++-------- doc/user_guide/en/new_features.adoc | 35 ++++------------------ doc/user_guide/en/protocols.adoc | 41 +++++++++++++++++--------- 5 files changed, 56 insertions(+), 59 deletions(-) diff --git a/doc/common/links.adoc b/doc/common/links.adoc index e886f551f..58ad60476 100644 --- a/doc/common/links.adoc +++ b/doc/common/links.adoc @@ -116,6 +116,7 @@ d). Edit lines as needed. Keeping them in alphabetic order help see dupes. :QRA64_EME: http://physics.princeton.edu/pulsar/K1JT/QRA64_EME.pdf[QRA64 for microwave EME] :svn: http://subversion.apache.org/packages.html#windows[Subversion] :win32: http://physics.princeton.edu/pulsar/K1JT/wsjtx-{VERSION}-win32.exe[wsjtx-{VERSION}-win32.exe] +:win64: http://physics.princeton.edu/pulsar/K1JT/wsjtx-{VERSION}-win64.exe[wsjtx-{VERSION}-win64.exe] :wsjt-devel: https://lists.sourceforge.net/lists/listinfo/wsjt-devel[here] :wsjt_repo: https://sourceforge.net/p/wsjt/wsjt_orig/ci/master/tree/[WSJT Source Repository] :wspr_code: http://physics.princeton.edu/pulsar/K1JT/WSPRcode.exe[WSPRcode.exe] diff --git a/doc/user_guide/en/install-windows.adoc b/doc/user_guide/en/install-windows.adoc index 5b8e06834..786e9a294 100644 --- a/doc/user_guide/en/install-windows.adoc +++ b/doc/user_guide/en/install-windows.adoc @@ -1,11 +1,12 @@ // Status=review -Download and execute the package file {win32}, following these -instructions: +Download and execute the package file {win32} (WinXP, Vista, Win 7, +Win 8, Win10, 32-bit) or {win64} (Vista, Win 7, Win 8, Win10, 64-bit) +following these instructions: * Install _WSJT-X_ into its own directory, for example `C:\WSJTX` or ` C:\WSJT\WSJTX`, rather than the conventional location `C:\Program - Files (x86)\WSJTX`. + Files ...\WSJTX`. * All program files relating to _WSJT-X_ will be stored in the chosen installation directory and its subdirectories. diff --git a/doc/user_guide/en/introduction.adoc b/doc/user_guide/en/introduction.adoc index b48738190..6da0f7936 100644 --- a/doc/user_guide/en/introduction.adoc +++ b/doc/user_guide/en/introduction.adoc @@ -7,10 +7,10 @@ K1**JT**,`" while the suffix "`-X`" indicates that _WSJT-X_ started as an extended and experimental branch of the program _WSJT_. -_WSJT-X_ Version {VERSION_MAJOR}.{VERSION_MINOR} offers nine different -protocols or modes: *FT8*, *JT4*, *JT9*, *JT65*, *QRA64*, *ISCAT*, -*MSK144*, *WSPR*, and *Echo*. The first five are designed for making -reliable QSOs under extreme weak-signal conditions. They use nearly +_WSJT-X_ Version {VERSION_MAJOR}.{VERSION_MINOR} offers ten different +protocols or modes: *FT4*, *FT8*, *JT4*, *JT9*, *JT65*, *QRA64*, +*ISCAT*, *MSK144*, *WSPR*, and *Echo*. The first six are designed for +making reliable QSOs under weak-signal conditions. They use nearly identical message structure and source encoding. JT65 and QRA64 were designed for EME ("`moonbounce`") on the VHF/UHF bands and have also proven very effective for worldwide QRP communication on the HF bands. @@ -25,12 +25,17 @@ one-minute timed sequences of alternating transmission and reception, so a minimal QSO takes four to six minutes — two or three transmissions by each station, one sending in odd UTC minutes and the other even. FT8 is operationally similar but four times faster -(15-second T/R sequences) and less sensitive by a few dB. On the HF -bands, world-wide QSOs are possible with any of these modes using -power levels of a few watts (or even milliwatts) and compromise -antennas. On VHF bands and higher, QSOs are possible (by EME and -other propagation types) at signal levels 10 to 15 dB below those -required for CW. +(15-second T/R sequences) and less sensitive by a few dB. FT4 is +faster still (7.5 s T/R sequences) and especially well suited for +radio contesting. On the HF bands, world-wide QSOs are possible with +any of these modes using power levels of a few watts (or even +milliwatts) and compromise antennas. On VHF bands and higher, QSOs +are possible (by EME and other propagation types) at signal levels 10 +to 15 dB below those required for CW. + +Note that even though their T/R sequences are short, FT4 and FT8 are +classified as slow modes because their message frames are sent +only once per transmission. *ISCAT*, *MSK144*, and optionally submodes *JT9E-H* are "`fast`" protocols designed to take advantage of brief signal enhancements from @@ -65,10 +70,10 @@ are available for all three platforms. *Version Numbers:* _WSJT-X_ release numbers have major, minor, and patch numbers separated by periods: for example, _WSJT-X_ Version -1.9.0. Temporary "`beta`" release candidates are sometimes made in +2.1.0. Temporary _beta release_ candidates are sometimes made in advance of a new general-availability release, in order to obtain user -feedback. For example, version 1.9.0-rc1, 1.9.0-rc2, etc., would -be beta releases leading up to the final release of v1.9.0. +feedback. For example, version 2.1.0-rc1, 2.1.0-rc2, etc., would +be beta releases leading up to the final release of v2.1.0. Release candidates should be used _only_ during a short testing period. They carry an implied obligation to provide feedback to the program development group. Candidate releases should not be used on diff --git a/doc/user_guide/en/new_features.adoc b/doc/user_guide/en/new_features.adoc index a90b52182..496bef16b 100644 --- a/doc/user_guide/en/new_features.adoc +++ b/doc/user_guide/en/new_features.adoc @@ -1,40 +1,17 @@ === New in Version {VERSION} For quick reference, here's a short list of features and capabilities -added to _WSJT-X_ since Version 1.9.1: +added to _WSJT-X_ since Version 2.0.1: -- New FT8 and MSK144 protocols with 77-bit payloads permit these enhancements: +- New FT4 protocol, designed especially for radio contesting -* Optimized contest messages for NA VHF, EU VHF, Field Day, RTTY Roundup +* T/R sequence length 7.5 s -* Full support for "/R" and "/P" calls in relevant contests +* Bandwidth 80 Hz -* New logging features for contesting - -* Integration with {n1mm_logger} and {writelog} for contesting - -* Improved support for compound and nonstandard callsigns - -* Nearly equal (or better) sensitivity compared to old protocols - -* Lower false decode rates - -- Improved color highlighting of received messages - -- Improved WSPR sensitivity - -- Expanded and improved UDP messages sent to companion programs - -- Bug fixes and other minor tweaks to user interface - -IMPORTANT: Note that for FT8 and MSK144 there is no backward -compatibility with WSJT-X 1.9.1 and earlier. Everyone using these -modes should upgrade to WSJT-X 2.0 by January 1, 2019. - -IMPORTANT: _WSJT-X_ Version 2.0 drops support for Apple Mac OS X 10.9 -(Mavericks). It is possible to build from source for this operating -system version but the DMG installer package requires 10.10 or later. +* Threshold sensitivity -17.5 dB +- Improvements to accessibility === Documentation Conventions diff --git a/doc/user_guide/en/protocols.adoc b/doc/user_guide/en/protocols.adoc index f50096097..fc0dad266 100644 --- a/doc/user_guide/en/protocols.adoc +++ b/doc/user_guide/en/protocols.adoc @@ -12,10 +12,10 @@ Special cases allow other information such as add-on callsign prefixes aim is to compress the most common messages used for minimally valid QSOs into a fixed 72-bit length. -The information payload for FT8 and MSK144 contains 77 bits. The 5 -additional bits are used to flag special message types used for FT8 -DXpedition Mode, contesting, nonstandard callsigns, and a few other -special types. +The information payload for FT4, FT8, and MSK144 contains 77 bits. +The 5 additional bits are used to flag special message types used for +FT8 DXpedition Mode, contesting, nonstandard callsigns, and a few +other special types. A standard amateur callsign consists of a one- or two-character prefix, at least one of which must be a letter, followed by a digit @@ -67,18 +67,29 @@ _WSJT-X_ modes have continuous phase and constant envelope. [[SLOW_MODES]] === Slow Modes +[[FT4PRO]] +==== FT4 + +Forward error correction (FEC) in FT4 uses a low-density parity check +(LDPC) code with 77 information bits, a 14-bit cyclic redundancy check +(CRC), and 83 parity bits making a 174-bit codeword. It is thus +called an LDPC (174,91) code. Synchronization uses four 4×4 Costas +arrays, and ramp-up and ramp-down symbols are inserted at the start +and end of each transmission. Modulation is 4-tone frequency-shift +keying with Gaussian smoothing of frequency transitions (4-GFSK). The +keying rate is 12000/576 = 20.8333 baud. Each transmitted symbol +conveys two bits, so the total number of channel symbols is 174/2 + 16 ++ 2 = 105. The total bandwidth is 4 × 20.8333 = 83.3 Hz. + [[FT8PRO]] ==== FT8 -Forward error correction (FEC) in FT8 uses a low-density parity check -(LDPC) code with 77 information bits, a 14-bit cyclic redundancy check -(CRC), and 83 parity bits making a 174-bit codeword. It is thus -called an LDPC (174,91) code. Synchronization uses 7×7 Costas arrays -at the beginning, middle, and end of each transmission. Modulation is -8-tone frequency-shift keying (8-FSK) at 12000/1920 = 6.25 baud. Each -transmitted symbol carries three bits, so the total number of channel -symbols is 174/3 + 21 = 79. The total occupied bandwidth is 8 × 6.25 -= 50 Hz. +FT8 uses the same LDPC (174,91) code as FT4. Modulation is 8-tone +frequency-shift keying (8-GFSK) at 12000/1920 = 6.25 baud. +Synchronization uses 7×7 Costas arrays at the beginning, middle, and +end of each transmission. Transmitted symbols carry three bits, so +the total number of channel symbols is 174/3 + 21 = 79. The total +occupied bandwidth is 8 × 6.25 = 50 Hz. [[JT4PRO]] ==== JT4 @@ -227,7 +238,8 @@ which the probability of decoding is 50% or higher. |=============================================================================== |Mode |FEC Type |(n,k) | Q|Modulation type|Keying rate (Baud)|Bandwidth (Hz) |Sync Energy|Tx Duration (s)|S/N Threshold (dB) -|FT8 |LDPC, r=1/2|(174,91)| 8| 8-FSK| 6.25 | 50.0 | 0.27| 12.6 | -21 +|FT4 |LDPC, r=1/2|(174,91)| 4| 4-GFSK| 20.8333 | 83.3 | 0.15| 5.04 | -17.5 +|FT8 |LDPC, r=1/2|(174,91)| 8| 8-GFSK| 6.25 | 50.0 | 0.27| 12.6 | -21 |JT4A |K=32, r=1/2|(206,72)| 2| 4-FSK| 4.375| 17.5 | 0.50| 47.1 | -23 |JT9A |K=32, r=1/2|(206,72)| 8| 9-FSK| 1.736| 15.6 | 0.19| 49.0 | -27 |JT65A |Reed Solomon|(63,12) |64|65-FSK| 2.692| 177.6 | 0.50| 46.8 | -25 @@ -246,6 +258,7 @@ comparable to tone spacing. [width="50%",cols="h,3*^",frame=topbot,options="header"] |===================================== |Mode |Tone Spacing |BW (Hz)|S/N (dB) +|FT4 |20.8333 | 83.3 |-17.5 |FT8 |6.25 | 50.0 |-21 |JT4A |4.375| 17.5 |-23 |JT4B |8.75 | 30.6 |-22 From 3ff672705fa78fdbfbf67a3c6d0e6cb861f3d23e Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Thu, 6 Jun 2019 14:14:11 -0400 Subject: [PATCH 135/159] Change the F11/F12 frequency increments for FT4 to +/- 90 Hz. --- widgets/mainwindow.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 7c0d178a8..2d3964efa 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -1991,7 +1991,7 @@ void MainWindow::keyPressEvent (QKeyEvent * e) if(e->modifiers() & Qt::ControlModifier) n+=100; if(e->modifiers() & Qt::ShiftModifier) { int offset=60; - if(m_mode=="FT4") offset=100; + if(m_mode=="FT4") offset=90; ui->TxFreqSpinBox->setValue(ui->TxFreqSpinBox->value()-offset); } else{ bumpFqso(n); @@ -2007,7 +2007,7 @@ void MainWindow::keyPressEvent (QKeyEvent * e) if(e->modifiers() & Qt::ControlModifier) n+=100; if(e->modifiers() & Qt::ShiftModifier) { int offset=60; - if(m_mode=="FT4") offset=100; + if(m_mode=="FT4") offset=90; ui->TxFreqSpinBox->setValue(ui->TxFreqSpinBox->value()+offset); } else { bumpFqso(n); From 3b777860ca742e761274850f92d0c9d6a5ec053a Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Thu, 6 Jun 2019 14:15:12 -0400 Subject: [PATCH 136/159] Add a User Guide tutorial section for FT4. --- doc/CMakeLists.txt | 3 ++ doc/user_guide/en/images/ft4_decodes.png | Bin 0 -> 23112 bytes doc/user_guide/en/images/ft4_waterfall.png | Bin 0 -> 35788 bytes doc/user_guide/en/tutorial-example4.adoc | 51 +++++++++++++++++++++ doc/user_guide/en/wsjtx-main.adoc | 4 ++ 5 files changed, 58 insertions(+) create mode 100644 doc/user_guide/en/images/ft4_decodes.png create mode 100644 doc/user_guide/en/images/ft4_waterfall.png create mode 100644 doc/user_guide/en/tutorial-example4.adoc diff --git a/doc/CMakeLists.txt b/doc/CMakeLists.txt index e81160575..bc333dd8c 100644 --- a/doc/CMakeLists.txt +++ b/doc/CMakeLists.txt @@ -52,6 +52,7 @@ set (UG_SRCS tutorial-example1.adoc tutorial-example2.adoc tutorial-example3.adoc + tutorial-example4.adoc tutorial-main-window.adoc tutorial-wide-graph-settings.adoc utilities.adoc @@ -77,6 +78,8 @@ set (UG_IMGS images/FreqCal_Graph.png images/FreqCal_Results.png images/freemsg.png + images/ft4_decodes.png + images/ft4_waterfall.png images/ft8_decodes.png images/FT8_waterfall.png images/help-menu.png diff --git a/doc/user_guide/en/images/ft4_decodes.png b/doc/user_guide/en/images/ft4_decodes.png new file mode 100644 index 0000000000000000000000000000000000000000..05d2083fd182c77e065cd09cf6af06fce037d8e0 GIT binary patch literal 23112 zcmb@tbyOU0mo1D02<{RfxVr|I;O_43!QI^@xI=Jg0)*i1mf+A3oW>=%``0AD_q}u1 z+_`tn`sNRcYUu9sJXL2O+qqf~s0aUo zbWxEMfv6rQ+y}pSWBF13BLqZk0^*}F4EQy?qm;G_1O!Uo>ks6RL%A6Qg!YQG*he)_ zgQJdw8utbDHLe%o%GGI^KmkbmaL?Z!-DF&BL?(JZ&X&URn1eDzZzsb^dZd1-M`qW% zF)HU#VX4=LM2iE^@LAl%`s47eFet4{h7n|R$kaa-uVQINZJ!rC9wbm4{W9J3w4Yz} zsp^X)}e zPB{WBHQrrMONO`fFIR`mPa|CyltM4n%n!o>x2eSUzu4DaHoGqRgw9G6x-J{Kt{VbC zFZWRszR&Df2i)-&{p>~FBwj-2iSv0r54&BDeM0w*0Vm8tFTJ>{ZhkjDU1v@C0Vf0# zPiI}%lwGIeTu(IFp5mjPSw-3+VrSm`*0JI;Hc4>*W1e9_E% ze(@jjd1>236ne;iJS2XQ4Oka?&Nq0DZ@clI+0B1?CVtR-dDeW{U%O>bNefJ;?Jxly zC7+NH6(y6~CrI)pF*7RV&TUbtxsr}`3a7-17OaZd@Ua_&q?k(^E|Lw!$hk49ZumZ7S?oipG+ty7=uA@Vxe9Ds=gC?V0-6|E0_8raFDq^Pbu7rmpM0jfOGV;MnuC0go4p z-vmxqwARzqC33#Xfv`Teyn4ayOfQ-MY9%qsJ~4Bx8%0hTR8=VkgIjw66zL~-(uDY- zAMYv_)id2lhrB+6uf;>#G9zh!NoSJP0qmN>J2&jA7+P;ifN+1Q zcLhmxEtA6GoQmx?tnD(H!u{fa$a#9rT1UEFfWrG-<7w3nAz#mu4T3G=O}eeAjIJ*RQ}yqTO~`T>C&_m*@$Hd{O@29Vz)hdfk_>3~HdlA_Tb9k^kc^p<0c&XKVi6ed_Hh4yTZo2V1dAXBcbGq4hIL-?=S#dFR zx!K@qe;!fvPn$+KWyF5z;`2oxC~GBuV2uqv(5!i(i*6#a9o>Tqeis3K$dXo*42Wk7 zX5KcaIx9B(%0$N0cn*Ws%jz6g|JmA|se%)yvdV|R!YSuzMpa;)I^cZ9;Rz7%eC_cD z^bq3EzUw1+H%@%}^W-rx-}`dS_e3{fM^WHDDBt&x_{nF&;H4=4d4DG$MWe&>7Iyar zW#X;t;LO3mVMnxi!+kxZLP~G1G?goWx7V7Ej>(w4c*;>HH1e$F?*J+4QWbe%~aOLFgzOBXwbo~Bhj=J-b*nh0+apE~F z=4IFLG2MT2L-x5x^J&uX;clWL{~{+&8h?j7KKC6ETKHD*8du2gY5H)&ABekpecjg7 zx!crvX}acjc4&Ah-gPa00*(R?zZ{+~cLiU(5ZsP2Z=3h>M+q%?E&y=tXM+U!_p`gt z%LyIV@7L}YxqSO94eyKcZ^>WQp@r@V0 z?*{;>%AL;!ig^0KB~RQhNxruZC_A{2>_hFGnL~~q;y)kuK=*s1Cc& z&_D#7y7w*|L<#=Q7Fw;*q?Ogt^)@I=AnHg;0It9YDxB=IZ`S0malH@x-lPY^`ENsH zeFc4Y1SV$tLY>TxJaZ0>kkJixg}h%LXt^GAl7~6WY3o9hNSU8c_)0GT_8`UF%^nPq zTmmN8hm058LuW~*Y=IwCVHaVc$2`orbmkX~gVxU77Ik4`<=3hl@SJD-1CEase$Yx{ z7Q0z9SI#pW%4Xsh)-#?u*m3@kw)boHnZIXOwVo84H)u&GM7}+{-kdrm7_`O*Y;rf_ z5tPKcey$r%hANiq(6xR~8-{|EJQ=q4CB)p(whI9-{vV@~<3mDJnm708pi<8`sm>y*8ZOSmO45Ah=6L?j}aCSmK6^+%Vc-$^;BQGHbKzCC@CeqrCAnM1lo;o2t-IdhcnQhSH8(LI&? zxUaHZVKS$zZk4LuH+?2ihuw{gtY3->Pt?LkdrwNf^GyKBtC9_Mn^cpI_=~~VlR5xZP>y_B!L>Sb?KTKFM^=YDd+6N zzs0t{DDo{KqromW$l#HgXdO*!#-4Yln4G&;c~#}IzEnqSN*Euy-qR z`SXa@$4r8$QwsvDX%8bE?`k-T>Rue!%c0)yRu^8Ye0eKmQ6X-hDg&y(qvuq^I zdoMf#y;U-E0Ohc2rVt}NKlhlxXz8{~@&+k<5I?M=%^Cz&VoOV@Crfd}#!R5CrXFWp zS&L>l!P7KtdY9rNphRqQz^afN;Sdjj9yrMGF#k^+bB^x9Pz4@-NB9RR5bm;W0(M6sv&6epqj0Q__}&^_ zZO)x=P<P-+sH9OhY0rNE$M!M(ZIsPr2xTubqn=Ck+3-s9`&usZO3J zAp{()1q8E#$#-hQVDisw7y^tC@Z_y~Jo0*1IXuOsff?Pkr`-k5+6f{fiDGPl@n5B} zw0MKIz65Xi+?iu^{H{?stGCRe1DR*e1 zDhgda!tM7v<+uc?#X?RD0&aSC^S$p+>2g1xuCK|cybWdN`Gll>C6-(U3tyn|y>66N zJcwE&*Ga}eOlvinw|vt~Y5?z)9~Nl3p5<%%!9NZGxcT80Kf#JNjYnIeLGHckQyuY7d1!(FMildQI&EfjRoGBQ6ms4)gvw-G&n;XF)WQa@ugZ2m8 z5VU-rpzrA^|JNg6A1DOG!Qf(F?CcP^6>3i9+iJ5Ekrjocu$foBzXzHJYsI%eIr?e*!#FxDKbgMEbo;g2x z=SUqBMXS0^H4#}eZiFG#RDRWFRFy=Y&e7_0Kln+gD1e%4OD;VtuQ1N@IvSJAW1^id^QY-l{MmAiXvQ1mAnFuzY^JqVCTurC(5ZbAv zC{(2+7So$ojJJC!5~En(ZXsF0z^?G__PlzIr3=vII5mpn2xGRr9f8{=%0=U^L!B6( zL8#ZH2oGt${o{Wf5d(cn9q0LBPa%0O2>+!c7K7^`Zq)xrpPqc+_X`~D^1)85=(mSk z1@PDfcht?K(rkYa()oWpVVApl#swq8CrB*fUvC&EnKG728hwqLb?j2EcuB=c2?39r zt{gqD$jSX!*!P(NUih5M)nEe*x}v*<8zE7lyT{RofHdFM8Eu#-6w##q&+DvP*x;`i z*AiYe@J>z8+A#3juP6&mN6B^jyvITz4VlzR;_k|UE(iwULTs^{V|V`PhNa+XZx8!P zfRI>s$tl;o2t5TalC;W~q?QAYS6jM?g1{2!l%6k6UxGe9cN6$|9=zUx%IF+9>_;rS_eHiQ`S`OJpu`*6jZ{JH;~{T{yiSFW^s8o;T_LT^h`MPX249D zyu}5mi~PD|GjQ~Df>o6z5}B5W00AmjZC>|I!457z*;BrFVN7@Zrgr+@-u%zC$b1bM zmX?2ZW$_wF7T&!sJ1Nr`yyW-`Et3EH9ZJ~=`MhVl|xg~IMI9}kX zAJpKwz{w~5;Gt9YdX6n z!IgG;r~j?6Oa!z!r3n?Lcq&Y&;3-@9mb2#Jj1*96G_#LZLeF;cH<4-#WVuz)TsgOL z`e!RfM>e-9T|}u_@-iu`4&Cmh|5~Z$^Q@tz^pgdYe-icuX5Khey*dG^< zf&AuAc9X+FxAFNJODn%1dN2E!f3BE~G$I7MfAn)IRMDRDoyEDANRpYww}X;wf|Ge1 z1#Xh*Fcdsdtd{cy8zf?8S~(jg*@WUfx0HQuh_SvT0zG~Shr*QX3}S=chCbbQ9>LY8 zgOl*k@Y50Wq|T0vVzH1B z9lu>dDMm(FfH4z_e#woFrOCdH!G$_yiBVzu)F^ARiesQaI4Gm;7XNTG?BSTWZ{4+e zZLQeqZ;o%q6ESk=P6}XXwMn`y#2Sjt^)daPJ@xZQh zwJ{bIna#GGDG<6{fVF->i;ij~=GrtPm2k`tit0PuU(i*<>}mjr`V7AY+;g zzGb<@3Sx3v;umSN3qX7p9xt(}&^f6&26{O(T?R?4<3exHK6;V4ePS4WLkbV>tBF5WK;?Gb4?n<(4duTH!9S@2S&pW(*`8P>U-r;eQ@csR6=XK z)(qLWRZ;GT&z8^^`nCPUM8Ofqe376;;zyQm%PDEH)GhWLd>8a+{Ave7Mp zr2PX$ThFEq^6!73xQ72lfr-2oKQp(EM8b3(Fx9s2=yafw%ZXO+pEGnVtLja`v+t-P z5=+TM?T{#9@Tj|Bq{3MMoXveVR>qf03;xFN3WHWrM<3AhV1DYaUih*oEJwOufe6N9 ztrJLfE;1xkdip#*Li$&WydOc>o2SB)&~=p>HoE|HW*Wk?R5VqXgYrbJsLWM_=B%7M zJQovmuiW&{HL$I^0I-!PU(P_%``_`f;Goq5NI$k}j{}FSKq=g`;3zS=$d2I|O-4#T z3k7(+qC`^_?)n);MNBERG7?7qDgDPc21lEBCA0!6_1);vG23!F9;e$#2t(Yg4XrE^ zl@)wZ77c*PnZUnbYD#sWSsP-^*{8@yF4;3J60nrcXbql0x|{|gE9W8`Ay-~wo^K#& zt*-`H%Os>Qt|v9Cq|dh2F$dz#!hV;D(opq)1x&-N2)?Edi=2ZIzBdt?Tne!aE z+>apB>Guh@_NA_@dgZ;42s-jBQF0O(TNGt*e$36c_lJ@rYeC!zS|Kck~3 zCWkz@b4eQLY5aAX#z(kA&^~5kDV26BpttM>2C5owBX#M*nLl`$n1F<7!uqhXm5`Ob zn%@fO)VuAN7Xq^%x#RvU3LJh;m5Ue$S7K3Ta1@%;&q(+i?uZiDtXeP8)ppewaq@i# zvrDOM9*l@-@%twR%W({L?sF?zJ+9g9-xBSrGpKbO_6-2XfZ_`1wmlx4M2BuljY&|0 z2<*_fu>0!rR*tqu6WA-u&Co7_4;{Z8)iI!Pbv5Dj{3heacb1X@? zVoCpLct>kzztLOSY$X6ustqt`y^JYA1WG}(WAh3~8tdAQQf7U0)DY|aYF6&5^nYz$ z?&|a-s!33Qr(kO<0_r_DiOHuy4Q7^-xP0K-?QcymonT2sci1ngw9O#(7Cqc1uTm4R zOEF|;v!gqfz4@?>JfR(3)i36gRY(ZPce4oQOSWhO2T z-+R7U>j^#=2Hub{OP!1tTx#7>T552FUs(+{jjQohkCnY$#@oc?e-S<7(`OG5VLN z=b`qKedruq`8#`fb#Sq^$LBcJnZ1k{wG~qvko>_{TvN*<^ZwrkV^upYZ+o@wuB~suMO$TT@a03aAlysXX148^!~aXdMbj$Kqx3BC)QbLqUhW+D21$BlF(s!?H>SZg?Vo=-9U(g96lSlIRxMG6uRMlkCV|43C; zCGo&D+t1-Ss?D>lvrg)NVO@Z$skgYWr3LxlVPPpPO-SkMGs*sr2Eo5d?y<2?mjA$^ z^tH`NfccM+=5_Y_C*=J5L{y#m1@$26<$Z;Z3sc~E%u7o;rY)1yd@BL^OJxu`9ox}r zG@*i3zrGWSUCJ)$WJQ9SC!eT@o|AeWE_*#b_VET4_C9xOyG}lC$|1upDVAj|3bwNF zCDV@UYuO45AX>$21=Dv9o1x?&-A628`QedmsIvK-@rpusLrDf0xVpZwVHC7F8?vv+ z{pX9Vm%Y{$PA#l{6qIOWCp)Kmo-SMO=nnY5I0N^cV~?foy|>LOQjyfCl8pB1X(sh| zwEyOcD4%!7y3J0y+>~f6XA9ll-aFA*buM%DZP`<@R((rZA9nyzy^A1oq>&j7Z*6pH zXz%1+&ecufaZ%3ZT)l*H?7m@IHEBg{^DV3feqLJo?Vsw`l>o}bRkjJjKOtICkj7Cl z0W@e23Y`%{&{AM`6CYdPq0V99hOA1V($N=ih6=69qDhMw%+SAaz)B^LLgTheKq%?s zj87mVLE#oABQQs($%`){jIZ;6pZ|#!$3iT%P+-6h&+|hKy&YiioAF{9+%vLkT}_Y0 zq0aq>Vwi(D*NlOadUUj6a?f63Vm>_oC=`;?r7!)|rcYPfJw#ULP+F;QiAST2hlERu zLM+DQw@gYL8$a8m0;-Gk0F? z)At>w(Anq6ddr~I@0*lO1RO1Tv>X5n60<(`IA`4Sx#^uR`+4qC@4I|RUIW>uy<82| ze9WF1>y_saAyFWt6|zvA9dvCaRWQE}uN>P1d{}`rJ#H5SVXPa)X6>5=5BMm2aQ{<9jya`}_*Pq6cg=F7sw~pGcSqs^E#T zH#3S=3wU`eg;{fc=vuW_Q-uEb3#JRQc|q;76bvYp40t2UT(hwwwZ6CAnpB$*Jp~+v zXAqr}3T4R)JsTvDQ}UjwQNObpv*5(P*as-=o&mtM?s&&PO>K_ffA_?q{9yZpqQcN% z@mCAPkD9LYluoLKLVy>=nf}*>4+lAMpgWQ4U4?A_Cd5U@Czg-g=#?o)hx)x2Cfvgz z^k+3&bfzMpmN->O1e$%0WVz3fcR5h#JT5fv_D3lTEe3HvK^zx*j2Q4ty+PXis?^y= z`Va!H$b^A?Pem*Jxp5JHThukya(JE=Ju~%+P~Kf6m-j%PD-e3SGdD#SQk3*rGyI#( z!Mx8HAmK)=h#3eXMSY?dMwQU@fFr&aTiJ@XJ-m$KA%$%$&q4G%t&|@M{B-ynBeF@` zoTuJpW(zscE?zKi<%D3}efYaolT1E6+!g-=OuwNebmDNv9E`Uaw{}JXiL|^`M(zr6 zHo>qqv$OB0(fl2^-u^s@4y9BwSrAo|#T64hy zW#zS`{+7drJ>Hw|bxH@No~~`N%g{sPLf{tFfJql_(wiW^ht_d1Mq)fYBqsH>u2w*_ zil9wxoY2(Vodl-;@biqmVg}V?7-6DCYerBv{FVc4=mjA<=4s6e&l{yckxCWJZ*=69 zrUoF)FcAe8tY!qK+dkyekIXN6$QqGw3w4UGOVa3YCEt)=?S+REYyB3km95aLO=obE zX>Ku&Q+oH4Cu$nrZLjz=f^%TLxU7$sq1Nuq_+9c>epRbL+)YR8DMvKb>B$lD_&`^I z_o02?4dFjz#?DIPrehRHIB#S|M#A6Dui|0g!`GIEG9|Zc(U6j){a!H{?tWuH`6v*2 z&eL6;``T=091JY|&>bRZ4P(#Us>8+tp2jXgOuB3DU+3tP$h!iSE2XK4=GD~YF&Paw zFfnT-O%XvV&C`pNyjX3dC@vJw`edy@EAp%97V#iG5%n0j&@TB4S5IkUq=hy~VCuRG zh8v7rEe1(mg!G%af;?gH&SO;tyx7-2Uwa{1wi~*(rya1Omw67$SM9lwc`jzCQ#4fU z#Fi_3d1t4EDp!=iBPo+Yj|)6kGU;LaAVJt~AK9H^ScR;x6eF|Zl5Owp#+nrUh9z{O z)@C$qRnSX1#<^dRr9}lwRskAwTV}6ahdsxgjvw?|5te(q3PGDdNAT4}un2s7=bJ{6 z!t{fQ0Z%EyvWbSK6*owAmWQAZ^H-dJ7s--yZ>8{13|dryrB+%_oevlE71KxeP9j|F z7a68EeD$z-@s}=ft~}IaCSr+F@u_`35e5onNEq}7QrxXp$?;HoAYk56q( zMcv{5iw0n}VO~)J74<)+<^Qn;pziQ7tX!S*h@27c*%7<*vzwRdy#tfzy{e)>EAQJE zP-K|PDQw#;oB56N&B$Yz{)Gv|co@u135be=KD4Tto2a)UQcm}BcH0f1TC&%3T)YpN zp-C-EiyZAoV=G*x{ZIvJ#?)_JII0g@6@6}g4c|>_6BhoqEYRwx#DX51P9rMzV}*PsHbcA~|$VhhlwzgK3+5xIEC?E)Uqv3G<|)$OEx*D2F8C*2~z zjrDvZIG9JJnk#);BB^d{H0ry0LV^24`qt5Kr#$8d{S4HOIZ>!&&Qvwkb&8*L$b+Bq+helzAZG_XCCMqnrPElDK1R@-EyCrqM*RH z6HU;&MR3zTqSE~~gqoAYK(lCUydvw;6FI;|L zx|MzmkY0xaScPna!Q{cnX$Ke82NyWXg?R8M58KL9$3Gm~#RwITs#oHT4vD|PSgi3b z5-#y`r90h_m>+*^Mg6BL)abZeA0+4s!$cYG@9P+4Nu)v8sa*M7Q+srq z+L17;N^`+`w@6s*1H6VdcRqwZ_sTrom@_F*eVdzIy(W*XO`*cAOVfKV#ebKZXHy_J zS$@dATu(v=phSYg^QCdabq;{>UFTN~K^Krfe;|IOHn)n_72v5K+zT*$%Soor#6M}o zaxKrCY3nPK;^x+)P1M2}qBpB18mYgIKZrVxTOzH~;5TxwbI>1-#_zG{%l@bD zRJhve2(2m`vO?S~O~SX~PvU&e=3KavA+@AF-_HF1qaR4_c^xt|)?)k#KHw39Pu+ig3hoR7p@ZV>_qS{2Mgfvc?3bgFy|6=eS*^hP8C$iYt^wQ4S~J@%$ldNsrN5k8_J#4>4m7 zbsz0JP;YC(VjQNhA@y={2AZrKKb%Gc*2fteJrm`9xp3pqAy@W|ij#gh*6DHrU}K*b ziiE{=9W`Onzt+Iufx=x8U#Mb0djq(3$&7>pRp>v4v6REp1)}1p+w&fkf)VED`H4cC zziY4x`<-Mo>{%TvphRp+nV6PfSmy3}+@nVI`#}_PqPSxK6RLG!yS|YZ3sy6U+`0QK z!V-sDP?jp#uCe!=jPWfZ#Ju8gLLR^UAKMC7{T-tL;5r|v%nXg?rjcXxv0cZ`T>&W9 zmrnjs#-F(G`)P^w*7w96w=&}tZgjS9JO0&50$Ky@2WLrMF8vS#>O6R2gD;UE9Ckc` zhbzs~Br0psr<{DmVM{N`RjKMU?H4Y5~Jo# zX_LCcozz9^%(u^4?ZA<&2YA)gi&2jV>@ckOSfShSvM7N)r zH58B!*(=(1ey=q5PRGTlLRvp_lb(nsy1Dn!oh&Q#_6d1`ef^(!V#^~uTr-I|ydTW%E95N|&|4Y)ip!hZpX;Dfbo>Ezcl5Ru2@ zQ$vfoRZKJ%HKE`gfLNauIy^&BLcotLi(jc#DmDmqE%iHoStJeLmY&WrG19V7jGX9` z`CFKs;+IKgI!xmz@Xrx{r_@k8*E_v?i%Uc|8=cM+S!-}Hq5{e1>YnG-{-ogRPfl?8h z>W^6LaU8A@>U!O90&1bzvX5t*N*^icY{+1{FDnkVKlMNKLei_Ds)#+svwPU#*`vTs z=5S}<()@^4EZeoB{L}L0Jz_?!H8JKah%)#JpH(D5(U1* zu|#}WaRoJj13ZJ_K`GD#gwgple(Uarv!;2`K3j6@K0p(oLWA88^OQMmbmy)%06!*u zarspzMN6DxhS(H!@z2Fn7vSRJYV!H^U&DA)4J_K&bplVvUkSPYqIUr|C@VyFh$jD# zX3|^H!=UhG_fhhdtrL?m4~f{eY=JXasRa&rUw$i+9xN7!wIm4}SR{@n zCU?T1{lFD{&rb^nB@%i$9#{OO%r^20VtemQ=Xx7pt{0_cCY%?6&`8Pu=G6<-1eUEA zuOH>W?KC-vz{SDkO1<1=oQ12sRjy-7k9Ig~g({LYPM@??Sf$LLhlhnwF}yPEUA3t- zNw~%*dKDMtG6>tVj6$-Bg1F+sGTVB%LHr0&CuSa&bj@<+UaxT<*Y?_K5acT6XNm~7BmCi=iD$)6|l%@FVs*saF#h`hS( zSkgshlUGKIK0+quSw_w|Im4-wZW`uXNI0(pse+n`seEaF6!S~ypAo*pw>!tO`0X*m zz1I-|_q(tCYVtc^THs9)&Xx4lmBc!-^JFx!Xo} zd-Td{mj&j}ba5PZ|Beg_jAp{jEqCmUa|}cG<9hp-Ywd|t_r%D}a5KVji*del5#B78 za)w?4OdDVU6RW2xH|b$OT|`=TS`755nMC}(eLu%QZb-9Tfnm|GK&|f&a8`0%;K72m zg>tk$D$$=|2(utW`$+qhF87SIAOS+!PM*Y~i+fOgro8CJx(H@E@I>*tq` z(c7b`KYO-s-!jL3nM?^PNidfZx2tCCymnH)+(rCjk9`t}w5*UWh?KpuU4SUQ>5H!; znniV`PQ)T7_{t7e72&eHO^-lN39? ziua4q{XMzx_4)*4xe_)Tv)S4|eZwxaN#)$&?3+pO#+lQvzc8ok_WZ*N^a7@y#f~q~N@2QW?6B zo(&n?lg9*agPhk-gK9>53oL%{L%agwe}Y)!z%Y~s6KfSpQ>knA-xFMQDEuK~KJPD{ zUQ19zT+AAxg}AVqv#MQFTcXoFdU=!hV^$eBx@en}E5RzdTn2_i_$_0l=n=(o*_>QXHNs zVTNd>!ANa1?x7F_9XvTXClg zTU#kVttu}t=av{?zK>UrG@%5(do%8!_jVdb1bX()JVuyYMRFuzoumT{%{*h$5F6=?8!~waUlq@*rE6 z{qg<3U^#mi6{#x#CZGF%%Njut>yK%I8Im69OGxM9F9nyZ$04^?ow;%KZG`7uniq&*~FP(3rMY=Ey>%8rqX+t|!@r z_1V2tpw-%8Ny=<)oJ4O2=!pBzFh@#M>X>cc3 zO>wR2CX@2qxCCN&rBu0rm^WPfG9c~6UfQ6*s0r9PRrYLL-qCSww4(G&+O!23At!OA zIo|j;(HGOu$!vvf%{aKMnQ<#JX3)`g;uX)!SWG{!1;k3o0uDy41XuQRz%(RSMw5O_ zDF_y0Me|Pmor`JE)dR9d+4;&s2^cc;!y9MHhzQ|W8Q%uSZDI+}E9K2>GRvEL8t^K7 zRyBb2M3ylNndAb`!YI|Bgs)2&`$B|$5S?)dopKK3wkjc!K2kyRQ2(Rq@F8}%{SSle zyCCMt4(#MCb{Cm-d>~hYh{}rRvYZ2M3O1FIjnYyM8^R*HA(_xBw`!_lcTE@oD7xHfu_NiR*p!2I&(m|`art`=<;9|`* z1buntM*eoYm0o%)qpeae)wcnOnx4=gm5W8&wnCI}R!&qPh>Eh%xdKl{i?-=JQ-PVu z0j8lXk^a<+L@RfJ&6TgbQhmM}wl4`~O1!!FT1k0doo+T-%_UX7cB!1ECPhxE`A1)e z94h1SUje{Omjm)nRAeEA_YP^iO) z>NQZ}X>b*_AI458&3rXyd%&=8w+zr`!VD(J4#Jbk;rqM$Re@H~eb8Dzyku{Be!8;o zOo=#<$1;P!K)=*LpOI6u3o6YBzYW#{QE8~s)`q-bV!EZ1{zp3@nTYt+Z+TNZ8!A8v z`j2QcqZMJufND_b8S%>1j?=$HQ#~MM#2Z`0vNupvotQlmva;jj6}4ZK4N9{p7A@5* z;UW!Ne+%zH*L;$y9;~#nArG3E!q$Ap`G;W`&IYoixnW-G5q!5Xv{L!!af6oU);m0{N|@+HegQ zk9t{-yL2GmImNrYkxa1a2Ap+dJqS_OnZR{3G?~5@0u_e%M+2DL`i$a<(S=^_0CJ>k zi2&}6_+>peo6v5knN#@c_p58on68w1n3juD<|3&E7%|%Z(*QktqR(^G8o#O*pnL`_ zK#{7>^Xu_`_W@AR6_u+_EJLqy5n})@FQG5IixRl%kkI-x#rMP^+5-FWMPm+Jo^+^p|n(oQm#8?LR1cykX=HNHP zRaS@hmbx%lB~@VqAdhkz4y66{RxrtUZ&XodJF%CtHLc?p74H%!pOL(Bl*)NDMzpL- z6^??bBd=rZKUwO7M87`4@hDO6dGUD2zYr#eXV53rmE9=^O5N|x^{E)AV)+G#8#NJ$ zK~(Q&L$CgtKoPQ(jp4kxtrbqUE}dC2UkNvmtRWxfDL~Q&f8&~XWCIb74au!`+bz8y z))X1?Y7Fp7z22bw6@55eBmXx~z`~LAE*px@DKO$Nd1^~}^nEk!s;BBpAE|T#J4Z`g zCz#ConEiU>^aL(bsy5IT$RlJ7Kq)QZalLYx!91jm%hU){2tS0K(_&~QY*JiTv{Byl zCoM{io4ketaOMiR^xP_QLVV3z8D-o3SqC}nqnugq;j<)a@S`G1dES;cQt&5Z3{Z(V zcK4CS6)=mMZA0*Xk5y&FAP9ftNRGy%FvprH$t+eCm7ljoa27VHPMmq=oWLoo3B$qI z*RIh~hQw%tFBO~9a(A{{%9QvMg@Ax06Af|TC?)8f43-aC6bdUWQ5q>GF?Q{Qf!GeZ zRVgf)w48o=^ozQafMZnFDnR-*XW{*Wvrm1y=65HO3x7}st*z|hK8_J9()tnO69rA- zR*V$C8AI-u_0}q+sARjmnv7fvj7{MTx!9>&&BL9@`(-vF3ujt)Tq0g&s?0TR&JJyM zut18Xm~ceO!!$WPh@ZthEQ4{fnD^gM(Dz~aV#Zul|4;x?$%R9`ynXc#bqOfEI2RX35 zt9{-#{cgwp57~-zXxq5^8_GIoR+t#R!_CCOlhGdvsm@-=wD32&MMe3;W}3P+#L-** z`XEY@3>9*x(hsy5sJ+8HLh;!C%(H4`QVz3kOte90#fdosukKdnecsqZD!{1Ay}2ni zRK#6XDo7n%7S~E9UBamXgxo_-I9ri`jI`0%OTs8~f#l9o!Cf(?;_)V`@A?uwxuImY zGitKV2D3{(#fD5B?>g%WjOq^C(c<}gae@GnTs$Q9>#sVgj@_lCB*%#iiLtw#;FhM-JUcJczD)jRm6M`Gf{pYOhn;$3MdgFSg-)pRD|^gpy(ZL1hS5 zZTf53y+Qq2b~EiFf*f2Z}L>L=F+!Oxt_13<0XR;eJ$SxeGwh4s}Lre zn%_j#Q~wC(kVMe+cH%cnurP`1-sa?v>E|!&ydV&$Pt9yXk++NVOvATWDtTc2v({Hq zb|}3O&x4&GCz~5&Fc|XXJw298-Hc3yOCvJz*w3HOm=(;J_$3>TglqYplfM0*WRp{I z-(Banvjf9jS1;-jSj+B!Fn+YFqEh|Rv&h!*u71tUtu3t?ONBbdJ&xmu3Tiu8e5jg3 zLiN#^P4>r~vlh$$who5pQrr!vps_A@AMLw0Uwt*{f1a%3XXnro3RoCBviQH59*$PM#o<3?^uq29!xYMLo|jj z2W+-rfn!L9W5a`3ng%0g8^l#_8O+%XGTG{NBUmVv^GSu68f(+dK~>?p0Ay2Ltzw z?-ky5SNWM4Qc52mU6`>aP73T_nUa!^_K}%>WOdj-`@hbX_!=z1v=M~$rE^5g{}D+o zMq4=rOj}zspa}z@p$QCEn)A8R(<5XfgCtCD$!b}XBH;th-Btt2l@fYfHiVukh*!(_ z);e&ZM?2l@E+H=GI*rnghyFzwF)xo__MU$D1nS@PtQ-^&*zQovJLzoLWk6;Iy5<*n zXO@reV_k`G99-tkIB`U3H{>^8^P&$i-6V5a+VE#ThQQhET#mPjY=Q0_+uK_^I{QOP z5BAB!N`qIK+|-z3ol3^Ee?P8AXmCEvVQUD;mM|{-hufdbh1ZyOe2g>Bm`8NxyDqR( zsxh;>rF!L+6+o71{$t^QX9>m__N)=zDReQneKq&f4mDgh z1l7B_^{{Un`>E?!VJbmkTIMZ z^bcm2r~kziCJ=oM{M7>*|4lk**Gkh?`h}NY;LxUr2WZQ{juY$1`&RPfDdKMXR#26O z01FQUvk+KEWg<$Irp`PU<&dIf!6ooJNv>j^=t~?xGHV$M$;w_t^J?pXxwWhkjJvFV z(WQBEa=J`L`7*zDje zrOICGNMa|r8e@XljK7koM@Wts-Fb*)v)G7I)gc=lX3e*@(W&?^I!eIT*E+_DYxA%v z4D;BW|E=P;efs9Q(huLW1y+bE7*$J)cXi#y1<0R9Ib&_zdhouc=2R$&Pw&0Yi}g2-w}-CUMmtry<=)S- zszEYW)1N|iA+G&~6J#p>$Sf7=7bN`Z%4%#=(%~mKWRZ9`RV#V>FekL~X2D$R`><~D zK48>C(yk^$rNKB`SE~|_9SJJ4KN|eJJ__trA5c$8-T|nFY^f0H{uyQ93=Vxg#Nfu# zD0Ew%8~7VA|BG_vF};)wa8Lrr^%^rlfpYCf)QfUOJYbvFYD}2)Z@Kx@gKvJ!~~#>8mWrQ3LE5 zXRaF7bH<*ut*)y~>D{Hdl;P%pG421-{HY2oA3y%DU?D}M)0Q~$dmoYDDlPNbYjP{+ ziKd76QyPACxk7*KK-(0y$8$!As59OyM`tVA!edE=RXHG?ORE@Gr+oi{v+h+?DZ(iT zoHJ?Vvv?&`ozm&3b(=YZoo1>z|3ZWtD4W0>3!|&((2FxZl@w9R#iq;mUUB=P{)@6l z=B=>essu3V#P~+>+=}H_DcTqRua$1k9lNBu`e{ls1Fj#Jj{C8YfT(OV4 zJf%v<#3$JQiG-1?STx3soCMdXbJb14)f0noBKoB(eHg7t4J>BO z@TkurF_Qs74QbQ3$s10XZx3QuN@?<1qir1V60Q>KhkdcvIb5NpY8ZKvZAzmdO80oQ z?i|;H#a&3SRflV}I;1MCQ1#rIp$?T10MTsMf3=w%-nV}%P?Pz-3+&@z90m9{a=stF zAT&RSGmK;pAP#=1BzZxs`-pA>_?t3Qwnawl# zcZ6k4_u(Ue2o^j%W<^@VuaFr~4Hsoi73tkxh$1nzz<-~|n&=+9pD-IadU0-2ggJit z|Fv?SK}~Lp8U_Jr(yR1<5J5mXAv8t6&_XC03*8`v8uFHS4E1V|njdNP1eCb?7SX57msH}SOH9J2 znB6r=f;OnAS%18=0BOCW&JVW@J6sU$b{Mt!xI#XBon;z^BB0{%3wiKJb0G!q1s=Pq zfC4?Zn>y5mv4_Dr#!J6|WrVS)4PKcrjXz`eHbwJ_8ISoQ#DtDk z*s7eq(UBuVSK#NFCGu!3#9;A4PPVCPN#Lr3XMPr0a1D|c5ny479*2&VouaRa&c9+8 z)HGB4I!2e&;LI6LUHF7c?X<6d>~l^@lE#z^&LMu!;6<22Z-x5>DO2kt(YMsnS<(_P z#RZ|Dg>AwEEuRV&zy3}{jQY@|bFNz4c3rPZ@`f52^ix}Ej89K}mIP(K2Zz9!V;*EZ zyA%3;lQcOne1|%l3Dtvf!H50GNkExRn%kORkKdYo05^r15iEE}UlPzOKZ9EJTb}jT>;*tYidzx*tLS{m4=d+|_$zH)^>mWP zrP^kfsy#Tn9-LE%Dhtk7PbV`w|3*AuvD>*@PDi#<73Nl&T1qFC-6brR?&_yTblK z@n^}d<8rD-=84s+BD1b%X)LP~Dk2d0(WR!aC4{2Yec3C+1w3U<;-Jc&RX^CZ{QhA2 z&0zCGjDHZ+93&Zq=v{v1$|u3;j#4Kd=B$S79G(6v(!ySvudQY3uZ*Tas7@cVOQ%@Ga=3A;NRVKyGzU1b=yOuAb z_Y?c|3Qq%(F&$J=Z+OwNUYT%aG?`s2aU%VP-wCK#99W!bSH>LUXt3GX>#{!m`ZY;f zGo&ku>w!$9Jft$a@G8uzHWO5S&}6vp&mLJ6z8RaGY#}W!`cY?pEx#zX5~h2eoBV)a zn&~dBmNv-R?ucL94}@I=59w;y17i@-Z8-F42hF{dN}s##z`uh_cysfZN#Do&ey7(y zjA*|#FhXUA1k{JmN7AF7%6+=@-WsCVyS4|(sG>m)2;166sMre` z`S5f&jZM^6Dfc&9(v`~E9G+u5F$%Rm9ijqD8cDPCrrPH|c{4O0M1+%SRP96TlBIk5 z?g^L3)Ukv|hV&5D2_^!sG)rNIM(s(lT6kvMC2VX*7@|<^0a;6e!7VMVK%(yB$KUIU zb-Lte`=zWJ;$O8D1M}riRv2-(2j(O6N%->T;N~_WNckaTysuty zcJfEV!{Z0;KEVR+>|5=Cr6p|8btM;(GMZaqgDm0{D@*I#|BMxXX-+Q-nlP@+PWjnKVJFC(heOFj zx)YR`wG(907QetxB8y_{#@uZ&mtzLK9w4iYvutIQkCYHoOv(eBc1ToU5~S&-NurTq zCpb%?#$wCBEHoJm?+t00Z{Q(D&?5^%DSy8$RWfyqtyZQ7jd;|Yo)kdIC0T@;z+@Y! z7Fb?2DIM+U>h**z5jboz)2&^47I8whQ#oNV^+47V)4U^7pH&UQ(Xo<#|RLC_Q2chrCJ*X6D^lJM0`|!q`NSN$|8BRmH`t@ptx#) zeLJ;LU0|tJ4dKQ6v8F{7Py5MWlmVk)>L_+Uqney@s5vM1^hmD&*1>t^=&vLy zMxQC<7cUxL=1mfAon^DvTZz#Ye)=v>Jyjg-HpSN6KCN|d^a0{nKjqQtGIRjaeoSo#+Lt856X}3j7tXMs_b!1nxjs?GpLQ%{A%% zJwPbxHse1Y{qDXDvHgWdZDd8- zu(;4ZwAByIPPeC<>v$LAmMA8U?b&*}1w|S0?^mrpj50T4LV~@6Rp?2NIiS5G7sT4W zgukk;Jk{QBNMy(z$2g=eg6=)AcV3_E`RtdQpUG+KFhoQDc3M?9Z*bpMcG2uzzIc$} zN*jC5GsaT-8E7^H{tY_r>y(q{2*kWitp`z<(i^^@^k2`i)v6K~Bsp`ba zx20u@+B5QR(Wg+hlap6raRco|x7L8xi-TRVCO@-5cQ&~<#&k#4onX!06DI@1cHzgg zXOGxix;Y0uW8d9Gm|tqUG&>4=a&jgwqn$K>8Kk33q&XXrCD5sjVfZ!kuioExZb#9y z&X*(a+CdpjCK&JADv5Ia&c@I%*Zk_AFfUxiD&XVz4fd2Sd~G|GvGU#s3yk33cbpeg z1Js{g@lK7|(FhWf))66HGG+eD@OwzSnGIspoWlaW+>Tk#ixRinMdY|NM$OP>I&3w5 z|8yfZK8kn1Hdzo^GJty${)`#ovIu`$wE>?%Fb^M8~vq|wY%n18>#fCyDBdE#4PfD3No<#*3ac=G1fK!p#h z{B&Gcr3WWu6y5f7;le>8tCJIJu*(E{4|q_d(>v-F(-=742x#pVg+)BcDMg>7 zwX)7N`(#aB|LF1;6;^uP`<1j1Tb8h)_fzjSz&z|VPW-72*So6;DDM45pMu}fo&SP# zOoBqBI{%S*q<2S41a&!I6xX5vFM~tJwJATLiHY<<6?>1!vAdi0j(Leul-tBgaIlEc zd`i(1OUSzSM>p#r08=|j9AoOe+DXsltJday&rX*?8s4m$Dso3| zymGfV&1oBkxHArSh{f{1RJABI3JO~=6PNY-b38~FyQw%ak8GJmTjHGKRBV%FM)t?a zk3x!@HX zg)|jz0?@psJF-j8?V)aSS#(($NDQ!hgG8RSn>(5_@fvYHH|qXlW1e_awJ9r6mQ)dmZB@ms)`oh(`$1g>QyBYSQR6Ju!O`9fWGalSZ zoQz_9zG|lxd%*G?)-!H%1@pxKDIJEiQ3jscuI@8owLe{|x}Rx+rjs}v{q#Y8)Sl_o z$?Lb;_UCe~-XFQ$wgADFk%`-Ei;W~9sTJNI)NdtaOKUsZ2~i_xG|ss@eJr$bi~2Rh zRKKw9j4=h*o8n*pD0!nRzn3Vv8K`MzlvaHTYJv*|oFDny`Wy?t%{R`zeSk74RoKq2 z90po|POT;`DI1xHUTWNYW4B1V3?TjUj)y_MYcr0FkNB_=yssH871QIgUX`HPGr99IY_0vcJ*c;#x zL{r%kVw|K_@tuM^vWwSI{tvhYdaB@+p-&S8T_XAl`32|s;)jjt7a=>2=*Qi zHj#XnGI?n{`!aPy2%v2rEc_(<6A|{O=M?IR@jiBL;wB-r;f0T?*5m8@GP;+;`DdQW zNLCI`EZkHO&`F`Xsk=BBTDhPQJ^lYeD^6#q+By{o4dF7dmI2h@q~*X>-Jf!u^yhIK z!jJ=ph%p)N5-DkUvHJM`YXS&NTr_)dI6eKV2;B7PQYy+i_d6JY4U2syawBhNF8y5H zJjxQOiFN`zegFUf literal 0 HcmV?d00001 diff --git a/doc/user_guide/en/images/ft4_waterfall.png b/doc/user_guide/en/images/ft4_waterfall.png new file mode 100644 index 0000000000000000000000000000000000000000..07ed6398a134587d5234f5714e7732d289166737 GIT binary patch literal 35788 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 Date: Thu, 6 Jun 2019 14:21:12 -0400 Subject: [PATCH 137/159] Update the shortcuts.txt file. --- shortcuts.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/shortcuts.txt b/shortcuts.txt index 10276a269..93c75585b 100644 --- a/shortcuts.txt +++ b/shortcuts.txt @@ -13,11 +13,11 @@ F7 Display Message Averaging window F11 Move Rx frequency down 1 Hz Ctrl+F11 Move identical Rx and Tx frequencies down 1 Hz - Shift+F11 Move Tx frequency down 60 Hz + Shift+F11 Move Tx frequency down 60 Hz (FT8) or 90 Hz (FT4) Ctrl+Shift+F11 Move dial frequency down 2000 Hz F12 Move Rx frequency up 1 Hz Ctrl+F12 Move identical Rx and Tx frequencies up 1 Hz - Shift+F12 Move Tx frequency up 60 Hz + Shift+F12 Move Tx frequency up 60 Hz (FT8) or 90 Hz (FT4) Ctrl+Shift+F12 Move dial frequency up 2000 Hz Alt+1-6 Set now transmission to this number on Tab 1 Ctl+1-6 Set next transmission to this number on Tab 1 From 85bc9ef6be261115c525b0641d71e4eef0698915 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Fri, 7 Jun 2019 01:33:18 +0100 Subject: [PATCH 138/159] Update prerequisite packages to include the Qt Linguist tools --- INSTALL | 62 +++++++++++++-------------------------------------------- 1 file changed, 14 insertions(+), 48 deletions(-) diff --git a/INSTALL b/INSTALL index 4f6e85b78..3886fe7c7 100644 --- a/INSTALL +++ b/INSTALL @@ -30,13 +30,13 @@ Mac". Qt v5, preferably v5.5 or later is required to build WSJT-X. -Qt v5 multimedia support and serial port is necessary as well as the -core Qt v5 components, normally installing the Qt multimedia -development package and Qt serialport development package are -sufficient to pull in all the required Qt components and dependants as -a single transaction. On some systems the Qt multimedia plugin -component is separate in the distribution repository an it may also -need installing. +Qt v5 multimedia support, serial port, and Linguist is necessary as +well as the core Qt v5 components, normally installing the Qt +multimedia development, Qt serialport development packages, and teh Qt +Linguist packages are sufficient to pull in all the required Qt +components and dependants as a single transaction. On some systems +the Qt multimedia plugin component is separate in the distribution +repository an it may also need installing. The single precision FFTW v3 library libfftw3f is required along with the libfftw library development package. Normally installing the @@ -256,47 +256,6 @@ The above commands will build hamlib and install it into ~/hamlib-prefix. If `make install-strip` fails, try `make install`. -Qt --- - -NOTE: As of Qt v5.4 building Qt from source on Mac OS X is no longer -necessary since the Qt team have switched to using the modern libc++ -Standard C++ Library for all distributable run time -components. Instead you may simply download a binary installer for OS -X 64-bit. The binary installer is here: - - http://www.qt.io/download - -The binary Qt distributions prior to Qt v5.4 from -http://www.qt.io/download unfortunately are built to use the libstdc++ -C++ support library, WSJT-X uses a less geriatric C++ dialect which -uses the libc++ C++ support library. This means that you need to -build Qt from sources. This is not difficult but does take some time. - -Download the Qt source tarball from -http://www.qt.io/download-open-source/, the link is about half way -down the page, you want the full sources tar ball shown as a 'tar.gz' -link. - -Unpack the sources and cd into the top level directory then type: - -$ ./configure -prefix ~/local/qt-macx-clang -opensource \ - -confirm-license -platform macx-clang -silent -nomake tests \ - -nomake examples -sdk macosx10.10 -skip qtwebkit \ - -skip qtwebkit-examples -skip qtquick1 -skip qtconnectivity \ - -skip qtlocation -skip qtsensors -skip qtscript \ - -skip qtwebsockets -skip qtwebengine -skip qtwebchannel \ - -skip qtwayland -skip qtquickcontrols -skip qtdeclarative \ - -skip qtxmlpatterns -skip qtenginio -$ make -j4 -$ make install - -If you are building on 10.8 or don't have the 10.10 Mac SDK (Xcode 6) -available, you can substitute '-sdk macosx10.9' above. - -The build above will take a few hours to complete. - - CMake ----- Although CMake is available via MacPorts I prefer to use the binary @@ -328,6 +287,13 @@ $ sudo chgrp wheel /usr/local/bin and then retry the install command. +Qt +-- + +Download the latest on-line installer package from the Qt web site and +isntall the latest Qt stable version development package. + + WSJT-X ------ First fetch the source from the repository: From b3d6f5d22e7ba687ffdc0f15ed585578556f822c Mon Sep 17 00:00:00 2001 From: Steve Franke Date: Fri, 7 Jun 2019 09:04:55 -0500 Subject: [PATCH 139/159] Fix a typo. --- INSTALL | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/INSTALL b/INSTALL index 3886fe7c7..42169fb38 100644 --- a/INSTALL +++ b/INSTALL @@ -32,7 +32,7 @@ Qt v5, preferably v5.5 or later is required to build WSJT-X. Qt v5 multimedia support, serial port, and Linguist is necessary as well as the core Qt v5 components, normally installing the Qt -multimedia development, Qt serialport development packages, and teh Qt +multimedia development, Qt serialport development packages, and the Qt Linguist packages are sufficient to pull in all the required Qt components and dependants as a single transaction. On some systems the Qt multimedia plugin component is separate in the distribution @@ -377,4 +377,4 @@ $ cmake --build . --target install 73 Bill -G4WJS. \ No newline at end of file +G4WJS. From 067692cd1e176a7ac38d19881d223fccd4f8818d Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Fri, 7 Jun 2019 17:21:57 +0100 Subject: [PATCH 140/159] Disable automatically enabled toolbar on Mac Qt automatically adds a "Menu->View->Show Tab Bar" button, this change disables that as we don't have a tool bar or tab bar. --- widgets/mainwindow.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 2d3964efa..0d6d63e74 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -413,6 +413,7 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple, m_manual {&m_network_manager} { ui->setupUi(this); + setUnifiedTitleAndToolBarOnMac (true); createStatusBar(); add_child_to_event_filter (this); ui->dxGridEntry->setValidator (new MaidenheadLocatorValidator {this}); From 53cb410b8ef1367d6c10ebc2ef54a463102d3b72 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Fri, 7 Jun 2019 23:48:21 +0100 Subject: [PATCH 141/159] Use all caps for Maindenhead Locators --- validators/MaidenheadLocatorValidator.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/validators/MaidenheadLocatorValidator.cpp b/validators/MaidenheadLocatorValidator.cpp index 9de41233e..e7e1134c7 100644 --- a/validators/MaidenheadLocatorValidator.cpp +++ b/validators/MaidenheadLocatorValidator.cpp @@ -64,7 +64,7 @@ auto MaidenheadLocatorValidator::validate (QString& input, int& pos) const -> St auto subsquare = match.captured ("subsquare"); if (subsquare.size ()) { - input.replace (match.capturedStart ("subsquare"), match.capturedLength ("subsquare"), subsquare.toLower ()); + input.replace (match.capturedStart ("subsquare"), match.capturedLength ("subsquare"), subsquare.toUpper ()); } if (match.hasMatch ()) return Acceptable; if (!input.size () || match.hasPartialMatch ()) return Intermediate; From 3c23a05d1fb5e17be3a5c5340e2552d7a2979744 Mon Sep 17 00:00:00 2001 From: Steve Franke Date: Sat, 8 Jun 2019 08:34:46 -0500 Subject: [PATCH 142/159] Move demod and bit metric calculation to a subroutine. This will make it easier to experiment with alternative schemes for demod. --- CMakeLists.txt | 1 + lib/ft4/get_ft4_bitmetrics.f90 | 114 +++++++++++++++++++++++++++++ lib/ft4_decode.f90 | 129 +++++---------------------------- 3 files changed, 133 insertions(+), 111 deletions(-) create mode 100644 lib/ft4/get_ft4_bitmetrics.f90 diff --git a/CMakeLists.txt b/CMakeLists.txt index 6451b5750..4b425a6e4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -573,6 +573,7 @@ set (wsjt_FSRCS lib/sync64.f90 lib/sync65.f90 lib/ft4/getcandidates4.f90 + lib/ft4/get_ft4_bitmetrics.f90 lib/ft8/sync8.f90 lib/ft8/sync8d.f90 lib/ft4/sync4d.f90 diff --git a/lib/ft4/get_ft4_bitmetrics.f90 b/lib/ft4/get_ft4_bitmetrics.f90 new file mode 100644 index 000000000..6d87485e8 --- /dev/null +++ b/lib/ft4/get_ft4_bitmetrics.f90 @@ -0,0 +1,114 @@ +subroutine get_ft4_bitmetrics(cd,smax,bitmetrics,badsync) + + include 'ft4_params.f90' + parameter (NSS=NSPS/NDOWN,NDMAX=NMAX/NDOWN) + complex cd(0:NN*NSS-1) + complex cs(0:3,NN) + complex csymb(NSS) + integer icos4a(0:3),icos4b(0:3),icos4c(0:3),icos4d(0:3) + integer graymap(0:3) + integer ip(1) + logical one(0:255,0:7) ! 256 4-symbol sequences, 8 bits + logical first + logical badsync + real bitmetrics(2*NN,3) + real s2(0:255) + real s4(0:3,NN) + + data icos4a/0,1,3,2/ + data icos4b/1,0,2,3/ + data icos4c/2,3,1,0/ + data icos4d/3,2,0,1/ + data graymap/0,1,3,2/ + data first/.true./ + save first,one + + if(first) then + one=.false. + do i=0,255 + do j=0,7 + if(iand(i,2**j).ne.0) one(i,j)=.true. + enddo + enddo + first=.false. + endif + + do k=1,NN + i1=(k-1)*NSS + csymb=cd(i1:i1+NSS-1) + call four2a(csymb,NSS,1,-1,1) + cs(0:3,k)=csymb(1:4) + s4(0:3,k)=abs(csymb(1:4)) + enddo + +! Sync quality check + is1=0 + is2=0 + is3=0 + is4=0 + badsync=.false. + do k=1,4 + ip=maxloc(s4(:,k)) + if(icos4a(k-1).eq.(ip(1)-1)) is1=is1+1 + ip=maxloc(s4(:,k+33)) + if(icos4b(k-1).eq.(ip(1)-1)) is2=is2+1 + ip=maxloc(s4(:,k+66)) + if(icos4c(k-1).eq.(ip(1)-1)) is3=is3+1 + ip=maxloc(s4(:,k+99)) + if(icos4d(k-1).eq.(ip(1)-1)) is4=is4+1 + enddo + nsync=is1+is2+is3+is4 !Number of correct hard sync symbols, 0-16 + if(smax .lt. 0.7 .or. nsync .lt. 8) then + badsync=.true. + return + endif + + do nseq=1,3 !Try coherent sequences of 1, 2, and 4 symbols + if(nseq.eq.1) nsym=1 + if(nseq.eq.2) nsym=2 + if(nseq.eq.3) nsym=4 + nt=2**(2*nsym) + do ks=1,NN-nsym+1,nsym !87+16=103 symbols. + amax=-1.0 + do i=0,nt-1 + i1=i/64 + i2=iand(i,63)/16 + i3=iand(i,15)/4 + i4=iand(i,3) + if(nsym.eq.1) then + s2(i)=abs(cs(graymap(i4),ks)) + elseif(nsym.eq.2) then + s2(i)=abs(cs(graymap(i3),ks)+cs(graymap(i4),ks+1)) + elseif(nsym.eq.4) then + s2(i)=abs(cs(graymap(i1),ks ) + & + cs(graymap(i2),ks+1) + & + cs(graymap(i3),ks+2) + & + cs(graymap(i4),ks+3) & + ) + else + print*,"Error - nsym must be 1, 2, or 4." + endif + enddo + ipt=1+(ks-1)*2 + if(nsym.eq.1) ibmax=1 + if(nsym.eq.2) ibmax=3 + if(nsym.eq.4) ibmax=7 + do ib=0,ibmax + bm=maxval(s2(0:nt-1),one(0:nt-1,ibmax-ib)) - & + maxval(s2(0:nt-1),.not.one(0:nt-1,ibmax-ib)) + if(ipt+ib.gt.2*NN) cycle + bitmetrics(ipt+ib,nseq)=bm + enddo + enddo + enddo + + bitmetrics(205:206,2)=bitmetrics(205:206,1) + bitmetrics(201:204,3)=bitmetrics(201:204,2) + bitmetrics(205:206,3)=bitmetrics(205:206,1) + + call normalizebmet(bitmetrics(:,1),2*NN) + call normalizebmet(bitmetrics(:,2),2*NN) + call normalizebmet(bitmetrics(:,3),2*NN) + return + +end subroutine get_ft4_bitmetrics diff --git a/lib/ft4_decode.f90 b/lib/ft4_decode.f90 index 50c9fa47d..bd42c0450 100644 --- a/lib/ft4_decode.f90 +++ b/lib/ft4_decode.f90 @@ -45,43 +45,31 @@ contains complex cb(0:NDMAX-1) complex cd(0:NN*NSS-1) !Complex waveform complex ctwk(2*NSS),ctwk2(2*NSS,-16:16) - complex csymb(NSS) - complex cs(0:3,NN) - real s4(0:3,NN) - real bmeta(2*NN),bmetb(2*NN),bmetc(2*NN) real a(5) + real bitmetrics(2*NN,3) real dd(NMAX) real llr(2*ND),llra(2*ND),llrb(2*ND),llrc(2*ND),llrd(2*ND) - real s2(0:255) real candidate(3,100) real savg(NH1),sbase(NH1) integer apbits(2*ND) integer apmy_ru(28),aphis_fd(28) - integer icos4a(0:3),icos4b(0:3),icos4c(0:3),icos4d(0:3) integer*2 iwave(NMAX) !Raw received data integer*1 message77(77),rvec(77),apmask(2*ND),cw(2*ND) integer*1 hbits(2*NN) - integer graymap(0:3) integer i4tone(103) - integer ip(1) integer nappasses(0:5) ! # of decoding passes for QSO States 0-5 integer naptypes(0:5,4) ! nQSOProgress, decoding pass integer mcq(29) integer mrrr(19),m73(19),mrr73(19) logical nohiscall,unpk77_success - logical one(0:255,0:7) ! 256 4-symbol sequences, 8 bits logical first, dobigfft logical dosubtract,doosd + logical badsync logical, intent(in) :: lapcqonly - data icos4a/0,1,3,2/ - data icos4b/1,0,2,3/ - data icos4c/2,3,1,0/ - data icos4d/3,2,0,1/ - data graymap/0,1,3,2/ data first/.true./ data mcq/0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0/ data mrrr/0,1,1,1,1,1,1,0,1,0,0,1,0,0,1,0,0,0,1/ @@ -90,7 +78,7 @@ contains data rvec/0,1,0,0,1,0,1,0,0,1,0,1,1,1,1,0,1,0,0,0,1,0,0,1,1,0,1,1,0, & 1,0,0,1,0,1,1,0,0,0,0,1,0,0,0,1,0,1,0,0,1,1,1,1,0,0,1,0,1, & 0,1,0,1,0,1,1,0,1,1,1,1,1,0,0,0,1,0,1/ - save fs,dt,tt,txt,twopi,h,one,first,apbits,nappasses,naptypes, & + save fs,dt,tt,txt,twopi,h,first,apbits,nappasses,naptypes, & mycall0,hiscall0,cqstr0,ctwk2 this%callback => callback @@ -105,12 +93,6 @@ contains txt=NZ*dt !Transmission length (s) without ramp up/down twopi=8.0*atan(1.0) h=1.0 - one=.false. - do i=0,255 - do j=0,7 - if(iand(i,2**j).ne.0) one(i,j)=.true. - enddo - enddo do idf=-16,16 a=0. @@ -237,7 +219,7 @@ contains nd2=ndecodes-nd1 if(nd2.eq.0) exit endif - + candidate=0.0 ncand=0 call timer('getcand4',0) @@ -302,89 +284,14 @@ contains else cd(-ibest:ibest+NN*NSS-1)=cb(0:NN*NSS+2*ibest-1) endif - call timer('four2a ',0) - do k=1,NN - i1=(k-1)*NSS - csymb=cd(i1:i1+NSS-1) - call four2a(csymb,NSS,1,-1,1) - cs(0:3,k)=csymb(1:4) - s4(0:3,k)=abs(csymb(1:4)) - enddo - call timer('four2a ',1) -! Sync quality check - is1=0 - is2=0 - is3=0 - is4=0 - do k=1,4 - ip=maxloc(s4(:,k)) - if(icos4a(k-1).eq.(ip(1)-1)) is1=is1+1 - ip=maxloc(s4(:,k+33)) - if(icos4b(k-1).eq.(ip(1)-1)) is2=is2+1 - ip=maxloc(s4(:,k+66)) - if(icos4c(k-1).eq.(ip(1)-1)) is3=is3+1 - ip=maxloc(s4(:,k+99)) - if(icos4d(k-1).eq.(ip(1)-1)) is4=is4+1 - enddo - nsync=is1+is2+is3+is4 !Number of correct hard sync symbols, 0-16 - if(smax .lt. 0.7 .or. nsync .lt. 8) cycle - - do nseq=1,3 !Try coherent sequences of 1, 2, and 4 symbols - if(nseq.eq.1) nsym=1 - if(nseq.eq.2) nsym=2 - if(nseq.eq.3) nsym=4 - nt=2**(2*nsym) - do ks=1,NN-nsym+1,nsym !87+16=103 symbols. - amax=-1.0 - do i=0,nt-1 - i1=i/64 - i2=iand(i,63)/16 - i3=iand(i,15)/4 - i4=iand(i,3) - if(nsym.eq.1) then - s2(i)=abs(cs(graymap(i4),ks)) - elseif(nsym.eq.2) then - s2(i)=abs(cs(graymap(i3),ks)+cs(graymap(i4),ks+1)) - elseif(nsym.eq.4) then - s2(i)=abs(cs(graymap(i1),ks ) + & - cs(graymap(i2),ks+1) + & - cs(graymap(i3),ks+2) + & - cs(graymap(i4),ks+3) & - ) - else - print*,"Error - nsym must be 1, 2, or 4." - endif - enddo - ipt=1+(ks-1)*2 - if(nsym.eq.1) ibmax=1 - if(nsym.eq.2) ibmax=3 - if(nsym.eq.4) ibmax=7 - do ib=0,ibmax - bm=maxval(s2(0:nt-1),one(0:nt-1,ibmax-ib)) - & - maxval(s2(0:nt-1),.not.one(0:nt-1,ibmax-ib)) - if(ipt+ib.gt.2*NN) cycle - if(nsym.eq.1) then - bmeta(ipt+ib)=bm - elseif(nsym.eq.2) then - bmetb(ipt+ib)=bm - elseif(nsym.eq.4) then - bmetc(ipt+ib)=bm - endif - enddo - enddo - enddo - - bmetb(205:206)=bmeta(205:206) - bmetc(201:204)=bmetb(201:204) - bmetc(205:206)=bmeta(205:206) - - call normalizebmet(bmeta,2*NN) - call normalizebmet(bmetb,2*NN) - call normalizebmet(bmetc,2*NN) + call timer('bitmet ',0) + call get_ft4_bitmetrics(cd,smax,bitmetrics,badsync) + call timer('bitmet ',1) + if(badsync) cycle hbits=0 - where(bmeta.ge.0) hbits=1 + where(bitmetrics(:,1).ge.0) hbits=1 ns1=count(hbits( 1: 8).eq.(/0,0,0,1,1,0,1,1/)) ns2=count(hbits( 67: 74).eq.(/0,1,0,0,1,1,1,0/)) ns3=count(hbits(133:140).eq.(/1,1,1,0,0,1,0,0/)) @@ -393,17 +300,17 @@ contains if(nsync_qual.lt. 20) cycle scalefac=2.83 - llra( 1: 58)=bmeta( 9: 66) - llra( 59:116)=bmeta( 75:132) - llra(117:174)=bmeta(141:198) + llra( 1: 58)=bitmetrics( 9: 66, 1) + llra( 59:116)=bitmetrics( 75:132, 1) + llra(117:174)=bitmetrics(141:198, 1) llra=scalefac*llra - llrb( 1: 58)=bmetb( 9: 66) - llrb( 59:116)=bmetb( 75:132) - llrb(117:174)=bmetb(141:198) + llrb( 1: 58)=bitmetrics( 9: 66, 2) + llrb( 59:116)=bitmetrics( 75:132, 2) + llrb(117:174)=bitmetrics(141:198, 2) llrb=scalefac*llrb - llrc( 1: 58)=bmetc( 9: 66) - llrc( 59:116)=bmetc( 75:132) - llrc(117:174)=bmetc(141:198) + llrc( 1: 58)=bitmetrics( 9: 66, 3) + llrc( 59:116)=bitmetrics( 75:132, 3) + llrc(117:174)=bitmetrics(141:198, 3) llrc=scalefac*llrc apmag=maxval(abs(llra))*1.1 From e9559244f8e0df839378ef26d7eeedbcd7803fac Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Tue, 11 Jun 2019 10:14:04 +0100 Subject: [PATCH 143/159] Recall "Settings->Colors->Highlight by mode" from settings on startup --- Configuration.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Configuration.cpp b/Configuration.cpp index b8c37184d..2ac22b0b7 100644 --- a/Configuration.cpp +++ b/Configuration.cpp @@ -1587,6 +1587,7 @@ void Configuration::impl::write_settings () settings_->setValue ("FrequenciesForRegionModes", QVariant::fromValue (frequencies_.frequency_list ())); settings_->setValue ("stations", QVariant::fromValue (stations_.station_list ())); settings_->setValue ("DecodeHighlighting", QVariant::fromValue (decode_highlighing_model_.items ())); + settings_->setValue ("HighlightByMode", highlight_by_mode_); settings_->setValue ("IncludeWAEEntities", include_WAE_entities_); settings_->setValue ("LotWDaysSinceLastUpload", LotW_days_since_upload_); settings_->setValue ("toRTTY", log_as_RTTY_); From 89dc109968f2ec14ecf86ff4b7a419a9b2406afd Mon Sep 17 00:00:00 2001 From: Steve Franke Date: Tue, 11 Jun 2019 09:17:13 -0500 Subject: [PATCH 144/159] Re-enable printing of ?a# decode quality and ap-type annotations, for now. --- lib/decoder.f90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/decoder.f90 b/lib/decoder.f90 index d3f1153f4..8abdcb75f 100644 --- a/lib/decoder.f90 +++ b/lib/decoder.f90 @@ -517,7 +517,7 @@ contains decoded0=decoded annot=' ' - if(ncontest.eq.0 .and. nap.ne.0) then + if(nap.ne.0) then write(annot,'(a1,i1)') 'a',nap if(qual.lt.0.17) decoded0(37:37)='?' endif @@ -598,7 +598,7 @@ contains decoded0=decoded annot=' ' - if(ncontest.eq.0 .and. nap.ne.0) then + if(nap.ne.0) then write(annot,'(a1,i1)') 'a',nap if(qual.lt.0.17) decoded0(37:37)='?' endif From fc07bd92875e90a6a51486e913784ca9a8a9967d Mon Sep 17 00:00:00 2001 From: Steve Franke Date: Wed, 12 Jun 2019 08:16:10 -0500 Subject: [PATCH 145/159] FT4: minor tweak to avoid passing an unnecessary argument and reject bad candidates sooner. --- lib/ft4/get_ft4_bitmetrics.f90 | 4 ++-- lib/ft4_decode.f90 | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/ft4/get_ft4_bitmetrics.f90 b/lib/ft4/get_ft4_bitmetrics.f90 index 6d87485e8..eba86a418 100644 --- a/lib/ft4/get_ft4_bitmetrics.f90 +++ b/lib/ft4/get_ft4_bitmetrics.f90 @@ -1,4 +1,4 @@ -subroutine get_ft4_bitmetrics(cd,smax,bitmetrics,badsync) +subroutine get_ft4_bitmetrics(cd,bitmetrics,badsync) include 'ft4_params.f90' parameter (NSS=NSPS/NDOWN,NDMAX=NMAX/NDOWN) @@ -58,7 +58,7 @@ subroutine get_ft4_bitmetrics(cd,smax,bitmetrics,badsync) if(icos4d(k-1).eq.(ip(1)-1)) is4=is4+1 enddo nsync=is1+is2+is3+is4 !Number of correct hard sync symbols, 0-16 - if(smax .lt. 0.7 .or. nsync .lt. 8) then + if(nsync .lt. 8) then badsync=.true. return endif diff --git a/lib/ft4_decode.f90 b/lib/ft4_decode.f90 index bd42c0450..28c044c77 100644 --- a/lib/ft4_decode.f90 +++ b/lib/ft4_decode.f90 @@ -269,6 +269,7 @@ contains enddo call timer('sync4d ',1) enddo + if(smax.lt.0.7) cycle f0=f0+real(idfbest) if( f0.le.10.0 .or. f0.ge.4990.0 ) cycle call timer('ft4down ',0) @@ -286,7 +287,7 @@ contains endif call timer('bitmet ',0) - call get_ft4_bitmetrics(cd,smax,bitmetrics,badsync) + call get_ft4_bitmetrics(cd,bitmetrics,badsync) call timer('bitmet ',1) if(badsync) cycle From 9de51ebfa3d9a48661c99aacf3b1eb1b6969f039 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Wed, 12 Jun 2019 11:31:35 -0400 Subject: [PATCH 146/159] Rename and tweak rtty_spec.f90. --- CMakeLists.txt | 3 ++ lib/rtty_spec.f90 | 86 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 89 insertions(+) create mode 100644 lib/rtty_spec.f90 diff --git a/CMakeLists.txt b/CMakeLists.txt index 4b425a6e4..0c10ff8d8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1274,6 +1274,9 @@ target_link_libraries (jt49sim wsjt_fort wsjt_cxx) add_executable (allsim lib/allsim.f90 wsjtx.rc) target_link_libraries (allsim wsjt_fort wsjt_cxx) +add_executable (rtty_spec lib/rtty_spec.f90 wsjtx.rc) +target_link_libraries (rtty_spec wsjt_fort wsjt_cxx) + add_executable (jt65code lib/jt65code.f90 wsjtx.rc) target_link_libraries (jt65code wsjt_fort wsjt_cxx) diff --git a/lib/rtty_spec.f90 b/lib/rtty_spec.f90 new file mode 100644 index 000000000..704e5ce53 --- /dev/null +++ b/lib/rtty_spec.f90 @@ -0,0 +1,86 @@ +program rtty_spec + +! Generate simulated data for standard RTTY and WSJT-X modes FT8, FT4 + + use wavhdr + use packjt + parameter (NMAX=15*12000) + type(hdr) h + complex cwave(NMAX) + real wave(NMAX) + real*4 dat(NMAX) !Generated waveform + integer*2 iwave(NMAX) !Generated waveform + integer itone(680) !Channel symbols (values 0-1, 0-3, 0-7) + integer*1 msgbits(77) + character*37 msg37,msgsent37 + character*8 arg + + nargs=iargc() + if(nargs.ne.1) then + print*,'Usage: rtty_spec ' + go to 999 + endif + call getarg(1,arg) + read(arg,*) snrdb !S/N in dB (2500 hz reference BW) + + rmsdb=25. + rms=10.0**(0.05*rmsdb) + sig=10.0**(0.05*snrdb) + npts=NMAX + + do i=1,NMAX !Generate gaussian noise + dat(i)=gran() + enddo + +! Add the RTTY signal + fsample=12000.0 !Sample rate (Hz) + dt=1.0/fsample !Sample interval (s) + twopi=8.0*atan(1.0) + phi=0. + dphi=0. + j0=-1 + do i=6001,NMAX-6000 + j=nint(i*dt/0.022) + if(j.ne.j0) then + f0=1415.0 + call random_number(rr) + if(rr.gt.0.5) f0=1585.0 + dphi=twopi*f0*dt + j0=j + endif + phi=phi+dphi + if(phi.gt.twopi) phi=phi-twopi + dat(i)=dat(i) + sig*sin(phi) + enddo + +! Add the FT8 signal + i3=0 + n3=0 + msg37='WB9XYZ KA2ABC FN42' + call genft8(msg37,i3,n3,msgsent37,msgbits,itone) + nsym=79 + nsps=1920 + bt=2.0 + f0=3000.0 + icmplx=0 + nwave=nsym*nsps + call gen_ft8wave(itone,nsym,nsps,bt,fsample,f0,cwave,wave,icmplx,nwave) + dat(6001:6000+nwave)=dat(6001:6000+nwave) + sig*wave(1:nwave) + +! Add the FT4 signal + ichk=0 + call genft4(msg37,ichk,msgsent37,msgbits,itone) + nsym=103 + nsps=576 + f0=3500.0 + icmplx=0 + nwave=(nsym+2)*nsps + call gen_ft4wave(itone,nsym,nsps,fsample,f0,cwave,wave,icmplx,nwave) + dat(6001:6000+nwave)=dat(6001:6000+nwave) + sig*wave(1:nwave) + h=default_header(12000,NMAX) + iwave=nint(rms*dat) + open(10,file='000000_000001.wav',access='stream',status='unknown') + write(10) h,iwave + close(10) + +999 end program rtty_spec From 3f5a99684230007ed81f309139606a60255136c1 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Thu, 13 Jun 2019 01:44:28 +0100 Subject: [PATCH 147/159] New UDP message SwitchConfiguration(14) to switch to an existing configuration The Status(1) message also acquires the current configuration name as a new field. See NetworkMessage.hpp for details. The UDP reference example program message_aggregator acquires the ability to display and change the configuration of a WSJT-X client to exercise these new features. --- MessageClient.cpp | 19 ++- MessageClient.hpp | 6 +- MessageServer.cpp | 17 ++- MessageServer.hpp | 5 +- MultiSettings.cpp | 156 ++++++++++++-------- MultiSettings.hpp | 4 + NetworkMessage.hpp | 16 +- UDPExamples/ClientWidget.cpp | 11 +- UDPExamples/ClientWidget.hpp | 5 +- UDPExamples/MessageAggregatorMainWindow.cpp | 1 + UDPExamples/UDPDaemon.cpp | 2 +- widgets/mainwindow.cpp | 6 +- 12 files changed, 171 insertions(+), 77 deletions(-) diff --git a/MessageClient.cpp b/MessageClient.cpp index 6e2ea7955..0629c3026 100644 --- a/MessageClient.cpp +++ b/MessageClient.cpp @@ -261,6 +261,18 @@ void MessageClient::impl::parse_message (QByteArray const& msg) } break; + case NetworkMessage::SwitchConfiguration: + { + QByteArray configuration_name; + in >> configuration_name; + TRACE_UDP ("SwitchConfiguration name:" << configuration_name); + if (check_status (in) != Fail && configuration_name.size ()) + { + Q_EMIT self_->switch_configuration (QString::fromUtf8 (configuration_name)); + } + } + break; + default: // Ignore // @@ -444,7 +456,8 @@ void MessageClient::status_update (Frequency f, QString const& mode, QString con , qint32 rx_df, qint32 tx_df, QString const& de_call , QString const& de_grid, QString const& dx_grid , bool watchdog_timeout, QString const& sub_mode - , bool fast_mode, quint8 special_op_mode) + , bool fast_mode, quint8 special_op_mode + , QString const& configuration_name) { if (m_->server_port_ && !m_->server_string_.isEmpty ()) { @@ -453,8 +466,8 @@ void MessageClient::status_update (Frequency f, QString const& mode, QString con out << f << mode.toUtf8 () << dx_call.toUtf8 () << report.toUtf8 () << tx_mode.toUtf8 () << tx_enabled << transmitting << decoding << rx_df << tx_df << de_call.toUtf8 () << de_grid.toUtf8 () << dx_grid.toUtf8 () << watchdog_timeout << sub_mode.toUtf8 () - << fast_mode << special_op_mode; - TRACE_UDP ("frequency:" << f << "mode:" << mode << "DX:" << dx_call << "report:" << report << "Tx mode:" << tx_mode << "tx_enabled:" << tx_enabled << "Tx:" << transmitting << "decoding:" << decoding << "Rx df:" << rx_df << "Tx df:" << tx_df << "DE:" << de_call << "DE grid:" << de_grid << "DX grid:" << dx_grid << "w/d t/o:" << watchdog_timeout << "sub_mode:" << sub_mode << "fast mode:" << fast_mode << "spec op mode:" << special_op_mode); + << fast_mode << special_op_mode << configuration_name.toUtf8 (); + TRACE_UDP ("frequency:" << f << "mode:" << mode << "DX:" << dx_call << "report:" << report << "Tx mode:" << tx_mode << "tx_enabled:" << tx_enabled << "Tx:" << transmitting << "decoding:" << decoding << "Rx df:" << rx_df << "Tx df:" << tx_df << "DE:" << de_call << "DE grid:" << de_grid << "DX grid:" << dx_grid << "w/d t/o:" << watchdog_timeout << "sub_mode:" << sub_mode << "fast mode:" << fast_mode << "spec op mode:" << special_op_mode << "configuration name:" << configuration_name); m_->send_message (out, message); } } diff --git a/MessageClient.hpp b/MessageClient.hpp index ca5f02037..2396a6ad0 100644 --- a/MessageClient.hpp +++ b/MessageClient.hpp @@ -52,7 +52,7 @@ public: , QString const& tx_mode, bool tx_enabled, bool transmitting, bool decoding , qint32 rx_df, qint32 tx_df, QString const& de_call, QString const& de_grid , QString const& dx_grid, bool watchdog_timeout, QString const& sub_mode - , bool fast_mode, quint8 special_op_mode); + , bool fast_mode, quint8 special_op_mode, QString const& configuration_name); Q_SLOT void decode (bool is_new, QTime time, qint32 snr, float delta_time, quint32 delta_frequency , QString const& mode, QString const& message, bool low_confidence , bool off_air); @@ -105,6 +105,10 @@ public: // callsign request for the specified call Q_SIGNAL void highlight_callsign (QString const& callsign, QColor const& bg, QColor const& fg, bool last_only); + // this signal is emitted if the server has requested a switch to a + // new configuration + Q_SIGNAL void switch_configuration (QString const& configuration_name); + // this signal is emitted when network errors occur or if a host // lookup fails Q_SIGNAL void error (QString const&) const; diff --git a/MessageServer.cpp b/MessageServer.cpp index dadf3d984..02d23e460 100644 --- a/MessageServer.cpp +++ b/MessageServer.cpp @@ -247,9 +247,10 @@ void MessageServer::impl::parse_message (QHostAddress const& sender, port_type s QByteArray sub_mode; bool fast_mode {false}; quint8 special_op_mode {0}; + QByteArray configuration_name; in >> f >> mode >> dx_call >> report >> tx_mode >> tx_enabled >> transmitting >> decoding >> rx_df >> tx_df >> de_call >> de_grid >> dx_grid >> watchdog_timeout >> sub_mode - >> fast_mode >> special_op_mode; + >> fast_mode >> special_op_mode >> configuration_name; if (check_status (in) != Fail) { Q_EMIT self_->status_update (id, f, QString::fromUtf8 (mode), QString::fromUtf8 (dx_call) @@ -258,7 +259,7 @@ void MessageServer::impl::parse_message (QHostAddress const& sender, port_type s , QString::fromUtf8 (de_call), QString::fromUtf8 (de_grid) , QString::fromUtf8 (dx_grid), watchdog_timeout , QString::fromUtf8 (sub_mode), fast_mode - , special_op_mode); + , special_op_mode, QString::fromUtf8 (configuration_name)); } } break; @@ -541,3 +542,15 @@ void MessageServer::highlight_callsign (QString const& id, QString const& callsi m_->send_message (out, message, iter.value ().sender_address_, (*iter).sender_port_); } } + +void MessageServer::switch_configuration (QString const& id, QString const& configuration_name) +{ + auto iter = m_->clients_.find (id); + if (iter != std::end (m_->clients_)) + { + QByteArray message; + NetworkMessage::Builder out {&message, NetworkMessage::SwitchConfiguration, id, (*iter).negotiated_schema_number_}; + out << configuration_name.toUtf8 (); + m_->send_message (out, message, iter.value ().sender_address_, (*iter).sender_port_); + } +} diff --git a/MessageServer.hpp b/MessageServer.hpp index 12377bef9..2764889cf 100644 --- a/MessageServer.hpp +++ b/MessageServer.hpp @@ -72,6 +72,9 @@ public: , QColor const& bg = QColor {}, QColor const& fg = QColor {} , bool last_only = false); + // ask the client with identification 'id' to switch configuration + Q_SLOT void switch_configuration (QString const& id, QString const& configuration_name); + // the following signals are emitted when a client broadcasts the // matching message Q_SIGNAL void client_opened (QString const& id, QString const& version, QString const& revision); @@ -80,7 +83,7 @@ public: , bool transmitting, bool decoding, qint32 rx_df, qint32 tx_df , QString const& de_call, QString const& de_grid, QString const& dx_grid , bool watchdog_timeout, QString const& sub_mode, bool fast_mode - , quint8 special_op_mode); + , quint8 special_op_mode, QString const& configuration_name); Q_SIGNAL void client_closed (QString const& id); Q_SIGNAL void decode (bool is_new, QString const& id, QTime time, qint32 snr, float delta_time , quint32 delta_frequency, QString const& mode, QString const& message diff --git a/MultiSettings.cpp b/MultiSettings.cpp index c0db0ed67..29c686d3d 100644 --- a/MultiSettings.cpp +++ b/MultiSettings.cpp @@ -159,13 +159,16 @@ public: bool exit (); QSettings settings_; + QString current_; + + // switch to this configuration + void select_configuration (QString const& target_name); private: using Dictionary = QMap; // create a configuration maintenance sub menu - QMenu * create_sub_menu (QMainWindow * main_window, - QMenu * parent, + QMenu * create_sub_menu (QMenu * parent, QString const& menu_title, QActionGroup * = nullptr); @@ -175,32 +178,32 @@ private: // write the settings values from the dictionary to the current group void load_from (Dictionary const&, bool add_placeholder = true); - // switch to this configuration - void select_configuration (QMainWindow *, QMenu const *); - // clone this configuration - void clone_configuration (QMainWindow * main_window, QMenu *, QMenu const *); + void clone_configuration (QMenu *, QMenu const *); // update this configuration from another - void clone_into_configuration (QMainWindow *, QMenu const *); + void clone_into_configuration (QMenu const *); // reset configuration to default values - void reset_configuration (QMainWindow *, QMenu const *); + void reset_configuration (QMenu const *); // change configuration name - void rename_configuration (QMainWindow *, QMenu *); + void rename_configuration (QMenu *); // remove a configuration - void delete_configuration (QMainWindow *, QMenu *); + void delete_configuration (QMenu *); + + // action to take on restart + enum class RepositionType {unchanged, replace, save_and_replace}; + void restart (RepositionType); MultiSettings const * parent_; // required for emitting signals + QMainWindow * main_window_; bool name_change_emit_pending_; // delayed until menu built QFont original_font_; - QString current_; - // action to take on restart - enum class RepositionType {unchanged, replace, save_and_replace} reposition_type_; + RepositionType reposition_type_; Dictionary new_settings_; bool exit_flag_; // false means loop around with new // configuration @@ -267,6 +270,16 @@ void MultiSettings::create_menu_actions (QMainWindow * main_window, QMenu * menu m_->create_menu_actions (main_window, menu); } +void MultiSettings::select_configuration (QString const& name) +{ + m_->select_configuration (name); +} + +QString MultiSettings::configuration_name () const +{ + return m_->current_; +} + bool MultiSettings::exit () { return m_->exit (); @@ -275,6 +288,7 @@ bool MultiSettings::exit () MultiSettings::impl::impl (MultiSettings const * parent, QString const& config_name) : settings_ {settings_path (), QSettings::IniFormat} , parent_ {parent} + , main_window_ {nullptr} , name_change_emit_pending_ {true} , reposition_type_ {RepositionType::unchanged} , exit_flag_ {true} @@ -411,13 +425,14 @@ bool MultiSettings::impl::reposition () // and, reset void MultiSettings::impl::create_menu_actions (QMainWindow * main_window, QMenu * menu) { + main_window_ = main_window; auto const& current_group = settings_.group (); if (current_group.size ()) settings_.endGroup (); SettingsGroup alternatives {&settings_, multi_settings_root_group}; // get the current configuration name auto const& current_configuration_name = settings_.value (multi_settings_current_name_key, tr (default_string)).toString (); // add the default configuration sub menu - QMenu * default_menu = create_sub_menu (main_window, menu, current_configuration_name, configurations_group_); + QMenu * default_menu = create_sub_menu (menu, current_configuration_name, configurations_group_); // and set as the current configuration default_menu->menuAction ()->setChecked (true); @@ -427,7 +442,7 @@ void MultiSettings::impl::create_menu_actions (QMainWindow * main_window, QMenu // add all the other configurations for (auto const& configuration_name: available_configurations) { - create_sub_menu (main_window, menu, configuration_name, configurations_group_); + create_sub_menu (menu, configuration_name, configurations_group_); } if (current_group.size ()) settings_.beginGroup (current_group); @@ -450,8 +465,7 @@ bool MultiSettings::impl::exit () return reposition (); } -QMenu * MultiSettings::impl::create_sub_menu (QMainWindow * main_window, - QMenu * parent_menu, +QMenu * MultiSettings::impl::create_sub_menu (QMenu * parent_menu, QString const& menu_title, QActionGroup * action_group) { @@ -460,7 +474,7 @@ QMenu * MultiSettings::impl::create_sub_menu (QMainWindow * main_window, sub_menu->menuAction ()->setCheckable (true); // populate sub-menu actions before showing - connect (sub_menu, &QMenu::aboutToShow, [this, main_window, parent_menu, sub_menu] () { + connect (sub_menu, &QMenu::aboutToShow, [this, parent_menu, sub_menu] () { // depopulate before populating and showing because on Mac OS X // there is an issue with depopulating in QMenu::aboutToHide() // with connections being disconnected before they are actioned @@ -474,16 +488,16 @@ QMenu * MultiSettings::impl::create_sub_menu (QMainWindow * main_window, { auto select_action = new QAction {tr ("&Switch To"), this}; sub_menu->addAction (select_action); - connect (select_action, &QAction::triggered, [this, main_window, sub_menu] (bool) { - select_configuration (main_window, sub_menu); + connect (select_action, &QAction::triggered, [this, sub_menu] (bool) { + select_configuration (sub_menu->title ()); }); sub_menu->addSeparator (); } auto clone_action = new QAction {tr ("&Clone"), this}; sub_menu->addAction (clone_action); - connect (clone_action, &QAction::triggered, [this, main_window, parent_menu, sub_menu] (bool) { - clone_configuration (main_window, parent_menu, sub_menu); + connect (clone_action, &QAction::triggered, [this, parent_menu, sub_menu] (bool) { + clone_configuration (parent_menu, sub_menu); }); auto const& current_group = settings_.group (); @@ -493,29 +507,29 @@ QMenu * MultiSettings::impl::create_sub_menu (QMainWindow * main_window, { auto clone_into_action = new QAction {tr ("Clone &Into ..."), this}; sub_menu->addAction (clone_into_action); - connect (clone_into_action, &QAction::triggered, [this, main_window, sub_menu] (bool) { - clone_into_configuration (main_window, sub_menu); + connect (clone_into_action, &QAction::triggered, [this, sub_menu] (bool) { + clone_into_configuration (sub_menu); }); } if (current_group.size ()) settings_.beginGroup (current_group); auto reset_action = new QAction {tr ("R&eset"), this}; sub_menu->addAction (reset_action); - connect (reset_action, &QAction::triggered, [this, main_window, sub_menu] (bool) { - reset_configuration (main_window, sub_menu); + connect (reset_action, &QAction::triggered, [this, sub_menu] (bool) { + reset_configuration (sub_menu); }); auto rename_action = new QAction {tr ("&Rename ..."), this}; sub_menu->addAction (rename_action); - connect (rename_action, &QAction::triggered, [this, main_window, sub_menu] (bool) { - rename_configuration (main_window, sub_menu); + connect (rename_action, &QAction::triggered, [this, sub_menu] (bool) { + rename_configuration (sub_menu); }); if (!is_current) { auto delete_action = new QAction {tr ("&Delete"), this}; sub_menu->addAction (delete_action); - connect (delete_action, &QAction::triggered, [this, main_window, sub_menu] (bool) { - delete_configuration (main_window, sub_menu); + connect (delete_action, &QAction::triggered, [this, sub_menu] (bool) { + delete_configuration (sub_menu); }); } }); @@ -558,11 +572,9 @@ void MultiSettings::impl::load_from (Dictionary const& dictionary, bool add_plac settings_.sync (); } -void MultiSettings::impl::select_configuration (QMainWindow * main_window, QMenu const * menu) +void MultiSettings::impl::select_configuration (QString const& target_name) { - auto const& target_name = menu->title (); - - if (target_name != current_) + if (main_window_ && target_name != current_) { { auto const& current_group = settings_.group (); @@ -577,13 +589,11 @@ void MultiSettings::impl::select_configuration (QMainWindow * main_window, QMenu // and set up the restart current_ = target_name; Q_EMIT parent_->configurationNameChanged (unescape_ampersands (current_)); - reposition_type_ = RepositionType::save_and_replace; - exit_flag_ = false; - main_window->close (); + restart (RepositionType::save_and_replace); } } -void MultiSettings::impl::clone_configuration (QMainWindow * main_window, QMenu * parent_menu, QMenu const * menu) +void MultiSettings::impl::clone_configuration (QMenu * parent_menu, QMenu const * menu) { auto const& current_group = settings_.group (); if (current_group.size ()) settings_.endGroup (); @@ -616,12 +626,15 @@ void MultiSettings::impl::clone_configuration (QMainWindow * main_window, QMenu load_from (source_settings); // insert the new configuration sub menu in the parent menu - create_sub_menu (main_window, parent_menu, new_name, configurations_group_); + create_sub_menu (parent_menu, new_name, configurations_group_); if (current_group.size ()) settings_.beginGroup (current_group); } -void MultiSettings::impl::clone_into_configuration (QMainWindow * main_window, QMenu const * menu) +void MultiSettings::impl::clone_into_configuration (QMenu const * menu) { + Q_ASSERT (main_window_); + if (!main_window_) return; + auto const& current_group = settings_.group (); if (current_group.size ()) settings_.endGroup (); auto const& target_name = menu->title (); @@ -642,15 +655,16 @@ void MultiSettings::impl::clone_into_configuration (QMainWindow * main_window, Q } // pick a source configuration - ExistingNameDialog dialog {sources, main_window}; + ExistingNameDialog dialog {sources, main_window_}; if (sources.size () && (1 == sources.size () || QDialog::Accepted == dialog.exec ())) { QString source_name {1 == sources.size () ? sources.at (0) : dialog.name ()}; - if (MessageBox::Yes == MessageBox::query_message (main_window, - tr ("Clone Into Configuration"), - tr ("Confirm overwrite of all values for configuration \"%1\" with values from \"%2\"?") - .arg (unescape_ampersands (target_name)) - .arg (unescape_ampersands (source_name)))) + if (main_window_ + && MessageBox::Yes == MessageBox::query_message (main_window_, + tr ("Clone Into Configuration"), + tr ("Confirm overwrite of all values for configuration \"%1\" with values from \"%2\"?") + .arg (unescape_ampersands (target_name)) + .arg (unescape_ampersands (source_name)))) { // grab the data to clone from if (source_name == current_group_name) @@ -669,9 +683,7 @@ void MultiSettings::impl::clone_into_configuration (QMainWindow * main_window, Q if (target_name == current_) { // restart with new settings - reposition_type_ = RepositionType::replace; - exit_flag_ = false; - main_window->close (); + restart (RepositionType::replace); } else { @@ -686,14 +698,18 @@ void MultiSettings::impl::clone_into_configuration (QMainWindow * main_window, Q if (current_group.size ()) settings_.beginGroup (current_group); } -void MultiSettings::impl::reset_configuration (QMainWindow * main_window, QMenu const * menu) +void MultiSettings::impl::reset_configuration (QMenu const * menu) { + Q_ASSERT (main_window_); + if (!main_window_) return; + auto const& target_name = menu->title (); - if (MessageBox::Yes != MessageBox::query_message (main_window, - tr ("Reset Configuration"), - tr ("Confirm reset to default values for configuration \"%1\"?") - .arg (unescape_ampersands (target_name)))) + if (!main_window_ + || MessageBox::Yes != MessageBox::query_message (main_window_, + tr ("Reset Configuration"), + tr ("Confirm reset to default values for configuration \"%1\"?") + .arg (unescape_ampersands (target_name)))) { return; } @@ -701,10 +717,8 @@ void MultiSettings::impl::reset_configuration (QMainWindow * main_window, QMenu if (target_name == current_) { // restart with default settings - reposition_type_ = RepositionType::replace; new_settings_.clear (); - exit_flag_ = false; - main_window->close (); + restart (RepositionType::replace); } else { @@ -721,8 +735,11 @@ void MultiSettings::impl::reset_configuration (QMainWindow * main_window, QMenu } } -void MultiSettings::impl::rename_configuration (QMainWindow * main_window, QMenu * menu) +void MultiSettings::impl::rename_configuration (QMenu * menu) { + Q_ASSERT (main_window_); + if (!main_window_) return; + auto const& current_group = settings_.group (); if (current_group.size ()) settings_.endGroup (); auto const& target_name = menu->title (); @@ -733,7 +750,7 @@ void MultiSettings::impl::rename_configuration (QMainWindow * main_window, QMenu invalid_names << settings_.value (multi_settings_current_name_key).toString (); // get the new name - NameDialog dialog {target_name, invalid_names, main_window}; + NameDialog dialog {target_name, invalid_names, main_window_}; if (QDialog::Accepted == dialog.exec ()) { if (target_name == current_) @@ -764,8 +781,9 @@ void MultiSettings::impl::rename_configuration (QMainWindow * main_window, QMenu if (current_group.size ()) settings_.beginGroup (current_group); } -void MultiSettings::impl::delete_configuration (QMainWindow * main_window, QMenu * menu) +void MultiSettings::impl::delete_configuration (QMenu * menu) { + Q_ASSERT (main_window_); auto const& target_name = menu->title (); if (target_name == current_) @@ -774,10 +792,11 @@ void MultiSettings::impl::delete_configuration (QMainWindow * main_window, QMenu } else { - if (MessageBox::Yes != MessageBox::query_message (main_window, - tr ("Delete Configuration"), - tr ("Confirm deletion of configuration \"%1\"?") - .arg (unescape_ampersands (target_name)))) + if (!main_window_ + || MessageBox::Yes != MessageBox::query_message (main_window_, + tr ("Delete Configuration"), + tr ("Confirm deletion of configuration \"%1\"?") + .arg (unescape_ampersands (target_name)))) { return; } @@ -793,3 +812,12 @@ void MultiSettings::impl::delete_configuration (QMainWindow * main_window, QMenu // update the menu menu->deleteLater (); } + +void MultiSettings::impl::restart (RepositionType type) +{ + Q_ASSERT (main_window_); + reposition_type_ = type; + exit_flag_ = false; + main_window_->close (); + main_window_ = nullptr; +} diff --git a/MultiSettings.hpp b/MultiSettings.hpp index 051553b48..5e0c9a679 100644 --- a/MultiSettings.hpp +++ b/MultiSettings.hpp @@ -80,6 +80,10 @@ public: // action is triggered. void create_menu_actions (QMainWindow *, QMenu *); + // switch to this configuration if it exists + Q_SLOT void select_configuration (QString const& name); + QString configuration_name () const; + // Access to the QSettings object instance. QSettings * settings (); diff --git a/NetworkMessage.hpp b/NetworkMessage.hpp index 4783bb369..be85d63ee 100644 --- a/NetworkMessage.hpp +++ b/NetworkMessage.hpp @@ -124,7 +124,8 @@ * Tx Watchdog bool * Sub-mode utf8 * Fast mode bool - * Special operation mode quint8 + * Special Operation Mode quint8 + * Configuration Name utf8 * * WSJT-X sends this status message when various internal state * changes to allow the server to track the relevant state of each @@ -145,7 +146,8 @@ * When the Tx DF changes, * When settings are exited, * When the DX call or grid changes, - * When the Tx watchdog is set or reset. + * When the Tx watchdog is set or reset, + * When the configuration name changes. * * The Special operation mode is an enumeration that indicates the * setting selected in the WSJT-X "Settings->Advanced->Special @@ -414,6 +416,15 @@ * the last instance only instead of all instances of the * specified call be highlighted or have it's highlighting * cleared. + * + * + * Switch Configuration In 14 quint32 + * Id (unique key) utf8 + * Configuration Name utf8 + * + * The server may send this message at any time. The message + * specifies the name of the configuration to switch to. The new + * configuration must exist. */ #include @@ -443,6 +454,7 @@ namespace NetworkMessage Location, LoggedADIF, HighlightCallsign, + SwitchConfiguration, maximum_message_type_ // ONLY add new message types // immediately before here }; diff --git a/UDPExamples/ClientWidget.cpp b/UDPExamples/ClientWidget.cpp index 1715670bf..7d1601938 100644 --- a/UDPExamples/ClientWidget.cpp +++ b/UDPExamples/ClientWidget.cpp @@ -139,6 +139,7 @@ ClientWidget::ClientWidget (QAbstractItemModel * decodes_model, QAbstractItemMod , rx_df_label_ {new QLabel} , tx_df_label_ {new QLabel} , report_label_ {new QLabel} + , configuration_line_edit_ {new QLineEdit} , columns_resized_ {false} { // set up widgets @@ -155,6 +156,7 @@ ClientWidget::ClientWidget (QAbstractItemModel * decodes_model, QAbstractItemMod auto form_layout = new QFormLayout; form_layout->addRow (tr ("Free text:"), message_line_edit_); form_layout->addRow (tr ("Temporary grid:"), grid_line_edit_); + form_layout->addRow (tr ("Configuration name:"), configuration_line_edit_); message_line_edit_->setValidator (new QRegExpValidator {message_alphabet, this}); grid_line_edit_->setValidator (new MaidenheadLocatorValidator {this}); connect (message_line_edit_, &QLineEdit::textEdited, [this] (QString const& text) { @@ -166,6 +168,9 @@ ClientWidget::ClientWidget (QAbstractItemModel * decodes_model, QAbstractItemMod connect (grid_line_edit_, &QLineEdit::editingFinished, [this] () { Q_EMIT location (id_, grid_line_edit_->text ()); }); + connect (configuration_line_edit_, &QLineEdit::editingFinished, [this] () { + Q_EMIT switch_configuration (id_, configuration_line_edit_->text ()); + }); auto decodes_page = new QWidget; auto decodes_layout = new QVBoxLayout {decodes_page}; @@ -266,7 +271,7 @@ void ClientWidget::update_status (QString const& id, Frequency f, QString const& , bool transmitting, bool decoding, qint32 rx_df, qint32 tx_df , QString const& de_call, QString const& de_grid, QString const& dx_grid , bool watchdog_timeout, QString const& sub_mode, bool fast_mode - , quint8 special_op_mode) + , quint8 special_op_mode, QString const& configuration_name) { if (id == id_) { @@ -304,6 +309,10 @@ void ClientWidget::update_status (QString const& id, Frequency f, QString const& halt_tx_button_->setEnabled (transmitting); update_dynamic_property (mode_label_, "decoding", decoding); update_dynamic_property (tx_df_label_, "watchdog_timeout", watchdog_timeout); + if (!configuration_line_edit_->hasFocus ()) + { + configuration_line_edit_->setText (configuration_name); + } } } diff --git a/UDPExamples/ClientWidget.hpp b/UDPExamples/ClientWidget.hpp index 22488531c..9aa8d35a0 100644 --- a/UDPExamples/ClientWidget.hpp +++ b/UDPExamples/ClientWidget.hpp @@ -34,7 +34,7 @@ public: , bool transmitting, bool decoding, qint32 rx_df, qint32 tx_df , QString const& de_call, QString const& de_grid, QString const& dx_grid , bool watchdog_timeout, QString const& sub_mode, bool fast_mode - , quint8 special_op_mode); + , quint8 special_op_mode, QString const& configuration_name); Q_SLOT void decode_added (bool is_new, QString const& client_id, QTime, qint32 snr , float delta_time, quint32 delta_frequency, QString const& mode , QString const& message, bool low_confidence, bool off_air); @@ -52,8 +52,10 @@ public: Q_SIGNAL void highlight_callsign (QString const& id, QString const& call , QColor const& bg = QColor {}, QColor const& fg = QColor {} , bool last_only = false); + Q_SIGNAL void switch_configuration (QString const& id, QString const& configuration_name); private: + QString id_; QListWidget const * calls_of_interest_; class IdFilterModel final @@ -94,6 +96,7 @@ private: QLabel * rx_df_label_; QLabel * tx_df_label_; QLabel * report_label_; + QLineEdit * configuration_line_edit_; bool columns_resized_; }; diff --git a/UDPExamples/MessageAggregatorMainWindow.cpp b/UDPExamples/MessageAggregatorMainWindow.cpp index e6937e6cb..34c674f2c 100644 --- a/UDPExamples/MessageAggregatorMainWindow.cpp +++ b/UDPExamples/MessageAggregatorMainWindow.cpp @@ -256,6 +256,7 @@ void MessageAggregatorMainWindow::add_client (QString const& id, QString const& connect (dock, &ClientWidget::location, server_, &MessageServer::location); connect (view_action, &QAction::toggled, dock, &ClientWidget::setVisible); connect (dock, &ClientWidget::highlight_callsign, server_, &MessageServer::highlight_callsign); + connect (dock, &ClientWidget::switch_configuration, server_, &MessageServer::switch_configuration); dock_widgets_[id] = dock; server_->replay (id); // request decodes and status } diff --git a/UDPExamples/UDPDaemon.cpp b/UDPExamples/UDPDaemon.cpp index 0ee202dc7..98ff49e6e 100644 --- a/UDPExamples/UDPDaemon.cpp +++ b/UDPExamples/UDPDaemon.cpp @@ -51,7 +51,7 @@ public: , bool /*transmitting*/, bool /*decoding*/, qint32 /*rx_df*/, qint32 /*tx_df*/ , QString const& /*de_call*/, QString const& /*de_grid*/, QString const& /*dx_grid*/ , bool /* watchdog_timeout */, QString const& sub_mode, bool /*fast_mode*/ - , quint8 /*special_op_mode*/) + , quint8 /*special_op_mode*/, QString const& /*configuration_name*/) { if (id == id_) { diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 0d6d63e74..529dab19d 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -560,6 +560,8 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple, connect (m_messageClient, &MessageClient::highlight_callsign, ui->decodedTextBrowser, &DisplayText::highlight_callsign); + connect (m_messageClient, &MessageClient::switch_configuration, m_multi_settings, &MultiSettings::select_configuration); + // Hook up WSPR band hopping connect (ui->band_hopping_schedule_push_button, &QPushButton::clicked , &m_WSPR_band_hopping, &WSPRBandHopping::show_dialog); @@ -719,6 +721,7 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple, else { config_label.hide (); } + statusUpdate (); }); m_multi_settings->create_menu_actions (this, ui->menuConfig); m_configurations_button = m_rigErrorMessageBox.addButton (tr ("Configurations...") @@ -7908,7 +7911,8 @@ void MainWindow::statusUpdate () const m_config.my_callsign (), m_config.my_grid (), m_hisGrid, m_tx_watchdog, submode != QChar::Null ? QString {submode} : QString {}, m_bFastMode, - static_cast (m_config.special_op_id ())); + static_cast (m_config.special_op_id ()), + m_multi_settings->configuration_name ()); } void MainWindow::childEvent (QChildEvent * e) From 7bd15246aed3c288c823a4fae1517cc557b37abb Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Thu, 13 Jun 2019 11:07:29 -0400 Subject: [PATCH 148/159] Adjustments to utility program rtty_spec.f90 --- lib/rtty_spec.f90 | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/lib/rtty_spec.f90 b/lib/rtty_spec.f90 index 704e5ce53..2ddc802f1 100644 --- a/lib/rtty_spec.f90 +++ b/lib/rtty_spec.f90 @@ -53,7 +53,21 @@ program rtty_spec dat(i)=dat(i) + sig*sin(phi) enddo -! Add the FT8 signal +! FT8 signal (FSK) + i3=0 + n3=0 + msg37='WB9XYZ KA2ABC FN42' + call genft8(msg37,i3,n3,msgsent37,msgbits,itone) + nsym=79 + nsps=1920 + bt=99.0 + f0=3500.0 + icmplx=0 + nwave=nsym*nsps + call gen_ft8wave(itone,nsym,nsps,bt,fsample,f0,cwave,wave,icmplx,nwave) + dat(6001:6000+nwave)=dat(6001:6000+nwave) + sig*wave(1:nwave) + +! FT8 signal (GFSK) i3=0 n3=0 msg37='WB9XYZ KA2ABC FN42' @@ -61,7 +75,7 @@ program rtty_spec nsym=79 nsps=1920 bt=2.0 - f0=3000.0 + f0=4000.0 icmplx=0 nwave=nsym*nsps call gen_ft8wave(itone,nsym,nsps,bt,fsample,f0,cwave,wave,icmplx,nwave) @@ -72,13 +86,15 @@ program rtty_spec call genft4(msg37,ichk,msgsent37,msgbits,itone) nsym=103 nsps=576 - f0=3500.0 + f0=4500.0 icmplx=0 nwave=(nsym+2)*nsps call gen_ft4wave(itone,nsym,nsps,fsample,f0,cwave,wave,icmplx,nwave) dat(6001:6000+nwave)=dat(6001:6000+nwave) + sig*wave(1:nwave) + h=default_header(12000,NMAX) - iwave=nint(rms*dat) + datmax=maxval(abs(dat)) + iwave=nint(32767.0*dat/datmax) open(10,file='000000_000001.wav',access='stream',status='unknown') write(10) h,iwave close(10) From 7e9cc9cbc7c0283591ef6ee688f6b06e4c7fd191 Mon Sep 17 00:00:00 2001 From: Steve Franke Date: Fri, 14 Jun 2019 16:28:59 -0500 Subject: [PATCH 149/159] FT4: Improve sync performance on disturbed channels. Make jt9 command-line option -d work --- lib/ft4/sync4d.f90 | 10 ++++++---- lib/ft4_decode.f90 | 7 +++---- lib/jt9.f90 | 1 - 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/lib/ft4/sync4d.f90 b/lib/ft4/sync4d.f90 index 28cb10b99..810412253 100644 --- a/lib/ft4/sync4d.f90 +++ b/lib/ft4/sync4d.f90 @@ -9,7 +9,6 @@ subroutine sync4d(cd0,i0,ctwk,itwk,sync) complex csync2(2*NSS) complex ctwk(2*NSS) complex z1,z2,z3,z4 - complex zz1,zz2,zz3,zz4 logical first integer icos4a(0:3),icos4b(0:3),icos4c(0:3),icos4d(0:3) data icos4a/0,1,3,2/ @@ -19,7 +18,7 @@ subroutine sync4d(cd0,i0,ctwk,itwk,sync) data first/.true./ save first,twopi,csynca,csyncb,csyncc,csyncd,fac - p(z1)=real(z1*fac)**2 + aimag(z1*fac)**2 !Statement function for power + p(z1)=sqrt(real(z1*fac)**2 + aimag(z1*fac)**2) !Statement function for power if( first ) then twopi=8.0*atan(1.0) @@ -60,11 +59,12 @@ subroutine sync4d(cd0,i0,ctwk,itwk,sync) z4=0. if(itwk.eq.1) csync2=ctwk*csynca !Tweak the frequency + z1=0. if(i1.ge.0 .and. i1+4*NSS-1.le.NP-1) then z1=sum(cd0(i1:i1+4*NSS-1:2)*conjg(csync2)) elseif( i1.lt.0 ) then npts=(i1+4*NSS-1)/2 - if(npts.le.8) then + if(npts.le.16) then z1=0. else z1=sum(cd0(0:i1+4*NSS-1:2)*conjg(csync2(2*NSS-npts:))) @@ -78,16 +78,18 @@ subroutine sync4d(cd0,i0,ctwk,itwk,sync) if(i3.ge.0 .and. i3+4*NSS-1.le.NP-1) z3=sum(cd0(i3:i3+4*NSS-1:2)*conjg(csync2)) if(itwk.eq.1) csync2=ctwk*csyncd !Tweak the frequency + z4=0. if(i4.ge.0 .and. i4+4*NSS-1.le.NP-1) then z4=sum(cd0(i4:i4+4*NSS-1:2)*conjg(csync2)) elseif( i4+4*NSS-1.gt.NP-1 ) then npts=(NP-1-i4+1)/2 - if(npts.le.8) then + if(npts.le.16) then z4=0. else z4=sum(cd0(i4:i4+2*npts-1:2)*conjg(csync2(1:npts))) endif endif + sync = p(z1) + p(z2) + p(z3) + p(z4) return diff --git a/lib/ft4_decode.f90 b/lib/ft4_decode.f90 index 28c044c77..0c1a4026f 100644 --- a/lib/ft4_decode.f90 +++ b/lib/ft4_decode.f90 @@ -285,12 +285,10 @@ contains else cd(-ibest:ibest+NN*NSS-1)=cb(0:NN*NSS+2*ibest-1) endif - call timer('bitmet ',0) call get_ft4_bitmetrics(cd,bitmetrics,badsync) call timer('bitmet ',1) if(badsync) cycle - hbits=0 where(bitmetrics(:,1).ge.0) hbits=1 ns1=count(hbits( 1: 8).eq.(/0,0,0,1,1,0,1,1/)) @@ -405,7 +403,7 @@ contains if(doosd .and. nharderror.lt.0) then ndeep=3 - if(abs(nfqso-f1).le.napwid) then + if(abs(nfqso-f0).le.napwid) then ndeep=4 endif call timer('osd174_91 ',0) @@ -439,7 +437,8 @@ contains endif nsnr=nint(max(-21.0,xsnr)) xdt=ibest/666.67 - 0.5 -!write(21,'(i6.6,i5,2x,f4.1,i6,2x,a37,2x,f4.1,3i3,f5.1)') nutc,nsnr,xdt,nint(f0),message,sync,iaptype,ipass,isp,dmin +!write(21,'(i6.6,i5,2x,f4.1,i6,2x,a37,2x,f4.1,3i3,f5.1,i4,i4)') & +! nutc,nsnr,xdt,nint(f0),message,sync,iaptype,ipass,isp,dmin,nsync_qual,nharderror call this%callback(sync,nsnr,xdt,f0,message,iaptype,qual) exit endif diff --git a/lib/jt9.f90 b/lib/jt9.f90 index 0e99a7592..2e8dbd0f0 100644 --- a/lib/jt9.f90 +++ b/lib/jt9.f90 @@ -179,7 +179,6 @@ program jt9 go to 999 endif - if(mode.eq.5) ndepth=3 allocate(shared_data) nflatten=0 From c26d0b4f29ac84fb05ce1f856459144b5ff66a1e Mon Sep 17 00:00:00 2001 From: Steve Franke Date: Sun, 16 Jun 2019 09:46:33 -0500 Subject: [PATCH 150/159] FT4: Imrovements to sync. Divide DT search range into 3 segments. Search central segment (near DT=0) first and try to decode the largest peak. Then find the largest peak in each of the surrounding segments and try to decode those only if the peak is larger than the one found in the central segment. Also re-indent ft4_decode.f90 and some other minor tweaks. --- lib/ft4/getcandidates4.f90 | 5 +- lib/ft4/sync4d.f90 | 2 +- lib/ft4_decode.f90 | 406 +++++++++++++++++++------------------ 3 files changed, 214 insertions(+), 199 deletions(-) diff --git a/lib/ft4/getcandidates4.f90 b/lib/ft4/getcandidates4.f90 index 951129915..09c2f135d 100644 --- a/lib/ft4/getcandidates4.f90 +++ b/lib/ft4/getcandidates4.f90 @@ -8,7 +8,7 @@ subroutine getcandidates4(dd,fa,fb,syncmin,nfqso,maxcand,savg,candidate, & real x(NFFT1) real window(NFFT1) complex cx(0:NH1) - real candidate(3,maxcand) + real candidate(2,maxcand) real dd(NMAX) integer ipk(1) equivalence (x,cx) @@ -64,8 +64,7 @@ subroutine getcandidates4(dd,fa,fb,syncmin,nfqso,maxcand,savg,candidate, & speak=savsm(i) - 0.25*(savsm(i-1)-savsm(i+1))*del ncand=ncand+1 candidate(1,ncand)=fpeak - candidate(2,ncand)=-99.99 - candidate(3,ncand)=speak + candidate(2,ncand)=speak if(ncand.eq.maxcand) exit endif enddo diff --git a/lib/ft4/sync4d.f90 b/lib/ft4/sync4d.f90 index 810412253..8d78f66aa 100644 --- a/lib/ft4/sync4d.f90 +++ b/lib/ft4/sync4d.f90 @@ -18,7 +18,7 @@ subroutine sync4d(cd0,i0,ctwk,itwk,sync) data first/.true./ save first,twopi,csynca,csyncb,csyncc,csyncd,fac - p(z1)=sqrt(real(z1*fac)**2 + aimag(z1*fac)**2) !Statement function for power + p(z1)=(real(z1*fac)**2 + aimag(z1*fac)**2)**0.5 !Statement function for power if( first ) then twopi=8.0*atan(1.0) diff --git a/lib/ft4_decode.f90 b/lib/ft4_decode.f90 index 0c1a4026f..0ec43dd99 100644 --- a/lib/ft4_decode.f90 +++ b/lib/ft4_decode.f90 @@ -50,7 +50,7 @@ contains real bitmetrics(2*NN,3) real dd(NMAX) real llr(2*ND),llra(2*ND),llrb(2*ND),llrc(2*ND),llrd(2*ND) - real candidate(3,100) + real candidate(2,100) real savg(NH1),sbase(NH1) integer apbits(2*ND) @@ -194,7 +194,7 @@ contains dd=iwave ! ndepth=3: 3 passes, bp+osd -! ndepth=2: 3 passes, bp only +! ndepth=2: 3 passes, bp only ! ndepth=1: 1 pass, no subtraction max_iterations=40 @@ -203,23 +203,23 @@ contains doosd=.true. nsp=3 if(ndepth.eq.2) then - doosd=.false. + doosd=.false. endif - if(ndepth.eq.1) then - nsp=1 - dosubtract=.false. - doosd=.false. + if(ndepth.eq.1) then + nsp=1 + dosubtract=.false. + doosd=.false. endif - + do isp = 1,nsp if(isp.eq.2) then - if(ndecodes.eq.0) exit - nd1=ndecodes + if(ndecodes.eq.0) exit + nd1=ndecodes elseif(isp.eq.3) then - nd2=ndecodes-nd1 - if(nd2.eq.0) exit + nd2=ndecodes-nd1 + if(nd2.eq.0) exit endif - + candidate=0.0 ncand=0 call timer('getcand4',0) @@ -229,7 +229,7 @@ contains dobigfft=.true. do icand=1,ncand f0=candidate(1,icand) - snr=candidate(3,icand)-1.0 + snr=candidate(2,icand)-1.0 call timer('ft4_down',0) call ft4_downsample(dd,dobigfft,f0,cd2) !Downsample to 32 Sam/Sym call timer('ft4_down',1) @@ -237,99 +237,113 @@ contains sum2=sum(cd2*conjg(cd2))/(real(NMAX)/real(NDOWN)) if(sum2.gt.0.0) cd2=cd2/sqrt(sum2) ! Sample rate is now 12000/18 = 666.67 samples/second - do isync=1,2 - if(isync.eq.1) then - idfmin=-12 - idfmax=12 - idfstp=3 - ibmin=-344 - ibmax=1012 - ibstp=4 - else - idfmin=idfbest-4 - idfmax=idfbest+4 - idfstp=1 - ibmin=ibest-5 - ibmax=ibest+5 - ibstp=1 - endif - ibest=-1 - smax=-99. - idfbest=0 - call timer('sync4d ',0) - do idf=idfmin,idfmax,idfstp - do istart=ibmin,ibmax,ibstp - call sync4d(cd2,istart,ctwk2(:,idf),1,sync) !Find sync power - if(sync.gt.smax) then - smax=sync - ibest=istart - idfbest=idf + do iseg=1,3 ! DT search is done over 3 segments + do isync=1,2 + if(isync.eq.1) then + idfmin=-12 + idfmax=12 + idfstp=3 + ibmin=-344 + ibmax=1012 + if(iseg.eq.1) then + ibmin=108 + ibmax=560 + elseif(iseg.eq.2) then + smax1=smax + ibmin=560 + ibmax=1012 + elseif(iseg.eq.3) then + ibmin=-344 + ibmax=108 endif + ibstp=4 + else + idfmin=idfbest-4 + idfmax=idfbest+4 + idfstp=1 + ibmin=ibest-5 + ibmax=ibest+5 + ibstp=1 + endif + ibest=-1 + idfbest=0 + smax=-99. + call timer('sync4d ',0) + do idf=idfmin,idfmax,idfstp + do istart=ibmin,ibmax,ibstp + call sync4d(cd2,istart,ctwk2(:,idf),1,sync) !Find sync power + if(sync.gt.smax) then + smax=sync + ibest=istart + idfbest=idf + endif + enddo enddo + call timer('sync4d ',1) enddo - call timer('sync4d ',1) - enddo - if(smax.lt.0.7) cycle - f0=f0+real(idfbest) - if( f0.le.10.0 .or. f0.ge.4990.0 ) cycle - call timer('ft4down ',0) - call ft4_downsample(dd,dobigfft,f0,cb) !Final downsample, corrected f0 - call timer('ft4down ',1) - sum2=sum(abs(cb)**2)/(real(NSS)*NN) - if(sum2.gt.0.0) cb=cb/sqrt(sum2) - cd=0. - if(ibest.ge.0) then - it=min(NDMAX-1,ibest+NN*NSS-1) - np=it-ibest+1 - cd(0:np-1)=cb(ibest:it) - else - cd(-ibest:ibest+NN*NSS-1)=cb(0:NN*NSS+2*ibest-1) - endif - call timer('bitmet ',0) - call get_ft4_bitmetrics(cd,bitmetrics,badsync) - call timer('bitmet ',1) - if(badsync) cycle - hbits=0 - where(bitmetrics(:,1).ge.0) hbits=1 - ns1=count(hbits( 1: 8).eq.(/0,0,0,1,1,0,1,1/)) - ns2=count(hbits( 67: 74).eq.(/0,1,0,0,1,1,1,0/)) - ns3=count(hbits(133:140).eq.(/1,1,1,0,0,1,0,0/)) - ns4=count(hbits(199:206).eq.(/1,0,1,1,0,0,0,1/)) - nsync_qual=ns1+ns2+ns3+ns4 - if(nsync_qual.lt. 20) cycle - - scalefac=2.83 - llra( 1: 58)=bitmetrics( 9: 66, 1) - llra( 59:116)=bitmetrics( 75:132, 1) - llra(117:174)=bitmetrics(141:198, 1) - llra=scalefac*llra - llrb( 1: 58)=bitmetrics( 9: 66, 2) - llrb( 59:116)=bitmetrics( 75:132, 2) - llrb(117:174)=bitmetrics(141:198, 2) - llrb=scalefac*llrb - llrc( 1: 58)=bitmetrics( 9: 66, 3) - llrc( 59:116)=bitmetrics( 75:132, 3) - llrc(117:174)=bitmetrics(141:198, 3) - llrc=scalefac*llrc - - apmag=maxval(abs(llra))*1.1 - npasses=3+nappasses(nQSOProgress) - if(lapcqonly) npasses=4 - if(ndepth.eq.1) npasses=3 - if(ncontest.ge.5) npasses=3 ! Don't support Fox and Hound - do ipass=1,npasses - if(ipass.eq.1) llr=llra - if(ipass.eq.2) llr=llrb - if(ipass.eq.3) llr=llrc - if(ipass.le.3) then - apmask=0 - iaptype=0 + if(iseg.eq.1) smax1=smax + if(smax.lt.0.7) cycle + if(iseg.gt.1 .and. smax.lt.smax1) cycle + f1=f0+real(idfbest) + if( f1.le.10.0 .or. f1.ge.4990.0 ) cycle + call timer('ft4down ',0) + call ft4_downsample(dd,dobigfft,f1,cb) !Final downsample, corrected f0 + call timer('ft4down ',1) + sum2=sum(abs(cb)**2)/(real(NSS)*NN) + if(sum2.gt.0.0) cb=cb/sqrt(sum2) + cd=0. + if(ibest.ge.0) then + it=min(NDMAX-1,ibest+NN*NSS-1) + np=it-ibest+1 + cd(0:np-1)=cb(ibest:it) + else + cd(-ibest:ibest+NN*NSS-1)=cb(0:NN*NSS+2*ibest-1) endif + call timer('bitmet ',0) + call get_ft4_bitmetrics(cd,bitmetrics,badsync) + call timer('bitmet ',1) + if(badsync) cycle + hbits=0 + where(bitmetrics(:,1).ge.0) hbits=1 + ns1=count(hbits( 1: 8).eq.(/0,0,0,1,1,0,1,1/)) + ns2=count(hbits( 67: 74).eq.(/0,1,0,0,1,1,1,0/)) + ns3=count(hbits(133:140).eq.(/1,1,1,0,0,1,0,0/)) + ns4=count(hbits(199:206).eq.(/1,0,1,1,0,0,0,1/)) + nsync_qual=ns1+ns2+ns3+ns4 + if(nsync_qual.lt. 20) cycle - if(ipass .gt. 3) then - llrd=llra - iaptype=naptypes(nQSOProgress,ipass-3) - if(lapcqonly) iaptype=1 + scalefac=2.83 + llra( 1: 58)=bitmetrics( 9: 66, 1) + llra( 59:116)=bitmetrics( 75:132, 1) + llra(117:174)=bitmetrics(141:198, 1) + llra=scalefac*llra + llrb( 1: 58)=bitmetrics( 9: 66, 2) + llrb( 59:116)=bitmetrics( 75:132, 2) + llrb(117:174)=bitmetrics(141:198, 2) + llrb=scalefac*llrb + llrc( 1: 58)=bitmetrics( 9: 66, 3) + llrc( 59:116)=bitmetrics( 75:132, 3) + llrc(117:174)=bitmetrics(141:198, 3) + llrc=scalefac*llrc + + apmag=maxval(abs(llra))*1.1 + npasses=3+nappasses(nQSOProgress) + if(lapcqonly) npasses=4 + if(ndepth.eq.1) npasses=3 + if(ncontest.ge.5) npasses=3 ! Don't support Fox and Hound + do ipass=1,npasses + if(ipass.eq.1) llr=llra + if(ipass.eq.2) llr=llrb + if(ipass.eq.3) llr=llrc + if(ipass.le.3) then + apmask=0 + iaptype=0 + endif + + if(ipass .gt. 3) then + llrd=llra + iaptype=naptypes(nQSOProgress,ipass-3) + if(lapcqonly) iaptype=1 ! ncontest=0 : NONE ! 1 : NA_VHF @@ -340,109 +354,111 @@ contains ! 6 : HOUND ! ! Conditions that cause us to bail out of AP decoding - napwid=50 - if(ncontest.le.4 .and. iaptype.ge.3 .and. (abs(f0-nfqso).gt.napwid) ) cycle - if(iaptype.ge.2 .and. apbits(1).gt.1) cycle ! No, or nonstandard, mycall - if(iaptype.ge.3 .and. apbits(30).gt.1) cycle ! No, or nonstandard, dxcall + napwid=50 + if(ncontest.le.4 .and. iaptype.ge.3 .and. (abs(f1-nfqso).gt.napwid) ) cycle + if(iaptype.ge.2 .and. apbits(1).gt.1) cycle ! No, or nonstandard, mycall + if(iaptype.ge.3 .and. apbits(30).gt.1) cycle ! No, or nonstandard, dxcall - if(iaptype.eq.1) then ! CQ or CQ TEST or CQ FD or CQ RU or CQ SCC - apmask=0 - apmask(1:29)=1 - llrd(1:29)=apmag*mcq(1:29) - endif - - if(iaptype.eq.2) then ! MyCall,???,??? - apmask=0 - if(ncontest.eq.0.or.ncontest.eq.1) then + if(iaptype.eq.1) then ! CQ or CQ TEST or CQ FD or CQ RU or CQ SCC + apmask=0 apmask(1:29)=1 - llrd(1:29)=apmag*apbits(1:29) - else if(ncontest.eq.2) then - apmask(1:28)=1 - llrd(1:28)=apmag*apbits(1:28) - else if(ncontest.eq.3) then - apmask(1:28)=1 - llrd(1:28)=apmag*apbits(1:28) - else if(ncontest.eq.4) then - apmask(2:29)=1 - llrd(2:29)=apmag*apmy_ru(1:28) + llrd(1:29)=apmag*mcq(1:29) endif - endif - if(iaptype.eq.3) then ! MyCall,DxCall,??? - apmask=0 - if(ncontest.eq.0.or.ncontest.eq.1.or.ncontest.eq.2) then - apmask(1:58)=1 - llrd(1:58)=apmag*apbits(1:58) - else if(ncontest.eq.3) then ! Field Day - apmask(1:56)=1 - llrd(1:28)=apmag*apbits(1:28) - llrd(29:56)=apmag*aphis_fd(1:28) - else if(ncontest.eq.4) then ! RTTY RU - apmask(2:57)=1 - llrd(2:29)=apmag*apmy_ru(1:28) - llrd(30:57)=apmag*apbits(30:57) + if(iaptype.eq.2) then ! MyCall,???,??? + apmask=0 + if(ncontest.eq.0.or.ncontest.eq.1) then + apmask(1:29)=1 + llrd(1:29)=apmag*apbits(1:29) + else if(ncontest.eq.2) then + apmask(1:28)=1 + llrd(1:28)=apmag*apbits(1:28) + else if(ncontest.eq.3) then + apmask(1:28)=1 + llrd(1:28)=apmag*apbits(1:28) + else if(ncontest.eq.4) then + apmask(2:29)=1 + llrd(2:29)=apmag*apmy_ru(1:28) + endif endif - endif - if(iaptype.eq.4 .or. iaptype.eq.5 .or. iaptype.eq.6) then - apmask=0 - if(ncontest.le.4) then - apmask(1:91)=1 ! mycall, hiscall, RRR|73|RR73 - if(iaptype.eq.6) llrd(1:91)=apmag*apbits(1:91) + if(iaptype.eq.3) then ! MyCall,DxCall,??? + apmask=0 + if(ncontest.eq.0.or.ncontest.eq.1.or.ncontest.eq.2) then + apmask(1:58)=1 + llrd(1:58)=apmag*apbits(1:58) + else if(ncontest.eq.3) then ! Field Day + apmask(1:56)=1 + llrd(1:28)=apmag*apbits(1:28) + llrd(29:56)=apmag*aphis_fd(1:28) + else if(ncontest.eq.4) then ! RTTY RU + apmask(2:57)=1 + llrd(2:29)=apmag*apmy_ru(1:28) + llrd(30:57)=apmag*apbits(30:57) + endif endif + + if(iaptype.eq.4 .or. iaptype.eq.5 .or. iaptype.eq.6) then + apmask=0 + if(ncontest.le.4) then + apmask(1:91)=1 ! mycall, hiscall, RRR|73|RR73 + if(iaptype.eq.6) llrd(1:91)=apmag*apbits(1:91) + endif + endif + + llr=llrd + endif + message77=0 + dmin=0.0 + call timer('bpdec174',0) + call bpdecode174_91(llr,apmask,max_iterations,message77, & + cw,nharderror,niterations) + call timer('bpdec174',1) + + if(doosd .and. nharderror.lt.0) then + ndeep=3 +! if(abs(nfqso-f1).le.napwid) then +! ndeep=4 +! endif + call timer('osd174_91 ',0) + call osd174_91(llr,apmask,ndeep,message77,cw,nharderror,dmin) + call timer('osd174_91 ',1) endif - llr=llrd - endif - message77=0 - dmin=0.0 - call timer('bpdec174',0) - call bpdecode174_91(llr,apmask,max_iterations,message77, & - cw,nharderror,niterations) - call timer('bpdec174',1) - - if(doosd .and. nharderror.lt.0) then - ndeep=3 - if(abs(nfqso-f0).le.napwid) then - ndeep=4 + if(sum(message77).eq.0) cycle + if( nharderror.ge.0 ) then + message77=mod(message77+rvec,2) ! remove rvec scrambling + write(c77,'(77i1)') message77(1:77) + call unpack77(c77,1,message,unpk77_success) + if(unpk77_success.and.dosubtract) then + call get_ft4_tones_from_77bits(message77,i4tone) + dt=real(ibest)/666.67 + call timer('subtract',0) + call subtractft4(dd,i4tone,f1,dt) + call timer('subtract',1) + endif + idupe=0 + do i=1,ndecodes + if(decodes(i).eq.message) idupe=1 + enddo + if(idupe.eq.1) exit + ndecodes=ndecodes+1 + decodes(ndecodes)=message + if(snr.gt.0.0) then + xsnr=10*log10(snr)-14.8 + else + xsnr=-21.0 + endif + nsnr=nint(max(-21.0,xsnr)) + xdt=ibest/666.67 - 0.5 +!write(21,'(i6.6,i5,2x,f4.1,i6,2x,a37,2x,f4.1,3i3,f5.1,i4,i4,i4)') & +! nutc,nsnr,xdt,nint(f1),message,smax,iaptype,ipass,isp,dmin,nsync_qual,nharderror,iseg + call this%callback(smax,nsnr,xdt,f1,message,iaptype,qual) + exit endif - call timer('osd174_91 ',0) - call osd174_91(llr,apmask,ndeep,message77,cw,nharderror,dmin) - call timer('osd174_91 ',1) - endif - - if(sum(message77).eq.0) cycle - if( nharderror.ge.0 ) then - message77=mod(message77+rvec,2) ! remove rvec scrambling - write(c77,'(77i1)') message77(1:77) - call unpack77(c77,1,message,unpk77_success) - if(unpk77_success.and.dosubtract) then - call get_ft4_tones_from_77bits(message77,i4tone) - dt=real(ibest)/666.67 - call timer('subtract',0) - call subtractft4(dd,i4tone,f0,dt) - call timer('subtract',1) - endif - idupe=0 - do i=1,ndecodes - if(decodes(i).eq.message) idupe=1 - enddo - if(idupe.eq.1) exit - ndecodes=ndecodes+1 - decodes(ndecodes)=message - if(snr.gt.0.0) then - xsnr=10*log10(snr)-14.8 - else - xsnr=-21.0 - endif - nsnr=nint(max(-21.0,xsnr)) - xdt=ibest/666.67 - 0.5 -!write(21,'(i6.6,i5,2x,f4.1,i6,2x,a37,2x,f4.1,3i3,f5.1,i4,i4)') & -! nutc,nsnr,xdt,nint(f0),message,sync,iaptype,ipass,isp,dmin,nsync_qual,nharderror - call this%callback(sync,nsnr,xdt,f0,message,iaptype,qual) - exit - endif - enddo !Sequence estimation + enddo !Sequence estimation + if(nharderror.ge.0) exit + enddo !3 DT segments enddo !Candidate list enddo !Subtraction loop return From 396bf1a0132dc8c2585a029c1a0cef1bb80e2636 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 17 Jun 2019 11:26:46 -0400 Subject: [PATCH 151/159] Correct a flaw in ft8sim when generating data with large abs(DT). --- lib/ft8/ft8sim.f90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/ft8/ft8sim.f90 b/lib/ft8/ft8sim.f90 index bbec600d4..c5dd82bb7 100644 --- a/lib/ft8/ft8sim.f90 +++ b/lib/ft8/ft8sim.f90 @@ -91,7 +91,7 @@ program ft8sim msg0=msg do ifile=1,nfiles k=nint((xdt+0.5)/dt) - ia=k + ia=max(1,k) phi=0.0 c0=0.0 do j=1,NN !Generate complex waveform @@ -105,7 +105,7 @@ program ft8sim if(fspread.ne.0.0 .or. delay.ne.0.0) call watterson(c0,NMAX,NWAVE,fs,delay,fspread) c=sig*c0 - ib=k + ib=min(k,NMAX) wave=real(c) peak=maxval(abs(wave(ia:ib))) nslots=1 From 393b595126bf88490faf1e4a8440255f169a4b88 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 17 Jun 2019 15:47:47 -0400 Subject: [PATCH 152/159] Editorial work on parts of the User Guide related to FT4. --- doc/user_guide/en/introduction.adoc | 6 ++++-- doc/user_guide/en/new_features.adoc | 18 ++++++------------ doc/user_guide/en/protocols.adoc | 9 +++++---- doc/user_guide/en/tutorial-example4.adoc | 3 ++- 4 files changed, 17 insertions(+), 19 deletions(-) diff --git a/doc/user_guide/en/introduction.adoc b/doc/user_guide/en/introduction.adoc index 6da0f7936..f0d8e12e7 100644 --- a/doc/user_guide/en/introduction.adoc +++ b/doc/user_guide/en/introduction.adoc @@ -34,8 +34,10 @@ are possible (by EME and other propagation types) at signal levels 10 to 15 dB below those required for CW. Note that even though their T/R sequences are short, FT4 and FT8 are -classified as slow modes because their message frames are sent -only once per transmission. +classified as slow modes because their message frames are sent only +once per transmission. All fast modes in _WSJT-X_ send their message +frames repeatedly, as many times as will fit into the Tx sequence +length. *ISCAT*, *MSK144*, and optionally submodes *JT9E-H* are "`fast`" protocols designed to take advantage of brief signal enhancements from diff --git a/doc/user_guide/en/new_features.adoc b/doc/user_guide/en/new_features.adoc index 496bef16b..de5c34ff0 100644 --- a/doc/user_guide/en/new_features.adoc +++ b/doc/user_guide/en/new_features.adoc @@ -1,17 +1,11 @@ === New in Version {VERSION} -For quick reference, here's a short list of features and capabilities -added to _WSJT-X_ since Version 2.0.1: - -- New FT4 protocol, designed especially for radio contesting - -* T/R sequence length 7.5 s - -* Bandwidth 80 Hz - -* Threshold sensitivity -17.5 dB - -- Improvements to accessibility +The most important feature added to _WSJT-X_ since Version 2.0.1 is +the new *FT4 protocol*, designed especially for radio contesting. It +has T/R sequence length 7.5 s, bandwidth 80 Hz, and threshold +sensitivity -17.5 dB. Version 2.1.0 also has improvements to FT8 +waveform generation, contest logging, rig control, the user interface, +and accessibility, as well as a number of bug fixes. === Documentation Conventions diff --git a/doc/user_guide/en/protocols.adoc b/doc/user_guide/en/protocols.adoc index fc0dad266..e0d4145e3 100644 --- a/doc/user_guide/en/protocols.adoc +++ b/doc/user_guide/en/protocols.adoc @@ -13,9 +13,10 @@ aim is to compress the most common messages used for minimally valid QSOs into a fixed 72-bit length. The information payload for FT4, FT8, and MSK144 contains 77 bits. -The 5 additional bits are used to flag special message types used for -FT8 DXpedition Mode, contesting, nonstandard callsigns, and a few -other special types. +The 5 new bits added to the original 72 are used to flag special +message types signifying special message types used for FT8 DXpedition +Mode, contesting, nonstandard callsigns, and a few other +possibilities. A standard amateur callsign consists of a one- or two-character prefix, at least one of which must be a letter, followed by a digit @@ -76,7 +77,7 @@ Forward error correction (FEC) in FT4 uses a low-density parity check called an LDPC (174,91) code. Synchronization uses four 4×4 Costas arrays, and ramp-up and ramp-down symbols are inserted at the start and end of each transmission. Modulation is 4-tone frequency-shift -keying with Gaussian smoothing of frequency transitions (4-GFSK). The +keying (4-GFSK) with Gaussian smoothing of frequency transitions. The keying rate is 12000/576 = 20.8333 baud. Each transmitted symbol conveys two bits, so the total number of channel symbols is 174/2 + 16 + 2 = 105. The total bandwidth is 4 × 20.8333 = 83.3 Hz. diff --git a/doc/user_guide/en/tutorial-example4.adoc b/doc/user_guide/en/tutorial-example4.adoc index 762459728..43be6af1a 100644 --- a/doc/user_guide/en/tutorial-example4.adoc +++ b/doc/user_guide/en/tutorial-example4.adoc @@ -14,7 +14,8 @@ frequency limit is approximately 4000 Hz. - Select *File | Open* and navigate to +...\save\samples\FT4\000000_000002.wav+. The waterfall and Band Activity window should look something like the following screen shots. -Most of the decoded messages use the *RTTY Roundup* message formats. +This sample file was recorded during a practice contest test session, so +most of the decoded messages use the *RTTY Roundup* message formats. [[X15]] image::ft4_waterfall.png[align="left",alt="Wide Graph Decode FT4"] From 6caf9955a490a013ecc93c953b2419c8845c9bc6 Mon Sep 17 00:00:00 2001 From: Steve Franke Date: Tue, 18 Jun 2019 11:35:54 -0500 Subject: [PATCH 153/159] Back off to 77 AP bits for RR73 decodes, for now. --- lib/ft4_decode.f90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/ft4_decode.f90 b/lib/ft4_decode.f90 index 0ec43dd99..3e4fa0916 100644 --- a/lib/ft4_decode.f90 +++ b/lib/ft4_decode.f90 @@ -401,8 +401,8 @@ contains if(iaptype.eq.4 .or. iaptype.eq.5 .or. iaptype.eq.6) then apmask=0 if(ncontest.le.4) then - apmask(1:91)=1 ! mycall, hiscall, RRR|73|RR73 - if(iaptype.eq.6) llrd(1:91)=apmag*apbits(1:91) + apmask(1:77)=1 ! mycall, hiscall, RRR|73|RR73 + if(iaptype.eq.6) llrd(1:77)=apmag*apbits(1:77) endif endif From c68679bd10e27e6940c1692ac047f42916b69c4f Mon Sep 17 00:00:00 2001 From: Steve Franke Date: Wed, 19 Jun 2019 09:07:08 -0500 Subject: [PATCH 154/159] Tweak to reduce the number of bad candidates. --- lib/ft4_decode.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ft4_decode.f90 b/lib/ft4_decode.f90 index 3e4fa0916..1fd60efa6 100644 --- a/lib/ft4_decode.f90 +++ b/lib/ft4_decode.f90 @@ -282,7 +282,7 @@ contains call timer('sync4d ',1) enddo if(iseg.eq.1) smax1=smax - if(smax.lt.0.7) cycle + if(smax.lt.1.2) cycle if(iseg.gt.1 .and. smax.lt.smax1) cycle f1=f0+real(idfbest) if( f1.le.10.0 .or. f1.ge.4990.0 ) cycle From 91aa591a7139d0bb3c3f989fd613941ee4790cdd Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Mon, 24 Jun 2019 00:56:41 +0100 Subject: [PATCH 155/159] Better ADIF conformance for ARRL Field Day mode This change may break N1MM Logger+ integration, notably the CLASS ADIF field is populated which may not be recognized by N1MM Logger+, nor interfaces to it. One exception to ADIF conformance is that the ARRL_SECT field may be populated with the value DX despite it not being a valid ARRL_SECT enumeration value. This is done for consistency with N1MM Logger+ ADIF exports. --- logbook/logbook.cpp | 47 ++++++++++++++++++++++++++++----------------- logbook/logbook.h | 12 ++++++------ widgets/logqso.cpp | 34 ++++++++++++++++---------------- 3 files changed, 52 insertions(+), 41 deletions(-) diff --git a/logbook/logbook.cpp b/logbook/logbook.cpp index a154664d5..bb27f8fba 100644 --- a/logbook/logbook.cpp +++ b/logbook/logbook.cpp @@ -32,7 +32,7 @@ void LogBook::match (QString const& call, QString const& mode, QString const& gr bool& ITUZoneB4, QString const& band) const { - if (call.length() > 0) + if (call.size() > 0) { auto const& mode_to_check = (config_ && !config_->highlight_by_mode ()) ? QString {} : mode; callB4 = worked_before_.call_worked (call, mode_to_check, band); @@ -77,30 +77,30 @@ QByteArray LogBook::QSOToADIF (QString const& hisCall, QString const& hisGrid, Q QString const& xSent, QString const& xRcvd) { QString t; - t = "" + hisCall; - t += " " + hisGrid; + t = "" + hisCall; + t += " " + hisGrid; if (mode != "FT4") { - t += " " + mode; + t += " " + mode; } else { - t += " MFSK " + mode; + t += " MFSK " + mode; } - t += " " + rptSent; - t += " " + rptRcvd; + t += " " + rptSent; + t += " " + rptRcvd; t += " " + dateTimeOn.date().toString("yyyyMMdd"); t += " " + dateTimeOn.time().toString("hhmmss"); t += " " + dateTimeOff.date().toString("yyyyMMdd"); t += " " + dateTimeOff.time().toString("hhmmss"); - t += " " + band; - t += " " + strDialFreq; - t += " " + myCall; - t += " " + myGrid; - if(txPower!="") t += " " + txPower; - if(comments!="") t += " " + comments; - if(name!="") t += " " + name; - if(operator_call!="") t+=" " + operator_call; + t += " " + band; + t += " " + strDialFreq; + t += " " + myCall; + t += " " + myGrid; + if(txPower!="") t += " " + txPower; + if(comments!="") t += " " + comments; + if(name!="") t += " " + name; + if(operator_call!="") t+=" " + operator_call; if (xSent.size ()) { auto words = xSent.split (' ', QString::SkipEmptyParts); @@ -131,16 +131,27 @@ QByteArray LogBook::QSOToADIF (QString const& hisCall, QString const& hisGrid, Q { if (words.at (1).toUInt ()) { - t += " " + words.at (1); + t += " " + words.at (1); } else if (words.at (0).toUInt () && words.at (0).size () > 3) // EU VHF contest exchange { // strip report and set SRX to serial - t += " " + words.at (0).mid (2); + t += " " + words.at (0).mid (2); } else { - t += " " + words.at (1); + if (Configuration::SpecialOperatingActivity::FIELD_DAY == config_->special_op_id ()) + { + // include DX as an ARRL_SECT value even though it is + // not in the ADIF spec ARRL_SECT enumeration, done + // because N1MM does the same + t += " ARRL-FIELD-DAY ' + + words.at (0) + " ' + words.at (1); + } + else if (Configuration::SpecialOperatingActivity::RTTY == config_->special_op_id ()) + { + t += " " + words.at (1); + } } } } diff --git a/logbook/logbook.h b/logbook/logbook.h index c87009e48..858bb64d8 100644 --- a/logbook/logbook.h +++ b/logbook/logbook.h @@ -39,12 +39,12 @@ public: AD1CCty::Record const&, bool& callB4, bool& countryB4, bool &gridB4, bool &continentB4, bool& CQZoneB4, bool& ITUZoneB4, QString const& currentBand = QString {}) const; - static QByteArray QSOToADIF (QString const& hisCall, QString const& hisGrid, QString const& mode, - QString const& rptSent, QString const& rptRcvd, QDateTime const& dateTimeOn, - QDateTime const& dateTimeOff, QString const& band, QString const& comments, - QString const& name, QString const& strDialFreq, QString const& myCall, - QString const& m_myGrid, QString const& m_txPower, QString const& operator_call, - QString const& xSent, QString const& xRcvd); + QByteArray QSOToADIF (QString const& hisCall, QString const& hisGrid, QString const& mode, + QString const& rptSent, QString const& rptRcvd, QDateTime const& dateTimeOn, + QDateTime const& dateTimeOff, QString const& band, QString const& comments, + QString const& name, QString const& strDialFreq, QString const& myCall, + QString const& m_myGrid, QString const& m_txPower, QString const& operator_call, + QString const& xSent, QString const& xRcvd); Q_SIGNAL void finished_loading (int worked_before_record_count, QString const& error) const; diff --git a/widgets/logqso.cpp b/widgets/logqso.cpp index 2eaedf116..14c92358b 100644 --- a/widgets/logqso.cpp +++ b/widgets/logqso.cpp @@ -202,23 +202,23 @@ void LogQSO::accept() , m_myGrid , xsent , xrcvd - , LogBook::QSOToADIF (hisCall - , hisGrid - , mode - , rptSent - , rptRcvd - , dateTimeOn - , dateTimeOff - , band - , m_comments - , name - , strDialFreq - , m_myCall - , m_myGrid - , m_txPower - , operator_call - , xsent - , xrcvd)); + , m_log->QSOToADIF (hisCall + , hisGrid + , mode + , rptSent + , rptRcvd + , dateTimeOn + , dateTimeOff + , band + , m_comments + , name + , strDialFreq + , m_myCall + , m_myGrid + , m_txPower + , operator_call + , xsent + , xrcvd)); QDialog::accept(); } From 17492c45a9f780fa637543d0549a3c6c01bbc2e0 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Mon, 24 Jun 2019 16:03:41 +0100 Subject: [PATCH 156/159] Further field day ADIF log enhancements Received exchange exported to SRX_STRING. --- logbook/logbook.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/logbook/logbook.cpp b/logbook/logbook.cpp index bb27f8fba..96a8cb8e3 100644 --- a/logbook/logbook.cpp +++ b/logbook/logbook.cpp @@ -145,7 +145,8 @@ QByteArray LogBook::QSOToADIF (QString const& hisCall, QString const& hisGrid, Q // include DX as an ARRL_SECT value even though it is // not in the ADIF spec ARRL_SECT enumeration, done // because N1MM does the same - t += " ARRL-FIELD-DAY ' + t += " ARRL-FIELD-DAY ' + xRcvd + + " ' + words.at (0) + " ' + words.at (1); } else if (Configuration::SpecialOperatingActivity::RTTY == config_->special_op_id ()) From e7889ba11bf17d407089959cf346fd058b9bf30b Mon Sep 17 00:00:00 2001 From: Steve Franke Date: Mon, 24 Jun 2019 11:09:55 -0500 Subject: [PATCH 157/159] FT4: candidates within 20 Hz of nfqso are presented to the decoder first. --- lib/ft4/getcandidates4.f90 | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/lib/ft4/getcandidates4.f90 b/lib/ft4/getcandidates4.f90 index 09c2f135d..e9860b7a7 100644 --- a/lib/ft4/getcandidates4.f90 +++ b/lib/ft4/getcandidates4.f90 @@ -8,7 +8,7 @@ subroutine getcandidates4(dd,fa,fb,syncmin,nfqso,maxcand,savg,candidate, & real x(NFFT1) real window(NFFT1) complex cx(0:NH1) - real candidate(2,maxcand) + real candidate(2,maxcand),candidatet(2,maxcand) real dd(NMAX) integer ipk(1) equivalence (x,cx) @@ -48,11 +48,12 @@ subroutine getcandidates4(dd,fa,fb,syncmin,nfqso,maxcand,savg,candidate, & if(nfa.lt.nint(200.0/df)) nfa=nint(200.0/df) nfb=fb/df if(nfb.gt.nint(4910.0/df)) nfb=nint(4910.0/df) - ncand=0 call ft4_baseline(savg,nfa,nfb,sbase) if(any(sbase(nfa:nfb).le.0)) return savsm(nfa:nfb)=savsm(nfa:nfb)/sbase(nfa:nfb) f_offset = -1.5*12000.0/NSPS + ncand=0 + candidatet=0 do i=nfa+1,nfb-1 if(savsm(i).ge.savsm(i-1) .and. savsm(i).ge.savsm(i+1) .and. & savsm(i).ge.syncmin) then @@ -63,11 +64,23 @@ subroutine getcandidates4(dd,fa,fb,syncmin,nfqso,maxcand,savg,candidate, & if(fpeak.lt.200.0 .or. fpeak.gt.4910.0) cycle speak=savsm(i) - 0.25*(savsm(i-1)-savsm(i+1))*del ncand=ncand+1 - candidate(1,ncand)=fpeak - candidate(2,ncand)=speak + candidatet(1,ncand)=fpeak + candidatet(2,ncand)=speak if(ncand.eq.maxcand) exit endif enddo - + candidate=0 + nq=count(abs(candidatet(1,1:ncand)-nfqso).le.20.0) + n1=1 + n2=nq+1 + do i=1,ncand + if(abs(candidatet(1,i)-nfqso).le.20.0) then + candidate(1:2,n1)=candidatet(1:2,i) + n1=n1+1 + else + candidate(1:2,n2)=candidatet(1:2,i) + n2=n2+1 + endif + enddo return end subroutine getcandidates4 From c65d83235665919f19aab0c64c3523bb87e0fcbe Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Tue, 25 Jun 2019 14:35:58 +0100 Subject: [PATCH 158/159] New UDP messages to close and reconfigure WSJT-X plus more status fields The Status(1) message acquires the new fields Frequency Tolerance, T/R Period, and Configuration Name. The Rx DF, Tx DF fields become unsigned (this should be a benign change which is just for correctness as -ve values have never been possible). The Close(6) message becomes bi-directional allowing external applications to gracefully close down WSJT-X instances. A new message SwitchConfiguration(14) is provided that allows an external application to switch the current configuration of a WSJT-X instance. Another new message Configure(15) is provided to allow external applications to adjust some key parameters like the mode and submode. See the NetworkMessages.hpp header commentary for full details. The UDPExamples/MessageAggregator reference application has been updated to be able to exercise all of the above changes. Note that this commit enforces stricter checking on the "Settings->Reporting->Allow UDP requests" option, which must be checked before any state changing incoming messages to a WSJT-X instance are processed. --- Configuration.cpp | 7 +- Configuration.hpp | 1 + MessageClient.cpp | 58 +++- MessageClient.hpp | 22 +- MessageServer.cpp | 43 ++- MessageServer.hpp | 16 +- NetworkMessage.hpp | 70 +++-- UDPExamples/ClientWidget.cpp | 292 ++++++++++++++------ UDPExamples/ClientWidget.hpp | 83 ++++-- UDPExamples/MessageAggregatorMainWindow.cpp | 4 +- UDPExamples/UDPDaemon.cpp | 3 +- widgets/RestrictedSpinBox.cpp | 14 + widgets/RestrictedSpinBox.hpp | 1 + widgets/mainwindow.cpp | 197 ++++++++----- widgets/mainwindow.h | 5 + 15 files changed, 609 insertions(+), 207 deletions(-) diff --git a/Configuration.cpp b/Configuration.cpp index 2ac22b0b7..ebb6380b3 100644 --- a/Configuration.cpp +++ b/Configuration.cpp @@ -2092,7 +2092,12 @@ void Configuration::impl::accept () Q_EMIT self_->udp_server_port_changed (new_port); } - accept_udp_requests_ = ui_->accept_udp_requests_check_box->isChecked (); + if (ui_->accept_udp_requests_check_box->isChecked () != accept_udp_requests_) + { + accept_udp_requests_ = ui_->accept_udp_requests_check_box->isChecked (); + Q_EMIT self_->accept_udp_requests_changed (accept_udp_requests_); + } + n1mm_server_name_ = ui_->n1mm_server_name_line_edit->text (); n1mm_server_port_ = ui_->n1mm_server_port_spin_box->value (); broadcast_to_n1mm_ = ui_->enable_n1mm_broadcast_check_box->isChecked (); diff --git a/Configuration.hpp b/Configuration.hpp index 80f5a5cd1..dbf232fd5 100644 --- a/Configuration.hpp +++ b/Configuration.hpp @@ -271,6 +271,7 @@ public: // Q_SIGNAL void udp_server_changed (QString const& udp_server) const; Q_SIGNAL void udp_server_port_changed (port_type server_port) const; + Q_SIGNAL void accept_udp_requests_changed (bool checked) const; // signal updates to decode highlighting Q_SIGNAL void decode_highlighting_changed (DecodeHighlightingModel const&) const; diff --git a/MessageClient.cpp b/MessageClient.cpp index 0629c3026..ddf269564 100644 --- a/MessageClient.cpp +++ b/MessageClient.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include @@ -35,6 +36,7 @@ public: impl (QString const& id, QString const& version, QString const& revision, port_type server_port, MessageClient * self) : self_ {self} + , enabled_ {false} , id_ {id} , version_ {version} , revision_ {revision} @@ -79,6 +81,7 @@ public: Q_SLOT void host_info_results (QHostInfo); MessageClient * self_; + bool enabled_; QString id_; QString version_; QString revision_; @@ -160,6 +163,12 @@ void MessageClient::impl::parse_message (QByteArray const& msg) schema_ = in.schema (); } + if (!enabled_) + { + TRACE_UDP ("message processing disabled for id:" << in.id ()); + return; + } + // // message format is described in NetworkMessage.hpp // @@ -200,6 +209,15 @@ void MessageClient::impl::parse_message (QByteArray const& msg) } break; + case NetworkMessage::Close: + TRACE_UDP ("Close"); + if (check_status (in) != Fail) + { + last_message_.clear (); + Q_EMIT self_->close (); + } + break; + case NetworkMessage::Replay: TRACE_UDP ("Replay"); if (check_status (in) != Fail) @@ -265,14 +283,38 @@ void MessageClient::impl::parse_message (QByteArray const& msg) { QByteArray configuration_name; in >> configuration_name; - TRACE_UDP ("SwitchConfiguration name:" << configuration_name); - if (check_status (in) != Fail && configuration_name.size ()) + TRACE_UDP ("Switch Configuration name:" << configuration_name); + if (check_status (in) != Fail) { Q_EMIT self_->switch_configuration (QString::fromUtf8 (configuration_name)); } } break; + case NetworkMessage::Configure: + { + QByteArray mode; + quint32 frequency_tolerance; + QByteArray submode; + bool fast_mode {false}; + quint32 tr_period {std::numeric_limits::max ()}; + quint32 rx_df {std::numeric_limits::max ()}; + QByteArray dx_call; + QByteArray dx_grid; + bool generate_messages {false}; + in >> mode >> frequency_tolerance >> submode >> fast_mode >> tr_period >> rx_df + >> dx_call >> dx_grid >> generate_messages; + TRACE_UDP ("Configure mode:" << mode << "frequency tolerance:" << frequency_tolerance << "submode:" << submode << "fast mode:" << fast_mode << "T/R period:" << tr_period << "rx df:" << rx_df << "dx call:" << dx_call << "dx grid:" << dx_grid << "generate messages:" << generate_messages); + if (check_status (in) != Fail) + { + Q_EMIT self_->configure (QString::fromUtf8 (mode), frequency_tolerance + , QString::fromUtf8 (submode), fast_mode, tr_period, rx_df + , QString::fromUtf8 (dx_call), QString::fromUtf8 (dx_grid) + , generate_messages); + } + } + break; + default: // Ignore // @@ -450,13 +492,19 @@ void MessageClient::add_blocked_destination (QHostAddress const& a) } } +void MessageClient::enable (bool flag) +{ + m_->enabled_ = flag; +} + void MessageClient::status_update (Frequency f, QString const& mode, QString const& dx_call , QString const& report, QString const& tx_mode , bool tx_enabled, bool transmitting, bool decoding - , qint32 rx_df, qint32 tx_df, QString const& de_call + , quint32 rx_df, quint32 tx_df, QString const& de_call , QString const& de_grid, QString const& dx_grid , bool watchdog_timeout, QString const& sub_mode , bool fast_mode, quint8 special_op_mode + , quint32 frequency_tolerance, quint32 tr_period , QString const& configuration_name) { if (m_->server_port_ && !m_->server_string_.isEmpty ()) @@ -466,8 +514,8 @@ void MessageClient::status_update (Frequency f, QString const& mode, QString con out << f << mode.toUtf8 () << dx_call.toUtf8 () << report.toUtf8 () << tx_mode.toUtf8 () << tx_enabled << transmitting << decoding << rx_df << tx_df << de_call.toUtf8 () << de_grid.toUtf8 () << dx_grid.toUtf8 () << watchdog_timeout << sub_mode.toUtf8 () - << fast_mode << special_op_mode << configuration_name.toUtf8 (); - TRACE_UDP ("frequency:" << f << "mode:" << mode << "DX:" << dx_call << "report:" << report << "Tx mode:" << tx_mode << "tx_enabled:" << tx_enabled << "Tx:" << transmitting << "decoding:" << decoding << "Rx df:" << rx_df << "Tx df:" << tx_df << "DE:" << de_call << "DE grid:" << de_grid << "DX grid:" << dx_grid << "w/d t/o:" << watchdog_timeout << "sub_mode:" << sub_mode << "fast mode:" << fast_mode << "spec op mode:" << special_op_mode << "configuration name:" << configuration_name); + << fast_mode << special_op_mode << frequency_tolerance << tr_period << configuration_name.toUtf8 (); + TRACE_UDP ("frequency:" << f << "mode:" << mode << "DX:" << dx_call << "report:" << report << "Tx mode:" << tx_mode << "tx_enabled:" << tx_enabled << "Tx:" << transmitting << "decoding:" << decoding << "Rx df:" << rx_df << "Tx df:" << tx_df << "DE:" << de_call << "DE grid:" << de_grid << "DX grid:" << dx_grid << "w/d t/o:" << watchdog_timeout << "sub_mode:" << sub_mode << "fast mode:" << fast_mode << "spec op mode:" << special_op_mode << "frequency tolerance:" << frequency_tolerance << "T/R period:" << tr_period << "configuration name:" << configuration_name); m_->send_message (out, message); } } diff --git a/MessageClient.hpp b/MessageClient.hpp index 2396a6ad0..20f39b019 100644 --- a/MessageClient.hpp +++ b/MessageClient.hpp @@ -47,12 +47,16 @@ public: // change the server port messages are sent to Q_SLOT void set_server_port (port_type server_port = 0u); + // enable incoming messages + Q_SLOT void enable (bool); + // outgoing messages Q_SLOT void status_update (Frequency, QString const& mode, QString const& dx_call, QString const& report , QString const& tx_mode, bool tx_enabled, bool transmitting, bool decoding - , qint32 rx_df, qint32 tx_df, QString const& de_call, QString const& de_grid + , quint32 rx_df, quint32 tx_df, QString const& de_call, QString const& de_grid , QString const& dx_grid, bool watchdog_timeout, QString const& sub_mode - , bool fast_mode, quint8 special_op_mode, QString const& configuration_name); + , bool fast_mode, quint8 special_op_mode, quint32 frequency_tolerance + , quint32 tr_period, QString const& configuration_name); Q_SLOT void decode (bool is_new, QTime time, qint32 snr, float delta_time, quint32 delta_frequency , QString const& mode, QString const& message, bool low_confidence , bool off_air); @@ -89,6 +93,10 @@ public: Q_SIGNAL void reply (QTime, qint32 snr, float delta_time, quint32 delta_frequency, QString const& mode , QString const& message_text, bool low_confidence, quint8 modifiers); + // this signal is emitted if the server has requested this client to + // close down gracefully + Q_SIGNAL void close (); + // this signal is emitted if the server has requested a replay of // all decodes Q_SIGNAL void replay (); @@ -105,10 +113,16 @@ public: // callsign request for the specified call Q_SIGNAL void highlight_callsign (QString const& callsign, QColor const& bg, QColor const& fg, bool last_only); - // this signal is emitted if the server has requested a switch to a - // new configuration + // this signal is emitted if the server has requested a + // configuration switch Q_SIGNAL void switch_configuration (QString const& configuration_name); + // this signal is emitted if the server has requested a + // configuration change + Q_SIGNAL void configure (QString const& mode, quint32 frequency_tolerance, QString const& submode + , bool fast_mode, quint32 tr_period, quint32 rx_df, QString const& dx_call + , QString const& dx_grid, bool generate_messages); + // this signal is emitted when network errors occur or if a host // lookup fails Q_SIGNAL void error (QString const&) const; diff --git a/MessageServer.cpp b/MessageServer.cpp index 02d23e460..07b2fb429 100644 --- a/MessageServer.cpp +++ b/MessageServer.cpp @@ -1,6 +1,7 @@ #include "MessageServer.hpp" #include +#include #include #include @@ -16,6 +17,11 @@ #include "moc_MessageServer.cpp" +namespace +{ + auto quint32_max = std::numeric_limits::max (); +} + class MessageServer::impl : public QUdpSocket { @@ -238,8 +244,8 @@ void MessageServer::impl::parse_message (QHostAddress const& sender, port_type s bool tx_enabled {false}; bool transmitting {false}; bool decoding {false}; - qint32 rx_df {-1}; - qint32 tx_df {-1}; + quint32 rx_df {quint32_max}; + quint32 tx_df {quint32_max}; QByteArray de_call; QByteArray de_grid; QByteArray dx_grid; @@ -247,10 +253,12 @@ void MessageServer::impl::parse_message (QHostAddress const& sender, port_type s QByteArray sub_mode; bool fast_mode {false}; quint8 special_op_mode {0}; + quint32 frequency_tolerance {quint32_max}; + quint32 tr_period {quint32_max}; QByteArray configuration_name; in >> f >> mode >> dx_call >> report >> tx_mode >> tx_enabled >> transmitting >> decoding >> rx_df >> tx_df >> de_call >> de_grid >> dx_grid >> watchdog_timeout >> sub_mode - >> fast_mode >> special_op_mode >> configuration_name; + >> fast_mode >> special_op_mode >> frequency_tolerance >> tr_period >> configuration_name; if (check_status (in) != Fail) { Q_EMIT self_->status_update (id, f, QString::fromUtf8 (mode), QString::fromUtf8 (dx_call) @@ -259,7 +267,8 @@ void MessageServer::impl::parse_message (QHostAddress const& sender, port_type s , QString::fromUtf8 (de_call), QString::fromUtf8 (de_grid) , QString::fromUtf8 (dx_grid), watchdog_timeout , QString::fromUtf8 (sub_mode), fast_mode - , special_op_mode, QString::fromUtf8 (configuration_name)); + , special_op_mode, frequency_tolerance, tr_period + , QString::fromUtf8 (configuration_name)); } } break; @@ -494,6 +503,17 @@ void MessageServer::replay (QString const& id) } } +void MessageServer::close (QString const& id) +{ + auto iter = m_->clients_.find (id); + if (iter != std::end (m_->clients_)) + { + QByteArray message; + NetworkMessage::Builder out {&message, NetworkMessage::Close, id, (*iter).negotiated_schema_number_}; + m_->send_message (out, message, iter.value ().sender_address_, (*iter).sender_port_); + } +} + void MessageServer::halt_tx (QString const& id, bool auto_only) { auto iter = m_->clients_.find (id); @@ -554,3 +574,18 @@ void MessageServer::switch_configuration (QString const& id, QString const& conf m_->send_message (out, message, iter.value ().sender_address_, (*iter).sender_port_); } } + +void MessageServer::configure (QString const& id, QString const& mode, quint32 frequency_tolerance + , QString const& submode, bool fast_mode, quint32 tr_period, quint32 rx_df + , QString const& dx_call, QString const& dx_grid, bool generate_messages) +{ + auto iter = m_->clients_.find (id); + if (iter != std::end (m_->clients_)) + { + QByteArray message; + NetworkMessage::Builder out {&message, NetworkMessage::Configure, id, (*iter).negotiated_schema_number_}; + out << mode.toUtf8 () << frequency_tolerance << submode.toUtf8 () << fast_mode << tr_period << rx_df + << dx_call.toUtf8 () << dx_grid.toUtf8 () << generate_messages; + m_->send_message (out, message, iter.value ().sender_address_, (*iter).sender_port_); + } +} diff --git a/MessageServer.hpp b/MessageServer.hpp index 2764889cf..f59c21fe0 100644 --- a/MessageServer.hpp +++ b/MessageServer.hpp @@ -52,6 +52,9 @@ public: Q_SLOT void reply (QString const& id, QTime time, qint32 snr, float delta_time, quint32 delta_frequency , QString const& mode, QString const& message, bool low_confidence, quint8 modifiers); + // ask the client with identification 'id' to close down gracefully + Q_SLOT void close (QString const& id); + // ask the client with identification 'id' to replay all decodes Q_SLOT void replay (QString const& id); @@ -72,18 +75,25 @@ public: , QColor const& bg = QColor {}, QColor const& fg = QColor {} , bool last_only = false); - // ask the client with identification 'id' to switch configuration + // ask the client with identification 'id' to switch to + // configuration 'configuration_name' Q_SLOT void switch_configuration (QString const& id, QString const& configuration_name); + // ask the client with identification 'id' to change configuration + Q_SLOT void configure (QString const& id, QString const& mode, quint32 frequency_tolerance + , QString const& submode, bool fast_mode, quint32 tr_period, quint32 rx_df + , QString const& dx_call, QString const& dx_grid, bool generate_messages); + // the following signals are emitted when a client broadcasts the // matching message Q_SIGNAL void client_opened (QString const& id, QString const& version, QString const& revision); Q_SIGNAL void status_update (QString const& id, Frequency, QString const& mode, QString const& dx_call , QString const& report, QString const& tx_mode, bool tx_enabled - , bool transmitting, bool decoding, qint32 rx_df, qint32 tx_df + , bool transmitting, bool decoding, quint32 rx_df, quint32 tx_df , QString const& de_call, QString const& de_grid, QString const& dx_grid , bool watchdog_timeout, QString const& sub_mode, bool fast_mode - , quint8 special_op_mode, QString const& configuration_name); + , quint8 special_op_mode, quint32 frequency_tolerance, quint32 tr_period + , QString const& configuration_name); Q_SIGNAL void client_closed (QString const& id); Q_SIGNAL void decode (bool is_new, QString const& id, QTime time, qint32 snr, float delta_time , quint32 delta_frequency, QString const& mode, QString const& message diff --git a/NetworkMessage.hpp b/NetworkMessage.hpp index be85d63ee..4628c29b8 100644 --- a/NetworkMessage.hpp +++ b/NetworkMessage.hpp @@ -116,8 +116,8 @@ * Tx Enabled bool * Transmitting bool * Decoding bool - * Rx DF qint32 - * Tx DF qint32 + * Rx DF quint32 + * Tx DF quint32 * DE call utf8 * DE grid utf8 * DX grid utf8 @@ -125,6 +125,8 @@ * Sub-mode utf8 * Fast mode bool * Special Operation Mode quint8 + * Frequency Tolerance quint32 + * T/R Period quint32 * Configuration Name utf8 * * WSJT-X sends this status message when various internal state @@ -134,20 +136,22 @@ * * Application start up, * "Enable Tx" button status changes, - * Dial frequency changes, - * Changes to the "DX Call" field, - * Operating mode, sub-mode or fast mode changes, - * Transmit mode changed (in dual JT9+JT65 mode), - * Changes to the "Rpt" spinner, - * After an old decodes replay sequence (see Replay below), - * When switching between Tx and Rx mode, - * At the start and end of decoding, - * When the Rx DF changes, - * When the Tx DF changes, - * When settings are exited, - * When the DX call or grid changes, - * When the Tx watchdog is set or reset, - * When the configuration name changes. + * dial frequency changes, + * changes to the "DX Call" field, + * operating mode, sub-mode or fast mode changes, + * transmit mode changed (in dual JT9+JT65 mode), + * changes to the "Rpt" spinner, + * after an old decodes replay sequence (see Replay below), + * when switching between Tx and Rx mode, + * at the start and end of decoding, + * when the Rx DF changes, + * when the Tx DF changes, + * when settings are exited, + * when the DX call or grid changes, + * when the Tx watchdog is set or reset, + * when the frequency tolerance is changed, + * when the T/R period is changed, + * when the configuration name changes. * * The Special operation mode is an enumeration that indicates the * setting selected in the WSJT-X "Settings->Advanced->Special @@ -161,6 +165,10 @@ * 5 -> FOX * 6 -> HOUND * + * The Frequency Tolerance and T/R period fields may have a value + * of the maximum quint32 value which implies the field is not + * applicable. + * * * Decode Out 2 quint32 * Id (unique key) utf8 @@ -273,11 +281,12 @@ * button. * * - * Close Out 6 quint32 + * Close Out/In 6 quint32 * Id (unique key) utf8 * - * Close is sent by a client immediately prior to it shutting - * down gracefully. + * Close is sent by a client immediately prior to it shutting + * down gracefully. When sent by a server it requests the target + * client to close down gracefully. * * * Replay In 7 quint32 @@ -418,13 +427,33 @@ * cleared. * * - * Switch Configuration In 14 quint32 + * SwitchConfiguration In 14 quint32 * Id (unique key) utf8 * Configuration Name utf8 * * The server may send this message at any time. The message * specifies the name of the configuration to switch to. The new * configuration must exist. + * + * + * Configure In 15 quint32 + * Id (unique key) utf8 + * Mode utf8 + * Frequency Tolerance quint32 + * Submode utf8 + * Fast Mode bool + * T/R Period quint32 + * Rx DF quint32 + * DX Call utf8 + * DX Grid utf8 + * Generate Messages bool + * + * The server may send this message at any time. The message + * specifies various configuration options. For utf8 string + * fields an empty value implies no change, for the quint32 Rx DF + * and Frequency Tolerance fields the maximum quint32 value + * implies no change. Invalid or unrecognized values will be + * silently ignored. */ #include @@ -455,6 +484,7 @@ namespace NetworkMessage LoggedADIF, HighlightCallsign, SwitchConfiguration, + Configure, maximum_message_type_ // ONLY add new message types // immediately before here }; diff --git a/UDPExamples/ClientWidget.cpp b/UDPExamples/ClientWidget.cpp index 7d1601938..ecf0b54fe 100644 --- a/UDPExamples/ClientWidget.cpp +++ b/UDPExamples/ClientWidget.cpp @@ -1,8 +1,11 @@ #include "ClientWidget.hpp" +#include #include #include +#include #include +#include #include "validators/MaidenheadLocatorValidator.hpp" @@ -11,6 +14,9 @@ namespace //QRegExp message_alphabet {"[- A-Za-z0-9+./?]*"}; QRegExp message_alphabet {"[- @A-Za-z0-9+./?#<>]*"}; QRegularExpression cq_re {"(CQ|CQDX|QRZ)[^A-Z0-9/]+"}; + QRegExpValidator message_validator {message_alphabet}; + MaidenheadLocatorValidator locator_validator; + quint32 quint32_max {std::numeric_limits::max ()}; void update_dynamic_property (QWidget * widget, char const * property, QVariant const& value) { @@ -21,9 +27,10 @@ namespace } } -ClientWidget::IdFilterModel::IdFilterModel (QString const& client_id) - : client_id_ {client_id} - , rx_df_ (-1) +ClientWidget::IdFilterModel::IdFilterModel (QString const& client_id, QObject * parent) + : QSortFilterProxyModel {parent} + , client_id_ {client_id} + , rx_df_ (quint32_max) { } @@ -49,7 +56,7 @@ QVariant ClientWidget::IdFilterModel::data (QModelIndex const& proxy_index, int break; case 4: // DF - if (qAbs (QSortFilterProxyModel::data (proxy_index).toInt () - rx_df_) <= 10) + if (qAbs (QSortFilterProxyModel::data (proxy_index).toUInt () - rx_df_) <= 10) { return QColor {255, 200, 200}; } @@ -87,7 +94,7 @@ void ClientWidget::IdFilterModel::de_call (QString const& call) } } -void ClientWidget::IdFilterModel::rx_df (int df) +void ClientWidget::IdFilterModel::rx_df (quint32 df) { if (df != rx_df_) { @@ -119,27 +126,48 @@ ClientWidget::ClientWidget (QAbstractItemModel * decodes_model, QAbstractItemMod , QListWidget const * calls_of_interest, QWidget * parent) : QDockWidget {make_title (id, version, revision), parent} , id_ {id} + , done_ {false} , calls_of_interest_ {calls_of_interest} - , decodes_proxy_model_ {id_} + , decodes_proxy_model_ {id} + , beacons_proxy_model_ {id} , erase_action_ {new QAction {tr ("&Erase Band Activity"), this}} , erase_rx_frequency_action_ {new QAction {tr ("Erase &Rx Frequency"), this}} , erase_both_action_ {new QAction {tr ("Erase &Both"), this}} - , decodes_table_view_ {new QTableView} - , beacons_table_view_ {new QTableView} - , message_line_edit_ {new QLineEdit} - , grid_line_edit_ {new QLineEdit} + , decodes_table_view_ {new QTableView {this}} + , beacons_table_view_ {new QTableView {this}} + , message_line_edit_ {new QLineEdit {this}} + , grid_line_edit_ {new QLineEdit {this}} + , generate_messages_push_button_ {new QPushButton {tr ("&Gen Msgs"), this}} + , auto_off_button_ {nullptr} + , halt_tx_button_ {nullptr} + , de_label_ {new QLabel {this}} + , frequency_label_ {new QLabel {this}} + , tx_df_label_ {new QLabel {this}} + , report_label_ {new QLabel {this}} + , configuration_line_edit_ {new QLineEdit {this}} + , mode_line_edit_ {new QLineEdit {this}} + , frequency_tolerance_spin_box_ {new QSpinBox {this}} + , tx_mode_label_ {new QLabel {this}} + , submode_line_edit_ {new QLineEdit {this}} + , fast_mode_check_box_ {new QCheckBox {this}} + , tr_period_spin_box_ {new QSpinBox {this}} + , rx_df_spin_box_ {new QSpinBox {this}} + , dx_call_line_edit_ {new QLineEdit {this}} + , dx_grid_line_edit_ {new QLineEdit {this}} + , decodes_page_ {new QWidget {this}} + , beacons_page_ {new QWidget {this}} + , content_widget_ {new QFrame {this}} + , status_bar_ {new QStatusBar {this}} + , control_button_box_ {new QDialogButtonBox {this}} + , form_layout_ {new QFormLayout} + , horizontal_layout_ {new QHBoxLayout} + , subform1_layout_ {new QFormLayout} + , subform2_layout_ {new QFormLayout} + , subform3_layout_ {new QFormLayout} + , decodes_layout_ {new QVBoxLayout {decodes_page_}} + , beacons_layout_ {new QVBoxLayout {beacons_page_}} + , content_layout_ {new QVBoxLayout {content_widget_}} , decodes_stack_ {new QStackedLayout} - , auto_off_button_ {new QPushButton {tr ("&Auto Off")}} - , halt_tx_button_ {new QPushButton {tr ("&Halt Tx")}} - , de_label_ {new QLabel} - , mode_label_ {new QLabel} - , fast_mode_ {false} - , frequency_label_ {new QLabel} - , dx_label_ {new QLabel} - , rx_df_label_ {new QLabel} - , tx_df_label_ {new QLabel} - , report_label_ {new QLabel} - , configuration_line_edit_ {new QLineEdit} , columns_resized_ {false} { // set up widgets @@ -153,12 +181,33 @@ ClientWidget::ClientWidget (QAbstractItemModel * decodes_model, QAbstractItemMod decodes_table_view_->insertAction (nullptr, erase_rx_frequency_action_); decodes_table_view_->insertAction (nullptr, erase_both_action_); - auto form_layout = new QFormLayout; - form_layout->addRow (tr ("Free text:"), message_line_edit_); - form_layout->addRow (tr ("Temporary grid:"), grid_line_edit_); - form_layout->addRow (tr ("Configuration name:"), configuration_line_edit_); - message_line_edit_->setValidator (new QRegExpValidator {message_alphabet, this}); - grid_line_edit_->setValidator (new MaidenheadLocatorValidator {this}); + message_line_edit_->setValidator (&message_validator); + grid_line_edit_->setValidator (&locator_validator); + dx_grid_line_edit_->setValidator (&locator_validator); + tr_period_spin_box_->setRange (5, 30); + tr_period_spin_box_->setSuffix (" s"); + rx_df_spin_box_->setRange (200, 5000); + frequency_tolerance_spin_box_->setRange (10, 1000); + frequency_tolerance_spin_box_->setPrefix ("\u00b1"); + frequency_tolerance_spin_box_->setSuffix (" Hz"); + + form_layout_->addRow (tr ("Free text:"), message_line_edit_); + form_layout_->addRow (tr ("Temporary grid:"), grid_line_edit_); + form_layout_->addRow (tr ("Configuration name:"), configuration_line_edit_); + form_layout_->addRow (horizontal_layout_); + subform1_layout_->addRow (tr ("Mode:"), mode_line_edit_); + subform2_layout_->addRow (tr ("Submode:"), submode_line_edit_); + subform3_layout_->addRow (tr ("Fast mode:"), fast_mode_check_box_); + subform1_layout_->addRow (tr ("T/R period:"), tr_period_spin_box_); + subform2_layout_->addRow (tr ("Rx DF:"), rx_df_spin_box_); + subform3_layout_->addRow (tr ("Freq. Tol:"), frequency_tolerance_spin_box_); + subform1_layout_->addRow (tr ("DX call:"), dx_call_line_edit_); + subform2_layout_->addRow (tr ("DX grid:"), dx_grid_line_edit_); + subform3_layout_->addRow (generate_messages_push_button_); + horizontal_layout_->addLayout (subform1_layout_); + horizontal_layout_->addLayout (subform2_layout_); + horizontal_layout_->addLayout (subform3_layout_); + connect (message_line_edit_, &QLineEdit::textEdited, [this] (QString const& text) { Q_EMIT do_free_text (id_, text, false); }); @@ -171,66 +220,99 @@ ClientWidget::ClientWidget (QAbstractItemModel * decodes_model, QAbstractItemMod connect (configuration_line_edit_, &QLineEdit::editingFinished, [this] () { Q_EMIT switch_configuration (id_, configuration_line_edit_->text ()); }); + connect (mode_line_edit_, &QLineEdit::editingFinished, [this] () { + QString empty; + Q_EMIT configure (id_, mode_line_edit_->text (), quint32_max, empty, fast_mode () + , quint32_max, quint32_max, empty, empty, false); + }); + connect (frequency_tolerance_spin_box_, static_cast (&QSpinBox::valueChanged), [this] (int i) { + QString empty; + auto f = frequency_tolerance_spin_box_->specialValueText ().size () ? quint32_max : i; + Q_EMIT configure (id_, empty, f, empty, fast_mode () + , quint32_max, quint32_max, empty, empty, false); + }); + connect (submode_line_edit_, &QLineEdit::editingFinished, [this] () { + QString empty; + Q_EMIT configure (id_, empty, quint32_max, submode_line_edit_->text (), fast_mode () + , quint32_max, quint32_max, empty, empty, false); + }); + connect (fast_mode_check_box_, &QCheckBox::stateChanged, [this] (int state) { + QString empty; + Q_EMIT configure (id_, empty, quint32_max, empty, Qt::Checked == state + , quint32_max, quint32_max, empty, empty, false); + }); + connect (tr_period_spin_box_, static_cast (&QSpinBox::valueChanged), [this] (int i) { + QString empty; + Q_EMIT configure (id_, empty, quint32_max, empty, fast_mode () + , i, quint32_max, empty, empty, false); + }); + connect (rx_df_spin_box_, static_cast (&QSpinBox::valueChanged), [this] (int i) { + QString empty; + Q_EMIT configure (id_, empty, quint32_max, empty, fast_mode () + , quint32_max, i, empty, empty, false); + }); + connect (dx_call_line_edit_, &QLineEdit::editingFinished, [this] () { + QString empty; + Q_EMIT configure (id_, empty, quint32_max, empty, fast_mode () + , quint32_max, quint32_max, dx_call_line_edit_->text (), empty, false); + }); + connect (dx_grid_line_edit_, &QLineEdit::editingFinished, [this] () { + QString empty; + Q_EMIT configure (id_, empty, quint32_max, empty, fast_mode () + , quint32_max, quint32_max, empty, dx_grid_line_edit_->text (), false); + }); - auto decodes_page = new QWidget; - auto decodes_layout = new QVBoxLayout {decodes_page}; - decodes_layout->setContentsMargins (QMargins {2, 2, 2, 2}); - decodes_layout->addWidget (decodes_table_view_); - decodes_layout->addLayout (form_layout); + decodes_layout_->setContentsMargins (QMargins {2, 2, 2, 2}); + decodes_layout_->addWidget (decodes_table_view_); + decodes_layout_->addLayout (form_layout_); - auto beacons_proxy_model = new IdFilterModel {id_}; - beacons_proxy_model->setSourceModel (beacons_model); - beacons_table_view_->setModel (beacons_proxy_model); + beacons_proxy_model_.setSourceModel (beacons_model); + beacons_table_view_->setModel (&beacons_proxy_model_); beacons_table_view_->verticalHeader ()->hide (); beacons_table_view_->hideColumn (0); beacons_table_view_->horizontalHeader ()->setStretchLastSection (true); beacons_table_view_->setContextMenuPolicy (Qt::ActionsContextMenu); beacons_table_view_->insertAction (nullptr, erase_action_); - auto beacons_page = new QWidget; - auto beacons_layout = new QVBoxLayout {beacons_page}; - beacons_layout->setContentsMargins (QMargins {2, 2, 2, 2}); - beacons_layout->addWidget (beacons_table_view_); + beacons_layout_->setContentsMargins (QMargins {2, 2, 2, 2}); + beacons_layout_->addWidget (beacons_table_view_); - decodes_stack_->addWidget (decodes_page); - decodes_stack_->addWidget (beacons_page); + decodes_stack_->addWidget (decodes_page_); + decodes_stack_->addWidget (beacons_page_); // stack alternative views - auto content_layout = new QVBoxLayout; - content_layout->setContentsMargins (QMargins {2, 2, 2, 2}); - content_layout->addLayout (decodes_stack_); + content_layout_->setContentsMargins (QMargins {2, 2, 2, 2}); + content_layout_->addLayout (decodes_stack_); // set up controls - auto control_button_box = new QDialogButtonBox; - control_button_box->addButton (auto_off_button_, QDialogButtonBox::ActionRole); - control_button_box->addButton (halt_tx_button_, QDialogButtonBox::ActionRole); + auto_off_button_ = control_button_box_->addButton (tr ("&Auto Off"), QDialogButtonBox::ActionRole); + halt_tx_button_ = control_button_box_->addButton (tr ("&Halt Tx"), QDialogButtonBox::ActionRole); + connect (generate_messages_push_button_, &QAbstractButton::clicked, [this] (bool /*checked*/) { + QString empty; + Q_EMIT configure (id_, empty, quint32_max, empty, fast_mode () + , quint32_max, quint32_max, empty, empty, true); + }); connect (auto_off_button_, &QAbstractButton::clicked, [this] (bool /* checked */) { Q_EMIT do_halt_tx (id_, true); }); connect (halt_tx_button_, &QAbstractButton::clicked, [this] (bool /* checked */) { Q_EMIT do_halt_tx (id_, false); }); - content_layout->addWidget (control_button_box); + content_layout_->addWidget (control_button_box_); // set up status area - auto status_bar = new QStatusBar; - status_bar->addPermanentWidget (de_label_); - status_bar->addPermanentWidget (mode_label_); - status_bar->addPermanentWidget (frequency_label_); - status_bar->addPermanentWidget (dx_label_); - status_bar->addPermanentWidget (rx_df_label_); - status_bar->addPermanentWidget (tx_df_label_); - status_bar->addPermanentWidget (report_label_); - content_layout->addWidget (status_bar); - connect (this, &ClientWidget::topLevelChanged, status_bar, &QStatusBar::setSizeGripEnabled); + status_bar_->addPermanentWidget (de_label_); + status_bar_->addPermanentWidget (tx_mode_label_); + status_bar_->addPermanentWidget (frequency_label_); + status_bar_->addPermanentWidget (tx_df_label_); + status_bar_->addPermanentWidget (report_label_); + content_layout_->addWidget (status_bar_); + connect (this, &ClientWidget::topLevelChanged, status_bar_, &QStatusBar::setSizeGripEnabled); // set up central widget - auto content_widget = new QFrame; - content_widget->setFrameStyle (QFrame::StyledPanel | QFrame::Sunken); - content_widget->setLayout (content_layout); - setWidget (content_widget); + content_widget_->setFrameStyle (QFrame::StyledPanel | QFrame::Sunken); + setWidget (content_widget_); // setMinimumSize (QSize {550, 0}); - setFeatures (DockWidgetMovable | DockWidgetFloatable); setAllowedAreas (Qt::BottomDockWidgetArea); setFloating (true); @@ -257,6 +339,25 @@ ClientWidget::ClientWidget (QAbstractItemModel * decodes_model, QAbstractItemMod } } +void ClientWidget::dispose () +{ + done_ = true; + close (); +} + +void ClientWidget::closeEvent (QCloseEvent *e) +{ + if (!done_) + { + Q_EMIT do_close (id_); + e->ignore (); // defer closure until client actually closes + } + else + { + QDockWidget::closeEvent (e); + } +} + ClientWidget::~ClientWidget () { for (int row = 0; row < calls_of_interest_->count (); ++row) @@ -266,16 +367,45 @@ ClientWidget::~ClientWidget () } } +bool ClientWidget::fast_mode () const +{ + return fast_mode_check_box_->isChecked (); +} + +namespace +{ + void update_line_edit (QLineEdit * le, QString const& value, bool allow_empty = true) + { + le->setEnabled (value.size () || allow_empty); + if (!(le->hasFocus () && le->isModified ())) + { + le->setText (value); + } + } + + void update_spin_box (QSpinBox * sb, int value, QString const& special_value = QString {}) + { + sb->setSpecialValueText (special_value); + bool enable {0 == special_value.size ()}; + sb->setEnabled (enable); + if (!sb->hasFocus () && enable) + { + sb->setValue (value); + } + } +} + void ClientWidget::update_status (QString const& id, Frequency f, QString const& mode, QString const& dx_call , QString const& report, QString const& tx_mode, bool tx_enabled - , bool transmitting, bool decoding, qint32 rx_df, qint32 tx_df + , bool transmitting, bool decoding, quint32 rx_df, quint32 tx_df , QString const& de_call, QString const& de_grid, QString const& dx_grid - , bool watchdog_timeout, QString const& sub_mode, bool fast_mode - , quint8 special_op_mode, QString const& configuration_name) + , bool watchdog_timeout, QString const& submode, bool fast_mode + , quint8 special_op_mode, quint32 frequency_tolerance, quint32 tr_period + , QString const& configuration_name) { - if (id == id_) + if (id == id_) { - fast_mode_ = fast_mode; + fast_mode_check_box_->setChecked (fast_mode); decodes_proxy_model_.de_call (de_call); decodes_proxy_model_.rx_df (rx_df); QString special; @@ -293,26 +423,26 @@ void ClientWidget::update_status (QString const& id, Frequency f, QString const& .arg (de_grid.size () ? '(' + de_grid + ')' : QString {}) .arg (special) : QString {}); - mode_label_->setText (QString {"Mode: %1%2%3%4"} - .arg (mode) - .arg (sub_mode) - .arg (fast_mode && !mode.contains (QRegularExpression {R"(ISCAT|MSK144)"}) ? "fast" : "") + update_line_edit (mode_line_edit_, mode); + update_spin_box (frequency_tolerance_spin_box_, frequency_tolerance + , quint32_max == frequency_tolerance ? QString {"n/a"} : QString {}); + update_line_edit (submode_line_edit_, submode, false); + tx_mode_label_->setText (QString {"Tx Mode: %1"} .arg (tx_mode.isEmpty () || tx_mode == mode ? "" : '(' + tx_mode + ')')); frequency_label_->setText ("QRG: " + Radio::pretty_frequency_MHz_string (f)); - dx_label_->setText (dx_call.size () >= 0 ? QString {"DX: %1%2"}.arg (dx_call) - .arg (dx_grid.size () ? '(' + dx_grid + ')' : QString {}) : QString {}); - rx_df_label_->setText (rx_df >= 0 ? QString {"Rx: %1"}.arg (rx_df) : ""); - tx_df_label_->setText (tx_df >= 0 ? QString {"Tx: %1"}.arg (tx_df) : ""); + update_line_edit (dx_call_line_edit_, dx_call); + update_line_edit (dx_grid_line_edit_, dx_grid); + if (rx_df != quint32_max) update_spin_box (rx_df_spin_box_, rx_df); + update_spin_box (tr_period_spin_box_, tr_period + , quint32_max == tr_period ? QString {"n/a"} : QString {}); + tx_df_label_->setText (QString {"Tx: %1"}.arg (tx_df)); report_label_->setText ("SNR: " + report); update_dynamic_property (frequency_label_, "transmitting", transmitting); auto_off_button_->setEnabled (tx_enabled); halt_tx_button_->setEnabled (transmitting); - update_dynamic_property (mode_label_, "decoding", decoding); + update_line_edit (configuration_line_edit_, configuration_name); + update_dynamic_property (mode_line_edit_, "decoding", decoding); update_dynamic_property (tx_df_label_, "watchdog_timeout", watchdog_timeout); - if (!configuration_line_edit_->hasFocus ()) - { - configuration_line_edit_->setText (configuration_name); - } } } diff --git a/UDPExamples/ClientWidget.hpp b/UDPExamples/ClientWidget.hpp index 9aa8d35a0..983ddd874 100644 --- a/UDPExamples/ClientWidget.hpp +++ b/UDPExamples/ClientWidget.hpp @@ -1,11 +1,11 @@ #ifndef WSJTX_UDP_CLIENT_WIDGET_MODEL_HPP__ #define WSJTX_UDP_CLIENT_WIDGET_MODEL_HPP__ +#include #include #include #include #include -#include #include "MessageServer.hpp" @@ -13,6 +13,20 @@ class QAbstractItemModel; class QModelIndex; class QColor; class QAction; +class QListWidget; +class QFormLayout; +class QVBoxLayout; +class QHBoxLayout; +class QStackedLayout; +class QTableView; +class QLineEdit; +class QAbstractButton; +class QLabel; +class QCheckBox; +class QSpinBox; +class QFrame; +class QStatusBar; +class QDialogButtonBox; using Frequency = MessageServer::Frequency; @@ -25,16 +39,18 @@ public: explicit ClientWidget (QAbstractItemModel * decodes_model, QAbstractItemModel * beacons_model , QString const& id, QString const& version, QString const& revision , QListWidget const * calls_of_interest, QWidget * parent = nullptr); + void dispose (); ~ClientWidget (); - bool fast_mode () const {return fast_mode_;} + bool fast_mode () const; Q_SLOT void update_status (QString const& id, Frequency f, QString const& mode, QString const& dx_call , QString const& report, QString const& tx_mode, bool tx_enabled - , bool transmitting, bool decoding, qint32 rx_df, qint32 tx_df + , bool transmitting, bool decoding, quint32 rx_df, quint32 tx_df , QString const& de_call, QString const& de_grid, QString const& dx_grid , bool watchdog_timeout, QString const& sub_mode, bool fast_mode - , quint8 special_op_mode, QString const& configuration_name); + , quint8 special_op_mode, quint32 frequency_tolerance, quint32 tr_period + , QString const& configuration_name); Q_SLOT void decode_added (bool is_new, QString const& client_id, QTime, qint32 snr , float delta_time, quint32 delta_frequency, QString const& mode , QString const& message, bool low_confidence, bool off_air); @@ -45,6 +61,7 @@ public: Q_SLOT void decodes_cleared (QString const& client_id); Q_SIGNAL void do_clear_decodes (QString const& id, quint8 window = 0); + Q_SIGNAL void do_close (QString const& id); Q_SIGNAL void do_reply (QModelIndex const&, quint8 modifier); Q_SIGNAL void do_halt_tx (QString const& id, bool auto_only); Q_SIGNAL void do_free_text (QString const& id, QString const& text, bool); @@ -53,31 +70,38 @@ public: , QColor const& bg = QColor {}, QColor const& fg = QColor {} , bool last_only = false); Q_SIGNAL void switch_configuration (QString const& id, QString const& configuration_name); + Q_SIGNAL void configure (QString const& id, QString const& mode, quint32 frequency_tolerance + , QString const& submode, bool fast_mode, quint32 tr_period, quint32 rx_df + , QString const& dx_call, QString const& dx_grid, bool generate_messages); private: - - QString id_; - QListWidget const * calls_of_interest_; class IdFilterModel final : public QSortFilterProxyModel { public: - IdFilterModel (QString const& client_id); + IdFilterModel (QString const& client_id, QObject * = nullptr); void de_call (QString const&); - void rx_df (int); + void rx_df (quint32); QVariant data (QModelIndex const& proxy_index, int role = Qt::DisplayRole) const override; - - protected: + private: bool filterAcceptsRow (int source_row, QModelIndex const& source_parent) const override; - private: QString client_id_; QString call_; QRegularExpression base_call_re_; - int rx_df_; - } decodes_proxy_model_; + quint32 rx_df_; + }; + + void closeEvent (QCloseEvent *) override; + + QString id_; + bool done_; + QListWidget const * calls_of_interest_; + IdFilterModel decodes_proxy_model_; + IdFilterModel beacons_proxy_model_; + QAction * erase_action_; QAction * erase_rx_frequency_action_; QAction * erase_both_action_; @@ -85,18 +109,39 @@ private: QTableView * beacons_table_view_; QLineEdit * message_line_edit_; QLineEdit * grid_line_edit_; - QStackedLayout * decodes_stack_; + QAbstractButton * generate_messages_push_button_; QAbstractButton * auto_off_button_; QAbstractButton * halt_tx_button_; QLabel * de_label_; - QLabel * mode_label_; - bool fast_mode_; QLabel * frequency_label_; - QLabel * dx_label_; - QLabel * rx_df_label_; QLabel * tx_df_label_; QLabel * report_label_; QLineEdit * configuration_line_edit_; + QLineEdit * mode_line_edit_; + QSpinBox * frequency_tolerance_spin_box_; + QLabel * tx_mode_label_; + QLineEdit * submode_line_edit_; + QCheckBox * fast_mode_check_box_; + QSpinBox * tr_period_spin_box_; + QSpinBox * rx_df_spin_box_; + QLineEdit * dx_call_line_edit_; + QLineEdit * dx_grid_line_edit_; + QWidget * decodes_page_; + QWidget * beacons_page_; + QFrame * content_widget_; + QStatusBar * status_bar_; + QDialogButtonBox * control_button_box_; + + QFormLayout * form_layout_; + QHBoxLayout * horizontal_layout_; + QFormLayout * subform1_layout_; + QFormLayout * subform2_layout_; + QFormLayout * subform3_layout_; + QVBoxLayout * decodes_layout_; + QVBoxLayout * beacons_layout_; + QVBoxLayout * content_layout_; + QStackedLayout * decodes_stack_; + bool columns_resized_; }; diff --git a/UDPExamples/MessageAggregatorMainWindow.cpp b/UDPExamples/MessageAggregatorMainWindow.cpp index 34c674f2c..6245918a9 100644 --- a/UDPExamples/MessageAggregatorMainWindow.cpp +++ b/UDPExamples/MessageAggregatorMainWindow.cpp @@ -250,6 +250,7 @@ void MessageAggregatorMainWindow::add_client (QString const& id, QString const& connect (server_, &MessageServer::WSPR_decode, dock, &ClientWidget::beacon_spot_added); connect (server_, &MessageServer::decodes_cleared, dock, &ClientWidget::decodes_cleared); connect (dock, &ClientWidget::do_clear_decodes, server_, &MessageServer::clear_decodes); + connect (dock, &ClientWidget::do_close, server_, &MessageServer::close); connect (dock, &ClientWidget::do_reply, decodes_model_, &DecodesModel::do_reply); connect (dock, &ClientWidget::do_halt_tx, server_, &MessageServer::halt_tx); connect (dock, &ClientWidget::do_free_text, server_, &MessageServer::free_text); @@ -257,6 +258,7 @@ void MessageAggregatorMainWindow::add_client (QString const& id, QString const& connect (view_action, &QAction::toggled, dock, &ClientWidget::setVisible); connect (dock, &ClientWidget::highlight_callsign, server_, &MessageServer::highlight_callsign); connect (dock, &ClientWidget::switch_configuration, server_, &MessageServer::switch_configuration); + connect (dock, &ClientWidget::configure, server_, &MessageServer::configure); dock_widgets_[id] = dock; server_->replay (id); // request decodes and status } @@ -266,7 +268,7 @@ void MessageAggregatorMainWindow::remove_client (QString const& id) auto iter = dock_widgets_.find (id); if (iter != std::end (dock_widgets_)) { - (*iter)->close (); + (*iter)->dispose (); dock_widgets_.erase (iter); } } diff --git a/UDPExamples/UDPDaemon.cpp b/UDPExamples/UDPDaemon.cpp index 98ff49e6e..7caeb3038 100644 --- a/UDPExamples/UDPDaemon.cpp +++ b/UDPExamples/UDPDaemon.cpp @@ -51,7 +51,8 @@ public: , bool /*transmitting*/, bool /*decoding*/, qint32 /*rx_df*/, qint32 /*tx_df*/ , QString const& /*de_call*/, QString const& /*de_grid*/, QString const& /*dx_grid*/ , bool /* watchdog_timeout */, QString const& sub_mode, bool /*fast_mode*/ - , quint8 /*special_op_mode*/, QString const& /*configuration_name*/) + , quint8 /*special_op_mode*/, quint32 /*frequency_tolerance*/, quint32 /*tr_period*/ + , QString const& /*configuration_name*/) { if (id == id_) { diff --git a/widgets/RestrictedSpinBox.cpp b/widgets/RestrictedSpinBox.cpp index d3201b331..3d18ce488 100644 --- a/widgets/RestrictedSpinBox.cpp +++ b/widgets/RestrictedSpinBox.cpp @@ -17,3 +17,17 @@ QValidator::State RestrictedSpinBox::validate (QString& input, int& pos) const } return valid; } + +void RestrictedSpinBox::fixup (QString& input) const +{ + auto iter = std::lower_bound (values ().begin (), values ().end (), valueFromText (input)); + HintedSpinBox::fixup (input); + if (iter != values ().end ()) + { + input = textFromValue (*iter); + } + else + { + input = textFromValue (values ().back ()); + } +} diff --git a/widgets/RestrictedSpinBox.hpp b/widgets/RestrictedSpinBox.hpp index f856e90ce..e984c3770 100644 --- a/widgets/RestrictedSpinBox.hpp +++ b/widgets/RestrictedSpinBox.hpp @@ -20,6 +20,7 @@ public: protected: // override the base class validation QValidator::State validate (QString& input, int& pos) const override; + void fixup (QString& input) const override; }; #endif diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 529dab19d..b11e7f9bb 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include @@ -201,6 +202,7 @@ namespace QRegExp message_alphabet {"[- @A-Za-z0-9+./?#<>;]*"}; // grid exact match excluding RR73 QRegularExpression grid_regexp {"\\A(?![Rr]{2}73)[A-Ra-r]{2}[0-9]{2}([A-Xa-x]{2}){0,1}\\z"}; + auto quint32_max = std::numeric_limits::max (); bool message_is_73 (int type, QStringList const& msg_parts) { @@ -410,7 +412,8 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple, m_config.udp_server_name (), m_config.udp_server_port (), this}}, psk_Reporter {new PSK_Reporter {m_messageClient, this}}, - m_manual {&m_network_manager} + m_manual {&m_network_manager}, + m_block_udp_status_updates {false} { ui->setupUi(this); setUnifiedTitleAndToolBarOnMac (true); @@ -501,6 +504,7 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple, }); // Network message handlers + m_messageClient->enable (m_config.accept_udp_requests ()); connect (m_messageClient, &MessageClient::clear_decodes, [this] (quint8 window) { ++window; if (window & 1) @@ -513,54 +517,51 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple, } }); connect (m_messageClient, &MessageClient::reply, this, &MainWindow::replyToCQ); + connect (m_messageClient, &MessageClient::close, this, &MainWindow::close); connect (m_messageClient, &MessageClient::replay, this, &MainWindow::replayDecodes); connect (m_messageClient, &MessageClient::location, this, &MainWindow::locationChange); connect (m_messageClient, &MessageClient::halt_tx, [this] (bool auto_only) { - if (m_config.accept_udp_requests ()) { - if (auto_only) { - if (ui->autoButton->isChecked ()) { - ui->autoButton->click(); - } - } else { - ui->stopTxButton->click(); + if (auto_only) { + if (ui->autoButton->isChecked ()) { + ui->autoButton->click(); } + } else { + ui->stopTxButton->click(); } }); connect (m_messageClient, &MessageClient::error, this, &MainWindow::networkError); connect (m_messageClient, &MessageClient::free_text, [this] (QString const& text, bool send) { - if (m_config.accept_udp_requests ()) { - tx_watchdog (false); - // send + non-empty text means set and send the free text - // message, !send + non-empty text means set the current free - // text message, send + empty text means send the current free - // text message without change, !send + empty text means clear - // the current free text message - if (0 == ui->tabWidget->currentIndex ()) { - if (!text.isEmpty ()) { - ui->tx5->setCurrentText (text); - } - if (send) { - ui->txb5->click (); - } else if (text.isEmpty ()) { - ui->tx5->setCurrentText (text); - } - } else if (1 == ui->tabWidget->currentIndex ()) { - if (!text.isEmpty ()) { - ui->freeTextMsg->setCurrentText (text); - } - if (send) { - ui->rbFreeText->click (); - } else if (text.isEmpty ()) { - ui->freeTextMsg->setCurrentText (text); - } + tx_watchdog (false); + // send + non-empty text means set and send the free text + // message, !send + non-empty text means set the current free + // text message, send + empty text means send the current free + // text message without change, !send + empty text means clear + // the current free text message + if (0 == ui->tabWidget->currentIndex ()) { + if (!text.isEmpty ()) { + ui->tx5->setCurrentText (text); + } + if (send) { + ui->txb5->click (); + } else if (text.isEmpty ()) { + ui->tx5->setCurrentText (text); + } + } else if (1 == ui->tabWidget->currentIndex ()) { + if (!text.isEmpty ()) { + ui->freeTextMsg->setCurrentText (text); + } + if (send) { + ui->rbFreeText->click (); + } else if (text.isEmpty ()) { + ui->freeTextMsg->setCurrentText (text); } - QApplication::alert (this); } + QApplication::alert (this); }); connect (m_messageClient, &MessageClient::highlight_callsign, ui->decodedTextBrowser, &DisplayText::highlight_callsign); - connect (m_messageClient, &MessageClient::switch_configuration, m_multi_settings, &MultiSettings::select_configuration); + connect (m_messageClient, &MessageClient::configure, this, &MainWindow::remote_configure); // Hook up WSPR band hopping connect (ui->band_hopping_schedule_push_button, &QPushButton::clicked @@ -711,6 +712,7 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple, connect (&m_config, &Configuration::transceiver_failure, this, &MainWindow::handle_transceiver_failure); connect (&m_config, &Configuration::udp_server_changed, m_messageClient, &MessageClient::set_server); connect (&m_config, &Configuration::udp_server_port_changed, m_messageClient, &MessageClient::set_server_port); + connect (&m_config, &Configuration::accept_udp_requests_changed, m_messageClient, &MessageClient::enable); // set up configurations menu connect (m_multi_settings, &MultiSettings::configurationNameChanged, [this] (QString const& name) { @@ -905,20 +907,8 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple, if(m_bFast9) m_bFastMode=true; ui->cbFast9->setChecked(m_bFast9 or m_bFastMode); - if(m_mode=="FT4") on_actionFT4_triggered(); - if(m_mode=="FT8") on_actionFT8_triggered(); - if(m_mode=="JT4") on_actionJT4_triggered(); - if(m_mode=="JT9") on_actionJT9_triggered(); - if(m_mode=="JT65") on_actionJT65_triggered(); - if(m_mode=="JT9+JT65") on_actionJT9_JT65_triggered(); - if(m_mode=="WSPR") on_actionWSPR_triggered(); - if(m_mode=="WSPR-LF") on_actionWSPR_LF_triggered(); - if(m_mode=="ISCAT") on_actionISCAT_triggered(); - if(m_mode=="MSK144") on_actionMSK144_triggered(); - if(m_mode=="QRA64") on_actionQRA64_triggered(); - if(m_mode=="Echo") on_actionEcho_triggered(); + set_mode (m_mode); if(m_mode=="Echo") monitor(false); //Don't auto-start Monitor in Echo mode. - if(m_mode=="FreqCal") on_actionFreqCal_triggered(); ui->sbSubmode->setValue (vhf ? m_nSubMode : 0); if(m_mode=="MSK144") { @@ -1762,19 +1752,7 @@ void MainWindow::on_actionSettings_triggered() //Setup Dialog bool b = vhf && (m_mode=="JT4" or m_mode=="JT65" or m_mode=="ISCAT" or m_mode=="JT9" or m_mode=="MSK144" or m_mode=="QRA64"); if(b) VHF_features_enabled(b); - if(m_mode=="FT4") on_actionFT4_triggered(); - if(m_mode=="FT8") on_actionFT8_triggered(); - if(m_mode=="JT4") on_actionJT4_triggered(); - if(m_mode=="JT9") on_actionJT9_triggered(); - if(m_mode=="JT9+JT65") on_actionJT9_JT65_triggered(); - if(m_mode=="JT65") on_actionJT65_triggered(); - if(m_mode=="QRA64") on_actionQRA64_triggered(); - if(m_mode=="FreqCal") on_actionFreqCal_triggered(); - if(m_mode=="ISCAT") on_actionISCAT_triggered(); - if(m_mode=="MSK144") on_actionMSK144_triggered(); - if(m_mode=="WSPR") on_actionWSPR_triggered(); - if(m_mode=="WSPR-LF") on_actionWSPR_LF_triggered(); - if(m_mode=="Echo") on_actionEcho_triggered(); + set_mode (m_mode); if(b) VHF_features_enabled(b); m_config.transceiver_online (); @@ -7190,6 +7168,7 @@ void MainWindow::transmitDisplay (bool transmitting) void MainWindow::on_sbFtol_valueChanged(int value) { m_wideGraph->setTol (value); + statusUpdate (); } void::MainWindow::VHF_features_enabled(bool b) @@ -7227,6 +7206,7 @@ void MainWindow::on_sbTR_valueChanged(int value) if(m_transmitting) { on_stopTxButton_clicked(); } + statusUpdate (); } QChar MainWindow::current_submode () const @@ -7328,11 +7308,6 @@ void MainWindow::replyToCQ (QTime time, qint32 snr, float delta_time, quint32 de , QString const& mode, QString const& message_text , bool /*low_confidence*/, quint8 modifiers) { - if (!m_config.accept_udp_requests ()) - { - return; - } - QString format_string {"%1 %2 %3 %4 %5 %6"}; auto const& time_string = time.toString ("~" == mode || "&" == mode || "+" == mode ? "hhmmss" : "hhmm"); @@ -7901,8 +7876,18 @@ void MainWindow::on_cbCQTx_toggled(bool b) void MainWindow::statusUpdate () const { - if (!ui) return; + if (!ui || m_block_udp_status_updates) return; auto submode = current_submode (); + auto ftol = ui->sbFtol->value (); + if (!(ui->sbFtol->isVisible () && ui->sbFtol->isEnabled ())) + { + ftol = quint32_max; + } + auto tr_period = ui->sbTR->value (); + if (!(ui->sbTR->isVisible () && ui->sbTR->isEnabled ())) + { + tr_period = quint32_max; + } m_messageClient->status_update (m_freqNominal, m_mode, m_hisCall, QString::number (ui->rptSpinBox->value ()), m_modeTx, ui->autoButton->isChecked (), @@ -7912,7 +7897,7 @@ void MainWindow::statusUpdate () const m_hisGrid, m_tx_watchdog, submode != QChar::Null ? QString {submode} : QString {}, m_bFastMode, static_cast (m_config.special_op_id ()), - m_multi_settings->configuration_name ()); + ftol, tr_period, m_multi_settings->configuration_name ()); } void MainWindow::childEvent (QChildEvent * e) @@ -8754,3 +8739,79 @@ void MainWindow::on_pbBestSP_clicked() if(!m_bBestSPArmed) ui->pbBestSP->setStyleSheet (""); if(m_bBestSPArmed) m_dateTimeBestSP=QDateTime::currentDateTimeUtc(); } + +void MainWindow::set_mode (QString const& mode) +{ + if ("FT4" == mode) on_actionFT4_triggered (); + else if ("FT8" == mode) on_actionFT8_triggered (); + else if ("JT4" == mode) on_actionJT4_triggered (); + else if ("JT9" == mode) on_actionJT9_triggered (); + else if ("JT9+JT65" == mode) on_actionJT9_JT65_triggered (); + else if ("JT65" == mode) on_actionJT65_triggered (); + else if ("QRA64" == mode) on_actionQRA64_triggered (); + else if ("FreqCal" == mode) on_actionFreqCal_triggered (); + else if ("ISCAT" == mode) on_actionISCAT_triggered (); + else if ("MSK144" == mode) on_actionMSK144_triggered (); + else if ("WSPR" == mode) on_actionWSPR_triggered (); + else if ("WSPR-LF" == mode) on_actionWSPR_LF_triggered (); + else if ("Echo" == mode) on_actionEcho_triggered (); +} + +void MainWindow::remote_configure (QString const& mode, quint32 frequency_tolerance + , QString const& submode, bool fast_mode, quint32 tr_period, quint32 rx_df + , QString const& dx_call, QString const& dx_grid, bool generate_messages) +{ + if (mode.size ()) + { + set_mode (mode); + } + if (frequency_tolerance != quint32_max && ui->sbFtol->isVisible ()) + { + ui->sbFtol->setValue (frequency_tolerance); + } + if (submode.size () && ui->sbSubmode->isVisible ()) + { + ui->sbSubmode->setValue (submode.toUpper ().at (0).toLatin1 () - 'A'); + } + if (ui->cbFast9->isVisible () && ui->cbFast9->isChecked () != fast_mode) + { + ui->cbFast9->click (); + } + if (tr_period != quint32_max && ui->sbTR->isVisible ()) + { + ui->sbTR->setValue (tr_period); + ui->sbTR->interpretText (); + } + if (rx_df != quint32_max && ui->RxFreqSpinBox->isVisible ()) + { + m_block_udp_status_updates = true; + ui->RxFreqSpinBox->setValue (rx_df); + ui->RxFreqSpinBox->interpretText (); + m_block_udp_status_updates = false; + } + if (dx_call.size () && ui->dxCallEntry->isVisible ()) + { + ui->dxCallEntry->setText (dx_call); + } + if (dx_grid.size () && ui->dxGridEntry->isVisible ()) + { + ui->dxGridEntry->setText (dx_grid); + } + if (generate_messages && ui->genStdMsgsPushButton->isVisible ()) + { + ui->genStdMsgsPushButton->click (); + } + if (m_config.udpWindowToFront ()) + { + show (); + raise (); + activateWindow (); + } + if (m_config.udpWindowRestore () && isMinimized ()) + { + showNormal (); + raise (); + } + tx_watchdog (false); + QApplication::alert (this); +} diff --git a/widgets/mainwindow.h b/widgets/mainwindow.h index ca545ec35..514dbb30a 100644 --- a/widgets/mainwindow.h +++ b/widgets/mainwindow.h @@ -313,6 +313,9 @@ private slots: void on_pbBestSP_clicked(); int setTxMsg(int n); bool stdCall(QString const& w); + void remote_configure (QString const& mode, quint32 frequency_tolerance, QString const& submode + , bool fast_mode, quint32 tr_period, quint32 rx_df, QString const& dx_call + , QString const& dx_grid, bool generate_messages); private: Q_SIGNAL void initializeAudioOutputStream (QAudioDeviceInfo, @@ -339,6 +342,7 @@ private: Q_SIGNAL void toggleShorthand () const; private: + void set_mode (QString const& mode); void astroUpdate (); void writeAllTxt(QString message); void auto_sequence (DecodedText const& message, unsigned start_tolerance, unsigned stop_tolerance); @@ -680,6 +684,7 @@ private: QHash m_pwrBandTuneMemory; // Remembers power level by band for tuning QByteArray m_geometryNoControls; QVector m_phaseEqCoefficients; + bool m_block_udp_status_updates; //---------------------------------------------------- private functions void readSettings(); From adcf202637b36c19dbd9f989067d8fef175d4015 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Sun, 30 Jun 2019 12:17:17 +0100 Subject: [PATCH 159/159] Repair a crash when decoding ISCAT Passing a auto stack variable to a future is not a good idea as it will almost certainly go out of scope before the future has finished executing. --- lib/fast_decode.f90 | 7 ++++--- widgets/mainwindow.cpp | 5 ++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/fast_decode.f90 b/lib/fast_decode.f90 index eebb73108..c3cadb6a7 100644 --- a/lib/fast_decode.f90 +++ b/lib/fast_decode.f90 @@ -1,4 +1,4 @@ -subroutine fast_decode(id2,narg,ntrperiod,line,mycall_12, & +subroutine fast_decode(id2,narg,trperiod,line,mycall_12, & hiscall_12) parameter (NMAX=30*12000) @@ -6,6 +6,7 @@ subroutine fast_decode(id2,narg,ntrperiod,line,mycall_12, & integer*2 id2a(NMAX) integer*2 id2b(NMAX) integer narg(0:14) + double precision trperiod real dat(30*12000) complex cdat(262145),cdat2(262145) real psavg(450) @@ -41,7 +42,7 @@ subroutine fast_decode(id2,narg,ntrperiod,line,mycall_12, & nhashcalls=narg(12) line(1:100)(1:1)=char(0) - if(t0.gt.float(ntrperiod)) go to 900 + if(t0.gt.trperiod) go to 900 if(t0.gt.t1) go to 900 if(nmode.eq.102) then @@ -53,7 +54,7 @@ subroutine fast_decode(id2,narg,ntrperiod,line,mycall_12, & cdat2=cdat ndat=ndat0 call wav11(id2,ndat,dat) - nzz=11025*ntrperiod + nzz=11025*int(trperiod) !beware if fractional T/R period ever used here if(ndat.lt.nzz) dat(ndat+1:nzz)=0.0 ndat=min(ndat,30*11025) call ana932(dat,ndat,cdat,npts) !Make downsampled analytic signal diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index b11e7f9bb..cf165d0df 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -147,7 +147,7 @@ extern "C" { float* level, float* sigdb, float* snr, float* dfreq, float* width); - void fast_decode_(short id2[], int narg[], int* ntrperiod, + void fast_decode_(short id2[], int narg[], double * trperiod, char msg[], char mycall[], char hiscall[], fortran_charlen_t, fortran_charlen_t, fortran_charlen_t); void degrade_snr_(short d2[], int* n, float* db, float* bandwidth); @@ -2965,10 +2965,9 @@ void MainWindow::decode() //decode() narg[12]=0; narg[13]=-1; narg[14]=m_config.aggressive(); - int nTRperiod=m_TRperiod; memcpy(d2b,dec_data.d2,2*360000); watcher3.setFuture (QtConcurrent::run (std::bind (fast_decode_,&d2b[0], - &narg[0],&nTRperiod,&m_msg[0][0], + &narg[0],&m_TRperiod,&m_msg[0][0], dec_data.params.mycall,dec_data.params.hiscall,8000,12,12))); } else { memcpy(to, from, qMin(mem_jt9->size(), size));