commit fb4f700b27767fe0cce8171c4e6321db4ac475ec
Author: Scarlett <kadansk8@gmail.com>
Date:   Sun Sep 17 01:58:17 2023 -0500

    initial commit

diff --git a/include/README b/include/README
new file mode 100644
index 0000000..194dcd4
--- /dev/null
+++ b/include/README
@@ -0,0 +1,39 @@
+
+This directory is intended for project header files.
+
+A header file is a file containing C declarations and macro definitions
+to be shared between several project source files. You request the use of a
+header file in your project source file (C, C++, etc) located in `src` folder
+by including it, with the C preprocessing directive `#include'.
+
+```src/main.c
+
+#include "header.h"
+
+int main (void)
+{
+ ...
+}
+```
+
+Including a header file produces the same results as copying the header file
+into each source file that needs it. Such copying would be time-consuming
+and error-prone. With a header file, the related declarations appear
+in only one place. If they need to be changed, they can be changed in one
+place, and programs that include the header file will automatically use the
+new version when next recompiled. The header file eliminates the labor of
+finding and changing all the copies as well as the risk that a failure to
+find one copy will result in inconsistencies within a program.
+
+In C, the usual convention is to give header files names that end with `.h'.
+It is most portable to use only letters, digits, dashes, and underscores in
+header file names, and at most one dot.
+
+Read more about using header files in official GCC documentation:
+
+* Include Syntax
+* Include Operation
+* Once-Only Headers
+* Computed Includes
+
+https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html
diff --git a/lib/README b/lib/README
new file mode 100644
index 0000000..6debab1
--- /dev/null
+++ b/lib/README
@@ -0,0 +1,46 @@
+
+This directory is intended for project specific (private) libraries.
+PlatformIO will compile them to static libraries and link into executable file.
+
+The source code of each library should be placed in a an own separate directory
+("lib/your_library_name/[here are source files]").
+
+For example, see a structure of the following two libraries `Foo` and `Bar`:
+
+|--lib
+|  |
+|  |--Bar
+|  |  |--docs
+|  |  |--examples
+|  |  |--src
+|  |     |- Bar.c
+|  |     |- Bar.h
+|  |  |- library.json (optional, custom build options, etc) https://docs.platformio.org/page/librarymanager/config.html
+|  |
+|  |--Foo
+|  |  |- Foo.c
+|  |  |- Foo.h
+|  |
+|  |- README --> THIS FILE
+|
+|- platformio.ini
+|--src
+   |- main.c
+
+and a contents of `src/main.c`:
+```
+#include <Foo.h>
+#include <Bar.h>
+
+int main (void)
+{
+  ...
+}
+
+```
+
+PlatformIO Library Dependency Finder will find automatically dependent
+libraries scanning project source files.
+
+More information about PlatformIO Library Dependency Finder
+- https://docs.platformio.org/page/librarymanager/ldf.html
diff --git a/platformio.ini b/platformio.ini
new file mode 100644
index 0000000..5f47dff
--- /dev/null
+++ b/platformio.ini
@@ -0,0 +1,16 @@
+; PlatformIO Project Configuration File
+;
+;   Build options: build flags, source filter
+;   Upload options: custom upload port, speed and extra flags
+;   Library options: dependencies, extra library storages
+;   Advanced options: extra scripting
+;
+; Please visit documentation for the other options and examples
+; https://docs.platformio.org/page/projectconf.html
+
+[env:pico]
+platform = https://github.com/maxgerhardt/platform-raspberrypi.git
+board = pico
+framework = arduino
+board_build.core = earlephilhower
+upload_port = /run/media/scarlett/RPI-RP2/
diff --git a/src/main.cpp b/src/main.cpp
new file mode 100644
index 0000000..8ec09c3
--- /dev/null
+++ b/src/main.cpp
@@ -0,0 +1,127 @@
+#include <Arduino.h>
+
+const int ZERO_PIN = 0;
+const int ONE_PIN = 1;
+char data[35];
+boolean valid = false;
+unsigned long timestamp = 0;
+int curr_bit = 0;
+
+void setup();
+void loop();
+void zero_bit();
+void one_bit();
+int parse();
+bool fullParity();
+bool evenParity();
+bool oddParity();
+
+void setup() {
+  attachInterrupt(ZERO_PIN,zero_bit,FALLING);
+  attachInterrupt(ONE_PIN,one_bit,FALLING);
+  Serial.begin(9600);
+}
+
+void loop() {
+  if(valid == true) {
+    noInterrupts();
+    for(int i = 0; i < 35; i++) {
+      Serial.print(data[i]);
+    }
+    Serial.println();
+    curr_bit = 0;
+    valid = false;
+
+    int cardnum = parse();
+    if(cardnum != -1) {
+      Serial.print("Card Number: ");
+      Serial.println(cardnum);
+    } else {
+      Serial.println("Invalid Card Number");
+    }
+
+    interrupts();
+  }
+}
+
+void zero_bit() {
+  if((valid == true) || (millis() - timestamp > 100)) {
+    valid = false;
+    curr_bit = 0;
+  }
+  data[curr_bit++] = '0';
+  if(curr_bit>34) {
+    valid = true;
+  }
+  timestamp = millis();
+}
+
+void one_bit() {
+if((valid == true) || (millis() - timestamp > 100)) {
+    valid = false;
+    curr_bit = 0;
+  }
+  data[curr_bit++] = '1';
+  if(curr_bit>34) {
+    valid = true;
+  }
+  timestamp = millis();
+}
+
+int parse() {
+  if (sizeof(data) == 35) {
+    if (fullParity() && evenParity() && oddParity()) {
+      char cardnum[20];
+      for (int i = 14; i < 34; i++) cardnum[i-14] = data[i];
+      return strtol(cardnum, NULL, 2);
+    }
+  }
+
+  return -1;
+}
+
+bool fullParity() {
+  int num = 0;
+  for (int i = 0; i < 34; i++) {
+    if (data[i] == '1') num++;
+  }
+
+  if (num % 2 == 0) {
+    Serial.println("Full parity check passed");
+    return true;
+  }
+  Serial.println("Full parity check failed");
+  return false;  
+}
+
+bool evenParity() {
+  int num = 0;
+  
+  for (int i = 2; i < 34; i++) {
+    if (i == 4 || i == 10 || i == 16 || i == 22 || i == 28) continue;
+    if (data[i] == '1') num++;
+  }
+
+  if (num % 2 == 0) {
+    Serial.println("Even parity check passed");
+    return true;
+  }
+  Serial.println("Even parity check failed");
+  return false;  
+}
+
+bool oddParity() {
+  int num = 0;
+  
+  for (int i = 2; i < 34; i++) {
+    if (i == 5 || i == 9 || i == 13 || i == 17 || i == 21 || i == 25 || i == 29 || i == 33) continue;
+    if (data[i] == '1') num++;
+  }
+
+  if (num % 2 == 0) {
+    Serial.println("Odd parity check passed");
+    return true;
+  }
+  Serial.println("Odd parity check failed");
+  return false;   
+}
\ No newline at end of file
diff --git a/test/README b/test/README
new file mode 100644
index 0000000..9b1e87b
--- /dev/null
+++ b/test/README
@@ -0,0 +1,11 @@
+
+This directory is intended for PlatformIO Test Runner and project tests.
+
+Unit Testing is a software testing method by which individual units of
+source code, sets of one or more MCU program modules together with associated
+control data, usage procedures, and operating procedures, are tested to
+determine whether they are fit for use. Unit testing finds problems early
+in the development cycle.
+
+More information about PlatformIO Unit Testing:
+- https://docs.platformio.org/en/latest/advanced/unit-testing/index.html