@@ -3,14 +3,13 @@ package telemetry
3
3
import (
4
4
"bytes"
5
5
"encoding/binary"
6
- "fmt"
7
- "log"
8
6
"net"
7
+ "os"
9
8
"time"
10
9
11
10
"github.com/kaitai-io/kaitai_struct_go_runtime/kaitai"
11
+ "github.com/rs/zerolog"
12
12
"github.com/vwhitteron/gt-telemetry/internal/gttelemetry"
13
- "github.com/vwhitteron/gt-telemetry/internal/utils"
14
13
"github.com/vwhitteron/gt-telemetry/internal/vehicles"
15
14
"golang.org/x/crypto/salsa20"
16
15
)
@@ -33,48 +32,62 @@ type statistics struct {
33
32
PacketsTotal int
34
33
}
35
34
36
- type Config struct {
35
+ type GTClientOpts struct {
37
36
IPAddr string
38
37
LogLevel string
38
+ Logger * zerolog.Logger
39
39
StatsEnabled bool
40
40
VehicleDB string
41
41
}
42
42
43
43
type GTClient struct {
44
- logger * utils .Logger
44
+ log zerolog .Logger
45
45
ipAddr string
46
46
sendPort int
47
47
receivePort int
48
48
Telemetry * transformer
49
49
Statistics * statistics
50
50
}
51
51
52
- func NewGTClient (config Config ) (* GTClient , error ) {
53
- if config .LogLevel == "" {
54
- config .LogLevel = "info"
52
+ func NewGTClient (opts GTClientOpts ) (* GTClient , error ) {
53
+ var log zerolog.Logger
54
+ if opts .Logger != nil {
55
+ log = * opts .Logger
56
+ } else {
57
+ log = zerolog .New (os .Stdout ).With ().Timestamp ().Logger ()
55
58
}
56
- logger , err := utils .NewLogger (config .LogLevel )
57
- if err != nil {
58
- return nil , err
59
+
60
+ switch opts .LogLevel {
61
+ case "debug" :
62
+ log = log .Level (zerolog .DebugLevel )
63
+ case "info" :
64
+ log = log .Level (zerolog .InfoLevel )
65
+ case "warn" :
66
+ log = log .Level (zerolog .WarnLevel )
67
+ case "error" :
68
+ log = log .Level (zerolog .ErrorLevel )
69
+ default :
70
+ log = log .Level (zerolog .WarnLevel )
71
+ log .Warn ().Msg ("Invalid log level, defaulting to warn" )
59
72
}
60
73
61
- if config .IPAddr == "" {
62
- config .IPAddr = "255.255.255.255"
74
+ if opts .IPAddr == "" {
75
+ opts .IPAddr = "255.255.255.255"
63
76
}
64
77
65
- inventory , err := vehicles .NewInventory (config .VehicleDB )
78
+ inventory , err := vehicles .NewInventory (opts .VehicleDB )
66
79
if err != nil {
67
80
return nil , err
68
81
}
69
82
70
83
return & GTClient {
71
- logger : logger ,
72
- ipAddr : config .IPAddr ,
84
+ log : log ,
85
+ ipAddr : opts .IPAddr ,
73
86
sendPort : 33739 ,
74
87
receivePort : 33740 ,
75
88
Telemetry : NewTransformer (inventory ),
76
89
Statistics : & statistics {
77
- enabled : config .StatsEnabled ,
90
+ enabled : opts .StatsEnabled ,
78
91
decodeTimeLast : time .Duration (0 ),
79
92
packetRateLast : time .Now (),
80
93
DecodeTimeAvg : time .Duration (0 ),
@@ -94,12 +107,12 @@ func NewGTClient(config Config) (*GTClient, error) {
94
107
func (c * GTClient ) Run () {
95
108
addr , err := net .ResolveUDPAddr ("udp" , ":33740" )
96
109
if err != nil {
97
- log .Fatal (err )
110
+ c . log .Fatal (). Msgf ( "resolve UDP address: %s" , err . Error () )
98
111
}
99
112
100
113
conn , err := net .ListenUDP ("udp" , addr )
101
114
if err != nil {
102
- log .Fatal (err )
115
+ c . log .Fatal (). Msgf ( "listen UDP: %s" , err . Error () )
103
116
}
104
117
defer conn .Close ()
105
118
@@ -118,12 +131,12 @@ func (c *GTClient) Run() {
118
131
buffer := make ([]byte , 4096 )
119
132
bufLen , _ , err := conn .ReadFromUDP (buffer )
120
133
if err != nil {
121
- c .logger .Debug (fmt . Sprintf ( "Failed to receive telemetry: %s" , err .Error () ))
134
+ c .log .Debug (). Msgf ( "failed to receive telemetry: %s" , err .Error ())
122
135
continue
123
136
}
124
137
125
138
if len (buffer [:bufLen ]) == 0 {
126
- c .logger .Debug ("No data received" )
139
+ c .log .Debug (). Msg ( "no data received" )
127
140
continue
128
141
}
129
142
@@ -136,7 +149,7 @@ func (c *GTClient) Run() {
136
149
137
150
err = rawTelemetry .Read (stream , nil , nil )
138
151
if err != nil {
139
- c .logger .Error (fmt . Sprintf ( "Failed to parse telemetry: %s" , err .Error () ))
152
+ c .log .Error (). Msgf ( "failed to parse telemetry: %s" , err .Error ())
140
153
c .Statistics .PacketsInvalid ++
141
154
}
142
155
@@ -167,10 +180,10 @@ func (c *GTClient) collectStats() {
167
180
168
181
delta := int (c .Telemetry .SequenceID () - c .Statistics .packetIDLast )
169
182
if delta > 1 {
170
- c .logger .Warn (fmt . Sprintf ( "Dropped packets detected: %d " , delta - 1 ))
183
+ c .log .Warn (). Int ( "dropped " , delta - 1 ). Msg ( "dropped packets detected" )
171
184
c .Statistics .PacketsDropped += int (delta - 1 )
172
185
} else if delta < 0 {
173
- c .logger .Warn ("Delayed packet deteted " )
186
+ c .log .Warn (). Msg ( "delayed packet detected " )
174
187
}
175
188
176
189
c .Statistics .packetIDLast = c .Telemetry .SequenceID ()
@@ -189,7 +202,7 @@ func (c *GTClient) collectStats() {
189
202
}
190
203
191
204
func (c * GTClient ) SendHeartbeat (conn * net.UDPConn ) {
192
- c .logger .Debug ("Sending heartbeat" )
205
+ c .log .Debug (). Msg ("Sending heartbeat" )
193
206
c .Statistics .Heartbeat = true
194
207
defer func () {
195
208
time .Sleep (250 * time .Millisecond )
@@ -201,11 +214,11 @@ func (c *GTClient) SendHeartbeat(conn *net.UDPConn) {
201
214
Port : c .sendPort ,
202
215
})
203
216
if err != nil {
204
- log .Fatal (err )
217
+ c . log .Fatal (). Msgf ( "write to udp: %s" , err . Error () )
205
218
}
206
219
err = conn .SetReadDeadline (time .Now ().Add (10 * time .Second ))
207
220
if err != nil {
208
- log .Fatal (err )
221
+ c . log .Fatal (). Msgf ( "set read deadline: %s" , err . Error () )
209
222
}
210
223
}
211
224
0 commit comments