comparison light8/rsn.py @ 4:f974a462133f

added light8 from the posted light8-1.0.tgz
author drewp
date Sun, 07 Jul 2002 01:16:10 +0000
parents 45b12307c695
children 7adc65771676
comparison
equal deleted inserted replaced
3:8856efb6516c 4:f974a462133f
1 #!/usr/bin/python 1 #!/usr/bin/env python
2 from __future__ import nested_scopes 2 from __future__ import nested_scopes
3 3
4 from Tix import * 4 from Tkinter import *
5 from signal import signal, SIGINT 5 from parport import *
6 from uihelpers import * 6 from time import sleep
7 from Fader import Fader 7 from signal import *
8 from Lightboard import Lightboard 8 import sys, thread, cPickle
9 import time # time is on our side 9
10 from Xfader import *
10 11
11 if len(sys.argv) >= 2: 12 if len(sys.argv) >= 2:
12 DUMMY = 0 13 DUMMY = 0
13 print "Light 8.8: This is the real thing, baby" 14 print "This is the real thing, baby"
14 window_title = "Light 8.8 (On Air)" 15 window_title = "Light 8.8 (On Air)"
15 else: 16 else:
16 DUMMY = 1 17 DUMMY = 1
17 print "Light 8.8: Dummy mode" 18 print "Dummy mode"
18 window_title = "Light 8.8 (Bogus)" 19 window_title = "Light 8.8 (Bogus)"
19 20
20 root = Tk() 21 root = Tk()
21 root.wm_title(window_title) 22 root.wm_title(window_title)
22 root.wm_geometry('+462+470') 23 root.wm_geometry('+447+373')
23 root.tk_focusFollowsMouse() 24
24 25 import Subs, Patch
26
27 def get_data(*args):
28 Subs.reload_data(DUMMY)
29 Patch.reload_data(DUMMY)
30 print "Patch:", Patch.patch
31 print "Subs:", ', '.join(Subs.subs.keys())
32
33 get_data()
25 34
26 if not DUMMY: 35 if not DUMMY:
27 # this turns the parportdmx from dummy to live 36 getparport()
28 print "Light 8.8: Preparing DMX interface..." 37
29 parportdmx.golive() 38 def sendlevels(levels):
30 39 if DUMMY: return
31 print "Light 8.8: And this...is Mr. Lightboard" 40 levels = list(levels) + [0]
32 mr_lightboard = Lightboard(root,DUMMY) 41 if levels[14] > 0: levels[14] = 100
33 # root.tk_setPalette('gray40') 42 # print "levels", ' '.join(["%3.1f" % l for l in levels])
34 43 outstart()
35 signal(SIGINT, mr_lightboard.quit) 44 for p in range(1,70):
36 45 outbyte(levels[p-1]*255/100)
37 # 46
38 # start net slider server in separate thread 47 channel_levels = []
39 # 48 scalelevels = {}
40 print "Light 8.8: External input server DELETED!" 49 fades = {}
41 #import ExternalInput, thread 50 stdfont = ('Arial', 8)
42 #thread.start_new_thread(ExternalInput.start_server,()) 51 monofont = ('Courier', 8)
43 52
44 bindkeys(root,'<Escape>', mr_lightboard.quit) 53 def colorlabel(label):
45 54 txt=label['text'] or "0"
46 root.bind_class("all","<ButtonPress-4>",lambda ev: eventtoparent(ev,"<ButtonPress-4>")) 55 lev=float(txt)/100
47 root.bind_class("all","<ButtonPress-5>",lambda ev: eventtoparent(ev,"<ButtonPress-5>")) 56 low=(80,80,180)
48 57 high=(255,55,050)
49 print 'Light 8.8: "Uh...Shiny McShine?"' 58 out = [int(l+lev*(h-l)) for h,l in zip(high,low)]
50 root.update_idletasks() 59 col="#%02X%02X%02X" % tuple(out)
51 60 label.config(bg=col)
52 if 1: 61
53 while 1: 62 _oldlevels=[None] * 68
54 root.update() # Receiver switches main 63
55 time.sleep(0.01) 64 def changelevel(*args):
56 else: 65 'Amp trims slider'
57 sys.path.append("/home/drewp/projects/editor/pour") 66 global _oldlevels
58 from utils import runstats 67
59 runstats("root.mainloop()") 68 levels = [0] * 68
60 69 for name, s in Subs.subs.items():
61 #import profile 70 newlevels = s.get_levels(level=scalelevels[name].get())
62 #profile.run("root.mainloop()","profile/idlemanysubs") 71 for (ch, fadelev) in newlevels.items():
72 levels[ch-1] = max(levels[ch-1], fadelev)
73
74 levels = [int(l) for l in levels]
75
76 for lev,lab,oldlev in zip(levels, channel_levels, _oldlevels):
77 if lev != oldlev:
78 lab.config(text="%d" % lev)
79 colorlabel(lab)
80
81 _oldlevels = levels[:]
82
83 sendlevels(levels)
84
85 def backgroundloop(*args):
86 root.after(50, backgroundloop, ())
87 changelevel()
88
89 def make_frame(parent):
90 f = Frame(parent, bd=0)
91 f.pack(side='left')
92 return f
93
94 def add_fade(slider, evt):
95 print 'b3!'
96
97 def execute(evt, str):
98 if str[0] == '*': # make a new sub
99 make_sub(str)
100 else:
101 print '>>>', str
102 print eval(str)
103 console_frame.focus()
104
105 def console():
106 global console_entry, console_frame
107 print "Light 8: Everything's under control"
108 t=Toplevel(root)
109 console_frame = Frame(t)
110 console_entry=Entry(console_frame)
111 console_entry.pack(expand=1, fill='x')
112 console_entry.bind('<Return>', lambda evt: execute(evt,
113 console_entry.get()))
114 console_frame.pack(fill=BOTH, expand=1)
115 t.wm_geometry("599x19+267+717")
116
117 buildinterface = None # temporary
118 def refresh(*args):
119 get_data()
120 buildinterface()
121 bindkeys('<Escape>', quit)
122
123 def quit(*args):
124 filename = '/tmp/light9.prefs'
125 if DUMMY:
126 filename += '.dummy'
127 print "Saving to", filename
128 file = open(filename, 'w')
129 cPickle.dump(Pickles(scalelevels), file)
130 root.destroy()
131 sys.exit()
132
133 def bindkeys(key, func):
134 root.bind(key, func)
135 for w in root.winfo_children():
136 w.bind(key, func)
137
138
139 def toggle_slider(s):
140 if s.get() == 0:
141 s.set(100)
142 else:
143 s.set(0)
144 def printout(t):
145 print t
146
147 xfader=Xfader(scalelevels)
148
149 def buildinterface(*args):
150 global channel_levels, _oldlevels, leveldisplay, stdfont, monofnt, xfader
151 for w in root.winfo_children():
152 w.destroy()
153
154 sublist = Subs.subs.items()
155 sublist.sort()
156
157 sub_tl = Toplevel()
158 sub_tl.wm_geometry("+0+0")
159 effect_tl = Toplevel()
160 effect_tl.wm_geometry("+0+352")
161
162 for name, sub in sublist:
163 if sub.is_effect:
164 f=Frame(effect_tl, bd=1, relief='raised')
165 else:
166 f=Frame(sub_tl, bd=1, relief='raised')
167
168 f.pack(fill='both',exp=1,side='left')
169
170 if name not in scalelevels:
171 scalelevels[name]=DoubleVar()
172
173 sub.set_slider_var(scalelevels[name])
174
175 scaleopts = {}
176 if sub.color:
177 scaleopts['troughcolor'] = sub.color
178 s=Scale(f,command=lambda l,name=name: changelevel(name,l),showvalue=0,
179 length=300-17,variable=scalelevels[name],width=20,
180 to=0,res=.001,from_=1,bd=1, **scaleopts)
181 l=Label(f,text=str(name), font=stdfont, padx=0, pady=0)
182 v=Label(f,textvariable=scalelevels[name], font=stdfont, padx=0, pady=0)
183 l.pack(side='bottom')
184 v.pack(side='bottom')
185
186 for axis in ('y','x'):
187 cvar=IntVar()
188 cb=Checkbutton(f,text=axis,variable=cvar,font=stdfont, padx=0, pady=0, bd=1)
189 button = ('Alt','Control')[axis=='y'] # unused?
190 # s.bind('<Key-%s>'%axis, lambda ev,cb=cb: cb.invoke)
191 cb.pack(side='bottom',fill='both', padx=0, pady=0)
192 xfader.registerbutton(name,axis,cvar)
193
194 s.pack(side='left')
195 s.bind('<3>', lambda evt, v=scalelevels[name]: toggle_slider(v))\
196
197 sframe = Frame(f,bd=2,relief='groove')
198 sub.draw_tk(sframe)
199 sframe.pack(side='left',fill='y')
200
201 # def event_printer(evt):
202 # print dir(evt)
203
204 # sub_tl.bind('<b>', event_printer)
205 leveldisplay=Toplevel(root)
206 leveldisplay.bind('<Escape>', sys.exit)
207 leveldisplay.wm_geometry('+873+400')
208 frames = (make_frame(leveldisplay), make_frame(leveldisplay))
209 channel_levels=[]
210 for channel in range(1, 69):
211 f=Frame(frames[channel > 34])
212 Label(f,text=str(channel), width=3, bg='lightPink',
213 font=stdfont, padx=0, pady=0, bd=0, height=1).pack(side='left')
214 Label(f,text=Patch.get_channel_name(channel), width=8,
215 font=stdfont, anchor='w', padx=0, pady=0, bd=0, height=1).pack(side='left')
216 l=Label(f,text=_oldlevels[channel-1], width=3, bg='lightBlue',
217 font=stdfont, anchor='e', padx=1, pady=0, bd=0, height=1)
218 l.pack(side='left')
219 colorlabel(l)
220 channel_levels.append(l)
221 f.pack(side='top')
222
223 console()
224
225 # root frame
226 controlpanel = Frame(root)
227 xf=Frame(controlpanel)
228 xf.pack(side='right')
229 for txt,cmd in (
230 ('Quit', quit),
231 ('Refresh', refresh),
232 ('Clear all', xfader.clearallbuttons),
233 ('On -> X', lambda: xfader.grab('x')),
234 ('Clear X', lambda: xfader.clearallbuttons('x')),
235 ('On -> Y', lambda: xfader.grab('y')),
236 ('Clear Y', lambda: xfader.clearallbuttons('y'))):
237 Button(controlpanel, text=txt, command=cmd).pack(side='top', fill='x')
238
239 # Button(controlpanel, text='Quit', command=quit).pack(side='left')
240 # Button(controlpanel, text='Refresh', command=refresh).pack(side='left')
241 # Button(controlpanel, text='Clearxfade', command=xfader.clearallbuttons).pack(side='left')
242 # Button(controlpanel, text='Grab x', command=lambda: xfader.grab('x')).pack(side='left')
243 # Button(controlpanel, text='Grab y', command=lambda: xfader.grab('y')).pack(side='left')
244
245 root.bind('<q>', quit)
246 root.bind('<r>', refresh)
247 leveldisplay.bind('<q>', quit)
248 leveldisplay.bind('<r>', refresh)
249
250 xfader.setupwidget(xf)
251 controlpanel.pack()
252
253 buildinterface()
254
255 class Pickles:
256 def __init__(self, scalelevels):
257 self.scalelevels = dict([(name, lev.get())
258 for name,lev in scalelevels.items()])
259
260 def load():
261 try:
262 filename = '/tmp/light9.prefs'
263 if DUMMY:
264 filename += '.dummy'
265 print "Loading from", filename
266 file = open(filename, 'r')
267 p = cPickle.load(file)
268 for s, v in p.scalelevels.items():
269 try:
270 scalelevels[s].set(v)
271 except:
272 print "Couldn't set %s -> %s" % (s, v)
273 except:
274 print "Couldn't load prefs (%s)" % filename
275
276 def make_sub(name):
277 global _oldlevels
278 i = 1
279 # name = console_entry.get() # read from console
280 if not name:
281 print "Enter sub name in console."
282 return
283
284 st = ''
285 linebuf = 'subs["%s"] = {' % name
286 for l in _oldlevels:
287 if l:
288 if len(linebuf) > 60:
289 st += linebuf + '\n '
290 linebuf = ''
291
292 linebuf += ' "%s" : %d,' % (Patch.get_channel_name(i), l)
293 i += 1
294 st += linebuf + '}\n'
295 if DUMMY:
296 filename = 'ConfigDummy.py'
297 else:
298 filename = 'Config.py'
299 f = open(filename, 'a')
300 f.write(st)
301 f.close()
302 print 'Added sub:', st
303 refresh()
304
305 load()
306 signal(SIGINT, quit)
307 bindkeys('<Escape>', quit)
308
309 # bindkeys('<q>', quit)
310 # bindkeys('<r>', refresh)
311 # bindkeys('<s>', make_sub)
312 backgroundloop()
313 root.mainloop() # Receiver switches main
314
315 while 1:
316 for lev in range(0,255,25)+range(255,0,-25):
317 sleep(.2)