diff --git a/test_stand_firmware/test_stand_firmware.ino b/test_stand_firmware/test_stand_firmware.ino
index 7f244ac5f923fa9ac6f29e300200cb68b53170c7..8aa506f4dcc6b276116f35adfc1d708904dc36df 100644
--- a/test_stand_firmware/test_stand_firmware.ino
+++ b/test_stand_firmware/test_stand_firmware.ino
@@ -1,109 +1,164 @@
-#include <movingAvg.h>
-
-const int DATA_PIN = A7;
-const int BUTTON_PIN = 2;
-int buttonState = 0;
-const boolean NO_HANDSHAKE = false;
-const int SEND_CODE = 65;
-int incomingByte = 0;
-
-int val = 0;
-const double TEN_BIT_SCALAR = 0.3516; // 360/1024
-int homePosition;
-
-// Rate variables
-long lastTime = 0;
-long currTime = 0;
-long lastReading = 0;
-long currReading = 0;
-int prevRate = 0;
-long deltaTime = 0;
-long deltaReading = 0;
-
-double rate;
-
-// Long Press Variables
-long buttonTimer = 0;
-const long LONG_PRESS_MILLIS = 250;
-boolean buttonActive = false;
-boolean longPressActive = false;
-boolean isInPositionMode = true;
-movingAvg mySensor(10);
-
-void serialFlush() {
-  while (Serial.available() > 0) {
-    char t = Serial.read();
-  }
-}
-
-void setup() {
-  // put your setup code here, to run once:
-  Serial.begin(9600);
-  pinMode(BUTTON_PIN, INPUT);
-  pinMode(LED_BUILTIN, OUTPUT);
-  homePosition = analogRead(DATA_PIN);
-  homePosition += 512;
-  lastTime = millis();
-  lastReading = analogRead(DATA_PIN);
-  
-  mySensor.begin();
-}
-
-void loop() {
-  currTime = millis();
-  currReading = analogRead(DATA_PIN);
-
-  if (digitalRead(BUTTON_PIN) == HIGH) {
-    if (buttonActive == false) { // Button was not pressed last cycle
-      buttonActive = true;
-      buttonTimer = millis();
-    }
-    if (((millis() - buttonTimer) > LONG_PRESS_MILLIS) && (longPressActive == false)) { // Detected a long press, swap modes
-      longPressActive = true;
-      isInPositionMode = !isInPositionMode;
-    }
-  }
-  else {
-    if (buttonActive == true) { // Button was being pressed last cycle
-      if (longPressActive == true) { // Button was being long pressed last cycle, user has released the long press
-        longPressActive = false;
-      }
-      else { // Short press occured, grab current position regardless of mode
-        homePosition = analogRead(DATA_PIN);
-        homePosition += 512;
-      }
-      buttonActive = false;
-    }
-  }
-
-  // LED on if we're in position mode, off if we're in rate mode
-  digitalWrite(LED_BUILTIN, isInPositionMode);
-
-  if (isInPositionMode == true) {
-    double absoluteDegrees = TEN_BIT_SCALAR * (double) currReading;
-    double relativeDegrees = TEN_BIT_SCALAR * (double) homePosition;
-    double displayPosition = absoluteDegrees - relativeDegrees;
-    displayPosition += (displayPosition < 0) ? (360) : (0);
-    Serial.println((displayPosition-180));
-    delay(100);
-  }
-  else { // We're in rate mode
-    
-    deltaTime = currTime - lastTime;
-    deltaReading = currReading - lastReading;
-    rate = 1000 * ((TEN_BIT_SCALAR * deltaReading) / (deltaTime));
-    
-    // Thanks josh for the fix
-    if(abs(rate - prevRate) > 360) {
-      
-    }else{
-      mySensor.reading(rate);
-      Serial.println(mySensor.getAvg()*-1);
-      delay(50);
-    }
-    prevRate = rate;
-    }
-  // Reset vars for next cycle
-  lastTime = currTime;
-  lastReading = currReading;
-}
+#include <movingAvg.h>
+unsigned long test_time = 0;
+const int DATA_PIN = A7;
+const int BUTTON_PIN = 2;
+boolean isStreaming = false;
+int f = 200;
+int w = 0;
+unsigned long time_step = 50000;
+
+const double TEN_BIT_SCALAR = 0.3516; // 360/1024
+int homePosition;
+double displayPosition;
+
+// Rate variables
+unsigned long lastTime = 0;
+unsigned long currTime = 0;
+int lastReading = 0;
+int currReading = 0;
+double deltaTime = 1;
+double deltaReading = 0;
+unsigned long buttonTimer = 0;
+int i = 0;
+
+double rate;
+
+// Long Press Variables
+const long LONG_PRESS = 250;
+boolean isInPositionMode = true;
+movingAvg myRate(20);
+
+void rateMode(){
+  deltaTime = currTime - lastTime; // Find change in time
+  deltaReading = currReading - lastReading; // Find change in position
+  deltaReading += (deltaReading < -512) ? (1024) : (0);
+  deltaReading -= (deltaReading > 512) ? (1024) : (0);
+  
+  // Rate is change in position divided by change in time (multiply by 10^6 to convert microseconds to seconds)
+  rate = TEN_BIT_SCALAR * deltaReading * 1000000 / deltaTime;
+ 
+  myRate.reading(rate);
+  rate = myRate.getAvg();
+  
+  if(isStreaming && !(isInPositionMode)){
+    Serial.println(rate);
+  }
+  
+}
+
+void positionMode(){
+  displayPosition = TEN_BIT_SCALAR * (double)(currReading);
+  displayPosition += (displayPosition < 0) ? (360) : (0);
+  displayPosition -= 180;
+  if(isStreaming && isInPositionMode){
+    Serial.println(displayPosition);
+  }
+}
+
+void handleButton(){
+  // If button was pressed
+  if(digitalRead(BUTTON_PIN) == HIGH){ 
+    buttonTimer = millis();
+    while(digitalRead(BUTTON_PIN) == HIGH){   
+    }
+    if(millis() - buttonTimer > LONG_PRESS){ // Detected a long press, swap modes
+      isInPositionMode = !isInPositionMode;
+    }
+    else{ // Short press occured, grab current position to reset home position regardless of mode
+      homePosition = analogRead(DATA_PIN);
+      homePosition += 512;
+    }
+    // LED on if we're in position mode, off if we're in rate mode
+    digitalWrite(LED_BUILTIN, isInPositionMode);
+  }
+}
+
+void handleSerial(){
+  if(Serial.available() > 0){
+    char readChar = Serial.read();
+    switch(readChar){
+      case 'h': // Set current position to be zero
+        homePosition = analogRead(DATA_PIN);
+        homePosition += 512;
+        break;
+      case 'w': // Change wait time between cycles (in microseconds)
+        w = Serial.readStringUntil('!').toInt();
+        if(w > 0 && w < 1000000){
+          time_step = w;
+        }
+        break;
+      case 't': // Toggle mode
+        isInPositionMode = !isInPositionMode;
+        // LED on if we're in position mode, off if we're in rate mode
+        digitalWrite(LED_BUILTIN, isInPositionMode);
+        break;
+      case 'p': // Set to position mode
+        isInPositionMode = true;
+        // LED on if we're in position mode, off if we're in rate mode
+        digitalWrite(LED_BUILTIN, isInPositionMode);
+        break;
+      case 'r': // Set to rate mode
+        isInPositionMode = false;
+        // LED on if we're in position mode, off if we're in rate mode
+        digitalWrite(LED_BUILTIN, isInPositionMode);
+        break;
+      case 'P': // Print position
+        Serial.println(displayPosition);
+        break;
+      case 'R': // Print rate
+        Serial.println(rate);
+        break;
+      case 'A': // Print value based on mode
+        if(isInPositionMode){
+          Serial.println(displayPosition);
+        }
+        else{
+          Serial.println(rate);
+        }
+        break;
+      case 's': // Enable Streaming
+        isStreaming = true;
+        break;
+      case 'd': // Disable Streaming
+        isStreaming = false;
+        break;
+      case 'x': // Print raw value 
+        Serial.println(analogRead(DATA_PIN));
+        break;
+    }
+  }
+}
+
+void setup() {
+  // put your setup code here, to run once:
+  Serial.begin(9600);
+  pinMode(BUTTON_PIN, INPUT);
+  pinMode(DATA_PIN, INPUT);
+  pinMode(LED_BUILTIN, OUTPUT);
+  homePosition = analogRead(DATA_PIN); // Capture home position
+  homePosition += 512; // Offset home position to middle value
+  lastTime = micros();
+  lastReading = analogRead(DATA_PIN);
+  // LED on if we're in position mode, off if we're in rate mode
+  digitalWrite(LED_BUILTIN, isInPositionMode);
+  myRate.begin();
+}
+
+void loop() {  
+    currTime = micros();
+    currReading = (analogRead(DATA_PIN) - homePosition + 1024) % 1024;
+
+    // Switch mode after long button press, zero position after short button press
+    handleButton();
+    // Find the position
+    positionMode();
+    // Find the rate
+    rateMode();
+    // Handle commands from the PC
+    handleSerial();
+    // Reset vars for next cycle
+    lastTime = currTime;
+    lastReading = currReading;
+    delayMicroseconds(time_step);
+ 
+}