Skip to content

Commit 4679289

Browse files
committed
extend the storage and the file format for QTCs
1 parent 73a0345 commit 4679289

File tree

8 files changed

+508
-187
lines changed

8 files changed

+508
-187
lines changed

core/app/app.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -310,7 +310,7 @@ func (c *Controller) openCurrentLog() error {
310310
}
311311

312312
var newLogbook *logbook.Logbook
313-
qsos, station, contest, keyerSettings, err := store.ReadAll()
313+
qsos, station, contest, keyerSettings, qtcs, err := store.ReadAll()
314314
if err != nil {
315315
log.Printf("Cannot load %s: %v", filepath.Base(filename), err)
316316
newLogbook = logbook.New(c.clock)
@@ -327,6 +327,7 @@ func (c *Controller) openCurrentLog() error {
327327
c.Keyer.SetSettings(*keyerSettings, "")
328328
}
329329
newLogbook = logbook.Load(c.clock, qsos)
330+
_ = qtcs // TODO: load the qtcs
330331
}
331332
c.changeLogbook(filename, store, newLogbook)
332333
return nil
@@ -520,7 +521,7 @@ func (c *Controller) Open() {
520521
}
521522

522523
store := store.NewFileStore(filename)
523-
qsos, station, contest, keyerSettings, err := store.ReadAll()
524+
qsos, station, contest, keyerSettings, qtcs, err := store.ReadAll()
524525
if err != nil {
525526
c.view.ShowErrorDialog("Cannot open %s: %v", filepath.Base(filename), err)
526527
return
@@ -538,6 +539,7 @@ func (c *Controller) Open() {
538539
c.Keyer.SetSettings(*keyerSettings, "")
539540
}
540541
log := logbook.Load(c.clock, qsos)
542+
_ = qtcs // TODO: load the qtcs
541543
c.changeLogbook(filename, store, log)
542544
c.Refresh()
543545
}

core/pb/convert.go

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,3 +180,65 @@ func KeyerSettingsToPB(settings core.KeyerSettings) *Keyer {
180180
ParrotIntervalSeconds: int32(settings.ParrotIntervalSeconds),
181181
}
182182
}
183+
184+
func ToQTC(pbQTC *QTC) (core.QTC, error) {
185+
var qtc core.QTC
186+
var err error
187+
188+
qtc.Timestamp = time.Unix(pbQTC.Timestamp, 0)
189+
qtc.Frequency = core.Frequency(pbQTC.Frequency)
190+
qtc.Band, err = parse.Band(pbQTC.Band)
191+
if err != nil {
192+
return core.QTC{}, err
193+
}
194+
qtc.Mode, err = parse.Mode(pbQTC.Mode)
195+
if err != nil {
196+
return core.QTC{}, err
197+
}
198+
199+
qtc.Kind = core.QTCKind(pbQTC.Kind)
200+
qtc.QSONumber = core.QSONumber(pbQTC.QsoNumber)
201+
qtc.TheirCallsign, err = callsign.Parse(pbQTC.TheirCallsign)
202+
if err != nil {
203+
return core.QTC{}, err
204+
}
205+
206+
if pbQTC.Header != "" {
207+
qtc.Header, err = core.ParseQTCHeader(pbQTC.Header)
208+
if err != nil {
209+
return core.QTC{}, err
210+
}
211+
}
212+
213+
if pbQTC.QtcTime != "" {
214+
qtc.QTCTime, err = core.ParseQTCTime(pbQTC.QtcTime, core.ZeroQTCTime)
215+
if err != nil {
216+
return core.QTC{}, err
217+
}
218+
}
219+
220+
qtc.QTCCallsign, err = callsign.Parse(pbQTC.QtcCallsign)
221+
if err != nil {
222+
return core.QTC{}, err
223+
}
224+
225+
qtc.QTCNumber = core.QSONumber(pbQTC.QtcNumber)
226+
227+
return qtc, nil
228+
}
229+
230+
func QTCToPB(qtc core.QTC) *QTC {
231+
return &QTC{
232+
Timestamp: qtc.Timestamp.Unix(),
233+
Frequency: float64(qtc.Frequency),
234+
Band: qtc.Band.String(),
235+
Mode: qtc.Mode.String(),
236+
Kind: int32(qtc.Kind),
237+
QsoNumber: int32(qtc.QSONumber),
238+
TheirCallsign: qtc.TheirCallsign.String(),
239+
Header: qtc.Header.String(),
240+
QtcTime: qtc.QTCTime.String(),
241+
QtcCallsign: qtc.QTCCallsign.String(),
242+
QtcNumber: int32(qtc.QTCNumber),
243+
}
244+
}

