#include "PhiGPS.h"

/*
 ===========================================================
    PhiGPS.cpp - VERSION v5.3 CORRECTED
    GPS NMEA parsing avec satellites + TIMEOUT
    
    FIX: Reset automatique si pas de données pendant 2s
    Animation de recherche quand count = 0
 ===========================================================
*/

PhiGPS::PhiGPS() 
: _lat(0), _lon(0), _alt(0), _fix(false), _sats(0), _idx(0), _lastUpdate(0) {}

bool PhiGPS::begin() {
    Serial1.begin(9600);  // GY-GPS6MV2 TX→D0(RX), RX→D1(TX)
    Serial.println("✓ PhiGPS (GY-GPS6MV2 + satellites + timeout)");
    _lastUpdate = millis();  // Initialiser timestamp
    return true;
}

void PhiGPS::update() {
    // TIMEOUT CHECK: Si pas de données NMEA pendant 2 secondes
    // → Reset satellites et fix (affichera animation de recherche)
    uint32_t now = millis();
    if (now - _lastUpdate > GPS_TIMEOUT_MS) {
        // Pas de données récentes → GPS déconnecté ou pas de fix
        _sats = 0;           // Force animation de recherche
        _fix = false;
        // Ne pas reset position (garde dernière position connue)
        // Mais qualité signal = 0
    }
    
    // Parser données NMEA si disponibles
    while (Serial1.available()) {
        char c = Serial1.read();
        if (c == '\n') {
            _buf[_idx] = 0;
            if (strncmp(_buf, "$GPGGA", 6) == 0) {
                _parseGGA(_buf);
                _lastUpdate = millis();  // Données fraîches reçues
            }
            _idx = 0;
        } else if (_idx < 99) {
            _buf[_idx++] = c;
        }
    }
}

void PhiGPS::_parseGGA(char* s) {
    char *p = strtok(s, ",");
    for (int i = 0; i < 10 && p; i++, p = strtok(NULL, ",")) {
        if (i == 2) {
            // Conversion NMEA ddmm.mmmm → dd.dddd
            float ddmm = atof(p);
            int dd = (int)(ddmm / 100);
            float mm = ddmm - (dd * 100.0f);
            _lat = dd + mm / 60.0f;
        }
        if (i == 4) {
            // Conversion NMEA dddmm.mmmm → ddd.dddd
            float dddmm = atof(p);
            int ddd = (int)(dddmm / 100);
            float mm = dddmm - (ddd * 100.0f);
            _lon = ddd + mm / 60.0f;
        }
        if (i == 6) _fix = (*p == '1' || *p == '2');
        if (i == 7) _sats = atoi(p);  // Nombre satellites
        if (i == 9) _alt = atof(p);
    }
}