Merge pull request #315 from bobbycar-graz/esp-now-blinker

This commit is contained in:
CommanderRedYT
2022-05-15 23:12:24 +02:00
committed by GitHub
8 changed files with 141 additions and 28 deletions

View File

@ -38,6 +38,7 @@ set(headers
bluetoothmode.h
bluetoothtexthelpers.h
bmsutils.h
bobbyblinker.h
bobbybuttons.h
bobbycheckbox.h
bobbyerrorhandler.h
@ -281,6 +282,7 @@ set(sources
bluetoothmode.cpp
bluetoothtexthelpers.cpp
bmsutils.cpp
bobbyblinker.cpp
bobbybuttons.cpp
bobbyerrorhandler.cpp
bobbyhupe.cpp

View File

@ -254,3 +254,6 @@ struct QuickActionExtra1Accessor : public NewSettingsAccessor<BobbyQuickActions>
struct QuickActionExtra2Accessor : public NewSettingsAccessor<BobbyQuickActions> { ConfigWrapper<BobbyQuickActions> &getConfig() const override { return configs.quickActionExtra2; } };
struct QuickActionExtra3Accessor : public NewSettingsAccessor<BobbyQuickActions> { ConfigWrapper<BobbyQuickActions> &getConfig() const override { return configs.quickActionExtra3; } };
struct QuickActionExtra4Accessor : public NewSettingsAccessor<BobbyQuickActions> { ConfigWrapper<BobbyQuickActions> &getConfig() const override { return configs.quickActionExtra4; } };
// Other
struct AnhaengerIdAccessor : public NewSettingsAccessor<uint16_t> { ConfigWrapper<uint16_t> &getConfig() const override { return configs.anhaenger_id; } };

83
main/bobbyblinker.cpp Normal file
View File

@ -0,0 +1,83 @@
#include "bobbyblinker.h"
// system includes
#include <esp_log.h>
// 3rdparty lib includes
#include <cpputils.h>
// local includes
#include "globals.h"
#include "espnowfunctions.h"
#include "ledstrip.h"
using namespace std::chrono_literals;
namespace {
constexpr const char * const TAG = "BOBBY_BLINKER";
void sendState(const std::string& state)
{
if (const auto error = espnow::send_espnow_message(fmt::format("{}:{}:{}", state, espchrono::utc_clock::now().time_since_epoch().count(), configs.anhaenger_id.value)); error != ESP_OK)
{
ESP_LOGE(TAG, "Error sending blinker message: %s", esp_err_to_name(error));
}
}
bool brakeLightsOffSent{false};
} // namespace
namespace bobbyblinker {
std::optional<espchrono::millis_clock::time_point> blinker_last_time_sent;
std::optional<espchrono::millis_clock::time_point> brake_last_time_sent;
void handle_blinker()
{
if (!configs.espnow.syncBlink.value)
return;
const bool blinker_state = (cpputils::is_in(blinkAnimation, LEDSTRIP_OVERWRITE_BLINKLEFT, LEDSTRIP_OVERWRITE_BLINKRIGHT, LEDSTRIP_OVERWRITE_BLINKBOTH));
if ((blinker_state && !blinker_last_time_sent) || (blinker_state && blinker_last_time_sent && espchrono::ago(*blinker_last_time_sent) > 500ms))
{
blinker_last_time_sent = espchrono::millis_clock::now();
if (blinkAnimation == LEDSTRIP_OVERWRITE_BLINKLEFT)
{
sendState("BLINKLEFT");
}
else if (blinkAnimation == LEDSTRIP_OVERWRITE_BLINKRIGHT)
{
sendState("BLINKRIGHT");
}
else if (blinkAnimation == LEDSTRIP_OVERWRITE_BLINKBOTH)
{
sendState("BLINKBOTH");
}
}
else if (!blinker_state && blinker_last_time_sent)
{
blinker_last_time_sent = std::nullopt;
sendState("BLINKOFF");
}
if (configs.ledstrip.enableBrakeLights.value && espchrono::ago(*brake_last_time_sent) > 500ms)
{
float avgPwm{};
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");
brakeLightsOffSent = false;
}
else if (!brakeLightsOffSent && avgPwm > -1.f)
{
sendState("BRAKELIGHTSOFF");
brakeLightsOffSent = true;
}
}
}
} // namespace bobbyblinker

10
main/bobbyblinker.h Normal file
View File

@ -0,0 +1,10 @@
#pragma once
// 3rdparty lib includes
#include <espchrono.h>
namespace bobbyblinker {
extern std::optional<espchrono::millis_clock::time_point> blinker_last_time_sent;
extern std::optional<espchrono::millis_clock::time_point> brake_last_time_sent;
void handle_blinker();
} // namespace bobbyhupe

View File

@ -18,6 +18,7 @@
#include "globals.h"
#include "utils.h"
#include "bobbybuttons.h"
#include "bobbyquickactions.h"
namespace {
constexpr const char * const TAG = "DEBUG";
@ -159,16 +160,14 @@ void handleNormalChar(char c)
case 'Z':
if (espgui::currentDisplay)
{
espgui::currentDisplay->buttonPressed(espgui::Button(BobbyButton::Left2));
espgui::currentDisplay->buttonReleased(espgui::Button(BobbyButton::Left2));
quickactions::blink_left();
}
break;
case 'u':
case 'U':
if (espgui::currentDisplay)
{
espgui::currentDisplay->buttonPressed(espgui::Button(BobbyButton::Right2));
espgui::currentDisplay->buttonReleased(espgui::Button(BobbyButton::Right2));
quickactions::blink_right();
}
break;
}

View File

@ -9,35 +9,37 @@
#include "icons/back.h"
// local includes
#include "utils.h"
#include "icons/wifi.h"
#include "icons/bluetooth.h"
#include "icons/time.h"
#include "icons/hardware.h"
#include "icons/buzzer.h"
#include "icons/info.h"
#include "icons/demos.h"
#include "icons/update.h"
#include "globals.h"
#include "accessors/settingsaccessors.h"
#include "displays/menus/limitssettingsmenu.h"
#include "displays/menus/networksettingsmenu.h"
#include "displays/menus/bluetoothsettingsmenu.h"
#include "bobbycheckbox.h"
#include "displays/bobbychangevaluedisplay.h"
#include "displays/menus/aboutmenu.h"
#include "displays/menus/blesettingsmenu.h"
#include "displays/menus/cloudsettingsmenu.h"
#include "displays/menus/udpcloudsettingsmenu.h"
#include "displays/menus/espnowmenu.h"
#include "displays/menus/selectbuildservermenu.h"
#include "displays/menus/timesettingsmenu.h"
#include "displays/menus/modessettingsmenu.h"
#include "displays/menus/controllerhardwaresettingsmenu.h"
#include "displays/menus/bluetoothsettingsmenu.h"
#include "displays/menus/boardcomputerhardwaresettingsmenu.h"
#include "displays/menus/buzzermenu.h"
#include "displays/menus/cloudsettingsmenu.h"
#include "displays/menus/controllerhardwaresettingsmenu.h"
#include "displays/menus/crashmenu.h"
#include "displays/menus/aboutmenu.h"
#include "displays/menus/mainmenu.h"
#include "displays/menus/espnowmenu.h"
#include "displays/menus/featureflagsmenu.h"
#include "bobbycheckbox.h"
#include "displays/menus/limitssettingsmenu.h"
#include "displays/menus/mainmenu.h"
#include "displays/menus/modessettingsmenu.h"
#include "displays/menus/networksettingsmenu.h"
#include "displays/menus/selectbuildservermenu.h"
#include "displays/menus/timesettingsmenu.h"
#include "displays/menus/udpcloudsettingsmenu.h"
#include "globals.h"
#include "icons/bluetooth.h"
#include "icons/buzzer.h"
#include "icons/demos.h"
#include "icons/hardware.h"
#include "icons/info.h"
#include "icons/time.h"
#include "icons/update.h"
#include "icons/wifi.h"
#include "textwithvaluehelper.h"
#include "utils.h"
namespace {
constexpr char TEXT_SETTINGS[] = "Settings";
@ -55,6 +57,7 @@ constexpr char TEXT_MODESSETTINGS[] = "Modes settings";
constexpr char TEXT_CONTROLLERHARDWARESETTINGS[] = "Controller H/W settings";
constexpr char TEXT_BOARDCOMPUTERHARDWARESETTINGS[] = "Boardcomputer H/W settings";
constexpr char TEXT_FEATUREFLAGS[] = "Feature flags";
constexpr char TEXT_ANHAENGER_ID[] = "Anhaenger ID";
constexpr char TEXT_AUTOCONNECTBMS[] = "Auto connect BMS";
constexpr char TEXT_BUZZER[] = "Buzzer";
constexpr char TEXT_FRONTLED[] = "Front LED";
@ -72,6 +75,14 @@ struct BacklightAccessor : public virtual espgui::AccessorInterface<bool>
#endif
struct FrontLedAccessor : public espgui::RefAccessor<bool> { bool &getRef() const override { return controllers.front.command.led; } };
struct BackLedAccessor : public espgui::RefAccessor<bool> { bool &getRef() const override { return controllers.back.command.led; } };
using AnhaengerIdChangeScreen = espgui::makeComponent<
BobbyChangeValueDisplay<uint16_t>,
espgui::StaticText<TEXT_ANHAENGER_ID>,
AnhaengerIdAccessor,
espgui::ConfirmActionInterface<espgui::PopScreenAction>,
espgui::BackActionInterface<espgui::PopScreenAction>
>;
} // namespace
using namespace espgui;
@ -106,6 +117,7 @@ SettingsMenu::SettingsMenu()
constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_BOARDCOMPUTERHARDWARESETTINGS>, PushScreenAction<BoardcomputerHardwareSettingsMenu>, StaticMenuItemIcon<&bobbyicons::hardware>>>();
}
constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_FEATUREFLAGS>, PushScreenAction<FeatureFlagsMenu>, StaticMenuItemIcon<&bobbyicons::demos>>>();
constructMenuItem<makeComponent<MenuItem, TextWithValueHelper<TEXT_ANHAENGER_ID, AnhaengerIdAccessor>, espgui::PushScreenAction<AnhaengerIdChangeScreen>>>();
//#if defined(FEATURE_BLUETOOTH) && defined(FEATURE_BMS)
// constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_AUTOCONNECTBMS>, BobbyCheckbox, AutoConnectBmsAccessor>>();
//#endif

View File

@ -12,6 +12,7 @@
#include "time_bobbycar.h"
#include "newsettings.h"
#include "bobbyhupe.h"
#include "bobbyblinker.h"
namespace espnow {
uint16_t lastYear; // Used for esp-now timesync
@ -146,6 +147,7 @@ void initESPNow()
void handle()
{
bobbyhupe::handle_hupe();
bobbyblinker::handle_blinker();
if (initialized < 255 && espnow_init_allowed())
{
initESPNow();
@ -244,7 +246,7 @@ void handle()
}
else
{
ESP_LOGI(TAG, "Unkown Type: %s - Message: %s", msg.type.c_str(), msg.content.c_str());
ESP_LOGI(TAG, "Unknown Type: %s - Message: %s", msg.type.c_str(), msg.content.c_str());
}
}
clear:

View File

@ -368,6 +368,8 @@ public:
ConfiguredFeatureFlag esp_now {"featureEspNow", false, false, "espnow"};
} feature;
ConfigWrapper<uint16_t> anhaenger_id {0, DoReset, {}, "anhaenger_id" };
struct {
ConfigWrapper<bool> bleEnabled {true, DoReset, {}, "bleEnabled" };
} bleSettings;