-
Notifications
You must be signed in to change notification settings - Fork 9
/
gps.go
274 lines (241 loc) · 9.11 KB
/
gps.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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
package rtcm3
import (
"encoding/binary"
"github.com/go-restruct/restruct"
"time"
)
// L1-Only GPS RTK Observables
type Message1001 struct {
AbstractMessage
ReferenceStationID uint16 `struct:"uint16:12"`
Epoch uint32 `struct:"uint32:30"`
SynchronousGNSS bool `struct:"uint8:1,variantbool"`
SignalsProcessed uint8 `struct:"uint8:5,sizeof=SatelliteData"`
SmoothingIndicator bool `struct:"uint8:1,variantbool"`
SmoothingInterval uint8 `struct:"uint8:3"`
SatelliteData []struct {
SatelliteID uint8 `struct:"uint8:6"`
L1CodeIndicator bool `struct:"uint8:1,variantbool"`
L1Pseudorange uint32 `struct:"uint32:24"`
L1PhaseRange int32 `struct:"int32:20"`
L1LockTimeIndicator uint8 `struct:"uint8:7"`
}
}
func DeserializeMessage1001(data []byte) (msg Message1001) {
restruct.Unpack(data, binary.BigEndian, &msg)
return msg
}
func (msg Message1001) Serialize() []byte {
data, _ := restruct.Pack(binary.BigEndian, &msg)
return data
}
func (msg Message1001) Time() time.Time {
return DF004(msg.Epoch)
}
func (msg Message1001) SatelliteCount() int {
return len(msg.SatelliteData)
}
// Extended L1-Only GPS RTK Observables
type Message1002 struct {
AbstractMessage
ReferenceStationID uint16 `struct:"uint16:12"`
Epoch uint32 `struct:"uint32:30"`
SynchronousGNSS bool `struct:"uint8:1,variantbool"`
SignalsProcessed uint8 `struct:"uint8:5,sizeof=SatelliteData"`
SmoothingIndicator bool `struct:"uint8:1,variantbool"`
SmoothingInterval uint8 `struct:"uint8:3"`
SatelliteData []struct {
SatelliteID uint8 `struct:"uint8:6"`
L1CodeIndicator bool `struct:"uint8:1,variantbool"`
L1Pseudorange uint32 `struct:"uint32:24"`
L1PhaseRange int32 `struct:"int32:20"`
L1LockTimeIndicator uint8 `struct:"uint8:7"`
L1PseudorangeAmbiguity uint8 `struct:"uint8"`
L1CNR uint8 `struct:"uint8"`
}
}
func DeserializeMessage1002(data []byte) (msg Message1002) {
restruct.Unpack(data, binary.BigEndian, &msg)
return msg
}
func (msg Message1002) Serialize() []byte {
data, _ := restruct.Pack(binary.BigEndian, &msg)
return data
}
func (msg Message1002) Time() time.Time {
return DF004(msg.Epoch)
}
func (msg Message1002) SatelliteCount() int {
return len(msg.SatelliteData)
}
// L1&L2 GPS RTK Observables
type Message1003 struct {
AbstractMessage
ReferenceStationID uint16 `struct:"uint16:12"`
Epoch uint32 `struct:"uint32:30"`
SynchronousGNSS bool `struct:"uint8:1,variantbool"`
SignalsProcessed uint8 `struct:"uint8:5,sizeof=SatelliteData"`
SmoothingIndicator bool `struct:"uint8:1,variantbool"`
SmoothingInterval uint8 `struct:"uint8:3"`
SatelliteData []struct {
SatelliteID uint8 `struct:"uint8:6"`
L1CodeIndicator bool `struct:"uint8:1,variantbool"`
L1Pseudorange uint32 `struct:"uint32:24"`
L1PhaseRange int32 `struct:"int32:20"`
L1LockTimeIndicator uint8 `struct:"uint8:7"`
L2CodeIndicator uint8 `struct:"uint8:2"`
L2PseudorangeDifference int16 `struct:"int16:14"`
L2PhaseRange int32 `struct:"int32:20"`
L2LockTimeIndicator uint8 `struct:"uint8:7"`
}
}
func DeserializeMessage1003(data []byte) (msg Message1003) {
restruct.Unpack(data, binary.BigEndian, &msg)
return msg
}
func (msg Message1003) Serialize() []byte {
data, _ := restruct.Pack(binary.BigEndian, &msg)
return data
}
func (msg Message1003) Time() time.Time {
return DF004(msg.Epoch)
}
func (msg Message1003) SatelliteCount() int {
return len(msg.SatelliteData)
}
// Extended L1&L2 GPS RTK Observables
type Message1004 struct {
AbstractMessage
ReferenceStationID uint16 `struct:"uint16:12"`
Epoch uint32 `struct:"uint32:30"`
SynchronousGNSS bool `struct:"uint8:1,variantbool"`
SignalsProcessed uint8 `struct:"uint8:5,sizeof=SatelliteData"`
SmoothingIndicator bool `struct:"uint8:1,variantbool"`
SmoothingInterval uint8 `struct:"uint8:3"`
SatelliteData []struct {
SatelliteID uint8 `struct:"uint8:6"`
L1CodeIndicator bool `struct:"uint8:1,variantbool"`
L1Pseudorange uint32 `struct:"uint32:24"`
L1PhaseRange int32 `struct:"int32:20"`
L1LockTimeIndicator uint8 `struct:"uint8:7"`
L1PseudorangeAmbiguity uint8 `struct:"uint8"`
L1CNR uint8 `struct:"uint8"`
L2CodeIndicator uint8 `struct:"uint8:2"`
L2PseudorangeDifference int16 `struct:"int16:14"`
L2PhaseRange int32 `struct:"int32:20"`
L2LockTimeIndicator uint8 `struct:"uint8:7"`
L2CNR uint8 `struct:"uint8"`
}
}
func DeserializeMessage1004(data []byte) (msg Message1004) {
restruct.Unpack(data, binary.BigEndian, &msg)
return msg
}
func (msg Message1004) Serialize() []byte {
data, _ := restruct.Pack(binary.BigEndian, &msg)
return data
}
func (msg Message1004) Time() time.Time {
return DF004(msg.Epoch)
}
func (msg Message1004) SatelliteCount() int {
return len(msg.SatelliteData)
}
// Network Auxiliary Station Data Message
type Message1014 struct {
AbstractMessage
NetworkID uint8 `struct:"uint8:8"`
SubnetworkID uint8 `struct:"uint8:4"`
AuxiliaryStationsTransmitted uint8 `struct:"uint8:5"`
MasterReferenceStationID uint16 `struct:"uint16:12"`
AuxiliaryReferenceStationID uint16 `struct:"uint16:12"`
AuxMasterDeltaLatitude int32 `struct:"int32:20"`
AuxMasterDeltaLongitude int32 `struct:"int32:21"`
AuxMasterDeltaHeight int32 `struct:"int32:23"`
}
func DeserializeMessage1014(data []byte) (msg Message1014) {
restruct.Unpack(data, binary.BigEndian, &msg)
return msg
}
func (msg Message1014) Serialize() []byte {
data, _ := restruct.Pack(binary.BigEndian, &msg)
return data
}
// GPS Ionospheric Correction Differences
type Message1015 struct {
AbstractMessage
NetworkID uint8 `struct:"uint8"`
SubnetworkID uint8 `struct:"uint8:4"`
Epoch uint32 `struct:"uint32:23"`
MultipleMessageIndicator bool `struct:"uint8:1,variantbool"`
MasterReferenceStationID uint16 `struct:"uint16:12"`
AuxiliaryReferenceStationID uint16 `struct:"uint16:12"`
SatelliteCount uint8 `struct:"uint8:4,sizeof=SatelliteData"`
SatelliteData []struct {
SatelliteID uint8 `struct:"uint8:6"`
AmbiguityStatusFlag uint8 `struct:"uint8:2"`
NonSyncCount uint8 `struct:"uint8:3"`
IonosphericCarrierPhaseCorrectionDifference int32 `struct:"int32:17"`
}
}
func DeserializeMessage1015(data []byte) (msg Message1015) {
restruct.Unpack(data, binary.BigEndian, &msg)
return msg
}
func (msg Message1015) Serialize() []byte {
data, _ := restruct.Pack(binary.BigEndian, &msg)
return data
}
// GPS Geometric Correction Differences
type Message1016 struct {
AbstractMessage
NetworkID uint8 `struct:"uint8"`
SubnetworkID uint8 `struct:"uint8:4"`
Epoch uint32 `struct:"uint32:23"`
MultipleMessageIndicator bool `struct:"uint8:1,variantbool"`
MasterReferenceStationID uint16 `struct:"uint16:12"`
AuxiliaryReferenceStationID uint16 `struct:"uint16:12"`
SatelliteCount uint8 `struct:"uint8:4,sizeof=SatelliteData"`
SatelliteData []struct {
SatelliteID uint8 `struct:"uint8:6"`
AmbiguityStatusFlag uint8 `struct:"uint8:2"`
NonSyncCount uint8 `struct:"uint8:3"`
GeometricCarrierPhaseCorrectionDifference int32 `struct:"int32:17"`
IODE uint8 `struct:"uint8"`
}
}
func DeserializeMessage1016(data []byte) (msg Message1016) {
restruct.Unpack(data, binary.BigEndian, &msg)
return msg
}
func (msg Message1016) Serialize() []byte {
data, _ := restruct.Pack(binary.BigEndian, &msg)
return data
}
// GPS Combined Geometric and Ionospheric Correction Differences
type Message1017 struct {
AbstractMessage
NetworkID uint8 `struct:"uint8"`
SubnetworkID uint8 `struct:"uint8:4"`
Epoch uint32 `struct:"uint32:23"`
MultipleMessageIndicator bool `struct:"uint8:1,variantbool"`
MasterReferenceStationID uint16 `struct:"uint16:12"`
AuxiliaryReferenceStationID uint16 `struct:"uint16:12"`
SatelliteCount uint8 `struct:"uint8:4,sizeof=SatelliteData"`
SatelliteData []struct {
SatelliteID uint8 `struct:"uint8:6"`
AmbiguityStatusFlag uint8 `struct:"uint8:2"`
NonSyncCount uint8 `struct:"uint8:3"`
GeometricCarrierPhaseCorrectionDifference int32 `struct:"int32:17"`
IODE uint8 `struct:"uint8"`
IonosphericCarrierPhaseCorrectionDifference int32 `struct:"uint32:17"`
}
}
func DeserializeMessage1017(data []byte) (msg Message1017) {
restruct.Unpack(data, binary.BigEndian, &msg)
return msg
}
func (msg Message1017) Serialize() []byte {
data, _ := restruct.Pack(binary.BigEndian, &msg)
return data
}