From 702e4a7f41d1b6be3dc350fdbd45a2d10170786f Mon Sep 17 00:00:00 2001 From: CommanderRedYT Date: Sat, 1 Jan 2022 19:58:19 +0100 Subject: [PATCH 1/2] Added can option in menudisplay --- main/accessors/settingsaccessors.h | 3 ++ main/can.cpp | 30 ++++++++++++------- .../menus/controllerhardwaresettingsmenu.cpp | 16 +++++----- main/newsettings.h | 4 +-- 4 files changed, 33 insertions(+), 20 deletions(-) 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) \ From cdf4d6d5ae1dffabc50d66bb2e4b91190835b8c9 Mon Sep 17 00:00:00 2001 From: CommanderRedYT Date: Sat, 1 Jan 2022 19:59:49 +0100 Subject: [PATCH 2/2] Removed queue --- main/espnowfunctions.cpp | 92 +++++++++++++++++----------------------- main/espnowfunctions.h | 2 - 2 files changed, 39 insertions(+), 55 deletions(-) diff --git a/main/espnowfunctions.cpp b/main/espnowfunctions.cpp index 8ca954a..97893b3 100644 --- a/main/espnowfunctions.cpp +++ b/main/espnowfunctions.cpp @@ -1,8 +1,6 @@ #ifdef FEATURE_ESPNOW #include "espnowfunctions.h" -#include - #include #include #include @@ -20,7 +18,6 @@ constexpr const char * const TAG = "BOBBY_ESP_NOW"; uint16_t lastYear; // Used for esp-now timesync -std::deque message_queue{}; std::vector peers{}; uint8_t initialized{0}; @@ -36,14 +33,46 @@ extern "C" void onReceive(const uint8_t *mac_addr, const uint8_t *data, int data size_t sep_pos = data_str.find(":"); if (std::string_view::npos != sep_pos) { - std::string_view msg_type = data_str.substr(0, sep_pos); - std::string_view msg = data_str.substr(sep_pos+1, data_str.length()-sep_pos-1); - ESP_LOGD(TAG, "Type: %.*s - Message: %.*s", msg_type.size(), msg_type.data(), msg.size(), msg.data()); + esp_now_message_t msg{ + .content = std::string{data_str.substr(sep_pos+1, data_str.length()-sep_pos-1)}, + .type = std::string{data_str.substr(0, sep_pos)} + }; - message_queue.push_back(esp_now_message_t { - .content = std::string{msg}, - .type = std::string{msg_type} - }); + ESP_LOGD(TAG, "Type: %s - Message: %s", msg.type.c_str(), msg.content.c_str()); + + if (msg.type == "T") + { + if (!receiveTimeStamp || !settings.espnow.syncTime) + return; + + if (const auto result = cpputils::fromString(msg.content); result) + { + onRecvTs(*result); + } + else + { + ESP_LOGW(TAG, "could not parse number: %.*s", result.error().size(), result.error().data()); + } + } + else if (msg.type == "BOBBYT") + { + if (!receiveTsFromOtherBobbycars || !settings.espnow.syncTimeWithOthers) + return; + + if (const auto result = cpputils::fromString(msg.content); result) + { + ESP_LOGI(TAG, "setting current time to %" PRIu64, *result); + onRecvTs(*result, true); + } + else + { + ESP_LOGW(TAG, "could not parse number: %.*s", result.error().size(), result.error().data()); + } + } + else + { + ESP_LOGI(TAG, "Unkown Type: %s - Message: %s", msg.type.c_str(), msg.content.c_str()); + } } else { @@ -183,49 +212,6 @@ void handle() } return; } - - if(message_queue.size()) - { - for (const esp_now_message_t &msg : message_queue) - { - ESP_LOGD(TAG, "queue has processed message of type '%s' with content '%s'", msg.type.c_str(), msg.content.c_str()); - message_queue.pop_front(); - - if (msg.type == "T") - { - if (!receiveTimeStamp || !settings.espnow.syncTime) - return; - - if (const auto result = cpputils::fromString(msg.content); result) - { - onRecvTs(*result); - } - else - { - ESP_LOGW(TAG, "could not parse number: %.*s", result.error().size(), result.error().data()); - } - } - else if (msg.type == "BOBBYT") - { - if (!receiveTsFromOtherBobbycars || !settings.espnow.syncTimeWithOthers) - return; - - if (const auto result = cpputils::fromString(msg.content); result) - { - ESP_LOGI(TAG, "setting current time to %" PRIu64, *result); - onRecvTs(*result, true); - } - else - { - ESP_LOGW(TAG, "could not parse number: %.*s", result.error().size(), result.error().data()); - } - } - else - { - ESP_LOGI(TAG, "Unkown Type: %s - Message: %s", msg.type.c_str(), msg.content.c_str()); - } - } - } } void onRecvTs(uint64_t millis, bool isFromBobbycar) diff --git a/main/espnowfunctions.h b/main/espnowfunctions.h index 99f7726..8c328d6 100644 --- a/main/espnowfunctions.h +++ b/main/espnowfunctions.h @@ -1,7 +1,6 @@ #pragma once #ifdef FEATURE_ESPNOW #include -#include #include #include #include @@ -19,7 +18,6 @@ struct esp_now_message_t extern bool receiveTimeStamp; extern bool receiveTsFromOtherBobbycars; -extern std::deque message_queue; extern std::vector peers; void initESPNow();