﻿#!/usr/bin/env python

import socket
import sys
import time
import pynmea2
import os


def buildGP(data):
    ts, lat, lon, alt = data.split(",")
    alt="0"

    # Conversion latitude / longitude en format NMEA
    lat = float(lat)
    lon = float(lon)
    
    lat_deg = int(abs(lat))
    lat_min = (abs(lat) - lat_deg) * 60
    lat_hemisphere = "N" if lat >= 0 else "S"
    
    lon_deg = int(abs(lon))
    lon_min = (abs(lon) - lon_deg) * 60
    lon_hemisphere = "E" if lon >= 0 else "W"
    
    # Création d'une phrase GGA
    msg = pynmea2.GGA(
        'GP',  
        'GGA',
        (
            ts, 
            f"{lat_deg:02d}{lat_min:06.3f}",            # latitude NMEA
            lat_hemisphere,
            f"{lon_deg:03d}{lon_min:06.3f}",            # longitude NMEA
            lon_hemisphere,
            "1",              # fix quality (1 = GPS)
            "8",              # nombre de satellites
            "1.0",            # HDOP
            alt,     # altitude
            "M",            # unité mètre
            "0",              # geoid separation
            "M",
            "",
            ""
        )
    )
    sentence = str(msg)
    return sentence

def envoi(UDP_IP, UDP_PORT, fichier, delai):
    sock = socket.socket(socket.AF_INET, 
                         socket.SOCK_DGRAM) 
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
    print("Ctrl-C pour sortir ")
    while True:
        try:
            last_line = lectureDerniereLigne(fichier)
            mess=buildGP(last_line)
            if mess!=None:
                if len(mess) < 1:
                    sock.close()
                    return True
                mess = mess.strip()
                mess = mess + u"\r\n"
                sock.sendto(mess.encode("utf-8"),(UDP_IP, UDP_PORT))
            time.sleep(delai) 

        except KeyboardInterrupt:
            sock.close()
            return True
        except Exception as msg:
            print(msg)
            sock.close()
            return False

def lectureDerniereLigne(filename):
    last_line = ""
    try:
        # lire seulement la dernière ligne existante
        with open(filename, "rb") as f:
            f.seek(-2, os.SEEK_END)
    
            # remonter jusqu'au début de la dernière ligne
            while f.read(1) != b"\n":
                f.seek(-2, os.SEEK_CUR)
    
            last_line = f.readline().decode().strip()
    
    except OSError:
        # fichier trop petit (ex: 1 seule ligne)
        with open(filename, "r") as f:
            last_line = f.read().strip()
    return last_line    


def main():

    delai = 2
    fichier = "gps.csv"
    lectureDerniereLigne(fichier)
    codeRetour= False
    portDest = 9666
    ipDest = "127.0.0.1"
    codeRetour = envoi(ipDest, portDest, fichier, delai)

    if codeRetour == True:
        print("Sortie normale.")
    else:
        print("Une erreur est survenue.")
    sys.exit()

if __name__ == "__main__":
    main()
