diff --git a/dw640HAT/dw640HAT.py b/dw640HAT/dw640HAT.py index 0c25c4d..83636b5 100644 --- a/dw640HAT/dw640HAT.py +++ b/dw640HAT/dw640HAT.py @@ -5,172 +5,172 @@ from Adafruit_PWM_Servo_Driver import PWM import time # class Adafruit_StepperMotor: -# MICROSTEPS = 8 -# MICROSTEP_CURVE = [0, 50, 98, 142, 180, 212, 236, 250, 255] +# MICROSTEPS = 8 +# MICROSTEP_CURVE = [0, 50, 98, 142, 180, 212, 236, 250, 255] # -# #MICROSTEPS = 16 -# # a sinusoidal curve NOT LINEAR! -# #MICROSTEP_CURVE = [0, 25, 50, 74, 98, 120, 141, 162, 180, 197, 212, 225, 236, 244, 250, 253, 255] +# #MICROSTEPS = 16 +# # a sinusoidal curve NOT LINEAR! +# #MICROSTEP_CURVE = [0, 25, 50, 74, 98, 120, 141, 162, 180, 197, 212, 225, 236, 244, 250, 253, 255] # -# def __init__(self, controller, num, steps=200): -# self.MC = controller -# self.revsteps = steps -# self.motornum = num -# self.sec_per_step = 0.1 -# self.steppingcounter = 0 -# self.currentstep = 0 +# def __init__(self, controller, num, steps=200): +# self.MC = controller +# self.revsteps = steps +# self.motornum = num +# self.sec_per_step = 0.1 +# self.steppingcounter = 0 +# self.currentstep = 0 # -# num -= 1 +# num -= 1 # -# if (num == 0): -# self.PWMA = 8 -# self.AIN2 = 9 -# self.AIN1 = 10 -# self.PWMB = 13 -# self.BIN2 = 12 -# self.BIN1 = 11 -# elif (num == 1): -# self.PWMA = 2 -# self.AIN2 = 3 -# self.AIN1 = 4 -# self.PWMB = 7 -# self.BIN2 = 6 -# self.BIN1 = 5 -# else: -# raise NameError('MotorHAT Stepper must be between 1 and 2 inclusive') +# if (num == 0): +# self.PWMA = 8 +# self.AIN2 = 9 +# self.AIN1 = 10 +# self.PWMB = 13 +# self.BIN2 = 12 +# self.BIN1 = 11 +# elif (num == 1): +# self.PWMA = 2 +# self.AIN2 = 3 +# self.AIN1 = 4 +# self.PWMB = 7 +# self.BIN2 = 6 +# self.BIN1 = 5 +# else: +# raise NameError('MotorHAT Stepper must be between 1 and 2 inclusive') # -# def setSpeed(self, rpm): -# self.sec_per_step = 60.0 / (self.revsteps * rpm) -# self.steppingcounter = 0 +# def setSpeed(self, rpm): +# self.sec_per_step = 60.0 / (self.revsteps * rpm) +# self.steppingcounter = 0 # -# def oneStep(self, dir, style): -# pwm_a = pwm_b = 255 +# def oneStep(self, dir, style): +# pwm_a = pwm_b = 255 # -# # first determine what sort of stepping procedure we're up to -# if (style == Adafruit_MotorHAT.SINGLE): -# if ((self.currentstep/(self.MICROSTEPS/2)) % 2): -# # we're at an odd step, weird -# if (dir == Adafruit_MotorHAT.FORWARD): -# self.currentstep += self.MICROSTEPS/2 -# else: -# self.currentstep -= self.MICROSTEPS/2 -# else: -# # go to next even step -# if (dir == Adafruit_MotorHAT.FORWARD): -# self.currentstep += self.MICROSTEPS -# else: -# self.currentstep -= self.MICROSTEPS -# if (style == Adafruit_MotorHAT.DOUBLE): -# if not (self.currentstep/(self.MICROSTEPS/2) % 2): -# # we're at an even step, weird -# if (dir == Adafruit_MotorHAT.FORWARD): -# self.currentstep += self.MICROSTEPS/2 -# else: -# self.currentstep -= self.MICROSTEPS/2 -# else: -# # go to next odd step -# if (dir == Adafruit_MotorHAT.FORWARD): -# self.currentstep += self.MICROSTEPS -# else: -# self.currentstep -= self.MICROSTEPS -# if (style == Adafruit_MotorHAT.INTERLEAVE): -# if (dir == Adafruit_MotorHAT.FORWARD): -# self.currentstep += self.MICROSTEPS/2 -# else: -# self.currentstep -= self.MICROSTEPS/2 +# # first determine what sort of stepping procedure we're up to +# if (style == Adafruit_MotorHAT.SINGLE): +# if ((self.currentstep/(self.MICROSTEPS/2)) % 2): +# # we're at an odd step, weird +# if (dir == Adafruit_MotorHAT.FORWARD): +# self.currentstep += self.MICROSTEPS/2 +# else: +# self.currentstep -= self.MICROSTEPS/2 +# else: +# # go to next even step +# if (dir == Adafruit_MotorHAT.FORWARD): +# self.currentstep += self.MICROSTEPS +# else: +# self.currentstep -= self.MICROSTEPS +# if (style == Adafruit_MotorHAT.DOUBLE): +# if not (self.currentstep/(self.MICROSTEPS/2) % 2): +# # we're at an even step, weird +# if (dir == Adafruit_MotorHAT.FORWARD): +# self.currentstep += self.MICROSTEPS/2 +# else: +# self.currentstep -= self.MICROSTEPS/2 +# else: +# # go to next odd step +# if (dir == Adafruit_MotorHAT.FORWARD): +# self.currentstep += self.MICROSTEPS +# else: +# self.currentstep -= self.MICROSTEPS +# if (style == Adafruit_MotorHAT.INTERLEAVE): +# if (dir == Adafruit_MotorHAT.FORWARD): +# self.currentstep += self.MICROSTEPS/2 +# else: +# self.currentstep -= self.MICROSTEPS/2 # -# if (style == Adafruit_MotorHAT.MICROSTEP): -# if (dir == Adafruit_MotorHAT.FORWARD): -# self.currentstep += 1 -# else: -# self.currentstep -= 1 +# if (style == Adafruit_MotorHAT.MICROSTEP): +# if (dir == Adafruit_MotorHAT.FORWARD): +# self.currentstep += 1 +# else: +# self.currentstep -= 1 # -# # go to next 'step' and wrap around -# self.currentstep += self.MICROSTEPS * 4 -# self.currentstep %= self.MICROSTEPS * 4 +# # go to next 'step' and wrap around +# self.currentstep += self.MICROSTEPS * 4 +# self.currentstep %= self.MICROSTEPS * 4 # -# pwm_a = pwm_b = 0 -# if (self.currentstep >= 0) and (self.currentstep < self.MICROSTEPS): -# pwm_a = self.MICROSTEP_CURVE[self.MICROSTEPS - self.currentstep] -# pwm_b = self.MICROSTEP_CURVE[self.currentstep] -# elif (self.currentstep >= self.MICROSTEPS) and (self.currentstep < self.MICROSTEPS*2): -# pwm_a = self.MICROSTEP_CURVE[self.currentstep - self.MICROSTEPS] -# pwm_b = self.MICROSTEP_CURVE[self.MICROSTEPS*2 - self.currentstep] -# elif (self.currentstep >= self.MICROSTEPS*2) and (self.currentstep < self.MICROSTEPS*3): -# pwm_a = self.MICROSTEP_CURVE[self.MICROSTEPS*3 - self.currentstep] -# pwm_b = self.MICROSTEP_CURVE[self.currentstep - self.MICROSTEPS*2] -# elif (self.currentstep >= self.MICROSTEPS*3) and (self.currentstep < self.MICROSTEPS*4): +# pwm_a = pwm_b = 0 +# if (self.currentstep >= 0) and (self.currentstep < self.MICROSTEPS): +# pwm_a = self.MICROSTEP_CURVE[self.MICROSTEPS - self.currentstep] +# pwm_b = self.MICROSTEP_CURVE[self.currentstep] +# elif (self.currentstep >= self.MICROSTEPS) and (self.currentstep < self.MICROSTEPS*2): +# pwm_a = self.MICROSTEP_CURVE[self.currentstep - self.MICROSTEPS] +# pwm_b = self.MICROSTEP_CURVE[self.MICROSTEPS*2 - self.currentstep] +# elif (self.currentstep >= self.MICROSTEPS*2) and (self.currentstep < self.MICROSTEPS*3): +# pwm_a = self.MICROSTEP_CURVE[self.MICROSTEPS*3 - self.currentstep] +# pwm_b = self.MICROSTEP_CURVE[self.currentstep - self.MICROSTEPS*2] +# elif (self.currentstep >= self.MICROSTEPS*3) and (self.currentstep < self.MICROSTEPS*4): # pwm_a = self.MICROSTEP_CURVE[self.currentstep - self.MICROSTEPS*3] # pwm_b = self.MICROSTEP_CURVE[self.MICROSTEPS*4 - self.currentstep] # # -# # go to next 'step' and wrap around -# self.currentstep += self.MICROSTEPS * 4 -# self.currentstep %= self.MICROSTEPS * 4 +# # go to next 'step' and wrap around +# self.currentstep += self.MICROSTEPS * 4 +# self.currentstep %= self.MICROSTEPS * 4 # -# # only really used for microstepping, otherwise always on! -# self.MC._pwm.setPWM(self.PWMA, 0, pwm_a*16) -# self.MC._pwm.setPWM(self.PWMB, 0, pwm_b*16) +# # only really used for microstepping, otherwise always on! +# self.MC._pwm.setPWM(self.PWMA, 0, pwm_a*16) +# self.MC._pwm.setPWM(self.PWMB, 0, pwm_b*16) # -# # set up coil energizing! -# coils = [0, 0, 0, 0] +# # set up coil energizing! +# coils = [0, 0, 0, 0] # -# if (style == Adafruit_MotorHAT.MICROSTEP): -# if (self.currentstep >= 0) and (self.currentstep < self.MICROSTEPS): -# coils = [1, 1, 0, 0] +# if (style == Adafruit_MotorHAT.MICROSTEP): +# if (self.currentstep >= 0) and (self.currentstep < self.MICROSTEPS): +# coils = [1, 1, 0, 0] # elif (self.currentstep >= self.MICROSTEPS) and (self.currentstep < self.MICROSTEPS*2): -# coils = [0, 1, 1, 0] +# coils = [0, 1, 1, 0] # elif (self.currentstep >= self.MICROSTEPS*2) and (self.currentstep < self.MICROSTEPS*3): -# coils = [0, 0, 1, 1] +# coils = [0, 0, 1, 1] # elif (self.currentstep >= self.MICROSTEPS*3) and (self.currentstep < self.MICROSTEPS*4): -# coils = [1, 0, 0, 1] -# else: -# step2coils = [ [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], -# [1, 0, 0, 1] ] -# coils = step2coils[self.currentstep/(self.MICROSTEPS/2)] +# coils = [1, 0, 0, 1] +# else: +# step2coils = [ [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], +# [1, 0, 0, 1] ] +# coils = step2coils[self.currentstep/(self.MICROSTEPS/2)] # -# #print "coils state = " + str(coils) -# self.MC.setPin(self.AIN2, coils[0]) -# self.MC.setPin(self.BIN1, coils[1]) -# self.MC.setPin(self.AIN1, coils[2]) -# self.MC.setPin(self.BIN2, coils[3]) +# #print "coils state = " + str(coils) +# self.MC.setPin(self.AIN2, coils[0]) +# self.MC.setPin(self.BIN1, coils[1]) +# self.MC.setPin(self.AIN1, coils[2]) +# self.MC.setPin(self.BIN2, coils[3]) # -# return self.currentstep +# return self.currentstep # -# def step(self, steps, direction, stepstyle): -# s_per_s = self.sec_per_step -# lateststep = 0 +# def step(self, steps, direction, stepstyle): +# s_per_s = self.sec_per_step +# lateststep = 0 # -# if (stepstyle == Adafruit_MotorHAT.INTERLEAVE): -# s_per_s = s_per_s / 2.0 -# if (stepstyle == Adafruit_MotorHAT.MICROSTEP): -# s_per_s /= self.MICROSTEPS -# steps *= self.MICROSTEPS +# if (stepstyle == Adafruit_MotorHAT.INTERLEAVE): +# s_per_s = s_per_s / 2.0 +# if (stepstyle == Adafruit_MotorHAT.MICROSTEP): +# s_per_s /= self.MICROSTEPS +# steps *= self.MICROSTEPS # -# print s_per_s, " sec per step" +# print s_per_s, " sec per step" # -# for s in range(steps): -# lateststep = self.oneStep(direction, stepstyle) -# time.sleep(s_per_s) +# for s in range(steps): +# lateststep = self.oneStep(direction, stepstyle) +# time.sleep(s_per_s) # -# if (stepstyle == Adafruit_MotorHAT.MICROSTEP): -# # this is an edge case, if we are in between full steps, lets just keep going -# # so we end on a full step -# while (lateststep != 0) and (lateststep != self.MICROSTEPS): -# lateststep = self.oneStep(dir, stepstyle) -# time.sleep(s_per_s) +# if (stepstyle == Adafruit_MotorHAT.MICROSTEP): +# # this is an edge case, if we are in between full steps, lets just keep going +# # so we end on a full step +# while (lateststep != 0) and (lateststep != self.MICROSTEPS): +# lateststep = self.oneStep(dir, stepstyle) +# time.sleep(s_per_s) class dw_DCMotor: - def __init__(self, controller, num): - self.speed = 0 - self.MC = controller - self.motornum = num + def __init__(self, controller, num): + self.speed = 0 + self.MC = controller + self.motornum = num modepin = in1 = in2 = 0 if (num == 0): @@ -185,93 +185,98 @@ class dw_DCMotor: elif (num == 3): in2 = 5 #phase in1 = 4 #enable - elif (num == 4): + elif (num == 4): in2 = 0 #phase in1 = 1 #enable - elif (num == 5): + elif (num == 5): in2 = 2 #phase in1 = 3 #enable + else: + raise NameError('MotorHAT Motor must be between 1 and 6 inclusive') - else: - raise NameError('MotorHAT Motor must be between 1 and 6 inclusive') - self.PHpin = in1 - self.ENpin = in2 + self.PHpin = in2 + self.ENpin = in1 + # switch off + self.run(dw_MotorCONTROL.RELEASE, 0) - def setMotorSpeed(self, value): - if(value > 0) and (value <= 255): - self.run(self, dw_MotorCONTROL.FORWARD, value) - if(value == 0): - self.run(self, dw_MotorCONTROL.RELEASE, value) - if(value < 0) and (value >= -255): - self.run(self, dw_MotorCONTROL.BACKWARD, abs(value)) + def setMotorSpeed(self, value): + if(value > 0) and (value <= 255): + self.run(dw_MotorCONTROL.FORWARD, value) + if(value == 0): + self.run(dw_MotorCONTROL.RELEASE, value) + if(value < 0) and (value >= -255): + self.run(dw_MotorCONTROL.BACKWARD, abs(value)) - def run(self, command, speed = 0): - if not self.MC: - return - if (command == dw_MotorCONTROL.FORWARD): - self.MC.setPin(self.PHpin, 0) - self.MC._pwm.setPWM(self.ENpin, 0, speed*16) - if (command == dw_MotorCONTROL.BACKWARD): - self.MC.setPin(self.PHpin, 1) - self.MC._pwm.setPWM(self.ENpin, 0, speed*16) - if (command == dw_MotorCONTROL.RELEASE): - self.MC.setPin(self.PHpin, 0) - self.MC.setPin(self.ENpin, 0) + def run(self, command, speed = 0): + if not self.MC: + return + if (command == dw_MotorCONTROL.FORWARD): + self.MC.setPin(self.PHpin, 0) + self.MC._pwm.setPWM(self.ENpin, 0, speed*16) + if (command == dw_MotorCONTROL.BACKWARD): + self.MC.setPin(self.PHpin, 1) + self.MC._pwm.setPWM(self.ENpin, 0, speed*16) + if (command == dw_MotorCONTROL.RELEASE): + self.MC.setPin(self.PHpin, 0) + self.MC.setPin(self.ENpin, 0) - def setSpeed(self, speed): - if (speed < 0): - speed = 0 - if (speed > 255): - speed = 255 - self.MC._pwm.setPWM(self.ENpin, 0, speed*16) + def setSpeed(self, speed): + if (speed < 0): + speed = 0 + if (speed > 255): + speed = 255 + self.MC._pwm.setPWM(self.ENpin, 0, speed*16) class dw_MotorCONTROL: - FORWARD = 1 - BACKWARD = 2 - BRAKE = 3 - RELEASE = 4 + FORWARD = 1 + BACKWARD = 2 + BRAKE = 3 + RELEASE = 4 - SINGLE = 1 - DOUBLE = 2 - INTERLEAVE = 3 - MICROSTEP = 4 + SINGLE = 1 + DOUBLE = 2 + INTERLEAVE = 3 + MICROSTEP = 4 - ININ = 0 - PHASE = 1 + ININ = 0 + PHASE = 1 - def __init__(self, addr = 0x60, freq = 1600): - self._i2caddr = addr # default addr on HAT - self._frequency = freq # default @1600Hz PWM freq - self.motors = [ dw_DCMotor(self, m) for m in range(6) ] - # self.steppers = [ Adafruit_StepperMotor(self, 1), Adafruit_StepperMotor(self, 2) ] - self._pwm = PWM(addr, debug=False) - self._pwm.setPWMFreq(self._frequency) - # Just gonna default to high for now - GPIO.setmode(GPIO.BCM) - GPIO.setup(17, GPIO.OUT) - GPIO.setup(27, GPIO.OUT) - GPIO.setup(22, GPIO.OUT) + def __init__(self, addr = 0x60, freq = 1600): + self._i2caddr = addr # default addr on HAT + self._frequency = freq # default @1600Hz PWM freq + # self.steppers = [ Adafruit_StepperMotor(self, 1), Adafruit_StepperMotor(self, 2) ] + self._pwm = PWM(addr, debug=False) + self._pwm.setPWMFreq(self._frequency) + # Just gonna default to high for now + GPIO.setmode(GPIO.BCM) - GPIO.output(17, GPIO.HIGH) - GPIO.output(27, GPIO.HIGH) - GPIO.output(22, GPIO.HIGH) + GPIO.setwarnings(False) + + GPIO.setup(17, GPIO.OUT) + GPIO.setup(27, GPIO.OUT) + GPIO.setup(22, GPIO.OUT) - def setPin(self, pin, value): - if (pin < 0) or (pin > 15): - raise NameError('PWM pin must be between 0 and 15 inclusive') - if (value != 0) and (value != 1): - raise NameError('Pin value must be 0 or 1!') - if (value == 0): - self._pwm.setPWM(pin, 0, 4096) - if (value == 1): - self._pwm.setPWM(pin, 4096, 0) + GPIO.output(17, GPIO.HIGH) + GPIO.output(27, GPIO.HIGH) + GPIO.output(22, GPIO.HIGH) - # def getStepper(self, steps, num): - # if (num < 1) or (num > 2): - # raise NameError('MotorHAT Stepper must be between 1 and 2 inclusive') - # return self.steppers[num-1] + self.motors = [ dw_DCMotor(self, m) for m in range(6) ] - def getMotor(self, num): - if (num < 1) or (num > 6): - raise NameError('MotorHAT Motor must be between 1 and 6 inclusive') - return self.motors[num-1] + def setPin(self, pin, value): + if (pin < 0) or (pin > 15): + raise NameError('PWM pin must be between 0 and 15 inclusive') + if (value != 0) and (value != 1): + raise NameError('Pin value must be 0 or 1!') + if (value == 0): + self._pwm.setPWM(pin, 0, 4096) + if (value == 1): + self._pwm.setPWM(pin, 4096, 0) + + def getMotor(self, num): + if (num < 1) or (num > 6): + raise NameError('MotorHAT Motor must be between 1 and 6 inclusive') + return self.motors[num-1] + + def allOff(self): + for y in range(5): + self.motors[y].run(dw_MotorCONTROL.RELEASE, 0) diff --git a/examples/640test.py b/examples/640test.py new file mode 100644 index 0000000..1128637 --- /dev/null +++ b/examples/640test.py @@ -0,0 +1,21 @@ +import time +from dw640HAT import dw_MotorCONTROL, dw_DCMotor + +dw = dw_MotorCONTROL( addr=0x60 ) +m = dw.getMotor(1) + +m.run(dw_MotorCONTROL.RELEASE) +time.sleep(5) + +##time.sleep(10) +print "Set forward" +m.setMotorSpeed(255) +time.sleep(5) +print "stop" +m.setMotorSpeed(0) +time.sleep(5) +print "Set reverse" +m.setMotorSpeed(-255) +time.sleep(5) +print "stop" +m.run(dw_MotorCONTROL.RELEASE) diff --git a/ez_setup.py b/ez_setup.py deleted file mode 100644 index 23ea9a2..0000000 --- a/ez_setup.py +++ /dev/null @@ -1,332 +0,0 @@ -#!/usr/bin/env python -"""Bootstrap setuptools installation - -To use setuptools in your package's setup.py, include this -file in the same directory and add this to the top of your setup.py:: - - from ez_setup import use_setuptools - use_setuptools() - -To require a specific version of setuptools, set a download -mirror, or use an alternate download directory, simply supply -the appropriate options to ``use_setuptools()``. - -This file can also be run as a script to install or upgrade setuptools. -""" -import os -import shutil -import sys -import tempfile -import zipfile -import optparse -import subprocess -import platform -import textwrap -import contextlib - -from distutils import log - -try: - from site import USER_SITE -except ImportError: - USER_SITE = None - -DEFAULT_VERSION = "3.5.1" -DEFAULT_URL = "https://pypi.python.org/packages/source/s/setuptools/" - -def _python_cmd(*args): - """ - Return True if the command succeeded. - """ - args = (sys.executable,) + args - return subprocess.call(args) == 0 - - -def _install(archive_filename, install_args=()): - with archive_context(archive_filename): - # installing - log.warn('Installing Setuptools') - if not _python_cmd('setup.py', 'install', *install_args): - log.warn('Something went wrong during the installation.') - log.warn('See the error message above.') - # exitcode will be 2 - return 2 - - -def _build_egg(egg, archive_filename, to_dir): - with archive_context(archive_filename): - # building an egg - log.warn('Building a Setuptools egg in %s', to_dir) - _python_cmd('setup.py', '-q', 'bdist_egg', '--dist-dir', to_dir) - # returning the result - log.warn(egg) - if not os.path.exists(egg): - raise IOError('Could not build the egg.') - - -def get_zip_class(): - """ - Supplement ZipFile class to support context manager for Python 2.6 - """ - class ContextualZipFile(zipfile.ZipFile): - def __enter__(self): - return self - def __exit__(self, type, value, traceback): - self.close - return zipfile.ZipFile if hasattr(zipfile.ZipFile, '__exit__') else \ - ContextualZipFile - - -@contextlib.contextmanager -def archive_context(filename): - # extracting the archive - tmpdir = tempfile.mkdtemp() - log.warn('Extracting in %s', tmpdir) - old_wd = os.getcwd() - try: - os.chdir(tmpdir) - with get_zip_class()(filename) as archive: - archive.extractall() - - # going in the directory - subdir = os.path.join(tmpdir, os.listdir(tmpdir)[0]) - os.chdir(subdir) - log.warn('Now working in %s', subdir) - yield - - finally: - os.chdir(old_wd) - shutil.rmtree(tmpdir) - - -def _do_download(version, download_base, to_dir, download_delay): - egg = os.path.join(to_dir, 'setuptools-%s-py%d.%d.egg' - % (version, sys.version_info[0], sys.version_info[1])) - if not os.path.exists(egg): - archive = download_setuptools(version, download_base, - to_dir, download_delay) - _build_egg(egg, archive, to_dir) - sys.path.insert(0, egg) - - # Remove previously-imported pkg_resources if present (see - # https://bitbucket.org/pypa/setuptools/pull-request/7/ for details). - if 'pkg_resources' in sys.modules: - del sys.modules['pkg_resources'] - - import setuptools - setuptools.bootstrap_install_from = egg - - -def use_setuptools(version=DEFAULT_VERSION, download_base=DEFAULT_URL, - to_dir=os.curdir, download_delay=15): - to_dir = os.path.abspath(to_dir) - rep_modules = 'pkg_resources', 'setuptools' - imported = set(sys.modules).intersection(rep_modules) - try: - import pkg_resources - except ImportError: - return _do_download(version, download_base, to_dir, download_delay) - try: - pkg_resources.require("setuptools>=" + version) - return - except pkg_resources.DistributionNotFound: - return _do_download(version, download_base, to_dir, download_delay) - except pkg_resources.VersionConflict as VC_err: - if imported: - msg = textwrap.dedent(""" - The required version of setuptools (>={version}) is not available, - and can't be installed while this script is running. Please - install a more recent version first, using - 'easy_install -U setuptools'. - - (Currently using {VC_err.args[0]!r}) - """).format(VC_err=VC_err, version=version) - sys.stderr.write(msg) - sys.exit(2) - - # otherwise, reload ok - del pkg_resources, sys.modules['pkg_resources'] - return _do_download(version, download_base, to_dir, download_delay) - -def _clean_check(cmd, target): - """ - Run the command to download target. If the command fails, clean up before - re-raising the error. - """ - try: - subprocess.check_call(cmd) - except subprocess.CalledProcessError: - if os.access(target, os.F_OK): - os.unlink(target) - raise - -def download_file_powershell(url, target): - """ - Download the file at url to target using Powershell (which will validate - trust). Raise an exception if the command cannot complete. - """ - target = os.path.abspath(target) - cmd = [ - 'powershell', - '-Command', - "(new-object System.Net.WebClient).DownloadFile(%(url)r, %(target)r)" % vars(), - ] - _clean_check(cmd, target) - -def has_powershell(): - if platform.system() != 'Windows': - return False - cmd = ['powershell', '-Command', 'echo test'] - devnull = open(os.path.devnull, 'wb') - try: - try: - subprocess.check_call(cmd, stdout=devnull, stderr=devnull) - except Exception: - return False - finally: - devnull.close() - return True - -download_file_powershell.viable = has_powershell - -def download_file_curl(url, target): - cmd = ['curl', url, '--silent', '--output', target] - _clean_check(cmd, target) - -def has_curl(): - cmd = ['curl', '--version'] - devnull = open(os.path.devnull, 'wb') - try: - try: - subprocess.check_call(cmd, stdout=devnull, stderr=devnull) - except Exception: - return False - finally: - devnull.close() - return True - -download_file_curl.viable = has_curl - -def download_file_wget(url, target): - cmd = ['wget', url, '--quiet', '--output-document', target] - _clean_check(cmd, target) - -def has_wget(): - cmd = ['wget', '--version'] - devnull = open(os.path.devnull, 'wb') - try: - try: - subprocess.check_call(cmd, stdout=devnull, stderr=devnull) - except Exception: - return False - finally: - devnull.close() - return True - -download_file_wget.viable = has_wget - -def download_file_insecure(url, target): - """ - Use Python to download the file, even though it cannot authenticate the - connection. - """ - try: - from urllib.request import urlopen - except ImportError: - from urllib2 import urlopen - src = dst = None - try: - src = urlopen(url) - # Read/write all in one block, so we don't create a corrupt file - # if the download is interrupted. - data = src.read() - dst = open(target, "wb") - dst.write(data) - finally: - if src: - src.close() - if dst: - dst.close() - -download_file_insecure.viable = lambda: True - -def get_best_downloader(): - downloaders = [ - download_file_powershell, - download_file_curl, - download_file_wget, - download_file_insecure, - ] - - for dl in downloaders: - if dl.viable(): - return dl - -def download_setuptools(version=DEFAULT_VERSION, download_base=DEFAULT_URL, - to_dir=os.curdir, delay=15, downloader_factory=get_best_downloader): - """ - Download setuptools from a specified location and return its filename - - `version` should be a valid setuptools version number that is available - as an egg for download under the `download_base` URL (which should end - with a '/'). `to_dir` is the directory where the egg will be downloaded. - `delay` is the number of seconds to pause before an actual download - attempt. - - ``downloader_factory`` should be a function taking no arguments and - returning a function for downloading a URL to a target. - """ - # making sure we use the absolute path - to_dir = os.path.abspath(to_dir) - zip_name = "setuptools-%s.zip" % version - url = download_base + zip_name - saveto = os.path.join(to_dir, zip_name) - if not os.path.exists(saveto): # Avoid repeated downloads - log.warn("Downloading %s", url) - downloader = downloader_factory() - downloader(url, saveto) - return os.path.realpath(saveto) - -def _build_install_args(options): - """ - Build the arguments to 'python setup.py install' on the setuptools package - """ - return ['--user'] if options.user_install else [] - -def _parse_args(): - """ - Parse the command line for options - """ - parser = optparse.OptionParser() - parser.add_option( - '--user', dest='user_install', action='store_true', default=False, - help='install in user site package (requires Python 2.6 or later)') - parser.add_option( - '--download-base', dest='download_base', metavar="URL", - default=DEFAULT_URL, - help='alternative URL from where to download the setuptools package') - parser.add_option( - '--insecure', dest='downloader_factory', action='store_const', - const=lambda: download_file_insecure, default=get_best_downloader, - help='Use internal, non-validating downloader' - ) - parser.add_option( - '--version', help="Specify which version to download", - default=DEFAULT_VERSION, - ) - options, args = parser.parse_args() - # positional arguments are ignored - return options - -def main(): - """Install or upgrade setuptools and EasyInstall""" - options = _parse_args() - archive = download_setuptools( - version=options.version, - download_base=options.download_base, - downloader_factory=options.downloader_factory, - ) - return _install(archive, _build_install_args(options)) - -if __name__ == '__main__': - sys.exit(main()) diff --git a/setup.py b/setup.py deleted file mode 100644 index 4cf76bb..0000000 --- a/setup.py +++ /dev/null @@ -1,14 +0,0 @@ -from ez_setup import use_setuptools -use_setuptools() -from setuptools import setup, find_packages - -setup(name = 'Adafruit_MotorHAT', - version = '1.3.0', - author = 'Limor Fried', - author_email = 'support@adafruit.com', - description = 'Library for Adafruit Motor HAT', - license = 'MIT', - url = 'https://github.com/adafruit/Adafruit_Python_MotorHAT/', - dependency_links = ['https://github.com/adafruit/Adafruit_Python_GPIO/tarball/master#egg=Adafruit-GPIO-0.7'], - install_requires = ['Adafruit-GPIO>=0.7'], - packages = find_packages())