Skip to content

Commit 9240a7f

Browse files
committed
add mini GNSS Data analysis
1 parent 3a4f322 commit 9240a7f

File tree

1 file changed

+179
-0
lines changed

1 file changed

+179
-0
lines changed

‎gnss/ugnss.py‎

Lines changed: 179 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,179 @@
1+
'''
2+
mini GNSS Data analysis
3+
4+
'''
5+
6+
class uGNSS():
7+
8+
GNSS_DIR = ('N', 'NNE', 'NE', 'ENE', 'E', 'ESE', 'SE', 'SSE', 'S',
9+
'SSW', 'SW', 'WSW', 'W', 'WNW', 'NW', 'NNW')
10+
GNSS_VALID = (b'1', b'2')
11+
12+
def __init__(self, bufsize = 2048):
13+
14+
self.latitude = 0.0
15+
self.longitude = 0.0
16+
self.latitude_dir = 'N'
17+
self.longitude_dir = 'E'
18+
self.speed = 0.0
19+
self.course = 0.0
20+
self.altitude = 0.0
21+
self.geoid_height = 0.0
22+
self.date = [0, 0, 0]
23+
self.time = [0, 0, 0]
24+
self.datetime = [0, 0, 0, 0, 0, 0, 0, 0]
25+
self.valid = False
26+
self.satellites_in_view = 0
27+
self.satellites_in_use = 0
28+
self.satellites_used = []
29+
self.hdop = 0.0
30+
self.pdop = 0.0
31+
self.vdop = 0.0
32+
self._crc = bytearray(1)
33+
self._buf = bytearray(256)
34+
self._pos = 0
35+
self._seg = []
36+
37+
def DM2DMS(dm):
38+
return
39+
40+
def checksum(self, buf, length):
41+
self._crc[0] = 0
42+
for i in range(1, length):
43+
self._crc[0] ^= buf[i]
44+
try:
45+
d = int(b'0x'+buf[length+1:length+3])
46+
except:
47+
return False
48+
return self._crc[0] == d
49+
50+
def parse(self):
51+
try:
52+
if not self.checksum(self._buf, self._pos-4):
53+
return False
54+
55+
self._seg = bytes(self._buf[1:self._pos-4]).split(b',')
56+
if self._seg[0] in self.GNSS_CMD:
57+
try:
58+
self.GNSS_CMD[self._seg[0]](self)
59+
return True
60+
except:
61+
return False
62+
63+
return False
64+
finally:
65+
self._pos = 0
66+
67+
def update_char(self, c):
68+
if self._pos:
69+
if self._pos > 250:
70+
self._pos = 0
71+
return False
72+
else:
73+
if type(c) is int:
74+
self._buf[self._pos] = c
75+
elif type(c) is str:
76+
self._buf[self._pos] = ord(c)
77+
else:
78+
self._pos = 0
79+
return False
80+
81+
if self._buf[self._pos] == ord('\n'):
82+
return self.parse()
83+
else:
84+
self._pos += 1
85+
else:
86+
if c == '$' or c == ord(b'$'):
87+
self._buf[0] = 36
88+
self._pos = 1
89+
90+
def update(self, dat):
91+
if not dat:
92+
return False
93+
94+
for i in range(len(dat)):
95+
self.update_char(dat[i])
96+
return self.valid
97+
98+
def _time(self, dat):
99+
h, m, s = dat[0:2], dat[2:4], dat[4:6]
100+
self.time = [int(h), int(m), int(s)]
101+
self.datetime[4:7] = self.time
102+
103+
def _date(self, dat):
104+
d, m, y = dat[0:2], dat[2:4], dat[4:6]
105+
self.date = [int(y), int(m), int(d)]
106+
self.datetime[0:3] = self.date
107+
108+
def _latlon(self, dat):
109+
t = float(dat)
110+
d, m = divmod(t, 100)
111+
return d + m/60
112+
113+
def _GNGGA(self):
114+
self._time(self._seg[1])
115+
self.latitude = self._latlon(self._seg[2])
116+
self.latitude_dir = self._seg[3].decode()
117+
self.longitude = self._latlon(self._seg[4])
118+
self.longitude_dir = self._seg[5].decode()
119+
self.valid = self._seg[6] in self.GNSS_VALID
120+
self.satellites_in_use = int(self._seg[7])
121+
self.hdop = float(self._seg[8])
122+
self.altitude = float(self._seg[9])
123+
self.geoid_height = float(self._seg[11])
124+
125+
def _GNRMC(self):
126+
self._time(self._seg[1])
127+
self._date(self._seg[9])
128+
self.valid = (self._seg[2] == b'A')
129+
self.latitude = self._latlon(self._seg[3])
130+
self.latitude_dir = self._seg[4].decode()
131+
self.longitude = self._latlon(self._seg[5])
132+
self.longitude_dir = self._seg[6].decode()
133+
self.speed = float(self._seg[7])
134+
self.course = float(self._seg[8])
135+
136+
def _GNVTG(self):
137+
self.course = float(self._seg[1])
138+
self.speed = float(self._seg[7])
139+
140+
def _GNGLL(self):
141+
self.latitude = self._latlon(self._seg[1])
142+
self.latitude_dir = self._seg[2]
143+
self.longitude = self._latlon(self._seg[3])
144+
self.longitude_dir = self._seg[4]
145+
self._time(self._seg[5])
146+
self.valid = (self._seg[6] == b'A')
147+
148+
def _GNGSA(self):
149+
self.pdop = float(self._seg[15])
150+
self.hdop = float(self._seg[16])
151+
self.vdop = float(self._seg[17])
152+
153+
def _GPGSV(self):
154+
self.satellites_in_view = int(self._seg[3])
155+
156+
GNSS_CMD = {
157+
b'GNGGA': _GNGGA,
158+
b'GNRMC': _GNRMC,
159+
b'GNVTG': _GNVTG,
160+
b'GNGLL': _GNGLL,
161+
b'GPGSV': _GPGSV,
162+
b'GNGSA': _GNGSA
163+
}
164+
165+
def print(self):
166+
print('GNSS valid:', self.valid)
167+
print('lat:', self.latitude, self.latitude_dir)
168+
print('lon:', self.longitude, self.longitude_dir)
169+
print('speed:', self.speed)
170+
print('altitude:', self.altitude, self.geoid_height)
171+
print('hdop:', self.hdop)
172+
print('pdop:', self.pdop)
173+
print('vdop:', self.vdop)
174+
print('UTC:', self.datetime, self.date, self.time)
175+
print('satellites')
176+
print(' in view:', self.satellites_in_view)
177+
print(' in use: ', self.satellites_in_use)
178+
print(' list: ', self.satellites_used)
179+

0 commit comments

Comments
 (0)