Compare commits

...

4 Commits

7 changed files with 74 additions and 60 deletions

View File

@ -3,9 +3,16 @@
#include "config.h" #include "config.h"
#include "prototypes.h" #include "prototypes.h"
enum SubpixelRenderingMode {
SUBPIXEL_RENDERING_SET,
SUBPIXEL_RENDERING_ADD,
SUBPIXEL_RENDERING_RAISE
};
class Window { class Window {
private: private:
void _circle_point(int x0, int y0, int x1, int y1, CRGB* color); void _circle_point(int x0, int y0, int x1, int y1, CRGB* color);
void _subpixel_render(uint8_t x, uint8_t y, CRGB* color, SubpixelRenderingMode m);
public: public:
const uint8_t x, y; const uint8_t x, y;
const uint8_t width, height; const uint8_t width, height;
@ -19,7 +26,7 @@ public:
void clear(); void clear();
void clear(CRGB* color); void clear(CRGB* color);
void setPixel(uint8_t x, uint8_t y, CRGB* color); void setPixel(uint8_t x, uint8_t y, CRGB* color);
void setSubPixel(accum88 x, accum88 y, CRGB* color); void setSubPixel(accum88 x, accum88 y, CRGB* color, SubpixelRenderingMode m = SUBPIXEL_RENDERING_ADD);
void setPixelByIndex(uint16_t index, CRGB* color); void setPixelByIndex(uint16_t index, CRGB* color);
void raisePixel(uint8_t x, uint8_t y, CRGB* color); void raisePixel(uint8_t x, uint8_t y, CRGB* color);
void line(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2, CRGB* color); void line(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2, CRGB* color);

View File

@ -8,10 +8,9 @@ private:
CRGB _color_seconds = CRGB(0xFF0000); CRGB _color_seconds = CRGB(0xFF0000);
void _draw_seconds(); void _draw_seconds();
void _draw_border_pixel(uint8_t second, uint8_t part, CRGB* color); void _draw_border_pixel(uint8_t second, CRGB* color);
public: public:
void loop(); void loop();
String get_name() override { return "big_clock"; } String get_name() override { return "big_clock"; }
}; };

View File

