Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: 4DGL-uLCD-SE EthernetInterface mbed-rtos mbed
Revision 0:50e84db663a3, committed 2015-12-08
- Comitter:
- doubster
- Date:
- Tue Dec 08 09:15:15 2015 +0000
- Commit message:
- Final Push for Morse Code Encoder
Changed in this revision
diff -r 000000000000 -r 50e84db663a3 4DGL-uLCD-SE.lib --- /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
diff -r 000000000000 -r 50e84db663a3 EthernetInterface.lib --- /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
diff -r 000000000000 -r 50e84db663a3 main.cpp
--- /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";
+}
+
+
+
+
diff -r 000000000000 -r 50e84db663a3 mbed-rtos.lib --- /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
diff -r 000000000000 -r 50e84db663a3 mbed.bld --- /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