Implemented basic ledstrip

This commit is contained in:
2021-08-17 22:06:13 +02:00
parent 3570fc03a3
commit 1d2c5d3b67
8 changed files with 117 additions and 28 deletions

3
.gitmodules vendored
View File

@ -52,3 +52,6 @@
[submodule "components/espasynchttpreq"]
path = components/espasynchttpreq
url = git@github.com:0xFEEDC0DE64/espasynchttpreq.git
[submodule "components/FastLED-idf"]
path = components/FastLED-idf
url = git@github.com:0xFEEDC0DE64/FastLED-idf.git

View File

@ -84,4 +84,6 @@ set(BOBBYCAR_BUILDFLAGS
# -DFEATURE_GARAGE
# -DFEATURE_NTP
-DFEATURE_WIRELESS_CONFIG
# -DFEATURE_LEDSTRIP
# -DPINS_LEDSTRIP=26
)

View File

@ -84,4 +84,7 @@ set(BOBBYCAR_BUILDFLAGS
-DFEATURE_GARAGE
-DFEATURE_NTP
# -DFEATURE_WIRELESS_CONFIG
-DFEATURE_LEDSTRIP
-DPINS_LEDSTRIP=26
-DLEDSTRIP_LENGTH=95
)

View File

@ -126,6 +126,7 @@ set(headers
icons/unchecked.h
icons/update.h
icons/wifi.h
ledstrip.h
menudisplay.h
menuitem.h
modes/defaultmode.h
@ -185,9 +186,9 @@ set(sources
set(dependencies
libsodium freertos nvs_flash esp_http_server esp_https_ota mdns app_update esp_system esp_websocket_client driver
arduino-esp32 ArduinoJson esp-nimble-cpp
arduino-esp32 ArduinoJson esp-nimble-cpp FastLED-idf TFT_eSPI
bobbycar-protocol cpputils cxx-ring-buffer date
espasynchttpreq espasyncota espchrono espcpputils esphttpdutils espwifistack expected fmt TFT_eSPI
espasynchttpreq espasyncota espchrono espcpputils esphttpdutils espwifistack expected fmt
)
idf_component_register(

51
main/ledstrip.h Normal file
View File

@ -0,0 +1,51 @@
#pragma once
#ifdef FEATURE_LEDSTRIP
// 3rdparty lib includes
#include <FastLED.h>
// local includes
#include "globals.h"
namespace {
std::array<CRGB, LEDSTRIP_LENGTH> leds;
uint8_t gHue = 0;
void initLedStrip()
{
FastLED.addLeds<NEOPIXEL, PINS_LEDSTRIP>(std::begin(leds), leds.size())
.setCorrection(TypicalSMD5050);
}
void updateLedStrip()
{
EVERY_N_MILLISECONDS( 20 ) { gHue++; }
if (brems && *brems > 50.f)
{
auto color = avgSpeedKmh < -0.1f ? CRGB{255, 255, 255} : CRGB{255, 0, 0};
constexpr auto kleinerOffset = 4;
constexpr auto grosserOffset = 10;
const auto center = std::begin(leds) + (leds.size() / 2) + 1;
std::fill(std::begin(leds), std::end(leds), CRGB{0, 0, 0});
std::fill(center - grosserOffset, center - kleinerOffset, color);
std::fill(center + kleinerOffset, center + grosserOffset, color);
}
else
{
fadeToBlackBy(std::begin(leds), leds.size(), 20);
uint8_t dothue = 0;
for (int i = 0; i < 8; i++)
{
leds[beatsin16(i + 7, 0, leds.size())] |= CHSV(dothue, 200, 255);
dothue += 32;
}
}
FastLED.show();
}
} // namespace
#endif

View File

@ -134,6 +134,9 @@ using namespace std::chrono_literals;
#endif
#include "wifi_bobbycar.h"
#include "time_bobbycar.h"
#ifdef FEATURE_LEDSTRIP
#include "ledstrip.h"
#endif
namespace {
std::optional<espchrono::millis_clock::time_point> lastWifiUpdate;
@ -154,6 +157,9 @@ std::optional<espchrono::millis_clock::time_point> lastCloudUpdate;
#ifdef FEATURE_NTP
std::optional<espchrono::millis_clock::time_point> lastNtpUpdate;
#endif
#ifdef FEATURE_LEDSTRIP
std::optional<espchrono::millis_clock::time_point> lastLedstripUpdate;
#endif
}
extern "C" void app_main()
@ -173,6 +179,32 @@ extern "C" void app_main()
initScreen();
bootLabel.redraw("settings");
settings = presets::defaultSettings;
stringSettings = presets::makeDefaultStringSettings();
if (settingsPersister.init())
{
if (!settingsPersister.openCommon())
ESP_LOGE("BOBBY", "openCommon() failed");
if (!settingsPersister.openProfile(0))
ESP_LOGE("BOBBY", "openProfile(0) failed");
loadSettings();
}
else
ESP_LOGE("BOBBY", "init() failed");
bootLabel.redraw("deviceName");
if (const auto result = wifi_stack::get_default_mac_addr())
std::sprintf(deviceName, STRING(DEVICE_PREFIX) "_%02hhx%02hhx%02hhx", result->at(3), result->at(4), result->at(5));
else
ESP_LOGE("MAIN", "get_default_mac_addr() failed: %.*s", result.error().size(), result.error().data());
bootLabel.redraw("wifi");
wifi_begin();
#ifdef FEATURE_DPAD
bootLabel.redraw("dpad");
dpad::init();
@ -204,32 +236,6 @@ extern "C" void app_main()
digitalWrite(PINS_MOSFET2, LOW);
#endif
bootLabel.redraw("settings");
settings = presets::defaultSettings;
stringSettings = presets::makeDefaultStringSettings();
if (settingsPersister.init())
{
if (!settingsPersister.openCommon())
ESP_LOGE("BOBBY", "openCommon() failed");
if (!settingsPersister.openProfile(0))
ESP_LOGE("BOBBY", "openProfile(0) failed");
loadSettings();
}
else
ESP_LOGE("BOBBY", "init() failed");
bootLabel.redraw("deviceName");
if (const auto result = wifi_stack::get_default_mac_addr())
std::sprintf(deviceName, STRING(DEVICE_PREFIX) "_%02hhx%02hhx%02hhx", result->at(3), result->at(4), result->at(5));
else
ESP_LOGE("MAIN", "get_default_mac_addr() failed: %.*s", result.error().size(), result.error().data());
bootLabel.redraw("wifi");
wifi_begin();
#ifdef FEATURE_SERIAL
bootLabel.redraw("swap front back");
updateSwapFrontBack();
@ -256,6 +262,7 @@ extern "C" void app_main()
#endif
#ifdef FEATURE_CAN
bootLabel.redraw("can");
can::initCan();
#endif
@ -267,6 +274,11 @@ extern "C" void app_main()
controllers.back.serial.get().begin(38400, SERIAL_8N1, PINS_RX2, PINS_TX2);
#endif
#ifdef FEATURE_LEDSTRIP
bootLabel.redraw("LED strip");
initLedStrip();
#endif
raw_gas = std::nullopt;
raw_brems = std::nullopt;
gas = std::nullopt;
@ -451,5 +463,14 @@ extern "C" void app_main()
#ifdef FEATURE_BMS
bms::update();
#endif
#ifdef FEATURE_LEDSTRIP
if (!lastLedstripUpdate || now - *lastLedstripUpdate >= 1000ms / 60)
{
updateLedStrip();
lastLedstripUpdate = now;
}
#endif
}
}

View File

@ -127,6 +127,13 @@ CONFIG_PARTITION_TABLE_OFFSET=0xf000
CONFIG_PARTITION_TABLE_MD5=y
# end of Partition Table
#
# FastLED
#
# CONFIG_FASTLED_METHOD_I2S is not set
CONFIG_FASTLED_METHOD_RMT=y
# end of FastLED
#
# Arduino Configuration
#