import _thread
from machine import Pin
from shared import get_lora
from shared import deviceTypes
from shared import config
import time

# --- Configuration Matérielle ---
vext = Pin(19, Pin.OUT)
vext.value(0)
time.sleep_ms(100)

# --- Lecture de l'ID unique de l'ESP ---
try:
    with open("device_id.txt", "r") as f:
        DEVICE_ID = f.read().strip()
except Exception:
    DEVICE_ID = "ESP32_Inconnu"

# --- Initialisation LoRa ---
lora = get_lora()
lora.configure(freq=868.1, sf=7)

print(f"ESP32 initialisé avec l'ID : '{DEVICE_ID}' (Type : {deviceTypes.DEVICE_TYPES['MICROWAVE']})")

def heartbeat_loop():
    while True:
        print(f"\nESP32 : Envoi du Heartbeat...")
        # Envoi périodique
        ping_payload = {
            "id": DEVICE_ID,
            "type": deviceTypes.DEVICE_TYPES["MICROWAVE"]
        }
        lora.send(ping_payload)
        
        # Le receive_packet est maintenant protégé par le lock dans lora_device
        # Si le main thread utilise la radio, ce thread attendra son tour
        paquet = lora.receive_packet(timeout_ms=2000)
        
        if paquet and not paquet["raw"]:
            donnees = paquet["data"]
            # Vérification si le paquet reçu est bien la réponse attendue de l'orchestrateur
            if donnees.get("type") == deviceTypes.DEVICE_TYPES["ORCHESTRATOR"]:
                print(f"ESP32 : Réponse reçue de l'orchestrateur '{donnees.get('id')}' ! [Statut: ALIVE]")
            else:
                print(f"ESP32 : Paquet reçu d'un type inattendu : {donnees.get('type')}")
        else:
            print("ESP32 : Pas de réponse de l'orchestrateur (Le RPI est-il éteint ?)")
        
        time.sleep(config.HEARTBEAT_INTERVAL)

# Lancer la boucle de heartbeat dans un thread séparé
_thread.start_new_thread(heartbeat_loop, ())

while True:
    # Fait rien pour l'instant
    time.sleep(1)