/
main.go
119 lines (106 loc) · 3.01 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
119
package main
import (
"os"
"fmt"
"time"
"encoding/binary"
"code.google.com/p/getopt"
"devel.mephi.ru/dyokunev/voltlogger_parser/voltloggerParser"
)
type printRow_arg struct {
outputPath string
outputFile *os.File
binaryOutput bool
insertParseTime bool
}
func handleHeader(h voltloggerParser.VoltloggerDumpHeader, arg_iface interface{}) (err error) {
arg := arg_iface.(*printRow_arg)
if (arg.binaryOutput) {
err = binary.Write(arg.outputFile, binary.LittleEndian, h)
if (err != nil) {
return err
}
}
return nil
}
func printRow(ts int64, row []int32, h voltloggerParser.VoltloggerDumpHeader, arg_iface interface{}) (err error) {
arg := arg_iface.(*printRow_arg)
var parseTime int64
if (arg.insertParseTime) {
parseTime = time.Now().UnixNano()
}
if (arg.binaryOutput) {
if (arg.insertParseTime) {
err = binary.Write(arg.outputFile, binary.LittleEndian, parseTime)
if (err != nil) {
return err
}
}
err = binary.Write(arg.outputFile, binary.LittleEndian, ts)
if (err != nil) {
return err
}
err = binary.Write(arg.outputFile, binary.LittleEndian, row)
if (err != nil) {
return err
}
} else {
if (arg.insertParseTime) {
fmt.Printf("%v\t", parseTime)
}
fmt.Printf("%v", ts)
rowLen := len(row)
for i:=0; i < rowLen; i++ {
fmt.Printf("\t%v", row[i])
}
fmt.Printf("\n")
}
return nil
}
func main() {
var err error
var dumpPath string
var noHeaders bool
var printRow_arg printRow_arg
var channelsNum int
getopt.StringVar(&dumpPath, 'i', "dump-path" )
getopt.StringVar(&printRow_arg.outputPath, 'o', "output-path" ).SetOptional()
getopt.BoolVar (&noHeaders, 'n', "no-headers" ).SetOptional()
getopt.IntVar (&channelsNum, 'c', "force-channels-num" ).SetOptional()
getopt.BoolVar (&printRow_arg.binaryOutput, 'b', "binary-output" ).SetOptional()
getopt.BoolVar (&printRow_arg.insertParseTime, 't', "insert-parse-time" ).SetOptional()
getopt.Parse()
if (getopt.NArgs() > 0 || dumpPath == "") {
getopt.Usage()
os.Exit(-2)
}
switch (printRow_arg.outputPath) {
/* case "":
now := time.Now()
year, month, day := now.Date()
hour, min, sec := now.Clock()
printRow_arg.outputPath = fmt.Sprintf("%v_%v-%02v-%02v_%02v:%02v:%02v.csv", h.DeviceName, year, int(month), day, hour, min, sec)
break*/
case "", "-":
printRow_arg.outputPath = "/dev/stdout"
printRow_arg.outputFile = os.Stdout
break
default:
printRow_arg.outputFile,err = os.Open(printRow_arg.outputPath)
panic(fmt.Errorf("Not supported yet"))
}
if (err != nil) {
fmt.Printf("Cannot open output file: %v", err.Error())
os.Exit(-1)
}
//if (printRow_arg.binaryOutput) {
// err = binary.Write(printRow_arg.outputFile, binary.LittleEndian, printRow_arg)
//}
err = voltloggerParser.ParseVoltloggerDump(dumpPath, noHeaders, channelsNum, handleHeader, printRow, &printRow_arg)
if (err != nil) {
fmt.Printf("Cannot parse the dump: %v\n", err.Error())
os.Exit(-1)
}
printRow_arg.outputFile.Close()
fmt.Printf("%v %v\n", dumpPath, printRow_arg)
}