// https://wokwi.com/projects/391185057960646657

# define NLEDS 9

# include <Adafruit_NeoPixel.h>

# define PIN 7
# define SIZE NLEDS

Adafruit_NeoPixel strip = Adafruit_NeoPixel(SIZE, PIN, NEO_GRB + NEO_KHZ800);

void myDelay(unsigned long x)
{
//  Serial.print("                  delay "); Serial.println(x);
  if (digitalRead(8) == LOW) x <<= 2;
  if (digitalRead(9) == LOW) x >>= 2;
  delay(x);
}

# define delay myDelay


void myDigitalWrite(int theLED, int theValue)
{

  unsigned long was = strip.getPixelColor(theLED - 2);

  strip.setPixelColor(theLED - 2, theValue ? 0xff0000 : 0x202020);
  strip.show();

  if (was == strip.getPixelColor(theLED - 2)) Serial.println("                         work to do");

  Serial.print(theLED);
  Serial.print(" + ");

  bool any = false;
  for (int ii = 0; ii < 9; ii++)
    any |= strip.getPixelColor(ii) == 0xff0000;

//  if (any) {
  {
    for (int ii = 0; ii < 9; ii++)
      Serial.print(strip.getPixelColor(ii) == 0xff0000 ? "X" : ".");
  
    Serial.println("");
  }
}

# define digitalWrite myDigitalWrite

# define t0  300
# define t1  600
# define t2  2000

# define SLOW 8
# define FAST 9

void setup() {
  Serial.begin(115200);
  Serial.println("for loop version N\n");
  strip.begin();

  pinMode(SLOW, INPUT_PULLUP);
  pinMode(FAST, INPUT_PULLUP);
}

void loop() {
  fileOnLeft();
  fileOffRight();
}

byte pins[9] = {2, 3, 4, 5, 6, 7, 8, 9, 10};

// turn on from the left starting from all off
void fileOnLeft()
{
  for (int ix = 0; ix < SIZE; ix++) {
    byte K = SIZE - 1;

    for (int iy = 0; iy < SIZE - ix; iy++) {
      digitalWrite(pins[K - iy], HIGH);
      delay(t0);
      digitalWrite(pins[K - iy], LOW);
    }

    digitalWrite(pins[ix], HIGH);
    delay(t1);
  }
  delay(t2);
}

// turn off from the right starting from all on
void fileOffRight()
{
  for (int ix = 0; ix < SIZE; ix++) {
    byte K = ix - 1;

    digitalWrite(pins[ix], LOW);

    for (int iy = 0; iy < ix; iy++) {
      digitalWrite(pins[K - iy], HIGH);
      delay(t0);
      digitalWrite(pins[K - iy], LOW);
    }

    delay(t1);
  }
  delay(t2);
}


void writeIt(int x) {
  int mask = 1;

  strip.clear();
  for (int ii = 0; ii < SIZE; ii++, mask <<= 1)
    strip.setPixelColor(ii, x & mask ? 0xff0000 : 0x004040);
  
  strip.show();
}