/*
===================
Markus Opitz 2026
instructables.com  
=================== 

ESP-NOW Receiver
*/


#include <WiFi.h>
#include <esp_now.h>

// Data structure (MUST be identical!)
typedef struct {
  uint16_t servo;
  bool left;
  bool right;
  bool button;
} ControlData;

ControlData data;

#include <ESP32Servo.h>
Servo R1;
const int servoPinR1 = D2;
int currentAngle = 90;
const int LEDpin = D7;
bool lastButtonState = false;


void onReceive(const esp_now_recv_info *info,
               const uint8_t *incomingData,
               int len) {

  ControlData data;
  memcpy(&data, incomingData, sizeof(data));

  R1.write(data.servo);
  Serial.println(data.servo);

  if (data.left)   {Serial.print("LEFT "); }
  if (data.right)  {Serial.print("RIGHT "); }
  if (data.button && !lastButtonState) {
      Serial.println("button");
      digitalWrite(LEDpin, HIGH);
  }
  if (!data.button && lastButtonState) {
       digitalWrite(LEDpin, LOW);
  }


  
  lastButtonState = data.button;
  Serial.println();

}

void setup() {
  Serial.begin(115200);

  WiFi.mode(WIFI_STA);

  if (esp_now_init() != ESP_OK) {
    Serial.println("ESP-NOW init failed");
    return;
  }

  esp_now_register_recv_cb(onReceive);

  Serial.println("receiver ready");

  // ESP32-C6 PWM Setup
  R1.setPeriodHertz(50);          // 50 Hz for Servos
  R1.attach(servoPinR1, 500, 2400);
  R1.write(90); delay(10);
  Serial.println("servo ready");

  pinMode(LEDpin, OUTPUT);
  digitalWrite(LEDpin, LOW);
}

void loop() {
  // all happens in callback
}