|
53 | 53 | _GSV15 = 7
|
54 | 54 | _GSV19 = 8
|
55 | 55 | _RMC_4_1 = 9
|
| 56 | +_VTG = 10 |
56 | 57 | _ST_MIN = _GLL
|
57 |
| -_ST_MAX = _RMC_4_1 |
| 58 | +_ST_MAX = _VTG |
58 | 59 |
|
59 | 60 | _SENTENCE_PARAMS = (
|
60 | 61 | # 0 - _GLL
|
|
77 | 78 | "iiiiiiIiiiIiiiIiiiI",
|
78 | 79 | # 9 - _RMC_4_1
|
79 | 80 | "scdcdcffsDCCC",
|
| 81 | + # 10 - _VTG |
| 82 | + "fcFCfcfcC", |
80 | 83 | )
|
81 | 84 |
|
82 | 85 |
|
@@ -202,6 +205,12 @@ def _parse_data(sentence_type: int, data: List[str]) -> Optional[List]:
|
202 | 205 | elif pti == "f":
|
203 | 206 | # A floating point number
|
204 | 207 | params.append(_parse_float(dti))
|
| 208 | + elif pti == "F": |
| 209 | + # A floating point number or Nothing |
| 210 | + if nothing: |
| 211 | + params.append(None) |
| 212 | + else: |
| 213 | + params.append(_parse_float(dti)) |
205 | 214 | elif pti == "i":
|
206 | 215 | # An integer
|
207 | 216 | params.append(_parse_int(dti))
|
@@ -289,6 +298,8 @@ def __init__(self, uart: UART, debug: bool = False) -> None:
|
289 | 298 | """Geoidal separation relative to WGS 84"""
|
290 | 299 | self.speed_knots = None
|
291 | 300 | """Ground speed in knots"""
|
| 301 | + self.speed_kmh = None |
| 302 | + """Ground speed in km/h""" |
292 | 303 | self.track_angle_deg = None
|
293 | 304 | """Track angle in degrees"""
|
294 | 305 | self._sats = None # Temporary holder for information from GSV messages
|
@@ -368,6 +379,8 @@ def update(self) -> bool:
|
368 | 379 | result = self._parse_gsv(talker, args)
|
369 | 380 | elif sentence_type == b"GSA": # GPS DOP and active satellites
|
370 | 381 | result = self._parse_gsa(talker, args)
|
| 382 | + elif sentence_type == b"VTG": # Ground speed |
| 383 | + result = self._parse_vtg(args) |
371 | 384 |
|
372 | 385 | return result
|
373 | 386 |
|
@@ -499,6 +512,30 @@ def _update_timestamp_utc(self, time_utc: str, date: Optional[str] = None) -> No
|
499 | 512 | (year, month, day, hours, mins, secs, 0, 0, -1)
|
500 | 513 | )
|
501 | 514 |
|
| 515 | + def _parse_vtg(self, data: List[str]) -> bool: |
| 516 | + # VTG - Course Over Ground and Ground Speed |
| 517 | + |
| 518 | + if data is None or len(data) != 9: |
| 519 | + return False # Unexpected number of params |
| 520 | + |
| 521 | + parsed_data = _parse_data(_VTG, data) |
| 522 | + if parsed_data is None: |
| 523 | + return False # Params didn't parse |
| 524 | + |
| 525 | + # Track made good, degrees true |
| 526 | + self.track_angle_deg = parsed_data[0] |
| 527 | + |
| 528 | + # Speed over ground, knots |
| 529 | + self.speed_knots = parsed_data[4] |
| 530 | + |
| 531 | + # Speed over ground, kilometers / hour |
| 532 | + self.speed_kmh = parsed_data[6] |
| 533 | + |
| 534 | + # Parse FAA mode indicator |
| 535 | + self._mode_indicator = parsed_data[8] |
| 536 | + |
| 537 | + return True |
| 538 | + |
502 | 539 | def _parse_gll(self, data: List[str]) -> bool:
|
503 | 540 | # GLL - Geographic Position - Latitude/Longitude
|
504 | 541 |
|
|
0 commit comments