This commit is contained in:
parent
b71faa3bcb
commit
c5856a6f7a
@ -1,34 +1,34 @@
|
||||
/**
|
||||
Animations are structured in AnimationData as follows:
|
||||
Animations are structured in AnimationData as follows:
|
||||
|
||||
.colors contains .color_count*3 uint8_t values for R, G and B.
|
||||
.colors contains .color_count*3 uint8_t values for R, G and B.
|
||||
|
||||
.offsets contains the frame start offsets within .data + the length of the data. (So
|
||||
you can always do something like `for (int i=anim.offsets[i]; i<anim.offsets[i+1]; i++)`.
|
||||
Accordingly it has a length of .frame_count+1.
|
||||
.offsets contains the frame start offsets within .data + the length of the data. (So
|
||||
you can always do something like `for (int i=anim.offsets[i]; i<anim.offsets[i+1]; i++)`.
|
||||
Accordingly it has a length of .frame_count+1.
|
||||
|
||||
.data contains all frames data with a run-length compression with escape char 255.
|
||||
This data references the index of one or multiple pixels in .colors. It starts at the
|
||||
top left pixel and walks each row to the right before starting the next row.
|
||||
To decode it: Start at a frame (indicated by .offsets). Get one byte as x.
|
||||
If x is <255: This is a single pixel of color x.
|
||||
if x is 255: Run-length-encoding. The next byte indicates of often the byte after that
|
||||
will be repeated. So, {255, 4, 10} is equal to {10, 10, 10, 10}.
|
||||
A special case that may happen in larger GIFs is that there are more than 255 repetitions
|
||||
of a color. Those will be split, so 355*color #10 will be: {255, 255, 10, 255, 100, 10},
|
||||
e.g. 255*10 + 100*10. Usually this shouldn't need special handling within a decoder.
|
||||
Regarding colors in .data:
|
||||
Color 0 means "keep the color from the previous frame". This color should never appear on frame #0.
|
||||
Color 1 means "show the background color".
|
||||
All other color values point to a color in .colors - with an offset of 2.
|
||||
So if in .data there's a color 3, paint this pixel in .colors[1].
|
||||
.data contains all frames data with a run-length compression with escape char 255.
|
||||
This data references the index of one or multiple pixels in .colors. It starts at the
|
||||
top left pixel and walks each row to the right before starting the next row.
|
||||
To decode it: Start at a frame (indicated by .offsets). Get one byte as x.
|
||||
If x is <255: This is a single pixel of color x.
|
||||
if x is 255: Run-length-encoding. The next byte indicates of often the byte after that
|
||||
will be repeated. So, {255, 4, 10} is equal to {10, 10, 10, 10}.
|
||||
A special case that may happen in larger GIFs is that there are more than 255 repetitions
|
||||
of a color. Those will be split, so 355*color #10 will be: {255, 255, 10, 255, 100, 10},
|
||||
e.g. 255*10 + 100*10. Usually this shouldn't need special handling within a decoder.
|
||||
Regarding colors in .data:
|
||||
Color 0 means "keep the color from the previous frame". This color should never appear on frame #0.
|
||||
Color 1 means "show the background color".
|
||||
All other color values point to a color in .colors - with an offset of 2.
|
||||
So if in .data there's a color 3, paint this pixel in .colors[1].
|
||||
|
||||
.individual_delays contains either 1 or .frame_count delays. They are given in ms and
|
||||
indicate how long the matching frame should be displayed. If all times are equal, then
|
||||
it contains only one entry and .individual_delays will be false.
|
||||
.individual_delays contains either 1 or .frame_count delays. They are given in ms and
|
||||
indicate how long the matching frame should be displayed. If all times are equal, then
|
||||
it contains only one entry and .individual_delays will be false.
|
||||
|
||||
.w and .h contain the dimensions of the image.
|
||||
**/
|
||||
.w and .h contain the dimensions of the image.
|
||||
**/
|
||||
|
||||
#pragma once
|
||||
#include <Arduino.h>
|
||||
@ -36,7 +36,7 @@
|
||||
#include "my_fastled.h"
|
||||
|
||||
class Animation {
|
||||
protected:
|
||||
protected:
|
||||
AnimationData* data;
|
||||
unsigned long currentFrameSince;
|
||||
uint8_t currentFrame = 0;
|
||||
@ -53,7 +53,7 @@ class Animation {
|
||||
void drawFrame(uint8_t frame_index);
|
||||
void drawPixel(int index, CRGB* color);
|
||||
uint16_t getFrameDelay(int frame);
|
||||
public:
|
||||
public:
|
||||
Animation(AnimationData* d);
|
||||
void setFgColor(CRGB*);
|
||||
void setBgColor(CRGB* bg_color);
|
||||
|
@ -6,9 +6,9 @@
|
||||
#include <Arduino.h>
|
||||
|
||||
class Effect {
|
||||
protected:
|
||||
protected:
|
||||
Window window = {0, 0, LED_WIDTH, LED_HEIGHT}; // Use a full screen window per default.
|
||||
public:
|
||||
public:
|
||||
virtual void loop() = 0;
|
||||
boolean supports_window = false;
|
||||
virtual boolean can_be_shown_with_clock() { return false; };
|
||||
|
@ -1,34 +1,34 @@
|
||||
/**
|
||||
Animations are structured in AnimationData as follows:
|
||||
Animations are structured in AnimationData as follows:
|
||||
|
||||
.colors contains .color_count*3 uint8_t values for R, G and B.
|
||||
.colors contains .color_count*3 uint8_t values for R, G and B.
|
||||
|
||||
.offsets contains the frame start offsets within .data + the length of the data. (So
|
||||
you can always do something like `for (int i=anim.offsets[i]; i<anim.offsets[i+1]; i++)`.
|
||||
Accordingly it has a length of .frame_count+1.
|
||||
.offsets contains the frame start offsets within .data + the length of the data. (So
|
||||
you can always do something like `for (int i=anim.offsets[i]; i<anim.offsets[i+1]; i++)`.
|
||||
Accordingly it has a length of .frame_count+1.
|
||||
|
||||
.data contains all frames data with a run-length compression with escape char 255.
|
||||
This data references the index of one or multiple pixels in .colors. It starts at the
|
||||
top left pixel and walks each row to the right before starting the next row.
|
||||
To decode it: Start at a frame (indicated by .offsets). Get one byte as x.
|
||||
If x is <255: This is a single pixel of color x.
|
||||
if x is 255: Run-length-encoding. The next byte indicates of often the byte after that
|
||||
will be repeated. So, {255, 4, 10} is equal to {10, 10, 10, 10}.
|
||||
A special case that may happen in larger GIFs is that there are more than 255 repetitions
|
||||
of a color. Those will be split, so 355*color #10 will be: {255, 255, 10, 255, 100, 10},
|
||||
e.g. 255*10 + 100*10. Usually this shouldn't need special handling within a decoder.
|
||||
Regarding colors in .data:
|
||||
Color 0 means "keep the color from the previous frame". This color should never appear on frame #0.
|
||||
Color 1 means "show the background color".
|
||||
All other color values point to a color in .colors - with an offset of 2.
|
||||
So if in .data there's a color 3, paint this pixel in .colors[1].
|
||||
.data contains all frames data with a run-length compression with escape char 255.
|
||||
This data references the index of one or multiple pixels in .colors. It starts at the
|
||||
top left pixel and walks each row to the right before starting the next row.
|
||||
To decode it: Start at a frame (indicated by .offsets). Get one byte as x.
|
||||
If x is <255: This is a single pixel of color x.
|
||||
if x is 255: Run-length-encoding. The next byte indicates of often the byte after that
|
||||
will be repeated. So, {255, 4, 10} is equal to {10, 10, 10, 10}.
|
||||
A special case that may happen in larger GIFs is that there are more than 255 repetitions
|
||||
of a color. Those will be split, so 355*color #10 will be: {255, 255, 10, 255, 100, 10},
|
||||
e.g. 255*10 + 100*10. Usually this shouldn't need special handling within a decoder.
|
||||
Regarding colors in .data:
|
||||
Color 0 means "keep the color from the previous frame". This color should never appear on frame #0.
|
||||
Color 1 means "show the background color".
|
||||
All other color values point to a color in .colors - with an offset of 2.
|
||||
So if in .data there's a color 3, paint this pixel in .colors[1].
|
||||
|
||||
.individual_delays contains either 1 or .frame_count delays. They are given in ms and
|
||||
indicate how long the matching frame should be displayed. If all times are equal, then
|
||||
it contains only one entry and .individual_delays will be false.
|
||||
.individual_delays contains either 1 or .frame_count delays. They are given in ms and
|
||||
indicate how long the matching frame should be displayed. If all times are equal, then
|
||||
it contains only one entry and .individual_delays will be false.
|
||||
|
||||
.w and .h contain the dimensions of the image.
|
||||
**/
|
||||
.w and .h contain the dimensions of the image.
|
||||
**/
|
||||
|
||||
#pragma once
|
||||
#include <Arduino.h>
|
||||
|
@ -6,13 +6,13 @@
|
||||
#include "Animation.h"
|
||||
|
||||
class AnimationEffect : public Effect {
|
||||
private:
|
||||
private:
|
||||
Animation *animation;
|
||||
AnimationData *animation_data;
|
||||
CRGB *bg_color;
|
||||
uint16_t xOffset;
|
||||
uint16_t yOffset;
|
||||
public:
|
||||
public:
|
||||
AnimationEffect(AnimationData* anim) : AnimationEffect(anim, new CRGB(0x000000), 0, 0) {}
|
||||
AnimationEffect(AnimationData* anim, CRGB* background_color) : AnimationEffect(anim, background_color, 0, 0) {}
|
||||
AnimationEffect(AnimationData* anim, CRGB* bg_color, int x, int y);
|
||||
|
@ -5,11 +5,11 @@
|
||||
#include "functions.h"
|
||||
|
||||
class BellEffect : public Effect {
|
||||
private:
|
||||
private:
|
||||
CRGB color_on = CRGB(0xFFFF00);
|
||||
CRGB color_off = CRGB(0x000000);
|
||||
boolean invert = false;
|
||||
public:
|
||||
public:
|
||||
void loop();
|
||||
};
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
#include "Effect.h"
|
||||
|
||||
class BigClockEffect : public Effect {
|
||||
private:
|
||||
private:
|
||||
CRGB color_h = CRGB(0xFF0000);
|
||||
CRGB color_m = CRGB(0x00FF00);
|
||||
CRGB color_colon = CRGB(0xFFFF00);
|
||||
@ -17,7 +17,7 @@ class BigClockEffect : public Effect {
|
||||
|
||||
void drawSprite(const unsigned char* sprite, int xOffset, int yOffset, CRGB color);
|
||||
|
||||
public:
|
||||
public:
|
||||
void loop();
|
||||
};
|
||||
|
||||
|
@ -6,10 +6,10 @@
|
||||
#include <FastLED.h>
|
||||
|
||||
class ClockEffect : public Effect {
|
||||
private:
|
||||
private:
|
||||
Window window = {0, LED_HEIGHT - 6, LED_WIDTH, 6};
|
||||
|
||||
public:
|
||||
public:
|
||||
void loop();
|
||||
void loop(boolean invert, CRGB fg_color, CRGB bg_color);
|
||||
};
|
||||
|
@ -5,11 +5,11 @@
|
||||
#include "effects.h"
|
||||
|
||||
class CycleEffect : public Effect {
|
||||
private:
|
||||
private:
|
||||
Effect* effect;
|
||||
uint16_t effect_id = -1;
|
||||
unsigned long effectSince = 0;
|
||||
public:
|
||||
public:
|
||||
void changeEffect();
|
||||
void start();
|
||||
void stop();
|
||||
|
@ -3,13 +3,13 @@
|
||||
#include "config.h"
|
||||
|
||||
class SingleDynamicEffect : public Effect {
|
||||
protected:
|
||||
protected:
|
||||
static const int factor = 2;
|
||||
static const int tile_count = LED_WIDTH/factor * LED_HEIGHT/factor;
|
||||
CRGB tiles[tile_count];
|
||||
CRGB old_tiles[tile_count];
|
||||
uint8_t blend = 0;
|
||||
public:
|
||||
public:
|
||||
SingleDynamicEffect();
|
||||
void init();
|
||||
boolean can_be_shown_with_clock();
|
||||
@ -18,6 +18,6 @@ class SingleDynamicEffect : public Effect {
|
||||
};
|
||||
|
||||
class MultiDynamicEffect : public SingleDynamicEffect {
|
||||
public:
|
||||
public:
|
||||
void loop();
|
||||
};
|
||||
|
@ -3,7 +3,7 @@
|
||||
#include "my_fastled.h"
|
||||
|
||||
class FireEffect : public Effect {
|
||||
private:
|
||||
private:
|
||||
uint8_t* data;
|
||||
uint8_t spark_temp();
|
||||
void cooldown();
|
||||
@ -12,7 +12,7 @@ class FireEffect : public Effect {
|
||||
void draw();
|
||||
static CRGBPalette16 palette;
|
||||
|
||||
public:
|
||||
public:
|
||||
void start();
|
||||
void stop();
|
||||
void loop();
|
||||
|
@ -8,14 +8,14 @@
|
||||
#include "my_color_palettes.h"
|
||||
|
||||
class MatrixEffectColumn {
|
||||
private:
|
||||
private:
|
||||
int x, y;
|
||||
int length;
|
||||
Window* window;
|
||||
uint16_t speed;
|
||||
boolean running;
|
||||
unsigned long last_move = 0;
|
||||
public:
|
||||
public:
|
||||
MatrixEffectColumn();
|
||||
MatrixEffectColumn(Window* win, int xPos);
|
||||
|
||||
@ -29,9 +29,9 @@ class MatrixEffectColumn {
|
||||
};
|
||||
|
||||
class MatrixEffect : public Effect {
|
||||
private:
|
||||
private:
|
||||
MatrixEffectColumn columns[LED_WIDTH];
|
||||
public:
|
||||
public:
|
||||
boolean can_be_shown_with_clock();
|
||||
MatrixEffect();
|
||||
void loop();
|
||||
|
@ -6,7 +6,7 @@
|
||||
#include "Effect.h"
|
||||
|
||||
class Sinematrix3Effect : public Effect {
|
||||
private:
|
||||
private:
|
||||
double pangle = 0;
|
||||
double angle = 0;
|
||||
double sx = 0;
|
||||
@ -27,7 +27,7 @@ class Sinematrix3Effect : public Effect {
|
||||
double fy = 1.0 / (LED_HEIGHT / PI);
|
||||
Matrix rotate;
|
||||
|
||||
public:
|
||||
public:
|
||||
boolean supports_window = true;
|
||||
boolean can_be_shown_with_clock();
|
||||
boolean clock_as_mask();
|
||||
|
@ -5,9 +5,9 @@
|
||||
#include "my_fastled.h"
|
||||
|
||||
class StaticEffect : public Effect {
|
||||
private:
|
||||
private:
|
||||
CRGB color;
|
||||
public:
|
||||
public:
|
||||
StaticEffect(CRGB col);
|
||||
boolean supports_window = true;
|
||||
void loop();
|
||||
|
@ -5,11 +5,11 @@
|
||||
#include <Arduino.h>
|
||||
|
||||
class TwirlEffect : public Effect {
|
||||
private:
|
||||
private:
|
||||
uint8_t angleOffset = 0;
|
||||
double center_x = 8;
|
||||
double center_y = 8;
|
||||
public:
|
||||
public:
|
||||
void loop();
|
||||
};
|
||||
|
||||
|
@ -1,34 +1,34 @@
|
||||
/**
|
||||
Animations are structured in AnimationData as follows:
|
||||
Animations are structured in AnimationData as follows:
|
||||
|
||||
.colors contains .color_count*3 uint8_t values for R, G and B.
|
||||
.colors contains .color_count*3 uint8_t values for R, G and B.
|
||||
|
||||
.offsets contains the frame start offsets within .data + the length of the data. (So
|
||||
you can always do something like `for (int i=anim.offsets[i]; i<anim.offsets[i+1]; i++)`.
|
||||
Accordingly it has a length of .frame_count+1.
|
||||
.offsets contains the frame start offsets within .data + the length of the data. (So
|
||||
you can always do something like `for (int i=anim.offsets[i]; i<anim.offsets[i+1]; i++)`.
|
||||
Accordingly it has a length of .frame_count+1.
|
||||
|
||||
.data contains all frames data with a run-length compression with escape char 255.
|
||||
This data references the index of one or multiple pixels in .colors. It starts at the
|
||||
top left pixel and walks each row to the right before starting the next row.
|
||||
To decode it: Start at a frame (indicated by .offsets). Get one byte as x.
|
||||
If x is <255: This is a single pixel of color x.
|
||||
if x is 255: Run-length-encoding. The next byte indicates of often the byte after that
|
||||
will be repeated. So, {255, 4, 10} is equal to {10, 10, 10, 10}.
|
||||
A special case that may happen in larger GIFs is that there are more than 255 repetitions
|
||||
of a color. Those will be split, so 355*color #10 will be: {255, 255, 10, 255, 100, 10},
|
||||
e.g. 255*10 + 100*10. Usually this shouldn't need special handling within a decoder.
|
||||
Regarding colors in .data:
|
||||
Color 0 means "keep the color from the previous frame". This color should never appear on frame #0.
|
||||
Color 1 means "show the background color".
|
||||
All other color values point to a color in .colors - with an offset of 2.
|
||||
So if in .data there's a color 3, paint this pixel in .colors[1].
|
||||
.data contains all frames data with a run-length compression with escape char 255.
|
||||
This data references the index of one or multiple pixels in .colors. It starts at the
|
||||
top left pixel and walks each row to the right before starting the next row.
|
||||
To decode it: Start at a frame (indicated by .offsets). Get one byte as x.
|
||||
If x is <255: This is a single pixel of color x.
|
||||
if x is 255: Run-length-encoding. The next byte indicates of often the byte after that
|
||||
will be repeated. So, {255, 4, 10} is equal to {10, 10, 10, 10}.
|
||||
A special case that may happen in larger GIFs is that there are more than 255 repetitions
|
||||
of a color. Those will be split, so 355*color #10 will be: {255, 255, 10, 255, 100, 10},
|
||||
e.g. 255*10 + 100*10. Usually this shouldn't need special handling within a decoder.
|
||||
Regarding colors in .data:
|
||||
Color 0 means "keep the color from the previous frame". This color should never appear on frame #0.
|
||||
Color 1 means "show the background color".
|
||||
All other color values point to a color in .colors - with an offset of 2.
|
||||
So if in .data there's a color 3, paint this pixel in .colors[1].
|
||||
|
||||
.individual_delays contains either 1 or .frame_count delays. They are given in ms and
|
||||
indicate how long the matching frame should be displayed. If all times are equal, then
|
||||
it contains only one entry and .individual_delays will be false.
|
||||
.individual_delays contains either 1 or .frame_count delays. They are given in ms and
|
||||
indicate how long the matching frame should be displayed. If all times are equal, then
|
||||
it contains only one entry and .individual_delays will be false.
|
||||
|
||||
.w and .h contain the dimensions of the image.
|
||||
**/
|
||||
.w and .h contain the dimensions of the image.
|
||||
**/
|
||||
|
||||
#include "Animation.h"
|
||||
#include "functions.h"
|
||||
|
@ -137,4 +137,3 @@ uint8_t animation_weather_icons_data[] PROGMEM = {
|
||||
uint16_t animation_weather_icons_delays[] = {0};
|
||||
uint16_t animation_weather_icons_offsets[] = {0,69,210,354,489,621,734,821,925,1061,1216,1359,1479,1627,1772,1841,1954,2060,2166,2308,2421,2551,2681,2763,2845,2927,3009,3093};
|
||||
AnimationData animation_weather_icons = {&animation_weather_icons_colors[0], &animation_weather_icons_data[0], &animation_weather_icons_offsets[0], &animation_weather_icons_delays[0], false, 15, 27, 16, 16};
|
||||
|
||||
|
@ -2,11 +2,11 @@
|
||||
|
||||
__attribute__ ((aligned(4))) extern const TProgmemRGBGradientPalette_byte palette_fire[] FL_PROGMEM = {
|
||||
0, 0, 0, 0, //black
|
||||
128, 255, 0, 0, //red
|
||||
224, 255,255, 0, //bright yellow
|
||||
255, 255,255,255 }; //full white
|
||||
128, 255, 0, 0, //red
|
||||
224, 255,255, 0, //bright yellow
|
||||
255, 255,255,255 }; //full white
|
||||
|
||||
__attribute__ ((aligned(4))) extern const TProgmemRGBGradientPalette_byte palette_matrix[] FL_PROGMEM = {
|
||||
0, 0, 0, 0, // black
|
||||
200, 0,255, 0, // green
|
||||
255, 255,255,255 }; // white
|
||||
200, 0,255, 0, // green
|
||||
255, 255,255,255 }; // white
|
||||
|
@ -38,6 +38,6 @@ void BigClockEffect::loop() {
|
||||
/*if (ntpClient.getSeconds() & 1) {
|
||||
leds[XYsafe(13, 2)] = color_colon;
|
||||
leds[XYsafe(13, 5)] = color_colon;
|
||||
}*/
|
||||
drawNumber(ntpClient.getSeconds(), 8, 8, color_colon);
|
||||
}*/
|
||||
drawNumber(ntpClient.getSeconds(), 8, 8, color_colon);
|
||||
}
|
||||
|
@ -2,15 +2,15 @@
|
||||
#include "config.h"
|
||||
|
||||
#ifndef MQTT_ENABLE
|
||||
#pragma message "MQTT_ENABLE is false. Skipping MQTT."
|
||||
#pragma message "MQTT_ENABLE is false. Skipping MQTT."
|
||||
#else
|
||||
|
||||
#if defined( ESP8266 )
|
||||
#include <ESP8266WiFi.h>
|
||||
#include <ESP8266WiFi.h>
|
||||
#elif defined( ESP32 )
|
||||
#include <WiFi.h>
|
||||
#include <WiFi.h>
|
||||
#else
|
||||
#error "Neither ESP32 nor ESP8266 set..."
|
||||
#error "Neither ESP32 nor ESP8266 set..."
|
||||
#endif
|
||||
#include <PubSubClient.h>
|
||||
#include "EffectEntry.h"
|
||||
|
@ -1,4 +1,5 @@
|
||||
#include <ArduinoOTA.h>
|
||||
|
||||
#if defined( ESP8266 )
|
||||
#include <ESP8266mDNS.h>
|
||||
#elif defined( ESP32 )
|
||||
@ -6,6 +7,7 @@
|
||||
#else
|
||||
#error Neither ESP32 nor ESP8266 set!
|
||||
#endif
|
||||
|
||||
#include <ArduinoOTA.h>
|
||||
#include "config.h"
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user