#define F_CPU 9600000UL

#include <avr/io.h>
#include <util/delay.h>

#define T 390UL

void led_on(void) {
  DDRB = 1;
}

void led_off(void) {
  DDRB = 0;
}

void sendBit(uint8_t i) {
  led_on();
  _delay_us(T/2);
  led_off();
  if(i != 0)
    _delay_us(T*3);
  else
    _delay_us(T);
}

void sendByte(uint8_t i) {
  uint8_t j;
  for(j = 0; j < 8; j++)
    sendBit(i & (1<<j));
}

void leader(void) {
  led_on();
  _delay_us(T*4);
  led_off();
  _delay_us(T*4);
}

void header(void) {
  sendByte(0x14);
  sendByte(0x63);
  sendByte(0x00);
  sendByte(0x10);
  sendByte(0x10);
}

void trailer(void) {
  sendBit(1);
  led_off();
  _delay_ms(8);
}

int main(void) {
  TCCR0A = 0b01000010;
  TCCR0B = 0b00000001;
  OCR0A = 126;

  // ON
  leader();
  header();
  sendByte(0xFC);
  sendByte(0x08);
  sendByte(0x30);
  sendByte(0xE1);
  sendByte(0x04);
  sendByte(0x01);
  sendByte(0x00);
  sendByte(0x00);
  sendByte(0x00);
  sendByte(0xEA);
  trailer();

  _delay_ms(1000);

  // OFF
  leader();
  header();    
  sendByte(0x02);
  trailer();
  
  while(1) 
    _delay_ms(1);
}
