Skip to content

Commit e83aaf9

Browse files
committed
add support for writing Cabrillo files
1 parent 12dbd66 commit e83aaf9

File tree

5 files changed

+413
-64
lines changed

5 files changed

+413
-64
lines changed

cabrillo.go

Lines changed: 80 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ import (
1212
"github.com/ftl/hamradio/locator"
1313
)
1414

15+
const TimestampLayout = "2006-01-02 1504"
16+
1517
func NewLog() *Log {
1618
return &Log{
1719
Custom: make(map[Tag]string),
@@ -54,38 +56,38 @@ func (t Tag) IsCustom() bool {
5456
}
5557

5658
const (
57-
StartOfLogTag Tag = "START-OF-LOG"
58-
EndOfLogTag Tag = "END-OF-LOG"
59-
CallsignTag Tag = "CALLSIGN"
60-
ContestTag Tag = "CONTEST"
61-
CategoryAssistedTag Tag = "CATEGORY-ASSISTED"
62-
CategoryBandTag Tag = "CATEGORY-BAND"
63-
CategoryModeTag Tag = "CATEGORY-MODE"
64-
CategoryOperatorTag Tag = "CATEGORY-OPERATOR"
65-
CategoryPowerTag Tag = "CATEGORY-POWER"
66-
CategoryStationTag Tag = "CATEGORY-STATION"
67-
CategoryTimeTag Tag = "CATEGORY-TIME"
68-
CategoryTransmitterTag Tag = "CATEGORY-TRANSMITTER"
69-
CategoryOverlayTag Tag = "CATEGORY-OVERLAY"
70-
CertificateTag Tag = "CERTIFICATE"
71-
ClaimedScoreTag Tag = "CLAIMED-SCORE"
72-
ClubTag Tag = "CLUB"
73-
CratedByTag Tag = "CREATED-BY"
74-
EmailTag Tag = "EMAIL"
75-
GridLocatorTag Tag = "GRID-LOCATOR"
76-
LocationTag Tag = "LOCATION"
77-
NameTag Tag = "NAME"
78-
AddressTag Tag = "ADDRESS"
79-
AddressCityTag Tag = "ADDRESS-CITY"
80-
AddressStateProviceTag Tag = "ADDRESS-STATE-PROVINCE"
81-
AddressPostalcodeTag Tag = "ADDRESS-POSTALCODE"
82-
AddressCountryTag Tag = "ADDRESS-COUNTRY"
83-
OperatorsTag Tag = "OPERATORS"
84-
OfftimeTag Tag = "OFFTIME"
85-
SoapboxTag Tag = "SOAPBOX"
86-
QSOTag Tag = "QSO"
87-
XQSOTag Tag = "X-QSO"
88-
XPrefix = "X-"
59+
StartOfLogTag Tag = "START-OF-LOG"
60+
EndOfLogTag Tag = "END-OF-LOG"
61+
CallsignTag Tag = "CALLSIGN"
62+
ContestTag Tag = "CONTEST"
63+
CategoryAssistedTag Tag = "CATEGORY-ASSISTED"
64+
CategoryBandTag Tag = "CATEGORY-BAND"
65+
CategoryModeTag Tag = "CATEGORY-MODE"
66+
CategoryOperatorTag Tag = "CATEGORY-OPERATOR"
67+
CategoryPowerTag Tag = "CATEGORY-POWER"
68+
CategoryStationTag Tag = "CATEGORY-STATION"
69+
CategoryTimeTag Tag = "CATEGORY-TIME"
70+
CategoryTransmitterTag Tag = "CATEGORY-TRANSMITTER"
71+
CategoryOverlayTag Tag = "CATEGORY-OVERLAY"
72+
CertificateTag Tag = "CERTIFICATE"
73+
ClaimedScoreTag Tag = "CLAIMED-SCORE"
74+
ClubTag Tag = "CLUB"
75+
CreatedByTag Tag = "CREATED-BY"
76+
EmailTag Tag = "EMAIL"
77+
GridLocatorTag Tag = "GRID-LOCATOR"
78+
LocationTag Tag = "LOCATION"
79+
NameTag Tag = "NAME"
80+
AddressTag Tag = "ADDRESS"
81+
AddressCityTag Tag = "ADDRESS-CITY"
82+
AddressStateProvinceTag Tag = "ADDRESS-STATE-PROVINCE"
83+
AddressPostalcodeTag Tag = "ADDRESS-POSTALCODE"
84+
AddressCountryTag Tag = "ADDRESS-COUNTRY"
85+
OperatorsTag Tag = "OPERATORS"
86+
OfftimeTag Tag = "OFFTIME"
87+
SoapboxTag Tag = "SOAPBOX"
88+
QSOTag Tag = "QSO"
89+
XQSOTag Tag = "X-QSO"
90+
XPrefix = "X-"
8991
)
9092

9193
type ContestIdentifier string
@@ -276,32 +278,69 @@ func (f QSOFrequency) ToBand() CategoryBand {
276278
if f.IsFrequency() {
277279
kHz := f.ToKilohertz()
278280
switch {
279-
case kHz < 3500:
281+
case kHz < 3_500:
280282
return Band160m
281-
case kHz < 7000:
283+
case kHz < 7_000:
282284
return Band80m
283-
case kHz < 14000:
285+
case kHz < 14_000:
284286
return Band40m
285-
case kHz < 21000:
287+
case kHz < 21_000:
286288
return Band20m
287-
case kHz < 28000:
289+
case kHz < 28_000:
288290
return Band15m
289-
default:
291+
case kHz < 50_000_000:
290292
return Band10m
293+
case kHz < 70_000_000:
294+
return Band6m
295+
case kHz < 144_000_000:
296+
return Band4m
297+
case kHz < 222_000_000:
298+
return Band2m
299+
case kHz < 430_000_000:
300+
return Band222
301+
case kHz < 900_000_000:
302+
return Band432
303+
case kHz < 1_200_000_000:
304+
return Band902
305+
case kHz < 2_300_000_000:
306+
return Band1_2G
307+
default:
308+
return Band2_3G
291309
}
292310
}
293311
switch f {
294-
case "50":
312+
case Frequency50MHz:
295313
return Band6m
296-
case "70":
314+
case Frequency70MHz:
297315
return Band4m
298-
case "144":
316+
case Frequency144MHz:
299317
return Band2m
300318
default:
301319
return CategoryBand(strings.ToUpper(string(f)))
302320
}
303321
}
304322

323+
const (
324+
Frequency50MHz QSOFrequency = "50"
325+
Frequency70MHz QSOFrequency = "70"
326+
Frequency144MHz QSOFrequency = "144"
327+
Frequency222MHz QSOFrequency = "222"
328+
Frequency432MHz QSOFrequency = "432"
329+
Frequency902MHz QSOFrequency = "902"
330+
Frequency1_2GHz QSOFrequency = "1.2G"
331+
Frequency2_3GHz QSOFrequency = "2.3G"
332+
Frequency3_4GHz QSOFrequency = "3.4G"
333+
Frequency5_7GHz QSOFrequency = "5.7G"
334+
Frequency10GHz QSOFrequency = "10G"
335+
Frequency24GHz QSOFrequency = "24G"
336+
Frequency47GHz QSOFrequency = "47G"
337+
Frequency75GHz QSOFrequency = "75G"
338+
Frequency122GHz QSOFrequency = "122G"
339+
Frequency134GHz QSOFrequency = "134G"
340+
Frequency241GHz QSOFrequency = "241G"
341+
FrequencyLight QSOFrequency = "LIGHT"
342+
)
343+
305344
type QSOMode string
306345

307346
const (
@@ -314,6 +353,5 @@ const (
314353

315354
type QSOInfo struct {
316355
Call callsign.Callsign
317-
RST string
318356
Exchange []string
319357
}

parse.go

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ var tagParsers = map[Tag]tagParser{
208208
log.Club = value
209209
return nil
210210
}),
211-
CratedByTag: tagParserFunc(func(log *Log, value string) error {
211+
CreatedByTag: tagParserFunc(func(log *Log, value string) error {
212212
log.CreatedBy = value
213213
return nil
214214
}),
@@ -243,7 +243,7 @@ var tagParsers = map[Tag]tagParser{
243243
log.Address.City = value
244244
return nil
245245
}),
246-
AddressStateProviceTag: tagParserFunc(func(log *Log, value string) error {
246+
AddressStateProvinceTag: tagParserFunc(func(log *Log, value string) error {
247247
log.Address.StateProvince = value
248248
return nil
249249
}),
@@ -329,8 +329,7 @@ var tagParsers = map[Tag]tagParser{
329329
}
330330

331331
func ParseTimestamp(s string) (time.Time, error) {
332-
const timestampLayout = "2006-01-02 1504"
333-
return time.Parse(timestampLayout, s)
332+
return time.Parse(TimestampLayout, s)
334333
}
335334

336335
func ParseQSO(s string) (QSO, error) {
@@ -390,8 +389,7 @@ func parseQSOInfo(columns []string) (QSOInfo, error) {
390389
if err != nil {
391390
return QSOInfo{}, err
392391
}
393-
result.RST = columns[1]
394-
result.Exchange = append([]string{}, columns[2:]...)
392+
result.Exchange = append([]string{}, columns[1:]...)
395393

396394
return result, nil
397395
}

parse_test.go

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -150,13 +150,11 @@ func TestParser_ParseAllTags(t *testing.T) {
150150
Timestamp: time.Date(1999, time.March, 6, 7, 11, 0, 0, time.UTC),
151151
Sent: QSOInfo{
152152
Call: callsign.MustParse("DL1ABC"),
153-
RST: "599",
154-
Exchange: []string{"B01"},
153+
Exchange: []string{"599", "B01"},
155154
},
156155
Received: QSOInfo{
157156
Call: callsign.MustParse("W1AW"),
158-
RST: "599",
159-
Exchange: []string{"001"},
157+
Exchange: []string{"599", "001"},
160158
},
161159
},
162160
}, actualLog.QSOData, "qso data")
@@ -167,13 +165,11 @@ func TestParser_ParseAllTags(t *testing.T) {
167165
Timestamp: time.Date(1999, time.March, 6, 7, 12, 0, 0, time.UTC),
168166
Sent: QSOInfo{
169167
Call: callsign.MustParse("DL1ABC"),
170-
RST: "599",
171-
Exchange: []string{"B01"},
168+
Exchange: []string{"599", "B01"},
172169
},
173170
Received: QSOInfo{
174171
Call: callsign.MustParse("N5KO"),
175-
RST: "599",
176-
Exchange: []string{"001"},
172+
Exchange: []string{"599", "001"},
177173
},
178174
Transmitter: 1,
179175
},
@@ -314,13 +310,11 @@ func TestParseQSO(t *testing.T) {
314310
Timestamp: time.Date(1999, time.March, 6, 7, 11, 0, 0, time.UTC),
315311
Sent: QSOInfo{
316312
Call: callsign.MustParse("HC8N"),
317-
RST: "59",
318-
Exchange: []string{"700"},
313+
Exchange: []string{"59", "700"},
319314
},
320315
Received: QSOInfo{
321316
Call: callsign.MustParse("W1AW"),
322-
RST: "59",
323-
Exchange: []string{"CT"},
317+
Exchange: []string{"59", "CT"},
324318
},
325319
},
326320
},
@@ -333,13 +327,11 @@ func TestParseQSO(t *testing.T) {
333327
Timestamp: time.Date(1999, time.March, 6, 7, 11, 0, 0, time.UTC),
334328
Sent: QSOInfo{
335329
Call: callsign.MustParse("HC8N"),
336-
RST: "59",
337-
Exchange: []string{"700"},
330+
Exchange: []string{"59", "700"},
338331
},
339332
Received: QSOInfo{
340333
Call: callsign.MustParse("W1AW"),
341-
RST: "59",
342-
Exchange: []string{"CT"},
334+
Exchange: []string{"59", "CT"},
343335
},
344336
Transmitter: 1,
345337
},

0 commit comments

Comments
 (0)