rawgps: fix crash, disable DPO

old-commit-hash: 98cde5848e
taco
Comma Device 3 years ago
parent af38179430
commit a014a4b18e
  1. 54
      selfdrive/sensord/rawgps/rawgpsd.py

@ -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)

Loading…
Cancel
Save