Final Project for ECE 4180. Morse Code Encoder and Transmission

Dependencies:   4DGL-uLCD-SE EthernetInterface mbed-rtos mbed

main.cpp

Committer:
doubster
Date:
2015-12-08
Revision:
0:50e84db663a3

File content as of revision 0:50e84db663a3:

#include "mbed.h"
#include "uLCD_4DGL.h"
#include <time.h>
#include <string>
#include "EthernetInterface.h"
 
// Definitions for networking  
const char* ECHO_SERVER_ADDRESS = "10.0.0.32";
const int ECHO_SERVER_PORT = 7;
 
// uLCD
uLCD_4DGL uLCD(p9,p10,p11); // serial tx, serial rx, reset pin;

// Mbed Leds
DigitalOut myled1(LED1);
DigitalOut myled2(LED2);
DigitalOut myled3(LED3);
DigitalOut myled4(LED4);

// Push Buttons
DigitalIn pb1(p23);
DigitalIn pb2(p22);
DigitalIn pb3(p21);

// Function declarations
// Screen Declarations
void StartScreen();
void ClientServerScreen();
void HelpScreen();
void InputScreen();
void EncryptionScreen();
void DecryptionScreen();
void CaesarShiftScreen();
// Actual Functions
string MorseCode(string a);

// UDP Transmission Functions 
void Client(string message);
string Server();
// Cipher declarations 
// opt => 0 Encrypt opt => 1 Decrypt
string CaesarCipher(string word,int opt, int shift);
string PolybiusSquareCipher(string a,int opt);
string PolybiusTableTranslation(char letter);
string PolybiusTableLookup(string number);

