156 lines
3.6 KiB
C++
156 lines
3.6 KiB
C++
#include <ESP8266WiFi.h>
|
|
#include <ESP8266mDNS.h>
|
|
#include <WiFiUdp.h>
|
|
#include <ArduinoOTA.h>
|
|
|
|
#define FASTLED_INTERNAL
|
|
#include "FastLED.h"
|
|
#include <PubSubClient.h>
|
|
#include "SimpleList.h"
|
|
#include "ntp.h"
|
|
|
|
#include "config.h"
|
|
CRGB leds[LED_COUNT];
|
|
WiFiClient wifi;
|
|
WiFiUDP ntpUDP;
|
|
NTPClient ntpClient(ntpUDP, NTP_SERVER, NTP_OFFSET, NTP_INTERVAL);
|
|
|
|
#ifdef DEBUG
|
|
#define LOG(x) Serial.print(x);
|
|
#define LOGln(x) Serial.println(x);
|
|
#else
|
|
#define LOG(x) ""
|
|
#define LOGln(x) ""
|
|
#endif
|
|
|
|
typedef struct {
|
|
uint8_t x;
|
|
uint8_t y;
|
|
uint8_t w;
|
|
uint8_t h;
|
|
} Window;
|
|
|
|
class Effect {
|
|
protected:
|
|
Window window = {0, 0, LED_WIDTH, LED_HEIGHT}; // Use a full screen window per default.
|
|
public:
|
|
virtual void loop() = 0;
|
|
boolean supports_window = false;
|
|
virtual boolean can_be_shown_with_clock() { return false; };
|
|
virtual boolean clock_as_mask() { return false; };
|
|
void setWindow(Window win) {
|
|
window = win;
|
|
};
|
|
};
|
|
|
|
#include "functions.h"
|
|
#include "text.h"
|
|
#include "sprites.h"
|
|
#include "animations.h"
|
|
#include "tools.h"
|
|
|
|
SimpleList<Effect*>* cycle_effects;
|
|
|
|
#include "effects.h"
|
|
|
|
#define NUM_EFFECTS 11
|
|
//EffectEntry effects[NUM_EFFECTS];
|
|
Sinematrix3 sinematrix3;
|
|
BigClock big_clock;
|
|
Clock clock;
|
|
Bell bell;
|
|
Static off(CRGB(0x000000));
|
|
Animation anim_koopa(&animation_koopa, CRGB(0x000000), 0, 0);
|
|
Animation anim_couple_rain(&animation_couple_rain, CRGB(0x000000), -8, -16);
|
|
SingleDynamic single_dynamic;
|
|
MultiDynamic multi_dynamic;
|
|
MatrixEffect matrix;
|
|
CycleEffect effect_cycle;
|
|
|
|
EffectEntry effects[NUM_EFFECTS] = {
|
|
{"sinematrix3", (Effect *)&sinematrix3},
|
|
{"big_clock", (Effect *)&big_clock},
|
|
{"clock", (Effect *)&clock},
|
|
{"bell", (Effect *)&bell},
|
|
{"off", (Effect *)&off},
|
|
{"koopa", (Effect *)&anim_koopa},
|
|
{"couple_rain", (Effect *)&anim_couple_rain},
|
|
{"single_dynamic", (Effect *)&single_dynamic},
|
|
{"multi_dynamic", (Effect *)&multi_dynamic},
|
|
{"matrix", (Effect *)&matrix},
|
|
{"cycle", (Effect *)&effect_cycle},
|
|
};
|
|
|
|
void setup_cycle_effects() {
|
|
LOGln("Core * Setting up cycle_effects");
|
|
cycle_effects = new SimpleList<Effect*>();
|
|
cycle_effects->add(&sinematrix3);
|
|
cycle_effects->add(&single_dynamic);
|
|
cycle_effects->add(&multi_dynamic);
|
|
cycle_effects->add(&matrix);
|
|
}
|
|
|
|
|
|
void setup() {
|
|
Serial.begin(74880);
|
|
Serial.println("Core * Starting");
|
|
setup_cycle_effects();
|
|
wifi_setup();
|
|
ota_setup();
|
|
fastled_setup();
|
|
ntpClient.begin();
|
|
mqtt_setup();
|
|
Serial.println("Core * Setup complete");
|
|
}
|
|
|
|
Effect* current_effect = &clock;
|
|
|
|
#include "mqtt.h"
|
|
|
|
uint8_t starting_up = OTA_STARTUP_DELAY;
|
|
int loop_timeouts = 0;
|
|
long loop_started_at = 0;
|
|
|
|
void loop() {
|
|
loop_started_at = millis();
|
|
ota_loop();
|
|
|
|
if (starting_up > 0) {
|
|
EVERY_N_SECONDS(1) {
|
|
Serial.print("Core * Waiting for OTA... "); Serial.println(starting_up);
|
|
starting_up--;
|
|
clear();
|
|
for (int i=0; i<starting_up; i++) {
|
|
leds[XYsafe(i, 0)] = CRGB(0xff0000);
|
|
}
|
|
FastLED.show();
|
|
}
|
|
return;
|
|
}
|
|
|
|
ntpClient.update();
|
|
mqtt_loop();
|
|
|
|
EVERY_N_MILLISECONDS(1000 / FPS) {
|
|
Serial.println("Core * loop running");
|
|
current_effect->loop();
|
|
|
|
if (current_effect->can_be_shown_with_clock()) {
|
|
clock.loop(current_effect->clock_as_mask(), CRGB(0xFFFFFF), CRGB(0x000000));
|
|
}
|
|
|
|
FastLED.show();
|
|
}
|
|
|
|
if (MONITOR_LOOP_TIMES && millis()-loop_started_at>=MONITOR_LOOP_TIME_THRESHOLD) {
|
|
LOG("Core * Loop took "); LOG(millis()-loop_started_at); LOGln("ms.");
|
|
loop_timeouts++;
|
|
LOG("Core * Timeout counter is now "); LOGln(loop_timeouts);
|
|
if (loop_timeouts >= MONITOR_LOOP_TIME_COUNT_MAX) {
|
|
ESP.restart();
|
|
}
|
|
} else if (loop_timeouts > 0) {
|
|
loop_timeouts--;
|
|
}
|
|
}
|