//március 15.

#include <avr/io.h>
#include <util/delay.h>

#define PIROS_BE PORTB |= (1<<PB2)
#define PIROS_KI PORTB &= ~(1<<PB2)

#define FEHER_BE PORTB |= (1<<PB1)
#define FEHER_KI PORTB &= ~(1<<PB1)

#define ZOLD_BE PORTB |= (1<<PB0)
#define ZOLD_KI PORTB &= ~(1<<PB0)


void do_delay(uint16_t ms_delay, uint16_t num_ms, uint16_t us_delay, uint16_t num_us)
{
uint16_t i;
for(i=0;i<num_ms;i++) _delay_ms(250);
for(i=0;i<ms_delay;i++) _delay_ms(1);
for(i=0;i<num_us;i++) _delay_us(250);
for(i=0;i<us_delay;i++) _delay_us(1);
}

void generate_tone(uint16_t frequency, uint16_t duration)
{
uint32_t total_delay_time;
uint16_t total_ms_delay_time, total_us_delay_time;
uint16_t num_us_delays, num_ms_delays, ms_delay_time, us_delay_time;
uint16_t num_periods;
total_delay_time = (1000000/frequency)/2-10;
total_ms_delay_time = total_delay_time/1000;
num_ms_delays = total_ms_delay_time/250;
ms_delay_time = total_ms_delay_time%250;
total_us_delay_time = total_delay_time%1000;
num_us_delays = total_us_delay_time/250;
us_delay_time = total_us_delay_time%250;
num_periods = ((uint32_t)duration*1000)/(1000000/frequency);

while((num_periods--) != 0)
{
do_delay(ms_delay_time, num_ms_delays, us_delay_time, num_us_delays);
PORTB |=  (1<<PINB4);
do_delay(ms_delay_time, num_ms_delays, us_delay_time, num_us_delays);
PORTB &= ~(1<<PINB4);
}
return;
}


int main(void)
{
DDRB = 0b010111;
PORTB = (1<<PINB3);

for(;;)
{
while(PINB & (1<<PINB3));

volatile int ido = 500;

PIROS_BE;
_delay_ms(ido);
FEHER_BE;
_delay_ms(ido);
PIROS_KI;
ZOLD_BE;
_delay_ms(ido);
FEHER_KI;
_delay_ms(ido);
ZOLD_KI;
_delay_ms(ido);
PIROS_BE;
FEHER_BE;
ZOLD_BE;
_delay_ms(ido);
PIROS_KI;
FEHER_KI;
ZOLD_KI;

volatile int ti = 300;
volatile int ta = 800;
volatile int nyujtott = 1200;
volatile int hosszu = 1000;
volatile int hosszu_m = hosszu+ta;

volatile int kozti = 150;

volatile int B_m = 233.08;
volatile int C = 261.63;
volatile int D = 293.66;
volatile int DD = 311.13;
volatile int F = 349.23;
volatile int FF = 369.99; 
volatile int G = 392;
volatile int GG = 415.3;
volatile int A = 440;
volatile int B = 466.16;
volatile int C_m = 523.25;
volatile int CC_m = 554.37;
volatile int D_m = 587.33;
volatile int DD_m = 622.25;

while(PINB & (1<<PINB3));

generate_tone(D, nyujtott); //is
generate_tone(DD, ti); //ten
generate_tone(F, ta); //áldd
generate_tone(B, ta); //meg
generate_tone(F, ta); //a
generate_tone(DD, ta); //ma
generate_tone(D, hosszu); //gyart
_delay_ms(kozti);
generate_tone(GG, ta); //jó
generate_tone(F, ta); //kedv
generate_tone(DD, ta); //vel
generate_tone(D, ta); //bõ
generate_tone(C, ta); //sé
generate_tone(D, ta); //ég
generate_tone(DD, hosszu); //gel
_delay_ms(kozti);
generate_tone(C, nyujtott); //nyújts
generate_tone(D, ti); //fe
generate_tone(DD, ta); //lé
generate_tone(CC_m, ta); //je
generate_tone(DD, ta); //vé
generate_tone(D, ta); //dõ
generate_tone(C, hosszu); //kart
_delay_ms(kozti);
generate_tone(F, ta); //ha
generate_tone(DD, ta); //küzd
generate_tone(D, ta); //el
generate_tone(C, ta); //len
generate_tone(B_m, ta); //sé
generate_tone(C, ta); //ég
generate_tone(D, hosszu); //gel
_delay_ms(kozti);
generate_tone(B, nyujtott); //bal
generate_tone(A, ti); //sors
generate_tone(G, ta); //a
generate_tone(FF, ta); //kit
generate_tone(G, ta); //ré
generate_tone(A, ta); //gen
generate_tone(D, hosszu); //tép
_delay_ms(kozti);
generate_tone(D_m, nyujtott); //ho
generate_tone(CC_m, ti); //ozz
generate_tone(B, ta); //rá
generate_tone(A, ta); //víg
generate_tone(B, ta); //esz
generate_tone(CC_m, ta); //ten
generate_tone(F, hosszu); //dõt
_delay_ms(kozti);
generate_tone(DD_m, nyujtott); //meg
generate_tone(D_m, ti); //bûn
generate_tone(CC_m, ta); //hõd
generate_tone(B, ta); //te
generate_tone(A, nyujtott); //már
generate_tone(G, ti); //e
generate_tone(F, ta); //nép
generate_tone(DD, ta); //a
generate_tone(D, ta); //múl
generate_tone(D, ta); //tat
generate_tone(C, ta); //sjõ
generate_tone(C, ti); //ve
generate_tone(D, ti); //en
generate_tone(B_m, hosszu_m); //dõt

PIROS_BE;
FEHER_BE;
ZOLD_BE;
_delay_ms(ido);
PIROS_KI;
FEHER_KI;
ZOLD_KI;

}

}