annotate service/mqtt_to_rdf/button_events.py @ 1726:7d3797ed6681

rough port to starlette and reactivex
author drewp@bigasterisk.com
date Tue, 20 Jun 2023 23:14:28 -0700
parents c3e3bd5dfa0b
children
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
1726
7d3797ed6681 rough port to starlette and reactivex
drewp@bigasterisk.com
parents: 793
diff changeset
3 import asyncio
793
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
4 import time
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
5 from typing import Any, Callable, List
1726
7d3797ed6681 rough port to starlette and reactivex
drewp@bigasterisk.com
parents: 793
diff changeset
6
793
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
7 from rdflib import Namespace
1726
7d3797ed6681 rough port to starlette and reactivex
drewp@bigasterisk.com
parents: 793
diff changeset
8 from reactivex import Observable
7d3797ed6681 rough port to starlette and reactivex
drewp@bigasterisk.com
parents: 793
diff changeset
9 from reactivex.abc.disposable import DisposableBase
7d3797ed6681 rough port to starlette and reactivex
drewp@bigasterisk.com
parents: 793
diff changeset
10 from reactivex.disposable import (CompositeDisposable, SerialDisposable, SingleAssignmentDisposable)
7d3797ed6681 rough port to starlette and reactivex
drewp@bigasterisk.com
parents: 793
diff changeset
11 from reactivex.scheduler.eventloop import AsyncIOScheduler
7d3797ed6681 rough port to starlette and reactivex
drewp@bigasterisk.com
parents: 793
diff changeset
12
793
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
13 ROOM = Namespace('http://projects.bigasterisk.com/room/')
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
14
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
15
1726
7d3797ed6681 rough port to starlette and reactivex
drewp@bigasterisk.com
parents: 793
diff changeset
16 def button_events(
7d3797ed6681 rough port to starlette and reactivex
drewp@bigasterisk.com
parents: 793
diff changeset
17 min_hold_sec: float,
7d3797ed6681 rough port to starlette and reactivex
drewp@bigasterisk.com
parents: 793
diff changeset
18 release_after_sec: float,
7d3797ed6681 rough port to starlette and reactivex
drewp@bigasterisk.com
parents: 793
diff changeset
19 ) -> Callable[[Observable], Observable]:
793
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
20
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
21 def op(source: Observable) -> Observable:
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
22
1726
7d3797ed6681 rough port to starlette and reactivex
drewp@bigasterisk.com
parents: 793
diff changeset
23 def subscribe(observer, scheduler_=None) -> DisposableBase:
7d3797ed6681 rough port to starlette and reactivex
drewp@bigasterisk.com
parents: 793
diff changeset
24 _scheduler = AsyncIOScheduler(asyncio.get_event_loop())
793
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
25 cancelable = SerialDisposable()
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
26 button_state = [None]
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
27
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
28 press_time: List[float] = [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 def set_state(state):
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
31 button_state[0] = state
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
32 observer.on_next(button_state[0])
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
33
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
34 set_state(ROOM['notPressed'])
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
35
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
36 def on_next(x: Any) -> None:
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
37 now = time.time()
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
38 if button_state[0] == ROOM['notPressed']:
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
39 set_state(ROOM['pressed'])
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
40 press_time[0] = now
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
41 elif button_state[0] == ROOM['pressed']:
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
42 if now > press_time[0] + min_hold_sec:
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
43 set_state(ROOM['held']) # should be pressed AND held
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
44 elif button_state[0] == ROOM['held']:
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
45 pass
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
46 else:
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
47 raise NotImplementedError(f'button_state={button_state}')
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
48
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
49 d = SingleAssignmentDisposable()
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
50 cancelable.disposable = d
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 def action(scheduler, state=None) -> None:
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
53 if button_state[0] != ROOM['notPressed']:
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
54 set_state(ROOM['notPressed'])
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
55
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
56 d.disposable = _scheduler.schedule_relative(release_after_sec, action)
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_error(exception: Exception) -> None:
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
59 cancelable.dispose()
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
60 observer.on_error(exception)
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
61
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
62 def on_completed() -> None:
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
63 raise NotImplementedError
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
64
1726
7d3797ed6681 rough port to starlette and reactivex
drewp@bigasterisk.com
parents: 793
diff changeset
65 subscription = source.subscribe(on_next, on_error, on_completed, scheduler=scheduler_)
793
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
66 return CompositeDisposable(subscription, cancelable)
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
67
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
68 return Observable(subscribe)
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
69
c3e3bd5dfa0b add rf button mqtt message processing
drewp@bigasterisk.com
parents:
diff changeset
70 return op