mirror of
				https://github.com/KevinMidboe/python-gpiozero.git
				synced 2025-10-29 17:50:37 +00:00 
			
		
		
		
	Fix #109
Document and test the LineSensor class properly. Multi-sensor devices can wait for now.
This commit is contained in:
		| @@ -20,6 +20,13 @@ Button | ||||
|     :members: wait_for_press, wait_for_release, pin, is_pressed, pull_up, when_pressed, when_released | ||||
|  | ||||
|  | ||||
| Line Sensor (TRCT5000) | ||||
| ====================== | ||||
|  | ||||
| .. autoclass:: LineSensor(pin) | ||||
|     :members: wait_for_line, wait_for_no_line, pin, line_detected, when_line, when_no_line | ||||
|  | ||||
|  | ||||
| Motion Sensor (D-SUN PIR) | ||||
| ========================= | ||||
|  | ||||
|   | ||||
| @@ -23,6 +23,7 @@ digraph classes { | ||||
|     Button->DigitalInputDevice; | ||||
|     MotionSensor->SmoothedInputDevice; | ||||
|     LightSensor->SmoothedInputDevice; | ||||
|     LineSensor->SmoothedInputDevice; | ||||
|  | ||||
|     OutputDevice->GPIODevice; | ||||
|     DigitalOutputDevice->OutputDevice; | ||||
|   | ||||
| @@ -410,18 +410,75 @@ Button.wait_for_press = Button.wait_for_active | ||||
| Button.wait_for_release = Button.wait_for_inactive | ||||
|  | ||||
|  | ||||
| class LineSensor(DigitalInputDevice): | ||||
| class LineSensor(SmoothedInputDevice): | ||||
|     """ | ||||
|     A single sensor line detector. | ||||
|     """ | ||||
|     def __init__(self, pin=None, pull_up=True, bounce_time=None): | ||||
|         super(LineSensor, self).__init__(pin, pull_up, bounce_time) | ||||
|     Extends :class:`DigitalInputDevice` and represents a single pin line sensor | ||||
|     like the TCRT5000 infra-red proximity sensor found in the `CamJam #3 | ||||
|     EduKit`_. | ||||
|  | ||||
| LineSensor.line_detected = LineSensor.is_active | ||||
| LineSensor.when_line = LineSensor.when_activated | ||||
| LineSensor.when_no_line = LineSensor.when_deactivated | ||||
| LineSensor.wait_for_line = LineSensor.wait_for_active | ||||
| LineSensor.wait_for_no_line = LineSensor.wait_for_inactive | ||||
|     A typical line sensor has a small circuit board with three pins: VCC, GND, | ||||
|     and OUT. VCC should be connected to a 3V3 pin, GND to one of the ground | ||||
|     pins, and finally OUT to the GPIO specified as the value of the *pin* | ||||
|     parameter in the constructor. | ||||
|  | ||||
|     The following code will print a line of text indicating when the sensor | ||||
|     detects a line, or stops detecting a line:: | ||||
|  | ||||
|         from gpiozero import LineSensor | ||||
|         from signal import pause | ||||
|  | ||||
|         sensor = LineSensor(4) | ||||
|         sensor.when_line = lambda: print('Line detected') | ||||
|         sensor.when_no_line = lambda: print('No line detected') | ||||
|         pause() | ||||
|  | ||||
|     :param int pin: | ||||
|         The GPIO pin which the button is attached to. See :doc:`notes` for | ||||
|         valid pin numbers. | ||||
|  | ||||
|     :param int queue_len: | ||||
|         The length of the queue used to store values read from the sensor. This | ||||
|         defaults to 5. | ||||
|  | ||||
|     :param float sample_rate: | ||||
|         The number of values to read from the device (and append to the | ||||
|         internal queue) per second. Defaults to 100. | ||||
|  | ||||
|     :param float threshold: | ||||
|         Defaults to 0.5. When the mean of all values in the internal queue | ||||
|         rises above this value, the sensor will be considered "active" by the | ||||
|         :attr:`~SmoothedInputDevice.is_active` property, and all appropriate | ||||
|         events will be fired. | ||||
|  | ||||
|     :param bool partial: | ||||
|         When ``False`` (the default), the object will not return a value for | ||||
|         :attr:`~SmoothedInputDevice.is_active` until the internal queue has | ||||
|         filled with values.  Only set this to ``True`` if you require values | ||||
|         immediately after object construction. | ||||
|  | ||||
|     .. _CamJam #3 EduKit: http://camjam.me/?page_id=1035 | ||||
|     """ | ||||
|     def __init__( | ||||
|             self, pin=None, queue_len=5, sample_rate=100, threshold=0.5, | ||||
|             partial=False): | ||||
|         super(LineSensor, self).__init__( | ||||
|             pin, pull_up=False, threshold=threshold, | ||||
|             queue_len=queue_len, sample_wait=1 / sample_rate, partial=partial | ||||
|         ) | ||||
|         try: | ||||
|             self._queue.start() | ||||
|         except: | ||||
|             self.close() | ||||
|             raise | ||||
|  | ||||
|     @property | ||||
|     def line_detected(self): | ||||
|         return not self.is_active | ||||
|  | ||||
| LineSensor.when_line = LineSensor.when_deactivated | ||||
| LineSensor.when_no_line = LineSensor.when_activated | ||||
| LineSensor.wait_for_line = LineSensor.wait_for_inactive | ||||
| LineSensor.wait_for_no_line = LineSensor.wait_for_active | ||||
|  | ||||
|  | ||||
| class MotionSensor(SmoothedInputDevice): | ||||
| @@ -455,7 +512,7 @@ class MotionSensor(SmoothedInputDevice): | ||||
|  | ||||
|     :param float sample_rate: | ||||
|         The number of values to read from the device (and append to the | ||||
|         internal queue) per second. Defaults to 10. | ||||
|         internal queue) per second. Defaults to 100. | ||||
|  | ||||
|     :param float threshold: | ||||
|         Defaults to 0.5. When the mean of all values in the internal queue | ||||
| @@ -762,9 +819,12 @@ class DistanceSensor(SmoothedInputDevice): | ||||
|             # wrong (XXX raise a warning?) | ||||
|             return 1.0 | ||||
|  | ||||
|     @property | ||||
|     def in_range(self): | ||||
|         return not self.is_active | ||||
|  | ||||
| DistanceSensor.when_out_of_range = DistanceSensor.when_activated | ||||
| DistanceSensor.when_in_range = DistanceSensor.when_deactivated | ||||
| DistanceSensor.wait_for_out_of_range = DistanceSensor.wait_for_active | ||||
| DistanceSensor.wait_for_in_range = DistanceSensor.wait_for_inactive | ||||
|  | ||||
|  | ||||
|   | ||||
| @@ -51,7 +51,6 @@ class GPIOQueue(GPIOThread): | ||||
|     def __init__( | ||||
|             self, parent, queue_len=5, sample_wait=0.0, partial=False, | ||||
|             average=median): | ||||
|         assert isinstance(parent, GPIODevice) | ||||
|         assert callable(average) | ||||
|         super(GPIOQueue, self).__init__(target=self.fill) | ||||
|         if queue_len < 1: | ||||
|   | ||||
		Reference in New Issue
	
	Block a user