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

#define TFT_CS     10
#define TFT_RST    9
#define TFT_DC     8
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64

#define TFT_WIDTH  240
#define TFT_HEIGHT 240

Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_RST);
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
RTC_DS3231 rtc;

#define BLACK       0x0000
#define WHITE       0xFFFF
#define RED         0xF800
#define GREEN       0x07E0
#define BLUE        0x001F
#define YELLOW      0xFFE0

int clockCenterX = TFT_WIDTH / 2 - 30;
int clockCenterY = TFT_HEIGHT / 2;

void setup() {
  Serial.begin(9600);
  Serial.println("Initializing...");

  if (!rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
  }

  if (rtc.lostPower()) {
    Serial.println("RTC lost power, setting the time!");
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  }

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

  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(0,0);
  display.display();

  tft.init(TFT_WIDTH, TFT_HEIGHT);
  tft.setRotation(1);
  tft.fillScreen(BLACK); // Clear the screen
  Serial.println("Display initialized.");

  drawClockFace();
  Serial.println("Clock face drawn.");
}

void loop() {
  DateTime now = rtc.now();
  display.clearDisplay();
  display.setCursor(0, 0);
  display.print("Time: ");
  display.print(now.hour(), DEC);
  display.print(':');
  display.print(now.minute(), DEC);
  display.print(':');
  display.print(now.second(), DEC);
  display.display();

  drawClockHands(now.hour(), now.minute(), now.second());
  delay(1000); // Update every second
}

void drawClockFace() {
  tft.fillScreen(BLACK); // Clear the screen
  tft.drawCircle(clockCenterX, clockCenterY, 100, WHITE);

  // Draw the clock numbers
  tft.setTextSize(2);
  tft.setTextColor(WHITE);

  for (int i = 1; i <= 12; i++) {
    float angle = i * 30 * PI / 180;
    int x = clockCenterX + 90 * cos(angle - PI / 2);
    int y = clockCenterY + 90 * sin(angle - PI / 2);
    tft.setCursor(x - 5, y - 5);
    tft.print(i);
  }
}

void drawClockHands(int hours, int minutes, int seconds) {
  static int prevSecond = -1;
  static int prevMinute = -1;
  static int prevHour = -1;

  float hourAngle = (hours + minutes / 60.0) * 30 * PI / 180;
  float minuteAngle = (minutes + seconds / 60.0) * 6 * PI / 180;
  float secondAngle = seconds * 6 * PI / 180;

  int hx = clockCenterX + 50 * cos(hourAngle - PI / 2);
  int hy = clockCenterY + 50 * sin(hourAngle - PI / 2);
  int mx = clockCenterX + 70 * cos(minuteAngle - PI / 2);
  int my = clockCenterY + 70 * sin(minuteAngle - PI / 2);
  int sx = clockCenterX + 90 * cos(secondAngle - PI / 2);
  int sy = clockCenterY + 90 * sin(secondAngle - PI / 2);

  if (prevSecond != seconds) {
    // Clear the previous hands
    if (prevHour != -1 && prevMinute != -1 && prevSecond != -1) {
      float prevHourAngle = (prevHour + prevMinute / 60.0) * 30 * PI / 180;
      float prevMinuteAngle = (prevMinute + prevSecond / 60.0) * 6 * PI / 180;
      float prevSecondAngle = prevSecond * 6 * PI / 180;

      int prevHx = clockCenterX + 50 * cos(prevHourAngle - PI / 2);
      int prevHy = clockCenterY + 50 * sin(prevHourAngle - PI / 2);
      int prevMx = clockCenterX + 70 * cos(prevMinuteAngle - PI / 2);
      int prevMy = clockCenterY + 70 * sin(prevMinuteAngle - PI / 2);
      int prevSx = clockCenterX + 90 * cos(prevSecondAngle - PI / 2);
      int prevSy = clockCenterY + 90 * sin(prevSecondAngle - PI / 2);

      tft.drawLine(clockCenterX, clockCenterY, prevHx, prevHy, BLACK);
      tft.drawLine(clockCenterX, clockCenterY, prevMx, prevMy, BLACK);
      tft.drawLine(clockCenterX, clockCenterY, prevSx, prevSy, BLACK);
    }

    // Draw the new hands
    tft.drawLine(clockCenterX, clockCenterY, hx, hy, RED);
    tft.drawLine(clockCenterX, clockCenterY, mx, my, GREEN);
    tft.drawLine(clockCenterX, clockCenterY, sx, sy, YELLOW);

    // Update previous values
    prevHour = hours;
    prevMinute = minutes;
    prevSecond = seconds;
  }
}
uno:A5.2
uno:A4.2
uno:AREF
uno:GND.1
uno:13
uno:12
uno:11
uno:10
uno:9
uno:8
uno:7
uno:6
uno:5
uno:4
uno:3
uno:2
uno:1
uno:0
uno:IOREF
uno:RESET
uno:3.3V
uno:5V
uno:GND.2
uno:GND.3
uno:VIN
uno:A0
uno:A1
uno:A2
uno:A3
uno:A4
uno:A5
st7789Breakout
chip1:DC
chip1:CS
chip1:SDA
chip1:SCL
chip1:GND
chip1:VCC
chip1:RST
GND5VSDASCLSQWRTCDS1307+
rtc1:GND
rtc1:5V
rtc1:SDA
rtc1:SCL
rtc1:SQW