annotate bin/dmxserver @ 1207:6b73af19dbe1

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