#include <Arduino.h>


static uint8_t out[] = { 3, 5, 6, 9 };

static uint8_t inp[] = { 2, 4 };


// https://m1cr0lab-esp32.github.io/remote-control-with-websocket/led-setup/
// https://forum.arduino.cc/t/port-register-manipulation/424880/3


struct button {
  uint8_t PIN;
  int debouns;
  void update() {
    digitalRead(this->PIN);
  };
};


struct Led {
  uint8_t PIN;
  bool on = false;
  Led(uint8_t PIN): PIN(PIN) {};
  void update() {
    digitalWrite(this->PIN, this->on ? HIGH : LOW);
  };
};


Led l1(3);

Led leds[] = {3, 5, 6, 9};

// button b1 = {2, 100};







//aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa



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

  // DDRD = B11111111;
  // return;

  for (auto pin : out)
    pinMode(pin, OUTPUT);

  for (auto pin : inp)
    pinMode(pin, INPUT_PULLUP);
}


// int buttonDelay() {
//   static int bd = 10;

//   if (!digitalRead(inp[0])) {
//     bd += 1;
//   } else if (!digitalRead(inp[1])) {
//     bd -= 1;
//   }

//   if (bd < 1) bd = 1;
//   if (bd > 100) bd = 100;


//   return bd;
// }


void wave() {
  for (auto pin : out) {
    digitalWrite(pin, HIGH);
    delay(100);
  }
  for (auto pin : out) {
    digitalWrite(pin, LOW);
    delay(100);
  }
}



// void setLed(uint8_t pin, bool dim = true) {
//   for (int i = 0; dim ? (i < 256) : (i >= 0) ; i += (dim ? 1 : -1)) {
//     analogWrite(pin, i);
//     delay(5);
//   }
// }


void toBinary(int num) {
  for (auto pin : out) {
    digitalWrite(pin, num % 2 ? HIGH : LOW);
    num >>= 1;
  }
}

int i = 0;

bool isInc = false;

void loop() {

  // PORTD = B11110000; // digital 4~7 HIGH, digital 3~0 LOW
  // delay(1000);
  // PORTD = B00001111; // digital 4~7 LOW, digital 3~0 HIGH
  // delay(1000);

  for(auto l : leds) {
    delay(200);
    l.on ^= true;
    l.update();
    delay(200);
    l.on ^= true;
    l.update();
  }


  // leds[0].on ^= true;
  // leds[0].update();

  return;

  toBinary(i);

  isInc = !digitalRead(inp[0]);


  if (isInc) {
    i += 1;

    delay(100);

    // isInc = true;

    // if (digitalRead(inp[0]))
    //   i -= 1;
  }

  if (!digitalRead(inp[1])) {
    i = 0;
  }


  // delay(10);

  i %= 1 << 4;


  // return;

  // for (auto pin : out) {
  //   for (int i = 0; i < 256; i++) {
  //     analogWrite(pin, i);
  //     int bv = buttonDelay();

  //     if (bv)
  //       delay(bv);
  //   }
  //   delay(10);
  // }
  // for (auto pin : out) {
  //   for (int i = 0; i < 256; i++) {
  //     analogWrite(pin, 255 - i);
  //     int bv = buttonDelay();

  //     if (bv)
  //       delay(bv);
  //   }
  //   delay(10);
  // }
}

$abcdeabcde151015202530fghijfghij
uno:A5.2
uno:A4.2
uno:AREF
uno:GND.1
uno:13
uno:12
uno:11
uno:10
uno:9
uno:8
uno:7
uno:6
uno:5
uno:4
uno:3
uno:2
uno:1
uno:0
uno:IOREF
uno:RESET
uno:3.3V
uno:5V
uno:GND.2
uno:GND.3
uno:VIN
uno:A0
uno:A1
uno:A2
uno:A3
uno:A4
uno:A5
btn1:1.l
btn1:2.l
btn1:1.r
btn1:2.r
btn2:1.l
btn2:2.l
btn2:1.r
btn2:2.r
led8:A
led8:C
led9:A
led9:C
led10:A
led10:C
led11:A
led11:C
r8:1
r8:2
r9:1
r9:2
r10:1
r10:2
r11:1
r11:2