// ESP8266 Code (Receiver of commands, Sender of data)

#include <Arduino.h>

// Используем аппаратный UART (Serial) для связи с ESP32
// TX (GPIO1) -> RX ESP32
// RX (GPIO3) <- TX ESP32
#define UART_PORT Serial

int n = 0;                // Текущая степень (0..10)
int direction = 1;        // 1 = увеличение, -1 = уменьшение
unsigned long lastSend = 0; 

void setup() {
  // Инициализация UART
  UART_PORT.begin(9600);
}

void loop() {
  // 🔹 Приём команд от ESP32 (только смена направления!)
  if (UART_PORT.available() > 0) {
    char cmd = UART_PORT.read();
    
    if (cmd == 'I' || cmd == 'i') {
      // Команда: начать увеличивать
      direction = 1;
    } 
    else if (cmd == 'D' || cmd == 'd') {
      // Команда: начать уменьшать
      direction = -1;
    }
  }

  // 🔹 Отправка значения 2^n каждую секунду
  if (millis() - lastSend >= 1000) {
    
    // 1. Вычисляем 2 в степени n
    long result = (1L << n); 
    
    // 2. Формируем строку для отправки (4 символа под число, например "1024")
    char buf[6]; 
    sprintf(buf, "%4ld", result);
    
    // 3. Отправляем на ESP32
    UART_PORT.print(buf);
    
    // 4. Изменяем n для СЛЕДУЮЩЕЙ итерации в зависимости от направления
    if (direction == 1) {
      // Движение вверх
      if (n < 10) {
        n++;
      } else {
        // Если достигли максимума, можно либо стоять, либо менять направление
        // Обычно при достижении предела просто остаемся на 10, пока не придет команда вниз
        // Или можно автоматически развернуться: direction = -1; 
        // Оставим n=10, чтобы пользователь сам нажал кнопку вниз, если нужно.
      }
    } 
    else {
      // Движение вниз
      if (n > 0) {
        n--;
      } else {
        // Если достигли минимума, остаемся на 0
      }
    }
    
    lastSend = millis();
  }
  
  delay(10);
}