diff --git a/src/display/Display.h b/src/display/Display.h index d0077c0..f5f0569 100644 --- a/src/display/Display.h +++ b/src/display/Display.h @@ -33,10 +33,16 @@ public: const uint16_t pixelCount; + bool fpsShow = true; + private: Adafruit_NeoPixel leds; + unsigned long fpsLastMillis = 0; + + int fps = 0; + public: Display(uint8_t width, uint8_t height) : @@ -109,7 +115,7 @@ public: if ((y % 2) != 0) { x = width - x - 1; } - leds.setPixelColor(y * width + x, color); + setIndex(y * width + x, color); } void clear() { @@ -117,9 +123,16 @@ public: } void loop() { + calculateFPS(); + drawFpsBorder(); leds.show(); } + void calculateFPS() { + fps = (int) round(1000.0 / (millis() - fpsLastMillis)); + fpsLastMillis = millis(); + } + void setBrightness(uint8_t brightness) { leds.setBrightness(brightness); } @@ -129,7 +142,53 @@ public: } void setIndex(uint16_t index, uint8_t r, uint8_t g, uint8_t b) { - leds.setPixelColor(index, r, g, b); + uint32_t color = (r << 8 | g) << 8 | b; + setIndex(index, color); + } + + void setIndex(uint16_t index, uint32_t color) { + leds.setPixelColor(index, color); + } + + void drawFpsBorder() { + if (!fpsShow) { + return; + } + + int frames = fps; + + uint8_t red = 255; + uint8_t green = 0; + uint8_t blue = 0; + if (frames > 3 * 76) { + frames -= 3 * 76; + red = 255; + green = 255; + blue = 255; + } else if (frames > 2 * 76) { + frames -= 2 * 76; + red = 0; + green = 0; + blue = 255; + } else if (frames > 76) { + frames -= 76; + red = 0; + green = 255; + blue = 0; + } + + for (int x = 0; x <= width - 1 && frames-- > 0; x++) { + set(x, 0, red, green, blue); + } + for (int y = 0; y <= height - 1 && frames-- > 0; y++) { + set(width - 1, y, red, green, blue); + } + for (int x = width - 1; x >= 0 && frames-- > 0; x--) { + set(x, height - 1, red, green, blue); + } + for (int y = height - 1; y >= 0 && frames-- > 0; y--) { + set(0, y, red, green, blue); + } } }; diff --git a/src/server.cpp b/src/server.cpp index c825fdc..4403f44 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -32,7 +32,8 @@ void server_setup() { server.on("/faster", web_faster); server.on("/faster/", web_faster); server.on("/slower", web_slower); - server.on("/slower/", web_slower); + server.on("/fps/on", web_fps_on); + server.on("/fps/off", web_fps_off); server.begin(); } @@ -55,6 +56,7 @@ void web_index() { server.sendContent("NEW_YEAR
"); server.sendContent("Helligkeit: + / -
"); server.sendContent("Geschwindigkeit: + / -
"); + server.sendContent("FPS: EIN / AUS
"); server.client().flush(); } @@ -96,3 +98,18 @@ void web_slower() { server.sendHeader("location", "/"); server.send(301, "text/plain", "ok"); } + +void web_fps_on() { + display.fpsShow = true; + redirect(); +} + +void web_fps_off() { + display.fpsShow = false; + redirect(); +} + +void redirect() { + server.sendHeader("location", "/"); + server.send(301, "text/plain", "ok"); +}