Added acceleration detection for brake lights

This commit is contained in:
CommanderRedYT
2022-12-18 00:18:50 +01:00
parent f6b4966071
commit b61dfcf53d
7 changed files with 61 additions and 18 deletions

View File

@ -60,23 +60,18 @@ namespace bobbyblinker {
} }
if (configs.ledstrip.enableBrakeLights.value() && espchrono::ago(*brake_last_time_sent) > 500ms) if (configs.ledstrip.enableBrakeLights.value() && espchrono::ago(*brake_last_time_sent) > 500ms)
{ {
float avgPwm{}; if (brakeLightsStatus == brakeLightsOffSent)
for (const Controller &controller: controllers) {
avgPwm +=
controller.command.left.pwm * (controller.invertLeft ? -1 : 1) +
controller.command.right.pwm * (controller.invertRight ? -1 : 1);
}
avgPwm /= 4;
if (avgPwm < -1.f)
{ {
sendState("BRAKELIGHTSON"); if (brakeLightsStatus)
brakeLightsOffSent = false; {
} sendState("BRAKELIGHTSON");
else if (!brakeLightsOffSent && avgPwm > -1.f) brakeLightsOffSent = false;
{ }
sendState("BRAKELIGHTSOFF"); else if (!brakeLightsOffSent)
brakeLightsOffSent = true; {
sendState("BRAKELIGHTSOFF");
brakeLightsOffSent = true;
}
} }
} }
} }

View File

@ -62,6 +62,15 @@ constexpr char TEXT_ERASENVS[] = "Erase NVS (old)";
constexpr char TEXT_RESET_NVS_NEW[] = "Reset NVS (new)"; constexpr char TEXT_RESET_NVS_NEW[] = "Reset NVS (new)";
constexpr char TEXT_DYNAMICMENU[] = "GUI experiments"; constexpr char TEXT_DYNAMICMENU[] = "GUI experiments";
constexpr char TEXT_BACK[] = "Back"; constexpr char TEXT_BACK[] = "Back";
class AccelerationText : public virtual espgui::TextInterface
{
public:
std::string text() const override
{
return fmt::format("Accel: {:.6f}", avgAccel);
}
};
} // namespace } // namespace
DebugMenu::DebugMenu() DebugMenu::DebugMenu()
@ -82,6 +91,7 @@ DebugMenu::DebugMenu()
#ifdef FEATURE_CAN #ifdef FEATURE_CAN
constructMenuItem<makeComponent<MenuItem, CanIcCrashText, StaticFont<2>, DisabledColor, DummyAction>>(); constructMenuItem<makeComponent<MenuItem, CanIcCrashText, StaticFont<2>, DisabledColor, DummyAction>>();
#endif #endif
constructMenuItem<makeComponent<MenuItem, AccelerationText, StaticFont<2>, DisabledColor, DummyAction>>();
constructMenuItem<makeComponent<MenuItem, EmptyText, DummyAction>>(); constructMenuItem<makeComponent<MenuItem, EmptyText, DummyAction>>();
constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_FRONTCOMMAND>, PushScreenAction<FrontCommandDebugMenu>>>(); constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_FRONTCOMMAND>, PushScreenAction<FrontCommandDebugMenu>>>();
constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_BACKCOMMAND>, PushScreenAction<BackCommandDebugMenu>>>(); constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_BACKCOMMAND>, PushScreenAction<BackCommandDebugMenu>>>();

View File

@ -15,8 +15,12 @@ float gametrakDist;
float avgSpeed{}; float avgSpeed{};
float avgSpeedKmh{}; float avgSpeedKmh{};
float sumCurrent{}; float sumCurrent{};
float lastAvgSpeedKmh{};
float avgAccel{};
bool isLocked{}; bool isLocked{};
espchrono::millis_clock::time_point lastAvgSpeedKmhTs{};
std::optional<int> sunrise; std::optional<int> sunrise;
std::optional<int> sunset; std::optional<int> sunset;
std::optional<espchrono::DateTime> sunrise_dt; std::optional<espchrono::DateTime> sunrise_dt;

View File

@ -53,8 +53,12 @@ extern esp_pm_config_esp32_t pm_config;
extern float avgSpeed; extern float avgSpeed;
extern float avgSpeedKmh; extern float avgSpeedKmh;
extern float lastAvgSpeedKmh;
extern float avgAccel;
extern float sumCurrent; extern float sumCurrent;
extern espchrono::millis_clock::time_point lastAvgSpeedKmhTs;
extern bool isLocked; extern bool isLocked;
#ifdef GLOBALS_PLUGIN #ifdef GLOBALS_PLUGIN

