boardd: wait for safety_setter_thread to finish while quitting panda_state_thread (#21961)
* rebase master * merge master * merge master * remove spacepull/22426/head
parent
009e37e797
commit
47f601e50a
|
@ -9,9 +9,11 @@
|
|||
#include <bitset>
|
||||
#include <cassert>
|
||||
#include <cerrno>
|
||||
#include <chrono>
|
||||
#include <cstdint>
|
||||
#include <cstdio>
|
||||
#include <cstdlib>
|
||||
#include <future>
|
||||
#include <thread>
|
||||
#include <unordered_map>
|
||||
|
||||
|
@ -34,20 +36,19 @@
|
|||
#define CUTOFF_IL 200
|
||||
#define SATURATE_IL 1600
|
||||
#define NIBBLE_TO_HEX(n) ((n) < 10 ? (n) + '0' : ((n) - 10) + 'a')
|
||||
using namespace std::chrono_literals;
|
||||
|
||||
std::atomic<bool> safety_setter_thread_running(false);
|
||||
std::atomic<bool> ignition(false);
|
||||
|
||||
ExitHandler do_exit;
|
||||
|
||||
|
||||
std::string get_time_str(const struct tm &time) {
|
||||
char s[30] = {'\0'};
|
||||
std::strftime(s, std::size(s), "%Y-%m-%d %H:%M:%S", &time);
|
||||
return s;
|
||||
}
|
||||
|
||||
void safety_setter_thread(Panda *panda) {
|
||||
bool safety_setter_thread(Panda *panda) {
|
||||
LOGD("Starting safety setter thread");
|
||||
// diagnostic only is the default, needed for VIN query
|
||||
panda->set_safety_model(cereal::CarParams::SafetyModel::ELM327);
|
||||
|
@ -57,8 +58,7 @@ void safety_setter_thread(Panda *panda) {
|
|||
// switch to SILENT when CarVin param is read
|
||||
while (true) {
|
||||
if (do_exit || !panda->connected) {
|
||||
safety_setter_thread_running = false;
|
||||
return;
|
||||
return false;
|
||||
};
|
||||
|
||||
std::string value_vin = p.get("CarVin");
|
||||
|
@ -78,8 +78,7 @@ void safety_setter_thread(Panda *panda) {
|
|||
LOGW("waiting for params to set safety model");
|
||||
while (true) {
|
||||
if (do_exit || !panda->connected) {
|
||||
safety_setter_thread_running = false;
|
||||
return;
|
||||
return false;
|
||||
};
|
||||
|
||||
if (p.getBool("ControlsReady")) {
|
||||
|
@ -101,8 +100,7 @@ void safety_setter_thread(Panda *panda) {
|
|||
LOGW("setting safety model: %d with param %d", (int)safety_model, safety_param);
|
||||
|
||||
panda->set_safety_model(safety_model, safety_param);
|
||||
|
||||
safety_setter_thread_running = false;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
|
@ -349,6 +347,7 @@ void send_peripheral_state(PubMaster *pm, Panda *panda) {
|
|||
void panda_state_thread(PubMaster *pm, Panda * peripheral_panda, Panda *panda, bool spoofing_started) {
|
||||
Params params;
|
||||
bool ignition_last = false;
|
||||
std::future<bool> safety_future;
|
||||
|
||||
LOGD("start panda state thread");
|
||||
|
||||
|
@ -360,10 +359,8 @@ void panda_state_thread(PubMaster *pm, Panda * peripheral_panda, Panda *panda, b
|
|||
// clear VIN, CarParams, and set new safety on car start
|
||||
if (ignition && !ignition_last) {
|
||||
params.clearAll(CLEAR_ON_IGNITION_ON);
|
||||
|
||||
if (!safety_setter_thread_running) {
|
||||
safety_setter_thread_running = true;
|
||||
std::thread(safety_setter_thread, panda).detach();
|
||||
if (!safety_future.valid() || safety_future.wait_for(0ms) == std::future_status::ready) {
|
||||
safety_future = std::async(std::launch::async, safety_setter_thread, panda);
|
||||
} else {
|
||||
LOGW("Safety setter thread already running");
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue