/*************************************************
   RTTY DECODER for GR-SAKURA v1.0 2014.07.04
   Kazuhiro Iwasa (JI3BNB)
   5BIT-BAUDOT-CODE, 45.45baud
   LCD 16x2
/*************************************************/
   
#include <rxduino.h>
#include <liquidcrystal.h>

LiquidCrystal lcd(4,5,6,7,8,9,10);
#define INPUT_PIN 2

byte i   = 0;
byte j   = 0;
byte k   = 0;
byte l;
byte sq  = 0;
byte d1  = 0;
byte d2  = 0;
byte d3  = 0;
byte d4  = 0;
byte d5  = 0;
byte dsp = 0;
byte fig = 0;
char ch;
char c[17];

void timer_interrupt(void)
{
        i++;
        if(sq == 0 && digitalRead(INPUT_PIN) == 0)
        {
                sq = 1;
                i = 0;
        }
        if(sq == 1 && i == 10)
        {
                if(digitalRead(INPUT_PIN) == 0)
                {
                        sq = 2;
                        i = 0;
                }
                else
                {
                        sq = 0;
                }
        }
        if(sq == 2 && i == 22)
        {
                d1 = digitalRead(INPUT_PIN);
        }
        if(sq == 2 && i == 44)
        {
                d2 = digitalRead(INPUT_PIN);
        }
        if(sq == 2 && i == 66)
        {
                d3 = digitalRead(INPUT_PIN);
        }
        if(sq == 2 && i == 88)
        {
                d4 = digitalRead(INPUT_PIN);
        }
        if(sq == 2 && i == 110)
        {
                d5 = digitalRead(INPUT_PIN);
                dsp = 1;
        }
        if(sq == 2 && i == 135)
        {        
                sq = 0;
        }
}

void setup()
{
        lcd.begin(16, 2);
        lcd.clear();
        pinMode(PIN_LED0, OUTPUT);
        timer_regist_userfunc(timer_interrupt);
}

