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 test_output_list(self): """Test output() using lists""" GPIO.setup(LOOP_OUT, GPIO.OUT) GPIO.setup(LED_PIN, GPIO.OUT) GPIO.output([LOOP_OUT, LED_PIN], GPIO.HIGH) self.assertEqual(GPIO.input(LOOP_OUT), GPIO.HIGH) self.assertEqual(GPIO.input(LED_PIN), GPIO.HIGH) GPIO.output((LOOP_OUT, LED_PIN), GPIO.LOW) self.assertEqual(GPIO.input(LOOP_OUT), GPIO.LOW) self.assertEqual(GPIO.input(LED_PIN), GPIO.LOW) GPIO.output([LOOP_OUT, LED_PIN], [GPIO.HIGH, GPIO.LOW]) self.assertEqual(GPIO.input(LOOP_OUT), GPIO.HIGH) self.assertEqual(GPIO.input(LED_PIN), GPIO.LOW) GPIO.output((LOOP_OUT, LED_PIN), (GPIO.LOW, GPIO.HIGH)) self.assertEqual(GPIO.input(LOOP_OUT), GPIO.LOW) self.assertEqual(GPIO.input(LED_PIN), GPIO.HIGH) with self.assertRaises(RuntimeError): GPIO.output([LOOP_OUT, LED_PIN], [0, 0, 0]) with self.assertRaises(RuntimeError): GPIO.output([LOOP_OUT, LED_PIN], (0, )) with self.assertRaises(RuntimeError): GPIO.output(LOOP_OUT, (0, 0)) with self.assertRaises(ValueError): GPIO.output([LOOP_OUT, 'x'], (0, 0)) with self.assertRaises(ValueError): GPIO.output([LOOP_OUT, LED_PIN], (0, 'x')) with self.assertRaises(ValueError): GPIO.output([LOOP_OUT, GND_PIN], (0, 0)) with self.assertRaises(RuntimeError): GPIO.output([LOOP_OUT, LOOP_IN], (0, 0))
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)