diff --git a/main/accessors/settingsaccessors.h b/main/accessors/settingsaccessors.h index c964b0c..b1c9743 100644 --- a/main/accessors/settingsaccessors.h +++ b/main/accessors/settingsaccessors.h @@ -234,6 +234,7 @@ struct ButtonProfile3Accessor : public NewSettingsAccessor { ConfigWrap // Can struct CanResetOnErrorAccessor : public NewSettingsAccessor { ConfigWrapper &getConfig() const override { return configs.canResetOnError; } }; +struct CanReinstallDriverAccessor : public NewSettingsAccessor { ConfigWrapper &getConfig() const override { return configs.canUninstallOnReset; } }; // Quick Actions struct QuickActionLeft2Accessor : public NewSettingsAccessor { ConfigWrapper &getConfig() const override { return configs.quickActionLeft2; } }; diff --git a/main/can.cpp b/main/can.cpp index fb30a84..d459a67 100644 --- a/main/can.cpp +++ b/main/can.cpp @@ -280,7 +280,7 @@ void sendCanCommands() const auto status = twai_get_status_info(&status_info); const auto timestamp_after = espchrono::millis_clock::now(); - if (result == ESP_ERR_TIMEOUT || (status == ESP_OK && status_info.bus_error_count > can_sequential_bus_errors)) + if ((result == ESP_ERR_TIMEOUT || status == TWAI_STATE_BUS_OFF) || (status == ESP_OK && status_info.bus_error_count > can_sequential_bus_errors)) { ++can_sequential_error_cnt; ++can_total_error_cnt; @@ -294,7 +294,7 @@ void sendCanCommands() } else if (result != ESP_OK) { - ESP_LOGE(TAG, "ERROR: twai_transmit() failed after %lldms with %s", + ESP_LOGD(TAG, "ERROR: twai_transmit() failed after %lldms with %s", (timestamp_after - timestamp_before).count(), esp_err_to_name(result)); } @@ -314,6 +314,20 @@ void sendCanCommands() { ESP_LOGE(TAG, "ERROR: twai_stop() failed with %s", esp_err_to_name(err)); } + + if (configs.canUninstallOnReset.value) + { + if (const auto err = twai_driver_uninstall(); err != ESP_OK) { + ESP_LOGE(TAG, "ERROR: twai_driver_uninstall() failed with %s", esp_err_to_name(err)); + } + twai_general_config_t g_config = TWAI_GENERAL_CONFIG_DEFAULT(GPIO_NUM_21, GPIO_NUM_22, + TWAI_MODE_NORMAL); + twai_timing_config_t t_config = TWAI_TIMING_CONFIG_250KBITS(); + twai_filter_config_t f_config = TWAI_FILTER_CONFIG_ACCEPT_ALL(); + if (const auto err = twai_driver_install(&g_config, &t_config, &f_config); err != ESP_OK) { + ESP_LOGE(TAG, "ERROR: twai_driver_install() failed with %s", esp_err_to_name(err)); + } + } if (const auto err = twai_start(); err != ESP_OK) { ESP_LOGE(TAG, "ERROR: twai_start() failed with %s", esp_err_to_name(err)); diff --git a/main/displays/menus/controllerhardwaresettingsmenu.cpp b/main/displays/menus/controllerhardwaresettingsmenu.cpp index e4d7c5b..52f53f8 100644 --- a/main/displays/menus/controllerhardwaresettingsmenu.cpp +++ b/main/displays/menus/controllerhardwaresettingsmenu.cpp @@ -32,6 +32,7 @@ constexpr char TEXT_BACKSENDCAN[] = "Back send CAN"; constexpr char TEXT_CANTRANSMITTIMEOUT[] = "CanTransmitTimeout"; constexpr char TEXT_CANRECEIVETIMEOUT[] = "CanReceiveTimeout"; constexpr char TEXT_CANRESETONERROR[] = "Reset on error"; +constexpr char TEXT_CANREINSTALLDRIVER[] = "Reinstall on error"; #endif constexpr char TEXT_BACK[] = "Back"; @@ -90,6 +91,7 @@ ControllerHardwareSettingsMenu::ControllerHardwareSettingsMenu() constructMenuItem, SwitchScreenAction>>(); constructMenuItem, SwitchScreenAction>>(); constructMenuItem, BobbyCheckbox, CanResetOnErrorAccessor>>(); + constructMenuItem, BobbyCheckbox, CanReinstallDriverAccessor>>(); #endif constructMenuItem, SwitchScreenAction, StaticMenuItemIcon<&espgui::icons::back>>>(); } diff --git a/main/newsettings.h b/main/newsettings.h index 413f410..981be8b 100644 --- a/main/newsettings.h +++ b/main/newsettings.h @@ -159,6 +159,7 @@ public: ConfigWrappertimeDst{espchrono::DayLightSavingMode::EuropeanSummerTime, DoReset, {}, "time_dst" }; ConfigWrapper canResetOnError {false, DoReset, {}, "canBusRstErr" }; + ConfigWrapper canUninstallOnReset {false, DoReset, {}, "canUnstlRstErr" }; ConfigWrapper sampleCount {50, DoReset, {}, "sampleCount" }; ConfigWrapper gasMin {0, DoReset, MinMaxValue, "gasMin" }; @@ -479,7 +480,8 @@ public: x(timezoneOffset) \ x(timeDst) \ \ - x(canResetOnError) \ + x(canResetOnError) \ + x(canUninstallOnReset) \ \ x(sampleCount) \ x(gasMin) \