#include <SPI.h>
#include <SD.h>
#include <pcmConfig.h>
#include <pcmRF.h>
#include <TMRpcm.h>

//#define SD_ChipSelectPin 53  //example uses hardware SS pin 53 on Mega2560
#define SD_ChipSelectPin 10  //using digital pin 4 on arduino nano 328, can use other pins

#define resolution 8
#define mains 50 // 60: north america, japan; 50: most other places
#define refresh 2 * 1000000 / mains

long t2,t3,t4,t7,t8;
long zero2=0;
long zero3=0;
long zero4=0;
long zero7=0;
long zero8=0;
long touch2=0;
long touch3=0;
long touch4=0;
long touch7=0;
long touch8=0;
int first=0;
int btn=0;

int analogPin=A7;
int pitanie=0;//0 - сеть / 1 - батарея

TMRpcm tmrpcm;   // create an object for use in this sketch
void setup(){
  pinMode(6, INPUT);
//  digitalWrite(6, HIGH);
  tmrpcm.speakerPin = 9; //5,6,11 or 46 on Mega, 9 on Uno, Nano, etc
  Serial.begin(9600);
  if (!SD.begin(SD_ChipSelectPin)) {  // see if the card is present and can be initialized:
    Serial.println("SD fail");  
    return;   // don't do anything more if not
  }
  Serial.println("SD is enabled");
  tmrpcm.volume(15);
  //tmrpcm.play("1.wav"); //the sound file "music" will play each time the arduino powers up, or is reset
  //digitalWrite(6, LOW);
}
void loop(){  
//  if(Serial.available()){    
//  }
  //digitalWrite(6, HIGH);
  if(!tmrpcm.isPlaying()) {
   pinMode(6, INPUT);
   digitalWrite(tmrpcm.speakerPin, LOW);
   //digitalWrite(6, HIGH);
   
   t2=timeD(2,  B00000100);
   Serial.print(" t2=");
   Serial.print(t2, DEC);
   t3=timeD(3,  B00001000);
   Serial.print(" t3=");
   Serial.print(t3, DEC);
   t4=timeD(4,  B00010000);
   Serial.print(" t4=");
   Serial.print(t4, DEC);

   t7=timeD(7,  B10000000);
   Serial.print(" t7=");
   Serial.print(t7, DEC);
   t8=time(8,  B00000001);
   Serial.print(" t8=");
   Serial.print(t8, DEC);
   
   int vcc=analogRead(analogPin);
   Serial.print(" vcc=");
   Serial.println(vcc, DEC);
   
   if(pitanie==0){//потеря питания
     if(vcc==0){
       btn=110;
       pitanie=1;
       tmrpcm.play("vcc0.wav");
     }
   }else if(pitanie==1){
     if(vcc>100){
       pitanie=0;
       btn=111;//восстановление питания
       tmrpcm.play("vcc1.wav");
     }
   }
   
   if(first<30){
     if(zero2 < t2){zero2 = t2;}
     if(zero3 < t3){zero3 = t3;}
     if(zero4 < t4){zero4 = t4;}
     if(zero7 < t7){zero7 = t7;}
     if(zero8 < t8){zero8 = t8;}
     first++;
   }else if(first==30){
     touch2=zero2;
     touch3=zero3;
     touch4=zero4;
     touch7=zero7;
     touch8=zero8;
     btn = 100;
   }else if(first>30 && first<60){
     touch2=(touch2+t2)/2;
   }else if(first==60){
     btn=102;
   }else if(first>60 && first<90){
     touch3=(touch3+t3)/2;
   }else if(first==90){
     btn=103;
   }else if(first>90 && first<120){
     touch4=(touch4+t4)/2;
   }else if(first==120){
     btn=104;
   }else if(first>120 && first<150){
     touch7=(touch7+t7)/2;
   }else if(first==150){
     btn=107;
   }else if(first>150 && first<180){
     touch8=(touch8+t8)/2;
   }else if(first==180){
     btn=108;
   }else{
     if(t2*2 > zero2+touch2){btn=1;}
     if(t3*2 > zero3+touch3){btn=2;}
     if(t4*2 > zero4+touch4){btn=3;}
     if(t7*2 > zero7+touch7){btn=4;}
     if(t8*2 > zero8+touch8){btn=5;}
   }
   

   
   if(btn == 1){ //send the letter p over the serial monitor to start playback
      tmrpcm.play("1.wav");
   }else if(btn == 2){
      tmrpcm.play("2.wav");
   }else if(btn == 3){
      tmrpcm.play("3.wav");
   }else if(btn == 4){
      tmrpcm.play("4.wav");
   }else if(btn == 5){
       //digitalWrite(6, LOW);
       pinMode(6, OUTPUT);
       digitalWrite(6, LOW);
      tmrpcm.play("5.wav");
   }else if(btn==100){
      tmrpcm.play("touch2.wav");//прикоснитесь к панели один рукой и удерживайте до звукового сигнала 
   }else if(btn==102){
      tmrpcm.play("touch3.wav");//пииип! отпустите панель один, прикоснитесь к панели два и удерживайте до звукового сигнала
   }else if(btn==103){
      tmrpcm.play("touch4.wav");//пииип! отпустите панель два, прикоснитесь к панели три и удерживайте до звукового сигнала
   }else if(btn==104){
      tmrpcm.play("touch7.wav");//пииип! отпустите панель три, прикоснитесь к панели четыре и удерживайте до звукового сигнала
   }else if(btn==107){
      tmrpcm.play("touch8.wav");//пииип! отпустите панель четыре, прикоснитесь к панели пять и удерживайте до звукового сигнала
   }else if(btn==108){
      tmrpcm.play("begin.wav");//пииип! отпустите панель пять. калибровка окончена.
   }
   btn = 0;
   first++;
 }
}

long timeD(int pin, byte mask) {
  unsigned long count = 0, total = 0;
  while(checkTimer() < refresh) {
    // pinMode is about 6 times slower than assigning
    // DDRB directly, but that pause is important
    pinMode(pin, OUTPUT);
    PORTD = 0;
    pinMode(pin, INPUT);
    while((PIND & mask) == 0)
      count++;
    total++;
  }
  startTimer();
  return (count << resolution) / total;
}


long time(int pin, byte mask) {
  unsigned long count = 0, total = 0;
  while(checkTimer() < refresh) {
    // pinMode is about 6 times slower than assigning
    // DDRB directly, but that pause is important
    pinMode(pin, OUTPUT);
    PORTB = 0;
    pinMode(pin, INPUT);
    while((PINB & mask) == 0)
      count++;
    total++;
  }
  startTimer();
  return (count << resolution) / total;
}

extern volatile unsigned long timer0_overflow_count;

void startTimer() {
  timer0_overflow_count = 0;
  TCNT0 = 0;
}

unsigned long checkTimer() {
  return ((timer0_overflow_count << 8) + TCNT0) << 2;
}
