#include <Wire.h>
#include <SD.h>
#include <SPI.h>
#include <SparkFun_u-blox_GNSS_v3.h>

SFE_UBLOX_GNSS myGNSS;
const int chipSelect = 10; // SPI CSピン

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

  pinMode(LEDR, OUTPUT); digitalWrite(LEDR, HIGH);
  pinMode(LEDG, OUTPUT); digitalWrite(LEDG, HIGH);
  pinMode(LEDB, OUTPUT); digitalWrite(LEDB, HIGH);

  // GPSモジュールの初期化
  // QwiicポートのI2CはWire1を指定する。
  Wire1.begin();
  if (myGNSS.begin(Wire1) == false) {
    Serial.println("u-blox GNSS not detected.");
    // 無限ループで処理を停止させる。
    digitalWrite(LEDR, LOW);
    while (1);
  }
  // SDカードの初期化
  if (!SD.begin(chipSelect)) {
    Serial.println("SD init failed!");
    digitalWrite(LEDG, LOW);
    while (1);
  }
  Serial.println("SD card initialized.");

  // ヘッダを書き込み（なければ）
  if (!SD.exists("log.csv")) {
    File logFile = SD.open("log.csv", FILE_WRITE);
    if (logFile) {
      logFile.println("# 時刻,緯度,経度");
      logFile.close();
    }
  }
  digitalWrite(LEDB, LOW);
}

void loop()
{
  // すべての情報を取得し内部にキャッシュする。
  if (myGNSS.getPVT()) {
    // 時刻取得(UTC)
    char timestamp[30];
    snprintf(timestamp, sizeof(timestamp), "%04d-%02d-%02dT%02d:%02d:%02dZ",
            myGNSS.getYear(), myGNSS.getMonth(), myGNSS.getDay(),
            myGNSS.getHour(), myGNSS.getMinute(), myGNSS.getSecond());

    // SDカードに書き込み
    File logFile = SD.open("log.csv", FILE_WRITE);
    if (logFile) {
      logFile.print(timestamp);
      logFile.print(",");
      logFile.print(myGNSS.getLatitude() / 1e7, 7);
      logFile.print(",");
      logFile.println(myGNSS.getLongitude() / 1e7, 7);
      logFile.close();
      Serial.println("Logged: " + String(timestamp));
    } else {
      Serial.println("Failed to open log.csv");
    }
  }
  delay(1000);
}
