from time import sleep
import pigpio

motor="H"

if motor=="V":
    ENA = 19
    DIR = 13
    STEP = 6
elif motor=="H":
    ENA = 21
    DIR = 20     # Direction GPIO Pin
    STEP = 16    # Step GPIO Pin
    # SWITCH = *UNDEF*  # GPIO pin of switch

# Connect to pigpiod daemon
pi = pigpio.pi()

# Set up pins as an output
pi.set_mode(DIR, pigpio.OUTPUT)
pi.set_mode(STEP, pigpio.OUTPUT)
pi.set_mode(ENA, pigpio.OUTPUT)

pi.write(ENA, pigpio.LOW)

# Set up input switch
# pi.set_mode(SWITCH, pigpio.INPUT)
# pi.set_pull_up_down(SWITCH, pigpio.PUD_UP)

# MODE = (14, 15, 18)   # Microstep Resolution GPIO Pins
# RESOLUTION = {'Full': (0, 0, 0),
#               'Half': (1, 0, 0),
#               '1/4': (0, 1, 0),
#               '1/8': (1, 1, 0),
#               '1/16': (0, 0, 1),
#               '1/32': (1, 0, 1)}
# for i in range(3):
#     pi.write(MODE[i], RESOLUTION['Full'][i])


def generate_ramp(ramp):
    """Generate ramp wave forms.

    ramp:  List of [Frequency, Steps]
    """
    pi.wave_clear()     # clear existing waves
    length = len(ramp)  # number of ramp levels
    wid = [-1] * length

    # Generate a wave per ramp level
    for i in range(length):
        frequency = ramp[i][0]
        micros = int(500000 / frequency)
        wf = []
        wf.append(pigpio.pulse(1 << STEP, 0, micros))  # pulse on
        wf.append(pigpio.pulse(0, 1 << STEP, micros))  # pulse off
        pi.wave_add_generic(wf)
        wid[i] = pi.wave_create()

    # Generate a chain of waves
    chain = []
    for i in range(length):
        steps = ramp[i][1]
        x = steps & 255
        y = steps >> 8
        chain += [255, 0, wid[i], 255, 1, x, y]

    pi.wave_chain(chain)  # Transmit chain.


try:
    old_ramp = 0
    loop = 0
    reps = 0
    replen = 1
    running = True
    while running:
#         new_ramp = pi.read(SWITCH)  # Read switch
        new_ramp = 1
        if new_ramp != old_ramp:
            if new_ramp:
                # Ramp up
                generate_ramp([[150,200],[240,200],[480,200],[660,200]])
#                generate_ramp([[320, 200],[500, 400],[800, 500],[1000, 700],[1600, 900],[2000, 10000]])
            else:
                # Ramp down
                generate_ramp([[1600, 900],
                               [1000, 700],
                               [500, 500],
                               [320, 400]])

            old_ramp = new_ramp
        sleep(.1)
        loop += 1
        if loop>replen:
            loop = 0
            reps += 1
            curwav = pi.wave_tx_at()
            print("repetition {0} started, wave is at {1}".format(reps,curwav),end="\r")
            if curwav==9999:
                running = False
    print("Running ended")

except KeyboardInterrupt:
    print ("\nCtrl-C pressed.  Stopping PIGPIO and exiting...")
except Exception as ue:
    print("\nException detected")
finally:
    pi.write(ENA,pigpio.HIGH)
    pi.wave_clear()
    pi.stop()
