-
Notifications
You must be signed in to change notification settings - Fork 4
/
log_editor.go
102 lines (84 loc) · 2.22 KB
/
log_editor.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
package main
import (
"flag"
"os"
file2 "github.com/half2me/antgo/driver/file"
"encoding/gob"
"io"
"fmt"
"github.com/half2me/antgo/message"
)
var fileName = flag.String("in", "", "File to open")
var outName = flag.String("out", "", "File to open")
var skip = flag.Int("skip", 0, "How many packets to skip")
var count = flag.Int("count", 0, "Read at most n packets (0 means unlimited)")
var filterType = flag.String("filtertype", "", "Filter device type [snc, pow]")
var filterId = flag.Uint("filterid", 0, "Filter device ID (0 means no filter")
func main() {
flag.Parse()
file, err := os.Open(*fileName)
if err != nil {
panic(err.Error())
}
defer file.Close()
var ofile *os.File
var enc *gob.Encoder
if len(*outName) > 0 {
var err error
if ofile, err = os.Create(*outName); err != nil {panic(err.Error())}
defer ofile.Close()
enc = gob.NewEncoder(ofile)
}
dec := gob.NewDecoder(file)
buf := file2.AntT{}
// TODO: implement seek without reading to memory :/
for i := 0; i < *skip; i++ {
if e := dec.Decode(&buf); e != nil {
if e == io.EOF {return} else {panic(e.Error())}
}
}
if *count == 0 {
for i := 0;;i++ {
if e := dec.Decode(&buf); e != nil {
if e == io.EOF {return} else {panic(e.Error())}
}
if ! filter(buf.Data) {continue}
fmt.Printf("[%8d] %s \n", i, buf.String())
if enc != nil {
if e := enc.Encode(buf); e != nil {
panic(e.Error())
}
}
}
} else {
for i := 0; i < *count ;i++ {
if e := dec.Decode(&buf); e != nil {
if e == io.EOF {return} else {panic(e.Error())}
}
if ! filter(buf.Data) {continue}
fmt.Printf("[%8d] %s \n", i, buf.String())
if enc != nil {
if e := enc.Encode(buf); e != nil {
panic(e.Error())
}
}
}
}
}
func filter(a message.AntPacket) (ok bool) {
if ! a.Valid() {panic("BAD CHECKSUM OMG!!!")}
if a.Class() != message.MESSAGE_TYPE_BROADCAST {return}
if len(*filterType) > 0 {
dt := message.AntBroadcastMessage(a).DeviceType()
switch *filterType {
case "snc":
if dt != message.DEVICE_TYPE_SPEED_AND_CADENCE {return}
case "pow":
if dt != message.DEVICE_TYPE_POWER {return}
}
}
if *filterId > 0 {
if message.AntBroadcastMessage(a).DeviceNumber() != uint16(*filterId) {return}
}
return true
}