#include <Wire.h>
#include "lcd_i2c.h"

LiquidCrystal_I2C lcd(LCD_ADDRESS, 16, 2);

struct DisplayData {
  char topLine[64];
  int value1;
  int value2;
  int value3;
};

struct TextCounter {
  unsigned long startTime;
  int incrementValue;
};

TextCounter textCounter;

void setup() {
  lcd.begin(16, 2);
  textCounter.startTime = millis(); // Запоминаем время запуска программы
}

void loop() {
  unsigned long currentTime = millis(); // Текущее время

  // Проверяем, прошло ли 500 мс с момента последнего увеличения incrementValue
  if (currentTime - textCounter.startTime >= 500) {
    textCounter.incrementValue++; // Увеличиваем incrementValue на 1
    textCounter.startTime = currentTime; // Обновляем время
  }

  DisplayData displayData;
  strncpy(displayData.topLine, "we are responsible for those who have been tame ", sizeof(displayData.topLine) - 1);
  displayData.topLine[sizeof(displayData.topLine) - 1] = '\0';
  displayData.value1 = 500;
  displayData.value2 = 800;
  displayData.value3 = 855;

  // Буферы для заполнения данных
  char buffer1[17];
  char buffer2[17];

  // Заполнение буфера 1
  fillBuffer1(displayData.topLine, buffer1, sizeof(buffer1), textCounter.incrementValue);

  // Заполнение буфера 2
  fillBuffer2(displayData.value1, displayData.value2, displayData.value3, buffer2, sizeof(buffer2));

  // Создание массива для вывода на дисплей
  char displayArray[32];
  strncpy(displayArray, buffer1, 16); // Копирование первых 16 символов из buffer1 в displayArray
  strncpy(displayArray + 16, buffer2, 16); // Копирование первых 16 символов из buffer2 в displayArray, начиная с позиции 16

  // Вывод данных на экран
  lcd.setCursor(0, 0);
  lcd.print(displayArray);

  lcd.setCursor(0, 1);
  lcd.print(displayArray + 16); // Вывод второй половины displayArray
}

void fillBuffer1(const char * source, char * buffer, size_t bufferSize, int incrementValue) {
  int startIndex = incrementValue % strlen(source); // Определяем начальный индекс на основе incrementValue
  int endIndex = startIndex + 16;

  if (endIndex > strlen(source)) {
    // Если endIndex превышает длину строки source, переносим его на начало строки
    endIndex = endIndex - strlen(source);

    // Копируем символы с конца строки source
    strncpy(buffer, source + startIndex, strlen(source) - startIndex);

    // Копируем оставшиеся символы с начала строки source
    strncat(buffer, source, endIndex);
  } else {
    strncpy(buffer, source + startIndex, endIndex - startIndex);
  }

  buffer[endIndex - startIndex] = '\0'; // Установка нулевого символа в конце буфера
}

void fillBuffer2(int value1, int value2, int value3, char * buffer, size_t bufferSize) {
  snprintf(buffer, bufferSize, "%d.%d.%d", value1, value2, value3);
}