int main() {
    
    // Create pullups
    pb1.mode(PullUp);
    pb2.mode(PullUp);
    pb3.mode(PullUp);
    
    // Constants 
    time_t start,end;
    double dif;
    string morseinput = "";
    string morsetranslation = "";
    string cipheredinput;
    string morsereceived = "";
    string cipherreceived = "";
    int clientserver;
    int firsttime = 0;
    int firsttimeserver = 0;
    string chosencipher = "";
    int shiftvalue = 0;
    bool inserting = true;
    EthernetInterface ethclient;
    EthernetInterface ethserver;
    const char * IPaddress = "10.0.0.32";  // 10.10.0.65
    const char * NetworkMask = "255.255.255.0";
    const char * Gateway = "10.0.0.1";   // 10.10.0.1
    
    // Welcome Screen
    StartScreen();
    
    // pb1 => up 
    // pb2 => down 
    // pb3 => right
    // 0 - Client
    // 1 - Server
    while(true)  // Infinite Loop. Restart at ClientServerScreen.
    {
        morseinput = "";
        morsetranslation = "";
        morsereceived = "";
        cipherreceived = "";
        clientserver = 0;
        uLCD.cls();
        ClientServerScreen();
        shiftvalue = 0;
        while(pb2 && pb1)
        {
        }
        
        if(!pb1) // pb1 was pressed, do Client Network
        {
            clientserver = 0;
        }
        else if(!pb2)
        {
            clientserver = 1; // pb2 was pressed, do Server Network
        }
        
        if(clientserver == 0)
        {
            uLCD.cls();
            if(firsttime==0)
            {
                HelpScreen();
            }
            uLCD.cls();
            InputScreen();
            // Input Morse Code below. pb1 to input. 
            // pb2 to move to the next step
            start = 0;
            end = 0;
            while(pb3)
            {
                
                if(!pb1) // Means a dot was inserted
                {
                    while(!pb1) // Need to wait until the button is released
                    {             
                    }
                    morseinput.append("."); 
                    inserting = true;  
                    time(&start);
                }
                else if(!pb2)
                {
                    while(!pb2) // Need to wait till release
                    {             
                    }
                    morseinput.append("-"); 
                    inserting = true;
                    time(&start); 
                }
                
                if(start !=0.0)
                {
                  time(&end);
                  dif = difftime(end,start);
                  if(dif>1)
                  {
                      string e = MorseCode(morseinput);
                      if(e!="error")
                      {
                          morsetranslation.append(e);
                          uLCD.printf("%s",e);
                      }
                      start = 0;
                      end = 0;
                      morseinput = "";
                    }
                }
            }
            
            uLCD.cls();
            EncryptionScreen();
            
            while(pb2 && pb1 && pb3)
            {
            }
            
            if(!pb1) // pb1 was pressed, do caesar cipher
            {
                uLCD.cls();
                CaesarShiftScreen();
                shiftvalue = 0;
                uLCD.locate(0,4);
                uLCD.printf("%02d",shiftvalue);
                while(pb3)
                {
                    if(!pb1) // Means go up one value
                    {
                        while(!pb1) // Need to wait until the button is released
                        {             
                        }
                        shiftvalue = shiftvalue + 1;
                        if(shiftvalue>25)
                        {
                            shiftvalue = 25;   
                        }
                        uLCD.locate(0,4);
                        uLCD.printf("%02d",shiftvalue);
                    }
                    if(!pb2) // Means go up one value
                    {
                        while(!pb2) // Need to wait until the button is released
                        {             
                        }
                        shiftvalue = shiftvalue - 1;
                        if(shiftvalue<0)
                        {
                            shiftvalue = 0;   
                        }
                        uLCD.locate(0,4);
                        uLCD.printf("%02d",shiftvalue);
                    }
                }
                cipheredinput = CaesarCipher(morsetranslation,0,shiftvalue);
                chosencipher = "Caesar Cipher";
            }
            else if(!pb2) // pb2 was pressed, do Polybius Square cipher
            {  
                cipheredinput = PolybiusSquareCipher(morsetranslation,0);
                chosencipher = "Polybius Sqre";
            }
            else if(!pb3)  // No Cipher
            {
                cipheredinput = morsetranslation;  
                chosencipher = "No Cipher";
            }
            wait(2);
            
            // Once the morse input comes in through here. 
            // Tell the user that we are about to send it all. 
            uLCD.cls();
            uLCD.printf("%s\n",chosencipher);
            uLCD.printf("Sending Value\n\n");
            uLCD.printf("\n%s\n",morsetranslation);
            uLCD.printf("\n%s\n",cipheredinput);
            wait(3);
            
            if(firsttime == 0)
            {
                ethclient.init();
                firsttime = 1;
            }

            ethclient.connect();
            UDPSocket sock;
            sock.init();
            Endpoint echo_server;
            echo_server.set_address(ECHO_SERVER_ADDRESS, ECHO_SERVER_PORT);
            char out_buffer[1024];
            strncpy(out_buffer, cipheredinput.c_str(), sizeof(out_buffer));
            out_buffer[sizeof(out_buffer) - 1] = 0;
            //uLCD.printf("\Client IP Address is %s\n", ethclient.getIPAddress());
            //wait(4);
            sock.sendTo(echo_server, out_buffer, sizeof(out_buffer));
            sock.close();
            ethclient.disconnect();
            // technically the eth should still be connected
            uLCD.cls();
            uLCD.printf("Message has been sent");
            wait(2);
        }
        else
        {
            uLCD.cls();    
            uLCD.printf("Receiving...");  

            if(firsttimeserver == 0)
            {
                //uLCD.printf("first time server");
                ethserver.init(IPaddress, NetworkMask, Gateway); 
                firsttimeserver = 1;
            }
            //uLCD.printf("initialized");
            ethserver.connect();
            UDPSocket server;
            server.bind(ECHO_SERVER_PORT);
            Endpoint client;
            char buffer[256];
            //uLCD.printf("\Server IP Address is %s\n", ethserver.getIPAddress());
            string message;
            int n = server.receiveFrom(client, buffer, sizeof(buffer));
            buffer[n] = '\0';
            
            string message2(buffer);
            server.close();
            ethserver.disconnect();          
            uLCD.cls();
            uLCD.printf("Message %s",message2);
            wait(3);
            morsereceived = message2;
            // string morsereceived = "";
            // string cipherreceived = "";
            
            // After Reception, User will have 2 options to decipher
            // Engima or Caesar. 
            uLCD.cls();
            DecryptionScreen();
            while(pb2 && pb1 && pb3)
            {
            }
            
            if(!pb1) // pb1 was pressed, do caesar cipher
            {
                uLCD.cls();
                CaesarShiftScreen();
                shiftvalue = 0;
                uLCD.locate(0,4);
                uLCD.printf("%02d",shiftvalue);
                while(pb3)
                {
                    if(!pb1) // Means go up one value
                    {
                        while(!pb1) // Need to wait until the button is released
                        {             
                        }
                        shiftvalue = shiftvalue + 1;
                        if(shiftvalue>25)
                        {
                            shiftvalue = 25;   
                        }
                        uLCD.locate(0,4);
                        uLCD.printf("%02d",shiftvalue);
                    }
                    if(!pb2) // Means go up one value
                    {
                        while(!pb2) // Need to wait until the button is released
                        {             
                        }
                        shiftvalue = shiftvalue - 1;
                        if(shiftvalue<0)
                        {
                            shiftvalue = 0;   
                        }
                        uLCD.locate(0,4);
                        uLCD.printf("%02d",shiftvalue);
                    }
                }
                cipherreceived = CaesarCipher(morsereceived,1,shiftvalue); // Second input = 1, for decryption
            }
            else if(!pb2) // pb2 was pressed, do Polybius Square Cipher
            {  
                cipherreceived = PolybiusSquareCipher(morsereceived,1);  // Second input = 1, for decryption
            }
            else if(!pb3)
            {
                cipherreceived = morsereceived;   
            }
            uLCD.cls();
            uLCD.printf("Decryption\n\n");
            uLCD.printf("%s\n",morsereceived);
            uLCD.printf("%s\n",cipherreceived);
            wait(5);
        }
    }
}


