Skip to content
Draft
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
bb34ee8
add CAN flash utility for body v1 and support for STM32F4
stefpi Apr 2, 2026
1ef77ad
revert step and add gating param on flash
stefpi Apr 3, 2026
04b435e
step for canHandle and increase timeout
stefpi Apr 3, 2026
75a2882
firmware version checking through UDS
stefpi Apr 3, 2026
3c3e427
rename
stefpi Apr 3, 2026
944ece3
refactor flash.py a bit with skip option
stefpi Apr 3, 2026
ccfc7ea
download most recent binary on version mismatch
stefpi Apr 3, 2026
b8acc9a
fix bin download to be on local mismatch not body mismatch
stefpi Apr 3, 2026
fd30520
handle no local bin file case
stefpi Apr 3, 2026
7544c6c
refactor
stefpi Apr 3, 2026
bee1d8f
cleanup
stefpi Apr 3, 2026
5a5177a
refactor for firmware signature instead
stefpi Apr 4, 2026
696b5c1
bump body v1 firmware version
stefpi Apr 4, 2026
e2d2278
fix typo
stefpi Apr 4, 2026
3b2f435
add some failsafes
stefpi Apr 6, 2026
ea03eec
don't overshadow python builtin
stefpi Apr 6, 2026
88a1e43
use opendbc flash script
stefpi Apr 7, 2026
3811b47
remove canhandle
stefpi Apr 7, 2026
b7eab38
flash script based on opendbc implementation
stefpi Apr 7, 2026
a415c76
clean diff
stefpi Apr 7, 2026
10c6d13
fix linter
stefpi Apr 7, 2026
4c7d604
update function call to opendbc
stefpi Apr 7, 2026
2224d3a
remove unused imports
stefpi Apr 7, 2026
54899f0
fix update function param names
stefpi Apr 7, 2026
47797d9
remove unused param in panda flash v1
stefpi Apr 7, 2026
0b51e87
remove send/recv adapters
stefpi Apr 7, 2026
e32f94e
remove unused import
stefpi Apr 7, 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
65 changes: 65 additions & 0 deletions board/body/v1/flash.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
#!/usr/bin/env python3

import sys
import _thread
import time
import argparse
from subprocess import check_output, CalledProcessError

from panda import Panda
from opendbc.car import structs
from opendbc.car.body.flash import update
from opendbc.car.body.values import FLASH_ADDR, BUS, BIN_URL, BIN_PATH

def heartbeat_thread(p):
while True:
try:
p.send_heartbeat()
time.sleep(0.5)
except Exception:
continue


def flash(addr=FLASH_ADDR, file=BIN_PATH):
p = Panda()
_thread.start_new_thread(heartbeat_thread, (p,))

p.set_safety_mode(structs.CarParams.SafetyModel.body)

update(
can_send=p.can_send,
can_recv=p.can_recv,
addr=addr,
bus=BUS,
file=file,
update_url=BIN_URL,
)


if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Flash body v2 over CAN")
parser.add_argument("fn", type=str, nargs="?", help="flash file")
parser.add_argument("--kill-pandad", action="store_true", help="kill pandad processes before flashing")
args = parser.parse_args()

if args.kill_pandad:
try:
check_output(["pkill", "-f", "selfdrive.pandad.pandad"])
check_output(["pkill", "-x", "pandad"])
print("pandad processes killed")
time.sleep(1)
except CalledProcessError:
print("no pandad processes found")
else:
try:
check_output(["pidof", "pandad"])
print("pandad is running, please kill it before running this script! (use --kill-pandad to kill automatically)")
sys.exit(1)
except CalledProcessError as e:
if e.returncode != 1: # 1 == no process found (pandad not running)
raise e

if not args.fn:
args.fn = BIN_PATH

flash(FLASH_ADDR, args.fn)
Loading