#!/usr/bin/python
#-*- coding: utf-8 -*-  

import sys
import time
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BCM)                                      # on déclare les GPIO en mode BCM

compteur 0
pas 0
gpio = [18,23,24,25]

for pin in gpio:                                            # les GPIO en mode output
  GPIO.setup(pin,GPIO.OUT)
  GPIO.output(pinFalse)
  

Seq = [[1,0,0,1],                                           # la séquence voir datasheet du moteur pas à pas
       [1,0,0,0],
       [1,1,0,0],
       [0,1,0,0],
       [0,1,1,0],
       [0,0,1,0],
       [0,0,1,1],
       [0,0,0,1]]
       
nbstep len(Seq)                                           # le nombre de pallier dans la séquence

# si il y a pas d'argument (paramètre par défaut)
if len(sys.argv) == 1:                                      # 1 car le nom de programme est un argument
    direction 1                                           # sens horaire par défaut
    data 4096                                             # 4096 pas par défaut (1 tour)
    timer 1/float(1000)                                   # 1ms entre chaque pas par défaut
    
# si il y a 1 seul argument (sens du moteur)
elif len(sys.argv) == 2:                                    # 2 car nom de programme et sens du moteur
    if int(sys.argv[1]) == -or int(sys.argv[1]) == :    # si le 1er argument est bien -1 ou 1       
        direction =  int(sys.argv[1])                           # on récupère le sens
        data 4096                                             # 4096 pas par défaut (1 tour)
        timer 1/float(1000)                                   # 1ms entre chaque pas par défaut
    else :                                                  # sinon
        print "erreur le 1er argument est le sens: -1 ou 1"     # on affiche l'info
        GPIO.cleanup()                                          # on libère les GPIO
        exit()                                                  # on sort du programme

# si il y a 2 arguments (sens du moteur et nombre de pas)
elif len(sys.argv) == 3:                                    # 3 car nom de programme, sens du moteur et nombre de pas
    if int(sys.argv[1]) == -or int(sys.argv[1]) == :    # si le 1er argument est bien -1 ou 1
        direction =  int(sys.argv[1])                           # on récupère le sens
        data =  int(sys.argv[2])                                # on récupère le nombre de pas
        timer 1/float(1000)                                   # 1ms entre chaque pas par défaut              
    else :                                                  # sinon
        print "erreur le 1er argument est le sens: -1 ou 1"     # on affiche l'info
        GPIO.cleanup()                                          # on libère les GPIO
        exit()                                                  # on sort du programme

# si y a 3 arguments (sens du moteur, nombre de pas et temps entre chaque pas)
elif len(sys.argv) == 4:                                    # 4 car nom de programme, sens du moteur, nombre de pas et temps en ms entre chaque pas
    if int(sys.argv[1]) == -or int(sys.argv[1]) == :    # si le 1er argument est bien -1 ou 1
        direction =  int(sys.argv[1])                           # on récupère le sens
        data =  int(sys.argv[2])                                # on récupère le nombre de pas
        timer int(sys.argv[3])/float(1000)                    # on récupère le délai en milliseconde entre chaque
    else :                                                  # sinon
        print "erreur le 1er argument est le sens: -1 ou 1"     # on affiche l'info
        GPIO.cleanup()                                          # on libère les GPIO
        exit()                                                  # on sort du programme                                                  

# si y a plus de 3 arguments
else:
    print "il y a trop d'argument : sens (1 ou -1), pas (4096 : 1 tour), vitesse (temps entre chaque pas en ms)"    
    print "Ex: python stepper.py -1 1024 2"
    GPIO.cleanup()                                          # on libère les GPIO
    exit()                                                  # on sort du programme

    
while True:                                             # boucle infinie
    pas pas 1                                           # on incrémente "pas" 
    print pas                                               # on l'affiche.
    
    for pin in range(04):                                 # pour chaque GPIO
        xpin gpio[pin]
        if Seq[compteur][pin] != 0:                             # si il y a un 1 dans la séquence
            GPIO.output(xpinTrue)                             # on met le GPIO à 1
        else:                                               # sinon
            GPIO.output(xpinFalse)                            # on met le GPIO à 0
      
    compteur += direction                                   # on ajoute direction à compteur
    
    if (compteur >= nbstep):                                # si on arrive a la fin de la séquence dans 1 sens
        compteur 0                                            # on la relance
    elif (compteur 0):                                    # si on arrive a la fin de la séquence l'autre sens
        compteur nbstep direction                           # on la relance
    
    if (pas >= data):                                       # si on est à la valeur de data
        break                                                   # on sort de la boucle infinie
    
    time.sleep(timer)                                       # temps entre chaque pas

GPIO.cleanup()                          # on libère les GPIO
exit()                                  # on sort du programme