# Python 3 Telemetry GUI - Tkinter & PySerial
import tkinter as tk
from tkinter import ttk
import serial
import threading
import sys

# Configure Serial connection
SERIAL_PORT = 'COM3' # Change to '/dev/ttyUSB0' on Linux
BAUD_RATE = 115200

try:
    ser = serial.Serial(SERIAL_PORT, BAUD_RATE, timeout=0.1)
except Exception as e:
    print(f"Error opening port {SERIAL_PORT}: {e}")
    ser = None

class TelemetryApp(tk.Tk):
    def __init__(self):
        super().__init__()
        self.title("Go-Kart Live Telemetry")
        self.geometry("400x300")
        self.configure(bg="#222")
        
        # Heading
        self.header = tk.Label(self, text="KART TELEMETRY STATUS", font=("Arial", 16, "bold"), fg="cyan", bg="#222")
        self.header.pack(pady=10)
        
        # Speed Label
        self.speed_val = tk.StringVar(value="0 km/h")
        self.speed_lbl = tk.Label(self, textvariable=self.speed_val, font=("Arial", 28, "bold"), fg="white", bg="#222")
        self.speed_lbl.pack(pady=10)
        
        # Throttle Progress Bar
        self.bar_lbl = tk.Label(self, text="Throttle Level:", font=("Arial", 10), fg="white", bg="#222")
        self.bar_lbl.pack()
        self.progress = ttk.Progressbar(self, orient="horizontal", length=300, mode="determinate")
        self.progress.pack(pady=10)
        
        # Voltage Label
        self.volt_val = tk.StringVar(value="Voltage: 0.0V")
        self.volt_lbl = tk.Label(self, textvariable=self.volt_val, font=("Arial", 12), fg="yellow", bg="#222")
        self.volt_lbl.pack(pady=10)
        
        # Run background thread for serial read
        self.running = True
        self.thread = threading.Thread(target=self.read_serial, daemon=True)
        self.thread.start()
        
    def read_serial(self):
        while self.running:
            if ser and ser.in_waiting > 0:
                try:
                    line = ser.readline().decode('utf-8').strip()
                    if line.startswith("$"):
                        # Parse CSV data: e.g. "$78,35,41.8"
                        data = line[1:].split(",")
                        if len(data) == 3:
                            throttle = int(data[0])
                            speed = int(data[1])
                            voltage = float(data[2])
                            
                            # Update Tkinter variables safely
                            self.progress['value'] = throttle
                            self.speed_val.set(f"{speed} km/h")
                            self.volt_val.set(f"Battery: {voltage} V")
                except Exception as e:
                    pass
                    
    def destroy(self):
        self.running = False
        if ser:
            ser.close()
        super().destroy()

if __name__ == "__main__":
    app = TelemetryApp()
    app.mainloop()
