From d5fa5c46e8f6ffdcd28e295ff039c9b54d3363e1 Mon Sep 17 00:00:00 2001 From: Prakhar <106583668+PrakharG8651@users.noreply.github.com> Date: Thu, 15 May 2025 16:13:17 +0530 Subject: [PATCH 1/8] Add files via upload --- Week0/taskweek0.ino | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Week0/taskweek0.ino diff --git a/Week0/taskweek0.ino b/Week0/taskweek0.ino new file mode 100644 index 0000000..e69de29 From b698182cd6c56580add1ecd5347e2179755786c6 Mon Sep 17 00:00:00 2001 From: PrakharG8651 Date: Thu, 15 May 2025 20:11:32 +0530 Subject: [PATCH 2/8] Add files --- Week0/taskweek0.ino | 0 Week0/taskweek0/taskweek0.ino | 53 +++++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+) delete mode 100644 Week0/taskweek0.ino create mode 100644 Week0/taskweek0/taskweek0.ino diff --git a/Week0/taskweek0.ino b/Week0/taskweek0.ino deleted file mode 100644 index e69de29..0000000 diff --git a/Week0/taskweek0/taskweek0.ino b/Week0/taskweek0/taskweek0.ino new file mode 100644 index 0000000..268b720 --- /dev/null +++ b/Week0/taskweek0/taskweek0.ino @@ -0,0 +1,53 @@ + +int pot1=A0; +int pot2=A1; +int bz1=3,bz2=4,bz3=5; +int white=8,green=9,yellow=10,orange=11,red=12; +int timer=0,led=0; +void setup() +{ + Serial.begin(9600); + pinMode(pot1, INPUT); + pinMode(bz1, OUTPUT); + pinMode(bz2, OUTPUT); + pinMode(bz3, OUTPUT); + + pinMode(pot2, INPUT); + pinMode(white, OUTPUT); + pinMode(green, OUTPUT); + pinMode(yellow, OUTPUT); + pinMode(orange, OUTPUT); + pinMode(red, OUTPUT); + digitalWrite(white, HIGH); + timer=analogRead(pot2); +} +int time=0; +void loop() +{ + if(time%100==0){ + digitalWrite(bz3,LOW); + digitalWrite(bz2,LOW); + digitalWrite(bz1,LOW); + int fre=analogRead(pot1); + if(fre<=341){ + digitalWrite(bz1,HIGH); + } + else if(fre<=682){ + digitalWrite(bz2,HIGH); + } + else{ + digitalWrite(bz3,HIGH); + } + } + if(timer==0){ + timer=analogRead(pot2); + digitalWrite(led+8,LOW); + led=(led+1)%5; + digitalWrite(led+8,HIGH); + } + time++; + timer--; + if(time>10000)time-=10000; + delay(1); +} +//https://www.tinkercad.com/things/f5dLJcZCVPw/editel?returnTo=%2Fdashboard \ No newline at end of file From 2e89042cca68c58f10990ea2c3dcb7ac3967aff2 Mon Sep 17 00:00:00 2001 From: PrakharG8651 Date: Sat, 17 May 2025 23:28:18 +0530 Subject: [PATCH 3/8] Assigment 5 --- Week0/Enigma-Machine Project | 1 + 1 file changed, 1 insertion(+) create mode 160000 Week0/Enigma-Machine Project diff --git a/Week0/Enigma-Machine Project b/Week0/Enigma-Machine Project new file mode 160000 index 0000000..3bed2fc --- /dev/null +++ b/Week0/Enigma-Machine Project @@ -0,0 +1 @@ +Subproject commit 3bed2fc00737043b97a7f43b1c083f98577b9fd9 From 6cf84de24d4b9496ca1767d360bf20c97bf28172 Mon Sep 17 00:00:00 2001 From: PrakharG8651 Date: Sat, 17 May 2025 23:35:12 +0530 Subject: [PATCH 4/8] Correct submission --- Week0/Enigma.js | 197 +++++++++++++++++++++++++++++++++++++++ Week0/EnigmaConstants.js | 144 ++++++++++++++++++++++++++++ 2 files changed, 341 insertions(+) create mode 100644 Week0/Enigma.js create mode 100644 Week0/EnigmaConstants.js diff --git a/Week0/Enigma.js b/Week0/Enigma.js new file mode 100644 index 0000000..2e7f286 --- /dev/null +++ b/Week0/Enigma.js @@ -0,0 +1,197 @@ +/* + * File: Enigma.js + * --------------- + * This program implements a graphical simulation of the Enigma machine. + */ + +import "graphics"; +import "EnigmaConstants.js"; + +/* Main program */ + +function Enigma() { + var enigmaImage = GImage("EnigmaTopView.png"); + var gw = GWindow(enigmaImage.getWidth(), enigmaImage.getHeight()); + gw.add(enigmaImage); + runEnigmaSimulation(gw); +} + +// You are responsible for filling in the rest of the code. Your +// implementation of runEnigmaSimulation should perform the +// following operations: +// +// 1. Create an object that encapsulates the state of the Enigma machine. +// 2. Create and add graphical objects that sit on top of the image. +// 3. Add listeners that forward mouse events to those objects. +var enigma={}; +function rotorRotation(enigma){ + var rotor = enigma.rotors[2]; + enigma.rotorOffset[2] = (enigma.rotorOffset[2] + 1) % 26; + var index = enigma.rotorOffset[2]; + rotor.setRotor(index); + if (index === 0) { + rotor = enigma.rotors[1]; + enigma.rotorOffset[1] = (enigma.rotorOffset[1] + 1) % 26; + index = enigma.rotorOffset[1]; + rotor.setRotor(index); + if (index === 0) { + rotor = enigma.rotors[0]; + enigma.rotorOffset[0] = (enigma.rotorOffset[0] + 1) % 26; + index = enigma.rotorOffset[0]; + rotor.setRotor(index); + } + } +} +function encryptLetter(letter, enigma) { + var index = letter.charCodeAt(0) - 65; + + // Forward pass through rotors + for (var i = 2; i >= 0; i--) { + index = (index + enigma.rotorOffset[i]) % 26; + var c = ROTOR_PERMUTATIONS[i].charCodeAt(index) - 65; + index = c; + } + + // Reflector + index = REFLECTOR_PERMUTATION.charCodeAt(index) - 65; + + // Reverse pass through rotors + for (var i = 0; i < 3; i++) { + var shiftedIndex = (index + enigma.rotorOffset[i]) % 26; + var letterAtIndex = String.fromCharCode(shiftedIndex + 65); + index = ROTOR_PERMUTATIONS[i].indexOf(letterAtIndex); + index = (index - enigma.rotorOffset[i] + 26) % 26; + } + + rotorRotation(enigma); + return String.fromCharCode(index + 65); +} + +function runEnigmaSimulation(gw) { + enigma.keys = []; + enigma.lamps = []; + enigma.currKey = null; + enigma.currLamp = null; + enigma.rotors = []; + enigma.rotorOffset = []; + gw.addEventListener("mousedown", function(e) { + for(var i=0;i<3;i++){ + if(enigma.rotors[i].contains(e.getX(), e.getY())){ + var rotor = enigma.rotors[i]; + enigma.rotorOffset[i] = (enigma.rotorOffset[i] + 1) % 26; + var index = enigma.rotorOffset[i]; + rotor.setRotor(index); + break; + } + } + for(var i=0;i<26;i++){ + if(enigma.keys[i].contains(e.getX(), e.getY())){ + if(enigma.currLamp !==null){ + enigma.currLamp.turnOff(); + } + enigma.currKey = enigma.keys[i]; + enigma.currKey.mousedownAction(enigma); + break; + } + } + + }); + + gw.addEventListener("mouseup", function(e) { + if (enigma.currKey !== null) { + var letter = enigma.currKey.letter; + var encryptedLetter = encryptLetter(letter,enigma); + var lampIndex = encryptedLetter.charCodeAt(0) - 65; + enigma.currLamp = enigma.lamps[lampIndex]; + enigma.currLamp.turnOn(); + enigma.currKey.mouseupAction(enigma); + } + }); + + for(var i=0;i<3;i++){ + var loc = ROTOR_LOCATIONS[i]; + var rotor = new GRect(-ROTOR_WIDTH/2, -ROTOR_HEIGHT/2, ROTOR_WIDTH, ROTOR_HEIGHT); + rotor.setFilled(true); + rotor.setFillColor(ROTOR_BGCOLOR); + var label = new GLabel("A", -9, ROTOR_LABEL_DY); + label.setFont(ROTOR_FONT); + label.setColor(ROTOR_COLOR); + var rotorSetting = new GCompound(); + rotorSetting.add(rotor); + rotorSetting.add(label); + rotorSetting.label = label; + enigma.rotors.push(rotorSetting); + enigma.rotorOffset.push(0); + gw.add(rotorSetting,loc.x,loc.y); + rotorSetting.setRotor = function(index) { + var letter = String.fromCharCode(index + 65); + this.label.setLabel(letter); + this.label.setColor(ROTOR_COLOR); + }; + } + for(var i=0;i<26;i++){ + var letter = String.fromCharCode(i + 65); + (function(i){ + //Key Setup + var loc = KEY_LOCATIONS[i]; + var outer = new GOval(-KEY_RADIUS, -KEY_RADIUS, KEY_RADIUS * 2, KEY_RADIUS * 2); + outer.setFilled(true); + outer.setFillColor(KEY_BORDER_COLOR); + + var inner = new GOval(-KEY_RADIUS+KEY_BORDER, -KEY_RADIUS+KEY_BORDER,(KEY_RADIUS - KEY_BORDER) * 2, (KEY_RADIUS - KEY_BORDER) * 2); + inner.setFilled(true); + inner.setFillColor(KEY_BGCOLOR); + + var label = new GLabel(letter, -9, KEY_LABEL_DY); + label.setFont(KEY_FONT); + label.setColor(KEY_UP_COLOR); + + var key = new GCompound(); + key.add(outer); + key.add(inner); + key.add(label); + key.letter = letter; + gw.add(key,loc.x,loc.y); + enigma.keys.push(key); + key.mousedownAction = function(enigma) { + label.setColor(KEY_DOWN_COLOR); + }; + + key.mouseupAction = function(enigma) { + label.setColor(KEY_UP_COLOR); + enigma.currKey = null; + }; + + })(i); + + (function(i){ + //Lamp Setup + var loc = LAMP_LOCATIONS[i]; + var outer = new GOval(-LAMP_RADIUS, -LAMP_RADIUS, LAMP_RADIUS * 2, LAMP_RADIUS * 2); + outer.setFilled(true); + outer.setFillColor(LAMP_BORDER_COLOR); + var inner = new GOval(-LAMP_RADIUS+KEY_BORDER, -LAMP_RADIUS+KEY_BORDER,(LAMP_RADIUS - KEY_BORDER) * 2, (LAMP_RADIUS - KEY_BORDER) * 2); + inner.setFilled(true); + inner.setFillColor(LAMP_BGCOLOR); + var label = new GLabel(letter, -9, LAMP_LABEL_DY); + label.setFont(LAMP_FONT); + label.setColor(LAMP_OFF_COLOR); + var lamp = new GCompound(); + lamp.add(outer); + lamp.add(inner); + lamp.add(label); + lamp.label = label; + lamp.turnOn = function() { + this.label.setColor(LAMP_ON_COLOR); + this.setColor(LAMP_ON_COLOR); + }; + + lamp.turnOff = function() { + this.label.setColor(LAMP_OFF_COLOR); + this.setColor(LAMP_BORDER_COLOR); + }; + gw.add(lamp,loc.x,loc.y); + enigma.lamps.push(lamp); + })(i); + } +} diff --git a/Week0/EnigmaConstants.js b/Week0/EnigmaConstants.js new file mode 100644 index 0000000..7064b8d --- /dev/null +++ b/Week0/EnigmaConstants.js @@ -0,0 +1,144 @@ +/* + * File: EnigmaConstants.js + * ------------------------ + * This file defines the constants used in the Enigma simulator. + */ + +/* + * The early German Enigma machines include three rotors, which advance + * at different speeds. The rotor on the right is the "fast" rotor, + * which advances on every keystroke. The rotor in the middle is the + * "medium" rotor, which advances when the fast rotor has made a + * complete revolution. The rotor at the left is the "slow" rotor, + * which advances when the medium rotor has made a complete cycle. + * The ROTOR_PERMUTATION array lists the three rotors from left to + * right: the slow rotor, the medium rotor, and the fast rotor. + * + * Each rotor implements a letter-substitution cipher, which is + * represented by a string of 26 uppercase letters that shows how + * the letters in the alphabet are mapped to new letters as the + * internal signal flows across the rotor from right to left. For + * example, the slow rotor corresponds to the following mapping + * when it is in its initial position: + * + * A B C D E F G H I J K L M N O P Q R S T U V W X Y Z + * | | | | | | | | | | | | | | | | | | | | | | | | | | + * E K M F L G D Q V Z N T O W Y H X U S P A I B R C J + */ + +const ROTOR_PERMUTATIONS = [ + "EKMFLGDQVZNTOWYHXUSPAIBRCJ", /* Permutation for slow rotor */ + "AJDKSIRUXBLHWTMCQGZNPYFVOE", /* Permutation for medium rotor */ + "BDFHJLCPRTXVZNYEIWGAKMUSQO" /* Permutation for fast rotor */ +]; + +/* Constants that control the display of the current rotor setting */ + +const ROTOR_BGCOLOR = "#BBAA77"; /* Background color for the rotor */ +const ROTOR_WIDTH = 24; /* Width of the setting indicator */ +const ROTOR_HEIGHT = 26; /* Height of the setting indicator */ +const ROTOR_COLOR = "Black"; /* Text color of the rotor */ +const ROTOR_LABEL_DY = 9; /* Offset from center to baseline */ +const ROTOR_FONT = "Helvetica Neue-24"; + +/* This array specifies the coordinates of each rotor display */ + +const ROTOR_LOCATIONS = [ + { x: 244, y: 95 }, + { x: 329, y: 95 }, + { x: 412, y: 95 } +]; + +/* + * To the left of the slow rotor, the Enigma machine includes a + * component called the "reflector," which implements a fixed + * permutation that remains unchanged as the rotors advance. The + * constant REFLECTOR_PERMUTATION defines the mapping of the reflector. + * Note that the reflector is symmetric. If A is transformed to I, + * then I is transformed to A. + */ + +const REFLECTOR_PERMUTATION = "IXUHFEZDAOMTKQJWNSRLCYPBVG"; + +/* Constants that define the keys on the Enigma keyboard */ + +const KEY_RADIUS = 24; /* Outer radius of a key in pixels */ +const KEY_BORDER = 3; /* Width of the key border */ +const KEY_BORDER_COLOR = "#CCCCCC"; /* Fill color of the key border */ +const KEY_BGCOLOR = "#666666"; /* Background color of the key */ +const KEY_UP_COLOR = "#CCCCCC"; /* Text color when the key is up */ +const KEY_DOWN_COLOR = "#CC3333"; /* Text color when the key is down */ +const KEY_LABEL_DY = 10; /* Offset from center to baseline */ +const KEY_FONT = "Helvetica Neue-Bold-28"; + +/* This array determines the coordinates of a key for each letter index */ + +const KEY_LOCATIONS = [ + { x: 140, y: 566 } /* A */, + { x: 471, y: 640 } /* B */, + { x: 319, y: 639 } /* C */, + { x: 294, y: 567 } /* D */, + { x: 268, y: 495 } /* E */, + { x: 371, y: 567 } /* F */, + { x: 448, y: 567 } /* G */, + { x: 523, y: 567 } /* H */, + { x: 650, y: 496 } /* I */, + { x: 598, y: 567 } /* J */, + { x: 674, y: 567 } /* K */, + { x: 699, y: 641 } /* L */, + { x: 624, y: 641 } /* M */, + { x: 547, y: 640 } /* N */, + { x: 725, y: 497 } /* O */, + { x: 92, y: 639 } /* P */, + { x: 115, y: 494 } /* Q */, + { x: 345, y: 495 } /* R */, + { x: 217, y: 566 } /* S */, + { x: 420, y: 496 } /* T */, + { x: 574, y: 496 } /* U */, + { x: 395, y: 639 } /* V */, + { x: 192, y: 494 } /* W */, + { x: 242, y: 639 } /* X */, + { x: 168, y: 639 } /* Y */, + { x: 497, y: 496 } /* Z */ +]; + +/* Constants that define the lamps above the Enigma keyboard */ + +const LAMP_RADIUS = 23; /* Radius of a lamp in pixels */ +const LAMP_BORDER_COLOR = "#111111"; /* Line color of the lamp border */ +const LAMP_BGCOLOR = "#333333"; /* Background color of the lamp */ +const LAMP_OFF_COLOR = "#666666"; /* Text color when the lamp is off */ +const LAMP_ON_COLOR = "#FFFF99"; /* Text color when the lamp is on */ +const LAMP_LABEL_DY = 9; /* Offset from center to baseline */ +const LAMP_FONT = "Helvetica Neue-Bold-24"; + +/* This array determines the coordinates of a lamp for each letter index */ + +const LAMP_LOCATIONS = [ + { x: 144, y: 332 } /* A */, + { x: 472, y: 403 } /* B */, + { x: 321, y: 402 } /* C */, + { x: 296, y: 333 } /* D */, + { x: 272, y: 265 } /* E */, + { x: 372, y: 333 } /* F */, + { x: 448, y: 334 } /* G */, + { x: 524, y: 334 } /* H */, + { x: 650, y: 266 } /* I */, + { x: 600, y: 335 } /* J */, + { x: 676, y: 335 } /* K */, + { x: 700, y: 403 } /* L */, + { x: 624, y: 403 } /* M */, + { x: 549, y: 403 } /* N */, + { x: 725, y: 267 } /* O */, + { x: 94, y: 401 } /* P */, + { x: 121, y: 264 } /* Q */, + { x: 347, y: 265 } /* R */, + { x: 220, y: 332 } /* S */, + { x: 423, y: 265 } /* T */, + { x: 574, y: 266 } /* U */, + { x: 397, y: 402 } /* V */, + { x: 197, y: 264 } /* W */, + { x: 246, y: 402 } /* X */, + { x: 170, y: 401 } /* Y */, + { x: 499, y: 265 } /* Z */ +]; From 131cbe84554fa758d55d8622fdcf82b24804a204 Mon Sep 17 00:00:00 2001 From: PrakharG8651 Date: Mon, 19 May 2025 22:34:28 +0530 Subject: [PATCH 5/8] Improvement --- Week0/Enigma.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/Week0/Enigma.js b/Week0/Enigma.js index 2e7f286..1bcae31 100644 --- a/Week0/Enigma.js +++ b/Week0/Enigma.js @@ -44,7 +44,6 @@ function rotorRotation(enigma){ } function encryptLetter(letter, enigma) { var index = letter.charCodeAt(0) - 65; - // Forward pass through rotors for (var i = 2; i >= 0; i--) { index = (index + enigma.rotorOffset[i]) % 26; @@ -57,12 +56,10 @@ function encryptLetter(letter, enigma) { // Reverse pass through rotors for (var i = 0; i < 3; i++) { - var shiftedIndex = (index + enigma.rotorOffset[i]) % 26; - var letterAtIndex = String.fromCharCode(shiftedIndex + 65); + var letterAtIndex = String.fromCharCode(index + 65); index = ROTOR_PERMUTATIONS[i].indexOf(letterAtIndex); index = (index - enigma.rotorOffset[i] + 26) % 26; } - rotorRotation(enigma); return String.fromCharCode(index + 65); } From 82f479ff5383451d1afe690205c77bfc212788c2 Mon Sep 17 00:00:00 2001 From: PrakharG8651 Date: Thu, 22 May 2025 23:43:32 +0530 Subject: [PATCH 6/8] Affine_Cipher --- Week0/.vscode/c_cpp_properties.json | 18 +++++++ Week0/.vscode/launch.json | 24 +++++++++ Week0/.vscode/settings.json | 59 +++++++++++++++++++++ Week0/affine_cipher.cpp | 76 ++++++++++++++++++++++++++++ Week0/affine_cipher.exe | Bin 0 -> 54203 bytes 5 files changed, 177 insertions(+) create mode 100644 Week0/.vscode/c_cpp_properties.json create mode 100644 Week0/.vscode/launch.json create mode 100644 Week0/.vscode/settings.json create mode 100644 Week0/affine_cipher.cpp create mode 100644 Week0/affine_cipher.exe diff --git a/Week0/.vscode/c_cpp_properties.json b/Week0/.vscode/c_cpp_properties.json new file mode 100644 index 0000000..f912847 --- /dev/null +++ b/Week0/.vscode/c_cpp_properties.json @@ -0,0 +1,18 @@ +{ + "configurations": [ + { + "name": "windows-gcc-x86", + "includePath": [ + "${workspaceFolder}/**" + ], + "compilerPath": "C:/MinGW/bin/gcc.exe", + "cStandard": "${default}", + "cppStandard": "${default}", + "intelliSenseMode": "windows-gcc-x86", + "compilerArgs": [ + "" + ] + } + ], + "version": 4 +} \ No newline at end of file diff --git a/Week0/.vscode/launch.json b/Week0/.vscode/launch.json new file mode 100644 index 0000000..108e0f6 --- /dev/null +++ b/Week0/.vscode/launch.json @@ -0,0 +1,24 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "C/C++ Runner: Debug Session", + "type": "cppdbg", + "request": "launch", + "args": [], + "stopAtEntry": false, + "externalConsole": true, + "cwd": "c:/F/week0/ENIGMA/Week0", + "program": "c:/F/week0/ENIGMA/Week0/build/Debug/outDebug", + "MIMode": "gdb", + "miDebuggerPath": "gdb", + "setupCommands": [ + { + "description": "Enable pretty-printing for gdb", + "text": "-enable-pretty-printing", + "ignoreFailures": true + } + ] + } + ] +} \ No newline at end of file diff --git a/Week0/.vscode/settings.json b/Week0/.vscode/settings.json new file mode 100644 index 0000000..bb879da --- /dev/null +++ b/Week0/.vscode/settings.json @@ -0,0 +1,59 @@ +{ + "C_Cpp_Runner.cCompilerPath": "gcc", + "C_Cpp_Runner.cppCompilerPath": "g++", + "C_Cpp_Runner.debuggerPath": "gdb", + "C_Cpp_Runner.cStandard": "", + "C_Cpp_Runner.cppStandard": "", + "C_Cpp_Runner.msvcBatchPath": "C:/Program Files/Microsoft Visual Studio/VR_NR/Community/VC/Auxiliary/Build/vcvarsall.bat", + "C_Cpp_Runner.useMsvc": false, + "C_Cpp_Runner.warnings": [ + "-Wall", + "-Wextra", + "-Wpedantic", + "-Wshadow", + "-Wformat=2", + "-Wcast-align", + "-Wconversion", + "-Wsign-conversion", + "-Wnull-dereference" + ], + "C_Cpp_Runner.msvcWarnings": [ + "/W4", + "/permissive-", + "/w14242", + "/w14287", + "/w14296", + "/w14311", + "/w14826", + "/w44062", + "/w44242", + "/w14905", + "/w14906", + "/w14263", + "/w44265", + "/w14928" + ], + "C_Cpp_Runner.enableWarnings": true, + "C_Cpp_Runner.warningsAsError": false, + "C_Cpp_Runner.compilerArgs": [], + "C_Cpp_Runner.linkerArgs": [], + "C_Cpp_Runner.includePaths": [], + "C_Cpp_Runner.includeSearch": [ + "*", + "**/*" + ], + "C_Cpp_Runner.excludeSearch": [ + "**/build", + "**/build/**", + "**/.*", + "**/.*/**", + "**/.vscode", + "**/.vscode/**" + ], + "C_Cpp_Runner.useAddressSanitizer": false, + "C_Cpp_Runner.useUndefinedSanitizer": false, + "C_Cpp_Runner.useLeakSanitizer": false, + "C_Cpp_Runner.showCompilationTime": false, + "C_Cpp_Runner.useLinkTimeOptimization": false, + "C_Cpp_Runner.msvcSecureNoWarnings": false +} \ No newline at end of file diff --git a/Week0/affine_cipher.cpp b/Week0/affine_cipher.cpp new file mode 100644 index 0000000..49e7673 --- /dev/null +++ b/Week0/affine_cipher.cpp @@ -0,0 +1,76 @@ +#include +#include +using namespace std; + +string toUpperCase(string str) { + for (char &c :str) { + c = toupper(c); + } + return str; +} + +string affineCipher(string text, int a, int b) { + string result = ""; + for (char c : text) { + char encryptedChar = char(((a * c + b) % 128)); + result += encryptedChar; + } + return result; +} + +bool coprime(int a, int b) { + while (b != 0) { + int t = b; + b = a % b; + a = t; + } + return a == 1; +} + +int getInverse(int a) { + for (int i = 1; i < 128; i++) { + if ((a * i) % 128 == 1) { + return i; + } + } + return -1; +} + +string decipher(string text, int a, int b) { + string result = ""; + for (char c : text) { + char encryptedChar = char(((c - b + 128) * a) % 128); + result += encryptedChar; + } + return result; +} + +int main(){ + string text; + int a,b; + cout<<"Enter the text to encrypt: "; + cin>>text; + cout<<"Enter the value of a: "; + cin>>a; + a%=128; + if(a<0) + a+=128; + if(coprime(a, 128)==false){ + cout<<"a and 128 are not coprime. Cannot encrypt."<>b; + b%=128; + if(b<0) + b+=128; + string enc = affineCipher(text, a, b); + cout<<"Encrypted text: "<M3K_Mg%5EN?OCM1$K^8%>gB`*_*h9qY0@S-BY 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�=h{TBpB8!6 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