core/pb/log.pb.go

Lines changed: 312 additions & 148 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

core/pb/log.proto

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ message Entry {
1414
Station station = 2;
1515
Contest contest = 3;
1616
Keyer keyer = 4;
17+
QTC qtc = 5;
1718
}
1819
}
1920

@@ -93,3 +94,17 @@ message Keyer {
9394
repeated string run_labels = 5;
9495
int32 parrot_interval_seconds = 6;
9596
}
97+
98+
message QTC {
99+
int64 timestamp = 1;
100+
double frequency = 2;
101+
string band = 3;
102+
string mode = 4;
103+
int32 kind = 5;
104+
int32 qso_number = 6;
105+
string their_callsign = 7;
106+
string header = 8;
107+
string qtc_time = 9;
108+
string qtc_callsign = 10;
109+
int32 qtc_number = 11;
110+
}

core/store/format.go

Lines changed: 42 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,12 @@ import (
1111
)
1212

1313
type fileFormat interface {
14-
ReadAll(pbReader) ([]core.QSO, *core.Station, *core.Contest, *core.KeyerSettings, error)
14+
ReadAll(pbReader) ([]core.QSO, *core.Station, *core.Contest, *core.KeyerSettings, []core.QTC, error)
1515
WriteQSO(pbWriter, core.QSO) error
1616
WriteStation(pbWriter, core.Station) error
1717
WriteContest(pbWriter, core.Contest) error
1818
WriteKeyer(pbWriter, core.KeyerSettings) error
19+
WriteQTC(pbWriter, core.QTC) error
1920
Clear(pbWriter) error
2021
}
2122

@@ -58,8 +59,8 @@ type unknownFormat struct {
5859
err error
5960
}
6061

