130 lines
3.9 KiB
Plaintext
130 lines
3.9 KiB
Plaintext
import serial
|
|
|
|
class pyGPS:
|
|
def __init__(self, port="/dev/ttyACM3", baud=9600):
|
|
self.ser = serial.Serial(port=port, baudrate=baud)
|
|
|
|
|
|
def get_raw(self):
|
|
return self.ser.readline().decode("utf-8").strip()
|
|
|
|
def get_time(self):
|
|
while True:
|
|
line = self.ser.readline().decode("utf-8").strip()
|
|
if line.startswith("$GPRMC"):
|
|
parts = line.split(",")
|
|
|
|
status = parts[2]
|
|
if status == "A":
|
|
time = parts[1]
|
|
|
|
hours = int(time[0:2])
|
|
minutes = int(time[2:4])
|
|
seconds = float(time[4:])
|
|
|
|
sec_int = int(seconds)
|
|
return f"{hours:02d}:{minutes:02d}:{sec_int:02d}"
|
|
else:
|
|
return f"00:00:00"
|
|
|
|
def get_lat(self):
|
|
while True:
|
|
line = self.ser.readline().decode("utf-8").strip()
|
|
if line.startswith("$GPRMC"):
|
|
parts = line.split(",")
|
|
|
|
status = parts[2]
|
|
if status == "A":
|
|
lat = parts[3]
|
|
lat_dir = parts[4]
|
|
|
|
degrees = int(lat[:2])
|
|
minutes_full = float(lat[2:])
|
|
|
|
minutes = int(minutes_full)
|
|
seconds = (minutes_full-minutes)*60
|
|
|
|
return f"{degrees}° {minutes:02d}' {seconds:05.2f}\" {lat_dir}"
|
|
else:
|
|
return "000° 00' 00.00\""
|
|
|
|
def get_lon(self):
|
|
while True:
|
|
line = self.ser.readline().decode("utf-8").strip()
|
|
if line.startswith("$GPRMC"):
|
|
parts = line.split(",")
|
|
|
|
status = parts[2]
|
|
if status == "A":
|
|
|
|
lon = parts[5]
|
|
lon_dir = parts[6]
|
|
|
|
degrees = int(lon[:3])
|
|
minutes_full = float(lon[3:])
|
|
|
|
minutes = int(minutes_full)
|
|
seconds = (minutes_full-minutes)*60
|
|
|
|
return f"{degrees:03d}° {minutes:02d}' {seconds:05.2f}\" {lon_dir}"
|
|
else:
|
|
return "000° 00' 00.00\""
|
|
|
|
def get_speed_kn(self):
|
|
while True:
|
|
line = self.ser.readline().decode("utf-8").strip()
|
|
if line.startswith("$GPRMC"):
|
|
parts = line.split(",")
|
|
|
|
status = parts[2]
|
|
if status == "A":
|
|
return round(float(parts[7]), 2)
|
|
return 0
|
|
|
|
def get_speed(self):
|
|
while True:
|
|
line = self.ser.readline().decode("utf-8").strip()
|
|
if line.startswith("$GPRMC"):
|
|
parts = line.split(",")
|
|
|
|
status = parts[2]
|
|
if status == "A":
|
|
return float(parts[7])
|
|
return 0
|
|
|
|
def get_speed_kmh(self):
|
|
while True:
|
|
return round((float(self.get_speed()) * 1.852),2)
|
|
|
|
def get_speed_ms(self):
|
|
while True:
|
|
return round((float(self.get_speed()) * 0.514444),2)
|
|
|
|
def get_course(self):
|
|
while True:
|
|
line = self.ser.readline().decode("utf-8").strip()
|
|
if line.startswith("$GPRMC"):
|
|
parts = line.split(",")
|
|
|
|
status = parts[2]
|
|
if status == "A":
|
|
|
|
course = parts[8]
|
|
if course == "":
|
|
course = "---"
|
|
return course
|
|
else:
|
|
return 0
|
|
|
|
def get_date(self):
|
|
while True:
|
|
line = self.ser.readline().decode("utf-8").strip()
|
|
if line.startswith("$GPRMC"):
|
|
parts = line.split(",")
|
|
status = parts[2]
|
|
if status == "A":
|
|
date = parts[9]
|
|
return f"{date[0:2]}.{date[2:4]}.{date[4:6]}"
|
|
return "00.00.0000"
|
|
|