Last active
November 1, 2016 02:17
-
-
Save turbinenreiter/45f456e22d340c8305ed78e15941bdf2 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import time | |
class RangeSensor: | |
def __init__(self): | |
pass | |
def make_generator(self): | |
t_end = time.time() + 0.1 | |
# tell sensor to start measurement | |
while time.time() < t_end: # while it isn't done yet | |
yield None # yield None | |
# read the result from the sensor | |
yield 'result' | |
def range(self): | |
# the blocking call creates a generator and waits until it stops | |
local_generator = self.make_generator() | |
while True: | |
try: | |
val = next(local_generator) | |
except StopIteration: | |
break | |
if val is not None: | |
return val | |
def range_non_blocking(self): | |
# the non blocking call creates a generator if necessary and returns its current value | |
# when no new value is available, it can either return None or the previous value | |
try: | |
val = next(self.range_generator) | |
except AttributeError: | |
self.range_generator = self.make_generator() | |
val = next(self.range_generator) | |
except StopIteration: | |
self.range_generator = self.make_generator() | |
val = next(self.range_generator) | |
return val | |
class Accel: | |
def x(self): | |
return(1) | |
rs = RangeSensor() | |
accel = Accel() | |
# example 1 | |
tw_end = time.time() + 0.3 | |
while time.time() < tw_end: | |
val = rs.range_non_blocking() | |
if val is None: | |
print('...', end='\r') | |
else: | |
print(val) | |
# example 2 | |
tw_end = time.time() + 0.3 | |
while time.time() < tw_end: | |
print(accel.x(), rs.range_non_blocking()) | |
time.sleep(0.025) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
This idea for non blocking sensor reads allows for fast data logging of multiple sensors without having to deal with each sensors specific delay and without the need of an event loop.