diff --git a/include/settings.h b/include/settings.h
index 3a867aafcfdb4ef88b98143c7fc4441dc225cfe9..76575f25fa433c30d876e67afc3aa5b990bbdb51 100644
--- a/include/settings.h
+++ b/include/settings.h
@@ -6,14 +6,29 @@
 
 #define DEBOUNCE_TIME_MS 50
 
-#define LEFT_MOTOR_SPEED 50
-#define RIGHT_MOTOR_SPEED 50
+#define LEFT_MOTOR_SPEED 25
+#define RIGHT_MOTOR_SPEED 25
+
+typedef struct {
+  float R;
+  float G;
+  float B;
+} Rgb;
+
+typedef struct {
+  Rgb min = Rgb{255, 255, 255};
+  Rgb max = Rgb{0, 0, 0};
+} ColorSensorCal;
+
+void printRGB(const Rgb& value);
+void checkButtonPress();
+void getColorValues(Rgb& left_value, Rgb& right_value);
 
 // mode 0(default) - break, 1 - coast
 void motorLeftForward(int speed, bool mode = 0);
-void motorLeftBackwards(int speed, bool mode = 0);
+void motorLeftBackward(int speed, bool mode = 0);
 void motorRightForward(int speed, bool mode = 0);
-void motorRightBackwards(int speed, bool mode = 0);
+void motorRightBackward(int speed, bool mode = 0);
 
 typedef enum {
     MODE_BREAK,
diff --git a/src/main.cpp b/src/main.cpp
index 81f2f59116f67d14a1275139582ce5ccfb5e0629..455b0e0b3467747c4c84df8c917e69a7c14e1c3e 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -8,10 +8,18 @@ Adafruit_TCS34725 color_sensor_left = Adafruit_TCS34725(TCS34725_INTEGRATIONTIME
 Adafruit_TCS34725 color_sensor_right = Adafruit_TCS34725(TCS34725_INTEGRATIONTIME_24MS, TCS34725_GAIN_4X);
 TwoWire Wire2 = TwoWire(PC9, PA8); // I2C channel 3 for right sensor
 
-bool forward = false;
 bool prev_button_state = true; // nominal high
 int prev_button_press_time = 0;
 
+bool enable_line_follow = false;
+int calibration_state = -1; // 0 - black, 1 - white, -1 - calibration disabled
+
+int left_red_threshold = 95;
+int right_red_threshold = 95;
+
+ColorSensorCal color_cal_left;
+ColorSensorCal color_cal_right;
+
 void setup() {
   Serial.begin(115200);
 
@@ -40,88 +48,117 @@ void setup() {
 }
 
 void loop() {
-  bool current_button_state = digitalRead(USER_BTN);
-  
-  // Trigger on falling edge
-  if(prev_button_state && !current_button_state && (millis() - prev_button_press_time > DEBOUNCE_TIME_MS)) {
-    forward = !forward;
-    prev_button_press_time = millis();
-    Serial.print("Pressed: ");
-    Serial.println(forward);
-  }
-  prev_button_state = current_button_state;
-
+  checkButtonPress();
 
   // For testing motor
   // int motor_speed = map(ir_left_value, 0, 1023, 0, 255);
   // Serial.println(motor_speed);
 
-  // Enable line following
-  /*
-  if (ir_left_value < LEFT_IR_THRESHOLD) {
-    motorLeftForward(LEFT_MOTOR_SPEED);
-  } else {
-    motorLeftForward(0);
-  }
-
-  if (ir_right_value < RIGHT_IR_THRESHOLD) {
-    motorRightForward(RIGHT_MOTOR_SPEED);
-  } else {
-    motorRightForward(0);
-  }
-  */
-
   // For testing motor
-  // if (forward) {
-  //   motorLeftForward(motor_speed);
-  //   motorRightForward(motor_speed);
+  // if (!enable_line_follow) {
+  //   motorLeftForward(LEFT_MOTOR_SPEED);
+  //   motorRightForward(RIGHT_MOTOR_SPEED);
   // } else {
-  //   motorLeftBackwards(motor_speed);
-  //   motorRightBackwards(motor_speed);
+  //   motorLeftBackward(LEFT_MOTOR_SPEED);
+  //   motorRightBackward(RIGHT_MOTOR_SPEED);
   // }
 
   // Color sensor code
-  float red_left, green_left, blue_left, red_right, green_right, blue_right;
-  color_sensor_left.setInterrupt(false);  // turn on LED
-  color_sensor_right.setInterrupt(false);  // turn on LED
-  delay(24);  // takes 24ms to read
-  color_sensor_left.getRGB(&red_left, &green_left, &blue_left);
-  color_sensor_right.getRGB(&red_right, &green_right, &blue_right);
-  color_sensor_left.setInterrupt(true);  // turn off LED
-  color_sensor_right.setInterrupt(true);  // turn off LED
+  Rgb left_color = {};
+  Rgb right_color = {};
+  getColorValues(left_color, right_color);
  
-  Serial.print("Left R:"); Serial.print(int(red_left));
-  Serial.print("\tG:"); Serial.print(int(green_left));
-  Serial.print("\tB:"); Serial.print(int(blue_left));
-  Serial.print("\t");
-  Serial.print("Right R:"); Serial.print(int(red_right));
-  Serial.print("\tG:"); Serial.print(int(green_right));
-  Serial.print("\tB:"); Serial.print(int(blue_right));
-  Serial.print("\n");
+  // Serial.print("Left ");
+  // printRGB(left_color);
+  // Serial.print("\t");
+  // Serial.print("Right "); 
+  // printRGB(right_color);
+  // Serial.print("\n");
+
+  // Enable line following
+  if (enable_line_follow) {
+    if (left_color.R < left_red_threshold) {
+      motorLeftForward(LEFT_MOTOR_SPEED);
+    } else {
+      motorLeftForward(0);
+    }
+
+    if (right_color.R < right_red_threshold) {
+      motorRightForward(RIGHT_MOTOR_SPEED);
+    } else {
+      motorRightForward(0);
+    }
+  }
+
+}
+
+void printRGB(const Rgb& value) {
+  Serial.print("R:"); Serial.print(int(value.R));
+  Serial.print("\tG:"); Serial.print(int(value.G));
+  Serial.print("\tB:"); Serial.print(int(value.B));
+}
+
+// Check user button press
+void checkButtonPress() {
+  bool current_button_state = digitalRead(USER_BTN);
+  
+  // Trigger on falling edge
+  if(prev_button_state && !current_button_state && (millis() - prev_button_press_time > DEBOUNCE_TIME_MS)) {
+    prev_button_press_time = millis();
+    Serial.print("Pressed: ");
+    enable_line_follow = !enable_line_follow;
+  }
+  prev_button_state = current_button_state;
+
+  // calibration code
+  if(calibration_state == 0) {
+    // Calibrate black
+    Serial.print("Calibrating black; ");
+    getColorValues(color_cal_left.min, color_cal_right.min);
+    // Transition to calibrate white
+    calibration_state = 1;
+  } else if (calibration_state == 1) {
+    // Calibrate white
+    getColorValues(color_cal_left.max, color_cal_right.max);
+    // Transition back to calibrate black next button press
+    calibration_state = 0;
+  }
 }
 
+void getColorValues(Rgb& left_value, Rgb& right_value) {
+  // Turn on LEDs
+  color_sensor_left.setInterrupt(false);
+  color_sensor_right.setInterrupt(false);
+  // Delay 24ms to read
+  delay(24);
+  color_sensor_left.getRGB(&left_value.R, &left_value.G, &left_value.B);
+  color_sensor_right.getRGB(&right_value.R, &right_value.G, &right_value.B);
+  // Turn off LEDs
+  color_sensor_left.setInterrupt(true);
+  color_sensor_right.setInterrupt(true);
+}
 // Left motor
 void motorLeftForward(int speed, bool mode) {
   if (!mode) {
     // Break
-    analogWrite(MOTOR_LEFT_PIN_2, 255);
-    analogWrite(MOTOR_LEFT_PIN_1, speed);
+    analogWrite(MOTOR_LEFT_PIN_1, 255);
+    analogWrite(MOTOR_LEFT_PIN_2, 255-speed);
   } else {
     // Coast
-    analogWrite(MOTOR_LEFT_PIN_2, 0);
-    analogWrite(MOTOR_LEFT_PIN_1, 255-speed);
+    analogWrite(MOTOR_LEFT_PIN_1, 0);
+    analogWrite(MOTOR_LEFT_PIN_2, speed);
   }
 }
 
-void motorLeftBackwards(int speed, bool mode) {
+void motorLeftBackward(int speed, bool mode) {
   if (!mode) {
     // Break
-    analogWrite(MOTOR_LEFT_PIN_1, 255);
-    analogWrite(MOTOR_LEFT_PIN_2, speed);
+    analogWrite(MOTOR_LEFT_PIN_2, 255);
+    analogWrite(MOTOR_LEFT_PIN_1, 255-speed);
   } else {
     // Coast
-    analogWrite(MOTOR_LEFT_PIN_1, 0);
-    analogWrite(MOTOR_LEFT_PIN_2, 255-speed);
+    analogWrite(MOTOR_LEFT_PIN_2, 0);
+    analogWrite(MOTOR_LEFT_PIN_1, speed);
   }
 }
 
@@ -129,23 +166,23 @@ void motorLeftBackwards(int speed, bool mode) {
 void motorRightForward(int speed, bool mode) {
   if (!mode) {
     // Break
-    analogWrite(MOTOR_RIGHT_PIN_2, 255);
-    analogWrite(MOTOR_RIGHT_PIN_1, speed);
+    analogWrite(MOTOR_RIGHT_PIN_1, 255);
+    analogWrite(MOTOR_RIGHT_PIN_2, 255-speed);
   } else {
     // Coast
-    analogWrite(MOTOR_RIGHT_PIN_2, 0);
-    analogWrite(MOTOR_RIGHT_PIN_1, 255-speed);
+    analogWrite(MOTOR_RIGHT_PIN_1, 0);
+    analogWrite(MOTOR_RIGHT_PIN_2, speed);
   }
 }
 
-void motorRightBackwards(int speed, bool mode) {
+void motorRightBackward(int speed, bool mode) {
   if (!mode) {
     // Break
-    analogWrite(MOTOR_RIGHT_PIN_1, 255);
-    analogWrite(MOTOR_RIGHT_PIN_2, speed);
+    analogWrite(MOTOR_RIGHT_PIN_2, 255);
+    analogWrite(MOTOR_RIGHT_PIN_1, 255-speed);
   } else {
     // Coast
-    analogWrite(MOTOR_RIGHT_PIN_1, 0);
-    analogWrite(MOTOR_RIGHT_PIN_2, 255-speed);
+    analogWrite(MOTOR_RIGHT_PIN_2, 0);
+    analogWrite(MOTOR_RIGHT_PIN_1, speed);
   }
 }
\ No newline at end of file