// No servo one press to end?
// https://forum.arduino.cc/t/learning-about-fsm-what-are-the-states-here/905546/30

const byte trigPin   = 6; // Low input from button to D6
const byte yellowLEDPin = A0; // LED flashes at intervals for KA photo
const byte redLEDPin    = A1; // Lit while video recording

enum { Off = LOW, On = HIGH };    // easier than rewiriing the LEDs

const int WaitBeforeRelease = 200;
const int WaitAfterRelease  = 200;

byte trigPinState;
int  trigCounter = 0;

# define VideoTime   3500;
// unused # define Snapshotime 5000;

unsigned long interval = 5000;

enum { ST_SNAPSHOT, ST_VIDEO };

// -----------------------------------------------------------------------------
void
singleCUBEServoPress (
    int cnt )
{
    while (cnt--)  {
        digitalWrite (yellowLEDPin, On);
        delay (WaitBeforeRelease);

        digitalWrite (yellowLEDPin, Off);
        delay (WaitAfterRelease);
    }
}

// -----------------------------------------------------------------------------
void
snapshot (void)
{
    singleCUBEServoPress (1);
}

// -----------------------------------------------------------------------------
void
videoStart (void)
{
    singleCUBEServoPress (2);

    trigCounter++;

    Serial.print ("Started video ");
    Serial.print ("trigCounter = ");
    Serial.println (trigCounter);
    digitalWrite (redLEDPin, On);


//   digitalWrite (redLEDPin, Off); // Stays low until next video record
}

// -----------------------------------------------------------------------------
void
videoEnd (void)
{
    singleCUBEServoPress (1);
    Serial.println (" End video ");
    digitalWrite (redLEDPin, Off);
}

// -----------------------------------------------------------------------------
void loop ()
{
    static unsigned long msecExpire = interval;
    static int state = ST_SNAPSHOT;

    unsigned long msec = millis ();

    if (msec > msecExpire)  {
        switch (state)  {
        case ST_VIDEO:
            videoEnd ();
            state      = ST_SNAPSHOT;
            msecExpire = msec + interval;
            break;

        case ST_SNAPSHOT:
        default:
            snapshot ();
            msecExpire = msec + interval;
            break;
        }
    }

    byte trig= digitalRead (trigPin);
    if (trigPinState != trig) {
        trigPinState = trig;

        delay(50);            // poor man's debounce

        if (trig == LOW) {
          if (state != ST_VIDEO) {
            msecExpire = msec + VideoTime;
            state = ST_VIDEO;

            videoStart ();
          } else {
            Serial.println("new motion - extend video period");
            msecExpire = msec + VideoTime;    // extend video duration
          }
        }
    }
}

// -----------------------------------------------------------------------------
void setup ()
{
    Serial.begin (115200);    // it's 2021

    Serial.println("hello trigger video");

    pinMode (trigPin,   INPUT_PULLUP);
    trigPinState = digitalRead (trigPin);

    pinMode (redLEDPin,    OUTPUT);
    pinMode (yellowLEDPin, OUTPUT);
    digitalWrite (redLEDPin,    Off);
    digitalWrite (yellowLEDPin, Off);
}