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

Adafruit_SSD1306 display(128, 64, &Wire, -1);

const uint8_t Q0_PIN = 3;
const uint8_t TOUCH_THRESHOLD = 6;

bool showName = false;
bool fingerDown = false;
uint8_t pressSamples = 0;
uint8_t releaseSamples = 0;

uint8_t readQ0() {
  pinMode(Q0_PIN, OUTPUT);
  digitalWrite(Q0_PIN, LOW);
  delayMicroseconds(25);
  pinMode(Q0_PIN, INPUT_PULLUP);

  uint8_t count = 0;
  while (digitalReadFast(Q0_PIN) == LOW && count < 200) {
    count++;
  }
  return count;
}

void drawText() {
  display.clearDisplay();
  display.setTextColor(SSD1306_WHITE);
  display.setTextSize(2);

  if (showName) {
    display.setCursor(16, 12);
    display.println("Xiangtao");
    display.setCursor(46, 36);
    display.print("Shi");
    Serial.println("Xiangtao Shi");
  } else {
    display.setCursor(4, 24);
    display.print("HTMAA 2026");
    Serial.println("HTMAA 2026");
  }

  display.display();
}

void setup() {
  Serial.begin(115200);
  Wire.setSDA(6);
  Wire.setSCL(7);

  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    while (true) {
      Serial.println("OLED not found at 0x3C");
      delay(1000);
    }
  }

  drawText();
}

void loop() {
  bool touched = readQ0() > TOUCH_THRESHOLD;

  if (touched) {
    releaseSamples = 0;
    if (pressSamples < 2) pressSamples++;

    if (pressSamples >= 2 && !fingerDown) {
      fingerDown = true;
      showName = !showName;
      drawText();
    }
  } else {
    pressSamples = 0;
    if (releaseSamples < 5) releaseSamples++;
    if (releaseSamples >= 5) fingerDown = false;
  }

  delay(20);
}
