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