1
0
mirror of https://github.com/xtacocorex/CHIP_IO synced 2025-07-20 12:53:22 +00:00

updates to the pytest tests to fix the issues with pwm, added 2 new tests that bring in 5 total unit tests. python3 unit tests are passing, this will close #42 and close #47

This commit is contained in:
Robert Wolterman
2017-02-26 21:04:40 -06:00
parent f7bec3f891
commit 29377cf24d
18 changed files with 149 additions and 27 deletions

251
test/integrations/gptest.py Normal file
View File

@ -0,0 +1,251 @@
#!/usr/bin/python
import CHIP_IO.GPIO as GPIO
import time
import threading
num_callbacks = 0
def myfuncallback(channel):
global num_callbacks
num_callbacks += 1
print("CALLBACK LIKE DRAKE IN HOTLINE BLING")
loopfunction_exit = False
def loopfunction():
print("LOOP FUNCTION START")
for i in xrange(4):
if loopfunction_exit:
break
if i % 2:
mystr = "SETTING CSID0 LOW (i=%d)" % i
print(mystr)
GPIO.output("CSID0", GPIO.LOW)
else:
mystr = "SETTING CSID0 HIGH (i=%d)" % i
print(mystr)
GPIO.output("CSID0", GPIO.HIGH)
print(" LOOP FUNCTION SLEEPING")
time.sleep(1)
num_errs = 0
print("GETTING CHIP_IO VERSION")
mystr = "CHIP_IO VERSION: %s" % GPIO.VERSION
print(mystr)
print("\nRUNNING GPIO SELF TEST")
GPIO.selftest(0)
print("\nVERIFYING SIMPLE FUNCTIONALITY")
GPIO.setup("GPIO1", GPIO.IN)
GPIO.setup("CSID0", GPIO.OUT, initial=GPIO.HIGH)
if (GPIO.input("GPIO1") != GPIO.HIGH):
print(" A high output on CSI0 does not lead to a high input on XIO-P2.")
print(" Perhaps you forgot to connect them?")
num_errs += 1
else:
print(" Able to use alternate names for GPIO")
GPIO.cleanup()
GPIO.setup("U14_15", GPIO.IN) # XIO-P2
GPIO.setup("CSID0", GPIO.OUT, initial=GPIO.LOW)
if (GPIO.input("XIO-P2") != GPIO.LOW):
print(" A low output on CSI0 does not lead to a low input on XIO-P2.")
print(" Perhaps you forgot to connect them?")
num_errs += 1
else:
print(" Able to use Pin Header+Number for GPIO")
GPIO.cleanup()
GPIO.setup("XIO-P2", GPIO.IN)
GPIO.setup("U14_31", GPIO.OUT) # CSID0
print("READING XIO-P2")
GPIO.output("CSID0", GPIO.HIGH)
assert(GPIO.input("XIO-P2") == GPIO.HIGH)
GPIO.output("CSID0", GPIO.LOW)
print "LOW", GPIO.input("GPIO1")
assert(GPIO.input("GPIO1") == GPIO.LOW)
# ==============================================
# EDGE DETECTION - AP-EINT1
print("\nSETTING UP RISING EDGE DETECTION ON AP-EINT1")
GPIO.setup("AP-EINT1", GPIO.IN)
GPIO.add_event_detect("AP-EINT1", GPIO.RISING, myfuncallback)
print("VERIFYING EDGE DETECT WAS SET PROPERLY")
f = open("/sys/class/gpio/gpio193/edge", "r")
edge = f.read()
f.close()
assert(edge == "rising\n")
GPIO.remove_event_detect("AP-EINT1")
# ==============================================
# EDGE DETECTION - AP-EINT3
print("\nSETTING UP BOTH EDGE DETECTION ON AP-EINT3")
GPIO.setup("AP-EINT3", GPIO.IN)
GPIO.add_event_detect("AP-EINT3", GPIO.BOTH, myfuncallback)
print("VERIFYING EDGE DETECT WAS SET PROPERLY")
f = open("/sys/class/gpio/gpio35/edge", "r")
edge = f.read()
f.close()
assert(edge == "both\n")
GPIO.remove_event_detect("AP-EINT3")
# ==============================================
# EDGE DETECTION - EXPANDED GPIO
print("\nSETTING UP FALLING EDGE DETECTION ON XIO-P2")
# WRITING CSID0 LOW FIRST AS THERE IS A DOUBLE HIT ON HIGH
GPIO.output("CSID0", GPIO.LOW)
GPIO.add_event_detect("XIO-P2", GPIO.FALLING, myfuncallback)
print("VERIFYING EDGE DETECT")
base = GPIO.get_gpio_base()
gfile = "/sys/class/gpio/gpio%d/edge" % (base + 2)
f = open(gfile, "r")
edge = f.read()
f.close()
assert(edge == "falling\n")
# LOOP WRITING ON CSID0 TO HOPEFULLY GET CALLBACK TO WORK
print("WAITING FOR CALLBACKS ON XIO-P2")
loopfunction()
mystr = " num_callbacks = %d" % num_callbacks
print(mystr)
GPIO.remove_event_detect("XIO-P2")
print("\nSETTING UP RISING EDGE DETECTION ON XIO-P2")
# WRITING CSID0 LOW FIRST AS THERE IS A DOUBLE HIT ON HIGH
GPIO.output("CSID0", GPIO.LOW)
num_callbacks = 0
GPIO.add_event_detect("XIO-P2", GPIO.RISING, myfuncallback)
print("WAITING FOR CALLBACKS ON XIO-P2")
loopfunction()
mystr = " num_callbacks = %d" % num_callbacks
print(mystr)
GPIO.remove_event_detect("XIO-P2")
print("\nSETTING UP BOTH EDGE DETECTION ON XIO-P2")
# WRITING CSID0 LOW FIRST AS THERE IS A DOUBLE HIT ON HIGH
GPIO.output("CSID0", GPIO.LOW)
num_callbacks = 0
GPIO.add_event_detect("XIO-P2", GPIO.BOTH, myfuncallback)
print("WAITING FOR CALLBACKS ON XIO-P2")
loopfunction()
mystr = " num_callbacks = %d" % num_callbacks
print(mystr)
GPIO.remove_event_detect("XIO-P2")
print("\nWAIT FOR EDGE TESTING, SETUP FOR FALLING EDGE")
print("PRESS CONTROL-C TO EXIT IF SCRIPT GETS STUCK")
try:
# WAIT FOR EDGE
t = threading.Thread(target=loopfunction)
t.start()
print("WAITING FOR EDGE ON XIO-P2")
GPIO.wait_for_edge("XIO-P2", GPIO.FALLING)
# THIS SHOULD ONLY PRINT IF WE'VE HIT THE EDGE DETECT
print("WE'VE FALLEN LIKE COOLIO'S CAREER")
except:
pass
print("Exit thread")
loopfunction_exit = True
t.join() # Wait till the thread exits.
GPIO.remove_event_detect("XIO-P2")
print("\n** BAD DAY SCENARIOS **")
print(" ")
print("TESTING ERRORS THROWN WHEN SPECIFYING EDGE DETECTION ON UNAUTHORIZED GPIO")
GPIO.setup("CSID1", GPIO.IN)
try:
GPIO.add_event_detect("CSID1", GPIO.FALLING, myfuncallback)
print(" Oops, it did not throw an exception! BUG!!!")
num_errs += 1
except ValueError, ex:
mystr = " error msg = %s" % ex.args[0]
print(mystr)
pass
except RuntimeError, ex:
mystr = " error msg = %s" % ex.args[0]
print(mystr)
pass
print("TESTING ERRORS THROWN WHEN SETTING UP AN ALREADY EXPORTED GPIO")
try:
GPIO.setup("CSID0", GPIO.LOW)
print(" Oops, it did not throw an exception! BUG!!!")
num_errs += 1
except ValueError, ex:
mystr = " error msg = %s" % ex.args[0]
print(mystr)
pass
except RuntimeError, ex:
mystr = " error msg = %s" % ex.args[0]
print(mystr)
pass
print("TESTING ERRORS THROWN WHEN WRITING TO A GPIO NOT SET UP")
try:
GPIO.output("CSID2", GPIO.LOW)
print(" Oops, it did not throw an exception! BUG!!!")
num_errs += 1
except ValueError, ex:
mystr = " error msg = %s" % ex.args[0]
print(mystr)
pass
except RuntimeError, ex:
mystr = " error msg = %s" % ex.args[0]
print(mystr)
pass
print("TESTING ERRORS THROWN WHEN WRITING TO A SET UP GPIO WITH NO DIRECTION")
try:
GPIO.output("CSID1", GPIO.LOW)
print(" Oops, it did not throw an exception! BUG!!!")
num_errs += 1
except ValueError, ex:
mystr = " error msg = %s" % ex.args[0]
print(mystr)
pass
except RuntimeError, ex:
mystr = " error msg = %s" % ex.args[0]
print(mystr)
pass
print("TESTING ERRORS THROWN FOR ILLEGAL GPIO")
try:
GPIO.setup("NOTUSED", GPIO.IN)
print(" Oops, it did not throw an exception! BUG!!!")
num_errs += 1
except ValueError, ex:
mystr = " error msg = %s" % ex.args[0]
print(mystr)
pass
except RuntimeError, ex:
mystr = " error msg = %s" % ex.args[0]
print(mystr)
pass
print("TESTING ERRORS THROWN FOR NON-GPIO")
try:
GPIO.setup("FEL", GPIO.IN)
print(" Oops, it did not throw an exception! BUG!!!")
num_errs += 1
except ValueError, ex:
mystr = " error msg = %s" % ex.args[0]
print(mystr)
pass
except RuntimeError, ex:
mystr = " error msg = %s" % ex.args[0]
print(mystr)
pass
print("GPIO CLEANUP")
GPIO.cleanup()
mystr = "DONE: %d ERRORS" % num_errs
print(mystr)

