/********************************************************
*  Code to access the raw data coming from the IR receiver
*  and display it on the screen. I used this code to generate
*  the code that sends commands to the tv. 
*  By: Jonathan Mash
*  Date: Feb. 2009
*  Based on work by: Walter Anderson (wandrson@walteranderson.us)
*********************************************************/
 
#include <avr/interrupt.h>
#include <avr/io.h>
 
#define TIMER_RESET  TCNT1 = 0
#define SAMPLE_SIZE  150
#define DEGBUG 0
 
int IRpin = 2;
unsigned int TimerValue[SAMPLE_SIZE];
char direction[SAMPLE_SIZE];
byte change_count;
long time;
int value;
void setup() {
  Serial.begin(115200);
  Serial.println("Analyze IR Remote");
  TCCR1A = 0x00;          // COM1A1=0, COM1A0=0 => Disconnect Pin OC1 from Timer/Counter 1 -- PWM11=0,PWM10=0 => PWM Operation disabled
  // ICNC1=0 => Capture Noise Canceler disabled -- ICES1=0 => Input Capture Edge Select (not used) -- CTC1=0 => Clear Timer/Counter 1 on Compare/Match
  // CS12=0 CS11=1 CS10=1 => Set prescaler to clock/64
  TCCR1B = 0x03;          // 16MHz clock with prescaler means TCNT1 increments every 4uS
  // ICIE1=0 => Timer/Counter 1, Input Capture Interrupt Enable -- OCIE1A=0 => Output Compare A Match Interrupt Enable -- OCIE1B=0 => Output Compare B Match Interrupt Enable
  // TOIE1=0 => Timer 1 Overflow Interrupt Enable
  TIMSK1 = 0x00;          
  pinMode(IRpin, INPUT);
}
 
void loop()
{
  Serial.println("Waiting...");
  change_count = 0;
  while(digitalRead(IRpin) == HIGH) {}                                 
  TIMER_RESET;
  TimerValue[change_count] = TCNT1;
  direction[change_count++] = '0';
  while (change_count < SAMPLE_SIZE) {
    if (direction[change_count-1] == '0') {
      while(digitalRead(IRpin) == LOW) {}
      TimerValue[change_count] = TCNT1;
      direction[change_count++] = '1';
    } else {
      while(digitalRead(IRpin) == HIGH) {}
      TimerValue[change_count] = TCNT1;
      direction[change_count++] = '0';
    }
  }
  //Serial.println("Bit stream detected!");
  change_count = 0;
  time = (long) TimerValue[change_count] * 4;
  change_count++;
  while (change_count < SAMPLE_SIZE) {
    time = (long) TimerValue[change_count] * 4;
 
    if(direction[change_count-1] == '0' && direction[change_count] == '1')
    {
      Serial.print("\t//");
      Serial.print((int)change_count);
      Serial.print("\t");
      Serial.print("HIGH\t");
      Serial.print("\t");
      Serial.println(time - (long)TimerValue[change_count-1] * 4);
      Serial.print("\toscillationWrite(led_pin, ");
      Serial.print(time - (long)TimerValue[change_count-1] * 4);
      Serial.println(");");
    }
    else if(direction[change_count-1] == '1' && direction[change_count] == '0')
    {
      Serial.print("\t//");
      Serial.print((int)change_count);
      Serial.print("\t");
      Serial.print("LOW\t");
      Serial.print("\t");
      Serial.println(time - (long)TimerValue[change_count-1] * 4);
      Serial.print("\tdelayMicroseconds(");
      Serial.print(time - (long)TimerValue[change_count-1] * 4);
      Serial.println(");");
    }
    change_count++;  
  }
  value=0;
  delay(100);
}