Mercurial > code > home > repos > light9
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) |