-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.go
118 lines (102 loc) · 1.94 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
package main
import (
"encoding/json"
"flag"
"fmt"
"io"
"log"
"os"
"time"
tea "github.com/charmbracelet/bubbletea"
)
var (
simulate = flag.String("simulate", "", "path name to read a previously captured log from RaceCapture")
output = flag.String("output", "", "path name to write *.jsonl file")
)
var ls = newLineScanner()
type Event struct {
Time time.Time
Event int
}
type model struct {
clock clock
count int
ch chan Event
}
func (m *model) Init() tea.Cmd {
return nil
}
func (m *model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
switch msg := msg.(type) {
case tea.KeyMsg:
if msg.Type == tea.KeySpace {
m.ch <- Event{Time: m.clock.Time(), Event: m.count}
m.count++
return m, nil
}
if msg.Type == tea.KeyCtrlC {
return m, tea.Quit
}
}
return m, nil
}
func (m *model) View() string {
return fmt.Sprintf("Press [SPACE] to send event #%d or [CTRL+C] to quit.", m.count)
}
func main() {
flag.Parse()
if *output == "" {
log.Fatal("The --output flag is required.")
}
var s io.ReadWriteCloser
var err error
if *simulate == "" {
s, err = openSerial()
} else {
s, err = openSimulator(*simulate)
}
if err != nil {
log.Fatal(err)
}
defer s.Close()
chEvent := make(chan Event)
chLine := make(chan Line)
go func() {
defer close(chLine)
ls.scan(s, chLine)
}()
done := make(chan struct{})
f, err := os.Create(*output)
if err != nil {
log.Fatal(err)
}
defer f.Close()
go func() {
defer close(done)
done:
for {
select {
case line := <-chLine:
b, err := json.Marshal(line)
if err != nil {
log.Fatal(err)
}
fmt.Fprintf(f, "%s\n", b)
case event, ok := <-chEvent:
if !ok {
break done
}
b, err := json.Marshal(event)
if err != nil {
log.Fatal(err)
}
fmt.Fprintf(f, "%s\n", b)
}
}
}()
if _, err := tea.NewProgram(&model{clock: defaultClockInstance, ch: chEvent}).Run(); err != nil {
log.Fatal(err)
}
close(chEvent)
<-done
}