From 48c21573bcd3a423cb9f2afe19c5b94b8a578925 Mon Sep 17 00:00:00 2001
From: NimmLor <admin@nimmervoll.work>
Date: Mon, 26 Oct 2020 00:33:11 +0100
Subject: [PATCH] fixes and new pattern for clock device

---
 esp8266-fastled-iot-webserver.ino | 102 +++++++++++++++++++++---------
 1 file changed, 71 insertions(+), 31 deletions(-)

diff --git a/esp8266-fastled-iot-webserver.ino b/esp8266-fastled-iot-webserver.ino
index ee8928b..0b1f51b 100644
--- a/esp8266-fastled-iot-webserver.ino
+++ b/esp8266-fastled-iot-webserver.ino
@@ -478,6 +478,7 @@ PatternAndNameList patterns = {
     // Time patterns
   #if DEVICE_TYPE == 2                
     { displayTimeStatic,      "Time" },
+    { displayTimeColorful,     "Time Colorful" },
     { displayTimeRainbow,     "Time Rainbow" },
   #endif
 
@@ -2362,9 +2363,16 @@ bool shouldUpdateTime()
     return false;
 }
 
-void DrawDots(int r, int g, int b)
+void DrawDots(int r, int g, int b, int hueMode)
 {
-    for (int i = 2*Digit2; i < Digit2; i++) leds[i] = CRGB(r, g, b);
+    for (int i = 2 * Digit2; i < Digit3; i++) {
+        if (hueMode == 1) {
+            int hue = map(i, 0, NUM_LEDS, 0, 255) + gHue;
+            if (hue >= 255) hue -= 255;
+            leds[i] = CHSV(map(hue, 0, NUM_LEDS, 0,255), 255,255);
+        }
+        else leds[i] = CRGB(r, g, b);
+    }
 }
 
 void displayTime(CRGB x = CRGB(0, 0, 0))
@@ -2373,13 +2381,13 @@ void displayTime(CRGB x = CRGB(0, 0, 0))
     if (x.r == 0 && x.g == 0 && x.b == 0)
     {
         hsv2rgb_rainbow(CHSV(gHue, 255, 255), c);
-        DrawTime(c.r, c.g, c.b);
-        DrawDots(c.r, c.g, c.b);
+        DrawTime(c.r, c.g, c.b, 0);
+        DrawDots(c.r, c.g, c.b, 0);
     }
     else
     {
-        DrawTime(x.r, x.g, x.b);
-        DrawDots(x.r, x.g, x.b);
+        DrawTime(x.r, x.g, x.b, 0);
+        DrawDots(x.r, x.g, x.b, 0);
     }
 }
 
@@ -2415,6 +2423,24 @@ void displayTimeRainbow()
     }
 }
 
+void displayTimeColorful()
+{
+    bool fresh_update = false;
+    if (shouldUpdateNTP)
+    {
+        fresh_update = GetTime();
+    }
+    if (fresh_update || shouldUpdateTime())
+    {
+        if (incrementTime() || fresh_update)
+        {
+            CRGB x = CRGB(255, 0, 0);
+            DrawTime(x.r, x.g, x.b, 1);
+            DrawDots(x.r, x.g, x.b, 1);
+        }
+    }
+}
+
 bool incrementTime()
 {
     bool retval = false;
@@ -2438,25 +2464,37 @@ bool incrementTime()
 }
 
 
-void DrawTime(int r, int g, int b)
+void DrawTime(int r, int g, int b, int hueMode)
 {
 #define LEDS_PER_SEGMENT (Digit2 / 7)
     for (int l = 0; l < LEDS_PER_SEGMENT; l++)
     {
-        if (hours < 10) DrawDigit(Digit1 + l, LEDS_PER_SEGMENT, r, g, b, -1);        // Turn off leading zero
-        else DrawDigit(Digit1 + l, LEDS_PER_SEGMENT, r, g, b, hours / 10); //Draw the first digit of the hour
-        DrawDigit(Digit2 + l, LEDS_PER_SEGMENT, r, g, b, hours - ((hours / 10) * 10)); //Draw the second digit of the hour
+        if (hours < 10) DrawDigit(Digit1 + l, LEDS_PER_SEGMENT, r, g, b, -1, hueMode);        // Turn off leading zero
+        else DrawDigit(Digit1 + l, LEDS_PER_SEGMENT, r, g, b, hours / 10, hueMode); //Draw the first digit of the hour
+        DrawDigit(Digit2 + l, LEDS_PER_SEGMENT, r, g, b, hours - ((hours / 10) * 10), hueMode); //Draw the second digit of the hour
 
-        DrawDigit(Digit3 + l, LEDS_PER_SEGMENT, r, g, b, mins / 10); //Draw the first digit of the minute
-        DrawDigit(Digit4 + l, LEDS_PER_SEGMENT, r, g, b, mins - ((mins / 10) * 10)); //Draw the second digit of the minute
+        DrawDigit(Digit3 + l, LEDS_PER_SEGMENT, r, g, b, mins / 10, hueMode); //Draw the first digit of the minute
+        DrawDigit(Digit4 + l, LEDS_PER_SEGMENT, r, g, b, mins - ((mins / 10) * 10), hueMode); //Draw the second digit of the minute
     }
 }
 
