// 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();

  // set up pins 2 to 11 as outputs
//  for (int i = 2; i <= 11; i++) {
//    pinMode(i, OUTPUT);
//  }
}

void loopX() {
  drfPhaseLoop();
}

void drfPhaseLoop(void) {
  const byte pins[] = {11,10,9,8,7,6,5,4,3,2};
  const byte numPins = sizeof(pins) / sizeof(pins[0]);
  const byte onWidth = 5;
  for (int phase = 0; phase < numPins + onWidth; ++phase) {
    int offPhase = phase - onWidth;
    if (phase < numPins) {
      Serial.print(char('A'+phase));
      digitalWrite(pins[phase], HIGH);
    }
    if (offPhase >= 0 && offPhase < numPins) {
      Serial.print(char('a'+offPhase));
      digitalWrite(pins[offPhase], LOW);
    }
    delay(300);
  }
}

# define t   200
# define t1  500
# define t2  2000

int mask;

void loop() {
  fileInLeft();
  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 fileInLeft() {
  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(177);
    }

    delay(777);
  }
}

/******** EFFECT 1 ********
void effect_1_fill_in_out() {

  for(int pinX = 2; pinX <= 11; pinX++) {
    for(int pin = 11; pin > pinX; pin--) {
      digitalWrite(pin, HIGH);
      delay(t);
      digitalWrite(pin, LOW);
    }
    digitalWrite(pinX, HIGH);
  }
  delay(t2);

  // ************ BUILT OUT ************

  for(int pinX = 2; pinX <= 11; pinX++) {
    digitalWrite(pinX, LOW);
    for(int pin = pinX; pin >= 2; pin--) {
      digitalWrite(pin, HIGH);
      delay(t);
      digitalWrite(pin, LOW);
    }
  }
  delay(t2);
}
*/