import time import datetime import serial import adafruit_gps import logging from pa1010d import PA1010D class GPSAdafruit: def __init__(self) -> None: uart = serial.Serial("/dev/ttyS0", baudrate=9600, timeout=3000) self.gps = adafruit_gps.GPS(uart, debug=False) self.gps.send_command(b"PMTK314,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0") self.gps.send_command(b"PMTK220,1000") self.is_gps_up = True def get_gps_data(self) -> dict: if not self.is_gps_up: raise OSError("GPS is not up!") else: self.gps.update() if not self.gps.has_fix: logging.error("No fix on GPS!") return {"error": "No fix"} else: timestamp_obj = self.gps.timestamp_utc return_dict = { "location": {"lat": self.gps.latitude, "lon": self.gps.longitude, "alt": self.gps.altitude_m}, "timestamp": {"year": timestamp_obj.tm_year, "month": timestamp_obj.tm_mon, "day": timestamp_obj.tm_mday, "hour": timestamp_obj.tm_hour, "minute": timestamp_obj.tm_min, "second": timestamp_obj.tm_sec}, "diags": {"satellites": self.gps.satellites, "knots": self.gps.speed_knots, "track_angle": self.gps.track_angle_deg, "horizontal_dilution": self.gps.horizontal_dilution, "height_geoid": self.gps.height_geoid}, "error": None } return return_dict class GPSPimori: def __init__(self) -> None: self.gps = PA1010D() def get_gps_data(self) -> dict: result = self.gps.update() if result: data = self.gps.data return_dict = { "location": {"lat": 0, "lon": 0, "alt": 0, "velocity": 0}, "diags": {"satellites": 0, "quality": 0, "knots": 0}, "error": 'No Fix' } if data['num_sats'] == None: # logging.error("No fix on GPS!") return return_dict elif int(data['num_sats']) < 3: # logging.error("No fix on GPS!") return return_dict else: return_dict = { "location": {"lat": data['latitude'], "lon": data['longitude'], "alt": data['altitude'], "velocity": data['speed_over_ground'] }, "timestamp": data['timestamp'], "diags": {"satellites": data['num_sats'], "quality": data['gps_qual'], "knots": data['speed_over_ground']}, "error": None } return return_dict class GPSFake: class GPS: def __init__(self) -> None: self.latitude = 0.0 self.longitude = 0.0 self.time = datetime.datetime() self.has_fix = True def __init__(self) -> None: self.gps = self.GPS() def get_gps_data(self) -> dict: if not self.gps.has_fix: # logging.error("No fix on GPS!") return {"error": "No fix"} else: return_dict = { "location": {"lat": self.gps.latitude, "lon": self.gps.longitude, "alt": None}, "timestamp": self.gps.time, "diags": {"satellites": None, "quality": None, "knots": None}, "error": None } return return_dict def set_gps_data(self, data: dict) -> None: ''' data = {'lat': , 'lon': , 'time': , 'fix': } ''' self.gps.latitude = data.get('lat', self.gps.latitude) self.gps.longitude = data.get('lon', self.gps.longitude) self.gps.time = data.get('time', datetime.datetime()) self.gps.has_fix = data.get('fix', self.gps.has_fix)