import tkinter as tk
import obd
import threading
import time

# Global OBD connection
connection = obd.OBD(fast=False)  # Non-aggressive startup

# Setup UI
root = tk.Tk()
root.title("Car RPM Display")
root.geometry("300x150")
root.configure(bg="black")

rpm_label = tk.Label(root, text="RPM: ---", font=("Helvetica", 32), fg="lime", bg="black")
rpm_label.pack(expand=True)

# Session counter to reinit every 10 reads
read_counter = 0

def update_rpm():
    global read_counter, connection
    while True:
        if connection.is_connected():
            try:
                response = connection.query(obd.commands.RPM, force=True)
                if response and not response.is_null():
                    rpm = int(response.value.magnitude)
                    rpm_label.config(text=f"RPM: {rpm}")
                else:
                    rpm_label.config(text="RPM: ---")
            except Exception as e:
                rpm_label.config(text="Error")
                print("[ERROR]", e)
        else:
            rpm_label.config(text="Disconnected")

        read_counter += 1

        # Soft reset after 10 polls to keep ECU happy
        if read_counter >= 10:
            read_counter = 0
            print("[INFO] Reinitializing connection to avoid timeout...")
            connection.close()
            time.sleep(0.5)
            connection = obd.OBD(fast=False)

        time.sleep(1.5)  # Slightly more relaxed than 1s

# Start thread
threading.Thread(target=update_rpm, daemon=True).start()

# Launch UI
root.mainloop()
