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

# include <Adafruit_NeoPixel.h>

# define PIN 7
# define SIZE 9

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


void myDelay(unsigned long x)
{
//  Serial.print("                  delay "); Serial.println(x);
  delay(x);
}

# define delay myDelay

# define digitalWrite myDigitalWrite

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

  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 t   20
# define t1  50
# define t2  100

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

# define t0  100
# define t1  500
# define t2  2000

int mask;

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

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

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

// fill from the left onto blank row
void fileOnLeft()
{
  int mask = 0;
  int display = 0;

  mask = 0;
  for (int ix = 0; ix < SIZE; ix++) {
    mask = 1;
    for (int ii = 0; ii < ix; ii++, mask <<= 1)
      display |= mask;

    mask = (1 << SIZE);
    for (int ii = 0; ii < SIZE - ix; ii++) {
      display &= ~mask;
      mask >>= 1;
      display |= mask;
      writeIt(display);
      delay(t0);
    }
    delay(t1);
  }
  delay(t2);
}