From b2648053d3231b3a16217834ebd492b64655633b Mon Sep 17 00:00:00 2001 From: Jean-Marc MEESSEN Date: Sun, 12 Jul 2020 22:33:01 +0200 Subject: [PATCH] Support WWFF and SOTA adif output --- cmd/FLEcli_version.go | 1 - cmd/adif.go | 14 +++-- cmd/adif_write.go | 61 +++++++++++-------- cmd/adif_write_test.go | 10 +-- cmd/displayLog.go | 2 +- cmd/parse_line.go | 48 +++++++-------- test/output/SOTA/sample.adi | 10 +++ .../plain/ON4KJM@ONFF-025920200524-v3.adi | 53 ++++++++++++++++ .../output/plain/ON4KJM@ONFF-025920200524.csv | 49 +++++++++++++++ 9 files changed, 189 insertions(+), 59 deletions(-) create mode 100644 test/output/SOTA/sample.adi create mode 100644 test/output/plain/ON4KJM@ONFF-025920200524-v3.adi create mode 100644 test/output/plain/ON4KJM@ONFF-025920200524.csv diff --git a/cmd/FLEcli_version.go b/cmd/FLEcli_version.go index a232301..c12177d 100644 --- a/cmd/FLEcli_version.go +++ b/cmd/FLEcli_version.go @@ -2,4 +2,3 @@ package cmd //VersionString is the version that will be displayed with the -v switch const VersionString = "v0.0.0 2020-07-11" - diff --git a/cmd/adif.go b/cmd/adif.go index db5a099..316bc60 100644 --- a/cmd/adif.go +++ b/cmd/adif.go @@ -24,7 +24,8 @@ import ( ) var outputFilename string -var isWwff bool +var isWWFFcli bool +var isSOTAcli bool var isOverwrite bool // adifCmd is executed when choosing the adif option (load and generate adif file) @@ -42,7 +43,8 @@ var adifCmd = &cobra.Command{ func init() { rootCmd.AddCommand(adifCmd) - adifCmd.PersistentFlags().BoolVarP(&isWwff, "wwff", "w", false, "Generates an ADIF file ready to be uploaded on WWFF") + adifCmd.PersistentFlags().BoolVarP(&isWWFFcli, "wwff", "w", false, "Generates a WWFF ready ADIF file.") + adifCmd.PersistentFlags().BoolVarP(&isSOTAcli, "sota", "s", false, "Generates a SOTA ready ADIF file.") adifCmd.PersistentFlags().BoolVarP(&isOverwrite, "overwrite", "", false, "Overwrites the output file if it exisits") adifCmd.PersistentFlags().StringVarP(&outputFilename, "output", "o", "", "Output filename") } @@ -55,7 +57,8 @@ func processAdifCommand() { fmt.Println("OutputFile: ", outputFilename) fmt.Println("computed output: ", verifiedOutputFilename) fmt.Println("Output filenameWasOK: ", filenameWasOK) - fmt.Println("wwff: ", isWwff) + fmt.Println("wwff: ", isWWFFcli) + fmt.Println("sota: ", isSOTAcli) fmt.Println("isOverwrite: ", isOverwrite) // if the output file could not be parsed correctly do noting @@ -69,15 +72,16 @@ func processAdifCommand() { return } + //TODO: There are more tests required here //check if we have the necessary information for the type - if isWwff { + if isWWFFcli { if loadedLogFile[0].MyWWFF == "" { fmt.Println("Missing MY-WWFF reference. Aborting...") return } } - outputAdif(verifiedOutputFilename, loadedLogFile) + outputAdif(verifiedOutputFilename, loadedLogFile, isWWFFcli, isSOTAcli) } } } diff --git a/cmd/adif_write.go b/cmd/adif_write.go index 7c1a441..90802ec 100644 --- a/cmd/adif_write.go +++ b/cmd/adif_write.go @@ -25,45 +25,58 @@ limitations under the License. */ // outputAdif generates and writes data in ADIF format -func outputAdif(outputFile string, fullLog []LogLine) { +func outputAdif(outputFile string, fullLog []LogLine, isWWFF bool, isSOTA bool) { + + //TODO: validate input data for combination //convert the log data to an in-memory ADIF file - adifData := buildAdif(fullLog) + adifData := buildAdif(fullLog, isWWFF, isSOTA) //write to a file writeAdif(outputFile, adifData) } // buildAdif creates the adif file in memory ready to be printed -func buildAdif(fullLog []LogLine) (adifList []string) { +func buildAdif(fullLog []LogLine, isWWFF bool, isSOTA bool) (adifList []string) { //Print the fixed header adifList = append(adifList, "ADIF Export for Fast Log Entry by DF3CB") adifList = append(adifList, "FLE") - adifList = append(adifList, "3.0.6") + adifList = append(adifList, "3.1.0") adifList = append(adifList, "") for _, logLine := range fullLog { - adifLine := "" - adifLine = adifLine + adifElement("STATION_CALLSIGN", logLine.MyCall) - adifLine = adifLine + adifElement("CALL", logLine.Call) - adifLine = adifLine + adifElement("QSO_DATE", adifDate(logLine.Date)) - adifLine = adifLine + adifElement("TIME_ON", logLine.Time) - adifLine = adifLine + adifElement("BAND", logLine.Band) - adifLine = adifLine + adifElement("MODE", logLine.Mode) + var adifLine strings.Builder + adifLine.WriteString(adifElement("STATION_CALLSIGN", logLine.MyCall)) + adifLine.WriteString(adifElement("CALL", logLine.Call)) + adifLine.WriteString(adifElement("QSO_DATE", adifDate(logLine.Date))) + adifLine.WriteString(adifElement("TIME_ON", logLine.Time)) + adifLine.WriteString(adifElement("BAND", logLine.Band)) + adifLine.WriteString(adifElement("MODE", logLine.Mode)) if logLine.Frequency != "" { - adifLine = adifLine + adifElement("FREQ", logLine.Frequency) + adifLine.WriteString(adifElement("FREQ", logLine.Frequency)) + } + adifLine.WriteString(adifElement("RST_SENT", logLine.RSTsent)) + adifLine.WriteString(adifElement("RST_RCVD", logLine.RSTrcvd)) + if logLine.QSLmsg != "" { + adifLine.WriteString(adifElement("QSLMSG", logLine.RSTrcvd)) + } + if isWWFF { + adifLine.WriteString(adifElement("MY_SIG", "WWFF")) + adifLine.WriteString(adifElement("MY_SIG_INFO", logLine.MyWWFF)) + } + if isSOTA { + adifLine.WriteString(adifElement("MY_SOTA_REF", logLine.MySOTA)) + if logLine.SOTA != "" { + adifLine.WriteString(adifElement("SOTA_REF", logLine.SOTA)) + } } - adifLine = adifLine + adifElement("RST_SENT", logLine.RSTsent) - adifLine = adifLine + adifElement("RST_RCVD", logLine.RSTrcvd) - adifLine = adifLine + adifElement("MY_SIG", "WWFF") - adifLine = adifLine + adifElement("MY_SIG_INFO", logLine.MyWWFF) - adifLine = adifLine + adifElement("OPERATOR", logLine.Operator) + adifLine.WriteString(adifElement("OPERATOR", logLine.Operator)) if logLine.Nickname != "" { - adifLine = adifLine + adifElement("APP_EQSL_QTH_NICKNAME", logLine.Nickname) + adifLine.WriteString(adifElement("APP_EQSL_QTH_NICKNAME", logLine.Nickname)) } - adifLine = adifLine + "" + adifLine.WriteString("") - adifList = append(adifList, adifLine) + adifList = append(adifList, adifLine.String()) } @@ -107,13 +120,13 @@ func checkFileError(e error) { //adifDate converts a date in YYYY-MM-DD format to YYYYMMDD func adifDate(inputDate string) (outputDate string) { - const RFC3339FullDate = "2006-01-02" - date, err := time.Parse(RFC3339FullDate, inputDate) + const FLEdateFormat = "2006-01-02" + date, err := time.Parse(FLEdateFormat, inputDate) //error should never happen if err != nil { panic(err) } - outputDate = fmt.Sprintf("%04d%02d%02d", date.Year(), date.Month(), date.Day()) - return outputDate + const ADIFdateFormat = "20060102" + return date.Format(ADIFdateFormat) } diff --git a/cmd/adif_write_test.go b/cmd/adif_write_test.go index cbab728..9aae610 100644 --- a/cmd/adif_write_test.go +++ b/cmd/adif_write_test.go @@ -44,7 +44,7 @@ func Test_buildAdif(t *testing.T) { expectedOutput1 := []string{ "ADIF Export for Fast Log Entry by DF3CB", "FLE", - "3.0.6", + "3.1.0", "", "ON4KJM/P S57LC 20200524 1310 20m CW 14.045 599 599 WWFF ONFF-0259 ON4KJM ONFF-0259-1 ", "ON4KJM/P ON4LY 20200524 1312 20m CW 559 599 WWFF ONFF-0259 ON4KJM ", @@ -52,6 +52,8 @@ func Test_buildAdif(t *testing.T) { type args struct { fullLog []LogLine + isWWFF bool + isSOTA bool } tests := []struct { name string @@ -59,14 +61,14 @@ func Test_buildAdif(t *testing.T) { wantAdifList []string }{ { - "Happy case", - args{fullLog: sampleFilledLog1}, + "Happy case-WWFF", + args{fullLog: sampleFilledLog1, isWWFF: true, isSOTA: false}, expectedOutput1, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if gotAdifList := buildAdif(tt.args.fullLog); !reflect.DeepEqual(gotAdifList, tt.wantAdifList) { + if gotAdifList := buildAdif(tt.args.fullLog, tt.args.isWWFF, tt.args.isSOTA); !reflect.DeepEqual(gotAdifList, tt.wantAdifList) { t.Errorf("buildAdif() = %v, want %v", gotAdifList, tt.wantAdifList) } }) diff --git a/cmd/displayLog.go b/cmd/displayLog.go index 30c952b..69e362a 100644 --- a/cmd/displayLog.go +++ b/cmd/displayLog.go @@ -29,7 +29,7 @@ func SprintLogRecord(logLine LogLine) string { output.WriteString("Operator " + logLine.Operator + "\n") output.WriteString("MyWWFF " + logLine.MyWWFF + "\n") output.WriteString("MySOTA " + logLine.MySOTA + "\n") - output.WriteString("QslMsg " + logLine.QslMsg + "\n") + output.WriteString("QslMsg " + logLine.QslMsgFromHeader + "\n") output.WriteString("Nickname " + logLine.Nickname + "\n") output.WriteString("Mode " + logLine.Mode + "\n") output.WriteString("ModeType " + logLine.ModeType + "\n") diff --git a/cmd/parse_line.go b/cmd/parse_line.go index 6673648..dbc4a85 100644 --- a/cmd/parse_line.go +++ b/cmd/parse_line.go @@ -28,30 +28,30 @@ import ( // LogLine is used to store all the data of a single log line type LogLine struct { - Date string - MyCall string - Operator string - MyWWFF string - MySOTA string - QslMsg string - Nickname string - Mode string - ModeType string - Band string - BandLowerLimit float64 - BandUpperLimit float64 - Frequency string - Time string - ActualTime string //time actually recorded in FLE - Call string - Comment string - QSLmsg string - OMname string - GridLoc string - RSTsent string - RSTrcvd string - WWFF string - SOTA string + Date string + MyCall string + Operator string + MyWWFF string + MySOTA string + QslMsgFromHeader string + Nickname string + Mode string + ModeType string + Band string + BandLowerLimit float64 + BandUpperLimit float64 + Frequency string + Time string + ActualTime string //time actually recorded in FLE + Call string + Comment string + QSLmsg string + OMname string + GridLoc string + RSTsent string + RSTrcvd string + WWFF string + SOTA string } var regexpIsFullTime = regexp.MustCompile("^[0-2]{1}[0-9]{3}$") diff --git a/test/output/SOTA/sample.adi b/test/output/SOTA/sample.adi new file mode 100644 index 0000000..bdc0c23 --- /dev/null +++ b/test/output/SOTA/sample.adi @@ -0,0 +1,10 @@ +ADIF file +created by SOTA2ADIF (http://www.on6zq.be/w/index.php/SOTA/SOTA2ADIF) on 2020/07/12 18:30:23 UTC + +SOTA2ADIF +20200712 +3.0.4 + +20010101 0101 ON6ZQ/P ON6ZQ/P 40M CW ON4XYZ F/AB-001 F/AB-001 comment 123 +20010102 0201 ON6ZQ/P ON6ZQ/P 40M CW ON4XYZ F/AB-002 F/AB-002 comment 456 +20010103 0301 ON6ZQ/P ON6ZQ/P ON/ON-001 40M CW ON4XYZ F/AB-003 F/AB-003 comment 789 diff --git a/test/output/plain/ON4KJM@ONFF-025920200524-v3.adi b/test/output/plain/ON4KJM@ONFF-025920200524-v3.adi new file mode 100644 index 0000000..5b4b7df --- /dev/null +++ b/test/output/plain/ON4KJM@ONFF-025920200524-v3.adi @@ -0,0 +1,53 @@ +ADIF Export for Fast Log Entry by DF3CB +FLE +3.1.0 + +ON4KJM/P S57LC 20200524 1310 20m CW 14.045 599 599 WWFF ONFF-0259 ON/ON-001 ON4KJM ONFF-0259-1 +ON4KJM/P ON4LY 20200524 1312 20m CW 14.045 559 599 WWFF ONFF-0259 ON/ON-001 ON4KJM ONFF-0259-1 +ON4KJM/P ON6ZQ 20200524 1315 20m CW 14.045 339 599 WWFF ONFF-0259 ON/ON-001 ON4KJM ONFF-0259-1 +ON4KJM/P IW3IEE 20200524 1320 20m CW 14.045 599 599 WWFF ONFF-0259 ON/ON-001 ON4KJM ONFF-0259-1 +ON4KJM/P OE7HHW 20200524 1325 20m CW 14.045 559 599 WWFF ONFF-0259 ON/ON-001 ON4KJM ONFF-0259-1 +ON4KJM/P OL90CRK 20200524 1337 20m CW 14.045 559 599 WWFF ONFF-0259 ON/ON-001 ON4KJM ONFF-0259-1 +ON4KJM/P OE6JTD 20200524 1342 20m CW 14.047 539 599 WWFF ONFF-0259 ON/ON-001 ON4KJM ONFF-0259-1 +ON4KJM/P HB9FBG/QRP 20200524 1405 20m CW 14.060 559 599 WWFF ONFF-0259 ON/ON-001 ON4KJM ONFF-0259-1 +ON4KJM/P HB9IJC 20200524 1415 30m CW 10.124 589 599 WWFF ONFF-0259 ON/ON-001 ON4KJM ONFF-0259-1 +ON4KJM/P F6ACV 20200524 1425 30m CW 10.124 579 599 WWFF ONFF-0259 ON/ON-001 ON4KJM ONFF-0259-1 +ON4KJM/P DL5SFC/P 20200524 1427 30m CW 10.124 559 559 WWFF ONFF-0259 ON/ON-001 ON4KJM ONFF-0259-1 +ON4KJM/P DL6TA 20200524 1429 30m CW 10.124 449 559 WWFF ONFF-0259 ON/ON-001 ON4KJM ONFF-0259-1 +ON4KJM/P PA1TT 20200524 1432 30m CW 10.124 599 599 WWFF ONFF-0259 ON/ON-001 ON4KJM ONFF-0259-1 +ON4KJM/P IK4GBU 20200524 1435 30m CW 10.124 559 599 WWFF ONFF-0259 ON/ON-001 ON4KJM ONFF-0259-1 +ON4KJM/P OH6MPS 20200524 1438 30m CW 10.124 599 599 WWFF ONFF-0259 ON/ON-001 ON4KJM ONFF-0259-1 +ON4KJM/P YL2TN 20200524 1442 30m CW 10.124 559 599 WWFF ONFF-0259 ON/ON-001 ON4KJM ONFF-0259-1 +ON4KJM/P OH6NPJ 20200524 1444 30m CW 10.124 559 599 WWFF ONFF-0259 ON/ON-001 ON4KJM ONFF-0259-1 +ON4KJM/P DL5OE 20200524 1447 30m CW 10.124 449 559 WWFF ONFF-0259 ON/ON-001 ON4KJM ONFF-0259-1 +ON4KJM/P I1ULJ 20200524 1500 40m CW 7.024 589 559 WWFF ONFF-0259 ON/ON-001 ON4KJM ONFF-0259-1 +ON4KJM/P I1GIS 20200524 1506 40m CW 7.026 559 599 WWFF ONFF-0259 ON/ON-001 ON4KJM ONFF-0259-1 +ON4KJM/P ON5SY 20200524 1513 40m CW 7.026 569 599 WWFF ONFF-0259 ON/ON-001 ON4KJM ONFF-0259-1 +ON4KJM/P GB1PBL 20200524 1520 40m CW 7.026 559 599 WWFF ONFF-0259 ON/ON-001 ON4KJM ONFF-0259-1 +ON4KJM/P IK2ECC 20200524 1521 40m CW 7.026 599 599 WWFF ONFF-0259 ON/ON-001 ON4KJM ONFF-0259-1 +ON4KJM/P PA0B 20200524 1522 40m CW 7.026 599 599 WWFF ONFF-0259 ON/ON-001 ON4KJM ONFF-0259-1 +ON4KJM/P OM5HW 20200524 1523 40m CW 7.026 599 599 WWFF ONFF-0259 ON/ON-001 ON4KJM ONFF-0259-1 +ON4KJM/P HA0ML 20200524 1524 40m CW 7.026 559 599 WWFF ONFF-0259 ON/ON-001 ON4KJM ONFF-0259-1 +ON4KJM/P OM1AY 20200524 1525 40m CW 7.026 599 599 WWFF ONFF-0259 ON/ON-001 ON4KJM ONFF-0259-1 +ON4KJM/P SP8LEP 20200524 1526 40m CW 7.026 599 599 WWFF ONFF-0259 ON/ON-001 ON4KJM ONFF-0259-1 +ON4KJM/P EA2CIA 20200524 1528 40m CW 7.026 599 599 WWFF ONFF-0259 ON/ON-001 ON4KJM ONFF-0259-1 +ON4KJM/P SP5CCK 20200524 1529 40m CW 7.026 559 599 WWFF ONFF-0259 ON/ON-001 ON4KJM ONFF-0259-1 +ON4KJM/P 9A4FM 20200524 1530 40m CW 7.026 579 599 WWFF ONFF-0259 ON/ON-001 ON4KJM ONFF-0259-1 +ON4KJM/P F5PSS 20200524 1531 40m CW 7.026 599 599 WWFF ONFF-0259 ON/ON-001 ON4KJM ONFF-0259-1 +ON4KJM/P SP8SV 20200524 1533 40m CW 7.026 599 599 WWFF ONFF-0259 ON/ON-001 ON4KJM ONFF-0259-1 +ON4KJM/P IS3SMB 20200524 1534 40m CW 7.026 599 599 WWFF ONFF-0259 ON/ON-001 ON4KJM ONFF-0259-1 +ON4KJM/P SM6CNX 20200524 1536 40m CW 7.026 599 599 WWFF ONFF-0259 ON/ON-001 ON4KJM ONFF-0259-1 +ON4KJM/P SQ2LKY 20200524 1537 40m CW 7.026 599 599 WWFF ONFF-0259 ON/ON-001 ON4KJM ONFF-0259-1 +ON4KJM/P ON4BB 20200524 1539 40m CW 7.026 599 599 WWFF ONFF-0259 ON/ON-001 ON4KJM ONFF-0259-1 +ON4KJM/P SP2YMX 20200524 1540 40m CW 7.024 599 559 WWFF ONFF-0259 ON/ON-001 ON4KJM ONFF-0259-1 +ON4KJM/P SP2F 20200524 1542 40m CW 7.024 599 599 WWFF ONFF-0259 ON/ON-001 ON4KJM ONFF-0259-1 +ON4KJM/P F6EOC 20200524 1543 40m CW 7.024 599 599 WWFF ONFF-0259 ON/ON-001 ON4KJM ONFF-0259-1 +ON4KJM/P EA1DT 20200524 1545 40m CW 7.024 599 599 WWFF ONFF-0259 ON/ON-001 ON4KJM ONFF-0259-1 +ON4KJM/P 2E0TTD 20200524 1546 40m CW 7.024 599 599 WWFF ONFF-0259 ON/ON-001 ON4KJM ONFF-0259-1 +ON4KJM/P SQ2EEY 20200524 1548 40m CW 7.024 579 599 WWFF ONFF-0259 ON/ON-001 ON4KJM ONFF-0259-1 +ON4KJM/P IW2BNA 20200524 1549 40m CW 7.024 579 599 WWFF ONFF-0259 ON/ON-001 ON4KJM ONFF-0259-1 +ON4KJM/P OH1XT 20200524 1551 40m CW 7.024 579 599 WWFF ONFF-0259 ON/ON-001 ON4KJM ONFF-0259-1 +ON4KJM/P ON4VT 20200524 1553 40m CW 7.024 559 599 WWFF ONFF-0259 ON/ON-001 ON4KJM ONFF-0259-1 +ON4KJM/P OZ9VO 20200524 1555 40m CW 7.024 559 559 WWFF ONFF-0259 ON/ON-001 ON4KJM ONFF-0259-1 +ON4KJM/P G0TQT 20200524 1557 40m CW 7.024 559 599 WWFF ONFF-0259 ON/ON-001 ON4KJM ONFF-0259-1 +ON4KJM/P DL2RPS 20200524 1625 80m CW 3.529 599 599 WWFF ONFF-0259 ON/ON-001 ON4KJM ONFF-0259-1 diff --git a/test/output/plain/ON4KJM@ONFF-025920200524.csv b/test/output/plain/ON4KJM@ONFF-025920200524.csv new file mode 100644 index 0000000..ed715e2 --- /dev/null +++ b/test/output/plain/ON4KJM@ONFF-025920200524.csv @@ -0,0 +1,49 @@ +V2,ON4KJM/P,ON/ON-001,24/05/20,1310,14MHz,CW,S57LC +V2,ON4KJM/P,ON/ON-001,24/05/20,1312,14MHz,CW,ON4LY +V2,ON4KJM/P,ON/ON-001,24/05/20,1315,14MHz,CW,ON6ZQ +V2,ON4KJM/P,ON/ON-001,24/05/20,1320,14MHz,CW,IW3IEE +V2,ON4KJM/P,ON/ON-001,24/05/20,1325,14MHz,CW,OE7HHW +V2,ON4KJM/P,ON/ON-001,24/05/20,1337,14MHz,CW,OL90CRK +V2,ON4KJM/P,ON/ON-001,24/05/20,1342,14MHz,CW,OE6JTD +V2,ON4KJM/P,ON/ON-001,24/05/20,1405,14MHz,CW,HB9FBG/QRP +V2,ON4KJM/P,ON/ON-001,24/05/20,1415,10MHz,CW,HB9IJC +V2,ON4KJM/P,ON/ON-001,24/05/20,1425,10MHz,CW,F6ACV +V2,ON4KJM/P,ON/ON-001,24/05/20,1427,10MHz,CW,DL5SFC/P +V2,ON4KJM/P,ON/ON-001,24/05/20,1429,10MHz,CW,DL6TA +V2,ON4KJM/P,ON/ON-001,24/05/20,1432,10MHz,CW,PA1TT +V2,ON4KJM/P,ON/ON-001,24/05/20,1435,10MHz,CW,IK4GBU +V2,ON4KJM/P,ON/ON-001,24/05/20,1438,10MHz,CW,OH6MPS +V2,ON4KJM/P,ON/ON-001,24/05/20,1442,10MHz,CW,YL2TN +V2,ON4KJM/P,ON/ON-001,24/05/20,1444,10MHz,CW,OH6NPJ +V2,ON4KJM/P,ON/ON-001,24/05/20,1447,10MHz,CW,DL5OE +V2,ON4KJM/P,ON/ON-001,24/05/20,1500,7MHz,CW,I1ULJ +V2,ON4KJM/P,ON/ON-001,24/05/20,1506,7MHz,CW,I1GIS +V2,ON4KJM/P,ON/ON-001,24/05/20,1513,7MHz,CW,ON5SY +V2,ON4KJM/P,ON/ON-001,24/05/20,1520,7MHz,CW,GB1PBL +V2,ON4KJM/P,ON/ON-001,24/05/20,1521,7MHz,CW,IK2ECC +V2,ON4KJM/P,ON/ON-001,24/05/20,1522,7MHz,CW,PA0B +V2,ON4KJM/P,ON/ON-001,24/05/20,1523,7MHz,CW,OM5HW +V2,ON4KJM/P,ON/ON-001,24/05/20,1524,7MHz,CW,HA0ML +V2,ON4KJM/P,ON/ON-001,24/05/20,1525,7MHz,CW,OM1AY +V2,ON4KJM/P,ON/ON-001,24/05/20,1526,7MHz,CW,SP8LEP +V2,ON4KJM/P,ON/ON-001,24/05/20,1528,7MHz,CW,EA2CIA +V2,ON4KJM/P,ON/ON-001,24/05/20,1529,7MHz,CW,SP5CCK +V2,ON4KJM/P,ON/ON-001,24/05/20,1530,7MHz,CW,9A4FM +V2,ON4KJM/P,ON/ON-001,24/05/20,1531,7MHz,CW,F5PSS +V2,ON4KJM/P,ON/ON-001,24/05/20,1533,7MHz,CW,SP8SV +V2,ON4KJM/P,ON/ON-001,24/05/20,1534,7MHz,CW,IS3SMB +V2,ON4KJM/P,ON/ON-001,24/05/20,1536,7MHz,CW,SM6CNX +V2,ON4KJM/P,ON/ON-001,24/05/20,1537,7MHz,CW,SQ2LKY +V2,ON4KJM/P,ON/ON-001,24/05/20,1539,7MHz,CW,ON4BB +V2,ON4KJM/P,ON/ON-001,24/05/20,1540,7MHz,CW,SP2YMX +V2,ON4KJM/P,ON/ON-001,24/05/20,1542,7MHz,CW,SP2F +V2,ON4KJM/P,ON/ON-001,24/05/20,1543,7MHz,CW,F6EOC +V2,ON4KJM/P,ON/ON-001,24/05/20,1545,7MHz,CW,EA1DT +V2,ON4KJM/P,ON/ON-001,24/05/20,1546,7MHz,CW,2E0TTD +V2,ON4KJM/P,ON/ON-001,24/05/20,1548,7MHz,CW,SQ2EEY +V2,ON4KJM/P,ON/ON-001,24/05/20,1549,7MHz,CW,IW2BNA +V2,ON4KJM/P,ON/ON-001,24/05/20,1551,7MHz,CW,OH1XT +V2,ON4KJM/P,ON/ON-001,24/05/20,1553,7MHz,CW,ON4VT +V2,ON4KJM/P,ON/ON-001,24/05/20,1555,7MHz,CW,OZ9VO +V2,ON4KJM/P,ON/ON-001,24/05/20,1557,7MHz,CW,G0TQT +V2,ON4KJM/P,ON/ON-001,24/05/20,1625,3.5MHz,CW,DL2RPS