annotate light8/Lightboard.py @ 116:9ddea0c614ee

much prettier stdout, including a clock (so you can tell the server's running) much prettier stdout, including a clock (so you can tell the server's running) and channel updates only when the levels change, and throttled to every 100 updates even then.
author drewp
date Fri, 13 Jun 2003 06:15:28 +0000
parents afbdae5e1359
children 6f9898f00c9c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
112
afbdae5e1359 dmx light output is now via a separate process which light8 talks to.
drewp
parents: 107
diff changeset
1 from __future__ import nested_scopes,division
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
2
45b12307c695 Initial revision
drewp
parents:
diff changeset
3 from Tix import *
45b12307c695 Initial revision
drewp
parents:
diff changeset
4 from signal import signal, SIGINT
103
ddd3c8f04640 more untested code, ready for production: colors for slider mapping
dmcc
parents: 102
diff changeset
5 from time import time
112
afbdae5e1359 dmx light output is now via a separate process which light8 talks to.
drewp
parents: 107
diff changeset
6 import xmlrpclib
78
0969d8a6729d support for external sliders. fill in ExternalInput with real IO
dmcc
parents: 74
diff changeset
7 import sys, cPickle, random
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
8
45b12307c695 Initial revision
drewp
parents:
diff changeset
9 from uihelpers import *
45b12307c695 Initial revision
drewp
parents:
diff changeset
10 from panels import *
45b12307c695 Initial revision
drewp
parents:
diff changeset
11 from Xfader import *
45b12307c695 Initial revision
drewp
parents:
diff changeset
12 from subediting import Subediting
45b12307c695 Initial revision
drewp
parents:
diff changeset
13 from Fader import Fader
79
233fe8cefa36 ExtSliderMapping moved to new file
dmcc
parents: 78
diff changeset
14 from ExternalInput import ExternalSliders
233fe8cefa36 ExtSliderMapping moved to new file
dmcc
parents: 78
diff changeset
15 import io, stage, Subs, Patch, ExtSliderMapper
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
16
45b12307c695 Initial revision
drewp
parents:
diff changeset
17 class Pickles:
67
0bf7e664f913 window pos saving
dmcc
parents: 62
diff changeset
18 def __init__(self, scalelevels, subs=None, windowpos=None):
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
19 self.scalelevels = dict([(name, lev.get())
45b12307c695 Initial revision
drewp
parents:
diff changeset
20 for name, lev in scalelevels.items()])
45b12307c695 Initial revision
drewp
parents:
diff changeset
21 self.substate = dict([(name, subobj.get_state())
45b12307c695 Initial revision
drewp
parents:
diff changeset
22 for name, subobj in subs])
67
0bf7e664f913 window pos saving
dmcc
parents: 62
diff changeset
23 self.windowpos = windowpos
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
24
45b12307c695 Initial revision
drewp
parents:
diff changeset
25 class Lightboard:
112
afbdae5e1359 dmx light output is now via a separate process which light8 talks to.
drewp
parents: 107
diff changeset
26 def __init__(self, master, DUMMY):
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
27 self.master = master
112
afbdae5e1359 dmx light output is now via a separate process which light8 talks to.
drewp
parents: 107
diff changeset
28
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
29 self.DUMMY = DUMMY
74
2dfae9ed1cda jostle feature, use it to shake levels mildly
dmcc
parents: 72
diff changeset
30 self.jostle_mode = 0
104
15ead14b4dd1 result of 7.13 performance, some ExtSliderMapper fixes
dmcc
parents: 103
diff changeset
31 self.lastline = None
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
32
107
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
33 self.channel_levels = [] # these are actually the labels for the
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
34 # channel levels, and should probably be moved
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
35 # to panels.Leveldisplay
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
36 self.scalelevels = {}
107
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
37
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
38 self.lastsublevels = {} # to determine which subs changed
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
39 self.unchangedeffect = {} # dict of levels for lights that didn't
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
40 # change last time
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
41 self.lastunchangedgroup = {}
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
42
78
0969d8a6729d support for external sliders. fill in ExternalInput with real IO
dmcc
parents: 74
diff changeset
43 # doesn't draw any UI yet-- look for self.xfader.setupwidget()
0969d8a6729d support for external sliders. fill in ExternalInput with real IO
dmcc
parents: 74
diff changeset
44 self.xfader = Xfader(self.scalelevels)
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
45 self.oldlevels = [None] * 68 # never replace this; just clear it
45b12307c695 Initial revision
drewp
parents:
diff changeset
46 self.subediting = Subediting(currentoutputlevels=self.oldlevels)
45b12307c695 Initial revision
drewp
parents:
diff changeset
47
68
57b3c454465a result of 7.8.2002 run-through
dmcc
parents: 67
diff changeset
48 self.windowpos = 0
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
49 self.get_data()
45b12307c695 Initial revision
drewp
parents:
diff changeset
50 self.buildinterface()
45b12307c695 Initial revision
drewp
parents:
diff changeset
51 self.load()
112
afbdae5e1359 dmx light output is now via a separate process which light8 talks to.
drewp
parents: 107
diff changeset
52
afbdae5e1359 dmx light output is now via a separate process which light8 talks to.
drewp
parents: 107
diff changeset
53 # get a connection to the dmx server
afbdae5e1359 dmx light output is now via a separate process which light8 talks to.
drewp
parents: 107
diff changeset
54 self.dmxserver=xmlrpclib.Server("http://localhost:8030")
afbdae5e1359 dmx light output is now via a separate process which light8 talks to.
drewp
parents: 107
diff changeset
55
afbdae5e1359 dmx light output is now via a separate process which light8 talks to.
drewp
parents: 107
diff changeset
56 print "Light 8.8: Entering backgroundloop"
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
57 self.backgroundloop()
62
2f2eb802e93d stage shows levels now. aims have blue halo for easy recognition.
dmcc
parents: 61
diff changeset
58 self.updatestagelevels()
103
ddd3c8f04640 more untested code, ready for production: colors for slider mapping
dmcc
parents: 102
diff changeset
59 self.rec_file = open('light9.log', 'a')
ddd3c8f04640 more untested code, ready for production: colors for slider mapping
dmcc
parents: 102
diff changeset
60 self.record_start()
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
61
45b12307c695 Initial revision
drewp
parents:
diff changeset
62 def buildinterface(self):
102
e04f7b552bcd - scroll wheel works everywhere
dmcc
parents: 101
diff changeset
63 print "Light 8.8: Constructing interface..."
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
64 for w in self.master.winfo_children():
45b12307c695 Initial revision
drewp
parents:
diff changeset
65 w.destroy()
45b12307c695 Initial revision
drewp
parents:
diff changeset
66
102
e04f7b552bcd - scroll wheel works everywhere
dmcc
parents: 101
diff changeset
67 print "\tstage"
78
0969d8a6729d support for external sliders. fill in ExternalInput with real IO
dmcc
parents: 74
diff changeset
68 stage_tl = toplevelat('stage')
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
69 s = stage.Stage(stage_tl)
45b12307c695 Initial revision
drewp
parents:
diff changeset
70 stage.createlights(s)
45b12307c695 Initial revision
drewp
parents:
diff changeset
71 s.setsubediting(self.subediting)
45b12307c695 Initial revision
drewp
parents:
diff changeset
72 s.pack()
62
2f2eb802e93d stage shows levels now. aims have blue halo for easy recognition.
dmcc
parents: 61
diff changeset
73 self.stage = s # save it
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
74
78
0969d8a6729d support for external sliders. fill in ExternalInput with real IO
dmcc
parents: 74
diff changeset
75 sub_tl = toplevelat('sub')
0969d8a6729d support for external sliders. fill in ExternalInput with real IO
dmcc
parents: 74
diff changeset
76 scene_tl = toplevelat('scenes')
0969d8a6729d support for external sliders. fill in ExternalInput with real IO
dmcc
parents: 74
diff changeset
77 effect_tl = toplevelat('effect')
0969d8a6729d support for external sliders. fill in ExternalInput with real IO
dmcc
parents: 74
diff changeset
78
102
e04f7b552bcd - scroll wheel works everywhere
dmcc
parents: 101
diff changeset
79 print "\tslider patching"
78
0969d8a6729d support for external sliders. fill in ExternalInput with real IO
dmcc
parents: 74
diff changeset
80 mapping_tl = toplevelat('mapping')
79
233fe8cefa36 ExtSliderMapping moved to new file
dmcc
parents: 78
diff changeset
81 self.slidermapper = ExtSliderMapper.ExtSliderMapper(mapping_tl,
233fe8cefa36 ExtSliderMapping moved to new file
dmcc
parents: 78
diff changeset
82 self.scalelevels,
103
ddd3c8f04640 more untested code, ready for production: colors for slider mapping
dmcc
parents: 102
diff changeset
83 ExternalSliders(),
ddd3c8f04640 more untested code, ready for production: colors for slider mapping
dmcc
parents: 102
diff changeset
84 self)
78
0969d8a6729d support for external sliders. fill in ExternalInput with real IO
dmcc
parents: 74
diff changeset
85 self.slidermapper.pack()
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
86
102
e04f7b552bcd - scroll wheel works everywhere
dmcc
parents: 101
diff changeset
87 print "\tsubmaster control"
107
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
88 self.subpanels = Subpanels(sub_tl, effect_tl, scene_tl, self,
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
89 self.scalelevels, Subs, self.xfader,
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
90 self.changelevel, self.subediting,
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
91 Subs.longestsubname())
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
92
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
93 for n, lev in self.scalelevels.items():
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
94 self.lastsublevels[n] = lev.get()
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
95
102
e04f7b552bcd - scroll wheel works everywhere
dmcc
parents: 101
diff changeset
96 print "\tlevel display"
78
0969d8a6729d support for external sliders. fill in ExternalInput with real IO
dmcc
parents: 74
diff changeset
97 leveldisplay_tl = toplevelat('leveldisplay')
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
98 leveldisplay_tl.bind('<Escape>', sys.exit)
45b12307c695 Initial revision
drewp
parents:
diff changeset
99
45b12307c695 Initial revision
drewp
parents:
diff changeset
100 self.leveldisplay = Leveldisplay(leveldisplay_tl, self.channel_levels)
107
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
101 # I don't think we need this
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
102 # for i in range(0,len(self.channel_levels)):
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
103 # self.channel_levels[i].config(text=self.oldlevels[i])
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
104 # colorlabel(self.channel_levels[i])
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
105
102
e04f7b552bcd - scroll wheel works everywhere
dmcc
parents: 101
diff changeset
106 print "\tconsole"
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
107 Console(self)
45b12307c695 Initial revision
drewp
parents:
diff changeset
108
45b12307c695 Initial revision
drewp
parents:
diff changeset
109 # root frame
102
e04f7b552bcd - scroll wheel works everywhere
dmcc
parents: 101
diff changeset
110 print "\tcontrol panel"
e04f7b552bcd - scroll wheel works everywhere
dmcc
parents: 101
diff changeset
111 self.master.configure(bg='black')
74
2dfae9ed1cda jostle feature, use it to shake levels mildly
dmcc
parents: 72
diff changeset
112 controlpanel = Controlpanel(self.master, self.xfader, self.refresh,
107
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
113 self.quit, self.toggle_jostle, self.nonzerosubs)
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
114
102
e04f7b552bcd - scroll wheel works everywhere
dmcc
parents: 101
diff changeset
115 print "\tcrossfader"
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
116 xf=Frame(self.master)
45b12307c695 Initial revision
drewp
parents:
diff changeset
117 xf.pack(side='right')
45b12307c695 Initial revision
drewp
parents:
diff changeset
118
45b12307c695 Initial revision
drewp
parents:
diff changeset
119 self.master.bind('<q>', self.quit)
45b12307c695 Initial revision
drewp
parents:
diff changeset
120 self.master.bind('<r>', self.refresh)
45b12307c695 Initial revision
drewp
parents:
diff changeset
121 leveldisplay_tl.bind('<q>', self.quit)
45b12307c695 Initial revision
drewp
parents:
diff changeset
122 leveldisplay_tl.bind('<r>', self.refresh)
45b12307c695 Initial revision
drewp
parents:
diff changeset
123
45b12307c695 Initial revision
drewp
parents:
diff changeset
124 self.xfader.setupwidget(xf)
45b12307c695 Initial revision
drewp
parents:
diff changeset
125 controlpanel.pack()
45b12307c695 Initial revision
drewp
parents:
diff changeset
126
102
e04f7b552bcd - scroll wheel works everywhere
dmcc
parents: 101
diff changeset
127 print "\tcue fader (skipped)"
e04f7b552bcd - scroll wheel works everywhere
dmcc
parents: 101
diff changeset
128 # cuefader_tl = toplevelat('cuefader')
e04f7b552bcd - scroll wheel works everywhere
dmcc
parents: 101
diff changeset
129 # cuefader = Fader(cuefader_tl, Subs.cues, self.scalelevels)
e04f7b552bcd - scroll wheel works everywhere
dmcc
parents: 101
diff changeset
130 # cuefader.pack()
e04f7b552bcd - scroll wheel works everywhere
dmcc
parents: 101
diff changeset
131 print "Light 8.8: Everything's under control"
e04f7b552bcd - scroll wheel works everywhere
dmcc
parents: 101
diff changeset
132
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
133
45b12307c695 Initial revision
drewp
parents:
diff changeset
134 def get_data(self,*args):
45b12307c695 Initial revision
drewp
parents:
diff changeset
135 Subs.reload_data(self.DUMMY)
45b12307c695 Initial revision
drewp
parents:
diff changeset
136 Patch.reload_data(self.DUMMY)
102
e04f7b552bcd - scroll wheel works everywhere
dmcc
parents: 101
diff changeset
137 print "Light 8.8:", len(Patch.patch), "dimmers patched"
e04f7b552bcd - scroll wheel works everywhere
dmcc
parents: 101
diff changeset
138 print "Light 8.8:", len(Subs.subs), "submasters loaded"
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
139
45b12307c695 Initial revision
drewp
parents:
diff changeset
140 def refresh(self, *args):
45b12307c695 Initial revision
drewp
parents:
diff changeset
141 'rebuild interface, reload data'
103
ddd3c8f04640 more untested code, ready for production: colors for slider mapping
dmcc
parents: 102
diff changeset
142 print "Light 8.8: Refresh initiated. Cross your fingers."
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
143 self.get_data()
103
ddd3c8f04640 more untested code, ready for production: colors for slider mapping
dmcc
parents: 102
diff changeset
144 print "Light 8.8: Subediting refreshed"
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
145 self.subediting.refresh()
103
ddd3c8f04640 more untested code, ready for production: colors for slider mapping
dmcc
parents: 102
diff changeset
146 print "Light 8.8: Rebuilding interface..."
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
147 self.buildinterface()
45b12307c695 Initial revision
drewp
parents:
diff changeset
148 bindkeys(self.master,'<Escape>', self.quit)
103
ddd3c8f04640 more untested code, ready for production: colors for slider mapping
dmcc
parents: 102
diff changeset
149 print "Light 8.8: Setting up slider patching..."
101
a995fd1a8f03 result of 7.12 performance
dmcc
parents: 95
diff changeset
150 self.slidermapper.setup()
a995fd1a8f03 result of 7.12 performance
dmcc
parents: 95
diff changeset
151 # self.master.tk_setPalette('gray40')
103
ddd3c8f04640 more untested code, ready for production: colors for slider mapping
dmcc
parents: 102
diff changeset
152 print "Light 8.8: Now back to your regularly scheduled Light 8"
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
153
45b12307c695 Initial revision
drewp
parents:
diff changeset
154 def stageassub(self):
45b12307c695 Initial revision
drewp
parents:
diff changeset
155 """returns the current onstage lighting as a levels
45b12307c695 Initial revision
drewp
parents:
diff changeset
156 dictionary, skipping the zeros, and using names where
45b12307c695 Initial revision
drewp
parents:
diff changeset
157 possible"""
45b12307c695 Initial revision
drewp
parents:
diff changeset
158 levs=self.oldlevels
45b12307c695 Initial revision
drewp
parents:
diff changeset
159
45b12307c695 Initial revision
drewp
parents:
diff changeset
160 return dict([(Patch.get_channel_name(i),l) for i,l
45b12307c695 Initial revision
drewp
parents:
diff changeset
161 in zip(range(1,len(levs)+1),levs)
45b12307c695 Initial revision
drewp
parents:
diff changeset
162 if l>0])
68
57b3c454465a result of 7.8.2002 run-through
dmcc
parents: 67
diff changeset
163 def save_sub(self, name, levels, refresh=1):
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
164 if not name:
45b12307c695 Initial revision
drewp
parents:
diff changeset
165 print "Enter sub name in console."
45b12307c695 Initial revision
drewp
parents:
diff changeset
166 return
45b12307c695 Initial revision
drewp
parents:
diff changeset
167
45b12307c695 Initial revision
drewp
parents:
diff changeset
168 st = ''
45b12307c695 Initial revision
drewp
parents:
diff changeset
169 linebuf = 'subs["%s"] = {' % name
45b12307c695 Initial revision
drewp
parents:
diff changeset
170 for channame,lev in levels.items():
45b12307c695 Initial revision
drewp
parents:
diff changeset
171 if len(linebuf) > 60:
45b12307c695 Initial revision
drewp
parents:
diff changeset
172 st += linebuf + '\n '
45b12307c695 Initial revision
drewp
parents:
diff changeset
173 linebuf = ''
45b12307c695 Initial revision
drewp
parents:
diff changeset
174
45b12307c695 Initial revision
drewp
parents:
diff changeset
175 linebuf += ' "%s" : %d,' % (channame, lev)
45b12307c695 Initial revision
drewp
parents:
diff changeset
176 st += linebuf + '}\n'
45b12307c695 Initial revision
drewp
parents:
diff changeset
177 if self.DUMMY:
45b12307c695 Initial revision
drewp
parents:
diff changeset
178 filename = 'ConfigDummy.py'
45b12307c695 Initial revision
drewp
parents:
diff changeset
179 else:
45b12307c695 Initial revision
drewp
parents:
diff changeset
180 filename = 'Config.py'
45b12307c695 Initial revision
drewp
parents:
diff changeset
181 f = open(filename, 'a')
45b12307c695 Initial revision
drewp
parents:
diff changeset
182 f.write(st)
45b12307c695 Initial revision
drewp
parents:
diff changeset
183 f.close()
45b12307c695 Initial revision
drewp
parents:
diff changeset
184 print 'Added sub:', st
68
57b3c454465a result of 7.8.2002 run-through
dmcc
parents: 67
diff changeset
185 if refresh:
57b3c454465a result of 7.8.2002 run-through
dmcc
parents: 67
diff changeset
186 self.refresh()
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
187
45b12307c695 Initial revision
drewp
parents:
diff changeset
188 # this is called on a loop, and ALSO by the Scales
45b12307c695 Initial revision
drewp
parents:
diff changeset
189 def changelevel(self, *args):
45b12307c695 Initial revision
drewp
parents:
diff changeset
190 'Amp trims slider'
45b12307c695 Initial revision
drewp
parents:
diff changeset
191
78
0969d8a6729d support for external sliders. fill in ExternalInput with real IO
dmcc
parents: 74
diff changeset
192 # load levels from external sliders
0969d8a6729d support for external sliders. fill in ExternalInput with real IO
dmcc
parents: 74
diff changeset
193 extlevels = self.slidermapper.get_levels()
0969d8a6729d support for external sliders. fill in ExternalInput with real IO
dmcc
parents: 74
diff changeset
194 for name, val in extlevels.items():
79
233fe8cefa36 ExtSliderMapping moved to new file
dmcc
parents: 78
diff changeset
195 if name in self.scalelevels:
95
d5deeed83228 FancyDoubleVar is a DoubleVar where you can temporarily disable the callbacks
drewp
parents: 79
diff changeset
196 sl = self.scalelevels[name]
d5deeed83228 FancyDoubleVar is a DoubleVar where you can temporarily disable the callbacks
drewp
parents: 79
diff changeset
197 sl.set(val)
107
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
198
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
199 # newstart = time()
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
200
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
201 # learn what changed
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
202 unchangedgroup = {}
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
203 changedgroup = {}
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
204 for name, lastlevel in self.lastsublevels.items():
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
205 newlevel = self.scalelevels[name].get()
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
206 if lastlevel != newlevel:
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
207 changedgroup[name] = newlevel
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
208 else:
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
209 unchangedgroup[name] = newlevel
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
210
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
211 changedeffect = {}
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
212 if not changedgroup:
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
213 # should load levels from last time
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
214 pass
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
215 else:
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
216 # calculate effect of new group. this should take no time if
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
217 # nothing changed
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
218 for name, level in changedgroup.items():
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
219 newlevels = Subs.subs[name].get_levels(level=level)
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
220 for (ch, fadelev) in newlevels.items():
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
221 changedeffect[ch-1] = \
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
222 max(changedeffect.get(ch-1, 0), fadelev)
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
223
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
224 if unchangedgroup != self.lastunchangedgroup:
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
225 # unchanged group changed! (confusing, huh?)
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
226 # this means: the static subs from the last time are not the same
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
227 # as they are this time, so we recalculate effect of unchanged group
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
228 self.unchangedeffect = {}
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
229 for name, level in unchangedgroup.items():
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
230 newlevels = Subs.subs[name].get_levels(level=level)
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
231 for (ch, fadelev) in newlevels.items():
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
232 self.unchangedeffect[ch-1] = \
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
233 max(self.unchangedeffect.get(ch-1, 0), fadelev)
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
234 self.lastunchangedgroup = unchangedgroup
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
235
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
236 # record sublevels for future generations (iterations, that is)
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
237 for name in self.lastsublevels:
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
238 self.lastsublevels[name] = self.scalelevels[name]
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
239
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
240 # merge effects together
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
241 levels = [0] * 68
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
242 if changedeffect:
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
243 levels = [int(max(changedeffect.get(ch, 0),
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
244 self.unchangedeffect.get(ch, 0)))
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
245 for ch in range(0, 68)]
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
246 else:
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
247 levels = [int(self.unchangedeffect.get(ch, 0))
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
248 for ch in range(0, 68)]
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
249
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
250 '''
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
251 newend = time()
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
252
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
253 levels_opt = levels
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
254
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
255 oldstart = time()
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
256 # i tried to optimize this to a dictionary, but there was no speed
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
257 # improvement
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
258 levels = [0] * 68
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
259 for name, s in Subs.subs.items():
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
260 sublevel = self.scalelevels[name].get()
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
261 newlevels = s.get_levels(level=sublevel)
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
262 self.lastsublevels[name] = sublevel # XXX remove
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
263 for (ch, fadelev) in newlevels.items():
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
264 levels[ch-1] = max(levels[ch-1], fadelev)
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
265 levels = [int(l) for l in levels]
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
266 oldend = time()
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
267
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
268 newtime = newend - newstart
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
269 oldtime = oldend - oldstart
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
270 print "new", newtime, 'old', (oldend - oldstart), 'sup', \
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
271 oldtime / newtime
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
272
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
273 if levels != levels_opt:
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
274 raise "not equal"
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
275 # for l, lo in zip(levels, levels_opt):
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
276 # print l, lo
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
277 '''
74
2dfae9ed1cda jostle feature, use it to shake levels mildly
dmcc
parents: 72
diff changeset
278
72
609cb9ae53b1 results of 7.10 rehearsal, rollback broken IO changes
dmcc
parents: 71
diff changeset
279 for lev,lab,oldlev,numlab in zip(levels, self.channel_levels,
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
280 self.oldlevels,
72
609cb9ae53b1 results of 7.10 rehearsal, rollback broken IO changes
dmcc
parents: 71
diff changeset
281 self.leveldisplay.number_labels):
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
282 if lev != oldlev:
62
2f2eb802e93d stage shows levels now. aims have blue halo for easy recognition.
dmcc
parents: 61
diff changeset
283 lab.config(text="%d" % lev) # update labels in lev display
2f2eb802e93d stage shows levels now. aims have blue halo for easy recognition.
dmcc
parents: 61
diff changeset
284 colorlabel(lab) # recolor labels
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
285 if lev < oldlev:
45b12307c695 Initial revision
drewp
parents:
diff changeset
286 numlab['bg'] = 'blue'
45b12307c695 Initial revision
drewp
parents:
diff changeset
287 else:
45b12307c695 Initial revision
drewp
parents:
diff changeset
288 numlab['bg'] = 'red'
45b12307c695 Initial revision
drewp
parents:
diff changeset
289 else:
102
e04f7b552bcd - scroll wheel works everywhere
dmcc
parents: 101
diff changeset
290 numlab['bg'] = 'grey40'
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
291
107
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
292 # replace the elements in oldlevels - don't make a new list
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
293 # (Subediting is watching it)
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
294 self.oldlevels[:] = levels[:]
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
295
74
2dfae9ed1cda jostle feature, use it to shake levels mildly
dmcc
parents: 72
diff changeset
296 if self.jostle_mode:
2dfae9ed1cda jostle feature, use it to shake levels mildly
dmcc
parents: 72
diff changeset
297 delta = random.randrange(-1, 2, 1) # (-1, 0, or 1)
2dfae9ed1cda jostle feature, use it to shake levels mildly
dmcc
parents: 72
diff changeset
298 # print "delta", delta
2dfae9ed1cda jostle feature, use it to shake levels mildly
dmcc
parents: 72
diff changeset
299 levels = [min(100, max(x + delta, 0)) for x in levels]
2dfae9ed1cda jostle feature, use it to shake levels mildly
dmcc
parents: 72
diff changeset
300 # print "jostled", levels
2dfae9ed1cda jostle feature, use it to shake levels mildly
dmcc
parents: 72
diff changeset
301
112
afbdae5e1359 dmx light output is now via a separate process which light8 talks to.
drewp
parents: 107
diff changeset
302 self.dmxserver.outputlevels("light8-%s" %os.getpid(),[l/100 for l in levels])
afbdae5e1359 dmx light output is now via a separate process which light8 talks to.
drewp
parents: 107
diff changeset
303 # self.parportdmx.sendlevels(levels)
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
304
62
2f2eb802e93d stage shows levels now. aims have blue halo for easy recognition.
dmcc
parents: 61
diff changeset
305 def updatestagelevels(self):
2f2eb802e93d stage shows levels now. aims have blue halo for easy recognition.
dmcc
parents: 61
diff changeset
306 self.master.after(100, self.updatestagelevels)
2f2eb802e93d stage shows levels now. aims have blue halo for easy recognition.
dmcc
parents: 61
diff changeset
307 for lev, idx in zip(self.oldlevels, xrange(0, 68 + 1)):
2f2eb802e93d stage shows levels now. aims have blue halo for easy recognition.
dmcc
parents: 61
diff changeset
308 self.stage.updatelightlevel(Patch.get_channel_name(idx + 1), lev)
2f2eb802e93d stage shows levels now. aims have blue halo for easy recognition.
dmcc
parents: 61
diff changeset
309
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
310 def load(self):
45b12307c695 Initial revision
drewp
parents:
diff changeset
311 try:
45b12307c695 Initial revision
drewp
parents:
diff changeset
312 filename = '/tmp/light9.prefs'
45b12307c695 Initial revision
drewp
parents:
diff changeset
313 if self.DUMMY:
45b12307c695 Initial revision
drewp
parents:
diff changeset
314 filename += '.dummy'
102
e04f7b552bcd - scroll wheel works everywhere
dmcc
parents: 101
diff changeset
315 print "Light 8.8: Loading from", filename
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
316 file = open(filename, 'r')
45b12307c695 Initial revision
drewp
parents:
diff changeset
317 p = cPickle.load(file)
45b12307c695 Initial revision
drewp
parents:
diff changeset
318 for s, v in p.scalelevels.items():
45b12307c695 Initial revision
drewp
parents:
diff changeset
319 try:
45b12307c695 Initial revision
drewp
parents:
diff changeset
320 self.scalelevels[s].set(v)
45b12307c695 Initial revision
drewp
parents:
diff changeset
321 except Exception,e:
45b12307c695 Initial revision
drewp
parents:
diff changeset
322 print "Couldn't set %s -> %s: %s" % (s, v,e)
45b12307c695 Initial revision
drewp
parents:
diff changeset
323 for name, substate in p.substate.items():
45b12307c695 Initial revision
drewp
parents:
diff changeset
324 try:
45b12307c695 Initial revision
drewp
parents:
diff changeset
325 Subs.subs[name].set_state(substate)
45b12307c695 Initial revision
drewp
parents:
diff changeset
326 except Exception, e:
45b12307c695 Initial revision
drewp
parents:
diff changeset
327 print "Couldn't set sub %s state: %s" % (name,e)
45b12307c695 Initial revision
drewp
parents:
diff changeset
328 except IOError, e:
45b12307c695 Initial revision
drewp
parents:
diff changeset
329 print "IOError: Couldn't load prefs (%s): %s" % (filename,e)
45b12307c695 Initial revision
drewp
parents:
diff changeset
330 except EOFError, e:
45b12307c695 Initial revision
drewp
parents:
diff changeset
331 print "EOFrror: Couldn't load prefs (%s): %s" % (filename,e)
45b12307c695 Initial revision
drewp
parents:
diff changeset
332 except Exception,e:
45b12307c695 Initial revision
drewp
parents:
diff changeset
333 print "Couldn't load prefs (%s): %s" % (filename,e)
78
0969d8a6729d support for external sliders. fill in ExternalInput with real IO
dmcc
parents: 74
diff changeset
334 self.slidermapper.setup()
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
335
45b12307c695 Initial revision
drewp
parents:
diff changeset
336 def backgroundloop(self, *args):
56
2af6698b0566 pulled Lightboard out of rsn.py (and fixed all the dependency problems i could find)
drewp
parents: 0
diff changeset
337 self.master.after(50, self.backgroundloop, ())
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
338 self.changelevel()
45b12307c695 Initial revision
drewp
parents:
diff changeset
339 def quit(self, *args):
103
ddd3c8f04640 more untested code, ready for production: colors for slider mapping
dmcc
parents: 102
diff changeset
340 print "Light 8.8: And that's my cue to exit..."
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
341 self.save()
103
ddd3c8f04640 more untested code, ready for production: colors for slider mapping
dmcc
parents: 102
diff changeset
342 self.record_end()
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
343 self.master.destroy()
45b12307c695 Initial revision
drewp
parents:
diff changeset
344 sys.exit()
45b12307c695 Initial revision
drewp
parents:
diff changeset
345 def save(self, *args):
45b12307c695 Initial revision
drewp
parents:
diff changeset
346 filename = '/tmp/light9.prefs'
45b12307c695 Initial revision
drewp
parents:
diff changeset
347 if self.DUMMY:
45b12307c695 Initial revision
drewp
parents:
diff changeset
348 filename += '.dummy'
103
ddd3c8f04640 more untested code, ready for production: colors for slider mapping
dmcc
parents: 102
diff changeset
349 print "Light 8.8: Saving to", filename
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
350 file = open(filename, 'w')
67
0bf7e664f913 window pos saving
dmcc
parents: 62
diff changeset
351
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
352 try:
45b12307c695 Initial revision
drewp
parents:
diff changeset
353 cPickle.dump(Pickles(self.scalelevels, Subs.subs.items()), file)
45b12307c695 Initial revision
drewp
parents:
diff changeset
354 except cPickle.UnpickleableError:
45b12307c695 Initial revision
drewp
parents:
diff changeset
355 print "UnpickleableError! There's yer problem."
74
2dfae9ed1cda jostle feature, use it to shake levels mildly
dmcc
parents: 72
diff changeset
356 def toggle_jostle(self, *args):
2dfae9ed1cda jostle feature, use it to shake levels mildly
dmcc
parents: 72
diff changeset
357 self.jostle_mode = not self.jostle_mode
107
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
358 if self.jostle_mode:
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
359 print 'Light 8.8: Perhaps we can jost-le your memory?'
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
360 else:
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
361 print 'Light 8.8: He remembers! (jostle off)'
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
362 def nonzerosubs(self, *args):
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
363 print "Light 8.8: Active subs:"
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
364 for n, dv in self.scalelevels.items():
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
365 if dv.get() > 0:
47bda76f5236 backed up backuper
dmcc
parents: 104
diff changeset
366 print "%-.4f: %s" % (dv.get(), n)
103
ddd3c8f04640 more untested code, ready for production: colors for slider mapping
dmcc
parents: 102
diff changeset
367 def record_start(self):
ddd3c8f04640 more untested code, ready for production: colors for slider mapping
dmcc
parents: 102
diff changeset
368 print "Light 8.8: Recorder started"
ddd3c8f04640 more untested code, ready for production: colors for slider mapping
dmcc
parents: 102
diff changeset
369 self.rec_file.write("%s:\t%s\n" % (time(), "--- Start ---"))
ddd3c8f04640 more untested code, ready for production: colors for slider mapping
dmcc
parents: 102
diff changeset
370 self.record_stamp()
ddd3c8f04640 more untested code, ready for production: colors for slider mapping
dmcc
parents: 102
diff changeset
371 def record_end(self):
ddd3c8f04640 more untested code, ready for production: colors for slider mapping
dmcc
parents: 102
diff changeset
372 print "Light 8.8: Recorder shutdown"
ddd3c8f04640 more untested code, ready for production: colors for slider mapping
dmcc
parents: 102
diff changeset
373 self.rec_file.write("%s:\t%s\n" % (time(), "--- End ---"))
ddd3c8f04640 more untested code, ready for production: colors for slider mapping
dmcc
parents: 102
diff changeset
374 def record_stamp(self):
ddd3c8f04640 more untested code, ready for production: colors for slider mapping
dmcc
parents: 102
diff changeset
375 'Record the current submaster levels, continue this loop'
ddd3c8f04640 more untested code, ready for production: colors for slider mapping
dmcc
parents: 102
diff changeset
376 levels = []
ddd3c8f04640 more untested code, ready for production: colors for slider mapping
dmcc
parents: 102
diff changeset
377 for n, v in self.scalelevels.items():
ddd3c8f04640 more untested code, ready for production: colors for slider mapping
dmcc
parents: 102
diff changeset
378 lev = v.get()
ddd3c8f04640 more untested code, ready for production: colors for slider mapping
dmcc
parents: 102
diff changeset
379 if lev:
ddd3c8f04640 more untested code, ready for production: colors for slider mapping
dmcc
parents: 102
diff changeset
380 levels.append('%s\t%s' % (n, lev))
ddd3c8f04640 more untested code, ready for production: colors for slider mapping
dmcc
parents: 102
diff changeset
381
104
15ead14b4dd1 result of 7.13 performance, some ExtSliderMapper fixes
dmcc
parents: 103
diff changeset
382
15ead14b4dd1 result of 7.13 performance, some ExtSliderMapper fixes
dmcc
parents: 103
diff changeset
383 newdata = '\t'.join(levels)
15ead14b4dd1 result of 7.13 performance, some ExtSliderMapper fixes
dmcc
parents: 103
diff changeset
384 if newdata!=self.lastline:
15ead14b4dd1 result of 7.13 performance, some ExtSliderMapper fixes
dmcc
parents: 103
diff changeset
385 template = "%s:\t%s\n" % (time(), newdata)
15ead14b4dd1 result of 7.13 performance, some ExtSliderMapper fixes
dmcc
parents: 103
diff changeset
386 self.rec_file.write(template)
15ead14b4dd1 result of 7.13 performance, some ExtSliderMapper fixes
dmcc
parents: 103
diff changeset
387 self.lastline = newdata
103
ddd3c8f04640 more untested code, ready for production: colors for slider mapping
dmcc
parents: 102
diff changeset
388 self.master.after(100, self.record_stamp)
ddd3c8f04640 more untested code, ready for production: colors for slider mapping
dmcc
parents: 102
diff changeset
389 def highlight_sub(self, name, color):
ddd3c8f04640 more untested code, ready for production: colors for slider mapping
dmcc
parents: 102
diff changeset
390 self.subediting.colorsub(name, color)