@8t_|8rveT2L$YD4_`hJUi0I!Ce}ooJ(=YR6S? z-7+BBGjV~l0g&sX(uwK`KaU=8|Js+$kxM|3#qxl2I@&wnt4REV?yhJ_@l=@C*Mca7sO|@q zK7u7kBOuz`O6c<_Aav-Z_zoa$gNA*8JZ~tM6D#p823gkvvd2(66@XANbk2={pja`j z;4zMq6@wE3gl0%O)mH)8XpsI*P8Eyu3Lu)bM7drEq%2A$i_h${6$YJu2b@iYevqc~ zd!tmOe=Z=jA}`twK`H?ehZ|!XdNM$H#-jl^G^W?bNIwC@W#Ie@o031Ek+juBCuXH&D?IoRtQuHGpWVbI8E)Bp~96DwT_#44BLH z4d9$H@Oc{$!qe+30tg*C#06%L8mO)ZL~C0@`YnKT87!6s$ZA8m?ji_g3wmU$21I*0 zDfl!2LWhnM0K_=1dx{_ieRiu7B{0_sP z3Z)ubO1Ch1c|%h%e%cTVGHu9R-$e89yKWPWUe#KKjwFvQ7hkJOefZ&r z!4Uft6lE-IY4Fy1H#FdL5&Xw%t^Qg?&08Sj3$6UKi@?puP@1b~$C6xZ1Tpq51+`=C zdf*|Z8FR!BO>+6~Os<4WLj&=-P2DeCq%zX+^E`F`Z=SsX8-4#zB=D8vRP24R5N2-j z)2=5?-omolD^b|vsiDmy>y)*8GLK9xmDfV!c&naQ=$GBrHxX+(e%5* z61TKq&lY2W{?y!~1z4(A(VtL8omVZvpOO8axd@rGVauPj6fqJqGq9PHg72r+@@U8R zuHswW%h-TQuJfX|Mp(fHRB}3RvP3{UjAv|SOiWfR~A*!w7mu&mj_jgmww+Zx8nO3_;EP8W!esm#QnDh4kJbz>NujF zc0a==YNVWyO*Sy5`16uzeqBQ=|NeIr(A|&2hUu&bjj1N`R#E4DF_(%A8>`Oz$;6otsGr+X@^XAQ+r@mVj zHD!y>>qoV7i-K{(I_xM%TlDGM@?|YxvT*~utc>}jLwOZG_XDNMDm+zr^fjv@e9ct- ztcc1<-%xH8rb1YB|2Q}nex65Ru2rEz#%%qUl}Ykqzfhv`A5AY_gb{nYY3iu^*MS*| zDb|40EbP`7-AFJioyiqrZ|}#o;Zjubd>22_66*bP!5jlWu_2cxcf>#vO{cyYMQU0% z3Nl$gx&#B3(;fku>?_$>PTSc{#tMyKu&sU@SuFf|$xGHD*vsQBuzk%(O1+*+$UFl|IBiZ;qdd8CnH z$4~BgW3)GFB+ZR=)I9WNvKC9hvUsnWrETz5KbQtfj|i&NUJ2|ekVPQQ@hmAU;T|Hw z4aQ)jkZAr6o6^#@W(sXbOw`rQtdAi7~` zRGuF3Q6b!)v~bL;y&5|r(1d}zj28CQX05w}Pwb^DK2*QXi;sOF1{K9@JWI|UV_2@) z$bM2d-259R3ubRDM`|oJ) z$mE!8`LK(cMgq-&jKg#pVIDzb$uGbuU=> zHOi&$&#M&;vSZwtB7~+fmavS27PT8PFA06ZZk-U#yAsUk`12Vt!oax0yU|dW#ulX3 z6b)`bb_F|(>SFa+p?MSS^@#lW6tSQ~y+0Ev62&(*#eM8Y>kyw~hZeMnN{sakd+QP_ zEMdg-qTDCcht<5=je{+EfzsFjRV)9QJA1CyXq!*#j;uZxlkv$}5n^ag9uw(fjqu;z zOc=E*HqwQ$#_Z;}%0V9l zGwOp~8sutGk{c85i)*e1-g zugGxfM%To1o{^_nP3VEJ@n_y2Sc^8sK1763Eu`||j_8mKLtUT0dBjK;%}eVXE<5Ei zF5hUDR~IR`+)tXmUVgmFYwb#7ylChRcnu-TvT4N=(h8kv#1@r8V|1|lt$YD7hoDcTnS6jsT=%~*7vj-SXC3P zQXv%h{Cr8lP==9f5L~M;)5j{Sqiybq5^1KQz zr8|o5P_av${52wVJ+j_E-x!Cehr$=(sf)V8TF^RQA~%k^3^Nx+8?udbuTSc){ug56 bm6Uwsoa2hjr%o1my{oTaYK?BRJ>3641DjJ= literal 0 HcmV?d00001 From 0c0d6aca2335b7ee3cdcf8af01377fda01de235f Mon Sep 17 00:00:00 2001 From: PrakharG8651 Date: Sat, 31 May 2025 00:10:17 +0530 Subject: [PATCH 7/8] Logic.c done --- Week0/affine_cipher.exe | Bin 54203 -> 0 bytes Week0/logic.c | 363 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 363 insertions(+) delete mode 100644 Week0/affine_cipher.exe create mode 100644 Week0/logic.c diff --git a/Week0/affine_cipher.exe b/Week0/affine_cipher.exe deleted file mode 100644 index 149e52bdea62a847324582acffd64f217b27e811..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 54203 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�=h{TBpB8!6 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