@ -54,6 +54,7 @@ void Window::drawSubText(Font* font, accum88 x, accum88 y, String text, CRGB* co
} }
void Window::drawChar(Font* font, accum88 xPos, accum88 yPos, const char c, CRGB* color, bool mask) { void Window::drawChar(Font* font, accum88 xPos, accum88 yPos, const char c, CRGB* color, bool mask) {
SubpixelRenderingMode mode = mask ? SUBPIXEL_RENDERING_SET : SUBPIXEL_RENDERING_ADD;
if (!font->isCharAllowed(c)) return; if (!font->isCharAllowed(c)) return;
uint16_t position = font->getCharPosition(c); uint16_t position = font->getCharPosition(c);
uint8_t* data = new uint8_t[font->width]; uint8_t* data = new uint8_t[font->width];
@ -62,7 +63,7 @@ void Window::drawChar(Font* font, accum88 xPos, accum88 yPos, const char c, CRGB
for(uint8_t y=0; y<font->height; y++) for(uint8_t x=0; x<font->width; x++) { for(uint8_t y=0; y<font->height; y++) for(uint8_t x=0; x<font->width; x++) {
bool on = (data[x]>>(font->height - 1 - y) & 1) * 255; bool on = (data[x]>>(font->height - 1 - y) & 1) * 255;
if (mask) on = !on; if (mask) on = !on;
if (on) this->setSubPixel(xPos + (x<<8), yPos + (y<<8), color); if (on) this->setSubPixel(xPos + (x<<8), yPos + (y<<8), color, mode);
} }
free(data); free(data);
@ -219,7 +220,7 @@ void Window::lineWithAngle(uint8_t x, uint8_t y, uint8_t angle, uint8_t startdis
line(x1, y1, x2, y2, color); line(x1, y1, x2, y2, color);
} }
void Window::setSubPixel(accum88 x, accum88 y, CRGB* color) { void Window::setSubPixel(accum88 x, accum88 y, CRGB* color, SubpixelRenderingMode mode) {
uint8_t px, py; uint8_t px, py;
// px = Part of next pixel to fill // px = Part of next pixel to fill
// x = "Origin pixel" // x = "Origin pixel"
@ -232,26 +233,34 @@ void Window::setSubPixel(accum88 x, accum88 y, CRGB* color) {
c = CRGB(scale8( scale8( color->r, 255-py), 255-px), c = CRGB(scale8( scale8( color->r, 255-py), 255-px),
scale8( scale8( color->g, 255-py), 255-px), scale8( scale8( color->g, 255-py), 255-px),
scale8( scale8( color->b, 255-py), 255-px)); scale8( scale8( color->b, 255-py), 255-px));
this->addPixelColor(x, y, &c); _subpixel_render(x, y, &c, mode);
if (px) { if (px) {
c = CRGB(scale8( scale8( color->r, 255-py), px), c = CRGB(scale8( scale8( color->r, 255-py), px),
scale8( scale8( color->g, 255-py), px), scale8( scale8( color->g, 255-py), px),
scale8( scale8( color->b, 255-py), px)); scale8( scale8( color->b, 255-py), px));
this->addPixelColor(x+1, y, &c); _subpixel_render(x+1, y, &c, mode);
} }
if (py) { if (py) {
c = CRGB(scale8( scale8( color->r, py), 255-px), c = CRGB(scale8( scale8( color->r, py), 255-px),
scale8( scale8( color->g, py), 255-px), scale8( scale8( color->g, py), 255-px),
scale8( scale8( color->b, py), 255-px)); scale8( scale8( color->b, py), 255-px));
this->addPixelColor(x, y+1, &c); _subpixel_render(x, y+1, &c, mode);
} }
if (px || py) { if (px || py) {
c = CRGB(scale8( scale8( color->r, py), px), c = CRGB(scale8( scale8( color->r, py), px),
scale8( scale8( color->g, py), px), scale8( scale8( color->g, py), px),
scale8( scale8( color->b, py), px)); scale8( scale8( color->b, py), px));
this->addPixelColor(x+1, y+1, &c); _subpixel_render(x+1, y+1, &c, mode);
}
}
void Window::_subpixel_render(uint8_t x, uint8_t y, CRGB* color, SubpixelRenderingMode mode) {
switch(mode) {
case SUBPIXEL_RENDERING_ADD: addPixelColor(x, y, color); break;
case SUBPIXEL_RENDERING_RAISE: raisePixel(x, y, color); break;
case SUBPIXEL_RENDERING_SET: setPixel(x, y, color); break;
} }
} }

View File

@ -25,33 +25,32 @@ void BigClockEffect::loop() {
void BigClockEffect::_draw_seconds() { void BigClockEffect::_draw_seconds() {
uint8_t seconds = ntpClient.getSeconds(); uint8_t seconds = ntpClient.getSeconds();
for (int i=1; i<=seconds; i++) { for (int i=1; i<=seconds; i++) {
_draw_border_pixel(i, 0, &_color_seconds); _draw_border_pixel(i, &_color_seconds);
} }
uint16_t millis = ntpClient.getEpochMillis() % 1000; uint16_t millis = ntpClient.getEpochMillis() % 1000;
if (millis > 0) { if (millis > 0) {
uint16_t position = ((60 - (60 - seconds) * millis) << 8) / 1000; uint8_t part = 60 - ((60 - seconds) * millis / 1000);
//uint8_t position = 60 - ((60 - seconds) * millis / 1000); _draw_border_pixel(part, &_color_seconds);
_draw_border_pixel(position>>8, position&0xFF, &_color_seconds);
} }
} }
void BigClockEffect::_draw_border_pixel(uint8_t i, uint8_t part, CRGB* color) { void BigClockEffect::_draw_border_pixel(uint8_t i, CRGB* color) {
accum88 x, y; uint8_t x, y;
if (i<=8) { if (i<=8) {
x = (7 + i)<<8 | part; x = 7 + i;
y = 0; y = 0;
} else if (i<=23) { } else if (i<=23) {
x = 15 << 8; x = 15;
y = (i - 8) << 8 | (255 - part); y = i - 8;
} else if (i<= 38) { } else if (i<= 38) {
x = (15 - i + 23) << 8 | (255 - part); x = 15 - i + 23;
y = 15 << 8; y = 15;
} else if (i <= 53) { } else if (i <= 53) {
x = 0; x = 0;
y = (15 - i + 38) << 8 | part; y = 15 - i + 38;
} else { } else {
x = (i - 53) << 8 | part; x = i - 53;
y = 0; y = 0;
} }
window->setSubPixel(x, y, color); window->setPixel(x, y, color);
} }

View File

@ -5,17 +5,17 @@ boolean Blur2DEffect::can_be_shown_with_clock() {
} }
void Blur2DEffect::loop() { void Blur2DEffect::loop() {
uint8_t blur_amount = dim8_raw(beatsin8(3, 64, 192)); uint8_t blur_amount = dim8_raw(beatsin8(3, 128, 224));
window->blur(blur_amount); window->blur(blur_amount);
uint8_t x1 = beatsin8(5, 0, window->width-1); uint8_t x1 = beatsin8(7, 0, window->width-1);
uint8_t y1 = beatsin8(8, 0, window->height-1); uint8_t y1 = beatsin8(11, 0, window->height-1);
uint8_t x2 = beatsin8(8, 0, window->width-1); uint8_t x2 = beatsin8(13, 0, window->width-1);
uint8_t y2 = beatsin8(3, 0, window->height-1); uint8_t y2 = beatsin8(8, 0, window->height-1);
uint8_t x3 = beatsin8(4, 0, window->width-1); uint8_t x3 = beatsin8(11, 0, window->width-1);
uint8_t y3 = beatsin8(7, 0, window->height-1); uint8_t y3 = beatsin8(13, 0, window->height-1);
uint16_t ms = millis(); uint16_t ms = millis();
CRGB c1 = CHSV(ms / 29, 200, 255); CRGB c1 = CHSV(ms / 29, 200, 255);

View File

@ -13,7 +13,7 @@ void NightClockEffect::loop() {
//uint8_t y = minutes % ((window->height - 5) * 2 - 2); //uint8_t y = minutes % ((window->height - 5) * 2 - 2);
//if (y > window->height - 5) y = 2*window->height - 2*y; //if (y > window->height - 5) y = 2*window->height - 2*y;
uint8_t y = minutes % 10; uint8_t y = minutes % 10;
ClockEffect::loop(false, CRGB(0x880000), CRGB(0x000000), y); ClockEffect::loop(false, CRGB(0x200000), CRGB(0x000000), y);
} }
void ClockEffect::loop() { void ClockEffect::loop() {
@ -34,7 +34,7 @@ void ClockEffect::loop(boolean invert, CRGB fg_color, CRGB bg_color, uint8_t yPo
// Manually clear the needed parts // Manually clear the needed parts
for(int y=0; y<6; y++) { for(int y=0; y<6; y++) {
window->setPixel(3, yPos+y, &bg_color); window->setPixel(3, yPos+y, &bg_color);
if (y!=2 && y!=4) { if (y!=1 && y!=3) {
window->setPixel(7, yPos+y, &bg_color); window->setPixel(7, yPos+y, &bg_color);
} }
window->setPixel(8, yPos+y, &bg_color); window->setPixel(8, yPos+y, &bg_color);

View File

@ -7,7 +7,7 @@ FireworkEffectDot::FireworkEffectDot(Window* w, FireworkEffect* e) {
show = 0; show = 0;
type = FIREWORK_DOT_NONE; type = FIREWORK_DOT_NONE;
_x = 0; _x = 0;
_y = 0; _y = _window->height - 1;
_xv = 0; _xv = 0;
_yv = 0; _yv = 0;
_r = 0; _r = 0;
@ -70,7 +70,7 @@ void FireworkEffectDot::move() {
} }
// Bounce if we hit the ground // Bounce if we hit the ground
if (_xv < 0 && _y < (-_yv)) { if (_xv < 0 && _y - _window->height < (-_yv)) {
if (type == FIREWORK_DOT_SPARK) { if (type == FIREWORK_DOT_SPARK) {
show = 0; show = 0;
} else { } else {
@ -84,7 +84,7 @@ void FireworkEffectDot::move() {
if (_yv < 300) { if (_yv < 300) {
if (type == FIREWORK_DOT_SHELL) { if (type == FIREWORK_DOT_SHELL) {
if (_y > (uint16_t)0x8000) { if (_y < (uint16_t)0x8000) {
// boom // boom
CRGB white(0xFFFFFF); CRGB white(0xFFFFFF);
_window->clear(&white); _window->clear(&white);
@ -103,7 +103,7 @@ void FireworkEffectDot::move() {
} else { } else {
_x += _xv; _x += _xv;
} }
_y += _yv; _y -= _yv;
} }
void FireworkEffectDot::ground_launch() { void FireworkEffectDot::ground_launch() {