View File

@ -0,0 +1,65 @@
import CHIP_IO.LRADC as ADC
# == ENABLE DEBUG ==
print("ENABLING LRADC DEBUG OUTPUT")
ADC.toggle_debug()
# == SETUP ==
print("LRADC SETUP WITH SAMPLE RATE OF 125")
ADC.setup(125)
# == SCALE FACTOR ==
print("GETTING SCALE FACTOR")
scalefactor = ADC.get_scale_factor()
print(scalefactor)
print("")
# == ALLOWABLE SAMPLING RATES ==
print("GETTING ALLOWABLE SAMPLE RATES")
rates = ADC.get_allowable_sample_rates()
print(rates)
print("IS 32.25 IN RATE TUPLE")
print(ADC.SAMPLE_RATE_32P25 in rates)
print("")
# == CURRENT SAMPLE RATE ==
print("CURRENT SAMPLING RATE")
crate = ADC.get_sample_rate()
print(crate)
print("")
# == SET SAMPLE RATE ==
print("SETTING SAMPLE RATE TO 62.5")
ADC.set_sample_rate(62.5)
crate = ADC.get_sample_rate()
print(crate)
print("")
# == CHAN 0 RAW ==
print("READING LRADC CHAN0 RAW")
raw0 = ADC.get_chan0_raw()
print(raw0)
print("")
# == CHAN 1 RAW ==
print("READING LRADC CHAN1 RAW")
raw1 = ADC.get_chan1_raw()
print(raw1)
print("")
# == CHAN 0 ==
print("READING LRADC CHAN0 WITH SCALE APPLIED")
full0 = ADC.get_chan0()
print(full0)
print("")
# == CHAN 1 ==
print("READING LRADC CHAN1 WITH SCALE APPLIED")
full1 = ADC.get_chan1()
print(full1)
print("")
# == RESET ==
print("RESETING SAMPLE RATE TO 250")
ADC.set_sample_rate(250)

