//45.45baud BAUDOT TELEMETRY BEACON v1.5

#include <stdio.h>

#define AFSK_OUT 12   //---- AFSK AUDIO OUTPUT
#define FSK_OUT  13   //---- TTL LEVEL OUTPUT
#define MARK     2295
#define SPACE    2125

const char ID[] = "DE JI3BNB /B";

boolean d1;
boolean d2;
boolean d3;
boolean d4;
boolean d5;
boolean sSq;
boolean sRd = 1;
boolean space;
boolean fig1;
int     fig2;
byte    i;
byte    j;
byte    idC;
char    ch;
char    sVal[9];

void setup()
{
        pinMode(FSK_OUT,  OUTPUT);
        pinMode(AFSK_OUT, OUTPUT);
        digitalWrite(FSK_OUT, HIGH);
        tone(AFSK_OUT, MARK);
        delay(700);
}

void sendFsk()
{
        //--start bit
        digitalWrite(FSK_OUT, LOW);
        tone(AFSK_OUT, SPACE);
        delay(22);
        //--bit1
        if(d1 == 1){
                digitalWrite(FSK_OUT, HIGH);
                tone(AFSK_OUT, MARK);
        }
        else{
                digitalWrite(FSK_OUT, LOW);
                tone(AFSK_OUT, SPACE);
        }
        delay(22);
        //--bit2
        if(d2 == 1){
                digitalWrite(FSK_OUT, HIGH);
                tone(AFSK_OUT, MARK);
        }
        else{
                digitalWrite(FSK_OUT, LOW);
                tone(AFSK_OUT, SPACE);
        }
        delay(22);
        //--bit3
        if(d3 == 1){
                digitalWrite(FSK_OUT, HIGH);
                tone(AFSK_OUT, MARK);
        }
        else{
                digitalWrite(FSK_OUT, LOW);
                tone(AFSK_OUT, SPACE);
        }
        delay(22);
        //--bit4
        if(d4 == 1){
                digitalWrite(FSK_OUT, HIGH);
                tone(AFSK_OUT, MARK);
        }
        else{
                digitalWrite(FSK_OUT, LOW);
                tone(AFSK_OUT, SPACE);
        }
        delay(22);
        //--bit5
        if(d5 == 1){
                digitalWrite(FSK_OUT, HIGH);
                tone(AFSK_OUT, MARK);
        }
        else{
                digitalWrite(FSK_OUT, LOW);
                tone(AFSK_OUT, SPACE);
        }
        delay(22);
        //--stop bit
        digitalWrite(FSK_OUT, HIGH);
        tone(AFSK_OUT, MARK);
        delay(33);
}

