Files
GyverLamp/firmware/old/GyverLamp_v1.5.4/runningText.ino
2019-11-14 14:17:02 +03:00

94 lines
3.4 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// работа с бегущим текстом
// **************** НАСТРОЙКИ ****************
#define TEXT_DIRECTION 1 // 1 - по горизонтали, 0 - по вертикали
#define MIRR_V 0 // отразить текст по вертикали (0 / 1)
#define MIRR_H 0 // отразить текст по горизонтали (0 / 1)
#define TEXT_HEIGHT 3 // высота, на которой бежит текст (от низа матрицы)
#define LET_WIDTH 5 // ширина буквы шрифта
#define LET_HEIGHT 8 // высота буквы шрифта
#define SPACE 1 // пробел
// --------------------- ДЛЯ РАЗРАБОТЧИКОВ ----------------------
int offset = WIDTH;
uint32_t scrollTimer;
void resetString() {
offset = WIDTH;
}
boolean fillString(String text, CRGB textColor, boolean clear) {
if (loadingFlag) {
offset = WIDTH; // перемотка в правый край
loadingFlag = false;
}
if (millis() - scrollTimer >= 100) {
scrollTimer = millis();
if (clear) FastLED.clear();
byte i = 0, j = 0;
while (text[i] != '\0') {
if ((byte)text[i] > 191) { // работаем с русскими буквами!
i++;
} else {
drawLetter(j, text[i], offset + j * (LET_WIDTH + SPACE), textColor);
i++;
j++;
}
}
offset--;
if (offset < -j * (LET_WIDTH + SPACE)) { // строка убежала
offset = WIDTH + 3;
return true;
}
FastLED.show();
}
return false;
}
void drawLetter(uint8_t index, uint8_t letter, int16_t offset, CRGB textColor) {
int8_t start_pos = 0, finish_pos = LET_WIDTH;
if (offset < -LET_WIDTH || offset > WIDTH) return;
if (offset < 0) start_pos = -offset;
if (offset > (WIDTH - LET_WIDTH)) finish_pos = WIDTH - offset;
for (byte i = start_pos; i < finish_pos; i++) {
int thisByte;
if (MIRR_V) thisByte = getFont((byte)letter, LET_WIDTH - 1 - i);
else thisByte = getFont((byte)letter, i);
for (byte j = 0; j < LET_HEIGHT; j++) {
boolean thisBit;
if (MIRR_H) thisBit = thisByte & (1 << j);
else thisBit = thisByte & (1 << (LET_HEIGHT - 1 - j));
// рисуем столбец (i - горизонтальная позиция, j - вертикальная)
if (TEXT_DIRECTION) {
if (thisBit) leds[getPixelNumber(offset + i, TEXT_HEIGHT + j)] = textColor;
//else drawPixelXY(offset + i, TEXT_HEIGHT + j, 0x000000);
} else {
if (thisBit) leds[getPixelNumber(i, offset + TEXT_HEIGHT + j)] = textColor;
//else drawPixelXY(i, offset + TEXT_HEIGHT + j, 0x000000);
}
}
}
}
// ------------- СЛУЖЕБНЫЕ ФУНКЦИИ --------------
// интерпретатор кода символа в массиве fontHEX (для Arduino IDE 1.8.* и выше)
uint8_t getFont(uint8_t font, uint8_t row) {
font = font - '0' + 16; // перевод код символа из таблицы ASCII в номер согласно нумерации массива
if (font <= 90) return pgm_read_byte(&(fontHEX[font][row])); // для английских букв и символов
else if (font >= 112 && font <= 159) { // и пизд*ц ждя русских
return pgm_read_byte(&(fontHEX[font - 17][row]));
} else if (font >= 96 && font <= 111) {
return pgm_read_byte(&(fontHEX[font + 47][row]));
}
}