mirror of
https://github.com/sunnypilot/sunnypilot.git
synced 2026-10-01 01:43:41 +08:00
Merge remote-tracking branch 'commaai/openpilot/master' into sync-20240201
This commit is contained in:
@@ -1,105 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import argparse
|
||||
from openpilot.common.basedir import BASEDIR
|
||||
|
||||
from openpilot.tools.lib.logreader import MultiLogIterator
|
||||
from openpilot.tools.lib.route import Route
|
||||
from openpilot.selfdrive.car.fw_versions import match_fw_to_car
|
||||
from openpilot.selfdrive.car.interfaces import get_interface_attr
|
||||
|
||||
|
||||
ALL_FW_VERSIONS = get_interface_attr("FW_VERSIONS")
|
||||
ALL_CARS = get_interface_attr("CAR")
|
||||
|
||||
PLATFORM_TO_PYTHON_CAR_NAME = {brand: {car.value: car.name for car in ALL_CARS[brand]} for brand in ALL_CARS}
|
||||
BRAND_TO_PLATFORMS = {brand: [car.value for car in ALL_CARS[brand]] for brand in ALL_CARS}
|
||||
PLATFORM_TO_BRAND = dict(sum([[(platform, brand) for platform in BRAND_TO_PLATFORMS[brand]] for brand in BRAND_TO_PLATFORMS], []))
|
||||
|
||||
def add_fw_versions(brand, platform, new_fw_versions):
|
||||
filename = f"{BASEDIR}/selfdrive/car/{brand}/values.py"
|
||||
with open(filename, "r") as f:
|
||||
values_py = f.read()
|
||||
|
||||
for key in new_fw_versions.keys():
|
||||
ecu, addr, subAddr = key
|
||||
fw_version = new_fw_versions[key]
|
||||
|
||||
platform_start = values_py.index(f"CAR.{PLATFORM_TO_PYTHON_CAR_NAME[brand][platform]}: {{")
|
||||
|
||||
start = values_py.index(f"(Ecu.{ecu}, {hex(addr)}, {subAddr}): [", platform_start)
|
||||
|
||||
try:
|
||||
end_str = "],\n"
|
||||
end = values_py.index(end_str, start)
|
||||
except ValueError:
|
||||
end_str = "]\n"
|
||||
end = values_py.index(end_str, start)
|
||||
|
||||
values_py = values_py[:end] + f" {fw_version},\n " + values_py[end:]
|
||||
|
||||
with open(filename, "w") as f:
|
||||
f.write(values_py)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
parser = argparse.ArgumentParser(description="Auto fingerprint from a route")
|
||||
parser.add_argument("route", help="The route name to use")
|
||||
parser.add_argument("platform", help="The platform, or leave empty to auto-determine using fuzzy", default=None, nargs='?')
|
||||
args = parser.parse_args()
|
||||
|
||||
route = Route(args.route)
|
||||
lr = MultiLogIterator(route.qlog_paths())
|
||||
|
||||
carFw = None
|
||||
carVin = None
|
||||
carPlatform = None
|
||||
|
||||
for msg in lr:
|
||||
if msg.which() == "carParams":
|
||||
carFw = msg.carParams.carFw
|
||||
carVin = msg.carParams.carVin
|
||||
carPlatform = msg.carParams.carFingerprint
|
||||
break
|
||||
|
||||
if carFw is None:
|
||||
raise Exception("No fw versions in the provided route...")
|
||||
|
||||
if args.platform is None: # attempt to auto-determine platform with other fuzzy fingerprints
|
||||
_, possible_platforms = match_fw_to_car(carFw, log=False)
|
||||
|
||||
if len(possible_platforms) != 1:
|
||||
print(f"Unable to auto-determine platform, possible platforms: {possible_platforms}")
|
||||
|
||||
if carPlatform != "mock":
|
||||
print("Using platform from route")
|
||||
platform = carPlatform
|
||||
else:
|
||||
raise Exception("unable to determine platform, try manually specifying the fingerprint.")
|
||||
else:
|
||||
platform = list(possible_platforms)[0]
|
||||
|
||||
else:
|
||||
platform = args.platform
|
||||
|
||||
print("Attempting to add fw version for: ", platform)
|
||||
|
||||
brand = PLATFORM_TO_BRAND[platform]
|
||||
|
||||
new_fw_versions = {}
|
||||
|
||||
for fw in carFw:
|
||||
if fw.brand == brand:
|
||||
addr = fw.address
|
||||
subAddr = None if fw.subAddress == 0 else fw.subAddress
|
||||
key = (fw.ecu.raw, addr, subAddr)
|
||||
|
||||
if key in ALL_FW_VERSIONS[brand][platform]:
|
||||
fw_versions = set(ALL_FW_VERSIONS[brand][platform][key])
|
||||
if fw.fwVersion not in fw_versions:
|
||||
new_fw_versions[(fw.ecu, addr, subAddr)] = fw.fwVersion
|
||||
|
||||
if not new_fw_versions:
|
||||
print("No new fw versions found...")
|
||||
|
||||
add_fw_versions(brand, platform, new_fw_versions)
|
||||
@@ -3,10 +3,11 @@ import argparse
|
||||
import binascii
|
||||
import time
|
||||
from collections import defaultdict
|
||||
from typing import Optional
|
||||
|
||||
import cereal.messaging as messaging
|
||||
from openpilot.selfdrive.debug.can_table import can_table
|
||||
from openpilot.tools.lib.logreader import logreader_from_route_or_segment
|
||||
from openpilot.tools.lib.logreader import LogIterable, LogReader
|
||||
|
||||
RED = '\033[91m'
|
||||
CLEAR = '\033[0m'
|
||||
@@ -95,13 +96,15 @@ if __name__ == "__main__":
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
init_lr, new_lr = None, None
|
||||
init_lr: Optional[LogIterable] = None
|
||||
new_lr: Optional[LogIterable] = None
|
||||
|
||||
if args.init:
|
||||
if args.init == '':
|
||||
init_lr = []
|
||||
else:
|
||||
init_lr = logreader_from_route_or_segment(args.init)
|
||||
init_lr = LogReader(args.init)
|
||||
if args.comp:
|
||||
new_lr = logreader_from_route_or_segment(args.comp)
|
||||
new_lr = LogReader(args.comp)
|
||||
|
||||
can_printer(args.bus, init_msgs=init_lr, new_msgs=new_lr, table=args.table)
|
||||
|
||||
@@ -4,16 +4,12 @@ import math
|
||||
import datetime
|
||||
from collections import Counter
|
||||
from pprint import pprint
|
||||
from tqdm import tqdm
|
||||
from typing import List, Tuple, cast
|
||||
|
||||
from cereal.services import SERVICE_LIST
|
||||
from openpilot.tools.lib.route import Route
|
||||
from openpilot.tools.lib.logreader import LogReader
|
||||
from openpilot.tools.lib.logreader import LogReader, ReadMode
|
||||
|
||||
if __name__ == "__main__":
|
||||
r = Route(sys.argv[1])
|
||||
|
||||
cnt_valid: Counter = Counter()
|
||||
cnt_events: Counter = Counter()
|
||||
|
||||
@@ -24,31 +20,29 @@ if __name__ == "__main__":
|
||||
start_time = math.inf
|
||||
end_time = -math.inf
|
||||
ignition_off = None
|
||||
for q in tqdm(r.qlog_paths()):
|
||||
if q is None:
|
||||
continue
|
||||
lr = list(LogReader(q))
|
||||
for msg in lr:
|
||||
end_time = max(end_time, msg.logMonoTime)
|
||||
start_time = min(start_time, msg.logMonoTime)
|
||||
for msg in LogReader(sys.argv[1], ReadMode.QLOG):
|
||||
end_time = max(end_time, msg.logMonoTime)
|
||||
start_time = min(start_time, msg.logMonoTime)
|
||||
|
||||
if msg.which() == 'carEvents':
|
||||
for e in msg.carEvents:
|
||||
cnt_events[e.name] += 1
|
||||
elif msg.which() == 'controlsState':
|
||||
if len(alerts) == 0 or alerts[-1][1] != msg.controlsState.alertType:
|
||||
if msg.which() == 'onroadEvents':
|
||||
for e in msg.onroadEvents:
|
||||
cnt_events[e.name] += 1
|
||||
elif msg.which() == 'controlsState':
|
||||
at = msg.controlsState.alertType
|
||||
if "/override" not in at or "lanechange" in at.lower():
|
||||
if len(alerts) == 0 or alerts[-1][1] != at:
|
||||
t = (msg.logMonoTime - start_time) / 1e9
|
||||
alerts.append((t, msg.controlsState.alertType))
|
||||
elif msg.which() == 'pandaStates':
|
||||
if ignition_off is None:
|
||||
ign = any(ps.ignitionLine or ps.ignitionCan for ps in msg.pandaStates)
|
||||
if not ign:
|
||||
ignition_off = msg.logMonoTime
|
||||
elif msg.which() in cams:
|
||||
cnt_cameras[msg.which()] += 1
|
||||
alerts.append((t, at))
|
||||
elif msg.which() == 'pandaStates':
|
||||
if ignition_off is None:
|
||||
ign = any(ps.ignitionLine or ps.ignitionCan for ps in msg.pandaStates)
|
||||
if not ign:
|
||||
ignition_off = msg.logMonoTime
|
||||
elif msg.which() in cams:
|
||||
cnt_cameras[msg.which()] += 1
|
||||
|
||||
if not msg.valid:
|
||||
cnt_valid[msg.which()] += 1
|
||||
if not msg.valid:
|
||||
cnt_valid[msg.which()] += 1
|
||||
|
||||
duration = (end_time - start_time) / 1e9
|
||||
|
||||
|
||||
@@ -54,9 +54,8 @@ def cycle_alerts(duration=200, is_metric=False):
|
||||
CS = car.CarState.new_message()
|
||||
CP = CarInterface.get_non_essential_params("HONDA CIVIC 2016")
|
||||
sm = messaging.SubMaster(['deviceState', 'pandaStates', 'roadCameraState', 'modelV2', 'liveCalibration',
|
||||
'driverMonitoringState', 'longitudinalPlan', 'lateralPlan', 'liveLocationKalman',
|
||||
'managerState', 'longitudinalPlanSP', 'lateralPlanSPDEPRECATED',
|
||||
'driverMonitoringStateSP'] + cameras)
|
||||
'driverMonitoringState', 'longitudinalPlan', 'liveLocationKalman',
|
||||
'managerState', 'longitudinalPlanSP', 'driverMonitoringStateSP'] + cameras)
|
||||
|
||||
pm = messaging.PubMaster(['controlsState', 'pandaStates', 'deviceState'])
|
||||
|
||||
|
||||
+46
@@ -0,0 +1,46 @@
|
||||
#!/usr/bin/env python3
|
||||
import argparse
|
||||
|
||||
from openpilot.tools.lib.logreader import LogReader, ReadMode
|
||||
from panda.python import uds
|
||||
|
||||
|
||||
def main(route: str, addrs: list[int]):
|
||||
"""
|
||||
TODO:
|
||||
- highlight TX vs RX clearly
|
||||
- disambiguate sendcan and can (useful to know if something sent on sendcan made it to the bus on can->128)
|
||||
- print as fixed width table, easier to read
|
||||
"""
|
||||
|
||||
lr = LogReader(route, default_mode=ReadMode.RLOG)
|
||||
|
||||
start_mono_time = None
|
||||
prev_mono_time = 0
|
||||
|
||||
# include rx addresses
|
||||
addrs = addrs + [uds.get_rx_addr_for_tx_addr(addr) for addr in addrs]
|
||||
|
||||
for msg in lr:
|
||||
if msg.which() == 'can':
|
||||
if start_mono_time is None:
|
||||
start_mono_time = msg.logMonoTime
|
||||
|
||||
if msg.which() in ("can", 'sendcan'):
|
||||
for can in getattr(msg, msg.which()):
|
||||
if can.address in addrs:
|
||||
if msg.logMonoTime != prev_mono_time:
|
||||
print()
|
||||
prev_mono_time = msg.logMonoTime
|
||||
print(f"{msg.logMonoTime} rxaddr={can.address}, bus={can.src}, {round((msg.logMonoTime - start_mono_time) * 1e-6, 2)} ms, " +
|
||||
f"0x{can.dat.hex()}, {can.dat}, {len(can.dat)=}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
parser = argparse.ArgumentParser(description='View back and forth ISO-TP communication between various ECUs given an address')
|
||||
parser.add_argument('route', help='Route name')
|
||||
parser.add_argument('addrs', nargs='*', help='List of tx address to view (0x7e0 for engine)')
|
||||
args = parser.parse_args()
|
||||
|
||||
addrs = [int(addr, base=16) if addr.startswith('0x') else int(addr) for addr in args.addrs]
|
||||
main(args.route, addrs)
|
||||
@@ -1,11 +1,9 @@
|
||||
#!/usr/bin/env python3
|
||||
import os
|
||||
import argparse
|
||||
import json
|
||||
|
||||
import cereal.messaging as messaging
|
||||
from openpilot.tools.lib.logreader import LogReader
|
||||
from openpilot.tools.lib.route import Route
|
||||
|
||||
LEVELS = {
|
||||
"DEBUG": 10,
|
||||
@@ -53,31 +51,18 @@ if __name__ == "__main__":
|
||||
parser.add_argument("route", type=str, nargs='*', help="route name + segment number for offline usage")
|
||||
args = parser.parse_args()
|
||||
|
||||
logs = None
|
||||
if len(args.route):
|
||||
if os.path.exists(args.route[0]):
|
||||
logs = [args.route[0]]
|
||||
else:
|
||||
r = Route(args.route[0])
|
||||
logs = [q_log if r_log is None else r_log for (q_log, r_log) in zip(r.qlog_paths(), r.log_paths(), strict=True)]
|
||||
|
||||
if len(args.route) == 2 and logs:
|
||||
n = int(args.route[1])
|
||||
logs = [logs[n]]
|
||||
|
||||
min_level = LEVELS[args.level]
|
||||
|
||||
if logs:
|
||||
for log in logs:
|
||||
if log:
|
||||
lr = LogReader(log)
|
||||
for m in lr:
|
||||
if m.which() == 'logMessage':
|
||||
print_logmessage(m.logMonoTime, m.logMessage, min_level)
|
||||
elif m.which() == 'errorLogMessage' and 'qlog' in log:
|
||||
print_logmessage(m.logMonoTime, m.errorLogMessage, min_level)
|
||||
elif m.which() == 'androidLog':
|
||||
print_androidlog(m.logMonoTime, m.androidLog)
|
||||
if args.route:
|
||||
for route in args.route:
|
||||
lr = LogReader(route)
|
||||
for m in lr:
|
||||
if m.which() == 'logMessage':
|
||||
print_logmessage(m.logMonoTime, m.logMessage, min_level)
|
||||
elif m.which() == 'errorLogMessage':
|
||||
print_logmessage(m.logMonoTime, m.errorLogMessage, min_level)
|
||||
elif m.which() == 'androidLog':
|
||||
print_androidlog(m.logMonoTime, m.androidLog)
|
||||
else:
|
||||
sm = messaging.SubMaster(['logMessage', 'androidLog'], addr=args.addr)
|
||||
while True:
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
from openpilot.tools.lib.route import Route
|
||||
from openpilot.tools.lib.logreader import MultiLogIterator
|
||||
from openpilot.tools.lib.logreader import LogReader, ReadMode
|
||||
|
||||
|
||||
def get_fingerprint(lr):
|
||||
@@ -40,6 +39,5 @@ if __name__ == "__main__":
|
||||
print("Usage: ./fingerprint_from_route.py <route>")
|
||||
sys.exit(1)
|
||||
|
||||
route = Route(sys.argv[1])
|
||||
lr = MultiLogIterator(route.log_paths()[:5])
|
||||
lr = LogReader(sys.argv[1], ReadMode.QLOG)
|
||||
get_fingerprint(lr)
|
||||
|
||||
Executable
+81
@@ -0,0 +1,81 @@
|
||||
#!/usr/bin/env python3
|
||||
import jinja2
|
||||
import os
|
||||
|
||||
from cereal import car
|
||||
from openpilot.common.basedir import BASEDIR
|
||||
from openpilot.selfdrive.car.interfaces import get_interface_attr
|
||||
|
||||
Ecu = car.CarParams.Ecu
|
||||
|
||||
CARS = get_interface_attr('CAR')
|
||||
FW_VERSIONS = get_interface_attr('FW_VERSIONS')
|
||||
FINGERPRINTS = get_interface_attr('FINGERPRINTS')
|
||||
ECU_NAME = {v: k for k, v in Ecu.schema.enumerants.items()}
|
||||
|
||||
FINGERPRINTS_PY_TEMPLATE = jinja2.Template("""
|
||||
{%- if FINGERPRINTS[brand] %}
|
||||
# ruff: noqa: E501
|
||||
{% endif %}
|
||||
{% if FW_VERSIONS[brand] %}
|
||||
from cereal import car
|
||||
{% endif %}
|
||||
from openpilot.selfdrive.car.{{brand}}.values import CAR
|
||||
{% if FW_VERSIONS[brand] %}
|
||||
|
||||
Ecu = car.CarParams.Ecu
|
||||
{% endif %}
|
||||
{% if comments +%}
|
||||
{{ comments | join() }}
|
||||
{% endif %}
|
||||
{% if FINGERPRINTS[brand] %}
|
||||
|
||||
FINGERPRINTS = {
|
||||
{% for car, fingerprints in FINGERPRINTS[brand].items() %}
|
||||
CAR.{{car.name}}: [{
|
||||
{% for fingerprint in fingerprints %}
|
||||
{% if not loop.first %}
|
||||
{{ "{" }}
|
||||
{% endif %}
|
||||
{% for key, value in fingerprint.items() %}{{key}}: {{value}}{% if not loop.last %}, {% endif %}{% endfor %}
|
||||
|
||||
}{% if loop.last %}]{% endif %},
|
||||
{% endfor %}
|
||||
{% endfor %}
|
||||
}
|
||||
{% endif %}
|
||||
|
||||
FW_VERSIONS{% if not FW_VERSIONS[brand] %}: dict[str, dict[tuple, list[bytes]]]{% endif %} = {
|
||||
{% for car, _ in FW_VERSIONS[brand].items() %}
|
||||
CAR.{{car.name}}: {
|
||||
{% for key, fw_versions in FW_VERSIONS[brand][car].items() %}
|
||||
(Ecu.{{ECU_NAME[key[0]]}}, 0x{{"%0x" | format(key[1] | int)}}, \
|
||||
{% if key[2] %}0x{{"%0x" | format(key[2] | int)}}{% else %}{{key[2]}}{% endif %}): [
|
||||
{% for fw_version in (fw_versions + extra_fw_versions.get(car, {}).get(key, [])) | unique | sort %}
|
||||
{{fw_version}},
|
||||
{% endfor %}
|
||||
],
|
||||
{% endfor %}
|
||||
},
|
||||
{% endfor %}
|
||||
}
|
||||
|
||||
""", trim_blocks=True)
|
||||
|
||||
|
||||
def format_brand_fw_versions(brand, extra_fw_versions: None | dict[str, dict[tuple, list[bytes]]] = None):
|
||||
extra_fw_versions = extra_fw_versions or {}
|
||||
|
||||
fingerprints_file = os.path.join(BASEDIR, f"selfdrive/car/{brand}/fingerprints.py")
|
||||
with open(fingerprints_file, "r") as f:
|
||||
comments = [line for line in f.readlines() if line.startswith("#") and "noqa" not in line]
|
||||
|
||||
with open(fingerprints_file, "w") as f:
|
||||
f.write(FINGERPRINTS_PY_TEMPLATE.render(brand=brand, comments=comments, ECU_NAME=ECU_NAME,
|
||||
FINGERPRINTS=FINGERPRINTS, FW_VERSIONS=FW_VERSIONS,
|
||||
extra_fw_versions=extra_fw_versions))
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
for brand in FW_VERSIONS.keys():
|
||||
format_brand_fw_versions(brand)
|
||||
@@ -8,9 +8,10 @@ from openpilot.selfdrive.car.docs import get_all_car_info
|
||||
from openpilot.selfdrive.car.docs_definitions import Column
|
||||
|
||||
FOOTNOTE_TAG = "<sup>{}</sup>"
|
||||
STAR_ICON = '<a href="##"><img valign="top" src="https://raw.githubusercontent.com/commaai/openpilot/master/docs/assets/icon-star-{}.svg" width="22" /></a>'
|
||||
VIDEO_ICON = '<a href="{}" target="_blank">\
|
||||
<img height="18px" src="https://raw.githubusercontent.com/commaai/openpilot/master/docs/assets/icon-youtube.svg"></img></a>'
|
||||
STAR_ICON = '<a href="##"><img valign="top" ' + \
|
||||
'src="https://media.githubusercontent.com/media/commaai/openpilot/master/docs/assets/icon-star-{}.svg" width="22" /></a>'
|
||||
VIDEO_ICON = '<a href="{}" target="_blank">' + \
|
||||
'<img height="18px" src="https://media.githubusercontent.com/media/commaai/openpilot/master/docs/assets/icon-youtube.svg"></img></a>'
|
||||
COLUMNS = "|" + "|".join([column.value for column in Column]) + "|"
|
||||
COLUMN_HEADER = "|---|---|---|{}|".format("|".join([":---:"] * (len(Column) - 3)))
|
||||
ARROW_SYMBOL = "➡️"
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
clpeak/
|
||||
@@ -1,22 +0,0 @@
|
||||
#!/usr/bin/bash
|
||||
|
||||
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
|
||||
cd $DIR
|
||||
|
||||
if [ ! -d "$DIR/clpeak" ]; then
|
||||
git clone https://github.com/krrishnarraj/clpeak.git
|
||||
|
||||
cd clpeak
|
||||
git fetch
|
||||
git checkout ec2d3e70e1abc7738b81f9277c7af79d89b2133b
|
||||
git reset --hard origin/master
|
||||
git submodule update --init --recursive --remote
|
||||
|
||||
git apply ../run_continuously.patch
|
||||
fi
|
||||
|
||||
cd clpeak
|
||||
mkdir build || true
|
||||
cd build
|
||||
cmake ..
|
||||
cmake --build .
|
||||
Binary file not shown.
@@ -1,39 +0,0 @@
|
||||
diff --git a/src/logger.cpp b/src/logger.cpp
|
||||
index a63c6dd..a1d9860 100644
|
||||
--- a/src/logger.cpp
|
||||
+++ b/src/logger.cpp
|
||||
@@ -24,34 +24,22 @@ logger::~logger()
|
||||
|
||||
void logger::print(string str)
|
||||
{
|
||||
- cout << str;
|
||||
- cout.flush();
|
||||
}
|
||||
|
||||
void logger::print(double val)
|
||||
{
|
||||
- cout << setprecision(2) << fixed;
|
||||
- cout << val;
|
||||
- cout.flush();
|
||||
}
|
||||
|
||||
void logger::print(float val)
|
||||
{
|
||||
- cout << setprecision(2) << fixed;
|
||||
- cout << val;
|
||||
- cout.flush();
|
||||
}
|
||||
|
||||
void logger::print(int val)
|
||||
{
|
||||
- cout << val;
|
||||
- cout.flush();
|
||||
}
|
||||
|
||||
void logger::print(unsigned int val)
|
||||
{
|
||||
- cout << val;
|
||||
- cout.flush();
|
||||
}
|
||||
|
||||
void logger::xmlOpenTag(string tag)
|
||||
@@ -1,13 +0,0 @@
|
||||
diff --git a/src/clpeak.cpp b/src/clpeak.cpp
|
||||
index 8cb192b..b6fe6f5 100644
|
||||
--- a/src/clpeak.cpp
|
||||
+++ b/src/clpeak.cpp
|
||||
@@ -47,7 +47,7 @@ int clPeak::runAll()
|
||||
|
||||
log->xmlOpenTag("clpeak");
|
||||
log->xmlAppendAttribs("os", OS_NAME);
|
||||
- for (size_t p = 0; p < platforms.size(); p++)
|
||||
+ for (size_t p = 0; p < platforms.size(); (p+1 % platforms.size()))
|
||||
{
|
||||
if (forcePlatform && (p != specifiedPlatform))
|
||||
continue;
|
||||
@@ -1,23 +0,0 @@
|
||||
#!/usr/bin/bash
|
||||
set -e
|
||||
|
||||
cd /sys/kernel/tracing
|
||||
|
||||
echo 1 > tracing_on
|
||||
echo boot > trace_clock
|
||||
echo 1000 > buffer_size_kb
|
||||
|
||||
# /sys/kernel/tracing/available_events
|
||||
echo 1 > events/irq/enable
|
||||
echo 1 > events/sched/enable
|
||||
echo 1 > events/kgsl/enable
|
||||
echo 1 > events/camera/enable
|
||||
echo 1 > events/workqueue/enable
|
||||
|
||||
echo > trace
|
||||
sleep 5
|
||||
echo 0 > tracing_on
|
||||
|
||||
cp trace /tmp/trace
|
||||
chown comma: /tmp/trace
|
||||
echo /tmp/trace
|
||||
@@ -1,2 +0,0 @@
|
||||
palanteer/
|
||||
viewer
|
||||
@@ -1,24 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
|
||||
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )"
|
||||
cd $DIR
|
||||
|
||||
if [ ! -d palanteer ]; then
|
||||
git clone https://github.com/dfeneyrou/palanteer
|
||||
pip install wheel
|
||||
sudo apt install libunwind-dev libdw-dev
|
||||
fi
|
||||
|
||||
cd palanteer
|
||||
git pull
|
||||
|
||||
mkdir -p build
|
||||
cd build
|
||||
cmake .. -DCMAKE_BUILD_TYPE=Release
|
||||
make -j$(nproc)
|
||||
|
||||
pip install --force-reinstall python/dist/palanteer*.whl
|
||||
|
||||
cp bin/palanteer $DIR/viewer
|
||||
@@ -1,7 +0,0 @@
|
||||
trace_*
|
||||
|
||||
tracebox
|
||||
trace_processor
|
||||
|
||||
perfetto/
|
||||
configs/
|
||||
@@ -1,11 +0,0 @@
|
||||
#!/usr/bin/bash
|
||||
|
||||
if [ ! -d perfetto ]; then
|
||||
git clone https://android.googlesource.com/platform/external/perfetto/
|
||||
fi
|
||||
|
||||
cd perfetto
|
||||
|
||||
tools/install-build-deps --linux-arm
|
||||
tools/gn gen --args='is_debug=false target_os="linux" target_cpu="arm64"' out/linux
|
||||
tools/ninja -C out/linux tracebox traced traced_probes perfetto
|
||||
@@ -1,6 +0,0 @@
|
||||
#!/usr/bin/bash
|
||||
|
||||
DEST=tici:/data/openpilot/selfdrive/debug/profiling/perfetto
|
||||
|
||||
scp -r perfetto/out/linux/tracebox $DEST
|
||||
scp -r perfetto/test/configs $DEST
|
||||
@@ -1,8 +0,0 @@
|
||||
#!/usr/bin/bash
|
||||
|
||||
DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)"
|
||||
cd $DIR
|
||||
|
||||
OUT=trace_
|
||||
sudo ./tracebox -o $OUT --txt -c configs/scheduling.cfg
|
||||
sudo chown $USER:$USER $OUT
|
||||
@@ -1,6 +0,0 @@
|
||||
#!/usr/bin/bash
|
||||
|
||||
curl -LO https://get.perfetto.dev/trace_processor
|
||||
chmod +x ./trace_processor
|
||||
|
||||
./trace_processor --httpd
|
||||
@@ -1,5 +0,0 @@
|
||||
#!/usr/bin/bash
|
||||
|
||||
DEST=tici:/data/openpilot/selfdrive/debug/profiling/perfetto
|
||||
|
||||
scp tici:/data/openpilot/selfdrive/debug/profiling/perfetto/trace_* .
|
||||
@@ -1,21 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
set -e
|
||||
|
||||
cd "$(dirname "$0")"
|
||||
|
||||
# find process with name passed in (excluding this process)
|
||||
for PID in $(pgrep -f $1); do
|
||||
if [ "$PID" != "$$" ]; then
|
||||
ps -p $PID -o args
|
||||
TRACE_PID=$PID
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
if [ -z "$TRACE_PID" ]; then
|
||||
echo "could not find PID for $1"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
sudo env PATH=$PATH py-spy record -d 5 -o /tmp/perf$TRACE_PID.svg -p $TRACE_PID &&
|
||||
google-chrome /tmp/perf$TRACE_PID.svg
|
||||
@@ -1 +0,0 @@
|
||||
SnapdragonProfiler/
|
||||
@@ -1,7 +0,0 @@
|
||||
snapdragon profiler
|
||||
--------
|
||||
|
||||
* download from https://developer.qualcomm.com/software/snapdragon-profiler
|
||||
* unzip to selfdrive/debug/profiling/snapdragon/SnapdragonProfiler
|
||||
* run ./setup-agnos.sh
|
||||
* run selfdrive/debug/adb.sh on device
|
||||
@@ -1,7 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# TODO: there's probably a better way to do this
|
||||
|
||||
cd SnapdragonProfiler/service
|
||||
mv android real_android
|
||||
ln -s agl/ android
|
||||
@@ -1,4 +0,0 @@
|
||||
#!/usr/bin/bash
|
||||
set -e
|
||||
|
||||
RUBYOPT="-W0" irqtop -d1 -R
|
||||
@@ -3,29 +3,28 @@
|
||||
import argparse
|
||||
|
||||
from openpilot.selfdrive.test.process_replay.process_replay import CONFIGS, replay_process
|
||||
from openpilot.tools.lib.logreader import MultiLogIterator
|
||||
from openpilot.tools.lib.route import Route
|
||||
from openpilot.tools.lib.helpers import save_log
|
||||
from openpilot.tools.lib.logreader import LogReader
|
||||
|
||||
if __name__ == "__main__":
|
||||
parser = argparse.ArgumentParser(description="Run process on route and create new logs",
|
||||
formatter_class=argparse.ArgumentDefaultsHelpFormatter)
|
||||
parser.add_argument("--fingerprint", help="The fingerprint to use")
|
||||
parser.add_argument("route", help="The route name to use")
|
||||
parser.add_argument("process", help="The process to run")
|
||||
args = parser.parse_args()
|
||||
|
||||
cfg = [c for c in CONFIGS if c.proc_name == args.process][0]
|
||||
|
||||
route = Route(args.route)
|
||||
lr = MultiLogIterator(route.log_paths())
|
||||
lr = LogReader(args.route)
|
||||
inputs = list(lr)
|
||||
|
||||
outputs = replay_process(cfg, inputs)
|
||||
outputs = replay_process(cfg, inputs, fingerprint=args.fingerprint)
|
||||
|
||||
# Remove message generated by the process under test and merge in the new messages
|
||||
produces = {o.which() for o in outputs}
|
||||
inputs = [i for i in inputs if i.which() not in produces]
|
||||
outputs = sorted(inputs + outputs, key=lambda x: x.logMonoTime)
|
||||
|
||||
fn = f"{args.route}_{args.process}.bz2"
|
||||
fn = f"{args.route.replace('/', '_')}_{args.process}.bz2"
|
||||
save_log(fn, outputs)
|
||||
|
||||
@@ -1,111 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
'''
|
||||
printing the gap between interrupts in a histogram to check if the
|
||||
frequency is what we expect, the bmx is not interrupt driven for as we
|
||||
get interrupts in a 2kHz rate.
|
||||
'''
|
||||
|
||||
import argparse
|
||||
import sys
|
||||
import numpy as np
|
||||
from collections import defaultdict
|
||||
|
||||
from openpilot.tools.lib.logreader import LogReader
|
||||
from openpilot.tools.lib.route import Route
|
||||
|
||||
import matplotlib.pyplot as plt
|
||||
|
||||
SRC_BMX = "bmx055"
|
||||
SRC_LSM = "lsm6ds3"
|
||||
|
||||
|
||||
def parseEvents(log_reader):
|
||||
bmx_data = defaultdict(list)
|
||||
lsm_data = defaultdict(list)
|
||||
|
||||
for m in log_reader:
|
||||
if m.which() not in ['accelerometer', 'gyroscope']:
|
||||
continue
|
||||
|
||||
d = getattr(m, m.which()).to_dict()
|
||||
|
||||
if d["source"] == SRC_BMX and "acceleration" in d:
|
||||
bmx_data["accel"].append(d["timestamp"] / 1e9)
|
||||
|
||||
if d["source"] == SRC_BMX and "gyroUncalibrated" in d:
|
||||
bmx_data["gyro"].append(d["timestamp"] / 1e9)
|
||||
|
||||
if d["source"] == SRC_LSM and "acceleration" in d:
|
||||
lsm_data["accel"].append(d["timestamp"] / 1e9)
|
||||
|
||||
if d["source"] == SRC_LSM and "gyroUncalibrated" in d:
|
||||
lsm_data["gyro"].append(d["timestamp"] / 1e9)
|
||||
|
||||
return bmx_data, lsm_data
|
||||
|
||||
|
||||
def cleanData(data):
|
||||
if len(data) == 0:
|
||||
return [], []
|
||||
|
||||
data.sort()
|
||||
diffs = np.diff(data)
|
||||
return data, diffs
|
||||
|
||||
|
||||
def logAvgValues(data, sensor):
|
||||
if len(data) == 0:
|
||||
print(f"{sensor}: no data to average")
|
||||
return
|
||||
|
||||
avg = sum(data) / len(data)
|
||||
hz = 1 / avg
|
||||
print(f"{sensor}: data_points: {len(data)} avg [ns]: {avg} avg [Hz]: {hz}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument("route", type=str, help="route name")
|
||||
parser.add_argument("segment", type=int, help="segment number")
|
||||
args = parser.parse_args()
|
||||
|
||||
r = Route(args.route)
|
||||
logs = r.log_paths()
|
||||
|
||||
if len(logs) == 0:
|
||||
print("NO data routes")
|
||||
sys.exit(0)
|
||||
|
||||
if args.segment >= len(logs):
|
||||
print(f"RouteID: {args.segment} out of range, max: {len(logs) -1}")
|
||||
sys.exit(0)
|
||||
|
||||
lr = LogReader(logs[args.segment])
|
||||
bmx_data, lsm_data = parseEvents(lr)
|
||||
|
||||
# sort bmx accel data, and then cal all the diffs, and to a histogram of those
|
||||
bmx_accel, bmx_accel_diffs = cleanData(bmx_data["accel"])
|
||||
bmx_gyro, bmx_gyro_diffs = cleanData(bmx_data["gyro"])
|
||||
lsm_accel, lsm_accel_diffs = cleanData(lsm_data["accel"])
|
||||
lsm_gyro, lsm_gyro_diffs = cleanData(lsm_data["gyro"])
|
||||
|
||||
# get out the averages
|
||||
logAvgValues(bmx_accel_diffs, "bmx accel")
|
||||
logAvgValues(bmx_gyro_diffs, "bmx gyro ")
|
||||
logAvgValues(lsm_accel_diffs, "lsm accel")
|
||||
logAvgValues(lsm_gyro_diffs, "lsm gyro ")
|
||||
|
||||
fig, axs = plt.subplots(1, 2, tight_layout=True)
|
||||
axs[0].hist(bmx_accel_diffs, bins=50)
|
||||
axs[0].set_title("bmx_accel")
|
||||
axs[1].hist(bmx_gyro_diffs, bins=50)
|
||||
axs[1].set_title("bmx_gyro")
|
||||
|
||||
figl, axsl = plt.subplots(1, 2, tight_layout=True)
|
||||
axsl[0].hist(lsm_accel_diffs, bins=50)
|
||||
axsl[0].set_title("lsm_accel")
|
||||
axsl[1].hist(lsm_gyro_diffs, bins=50)
|
||||
axsl[1].set_title("lsm_gyro")
|
||||
|
||||
print("check plot...")
|
||||
plt.show()
|
||||
@@ -1,38 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
import argparse
|
||||
import sys
|
||||
from typing import List
|
||||
import unittest
|
||||
|
||||
from openpilot.selfdrive.car.tests.routes import CarTestRoute
|
||||
from openpilot.selfdrive.car.tests.test_models import TestCarModel
|
||||
from openpilot.tools.lib.route import SegmentName
|
||||
|
||||
|
||||
def create_test_models_suite(routes: List[CarTestRoute], ci=False) -> unittest.TestSuite:
|
||||
test_suite = unittest.TestSuite()
|
||||
for test_route in routes:
|
||||
# create new test case and discover tests
|
||||
test_case_args = {"car_model": test_route.car_model, "test_route": test_route, "ci": ci}
|
||||
CarModelTestCase = type("CarModelTestCase", (TestCarModel,), test_case_args)
|
||||
test_suite.addTest(unittest.TestLoader().loadTestsFromTestCase(CarModelTestCase))
|
||||
return test_suite
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
parser = argparse.ArgumentParser(description="Test any route against common issues with a new car port. " +
|
||||
"Uses selfdrive/car/tests/test_models.py")
|
||||
parser.add_argument("route_or_segment_name", help="Specify route to run tests on")
|
||||
parser.add_argument("--car", help="Specify car model for test route")
|
||||
parser.add_argument("--ci", action="store_true", help="Attempt to get logs using openpilotci, need to specify car")
|
||||
args = parser.parse_args()
|
||||
if len(sys.argv) == 1:
|
||||
parser.print_help()
|
||||
sys.exit()
|
||||
|
||||
route_or_segment_name = SegmentName(args.route_or_segment_name.strip(), allow_route_name=True)
|
||||
segment_num = route_or_segment_name.segment_num if route_or_segment_name.segment_num != -1 else None
|
||||
test_route = CarTestRoute(route_or_segment_name.route_name.canonical_name, args.car, segment=segment_num)
|
||||
test_suite = create_test_models_suite([test_route], ci=args.ci)
|
||||
|
||||
unittest.TextTestRunner().run(test_suite)
|
||||
@@ -6,8 +6,8 @@ import argparse
|
||||
import os
|
||||
import traceback
|
||||
from tqdm import tqdm
|
||||
from openpilot.tools.lib.logreader import LogReader
|
||||
from openpilot.tools.lib.route import Route
|
||||
from openpilot.tools.lib.logreader import LogReader, ReadMode
|
||||
from openpilot.tools.lib.route import SegmentRange
|
||||
from openpilot.selfdrive.car.car_helpers import interface_names
|
||||
from openpilot.selfdrive.car.fw_versions import VERSIONS, match_fw_to_car
|
||||
|
||||
@@ -44,23 +44,14 @@ if __name__ == "__main__":
|
||||
|
||||
dongles = []
|
||||
for route in tqdm(routes):
|
||||
route = route.rstrip()
|
||||
dongle_id, time = route.split('|')
|
||||
dongle_id = SegmentRange(route).dongle_id
|
||||
|
||||
if dongle_id in dongles:
|
||||
continue
|
||||
|
||||
if NO_API:
|
||||
qlog_path = f"cd:/{dongle_id}/{time}/0/qlog.bz2"
|
||||
else:
|
||||
route = Route(route)
|
||||
qlog_path = next((p for p in route.qlog_paths() if p is not None), None)
|
||||
|
||||
if qlog_path is None:
|
||||
continue
|
||||
lr = LogReader(route, default_mode=ReadMode.QLOG)
|
||||
|
||||
try:
|
||||
lr = LogReader(qlog_path)
|
||||
dongles.append(dongle_id)
|
||||
|
||||
CP = None
|
||||
@@ -98,13 +89,11 @@ if __name__ == "__main__":
|
||||
if len(fuzzy_matches) == 1:
|
||||
if list(fuzzy_matches)[0] != live_fingerprint:
|
||||
wrong_fuzzy += 1
|
||||
print(f"{dongle_id}|{time}")
|
||||
print("Fuzzy match wrong! Fuzzy:", fuzzy_matches, "Live:", live_fingerprint)
|
||||
else:
|
||||
good_fuzzy += 1
|
||||
break
|
||||
|
||||
print(f"{dongle_id}|{time}")
|
||||
print("Old style:", live_fingerprint, "Vin", CP.carVin)
|
||||
print("New style (exact):", exact_matches)
|
||||
print("New style (fuzzy):", fuzzy_matches)
|
||||
@@ -112,8 +101,8 @@ if __name__ == "__main__":
|
||||
padding = max([len(fw.brand or UNKNOWN_BRAND) for fw in car_fw])
|
||||
for version in sorted(car_fw, key=lambda fw: fw.brand):
|
||||
subaddr = None if version.subAddress == 0 else hex(version.subAddress)
|
||||
print(f" Brand: {version.brand or UNKNOWN_BRAND:{padding}}, bus: {version.bus} - \
|
||||
(Ecu.{version.ecu}, {hex(version.address)}, {subaddr}): [{version.fwVersion}],")
|
||||
print(f" Brand: {version.brand or UNKNOWN_BRAND:{padding}}, bus: {version.bus} - " +
|
||||
f"(Ecu.{version.ecu}, {hex(version.address)}, {subaddr}): [{version.fwVersion}],")
|
||||
|
||||
print("Mismatches")
|
||||
found = False
|
||||
|
||||
@@ -5,8 +5,7 @@ import matplotlib.pyplot as plt
|
||||
from sklearn import linear_model
|
||||
from openpilot.selfdrive.car.toyota.values import STEER_THRESHOLD
|
||||
|
||||
from openpilot.tools.lib.route import Route
|
||||
from openpilot.tools.lib.logreader import MultiLogIterator
|
||||
from openpilot.tools.lib.logreader import LogReader
|
||||
|
||||
MIN_SAMPLES = 30 * 100
|
||||
|
||||
@@ -58,7 +57,6 @@ def get_eps_factor(lr, plot=False):
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
r = Route(sys.argv[1])
|
||||
lr = MultiLogIterator(r.log_paths())
|
||||
lr = LogReader(sys.argv[1])
|
||||
n = get_eps_factor(lr, plot="--plot" in sys.argv)
|
||||
print("EPS torque factor: ", n)
|
||||
|
||||
Reference in New Issue
Block a user