void setup()
{
  Serial.begin( 115200 );
  Serial.println( "LED Thing is ready" );
  pinMode( LED_BUILTIN, OUTPUT );
  digitalWrite( LED_BUILTIN, LOW );
}

void loop()
{
  static uint8_t repeats = 0;
  static uint32_t timeOn = 0;
  static uint32_t timeOff = 0;

  static uint32_t start = 0;
  static uint32_t timer = 0;
  static bool run = false;
  static bool abort = false;
  static bool ledState = false;

  if ( Serial.available() )
  {
    String data = Serial.readString();

    switch ( data.charAt(0) )
    {
      case 'A' :
      {
        repeats = data.substring(1, 3).toInt();
        timeOn = data.substring(3, 4).toInt() * 1000UL;
        timeOff = data.substring(4, 5).toInt() * 1000UL;

        run = true;
        abort = false;
        start = 0;
        timer = 0;
        ledState = false;

        Serial.print( "Program started : " );
        Serial.print( "repeats = ");
        Serial.print( repeats );
        Serial.print( ", timeOn = ");
        Serial.print( timeOn );
        Serial.print( ", timeOff = ");
        Serial.println( timeOff );
        break;
      }

      case 's' :
      {
        if ( run == true )
        {
          abort = true;
          Serial.println( "Aborting..." );
        }
        else
        {
          Serial.println( "Program not running" );
        }
        break;
      }

      default :
      {
        Serial.println( "Unknown command" );
        break;
      }
    }
  }

  if ( run == true && millis() - start >= timer )
  {
    start = millis();
    ledState = !ledState;
    timer = ledState ? timeOn : timeOff;
    digitalWrite( LED_BUILTIN, ledState ? HIGH : LOW );
    
    if ( ledState == false && ( --repeats == 0 || abort == true ) )
    {
      run = false;
      Serial.println( "Program finished" );
    }
  }
}