annotate service/mqtt_to_rdf/button_events.py @ 1623:cf901d219007

apparently this was redundant
author drewp@bigasterisk.com
date Wed, 08 Sep 2021 18:56:24 -0700
parents c3e3bd5dfa0b
children 7d3797ed6681
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
793
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
1 """given repeated RF codes for a button press, make interesting button events"""
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
2
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
3 import time
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
4 from typing import Any, Callable, List
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
5 from rx.core.typing import Disposable
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
6 from rx.core import Observable, typing
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
7 from rx.disposable import CompositeDisposable, SingleAssignmentDisposable, SerialDisposable
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
8 from rx.scheduler import TimeoutScheduler
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
9 from rdflib import Namespace
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
10 ROOM = Namespace('http://projects.bigasterisk.com/room/')
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
11
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
12
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
13 def button_events(min_hold_sec: float,
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
14 release_after_sec: float,
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
15 scheduler=typing.Scheduler) -> Callable[[Observable], Observable]:
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
16
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
17 def op(source: Observable) -> Observable:
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
18
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
19 def subscribe(observer, scheduler_=None) -> Disposable:
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
20 _scheduler = scheduler or scheduler_ or TimeoutScheduler.singleton()
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
21 cancelable = SerialDisposable()
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
22 button_state = [None]
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
23
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
24 press_time: List[float] = [0.]
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
25
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
26 def set_state(state):
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
27 button_state[0] = state
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
28 observer.on_next(button_state[0])
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
29
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
30 set_state(ROOM['notPressed'])
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
31
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
32 def on_next(x: Any) -> None:
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
33 now = time.time()
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
34 if button_state[0] == ROOM['notPressed']:
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
35 set_state(ROOM['pressed'])
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
36 press_time[0] = now
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
37 elif button_state[0] == ROOM['pressed']:
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
38 if now > press_time[0] + min_hold_sec:
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
39 set_state(ROOM['held']) # should be pressed AND held
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
40 elif button_state[0] == ROOM['held']:
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
41 pass
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
42 else:
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
43 raise NotImplementedError(f'button_state={button_state}')
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
44
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
45 d = SingleAssignmentDisposable()
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
46 cancelable.disposable = d
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
47
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
48 def action(scheduler, state=None) -> None:
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
49 if button_state[0] != ROOM['notPressed']:
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
50 set_state(ROOM['notPressed'])
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
51
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
52 d.disposable = _scheduler.schedule_relative(release_after_sec, action)
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
53
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
54 def on_error(exception: Exception) -> None:
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
55 cancelable.dispose()
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
56 observer.on_error(exception)
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
57
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
58 def on_completed() -> None:
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
59 raise NotImplementedError
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
60
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
61 subscription = source.subscribe_(on_next, on_error, on_completed, scheduler=scheduler_)
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
62 return CompositeDisposable(subscription, cancelable)
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
63
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
64 return Observable(subscribe)
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
65
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
66 return op