void loop()
{
        if(dsp == 1)
        {
                ch = '\0';
                if(d1 == 1 && d2 == 1 && d3 == 1 && d4 == 1 && d5 == 1) //LETTERS
                {
                        fig = 0;
                        digitalWrite(PIN_LED0, LOW);
                }
                if(d1 == 1 && d2 == 1 && d3 == 0 && d4 == 1 && d5 == 1) //FIGURES
                {
                        fig = 1;
                        digitalWrite(PIN_LED0, HIGH);
                }            
                if(d1 == 0 && d2 == 0 && d3 == 0 && d4 == 1 && d5 == 0){         } //CR
                if(d1 == 0 && d2 == 1 && d3 == 0 && d4 == 0 && d5 == 0){ch = ' ';} //LF
                if(d1 == 0 && d2 == 0 && d3 == 1 && d4 == 0 && d5 == 0){ch = ' ';} //SPACE
                if(fig == 0)
                {
                        if(d1 == 1 && d2 == 1 && d3 == 0 && d4 == 0 && d5 == 0){ch = 'A';}
                        if(d1 == 1 && d2 == 0 && d3 == 0 && d4 == 1 && d5 == 1){ch = 'B';}
                        if(d1 == 0 && d2 == 1 && d3 == 1 && d4 == 1 && d5 == 0){ch = 'C';}
                        if(d1 == 1 && d2 == 0 && d3 == 0 && d4 == 1 && d5 == 0){ch = 'D';}
                        if(d1 == 1 && d2 == 0 && d3 == 0 && d4 == 0 && d5 == 0){ch = 'E';}
                        if(d1 == 1 && d2 == 0 && d3 == 1 && d4 == 1 && d5 == 0){ch = 'F';}
                        if(d1 == 0 && d2 == 1 && d3 == 0 && d4 == 1 && d5 == 1){ch = 'G';}
                        if(d1 == 0 && d2 == 0 && d3 == 1 && d4 == 0 && d5 == 1){ch = 'H';}
                        if(d1 == 0 && d2 == 1 && d3 == 1 && d4 == 0 && d5 == 0){ch = 'I';}
                        if(d1 == 1 && d2 == 1 && d3 == 0 && d4 == 1 && d5 == 0){ch = 'J';}
                        if(d1 == 1 && d2 == 1 && d3 == 1 && d4 == 1 && d5 == 0){ch = 'K';}
                        if(d1 == 0 && d2 == 1 && d3 == 0 && d4 == 0 && d5 == 1){ch = 'L';}
                        if(d1 == 0 && d2 == 0 && d3 == 1 && d4 == 1 && d5 == 1){ch = 'M';}
                        if(d1 == 0 && d2 == 0 && d3 == 1 && d4 == 1 && d5 == 0){ch = 'N';}
                        if(d1 == 0 && d2 == 0 && d3 == 0 && d4 == 1 && d5 == 1){ch = 'O';}
                        if(d1 == 0 && d2 == 1 && d3 == 1 && d4 == 0 && d5 == 1){ch = 'P';}
                        if(d1 == 1 && d2 == 1 && d3 == 1 && d4 == 0 && d5 == 1){ch = 'Q';}
                        if(d1 == 0 && d2 == 1 && d3 == 0 && d4 == 1 && d5 == 0){ch = 'R';}
                        if(d1 == 1 && d2 == 0 && d3 == 1 && d4 == 0 && d5 == 0){ch = 'S';}
                        if(d1 == 0 && d2 == 0 && d3 == 0 && d4 == 0 && d5 == 1){ch = 'T';}
                        if(d1 == 1 && d2 == 1 && d3 == 1 && d4 == 0 && d5 == 0){ch = 'U';}
                        if(d1 == 0 && d2 == 1 && d3 == 1 && d4 == 1 && d5 == 1){ch = 'V';}
                        if(d1 == 1 && d2 == 1 && d3 == 0 && d4 == 0 && d5 == 1){ch = 'W';}
                        if(d1 == 1 && d2 == 0 && d3 == 1 && d4 == 1 && d5 == 1){ch = 'X';}
                        if(d1 == 1 && d2 == 0 && d3 == 1 && d4 == 0 && d5 == 1){ch = 'Y';}
                        if(d1 == 1 && d2 == 0 && d3 == 0 && d4 == 0 && d5 == 1){ch = 'Z';}
                }
                if(fig == 1)
                {
                        if(d1 == 1 && d2 == 1 && d3 == 0 && d4 == 0 && d5 == 0){ch = '-';}
                        if(d1 == 1 && d2 == 0 && d3 == 0 && d4 == 1 && d5 == 1){ch = '?';}
                        if(d1 == 0 && d2 == 1 && d3 == 1 && d4 == 1 && d5 == 0){ch = ':';}
                        if(d1 == 1 && d2 == 0 && d3 == 0 && d4 == 1 && d5 == 0){         }
                        if(d1 == 1 && d2 == 0 && d3 == 0 && d4 == 0 && d5 == 0){ch = '3';}
                        if(d1 == 1 && d2 == 0 && d3 == 1 && d4 == 1 && d5 == 0){         }
                        if(d1 == 0 && d2 == 1 && d3 == 0 && d4 == 1 && d5 == 1){         }
                        if(d1 == 0 && d2 == 0 && d3 == 1 && d4 == 0 && d5 == 1){         }
                        if(d1 == 0 && d2 == 1 && d3 == 1 && d4 == 0 && d5 == 0){ch = '8';}
                        if(d1 == 1 && d2 == 1 && d3 == 0 && d4 == 1 && d5 == 0){         }
                        if(d1 == 1 && d2 == 1 && d3 == 1 && d4 == 1 && d5 == 0){ch = '(';}
                        if(d1 == 0 && d2 == 1 && d3 == 0 && d4 == 0 && d5 == 1){ch = ')';}
                        if(d1 == 0 && d2 == 0 && d3 == 1 && d4 == 1 && d5 == 1){ch = '.';}
                        if(d1 == 0 && d2 == 0 && d3 == 1 && d4 == 1 && d5 == 0){ch = ',';}
                        if(d1 == 0 && d2 == 0 && d3 == 0 && d4 == 1 && d5 == 1){ch = '9';}
                        if(d1 == 0 && d2 == 1 && d3 == 1 && d4 == 0 && d5 == 1){ch = '0';}
                        if(d1 == 1 && d2 == 1 && d3 == 1 && d4 == 0 && d5 == 1){ch = '1';}
                        if(d1 == 0 && d2 == 1 && d3 == 0 && d4 == 1 && d5 == 0){ch = '4';}
                        if(d1 == 1 && d2 == 0 && d3 == 1 && d4 == 0 && d5 == 0){         }
                        if(d1 == 0 && d2 == 0 && d3 == 0 && d4 == 0 && d5 == 1){ch = '5';}
                        if(d1 == 1 && d2 == 1 && d3 == 1 && d4 == 0 && d5 == 0){ch = '7';}
                        if(d1 == 0 && d2 == 1 && d3 == 1 && d4 == 1 && d5 == 1){         }
                        if(d1 == 1 && d2 == 1 && d3 == 0 && d4 == 0 && d5 == 1){ch = '2';}
                        if(d1 == 1 && d2 == 0 && d3 == 1 && d4 == 1 && d5 == 1){ch = '/';}
                        if(d1 == 1 && d2 == 0 && d3 == 1 && d4 == 0 && d5 == 1){ch = '6';}
                        if(d1 == 1 && d2 == 0 && d3 == 0 && d4 == 0 && d5 == 1){         }
                }
                if(ch != '\0')
                {
                        lcd.setCursor(j, k);
                        lcd.print(ch);
                        c[j] = ch;
                        j++;
                        if(j == 16 && k == 0)
                        {
                                j = 0;
                                k = 1;
                        }
                        if(j == 16 && k == 1)
                        {
                                lcd.clear();
                                for(l = 0; l < 16; l++)
                                {
                                        lcd.print(c[l]);
                                }
                                j = 0;
                                k = 1;
                        }
                }
                dsp = 0;
        }
        delay(5);
}