Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
87 commits
Select commit Hold shift + click to select a range
aa19f65
add imgui
adeebshihadeh Mar 16, 2026
1b2fd1f
lil progress
adeebshihadeh Mar 20, 2026
8ec76f6
lil progress
adeebshihadeh Mar 20, 2026
e25749c
kinda works
adeebshihadeh Mar 21, 2026
06e72ec
simple load
adeebshihadeh Mar 21, 2026
b868f5a
lil more
adeebshihadeh Mar 21, 2026
534dc80
getting pretty decent
adeebshihadeh Mar 21, 2026
754a636
lil better
adeebshihadeh Mar 21, 2026
b0bdbf3
wow
adeebshihadeh Mar 21, 2026
23a578c
lil more
adeebshihadeh Mar 21, 2026
e88d970
fast
adeebshihadeh Mar 21, 2026
bf9a82a
lil more
adeebshihadeh Mar 21, 2026
e0965ce
rm that
adeebshihadeh Mar 21, 2026
a54350c
video
adeebshihadeh Mar 21, 2026
375d1b6
lil more
adeebshihadeh Mar 21, 2026
67bd08d
custom series
adeebshihadeh Mar 21, 2026
9efc7a8
json layouts
adeebshihadeh Mar 21, 2026
9a12a88
tools/jotpluggler: simplify build and fix macOS link
adeebshihadeh Mar 21, 2026
ec4c875
build: export replay_lib once from SConstruct
adeebshihadeh Mar 21, 2026
ecd5f3c
Merge branch 'master' of ssh://github.com/commaai/openpilot into jotp…
adeebshihadeh Mar 21, 2026
906a4ae
new imgui
adeebshihadeh Mar 21, 2026
5a2bcb6
new pkg
adeebshihadeh Mar 21, 2026
c29e3f3
ttf
adeebshihadeh Mar 21, 2026
518ee52
lil cleanup
adeebshihadeh Mar 21, 2026
a1794e2
lil more
adeebshihadeh Mar 21, 2026
d20a027
cleanup build
adeebshihadeh Mar 21, 2026
4a5081f
text logs!
adeebshihadeh Mar 21, 2026
f6e8263
looking good
adeebshihadeh Mar 21, 2026
0510b5b
enums!
adeebshihadeh Mar 21, 2026
7b9ac7d
minify
adeebshihadeh Mar 21, 2026
ee9027b
fix camera timings
adeebshihadeh Mar 21, 2026
da67bac
can
adeebshihadeh Mar 21, 2026
f226939
lil more
adeebshihadeh Mar 21, 2026
2ff0316
lil more
adeebshihadeh Mar 21, 2026
3dd2797
lil more
adeebshihadeh Mar 21, 2026
315e5a3
streaming
adeebshihadeh Mar 21, 2026
deb2d0d
stream fixups
adeebshihadeh Mar 21, 2026
71f4370
lil tweaks
adeebshihadeh Mar 21, 2026
23ff482
cleanup
adeebshihadeh Mar 21, 2026
c87f5cc
claude cleanups
adeebshihadeh Mar 21, 2026
260c7d4
Merge branch 'master' of ssh://github.com/commaai/openpilot into jotp…
adeebshihadeh Mar 21, 2026
dbcced6
round two
adeebshihadeh Mar 22, 2026
aa873e6
lil more
adeebshihadeh Mar 22, 2026
3ef1311
match
adeebshihadeh Mar 22, 2026
e2a9670
lil more simplify
adeebshihadeh Mar 22, 2026
e0f2156
one more pass
adeebshihadeh Mar 22, 2026
0703bbd
undo redo
adeebshihadeh Mar 22, 2026
fc7220c
nice timeline
adeebshihadeh Mar 22, 2026
f1bda01
nice formatting
adeebshihadeh Mar 22, 2026
26dc306
scroll
adeebshihadeh Mar 22, 2026
967fc78
lil polish
adeebshihadeh Mar 22, 2026
6c5963f
state transitions
adeebshihadeh Mar 22, 2026
ebf7bf4
a map!
adeebshihadeh Mar 22, 2026
ea3d4f8
vector map
adeebshihadeh Mar 22, 2026
a228a36
google maps button
adeebshihadeh Mar 22, 2026
9e96033
cams
adeebshihadeh Mar 22, 2026
fc18929
feeling nice
adeebshihadeh Mar 22, 2026
6213dd3
hw accel
adeebshihadeh Mar 22, 2026
d7d3046
fix up splitting
adeebshihadeh Mar 22, 2026
96e11ee
lil more
adeebshihadeh Mar 22, 2026
c87b96e
lock
adeebshihadeh Mar 22, 2026
b391769
start simplify
adeebshihadeh Mar 22, 2026
91ab171
fix linux build
adeebshihadeh Mar 22, 2026
8ff6568
common dbc
adeebshihadeh Mar 22, 2026
a6030a9
add those
adeebshihadeh Mar 22, 2026
2c060fe
lil more
adeebshihadeh Mar 23, 2026
31b9ab6
lil more
adeebshihadeh Mar 23, 2026
9caf920
Merge branch 'master' of ssh://github.com/commaai/openpilot into jotp…
adeebshihadeh Mar 23, 2026
ef53407
start cabana
adeebshihadeh Mar 23, 2026
7a6c964
more cabana
adeebshihadeh Mar 23, 2026
92fad3c
start cleaning up
adeebshihadeh Mar 23, 2026
1facdbb
revert dbc stuff
adeebshihadeh Mar 23, 2026
01d75d2
Merge branch 'master' of ssh://github.com/commaai/openpilot into jotp…
adeebshihadeh Mar 23, 2026
0962556
lil more cabana
adeebshihadeh Mar 23, 2026
420de0c
more cabana
adeebshihadeh Mar 23, 2026
3ca8b8b
Merge branch 'master' of ssh://github.com/commaai/openpilot into jotp…
adeebshihadeh Mar 23, 2026
2372a00
cleanup bad merge
adeebshihadeh Mar 23, 2026
ed7c248
lil more cabana
adeebshihadeh Mar 23, 2026
c888660
more cabana
adeebshihadeh Mar 23, 2026
01107df
more cabana
adeebshihadeh Mar 24, 2026
130c995
lil more?
adeebshihadeh Mar 24, 2026
78c139b
lil more
adeebshihadeh Mar 24, 2026
59a78ea
crash tester
adeebshihadeh Mar 24, 2026
60e1c4b
lil cleaner test
adeebshihadeh Mar 24, 2026
03de147
more crash test
adeebshihadeh Mar 24, 2026
ab156f5
lil more
adeebshihadeh Mar 25, 2026
ed4956d
Merge remote-tracking branch 'origin/master' into jotpluggler
adeebshihadeh Apr 15, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
<span> · </span>
<a href="https://discord.comma.ai">Community</a>
<span> · </span>
<a href="https://comma.ai/shop">Try it on a comma four</a>
<a href="https://comma.ai/shop">Try it on a comma 3X</a>
</h3>

