pecanpico9/decoder/position.py

84 wiersze
2.7 KiB
Python

from datetime import datetime,timedelta,timezone
import sqlite3
import base91
def insert_log(sqlite, call, data):
if len(data)/10*10 != len(data): # Is not multiple of 8 bytes
return # APRS message sampled too short
for i in range(int(len(data)/10)):
tim = (data[i*10+3] << 24) | (data[i*10+2] << 16) | (data[i*10+1] << 8) | data[i*10+0]
lat = (data[i*10+5] << 8) | data[i*10+4]
lon = (data[i*10+7] << 8) | data[i*10+6]
alt = (data[i*10+9] << 8) | data[i*10+8]
lat = float(lat * 180) / 65536 - 90
lon = float(lon * 360) / 65536 - 180
tim_stringified = datetime.utcfromtimestamp(tim).strftime("%Y-%m-%d %H:%M:%S")
try:
sqlite.cursor().execute("INSERT OR FAIL INTO position (call,time,org,lat,lon,alt) VALUES (?,?,'log',?,?,?)", (call, tim, lat, lon, alt))
print("Decoded log from %s time %s => lat=%06.3f lon=%07.3f alt=%05d" % (call, tim_stringified, lat, lon, alt))
except sqlite3.IntegrityError:
print("Decoded log from %s time %s => lat=%06.3f lon=%07.3f alt=%05d already in db" % (call, tim_stringified, lat, lon, alt))
sqlite.commit()
def decode_position(tim, posi, tel):
# Decode latitude
y3 = ord(posi[1]) - 33
y2 = ord(posi[2]) - 33
y1 = ord(posi[3]) - 33
y0 = ord(posi[4]) - 33
ye = y0 + y1*91 + y2*8281 + y3*753571
y = -ye / 380926.0 + 90
# Decode longitude
x3 = ord(posi[5]) - 33
x2 = ord(posi[6]) - 33
x1 = ord(posi[7]) - 33
x0 = ord(posi[8]) - 33
xe = x0 + x1*91 + x2*8281 + x3*753571
x = xe / 190463.0 - 180
# Decode altitude
z1 = ord(posi[10]) - 33
z0 = ord(posi[11]) - 33
ze = z0 + z1*91
z = pow(1.002, ze) / 3.281
# Decode time
timd = datetime.now()
timd = timd.replace(hour = int(tim[0:2]), minute = int(tim[2:4]), second = int(tim[4:6]), microsecond=0)
if datetime.utcnow() < timd: # Packet was sampled yesterday
timd -= timedelta(1)
# Decode telemetry
teld = [0]*6
if tel != None:
for i in range(6):
t1 = ord(tel[i*2+0]) - 33
t0 = ord(tel[i*2+1]) - 33
teld.append(t0 + t1*91)
return timd,x,y,z,teld
def insert_position(sqlite, call, tim, posi, comm, tel): #sqlite, call, data
# Decode
timd,x,y,z,teld = decode_position(tim, posi, tel)
# Insert
sqlite.cursor().execute("""
INSERT OR REPLACE INTO position (call,time,org,lat,lon,alt,comment,sequ,tel1,tel2,tel3,tel4,tel5)
VALUES (?,?,'pos',?,?,?,?,?,?,?,?,?,?)""",
(call, int(timd.timestamp()), y, x, int(z), comm, teld[0], teld[1], teld[2], teld[3], teld[4], teld[5])
)
sqlite.commit()
# Debug
tim_stringified = timd.strftime("%Y-%m-%d %H:%M:%S")
print("Decoded position from %s time %s => lat=%f lon=%f alt=%d comment=%s, sequ=%d tel=[%d,%d,%d,%d,%d]"
% (call, tim_stringified, y, x, z, comm, teld[0], teld[1], teld[2], teld[3], teld[4], teld[5]))