-void dDHelper(int seg, int segmentLedCount, CRGB rgb = CRGB(0, 0, 0))
+void dDHelper(int offset, int seg, int segmentLedCount, int hueMode, CRGB rgb = CRGB(0, 0, 0) )
 {
-    for (int i = 0; i < segmentLedCount; i++)
-    {
-        leds[seg + i + seg * (segmentLedCount - 1)] = rgb;
+    if (hueMode == 1) {
+        for (int i = 0; i < segmentLedCount; i++)
+        {
+            int pos = offset + seg + i + seg * (segmentLedCount - 1);
+            int hue = map(pos, 0, NUM_LEDS, 0, 255) + gHue;
+            if (hue >= 255) hue -= 255;
+            CHSV col = CHSV(hue, 255, 255);
+            leds[pos] = col;
+        }
+    }
+    else {
+        for (int i = 0; i < segmentLedCount; i++)
+        {
+            leds[offset + seg + i + seg * (segmentLedCount - 1)] = rgb;
+        }
     }
 }
 
@@ -2471,65 +2509,67 @@ void dDHelper(int seg, int segmentLedCount, CRGB rgb = CRGB(0, 0, 0))
  * - b: blue component (0-255)
  * - n: value to be drawn (0-9)
  */
-void DrawDigit(int offset, int segmentLedCount, int r, int g, int b, int n)
+void DrawDigit(int offset, int segmentLedCount, int r, int g, int b, int n, int hueMode)
 {
+    Serial.print("Digit: ");
+    Serial.println(segmentLedCount);
     int s = segmentLedCount;
     CRGB rgb = CRGB(r, g, b);
     if (n == 2 || n == 3 || n == 4 || n == 5 || n == 6 || n == 8 || n == 9) //MIDDLE
     {
-        dDHelper(0, s, rgb);
+        dDHelper(offset, 0, s, hueMode, rgb);
     }
     else
     {
-        dDHelper(0, s);
+        dDHelper(offset, 0, s, 0);
     }
     if (n == 0 || n == 1 || n == 2 || n == 3 || n == 4 || n == 7 || n == 8 || n == 9) //TOP RIGHT
     {
-        dDHelper(1, s, rgb);
+        dDHelper(offset, 1, s, hueMode, rgb);
     }
     else
     {
-        dDHelper(1, s);
+        dDHelper(offset, 1, s, 0);
     }
     if (n == 0 || n == 2 || n == 3 || n == 5 || n == 6 || n == 7 || n == 8 || n == 9) //TOP
     {
-        dDHelper(2, s, rgb);
+        dDHelper(offset, 2, s, hueMode, rgb);
     }
     else
     {
-        dDHelper(2, s);
+        dDHelper(offset, 2, s, 0);
     }
     if (n == 0 || n == 4 || n == 5 || n == 6 || n == 8 || n == 9) //TOP LEFT
     {
-        dDHelper(3, s, rgb);
+        dDHelper(offset, 3, s, hueMode, rgb);
     }
     else
     {
-        dDHelper(3, s);
+        dDHelper(offset, 3, s, 0);
     }
     if (n == 0 || n == 2 || n == 6 || n == 8) //BOTTOM LEFT
     {
-        dDHelper(4, s, rgb);
+        dDHelper(offset, 4, s, hueMode, rgb);
     }
     else
     {
-        dDHelper(4, s);
+        dDHelper(offset, 4, s, 0);
     }
     if (n == 0 || n == 2 || n == 3 || n == 5 || n == 6 || n == 8 || n == 9) //BOTTOM
     {
-        dDHelper(5, s, rgb);
+        dDHelper(offset, 5, s, hueMode, rgb);
     }
     else
     {
-        dDHelper(5, s);
+        dDHelper(offset, 5, s, 0);
     }
     if (n == 0 || n == 1 || n == 3 || n == 4 || n == 5 || n == 6 || n == 7 || n == 8 || n == 9) //BOTTOM RIGHT
     {
-        dDHelper(6, s, rgb);
+        dDHelper(offset, 6, s, hueMode, rgb);
     }
     else
     {
-        dDHelper(6, s);
+        dDHelper(offset, 6, s, 0);
     }
 }
 #endif
-- 
GitLab