def testShellCmdWithWaitForEdge(self): self.finished = False def shellcmd(): for i in range(50): os.system('sleep 0') subprocess.call('sleep 0', shell=True) self.finished = True def makehigh(): GPIO.output(LOOP_OUT, GPIO.HIGH) GPIO.output(LOOP_OUT, GPIO.LOW) t1 = Timer(0.1, shellcmd) t2 = Timer(0.5, makehigh) t1.start() t2.start() starttime = time.time() channel = GPIO.wait_for_edge(LOOP_IN, GPIO.RISING, timeout=1000) endtime = time.time() self.assertGreater(endtime - starttime, 0.5) self.assertLess(endtime - starttime, 0.6) self.assertEqual(channel, LOOP_IN) # make sure tasks in this test have finished before continuing while not self.finished: time.sleep(0.1)
def testWaitForFalling(self): def makelow(): GPIO.output(LOOP_OUT, GPIO.LOW) GPIO.output(LOOP_OUT, GPIO.HIGH) t = Timer(0.1, makelow) t.start() GPIO.wait_for_edge(LOOP_IN, GPIO.FALLING)
def testWaitForRising(self): def makehigh(): GPIO.output(LOOP_OUT, GPIO.HIGH) GPIO.output(LOOP_OUT, GPIO.LOW) t = Timer(0.1, makehigh) t.start() GPIO.wait_for_edge(LOOP_IN, GPIO.RISING)
def testInvalidBouncetime(self): with self.assertRaises(ValueError): GPIO.add_event_detect(LOOP_IN, GPIO.RISING, bouncetime=-1) with self.assertRaises(ValueError): GPIO.wait_for_edge(LOOP_IN, GPIO.RISING, bouncetime=-1) GPIO.add_event_detect(LOOP_IN, GPIO.RISING, bouncetime=123) with self.assertRaises(RuntimeError): GPIO.wait_for_edge(LOOP_IN, GPIO.RISING, bouncetime=321) GPIO.remove_event_detect(LOOP_IN)
def test_event_detected(self): self.switchcount = 0 print( "\nGPIO.event_detected() switch bounce test. Press switch at least 10 times and count..." ) GPIO.add_event_detect(SWITCH_PIN, GPIO.FALLING, bouncetime=200) while self.switchcount < 10: if GPIO.event_detected(SWITCH_PIN): self.switchcount += 1 print('Button press', self.switchcount) GPIO.remove_event_detect(SWITCH_PIN)
def issue_154(): # fails with led off at around 400 count = 0 pinRef = GPIO.PWM(LED_PIN, 50) # create new PWM instance while True: pinRef.start(10) # update PWM value time.sleep(0.05) pinRef.stop() GPIO.output(LED_PIN, 0) time.sleep(0.05) count = count + 1 print count
def test_switchbounce(self): self.switchcount = 0 print( "\nSwitch bounce test. Press switch at least 10 times and count..." ) GPIO.add_event_detect(SWITCH_PIN, GPIO.FALLING, callback=self.cb, bouncetime=200) while self.switchcount < 10: time.sleep(1) GPIO.remove_event_detect(SWITCH_PIN)
def runTest(self): GPIO.setmode(GPIO.BOARD) GPIO.setup(LED_PIN, GPIO.OUT) pwm = GPIO.PWM(LED_PIN, 50) with self.assertRaises(RuntimeError): pwm2 = GPIO.PWM(LED_PIN, 49) GPIO.cleanup()
def test_loopback(self): """Test output loops back to another input""" GPIO.setup(LOOP_IN, GPIO.IN, pull_up_down=GPIO.PUD_OFF) GPIO.setup(LOOP_OUT, GPIO.OUT, initial=GPIO.LOW) self.assertEqual(GPIO.input(LOOP_IN), GPIO.LOW) GPIO.output(LOOP_OUT, GPIO.HIGH) self.assertEqual(GPIO.input(LOOP_IN), GPIO.HIGH)
def test_outputread(self): """Test that an output() can be input()""" GPIO.setup(LED_PIN, GPIO.OUT) GPIO.output(LED_PIN, GPIO.HIGH) self.assertEqual(GPIO.input(LED_PIN), GPIO.HIGH) GPIO.output(LED_PIN, GPIO.LOW) self.assertEqual(GPIO.input(LED_PIN), GPIO.LOW)
def issue_94(cycles): # led flickers. Bug = LED stays off at around cycle 400 pwm = GPIO.PWM(LED_PIN, 1) for i in xrange(cycles): print(i) pwm.ChangeFrequency(25) pwm.start(50) time.sleep(1) pwm.stop()
def testWaitForEdgeInLoop(self): def makelow(): GPIO.output(LOOP_OUT, GPIO.LOW) count = 0 timestart = time.time() GPIO.output(LOOP_OUT, GPIO.HIGH) while True: t = Timer(0.1, makelow) t.start() starttime = time.time() channel = GPIO.wait_for_edge(LOOP_IN, GPIO.FALLING, timeout=200) endtime = time.time() self.assertLess(endtime - starttime, 0.12) self.assertEqual(channel, LOOP_IN) GPIO.output(LOOP_OUT, GPIO.HIGH) count += 1 if time.time() - timestart > 5 or count > 150: break
def testWaitForEventSwitchbounce(self): self.finished = False def bounce(): GPIO.output(LOOP_OUT, GPIO.HIGH) time.sleep(0.01) GPIO.output(LOOP_OUT, GPIO.LOW) time.sleep(0.01) GPIO.output(LOOP_OUT, GPIO.HIGH) time.sleep(0.01) GPIO.output(LOOP_OUT, GPIO.LOW) time.sleep(0.2) GPIO.output(LOOP_OUT, GPIO.HIGH) time.sleep(0.01) GPIO.output(LOOP_OUT, GPIO.LOW) time.sleep(0.01) GPIO.output(LOOP_OUT, GPIO.HIGH) time.sleep(0.01) GPIO.output(LOOP_OUT, GPIO.LOW) self.finished = True GPIO.output(LOOP_OUT, GPIO.LOW) t1 = Timer(0.1, bounce) t1.start() starttime = time.time() GPIO.wait_for_edge(LOOP_IN, GPIO.RISING, bouncetime=100) GPIO.wait_for_edge(LOOP_IN, GPIO.RISING, bouncetime=100) finishtime = time.time() self.assertGreater(finishtime - starttime, 0.2) while not self.finished: time.sleep(0.1)
def testExceptionInCallback(self): self.run_cb = False def cb(channel): with self.assertRaises(ZeroDivisionError): self.run_cb = True a = 1 / 0 GPIO.output(LOOP_OUT, GPIO.LOW) GPIO.add_event_detect(LOOP_IN, GPIO.RISING, callback=cb) time.sleep(0.01) GPIO.output(LOOP_OUT, GPIO.HIGH) time.sleep(0.01) self.assertEqual(self.run_cb, True) GPIO.remove_event_detect(LOOP_IN)
def testShellCmdWithEventCallback(self): self.run_cb = False def cb(channel): self.run_cb = True GPIO.output(LOOP_OUT, GPIO.LOW) GPIO.add_event_detect(LOOP_IN, GPIO.RISING, callback=cb) time.sleep(0.01) for i in range(50): os.system('sleep 0') subprocess.call('sleep 0', shell=True) GPIO.output(LOOP_OUT, GPIO.HIGH) time.sleep(0.01) GPIO.remove_event_detect(LOOP_IN) self.assertEqual(self.run_cb, True)
def testAlternateWaitForEdge(self): def makehigh(): GPIO.output(LOOP_OUT, GPIO.HIGH) def makelow(): GPIO.output(LOOP_OUT, GPIO.LOW) GPIO.output(LOOP_OUT, GPIO.LOW) t = Timer(0.1, makehigh) t2 = Timer(0.15, makelow) t.start() t2.start() GPIO.wait_for_edge(LOOP_IN, GPIO.RISING) GPIO.wait_for_edge(LOOP_IN, GPIO.FALLING)
def runTest(self): GPIO.setmode(GPIO.BOARD) GPIO.setup(LED_PIN, GPIO.OUT) pwm = GPIO.PWM(LED_PIN, 50) pwm.start(100) print("\nPWM tests") response = input('Is the LED on (y/n) ? ').upper() self.assertEqual(response, 'Y') pwm.start(0) response = input('Is the LED off (y/n) ? ').upper() self.assertEqual(response, 'Y') print("LED Brighten/fade test...") for i in range(0, 3): for x in range(0, 101, 5): pwm.ChangeDutyCycle(x) time.sleep(0.1) for x in range(100, -1, -5): pwm.ChangeDutyCycle(x) time.sleep(0.1) pwm.stop() response = input('Did it work (y/n) ? ').upper() self.assertEqual(response, 'Y') GPIO.cleanup()
def testWaitForEdgeTimeout(self): def makehigh(): GPIO.output(LOOP_OUT, GPIO.HIGH) def makelow(): GPIO.output(LOOP_OUT, GPIO.LOW) with self.assertRaises(TypeError): GPIO.wait_for_edge(LOOP_IN, GPIO.RISING, timeout="beer") with self.assertRaises(ValueError): GPIO.wait_for_edge(LOOP_IN, GPIO.RISING, timeout=-1234) makelow() chan = GPIO.wait_for_edge(LOOP_IN, GPIO.RISING, timeout=200) self.assertEqual(chan, None) t = Timer(0.1, makehigh) t.start() chan = GPIO.wait_for_edge(LOOP_IN, GPIO.RISING, timeout=200) self.assertEqual(chan, LOOP_IN)
def tearDown(self): GPIO.cleanup()
def makelow(): GPIO.output(LOOP_OUT, GPIO.LOW)
def makehigh(): GPIO.output(LOOP_OUT, GPIO.HIGH)
def test_cleantuple(self): GPIO.setup(LOOP_OUT, GPIO.OUT) GPIO.setup(LED_PIN, GPIO.OUT) self.assertEqual(GPIO.gpio_function(LOOP_OUT), GPIO.OUT) self.assertEqual(GPIO.gpio_function(LED_PIN), GPIO.OUT) GPIO.cleanup((LOOP_OUT, )) GPIO.setmode(GPIO.BOARD) self.assertEqual(GPIO.gpio_function(LOOP_OUT), GPIO.IN) self.assertEqual(GPIO.gpio_function(LED_PIN), GPIO.OUT) GPIO.cleanup((LED_PIN, )) GPIO.setmode(GPIO.BOARD) self.assertEqual(GPIO.gpio_function(LOOP_OUT), GPIO.IN) self.assertEqual(GPIO.gpio_function(LED_PIN), GPIO.IN) GPIO.setup(LOOP_OUT, GPIO.OUT) GPIO.setup(LED_PIN, GPIO.OUT) GPIO.cleanup((LOOP_OUT, LED_PIN)) GPIO.setmode(GPIO.BOARD) self.assertEqual(GPIO.gpio_function(LOOP_OUT), GPIO.IN) self.assertEqual(GPIO.gpio_function(LED_PIN), GPIO.IN)
def runTest(self): # Test mode not set (BOARD or BCM) exception with self.assertRaises(RuntimeError) as e: GPIO.setup(LED_PIN, GPIO.OUT) self.assertEqual( str(e.exception), 'Please set pin numbering mode using GPIO.setmode(GPIO.BOARD) or GPIO.setmode(GPIO.BCM)' ) # Test trying to change mode after it has been set GPIO.setmode(GPIO.BCM) with self.assertRaises(ValueError) as e: GPIO.setmode(GPIO.BOARD) GPIO.setup(LED_PIN_BCM, GPIO.IN) GPIO.cleanup() # Test setting an invalid mode with self.assertRaises(ValueError): GPIO.setmode(666) # Test getmode() self.assertEqual(GPIO.getmode(), None) GPIO.setmode(GPIO.BCM) self.assertEqual(GPIO.getmode(), GPIO.BCM) GPIO.setup(LED_PIN_BCM, GPIO.IN) GPIO.cleanup() GPIO.setmode(GPIO.BOARD) self.assertEqual(GPIO.getmode(), GPIO.BOARD) # Test not set as OUTPUT message GPIO.setmode(GPIO.BOARD) with self.assertRaises(RuntimeError) as e: GPIO.output(LED_PIN, GPIO.HIGH) self.assertEqual(str(e.exception), 'The GPIO channel has not been set up as an OUTPUT') # Test setup(..., pull_up_down=GPIO.HIGH) raises exception GPIO.setmode(GPIO.BOARD) with self.assertRaises(ValueError): GPIO.setup(LED_PIN, GPIO.IN, pull_up_down=GPIO.HIGH) # Test not valid on a raspi exception GPIO.setmode(GPIO.BOARD) with self.assertRaises(ValueError) as e: GPIO.setup(GND_PIN, GPIO.OUT) self.assertEqual(str(e.exception), 'The channel sent is invalid on a Raspberry Pi') # Test 'already in use' warning GPIO.setmode(GPIO.BOARD) with open('/sys/class/gpio/export', 'wb') as f: f.write(str(LED_PIN_BCM).encode()) time.sleep(0.2) # wait for udev to set permissions with open('/sys/class/gpio/gpio%s/direction' % LED_PIN_BCM, 'wb') as f: f.write(b'out') time.sleep(0.2) with warnings.catch_warnings(record=True) as w: GPIO.setup(LED_PIN, GPIO.OUT) # generate 'already in use' warning self.assertEqual(w[0].category, RuntimeWarning) with open('/sys/class/gpio/unexport', 'wb') as f: f.write(str(LED_PIN_BCM).encode()) GPIO.cleanup() # test initial value of high reads back as high GPIO.setmode(GPIO.BOARD) GPIO.setup(LED_PIN, GPIO.OUT, initial=GPIO.HIGH) self.assertEqual(GPIO.input(LED_PIN), GPIO.HIGH) GPIO.cleanup() # test initial value of low reads back as low GPIO.setmode(GPIO.BOARD) GPIO.setup(LED_PIN, GPIO.OUT, initial=GPIO.LOW) self.assertEqual(GPIO.input(LED_PIN), GPIO.LOW) GPIO.cleanup() # test pull up/down works GPIO.setmode(GPIO.BOARD) for i in range(1000): GPIO.setup(NC_PIN, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) time.sleep(0.001) self.assertEqual(GPIO.input(NC_PIN), GPIO.LOW) GPIO.setup(NC_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP) time.sleep(0.001) self.assertEqual(GPIO.input(NC_PIN), GPIO.HIGH) GPIO.cleanup() # test setup of a list of channels GPIO.setmode(GPIO.BOARD) GPIO.setup([LED_PIN, LOOP_OUT], GPIO.OUT) self.assertEqual(GPIO.gpio_function(LED_PIN), GPIO.OUT) self.assertEqual(GPIO.gpio_function(LOOP_OUT), GPIO.OUT) GPIO.cleanup() GPIO.setmode(GPIO.BOARD) with self.assertRaises(ValueError) as e: GPIO.setup([LED_PIN, GND_PIN], GPIO.OUT) self.assertEqual(GPIO.gpio_function(LED_PIN), GPIO.OUT) self.assertEqual(str(e.exception), 'The channel sent is invalid on a Raspberry Pi') GPIO.cleanup() # test setup of a tuple of channels GPIO.setmode(GPIO.BOARD) GPIO.setup((LED_PIN, LOOP_OUT), GPIO.OUT) self.assertEqual(GPIO.gpio_function(LED_PIN), GPIO.OUT) self.assertEqual(GPIO.gpio_function(LOOP_OUT), GPIO.OUT) GPIO.cleanup() # test warning when using pull up/down on i2c channels GPIO.setmode(GPIO.BOARD) if GPIO.RPI_INFO['P1_REVISION'] == 0: # compute module pass # test not vailid else: # revision 1, 2 or A+/B+ with warnings.catch_warnings(record=True) as w: GPIO.setup(3, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) self.assertEqual(w[0].category, RuntimeWarning) with warnings.catch_warnings(record=True) as w: GPIO.setup(5, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) self.assertEqual(w[0].category, RuntimeWarning) GPIO.cleanup() # test non integer channel GPIO.setmode(GPIO.BOARD) with self.assertRaises(ValueError): GPIO.setup('d', GPIO.OUT) with self.assertRaises(ValueError): GPIO.setup(('d', LED_PIN), GPIO.OUT) # test setting pull_up_down on an output GPIO.setmode(GPIO.BOARD) with self.assertRaises(ValueError): GPIO.setup(LOOP_OUT, GPIO.OUT, pull_up_down=GPIO.PUD_DOWN) # test setting initial on an input GPIO.setmode(GPIO.BOARD) with self.assertRaises(ValueError): GPIO.setup(LOOP_IN, GPIO.IN, initial=GPIO.LOW)
def testBothEventDetected(self): GPIO.output(LOOP_OUT, GPIO.LOW) GPIO.add_event_detect(LOOP_IN, GPIO.BOTH) time.sleep(0.01) self.assertEqual(GPIO.event_detected(LOOP_IN), False) GPIO.output(LOOP_OUT, GPIO.HIGH) time.sleep(0.01) self.assertEqual(GPIO.event_detected(LOOP_IN), True) self.assertEqual(GPIO.event_detected(LOOP_IN), False) GPIO.output(LOOP_OUT, GPIO.LOW) time.sleep(0.01) self.assertEqual(GPIO.event_detected(LOOP_IN), True) GPIO.remove_event_detect(LOOP_IN)
def testHighLowEvent(self): with self.assertRaises(ValueError): GPIO.add_event_detect(LOOP_IN, GPIO.LOW) with self.assertRaises(ValueError): GPIO.add_event_detect(LOOP_IN, GPIO.HIGH)
def setUp(self): GPIO.setmode(GPIO.BOARD)
def test_cleanone(self): GPIO.setup(LOOP_OUT, GPIO.OUT) GPIO.setup(LED_PIN, GPIO.OUT) GPIO.setup(SWITCH_PIN, GPIO.IN) GPIO.setup(LOOP_IN, GPIO.IN) GPIO.add_event_detect(SWITCH_PIN, GPIO.FALLING) GPIO.add_event_detect(LOOP_IN, GPIO.RISING) time.sleep(0.2) # wait for udev to set permissions self.assertEqual(GPIO.gpio_function(LOOP_OUT), GPIO.OUT) self.assertEqual(GPIO.gpio_function(LED_PIN), GPIO.OUT) self.assertEqual(GPIO.gpio_function(SWITCH_PIN), GPIO.IN) self.assertEqual(GPIO.gpio_function(LOOP_IN), GPIO.IN) self.assertTrue( os.path.exists('/sys/class/gpio/gpio%s' % SWITCH_PIN_BCM)) self.assertTrue(os.path.exists('/sys/class/gpio/gpio%s' % LOOP_IN_BCM)) GPIO.cleanup(SWITCH_PIN) time.sleep(0.2) # wait for udev to set permissions self.assertFalse( os.path.exists('/sys/class/gpio/gpio%s' % SWITCH_PIN_BCM)) self.assertTrue(os.path.exists('/sys/class/gpio/gpio%s' % LOOP_IN_BCM)) GPIO.cleanup(LOOP_IN) time.sleep(0.2) # wait for udev to set permissions self.assertFalse( os.path.exists('/sys/class/gpio/gpio%s' % SWITCH_PIN_BCM)) self.assertFalse(os.path.exists('/sys/class/gpio/gpio%s' % LOOP_IN_BCM)) GPIO.cleanup(LOOP_OUT) self.assertEqual(GPIO.gpio_function(LOOP_OUT), GPIO.IN) self.assertEqual(GPIO.gpio_function(LED_PIN), GPIO.OUT) GPIO.cleanup(LED_PIN) self.assertEqual(GPIO.gpio_function(LOOP_OUT), GPIO.IN) self.assertEqual(GPIO.gpio_function(LED_PIN), GPIO.IN)
def testAddEventCallback(self): def cb(channel): self.callback_count += 1 # falling test self.callback_count = 0 GPIO.output(LOOP_OUT, GPIO.HIGH) GPIO.add_event_detect(LOOP_IN, GPIO.FALLING) GPIO.add_event_callback(LOOP_IN, cb) time.sleep(0.01) for i in range(2048): GPIO.output(LOOP_OUT, GPIO.LOW) time.sleep(0.001) GPIO.output(LOOP_OUT, GPIO.HIGH) time.sleep(0.001) GPIO.remove_event_detect(LOOP_IN) self.assertEqual(self.callback_count, 2048) # rising test self.callback_count = 0 GPIO.output(LOOP_OUT, GPIO.LOW) GPIO.add_event_detect(LOOP_IN, GPIO.RISING, callback=cb) time.sleep(0.01) for i in range(2048): GPIO.output(LOOP_OUT, GPIO.HIGH) time.sleep(0.001) GPIO.output(LOOP_OUT, GPIO.LOW) time.sleep(0.001) GPIO.remove_event_detect(LOOP_IN) self.assertEqual(self.callback_count, 2048) # both test self.callback_count = 0 GPIO.output(LOOP_OUT, GPIO.LOW) GPIO.add_event_detect(LOOP_IN, GPIO.BOTH, callback=cb) time.sleep(0.01) for i in range(2048): GPIO.output(LOOP_OUT, GPIO.HIGH) time.sleep(0.001) GPIO.output(LOOP_OUT, GPIO.LOW) time.sleep(0.001) GPIO.remove_event_detect(LOOP_IN) self.assertEqual(self.callback_count, 4096)
def test_cleanlist(self): GPIO.setup(LOOP_OUT, GPIO.OUT) GPIO.setup(LED_PIN, GPIO.OUT) self.assertEqual(GPIO.gpio_function(LOOP_OUT), GPIO.OUT) self.assertEqual(GPIO.gpio_function(LED_PIN), GPIO.OUT) GPIO.cleanup([LOOP_OUT]) self.assertEqual(GPIO.gpio_function(LOOP_OUT), GPIO.IN) self.assertEqual(GPIO.gpio_function(LED_PIN), GPIO.OUT) GPIO.cleanup([LED_PIN]) self.assertEqual(GPIO.gpio_function(LOOP_OUT), GPIO.IN) self.assertEqual(GPIO.gpio_function(LED_PIN), GPIO.IN) GPIO.setup(LOOP_OUT, GPIO.OUT) GPIO.setup(LED_PIN, GPIO.OUT) GPIO.cleanup([LOOP_OUT, LED_PIN]) self.assertEqual(GPIO.gpio_function(LOOP_OUT), GPIO.IN) self.assertEqual(GPIO.gpio_function(LED_PIN), GPIO.IN)
def testEventOnOutput(self): with self.assertRaises(RuntimeError): GPIO.add_event_detect(LOOP_OUT, GPIO.FALLING)