// #include <SPI.h>
// #include <Wire.h>
// #include <Adafruit_GFX.h>
// #include <Adafruit_SSD1306.h>

// #define SCREEN_WIDTH 128 
// #define SCREEN_HEIGHT 64 
// #define OLED_RESET     -1 
// #define SCREEN_ADDRESS 0x3C 
// Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

// #define LOGO_HEIGHT   16
// #define LOGO_WIDTH    16

// const int buttonPins[] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
// const char* functions[] = {"C", "D", "NOT", "A", "B", "+", "(", ")", ".", "'", "NOT"};

// void setup() {
//   Serial.begin(9600);

//   if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
//     Serial.println(F("SSD1306 allocation failed"));
//     for(;;); 
//   }

//   display.display();
//   delay(100); 
//   display.clearDisplay();

//   display.setTextSize(1);             
//   display.setTextColor(SSD1306_WHITE);

//   testdrawstyles();   

//   for (int i=0;i<11;i++) pinMode(buttonPins[i], INPUT_PULLUP);
// }

// void loop() {
//   readButton();

// }

// void testdrawstyles(void) {
//   display.clearDisplay();
//   display.setCursor(0,0); display.println(F("Hello, world!"));
//   display.display();
// }

// int x=0;
// void readButton()
// {
//   for (int i = 0; i < 11; i++) {
//     if (digitalRead(buttonPins[i]) == LOW) { // Button pressed
//       Serial.print(functions[i]);
//       display.setCursor(x,20); display.print(functions[i]);
//       display.display();
//       while(digitalRead(buttonPins[i]) == LOW);
//       delay(300);
//       x+=10;
//     }
//   }
// }

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET     -1
#define SCREEN_ADDRESS 0x3C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

const int buttonPins[] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
const char* functions[] = {"C", "D", "'", "A", "B", "+", "(", ")", ".", "'", "NOT"};

String equation = "";

void setup() {
  Serial.begin(9600);

  if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
    Serial.println(F("SSD1306 allocation failed"));
    for(;;);
  }

  display.display();
  delay(100);
  display.clearDisplay();

  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);

  display.setCursor(0,0);
  display.println(F("Boolean Simplifier"));
  display.display();

  for (int i = 0; i < 11; i++) {
    pinMode(buttonPins[i], INPUT_PULLUP);
  }
}

void loop() {
  readButton();
}

int x = 0;
void readButton() {
  for (int i = 0; i < 11; i++) {
    if (digitalRead(buttonPins[i]) == LOW) { // Button pressed
      Serial.print(functions[i]);
      equation += functions[i];
      display.setCursor(x, 20);
      display.print(functions[i]);
      display.display();
      while (digitalRead(buttonPins[i]) == LOW);
      delay(300);
      x += 10;
    }
  }
}

void simplifyEquation() {
  // Example equation to simplify: \overline{A}B + AB + \overline{A}\overline{B}C
  
  // Populate the K-map manually for this example
  int kMap[4][2] = {
    {0, 1},  // 00: A=0, B=0 -> C=0, C=1
    {1, 1},  // 01: A=0, B=1 -> C=0, C=1
    {0, 0},  // 10: A=1, B=0 -> C=0, C=1
    {1, 1}   // 11: A=1, B=1 -> C=0, C=1
  };

  // Display the K-map
  display.clearDisplay();
  display.setCursor(0, 0);
  display.println("K-map:");
  for (int i = 0; i < 4; i++) {
    for (int j = 0; j < 2; j++) {
      display.print(kMap[i][j]);
      display.print(" ");
    }
    display.println();
  }
  display.display();
  delay(2000);

  // Simplified equation (manually simplified for this example)
  String simplifiedEquation = "B + A'C";
  display.clearDisplay();
  display.setCursor(0, 0);
  display.println("Simplified:");
  display.setCursor(0, 20);
  display.print(simplifiedEquation);
  display.display();
}