From 809dc5c06c6b31b20654d62b8cfcab91da4e0025 Mon Sep 17 00:00:00 2001
From: Jack Holdsworth <Dooster12@Hotmail.co.uk>
Date: Sun, 7 May 2023 13:25:25 +0100
Subject: [PATCH] final changes

---
 README.md        | 199 +++++++++++++++++++++++++++--------------------
 Schematic.fzz    | Bin 0 -> 42841 bytes
 calculator.py    |  95 +++++++++++++---------
 features.py      |  15 ++++
 keyboard.py      |  33 --------
 keyboardClass.py |   6 ++
 rpn.py           |   1 -
 stackClass.py    |  12 +--
 test.py          |   5 --
 9 files changed, 203 insertions(+), 163 deletions(-)
 create mode 100644 Schematic.fzz
 create mode 100644 features.py
 delete mode 100644 keyboard.py
 delete mode 100644 test.py

diff --git a/README.md b/README.md
index 2a59059..e426f2b 100644
--- a/README.md
+++ b/README.md
@@ -1,92 +1,125 @@
 # Digital Design - Calculator
+![image](src/uwe.png)
 
+**Module Name:** Digital Design - Calculator
 
+**Module Code:** UFCFCS‑30‑2
 
-## Getting started
+**Module Leader Name:** Benedict R. Gaster
 
