Py-Ser-gps/render.py
2023-06-17 17:49:43 +02:00

66 lines
1.9 KiB
Python

from ipyleaflet import Map, Marker
import pynmea2
import serial
import io
import gpxpy
import gpxpy.gpx
import signal
import sys
def signal_handler(sig, frame):
gpx_file.write(gpx.to_xml())
gpx_file.truncate()
gpx_file.close()
print("Quitting")
sys.exit(0)
gpx_file = open('track.gpx', 'w')
gpx_file.seek(0)
gpx = gpxpy.gpx.GPX()
gpx_track = gpxpy.gpx.GPXTrack()
gpx.tracks.append(gpx_track)
gpx_segment = gpxpy.gpx.GPXTrackSegment()
gpx_track.segments.append(gpx_segment)
ser = serial.Serial('/dev/ttyACM1', 9600, timeout=5.0)
sio = io.TextIOWrapper(io.BufferedRWPair(ser, ser))
last_time = 0
signal.signal(signal.SIGINT, signal_handler)
while True:
try:
line = sio.readline().rstrip('\n') # Remove newline character
msg = pynmea2.parse(line)
latitude = msg.latitude
longitude = msg.longitude
# altitude = msg.altitude
# time = f"{msg.datestamp}T{msg.timestamp}Z"
except serial.SerialException as e:
# print('Device error: {}'.format(e))
break
except pynmea2.ParseError as e:
# print('Parse error: {}'.format(e))
continue
except Exception as e:
continue
else:
if last_time == 0:
center = (latitude, longitude)
m = Map(center=center, zoom=15)
marker = Marker(location=center, draggable=False)
m.add_layer(marker)
display(m)
last_time = time
last_latitude=latitude
last_longitude=longitude
gpx_segment.points.append(gpxpy.gpx.GPXTrackPoint(latitude, longitude))
else:
marker.location = (latitude, longitude)
last_time = time
if not last_latitude==latitude or not last_longitude==longitude:
gpx_segment.points.append(gpxpy.gpx.GPXTrackPoint(latitude, longitude))
print("Added gpx point")
last_latitude=latitude
last_longitude=longitude