Skip to content

Commit

Permalink
reorganize the nmea drivers by message type
Browse files Browse the repository at this point in the history
  • Loading branch information
giumas committed Jan 21, 2024
1 parent 84c24fe commit e1eb91b
Show file tree
Hide file tree
Showing 8 changed files with 136 additions and 103 deletions.
5 changes: 2 additions & 3 deletions hyo2/soundspeed/base/callbacks/abstract_callbacks.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
from abc import ABCMeta, abstractmethod
import logging
from abc import ABCMeta, abstractmethod
from datetime import datetime
from typing import Optional, TYPE_CHECKING

if TYPE_CHECKING:
from hyo2.soundspeed.listener.sis.sis import Sis
from hyo2.soundspeed.listener.nmea.nmea import Nmea


logger = logging.getLogger(__name__)


Expand All @@ -16,7 +15,7 @@ class GeneralAbstractCallbacks(metaclass=ABCMeta):

def __init__(self) -> None:
self.sis_listener = None # type: Optional[Sis]
self.nmea_listener = None # type: Optional[Nmea]
self.nmea_listener = None # type: Optional[Nmea]

@abstractmethod
def ask_number(self, title: Optional[str] = "", msg: Optional[str] = "Enter number", default: Optional[float] = 0.0,
Expand Down
91 changes: 0 additions & 91 deletions hyo2/soundspeed/formats/nmea0183.py

This file was deleted.

Empty file.
45 changes: 45 additions & 0 deletions hyo2/soundspeed/formats/nmea_0183/nmea_0183_gga.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import logging
from hyo2.soundspeed.formats.nmea_0183.nmea_0183_nav_abstract import Nmea0183NavAbstract

logger = logging.getLogger(__name__)


class Nmea0183GGA(Nmea0183NavAbstract):

def __init__(self, data: str) -> None:
super(Nmea0183GGA, self).__init__(data)

def _parse(self) -> None:

self._timestamp = self.msg[1]
self._lat = self.msg[2]
self._lat_dir = self.msg[3]
self._lon = self.msg[4]
self._lon_dir = self.msg[5]
self._gps_qual = self.msg[6]
self._num_sats = self.msg[7]
self._horizontal_dil = self.msg[8]
self._altitude = self.msg[9]
self._altitude_units = self.msg[10]
self._geo_sep = self.msg[11]
self._geo_sep_units = self.msg[12]
self._age_gps_data = self.msg[13]
self._ref_station_id = self.msg[14]

try:
self._latitude = int(self._lat[:2]) + float(self._lat[2:]) / 60.
if self._lat_dir == 'S':
self._latitude = -1.0 * self.latitude
# logger.debug("NMEA 0183 $$GGA lat: {}".format(self.latitude))

except Exception as e:
logger.warning("unable to interpret latitude from %s and %s: %s" % (self._lat, self._lat_dir, e))

try:
self._longitude = int(self._lon[:3]) + float(self._lon[3:]) / 60.
if self._lon_dir == 'W':
self._longitude = -1.0 * self.longitude
# logger.debug("NMEA 0183 $$GGA lon: {}".format(self.longitude))

except Exception as e:
logger.warning("unable to interpret longitude from %s and %s: %s" % (self._lon, self._lon_dir, e))
45 changes: 45 additions & 0 deletions hyo2/soundspeed/formats/nmea_0183/nmea_0183_gll.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import logging
from typing import Optional
from hyo2.soundspeed.formats.nmea_0183.nmea_0183_nav_abstract import Nmea0183NavAbstract

logger = logging.getLogger(__name__)


class Nmea0183GLL(Nmea0183NavAbstract):

def __init__(self, data: str) -> None:
super(Nmea0183GLL, self).__init__(data)

self._lat = Optional[str]
self._lat_dir = Optional[str]
self._lon = Optional[str]
self._lon_dir = Optional[str]
self._timestamp = Optional[str]
self._status = Optional[str]

def _parse(self) -> None:

self._lat = self.msg[1]
self._lat_dir = self.msg[2]
self._lon = self.msg[3]
self._lon_dir = self.msg[4]
self._timestamp = self.msg[5]
self._status = self.msg[6]

try:
self._latitude = int(self._lat[:2]) + float(self._lat[2:]) / 60.
if self._lat_dir == 'S':
self._latitude = -1.0 * self.latitude
# logger.debug("NMEA 0183 $$GLL lat: {}".format(self.latitude))

except Exception as e:
logger.warning("unable to interpret latitude from %s and %s: %s" % (self._lat, self._lat_dir, e))

try:
self._longitude = int(self._lon[:3]) + float(self._lon[3:]) / 60.
if self._lon_dir == 'W':
self._longitude = -1.0 * self.longitude
# logger.debug("NMEA 0183 $$GLL lon: {}".format(self.longitude))

except Exception as e:
logger.warning("unable to interpret longitude from %s and %s: %s" % (self._lon, self._lon_dir, e))
34 changes: 34 additions & 0 deletions hyo2/soundspeed/formats/nmea_0183/nmea_0183_nav_abstract.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import logging
from abc import ABCMeta, abstractmethod
from typing import Optional

logger = logging.getLogger(__name__)


class Nmea0183NavAbstract(metaclass=ABCMeta):

def __init__(self, data: str) -> None:
self.data = data
self.msg = None # type: Optional[list[str]]

self._latitude = None # type: Optional[float]
self._longitude = None # type: Optional[float]

self.msg = self.data.split(',')

self._parse()

@abstractmethod
def _parse(self) -> None:
pass

@property
def latitude(self) -> Optional[float]:
return self._latitude

@property
def longitude(self) -> Optional[float]:
return self._longitude

def __str__(self) -> str:
return "Latitude: %s, longitude: %s" % (self._latitude, self._longitude)
2 changes: 1 addition & 1 deletion hyo2/soundspeed/listener/abstract.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ def __init__(self, port: int = 4001, ip: str = "0.0.0.0", timeout: int = 1,

self.shutdown = Event()
self.sock_in = None
self.data = None
self.data = None # type: Optional[bytes]
self.sender = None

def init_sockets(self) -> bool:
Expand Down
17 changes: 9 additions & 8 deletions hyo2/soundspeed/listener/nmea/nmea.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,9 @@
from datetime import datetime
from typing import Optional, Union

from hyo2.soundspeed.formats.nmea_0183.nmea_0183_gga import Nmea0183GGA
from hyo2.soundspeed.formats.nmea_0183.nmea_0183_gll import Nmea0183GLL
from hyo2.soundspeed.listener.abstract import AbstractListener
from hyo2.soundspeed.formats import nmea0183

logger = logging.getLogger(__name__)

Expand All @@ -16,9 +17,9 @@ def __init__(self, port: int, timeout: int = 1, ip: str = "0.0.0.0",
super(Nmea, self).__init__(port=port, ip=ip, timeout=timeout, target=target, name=name, debug=debug)
self.desc = name

self.nav = None # type: Union[nmea0183.Nmea0183GGA, nmea0183.Nmea0183GLL, None]
self.nav = None # type: Optional[Union[Nmea0183GGA, Nmea0183GLL]]
self.nav_last_time = None # type: Optional[datetime]

@property
def nav_latitude(self) -> Optional[float]:
if self.nav is None:
Expand All @@ -29,7 +30,7 @@ def nav_latitude(self) -> Optional[float]:
def nav_longitude(self) -> Optional[float]:
if self.nav is None:
return None
return self.nav.longitude
return self.nav.longitude

def parse(self) -> None:
this_data = self.data[:].decode("utf-8")
Expand All @@ -39,14 +40,14 @@ def parse(self) -> None:
sentence_type = this_data[3:6]

if sentence_type == 'GGA':
self.nav = nmea0183.Nmea0183GGA(this_data)
self.nav = Nmea0183GGA(this_data)
self.nav_last_time = datetime.utcnow()

elif sentence_type == 'GLL':
self.nav = nmea0183.Nmea0183GLL(this_data)
self.nav = Nmea0183GLL(this_data)
self.nav_last_time = datetime.utcnow()

def __repr__(self):
msg = "%s" % super(Nmea, self).__repr__()
# msg += " <has data loaded: %s>\n" % self.has_data_loaded
msg += " <nav last time: %s>\n" % self.nav_last_time
return msg

0 comments on commit e1eb91b

Please sign in to comment.