Final Project for ECE 4180. Morse Code Encoder and Transmission

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

Files at this revision

API Documentation at this revision

Comitter:
doubster
Date:
Tue Dec 08 09:15:15 2015 +0000
Commit message:
Final Push for Morse Code Encoder

Changed in this revision

4DGL-uLCD-SE.lib Show annotated file Show diff for this revision Revisions of this file
EthernetInterface.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed-rtos.lib Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/4DGL-uLCD-SE.lib	Tue Dec 08 09:15:15 2015 +0000
@@ -0,0 +1,1 @@
+http://developer.mbed.org/users/4180_1/code/4DGL-uLCD-SE/#e39a44de229a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/EthernetInterface.lib	Tue Dec 08 09:15:15 2015 +0000
@@ -0,0 +1,1 @@
+http://developer.mbed.org/users/mbed_official/code/EthernetInterface/#2fc406e2553f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Tue Dec 08 09:15:15 2015 +0000
@@ -0,0 +1,583 @@
+#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";
+}
+
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed-rtos.lib	Tue Dec 08 09:15:15 2015 +0000
@@ -0,0 +1,1 @@
+http://developer.mbed.org/users/mbed_official/code/mbed-rtos/#12552ef4e980
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Tue Dec 08 09:15:15 2015 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/9296ab0bfc11
\ No newline at end of file