diff --git a/include/Transitiontypes/Transition.hpp b/include/Transitiontypes/Transition.hpp index f02ee4fd..b929db66 100644 --- a/include/Transitiontypes/Transition.hpp +++ b/include/Transitiontypes/Transition.hpp @@ -473,16 +473,28 @@ void Transition::analyzeColors(RgbfColor **dest, RgbfColor **source, void Transition::setMinute() { if (G.minuteVariant != MinuteVariant::Off) { - uint8_t m = lastMinute % 5; + uint8_t m5 = lastMinute % 5; uint16_t minArray[4]; usedUhrType->getMinuteArray(minArray, clockWork.determineWhichMinuteVariant()); if (G.layoutVariant[ReverseMinDirection]) { std::reverse(std::begin(minArray), std::end(minArray)); } - for (uint8_t i = 0; i < 4; i++) { - led.setPixel(minArray[i], - HsbColor{m > i ? foregroundMinute : background}); + + uint8_t numLEDsPerLetter = 1; + if (G.buildTypeDef == BuildTypeDef::DoubleRes) { + numLEDsPerLetter = 2; + } else if (G.buildTypeDef == BuildTypeDef::TrippleRes) { + numLEDsPerLetter = 3; + } else if (G.buildTypeDef == BuildTypeDef::QuadRes) { + numLEDsPerLetter = 4; + } + + for (uint8_t m = 0; m < 4; m++) { + for (int i = 0; i < numLEDsPerLetter; i++) { + led.setPixel(minArray[m] * numLEDsPerLetter + i, + HsbColor{m5 > m ? foregroundMinute : background}); + } // TODO: fading transition for Minutes } } diff --git a/include/Uhr.h b/include/Uhr.h index fa87f528..b1be39dc 100644 --- a/include/Uhr.h +++ b/include/Uhr.h @@ -66,6 +66,8 @@ enum class BuildTypeDef { Normal = 0, DoubleResM1 = 1, DoubleRes = 2, + TrippleRes = 3, + QuadRes = 4 }; enum class MinuteVariant { diff --git a/include/Uhrtypes/DE11x11.hpp b/include/Uhrtypes/DE11x11.hpp index 446f31c8..296d4354 100644 --- a/include/Uhrtypes/DE11x11.hpp +++ b/include/Uhrtypes/DE11x11.hpp @@ -111,6 +111,8 @@ class De11x11_t : public iUhrType { case FrontWord::vor: case FrontWord::v_vor: setFrontMatrixWord(3, 2, 4); + break; + case FrontWord::uhr: setFrontMatrixWord(10, 0, 2); break; diff --git a/include/led.h b/include/led.h index 9f906f1d..dc964a96 100644 --- a/include/led.h +++ b/include/led.h @@ -74,6 +74,7 @@ class Led { // Pixel Clear Functions //------------------------------------------------------------------------------ inline void clearPixel(uint16_t i); + inline void clearPixel(uint8_t row, uint8_t col); inline void clearClock(); inline void clearRow(uint8_t row); inline void clearMinArray(); diff --git a/include/led.hpp b/include/led.hpp index acda06f5..a7d3ef4d 100644 --- a/include/led.hpp +++ b/include/led.hpp @@ -244,7 +244,19 @@ void Led::setPixel(uint16_t ledIndex, HsbColor color) { //------------------------------------------------------------------------------ void Led::setPixel(uint8_t row, uint8_t col, HsbColor color) { - setPixel(usedUhrType->getFrontMatrixIndex(row, col), color); + uint8_t numLEDsPerLetter = 1; + if (G.buildTypeDef == BuildTypeDef::DoubleRes) { + numLEDsPerLetter = 2; + } else if (G.buildTypeDef == BuildTypeDef::TrippleRes) { + numLEDsPerLetter = 3; + } else if (G.buildTypeDef == BuildTypeDef::QuadRes) { + numLEDsPerLetter = 4; + } + + uint16_t ledIndex = usedUhrType->getFrontMatrixIndex(row, col); + for (int i = 0; i < numLEDsPerLetter; i++) { + setPixel(ledIndex * numLEDsPerLetter + i, color); + } } //------------------------------------------------------------------------------ @@ -267,7 +279,7 @@ void Led::setbyFrontMatrix(ColorPosition colorPosition, if (boolSetPixel) { setPixel(row, col, displayedColor); } else if (colorPosition != Background) { - clearPixel(usedUhrType->getFrontMatrixIndex(row, col)); + clearPixel(row, col); } } } @@ -297,11 +309,23 @@ void Led::setbyMinuteArray(ColorPosition colorPosition) { HsbColor displayedColor = getColorbyPositionWithAppliedBrightness(colorPosition); + uint8_t numLEDsPerLetter = 1; + if (G.buildTypeDef == BuildTypeDef::DoubleRes) { + numLEDsPerLetter = 2; + } else if (G.buildTypeDef == BuildTypeDef::TrippleRes) { + numLEDsPerLetter = 3; + } else if (G.buildTypeDef == BuildTypeDef::QuadRes) { + numLEDsPerLetter = 4; + } + /* Set minutes According to minute byte */ - for (uint8_t i = 0; i < 4; i++) { + for (uint8_t m = 0; m < 4; m++) { /* Bitwise check whether Pixel bit is set */ - if ((minuteArray >> i) & 1U) { - setPixel(minutePixelArray[i], displayedColor); + if ((minuteArray >> m) & 1U) { + for (int i = 0; i < numLEDsPerLetter; i++) { + setPixel(minutePixelArray[m] * numLEDsPerLetter + i, + displayedColor); + } } } } @@ -457,6 +481,24 @@ bool Led::getState() { // Pixel Clear Functions //------------------------------------------------------------------------------ +inline void Led::clearPixel(uint8_t row, uint8_t col) { + uint8_t numLEDsPerLetter = 1; + if (G.buildTypeDef == BuildTypeDef::DoubleRes) { + numLEDsPerLetter = 2; + } else if (G.buildTypeDef == BuildTypeDef::TrippleRes) { + numLEDsPerLetter = 3; + } else if (G.buildTypeDef == BuildTypeDef::QuadRes) { + numLEDsPerLetter = 4; + } + + uint16_t ledIndex = usedUhrType->getFrontMatrixIndex(row, col); + for (int i = 0; i < numLEDsPerLetter; i++) { + clearPixel(ledIndex * numLEDsPerLetter + i); + } +} + +//------------------------------------------------------------------------------ + inline void Led::clearPixel(uint16_t i) { if (G.Colortype == Grbw) { strip_RGBW->SetPixelColor(i, 0); @@ -471,7 +513,7 @@ inline void Led::clearClock() { for (uint8_t row = 0; row < usedUhrType->rowsWordMatrix(); row++) { for (uint8_t col = 0; col < usedUhrType->colsWordMatrix(); col++) { usedUhrType->setFrontMatrixPixel(row, col, false); - clearPixel(usedUhrType->getFrontMatrixIndex(row, col)); + clearPixel(row, col); } } } @@ -481,15 +523,26 @@ inline void Led::clearClock() { inline void Led::clearRow(uint8_t row) { for (uint8_t col = 0; col < usedUhrType->colsWordMatrix(); col++) { usedUhrType->setFrontMatrixPixel(row, col, false); - clearPixel(usedUhrType->getFrontMatrixIndex(row, col)); + clearPixel(row, col); } } //------------------------------------------------------------------------------ inline void Led::clearMinArray() { - for (uint16_t i = minutePixelArray[0]; i <= minutePixelArray[3]; i++) { - clearPixel(i); + for (uint16_t m = minutePixelArray[0]; m <= minutePixelArray[3]; m++) { + uint8_t numLEDsPerLetter = 1; + if (G.buildTypeDef == BuildTypeDef::DoubleRes) { + numLEDsPerLetter = 2; + } else if (G.buildTypeDef == BuildTypeDef::TrippleRes) { + numLEDsPerLetter = 3; + } else if (G.buildTypeDef == BuildTypeDef::QuadRes) { + numLEDsPerLetter = 4; + } + + for (int i = 0; i < numLEDsPerLetter; i++) { + clearPixel(m * numLEDsPerLetter + i); + } } minuteArray = 0; } diff --git a/webpage/index.html b/webpage/index.html index 34a1bb33..5d2c912a 100644 --- a/webpage/index.html +++ b/webpage/index.html @@ -396,6 +396,9 @@
diff --git a/webpage/language/de.js b/webpage/language/de.js index 672ad21a..47e0c3bc 100644 --- a/webpage/language/de.js +++ b/webpage/language/de.js @@ -159,7 +159,9 @@ let TRANSLATION_DE_DE = { "buildtype": "Bauart", "normal": "Jede LED entspricht einem Buchstaben", "doubleResM1": "Jede zweite LED entspricht einem Buchstaben", - "doubleRes": "Je zwei LEDs pro Buchstabe" + "doubleRes": "Je zwei LEDs pro Buchstabe", + "trippleRes": "Je drei LEDs pro Buchstabe", + "quadRes": "Je vier LEDs pro Buchstabe" }, "language": { "h2": "Sprache", diff --git a/webpage/language/en.js b/webpage/language/en.js index 386cebe7..5e922168 100644 --- a/webpage/language/en.js +++ b/webpage/language/en.js @@ -159,7 +159,9 @@ let TRANSLATION_EN_US = { "buildtype": "Buildtype", "normal": "Each LED corresponds to one letter", "doubleResM1": "Every second LED corresponds to one letter", - "doubleRes": "Two LEDs per letter" + "doubleRes": "Two LEDs per letter", + "trippleRes": "Three LEDs per letter", + "quadRes": "Four LEDs per letter" }, "language": { "h2": "Language",