124 lines
4.5 KiB
Python
Executable File
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)
|