Quick start: `bash <(curl -fsSL openpilot.comma.ai)`
Expand All @@ -42,10 +42,10 @@ Using openpilot in a car
------

To use openpilot in a car, you need four things:
1. **Supported Device:** a comma four, available at [comma.ai/shop/comma-four](https://www.comma.ai/shop/comma-four).
2. **Software:** The setup procedure for the comma four allows users to enter a URL for custom software. Use the URL `openpilot.comma.ai` to install the release version.
1. **Supported Device:** a comma 3X, available at [comma.ai/shop](https://comma.ai/shop/comma-3x).
2. **Software:** The setup procedure for the comma 3X allows users to enter a URL for custom software. Use the URL `openpilot.comma.ai` to install the release version.
3. **Supported Car:** Ensure that you have one of [the 275+ supported cars](docs/CARS.md).
4. **Car Harness:** You will also need a [car harness](https://comma.ai/shop/car-harness) to connect your comma four to your car.
4. **Car Harness:** You will also need a [car harness](https://comma.ai/shop/car-harness) to connect your comma 3X to your car.

We have detailed instructions for [how to install the harness and device in a car](https://comma.ai/setup). Note that it's possible to run openpilot on [other hardware](https://blog.comma.ai/self-driving-car-for-free/), although it's not plug-and-play.

Expand Down
2 changes: 1 addition & 1 deletion tools/cabana/SConscript
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ base_frameworks = qt_env['FRAMEWORKS']
base_libs = [common, messaging, cereal, visionipc, 'm', 'pthread'] + qt_env["LIBS"]

if arch == "Darwin":
base_frameworks += ['QtCharts', 'CoreFoundation', 'CoreVideo', 'CoreMedia', 'IOKit', 'Security', 'VideoToolbox']
base_frameworks.append('QtCharts')
else:
base_libs.append('Qt5Charts')

Expand Down
2 changes: 1 addition & 1 deletion tools/cabana/cabana
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,6 @@ fi

# Build _cabana
cd "$ROOT"
scons -j4 tools/cabana/_cabana cereal/messaging/bridge
scons -j"$(nproc)" tools/cabana/_cabana cereal/messaging/bridge

exec "$DIR/_cabana" "$@"
125 changes: 49 additions & 76 deletions tools/jotpluggler/SConscript
Original file line number Diff line number Diff line change
@@ -1,92 +1,65 @@
import os

import imgui
import libusb
from opendbc import get_generated_dbcs
from opendbc.car import Bus
from opendbc.car.fingerprints import MIGRATION
from opendbc.car.values import PLATFORMS
from openpilot.common.basedir import BASEDIR

Import('env', 'arch', 'common', 'messaging', 'visionipc', 'cereal', 'replay_lib')

jot_env = env.Clone()
jot_env["LIBPATH"] += [imgui.MESA_DIR, libusb.LIB_DIR]
jot_env["CPPPATH"] += [imgui.INCLUDE_DIR, libusb.INCLUDE_DIR]
jot_env["CXXFLAGS"] += [
"-DGLFW_INCLUDE_NONE",
'-DJOTP_REPO_ROOT=\'"%s"\'' % os.path.realpath(BASEDIR),
jot_env["LIBPATH"] += [imgui.MESA_DIR]
jot_env["CPPPATH"] += [imgui.INCLUDE_DIR]
jot_env["CPPPATH"] += [libusb.INCLUDE_DIR]
jot_env["LIBPATH"] += [libusb.LIB_DIR]
jot_env["CXXFLAGS"] += ["-DGLFW_INCLUDE_NONE"]
repo_root = jot_env.Dir("../..").abspath
jot_env["CXXFLAGS"] += ['-DJOTP_REPO_ROOT=\'"%s"\'' % repo_root]
generated_dbc_dir = "tools/jotpluggler/generated_dbcs"
generated_dbc_stamp = jot_env.Command(
f"{generated_dbc_dir}/.stamp",
["materialize_generated_dbcs.py"],
f"python3 tools/jotpluggler/materialize_generated_dbcs.py --out {generated_dbc_dir}",
)

jot_sources = [
"main.cc",
"app.cc",
"app_browser.cc",
"app_cabana.cc",
"app_cabana_widgets.cc",
"app_camera.cc",
"app_common.cc",
"app_custom_series.cc",
"app_layout_flow.cc",
"app_layout_io.cc",
"app_logs.cc",
"app_map.cc",
"app_plot.cc",
"app_render_flow.cc",
"app_runtime.cc",
"app_session_flow.cc",
"app_sidebar_flow.cc",
"app_socketcan.cc",
"app_stream_flow.cc",
"bootstrap_icons.cc",
"dbc_core.cc",
"../cabana/panda.cc",
"sketch_layout.cc",
]

def materialize_generated_dbcs(target, source, env):
out_dir = os.path.dirname(str(target[0]))
os.makedirs(out_dir, exist_ok=True)

for name in os.listdir(out_dir):
if name.endswith('.dbc'):
os.unlink(os.path.join(out_dir, name))

for name, content in sorted(get_generated_dbcs().items()):
with open(os.path.join(out_dir, f"{name}.dbc"), "w") as f:
f.write(content)

with open(str(target[0]), "w") as f:
f.write("ok\n")

return None

def write_car_fingerprint_to_dbc_header(target, source, env):
pairs = {}

for name, platform in sorted(PLATFORMS.items()):
dbc = platform.config.dbc_dict.get(Bus.pt, "")
if not dbc and name.startswith("TESLA_"):
dbc = platform.config.dbc_dict.get(Bus.party, "")
if not dbc and name == "COMMA_BODY":
dbc = "comma_body"
if dbc and name != "MOCK":
pairs[name] = dbc

for fingerprint, car in sorted(MIGRATION.items()):
dbc = pairs.get(str(car), "")
if dbc:
pairs[fingerprint] = dbc

lines = [
"#pragma once",
"",
"#include <string_view>",
"#include <utility>",
"",
"inline constexpr std::pair<std::string_view, std::string_view> kCarFingerprintToDbc[] = {",
]
lines.extend(f' {{"{fingerprint}", "{dbc}"}},' for fingerprint, dbc in sorted(pairs.items()))
lines.extend([
"};",
"",
"inline std::string_view dbc_for_car_fingerprint(std::string_view fingerprint) {",
" for (const auto &[car_fingerprint, dbc] : kCarFingerprintToDbc) {",
" if (car_fingerprint == fingerprint) return dbc;",
" }",
" return {};",
"}",
"",
])

with open(str(target[0]), "w") as f:
f.write("\n".join(lines))

return None

generated_dbc_stamp = jot_env.Command(f"generated_dbcs/.stamp", [], materialize_generated_dbcs)
car_fingerprint_to_dbc = jot_env.Command("car_fingerprint_to_dbc.h", [], write_car_fingerprint_to_dbc_header)
objects = []
for source in jot_sources:
basename = os.path.splitext(os.path.basename(source))[0]
objects.append(jot_env.Object(target=f"jot_{basename}", source=source))

libs = [replay_lib, common, messaging, visionipc, cereal, File(f"{imgui.LIB_DIR}/libimgui.a"), File(f"{imgui.LIB_DIR}/libglfw3.a"),
imgui_static = File(f"{imgui.LIB_DIR}/libimgui.a")
glfw_static = File(f"{imgui.LIB_DIR}/libglfw3.a")
frameworks = []
libs = [replay_lib, common, messaging, visionipc, cereal, imgui_static, glfw_static,
"avformat", "avcodec", "avutil", "x264", "yuv", "z", "bz2", "zstd", "m", "pthread", "usb-1.0"]
if arch == "Darwin":
jot_env["FRAMEWORKS"] = ["OpenGL", "Cocoa", "IOKit", "CoreFoundation", "CoreVideo", "CoreMedia", "VideoToolbox"]
frameworks = ["OpenGL", "Cocoa", "IOKit", "CoreFoundation", "CoreVideo", "CoreMedia", "VideoToolbox"]
else:
libs += ["GL", "dl", "va", "va-drm", "drm"]

program = jot_env.Program("jotpluggler", jot_env.Glob("*.cc"), LIBS=libs)
program = jot_env.Program("jotpluggler", objects, LIBS=libs, FRAMEWORKS=frameworks)
jot_env.Depends(program, generated_dbc_stamp)
jot_env.Depends(program, car_fingerprint_to_dbc)
Loading
Loading