class LEDTimer {
  public:
    int numberpin;
    int timeout;
    bool ison = false;
    unsigned long previous;
    LEDTimer (int pin, int to){numberpin = pin;timeout=to;}
    void turnOn(){if(!ison){previous = millis();ison=true;digitalWrite(numberpin, HIGH);};}
    void listen()
    {
      if (ison){if((millis() - previous) > timeout){ison = false;digitalWrite(numberpin, LOW);};}
    }
};


class Button7600 {
  public:
    int numberpin;
    bool ispressed = false;
    Button7600 (int pin){numberpin = pin;}
    virtual void onPressDown(){}
    virtual void onPressUp(){}
    void listen()
    {
      int buttonState = digitalRead(numberpin);
      if (buttonState == 0){if (!ispressed){onPressDown();ispressed=true;}}
      else{if (ispressed){onPressUp();ispressed=false;}}
    }
  uint8_t sendATcommand(const char* ATcommand, const char* expected_answer, unsigned int timeout) {
    uint8_t x=0,  answer=0;
    char response[100];
    unsigned long previous;
    memset(response, '\0', 100);    // Initialize the string
    delay(100);
    while( Serial1.available() > 0) Serial1.read();    // Clean the input buffer
    Serial1.println(ATcommand);    // Send the AT command 
    x = 0;
    previous = millis();
    do{
      if(Serial1.available() != 0){    
        response[x] = Serial1.read();      
        x++;
        if (strstr(response, expected_answer) != NULL)    
        {
          answer = 1;
        }
      }
    }while((answer == 0) && ((millis() - previous) < timeout));
    return answer;
  }
};