From 798aa6605253e8bcc34ff321192a688a236553c2 Mon Sep 17 00:00:00 2001 From: gunner47 Date: Sun, 15 Sep 2019 23:09:13 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=BF=D1=82=D0=B8=D0=BC=D0=B8=D0=B7?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D1=8F=20=D0=B8=D1=81=D0=BF=D0=BE=D0=BB=D1=8C?= =?UTF-8?q?=D0=B7=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F=20=D0=BF=D0=B0=D0=BC?= =?UTF-8?q?=D1=8F=D1=82=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- firmware/GyverLamp_v1.4/FavoritesManager.h | 20 ++++++------- firmware/GyverLamp_v1.4/GyverLamp_v1.4.ino | 2 +- firmware/GyverLamp_v1.4/button.ino | 1 + firmware/GyverLamp_v1.4/effects.ino | 33 ++++++++++++++++++++++ firmware/GyverLamp_v1.4/parsing.ino | 19 ++----------- firmware/GyverLamp_v1.4/utility.ino | 11 ++++---- 6 files changed, 54 insertions(+), 32 deletions(-) diff --git a/firmware/GyverLamp_v1.4/FavoritesManager.h b/firmware/GyverLamp_v1.4/FavoritesManager.h index e8b7b5a..d158bb7 100644 --- a/firmware/GyverLamp_v1.4/FavoritesManager.h +++ b/firmware/GyverLamp_v1.4/FavoritesManager.h @@ -17,30 +17,30 @@ class FavoritesManager static void SetStatus(char* statusText) // помещает в statusText состояние режима работы избранных эффектов { char buff[6]; - statusText = "FAV "; + strcpy_P(statusText, PSTR("FAV ")); - statusText = strcat(statusText, FavoritesRunning ? "1" : "0"); - statusText = strcat(statusText, " "); + strcat_P(statusText, FavoritesRunning ? PSTR("1") : PSTR("0")); + strcat_P(statusText, PSTR(" ")); itoa(Interval, buff, 10); - statusText = strcat(statusText, buff); - statusText = strcat(statusText, " "); + strcat(statusText, buff); + strcat_P(statusText, PSTR(" ")); buff[0] = '\0'; itoa(Dispersion, buff, 10); - statusText = strcat(statusText, buff); - statusText = strcat(statusText, " "); + strcat(statusText, buff); + strcat_P(statusText, PSTR(" ")); buff[0] = '\0'; for (uint8_t i = 0; i < MODE_AMOUNT; i++) { itoa((uint8_t)FavoriteModes[i], buff, 10); - statusText = strcat(statusText, buff); - if (i < MODE_AMOUNT - 1) statusText = strcat(statusText, " "); + strcat(statusText, buff); + if (i < MODE_AMOUNT - 1) strcat_P(statusText, PSTR(" ")); buff[0] = '\0'; } - statusText = strcat(statusText, "\0"); + statusText += '\0'; } static void ConfigureFavorites(const char* statusText) // принимает statusText, парсит его и инициализирует свойства класса значениями из statusText'а diff --git a/firmware/GyverLamp_v1.4/GyverLamp_v1.4.ino b/firmware/GyverLamp_v1.4/GyverLamp_v1.4.ino index 1b3b42c..6f4ad02 100644 --- a/firmware/GyverLamp_v1.4/GyverLamp_v1.4.ino +++ b/firmware/GyverLamp_v1.4/GyverLamp_v1.4.ino @@ -168,7 +168,7 @@ void setup() #endif // ЛЕНТА - FastLED.addLeds(leds, NUM_LEDS)/*.setCorrection( TypicalLEDStrip )*/; + FastLED.addLeds(leds, NUM_LEDS)/*.setCorrection(TypicalLEDStrip)*/; FastLED.setBrightness(BRIGHTNESS); if (CURRENT_LIMIT > 0) FastLED.setMaxPowerInVoltsAndMilliamps(5, CURRENT_LIMIT); FastLED.clear(); diff --git a/firmware/GyverLamp_v1.4/button.ino b/firmware/GyverLamp_v1.4/button.ino index 32300ff..7ac1768 100644 --- a/firmware/GyverLamp_v1.4/button.ino +++ b/firmware/GyverLamp_v1.4/button.ino @@ -4,6 +4,7 @@ bool brightDirection; void buttonTick() { touch.tick(); + if (touch.isSingle()) { if (dawnFlag) diff --git a/firmware/GyverLamp_v1.4/effects.ino b/firmware/GyverLamp_v1.4/effects.ino index c4497e9..d2b6aa9 100644 --- a/firmware/GyverLamp_v1.4/effects.ino +++ b/firmware/GyverLamp_v1.4/effects.ino @@ -662,6 +662,39 @@ void whiteColorRoutine() } } +// ------------- экспериментальный эффект ------------- +// ------------- белый свет (уменьшение яркости по горизинтали от центра вверх и вниз; масштаб - ширина центральной полосы максимальной яркости; яркость - общая яркость ------------- +#define MINIMUM_BRIGHTNES (90U) // минимальная яркость (ниже матрица мерцает) +void whiteColorRoutine2() +{ + if (loadingFlag) + { + Serial.println("Отрисовка"); + loadingFlag = false; + FastLED.clear(); + delay(1); + + uint8_t centerY = max((uint8_t)round(HEIGHT / 2.0F) - 1, 0); + uint8_t bottomOffset = (uint8_t)(!(HEIGHT & 1) && (HEIGHT > 1)); // если высота матрицы чётная, линий с максимальной яркостью две, а линии с угасающей яркостью снизу будут смещены на один ряд + for (int16_t y = centerY; y >= 0; y--) + { + CRGB color = CHSV(100, 1, + constrain(uint8_t( // определяем яркость + modes[EFF_WHITE_COLOR].Brightness * (y + 1) / (centerY + 1) + // влияние координаты Y на яркость (плавное затухаие вверх и вниз) + modes[EFF_WHITE_COLOR].Brightness * modes[EFF_WHITE_COLOR].Scale / 100), // влияние масштаба на яркость + MINIMUM_BRIGHTNES, + max((uint8_t)MINIMUM_BRIGHTNES, (uint8_t)modes[EFF_WHITE_COLOR].Brightness) + )); + + for (uint8_t x = 0; x < WIDTH; x++) + { + drawPixelXY(x, y, color); // при чётной высоте матрицы максимально яркими отрисуются 2 центральных горизонтальных полосы + drawPixelXY(x, max((uint8_t)(HEIGHT - 1) - (y + 1) + bottomOffset, 0), color); // при нечётной - одна, но дважды + } + } + } +} + /* * устарело void lightersRoutine() diff --git a/firmware/GyverLamp_v1.4/parsing.ino b/firmware/GyverLamp_v1.4/parsing.ino index 88a271d..68a93b0 100644 --- a/firmware/GyverLamp_v1.4/parsing.ino +++ b/firmware/GyverLamp_v1.4/parsing.ino @@ -45,6 +45,7 @@ void parseUDP() memcpy(buff, &inputBuffer[3], strlen(inputBuffer)); // взять подстроку, состоящую последних символов строки inputBuffer, начиная с символа 4 modes[currentMode].Brightness = constrain(atoi(buff), 1, 255); FastLED.setBrightness(modes[currentMode].Brightness); + loadingFlag = true; settChanged = true; eepromTimeout = millis(); sendCurrent(); @@ -158,14 +159,13 @@ void parseUDP() else if (!strncmp_P(inputBuffer, PSTR("FAV_GET"), 7)) { - sendFavorites(); + FavoritesManager::SetStatus(inputBuffer); } else if (!strncmp_P(inputBuffer, PSTR("FAV_SET"), 7)) { FavoritesManager::ConfigureFavorites(inputBuffer); - //FavoritesManager::SetStatus(inputBuffer); - sendFavorites(); + FavoritesManager::SetStatus(inputBuffer); settChanged = true; eepromTimeout = millis(); } @@ -263,16 +263,3 @@ void sendTimer() TimerManager::TimerOption, (TimerManager::TimerRunning ? (uint16_t)floor((TimerManager::TimeToFire - millis()) / 1000) : 0)); } - -void sendFavorites() -{ - sprintf_P(inputBuffer, PSTR("FAV %u %u %u"), - FavoritesManager::FavoritesRunning, - FavoritesManager::Interval, - FavoritesManager::Dispersion); - - for (uint8_t i = 0; i < MODE_AMOUNT; i++) - { - sprintf_P(inputBuffer, PSTR("%s %u"), inputBuffer, FavoritesManager::FavoriteModes[i]); - } -} diff --git a/firmware/GyverLamp_v1.4/utility.ino b/firmware/GyverLamp_v1.4/utility.ino index 7bf0b73..67c4224 100644 --- a/firmware/GyverLamp_v1.4/utility.ino +++ b/firmware/GyverLamp_v1.4/utility.ino @@ -3,16 +3,17 @@ // залить все void fillAll(CRGB color) { - for (int32_t i = 0; i < NUM_LEDS; i++) { + for (int32_t i = 0; i < NUM_LEDS; i++) + { leds[i] = color; } } // функция отрисовки точки по координатам X Y -void drawPixelXY(int8_t x, int8_t y, CRGB color) +void drawPixelXY(uint8_t x, uint8_t y, CRGB color) { if (x < 0 || x > WIDTH - 1 || y < 0 || y > HEIGHT - 1) return; - int32_t thisPixel = getPixelNumber(x, y) * SEGMENTS; + uint32_t thisPixel = getPixelNumber(x, y) * SEGMENTS; for (uint8_t i = 0; i < SEGMENTS; i++) { leds[thisPixel + i] = color; @@ -28,7 +29,7 @@ uint32_t getPixColor(uint32_t thisSegm) } // функция получения цвета пикселя в матрице по его координатам -uint32_t getPixColorXY(int8_t x, int8_t y) +uint32_t getPixColorXY(uint8_t x, uint8_t y) { return getPixColor(getPixelNumber(x, y)); } @@ -83,7 +84,7 @@ uint32_t getPixColorXY(int8_t x, int8_t y) #endif // получить номер пикселя в ленте по координатам -uint16_t getPixelNumber(int8_t x, int8_t y) +uint16_t getPixelNumber(uint8_t x, uint8_t y) { if ((THIS_Y % 2 == 0) || MATRIX_TYPE) // если чётная строка {