/*
 * test.c
 *
 * Created: 2017-04-12 11:22:42
 * Author : Cecilia Skoglund och Johan Hansson
 */ 

#include <avr/io.h>
#include <util/delay.h>
#include <stdlib.h>
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               int main(void){

	DDRD = 0b00110000;
	PINA = 0x01;
	DDRB = 0xFF;
	int melodyCounter = 1;
	int loopToneActive = 0;

	void bOn(){
		PORTD = 0b01010000;
		PORTD = 0b01000000;
		PORTB = 0b11111111;
		PORTD = 0b01010000;
		PORTD = 0b01110000;
	}
	
	void bOff(){
		PORTD = 0b01010000;
		PORTD = 0b01000000;
		PORTB = 0b00000000;
		PORTD = 0b01010000;
		PORTD = 0b01110000;
	}
	
	void generateTone(double delay, int iteration){
		if(loopToneActive==0){_delay_ms(200);}
		for(int i = 0;i<iteration;i++){
			bOn();
			_delay_ms(delay);
			bOff();
			_delay_ms(delay);
		}
		PORTD = 0b00000000;
	}
	
	void loopTone(){
		loopToneActive==1;
		for(int i = 5;i<20;i++){
			generateTone(i,15);
		}
		for(int i = 20;i>3;i--){
			generateTone(i,15);
		}
		loopToneActive==0;
	}
	
	int checkButton(){
		if(PIND & (1<<PD2)){
			melodyCounter++;
			loopTone();
			_delay_ms(200);
			return 1;
		}
		return 0;
	}

	void Feliz(){
		while(1){
			/* D */
			generateTone(14,60);
			if(checkButton()==1){
				break;
			}
			/* D */
			generateTone(14,60);
			if(checkButton()==1){
				break;
			}
			/* E */
			generateTone(12,120);
			if(checkButton()==1){
				break;
			}
			/* D */
			generateTone(14,100);
			if(checkButton()==1){
				break;
			}
			/* G */
			generateTone(10,150);
			if(checkButton()==1){
				break;
			}
			/* F# */
			generateTone(10.5,300);
			if(checkButton()==1){
				break;
			}
			/* D */
			generateTone(14,60);
			if(checkButton()==1){
				break;
			}
			/* D */
			generateTone(14,60);
			if(checkButton()==1){
				break;
			}
			/* E */
			generateTone(12,120);
			if(checkButton()==1){
				break;
			}
			/* D */
			generateTone(14,100);
			if(checkButton()==1){
				break;
			}
			/* A */
			generateTone(9,130);
			if(checkButton()==1){
				break;
			}
			/* G */
			generateTone(10,300);
			if(checkButton()==1){
				break;
			}
			/* D */
			generateTone(14,60);
			if(checkButton()==1){
				break;
			}
			/* D */
			generateTone(14,60);
			if(checkButton()==1){
				break;
			}
			/* D */
			generateTone(5.3,250);
			if(checkButton()==1){
				break;
			}
			/* B */
			generateTone(8,200);
			if(checkButton()==1){
				break;
			}
			/* G */
			generateTone(10,200);
			if(checkButton()==1){
				break;
			}
			/* F# */
			generateTone(10.7,200);
			if(checkButton()==1){
				break;
			}
			/* E */
			generateTone(12,150);
			if(checkButton()==1){
				break;
			}
			/* C */
			generateTone(7.5,100);
			if(checkButton()==1){
				break;
			}
			/* C */
			generateTone(7.5,100);
			if(checkButton()==1){
				break;
			}
			/* B */
			generateTone(8,200);
			if(checkButton()==1){
				break;
			}
			/* G */
			generateTone(10,200);
			if(checkButton()==1){
				break;
			}
			/* A */
			generateTone(9,150);
			if(checkButton()==1){
				break;
			}
			/* G */
			generateTone(10,300);
			if(checkButton()==1){
				break;
			}
			_delay_ms(200);
		}
	}
	
	void Twinkle(){
		while(1){
			/* D */
			generateTone(13.8,150);
			if(checkButton()==1){
				break;
			}
			/* D */
			generateTone(13.8,150);
			if(checkButton()==1){
				break;
			}
			/* A */
			generateTone(9,200);
			if(checkButton()==1){
				break;
			}
			/* A */
			generateTone(9,200);
			if(checkButton()==1){
				break;
			}
			/* B */
			generateTone(8,200);
			if(checkButton()==1){
				break;
			}
			/* B */
			generateTone(8,200);
			if(checkButton()==1){
				break;
			}
			/* A */ 
			generateTone(9,300);
			if(checkButton()==1){
				break;
			}
			/* G */
			generateTone(10,180);
			if(checkButton()==1){
				break;
			}
			/* G */
			generateTone(10,180);
			if(checkButton()==1){
				break;
			}
			/* F# */
			generateTone(10.7,175);
			if(checkButton()==1){
				break;
			}
			/* F# */
			generateTone(10.7,175);
			if(checkButton()==1){
				break;
			}
			/* E */
			generateTone(12,160);
			if(checkButton()==1){
				break;
			}
			/* E */
			generateTone(12,160);
			if(checkButton()==1){
				break;
			}
			/* D */
			generateTone(13.8,150);
			if(checkButton()==1){
				break;
			}
			/* A */
			generateTone(9,200);
			if(checkButton()==1){
				break;
			}
			/* A */
			generateTone(9,200);
			if(checkButton()==1){
				break;
			}
			/* G */
			generateTone(10,180);
			if(checkButton()==1){
				break;
			}
			/* G */
			generateTone(10,180);
			if(checkButton()==1){
				break;
			}
			/* F# */
			generateTone(10.7,175);
			if(checkButton()==1){
				break;
			}
			/* F# */
			generateTone(10.7,175);
			if(checkButton()==1){
				break;
			}
			/* E */
			generateTone(12,160);
			if(checkButton()==1){
				break;
			}
			/* A */
			generateTone(9,200);
			if(checkButton()==1){
				break;
			}
			/* A */
			generateTone(9,200);
			if(checkButton()==1){
				break;
			}
			/* G */
			generateTone(10,180);
			if(checkButton()==1){
				break;
			}
			/* G */
			generateTone(10,180);
			if(checkButton()==1){
				break;
			}
			/* F# */
			generateTone(10.7,175);
			if(checkButton()==1){
				break;
			}
			/* F# */
			generateTone(10.7,175);
			if(checkButton()==1){
				break;
			}
			/* E */
			generateTone(12,160);
			if(checkButton()==1){
				break;
			}
			/* D */
			generateTone(13.8,150);
			if(checkButton()==1){
				break;
			}
			/* D */
			generateTone(13.8,150);
			if(checkButton()==1){
				break;
			}
			/* A */
			generateTone(9,200);
			if(checkButton()==1){
				break;
			}
			/* A */
			generateTone(9,200);
			if(checkButton()==1){
				break;
			}
			/* B */
			generateTone(8,200);
			if(checkButton()==1){
				break;
			}
			/* B */
			generateTone(8,200);
			if(checkButton()==1){
				break;
			}
			/* A */ 
			generateTone(9,300);
			if(checkButton()==1){
				break;
			}
			/* G */
			generateTone(10,180);
			if(checkButton()==1){
				break;
			}
			/* G */
			generateTone(10,180);
			if(checkButton()==1){
				break;
			}
			/* F# */
			generateTone(10.7,175);
			if(checkButton()==1){
				break;
			}
			/* F# */
			generateTone(10.7,175);
			if(checkButton()==1){
				break;
			}
			/* E */
			generateTone(12,160);
			if(checkButton()==1){
				break;
			}
			/* E */
			generateTone(12,160);
			if(checkButton()==1){
				break;
			}
			/* D */
			generateTone(13.8,150);
			if(checkButton()==1){
				break;
			}
			_delay_ms(200);
		}
	}
	
	void Glassbilen(){
		while(1){
			/* F */
			generateTone(11.5,80);
			if(checkButton()==1){
				break;
			}
			/* A */
			generateTone(9,100);
			if(checkButton()==1){
				break;
			}
			/* C */
			generateTone(7.5,100);
			if(checkButton()==1){
				break;
			}
			/* A */
			generateTone(9,100);
			if(checkButton()==1){
				break;
			}
			/* F */
			generateTone(11.5,160);
			if(checkButton()==1){
				break;
			}
			/* F */
			generateTone(11.5,80);
			if(checkButton()==1){
				break;
			}
			/* A */
			generateTone(9,100);
			if(checkButton()==1){
				break;
			}
			/* C */
			generateTone(7.5,100);
			if(checkButton()==1){
				break;
			}
			/* A */
			generateTone(9,100);
			if(checkButton()==1){
				break;
			}
			/* F */
			generateTone(11.5,160);
			if(checkButton()==1){
				break;
			}
			/* F */
			generateTone(11.5,80);
			if(checkButton()==1){
				break;
			}
			/* Bb */
			generateTone(8.5,200);
			if(checkButton()==1){
				break;
			}
			/* Bb */
			generateTone(8.5,110);
			if(checkButton()==1){
				break;
			}
			/* G */
			generateTone(10,160);
			if(checkButton()==1){
				break;
			}
			/* G */
			generateTone(10,90);
			if(checkButton()==1){
				break;
			}
			/* F */
			generateTone(11.5,160);
			if(checkButton()==1){
				break;
			}
			_delay_ms(500);
		}
	}
	
	void Levels(){
		while(1){
			/* C# */
			generateTone(7,100);
			if(checkButton()==1){
				break;
			}
			/* B */
			generateTone(8,100);
			if(checkButton()==1){
				break;
			}
			/* G# */
			generateTone(9.5,100);
			if(checkButton()==1){
				break;
			}
			/* F# */
			generateTone(10.7,100);
			if(checkButton()==1){
				break;
			}
			/* E */
			generateTone(12,75);
			if(checkButton()==1){
				break;
			}
			/* E */
			generateTone(12,75);
			if(checkButton()==1){
				break;
			}
			_delay_ms(1500);
			/* E */
			generateTone(12,75);
			if(checkButton()==1){
				break;
			}
			/* E */
			generateTone(12,75);
			if(checkButton()==1){
				break;
			}
			/* E */
			generateTone(12,75);
			if(checkButton()==1){
				break;
			}
			/* E */
			generateTone(12,75);
			if(checkButton()==1){
				break;
			}
			/* D# */
			generateTone(13,85);
			if(checkButton()==1){
				break;
			}
			/* E */
			generateTone(12,75);
			if(checkButton()==1){
				break;
			}
			/* E */
			generateTone(12,75);
			if(checkButton()==1){
				break;
			}
			/* E */
			generateTone(12,75);
			if(checkButton()==1){
				break;
			}
			_delay_ms(2000);
			/* C# */
			generateTone(7,100);
			if(checkButton()==1){
				break;
			}
			/* B */
			generateTone(8,100);
			if(checkButton()==1){
				break;
			}
			/* G# */
			generateTone(9.5,100);
			if(checkButton()==1){
				break;
			}
			/* F# */
			generateTone(10.7,100);
			if(checkButton()==1){
				break;
			}
			/* E */
			generateTone(12,75);
			if(checkButton()==1){
				break;
			}
			/* E */
			generateTone(12,75);
			if(checkButton()==1){
				break;
			}
			_delay_ms(1500);
			/* E */
			generateTone(12,75);
			if(checkButton()==1){
				break;
			}
			/* E */
			generateTone(12,75);
			if(checkButton()==1){
				break;
			}
			/* E */
			generateTone(12,75);
			if(checkButton()==1){
				break;
			}
			/* E */
			generateTone(12,75);
			if(checkButton()==1){
				break;
			}
			/* C# */
			generateTone(14.1,75);
			if(checkButton()==1){
				break;
			}
			/* C# */
			generateTone(14.1,75);
			if(checkButton()==1){
				break;
			}
			/* B */
			generateTone(16.4,60);
			if(checkButton()==1){
				break;
			}
			/* B */
			generateTone(16.4,60);
			if(checkButton()==1){
				break;
			}
			_delay_ms(1500);
		}
	}
	
	void OneIntro(){
		int a = 1;
		while(a == 1){
			for(int i=0;i<4;i++){
				generateTone(70,50);
				if(checkButton()==1){
					break;
				}
			}
			for(int i=0;i<4;i++){
				generateTone(70,25);
				if(checkButton()==1){
					break;
				}
			}
			for(int i=0;i<8;i++){
				generateTone(70,12.5);
				if(checkButton()==1){
					break;
				}
			}
			for(int i=0;i<16;i++){
				generateTone(70,5);
				if(checkButton()==1){
					break;
				}
			}
			for(int i=0;i<32;i++){
				generateTone(70,3);
				if(checkButton()==1){
					break;
				}
			}
			for(int i=0;i<32;i++){
				generateTone(70,2);
				if(checkButton()==1){
					break;
				}
			}
			for(int i=0;i<64;i++){
				generateTone(70,1);
				if(checkButton()==1){
					break;
				}
			}
			for(int i=70;i>60;i--){
				generateTone(i,1);
				if(checkButton()==1){
					break;
				}
			}
			for(int i=60;i>50;i--){
				generateTone(i,2);
				if(checkButton()==1){
					break;
				}
			}
			for(int i=50;i>40;i--){
				generateTone(i,3);
				if(checkButton()==1){
					break;
				}
			}
			for(int i=40;i>30;i--){
				generateTone(i,4);
				if(checkButton()==1){
					break;
				}
			}
			for(int i=30;i>20;i--){
				generateTone(i,5);
				if(checkButton()==1){
					break;
				}
			}
			for(int i=20;i>4;i--){
				generateTone(i,6);
				if(checkButton()==1){
					break;
				}
			}
			generateTone(9,900);
			if(checkButton()==1){
				break;
			}
			_delay_ms(500);
			a = 0;
		}
	}
	
	void One(){
		OneIntro();
		while(1){
			/* A */
			generateTone(9,150);
			if(checkButton()==1){
				break;
			}
			/* G */
			generateTone(10,150);
			if(checkButton()==1){
				break;
			}
			/* F */
			generateTone(11.5,150);
			if(checkButton()==1){
				break;
			}
			/* E */
			generateTone(12,130);
			if(checkButton()==1){
				break;
			}
			/* D */
			generateTone(13.8,100);
			if(checkButton()==1){
				break;
			}
			/* D */
			generateTone(13.8,90);
			if(checkButton()==1){
				break;
			}
			/* D */
			generateTone(13.8,90);
			if(checkButton()==1){
				break;
			}
			/* D */
			generateTone(13.8,90);
			if(checkButton()==1){
				break;
			}
			/* D */
			generateTone(13.8,90);
			if(checkButton()==1){
				break;
			}
			_delay_ms(600);
			/* D */
			generateTone(13.8,70);
			if(checkButton()==1){
				break;
			}
			/* D */
			generateTone(13.8,70);
			if(checkButton()==1){
				break;
			}
			/* A */
			generateTone(9,150);
			if(checkButton()==1){
				break;
			}
			/* G */
			generateTone(10,150);
			if(checkButton()==1){
				break;
			}
			/* F */
			generateTone(11.5,150);
			if(checkButton()==1){
				break;
			}
			/* E */
			generateTone(12,130);
			if(checkButton()==1){
				break;
			}
			/* G */
			generateTone(10,150);
			if(checkButton()==1){
				break;
			}
			/* G */
			generateTone(10,150);
			if(checkButton()==1){
				break;	
			}
			/* G */
			generateTone(10,150);
			if(checkButton()==1){
				break;
			}
			/* G */
			generateTone(10,150);
			if(checkButton()==1){
				break;
			}
			/* G */
			generateTone(10,150);
			if(checkButton()==1){
				break;
			}
			_delay_ms(600);
			/* G */
			generateTone(10,75);
			if(checkButton()==1){
				break;
			}
			/* A */
			generateTone(9,75);
			if(checkButton()==1){
				break;
			}
			_delay_ms(500);
		}
	}

    while(1){	
		DDRD = 0b01110100;
		PORTD = 0x00;
		switch(melodyCounter){
			case 1 : while(checkButton()==0){}; break; 	
			case 2 : Glassbilen();_delay_ms(400); break;
			case 3 : Twinkle();_delay_ms(400);  break;
			case 4 : Levels(); _delay_ms(400); break; break;
			case 5 : One();_delay_ms(400);melodyCounter=1;break;
		}
	}
}