/*
  Copyright (c) 2012 Arduino LLC. All right reserved.

  This library is free software; you can redistribute it and/or
  modify it under the terms of the GNU Lesser General Public
  License as published by the Free Software Foundation; either
  version 2.1 of the License, or (at your option) any later version.

  This library is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  Lesser General Public License for more details.

  You should have received a copy of the GNU Lesser General Public
  License along with this library; if not, write to the Free Software
  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/

#include "ArduinoRobot.h"
#include "SquawkSD.h"
#include "Fat16.h"



SQUAWK_CONSTRUCT_ISR(SQUAWK_PWM_PIN5);


void RobotControl::beginSpeaker(uint16_t frequency){
  SquawkSynth::begin(frequency);
  SquawkSynth::play();
  osc[2].vol = 0x7F;
}

void RobotControl::playNote(byte period, word length, char modifier) {
  // Modifier . makes note length 2/3
  if(modifier == '.') length = (length * 2) / 3;
  // Set up the play frequency, 352800 is [sample_rate]=44100 * [tuning]=8.0
  osc[2].freq = 352800 / period;
  // Delay, silence, delay
  delay(length);
  osc[2].freq = 0;
  delay(length);
}

void RobotControl::playMelody(char* script){
  // Find length of play string
  word length = strlen(script);
  // Set the default note time
  word time = 500;
  // Loop through each character in the play string
  for(int n = 0; n < length; n++) {
    // Fetch the character AFTER the current one - it may contain a modifier
    char modifier = script[n + 1];
    // Fetch the current character and branch accordingly
    switch(script[n]) {
      // Notes
      case 'c': playNote(214, time, modifier); break; // Play a  C
      case 'C': playNote(202, time, modifier); break; // Play a  C#
      case 'd': playNote(190, time, modifier); break; // Play a  D
      case 'D': playNote(180, time, modifier); break; // Play a  D#
      case 'e': playNote(170, time, modifier); break; // Play an E
      case 'f': playNote(160, time, modifier); break; // Play an F
      case 'F': playNote(151, time, modifier); break; // Play an F#
      case 'g': playNote(143, time, modifier); break; // Play a  G
      case 'G': playNote(135, time, modifier); break; // Play a  G#
      case 'a': playNote(127, time, modifier); break; // Play an A
      case 'A': playNote(120, time, modifier); break; // Play an A#
      case 'b': playNote(113, time, modifier); break; // Play a  B
      // Delay
      case '-': playNote(0,   time, modifier); break; // Play a quiet note
      // Note lengths
      case '1': time = 1000; break; // Full note
      case '2': time =  500; break; // Half note
      case '4': time =  250; break; // Quarter note
      case '8': time =   50; break; // Eigth note
	  // Modifier '.' makes note length 2/3

    }
  }
}

void RobotControl::beep(int beep_length){
  char scr1[]="8F";
  char scr2[]="8Fe";
  char scr3[]="1F";

  switch (beep_length)
  {
  case BEEP_SIMPLE:
  default:
    playMelody(scr1);
    break;

  case BEEP_DOUBLE:
	playMelody(scr2);
    break;

  case BEEP_LONG:
    playMelody(scr3);
  }

}

void RobotControl::tempoWrite(int tempo){
	SquawkSynthSD::tempo(tempo);
}
void RobotControl::tuneWrite(float tune){
	SquawkSynthSD::tune(tune);
}

void RobotControl::playFile(char* filename){
  melody.open(filename,O_READ);
  SquawkSynthSD::play(melody);
}

void RobotControl::stopPlayFile(){
  melody.close();
}