View File

@ -0,0 +1,36 @@
#!/usr/bin/python
import CHIP_IO.OverlayManager as OM
import os
# ENABLE DEBUG
print("ENABLING OVERLAY MANAGER DEBUG")
OM.toggle_debug()
# **************** PWM *******************
print("\nIS PWM ENABLED: {0}".format(OM.get_pwm_loaded()))
OM.load("PWM0")
print("IS PWM ENABLED: {0}".format(OM.get_pwm_loaded()))
# VERIFY PWM0 EXISTS
if os.path.exists('/sys/class/pwm/pwmchip0'):
print("PWM DEVICE EXISTS")
else:
print("PWM DEVICE DID NOT LOAD PROPERLY")
print("UNLOADING PWM0")
OM.unload("PWM0")
print("IS PWM ENABLED: {0}".format(OM.get_pwm_loaded()))
# **************** SPI2 *******************
print("\nIS SPI ENABLED: {0}".format(OM.get_spi_loaded()))
OM.load("SPI2")
print("IS SPI ENABLED: {0}".format(OM.get_spi_loaded()))
# VERIFY SPI2 EXISTS
if os.listdir('/sys/class/spi_master') != "":
print("SPI DEVICE EXISTS")
else:
print("SPI DEVICE DID NOT LOAD PROPERLY")
print("UNLOADING SPI")
OM.unload("SPI2")
print("IS SPI ENABLED: {0}".format(OM.get_spi_loaded()))

View File

@ -0,0 +1,99 @@
#!/usr/bin/python
import CHIP_IO.PWM as PWM
import CHIP_IO.GPIO as GPIO
import CHIP_IO.OverlayManager as OM
import time
import datetime
import threading
class PWMReceiver(threading.Thread):
def __init__(self,gpio,key,maxcount=20,sleeptime=0.5):
self.gpio = gpio
self.key = key
self.counter = 0
self.maxcount = maxcount
self.sleeptime = sleeptime
threading.Thread.__init__(self)
def run(self):
print("SETTING UP RECEIVER GPIO")
self.gpio.cleanup()
self.gpio.setup(self.key, self.gpio.IN)
print("STARTING RECEIVE LOOP")
try:
while self.counter < self.maxcount:
pwmval = self.gpio.input(self.key)
print("PWM VALUE: {0} @ {1}".format(pwmval, datetime.datetime.now()))
time.sleep(self.sleeptime)
self.counter += 1
except KeyboardInterrupt:
self.gpio.cleanup(self.key)
def PrintPwmData():
print("PRINTING PWM SYSFS DATA")
f = open("/sys/class/pwm/pwmchip0/pwm0/enable")
print("PWM0 ENABLE:\t{}".format(f.readline()))
f.close()
f = open("/sys/class/pwm/pwmchip0/pwm0/period")
print("PWM0 PERIOD:\t{}".format(f.readline()))
f.close()
f = open("/sys/class/pwm/pwmchip0/pwm0/duty_cycle")
print("PWM0 DUTY CYCLE:\t{}".format(f.readline()))
f.close()
f = open("/sys/class/pwm/pwmchip0/pwm0/polarity")
print("PWM0 POLARITY:\t{}".format(f.readline()))
f.close()
if __name__ == "__main__":
# SETUP VARIABLES
PWMGPIO = "PWM0"
RECEIVERGPIO = "CSID0"
COUNT = 150
SLEEPTIME = 0.01
# LOAD THE PWM OVERLAY
print("LOADING PWM OVERLAY")
OM.load("PWM0")
time.sleep(1)
# CLEANUP THE GPIO
#GPIO.cleanup()
#PWM.cleanup()
# SETUP PWM
try:
print("PWM START")
PWM.toggle_debug()
PWM.start(PWMGPIO, 15, 50, 1)
PrintPwmData()
# UNCOMMENT FOR CRASH
#print("PWM SET FREQUENCY")
#PWM.set_frequency(PWMGPIO, 200)
#PrintPwmData()
# UNCOMMENT FOR CRASH
#print("PWM SET DUTY CYCLE")
#PWM.set_duty_cycle(PWMGPIO, 25)
#PrintPwmData()
# SETUP PWM RECEIVER
#rcvr = PWMReceiver(GPIO, RECEIVERGPIO, COUNT, SLEEPTIME)
#rcvr.start()
#time.sleep(COUNT*SLEEPTIME + 1)
raw_input("PRESS ENTER WHEN DONE")
except:
raise
finally:
# CLEANUP
print("CLEANUP")
PWM.stop(PWMGPIO)
PWM.cleanup()
#OM.unload("PWM0")
#GPIO.cleanup()

View File

@ -0,0 +1,71 @@
import CHIP_IO.SERVO as SERVO
import CHIP_IO.GPIO as GPIO
import time
import datetime
import threading
class ServoTestReceiver(threading.Thread):
def __init__(self,gpio,key,maxcount=20,sleeptime=0.005):
self.gpio = gpio
self.key = key
self.counter = 0
self.maxcount = maxcount
self.sleeptime = sleeptime
self.dead = False
threading.Thread.__init__(self)
def kill(self):
self.dead = True
def run(self):
print("SETTING UP RECEIVER GPIO")
self.gpio.cleanup()
self.gpio.setup(self.key, self.gpio.IN)
print("STARTING RECEIVE LOOP")
try:
#while self.counter < self.maxcount:
while not self.dead:
pwmval = self.gpio.input(self.key)
print("SERVO VALUE: {0} @ {1}".format(pwmval, datetime.datetime.now()))
time.sleep(self.sleeptime)
self.counter += 1
except KeyboardInterrupt:
self.gpio.cleanup(self.key)
if __name__ == "__main__":
# SETUP VARIABLES
SERVOGPIO = "CSID1" #"XIO-P7"
RECEIVERGPIO = "CSID7"
COUNT = 120
SLEEPTIME = 0.0001
RANGE = 180
# SETUP PWM
try:
print("SERVO START")
SERVO.toggle_debug()
SERVO.start(SERVOGPIO, 0, RANGE)
# SETUP SERVO RECEIVER
#rcvr = ServoTestReceiver(GPIO, RECEIVERGPIO, COUNT, SLEEPTIME)
#rcvr.start()
# LOOP THROUGH RANGE
for i in range(-(RANGE/2),(RANGE/2),5):
print("SETTING ANGLE: {0}".format(i))
SERVO.set_angle(SERVOGPIO, i)
time.sleep(1)
#rcvr.kill()
raw_input("PRESS ENTER WHEN DONE")
except:
raise
finally:
# CLEANUP
print("CLEANUP")
SERVO.stop(SERVOGPIO)
SERVO.cleanup(SERVOGPIO)

