Mercurial > code > home > repos > light9
annotate bin/attic/dmxserver @ 2376:4556eebe5d73
topdir reorgs; let pdm have its src/ dir; separate vite area from light9/
author | drewp@bigasterisk.com |
---|---|
date | Sun, 12 May 2024 19:02:10 -0700 |
parents | bin/dmxserver@5bcb950024af |
children |
rev | line source |
---|---|
686
a301a0039c66
buildout and rdflib updates
Drew Perttula <drewp@bigasterisk.com>
parents:
623
diff
changeset
|
1 #!bin/python |
0 | 2 """ |
1530 | 3 Replaced by bin/collector |
4 | |
0 | 5 |
6 this is the only process to talk to the dmx hardware. other clients | |
7 can connect to this server and present dmx output, and this server | |
8 will max ('pile-on') all the client requests. | |
9 | |
10 this server has a level display which is the final set of values that | |
11 goes to the hardware. | |
12 | |
13 clients shall connect to the xmlrpc server and send: | |
14 | |
15 their PID (or some other cookie) | |
16 | |
17 a length-n list of 0..1 levels which will represent the channel | |
18 values for the n first dmx channels. | |
19 | |
20 server is port 8030; xmlrpc method is called outputlevels(pid,levellist). | |
21 | |
116
9ddea0c614ee
much prettier stdout, including a clock (so you can tell the server's running)
drewp
parents:
112
diff
changeset
|
22 todo: |
9ddea0c614ee
much prettier stdout, including a clock (so you can tell the server's running)
drewp
parents:
112
diff
changeset
|
23 save dmx on quit and restore on restart |
9ddea0c614ee
much prettier stdout, including a clock (so you can tell the server's running)
drewp
parents:
112
diff
changeset
|
24 if parport fails, run in dummy mode (and make an option for that too) |
0 | 25 """ |
26 | |
27 from twisted.internet import reactor | |
28 from twisted.web import xmlrpc, server | |
1858 | 29 import sys, time, os |
194 | 30 from optparse import OptionParser |
209
1a84c5e83d3e
dmxserver and subcomposer work in new layout
drewp@bigasterisk.com
parents:
199
diff
changeset
|
31 import run_local |
1858 | 32 import txosc.dispatch, txosc. async |
333
44189a37a876
change dmxserver to use enttec opendmx
drewp@bigasterisk.com
parents:
210
diff
changeset
|
33 from light9.io import ParportDMX, UsbDMX |
44189a37a876
change dmxserver to use enttec opendmx
drewp@bigasterisk.com
parents:
210
diff
changeset
|
34 |
209
1a84c5e83d3e
dmxserver and subcomposer work in new layout
drewp@bigasterisk.com
parents:
199
diff
changeset
|
35 from light9.updatefreq import Updatefreq |
210
f41004d5a507
factored out some networking, new show/ layout, curvecalc works
drewp@bigasterisk.com
parents:
209
diff
changeset
|
36 from light9 import networking |
0 | 37 |
1220
d5e99fee786d
twisted uses zmq (not xmlrpc) to send levels to dmxserver
Drew Perttula <drewp@bigasterisk.com>
parents:
1009
diff
changeset
|
38 from txzmq import ZmqEndpoint, ZmqFactory, ZmqPullConnection, ZmqRequestTimeoutError |
d5e99fee786d
twisted uses zmq (not xmlrpc) to send levels to dmxserver
Drew Perttula <drewp@bigasterisk.com>
parents:
1009
diff
changeset
|
39 import json |
d5e99fee786d
twisted uses zmq (not xmlrpc) to send levels to dmxserver
Drew Perttula <drewp@bigasterisk.com>
parents:
1009
diff
changeset
|
40 |
1858 | 41 |
1220
d5e99fee786d
twisted uses zmq (not xmlrpc) to send levels to dmxserver
Drew Perttula <drewp@bigasterisk.com>
parents:
1009
diff
changeset
|
42 def startZmq(port, outputlevels): |
d5e99fee786d
twisted uses zmq (not xmlrpc) to send levels to dmxserver
Drew Perttula <drewp@bigasterisk.com>
parents:
1009
diff
changeset
|
43 zf = ZmqFactory() |
d5e99fee786d
twisted uses zmq (not xmlrpc) to send levels to dmxserver
Drew Perttula <drewp@bigasterisk.com>
parents:
1009
diff
changeset
|
44 e = ZmqEndpoint('bind', 'tcp://*:%s' % port) |
d5e99fee786d
twisted uses zmq (not xmlrpc) to send levels to dmxserver
Drew Perttula <drewp@bigasterisk.com>
parents:
1009
diff
changeset
|
45 s = ZmqPullConnection(zf, e) |
1858 | 46 |
1220
d5e99fee786d
twisted uses zmq (not xmlrpc) to send levels to dmxserver
Drew Perttula <drewp@bigasterisk.com>
parents:
1009
diff
changeset
|
47 def onPull(message): |
d5e99fee786d
twisted uses zmq (not xmlrpc) to send levels to dmxserver
Drew Perttula <drewp@bigasterisk.com>
parents:
1009
diff
changeset
|
48 msg = json.loads(message[0]) |
d5e99fee786d
twisted uses zmq (not xmlrpc) to send levels to dmxserver
Drew Perttula <drewp@bigasterisk.com>
parents:
1009
diff
changeset
|
49 outputlevels(msg['clientid'], msg['levellist']) |
1858 | 50 |
1220
d5e99fee786d
twisted uses zmq (not xmlrpc) to send levels to dmxserver
Drew Perttula <drewp@bigasterisk.com>
parents:
1009
diff
changeset
|
51 s.onPull = onPull |
1009
ba47676dde49
dmxserver can receive OSC requests too
drewp@bigasterisk.com
parents:
978
diff
changeset
|
52 |
1858 | 53 |
1009
ba47676dde49
dmxserver can receive OSC requests too
drewp@bigasterisk.com
parents:
978
diff
changeset
|
54 class ReceiverApplication(object): |
ba47676dde49
dmxserver can receive OSC requests too
drewp@bigasterisk.com
parents:
978
diff
changeset
|
55 """ |
ba47676dde49
dmxserver can receive OSC requests too
drewp@bigasterisk.com
parents:
978
diff
changeset
|
56 receive UDP OSC messages. address is /dmx/1 for dmx channel 1, |
ba47676dde49
dmxserver can receive OSC requests too
drewp@bigasterisk.com
parents:
978
diff
changeset
|
57 arguments are 0-1 floats for that channel and any number of |
ba47676dde49
dmxserver can receive OSC requests too
drewp@bigasterisk.com
parents:
978
diff
changeset
|
58 following channels. |
ba47676dde49
dmxserver can receive OSC requests too
drewp@bigasterisk.com
parents:
978
diff
changeset
|
59 """ |
1858 | 60 |
1009
ba47676dde49
dmxserver can receive OSC requests too
drewp@bigasterisk.com
parents:
978
diff
changeset
|
61 def __init__(self, port, lightServer): |
ba47676dde49
dmxserver can receive OSC requests too
drewp@bigasterisk.com
parents:
978
diff
changeset
|
62 self.port = port |
ba47676dde49
dmxserver can receive OSC requests too
drewp@bigasterisk.com
parents:
978
diff
changeset
|
63 self.lightServer = lightServer |
ba47676dde49
dmxserver can receive OSC requests too
drewp@bigasterisk.com
parents:
978
diff
changeset
|
64 self.receiver = txosc.dispatch.Receiver() |
ba47676dde49
dmxserver can receive OSC requests too
drewp@bigasterisk.com
parents:
978
diff
changeset
|
65 self.receiver.addCallback("/dmx/*", self.pixel_handler) |
ba47676dde49
dmxserver can receive OSC requests too
drewp@bigasterisk.com
parents:
978
diff
changeset
|
66 self._server_port = reactor.listenUDP( |
ba47676dde49
dmxserver can receive OSC requests too
drewp@bigasterisk.com
parents:
978
diff
changeset
|
67 self.port, |
1858 | 68 txosc. async .DatagramServerProtocol(self.receiver), |
1009
ba47676dde49
dmxserver can receive OSC requests too
drewp@bigasterisk.com
parents:
978
diff
changeset
|
69 interface='0.0.0.0') |
1859
f066d6e874db
2to3 with these fixers: all idioms set_literal
drewp@bigasterisk.com
parents:
1858
diff
changeset
|
70 print("Listening OSC on udp port %s" % (self.port)) |
1009
ba47676dde49
dmxserver can receive OSC requests too
drewp@bigasterisk.com
parents:
978
diff
changeset
|
71 |
ba47676dde49
dmxserver can receive OSC requests too
drewp@bigasterisk.com
parents:
978
diff
changeset
|
72 def pixel_handler(self, message, address): |
ba47676dde49
dmxserver can receive OSC requests too
drewp@bigasterisk.com
parents:
978
diff
changeset
|
73 # this is already 1-based though I don't know why |
ba47676dde49
dmxserver can receive OSC requests too
drewp@bigasterisk.com
parents:
978
diff
changeset
|
74 startChannel = int(message.address.split('/')[2]) |
ba47676dde49
dmxserver can receive OSC requests too
drewp@bigasterisk.com
parents:
978
diff
changeset
|
75 levels = [a.value for a in message.arguments] |
ba47676dde49
dmxserver can receive OSC requests too
drewp@bigasterisk.com
parents:
978
diff
changeset
|
76 allLevels = [0] * (startChannel - 1) + levels |
1858 | 77 self.lightServer.xmlrpc_outputlevels("osc@%s" % startChannel, allLevels) |
78 | |
1009
ba47676dde49
dmxserver can receive OSC requests too
drewp@bigasterisk.com
parents:
978
diff
changeset
|
79 |
0 | 80 class XMLRPCServe(xmlrpc.XMLRPC): |
1858 | 81 |
82 def __init__(self, options): | |
116
9ddea0c614ee
much prettier stdout, including a clock (so you can tell the server's running)
drewp
parents:
112
diff
changeset
|
83 |
9ddea0c614ee
much prettier stdout, including a clock (so you can tell the server's running)
drewp
parents:
112
diff
changeset
|
84 xmlrpc.XMLRPC.__init__(self) |
1858 | 85 |
86 self.clientlevels = {} # clientID : list of levels | |
87 self.lastseen = {} # clientID : time last seen | |
88 self.clientfreq = {} # clientID : updatefreq | |
89 | |
90 self.combinedlevels = [] # list of levels, after max'ing the clients | |
91 self.clientschanged = 1 # have clients sent anything since the last send? | |
92 self.options = options | |
93 self.lastupdate = 0 # time of last dmx send | |
94 self.laststatsprint = 0 # time | |
134 | 95 |
96 # desired seconds between sendlevels() calls | |
1858 | 97 self.calldelay = 1 / options.updates_per_sec |
0 | 98 |
1859
f066d6e874db
2to3 with these fixers: all idioms set_literal
drewp@bigasterisk.com
parents:
1858
diff
changeset
|
99 print("starting parport connection") |
978 | 100 self.parportdmx = UsbDMX(dimmers=90, port=options.dmx_device) |
1858 | 101 if os.environ.get('DMXDUMMY', 0): |
199 | 102 self.parportdmx.godummy() |
103 else: | |
104 self.parportdmx.golive() | |
0 | 105 |
1858 | 106 self.updatefreq = Updatefreq() # freq of actual dmx sends |
107 self.num_unshown_updates = None | |
108 self.lastshownlevels = None | |
134 | 109 # start the loop |
0 | 110 self.sendlevels() |
134 | 111 |
112 # the other loop | |
113 self.purgeclients() | |
1858 | 114 |
118
2c25a69c084d
now tracks update frequencies of the server and each client
drewp
parents:
116
diff
changeset
|
115 def purgeclients(self): |
194 | 116 """forget about any clients who haven't sent levels in a while. |
117 this runs in a loop""" | |
134 | 118 |
1858 | 119 purge_age = 10 # seconds |
134 | 120 |
1858 | 121 reactor.callLater(1, self.purgeclients) |
122 | |
123 now = time.time() | |
1859
f066d6e874db
2to3 with these fixers: all idioms set_literal
drewp@bigasterisk.com
parents:
1858
diff
changeset
|
124 cids = list(self.lastseen.keys()) |
194 | 125 for cid in cids: |
1858 | 126 lastseen = self.lastseen[cid] |
353
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
352
diff
changeset
|
127 if lastseen < now - purge_age: |
1859
f066d6e874db
2to3 with these fixers: all idioms set_literal
drewp@bigasterisk.com
parents:
1858
diff
changeset
|
128 print(("forgetting client %s (no activity for %s sec)" % |
1860 | 129 (cid, purge_age))) |
353
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
352
diff
changeset
|
130 try: |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
352
diff
changeset
|
131 del self.clientlevels[cid] |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
352
diff
changeset
|
132 except KeyError: |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
352
diff
changeset
|
133 pass |
194 | 134 del self.clientfreq[cid] |
118
2c25a69c084d
now tracks update frequencies of the server and each client
drewp
parents:
116
diff
changeset
|
135 del self.lastseen[cid] |
1858 | 136 |
0 | 137 def sendlevels(self): |
134 | 138 """sends to dmx if levels have changed, or if we havent sent |
139 in a while""" | |
140 | |
1858 | 141 reactor.callLater(self.calldelay, self.sendlevels) |
134 | 142 |
0 | 143 if self.clientschanged: |
144 # recalc levels | |
145 | |
118
2c25a69c084d
now tracks update frequencies of the server and each client
drewp
parents:
116
diff
changeset
|
146 self.calclevels() |
1858 | 147 |
148 if (self.num_unshown_updates is None or # first time | |
149 self.options.fast_updates or # show always | |
150 ( | |
151 self.combinedlevels != self.lastshownlevels and # changed | |
152 self.num_unshown_updates > 5)): # not too frequent | |
153 self.num_unshown_updates = 0 | |
118
2c25a69c084d
now tracks update frequencies of the server and each client
drewp
parents:
116
diff
changeset
|
154 self.printlevels() |
1858 | 155 self.lastshownlevels = self.combinedlevels[:] |
116
9ddea0c614ee
much prettier stdout, including a clock (so you can tell the server's running)
drewp
parents:
112
diff
changeset
|
156 else: |
1858 | 157 self.num_unshown_updates += 1 |
116
9ddea0c614ee
much prettier stdout, including a clock (so you can tell the server's running)
drewp
parents:
112
diff
changeset
|
158 |
1858 | 159 if time.time() > self.laststatsprint + 2: |
160 self.laststatsprint = time.time() | |
118
2c25a69c084d
now tracks update frequencies of the server and each client
drewp
parents:
116
diff
changeset
|
161 self.printstats() |
2c25a69c084d
now tracks update frequencies of the server and each client
drewp
parents:
116
diff
changeset
|
162 |
333
44189a37a876
change dmxserver to use enttec opendmx
drewp@bigasterisk.com
parents:
210
diff
changeset
|
163 # used to be a fixed 1 in here, for the max delay between |
44189a37a876
change dmxserver to use enttec opendmx
drewp@bigasterisk.com
parents:
210
diff
changeset
|
164 # calls, instead of calldelay |
1858 | 165 if self.clientschanged or time.time( |
166 ) > self.lastupdate + self.calldelay: | |
167 self.lastupdate = time.time() | |
134 | 168 self.sendlevels_dmx() |
169 | |
1858 | 170 self.clientschanged = 0 # clear the flag |
171 | |
118
2c25a69c084d
now tracks update frequencies of the server and each client
drewp
parents:
116
diff
changeset
|
172 def calclevels(self): |
2c25a69c084d
now tracks update frequencies of the server and each client
drewp
parents:
116
diff
changeset
|
173 """combine all the known client levels into self.combinedlevels""" |
1858 | 174 self.combinedlevels = [] |
175 for chan in range(0, self.parportdmx.dimmers): | |
176 x = 0 | |
1859
f066d6e874db
2to3 with these fixers: all idioms set_literal
drewp@bigasterisk.com
parents:
1858
diff
changeset
|
177 for clientlist in list(self.clientlevels.values()): |
1858 | 178 if len(clientlist) > chan: |
118
2c25a69c084d
now tracks update frequencies of the server and each client
drewp
parents:
116
diff
changeset
|
179 # clamp client levels to 0..1 |
1858 | 180 cl = max(0, min(1, clientlist[chan])) |
181 x = max(x, cl) | |
118
2c25a69c084d
now tracks update frequencies of the server and each client
drewp
parents:
116
diff
changeset
|
182 self.combinedlevels.append(x) |
2c25a69c084d
now tracks update frequencies of the server and each client
drewp
parents:
116
diff
changeset
|
183 |
2c25a69c084d
now tracks update frequencies of the server and each client
drewp
parents:
116
diff
changeset
|
184 def printlevels(self): |
2c25a69c084d
now tracks update frequencies of the server and each client
drewp
parents:
116
diff
changeset
|
185 """write all the levels to stdout""" |
1860 | 186 print("Levels:", |
187 "".join(["% 2d " % (x * 100) for x in self.combinedlevels])) | |
1858 | 188 |
118
2c25a69c084d
now tracks update frequencies of the server and each client
drewp
parents:
116
diff
changeset
|
189 def printstats(self): |
2c25a69c084d
now tracks update frequencies of the server and each client
drewp
parents:
116
diff
changeset
|
190 """print the clock, freq, etc, with a \r at the end""" |
2c25a69c084d
now tracks update frequencies of the server and each client
drewp
parents:
116
diff
changeset
|
191 |
1858 | 192 sys.stdout.write("dmxserver up at %s, [polls %s] " % ( |
193 time.strftime("%H:%M:%S"), | |
194 str(self.updatefreq), | |
195 )) | |
1859
f066d6e874db
2to3 with these fixers: all idioms set_literal
drewp@bigasterisk.com
parents:
1858
diff
changeset
|
196 for cid, freq in list(self.clientfreq.items()): |
1858 | 197 sys.stdout.write("[%s %s] " % (cid, str(freq))) |
118
2c25a69c084d
now tracks update frequencies of the server and each client
drewp
parents:
116
diff
changeset
|
198 sys.stdout.write("\r") |
2c25a69c084d
now tracks update frequencies of the server and each client
drewp
parents:
116
diff
changeset
|
199 sys.stdout.flush() |
2c25a69c084d
now tracks update frequencies of the server and each client
drewp
parents:
116
diff
changeset
|
200 |
2c25a69c084d
now tracks update frequencies of the server and each client
drewp
parents:
116
diff
changeset
|
201 def sendlevels_dmx(self): |
2c25a69c084d
now tracks update frequencies of the server and each client
drewp
parents:
116
diff
changeset
|
202 """output self.combinedlevels to dmx, and keep the updates/sec stats""" |
2c25a69c084d
now tracks update frequencies of the server and each client
drewp
parents:
116
diff
changeset
|
203 # they'll get divided by 100 |
116
9ddea0c614ee
much prettier stdout, including a clock (so you can tell the server's running)
drewp
parents:
112
diff
changeset
|
204 if self.parportdmx: |
1858 | 205 self.parportdmx.sendlevels([l * 100 for l in self.combinedlevels]) |
118
2c25a69c084d
now tracks update frequencies of the server and each client
drewp
parents:
116
diff
changeset
|
206 self.updatefreq.update() |
1858 | 207 |
208 def xmlrpc_echo(self, x): | |
0 | 209 return x |
1858 | 210 |
211 def xmlrpc_outputlevels(self, cid, levellist): | |
118
2c25a69c084d
now tracks update frequencies of the server and each client
drewp
parents:
116
diff
changeset
|
212 """send a unique id for your client (name+pid maybe), then |
2c25a69c084d
now tracks update frequencies of the server and each client
drewp
parents:
116
diff
changeset
|
213 the variable-length dmx levellist (scaled 0..1)""" |
1858 | 214 if levellist != self.clientlevels.get(cid, None): |
215 self.clientlevels[cid] = levellist | |
216 self.clientschanged = 1 | |
353
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
352
diff
changeset
|
217 self.trackClientFreq(cid) |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
352
diff
changeset
|
218 return "ok" |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
352
diff
changeset
|
219 |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
352
diff
changeset
|
220 def xmlrpc_currentlevels(self, cid): |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
352
diff
changeset
|
221 """get a list of levels we're currently sending out. All |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
352
diff
changeset
|
222 channels beyond the list you get back, they're at zero.""" |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
352
diff
changeset
|
223 # if this is still too slow, it might help to return a single |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
352
diff
changeset
|
224 # pickled string |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
352
diff
changeset
|
225 self.trackClientFreq(cid) |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
352
diff
changeset
|
226 trunc = self.combinedlevels[:] |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
352
diff
changeset
|
227 i = len(trunc) - 1 |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
352
diff
changeset
|
228 if i < 0: |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
352
diff
changeset
|
229 return [] |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
352
diff
changeset
|
230 while trunc[i] == 0 and i >= 0: |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
352
diff
changeset
|
231 i -= 1 |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
352
diff
changeset
|
232 if i < 0: |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
352
diff
changeset
|
233 return [] |
1858 | 234 trunc = trunc[:i + 1] |
353
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
352
diff
changeset
|
235 return trunc |
1858 | 236 |
353
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
352
diff
changeset
|
237 def trackClientFreq(self, cid): |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
352
diff
changeset
|
238 if cid not in self.lastseen: |
1859
f066d6e874db
2to3 with these fixers: all idioms set_literal
drewp@bigasterisk.com
parents:
1858
diff
changeset
|
239 print("hello new client %s" % cid) |
1858 | 240 self.clientfreq[cid] = Updatefreq() |
241 self.lastseen[cid] = time.time() | |
118
2c25a69c084d
now tracks update frequencies of the server and each client
drewp
parents:
116
diff
changeset
|
242 self.clientfreq[cid].update() |
1858 | 243 |
352
9d1f323fb3d3
new bin/lightsim tied to dmxserver
Drew Perttula <drewp@bigasterisk.com>
parents:
333
diff
changeset
|
244 |
1858 | 245 parser = OptionParser() |
246 parser.add_option("-f", | |
247 "--fast-updates", | |
248 action='store_true', | |
118
2c25a69c084d
now tracks update frequencies of the server and each client
drewp
parents:
116
diff
changeset
|
249 help=('display all dmx output to stdout instead ' |
2c25a69c084d
now tracks update frequencies of the server and each client
drewp
parents:
116
diff
changeset
|
250 'of the usual reduced output')) |
1858 | 251 parser.add_option("-r", |
252 "--updates-per-sec", | |
253 type='float', | |
254 default=20, | |
134 | 255 help=('dmx output frequency')) |
1858 | 256 parser.add_option("-d", |
257 "--dmx-device", | |
258 default='/dev/dmx0', | |
876
e263c4bd73f9
pass dmx choice into dmxserver
Drew Perttula <drewp@bigasterisk.com>
parents:
686
diff
changeset
|
259 help='dmx device name') |
1858 | 260 parser.add_option("-n", |
261 "--dummy", | |
262 action="store_true", | |
419 | 263 help="dummy mode, same as DMXDUMMY=1 env variable") |
1858 | 264 (options, songfiles) = parser.parse_args() |
118
2c25a69c084d
now tracks update frequencies of the server and each client
drewp
parents:
116
diff
changeset
|
265 |
1859
f066d6e874db
2to3 with these fixers: all idioms set_literal
drewp@bigasterisk.com
parents:
1858
diff
changeset
|
266 print(options) |
134 | 267 |
419 | 268 if options.dummy: |
269 os.environ['DMXDUMMY'] = "1" | |
270 | |
623
46d319974176
move networking settings to config.n3
drewp@bigasterisk.com
parents:
419
diff
changeset
|
271 port = networking.dmxServer.port |
1859
f066d6e874db
2to3 with these fixers: all idioms set_literal
drewp@bigasterisk.com
parents:
1858
diff
changeset
|
272 print("starting xmlrpc server on port %s" % port) |
1009
ba47676dde49
dmxserver can receive OSC requests too
drewp@bigasterisk.com
parents:
978
diff
changeset
|
273 xmlrpcServe = XMLRPCServe(options) |
1858 | 274 reactor.listenTCP(port, server.Site(xmlrpcServe)) |
1009
ba47676dde49
dmxserver can receive OSC requests too
drewp@bigasterisk.com
parents:
978
diff
changeset
|
275 |
1220
d5e99fee786d
twisted uses zmq (not xmlrpc) to send levels to dmxserver
Drew Perttula <drewp@bigasterisk.com>
parents:
1009
diff
changeset
|
276 startZmq(networking.dmxServerZmq.port, xmlrpcServe.xmlrpc_outputlevels) |
1858 | 277 |
1009
ba47676dde49
dmxserver can receive OSC requests too
drewp@bigasterisk.com
parents:
978
diff
changeset
|
278 oscApp = ReceiverApplication(9051, xmlrpcServe) |
ba47676dde49
dmxserver can receive OSC requests too
drewp@bigasterisk.com
parents:
978
diff
changeset
|
279 |
0 | 280 reactor.run() |