import RPi.GPIO as GPIO
import time

# -----------------------------
# Configuration des GPIO
# -----------------------------
GPIO.setmode(GPIO.BCM)

# Sorties pour les relais
RELAIS_A = 17
RELAIS_B = 27

# Entrées : fins de course
FIN_A = 22
FIN_B = 23

# Entrées : boutons poussoirs
BP_AVANT = 5
BP_ARRIERE = 6

GPIO.setup(RELAIS_A, GPIO.OUT)
GPIO.setup(RELAIS_B, GPIO.OUT)

GPIO.setup(FIN_A, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(FIN_B, GPIO.IN, pull_up_down=GPIO.PUD_UP)

GPIO.setup(BP_AVANT, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(BP_ARRIERE, GPIO.IN, pull_up_down=GPIO.PUD_UP)

# Relais off au départ
GPIO.output(RELAIS_A, GPIO.LOW)
GPIO.output(RELAIS_B, GPIO.LOW)


# -----------------------------
# Fonctions moteur
# -----------------------------
def stop():
    GPIO.output(RELAIS_A, GPIO.LOW)
    GPIO.output(RELAIS_B, GPIO.LOW)
    print("Moteur arrêté")


def avance():
    GPIO.output(RELAIS_B, GPIO.LOW)   # sécurité
    GPIO.output(RELAIS_A, GPIO.HIGH)
    print("Moteur en AVANCE")


def recule():
    GPIO.output(RELAIS_A, GPIO.LOW)   # sécurité
    GPIO.output(RELAIS_B, GPIO.HIGH)
    print("Moteur en RECUL")


# -----------------------------
# Déplacements automatiques
# -----------------------------
def aller_en_avant():
    print("→ Déplacement vers l’avant")
    avance()

    while True:
        # fin de course avant atteinte ?
        if GPIO.input(FIN_A) == GPIO.LOW:
            print("Fin de course AVANT atteint")
            stop()
            break
        time.sleep(0.02)


def aller_en_arriere():
    print("→ Déplacement vers l’arrière")
    recule()

    while True:
        # fin de course arrière atteinte ?
        if GPIO.input(FIN_B) == GPIO.LOW:
            print("Fin de course ARRIERE atteint")
            stop()
            break
        time.sleep(0.02)


# -----------------------------
# Programme principal
# -----------------------------
print("Programme démarré : utiliser les boutons poussoirs.")

try:
    while True:

        # -----------------------------
        # Si on appuie sur le bouton AVANT
        # -----------------------------
        if GPIO.input(BP_AVANT) == GPIO.LOW:  # active à LOW
            print("Bouton AVANT pressé")
            aller_en_avant()

        # -----------------------------
        # Si on appuie sur le bouton ARRIERE
        # -----------------------------
        if GPIO.input(BP_ARRIERE) == GPIO.LOW:
            print("Bouton ARRIERE pressé")
            aller_en_arriere()

        time.sleep(0.05)  # anti rebond minimal + charge CPU

except KeyboardInterrupt:
    pass

finally:
    stop()
    GPIO.cleanup()
    print("GPIO nettoyés, programme terminé.")