// Start Screen to show Welcome Page
void StartScreen()
{
    uLCD.printf("Welcome to the Morse Code Enconder and Transmitter.\n\n\n");
    wait(4);    
}

// Screen to choose between Client and Servers
void ClientServerScreen()
{
    uLCD.printf("Choose an option:\n\n");
    uLCD.printf("1 - Transmit\n");
    uLCD.printf("2 - Receive\n");
    //uLCD.printf("3 - Checkers\n");
}

// Screen 2
void HelpScreen()
{
    uLCD.printf("Up => . \n\n");
    uLCD.printf("Down => - \n\n");
    uLCD.printf("Right => Submit\n");
    wait(2);
}

// Screen 3
void InputScreen()
{
    uLCD.printf("Input Morse Code\n");   
}

// Screen 4
void EncryptionScreen()
{
    uLCD.printf("Choose encryption:\n\n");
    uLCD.printf("1 - Caesar Cipher\n");
    uLCD.printf("2 - Polybius Sqre\n");
    uLCD.printf("3 - No cipher\n");
}

void DecryptionScreen()
{
    uLCD.printf("Choose decryption:\n\n");
    uLCD.printf("1 - Caesar Cipher\n");
    uLCD.printf("2 - Polybius Sqre\n");
    uLCD.printf("3 - No cipher\n");
}

void CaesarShiftScreen() {
    uLCD.printf("Choose a shift value\n");
    uLCD.printf("UP and DOWN");
}

// Returns the proper character based on the inputed morse code
string MorseCode(string a)
{
    //uLCD.printf("%s",a);
    if(a == ".-") { return "A";}
    if(a == "-...") { return "B";}
    if(a == "-.-.") { return "C";}
    if(a == "-..") { return "D";}
    if(a == ".") { return "E";}
    if(a == "..-.") { return "F";}
    if(a == "--.") { return "G";}
    if(a == "....") { return "H";}
    if(a == "..") { return "I";}
    if(a == ".---") { return "J";}
    if(a == "-.-") { return "K";}
    if(a == ".-..") { return "L";}
    if(a == "--") { return "M";}
    if(a == "-.") { return "N";}
    if(a == "---") { return "O";}
    if(a == ".--.") { return "P";}
    if(a == "--.-") { return "Q";}
    if(a == ".-.") { return "R";}
    if(a == "...") { return "S";}
    if(a == "-") { return "T";}
    if(a == "..-") { return "U";}
    if(a == "...-") { return "V";}
    if(a == ".--") { return "W";}
    if(a == "-..-") { return "X";}
    if(a == "-.--") { return "Y";}
    if(a == "--..") { return "Z";}
    if(a == ".----") { return "1";}
    if(a == "..---") { return "2";}
    if(a == "...--") { return "3";}
    if(a == "....-") { return "4";}
    if(a == ".....") { return "5";}
    if(a == "-....") { return "6";}
    if(a == "--...") { return "7";}
    if(a == "---..") { return "8";}
    if(a == "----.") { return "9";}
    if(a == "-----") { return "0";}
    return "error";
}

// Cipher Codes by Ishita 



