From cb11ca3c9e3f37738dbe103b972571364c4b0d64 Mon Sep 17 00:00:00 2001 From: CommanderRedYT Date: Sat, 12 Feb 2022 19:07:34 +0100 Subject: [PATCH] Mick config & fixes (#260) --- config_mick.cmake | 15 ++-- ignore.tar.gz.gpg | Bin 1538 -> 1664 bytes main/accessors/settingsaccessors.h | 1 + main/can.cpp | 4 + .../boardcomputerhardwaresettingsmenu.cpp | 9 ++ main/displays/menus/statisticsmenu.cpp | 3 +- main/displays/menus/taskmanagermenu.cpp | 3 +- main/dpad5wire_2out.cpp | 24 ++++- main/dpad6wire.cpp | 12 ++- main/drivingstatistics.cpp | 84 +++++++++--------- main/newsettings.h | 2 + 11 files changed, 99 insertions(+), 58 deletions(-) diff --git a/config_mick.cmake b/config_mick.cmake index fba536b..2ea366d 100644 --- a/config_mick.cmake +++ b/config_mick.cmake @@ -41,13 +41,13 @@ set(BOBBYCAR_BUILDFLAGS -DDEFAULT_FIELDWEAKMAX=7 -DDEFAULT_FIELDADVMAX=40 -DFEATURE_WEBSERVER -# -DFEATURE_OTA -# -DFEATURE_DPAD_5WIRESW -# -DPINS_DPAD_5WIRESW_OUT=4 -# -DPINS_DPAD_5WIRESW_IN1=5 -# -DPINS_DPAD_5WIRESW_IN2=27 -# -DPINS_DPAD_5WIRESW_IN3=18 -# -DPINS_DPAD_5WIRESW_IN4=19 + -DFEATURE_OTA + -DFEATURE_DPAD_5WIRESW_2OUT + -DPINS_DPAD_5WIRESW_OUT1=5 + -DPINS_DPAD_5WIRESW_OUT2=19 + -DPINS_DPAD_5WIRESW_IN1=4 + -DPINS_DPAD_5WIRESW_IN2=18 + -DPINS_DPAD_5WIRESW_IN3=27 -DFEATURE_BLE # -DFEATURE_BLUETOOTH # -DFEATURE_BMS @@ -70,6 +70,7 @@ set(BOBBYCAR_BUILDFLAGS -DLEDSTRIP_ANIMATION_DEFAULT=0 -DOLD_NVS -DFEATURE_DNS_NS + -DFEATURE_IS_MIR_EGAL_OB_DER_WEBSERVER_KORREKT_ARBEITET ) if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/ignore/lockscreen_plugin.cmake") diff --git a/ignore.tar.gz.gpg b/ignore.tar.gz.gpg index 55ca9aa87e0a8587eee442e9391dd17d40f63588..89d2932b8423a9f8770c91d15a5def3629277357 100644 GIT binary patch literal 1664 zcmeC-WnpJ#y8TGkoj3K^@Bf#Mu47Ex>RhFA+V$hS3m((|wI1<%XxElf>9SL-Bk=zL zeVxr4Pm~$lpRFRE=ht~F<1_pDPuF|CG75Pa*v!dEee-(hibQUCndmPocBd@!w%l{M zb%n<^|7pu*{2vAHThzJke+|=1>lOCmX`Pd9-xr^o>ghlIio&pdB2*PoLv={7yBt&RNGZ!}3@YQu@g>6z0Omdl;(JCwS)t!PH# zeM_MYr;crQJ$(3~M4N|{jmYZE-JgEmR`{Iwbn~z2CMRbe*#7@Wz>?!E1tI10Zyx8q zRoBD1zsRmDW}`%wIbX=?xjJgyb@mVW{|YUb(-|B4|7O73Tdt<}8!O*(2F zJWNzKb=0k0*KnNc=fA)?sk5}X(->v;Oqy4%xjktW??%6f2bBdSuQvR*R0_K95V830 z6Zxro+}ilv>R)fz$#%Q*MbV+GiJX~hTB?5}ikW2x%PGiNPw#x1+3jDreTBy41FK>k z{%U>OykvtLfA)mxF866`{N0x?$obJO^1b3V_qiY6l3j9syxyc$ZNM9G*g!t?&4%Oq zO}e>0Ub{9q@J;AHy(OorY8m;yxW7tR@t7raS%#1Hvu}32iYzw9QPz(4ch^=Ou}oNS z+)6Vc^u9UA+6dvAi`N51E3cOK@&0*Kt<8D%otNt@6BUarhD9>5Z$C*`T5Ggs{&)L+ z{MOsLsihiM?uY&6+1{P~&{AMW)Wmy%k&6&r0~oyzsoUq(s|%*BDWW^-VtoIQlF5 zm*(<&3QC_Uyz!}T%UZr`4eIju-_F~eyVUOFOU8PUNmdsuS5_)`6mkkUNrt;Uj7?)? z&HR0FH-q@M9n5@jYL@$?W%!;+tFAisrqxMz?UZ<92EO2n?QABZHzGLWQ&zi8JaPEW zNiXv_v9CPmyroanpH}|;=2Ck{X50g*LsM+?`pn87yHvW(l=UFg!e%|z1iQ=+Z% z(`in}C0C``Y?>{y`N`#3E$5UTiOyf}xBc|(&?NKuc}+>HEbj=ej#~LA;qt$;R{IZ1 zEoMAgdHv|-hPhS?@Agjlx{UX4>hHW`3(8t`i^US{5_^V zyH`Gcu{dUv;=~2tk2|l^4~S9j3o_m}+x*#QB}b<2BCA*TIQmyKzP~ARlqWXGMvDK) z!gJcO@1JR$%874&_sPtd}tzLiWt)5I$BD7SVZbfA&NfrQJW-%roQhuCuF)-BzDFsaMzhCjY2FV(6D=2CH|U zS#$6lNB<9Zmq~2j7ELkaFJV_VTFzVg{ojTKxh`DgrLw`}s>0GcTlFm3b4?5K*~*UYGjwE!CX`F&jDK z9yR%TPAyo;I3sTNa}Ac*ytJK~?A}u(d7=+xzcRA4Hqzeeyrk|>&5^AyZnx%`yDSM^ z+Msdw=lqvXK2Cb$aBXtA=I8dh!@18c+`TWnUNJ;=&a!hKw_h&QoXDw|<>i;?x-KD5 z_tbXj59jzbq|}~v@*gPIR{Q9{$)4$Q(DPkvh)uq%t^?zw7rKrwdvl$0PD(#Hv@OTI srAKMHij1{U=5m?N+W94SB)xYP@vpkU#Cy4W>+^N3=04XmwbpQYW literal 1538 zcmeC-WnpJ#YR)ZBJR1-Z|NGKW14hjvvrV$LYi1qa+G2RGMEKyf0tTB|r=M)U{ zelt#AH~ZEq>;K1ROga1e2)FmX>j%Cb>AE@JA%23J=^h@IW2<|&s=R-=ddK6Q)bfKY zcFQfF$~xw=$km^mZ^QHan&G!KtE3t_ou4RuIGwlPg7S*l-;)FC1pB$rQ?O#W{&i|Zyj~HoS!Q`_|Dz@;K8*2V2 zUvx`bY4m<}TD?+Jg4|v)+a@2M9+UO+gRTb7T(zs_=tHiJlQ#Q>a%fzk;`i7p5`sKCwtE zSk2V>eXHM|TYI#h-qU%zuJ^IqJ*~fwRK-lzZx^(07X7!roPFWWg1JK8M+z^_j=1yv zz*JV7d-C%PRGGZL9h6kHS?PJmT|lVReu`P}elC5# zQjgtFZh71~R+<@pz-#fxt?XuhbP|j{TW96|EW5B^PKUyWGp`uF*Umdx_Uf)3yR-{? zaY4jafA9L%(;WhhmySJKFT*DdOi@=UsBva^9%; z_Ws?Vhu$5nTex$3E*$<9uJnnZzpG_-d zw(==1pFMSNn9c3Ac9wPg`xf)hi_tl-RPbk2+8M2k3w+E*vH6Vxdjfv!@)JMUxWjO% z=v}6QAn}h1U#*ST*I&|-;k8XnJ3S-w#F6jkdg84jbV{07Eb~MqJTm_GB|ol>?4P#t z)H(ZA8#PwF4+&b5k#D%r?eXls^`ACOoWZ~Lr+36$&b&8XO1=W20Vf^r`nq)L9zU=m zQT1T@{g1&b_q!^`87}z|*_$?D$&;whWd;@+50^<+EOK;Q-Pi1pKXcRb{FPM)RE+PZms*Xt1glFZDtr<%Aaz5*&H^m*Sx2gIin+&uglnQw|l=y_x&&% zy~#HhoYS)5-xtH=x9f0s#@qzqIpqfbW<1Q@a0)uKhQSKRZ!yN%haa{sGlt Q1}9h5t7g6E+vCd#099f6Bme*a diff --git a/main/accessors/settingsaccessors.h b/main/accessors/settingsaccessors.h index 63e3ebd..7351226 100644 --- a/main/accessors/settingsaccessors.h +++ b/main/accessors/settingsaccessors.h @@ -113,6 +113,7 @@ struct BremsMinAccessor : public NewSettingsAccessor { ConfigWrapper { ConfigWrapper &getConfig() const override { return configs.bremsMax; } }; #if defined(FEATURE_DPAD) || defined(FEATURE_DPAD_3WIRESW) || defined(FEATURE_DPAD_5WIRESW) || defined(FEATURE_DPAD_5WIRESW_2OUT) || defined (FEATURE_DPAD_6WIRESW) struct DPadDebounceAccessor : public NewSettingsAccessor { ConfigWrapper &getConfig() const override { return configs.dpadDebounce; } }; +struct ButtonDelayAccessor : public NewSettingsAccessor { ConfigWrapper &getConfig() const override { return configs.buttonReadDelay; } }; #endif #ifdef FEATURE_GAMETRAK struct GametrakXMinAccessor : public NewSettingsAccessor { ConfigWrapper &getConfig() const override { return configs.boardcomputerHardware.gametrakXMin; } }; diff --git a/main/can.cpp b/main/can.cpp index 87401ce..1b628c1 100644 --- a/main/can.cpp +++ b/main/can.cpp @@ -331,10 +331,14 @@ void sendCanCommands() using namespace bobbycar::protocol::can; +#ifdef HAS_SIMPLIFIED + SIMPLIFIED_PWM +#else if (front) send(MotorController::Command::InpTgt, front->command.left.pwm); if (front) send(MotorController::Command::InpTgt, front->command.right.pwm); if (back) send(MotorController::Command::InpTgt, back->command.left.pwm); if (back) send(MotorController::Command::InpTgt, back->command.right.pwm); +#endif uint16_t buttonLeds{}; if (const auto index = settingsPersister.currentlyOpenProfileIndex()) diff --git a/main/displays/menus/boardcomputerhardwaresettingsmenu.cpp b/main/displays/menus/boardcomputerhardwaresettingsmenu.cpp index 19e3adb..c5a1f34 100644 --- a/main/displays/menus/boardcomputerhardwaresettingsmenu.cpp +++ b/main/displays/menus/boardcomputerhardwaresettingsmenu.cpp @@ -40,6 +40,7 @@ constexpr char TEXT_GASMAX[] = "gasMax"; constexpr char TEXT_BREMSMIN[] = "bremsMin"; constexpr char TEXT_BREMSMAX[] = "bremsMax"; constexpr char TEXT_DPADDEBOUNCE[] = "dpadDebounce"; +constexpr char TEXT_BUTTONDELAY[] = "button read delay"; constexpr char TEXT_GAMETRAKCALIBRATE[] = "Gametrak calibrate"; constexpr char TEXT_SETGAMETRAKXMIN[] = "Set gametrakXMin"; constexpr char TEXT_SETGAMETRAKXMAX[] = "Set gametrakXMax"; @@ -116,6 +117,13 @@ using DPadDebounceChangeScreen = espgui::makeComponent< espgui::ConfirmActionInterface>, espgui::BackActionInterface> >; +using ButtonDelayChangeScreen = espgui::makeComponent< + BobbyChangeValueDisplay, + espgui::StaticText, + ButtonDelayAccessor, + espgui::ConfirmActionInterface>, + espgui::BackActionInterface> +>; #endif #ifdef FEATURE_GAMETRAK @@ -198,6 +206,7 @@ BoardcomputerHardwareSettingsMenu::BoardcomputerHardwareSettingsMenu() constructMenuItem, SwitchScreenAction>>(); #if defined(FEATURE_DPAD) || defined(FEATURE_DPAD_3WIRESW) || defined(FEATURE_DPAD_5WIRESW) || defined(FEATURE_DPAD_5WIRESW_2OUT) || defined (FEATURE_DPAD_6WIRESW) constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction>>(); #endif #ifdef FEATURE_GAMETRAK constructMenuItem, diff --git a/main/displays/menus/statisticsmenu.cpp b/main/displays/menus/statisticsmenu.cpp index 0d798a5..cb767fd 100644 --- a/main/displays/menus/statisticsmenu.cpp +++ b/main/displays/menus/statisticsmenu.cpp @@ -42,6 +42,7 @@ class UptimeText : public virtual espgui::TextInterface public: std::string text() const override { + using namespace std::chrono_literals; const auto uptime = espchrono::millis_clock::now().time_since_epoch(); auto converted = date::make_time(uptime); auto msecs = uptime @@ -52,7 +53,7 @@ public: converted.hours().count(), converted.minutes().count(), converted.seconds().count(), - msecs.count()); + msecs / 1ms); } }; diff --git a/main/displays/menus/taskmanagermenu.cpp b/main/displays/menus/taskmanagermenu.cpp index 998d01d..9da00a5 100644 --- a/main/displays/menus/taskmanagermenu.cpp +++ b/main/displays/menus/taskmanagermenu.cpp @@ -12,6 +12,7 @@ #include "taskmanager.h" using namespace espgui; +using namespace std::chrono_literals; namespace { constexpr char TEXT_TASKMANAGER[] = "Taskmanager"; @@ -25,7 +26,7 @@ public: std::string text() const override { const std::string_view name{m_task.name()}; - return fmt::format("{}{}&f &2{} &1{}ms", name.size() > 6 ? "&s" : "", name, m_task.callCount(), m_task.maxElapsed().count()); + return fmt::format("{}{}&f &2{} &1{}ms", name.size() > 6 ? "&s" : "", name, m_task.callCount(), m_task.maxElapsed() / 1ms); } private: diff --git a/main/dpad5wire_2out.cpp b/main/dpad5wire_2out.cpp index 880a245..9532d73 100644 --- a/main/dpad5wire_2out.cpp +++ b/main/dpad5wire_2out.cpp @@ -52,7 +52,11 @@ std::array Helper::read() pinMode(IN2, INPUT_PULLUP); pinMode(IN3, INPUT_PULLUP); - vPortYield(); + if (configs.buttonReadDelay.value != 0) { + delayMicroseconds(configs.buttonReadDelay.value); + } else { + vPortYield(); + } result[0] = digitalRead(IN1)==LOW; result[1] = digitalRead(IN2)==LOW; @@ -64,7 +68,11 @@ std::array Helper::read() pinMode(IN2, INPUT_PULLDOWN); pinMode(IN3, INPUT_PULLDOWN); - vPortYield(); + if (configs.buttonReadDelay.value != 0) { + delayMicroseconds(configs.buttonReadDelay.value); + } else { + vPortYield(); + } result[3] = digitalRead(IN1); result[4] = digitalRead(IN2); @@ -79,7 +87,11 @@ std::array Helper::read() pinMode(IN2, INPUT_PULLUP); pinMode(IN3, INPUT_PULLUP); - vPortYield(); + if (configs.buttonReadDelay.value != 0) { + delayMicroseconds(configs.buttonReadDelay.value); + } else { + vPortYield(); + } result[6] = digitalRead(IN1)==LOW; result[7] = digitalRead(IN2)==LOW; @@ -91,7 +103,11 @@ std::array Helper::read() pinMode(IN2, INPUT_PULLDOWN); pinMode(IN3, INPUT_PULLDOWN); - vPortYield(); + if (configs.buttonReadDelay.value != 0) { + delayMicroseconds(configs.buttonReadDelay.value); + } else { + vPortYield(); + } result[9] = digitalRead(IN1); result[10] = digitalRead(IN2); diff --git a/main/dpad6wire.cpp b/main/dpad6wire.cpp index a52a4c7..a360c6f 100644 --- a/main/dpad6wire.cpp +++ b/main/dpad6wire.cpp @@ -53,7 +53,11 @@ std::array Helper::read() pinMode(IN4, INPUT_PULLUP); pinMode(IN5, INPUT_PULLUP); - vPortYield(); + if (configs.buttonReadDelay.value != 0) { + delayMicroseconds(configs.buttonReadDelay.value); + } else { + vPortYield(); + } result[0] = digitalRead(IN1)==LOW; result[1] = digitalRead(IN2)==LOW; @@ -69,7 +73,11 @@ std::array Helper::read() pinMode(IN4, INPUT_PULLDOWN); pinMode(IN5, INPUT_PULLDOWN); - vPortYield(); + if (configs.buttonReadDelay.value != 0) { + delayMicroseconds(configs.buttonReadDelay.value); + } else { + vPortYield(); + } result[4] = digitalRead(IN1); result[5] = digitalRead(IN2); diff --git a/main/drivingstatistics.cpp b/main/drivingstatistics.cpp index 8d9636f..9a1b59d 100644 --- a/main/drivingstatistics.cpp +++ b/main/drivingstatistics.cpp @@ -21,7 +21,7 @@ float getAvgWhPerKm() float getAvgKmh() { - return (drivingStatistics.meters_driven / 1000.) / ((drivingStatistics.currentDrivingTime / 1ms) / 1000 / 60 / 60); // (meter / 1000) / (ms / 1000 / 60 / 60) + return (drivingStatistics.meters_driven / 1000.f) / ((drivingStatistics.currentDrivingTime / 1ms) / 1000.f / 60.f / 60.f); // (meter / 1000) / (ms / 1000 / 60 / 60) } float getEstimatedKmLeft() @@ -72,53 +72,51 @@ void initStatistics() void calculateStatistics() { - EVERY_N_MILLIS( 10 ) { - static bool saveTotal = false; + static bool saveTotal = false; - if ((configs.savedStatistics.totalCentimeters.value / 100.f) > drivingStatistics.totalMeters) + if ((configs.savedStatistics.totalCentimeters.value / 100.f) > drivingStatistics.totalMeters) + { + drivingStatistics.totalMeters = configs.savedStatistics.totalCentimeters.value / 100.f; + drivingStatistics.last_cm_written = configs.savedStatistics.totalCentimeters.value; + } + + static auto last_km_calculation = espchrono::millis_clock::now(); + const auto duration = espchrono::ago(last_km_calculation); + last_km_calculation = espchrono::millis_clock::now(); + + const float meters_driven_now = (abs(avgSpeedKmh) / 3.6) * ((duration / 1ms) / 1000.); + drivingStatistics.meters_driven += meters_driven_now; + drivingStatistics.totalMeters += meters_driven_now; // Udate meters driven + + if (abs(avgSpeedKmh) > 1) + { + if (!saveTotal && abs(avgSpeedKmh) > 5) { - drivingStatistics.totalMeters = configs.savedStatistics.totalCentimeters.value / 100.f; - drivingStatistics.last_cm_written = configs.savedStatistics.totalCentimeters.value; + saveTotal = true; } + drivingStatistics.currentDrivingTime += duration; - static auto last_km_calculation = espchrono::millis_clock::now(); - const auto duration = espchrono::ago(last_km_calculation); - last_km_calculation = espchrono::millis_clock::now(); - - const float meters_driven_now = (abs(avgSpeedKmh) / 3.6) * ((duration / 1ms) / 1000.); - drivingStatistics.meters_driven += meters_driven_now; - drivingStatistics.totalMeters += meters_driven_now; // Udate meters driven - - if (abs(avgSpeedKmh) > 1) + if (const auto avgVoltage = controllers.getAvgVoltage(); avgVoltage) { - if (!saveTotal && abs(avgSpeedKmh) > 5) - { - saveTotal = true; - } - drivingStatistics.currentDrivingTime += duration; - - if (const auto avgVoltage = controllers.getAvgVoltage(); avgVoltage) - { - auto watt = sumCurrent * *avgVoltage; - const float ws_driven_now = watt * ((duration / 1ms) / 1000.); - drivingStatistics.wh_used += ws_driven_now / 3600; // Wh - drivingStatistics.batteryWhEstimate -= ws_driven_now / 3600; - } - } - else - { - drivingStatistics.wh_used += (13 * ((duration / 1ms) / 1000.)) / 3600; // Wh - drivingStatistics.batteryWhEstimate = getRemainingWattHours(); - } - - if ((drivingStatistics.totalMeters > ((drivingStatistics.last_cm_written / 100.f) + 100)) || (saveTotal && abs(avgSpeedKmh) < 0.5)) - { - if (saveTotal) - { - saveTotal = false; - } - drivingStatistics.last_cm_written = drivingStatistics.totalMeters * 100; // Save total Meters - configs.write_config(configs.savedStatistics.totalCentimeters, drivingStatistics.last_cm_written); + auto watt = sumCurrent * *avgVoltage; + const float ws_driven_now = watt * ((duration / 1ms) / 1000.); + drivingStatistics.wh_used += ws_driven_now / 3600; // Wh + drivingStatistics.batteryWhEstimate -= ws_driven_now / 3600; } } + else + { + drivingStatistics.wh_used += (13 * ((duration / 1ms) / 1000.)) / 3600; // Wh + drivingStatistics.batteryWhEstimate = getRemainingWattHours(); + } + + if ((drivingStatistics.totalMeters > ((drivingStatistics.last_cm_written / 100.f) + 100)) || (saveTotal && abs(avgSpeedKmh) < 0.5)) + { + if (saveTotal) + { + saveTotal = false; + } + drivingStatistics.last_cm_written = drivingStatistics.totalMeters * 100; // Save total Meters + configs.write_config(configs.savedStatistics.totalCentimeters, drivingStatistics.last_cm_written); + } } diff --git a/main/newsettings.h b/main/newsettings.h index cbf8cc9..d89c8eb 100644 --- a/main/newsettings.h +++ b/main/newsettings.h @@ -138,6 +138,7 @@ public: ConfigWrapper deadband {20, DoReset, MinMaxValue,"deadband" }; ConfigWrapper dpadDebounce {25, DoReset, {}, "dpadDebounce" }; + ConfigWrapper buttonReadDelay {1, DoReset, {}, "buttonDelay" }; ConfigWrapper dpadMappingLeft {INPUT_MAPPING_NONE, DoReset, {}, "dpadMapLeft" }; ConfigWrapper dpadMappingRight {INPUT_MAPPING_NONE, DoReset, {}, "dpadMapRight" }; @@ -432,6 +433,7 @@ public: x(deadband) \ \ x(dpadDebounce) \ + x(buttonReadDelay) \ \ x(dpadMappingLeft) \ x(dpadMappingRight) \