void chTable()
{
        fig2 = -1;
        if(ch == ' ')
        {
                d1 = 0; d2 = 0; d3 = 1; d4 = 0; d5 = 0;
                space = 1;
        }
        else if(ch == 'A'){d1 = 1; d2 = 1; d3 = 0; d4 = 0; d5 = 0; fig2 = 0;}
        else if(ch == 'B'){d1 = 1; d2 = 0; d3 = 0; d4 = 1; d5 = 1; fig2 = 0;}
        else if(ch == 'C'){d1 = 0; d2 = 1; d3 = 1; d4 = 1; d5 = 0; fig2 = 0;}
        else if(ch == 'D'){d1 = 1; d2 = 0; d3 = 0; d4 = 1; d5 = 0; fig2 = 0;}
        else if(ch == 'E'){d1 = 1; d2 = 0; d3 = 0; d4 = 0; d5 = 0; fig2 = 0;}
        else if(ch == 'F'){d1 = 1; d2 = 0; d3 = 1; d4 = 1; d5 = 0; fig2 = 0;}
        else if(ch == 'G'){d1 = 0; d2 = 1; d3 = 0; d4 = 1; d5 = 1; fig2 = 0;}
        else if(ch == 'H'){d1 = 0; d2 = 0; d3 = 1; d4 = 0; d5 = 1; fig2 = 0;}
        else if(ch == 'I'){d1 = 0; d2 = 1; d3 = 1; d4 = 0; d5 = 0; fig2 = 0;}
        else if(ch == 'J'){d1 = 1; d2 = 1; d3 = 0; d4 = 1; d5 = 0; fig2 = 0;}
        else if(ch == 'K'){d1 = 1; d2 = 1; d3 = 1; d4 = 1; d5 = 0; fig2 = 0;}
        else if(ch == 'L'){d1 = 0; d2 = 1; d3 = 0; d4 = 0; d5 = 1; fig2 = 0;}
        else if(ch == 'M'){d1 = 0; d2 = 0; d3 = 1; d4 = 1; d5 = 1; fig2 = 0;}
        else if(ch == 'N'){d1 = 0; d2 = 0; d3 = 1; d4 = 1; d5 = 0; fig2 = 0;}
        else if(ch == 'O'){d1 = 0; d2 = 0; d3 = 0; d4 = 1; d5 = 1; fig2 = 0;}
        else if(ch == 'P'){d1 = 0; d2 = 1; d3 = 1; d4 = 0; d5 = 1; fig2 = 0;}
        else if(ch == 'Q'){d1 = 1; d2 = 1; d3 = 1; d4 = 0; d5 = 1; fig2 = 0;}
        else if(ch == 'R'){d1 = 0; d2 = 1; d3 = 0; d4 = 1; d5 = 0; fig2 = 0;}
        else if(ch == 'S'){d1 = 1; d2 = 0; d3 = 1; d4 = 0; d5 = 0; fig2 = 0;}
        else if(ch == 'T'){d1 = 0; d2 = 0; d3 = 0; d4 = 0; d5 = 1; fig2 = 0;}
        else if(ch == 'U'){d1 = 1; d2 = 1; d3 = 1; d4 = 0; d5 = 0; fig2 = 0;}
        else if(ch == 'V'){d1 = 0; d2 = 1; d3 = 1; d4 = 1; d5 = 1; fig2 = 0;}
        else if(ch == 'W'){d1 = 1; d2 = 1; d3 = 0; d4 = 0; d5 = 1; fig2 = 0;}
        else if(ch == 'X'){d1 = 1; d2 = 0; d3 = 1; d4 = 1; d5 = 1; fig2 = 0;}
        else if(ch == 'Y'){d1 = 1; d2 = 0; d3 = 1; d4 = 0; d5 = 1; fig2 = 0;}
        else if(ch == 'Z'){d1 = 1; d2 = 0; d3 = 0; d4 = 0; d5 = 1; fig2 = 0;}
        else if(ch == '0'){d1 = 0; d2 = 1; d3 = 1; d4 = 0; d5 = 1; fig2 = 1;}
        else if(ch == '1'){d1 = 1; d2 = 1; d3 = 1; d4 = 0; d5 = 1; fig2 = 1;}
        else if(ch == '2'){d1 = 1; d2 = 1; d3 = 0; d4 = 0; d5 = 1; fig2 = 1;}
        else if(ch == '3'){d1 = 1; d2 = 0; d3 = 0; d4 = 0; d5 = 0; fig2 = 1;}
        else if(ch == '4'){d1 = 0; d2 = 1; d3 = 0; d4 = 1; d5 = 0; fig2 = 1;}
        else if(ch == '5'){d1 = 0; d2 = 0; d3 = 0; d4 = 0; d5 = 1; fig2 = 1;}
        else if(ch == '6'){d1 = 1; d2 = 0; d3 = 1; d4 = 0; d5 = 1; fig2 = 1;}
        else if(ch == '7'){d1 = 1; d2 = 1; d3 = 1; d4 = 0; d5 = 0; fig2 = 1;}
        else if(ch == '8'){d1 = 0; d2 = 1; d3 = 1; d4 = 0; d5 = 0; fig2 = 1;}
        else if(ch == '9'){d1 = 0; d2 = 0; d3 = 0; d4 = 1; d5 = 1; fig2 = 1;}
        else if(ch == '-'){d1 = 1; d2 = 1; d3 = 0; d4 = 0; d5 = 0; fig2 = 1;}
        else if(ch == '?'){d1 = 1; d2 = 0; d3 = 0; d4 = 1; d5 = 1; fig2 = 1;}
        else if(ch == ':'){d1 = 0; d2 = 1; d3 = 1; d4 = 1; d5 = 0; fig2 = 1;}
        else if(ch == '('){d1 = 1; d2 = 1; d3 = 1; d4 = 1; d5 = 0; fig2 = 1;}
        else if(ch == ')'){d1 = 0; d2 = 1; d3 = 0; d4 = 0; d5 = 1; fig2 = 1;}
        else if(ch == '.'){d1 = 0; d2 = 0; d3 = 1; d4 = 1; d5 = 1; fig2 = 1;}
        else if(ch == ','){d1 = 0; d2 = 0; d3 = 1; d4 = 1; d5 = 0; fig2 = 1;}
        else if(ch == '/'){d1 = 1; d2 = 0; d3 = 1; d4 = 1; d5 = 1; fig2 = 1;}
        else if(ch == '+'){d1 = 1; d2 = 0; d3 = 0; d4 = 0; d5 = 1; fig2 = 1;} //ITA2
        else
        {
                ch = ' ';
                d1 = 0; d2 = 0; d3 = 1; d4 = 0; d5 = 0;
                space = 1;
        }
}

