/* 

This code was lifted and modified from Lady Ada's Halloween Pumpkin project:
http://www.ladyada.net/make/pumpkin/pumpkin.html

*/



#include <ArduinoPins.h>
#include <FatReader.h>
#include <FatStructs.h>
#include <mcpDac.h>
#include <SdInfo.h>
#include <SdReader.h>
#include <WaveHC.h>
#include <Wavemainpage.h>
#include <WavePinDefs.h>
#include <WaveUtil.h>


SdReader card;
FatVolume vol;
FatReader root;
FatReader f;
WaveHC wave;      // only one!



#define playcomplete(x) ROM_playcomplete(PSTR(x))         // save RAM by using program memory strings
#define aref_voltage 3.3         // we tie 3.3V to ARef and measure it with a multimeter!

#define eyes 9
#define white 6
#define OddRunes 7
#define EvenRunes 8
#define Button1 4
#define Button2 5
#define Xaxis 0
#define Yaxis 1
#define Zaxis 2

long time;
long previoustime;
int prevstate = 0;

void setup() {
  analogReference(EXTERNAL);
  Serial.begin(9600);           // set up Serial library at 9600 bps
  Serial.println("Wave test!");

  pinMode(2, OUTPUT); 
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(eyes, OUTPUT);
  pinMode(white, OUTPUT);
  pinMode(OddRunes, OUTPUT);
  pinMode(EvenRunes, OUTPUT);
  
  digitalWrite(eyes, HIGH);

  
  randomSeed(analogRead(0));
  
  time = millis();
  previoustime = time;


  if (!card.init()) {
    putstring_nl("Card init. failed!"); return;
  }
  if (!vol.init(card)) {
    putstring_nl("No partition!"); return;
  }
  if (!root.openRoot(vol)) {
    putstring_nl("Couldn't open dir"); return;
  }

  putstring_nl("Files found:");
  ls();
}

void ls() {
  dir_t d;
  root.rewind();
  while (root.readDir(d) > 0) {
    printName(d);
    Serial.println();
  }
}

void printName(dir_t &dir)
{
  for (uint8_t i = 0; i < 11; i++) {
    if (dir.name[i] == ' ')continue;
    if (i == 8) Serial.print('.');
    Serial.print(dir.name[i]);
  }
  if (DIR_IS_SUBDIR(dir)) Serial.print('/');
}




// uint8_t pumpkinstate = 0;

void loop() { 
  
   int tiltsensor[3], i;
   time = millis();
   
   for (int z=0; z<3; z++) {
     tiltsensor[z] = 0;
   }
   for (i=0; i<8; i++) {
     for (int z=0; z<3; z++) {
       tiltsensor[z] += analogRead(z);
     }
     
     delay(5);
   }
   
   for (int z=0; z<3; z++) {
     tiltsensor[z] /= 8;
   }

   putstring("Sensor = "); Serial.print(tiltsensor[0]); Serial.print("    "); Serial.print(tiltsensor[1]); Serial.print("     "); Serial.println(tiltsensor[2]);
   
   if ((analogRead(Button1)) >500) {
     
     if(time - previoustime > 1000) {
     flashrunes();
     previoustime = time;
     }
   
   if (tiltsensor[Xaxis] <= 450) {
     playcomplete("left.WAV"); 
   } 
   if (tiltsensor[Xaxis] >= 630) {
     playcomplete("right.WAV");
   }
   if (tiltsensor[Yaxis] <= 450) {
     playcomplete("backward.WAV");
   }
   if (tiltsensor[Yaxis] >= 630) {
     playcomplete("forward.WAV");
   }
   if (tiltsensor[Zaxis] <= 550) {
     playcomplete("stamp.WAV");
   }
   }
   else {
     digitalWrite(OddRunes, LOW);
     digitalWrite(EvenRunes, LOW);
   }
   
 
     //  one out of 300 times play one of the dragon sounds (once every few minutes)
     i = random(300);
     //Serial.println(i);
     if (i == 0) {
       i = random(4);
       if (i == 0) {
           playcomplete("roar1.WAV");
       } else if (i == 1) {
           playcomplete("roar2.WAV");
       } else if (i == 2) {
           playcomplete("roar3.WAV");
       } else {
           playcomplete("roar4.WAV");   
       }
     }

}



void ROM_playcomplete(const char *romname) {
  char name[13], i;
  uint8_t volume;
  int v2;
  
  for (i=0; i<13; i++) {
    name[i] = pgm_read_byte(&romname[i]);
  }
  name[12] = 0;
  Serial.println(name);
  playfile(name);
  while (wave.isplaying) {
   volume = 0;
   for (i=0; i<8; i++) {
     v2 = analogRead(3) - 512;
     if (v2 < 0) 
        v2 *= -1;
     if (v2 > volume)
       volume = v2;
     delay(5);
   }
   if (volume > 200) {
     digitalWrite(white, HIGH);
   } else {
     digitalWrite(white, LOW);
   }
   if (volume > 175) {
     digitalWrite(OddRunes, HIGH);
   } else {
     digitalWrite(OddRunes, LOW);
   } 
   if (volume > 150) {
     digitalWrite(EvenRunes, HIGH);
   } else {
     digitalWrite(EvenRunes, LOW);
   } 
   //putstring("vol = "); Serial.println(volume, DEC);
  }
  
  digitalWrite(white, LOW);
  digitalWrite(OddRunes, LOW);
  digitalWrite(EvenRunes, LOW);

}

void playfile(char *name) {
  if (wave.isplaying) {// already playing something, so stop it!
    wave.stop(); // stop it
  }
  if (!f.open(root, name)) {
    putstring("Couldn't open file "); Serial.print(name); return;
  }
  if (!wave.create(f)) {
    putstring_nl("Not a valid WAV"); return;
  }
  // ok time to play!
  wave.play();
}

void flashrunes() {
  
  if (prevstate > 0) {
    digitalWrite(OddRunes, HIGH);
    digitalWrite(EvenRunes, LOW);
    prevstate = 0;
  }
  
  else {
    digitalWrite(OddRunes, LOW);
    digitalWrite(EvenRunes, HIGH);
    prevstate = 1;
  }
}
  
  
