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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
686
a301a0039c66 buildout and rdflib updates
Drew Perttula <drewp@bigasterisk.com>
parents: 623
diff changeset
1 #!bin/python
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
2 """
1530
a5a44077c54c docs and error msgs
drewp@bigasterisk.com
parents: 1220
diff changeset
3 Replaced by bin/collector
a5a44077c54c docs and error msgs
drewp@bigasterisk.com
parents: 1220
diff changeset
4
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
5
45b12307c695 Initial revision
drewp
parents:
diff changeset
6 this is the only process to talk to the dmx hardware. other clients
45b12307c695 Initial revision
drewp
parents:
diff changeset
7 can connect to this server and present dmx output, and this server
45b12307c695 Initial revision
drewp
parents:
diff changeset
8 will max ('pile-on') all the client requests.
45b12307c695 Initial revision
drewp
parents:
diff changeset
9
45b12307c695 Initial revision
drewp
parents:
diff changeset
10 this server has a level display which is the final set of values that
45b12307c695 Initial revision
drewp
parents:
diff changeset
11 goes to the hardware.
45b12307c695 Initial revision
drewp
parents:
diff changeset
12
45b12307c695 Initial revision
drewp
parents:
diff changeset
13 clients shall connect to the xmlrpc server and send:
45b12307c695 Initial revision
drewp
parents:
diff changeset
14
45b12307c695 Initial revision
drewp
parents:
diff changeset
15 their PID (or some other cookie)
45b12307c695 Initial revision
drewp
parents:
diff changeset
16
45b12307c695 Initial revision
drewp
parents:
diff changeset
17 a length-n list of 0..1 levels which will represent the channel
45b12307c695 Initial revision
drewp
parents:
diff changeset
18 values for the n first dmx channels.
45b12307c695 Initial revision
drewp
parents:
diff changeset
19
45b12307c695 Initial revision
drewp
parents:
diff changeset
20 server is port 8030; xmlrpc method is called outputlevels(pid,levellist).
45b12307c695 Initial revision
drewp
parents:
diff changeset
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
45b12307c695 Initial revision
drewp
parents:
diff changeset
25 """
45b12307c695 Initial revision
drewp
parents:
diff changeset
26
45b12307c695 Initial revision
drewp
parents:
diff changeset
27 from twisted.internet import reactor
45b12307c695 Initial revision
drewp
parents:
diff changeset
28 from twisted.web import xmlrpc, server
1858
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
29 import sys, time, os
194
70d45c584776 minor old changes
drewp
parents: 140
diff changeset
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
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
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
45b12307c695 Initial revision
drewp
parents:
diff changeset
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
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
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
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
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
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
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
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
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
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
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
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
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
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
77 self.lightServer.xmlrpc_outputlevels("osc@%s" % startChannel, allLevels)
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
78
1009
ba47676dde49 dmxserver can receive OSC requests too
drewp@bigasterisk.com
parents: 978
diff changeset
79
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
80 class XMLRPCServe(xmlrpc.XMLRPC):
1858
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
81
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
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
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
85
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
86 self.clientlevels = {} # clientID : list of levels
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
87 self.lastseen = {} # clientID : time last seen
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
88 self.clientfreq = {} # clientID : updatefreq
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
89
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
90 self.combinedlevels = [] # list of levels, after max'ing the clients
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
91 self.clientschanged = 1 # have clients sent anything since the last send?
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
92 self.options = options
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
93 self.lastupdate = 0 # time of last dmx send
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
94 self.laststatsprint = 0 # time
134
f2f73a2171e6 many adjustments to the loops and timing
drewp
parents: 118
diff changeset
95
f2f73a2171e6 many adjustments to the loops and timing
drewp
parents: 118
diff changeset
96 # desired seconds between sendlevels() calls
1858
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
97 self.calldelay = 1 / options.updates_per_sec
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
98
1859
f066d6e874db 2to3 with these fixers: all idioms set_literal
drewp@bigasterisk.com
parents: 1858
diff changeset
99 print("starting parport connection")
978
ce159eea90b5 now 90 dimmers
drewp@bigasterisk.com
parents: 975
diff changeset
100 self.parportdmx = UsbDMX(dimmers=90, port=options.dmx_device)
1858
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
101 if os.environ.get('DMXDUMMY', 0):
199
cde2ae379be0 added dummy mode, activated by env var DMXDUMMY=1
drewp
parents: 194
diff changeset
102 self.parportdmx.godummy()
cde2ae379be0 added dummy mode, activated by env var DMXDUMMY=1
drewp
parents: 194
diff changeset
103 else:
cde2ae379be0 added dummy mode, activated by env var DMXDUMMY=1
drewp
parents: 194
diff changeset
104 self.parportdmx.golive()
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
105
1858
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
106 self.updatefreq = Updatefreq() # freq of actual dmx sends
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
107 self.num_unshown_updates = None
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
108 self.lastshownlevels = None
134
f2f73a2171e6 many adjustments to the loops and timing
drewp
parents: 118
diff changeset
109 # start the loop
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
110 self.sendlevels()
134
f2f73a2171e6 many adjustments to the loops and timing
drewp
parents: 118
diff changeset
111
f2f73a2171e6 many adjustments to the loops and timing
drewp
parents: 118
diff changeset
112 # the other loop
f2f73a2171e6 many adjustments to the loops and timing
drewp
parents: 118
diff changeset
113 self.purgeclients()
1858
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
114
118
2c25a69c084d now tracks update frequencies of the server and each client
drewp
parents: 116
diff changeset
115 def purgeclients(self):
194
70d45c584776 minor old changes
drewp
parents: 140
diff changeset
116 """forget about any clients who haven't sent levels in a while.
70d45c584776 minor old changes
drewp
parents: 140
diff changeset
117 this runs in a loop"""
134
f2f73a2171e6 many adjustments to the loops and timing
drewp
parents: 118
diff changeset
118
1858
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
119 purge_age = 10 # seconds
134
f2f73a2171e6 many adjustments to the loops and timing
drewp
parents: 118
diff changeset
120
1858
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
121 reactor.callLater(1, self.purgeclients)
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
122
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
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
70d45c584776 minor old changes
drewp
parents: 140
diff changeset
125 for cid in cids:
1858
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
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
5bcb950024af reformat python
drewp@bigasterisk.com
parents: 1859
diff changeset
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
70d45c584776 minor old changes
drewp
parents: 140
diff changeset
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
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
136
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
137 def sendlevels(self):
134
f2f73a2171e6 many adjustments to the loops and timing
drewp
parents: 118
diff changeset
138 """sends to dmx if levels have changed, or if we havent sent
f2f73a2171e6 many adjustments to the loops and timing
drewp
parents: 118
diff changeset
139 in a while"""
f2f73a2171e6 many adjustments to the loops and timing
drewp
parents: 118
diff changeset
140
1858
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
141 reactor.callLater(self.calldelay, self.sendlevels)
134
f2f73a2171e6 many adjustments to the loops and timing
drewp
parents: 118
diff changeset
142
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
143 if self.clientschanged:
45b12307c695 Initial revision
drewp
parents:
diff changeset
144 # recalc levels
45b12307c695 Initial revision
drewp
parents:
diff changeset
145
118
2c25a69c084d now tracks update frequencies of the server and each client
drewp
parents: 116
diff changeset
146 self.calclevels()
1858
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
147
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
148 if (self.num_unshown_updates is None or # first time
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
149 self.options.fast_updates or # show always
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
150 (
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
151 self.combinedlevels != self.lastshownlevels and # changed
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
152 self.num_unshown_updates > 5)): # not too frequent
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
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
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
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
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
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
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
159 if time.time() > self.laststatsprint + 2:
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
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
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
165 if self.clientschanged or time.time(
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
166 ) > self.lastupdate + self.calldelay:
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
167 self.lastupdate = time.time()
134
f2f73a2171e6 many adjustments to the loops and timing
drewp
parents: 118
diff changeset
168 self.sendlevels_dmx()
f2f73a2171e6 many adjustments to the loops and timing
drewp
parents: 118
diff changeset
169
1858
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
170 self.clientschanged = 0 # clear the flag
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
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
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
174 self.combinedlevels = []
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
175 for chan in range(0, self.parportdmx.dimmers):
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
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
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
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
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
180 cl = max(0, min(1, clientlist[chan]))
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
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
5bcb950024af reformat python
drewp@bigasterisk.com
parents: 1859
diff changeset
186 print("Levels:",
5bcb950024af reformat python
drewp@bigasterisk.com
parents: 1859
diff changeset
187 "".join(["% 2d " % (x * 100) for x in self.combinedlevels]))
1858
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
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
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
192 sys.stdout.write("dmxserver up at %s, [polls %s] " % (
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
193 time.strftime("%H:%M:%S"),
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
194 str(self.updatefreq),
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
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
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
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
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
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
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
207
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
208 def xmlrpc_echo(self, x):
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
209 return x
1858
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
210
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
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
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
214 if levellist != self.clientlevels.get(cid, None):
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
215 self.clientlevels[cid] = levellist
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
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
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
234 trunc = trunc[:i + 1]
353
941cfe1e1691 lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents: 352
diff changeset
235 return trunc
1858
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
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
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
240 self.clientfreq[cid] = Updatefreq()
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
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
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
243
352
9d1f323fb3d3 new bin/lightsim tied to dmxserver
Drew Perttula <drewp@bigasterisk.com>
parents: 333
diff changeset
244
1858
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
245 parser = OptionParser()
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
246 parser.add_option("-f",
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
247 "--fast-updates",
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
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
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
251 parser.add_option("-r",
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
252 "--updates-per-sec",
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
253 type='float',
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
254 default=20,
134
f2f73a2171e6 many adjustments to the loops and timing
drewp
parents: 118
diff changeset
255 help=('dmx output frequency'))
1858
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
256 parser.add_option("-d",
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
257 "--dmx-device",
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
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
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
260 parser.add_option("-n",
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
261 "--dummy",
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
262 action="store_true",
419
632539a8c30e dmxserver now takes -n/--dummy
drewp@bigasterisk.com
parents: 353
diff changeset
263 help="dummy mode, same as DMXDUMMY=1 env variable")
1858
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
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
f2f73a2171e6 many adjustments to the loops and timing
drewp
parents: 118
diff changeset
267
419
632539a8c30e dmxserver now takes -n/--dummy
drewp@bigasterisk.com
parents: 353
diff changeset
268 if options.dummy:
632539a8c30e dmxserver now takes -n/--dummy
drewp@bigasterisk.com
parents: 353
diff changeset
269 os.environ['DMXDUMMY'] = "1"
632539a8c30e dmxserver now takes -n/--dummy
drewp@bigasterisk.com
parents: 353
diff changeset
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
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
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
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1530
diff changeset
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
45b12307c695 Initial revision
drewp
parents:
diff changeset
280 reactor.run()