View File

@ -19,6 +19,8 @@ std::vector<CRGB> leds;
uint8_t gHue = 0; uint8_t gHue = 0;
float gLedPosition = 0; // yes, this is intendet as a float value! Do NOT change! float gLedPosition = 0; // yes, this is intendet as a float value! Do NOT change!
bool brakeLightsStatus;
uint16_t blinkAnimation = LEDSTRIP_OVERWRITE_NONE; uint16_t blinkAnimation = LEDSTRIP_OVERWRITE_NONE;
namespace { namespace {
@ -149,11 +151,12 @@ void updateLedStrip()
} }
avgPwm /= 4; avgPwm /= 4;
if (avgPwm < -1.f) // avgAccel in m/s/s
if (avgPwm < -1.f || (avgAccel < -0.001f && avgSpeedKmh > 5.f))
{ {
auto color = avgSpeedKmh < -0.1f ? CRGB{255, 255, 255} : CRGB{255, 0, 0}; auto color = avgSpeedKmh < -0.1f ? CRGB{255, 255, 255} : CRGB{255, 0, 0};
const auto center = (std::begin(leds) + (leds.size() / 2) + configs.ledstrip.centerOffset.value()); brakeLightsStatus = true;
std::fill(std::begin(leds), std::end(leds), CRGB{0, 0, 0}); std::fill(std::begin(leds), std::end(leds), CRGB{0, 0, 0});
if (configs.ledstrip.enableFullBlink.value()) if (configs.ledstrip.enableFullBlink.value())
@ -162,12 +165,15 @@ void updateLedStrip()
} }
else if(!configs.ledstrip.enableAnimBlink.value()) else if(!configs.ledstrip.enableAnimBlink.value())
{ {
const auto center = (std::begin(leds) + (leds.size() / 2) + configs.ledstrip.centerOffset.value());
std::fill(center - configs.ledstrip.bigOffset.value() - 2, center - configs.ledstrip.smallOffset.value() + 2, color); std::fill(center - configs.ledstrip.bigOffset.value() - 2, center - configs.ledstrip.smallOffset.value() + 2, color);
std::fill(center + configs.ledstrip.smallOffset.value() - 2, center + configs.ledstrip.bigOffset.value() + 2, color); std::fill(center + configs.ledstrip.smallOffset.value() - 2, center + configs.ledstrip.bigOffset.value() + 2, color);
} }
} }
else else
{ {
brakeLightsStatus = false;
showAnimation(); showAnimation();
} }
} }

View File

@ -44,6 +44,8 @@ extern float gLedPosition; // yes, this is intendet as a float value! Do NOT cha
extern uint16_t blinkAnimation; extern uint16_t blinkAnimation;
extern bool brakeLightsStatus;
void showDefaultLedstrip(); void showDefaultLedstrip();
void showAnimation(); void showAnimation();
void showBetterRainbow(); void showBetterRainbow();

View File

@ -248,6 +248,28 @@ void updateAccumulators()
sumCurrent = fixCurrent(sumCurrent); sumCurrent = fixCurrent(sumCurrent);
avgSpeedKmh = convertToKmh(avgSpeed); avgSpeedKmh = convertToKmh(avgSpeed);
// accel
EVERY_N_MILLIS(100)
{
const auto now = espchrono::millis_clock::now();
const auto delta = now - lastAvgSpeedKmhTs;
const auto deltaSpeedKmh = avgSpeedKmh - lastAvgSpeedKmh;
// ESP_LOGI("utils.cpp", "delta: %lli ms, deltaSpeedKmh: %f", delta.count() / 1000, deltaSpeedKmh);
const auto deltaMilliseconds = delta.count() / 1000.f;
const auto kmh_s = deltaSpeedKmh / deltaMilliseconds; // km/h / s
const auto m_s2 = kmh_s * 1000.f / 3600.f; // m/s^2
// ESP_LOGI("utils.cpp", "m_s2: %f", m_s2);
avgAccel = m_s2;
lastAvgSpeedKmh = avgSpeedKmh;
lastAvgSpeedKmhTs = espchrono::millis_clock::now();
}
} }
float wattToAmpere(float watt) { float wattToAmpere(float watt) {