build for esp32 mask project
This commit is contained in:
187
src/main.cpp
187
src/main.cpp
@@ -12,7 +12,6 @@
|
||||
|
||||
#include "Static.h"
|
||||
#include "Config.h"
|
||||
#include "colors.h"
|
||||
|
||||
#include "Sequencer.h"
|
||||
#include "LogService.h"
|
||||
@@ -36,6 +35,7 @@
|
||||
#include "platform/particle/MDNSService.cpp"
|
||||
#else
|
||||
#include "WiFiTask.h"
|
||||
#include "platform/arduino/BluetoothSerialTelemetry.h"
|
||||
#include "platform/arduino/MQTTTelemetry.h"
|
||||
#include <ArduinoOTA.h>
|
||||
#endif
|
||||
@@ -55,9 +55,6 @@
|
||||
CRGB leds[HardwareConfig::MAX_LED_NUM];
|
||||
Display dpy(leds, HardwareConfig::MAX_LED_NUM, Static<ConfigService>::instance()->coordMap());
|
||||
|
||||
LinearCoordinateMapping neckMap{60, 0};
|
||||
Display neckDisplay(leds, HardwareConfig::MAX_LED_NUM, &neckMap);
|
||||
|
||||
// Setup power management
|
||||
Power<MAX_BRIGHTNESS, PSU_MILLIAMPS> power;
|
||||
|
||||
@@ -113,7 +110,7 @@ class ArduinoOTAUpdater : public BufferedInputSource {
|
||||
}
|
||||
|
||||
void handleEvent(const InputEvent& evt) {
|
||||
if (evt.intent == InputEvent::NetworkStatus) {
|
||||
if (evt.intent == InputEvent::NetworkStatus && evt.asInt()) {
|
||||
Log.notice("Booting OTA");
|
||||
m_online = true;
|
||||
ArduinoOTA.begin();
|
||||
@@ -176,19 +173,17 @@ DrainAnimation drain{Task::Stopped};
|
||||
Flashlight flashlight{Task::Stopped};
|
||||
|
||||
Sequencer sequencer{{
|
||||
{"Idle", {"Solid", "MPU5060", "Pulse", "Hackerbots", "Kieryn", "CircadianRhythm"}},
|
||||
{"Idle", {"Solid", "MPU5060", "Pulse", "IdleColors", "CircadianRhythm"}},
|
||||
{"Solid", {"Solid", "MPU5060", "Pulse", "CircadianRhythm"}},
|
||||
{"Interactive", {"Drain", "CircadianRhythm"}},
|
||||
{"Interactive", {"Drain", "MPU5060", "CircadianRhythm"}},
|
||||
{"Flashlight", {"Flashlight"}},
|
||||
{"Nightlight", {"Drain", "Pulse", "Noisebridge"}},
|
||||
{"Gay", {"Solid", "Pulse", "Rainbow", "Hackerbots", "Kieryn"}},
|
||||
{"Acid", {"Chimes", "Pulse", "MPU5060", "Hackerbots", "Rainbow"}},
|
||||
{"Gay", {"Solid", "Pulse", "Rainbow", "Rainbow"}},
|
||||
{"Acid", {"Chimes", "Pulse", "MPU5060", "IdleColors", "Rainbow"}},
|
||||
}};
|
||||
|
||||
|
||||
// Render all layers to the displays
|
||||
Renderer renderer{
|
||||
//{&dpy, &neckDisplay},
|
||||
{&dpy},
|
||||
{
|
||||
&chimes,
|
||||
@@ -207,29 +202,22 @@ Renderer configRenderer{
|
||||
};
|
||||
|
||||
// Cycle some random colors
|
||||
ColorSequenceInput<7> noisebridgeCycle{{colorForName("Red").rgb}, "Noisebridge", Task::Stopped};
|
||||
|
||||
ColorSequenceInput<13> kierynCycle{{
|
||||
ColorSequenceInput<9> idleCycle{{
|
||||
CRGB(0, 123, 167), // Cerulean
|
||||
CRGB(80, 200, 120), // Emerald
|
||||
CRGB(207, 113, 175), // Sky Magenta
|
||||
}, "Kieryn", Task::Running};
|
||||
|
||||
ColorSequenceInput<7> rainbowCycle{{
|
||||
colorForName("Red").rgb,
|
||||
colorForName("Orange").rgb,
|
||||
colorForName("Yellow").rgb,
|
||||
colorForName("Green").rgb,
|
||||
colorForName("Blue").rgb,
|
||||
colorForName("Purple").rgb,
|
||||
colorForName("White").rgb,
|
||||
}, "Rainbow", Task::Stopped};
|
||||
|
||||
ColorSequenceInput<7> hackerbotsCycle{{
|
||||
CRGB(128, 0, 128), // Purple
|
||||
CRGB(255, 255, 255), // White
|
||||
CRGB(0, 255, 255), // Cyan
|
||||
}, "Hackerbots", Task::Running};
|
||||
}, "IdleColors", Task::Running};
|
||||
|
||||
ColorSequenceInput<7> rainbowCycle{{
|
||||
CRGB(255, 0, 0), // Red
|
||||
CRGB(255, 127, 0), // Yellow
|
||||
CRGB(0, 255, 0), // Green
|
||||
CRGB(0, 0, 255), // Blue
|
||||
CRGB(128, 0, 128), // Purple
|
||||
}, "Rainbow", Task::Stopped};
|
||||
|
||||
struct ConfigInputTask: public BufferedInputSource {
|
||||
public:
|
||||
@@ -324,48 +312,53 @@ std::array<ScheduleEntry, 10> schedule{{
|
||||
{23, 20}
|
||||
}};
|
||||
|
||||
uint8_t brightnessForTime(uint8_t hour, uint8_t minute) {
|
||||
ScheduleEntry start = schedule.back();
|
||||
ScheduleEntry end = schedule.front();
|
||||
for(ScheduleEntry cur : schedule) {
|
||||
// Find the last hour that is prior to or equal to now
|
||||
if (cur.hour <= hour) {
|
||||
start = cur;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
for(ScheduleEntry cur : schedule) {
|
||||
// Find the first hour that is after now
|
||||
// If no such hour exists, we should automatically wrap back to hour 0
|
||||
if (cur.hour > hour) {
|
||||
end = cur;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (start.hour > end.hour) {
|
||||
end.hour += 24;
|
||||
}
|
||||
|
||||
uint16_t startTime = start.hour * 60;
|
||||
uint16_t endTime = end.hour * 60;
|
||||
uint16_t nowTime = hour * 60 + minute;
|
||||
|
||||
uint16_t duration = endTime - startTime;
|
||||
uint16_t curDuration = nowTime - startTime;
|
||||
|
||||
uint8_t frac = ((double)curDuration / (double)duration) * 255.0;
|
||||
|
||||
return lerp8by8(start.brightness, end.brightness, frac);
|
||||
}
|
||||
|
||||
class CircadianRhythm : public InputSource {
|
||||
private:
|
||||
bool needsUpdate = true;
|
||||
public:
|
||||
CircadianRhythm() : InputSource("CircadianRhythm") {}
|
||||
|
||||
void onStart() {
|
||||
needsUpdate = true;
|
||||
}
|
||||
|
||||
uint8_t brightnessForTime(uint8_t hour, uint8_t minute) const {
|
||||
ScheduleEntry start = schedule.back();
|
||||
ScheduleEntry end = schedule.front();
|
||||
for(ScheduleEntry cur : schedule) {
|
||||
// Find the last hour that is prior to or equal to now
|
||||
if (cur.hour <= hour) {
|
||||
start = cur;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
for(ScheduleEntry cur : schedule) {
|
||||
// Find the first hour that is after now
|
||||
// If no such hour exists, we should automatically wrap back to hour 0
|
||||
if (cur.hour > hour) {
|
||||
end = cur;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (start.hour > end.hour) {
|
||||
end.hour += 24;
|
||||
}
|
||||
|
||||
uint16_t startTime = start.hour * 60;
|
||||
uint16_t endTime = end.hour * 60;
|
||||
uint16_t nowTime = hour * 60 + minute;
|
||||
|
||||
uint16_t duration = endTime - startTime;
|
||||
uint16_t curDuration = nowTime - startTime;
|
||||
|
||||
uint8_t frac = map8(curDuration, 0, duration);
|
||||
|
||||
return lerp8by8(start.brightness, end.brightness, frac);
|
||||
}
|
||||
|
||||
|
||||
InputEvent read() {
|
||||
EVERY_N_SECONDS(60) {
|
||||
needsUpdate = true;
|
||||
@@ -390,6 +383,8 @@ STATIC_ALLOC(CircadianRhythm);
|
||||
// A special mainloop app for configuring hardware settings that reboots the
|
||||
// device when the user is finished.
|
||||
MainLoop configApp{{
|
||||
Static<Platform>::instance(),
|
||||
|
||||
// Manage read/write of configuration data
|
||||
Static<ConfigService>::instance(),
|
||||
|
||||
@@ -415,9 +410,45 @@ MainLoop configApp{{
|
||||
&configRenderer,
|
||||
}};
|
||||
|
||||
TaskFunc safeModeNag([]{
|
||||
static uint8_t frame = 0;
|
||||
EVERY_N_SECONDS(30) {
|
||||
Log.notice("I am running in safe mode!");
|
||||
}
|
||||
EVERY_N_MILLISECONDS(16) {
|
||||
frame++;
|
||||
for(int i = 0; i < HardwareConfig::MAX_LED_NUM; i++) {
|
||||
leds[i] = CRGB(0, 0, 0);
|
||||
}
|
||||
for(int idx = 0; idx < 3; idx++) {
|
||||
uint8_t length = beatsin8(5, 3, HardwareConfig::MAX_LED_NUM, 0, idx * 5);
|
||||
for(int i = 0; i < length; i++) {
|
||||
leds[i] += CRGB(scale8(5, beatsin8(5 + i * 7, 0, 255, 0, i*3)), 0, 0);
|
||||
}
|
||||
}
|
||||
FastLED.show();
|
||||
}
|
||||
});
|
||||
|
||||
MainLoop safeModeApp({
|
||||
Static<Platform>::instance(),
|
||||
// ESP Wifi
|
||||
Static<WiFiTask>::instance(),
|
||||
// System logging
|
||||
Static<LogService>::instance(),
|
||||
// MQTT
|
||||
Static<MQTTTelemetry>::instance(),
|
||||
// OTA Updates
|
||||
Static<ArduinoOTAUpdater>::instance(),
|
||||
|
||||
&safeModeNag,
|
||||
});
|
||||
|
||||
// Turn on,
|
||||
MainLoop renderbugApp{{
|
||||
|
||||
Static<Platform>::instance(),
|
||||
|
||||
// Load/update graphics configuration from EEPROM
|
||||
Static<ConfigService>::instance(),
|
||||
|
||||
@@ -431,18 +462,28 @@ MainLoop renderbugApp{{
|
||||
Static<PhotonInput>::instance(),
|
||||
#else
|
||||
// ESP Wifi
|
||||
Static<WiFiTask>::instance(),
|
||||
//Static<WiFiTask>::instance(),
|
||||
#endif
|
||||
|
||||
#ifdef BOARD_ESP32
|
||||
// ESP32 Bluetooth
|
||||
Static<BluetoothSerialTelemetry>::instance(),
|
||||
#endif
|
||||
|
||||
// System logging
|
||||
Static<LogService>::instance(),
|
||||
|
||||
#ifdef CONFIG_MPU5060
|
||||
// Hardware drivers
|
||||
Static<MPU5060>::instance(),
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_BUTTONS
|
||||
Static<Buttons>::instance(),
|
||||
|
||||
// Map buttons to events
|
||||
&keyMap,
|
||||
#endif
|
||||
|
||||
// Pattern sequencer
|
||||
&sequencer,
|
||||
@@ -451,13 +492,11 @@ MainLoop renderbugApp{{
|
||||
Static<CircadianRhythm>::instance(),
|
||||
|
||||
// Periodic motion input
|
||||
&randomPulse,
|
||||
//&randomPulse,
|
||||
|
||||
// Periodic color inputs
|
||||
&noisebridgeCycle,
|
||||
&kierynCycle,
|
||||
&idleCycle,
|
||||
&rainbowCycle,
|
||||
&hackerbotsCycle,
|
||||
|
||||
// Animations
|
||||
&chimes,
|
||||
@@ -521,8 +560,13 @@ void setup() {
|
||||
Log.notice(u8"💡 Starting FastLED...");
|
||||
Platform::addLEDs(leds, HardwareConfig::MAX_LED_NUM);
|
||||
|
||||
if (Platform::bootopts.isSetup) {
|
||||
Log.notice(u8"🌌 Starting Figment in configuration mode...");
|
||||
if (Platform::bootopts.isSafeMode) {
|
||||
Log.notice(u8"⚠️ Starting Figment in safe mode!!!");
|
||||
runner = safeModeApp;
|
||||
FastLED.showColor(CRGB(5, 0, 0));
|
||||
FastLED.show();
|
||||
} else if (Platform::bootopts.isSetup) {
|
||||
Log.notice(u8"🔧 Starting Figment in configuration mode...");
|
||||
runner = configApp;
|
||||
} else {
|
||||
Log.notice(u8"🌌 Starting Figment...");
|
||||
@@ -537,5 +581,6 @@ void setup() {
|
||||
|
||||
// Drop out.
|
||||
void loop() {
|
||||
//Platform::loop();
|
||||
runner.loop();
|
||||
}
|
||||
|
Reference in New Issue
Block a user