|
|
@ -4,6 +4,7 @@ import sys |
|
|
|
import signal |
|
|
|
import signal |
|
|
|
import itertools |
|
|
|
import itertools |
|
|
|
import math |
|
|
|
import math |
|
|
|
|
|
|
|
import time |
|
|
|
from typing import NoReturn |
|
|
|
from typing import NoReturn |
|
|
|
from struct import unpack_from, calcsize |
|
|
|
from struct import unpack_from, calcsize |
|
|
|
|
|
|
|
|
|
|
@ -18,6 +19,8 @@ from selfdrive.sensord.rawgps.structs import glonass_measurement_report, glonass |
|
|
|
from selfdrive.sensord.rawgps.structs import LOG_GNSS_GPS_MEASUREMENT_REPORT, LOG_GNSS_GLONASS_MEASUREMENT_REPORT |
|
|
|
from selfdrive.sensord.rawgps.structs import LOG_GNSS_GPS_MEASUREMENT_REPORT, LOG_GNSS_GLONASS_MEASUREMENT_REPORT |
|
|
|
from selfdrive.sensord.rawgps.structs import position_report, LOG_GNSS_POSITION_REPORT |
|
|
|
from selfdrive.sensord.rawgps.structs import position_report, LOG_GNSS_POSITION_REPORT |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DEBUG = int(os.getenv("DEBUG", "0"))==1 |
|
|
|
|
|
|
|
|
|
|
|
miscStatusFields = { |
|
|
|
miscStatusFields = { |
|
|
|
"multipathEstimateIsValid": 0, |
|
|
|
"multipathEstimateIsValid": 0, |
|
|
|
"directionIsValid": 1, |
|
|
|
"directionIsValid": 1, |
|
|
@ -78,6 +81,8 @@ def main() -> NoReturn: |
|
|
|
log_types.append(LOG_GNSS_POSITION_REPORT) |
|
|
|
log_types.append(LOG_GNSS_POSITION_REPORT) |
|
|
|
pub_types.append("gpsLocationExternal") |
|
|
|
pub_types.append("gpsLocationExternal") |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# disable DPO power savings for more accuracy |
|
|
|
|
|
|
|
os.system("mmcli -m 0 --command='AT+QGPSCFG=\"dpoenable\",0'") |
|
|
|
os.system("mmcli -m 0 --location-enable-gps-raw --location-enable-gps-nmea") |
|
|
|
os.system("mmcli -m 0 --location-enable-gps-raw --location-enable-gps-nmea") |
|
|
|
diag = ModemDiag() |
|
|
|
diag = ModemDiag() |
|
|
|
|
|
|
|
|
|
|
@ -112,8 +117,8 @@ def main() -> NoReturn: |
|
|
|
assert log_inner_length == len(inner_log_packet) |
|
|
|
assert log_inner_length == len(inner_log_packet) |
|
|
|
if log_type not in log_types: |
|
|
|
if log_type not in log_types: |
|
|
|
continue |
|
|
|
continue |
|
|
|
#print("got log: %x" % log_type) |
|
|
|
if DEBUG: |
|
|
|
|
|
|
|
print("%.2f: got log: %x len %d" % (time.time(), log_type, len(log_payload))) |
|
|
|
if log_type == LOG_GNSS_POSITION_REPORT: |
|
|
|
if log_type == LOG_GNSS_POSITION_REPORT: |
|
|
|
report = unpack_position(log_payload) |
|
|
|
report = unpack_position(log_payload) |
|
|
|
if report["u_PosSource"] != 2: |
|
|
|
if report["u_PosSource"] != 2: |
|
|
@ -171,29 +176,30 @@ def main() -> NoReturn: |
|
|
|
pass |
|
|
|
pass |
|
|
|
else: |
|
|
|
else: |
|
|
|
setattr(report, k, v) |
|
|
|
setattr(report, k, v) |
|
|
|
assert len(sats)//dat['svCount'] == size_meas_sv |
|
|
|
|
|
|
|
report.init('sv', dat['svCount']) |
|
|
|
report.init('sv', dat['svCount']) |
|
|
|
for i in range(dat['svCount']): |
|
|
|
if dat['svCount'] > 0: |
|
|
|
sv = report.sv[i] |
|
|
|
assert len(sats)//dat['svCount'] == size_meas_sv |
|
|
|
sv.init('measurementStatus') |
|
|
|
for i in range(dat['svCount']): |
|
|
|
sat = unpack_meas_sv(sats[size_meas_sv*i:size_meas_sv*(i+1)]) |
|
|
|
sv = report.sv[i] |
|
|
|
for k,v in sat.items(): |
|
|
|
sv.init('measurementStatus') |
|
|
|
if k == "parityErrorCount": |
|
|
|
sat = unpack_meas_sv(sats[size_meas_sv*i:size_meas_sv*(i+1)]) |
|
|
|
sv.gpsParityErrorCount = v |
|
|
|
for k,v in sat.items(): |
|
|
|
elif k == "frequencyIndex": |
|
|
|
if k == "parityErrorCount": |
|
|
|
sv.glonassFrequencyIndex = v |
|
|
|
sv.gpsParityErrorCount = v |
|
|
|
elif k == "hemmingErrorCount": |
|
|
|
elif k == "frequencyIndex": |
|
|
|
sv.glonassHemmingErrorCount = v |
|
|
|
sv.glonassFrequencyIndex = v |
|
|
|
elif k == "measurementStatus": |
|
|
|
elif k == "hemmingErrorCount": |
|
|
|
for kk,vv in itertools.chain(*measurement_status_fields): |
|
|
|
sv.glonassHemmingErrorCount = v |
|
|
|
setattr(sv.measurementStatus, kk, bool(v & (1<<vv))) |
|
|
|
elif k == "measurementStatus": |
|
|
|
elif k == "miscStatus": |
|
|
|
for kk,vv in itertools.chain(*measurement_status_fields): |
|
|
|
for kk,vv in miscStatusFields.items(): |
|
|
|
setattr(sv.measurementStatus, kk, bool(v & (1<<vv))) |
|
|
|
setattr(sv.measurementStatus, kk, bool(v & (1<<vv))) |
|
|
|
elif k == "miscStatus": |
|
|
|
elif k == "pad": |
|
|
|
for kk,vv in miscStatusFields.items(): |
|
|
|
pass |
|
|
|
setattr(sv.measurementStatus, kk, bool(v & (1<<vv))) |
|
|
|
else: |
|
|
|
elif k == "pad": |
|
|
|
setattr(sv, k, v) |
|
|
|
pass |
|
|
|
|
|
|
|
else: |
|
|
|
|
|
|
|
setattr(sv, k, v) |
|
|
|
|
|
|
|
|
|
|
|
pm.send('qcomGnss', msg) |
|
|
|
pm.send('qcomGnss', msg) |
|
|
|
|
|
|
|
|
|
|
|