// Find the length of the string
// Loop through it, and replace each a[i] with its equivalent that is 3 letters later. 
// For that will have to loop through Alphabet and find the position of said letter. 
// Then increment. So hopefully there is a isin(alphabet,"A) -> that returns the index, position etc.
string CaesarCipher(string word, int opt, int shift)
{
    string alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    if(opt == 0) // Encrypt
    {   
        string encrypted = "";
        for (int x = 0; x < word.length(); x++) {
            char c = word[x];
            int ind = alphabet.find(c);
            ind = (ind + shift) % 26;
            encrypted += alphabet[ind];
        }
        return encrypted; 
    }  else if (opt == 1) { //Decrypt
        string decrypted = "";
        for (int x = 0; x < word.length(); x++) {
            char c = word[x];
            int ind = alphabet.find(c);
            ind = (ind - shift) % 26;
            decrypted += alphabet[ind];
        }
        return decrypted;
    } else {
        return "Error";
    }
}

//Polybius Square cipher
string PolybiusSquareCipher(string word,int opt)
{
    string number = "";
    string numbers = "";
    if(opt == 0) // Encrypt
    {   
        string encrypted = "";
        string rows = "";
        string cols = "";
        for (int x = 0; x < word.length(); x++) {
            char c = word[x];
            number = PolybiusTableTranslation(c);
            rows += number[0];
            cols += number[1]; 
        }
        numbers = rows + cols;
        for (int y = 0; y < numbers.length(); y = y + 2) {
            encrypted += PolybiusTableLookup(numbers.substr(y,2));
        }
        return encrypted; 
    }  else if (opt == 1) { //Decrypt
        string decrypted = "";
        for (int x = 0; x < word.length(); x++) {
            char c = word[x];
            number = PolybiusTableTranslation(c);
            numbers += number;
        }
        int length = numbers.length()/2;
        for (int y = 0; y < length; y++) {
            string newNum = "";
            newNum += numbers[y];
            newNum += numbers[y + length];
            decrypted += PolybiusTableLookup(newNum);
        }
        return decrypted;
    } else {
        return "Error";
    }
}



string PolybiusTableTranslation(char letter) {
    if (letter == 'A') {return "11";}
    if (letter == 'B') {return "12";}
    if (letter == 'C') {return "13";}
    if (letter == 'D') {return "14";}
    if (letter == 'E') {return "15";}
    if (letter == 'F') {return "21";}
    if (letter == 'G') {return "22";}
    if (letter == 'H') {return "23";}
    if (letter == 'I') {return "24";}
    if (letter == 'J') {return "24";}
    if (letter == 'K') {return "25";}
    if (letter == 'L') {return "31";}
    if (letter == 'M') {return "32";}
    if (letter == 'N') {return "33";}
    if (letter == 'O') {return "34";}
    if (letter == 'P') {return "35";}
    if (letter == 'Q') {return "41";}
    if (letter == 'R') {return "42";}
    if (letter == 'S') {return "43";}
    if (letter == 'T') {return "44";}
    if (letter == 'U') {return "45";}
    if (letter == 'V') {return "51";}
    if (letter == 'W') {return "52";}
    if (letter == 'X') {return "53";}
    if (letter == 'Y') {return "54";}
    if (letter == 'Z') {return "55";}
    
    return "error";
}

string PolybiusTableLookup(string number) {
    if (number == "11") {return "A";}  
    if (number == "12") {return "B";}  
    if (number == "13") {return "C";}
    if (number == "14") {return "D";}
    if (number == "15") {return "E";}
    if (number == "21") {return "F";}
    if (number == "22") {return "G";}
    if (number == "23") {return "H";}
    if (number == "24") {return "I/J";}
    if (number == "25") {return "K";}
    if (number == "31") {return "L";}
    if (number == "32") {return "M";}
    if (number == "33") {return "N";}
    if (number == "34") {return "O";}
    if (number =="35") {return "P";}
    if (number == "41") {return "Q";}
    if (number == "42") {return "R";}
    if (number == "43") {return "S";}
    if (number == "44") {return "T";}
    if (number == "45") {return "U";}
    if (number == "51") {return "V";}
    if (number == "52") {return "W";}
    if (number == "53") {return "X";}
    if (number == "54") {return "Y";}
    if (number == "55") {return "Z";}
 
    return "error";
}