61-
func (f *unknownFormat) ReadAll(pbReader) ([]core.QSO, *core.Station, *core.Contest, *core.KeyerSettings, error) {
62-
return nil, nil, nil, nil, f.err
62+
func (f *unknownFormat) ReadAll(pbReader) ([]core.QSO, *core.Station, *core.Contest, *core.KeyerSettings, []core.QTC, error) {
63+
return nil, nil, nil, nil, nil, f.err
6364
}
6465

6566
func (f *unknownFormat) WriteQSO(pbWriter, core.QSO) error {
@@ -78,6 +79,10 @@ func (f *unknownFormat) WriteKeyer(pbWriter, core.KeyerSettings) error {
7879
return f.err
7980
}
8081

82+
func (f *unknownFormat) WriteQTC(pbWriter, core.QTC) error {
83+
return f.err
84+
}
85+
8186
func (f *unknownFormat) Clear(pbWriter) error {
8287
return f.err
8388
}
@@ -86,19 +91,19 @@ type v0Format struct {
8691
filename string
8792
}
8893

89-
func (f *v0Format) ReadAll(r pbReader) ([]core.QSO, *core.Station, *core.Contest, *core.KeyerSettings, error) {
94+
func (f *v0Format) ReadAll(r pbReader) ([]core.QSO, *core.Station, *core.Contest, *core.KeyerSettings, []core.QTC, error) {
9095
qsos := []core.QSO{}
9196
var pbQSO pb.QSO
9297
for {
9398
err := r.Read(&pbQSO)
9499
if err == io.EOF {
95-
return qsos, nil, nil, nil, nil
100+
return qsos, nil, nil, nil, nil, nil
96101
} else if err != nil {
97-
return nil, nil, nil, nil, err
102+
return nil, nil, nil, nil, nil, err
98103
}
99104
qso, err := pb.ToQSO(&pbQSO)
100105
if err != nil {
101-
return nil, nil, nil, nil, err
106+
return nil, nil, nil, nil, nil, err
102107
}
103108
qsos = append(qsos, qso)
104109
}
@@ -124,6 +129,11 @@ func (f *v0Format) WriteKeyer(pbWriter, core.KeyerSettings) error {
124129
return nil
125130
}
126131

132+
func (f *v0Format) WriteQTC(pbWriter, core.QTC) error {
133+
log.Println("The V0 file format cannot store QTC data.")
134+
return nil
135+
}
136+
127137
func (f *v0Format) Clear(pbWriter) error {
128138
return nil
129139
}
@@ -132,59 +142,67 @@ type v1Format struct {
132142
filename string
133143
}
134144

135-
func (f *v1Format) ReadAll(r pbReader) ([]core.QSO, *core.Station, *core.Contest, *core.KeyerSettings, error) {
145+
func (f *v1Format) ReadAll(r pbReader) ([]core.QSO, *core.Station, *core.Contest, *core.KeyerSettings, []core.QTC, error) {
136146
var (
137147
pbFormatInfo pb.FileInfo
138148
pbEntry pb.Entry
139149
)
140150
_, err := r.ReadPreamble()
141151
if err != nil {
142-
return nil, nil, nil, nil, err
152+
return nil, nil, nil, nil, nil, err
143153
}
144154
err = r.Read(&pbFormatInfo)
145155
if err != nil {
146-
return nil, nil, nil, nil, err
156+
return nil, nil, nil, nil, nil, err
147157
}
148158

149159
var qsos []core.QSO
150160
var station *core.Station
151161
var contest *core.Contest
152162
var settings *core.KeyerSettings
163+
var qtcs []core.QTC
153164
for {
154165
err := r.Read(&pbEntry)
155166
if err == io.EOF {
156-
return qsos, station, contest, settings, nil
167+
return qsos, station, contest, settings, qtcs, nil
157168
} else if err != nil {
158-
return nil, nil, nil, nil, err
169+
return nil, nil, nil, nil, nil, err
159170
}
160171

161172
if pbQSO := pbEntry.GetQso(); pbQSO != nil {
162173
qso, err := pb.ToQSO(pbQSO)
163174
if err != nil {
164-
return nil, nil, nil, nil, err
175+
return nil, nil, nil, nil, nil, err
165176
}
166177
qsos = append(qsos, qso)
167178
}
168179
if pbStation := pbEntry.GetStation(); pbStation != nil {
169180
s, err := pb.ToStation(pbStation)
170181
station = &s
171182
if err != nil {
172-
return nil, nil, nil, nil, err
183+
return nil, nil, nil, nil, nil, err
173184
}
174185
}
175186
if pbContest := pbEntry.GetContest(); pbContest != nil {
176187
c, err := pb.ToContest(pbContest)
177188
contest = &c
178189
if err != nil {
179-
return nil, nil, nil, nil, err
190+
return nil, nil, nil, nil, nil, err
180191
}
181192
}
182193
if pbKeyer := pbEntry.GetKeyer(); pbKeyer != nil {
183194
k, err := pb.ToKeyerSettings(pbKeyer)
184195
settings = &k
185196
if err != nil {
186-
return nil, nil, nil, nil, err
197+
return nil, nil, nil, nil, nil, err
198+
}
199+
}
200+
if pbQTC := pbEntry.GetQtc(); pbQTC != nil {
201+
qtc, err := pb.ToQTC(pbQTC)
202+
if err != nil {
203+
return nil, nil, nil, nil, nil, err
187204
}
205+
qtcs = append(qtcs, qtc)
188206
}
189207
}
190208
}
@@ -221,6 +239,14 @@ func (f *v1Format) WriteKeyer(w pbWriter, settings core.KeyerSettings) error {
221239
return w.Write(pbEntry)
222240
}
223241

242+
func (f *v1Format) WriteQTC(w pbWriter, qtc core.QTC) error {
243+
pbQTC := pb.QTCToPB(qtc)
244+
pbEntry := &pb.Entry{
245+
Entry: &pb.Entry_Qtc{Qtc: pbQTC},
246+
}
247+
return w.Write(pbEntry)
248+
}
249+
224250
func (f *v1Format) Clear(w pbWriter) error {
225251
err := w.WritePreamble()
226252
if err != nil {

core/store/store.go

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,7 @@ import (
88
"log"
99
"os"
1010

11-
"github.com/golang/protobuf/proto"
12-
"google.golang.org/protobuf/runtime/protoiface"
11+
"google.golang.org/protobuf/proto"
1312

1413
"github.com/ftl/hellocontest/core"
1514
)
@@ -39,10 +38,10 @@ func (f *FileStore) Exists() bool {
3938
return true
4039
}
4140

42-
func (f *FileStore) ReadAll() ([]core.QSO, *core.Station, *core.Contest, *core.KeyerSettings, error) {
41+
func (f *FileStore) ReadAll() ([]core.QSO, *core.Station, *core.Contest, *core.KeyerSettings, []core.QTC, error) {
4342
b, err := os.ReadFile(f.filename)
4443
if err != nil {
45-
return nil, nil, nil, nil, err
44+
return nil, nil, nil, nil, nil, err
4645
}
4746

4847
reader := bytes.NewReader(b)
@@ -91,6 +90,16 @@ func (f *FileStore) WriteKeyer(keyer core.KeyerSettings) error {
9190
return f.format.WriteKeyer(&pbReadWriter{writer: file}, keyer)
9291
}
9392

93+
func (f *FileStore) WriteQTC(qtc core.QTC) error {
94+
file, err := os.OpenFile(f.filename, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644)
95+
if err != nil {
96+
return err
97+
}
98+
defer file.Close()
99+
100+
return f.format.WriteQTC(&pbReadWriter{writer: file}, qtc)
101+
}
102+
94103
func (f *FileStore) Clear() error {
95104
file, err := os.Create(f.filename)
96105
if err != nil {
@@ -103,12 +112,12 @@ func (f *FileStore) Clear() error {
103112
}
104113

105114
type pbReader interface {
106-
Read(pb protoiface.MessageV1) error
115+
Read(pb proto.Message) error
107116
ReadPreamble() (int32, error)
108117
}
109118

110119
type pbWriter interface {
111-
Write(pb protoiface.MessageV1) error
120+
Write(pb proto.Message) error
112121
WritePreamble() error
113122
}
114123

@@ -117,7 +126,7 @@ type pbReadWriter struct {
117126
writer io.Writer
118127
}
119128

120-
func (rw *pbReadWriter) Read(pb protoiface.MessageV1) error {
129+
func (rw *pbReadWriter) Read(pb proto.Message) error {
121130
var length int32
122131
err := binary.Read(rw.reader, binary.LittleEndian, &length)
123132
if err != nil {
@@ -142,7 +151,7 @@ func (rw *pbReadWriter) ReadPreamble() (int32, error) {
142151
return preamble, nil
143152
}
144153

145-
func (rw *pbReadWriter) Write(pb protoiface.MessageV1) error {
154+
func (rw *pbReadWriter) Write(pb proto.Message) error {
146155
b, err := proto.Marshal(pb)
147156
if err != nil {
148157
return err

0 commit comments

Comments
 (0)