import RPi.GPIO as GPIO
from time import sleep

# Pins in BOARD-Mode
PUL1, DIR1 = 12, 35  # X-Achse (GPIO 18, GPIO 19)
PUL2, DIR2 = 15, 16  # Y-Achse (GPIO 22, GPIO 23)
PUL3, DIR3 = 18, 37  # Z-Achse (GPIO 24, GPIO 26)

CW = 1
CCW = 0
turns = 3  # 3 Umdrehungen
steps_per_turn = 1600  # 1/8 Microstep
total_steps = turns * steps_per_turn  # 4800 Schritte
speed = 0.0005  # Startwert, erhöhe bei Buzzing

GPIO.setmode(GPIO.BOARD)
GPIO.setup(PUL1, GPIO.OUT)
GPIO.setup(DIR1, GPIO.OUT)
GPIO.setup(PUL2, GPIO.OUT)
GPIO.setup(DIR2, GPIO.OUT)
GPIO.setup(PUL3, GPIO.OUT)
GPIO.setup(DIR3, GPIO.OUT)

try:
    while True:
        # Vorwärts (3 Umdrehungen)
        GPIO.output(DIR1, CW)
        GPIO.output(DIR2, CW)
        GPIO.output(DIR3, CW)
        print("Vorwärts 3 Umdrehungen...")
        for _ in range(total_steps):
            GPIO.output(PUL1, GPIO.HIGH)
            GPIO.output(PUL2, GPIO.HIGH)
            GPIO.output(PUL3, GPIO.HIGH)
            sleep(speed)
            GPIO.output(PUL1, GPIO.LOW)
            GPIO.output(PUL2, GPIO.LOW)
            GPIO.output(PUL3, GPIO.LOW)
            sleep(speed)
        print("Vorwärts abgeschlossen")

        sleep(1.0)  # Pause zwischen Richtungen

        # Rückwärts (3 Umdrehungen)
        GPIO.output(DIR1, CCW)
        GPIO.output(DIR2, CCW)
        GPIO.output(DIR3, CCW)
        print("Rückwärts 3 Umdrehungen...")
        for _ in range(total_steps):
            GPIO.output(PUL1, GPIO.HIGH)
            GPIO.output(PUL2, GPIO.HIGH)
            GPIO.output(PUL3, GPIO.HIGH)
            sleep(speed)
            GPIO.output(PUL1, GPIO.LOW)
            GPIO.output(PUL2, GPIO.LOW)
            GPIO.output(PUL3, GPIO.LOW)
            sleep(speed)
        print("Rückwärts abgeschlossen")

        sleep(1.0)  # Pause vor nächstem Zyklus

except KeyboardInterrupt:
    print("Cleanup")
    GPIO.cleanup()