// Code to control LED board 3
//
//
//
//
//
// 
// get_char and elements from the preamble taken from code by Neil Gershenfeld
//
//
//
// Rahul Naidoo 
// 2016
// HTM[a]A





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


#define output(directions,pin) (directions |= pin) // set port direction for output
#define input(directions,pin) (directions &= (~pin)) // set port direction for input
#define set(port,pin) (port |= pin) // set port pin
#define clear(port,pin) (port &= (~pin)) // clear port pin
#define pin_test(pins,pin) (pins & pin) // test for port pin
#define bit_test(byte,bit) (byte & (1 << bit)) // test for bit set
#define bit_delay_time 100 // bit delay for 9600 with overhead
#define bit_delay() _delay_us(bit_delay_time) // RS232 bit delay
#define half_bit_delay() _delay_us(bit_delay_time/2) // RS232 half bit delay
#define pause_delay() _delay_ms(1000) //  pause between sending ints
#define char_delay() _delay_ms(10) // char delay




void get_char(volatile unsigned char *pins, unsigned char pin, char *rxbyte) {
   //
   // read character into rxbyte on pins pin
   //    assumes line driver (inverts bits)
   //
   *rxbyte = 0;
   while (pin_test(*pins,pin))
      //
      // wait for start bit
      //
      ;
   //
   // delay to middle of first data bit
   //
   half_bit_delay();
   bit_delay();
   //
   // unrolled loop to read data bits
   //
   if pin_test(*pins,pin)
      *rxbyte |= (1 << 0);
   else
      *rxbyte |= (0 << 0);
   bit_delay();
   if pin_test(*pins,pin)
      *rxbyte |= (1 << 1);
   else
      *rxbyte |= (0 << 1);
   bit_delay();
   if pin_test(*pins,pin)
      *rxbyte |= (1 << 2);
   else
      *rxbyte |= (0 << 2);
   bit_delay();
   if pin_test(*pins,pin)
      *rxbyte |= (1 << 3);
   else
      *rxbyte |= (0 << 3);
   bit_delay(); 
   if pin_test(*pins,pin)
      *rxbyte |= (1 << 4);
   else
      *rxbyte |= (0 << 4);
   bit_delay();
   if pin_test(*pins,pin)
      *rxbyte |= (1 << 5);
   else
      *rxbyte |= (0 << 5);
   bit_delay();
   if pin_test(*pins,pin)
      *rxbyte |= (1 << 6);
   else
      *rxbyte |= (0 << 6);
   bit_delay();
   if pin_test(*pins,pin)
      *rxbyte |= (1 << 7);
   else
      *rxbyte |= (0 << 7);
   //
   // wait for stop bit
   //
   bit_delay();
   half_bit_delay();
   }


int main(void) {

static char Timeint;

  CLKPR = (1 << CLKPCE);
  CLKPR = (0 << CLKPS3) | (0 << CLKPS2) | (0 << CLKPS1) | (0 << CLKPS0);
   //

PORTA = 0b00000001;  // initialize input pin
DDRA = 0b10001100; //set up output pins
DDRB = 0b00000111; //set up output pins


//set(PORTA, (1 << PA3)); // set the input pin 

//input(DDRA, (1 << PA3)); 

//set(PORTA, (1 << PA1)); //set the output pin

//output(DDRA, (1 << PA1));


while (1) {

if ((PINA & 0b00000001) == 0 ) {
get_char(&PINA, (1 << PA0), &Timeint);
}
if (Timeint == 0){
   PORTA = 0b00000001;
   PORTB = 0b00000000;
}
else if (Timeint == 1){
   PORTA = 0b00000001;
   PORTB = 0b00000000;
}
else if (Timeint == 2){
   PORTA = 0b00000001;
   PORTB = 0b00000000;
}
else if (Timeint == 3){
   PORTA = 0b00000001;
   PORTB = 0b00000000;
}
else if (Timeint == 4){
   PORTA = 0b00000001;
   PORTB = 0b00000000;
}
else if (Timeint == 5){
   PORTA = 0b00000001;
   PORTB = 0b00000000;
}
else if (Timeint == 6){
   PORTA = 0b00000001;
   PORTB = 0b00000000;
}
else if (Timeint == 7){
   PORTA = 0b00000001;
   PORTB = 0b00000000;
}
else if (Timeint == 8){
   PORTA = 0b00000001;
   PORTB = 0b00000000;
}
else if (Timeint == 9){
   PORTA = 0b00000001;
   PORTB = 0b00000000;
}
else if (Timeint == 10){
   PORTA = 0b00000001;
   PORTB = 0b00000000;
}
else if (Timeint == 11){
   PORTA = 0b00000001;
   PORTB = 0b00000000;
}
else if (Timeint == 12){
   PORTA = 0b00000001;
   PORTB = 0b00000000;
}
else if (Timeint == 13) {
   PORTA = 0b10000001;
   PORTB = 0b00000000;
}
else if (Timeint == 14) {
   PORTA = 0b10001001;
   PORTB = 0b00000000;
}
else if (Timeint == 15) {
   PORTA = 0b10001101;
   PORTB = 0b00000000;
}
else if (Timeint == 16) {
   PORTA = 0b10001101;
   PORTB = 0b00000100;
}
else if (Timeint == 17) {
   PORTA = 0b10001101;
   PORTB = 0b00000110;
}
else if (Timeint == 18) {
   PORTA = 0b10001101;
   PORTB = 0b00000111;
}
else if (Timeint == 28) {
   //  PORTA = 0b10001101;
    // PORTB = 0b00000111;
   //  pause_delay();
    // PORTA = 0b00000001;
   //  PORTB = 0b00000000;
   //  pause_delay();
   //  PORTA = 0b10001101;
   //  PORTB = 0b00000111;
   //  pause_delay();
     PORTA = 0b00000001;
     PORTB = 0b00000001;

}
else {
   PORTA = 0b10001101;
   PORTB = 0b00000111;
}
}





return(0);

}
