From 3bd6571e9733b882db8b90ad5b391c908922ea3b Mon Sep 17 00:00:00 2001 From: Aleh Arol Date: Sun, 8 Nov 2015 00:09:42 +0300 Subject: [PATCH 1/3] #62: add force flush meta attribute for ev3dev object attributes; force LED trigger mode flush on write. --- ev3/ev3dev.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/ev3/ev3dev.py b/ev3/ev3dev.py index 42c051d..1d28761 100755 --- a/ev3/ev3dev.py +++ b/ev3/ev3dev.py @@ -104,7 +104,7 @@ def __init__(self, **kwargs): def __call__(self, cls): for name, args in self.kwargs.items(): - def ev3_property(name, read_only=False, write_only=False, property_type=Ev3StringType): + def ev3_property(name, read_only=False, write_only=False, flush_on_write=False, property_type=Ev3StringType): def fget(self): if not write_only: return property_type.post_read(self.read_value(name)) @@ -113,7 +113,7 @@ def fget(self): def fset(self, value): self.write_value( - name, property_type.pre_write(value)) + name, property_type.pre_write(value), flush_on_write) return property(fget, None if read_only else fset) setattr(cls, name, ev3_property(name, **args)) @@ -193,11 +193,13 @@ def read_value(self, name): else: return None - def write_value(self, name, value): + def write_value(self, name, value, flush = False): attr_file = os.path.join(self.sys_path, name) if os.path.isfile(attr_file): with open(attr_file, 'w') as f: f.write(str(value)) + if flush: + f.flush() else: return @@ -460,7 +462,7 @@ def fset(self, value): @create_ev3_property( brightness={'read_only': False, 'property_type': Ev3IntType}, max_brightness={'read_only': True, 'property_type': Ev3IntType}, - trigger={'read_only': False}, + trigger={'read_only': False, 'flush_on_write': True}, delay_on={'read_only': False, 'property_type': Ev3IntType}, delay_off={'read_only': False, 'property_type': Ev3IntType} ) From 0f086bc94507490396f1512fac8d9ccd3c0c3348 Mon Sep 17 00:00:00 2001 From: Aleh Arol Date: Sun, 8 Nov 2015 11:32:03 +0300 Subject: [PATCH 2/3] Fix incorrect indentation --- ev3/ev3dev.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ev3/ev3dev.py b/ev3/ev3dev.py index 1d28761..9734cd4 100755 --- a/ev3/ev3dev.py +++ b/ev3/ev3dev.py @@ -198,8 +198,8 @@ def write_value(self, name, value, flush = False): if os.path.isfile(attr_file): with open(attr_file, 'w') as f: f.write(str(value)) - if flush: - f.flush() + if flush: + f.flush() else: return From cde56f8e2c941f82967345f131d2ab281fb05d59 Mon Sep 17 00:00:00 2001 From: Aleh Arol Date: Tue, 1 Dec 2015 23:56:38 +0300 Subject: [PATCH 3/3] Add unconditional poll events; Add configurable time delta parameter to event loop --- ev3/event_loop.py | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/ev3/event_loop.py b/ev3/event_loop.py index 1069a79..30341fb 100644 --- a/ev3/event_loop.py +++ b/ev3/event_loop.py @@ -30,7 +30,7 @@ def register_condition(self, condition, target, repeat=False, count=-1): return len(self._events) - 1 def register_value_change(self, getter, startvalue, target, count=-1): - """Register `target` to be called when evaliating ``getter()`` + """Register `target` to be called when evaluating ``getter()`` returns a new value. `startvalue` is the starting value to check against. @@ -54,28 +54,37 @@ def register_timer(self, seconds, target, count=1): """ target_time = time.time() + seconds condition = lambda: time.time() >= target_time - return self._add_condition(condition, target, False, count) + return self.register_condition(condition, target, False, count) + + def register_poll(self, poller, callback): + """Register `callback` to be called on every ``poller()`` evaluation. + + Returns an ID that can be used to unregister this poll event. + """ + self._events.append(PollEvent( + poller, callback)) + return len(self._events) - 1 def unregister(self, id): """Ungegister condition with the given id.""" del self._events[id] - def start(self): + def start(self, time_delta = 0.1): """Starts the event loop.""" - self._loop() + self._loop(time_delta) def stop(self): """Stops event loop.""" self._closed = True - def _loop(self): + def _loop(self, time_delta = 0.1): """The event loop.""" while not self._closed: for i in range(len(self._events) - 1, -1, -1): self._events[i].evaluate() if self._events[i]._count == 0: self.unregister(i) - time.sleep(0.1) + time.sleep(time_delta) class Event(object): @@ -136,3 +145,12 @@ def __init__(self, getter, startvalue, target, count=-1): def poll(self): return self._evaluation != self._previous_evaluation + + +class PollEvent(Event): + + def __init__(self, poller, callback): + Event.__init__(self, poller, callback, count=-1) + + def poll(self): + return True