View File

@ -0,0 +1,70 @@
#!/usr/bin/python
import CHIP_IO.SOFTPWM as SPWM
import CHIP_IO.GPIO as GPIO
import time
import datetime
import threading
class SPWMReceiver(threading.Thread):
def __init__(self,gpio,key,maxcount=20,sleeptime=0.5):
self.gpio = gpio
self.key = key
self.counter = 0
self.maxcount = maxcount
self.sleeptime = sleeptime
threading.Thread.__init__(self)
def run(self):
print("SETTING UP RECEIVER GPIO")
self.gpio.cleanup()
self.gpio.setup(self.key, self.gpio.IN)
print("STARTING RECEIVE LOOP")
try:
while self.counter < self.maxcount:
pwmval = self.gpio.input(self.key)
print("SPWM VALUE: {0} @ {1}".format(pwmval, datetime.datetime.now()))
time.sleep(self.sleeptime)
self.counter += 1
except KeyboardInterrupt:
self.gpio.cleanup(self.key)
if __name__ == "__main__":
# SETUP VARIABLES
SPWMGPIO = "XIO-P7"
RECEIVERGPIO = "CSID0"
COUNT = 200
SLEEPTIME = 0.01
# CLEANUP THE GPIO
GPIO.cleanup()
SPWM.cleanup()
# ISSUE #16 VERIFICATION
try:
print("VERIFYING FIX FOR ISSUE #16, GPIO CONFIGURED THAT SPWM WANTS TO USE")
GPIO.setup(SPWMGPIO, GPIO.OUT)
SPWM.start(SPWMGPIO, 50, 1)
except Exception as e:
print("EXCEPTION: {}".format(e))
print("GPIO CLEANUP")
GPIO.cleanup()
# SETUP SOFTPWM
print("STARTING SOFTPWM TEST")
SPWM.start(SPWMGPIO, 50, 1)
SPWM.set_frequency(SPWMGPIO, 2)
# SETUP SOFTPWM RECEIVER
rcvr = SPWMReceiver(GPIO, RECEIVERGPIO, COUNT, SLEEPTIME)
rcvr.start()
time.sleep(COUNT*SLEEPTIME + 1)
# CLEANUP
print("CLEANUP")
SPWM.stop(SPWMGPIO)
SPWM.cleanup()
GPIO.cleanup()

View File

@ -0,0 +1,45 @@
#!/usr/bin/python
import CHIP_IO.SOFTPWM as PWM
import CHIP_IO.GPIO as GPIO
import CHIP_IO.OverlayManager as OM
import time
import datetime
if __name__ == "__main__":
# SETUP VARIABLES
PWMGPIO = "XIO-P7"
#PWMGPIO = "LCD-D4"
COUNT = 150
SLEEPTIME = 0.01
time.sleep(1)
# SETUP PWM
try:
print("PWM START")
#PWM.toggle_debug()
PWM.start(PWMGPIO, 50, 45, 1)
# UNCOMMENT FOR CRASH
print("PWM SET FREQUENCY")
PWM.set_frequency(PWMGPIO, 10)
# UNCOMMENT FOR CRASH
print("PWM SET DUTY CYCLE")
PWM.set_duty_cycle(PWMGPIO, 25)
#time.sleep(COUNT*SLEEPTIME + 1)
raw_input("PRESS ENTER WHEN DONE")
except:
raise
finally:
# CLEANUP
print("CLEANUP")
PWM.stop(PWMGPIO)
PWM.cleanup()
#OM.unload("PWM0")
#GPIO.cleanup()