comparison light8/rsn.py @ 56:2af6698b0566

pulled Lightboard out of rsn.py (and fixed all the dependency problems i could find) pulled Lightboard out of rsn.py (and fixed all the dependency problems i could find) made some exceptions print better
author drewp
date Tue, 09 Jul 2002 05:28:21 +0000
parents 3011c1028eb7
children eaf60f5dce86
comparison
equal deleted inserted replaced
55:5e8c505bcc2c 56:2af6698b0566
11 from panels import * 11 from panels import *
12 from Xfader import * 12 from Xfader import *
13 from subediting import Subediting 13 from subediting import Subediting
14 from Fader import Fader 14 from Fader import Fader
15 import stage 15 import stage
16 from Lightboard import Lightboard
17
18 import Subs, Patch
19
20
16 21
17 if len(sys.argv) >= 2: 22 if len(sys.argv) >= 2:
18 DUMMY = 0 23 DUMMY = 0
19 print "This is the real thing, baby" 24 print "This is the real thing, baby"
20 window_title = "Light 8.8 (On Air)" 25 window_title = "Light 8.8 (On Air)"
26 root = Tk() 31 root = Tk()
27 root.wm_title(window_title) 32 root.wm_title(window_title)
28 root.wm_geometry('+462+470') 33 root.wm_geometry('+462+470')
29 root.tk_focusFollowsMouse() 34 root.tk_focusFollowsMouse()
30 35
31 import Subs, Patch
32
33 def get_data(*args):
34 Subs.reload_data(DUMMY)
35 Patch.reload_data(DUMMY)
36 print "Patch:", Patch.patch
37 print "Subs:", ', '.join(Subs.subs.keys())
38
39 get_data()
40 36
41 parportdmx = io.ParportDMX(DUMMY) 37 parportdmx = io.ParportDMX(DUMMY)
42 38
43 class Lightboard: 39 mr_lightboard = Lightboard(root,parportdmx,DUMMY)
44 def __init__(self, master):
45 self.master = master
46
47 self.channel_levels = []
48 self.scalelevels = {}
49 self.xfader = Xfader(self.scalelevels) # doesn't draw any UI yet-- look for self.xfader.setupwidget()
50 self.oldlevels = [None] * 68 # never replace this; just clear it
51 self.subediting = Subediting(currentoutputlevels=self.oldlevels)
52
53 self.buildinterface()
54 self.load()
55 self.backgroundloop()
56
57 def buildinterface(self):
58 global DUMMY
59 for w in self.master.winfo_children():
60 w.destroy()
61
62 stage_tl = toplevelat(22,30)
63 s = stage.Stage(stage_tl)
64 stage.createlights(s)
65 s.setsubediting(self.subediting)
66 s.pack()
67
68 sub_tl = toplevelat(0,0)
69 effect_tl = toplevelat(462,4)
70
71 self.subpanels = Subpanels(sub_tl, effect_tl, self, self.scalelevels,
72 Subs, self.xfader, self.changelevel,
73 self.subediting, Subs.longestsubname())
74
75 leveldisplay_tl = toplevelat(873,400)
76 leveldisplay_tl.bind('<Escape>', sys.exit)
77
78 self.leveldisplay = Leveldisplay(leveldisplay_tl, self.channel_levels)
79 for i in range(0,len(self.channel_levels)):
80 self.channel_levels[i].config(text=self.oldlevels[i])
81 colorlabel(self.channel_levels[i])
82
83 Console(self)
84
85 # root frame
86 controlpanel = Controlpanel(root, self.xfader, self.refresh, self.quit)
87
88 xf=Frame(root)
89 xf.pack(side='right')
90
91 root.bind('<q>', self.quit)
92 root.bind('<r>', self.refresh)
93 leveldisplay_tl.bind('<q>', self.quit)
94 leveldisplay_tl.bind('<r>', self.refresh)
95
96 self.xfader.setupwidget(xf)
97 controlpanel.pack()
98
99 cuefader_tl = toplevelat(78, 480)
100 cuefader = Fader(cuefader_tl, Subs.cues, self.scalelevels)
101 cuefader.pack()
102
103 def refresh(self, *args):
104 'rebuild interface, reload data'
105 get_data()
106 self.subediting.refresh()
107 self.buildinterface()
108 bindkeys(root,'<Escape>', self.quit)
109
110 def stageassub(self):
111 """returns the current onstage lighting as a levels
112 dictionary, skipping the zeros, and using names where
113 possible"""
114 levs=self.oldlevels
115
116 return dict([(Patch.get_channel_name(i),l) for i,l
117 in zip(range(1,len(levs)+1),levs)
118 if l>0])
119 def save_sub(self, name, levels):
120 if not name:
121 print "Enter sub name in console."
122 return
123
124 st = ''
125 linebuf = 'subs["%s"] = {' % name
126 for channame,lev in levels.items():
127 if len(linebuf) > 60:
128 st += linebuf + '\n '
129 linebuf = ''
130
131 linebuf += ' "%s" : %d,' % (channame, lev)
132 st += linebuf + '}\n'
133 if DUMMY:
134 filename = 'ConfigDummy.py'
135 else:
136 filename = 'Config.py'
137 f = open(filename, 'a')
138 f.write(st)
139 f.close()
140 print 'Added sub:', st
141 self.refresh()
142
143 # this is called on a loop, and ALSO by the Scales
144 def changelevel(self, *args):
145 'Amp trims slider'
146
147 levels = [0] * 68
148 for name, s in Subs.subs.items():
149 newlevels = s.get_levels(level=self.scalelevels[name].get())
150 for (ch, fadelev) in newlevels.items():
151 levels[ch-1] = max(levels[ch-1], fadelev)
152
153 levels = [int(l) for l in levels]
154
155 for lev,lab,oldlev,numlab in zip(levels, self.channel_levels,
156 self.oldlevels,
157 self.leveldisplay.number_labels):
158 if lev != oldlev:
159 lab.config(text="%d" % lev)
160 colorlabel(lab)
161 if lev < oldlev:
162 numlab['bg'] = 'blue'
163 else:
164 numlab['bg'] = 'red'
165 else:
166 numlab['bg'] = 'lightPink'
167
168 self.oldlevels[:] = levels[:] # replace the elements in oldlevels - don't make a new list (Subediting is watching it)
169
170 parportdmx.sendlevels(levels)
171
172 def load(self):
173 try:
174 filename = '/tmp/light9.prefs'
175 if DUMMY:
176 filename += '.dummy'
177 print "Loading from", filename
178 file = open(filename, 'r')
179 p = cPickle.load(file)
180 for s, v in p.scalelevels.items():
181 try:
182 self.scalelevels[s].set(v)
183 except:
184 print "Couldn't set %s -> %s" % (s, v)
185 for name, substate in p.substate.items():
186 try:
187 Subs.subs[name].set_state(substate)
188 except:
189 print "Couldn't set sub %s state" % name
190 except IOError:
191 print "IOError: Couldn't load prefs (%s)" % filename
192 except EOFError:
193 print "EOFrror: Couldn't load prefs (%s)" % filename
194 except:
195 print "BigTrouble: Couldn't load prefs (%s)" % filename
196
197 def backgroundloop(self, *args):
198 self.master.after(50, self.backgroundloop, ())
199 self.changelevel()
200 def quit(self, *args):
201 self.save()
202 root.destroy()
203 sys.exit()
204 def save(self, *args):
205 filename = '/tmp/light9.prefs'
206 if DUMMY:
207 filename += '.dummy'
208 print "Saving to", filename
209 file = open(filename, 'w')
210 try:
211 cPickle.dump(Pickles(self.scalelevels, Subs.subs.items()), file)
212 except cPickle.UnpickleableError:
213 print "UnpickleableError! There's yer problem."
214
215 class Pickles:
216 def __init__(self, scalelevels, subs=None):
217 self.scalelevels = dict([(name, lev.get())
218 for name, lev in scalelevels.items()])
219 self.substate = dict([(name, subobj.get_state())
220 for name, subobj in subs])
221 # print "substate", self.substate
222
223 mr_lightboard = Lightboard(root)
224 40
225 signal(SIGINT, mr_lightboard.quit) 41 signal(SIGINT, mr_lightboard.quit)
226 bindkeys(root,'<Escape>', mr_lightboard.quit) 42 bindkeys(root,'<Escape>', mr_lightboard.quit)
227 43
228 root.mainloop() # Receiver switches main 44 root.mainloop() # Receiver switches main