Sequential tail lights controlled with IR remote

take a look at this


const byte pinsLed [] = { 10, 11, 12, 13 };

enum { Off = HIGH, On = LOW };

enum { None, Flash, Left, Right };
int mode = None;

unsigned idx;

// -----------------------------------------------------------------------------
void
ledsOnOff (
    byte  state)
{
    for (unsigned n=0; n < sizeof(pinsLed); n++)
        digitalWrite (pinsLed [n], state);
}

// -------------------------------------
void
ledsFlash (void)
{
    for (unsigned n=0; n < sizeof(pinsLed); n++)
        digitalWrite (pinsLed [n], ! digitalRead (pinsLed [n]));
}

// -------------------------------------
void
ledsSeq (
    int  dir )
{
    if (Left == dir) {
        for (unsigned n = 0; n < sizeof(pinsLed); n++)  {
            if (n <= idx)
                digitalWrite (pinsLed [n], On);
            else
                digitalWrite (pinsLed [n], Off);
        }

        if (sizeof(pinsLed) <= ++idx)
            idx = 0;
    }

    else if (Right == dir) {
        for (unsigned n = 0; n < sizeof(pinsLed); n++)  {
            if (n >= idx)
                digitalWrite (pinsLed [n], On);
            else
                digitalWrite (pinsLed [n], Off);
        }

        if (0 == idx--)
            idx = sizeof(pinsLed)-1;
    }

    Serial.print   (sizeof(pinsLed));
    Serial.print   ("  ");
    Serial.println (idx);
}

// -----------------------------------------------------------------------------
void
loop (void)
{
    if (Serial.available ())  {
        char c = Serial.read ();
        switch (c)  {
        case '0':
            ledsOnOff (Off);
            mode = None;
            break;

        case '1':
            ledsOnOff (On);
            mode = None;
            break;

        case 'f':
            mode = Flash;
            break;

        case 'l':
            mode = Left;
            break;

        case 'r':
            mode = Right;
            break;
        }
    }

    static unsigned long msecLst;
           unsigned long msec = millis ();

#define Period   250
    if ( (msec - msecLst) > Period)  {
        msecLst = msec;

        switch (mode)  {
        case Right:
        case Left:
            ledsSeq (mode);
            break;

        case Flash:
            ledsFlash ();
            break;
        }
    }
}

// -----------------------------------------------------------------------------
void
setup (void)
{
    Serial.begin (9600);

    for (unsigned n=0; n < sizeof(pinsLed); n++)  {
        digitalWrite (pinsLed [n], Off);
        pinMode      (pinsLed [n], OUTPUT);
    }
}