// ======================================================================
//   Két Viessmann 3 LED-es fénysorompó szinkron vezérlése
//
//   AUTOMATA ÜZEM: LDR + lézer alapján működik
//   KÉZI ÜZEM: gomb rövid nyomása -> szabad/tílos váltás
//   2 mp hosszú nyomás -> automata <-> kézi váltás
//
//   LED logika: harmadik láb mindig INPUT, így nem világít össze semmi
//   GOMB: A0 (INPUT_PULLUP) -> LOW = nyomva, HIGH = nincs nyomva
//   MODE kijelző: D13 (LOW=automata, HIGH=kézi)
// ======================================================================


// -------------------
//  JELZŐ 1 lábai
// -------------------
const int S1_SARGA = 2;
const int S1_PIROS = 3;
const int S1_FEHER = 4;

// -------------------
//  JELZŐ 2 lábai
// -------------------
const int S2_SARGA = 8;
const int S2_PIROS = 9;
const int S2_FEHER = 10;

// -------------------
//  Bemenetek
// -------------------
const int LDR_PIN    = A1;   // automata fénykapu
const int BUTTON_PIN = A0;   // gomb (INPUT_PULLUP)
const int MODE_PIN   = 13;   // visszajelző LED (automat/kezi)

// -------------------
//  Állapotváltozók
// -------------------
unsigned long lastToggle = 0;
bool feherState = false;
bool pirosState = false;

unsigned long buttonPressStart = 0;
bool lastButton = HIGH;

bool manualMode = false;     // false = automata, true = kézi
bool manualTilos = false;    // kézi módban aktív jelzés


// ======================================================================
//  Inicializálás
// ======================================================================
void setup() {
  Serial.begin(9600);

  pinMode(S1_SARGA, OUTPUT);
  pinMode(S1_PIROS, OUTPUT);
  pinMode(S1_FEHER, OUTPUT);

  pinMode(S2_SARGA, OUTPUT);
  pinMode(S2_PIROS, OUTPUT);
  pinMode(S2_FEHER, OUTPUT);

  pinMode(LDR_PIN, INPUT);
  pinMode(BUTTON_PIN, INPUT_PULLUP);

  pinMode(MODE_PIN, OUTPUT);   // manuális/automata jelzés

  allOff();
}


// ======================================================================
//  Fő loop
// ======================================================================
void loop() {

  // -------------------------------------
  // 1) GOMB KEZELÉSE (INPUT_PULLUP)
  // -------------------------------------
  bool btn = digitalRead(BUTTON_PIN);

  // Lenyomás (LOW)
  if (btn == LOW && lastButton == HIGH) {
    buttonPressStart = millis();
  }

  // Felengedés (HIGH)
  if (btn == HIGH && lastButton == LOW) {
    unsigned long pressTime = millis() - buttonPressStart;

    if (pressTime >= 2000) {
      // hosszú nyomás -> üzemmód váltás
      manualMode = !manualMode;
      Serial.print("MOD VALTAS: ");
      Serial.println(manualMode ? "KEZI" : "AUTOMATA");
    } else {
      // rövid nyomás -> csak kézi módban érvényes
      if (manualMode) {
        manualTilos = !manualTilos;
        Serial.print("KEZI VALTAS: ");
        Serial.println(manualTilos ? "TILOS" : "SZABAD");
      }
    }
  }

  lastButton = btn;


  // -------------------------------------
  // 2) MODE visszajelző (D13)
  // -------------------------------------
  digitalWrite(MODE_PIN, manualMode ? HIGH : LOW);


  // -------------------------------------
  // 3) AUTOMATA / KÉZI ÜZEM LOGIKA
  // -------------------------------------
  bool tilos = false;

  if (!manualMode) {
    // AUTOMATA: LDR vezérlés
    int feny = analogRead(LDR_PIN);
    tilos = (feny < 400);   // határérték
    Serial.print("AUTO feny=");
    Serial.print(feny);
    Serial.print("  tilos=");
    Serial.println(tilos);
  } 
  else {
    // KÉZI: LDR-t ignoráljuk
    tilos = manualTilos;
    Serial.print("KEZI tilos=");
    Serial.println(tilos);
  }


  // -------------------------------------
  // 4) JELZÉS VEZÉRLÉS
  // -------------------------------------
  if (!tilos) {
    feherVillog();
  } else {
    pirosValtakozik();
  }
}



// ======================================================================
//  LED VEZÉRLÉS
// ======================================================================

void allOff() {
  pinMode(S1_SARGA, OUTPUT); digitalWrite(S1_SARGA, LOW);
  pinMode(S1_PIROS, OUTPUT); digitalWrite(S1_PIROS, LOW);
  pinMode(S1_FEHER, OUTPUT); digitalWrite(S1_FEHER, LOW);

  pinMode(S2_SARGA, OUTPUT); digitalWrite(S2_SARGA, LOW);
  pinMode(S2_PIROS, OUTPUT); digitalWrite(S2_PIROS, LOW);
  pinMode(S2_FEHER, OUTPUT); digitalWrite(S2_FEHER, LOW);
}


// FEHÉR: piros HIGH, fehér LOW, sárga INPUT
void feherOn() {
  pinMode(S1_SARGA, INPUT);
  pinMode(S1_PIROS, OUTPUT); digitalWrite(S1_PIROS, HIGH);
  pinMode(S1_FEHER, OUTPUT); digitalWrite(S1_FEHER, LOW);

  pinMode(S2_SARGA, INPUT);
  pinMode(S2_PIROS, OUTPUT); digitalWrite(S2_PIROS, HIGH);
  pinMode(S2_FEHER, OUTPUT); digitalWrite(S2_FEHER, LOW);
}


// JOBB PIROS: sárga HIGH, piros LOW
void jobbPirosOn() {
  pinMode(S1_FEHER, INPUT);
  pinMode(S1_SARGA, OUTPUT); digitalWrite(S1_SARGA, HIGH);
  pinMode(S1_PIROS, OUTPUT); digitalWrite(S1_PIROS, LOW);

  pinMode(S2_FEHER, INPUT);
  pinMode(S2_SARGA, OUTPUT); digitalWrite(S2_SARGA, HIGH);
  pinMode(S2_PIROS, OUTPUT); digitalWrite(S2_PIROS, LOW);
}


// BAL PIROS: sárga LOW, piros HIGH
void balPirosOn() {
  pinMode(S1_FEHER, INPUT);
  pinMode(S1_SARGA, OUTPUT); digitalWrite(S1_SARGA, LOW);
  pinMode(S1_PIROS, OUTPUT); digitalWrite(S1_PIROS, HIGH);

  pinMode(S2_FEHER, INPUT);
  pinMode(S2_SARGA, OUTPUT); digitalWrite(S2_SARGA, LOW);
  pinMode(S2_PIROS, OUTPUT); digitalWrite(S2_PIROS, HIGH);
}


// ======================================================================
//  VILLOGÁS – SZABAD
// ======================================================================
void feherVillog() {
  if (millis() - lastToggle > 750) {
    lastToggle = millis();
    feherState = !feherState;
    if (feherState) feherOn();
    else allOff();
  }
}


// ======================================================================
//  VILLOGÁS – TILOS
// ======================================================================
void pirosValtakozik() {
  if (millis() - lastToggle > 750) {
    lastToggle = millis();
    pirosState = !pirosState;
    if (pirosState) jobbPirosOn();
    else balPirosOn();
  }
}