@8t_|8rveT2L$YD4_`hJUi0I!Ce}ooJ(=YR6S? z-7+BBGjV~l0g&sX(uwK`KaU=8|Js+$kxM|3#qxl2I@&wnt4REV?yhJ_@l=@C*Mca7sO|@q zK7u7kBOuz`O6c<_Aav-Z_zoa$gNA*8JZ~tM6D#p823gkvvd2(66@XANbk2={pja`j z;4zMq6@wE3gl0%O)mH)8XpsI*P8Eyu3Lu)bM7drEq%2A$i_h${6$YJu2b@iYevqc~ zd!tmOe=Z=jA}`twK`H?ehZ|!XdNM$H#-jl^G^W?bNIwC@W#Ie@o031Ek+juBCuXH&D?IoRtQuHGpWVbI8E)Bp~96DwT_#44BLH z4d9$H@Oc{$!qe+30tg*C#06%L8mO)ZL~C0@`YnKT87!6s$ZA8m?ji_g3wmU$21I*0 zDfl!2LWhnM0K_=1dx{_ieRiu7B{0_sP z3Z)ubO1Ch1c|%h%e%cTVGHu9R-$e89yKWPWUe#KKjwFvQ7hkJOefZ&r z!4Uft6lE-IY4Fy1H#FdL5&Xw%t^Qg?&08Sj3$6UKi@?puP@1b~$C6xZ1Tpq51+`=C zdf*|Z8FR!BO>+6~Os<4WLj&=-P2DeCq%zX+^E`F`Z=SsX8-4#zB=D8vRP24R5N2-j z)2=5?-omolD^b|vsiDmy>y)*8GLK9xmDfV!c&naQ=$GBrHxX+(e%5* z61TKq&lY2W{?y!~1z4(A(VtL8omVZvpOO8axd@rGVauPj6fqJqGq9PHg72r+@@U8R zuHswW%h-TQuJfX|Mp(fHRB}3RvP3{UjAv|SOiWfR~A*!w7mu&mj_jgmww+Zx8nO3_;EP8W!esm#QnDh4kJbz>NujF zc0a==YNVWyO*Sy5`16uzeqBQ=|NeIr(A|&2hUu&bjj1N`R#E4DF_(%A8>`Oz$;6otsGr+X@^XAQ+r@mVj zHD!y>>qoV7i-K{(I_xM%TlDGM@?|YxvT*~utc>}jLwOZG_XDNMDm+zr^fjv@e9ct- ztcc1<-%xH8rb1YB|2Q}nex65Ru2rEz#%%qUl}Ykqzfhv`A5AY_gb{nYY3iu^*MS*| zDb|40EbP`7-AFJioyiqrZ|}#o;Zjubd>22_66*bP!5jlWu_2cxcf>#vO{cyYMQU0% z3Nl$gx&#B3(;fku>?_$>PTSc{#tMyKu&sU@SuFf|$xGHD*vsQBuzk%(O1+*+$UFl|IBiZ;qdd8CnH z$4~BgW3)GFB+ZR=)I9WNvKC9hvUsnWrETz5KbQtfj|i&NUJ2|ekVPQQ@hmAU;T|Hw z4aQ)jkZAr6o6^#@W(sXbOw`rQtdAi7~` zRGuF3Q6b!)v~bL;y&5|r(1d}zj28CQX05w}Pwb^DK2*QXi;sOF1{K9@JWI|UV_2@) z$bM2d-259R3ubRDM`|oJ) z$mE!8`LK(cMgq-&jKg#pVIDzb$uGbuU=> zHOi&$&#M&;vSZwtB7~+fmavS27PT8PFA06ZZk-U#yAsUk`12Vt!oax0yU|dW#ulX3 z6b)`bb_F|(>SFa+p?MSS^@#lW6tSQ~y+0Ev62&(*#eM8Y>kyw~hZeMnN{sakd+QP_ zEMdg-qTDCcht<5=je{+EfzsFjRV)9QJA1CyXq!*#j;uZxlkv$}5n^ag9uw(fjqu;z zOc=E*HqwQ$#_Z;}%0V9l zGwOp~8sutGk{c85i)*e1-g zugGxfM%To1o{^_nP3VEJ@n_y2Sc^8sK1763Eu`||j_8mKLtUT0dBjK;%}eVXE<5Ei zF5hUDR~IR`+)tXmUVgmFYwb#7ylChRcnu-TvT4N=(h8kv#1@r8V|1|lt$YD7hoDcTnS6jsT=%~*7vj-SXC3P zQXv%h{Cr8lP==9f5L~M;)5j{Sqiybq5^1KQz zr8|o5P_av${52wVJ+j_E-x!Cehr$=(sf)V8TF^RQA~%k^3^Nx+8?udbuTSc){ug56 bm6Uwsoa2hjr%o1my{oTaYK?BRJ>3641DjJ= diff --git a/Week0/logic.c b/Week0/logic.c new file mode 100644 index 0000000..9cee3c2 --- /dev/null +++ b/Week0/logic.c @@ -0,0 +1,363 @@ +#include +#include +#include +#include + +// Number of rotors and alphabet size +#define NUM_ROTORS 3 +#define ALPHABET_SIZE 26 + +// Rotor configurations (historical Enigma I rotors) +char rotors[NUM_ROTORS][ALPHABET_SIZE + 1] = { + "EKMFLGDQVZNTOWYHXUSPAIBRCJ", // Rotor I + "AJDKSIRUXBLHWTMCQGZNPYFVOE", // Rotor II + "BDFHJLCPRTXVZNYEIWGAKMUSQO" // Rotor III +}; + +// Reflector configuration (historical Enigma reflector B) +char reflector[ALPHABET_SIZE + 1] = "YRUHQSLDPXNGOKMIEBFZCWVJAT"; + +// Rotor offset positions (can be modified by user) +volatile int rotor_offsets[NUM_ROTORS] = {0, 0, 0}; // Right, middle, left + +// Turnover positions for each rotor (when the next rotor steps) +// Q, E, V for rotors I, II, III respectively (0-indexed) +int turnovers[NUM_ROTORS] = {'Q' - 'A', 'E' - 'A', 'V' - 'A'}; + +// Plugboard pairings (initialized to no swaps) +int pairings[ALPHABET_SIZE] = {0}; +int sketcherboard[ALPHABET_SIZE]={0}; +// Input and output buffers +char input_buffer[256] = {0}; +char output_buffer[256] = {0}; +bool sketcher_board_on=false; + +// To track stepping of rotors +int stepping[NUM_ROTORS] = {0, 0, 0}; + +// Convert a character to its 0-based index in the alphabet (A=0, B=1, etc.) +int char_to_index(char c) { + // Return the index of the letter in the alphabet (A=0, B=1, etc.) + return toupper(c) - 'A'; +} + +// Convert an index back to a character +char index_to_char(int index) { + // Convert an index (0-25) back to a character (A-Z) + return 'A' + (index % ALPHABET_SIZE); +} + +// Find the inverse mapping for a given rotor +int index_inverse(int c, int rotor) { + // This function finds the position in the rotor where the given + // character (as index + 'A') appears + int i; + for (i = 0; i < ALPHABET_SIZE; i++) { + if (rotors[rotor][i] == c + 'A') { + return i; + } + } + return -1; // Error condition +} + +// Map an input through a rotor from right to left +int rotor_r_to_l(int input, int rotor) { + // Apply offset to determine which contact is hit + int idx = (input + rotor_offsets[rotor]) % ALPHABET_SIZE; + + // Determine which contact it maps to, based on the rotor's wiring + int mapped = rotors[rotor][idx] - 'A'; + + // Adjust for the offset to get the index of the output contact + int res = mapped - rotor_offsets[rotor]; + + // Ensure the result is within range 0-25 + if (res < 0) res += ALPHABET_SIZE; + if (res >= ALPHABET_SIZE) res -= ALPHABET_SIZE; + + return res; +} + +// Map an input through a rotor from left to right +int rotor_l_to_r(int input, int rotor) { + // Apply offset to determine which contact is hit + int idx = (input + rotor_offsets[rotor]) % ALPHABET_SIZE; + + // Find the inverse mapping (which contact on the right maps to this one) + int inverse = index_inverse(idx, rotor); + + // Adjust for the offset to get the index of the output contact + int res = inverse - rotor_offsets[rotor]; + + // Ensure the result is within range 0-25 + if (res < 0) res += ALPHABET_SIZE; + if (res >= ALPHABET_SIZE) res -= ALPHABET_SIZE; + + return res; +} + +// Map an input through the reflector +int reflect(int input) { + // The reflector simply uses the lookup table to map the input + // to its corresponding output + return reflector[input] - 'A'; +} + +// Initialize the plugboard with given pairs +void initialize_plugboard(const char *pairs) { + // Reset the plugboard to no swaps + for (int i = 0; i < ALPHABET_SIZE; i++) { + pairings[i] = 0; + } + + // Process each pair + for (int i = 0; i < strlen(pairs); i += 3) { + if (pairs[i+1] == ' ' && i+2 < strlen(pairs)) { + // Extract the two letters to be paired + int first = toupper(pairs[i]) - 'A'; + int second = toupper(pairs[i+2]) - 'A'; + + if (first >= 0 && first < ALPHABET_SIZE && + second >= 0 && second < ALPHABET_SIZE) { + // Set up the bidirectional swap + pairings[first] = second - first; + pairings[second] = first - second; + } + } + } +} + +void initialize_sketcherboard(const char *pairs) { + // Reset the plugboard to no swaps + for (int i = 0; i < ALPHABET_SIZE; i++) { + pairings[i] = 0; + } + + // Process each pair + for (int i = 0; i < strlen(pairs); i += 3) { + if (pairs[i+1] == ' ' && i+2 < strlen(pairs)) { + // Extract the two letters to be paired + int first = toupper(pairs[i]) - 'A'; + int second = toupper(pairs[i+2]) - 'A'; + + if (first >= 0 && first < ALPHABET_SIZE && + second >= 0 && second < ALPHABET_SIZE) { + // Set up the bidirectional swap + sketcherboard[first] = second - first; + sketcherboard[second] = first - second; + } + } + } +} +// Swap a letter through the plugboard +int plug_swap(int input) { + // Add the offset (which may be 0 if no swap) to the input + if(sketcher_board_on) return input+sketcherboard[input]; + return input+pairings[input]; +} + +// Advance the rotors +void spin_rotors() { + if(rotor_offsets[0]==turnovers[0]){ + if(rotor_offsets[1]==turnovers[1]){ + rotor_offsets[2]=(rotor_offsets[2]+1)%ALPHABET_SIZE; + } + rotor_offsets[1]=(rotor_offsets[1]+1)%ALPHABET_SIZE; + } + else if(rotor_offsets[1]==turnovers[1]){ + rotor_offsets[2]=(rotor_offsets[2]+1)%ALPHABET_SIZE; + rotor_offsets[1]=(rotor_offsets[1]+1)%ALPHABET_SIZE; + } + rotor_offsets[0]=(rotor_offsets[0]+1)%ALPHABET_SIZE; +} + +// Simplified protothread structure for demonstration +struct pt { + int yield_state; +}; + +#define PT_BEGIN(pt) int yield_state = 0; switch(yield_state) { case 0: +#define PT_END(pt) } return 0; +#define PT_YIELD_TIME_msec(pt, ms) do { pt->yield_state = __LINE__; return 1; case __LINE__: } while(0); +#define PT_EXIT(pt) do { return 0; } while(0) + +// Encrypt a message using the PT_Encrypt thread +int PT_Encrypt(struct pt *pt, const char *input, char *output) { + PT_BEGIN(pt); + + int encrypt_idx = 0; + memset(output, '\0', 256); + + while (input[encrypt_idx] != '\0') { + // Skip non-alphabetic characters + if (!isalpha(input[encrypt_idx])) { + output[encrypt_idx] = input[encrypt_idx]; + encrypt_idx++; + continue; + } + + int res; + // Apply plugboard to the input character + res = plug_swap(char_to_index(input[encrypt_idx])); + + // Advance the rotors before encryption (once per character) + spin_rotors(); + + // Through the rotors from right to left + res = rotor_r_to_l(res, 0); // Right rotor + res = rotor_r_to_l(res, 1); // Middle rotor + res = rotor_r_to_l(res, 2); // Left rotor + + // Through the reflector + res = reflect(res); + + // Back through the rotors from left to right + res = rotor_l_to_r(res, 2); // Left rotor + res = rotor_l_to_r(res, 1); // Middle rotor + res = rotor_l_to_r(res, 0); // Right rotor + + // Apply plugboard again + res = plug_swap(res); + + // Store the result + output[encrypt_idx] = index_to_char(res); + + encrypt_idx++; + + // Yield to allow other threads to run + // PT_YIELD_TIME_msec(pt, 1000); + } + + // Terminate the thread + PT_EXIT(pt); + + PT_END(pt); +} + +// Simple encrypt character function (without threading) +char encrypt_char(char c) { + // If not a letter, return unchanged + if(c==' ' && sketcher_board_on){ + printf("Press-\n1)To continue using sketcher board\n2)To stop using sketcher board\n"); + int choice; + scanf("%d",&choice); + if(choice==2){ + sketcher_board_on=false; + } + } + if (!isalpha(c)) return c; + + // Convert to uppercase + c = toupper(c); + + // Advance the rotors + spin_rotors(); + + // Apply encryption logic + int res = char_to_index(c); + res = plug_swap(res); + res = rotor_r_to_l(res, 0); + res = rotor_r_to_l(res, 1); + res = rotor_r_to_l(res, 2); + res = reflect(res); + res = rotor_l_to_r(res, 2); + res = rotor_l_to_r(res, 1); + res = rotor_l_to_r(res, 0); + res = plug_swap(res); + + return index_to_char(res); +} + +// Simple encrypt message function (without threading) +void encrypt_message(const char *input, char *output) { + int i = 0; + while (input[i] != '\0') { + output[i] = encrypt_char(input[i]); + i++; + } + output[i] = '\0'; +} + +// Print current rotor positions +void print_rotor_status() { + printf("Rotor positions (L,M,R): %c %c %c\n", + index_to_char(rotor_offsets[2]), + index_to_char(rotor_offsets[1]), + index_to_char(rotor_offsets[0])); +} + +// Set rotor positions +void set_rotor_positions(char left, char middle, char right) { + rotor_offsets[2] = char_to_index(left); + rotor_offsets[1] = char_to_index(middle); + rotor_offsets[0] = char_to_index(right); +} + +// Example main function to demonstrate usage +int main() { + char command[10]; + char text[256]; + char plugboard_config[256] = ""; + char sketcher_board[256]=""; + struct pt pt_encrypt; + + printf("=== Enigma Machine Simulator ===\n\n"); + + while (true) { + print_rotor_status(); + printf("\nCommands:\n"); + printf("1: Set rotor positions\n"); + printf("2: Set plugboard configuration\n"); + printf("3: Encrypt a message\n"); + printf("4:Add sketcherboard settings\n"); + printf("5: Quit\n"); + printf("\nEnter command: "); + + scanf("%s", command); + if (command[0] == '1') { + char left, middle, right; + printf("Enter rotor positions (left middle right, e.g., 'A B C'): "); + scanf(" %c %c %c", &left, &middle, &right); + set_rotor_positions(left, middle, right); + printf("Rotor positions set to: %c %c %c\n\n", left, middle, right); + } + else if (command[0] == '2') { + printf("Enter plugboard pairs (e.g., 'A B C D' to swap A-B and C-D): "); + getchar(); // Clear newline + fgets(plugboard_config, sizeof(plugboard_config), stdin); + initialize_plugboard(plugboard_config); + printf("Plugboard configuration set\n\n"); + } + else if (command[0] == '3') { + printf("Enter message to encrypt: "); + getchar(); // Clear newline + fgets(text, sizeof(text), stdin); + text[strcspn(text, "\n")] = '\0'; // Remove newline + + encrypt_message(text, output_buffer); + printf("Encrypted message: %s\n\n", output_buffer); + + // Reset rotor positions for demonstration + printf("Note: Rotors have advanced during encryption.\n"); + + } + else if(command[0]=='4'){ + printf("Write the sketcher board setting.(e.g., 'A B C D' to swap A-B and C-D): "); + getchar(); // Clear newline + fgets(sketcher_board, sizeof(sketcher_board), stdin); + sketcher_board_on=true; + initialize_sketcherboard(sketcher_board); + printf("Sketcherboard configuration set\n\n"); + } + else if (command[0] == '5') { + printf("Exiting Enigma simulator.\n"); + break; + } + else { + printf("Invalid command. Please try again.\n\n"); + } + + } + + return 0; +} From 00317a4660a3f6a3916c0c27b4ccae9134a01b86 Mon Sep 17 00:00:00 2001 From: PrakharG8651 Date: Sun, 1 Jun 2025 17:44:18 +0530 Subject: [PATCH 8/8] Jupiter notebook done --- Week0/gui.ipynb | 257 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 257 insertions(+) create mode 100644 Week0/gui.ipynb diff --git a/Week0/gui.ipynb b/Week0/gui.ipynb new file mode 100644 index 0000000..3440fe9 --- /dev/null +++ b/Week0/gui.ipynb @@ -0,0 +1,257 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "7d52f190", + "metadata": {}, + "source": [ + "# Welcome to the Enigma GUI Interface Project! 🧩🔐\n", + "\n", + "In this project, we'll use Python and a library called PySimpleGUI to build a Graphical User Interface (GUI) that connects to an Enigma-like encryption machine (connected via a microcontroller).\n", + "\n", + "We'll learn:\n", + "- How GUI layouts work 🧱\n", + "- How to send messages to a serial device 💬\n", + "- How to interact with buttons, sliders, listboxes, and inputs 👆\n", + "\n", + "References :\n", + " - [PySimpleGUI Doc](https://docs.pysimplegui.com/en/latest/)\n", + " - [Tutoral link](https://www.tutorialspoint.com/pysimplegui/)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "1f9cbe16", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: PySimpleGUI in c:\\users\\p9415\\appdata\\local\\programs\\python\\python313\\lib\\site-packages (5.0.10)\n", + "Requirement already satisfied: rsa in c:\\users\\p9415\\appdata\\local\\programs\\python\\python313\\lib\\site-packages (from PySimpleGUI) (4.9.1)\n", + "Requirement already satisfied: pyasn1>=0.1.3 in c:\\users\\p9415\\appdata\\local\\programs\\python\\python313\\lib\\site-packages (from rsa->PySimpleGUI) (0.6.1)\n", + "Requirement already satisfied: serial in c:\\users\\p9415\\appdata\\local\\programs\\python\\python313\\lib\\site-packages (0.0.97)\n", + "Requirement already satisfied: future>=0.17.1 in c:\\users\\p9415\\appdata\\local\\programs\\python\\python313\\lib\\site-packages (from serial) (1.0.0)\n", + "Requirement already satisfied: pyyaml>=3.13 in c:\\users\\p9415\\appdata\\local\\programs\\python\\python313\\lib\\site-packages (from serial) (6.0.2)\n", + "Requirement already satisfied: iso8601>=0.1.12 in c:\\users\\p9415\\appdata\\local\\programs\\python\\python313\\lib\\site-packages (from serial) (2.1.0)\n" + ] + } + ], + "source": [ + "# If you're using Google Colab or a local setup, run this line to install PySimpleGUI\n", + "!pip install PySimpleGUI\n", + "!pip install serial" + ] + }, + { + "cell_type": "markdown", + "id": "368a8fab", + "metadata": {}, + "source": [ + "Install Required Libraries" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "97c9b5e1", + "metadata": {}, + "outputs": [], + "source": [ + "import PySimpleGUI as sg\n", + "import serial\n", + "import time" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "50e5133d", + "metadata": {}, + "outputs": [], + "source": [ + "ser = serial.Serial('COM4', 115200, timeout=0.001)" + ] + }, + { + "cell_type": "markdown", + "id": "fddcb6aa", + "metadata": {}, + "source": [ + "### Task (for the code below):\n", + "\n", + "- Add three more text input sections for rotor1, rotor2, and rotor3.\n", + "\n", + "- Add a listbox to choose letters for the rotors from A" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "0384647a", + "metadata": {}, + "outputs": [], + "source": [ + "font_spec = 'Courier 24 bold'\n", + "heading_color = '#2FB8AD'\n", + "alphabet_list = list(\"ABCDEFGHIJKLMNOPQRSTUVWXYZ\")\n", + "\n", + "# This defines how the GUI looks\n", + "layout = [\n", + " [sg.Text('Please Input Characters', background_color=heading_color)],\n", + " [sg.InputText('', key='pic_input'), sg.Button('Send', key='pic_send')],\n", + " [sg.Text('Rotor 1', background_color=heading_color),sg.Text(' '*54),\n", + " sg.Listbox(values=alphabet_list, size=(10, 1), enable_events=True, key='offset_1')],\n", + " [sg.InputText(key=\"rotor_1\"),sg.Button('Send', key='rotor1_send')],\n", + " [sg.Text('Rotor 2', background_color=heading_color),sg.Text(' '*54),\n", + " sg.Listbox(values=alphabet_list, size=(10, 1), enable_events=True, key='offset_2')],\n", + " [sg.InputText(key='rotor_2'),sg.Button('Send', key='rotor2_send')],\n", + " [sg.Text('Rotor 3', background_color=heading_color),sg.Text(' '*54),\n", + " sg.Listbox(values=alphabet_list, size=(10, 1), enable_events=True, key='offset_3')],\n", + " [sg.InputText(key='rotor_3'),sg.Button('Send', key='rotor3_send')],\n", + " [sg.Checkbox('Enable Reset', key='r_en'),sg.Button('Reset', key='rtg')],\n", + "]" + ] + }, + { + "cell_type": "markdown", + "id": "9d4c40f4", + "metadata": {}, + "source": [ + "### Apply Custom Theme to GUI\n", + "Task: Try changing colors! Make your GUI colorful! " + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "f37e74cf", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sg.SetOptions(\n", + " background_color='#9FB8AD',\n", + " text_element_background_color='#9FB8AD',\n", + " element_background_color='#475841',\n", + " button_color=('white', '#475841'),\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "284faa59", + "metadata": {}, + "outputs": [], + "source": [ + "##Create and show the window\n", + "window = sg.Window('ECE4760 Interface', layout, finalize=True)\n", + "while True:\n", + " event, values = window.read(timeout=20)\n", + " \n", + " if event == sg.WIN_CLOSED or event == 'Exit':\n", + " break\n", + "\n", + " # Send typed message to PIC\n", + " if event == 'pic_send':\n", + " message = values['pic_input']\n", + " print(message)\n", + " #ser.write((message + '\\r').encode())\n", + " if event == 'rotor1_send':\n", + " settings= values['rotor_1']\n", + " print(settings)\n", + " if event == 'rotor2_send':\n", + " settings= values['rotor_2']\n", + " print(settings)\n", + " if event == 'rotor3_send':\n", + " settings= values['rotor_3']\n", + " print(settings)\n", + " if event == 'rtg' and values['r_en']:\n", + " print('reset done')\n", + " ser.send_break()\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0ae99922", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "a84bef37", + "metadata": {}, + "source": [ + "**Task**: Add event handling for `rotor1_send`, `rotor2_send`, and `rotor3_send`. Also, read serial data and show it in the `console`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cbed1be6", + "metadata": {}, + "outputs": [], + "source": [ + "# Reset only if checkbox is selected and RESET button clicked\n", + "if event == 'rtg' and values['r_en']:\n", + " ser.send_break() # sends a reset signal to the PIC" + ] + }, + { + "cell_type": "markdown", + "id": "e18bdfde", + "metadata": {}, + "source": [ + "**Task**: Add a checkbox called 'Enable Reset' and a button called 'RESET PIC'." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d8026f60", + "metadata": {}, + "outputs": [], + "source": [ + "# Close window after loop ends\n", + "window.close()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.13.2" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}