diff --git a/README.md b/README.md index 407eecc..0a2114e 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ English description further below. Dies ist ein Projekt für eine mehrsprachige Wortuhr auf Grundlage eines ESP8266-Mikrocontrollers und einer programmierbaren LED-Leiste (WS2812 oder SK6812). Eine Wortuhr ist ein wunderschönes DIY-Projekt für Anfänger, das Technologie und Design kombiniert, um eine funktionale und ästhetisch ansprechende Uhr zu schaffen. Egal, ob Sie ein Anfänger oder ein erfahrener Bastler sind, dieses Projekt ist eine großartige Möglichkeit, Ihre Fähigkeiten unter Beweis zu stellen und etwas wirklich Besonderes zu schaffen. Die Software hat viele Funktionen: -- Mehrsprachig (🇬🇧, 🇩🇪, 🇪🇸, 🇮🇹, 🇳🇱, 🇭🇺) +- Mehrsprachig (🇬🇧, 🇩🇪, 🇪🇸, 🇮🇹, 🇳🇱, 🇭🇺, 🇷🇴, 🇨🇭, 🇷🇺, 🇸🇪, 🇫🇷) - Unterstützung für mehrere Layouts und LED-Abstände - Farbwechsel der Displayfarbe möglich (RGB oder RGBW) - Digitale Uhranzeige @@ -105,7 +105,7 @@ Die einzige Bedingung ist, dass der Copyright-Hinweis des Originalprogramms nich This is a project for a multilingual word clock based on an ESP8266 microcontroller and a programmable LED strip (WS2812 or SK6812). A word clock is a beautiful DIY project for beginners that combines technology and design to create a functional and aesthetically pleasing clock. Whether you're a beginner or an experienced hobbyist, this project is a great way to show off your skills and create something truly special. The software has many features: -- Multilingual (🇬🇧, 🇩🇪, 🇪🇸, 🇮🇹, 🇳🇱, 🇭🇺) +- Multilingual (🇬🇧, 🇩🇪, 🇪🇸, 🇮🇹, 🇳🇱, 🇭🇺, 🇷🇴, 🇨🇭, 🇷🇺, 🇸🇪, 🇫🇷) - Support for multiple layouts and LED spacing - Colour change of the display colour possible (RGB or RGBW) - Digital clock display diff --git a/eslintrc.json b/eslintrc.json old mode 100644 new mode 100755 index 503ca9a..869b7e6 --- a/eslintrc.json +++ b/eslintrc.json @@ -268,6 +268,7 @@ "TRANSLATION_IT": "readonly", "TRANSLATION_ES": "readonly", "TRANSLATION_HU": "readonly", + "TRANSLATION_RU": "readonly", "i18next": "readonly", "isLocalEnvironment": "readonly" } diff --git a/include/Uhr.h b/include/Uhr.h index 22311ad..82955ad 100644 --- a/include/Uhr.h +++ b/include/Uhr.h @@ -272,6 +272,7 @@ enum ClockType { Ro10x11 = 19, Fr10x11 = 21, Se10x11 = 22, + Ru10x11 = 23, }; enum Icons { diff --git a/include/Uhrtypes/HU10x10.hpp b/include/Uhrtypes/HU10x10.hpp index 3273185..2335d37 100644 --- a/include/Uhrtypes/HU10x10.hpp +++ b/include/Uhrtypes/HU10x10.hpp @@ -5,8 +5,8 @@ /* * Layout Front * COL - * X 9 8 7 6 5 4 3 2 1 0 - * ROW + - - - - - - - - - - - + * 9 8 7 6 5 4 3 2 1 0 + * ROW + - - - - - - - - - - * 0 | Ö T B T Í Z J A S U * 1 | P E R C C E L E W O * 2 | M Ú L T A M Ú L V A diff --git a/include/Uhrtypes/RU10x11.hpp b/include/Uhrtypes/RU10x11.hpp new file mode 100755 index 0000000..868486f --- /dev/null +++ b/include/Uhrtypes/RU10x11.hpp @@ -0,0 +1,227 @@ +#pragma once + +#include "Uhrtype.hpp" + +/* + * Layout Front by Ragman + * COL + * X 9 8 7 6 5 4 3 2 1 0 + * ROW + - - - - - - - - - - - + * 0 | О Д И Н П Я Т Ь Д В А + * 1 | Д Е Ш Е С Т Ь В Я Т Ь + * 2 | В О Ч Е C E M Ь Т Р И + * 3 | Т Ы Д В Е Р Е С Я Т Ь + * 4 | Н А Д Ц А Т Ь Ч А С А + * 5 | Ч А С О В Д С О Р О К + * 6 | Т Р И Д В А Д П Я Т Ь + * 7 | П Я Т Н А Д Е Ц А Т Ь + * 8 | A M Д Е С Я Т С Я Т Ь + * 9 | П Я Т Ь Я Р М И Н У Т + */ + +class Ru10x11_t : public iUhrType { +public: + virtual LanguageAbbreviation usedLang() override { + return LanguageAbbreviation::RU; + }; + + //------------------------------------------------------------------------------ + + virtual const bool hasZwanzig() override { return true; } + + //------------------------------------------------------------------------------ + + virtual const bool hasTwentyfive() override { return true; } + + //------------------------------------------------------------------------------ + + virtual const bool hasThirtyfive() override { return true; } + + //------------------------------------------------------------------------------ + + virtual const bool hasForty() override { return true; } + + //------------------------------------------------------------------------------ + + virtual const bool hasDreiviertel() override { return true; } + + //------------------------------------------------------------------------------ + + virtual const bool hasFifty() override { return true; } + + //------------------------------------------------------------------------------ + + virtual const bool hasFiftyFive() override { return true; } + + //------------------------------------------------------------------------------ + + void show(FrontWord word) override { + switch (word) { + + case FrontWord::es_ist: + // Ч А С О В (5 ... 12) + setFrontMatrixWord(5, 6, 10); + break; + + case FrontWord::es_ist___plural___: + // Ч А С A (2 ...4) + setFrontMatrixWord(4, 0, 3); + break; + + case FrontWord::es_ist__singular__: + // Ч А С (1) + setFrontMatrixWord(4, 1, 3); + break; + + case FrontWord::hour_1: + // О Д И Н + setFrontMatrixWord(0, 7, 10); + break; + + case FrontWord::hour_2: + // Д В А + setFrontMatrixWord(0, 0, 2); + break; + + case FrontWord::hour_3: + // Т Р И + setFrontMatrixWord(2, 0, 2); + break; + + case FrontWord::hour_4: + // Ч Е Т Ы Р Е + setFrontMatrixWord(2, 7, 8); + setFrontMatrixWord(3, 9, 10); + setFrontMatrixWord(3, 4, 5); + break; + + case FrontWord::hour_5: + // П Я Т Ь + setFrontMatrixWord(0, 3, 6); + break; + + case FrontWord::hour_6: + // Ш Е С Т Ь + setFrontMatrixWord(1, 4, 8); + break; + + case FrontWord::hour_7: + // C E M Ь + setFrontMatrixWord(2, 3, 6); + break; + + case FrontWord::hour_8: + // B O C E M Ь + setFrontMatrixWord(2, 9, 10); + setFrontMatrixWord(2, 3, 6); + break; + + case FrontWord::hour_9: + // Д Е В Я Т Ь + setFrontMatrixWord(1, 9, 10); + setFrontMatrixWord(1, 0, 3); + break; + + case FrontWord::hour_10: + // Д Е С Я Т Ь + setFrontMatrixWord(1, 9, 10); + setFrontMatrixWord(3, 0, 3); + break; + + case FrontWord::hour_11: + // О Д И Н Н А Д Ц А Т Ь + setFrontMatrixWord(0, 7, 10); + setFrontMatrixWord(4, 4, 10); + break; + + case FrontWord::hour_12: + // Д В Е Н А Д Ц А Т Ь + setFrontMatrixWord(3, 6, 8); + setFrontMatrixWord(4, 4, 10); + break; + + case FrontWord::min_5: + // П Я Т Ь М И Н У Т + setFrontMatrixWord(9, 7, 10); + setFrontMatrixWord(9, 0, 4); + break; + + case FrontWord::min_10: + // Д Е С Я Т Ь М И Н У Т + setFrontMatrixWord(8, 7, 8); + setFrontMatrixWord(8, 0, 3); + setFrontMatrixWord(9, 0, 4); + break; + + case FrontWord::viertel: + // П Я Т Н А Д Ц А Т Ь М И Н У Т + setFrontMatrixWord(7, 5, 10); + setFrontMatrixWord(7, 0, 3); + setFrontMatrixWord(9, 0, 4); + break; + + case FrontWord::min_20: + // Д В А Д Ц А Т Ь М И Н У Т + setFrontMatrixWord(6, 4, 7); + setFrontMatrixWord(7, 0, 3); + setFrontMatrixWord(9, 0, 4); + break; + + case FrontWord::min_25: + // Д В А Д Ц А Т Ь П Я Т Ь М И Н У Т + setFrontMatrixWord(6, 4, 7); + setFrontMatrixWord(7, 0, 3); + setFrontMatrixWord(9, 7, 10); + setFrontMatrixWord(9, 0, 4); + break; + + case FrontWord::halb: + // Т Р И Д Ц А Т Ь М И Н У Т + setFrontMatrixWord(6, 7, 10); + setFrontMatrixWord(7, 0, 3); + setFrontMatrixWord(9, 0, 4); + break; + + case FrontWord::min_35: + // Т Р И Д Ц А Т Ь П Я Т Ь М И Н У Т + setFrontMatrixWord(6, 7, 10); + setFrontMatrixWord(7, 0, 3); + setFrontMatrixWord(9, 7, 10); + setFrontMatrixWord(9, 0, 4); + break; + + case FrontWord::min_40: + // C O P O K М И Н У Т + setFrontMatrixWord(5, 0, 4); + setFrontMatrixWord(9, 0, 4); + break; + + case FrontWord::dreiviertel: + // C O P O K П Я Т Ь М И Н У Т + setFrontMatrixWord(5, 0, 4); + setFrontMatrixWord(9, 7, 10); + setFrontMatrixWord(9, 0, 4); + break; + + case FrontWord::min_50: + // П Я Т Ь Д Е С Я Т М И Н У Т + setFrontMatrixWord(6, 0, 3); + setFrontMatrixWord(8, 4, 8); + setFrontMatrixWord(9, 0, 4); + break; + + case FrontWord::min_55: + // П Я Т Ь Д Е С Я Т П Я Т Ь М И Н У Т + setFrontMatrixWord(6, 0, 3); + setFrontMatrixWord(8, 4, 8); + setFrontMatrixWord(9, 7, 10); + setFrontMatrixWord(9, 0, 4); + break; + + default: + break; + }; + }; +}; + +Ru10x11_t _ru10x11; \ No newline at end of file diff --git a/include/Uhrtypes/Uhrtype.hpp b/include/Uhrtypes/Uhrtype.hpp index 22311b1..e0fa96f 100644 --- a/include/Uhrtypes/Uhrtype.hpp +++ b/include/Uhrtypes/Uhrtype.hpp @@ -1,6 +1,6 @@ #pragma once -enum class LanguageAbbreviation { DE, EN, ES, IT, NL, HU, RO, FR, SE }; +enum class LanguageAbbreviation { DE, EN, ES, IT, NL, HU, RO, FR, SE, RU }; enum class FrontWord { error, @@ -69,6 +69,7 @@ enum class FrontWord { m_num4, es_ist, + es_ist__singular__, es_ist___plural___, nach, vor, @@ -181,6 +182,12 @@ class iUhrType { virtual const bool hasThirtyfive() { return false; } + virtual const bool hasForty() { return false; } + + virtual const bool hasFifty() { return false; } + + virtual const bool hasFiftyFive() { return false; } + virtual const bool hasMitternacht() { return false; } virtual const bool has24HourLayout() { return false; } diff --git a/include/clockWork.h b/include/clockWork.h index f745874..fad9f50 100644 --- a/include/clockWork.h +++ b/include/clockWork.h @@ -31,6 +31,8 @@ class ClockWork { void showMinute(uint8_t min); void resetMinVariantIfNotAvailable(); FrontWord getFrontWordForNum(uint8_t min); + bool hasTwentyAndCheckForUsage(); + bool hasDreiviertelAndCheckForUsage(); void setMinute(uint8_t min, uint8_t &offsetHour, bool &fullHour); //------------------------------------------------------------------------------ @@ -46,6 +48,7 @@ class ClockWork { WordclockChanges changesInClockface(); void calcClockface(); void setClock(); + void DetermineWhichItIsToShow(uint8_t offsetHour); void clearClockByProgInit(); public: diff --git a/include/clockWork.hpp b/include/clockWork.hpp index 8632b21..67e58b0 100644 --- a/include/clockWork.hpp +++ b/include/clockWork.hpp @@ -84,6 +84,8 @@ iUhrType *ClockWork::getPointer(uint8_t type) { return &_fr10x11; case Se10x11: return &_se10x11; + case Ru10x11: + return &_ru10x11; default: return nullptr; } @@ -455,6 +457,25 @@ FrontWord ClockWork::getFrontWordForNum(uint8_t min) { //------------------------------------------------------------------------------ +bool ClockWork::hasTwentyAndCheckForUsage() { + return usedUhrType->hasZwanzig() || G.languageVariant[ItIs40]; +} + +//------------------------------------------------------------------------------ + +bool ClockWork::hasDreiviertelAndCheckForUsage() { + if (usedUhrType->hasDreiviertel()) { + if (usedUhrType->usedLang() != LanguageAbbreviation::DE) { + return true; + } else if (G.languageVariant[ItIs45]) { + return true; + } + } + return false; +} + +//------------------------------------------------------------------------------ + void ClockWork::setMinute(uint8_t min, uint8_t &offsetHour, bool &fullHour) { if (usedUhrType->has24HourLayout()) { usedUhrType->show(FrontWord::uhr); @@ -505,9 +526,6 @@ void ClockWork::setMinute(uint8_t min, uint8_t &offsetHour, bool &fullHour) { case 13: case 14: usedUhrType->show(getFrontWordForNum(min)); - if (usedUhrType->has24HourLayout()) { - usedUhrType->show(FrontWord::minuten); - } usedUhrType->show(FrontWord::nach); break; case 15: // quarter past @@ -530,15 +548,15 @@ void ClockWork::setMinute(uint8_t min, uint8_t &offsetHour, bool &fullHour) { usedUhrType->show(getFrontWordForNum(min)); usedUhrType->show(FrontWord::nach); break; - case 20: // 20 past - if (!usedUhrType->hasZwanzig() || G.languageVariant[ItIs20]) { + case 20: + if (hasTwentyAndCheckForUsage()) { + usedUhrType->show(FrontWord::min_20); + usedUhrType->show(FrontWord::nach); + } else { usedUhrType->show(FrontWord::min_10); usedUhrType->show(FrontWord::vor); usedUhrType->show(FrontWord::halb); offsetHour = 1; - } else { - usedUhrType->show(FrontWord::min_20); - usedUhrType->show(FrontWord::nach); } break; case 21: @@ -577,7 +595,7 @@ void ClockWork::setMinute(uint8_t min, uint8_t &offsetHour, bool &fullHour) { usedUhrType->show(FrontWord::halb); usedUhrType->show(FrontWord::nach); } else { - if (G.UhrtypeDef == Fr10x11) { + if (G.UhrtypeDef == Fr10x11 || G.UhrtypeDef == Ru10x11) { usedUhrType->show(FrontWord::halb); } else { usedUhrType->show(FrontWord::halb); @@ -602,13 +620,12 @@ void ClockWork::setMinute(uint8_t min, uint8_t &offsetHour, bool &fullHour) { } else if (usedUhrType->hasTwentyfive()) { usedUhrType->show(FrontWord::min_25); usedUhrType->show(FrontWord::vor); - offsetHour = 1; } else { usedUhrType->show(FrontWord::min_5); usedUhrType->show(FrontWord::nach); usedUhrType->show(FrontWord::halb); - offsetHour = 1; } + offsetHour = 1; break; case 36: case 37: @@ -620,13 +637,15 @@ void ClockWork::setMinute(uint8_t min, uint8_t &offsetHour, bool &fullHour) { offsetHour = 1; break; case 40: - if (!usedUhrType->hasZwanzig() || G.languageVariant[ItIs40]) { + if (usedUhrType->hasForty()) { + usedUhrType->show(FrontWord::min_40); + } else if (hasTwentyAndCheckForUsage()) { + usedUhrType->show(FrontWord::min_20); + usedUhrType->show(FrontWord::vor); + } else { usedUhrType->show(FrontWord::min_10); usedUhrType->show(FrontWord::nach); usedUhrType->show(FrontWord::halb); - } else { - usedUhrType->show(FrontWord::min_20); - usedUhrType->show(FrontWord::vor); } offsetHour = 1; break; @@ -639,7 +658,7 @@ void ClockWork::setMinute(uint8_t min, uint8_t &offsetHour, bool &fullHour) { offsetHour = 1; break; case 45: // quarter to - if (usedUhrType->hasDreiviertel() && G.languageVariant[ItIs45]) { + if (hasDreiviertelAndCheckForUsage()) { usedUhrType->show(FrontWord::dreiviertel); } else { // A Quarter to @@ -656,13 +675,25 @@ void ClockWork::setMinute(uint8_t min, uint8_t &offsetHour, bool &fullHour) { case 48: case 49: case 50: + if (usedUhrType->hasFifty()) { + usedUhrType->show(FrontWord::min_50); + } else { + usedUhrType->show(getFrontWordForNum(60 - min)); + usedUhrType->show(FrontWord::vor); + } + offsetHour = 1; + break; case 51: case 52: case 53: case 54: case 55: - usedUhrType->show(getFrontWordForNum(60 - min)); - usedUhrType->show(FrontWord::vor); + if (usedUhrType->hasFiftyFive()) { + usedUhrType->show(FrontWord::min_55); + } else { + usedUhrType->show(getFrontWordForNum(60 - min)); + usedUhrType->show(FrontWord::vor); + } offsetHour = 1; break; case 56: @@ -682,6 +713,10 @@ void ClockWork::setMinute(uint8_t min, uint8_t &offsetHour, bool &fullHour) { default: break; } + + if (G.UhrtypeDef == Ru10x11) { + offsetHour = 0; + } } } @@ -821,11 +856,32 @@ void ClockWork::setClock() { setHour(_hour + offsetHour, fullHour); if (!G.languageVariant[NotShowItIs]) { - if (G.UhrtypeDef == Es10x11 && (_hour + offsetHour) == 1) { + DetermineWhichItIsToShow(_hour + offsetHour); + } +} + +//------------------------------------------------------------------------------ + +void ClockWork::DetermineWhichItIsToShow(uint8_t hour) { + if (G.UhrtypeDef == Ru10x11) { + hour %= 12; + switch (hour) { + case 1: + usedUhrType->show(FrontWord::es_ist__singular__); + break; + case 2: + case 3: + case 4: usedUhrType->show(FrontWord::es_ist___plural___); - } else { + break; + default: usedUhrType->show(FrontWord::es_ist); + break; } + } else if (G.UhrtypeDef == Es10x11 && hour == 1) { + usedUhrType->show(FrontWord::es_ist___plural___); + } else { + usedUhrType->show(FrontWord::es_ist); } } diff --git a/include/config.h b/include/config.h index bf7e055..b70ea39 100644 --- a/include/config.h +++ b/include/config.h @@ -124,6 +124,14 @@ // 10 rows, 11 LED's per row + 4 LED's for minutes, with modified // layout for the French language +/**********************/ +/* Russian */ +/**********************/ +// +// #define DEFAULT_LAYOUT Ru10x11 +// 10 rows, 11 LED's per row + 4 LED's for minutes, with modified +// layout for the Russian language + /**********************/ /* Swedish */ /**********************/ diff --git a/src/Wortuhr.cpp b/src/Wortuhr.cpp index 045c70e..cdead55 100644 --- a/src/Wortuhr.cpp +++ b/src/Wortuhr.cpp @@ -210,7 +210,7 @@ void setup() { G.transitionType = 0; // Transition::NO_TRANSITION; G.transitionDuration = 2; G.transitionSpeed = 30; - G.transitionColorize = 1; + G.transitionColorize = 0; G.transitionDemo = false; eeprom::write(); diff --git a/webpage/i18n.js b/webpage/i18n.js index 9f8efb0..553155c 100644 --- a/webpage/i18n.js +++ b/webpage/i18n.js @@ -27,6 +27,9 @@ i18next.init({ }, hu: { translation: TRANSLATION_HU + }, + ru: { + translation: TRANSLATION_RU } } }, (error) => { diff --git a/webpage/index.html b/webpage/index.html index cdfb6b3..00f6081 100644 --- a/webpage/index.html +++ b/webpage/index.html @@ -65,6 +65,7 @@ + @@ -245,6 +246,7 @@
+