-To make it easy for you to get started with GitLab, here's a list of recommended next steps.
-
-Already a pro? Just edit this README.md and make it your own. Want to make it easy? [Use the template at the bottom](#editing-this-readme)!
-
-## Add your files
-
-- [ ] [Create](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#create-a-file) or [upload](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#upload-a-file) files
-- [ ] [Add files using the command line](https://docs.gitlab.com/ee/gitlab-basics/add-file.html#add-a-file-using-the-command-line) or push an existing Git repository with the following command:
-
-```
-cd existing_repo
-git remote add origin https://gitlab.uwe.ac.uk/jo2-holdsworth/digital-design-calculator.git
-git branch -M main
-git push -uf origin main
-```
-
-## Integrate with your tools
-
-- [ ] [Set up project integrations](https://gitlab.uwe.ac.uk/jo2-holdsworth/digital-design-calculator/-/settings/integrations)
-
-## Collaborate with your team
-
-- [ ] [Invite team members and collaborators](https://docs.gitlab.com/ee/user/project/members/)
-- [ ] [Create a new merge request](https://docs.gitlab.com/ee/user/project/merge_requests/creating_merge_requests.html)
-- [ ] [Automatically close issues from merge requests](https://docs.gitlab.com/ee/user/project/issues/managing_issues.html#closing-issues-automatically)
-- [ ] [Enable merge request approvals](https://docs.gitlab.com/ee/user/project/merge_requests/approvals/)
-- [ ] [Automatically merge when pipeline succeeds](https://docs.gitlab.com/ee/user/project/merge_requests/merge_when_pipeline_succeeds.html)
-
-## Test and Deploy
-
-Use the built-in continuous integration in GitLab.
-
-- [ ] [Get started with GitLab CI/CD](https://docs.gitlab.com/ee/ci/quick_start/index.html)
-- [ ] [Analyze your code for known vulnerabilities with Static Application Security Testing(SAST)](https://docs.gitlab.com/ee/user/application_security/sast/)
-- [ ] [Deploy to Kubernetes, Amazon EC2, or Amazon ECS using Auto Deploy](https://docs.gitlab.com/ee/topics/autodevops/requirements.html)
-- [ ] [Use pull-based deployments for improved Kubernetes management](https://docs.gitlab.com/ee/user/clusters/agent/)
-- [ ] [Set up protected environments](https://docs.gitlab.com/ee/ci/environments/protected_environments.html)
-
-***
-
-# Editing this README
-
-When you're ready to make this README your own, just edit this file and use the handy template below (or feel free to structure it however you want - this is just a starting point!). Thank you to [makeareadme.com](https://www.makeareadme.com/) for this template.
-
-## Suggestions for a good README
-Every project is different, so consider which of these sections apply to yours. The sections used in the template are suggestions for most open source projects. Also keep in mind that while a README can be too long and detailed, too long is better than too short. If you think your README is too long, consider utilizing another form of documentation rather than cutting out information.
-
-## Name
-Choose a self-explaining name for your project.
+- [Digital Design - Calculator](#digital-design---calculator)
+  - [Description](#description)
+    - [Task 1:  a RPN calculator in Python.](#task-1--a-rpn-calculator-in-python)
+    - [Task 2: Hardware interface.](#task-2-hardware-interface)
+    - [Task 3: Server UDP time.](#task-3-server-udp-time)
+  - [Demos](#demos)
+  - [Getting Started](#getting-started)
+    - [Dependencies](#dependencies)
+    - [Installing](#installing)
+  - [Authors](#authors)
+  - [Version History](#version-history)
+  - [License](#license)
 
 ## Description
-Let people know what your project can do specifically. Provide context and add a link to any reference visitors might be unfamiliar with. A list of Features or a Background subsection can also be added here. If there are alternatives to your project, this is a good place to list differentiating factors.
-
-## Badges
-On some READMEs, you may see small images that convey metadata, such as whether or not all the tests are passing for the project. You can use Shields to add some to your README. Many services also have instructions for adding a badge.
-
-## Visuals
-Depending on what you are making, it can be a good idea to include screenshots or even a video (you'll frequently see GIFs rather than actual videos). Tools like ttygif can help, but check out Asciinema for a more sophisticated method.
-
-## Installation
-Within a particular ecosystem, there may be a common way of installing things, such as using Yarn, NuGet, or Homebrew. However, consider the possibility that whoever is reading your README is a novice and would like more guidance. Listing specific steps helps remove ambiguity and gets people to using your project as quickly as possible. If it only runs in a specific context like a particular programming language version or operating system or has dependencies that have to be installed manually, also add a Requirements subsection.
-
-## Usage
-Use examples liberally, and show the expected output if you can. It's helpful to have inline the smallest example of usage that you can demonstrate, while providing links to more sophisticated examples if they are too long to reasonably include in the README.
-
-## Support
-Tell people where they can go to for help. It can be any combination of an issue tracker, a chat room, an email address, etc.
-
-## Roadmap
-If you have ideas for releases in the future, it is a good idea to list them in the README.
-
-## Contributing
-State if you are open to contributions and what your requirements are for accepting them.
-
-For people who want to make changes to your project, it's helpful to have some documentation on how to get started. Perhaps there is a script that they should run or some environment variables that they need to set. Make these steps explicit. These instructions could also be useful to your future self.
-
-You can also document commands to lint the code or run tests. These steps help to ensure high code quality and reduce the likelihood that the changes inadvertently break something. Having instructions for running tests is especially helpful if it requires external setup, such as starting a Selenium server for testing in a browser.
-
-## Authors and acknowledgment
-Show your appreciation to those who have contributed to the project.
+Worksheet 3:  
+-This worksheet explored the UDP protocol. We will be decoding, encoding and comunicating with it in this rep
+FEATURES OF CALCULATOR
+**-This is a rep for only worksheet 3.**
+* [IOT - Worksheet 2 part 1 ](https://gitlab.uwe.ac.uk/jo2-holdsworth/iot-worksheet-2-part-1) can be found here  
+* [IOT - Worksheet 2 part 2 ](https://gitlab.uwe.ac.uk/jo2-holdsworth/iot-worksheet-2-part-2) can be found here 
+* [IOT - Worksheet 3](https://gitlab.uwe.ac.uk/jo2-holdsworth/iot-worksheet-3) **you are here**
+
+### Task 1:  a RPN calculator in Python.
+* *RPN stands for reverse Polish Notation. RPN is postfix notation meaning the operators succeeds the operands.
+* ***stackClass.py*** A simple class to create a stack datatype within python. Contains a few error checking validation build into functions to help with the flow of the calculator program. The validation is used to prevent the user from performing actions or calculations that are not valid. The validation simply tells returns the current state of the stack. For example if the stack is empty and a `pop()` is called it will return **False**
+* ***sy.py*** A provided shunting yard algorithm. Takes input string and returns postfix. 
+* ***rpn.py*** contains rpn_eval a Reverse Polish Notation Evaluator 
+  * **def rpn_eval(tokens,stack)** Takes a string of expressions **+,-,*,/**  `pop()`'s left and right value from the stack and applies the first expression and then `push(value)`'s the value back onto the stack thus making calculations._
+### Task 2: Hardware interface.
+* The calculator hardware is made up of three sub components. We have the *raspberry pi zero w* it self, this connects the components together and makes the calulations. The keypad makes up the second component and the OLED screen makes up the third component. There are some additional features I have added but these will be discussed later on. This section is only relevant to the required components. 
+* ***The raspberry pi zero w*** This device is responsible for communicating to the other components. It also is responsible for the processing of *Task 1:*
+  * **calculator.py** This is the runner file. Responsible for connecting the hardware and making calculations. Displays welcome messages and puts `runCalculator()` into a loop 
+    * **def runCalculator(lastPressed=[])** This function Runs the calculator. Writes buttons icons to the screen. Takes a pre input of the last pressed, this prevents the wake button press from inputting a input into the stack. A full cycle of the **lastPressed** button not being pressed is required to be able to operate the button. Retrieves the inputs from `keyboardclass.ispressed()`, if buttons pressed is an operation for example ***'='*** is will then compute the sum entered. Other wise it will add the input to the stack and display the stack string on the screen.
+* ***The Keyboard*** The keyboard is a 8 button switch matrix. Its wired to the raspberry pi via GPIO pins *(Please see wiring diagram for further details)*. A switch matrix works by ending power to one column at a time and then detecting if a row is active. Each column and row is cycled through multiple times per second. The main benefit for a switch matrix board is the reduced number of GPIO pins required.
+  * **keyboardClass.py** A class containing a few methods to the operation of the keyboard. Includes setup and outputs.
+    * **__init__()** Setup between the keyboard and the raspberry pi. Enables the connected GPIO pins *(Please see wiring diagram for further details)*
+    * **def isPressed(row, col)** Takes a row and column and returns if that button is pressed. Used mainly for debugging features and additional functionality. 
+    * **pressed()** Takes no arguments. Returns an array of string of all buttons currently pressed. Detects what rows and columns are being pressed and calls `keyConverter()` to covert row and column into a string of button. I chose this unique way of processing button presses so that multiple button presses can be detected for additional features.
+    * **keyConverter(row,col)** Coverts the given row and column into a string of the corresponding button button.
+* ***The OLED screen*** The OLED screen is a small 129 by 64 screen. It will be used to display information to the user. Including the inputs and menu.
+  * **dd_oled.c** An API to communicate to the screen. The OLED screen communicated over I2C and is connected the the `sda,scl` pins on the raspberry pi *(Please see wiring diagram for further details)* 
+    * **int oledSetPixel(int x, int y, unsigned char ucColor)** Sets the defined pixel to the given colour. This function forms the base for other functions.
+    * **int oledFill(unsigned char ucData)** Sets the screen to a given color. Also useful to reset the screen after input alteration.
+    * **int oledWriteString(int x, int y, char \*szMsg, int iSize)**  This function displays a string of a given size in a location that is defined. Used for displaying the menu and inputs from the user. 
+    * **int oledDrawLine(int x0, int y0, int x1, int y1, unsigned char ucPixel)** Draws a line across the screen at a given location and colour. Uses a naive line algorithm. Should be replaced in the future with a non naive line algorithm.
+    * **python API** pyOjbects are located at the bottom of the file. These object are used to connect the C file to the python extension. 
+  * **setup.py** setup.py is a file used in the processes of building the c to python extension for the olid API.
+* ***Additional features*** This sections discusses some of the additional features I have added to the calculator.
+  * **Buttons** Multiple buttons make up extra functions of the calculator.
+    * **Brackets** There are two buttons near the screen. These buttons are soldered onto a perf board along with the led. These buttons are designed to be used along with a icon on the screen to signify the function of the buttons. Currently the buttons are used to input brackets into the calculator. 
+    * **On-Off** Located on the side of the calculator lies a push button with a On-Off icon. Pressing this button toggles a toggle switch connected between the negative leg of the batery and the raspberry pi.
+  * **LED** As the rapsberry pi is located within the case, I have added a LED status light that indicates that the device is powered and working.
+  * **Battery** The battery is a small LIPO Cell connected to the usb-c charging port. It charges relatively slow but due to the low power consumption of the raspberry pi this is not an issue. 
+  * **USB-C**
+  * **Case**
+___
+### Task 3: Server UDP time.
+* This takes builds upon **task 1** and **task 2** we need to send and receive packets from the sever with the correct checksum. This means encoding and decoding UDP.
+* ***mainSendandReceive()*** This function is a controller for smaller functions. It simply connects to server and tells the program to send and get packets from the server.![image](src/screenshot10.PNG)
+* ***recv_and_decode_packet(websocket)***  We are taking a websocket connecting to it and printing the packet all it one. This take doesnt require us todo much else with the packet so it can just be called in a function. ![image](src/screenshot11.PNG)
+* ***send_packet(websocket, sourcePort, deskPort, payLoad)*** To send packets to the server they need to be in UDP format in base64. This function will create a header for the payload including the correct checksum so the server can confirm the packet has arrived valid. ![image](src/screenshot12.PNG)
+* ***unittest.py*** unittest is an inbuilt Python library. Its a test runner and is specially design for running tests and debugging. This one contains a few useful tools that we are going to use. It works similarly to the assert function. Task 3 doesn't have any output other than to the terminal. I could alter the output but this is out of my scope for the project. Here I am just checking if the program runs correctly. All the tests were successful.![image](src/screenshot15.PNG)![image](src/screenshot16.PNG)
+___
+## Demos
+* ***Task 1:***  
+  **https://www.youtube.com/embed/_whlYriiWjs**  
+  ![video](src/demo1.mp4) 
+* ***Task 2:***  
+  **https://www.youtube.com/embed/1Am2Eauk4dY**  
+  ![video](src/demo2.mp4) 
+* ***Task 3:***  
+  **https://www.youtube.com/embed/wndZ8pPSINo**  
+  ![video](src/demo3.mp4) 
+
+___
+## Getting Started
+
+* Running the task files
+  * Task 1: `python3 udpdecoder.py`
+  * Task 2: `python3 checksum.py`
+  * Task 3: `python3 serverudptime.py`
+
+### Dependencies
+
+* unittest
+* asyncio
+* websockets
+* json
+* time
+* base64
+
+### Installing
+
+* Nothing to install
+
+## Authors
+
+Contributors names and contact info
+
+ex. Jack Holdsworth @ [my website](https://holdsworth.dev)
+
+## Version History
+* 0.4
+  * README
+  * Unittesting
+* 0.3
+  * task 2 done
+  * started task 3
+* 0.2
+  * most of task 2 done
+  * README made
+* 0.1
+  * init.
 
 ## License
-For open source projects, say how it is licensed.
-
-## Project status
-If you have run out of energy or time for your project, put a note at the top of the README saying that development has slowed down or stopped completely. Someone may choose to fork your project or volunteer to step in as a maintainer or owner, allowing your project to keep going. You can also make an explicit request for maintainers.
+This project is licensed under the GPL License - see the LICENSE.md file for details
\ No newline at end of file
diff --git a/Schematic.fzz b/Schematic.fzz
new file mode 100644
index 0000000000000000000000000000000000000000..f071885235d4236545a50d9a3cc7f07ef54b1e2d
GIT binary patch
literal 42841
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

literal 0
HcmV?d00001

diff --git a/calculator.py b/calculator.py
index 014031f..0bd7d3b 100644
--- a/calculator.py
+++ b/calculator.py
@@ -6,38 +6,61 @@ import rpn
 import dd_oled
 import RPi.GPIO as GPIO
 
-def runCalculator(lastPressed=[]):
-    x = 0
-    calculate = 0
-    stack = stackClass.stack()
-    rpnStack = stackClass.stack()
-    while x < 200 and calculate == 0: #tempory return to while 1:
-        pressed = keypad.pressed()
+def runCalculator(lastPressed=[]): # the calculator function. Takes parameters for key ignore.
+    x = 0 # counter
+    calculate = 0 # activate variable.
+    stack = stackClass.stack() # init the stack
+    rpnStack = stackClass.stack() # another stack for rpn
+    dd_oled.write_string(20, 0, '(', 2) # display buttons
+    dd_oled.write_string(20, 2, ')', 2)
+    while x < 800 and calculate == 0: #tempory return to while 1:
+
+        pressed = keypad.pressed() # get pressed keys
 
-        for key in pressed:
-            if len(lastPressed) == 0:
-                if key != "=":
-                    stack.push(key)
+        for key in pressed: # for pressed key
+            if len(lastPressed) == 0: # checks for previous key presses
+                if key != "=" and key != "#": # if not a command key
+                    stack.push(key) # push new key
+                    dd_oled.oled_fill(0) # refresh screen
+                    dd_oled.write_string(0, 0, ''.join(stack.stack[:15]), 0) # print two lines
+                    dd_oled.write_string(0, 1, ''.join(stack.stack[15:]), 0) 
+                    dd_oled.write_string(20, 0, '(', 2) # reprint buttons
+                    dd_oled.write_string(20, 2, ')', 2)
+                elif key == "#": # back space button
+                    stack.pop() 
                     dd_oled.oled_fill(0)
-                    dd_oled.write_string(0, 0, ''.join(stack.stack), 0) 
+                    dd_oled.write_string(0, 0, ''.join(stack.stack[:15]), 0)
+                    dd_oled.write_string(0, 1, ''.join(stack.stack[15:]), 0) 
+                    dd_oled.write_string(20, 0, '(', 2)
+                    dd_oled.write_string(20, 2, ')', 2)
                 else:
-                    calculate = 1
+                    calculate = 1 # end loop start calculation.
             else:
                 for lastKey in lastPressed:
                     if lastKey != key:
-                        if key != "=":
+                        if key != "=" and key != "#":
                             stack.push(key)
                             dd_oled.oled_fill(0)
-                            dd_oled.write_string(0, 0, ''.join(stack.stack), 0) 
+                            dd_oled.write_string(0, 0, ''.join(stack.stack[:15]), 0)
+                            dd_oled.write_string(0, 1, ''.join(stack.stack[15:]), 0) 
+                            dd_oled.write_string(20, 0, '(', 2)
+                            dd_oled.write_string(20, 2, ')', 2)
+                        elif key == "#":
+                            stack.pop()
+                            dd_oled.oled_fill(0)
+                            dd_oled.write_string(0, 0, ''.join(stack.stack[:15]), 0)
+                            dd_oled.write_string(0, 1, ''.join(stack.stack[15:]), 0) 
+                            dd_oled.write_string(20, 0, '(', 2)
+                            dd_oled.write_string(20, 2, ')', 2)
                         else:
                             calculate = 1
 
-        lastPressed = pressed
+        lastPressed = pressed # to allow for only 1 character per press
         
-        print(stack.stack)
-        time.sleep(.1)
-        x += 1
-    test = sy.shunt(sy.tokenize(''.join(stack.stack)))
+        print(stack.stack) # debug
+        time.sleep(.1) # time delay
+        x += 1 # counter
+    test = sy.shunt(sy.tokenize(''.join(stack.stack)))  # token out
 
 
     print(type(test))
@@ -47,18 +70,19 @@ def runCalculator(lastPressed=[]):
     #     print("hi")
     ans = rpn.rpn_eval(test,rpnStack)
     print(ans)
-    dd_oled.oled_fill(0)
-    dd_oled.write_string(0, 0, ''.join(ans), 0) 
+    dd_oled.oled_fill(0) # print answer 
+    dd_oled.write_string(0, 0, ''.join(ans)[:15], 0)
+    dd_oled.write_string(0, 1, ''.join(ans)[15:], 0) 
 
 # print(f"1 : {sy.shunt(stack.stack)}")
 
-keypad = keyboardClass.Keypad()
-dd_oled.oled_init(1, 0x3C, 1, 0, 0)
-dd_oled.oled_fill(0)
-dd_oled.write_string(1, 0, 'Welcome', 1)
+keypad = keyboardClass.Keypad() # init keyboard
+dd_oled.oled_init(1, 0x3C, 1, 0, 0) # init screen
+dd_oled.oled_fill(0) # clear
+dd_oled.write_string(1, 0, 'Welcome', 1) #welcome message
 dd_oled.write_string(5, 3, 'Press any key', 2)
-lastPressed = [] 
-while True:
+lastPressed = [] # key press tracker
+while True: # forever loop
     pressed = keypad.pressed()
     if pressed != lastPressed:
         lastPressed = pressed
@@ -69,20 +93,21 @@ while True:
     runCalculator(lastPressed)
     lastPressed = []
     dd_oled.write_string(5, 2, 'Press any key.', 2)
-    dd_oled.write_string(5, 3, 'or \'#\' to exit', 2)
+    # dd_oled.write_string(5, 3, 'or \'#\' to exit', 2)
     
     while True:
         time.sleep(1)
         pressed = keypad.pressed()
         if pressed != lastPressed:
             print(f"pressed:{pressed}")
-            if '#' in pressed:
-                GPIO.cleanup()
-                exit()
+            # if '#' in pressed:
+            #     GPIO.cleanup()
+            #     exit()
                 
-            else:
-                lastPressed = pressed
-                break
+            # else:
+            lastPressed = pressed
+            dd_oled.oled_fill(0)
+            break
         lastPressed = pressed
 
 # ADD mine sweeper
diff --git a/features.py b/features.py
new file mode 100644
index 0000000..7a9e55f
--- /dev/null
+++ b/features.py
@@ -0,0 +1,15 @@
+import RPi.GPIO as GPIO
+import time
+GPIO.setmode(GPIO.BCM)
+GPIO.setup(18, GPIO.OUT)
+GPIO.setup(15,GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
+GPIO.setup(14,GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
+while True: # Run forever
+    button0_state = GPIO.input(15)
+    button1_state = GPIO.input(14)
+    print(button0_state)
+    print(button1_state)
+    GPIO.output(18,GPIO.HIGH)
+    time.sleep(1)
+    GPIO.output(18,GPIO.LOW)
+    time.sleep(1)
\ No newline at end of file
diff --git a/keyboard.py b/keyboard.py
deleted file mode 100644
index 3f70d5c..0000000
--- a/keyboard.py
+++ /dev/null
@@ -1,33 +0,0 @@
-import RPi.GPIO as GPIO
-import time
-
-COL1 = 6
-COL2 = 13
-COL3 = 19
-COL4 = 26
-ROW1 = 16
-ROW2 = 20
-ROW3 = 21
-ROW4 = 5
-
-GPIO.setmode(GPIO.BCM)
-#setup rows
-# set row1 as input and pullup (i.e. set HIGH)
-GPIO.setup(ROW1, GPIO.IN, pull_up_down=GPIO.PUD_UP)
-# other columnds go here
-# setup columns
-GPIO.setup(COL1, GPIO.OUT)
-# other rows go here
-# loop forever
-while True:
- # output LOW to col1
- GPIO.output(COL1, GPIO.LOW)
- # read the state of row1
- # if [ROW1, COL1] (which is key 1) pressed
- # then it will be 0 otherwise 1
- row1_state = GPIO.input(ROW1)
- print(row1_state)
- print('#######')
- time.sleep(1)
-# reset GPIOs before exiting
-GPIO.cleanup()
diff --git a/keyboardClass.py b/keyboardClass.py
index e11a4d2..db2630e 100644
--- a/keyboardClass.py
+++ b/keyboardClass.py
@@ -20,6 +20,8 @@ class Keypad:
         for col in self.cols:
             GPIO.setup(col, GPIO.OUT)
             GPIO.output(col, GPIO.HIGH)
+        GPIO.setup(15,GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
+        GPIO.setup(14,GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
 
     def isPressed(self, row, col):
         GPIO.output(col, GPIO.LOW)
@@ -40,6 +42,10 @@ class Keypad:
                     pressed.append(self.keyConverter(row,col))
                     # print("pressed detected ########################")
                     # print("appended"+ str(self.keyConverter(row,col)))
+        if GPIO.input(15) == 1:
+            pressed.append('(')
+        if GPIO.input(14) == 1:
+            pressed.append(')')
         return pressed
     
     def keyConverter(self,row,col):
diff --git a/rpn.py b/rpn.py
index 10cc4d0..071ec41 100644
--- a/rpn.py
+++ b/rpn.py
@@ -1,5 +1,4 @@
 def rpn_eval(tokens,stack):
-    print("here0")
     print(tokens)
     for item in tokens:
         print(item)
diff --git a/stackClass.py b/stackClass.py
index ef1f94e..4adeff0 100644
--- a/stackClass.py
+++ b/stackClass.py
@@ -1,31 +1,31 @@
 class stack:
-    def __init__ (self,size = 32): 
+    def __init__ (self,size = 30): # max size of stack is 32 by default
         self.stack = []
         self.maxSize = size
 
-    def push(self,plate):
+    def push(self,plate): # push method with error checking and return
         if self.isFull() == False:
             self.stack.append(plate)
             return True
         else:
             return False
     
-    def pop(self):
+    def pop(self): # pop method with error checking and return
         if self.isEmpty() == False:
             return self.stack.pop()
         else:
             return False
     
-    def size(self):
+    def size(self): # size method to return current size of stack
         return len(self.stack)
     
-    def isEmpty(self):
+    def isEmpty(self): # isEmpty method to check if the stack is empty
         if len(self.stack) == 0:
             return True
         else:
             return False
 
-    def isFull(self):
+    def isFull(self): # isFull method to check if the stack is full
         if len(self.stack) >= self.maxSize:
             return True
         else:
diff --git a/test.py b/test.py
deleted file mode 100644
index ec633df..0000000
--- a/test.py
+++ /dev/null
@@ -1,5 +0,0 @@
-import hello
-
-hello.oled_init(1, 0x3C, 1, 1, 1)
-hello.oled_fill(0)
-hello.write_string(0, 0, "1+1=2", 0) 
\ No newline at end of file
-- 
GitLab