Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

pandad: reset safety mode on exit #32103

Merged
merged 37 commits into from
Jan 22, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
3ab595f
boardd: reset safety mode on exit
adeebshihadeh Apr 4, 2024
b182ff4
comment
adeebshihadeh Apr 4, 2024
830c538
Merge remote-tracking branch 'upstream/master' into boardd-no-fault
sshane Jun 6, 2024
593d469
log it
sshane Jun 6, 2024
90aeb19
logmessaged might not be alive
sshane Jun 6, 2024
452b0a9
reproduction, manager gets SIGTERM from python_process
sshane Jun 6, 2024
cc8ea4f
even smaller repro
sshane Jun 6, 2024
76e9402
should work
sshane Jun 6, 2024
497bd81
let's not change that rn
sshane Jun 6, 2024
6927015
something like this
sshane Jun 6, 2024
8ae9025
pandad.cc should receive same SIGTERM and exit
sshane Jun 6, 2024
1dbea86
stash
sshane Jun 6, 2024
5d87fc5
remove debugging
sshane Jun 6, 2024
f15218c
remove debugging
sshane Jun 6, 2024
3985f17
match behavior
sshane Jun 6, 2024
b1ef22b
convention
sshane Jun 6, 2024
de9d078
systemd option
sshane Jun 6, 2024
8fb9896
manager option
sshane Jun 6, 2024
2f711c4
Merge remote-tracking branch 'upstream/master' into boardd-no-fault
sshane Jun 8, 2024
9dbe986
Merge remote-tracking branch 'upstream/master' into boardd-no-fault
sshane Jun 8, 2024
c617477
just curious if this works, change to ELM327 on exit
sshane Jun 8, 2024
d49eb66
Revert "just curious if this works, change to ELM327 on exit"
sshane Jun 8, 2024
5126ffc
Merge remote-tracking branch 'upstream/master' into boardd-no-fault
sshane Jan 17, 2025
7388329
check onroad
sshane Jan 17, 2025
f25b189
useless
sshane Jan 17, 2025
9a00d49
comment
sshane Jan 17, 2025
429613b
fix
sshane Jan 17, 2025
2bb1386
debug
sshane Jan 17, 2025
55233fc
Revert "debug"
sshane Jan 18, 2025
c3fa109
Update common/util.h
sshane Jan 18, 2025
f85ae89
Merge remote-tracking branch 'upstream/master' into boardd-no-fault
sshane Jan 18, 2025
40c8c66
Merge remote-tracking branch 'upstream/master' into boardd-no-fault
sshane Jan 22, 2025
c54fe08
double wait does not work, blocking in signal handler not good, exit …
sshane Jan 22, 2025
736c114
organize?
sshane Jan 22, 2025
c2e0481
no sys
sshane Jan 22, 2025
8a0ca3a
Merge remote-tracking branch 'upstream/master' into boardd-no-fault
sshane Jan 22, 2025
582e0aa
None
sshane Jan 22, 2025
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
22 changes: 16 additions & 6 deletions selfdrive/pandad/pandad.cc
Original file line number Diff line number Diff line change
Expand Up @@ -323,9 +323,7 @@ void send_peripheral_state(Panda *panda, PubMaster *pm) {
pm->send("peripheralState", msg);
}

void process_panda_state(std::vector<Panda *> &pandas, PubMaster *pm, bool spoofing_started) {
static SubMaster sm({"selfdriveState"});

void process_panda_state(std::vector<Panda *> &pandas, PubMaster *pm, bool engaged, bool spoofing_started) {
std::vector<std::string> connected_serials;
for (Panda *p : pandas) {
connected_serials.push_back(p->hw_serial());
Expand Down Expand Up @@ -361,8 +359,6 @@ void process_panda_state(std::vector<Panda *> &pandas, PubMaster *pm, bool spoof
}
}

sm.update(0);
const bool engaged = sm.allAliveAndValid({"selfdriveState"}) && sm["selfdriveState"].getSelfdriveState().getEnabled();
for (const auto &panda : pandas) {
panda->send_heartbeat(engaged);
}
Expand Down Expand Up @@ -428,9 +424,11 @@ void pandad_run(std::vector<Panda *> &pandas) {
std::thread send_thread(can_send_thread, pandas, fake_send);

RateKeeper rk("pandad", 100);
SubMaster sm({"selfdriveState"});
PubMaster pm({"can", "pandaStates", "peripheralState"});
PandaSafety panda_safety(pandas);
Panda *peripheral_panda = pandas[0];
bool engaged = false;

// Main loop: receive CAN data and process states
while (!do_exit && check_all_connected(pandas)) {
Expand All @@ -443,7 +441,9 @@ void pandad_run(std::vector<Panda *> &pandas) {

// Process panda state at 10 Hz
if (rk.frame() % 10 == 0) {
process_panda_state(pandas, &pm, spoofing_started);
sm.update(0);
engaged = sm.allAliveAndValid({"selfdriveState"}) && sm["selfdriveState"].getSelfdriveState().getEnabled();
process_panda_state(pandas, &pm, engaged, spoofing_started);
panda_safety.configureSafetyMode();
}

Expand All @@ -455,6 +455,16 @@ void pandad_run(std::vector<Panda *> &pandas) {
rk.keepTime();
}

// Close relay on exit to prevent a fault
const bool is_onroad = Params().getBool("IsOnroad");
if (is_onroad && !engaged) {
for (auto &p : pandas) {
if (p->connected()) {
p->set_safety_model(cereal::CarParams::SafetyModel::NO_OUTPUT);
}
}
}

send_thread.join();
}

Expand Down
23 changes: 18 additions & 5 deletions selfdrive/pandad/pandad.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
import os
import usb1
import time
import signal
import subprocess
from typing import NoReturn

from panda import Panda, PandaDFU, PandaProtocolMismatch, FW_PATH
from openpilot.common.basedir import BASEDIR
Expand Down Expand Up @@ -61,13 +61,25 @@ def flash_panda(panda_serial: str) -> Panda:
return panda


def main() -> NoReturn:
def main() -> None:
# signal pandad to close the relay and exit
def signal_handler(signum, frame):
cloudlog.info(f"Caught signal {signum}, exiting")
nonlocal do_exit
do_exit = True
if process is not None:
process.send_signal(signal.SIGINT)

process = None
do_exit = False
signal.signal(signal.SIGINT, signal_handler)

count = 0
first_run = True
params = Params()
no_internal_panda_count = 0

while True:
while not do_exit:
try:
count += 1
cloudlog.event("pandad.flash_and_connect", count=count)
Expand Down Expand Up @@ -159,8 +171,9 @@ def main() -> NoReturn:

# run pandad with all connected serials as arguments
os.environ['MANAGER_DAEMON'] = 'pandad'
os.chdir(os.path.join(BASEDIR, "selfdrive/pandad"))
subprocess.run(["./pandad", *panda_serials], check=True)
process = subprocess.Popen(["./pandad", *panda_serials], cwd=os.path.join(BASEDIR, "selfdrive/pandad"))
process.wait()


if __name__ == "__main__":
main()
Loading