new_thea/Legacy/src/GPS.py
2021-09-21 12:11:46 +01:00

124 lines
4.5 KiB
Python
Executable File

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': <latitude>,
'lon': <longtitude>,
'time': <datetime>,
'fix': <bool: has_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)