#include "Arduino.h" #include #include #include #include "Platform.h" #include "Static.h" #include "Config.h" #include "LogService.h" #include #include "inputs/ColorCycle.h" #include "inputs/Buttons.h" #include "SafeMode.h" // Setup FastLED and the display CRGB leds[HardwareConfig::MAX_LED_NUM]; Display dpy(leds, HardwareConfig::MAX_LED_NUM, Static::instance()->coordMap()); // FIXME: rewrite as static task /*FigmentFunc configDisplay([](Display* dpy) { uint8_t brightness = brighten8_video(beatsin8(60)); auto coords = Static::instance()->coordMap(); for(int i = 0; i < HardwareConfig::MAX_LED_NUM; i++) { if (i < coords->startPixel || i > coords->startPixel + coords->pixelCount) { dpy->pixelAt(i) += CRGB(brightness, 0, 0); } else { dpy->pixelAt(i) += CRGB(255 - brightness, 255 - brightness, 255 - brightness); } } });*/ // Cycle some random colors ColorSequenceInput<9> idleCycle{{ CRGB(0, 123, 167), // Cerulean CRGB(80, 200, 120), // Emerald CRGB(207, 113, 175), // Sky Magenta CRGB(128, 0, 128), // Purple CRGB(255, 255, 255), // White CRGB(0, 255, 255), // Cyan }, "IdleColors"}; REGISTER_TASK(idleCycle); 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"}; REGISTER_TASK(rainbowCycle); MainLoop* runner = &SafeMode::safeModeApp; void setup() { // Turn on, Platform::preSetup(); Log.notice(F(u8"\n\n\nšŸ› Booting Renderbug!")); Log.notice(F(u8"šŸž I am built for %d LEDs on pin %d"), HardwareConfig::MAX_LED_NUM, RENDERBUG_LED_PIN); Log.notice(F(u8"šŸ“” Platform %s version %s"), Platform::name(), Platform::version()); Log.notice(F(u8"Setting timezone to +2 (CEST)")); Platform::setTimezone(+1); Log.trace(F(u8"Setting up platform...")); Platform::setup(); Platform::bootSplash(); Log.notice(F(u8"šŸ’” Starting FastLED on %d LEDs..."), HardwareConfig::MAX_LED_NUM); Platform::addLEDs(leds, HardwareConfig::MAX_LED_NUM); // Tune in, if (Platform::bootopts.isSafeMode) { Log.warning(F(u8"āš ļø Starting Figment in safe mode!!!")); runner = &SafeMode::safeModeApp; for(auto task : runner->scheduler.tasks) { task->state = Task::Running; } FastLED.showColor(CRGB(255, 0, 0)); FastLED.show(); } else { Log.notice(F(u8"šŸŒŒ Starting Figment...")); if (Platform::bootopts.isSetup) { Log.warning(F(u8"šŸ”§ Booting up into setup profile!!!")); Static::instance()->overrideProfile("setup"); } // Render all layers to the displays Renderer* renderer = new Renderer({&dpy}, std::vector{Platform::beginFigments(), Platform::endFigments()}); std::vector defaultTasks{Platform::beginTasks(), Platform::endTasks()}; defaultTasks.push_back(renderer); runner = new MainLoop{std::vector{defaultTasks.begin(), defaultTasks.end()}}; } Serial.flush(); runner->start(); Log.notice(F(u8"šŸ’½ %l bytes of free RAM"), Platform::freeRam()); Log.notice(F(u8"šŸš€ Setup complete! Ready to rock and roll.")); Serial.flush(); } // Drop out. void loop() { EVERY_N_SECONDS(5) { Log.notice("FPS: %d\tRAM: %d", FastLED.getFPS(), Platform::freeRam()); } runner->loop(); }