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 <NTPClient.h>
 | |
| #include <PubSubClient.h>
 | |
| #include "SimpleList.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();
 | |
|   ntp_setup();
 | |
|   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;
 | |
|   }
 | |
|   
 | |
|   ntp_loop();
 | |
|   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--;
 | |
|   }
 | |
| }
 |