/*
 * Projekt sekretnego pudełka przygotowany do Arduino 1.0 z układem Attiny85
 * Licencja GPL
 Wykrywa sekwencję pukania i jeżeli jest poprawna, uruchamia silnik otwierający pudełko
 
 Steve Hoefer http://grathio.com
 Wersja 0.1.10.20.10
 Licencja Creative Commons Attribution-Noncommercial-Share Alike 3.0
 http://creativecommons.org/licenses/by-nc-sa/3.0/us/
 (W skrócie: Możesz robić z kodem, co chcesz, ale umieść w nim cztery powyższe wiersze i nie sprzedawaj go w żadnej postaci bez porozumienia ze mną.)
* Przekonwertowana na obiekt przez Rick Anderson http://github.com/ricklon/attinysecretknock
 */

#ifndef SecretKnock_h
#define SecretKnock_h

#if defined(ARDUINO) && ARDUINO  >= 100
#include "Arduino.h"
#include "pins_arduino.h"
#else
#include "WProgram.h"
#include "pins_arduino.h"
#endif

#define MAX_KNOCKS 20


class SecretKnock 
{

private:
public:

  // Stałe do tuningu. Mogą to być zmienne i skojarzone z potencjometrem do regulacji, itp.
   int threshold;         // Minimalny poziom sygnału z czujnika piezoelektrycznego oznaczający pukanie
   int rejectValue;       // Jeżeli wystukany szyfr różni się od wzorca o tyle procent, nie otwieramy pudełka.
   int averageRejectValue;// Jeżeli średni czas pukania różni się o tyle procent, nie otwieramy pudełka.
   int knockFadeTime;     // Czas w milisekundach na zaniknięcie puknięcia przed nasłuchiwaniem następnego (timer wytłumienia)
   int lockTurnTime;      // Czas w milisekundach na uruchomienie silnika i wykonanie połowy obrotu
   int lockMotor;         
   int knockComplete;      // Maksymalny czas oczekiwania, po którym uznajemy, że pukanie się zakończyło


  // Zmienne
  int * knockReadings;       // Podczas pukania ta tabela jest wypełniana przerwami pomiędzy puknięciami.
  int knockSensorValue;      // Ostatni odczyt z czujnika pukania.
  int programButtonPressed;  // Ustaw flagę, aby zapamiętać ustawienie przycisku na końcu cyklu


  int secretCode[MAX_KNOCKS];

  // Definicje pinów
   int programSwitch;       // Jeżeli stan jest wysoki, programujemy nowy kod
  //const int servoPin = 1;  // Pin 4 to PWM
   int knockSensor;         // Czujnik piezoelektryczny dołączony do pinu ADC1.
   int redLED;              // Dioda LED oznaczająca status
   int greenLED;            // Dioda LED oznaczająca status
  //const int speakerPin = 2;


  SecretKnock(void);

  void begin(int * initKnocks);

  void checkKnock();

  void listenToSecretKnock();

  void triggerDoorUnlock();

  boolean validateKnock();

  void openDoor();

  void blinkSuccess();

  void playSuccess();

};
#endif

