diff --git a/main/accessors/settingsaccessors.h b/main/accessors/settingsaccessors.h index 19cfde2..df23d8f 100644 --- a/main/accessors/settingsaccessors.h +++ b/main/accessors/settingsaccessors.h @@ -254,3 +254,6 @@ struct ButtonProfile0Accessor : public NewSettingsAccessor { ConfigWrap struct ButtonProfile1Accessor : public NewSettingsAccessor { ConfigWrapper &getConfig() const override { return configs.dpadMappingProfile1; } }; struct ButtonProfile2Accessor : public NewSettingsAccessor { ConfigWrapper &getConfig() const override { return configs.dpadMappingProfile2; } }; struct ButtonProfile3Accessor : public NewSettingsAccessor { ConfigWrapper &getConfig() const override { return configs.dpadMappingProfile3; } }; + +// Can +struct CanResetOnErrorAccessor : public NewSettingsAccessor { ConfigWrapper &getConfig() const override { return configs.canResetOnError; } }; diff --git a/main/can.cpp b/main/can.cpp index 075b302..86021f2 100644 --- a/main/can.cpp +++ b/main/can.cpp @@ -273,14 +273,13 @@ void sendCanCommands() const auto timestamp_before = espchrono::millis_clock::now(); const auto result = twai_transmit(&message, timeout); + if (result != ESP_OK && result != ESP_ERR_TIMEOUT) { ESP_LOGE(TAG, "ERROR: twai_transmit() failed with %s", esp_err_to_name(result)); } - - - - if (result == ESP_ERR_TIMEOUT) { + else if (result == ESP_ERR_TIMEOUT) + { ++can_sequential_error_cnt; ++can_total_error_cnt; @@ -288,20 +287,29 @@ void sendCanCommands() espchrono::ago(timestamp_before).count(), can_sequential_error_cnt, can_total_error_cnt); - } else { + } + else + { can_sequential_error_cnt = 0; } - if (can_sequential_error_cnt > 3) { + if (can_sequential_error_cnt > 3) + { can_sequential_error_cnt = 0; - if (configs.canBusResetOnError.value) { - ESP_LOGE(TAG, "CAN BUS RESET: twai_stop(): %s", esp_err_to_name(twai_stop())); - ESP_LOGE(TAG, "CAN BUS RESET: twai_start(): %s", esp_err_to_name(twai_start())); - + if (configs.canResetOnError.value) + { + ESP_LOGW(TAG, "WARNING: Something isn't right, trying to restart can ic..."); + if (const auto err = twai_stop(); err != ESP_OK) + { + ESP_LOGE(TAG, "ERROR: twai_stop() 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)); + } } } - return result; }; diff --git a/main/displays/menus/controllerhardwaresettingsmenu.cpp b/main/displays/menus/controllerhardwaresettingsmenu.cpp index a49a3ad..e4d7c5b 100644 --- a/main/displays/menus/controllerhardwaresettingsmenu.cpp +++ b/main/displays/menus/controllerhardwaresettingsmenu.cpp @@ -31,6 +31,7 @@ constexpr char TEXT_FRONTSENDCAN[] = "Front send CAN"; constexpr char TEXT_BACKSENDCAN[] = "Back send CAN"; constexpr char TEXT_CANTRANSMITTIMEOUT[] = "CanTransmitTimeout"; constexpr char TEXT_CANRECEIVETIMEOUT[] = "CanReceiveTimeout"; +constexpr char TEXT_CANRESETONERROR[] = "Reset on error"; #endif constexpr char TEXT_BACK[] = "Back"; @@ -77,19 +78,20 @@ using CanReceiveTimeoutChangeScreen = espgui::makeComponent< ControllerHardwareSettingsMenu::ControllerHardwareSettingsMenu() { using namespace espgui; - constructMenuItem, SwitchScreenAction>>(); - constructMenuItem, SwitchScreenAction>>(); - constructMenuItem, SwitchScreenAction>>(); - constructMenuItem, SwitchScreenAction>>(); - constructMenuItem, SwitchScreenAction>>(); - constructMenuItem, BobbyCheckbox, SwapFrontBackAccessor>>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, BobbyCheckbox, SwapFrontBackAccessor>>(); #ifdef FEATURE_CAN constructMenuItem, BobbyCheckbox, SendFrontCanCmdAccessor>>(); constructMenuItem, BobbyCheckbox, SendBackCanCmdAccessor>>(); constructMenuItem, SwitchScreenAction>>(); constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, BobbyCheckbox, CanResetOnErrorAccessor>>(); #endif - constructMenuItem, SwitchScreenAction, StaticMenuItemIcon<&espgui::icons::back>>>(); + constructMenuItem, SwitchScreenAction, StaticMenuItemIcon<&espgui::icons::back>>>(); } std::string ControllerHardwareSettingsMenu::text() const diff --git a/main/newsettings.h b/main/newsettings.h index fdbe435..2423605 100644 --- a/main/newsettings.h +++ b/main/newsettings.h @@ -118,7 +118,7 @@ public: ConfigWrapper timezoneOffset{espchrono::minutes32{60}, DoReset, {}, "timezoneOffset" }; // MinMaxValue ConfigWrappertimeDst{espchrono::DayLightSavingMode::EuropeanSummerTime, DoReset, {}, "time_dst" }; - ConfigWrapper canBusResetOnError {false, DoReset, {}, "canBusRstErr" }; + ConfigWrapper canResetOnError {false, DoReset, {}, "canBusRstErr" }; ConfigWrapper sampleCount {50, DoReset, {}, "sampleCount" }; ConfigWrapper gasMin {0, DoReset, MinMaxValue, "gasMin" }; @@ -301,7 +301,7 @@ public: x(timezoneOffset) \ x(timeDst) \ \ - x(canBusResetOnError) \ + x(canResetOnError) \ \ x(sampleCount) \ x(gasMin) \