annotate light8/Lightboard.py @ 2405:69ca2b2fc133

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