void loop()
{
        //SEND SENSOR VALUES
        if(sSq == 0)
        {
                if( sRd == 1)
                {
                        if(i == 0)
                        {
                                sprintf(sVal, "A0: %04d", analogRead(0));
                        }
                        if(i == 1)
                        {
                                sprintf(sVal, "A1: %04d", analogRead(1));
                        }
                        if(i == 2)
                        {
                                sprintf(sVal, "A2: %04d", analogRead(2));
                        }
                        if(i == 3)
                        {
                                sprintf(sVal, "A3: %04d", analogRead(3));
                        }
                        sRd = 0;
                }
                ch = sVal[j];
                if(ch != '\0')
                {
                        chTable();
                        if(fig1 == 0 && fig2 == 1)
                        {
                                d1 = 1; d2 = 1; d3 = 0; d4 = 1; d5 = 1; //FIGURES
                        }
                        else if(fig1 == 1 && fig2 == 0)
                        {
                                d1 = 1; d2 = 1; d3 = 1; d4 = 1; d5 = 1; //LETTERS
                        }
                        else if(space == 1 && fig2 == 1)
                        {
                                d1 = 1; d2 = 1; d3 = 0; d4 = 1; d5 = 1; //FIGURES 
                        }
                        else
                        {
                                j++;
                        }
                        if(fig2 == 0 || fig2 == 1)
                        {
                                space = 0;
                                fig1 = fig2;
                        }
                        sendFsk();
                }
                if(ch == '\0')
                {
                        d1 = 0; d2 = 0; d3 = 1; d4 = 0; d5 = 0; //SPACE
                        space = 1;
                        sendFsk();
                        i++;
                        if(i == 4) //OVERFLOW
                        {
                                i = 0;
                                sSq = 1;
                        }
                        j = 0;
                        sRd = 1;
                }
        }
        //SEND ID
        if(sSq == 1)
        {
                if(idC < 9)
                {
                        d1 = 0; d2 = 0; d3 = 0; d4 = 1; d5 = 0; //CR
                        sendFsk();
                        d1 = 0; d2 = 1; d3 = 0; d4 = 0; d5 = 0; //LF
                        sendFsk();
                        sSq = 0;
                        j = 0;
                        delay(700);
                        idC++;
                }
                if(idC == 9)
                {
                        ch = ID[j];
                        if(ch != '\0')
                        {
                                chTable();
                                if(fig1 == 0 && fig2 == 1)
                                {
                                        d1 = 1; d2 = 1; d3 = 0; d4 = 1; d5 = 1; //FIGURES
                                }
                                else if(fig1 == 1 && fig2 == 0)
                                {
                                        d1 = 1; d2 = 1; d3 = 1; d4 = 1; d5 = 1; //LETTERS
                                }
                                else if(space == 1 && fig2 == 1)
                                {
                                        d1 = 1; d2 = 1; d3 = 0; d4 = 1; d5 = 1; //FIGURES 
                                }
                                else
                                {
                                        j++;
                                }
                                if(fig2 == 0 || fig2 == 1)
                                {
                                        space = 0;
                                        fig1 = fig2;
                                }
                                sendFsk();
                        }
                        if(ch == '\0')
                        {
                                d1 = 0; d2 = 0; d3 = 0; d4 = 1; d5 = 0; //CR
                                sendFsk();
                                d1 = 0; d2 = 1; d3 = 0; d4 = 0; d5 = 0; //LF
                                sendFsk();
                                sSq = 0;
                                j = 0;
                                delay(700);
                                idC = 0;
                        }
                }
        }
        delay(5);
}