Merge pull request #315 from bobbycar-graz/esp-now-blinker
This commit is contained in:
@ -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
|
||||
|
@ -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
83
main/bobbyblinker.cpp
Normal 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
10
main/bobbyblinker.h
Normal 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
|
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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:
|
||||
|
@ -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;
|
||||
|
Reference in New Issue
Block a user