From cab81c497ee33b4cca6f2412687b00bb78287833 Mon Sep 17 00:00:00 2001 From: Rick Lan Date: Tue, 8 Apr 2025 17:14:19 +0800 Subject: [PATCH] Core - Last Errors Btn --- common/params_keys.h | 1 + selfdrive/ui/qt/offroad/developer_panel.cc | 15 +++++++++++++++ system/sentry.py | 5 +++++ 3 files changed, 21 insertions(+) diff --git a/common/params_keys.h b/common/params_keys.h index 8012e057a..2b36e1478 100644 --- a/common/params_keys.h +++ b/common/params_keys.h @@ -120,4 +120,5 @@ inline static std::unordered_map keys = { {"UpdaterTargetBranch", CLEAR_ON_MANAGER_START}, {"UpdaterLastFetchTime", PERSISTENT}, {"Version", PERSISTENT}, + {"dp_device_last_log", CLEAR_ON_ONROAD_TRANSITION}, }; diff --git a/selfdrive/ui/qt/offroad/developer_panel.cc b/selfdrive/ui/qt/offroad/developer_panel.cc index a095228da..2f533f16b 100644 --- a/selfdrive/ui/qt/offroad/developer_panel.cc +++ b/selfdrive/ui/qt/offroad/developer_panel.cc @@ -45,6 +45,21 @@ DeveloperPanel::DeveloperPanel(SettingsWindow *parent) : ListWidget(parent) { // Toggles should be not available to change in onroad state QObject::connect(uiState(), &UIState::offroadTransition, this, &DeveloperPanel::updateToggles); + + // error logs + QPushButton* error_log_btn = new QPushButton(QObject::tr("Show Last Errors")); + error_log_btn->setObjectName("error_log_btn"); + + error_log_btn->setStyleSheet(R"( + #error_log_btn { height: 120px; border-radius: 15px; background-color: #393939; } + #error_log_btn:pressed { background-color: #4a4a4a; } + )"); + + addItem(error_log_btn); + + QObject::connect(error_log_btn, &QPushButton::clicked, [=]() { + ConfirmationDialog::rich(QString::fromStdString(params.get("dp_device_last_log")), parent); + }); } void DeveloperPanel::updateToggles(bool _offroad) { diff --git a/system/sentry.py b/system/sentry.py index 5733b5377..8c08a6dea 100644 --- a/system/sentry.py +++ b/system/sentry.py @@ -26,11 +26,16 @@ def report_tombstone(fn: str, message: str, contents: str) -> None: sentry_sdk.capture_message(message=message) sentry_sdk.flush() +def save_exception(exc_text): + log = "\n".join(exc_text.splitlines()) + "\n" + Params().put("dp_device_last_log", log) def capture_exception(*args, **kwargs) -> None: cloudlog.error("crash", exc_info=kwargs.get('exc_info', 1)) try: + import traceback + save_exception(traceback.format_exc()) sentry_sdk.capture_exception(*args, **kwargs) sentry_sdk.flush() # https://github.com/getsentry/sentry-python/issues/291 except Exception: