annotate add_monolight.patch @ 501:c38b0b9612cd

broken wip
author Louis Opter <kalessin@kalessin.fr>
date Sun, 23 Oct 2016 14:53:11 -0700
parents d250169c1a69
children a78f7f19d40f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
491
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1 # HG changeset patch
499
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
2 # Parent 7e908ae2e0c7088791fb4a442d86d7687a52b956
493
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
3 Start an experimental GUI for a Monome 128 Varibright
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
4
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
5 Written in Python >= 3.5.
491
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
6
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
7 diff --git a/.hgignore b/.hgignore
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
8 --- a/.hgignore
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
9 +++ b/.hgignore
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
10 @@ -2,3 +2,4 @@
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
11 .*\.py[co]$
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
12 ^build
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
13 ^pcaps
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
14 +.*\.egg-info$
498
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
15 diff --git a/apps/monolight/monolight/__init__.py b/apps/monolight/monolight/__init__.py
491
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
16 new file mode 100644
498
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
17 diff --git a/apps/monolight/monolight/cli.py b/apps/monolight/monolight/cli.py
491
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
18 new file mode 100644
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
19 --- /dev/null
498
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
20 +++ b/apps/monolight/monolight/cli.py
501
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
21 @@ -0,0 +1,69 @@
493
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
22 +# Copyright (c) 2016, Louis Opter <louis@opter.org>
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
23 +#
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
24 +# This file is part of lightsd.
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
25 +#
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
26 +# lightsd is free software: you can redistribute it and/or modify
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
27 +# it under the terms of the GNU General Public License as published by
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
28 +# the Free Software Foundation, either version 3 of the License, or
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
29 +# (at your option) any later version.
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
30 +#
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
31 +# lightsd is distributed in the hope that it will be useful,
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
32 +# but WITHOUT ANY WARRANTY; without even the implied warranty of
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
33 +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
34 +# GNU General Public License for more details.
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
35 +#
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
36 +# You should have received a copy of the GNU General Public License
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
37 +# along with lightsd. If not, see <http://www.gnu.org/licenses/>.
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
38 +
491
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
39 +import asyncio
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
40 +import click
494
8f70d5539e5c Organize the code a bit better
Louis Opter <kalessin@kalessin.fr>
parents: 493
diff changeset
41 +import functools
499
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
42 +import lightsc
491
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
43 +import locale
493
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
44 +import logging
491
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
45 +import monome
496
08ad69e0a7a7 get things working in a good shape
Louis Opter <kalessin@kalessin.fr>
parents: 495
diff changeset
46 +import signal
493
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
47 +
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
48 +from . import osc
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
49 +from . import ui
491
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
50 +
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
51 +ENCODING = locale.getpreferredencoding()
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
52 +
493
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
53 +logging.basicConfig(level=logging.INFO)
491
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
54 +
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
55 +
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
56 +@click.command()
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
57 +@click.option("--serialoscd-host", default="127.0.0.1")
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
58 +@click.option("--serialoscd-port", type=click.IntRange(0, 2**16 - 1))
499
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
59 +@click.option("--lightsd-url")
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
60 +def main(serialoscd_host: str, serialoscd_port: int, lightsd_url: str):
491
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
61 + loop = asyncio.get_event_loop()
493
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
62 +
501
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
63 + monome_future = asyncio.Future()
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
64 + grid = ui.MonomeGrid()
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
65 +
496
08ad69e0a7a7 get things working in a good shape
Louis Opter <kalessin@kalessin.fr>
parents: 495
diff changeset
66 + tasks = asyncio.gather(
499
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
67 + loop.create_task(lightsc.create_async_lightsd_connection(lightsd_url)),
501
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
68 + loop.create_task(monome.create_serialosc_connection(functools.partial(
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
69 + osc.MonomeApplication, monome_future, grid.submit_input
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
70 + ))),
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
71 + asyncio.ensure_future(monome_future)
496
08ad69e0a7a7 get things working in a good shape
Louis Opter <kalessin@kalessin.fr>
parents: 495
diff changeset
72 + )
08ad69e0a7a7 get things working in a good shape
Louis Opter <kalessin@kalessin.fr>
parents: 495
diff changeset
73 + loop.run_until_complete(tasks)
501
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
74 + lightsd, serialosc, monome_app = tasks.result()
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
75 +
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
76 + grid.set_monome(monome_app)
493
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
77 +
499
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
78 + if hasattr(loop, "add_signal_handler"):
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
79 + for signum in (signal.SIGINT, signal.SIGTERM, signal.SIGQUIT):
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
80 + loop.add_signal_handler(signum, ui.stop)
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
81 +
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
82 + # TODO: make which monome instance to use something configurable
501
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
83 + ui_task = loop.create_task(ui.start(loop, lightsd, grid))
496
08ad69e0a7a7 get things working in a good shape
Louis Opter <kalessin@kalessin.fr>
parents: 495
diff changeset
84 +
499
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
85 + loop.run_until_complete(ui_task)
493
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
86 +
499
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
87 + serialosc.disconnect()
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
88 + loop.run_until_complete(lightsd.close())
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
89 +
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
90 + loop.close()
501
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
91 diff --git a/apps/monolight/monolight/osc.py b/apps/monolight/monolight/osc.py
500
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
92 new file mode 100644
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
93 --- /dev/null
501
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
94 +++ b/apps/monolight/monolight/osc.py
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
95 @@ -0,0 +1,66 @@
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
96 +# Copyright (c) 2016, Louis Opter <louis@opter.org>
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
97 +#
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
98 +# This file is part of lightsd.
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
99 +#
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
100 +# lightsd is free software: you can redistribute it and/or modify
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
101 +# it under the terms of the GNU General Public License as published by
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
102 +# the Free Software Foundation, either version 3 of the License, or
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
103 +# (at your option) any later version.
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
104 +#
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
105 +# lightsd is distributed in the hope that it will be useful,
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
106 +# but WITHOUT ANY WARRANTY; without even the implied warranty of
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
107 +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
108 +# GNU General Public License for more details.
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
109 +#
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
110 +# You should have received a copy of the GNU General Public License
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
111 +# along with lightsd. If not, see <http://www.gnu.org/licenses/>.
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
112 +
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
113 +import asyncio
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
114 +import monome
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
115 +
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
116 +from enum import IntEnum
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
117 +from typing import Callable
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
118 +
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
119 +
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
120 +class MonomeKeyState(IntEnum):
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
121 +
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
122 + DOWN = 1
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
123 + UP = 0
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
124 +
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
125 +
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
126 +class MonomeLedLevel(IntEnum):
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
127 +
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
128 + OFF = 0
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
129 + VERY_LOW_1 = 1
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
130 + VERY_LOW_2 = 2
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
131 + VERY_LOW_3 = 3
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
132 + LOW = LOW_1 = 4
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
133 + LOW_2 = 5
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
134 + LOW_3 = 6
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
135 + LOW_4 = 7
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
136 + MEDIUM = MEDIUM_1 = 8
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
137 + MEDIUM_2 = 9
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
138 + MEDIUM_3 = 10
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
139 + MEDIUM_4 = 11
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
140 + HIGH = HIGH_1 = 12
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
141 + HIGH_2 = 13
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
142 + HIGH_3 = 14
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
143 + HIGH_4 = ON = 15
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
144 +
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
145 +
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
146 +class MonomeApplication(monome.Monome):
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
147 +
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
148 + def __init__(
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
149 + self,
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
150 + future: asyncio.Future,
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
151 + keypress_callback: Callable[[int, int, int], None]
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
152 + ) -> None:
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
153 + monome.Monome.__init__(self, "/monolight")
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
154 + future.set_result(self)
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
155 + self._keypress_callback = keypress_callback
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
156 +
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
157 + def ready(self) -> None:
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
158 + self.led_all(MonomeLedLevel.OFF)
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
159 +
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
160 + def grid_key(self, x: int, y: int, s: int):
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
161 + self._keypress_callback(x, y, s)
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
162 diff --git a/apps/monolight/monolight/types.py b/apps/monolight/monolight/types.py
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
163 new file mode 100644
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
164 --- /dev/null
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
165 +++ b/apps/monolight/monolight/types.py
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
166 @@ -0,0 +1,18 @@
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
167 +# Copyright (c) 2016, Louis Opter <louis@opter.org>
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
168 +#
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
169 +# This file is part of lightsd.
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
170 +#
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
171 +# lightsd is free software: you can redistribute it and/or modify
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
172 +# it under the terms of the GNU General Public License as published by
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
173 +# the Free Software Foundation, either version 3 of the License, or
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
174 +# (at your option) any later version.
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
175 +#
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
176 +# lightsd is distributed in the hope that it will be useful,
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
177 +# but WITHOUT ANY WARRANTY; without even the implied warranty of
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
178 +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
179 +# GNU General Public License for more details.
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
180 +#
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
181 +# You should have received a copy of the GNU General Public License
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
182 +# along with lightsd. If not, see <http://www.gnu.org/licenses/>.
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
183 +
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
184 +TimeMonotonic = float
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
185 diff --git a/apps/monolight/monolight/ui/__init__.py b/apps/monolight/monolight/ui/__init__.py
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
186 new file mode 100644
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
187 --- /dev/null
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
188 +++ b/apps/monolight/monolight/ui/__init__.py
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
189 @@ -0,0 +1,19 @@
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
190 +# Copyright (c) 2016, Louis Opter <louis@opter.org>
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
191 +#
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
192 +# This file is part of lightsd.
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
193 +#
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
194 +# lightsd is free software: you can redistribute it and/or modify
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
195 +# it under the terms of the GNU General Public License as published by
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
196 +# the Free Software Foundation, either version 3 of the License, or
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
197 +# (at your option) any later version.
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
198 +#
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
199 +# lightsd is distributed in the hope that it will be useful,
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
200 +# but WITHOUT ANY WARRANTY; without even the implied warranty of
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
201 +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
202 +# GNU General Public License for more details.
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
203 +#
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
204 +# You should have received a copy of the GNU General Public License
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
205 +# along with lightsd. If not, see <http://www.gnu.org/licenses/>.
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
206 +
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
207 +from .grid import MonomeGrid # noqa
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
208 +from .ui import start, stop, submit_keypress # noqa
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
209 diff --git a/apps/monolight/monolight/ui/components/__init__.py b/apps/monolight/monolight/ui/components/__init__.py
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
210 new file mode 100644
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
211 --- /dev/null
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
212 +++ b/apps/monolight/monolight/ui/components/__init__.py
500
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
213 @@ -0,0 +1,20 @@
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
214 +# Copyright (c) 2016, Louis Opter <louis@opter.org>
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
215 +#
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
216 +# This file is part of lightsd.
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
217 +#
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
218 +# lightsd is free software: you can redistribute it and/or modify
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
219 +# it under the terms of the GNU General Public License as published by
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
220 +# the Free Software Foundation, either version 3 of the License, or
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
221 +# (at your option) any later version.
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
222 +#
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
223 +# lightsd is distributed in the hope that it will be useful,
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
224 +# but WITHOUT ANY WARRANTY; without even the implied warranty of
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
225 +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
226 +# GNU General Public License for more details.
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
227 +#
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
228 +# You should have received a copy of the GNU General Public License
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
229 +# along with lightsd. If not, see <http://www.gnu.org/licenses/>.
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
230 +
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
231 +from .base import MonomeGrid # noqa
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
232 +from .layers import Layer # noqa
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
233 +from .button import button # noqa
501
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
234 diff --git a/apps/monolight/monolight/ui/components/base.py b/apps/monolight/monolight/ui/components/base.py
500
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
235 new file mode 100644
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
236 --- /dev/null
501
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
237 +++ b/apps/monolight/monolight/ui/components/base.py
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
238 @@ -0,0 +1,110 @@
500
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
239 +# Copyright (c) 2016, Louis Opter <louis@opter.org>
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
240 +#
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
241 +# This file is part of lightsd.
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
242 +#
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
243 +# lightsd is free software: you can redistribute it and/or modify
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
244 +# it under the terms of the GNU General Public License as published by
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
245 +# the Free Software Foundation, either version 3 of the License, or
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
246 +# (at your option) any later version.
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
247 +#
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
248 +# lightsd is distributed in the hope that it will be useful,
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
249 +# but WITHOUT ANY WARRANTY; without even the implied warranty of
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
250 +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
251 +# GNU General Public License for more details.
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
252 +#
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
253 +# You should have received a copy of the GNU General Public License
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
254 +# along with lightsd. If not, see <http://www.gnu.org/licenses/>.
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
255 +
501
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
256 +from ...osc import MonomeLedLevel
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
257 +from ..types import Dimensions, Position
500
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
258 +
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
259 +
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
260 +class LedSprite:
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
261 +
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
262 + def __init__(
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
263 + self,
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
264 + size: Dimensions,
501
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
265 + level: MonomeLedLevel = MonomeLedLevel.OFF
500
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
266 + ) -> None:
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
267 + self.size = size
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
268 + self._levels = [level] * size.width * size.height
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
269 +
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
270 + def _index(self, offset: Position):
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
271 + return self.size.height * offset.y + self.size.width * offset.x
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
272 +
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
273 + def set(self, offset: Position, level: MonomeLedLevel):
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
274 + self._levels[self._index(offset)] = level
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
275 +
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
276 + def get(self, offset: Position):
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
277 + return self._levels[self._index(offset)]
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
278 +
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
279 + def __iter__(self):
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
280 + for off_x in range(self.size.width):
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
281 + for off_y in range(self.size.height):
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
282 + yield off_x, off_y, self.get(Position(x=off_x, y=off_y))
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
283 +
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
284 +
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
285 +class UIComponentInsertionError(Exception):
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
286 + pass
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
287 +
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
288 +
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
289 +class UIComponentBase:
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
290 +
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
291 + def __init__(self, name: str, size: Dimensions, offset: Position) -> None:
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
292 + self.name = name
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
293 + self.size = size
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
294 + self.offset = offset
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
295 + self._nw_corner = offset
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
296 + self._se_corner = Position(
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
297 + x=self.offset.x + self.size.width,
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
298 + y=self.offset.y + self.size.height
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
299 + )
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
300 + self.children = set()
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
301 +
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
302 + def __repr__(self):
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
303 + return "<{}({}, size=({!r}), offset=({!r})>".format(
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
304 + self.__class__.__name__, self.name, self.size, self.offset
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
305 + )
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
306 +
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
307 + def insert(self, new: "UIComponentBase") -> None:
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
308 + if new in self.children:
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
309 + raise UIComponentInsertionError(
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
310 + "{!r} is already part of {!r}".format(new, self)
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
311 + )
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
312 + if not new.within(self):
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
313 + raise UIComponentInsertionError(
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
314 + "{!r} doesn't fit into {!r}".format(new, self)
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
315 + )
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
316 + for child in self.children:
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
317 + if child.collides(new):
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
318 + raise UIComponentInsertionError(
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
319 + "{!r} conflicts with {!r}".format(new, child)
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
320 + )
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
321 + self.children.add(new)
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
322 +
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
323 + def collides(self, other: "UIComponentBase") -> bool:
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
324 + """Return True if ``self`` and ``other`` overlap in any way."""
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
325 +
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
326 + return all(
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
327 + self._nw_corner.x <= other._se_corner.x,
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
328 + self._se_corner.x >= other._nw_corner.x,
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
329 + self._nw_corner.y <= other._se_corner.y,
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
330 + self._se_corner.y >= other._nw_corner.y,
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
331 + )
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
332 +
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
333 + def within(self, other: "UIComponentBase") -> bool:
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
334 + """Return True if ``self`` fits within ``other``."""
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
335 +
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
336 + return all(
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
337 + other._nw_corner.x >= self._nw_corner.x,
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
338 + other._nw_corner.y >= self._nw_corner.y,
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
339 + other._se_corner.x <= self._se_corner.x,
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
340 + other._se_corner.y <= self._se_corner.y
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
341 + )
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
342 +
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
343 + def to_sprite(self) -> LedSprite:
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
344 + return LedSprite(self.size)
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
345 +
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
346 + # maybe that bool return type could become an enum or a composite:
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
347 + def submit_input(self, offset: Position) -> bool:
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
348 + return False
501
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
349 diff --git a/apps/monolight/monolight/ui/components/button.py b/apps/monolight/monolight/ui/components/button.py
500
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
350 new file mode 100644
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
351 --- /dev/null
501
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
352 +++ b/apps/monolight/monolight/ui/components/button.py
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
353 @@ -0,0 +1,49 @@
500
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
354 +# Copyright (c) 2016, Louis Opter <louis@opter.org>
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
355 +#
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
356 +# This file is part of lightsd.
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
357 +#
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
358 +# lightsd is free software: you can redistribute it and/or modify
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
359 +# it under the terms of the GNU General Public License as published by
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
360 +# the Free Software Foundation, either version 3 of the License, or
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
361 +# (at your option) any later version.
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
362 +#
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
363 +# lightsd is distributed in the hope that it will be useful,
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
364 +# but WITHOUT ANY WARRANTY; without even the implied warranty of
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
365 +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
366 +# GNU General Public License for more details.
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
367 +#
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
368 +# You should have received a copy of the GNU General Public License
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
369 +# along with lightsd. If not, see <http://www.gnu.org/licenses/>.
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
370 +
501
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
371 +from .base import LedSprite, UIComponentBase
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
372 +from ...osc import MONOME_LED_OFF, MONOME_LED_ON
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
373 +from ..types import Dimensions, Position
500
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
374 +
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
375 +
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
376 +class Button(UIComponentBase):
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
377 +
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
378 + OFF = 0
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
379 + ON = 1
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
380 +
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
381 + # make the size configurable too?
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
382 + def __init__(self, offset: Position, state: int) -> None:
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
383 + self.offset = offset
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
384 + self.state = Button.ON
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
385 + self.children = None
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
386 +
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
387 + def toggle(self) -> bool: # previous state
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
388 + rv = self.state
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
389 + self.state = not self.state
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
390 + return bool(rv)
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
391 +
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
392 + def to_sprite(self):
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
393 + return LedSprite(
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
394 + Dimensions(1, 1),
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
395 + MONOME_LED_ON if self.state is Button.ON else MONOME_LED_OFF,
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
396 + )
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
397 +
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
398 + def submit_input(self, offset: Position) -> bool:
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
399 + if self.offset == offset:
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
400 + self.toggle()
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
401 + return True
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
402 + return False
501
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
403 diff --git a/apps/monolight/monolight/ui/components/layer.py b/apps/monolight/monolight/ui/components/layer.py
500
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
404 new file mode 100644
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
405 --- /dev/null
501
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
406 +++ b/apps/monolight/monolight/ui/components/layer.py
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
407 @@ -0,0 +1,41 @@
498
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
408 +# Copyright (c) 2016, Louis Opter <louis@opter.org>
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
409 +#
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
410 +# This file is part of lightsd.
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
411 +#
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
412 +# lightsd is free software: you can redistribute it and/or modify
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
413 +# it under the terms of the GNU General Public License as published by
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
414 +# the Free Software Foundation, either version 3 of the License, or
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
415 +# (at your option) any later version.
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
416 +#
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
417 +# lightsd is distributed in the hope that it will be useful,
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
418 +# but WITHOUT ANY WARRANTY; without even the implied warranty of
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
419 +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
420 +# GNU General Public License for more details.
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
421 +#
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
422 +# You should have received a copy of the GNU General Public License
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
423 +# along with lightsd. If not, see <http://www.gnu.org/licenses/>.
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
424 +
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
425 +import monome
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
426 +
501
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
427 +from .base import UIComponentBase
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
428 +from ...osc import MONOME_LED_OFF
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
429 +from ..types import Dimensions
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
430 +from ...types import TimeMonotonic
500
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
431 +
498
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
432 +
501
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
433 +class Layer(UIComponentBase):
498
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
434 +
501
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
435 + def __init_(self, size: Dimensions):
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
436 + self.size = size
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
437 + self.led_buffer = monome.LedBuffer(width=size.width, height=size.height)
498
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
438 +
501
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
439 + def _blit(self, component: UIComponentBase):
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
440 + for off_x, off_y, level in component.to_sprite():
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
441 + self.led_buffer.led_set(
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
442 + component.offset.x + off_x, component.offset.y + off_y, level
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
443 + )
498
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
444 +
501
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
445 + def render(self, frame_ts: TimeMonotonic) -> None:
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
446 + self.led_buffer.led_level_all(MONOME_LED_OFF)
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
447 + for component in self.children:
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
448 + self._blit(component)
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
449 diff --git a/apps/monolight/monolight/ui/grid.py b/apps/monolight/monolight/ui/grid.py
500
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
450 new file mode 100644
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
451 --- /dev/null
501
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
452 +++ b/apps/monolight/monolight/ui/grid.py
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
453 @@ -0,0 +1,37 @@
500
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
454 +# Copyright (c) 2016, Louis Opter <louis@opter.org>
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
455 +#
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
456 +# This file is part of lightsd.
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
457 +#
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
458 +# lightsd is free software: you can redistribute it and/or modify
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
459 +# it under the terms of the GNU General Public License as published by
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
460 +# the Free Software Foundation, either version 3 of the License, or
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
461 +# (at your option) any later version.
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
462 +#
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
463 +# lightsd is distributed in the hope that it will be useful,
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
464 +# but WITHOUT ANY WARRANTY; without even the implied warranty of
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
465 +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
466 +# GNU General Public License for more details.
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
467 +#
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
468 +# You should have received a copy of the GNU General Public License
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
469 +# along with lightsd. If not, see <http://www.gnu.org/licenses/>.
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
470 +
501
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
471 +from .. import osc
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
472 +from .components.layer import Layer
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
473 +from .types import Dimensions, Keypress, Position
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
474 +
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
475 +
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
476 +class MonomeGrid:
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
477 +
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
478 + def __init__(self) -> None:
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
479 + self.size = None # type: Dimensions
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
480 + self.layers = None # z-order, type: List[Layer]
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
481 + self.monome = None # type: osc.MonomeApplication
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
482 +
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
483 + def set_monome(self, grid: osc.MonomeApplication) -> None:
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
484 + self.size = Dimensions(height=grid.height, width=grid.width)
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
485 + self.layers = [Layer(self.size)]
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
486 + self.grid = grid
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
487 +
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
488 + def submit_input(self, x: int, y: int, s: int) -> None:
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
489 + if self.layers:
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
490 + self.layers[-1].submit_input(Keypress(Position(x, y), s))
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
491 diff --git a/apps/monolight/monolight/ui/types.py b/apps/monolight/monolight/ui/types.py
496
08ad69e0a7a7 get things working in a good shape
Louis Opter <kalessin@kalessin.fr>
parents: 495
diff changeset
492 new file mode 100644
08ad69e0a7a7 get things working in a good shape
Louis Opter <kalessin@kalessin.fr>
parents: 495
diff changeset
493 --- /dev/null
501
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
494 +++ b/apps/monolight/monolight/ui/types.py
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
495 @@ -0,0 +1,57 @@
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
496 +# Copyright (c) 2016, Louis Opter <louis@opter.org>
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
497 +#
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
498 +# This file is part of lightsd.
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
499 +#
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
500 +# lightsd is free software: you can redistribute it and/or modify
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
501 +# it under the terms of the GNU General Public License as published by
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
502 +# the Free Software Foundation, either version 3 of the License, or
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
503 +# (at your option) any later version.
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
504 +#
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
505 +# lightsd is distributed in the hope that it will be useful,
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
506 +# but WITHOUT ANY WARRANTY; without even the implied warranty of
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
507 +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
508 +# GNU General Public License for more details.
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
509 +#
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
510 +# You should have received a copy of the GNU General Public License
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
511 +# along with lightsd. If not, see <http://www.gnu.org/licenses/>.
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
512 +
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
513 +from typing import NamedTuple
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
514 +
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
515 +from .. import osc
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
516 +
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
517 +_Dimensions = NamedTuple("Dimensions", [("height", int), ("width", int)])
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
518 +_Position = NamedTuple("Position", [("x", int), ("y", int)])
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
519 +
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
520 +
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
521 +class Dimensions(_Dimensions):
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
522 +
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
523 + def __repr__(self) -> str:
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
524 + return "height={}, width={}".format(*self)
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
525 +
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
526 +
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
527 +class Position(_Position):
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
528 +
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
529 + def __repr__(self) -> str:
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
530 + return "{}, {}".format(*self)
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
531 +
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
532 +_Keypress = NamedTuple("KeyPress", [
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
533 + ("position", Position), ("state", osc.MonomeKeyState)
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
534 +])
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
535 +
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
536 +
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
537 +class Keypress(_Keypress):
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
538 +
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
539 + @property
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
540 + def x(self):
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
541 + return self.position.x
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
542 +
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
543 + @property
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
544 + def y(self):
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
545 + return self.position.y
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
546 +
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
547 + @property
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
548 + def s(self):
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
549 + return self.state.value
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
550 +
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
551 + def __repr__(self) -> str:
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
552 + return "{!r}, {}".format(self.position, self.state.name)
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
553 diff --git a/apps/monolight/monolight/ui/ui.py b/apps/monolight/monolight/ui/ui.py
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
554 new file mode 100644
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
555 --- /dev/null
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
556 +++ b/apps/monolight/monolight/ui/ui.py
500
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
557 @@ -0,0 +1,124 @@
498
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
558 +# Copyright (c) 2016, Louis Opter <louis@opter.org>
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
559 +#
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
560 +# This file is part of lightsd.
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
561 +#
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
562 +# lightsd is free software: you can redistribute it and/or modify
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
563 +# it under the terms of the GNU General Public License as published by
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
564 +# the Free Software Foundation, either version 3 of the License, or
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
565 +# (at your option) any later version.
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
566 +#
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
567 +# lightsd is distributed in the hope that it will be useful,
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
568 +# but WITHOUT ANY WARRANTY; without even the implied warranty of
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
569 +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
570 +# GNU General Public License for more details.
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
571 +#
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
572 +# You should have received a copy of the GNU General Public License
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
573 +# along with lightsd. If not, see <http://www.gnu.org/licenses/>.
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
574 +
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
575 +import asyncio
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
576 +import monome
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
577 +import logging
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
578 +
500
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
579 +from typing import (
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
580 + NamedTuple,
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
581 +)
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
582 +
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
583 +from lightsc import LightsClient
499
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
584 +from lightsc.requests import (
498
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
585 + SetLightFromHSBK,
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
586 + PowerOff,
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
587 + PowerOn,
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
588 + PowerToggle,
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
589 +)
501
c38b0b9612cd broken wip
Louis Opter <kalessin@kalessin.fr>
parents: 500
diff changeset
590 +from ..osc import (
499
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
591 + MONOME_KEYPRESS_DOWN,
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
592 + monome_apply,
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
593 +)
500
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
594 +
498
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
595 +logger = logging.getLogger("monolight.ui")
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
596 +
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
597 +_event_queue = None
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
598 +
500
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
599 +_KeyPress = NamedTuple("_KeyPress", [("x", int), ("y", int), ("state", int)])
498
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
600 +
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
601 +_STOP_SENTINEL = object()
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
602 +
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
603 +
500
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
604 +def draw(serialosc: monome.SerialOsc):
498
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
605 + buf = monome.LedBuffer(8, 8)
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
606 + buf.led_set(0, 0, 1)
500
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
607 + for x in range(0, 6):
498
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
608 + buf.led_set(x, 7, 1)
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
609 + monome_apply(serialosc, buf.render)
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
610 +
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
611 +
500
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
612 +def hide(serialosc: monome.SerialOsc):
498
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
613 + monome_apply(serialosc, monome.Monome.led_all, 0)
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
614 +
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
615 +
500
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
616 +async def start(
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
617 + loop: asyncio.AbstractEventLoop,
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
618 + lightsd: LightsClient,
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
619 + serialosc: monome.SerialOsc,
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
620 +):
498
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
621 + global _event_queue
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
622 +
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
623 + _event_queue = asyncio.Queue()
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
624 +
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
625 + hidden = True
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
626 +
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
627 + while True:
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
628 + keypress = await _event_queue.get()
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
629 + if keypress is _STOP_SENTINEL:
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
630 + hide(serialosc)
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
631 + _event_queue = None
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
632 + return
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
633 +
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
634 + if not hidden:
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
635 + draw(serialosc)
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
636 +
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
637 + logger.info("keypress: x={}, y={}, state={}".format(*keypress))
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
638 +
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
639 + if keypress.state != MONOME_KEYPRESS_DOWN:
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
640 + continue
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
641 + if keypress.y != 7 and keypress.y != 0:
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
642 + continue
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
643 + if keypress.x == 0:
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
644 + if keypress.y == 0:
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
645 + hidden = not hidden
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
646 + if hidden:
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
647 + hide(serialosc)
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
648 + continue
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
649 + await lightsd.apply(PowerOff(["*"]))
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
650 + if keypress.y != 7:
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
651 + continue
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
652 + if keypress.x == 1:
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
653 + await lightsd.apply(PowerOn(["*"]))
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
654 + elif keypress.x == 2:
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
655 + await lightsd.apply(PowerToggle(["neko"]))
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
656 + elif keypress.x == 3:
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
657 + await lightsd.apply(PowerToggle(["fugu"]))
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
658 + elif keypress.x == 4:
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
659 + async with lightsd.batch() as batch:
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
660 + batch.apply(SetLightFromHSBK(
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
661 + ["#tower"], 37.469443, 1.0, 0.25, 3500, 600
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
662 + ))
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
663 + batch.apply(SetLightFromHSBK(
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
664 + ["fugu", "buzz"], 47.469443, 0.2, 0.2, 3500, 600
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
665 + ))
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
666 + batch.apply(SetLightFromHSBK(
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
667 + ["candle"], 47.469443, 0.2, 0.15, 3500, 600
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
668 + ))
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
669 + batch.apply(PowerOn(["#br"]))
500
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
670 + elif keypress.x == 5:
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
671 + pass
498
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
672 +
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
673 +
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
674 +def stop():
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
675 + if _event_queue is not None:
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
676 + _event_queue.put_nowait(_STOP_SENTINEL)
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
677 +
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
678 +
500
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
679 +def submit_keypress(x: int, y: int, state: int):
498
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
680 + if _event_queue is not None:
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
681 + _event_queue.put_nowait(_KeyPress(x, y, state))
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
682 diff --git a/apps/monolight/setup.py b/apps/monolight/setup.py
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
683 new file mode 100644
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
684 --- /dev/null
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
685 +++ b/apps/monolight/setup.py
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
686 @@ -0,0 +1,52 @@
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
687 +# Copyright (c) 2016, Louis Opter <louis@opter.org>
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
688 +#
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
689 +# This file is part of lighstd.
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
690 +#
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
691 +# lighstd is free software: you can redistribute it and/or modify
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
692 +# it under the terms of the GNU General Public License as published by
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
693 +# the Free Software Foundation, either version 3 of the License, or
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
694 +# (at your option) any later version.
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
695 +#
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
696 +# lighstd is distributed in the hope that it will be useful,
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
697 +# but WITHOUT ANY WARRANTY; without even the implied warranty of
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
698 +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
699 +# GNU General Public License for more details.
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
700 +#
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
701 +# You should have received a copy of the GNU General Public License
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
702 +# along with lighstd. If not, see <http://www.gnu.org/licenses/>.
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
703 +
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
704 +import setuptools
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
705 +
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
706 +version = "0.0.1.dev0"
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
707 +
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
708 +setuptools.setup(
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
709 + name="monolight",
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
710 + version=version,
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
711 + description="A Monome UI to control smart bulbs using lightsd",
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
712 + author="Louis Opter",
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
713 + author_email="louis@opter.org",
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
714 + packages=setuptools.find_packages(exclude=['tests', 'tests.*']),
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
715 + include_package_data=True,
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
716 + entry_points={
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
717 + "console_scripts": [
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
718 + "monolight = monolight.cli:main",
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
719 + ],
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
720 + },
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
721 + install_requires=[
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
722 + "click~=6.6",
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
723 + "pymonome~=0.8.2",
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
724 + ],
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
725 + tests_require=[
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
726 + "doubles~=1.1.3",
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
727 + "freezegun~=0.3.5",
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
728 + "pytest~=3.0",
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
729 + ],
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
730 + extras_require={
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
731 + "dev": [
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
732 + "flake8",
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
733 + "ipython",
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
734 + "pdbpp",
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
735 + "pep8",
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
736 + ],
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
737 + },
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
738 +)
499
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
739 diff --git a/clients/python/lightsc/README.rst b/clients/python/lightsc/README.rst
498
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
740 new file mode 100644
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
741 --- /dev/null
499
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
742 +++ b/clients/python/lightsc/README.rst
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
743 @@ -0,0 +1,63 @@
498
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
744 +A Python client to control your smart bulbs through lightsd
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
745 +===========================================================
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
746 +
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
747 +lightsd_ is a daemon (background service) to control your LIFX_ WiFi "smart"
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
748 +bulbs. This package allows you to make RPC calls to lightsd to control your
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
749 +light bulbs from Python. It is built on top of the ``asyncio`` module and
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
750 +requires Python ≥ 3.5:
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
751 +
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
752 +.. code-block:: python
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
753 +
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
754 + import asyncio
499
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
755 + import click
498
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
756 +
499
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
757 + from lightsc import LightsView, create_async_lightsd_connection
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
758 + from lightsc.requests import (
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
759 + GetLightState,
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
760 + PowerOff,
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
761 + PowerOn,
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
762 + SetLightFromHSBK,
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
763 + )
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
764 +
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
765 + async def example(url, targets):
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
766 + async with create_async_lightsd_connection(url) as client:
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
767 + click.echo("Connected to lightsd running at {}".format(client.url))
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
768 +
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
769 + view = LightsView()
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
770 + view.update(await client.apply(GetLightState(targets))
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
771 + click.echo("Discovered bulbs: {}".format(view))
498
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
772 +
499
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
773 + transition_ms = 600
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
774 + red_hsbk = (0., 1., 1., 3500)
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
775 + click.echo("Turning all bulbs to red in {}ms...".format(transition_ms))
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
776 + async with client.batch() as batch:
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
777 + batch.apply(PowerOn(targets))
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
778 + batch.apply(SetLightFromHSBK(targets, *red_hsbk, transition_ms=transition_ms))
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
779 +
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
780 + click.echo("Restoring original state")
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
781 + async with client.batch() as batch:
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
782 + for b in view.bulbs:
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
783 + PowerState = PowerOn if b.power else PowerOff
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
784 + hsbk = (b.h, b.s, b.b, b.k)
498
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
785 +
499
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
786 + batch.apply(PowerState([b.label]))
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
787 + batch.apply(SetLightFromHSBK([b.label], *hsbk, transition_ms=transition_ms))
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
788 +
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
789 + @click.command()
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
790 + @click.option("--lightsd-url", help="supported schemes: tcp+jsonrpc://, unix+jsonrpc://")
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
791 + @click.argument("bulb_targets", nargs=-1, required=True)
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
792 + def main(lightsd_url, bulb_targets)
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
793 + """This example will turn all your bulbs to red before restoring their
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
794 + original state.
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
795 +
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
796 + If an URL is not provided this script will attempt to connect to
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
797 + lightsd's UNIX socket.
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
798 + """
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
799 +
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
800 + evl = asyncio.get_event_loop()
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
801 + evl.run_until_complete(evl.create_task(example(lightsd_url, bulb_targets)))
498
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
802 +
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
803 +.. _lightsd: https://www.lightsd.io/
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
804 +.. _LIFX: http://lifx.co/
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
805 +
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
806 +.. vim: set tw=80 spelllang=en spell:
499
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
807 diff --git a/clients/python/lightsc/lightsc/__init__.py b/clients/python/lightsc/lightsc/__init__.py
498
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
808 new file mode 100644
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
809 --- /dev/null
499
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
810 +++ b/clients/python/lightsc/lightsc/__init__.py
500
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
811 @@ -0,0 +1,25 @@
496
08ad69e0a7a7 get things working in a good shape
Louis Opter <kalessin@kalessin.fr>
parents: 495
diff changeset
812 +# Copyright (c) 2016, Louis Opter <louis@opter.org>
08ad69e0a7a7 get things working in a good shape
Louis Opter <kalessin@kalessin.fr>
parents: 495
diff changeset
813 +#
08ad69e0a7a7 get things working in a good shape
Louis Opter <kalessin@kalessin.fr>
parents: 495
diff changeset
814 +# This file is part of lightsd.
08ad69e0a7a7 get things working in a good shape
Louis Opter <kalessin@kalessin.fr>
parents: 495
diff changeset
815 +#
08ad69e0a7a7 get things working in a good shape
Louis Opter <kalessin@kalessin.fr>
parents: 495
diff changeset
816 +# lightsd is free software: you can redistribute it and/or modify
08ad69e0a7a7 get things working in a good shape
Louis Opter <kalessin@kalessin.fr>
parents: 495
diff changeset
817 +# it under the terms of the GNU General Public License as published by
08ad69e0a7a7 get things working in a good shape
Louis Opter <kalessin@kalessin.fr>
parents: 495
diff changeset
818 +# the Free Software Foundation, either version 3 of the License, or
08ad69e0a7a7 get things working in a good shape
Louis Opter <kalessin@kalessin.fr>
parents: 495
diff changeset
819 +# (at your option) any later version.
08ad69e0a7a7 get things working in a good shape
Louis Opter <kalessin@kalessin.fr>
parents: 495
diff changeset
820 +#
08ad69e0a7a7 get things working in a good shape
Louis Opter <kalessin@kalessin.fr>
parents: 495
diff changeset
821 +# lightsd is distributed in the hope that it will be useful,
08ad69e0a7a7 get things working in a good shape
Louis Opter <kalessin@kalessin.fr>
parents: 495
diff changeset
822 +# but WITHOUT ANY WARRANTY; without even the implied warranty of
08ad69e0a7a7 get things working in a good shape
Louis Opter <kalessin@kalessin.fr>
parents: 495
diff changeset
823 +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
08ad69e0a7a7 get things working in a good shape
Louis Opter <kalessin@kalessin.fr>
parents: 495
diff changeset
824 +# GNU General Public License for more details.
08ad69e0a7a7 get things working in a good shape
Louis Opter <kalessin@kalessin.fr>
parents: 495
diff changeset
825 +#
08ad69e0a7a7 get things working in a good shape
Louis Opter <kalessin@kalessin.fr>
parents: 495
diff changeset
826 +# You should have received a copy of the GNU General Public License
08ad69e0a7a7 get things working in a good shape
Louis Opter <kalessin@kalessin.fr>
parents: 495
diff changeset
827 +# along with lightsd. If not, see <http://www.gnu.org/licenses/>.
493
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
828 +
498
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
829 +from .client import ( # noqa
500
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
830 + LightsClient,
496
08ad69e0a7a7 get things working in a good shape
Louis Opter <kalessin@kalessin.fr>
parents: 495
diff changeset
831 + create_lightsd_connection,
499
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
832 + create_async_lightsd_connection,
496
08ad69e0a7a7 get things working in a good shape
Louis Opter <kalessin@kalessin.fr>
parents: 495
diff changeset
833 +)
499
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
834 +from .view import ( # noqa
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
835 + LightsView,
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
836 +)
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
837 diff --git a/clients/python/lightsc/lightsc/client.py b/clients/python/lightsc/lightsc/client.py
491
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
838 new file mode 100644
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
839 --- /dev/null
499
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
840 +++ b/clients/python/lightsc/lightsc/client.py
500
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
841 @@ -0,0 +1,326 @@
491
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
842 +# Copyright (c) 2016, Louis Opter <louis@opter.org>
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
843 +#
493
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
844 +# This file is part of lightsd.
491
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
845 +#
493
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
846 +# lightsd is free software: you can redistribute it and/or modify
491
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
847 +# it under the terms of the GNU General Public License as published by
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
848 +# the Free Software Foundation, either version 3 of the License, or
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
849 +# (at your option) any later version.
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
850 +#
493
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
851 +# lightsd is distributed in the hope that it will be useful,
491
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
852 +# but WITHOUT ANY WARRANTY; without even the implied warranty of
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
853 +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
854 +# GNU General Public License for more details.
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
855 +#
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
856 +# You should have received a copy of the GNU General Public License
493
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
857 +# along with lightsd. If not, see <http://www.gnu.org/licenses/>.
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
858 +
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
859 +import asyncio
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
860 +import functools
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
861 +import json
499
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
862 +import locale
493
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
863 +import logging
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
864 +import os
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
865 +import urllib
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
866 +import uuid
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
867 +
499
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
868 +from typing import (
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
869 + Any,
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
870 + Callable,
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
871 + Dict,
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
872 + List,
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
873 + NamedTuple,
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
874 + Sequence,
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
875 +)
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
876 +from typing import ( # noqa
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
877 + Tuple,
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
878 + Type,
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
879 +)
496
08ad69e0a7a7 get things working in a good shape
Louis Opter <kalessin@kalessin.fr>
parents: 495
diff changeset
880 +
499
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
881 +from . import (
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
882 + exceptions,
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
883 + requests,
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
884 + responses,
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
885 + structs,
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
886 +)
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
887 +
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
888 +logger = logging.getLogger("lightsd.client")
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
889 +
493
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
890 +
499
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
891 +_JSONRPCMethod = NamedTuple("_JSONRPCMethod", [
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
892 + ("name", str),
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
893 + ("map_result", Callable[[Any], responses.Response]),
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
894 +])
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
895 +_JSONRPC_API = {
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
896 + requests.GetLightState: _JSONRPCMethod(
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
897 + name="get_light_state",
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
898 + map_result=lambda result: responses.LightsState([
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
899 + structs.LightBulb(
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
900 + b["label"], b["power"], *b["hsbk"], tags=b["tags"]
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
901 + ) for b in result
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
902 + ])
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
903 + ),
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
904 + requests.SetLightFromHSBK: _JSONRPCMethod(
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
905 + name="set_light_from_hsbk",
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
906 + map_result=lambda result: responses.Bool(result)
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
907 + ),
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
908 + requests.PowerOn: _JSONRPCMethod(
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
909 + name="power_on",
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
910 + map_result=lambda result: responses.Bool(result)
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
911 + ),
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
912 + requests.PowerOff: _JSONRPCMethod(
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
913 + name="power_off",
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
914 + map_result=lambda result: responses.Bool(result)
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
915 + ),
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
916 + requests.PowerToggle: _JSONRPCMethod(
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
917 + name="power_toggle",
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
918 + map_result=lambda result: responses.Bool(result)
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
919 + ),
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
920 +} # type: Dict[Type[requests.RequestClass], _JSONRPCMethod]
493
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
921 +
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
922 +
495
e3a86bd3a01a i don't think this works
Louis Opter <kalessin@kalessin.fr>
parents: 494
diff changeset
923 +class _JSONRPCCall:
e3a86bd3a01a i don't think this works
Louis Opter <kalessin@kalessin.fr>
parents: 494
diff changeset
924 +
499
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
925 + def __init__(
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
926 + self, method: str, params: Sequence[Any], timeout: int = None
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
927 + ) -> None:
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
928 + self.id = str(uuid.uuid4())
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
929 + self.method = method
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
930 + self.params = params
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
931 + self.timeout = timeout
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
932 + self.timeout_handle = None # type: asyncio.Handle
495
e3a86bd3a01a i don't think this works
Louis Opter <kalessin@kalessin.fr>
parents: 494
diff changeset
933 + self.request = {
499
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
934 + "id": self.id,
495
e3a86bd3a01a i don't think this works
Louis Opter <kalessin@kalessin.fr>
parents: 494
diff changeset
935 + "jsonrpc": "2.0",
e3a86bd3a01a i don't think this works
Louis Opter <kalessin@kalessin.fr>
parents: 494
diff changeset
936 + "method": method,
e3a86bd3a01a i don't think this works
Louis Opter <kalessin@kalessin.fr>
parents: 494
diff changeset
937 + "params": params,
e3a86bd3a01a i don't think this works
Louis Opter <kalessin@kalessin.fr>
parents: 494
diff changeset
938 + }
499
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
939 + self.response = asyncio.Future() # type: asyncio.futures.Future
495
e3a86bd3a01a i don't think this works
Louis Opter <kalessin@kalessin.fr>
parents: 494
diff changeset
940 +
e3a86bd3a01a i don't think this works
Louis Opter <kalessin@kalessin.fr>
parents: 494
diff changeset
941 +
499
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
942 +class AsyncJSONRPCLightsClient:
493
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
943 +
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
944 + READ_SIZE = 8192
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
945 + TIMEOUT = 2 # seconds
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
946 + ENCODING = "utf-8"
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
947 +
499
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
948 + def __init__(
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
949 + self,
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
950 + url: str,
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
951 + encoding: str = ENCODING,
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
952 + timeout: int = TIMEOUT,
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
953 + read_size: int = READ_SIZE,
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
954 + loop: asyncio.AbstractEventLoop = None
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
955 + ) -> None:
493
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
956 + self.url = url
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
957 + self.encoding = encoding
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
958 + self.timeout = timeout
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
959 + self.read_size = read_size
499
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
960 + self._listen_task = None # type: asyncio.Task
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
961 + self._pending_calls = {} # type: Dict[str, _JSONRPCCall]
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
962 + self._reader = None # type: asyncio.StreamReader
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
963 + self._writer = None # type: asyncio.StreamWriter
493
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
964 + self._loop = loop or asyncio.get_event_loop()
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
965 +
499
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
966 + def _handle_response(
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
967 + self, id: str, response: Any, timeout: bool = False
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
968 + ) -> None:
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
969 + call = self._pending_calls.pop(id)
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
970 + if timeout is True:
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
971 + call.response.set_exception(exceptions.LightsClientTimeoutError())
496
08ad69e0a7a7 get things working in a good shape
Louis Opter <kalessin@kalessin.fr>
parents: 495
diff changeset
972 + return
499
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
973 + call.timeout_handle.cancel()
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
974 + call.response.set_result(response)
496
08ad69e0a7a7 get things working in a good shape
Louis Opter <kalessin@kalessin.fr>
parents: 495
diff changeset
975 +
499
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
976 + async def _jsonrpc_execute(
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
977 + self, pipeline: List[_JSONRPCCall]
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
978 + ) -> Dict[str, Any]:
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
979 + if not pipeline:
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
980 + return {}
496
08ad69e0a7a7 get things working in a good shape
Louis Opter <kalessin@kalessin.fr>
parents: 495
diff changeset
981 +
499
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
982 + requests = [call.request for call in pipeline]
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
983 + for req in requests:
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
984 + logger.info("Request {id}: {method}({params})".format(**req))
496
08ad69e0a7a7 get things working in a good shape
Louis Opter <kalessin@kalessin.fr>
parents: 495
diff changeset
985 +
499
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
986 + payload = json.dumps(requests[0] if len(requests) == 1 else requests)
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
987 + self._writer.write(payload.encode(self.encoding, "surrogateescape"))
496
08ad69e0a7a7 get things working in a good shape
Louis Opter <kalessin@kalessin.fr>
parents: 495
diff changeset
988 +
08ad69e0a7a7 get things working in a good shape
Louis Opter <kalessin@kalessin.fr>
parents: 495
diff changeset
989 + await self._writer.drain()
08ad69e0a7a7 get things working in a good shape
Louis Opter <kalessin@kalessin.fr>
parents: 495
diff changeset
990 +
08ad69e0a7a7 get things working in a good shape
Louis Opter <kalessin@kalessin.fr>
parents: 495
diff changeset
991 + for call in pipeline:
499
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
992 + call.timeout_handle = self._loop.call_later(
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
993 + call.timeout,
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
994 + functools.partial(
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
995 + self._handle_response, call.id, response=None, timeout=True
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
996 + )
496
08ad69e0a7a7 get things working in a good shape
Louis Opter <kalessin@kalessin.fr>
parents: 495
diff changeset
997 + )
499
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
998 + self._pending_calls[call.id] = call
496
08ad69e0a7a7 get things working in a good shape
Louis Opter <kalessin@kalessin.fr>
parents: 495
diff changeset
999 +
499
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1000 + futures = [call.response for call in pipeline]
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1001 + await asyncio.wait(futures, loop=self._loop)
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1002 + return {call.id: call.response.result() for call in pipeline}
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1003 +
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1004 + async def close(self) -> None:
496
08ad69e0a7a7 get things working in a good shape
Louis Opter <kalessin@kalessin.fr>
parents: 495
diff changeset
1005 + if self._listen_task is not None:
08ad69e0a7a7 get things working in a good shape
Louis Opter <kalessin@kalessin.fr>
parents: 495
diff changeset
1006 + self._listen_task.cancel()
499
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1007 + self._listen_task = None
496
08ad69e0a7a7 get things working in a good shape
Louis Opter <kalessin@kalessin.fr>
parents: 495
diff changeset
1008 +
08ad69e0a7a7 get things working in a good shape
Louis Opter <kalessin@kalessin.fr>
parents: 495
diff changeset
1009 + if self._writer is not None:
08ad69e0a7a7 get things working in a good shape
Louis Opter <kalessin@kalessin.fr>
parents: 495
diff changeset
1010 + if self._writer.can_write_eof():
08ad69e0a7a7 get things working in a good shape
Louis Opter <kalessin@kalessin.fr>
parents: 495
diff changeset
1011 + self._writer.write_eof()
08ad69e0a7a7 get things working in a good shape
Louis Opter <kalessin@kalessin.fr>
parents: 495
diff changeset
1012 + self._writer.close()
08ad69e0a7a7 get things working in a good shape
Louis Opter <kalessin@kalessin.fr>
parents: 495
diff changeset
1013 + if self._reader is not None:
08ad69e0a7a7 get things working in a good shape
Louis Opter <kalessin@kalessin.fr>
parents: 495
diff changeset
1014 + self._reader.feed_eof()
08ad69e0a7a7 get things working in a good shape
Louis Opter <kalessin@kalessin.fr>
parents: 495
diff changeset
1015 + if not self._reader.at_eof():
08ad69e0a7a7 get things working in a good shape
Louis Opter <kalessin@kalessin.fr>
parents: 495
diff changeset
1016 + await self._reader.read()
08ad69e0a7a7 get things working in a good shape
Louis Opter <kalessin@kalessin.fr>
parents: 495
diff changeset
1017 + self._reader = self._writer = None
08ad69e0a7a7 get things working in a good shape
Louis Opter <kalessin@kalessin.fr>
parents: 495
diff changeset
1018 +
499
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1019 + self._pending_calls = {}
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1020 +
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1021 + async def _reconnect(self) -> None:
496
08ad69e0a7a7 get things working in a good shape
Louis Opter <kalessin@kalessin.fr>
parents: 495
diff changeset
1022 + await self.close()
08ad69e0a7a7 get things working in a good shape
Louis Opter <kalessin@kalessin.fr>
parents: 495
diff changeset
1023 + await self.connect()
08ad69e0a7a7 get things working in a good shape
Louis Opter <kalessin@kalessin.fr>
parents: 495
diff changeset
1024 +
499
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1025 + async def apply(self, req: requests.Request, timeout: int = TIMEOUT):
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1026 + method = _JSONRPC_API[req.__class__]
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1027 + call = _JSONRPCCall(method.name, req.params, timeout=timeout)
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1028 + reps_by_id = await self._jsonrpc_execute([call])
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1029 + return method.map_result(reps_by_id[call.id])
496
08ad69e0a7a7 get things working in a good shape
Louis Opter <kalessin@kalessin.fr>
parents: 495
diff changeset
1030 +
499
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1031 + async def connect(self) -> None:
493
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
1032 + parts = urllib.parse.urlparse(self.url)
499
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1033 + if parts.scheme == "unix+jsonrpc":
493
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
1034 + path = os.path.join(parts.netloc, parts.path).rstrip(os.path.sep)
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
1035 + open_connection = functools.partial(
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
1036 + asyncio.open_unix_connection, path
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
1037 + )
499
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1038 + elif parts.scheme == "tcp+jsonrpc":
493
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
1039 + open_connection = functools.partial(
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
1040 + asyncio.open_connection, parts.hostname, parts.port
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
1041 + )
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
1042 + else:
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
1043 + raise ValueError("Unsupported url {}".format(self.url))
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
1044 +
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
1045 + try:
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
1046 + self._reader, self._writer = await asyncio.wait_for(
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
1047 + open_connection(limit=self.read_size, loop=self._loop),
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
1048 + self.timeout,
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
1049 + loop=self._loop,
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
1050 + )
499
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1051 + self._listen_task = self._loop.create_task(self._listen())
493
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
1052 + except Exception:
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
1053 + logger.error("Couldn't open {}".format(self.url))
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
1054 + raise
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
1055 +
499
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1056 + async def _listen(self) -> None:
493
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
1057 + buf = bytearray()
496
08ad69e0a7a7 get things working in a good shape
Louis Opter <kalessin@kalessin.fr>
parents: 495
diff changeset
1058 +
493
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
1059 + while True:
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
1060 + chunk = await self._reader.read(self.READ_SIZE)
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
1061 + if not len(chunk): # EOF, reconnect
496
08ad69e0a7a7 get things working in a good shape
Louis Opter <kalessin@kalessin.fr>
parents: 495
diff changeset
1062 + logger.info("EOF, reconnecting...")
493
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
1063 + await self._reconnect()
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
1064 + return
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
1065 +
496
08ad69e0a7a7 get things working in a good shape
Louis Opter <kalessin@kalessin.fr>
parents: 495
diff changeset
1066 + buf += chunk
493
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
1067 + try:
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
1068 + json.loads(buf.decode(self.encoding, "ignore"))
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
1069 + except Exception:
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
1070 + continue
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
1071 + response = json.loads(buf.decode(self.encoding, "surrogateescape"))
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
1072 + buf = bytearray()
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
1073 +
496
08ad69e0a7a7 get things working in a good shape
Louis Opter <kalessin@kalessin.fr>
parents: 495
diff changeset
1074 + batch = response if isinstance(response, list) else [response]
499
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1075 + for response in batch:
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1076 + id = response["id"]
495
e3a86bd3a01a i don't think this works
Louis Opter <kalessin@kalessin.fr>
parents: 494
diff changeset
1077 +
496
08ad69e0a7a7 get things working in a good shape
Louis Opter <kalessin@kalessin.fr>
parents: 495
diff changeset
1078 + error = response.get("error")
08ad69e0a7a7 get things working in a good shape
Louis Opter <kalessin@kalessin.fr>
parents: 495
diff changeset
1079 + if error is not None:
499
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1080 + code = error.get("code")
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1081 + msg = error.get("msg")
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1082 + logger.warning("Error {}: {} - {}".format(id, code, msg))
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1083 + call = self._pending_calls.pop(id)
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1084 + ex = exceptions.LightsClientError(msg)
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1085 + call.response.set_exception(ex)
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1086 + call.timeout_handle.cancel()
496
08ad69e0a7a7 get things working in a good shape
Louis Opter <kalessin@kalessin.fr>
parents: 495
diff changeset
1087 + continue
493
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
1088 +
499
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1089 + logger.info("Response {}: {}".format(id, response["result"]))
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1090 + self._handle_response(id, response["result"])
493
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
1091 +
499
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1092 + def batch(self) -> "_AsyncJSONRPCBatch":
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1093 + return _AsyncJSONRPCBatch(self)
493
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
1094 +
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
1095 +
500
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
1096 +# LightsClient could eventually point to a different but api-compatible class
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
1097 +# someday:
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
1098 +LightsClient = AsyncJSONRPCLightsClient
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
1099 +
d250169c1a69 wip, completely break monolight again
Louis Opter <kalessin@kalessin.fr>
parents: 499
diff changeset
1100 +
499
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1101 +class _AsyncJSONRPCBatch:
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1102 +
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1103 + def __init__(self, client: AsyncJSONRPCLightsClient) -> None:
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1104 + self.responses = None # type: Tuple[responses.Response, ...]
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1105 + self._client = client
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1106 + self._batch = [] # type: List[_JSONRPCCall]
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1107 +
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1108 + async def __aenter__(self) -> "_AsyncJSONRPCBatch":
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1109 + return self
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1110 +
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1111 + async def __aexit__(self, exc_type, exc_val, exc_tb):
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1112 + if exc_type is None:
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1113 + reps_by_id = await self._client._jsonrpc_execute(self._batch)
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1114 + self.responses = (
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1115 + _JSONRPC_API[req.__class__].map_result(reps_by_id[req.id])
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1116 + for req in self._batch
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1117 + )
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1118 +
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1119 + def apply(
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1120 + self,
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1121 + req: requests.Request,
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1122 + timeout: int = AsyncJSONRPCLightsClient.TIMEOUT
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1123 + ) -> None:
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1124 + method = _JSONRPC_API[req.__class__]
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1125 + call = _JSONRPCCall(method.name, req.params, timeout=timeout)
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1126 + self._batch.append(call)
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1127 +
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1128 +
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1129 +async def get_lightsd_unix_socket_async(
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1130 + loop: asyncio.AbstractEventLoop = None,
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1131 +) -> str:
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1132 + process = await asyncio.create_subprocess_exec(
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1133 + "lightsd", "--rundir",
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1134 + stdout=asyncio.subprocess.PIPE,
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1135 + stderr=asyncio.subprocess.DEVNULL,
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1136 + loop=loop,
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1137 + )
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1138 + stdout, stderr = await process.communicate()
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1139 + stdout = stdout.decode(locale.getpreferredencoding()).strip()
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1140 + if process.returncode == 0 and stdout:
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1141 + lightsdrundir = stdout
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1142 + else:
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1143 + lightsdrundir = "build"
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1144 + logger.warning(
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1145 + "Couldn't infer lightsd's runtime directory, is "
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1146 + "lightsd installed? Trying {}…".format(lightsdrundir)
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1147 + )
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1148 +
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1149 + return "unix+jsonrpc://" + os.path.join(lightsdrundir, "socket")
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1150 +
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1151 +
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1152 +async def create_async_lightsd_connection(
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1153 + url: str = None,
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1154 + loop: asyncio.AbstractEventLoop = None
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1155 +) -> AsyncJSONRPCLightsClient:
493
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
1156 + if loop is None:
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
1157 + loop = asyncio.get_event_loop()
499
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1158 + if url is None:
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1159 + url = await get_lightsd_unix_socket_async(loop)
493
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
1160 +
499
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1161 + c = AsyncJSONRPCLightsClient(url, loop=loop)
494
8f70d5539e5c Organize the code a bit better
Louis Opter <kalessin@kalessin.fr>
parents: 493
diff changeset
1162 + await c.connect()
8f70d5539e5c Organize the code a bit better
Louis Opter <kalessin@kalessin.fr>
parents: 493
diff changeset
1163 + return c
499
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1164 +
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1165 +
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1166 +def create_lightsd_connection(url: str = None) -> None:
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1167 + raise NotImplementedError("Sorry, no synchronous client available yet")
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1168 diff --git a/clients/python/lightsc/lightsc/exceptions.py b/clients/python/lightsc/lightsc/exceptions.py
493
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
1169 new file mode 100644
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
1170 --- /dev/null
499
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1171 +++ b/clients/python/lightsc/lightsc/exceptions.py
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1172 @@ -0,0 +1,28 @@
493
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
1173 +# Copyright (c) 2016, Louis Opter <louis@opter.org>
496
08ad69e0a7a7 get things working in a good shape
Louis Opter <kalessin@kalessin.fr>
parents: 495
diff changeset
1174 +#
493
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
1175 +# This file is part of lightsd.
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
1176 +#
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
1177 +# lightsd is free software: you can redistribute it and/or modify
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
1178 +# it under the terms of the GNU General Public License as published by
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
1179 +# the Free Software Foundation, either version 3 of the License, or
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
1180 +# (at your option) any later version.
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
1181 +#
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
1182 +# lightsd is distributed in the hope that it will be useful,
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
1183 +# but WITHOUT ANY WARRANTY; without even the implied warranty of
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
1184 +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
1185 +# GNU General Public License for more details.
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
1186 +#
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
1187 +# You should have received a copy of the GNU General Public License
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
1188 +# along with lightsd. If not, see <http://www.gnu.org/licenses/>.
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
1189 +
498
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
1190 +
499
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1191 +class LightsError(Exception):
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1192 + pass
493
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
1193 +
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
1194 +
499
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1195 +class LightsClientError(LightsError):
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1196 + pass
496
08ad69e0a7a7 get things working in a good shape
Louis Opter <kalessin@kalessin.fr>
parents: 495
diff changeset
1197 +
493
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
1198 +
499
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1199 +class LightsClientTimeoutError(LightsClientError):
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1200 + pass
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1201 diff --git a/clients/python/lightsc/lightsc/requests.py b/clients/python/lightsc/lightsc/requests.py
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1202 new file mode 100644
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1203 --- /dev/null
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1204 +++ b/clients/python/lightsc/lightsc/requests.py
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1205 @@ -0,0 +1,65 @@
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1206 +# Copyright (c) 2016, Louis Opter <louis@opter.org>
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1207 +#
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1208 +# This file is part of lightsd.
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1209 +#
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1210 +# lightsd is free software: you can redistribute it and/or modify
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1211 +# it under the terms of the GNU General Public License as published by
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1212 +# the Free Software Foundation, either version 3 of the License, or
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1213 +# (at your option) any later version.
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1214 +#
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1215 +# lightsd is distributed in the hope that it will be useful,
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1216 +# but WITHOUT ANY WARRANTY; without even the implied warranty of
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1217 +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1218 +# GNU General Public License for more details.
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1219 +#
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1220 +# You should have received a copy of the GNU General Public License
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1221 +# along with lightsd. If not, see <http://www.gnu.org/licenses/>.
498
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
1222 +
499
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1223 +from typing import (
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1224 + Any,
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1225 + List,
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1226 + TypeVar,
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1227 +)
493
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
1228 +
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
1229 +
499
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1230 +class Request:
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1231 +
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1232 + def __init__(self, *args: Any) -> None:
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1233 + self.params = args
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1234 +
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1235 +RequestClass = TypeVar("RequestClass", bound=Request)
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1236 +
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1237 +
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1238 +class SetLightFromHSBK(Request):
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1239 +
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1240 + def __init__(
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1241 + self,
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1242 + targets: List[str],
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1243 + h: float, s: float, b: float, k: int,
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1244 + transition_ms: int
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1245 + ) -> None:
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1246 + Request.__init__(self, targets, h, s, b, k, transition_ms)
498
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
1247 +
499
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1248 +
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1249 +class GetLightState(Request):
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1250 +
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1251 + def __init__(self, targets: List[str]) -> None:
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1252 + Request.__init__(self, targets)
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1253 +
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1254 +
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1255 +class PowerOff(Request):
498
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
1256 +
499
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1257 + def __init__(self, targets: List[str]) -> None:
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1258 + Request.__init__(self, targets)
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1259 +
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1260 +
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1261 +class PowerOn(Request):
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1262 +
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1263 + def __init__(self, targets: List[str]) -> None:
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1264 + Request.__init__(self, targets)
493
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
1265 +
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
1266 +
499
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1267 +class PowerToggle(Request):
493
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
1268 +
499
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1269 + def __init__(self, targets: List[str]) -> None:
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1270 + Request.__init__(self, targets)
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1271 diff --git a/clients/python/lightsc/lightsc/responses.py b/clients/python/lightsc/lightsc/responses.py
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1272 new file mode 100644
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1273 --- /dev/null
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1274 +++ b/clients/python/lightsc/lightsc/responses.py
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1275 @@ -0,0 +1,41 @@
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1276 +# Copyright (c) 2016, Louis Opter <louis@opter.org>
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1277 +#
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1278 +# This file is part of lightsd.
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1279 +#
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1280 +# lightsd is free software: you can redistribute it and/or modify
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1281 +# it under the terms of the GNU General Public License as published by
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1282 +# the Free Software Foundation, either version 3 of the License, or
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1283 +# (at your option) any later version.
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1284 +#
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1285 +# lightsd is distributed in the hope that it will be useful,
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1286 +# but WITHOUT ANY WARRANTY; without even the implied warranty of
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1287 +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1288 +# GNU General Public License for more details.
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1289 +#
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1290 +# You should have received a copy of the GNU General Public License
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1291 +# along with lightsd. If not, see <http://www.gnu.org/licenses/>.
498
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
1292 +
499
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1293 +from typing import (
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1294 + List,
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1295 + TypeVar,
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1296 +)
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1297 +
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1298 +from . import structs
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1299 +
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1300 +
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1301 +class Response:
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1302 + pass
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1303 +
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1304 +ResponseClass = TypeVar("ResponseClass", bound=Response)
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1305 +
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1306 +
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1307 +class Bool(Response):
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1308 +
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1309 + def __init__(self, bool: bool) -> None:
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1310 + self.value = bool
496
08ad69e0a7a7 get things working in a good shape
Louis Opter <kalessin@kalessin.fr>
parents: 495
diff changeset
1311 +
08ad69e0a7a7 get things working in a good shape
Louis Opter <kalessin@kalessin.fr>
parents: 495
diff changeset
1312 +
499
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1313 +class LightsState(Response):
498
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
1314 +
499
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1315 + def __init__(self, bulbs: List[structs.LightBulb]) -> None:
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1316 + self.bulbs = bulbs
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1317 diff --git a/clients/python/lightsc/lightsc/structs.py b/clients/python/lightsc/lightsc/structs.py
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1318 new file mode 100644
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1319 --- /dev/null
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1320 +++ b/clients/python/lightsc/lightsc/structs.py
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1321 @@ -0,0 +1,42 @@
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1322 +# Copyright (c) 2016, Louis Opter <louis@opter.org>
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1323 +#
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1324 +# This file is part of lightsd.
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1325 +#
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1326 +# lightsd is free software: you can redistribute it and/or modify
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1327 +# it under the terms of the GNU General Public License as published by
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1328 +# the Free Software Foundation, either version 3 of the License, or
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1329 +# (at your option) any later version.
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1330 +#
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1331 +# lightsd is distributed in the hope that it will be useful,
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1332 +# but WITHOUT ANY WARRANTY; without even the implied warranty of
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1333 +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1334 +# GNU General Public License for more details.
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1335 +#
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1336 +# You should have received a copy of the GNU General Public License
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1337 +# along with lightsd. If not, see <http://www.gnu.org/licenses/>.
498
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
1338 +
499
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1339 +from typing import (
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1340 + List,
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1341 +)
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1342 +
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1343 +
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1344 +class Struct:
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1345 + pass
493
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
1346 +
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
1347 +
499
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1348 +class LightBulb(Struct):
498
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
1349 +
499
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1350 + def __init__(
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1351 + self,
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1352 + label: str,
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1353 + power: bool,
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1354 + h: float, s: float, b: float, k: int,
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1355 + tags: List[str]
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1356 + ) -> None:
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1357 + self.label = label
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1358 + self.power = power
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1359 + self.h = h
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1360 + self.s = s
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1361 + self.b = b
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1362 + self.k = k
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1363 + self.tags = tags
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1364 diff --git a/clients/python/lightsc/lightsc/view.py b/clients/python/lightsc/lightsc/view.py
491
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1365 new file mode 100644
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1366 --- /dev/null
499
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1367 +++ b/clients/python/lightsc/lightsc/view.py
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1368 @@ -0,0 +1,32 @@
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1369 +# Copyright (c) 2016, Louis Opter <louis@opter.org>
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1370 +#
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1371 +# This file is part of lightsd.
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1372 +#
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1373 +# lightsd is free software: you can redistribute it and/or modify
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1374 +# it under the terms of the GNU General Public License as published by
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1375 +# the Free Software Foundation, either version 3 of the License, or
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1376 +# (at your option) any later version.
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1377 +#
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1378 +# lightsd is distributed in the hope that it will be useful,
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1379 +# but WITHOUT ANY WARRANTY; without even the implied warranty of
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1380 +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1381 +# GNU General Public License for more details.
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1382 +#
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1383 +# You should have received a copy of the GNU General Public License
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1384 +# along with lightsd. If not, see <http://www.gnu.org/licenses/>.
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1385 +
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1386 +import pprint
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1387 +
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1388 +
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1389 +class LightsView:
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1390 +
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1391 + def __init__(self):
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1392 + self.bulbs = []
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1393 + self.bulbs_by_label = {}
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1394 +
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1395 + def __str__(self):
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1396 + return pprint.pformat(self.bulbs_by_label)
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1397 +
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1398 + def update(self, lights_state):
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1399 + self.bulbs = lights_state.bulbs
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1400 + self.bulbs_by_label = {b.label for b in lights_state.bulbs.items()}
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1401 diff --git a/clients/python/lightsc/setup.py b/clients/python/lightsc/setup.py
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1402 new file mode 100644
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1403 --- /dev/null
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1404 +++ b/clients/python/lightsc/setup.py
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1405 @@ -0,0 +1,53 @@
491
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1406 +# Copyright (c) 2016, Louis Opter <louis@opter.org>
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1407 +#
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1408 +# This file is part of lighstd.
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1409 +#
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1410 +# lighstd is free software: you can redistribute it and/or modify
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1411 +# it under the terms of the GNU General Public License as published by
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1412 +# the Free Software Foundation, either version 3 of the License, or
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1413 +# (at your option) any later version.
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1414 +#
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1415 +# lighstd is distributed in the hope that it will be useful,
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1416 +# but WITHOUT ANY WARRANTY; without even the implied warranty of
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1417 +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1418 +# GNU General Public License for more details.
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1419 +#
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1420 +# You should have received a copy of the GNU General Public License
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1421 +# along with lighstd. If not, see <http://www.gnu.org/licenses/>.
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1422 +
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1423 +import setuptools
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1424 +
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1425 +version = "0.0.1.dev0"
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1426 +
498
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
1427 +with open("README.rst", "r") as fp:
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
1428 + long_description = fp.read()
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
1429 +
491
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1430 +setuptools.setup(
499
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1431 + name="lightsc",
491
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1432 + version=version,
499
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1433 + description="A client to interact with lightsd",
498
ada36e135d0d Wip, break things appart
Louis Opter <kalessin@kalessin.fr>
parents: 496
diff changeset
1434 + long_description=long_description,
491
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1435 + author="Louis Opter",
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1436 + author_email="louis@opter.org",
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1437 + packages=setuptools.find_packages(exclude=['tests', 'tests.*']),
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1438 + include_package_data=True,
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1439 + entry_points={
499
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1440 + "console_scripts": [],
491
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1441 + },
499
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1442 + install_requires=[],
491
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1443 + tests_require=[
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1444 + "doubles~=1.1.3",
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1445 + "freezegun~=0.3.5",
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1446 + "pytest~=3.0",
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1447 + ],
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1448 + extras_require={
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1449 + "dev": [
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1450 + "flake8",
499
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1451 + "mypy-lang",
493
d9f90a882319 Wip monolight
Louis Opter <kalessin@kalessin.fr>
parents: 491
diff changeset
1452 + "ipython",
491
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1453 + "pdbpp",
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1454 + "pep8",
499
2da15caf4d44 Get monolight to work again with the refactored client
Louis Opter <kalessin@kalessin.fr>
parents: 498
diff changeset
1455 + "typed-ast",
491
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1456 + ],
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1457 + },
6b153374b871 start this python bridge between a monome and lightsd
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1458 +)