
#include "adc.c"
#include "PWMTable.c"

#include <util/delay.h>     /* in lteren avr-libc Versionen <avr/delay.h> */ 

void long_delay(uint16_t ms) {
    for(; ms>0; ms--) _delay_ms(1);
}



int main (void) {            
 
   DDRB  = 0xff;             
   PORTB = 0x03;            
   uint16_t adcval, adcvalold;		//Werte des ADC
   int16_t iLED1, iLED2;			//gespeicherte Werte PWM
   uint8_t iTaste;					// Zifferntaste
 


	//10 Bit PWM mit 64 Stufen initialisieren
	pwm_10_64init();
	//Fernbedinung aktivieren
	rc5_init (RC5_ALL);

	/* Interrupts zulassen */
	sei();
	//Anfangswerte setzen
	iTaste=0;
	iLED1=4;pwm_10_64(iLED1, 1); 
	iLED2=4;pwm_10_64(iLED2, 2);


   while(1) {                
	   if (-1 == rc5.flip)
	   {
	   		//keine FB-Taste gedrckt: Kanal 0 ADC lesen
			adcval = ReadChannel(0); /* MUX-Bits auf 0b0000 -> Channel 0 */
			//Differenz zum vorhergehenden Wert? -> Poti wurde verndert
			if ((adcval > adcvalold+5) || (adcval < adcvalold-5))
			{
				//ADC (10 bit) auf 6 Bit abbilden und Werte setzen
				iLED1=adcval/16;iLED2=adcval/16;
				pwm_10_64(iLED1, 1);
				pwm_10_64(iLED2, 2);
				//Wert speichern
				adcvalold=adcval;
			}
	   }
	   else
	   {
	      	/* Ja, dann rc5.code merken und evtl. rc5.addr */
	      	uint8_t code = rc5.code;
	      	uint8_t addr = rc5.addr;
	      	/* und auf naechstes Zeichen warten */
	      	rc5.flip = -1;
		  if (addr==0)
		  {
		  switch (code)
		  {
			case 12: { 	iLED1=0;iLED2=0;
						pwm_10_64(iLED1, 1);pwm_10_64(iLED2, 2);break;}    // Aus
    		case 43: { 	iLED1=15;iLED2=15;
						pwm_10_64(iLED1, 1);pwm_10_64(iLED2, 2);break;}    // Play
    		case 44: { 	iLED1=30;iLED2=30;
						pwm_10_64(iLED1, 1);pwm_10_64(iLED2, 2);break;}    // Stop
    		case 53: { 	iLED1=45;iLED2=45;
						pwm_10_64(iLED1, 1);pwm_10_64(iLED2, 2);break;}    // Pause
    		case 13: { 	iLED1=63;iLED2=63;
						pwm_10_64(iLED1, 1);pwm_10_64(iLED2, 2);break;}    // Mute
    		case 60: { 	iLED1=30;iLED2=0;
						pwm_10_64(iLED1, 1);pwm_10_64(iLED2, 2);break;}    // Record
    		case 46: { 	iLED1=50;iLED2=0;
						pwm_10_64(iLED1, 1);pwm_10_64(iLED2, 2);break;}    // back
    		case 56: { 	iLED1=0;iLED2=30;
						pwm_10_64(iLED1, 1);pwm_10_64(iLED2, 2);break;}    // exit
    		case 42: { 	iLED1=0;iLED2=50;
						pwm_10_64(iLED1, 1);pwm_10_64(iLED2, 2);break;}    // forward

    		case 16:// Vol + in Abhngigkeit Zifferntaste
			 		{ 
						if(iTaste==2) iLED2+=2;
						else if (iTaste==1) iLED1+=2;
						else {iLED1+=2;iLED2+=2;}
						if (iLED1 > 63) iLED1 = 63;
						if (iLED2 > 63) iLED2 = 63;
						pwm_10_64(iLED1, 1);
						pwm_10_64(iLED2, 2);
						break;
					}    
    		case 17:// Vol - in Abhngigkeit Zifferntaste
					 { 
						if(iTaste==2) iLED2-=2;
						else if (iTaste==1) iLED1-=2;
						else {iLED1-=2;iLED2-=2;}
						if (iLED1 < 0) iLED1 = 0;
						if (iLED2 < 0) iLED2 = 0;
						pwm_10_64(iLED1, 1);
						pwm_10_64(iLED2, 2);
						break;}    
    		case 32: { // Ch + in Abhngigkeit Zifferntaste
						if(iTaste==2) iLED2+=8;
						else if (iTaste==1) iLED1+=8;
						else {iLED1+=8;iLED2+=8;}
						if (iLED1 > 63) iLED1 = 63;
						if (iLED2 > 63) iLED2 = 63;
						pwm_10_64(iLED1, 1);
						pwm_10_64(iLED2, 2);
						break;
					}    
    		case 33: { // Ch - in Abhngigkeit Zifferntaste
						if(iTaste==2) iLED2-=8;
						else if (iTaste==1) iLED1-=8;
						else {iLED1-=8;iLED2-=8;}
						if (iLED1 < 0) iLED1 = 0;
						if (iLED2 < 0) iLED2 = 0;
						pwm_10_64(iLED1, 1);
						pwm_10_64(iLED2, 2);
						break;}    

			case 1:	 { iTaste=1;break; }
			case 2:	 { iTaste=2;break; }
			case 0:	 { iTaste=0;break; }
    		default: ;    

		  }
		  }
      

	   }


   }                         
 
   /* wird nie erreicht */
   return 0;                 
}
