Mercurial > code > home > repos > light9
changeset 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 | 5e8c505bcc2c |
children | eaf60f5dce86 |
files | light8/Lightboard.py light8/rsn.py |
diffstat | 2 files changed, 47 insertions(+), 415 deletions(-) [+] |
line wrap: on
line diff
--- a/light8/Lightboard.py Mon Jul 08 15:53:29 2002 +0000 +++ b/light8/Lightboard.py Tue Jul 09 05:28:21 2002 +0000 @@ -1,115 +1,74 @@ -from __future__ import nested_scopes,division +from __future__ import nested_scopes from Tix import * +from time import sleep from signal import signal, SIGINT -from time import time -import sys, cPickle, random +import sys, cPickle +import io from uihelpers import * from panels import * from Xfader import * from subediting import Subediting from Fader import Fader -from ExternalInput import ExternalSliders -import io, stage, Subs, Patch, ExtSliderMapper -import dmxclient +import stage +import Subs, Patch class Pickles: - def __init__(self, scalelevels, subs=None, windowpos=None): + def __init__(self, scalelevels, subs=None): self.scalelevels = dict([(name, lev.get()) for name, lev in scalelevels.items()]) self.substate = dict([(name, subobj.get_state()) for name, subobj in subs]) - self.windowpos = windowpos + # print "substate", self.substate class Lightboard: - def __init__(self, master, DUMMY): + def __init__(self, master, parportdmx, DUMMY): self.master = master - + self.parportdmx = parportdmx self.DUMMY = DUMMY - self.jostle_mode = 0 - self.lastline = None - self.channel_levels = [] # these are actually the labels for the - # channel levels, and should probably be moved - # to panels.Leveldisplay + self.channel_levels = [] self.scalelevels = {} - - self.lastsublevels = {} # to determine which subs changed - self.unchangedeffect = {} # dict of levels for lights that didn't - # change last time - self.lastunchangedgroup = {} - - # doesn't draw any UI yet-- look for self.xfader.setupwidget() - self.xfader = Xfader(self.scalelevels) + self.xfader = Xfader(self.scalelevels) # doesn't draw any UI yet-- look for self.xfader.setupwidget() self.oldlevels = [None] * 68 # never replace this; just clear it self.subediting = Subediting(currentoutputlevels=self.oldlevels) - self.windowpos = 0 self.get_data() self.buildinterface() self.load() - - print "Light 8.8: Entering backgroundloop" self.backgroundloop() - self.updatestagelevels() - self.rec_file = open('light9.log', 'a') - self.record_start() def buildinterface(self): - print "Light 8.8: Constructing interface..." for w in self.master.winfo_children(): w.destroy() - print "\tstage" - stage_tl = toplevelat('stage') + stage_tl = toplevelat(22,30) s = stage.Stage(stage_tl) stage.createlights(s) s.setsubediting(self.subediting) s.pack() - self.stage = s # save it - sub_tl = toplevelat('sub') - scene_tl = toplevelat('scenes') - effect_tl = toplevelat('effect') + sub_tl = toplevelat(0,0) + effect_tl = toplevelat(462,4) - print "\tslider patching -- It can't be turned off!" - mapping_tl = toplevelat('mapping') - self.slidermapper = ExtSliderMapper.ExtSliderMapper(mapping_tl, - self.scalelevels, - ExternalSliders(), - self) - self.slidermapper.pack() + self.subpanels = Subpanels(sub_tl, effect_tl, self, self.scalelevels, + Subs, self.xfader, self.changelevel, + self.subediting, Subs.longestsubname()) - print "\tsubmaster control" - self.subpanels = Subpanels(sub_tl, effect_tl, scene_tl, self, - self.scalelevels, Subs, self.xfader, - self.changelevel, self.subediting, - Subs.longestsubname()) - - for n, lev in self.scalelevels.items(): - self.lastsublevels[n] = lev.get() - - print "\tlevel display" - leveldisplay_tl = toplevelat('leveldisplay') + leveldisplay_tl = toplevelat(873,400) leveldisplay_tl.bind('<Escape>', sys.exit) self.leveldisplay = Leveldisplay(leveldisplay_tl, self.channel_levels) - # I don't think we need this - # for i in range(0,len(self.channel_levels)): - # self.channel_levels[i].config(text=self.oldlevels[i]) - # colorlabel(self.channel_levels[i]) + for i in range(0,len(self.channel_levels)): + self.channel_levels[i].config(text=self.oldlevels[i]) + colorlabel(self.channel_levels[i]) - print "\tconsole" Console(self) # root frame - print "\tcontrol panel" - self.master.configure(bg='black') - controlpanel = Controlpanel(self.master, self.xfader, self.refresh, - self.quit, self.toggle_jostle, self.nonzerosubs) + controlpanel = Controlpanel(self.master, self.xfader, self.refresh, self.quit) - print "\tcrossfader" xf=Frame(self.master) xf.pack(side='right') @@ -121,32 +80,22 @@ self.xfader.setupwidget(xf) controlpanel.pack() - print "\tcue fader (skipped)" - # cuefader_tl = toplevelat('cuefader') - # cuefader = Fader(cuefader_tl, Subs.cues, self.scalelevels) - # cuefader.pack() - print "Light 8.8: Everything's under control" - + cuefader_tl = toplevelat(78, 480) + cuefader = Fader(cuefader_tl, Subs.cues, self.scalelevels) + cuefader.pack() def get_data(self,*args): Subs.reload_data(self.DUMMY) Patch.reload_data(self.DUMMY) - print "Light 8.8:", len(Patch.patch), "dimmers patched" - print "Light 8.8:", len(Subs.subs), "submasters loaded" + print "Patch:", Patch.patch + print "Subs:", ', '.join(Subs.subs.keys()) def refresh(self, *args): 'rebuild interface, reload data' - print "Light 8.8: Refresh initiated. Cross your fingers." self.get_data() - print "Light 8.8: Subediting refreshed" self.subediting.refresh() - print "Light 8.8: Rebuilding interface..." self.buildinterface() bindkeys(self.master,'<Escape>', self.quit) - print "Light 8.8: Setting up slider patching..." - self.slidermapper.setup() - # self.master.tk_setPalette('gray40') - print "Light 8.8: Now back to your regularly scheduled Light 8" def stageassub(self): """returns the current onstage lighting as a levels @@ -157,7 +106,7 @@ return dict([(Patch.get_channel_name(i),l) for i,l in zip(range(1,len(levs)+1),levs) if l>0]) - def save_sub(self, name, levels, refresh=1): + def save_sub(self, name, levels): if not name: print "Enter sub name in console." return @@ -179,137 +128,43 @@ f.write(st) f.close() print 'Added sub:', st - if refresh: - self.refresh() + self.refresh() # this is called on a loop, and ALSO by the Scales def changelevel(self, *args): 'Amp trims slider' - # load levels from external sliders - extlevels = self.slidermapper.get_levels() - for name, val in extlevels.items(): - if name in self.scalelevels: - sl = self.scalelevels[name] - sl.set(val) - - # newstart = time() - - # learn what changed - unchangedgroup = {} - changedgroup = {} - for name, lastlevel in self.lastsublevels.items(): - newlevel = self.scalelevels[name].get() - if lastlevel != newlevel: - changedgroup[name] = newlevel - else: - unchangedgroup[name] = newlevel - - changedeffect = {} - if not changedgroup: - # should load levels from last time - pass - else: - # calculate effect of new group. this should take no time if - # nothing changed - for name, level in changedgroup.items(): - newlevels = Subs.subs[name].get_levels(level=level) - for (ch, fadelev) in newlevels.items(): - changedeffect[ch-1] = \ - max(changedeffect.get(ch-1, 0), fadelev) - - if unchangedgroup != self.lastunchangedgroup: - # unchanged group changed! (confusing, huh?) - # this means: the static subs from the last time are not the same - # as they are this time, so we recalculate effect of unchanged group - self.unchangedeffect = {} - for name, level in unchangedgroup.items(): - newlevels = Subs.subs[name].get_levels(level=level) - for (ch, fadelev) in newlevels.items(): - self.unchangedeffect[ch-1] = \ - max(self.unchangedeffect.get(ch-1, 0), fadelev) - self.lastunchangedgroup = unchangedgroup - - # record sublevels for future generations (iterations, that is) - for name in self.lastsublevels: - self.lastsublevels[name] = self.scalelevels[name] - - # merge effects together - levels = [0] * 68 - if changedeffect: - levels = [int(max(changedeffect.get(ch, 0), - self.unchangedeffect.get(ch, 0))) - for ch in range(0, 68)] - else: - levels = [int(self.unchangedeffect.get(ch, 0)) - for ch in range(0, 68)] - - ''' - newend = time() - - levels_opt = levels - - oldstart = time() - # i tried to optimize this to a dictionary, but there was no speed - # improvement levels = [0] * 68 for name, s in Subs.subs.items(): - sublevel = self.scalelevels[name].get() - newlevels = s.get_levels(level=sublevel) - self.lastsublevels[name] = sublevel # XXX remove + newlevels = s.get_levels(level=self.scalelevels[name].get()) for (ch, fadelev) in newlevels.items(): levels[ch-1] = max(levels[ch-1], fadelev) - levels = [int(l) for l in levels] - oldend = time() - newtime = newend - newstart - oldtime = oldend - oldstart - print "new", newtime, 'old', (oldend - oldstart), 'sup', \ - oldtime / newtime - - if levels != levels_opt: - raise "not equal" - # for l, lo in zip(levels, levels_opt): - # print l, lo - ''' - + levels = [int(l) for l in levels] + for lev,lab,oldlev,numlab in zip(levels, self.channel_levels, self.oldlevels, self.leveldisplay.number_labels): if lev != oldlev: - lab.config(text="%d" % lev) # update labels in lev display - colorlabel(lab) # recolor labels + lab.config(text="%d" % lev) + colorlabel(lab) if lev < oldlev: numlab['bg'] = 'blue' else: numlab['bg'] = 'red' else: - numlab['bg'] = 'grey40' + numlab['bg'] = 'lightPink' - # replace the elements in oldlevels - don't make a new list - # (Subediting is watching it) - self.oldlevels[:] = levels[:] + self.oldlevels[:] = levels[:] # replace the elements in oldlevels - don't make a new list (Subediting is watching it) - if self.jostle_mode: - delta = random.randrange(-1, 2, 1) # (-1, 0, or 1) - # print "delta", delta - levels = [min(100, max(x + delta, 0)) for x in levels] - # print "jostled", levels - - dmxclient.outputlevels([l/100 for l in levels]) -# self.parportdmx.sendlevels(levels) - - def updatestagelevels(self): - self.master.after(100, self.updatestagelevels) - for lev, idx in zip(self.oldlevels, xrange(0, 68 + 1)): - self.stage.updatelightlevel(Patch.get_channel_name(idx + 1), lev) + self.parportdmx.sendlevels(levels) def load(self): try: filename = '/tmp/light9.prefs' if self.DUMMY: filename += '.dummy' - print "Light 8.8: Loading from", filename + print "Loading from", filename file = open(filename, 'r') p = cPickle.load(file) for s, v in p.scalelevels.items(): @@ -328,60 +183,21 @@ print "EOFrror: Couldn't load prefs (%s): %s" % (filename,e) except Exception,e: print "Couldn't load prefs (%s): %s" % (filename,e) - self.slidermapper.setup() def backgroundloop(self, *args): - self.master.after(150, self.backgroundloop, ()) + self.master.after(50, self.backgroundloop, ()) self.changelevel() def quit(self, *args): - print "Light 8.8: And that's my cue to exit..." self.save() - self.record_end() self.master.destroy() sys.exit() def save(self, *args): filename = '/tmp/light9.prefs' if self.DUMMY: filename += '.dummy' - print "Light 8.8: Saving to", filename + print "Saving to", filename file = open(filename, 'w') - try: cPickle.dump(Pickles(self.scalelevels, Subs.subs.items()), file) except cPickle.UnpickleableError: print "UnpickleableError! There's yer problem." - def toggle_jostle(self, *args): - self.jostle_mode = not self.jostle_mode - if self.jostle_mode: - print 'Light 8.8: Perhaps we can jost-le your memory?' - else: - print 'Light 8.8: He remembers! (jostle off)' - def nonzerosubs(self, *args): - print "Light 8.8: Active subs:" - for n, dv in self.scalelevels.items(): - if dv.get() > 0: - print "%-.4f: %s" % (dv.get(), n) - def record_start(self): - print "Light 8.8: Recorder started" - self.rec_file.write("%s:\t%s\n" % (time(), "--- Start ---")) - self.record_stamp() - def record_end(self): - print "Light 8.8: Recorder shutdown" - self.rec_file.write("%s:\t%s\n" % (time(), "--- End ---")) - def record_stamp(self): - 'Record the current submaster levels, continue this loop' - levels = [] - for n, v in self.scalelevels.items(): - lev = v.get() - if lev: - levels.append('%s\t%s' % (n, lev)) - - - newdata = '\t'.join(levels) - if newdata!=self.lastline: - template = "%s:\t%s\n" % (time(), newdata) - self.rec_file.write(template) - self.lastline = newdata - self.master.after(100, self.record_stamp) - def highlight_sub(self, name, color): - self.subediting.colorsub(name, color)
--- a/light8/rsn.py Mon Jul 08 15:53:29 2002 +0000 +++ b/light8/rsn.py Tue Jul 09 05:28:21 2002 +0000 @@ -13,6 +13,11 @@ from subediting import Subediting from Fader import Fader import stage +from Lightboard import Lightboard + +import Subs, Patch + + if len(sys.argv) >= 2: DUMMY = 0 @@ -28,199 +33,10 @@ root.wm_geometry('+462+470') root.tk_focusFollowsMouse() -import Subs, Patch - -def get_data(*args): - Subs.reload_data(DUMMY) - Patch.reload_data(DUMMY) - print "Patch:", Patch.patch - print "Subs:", ', '.join(Subs.subs.keys()) - -get_data() parportdmx = io.ParportDMX(DUMMY) -class Lightboard: - def __init__(self, master): - self.master = master - - self.channel_levels = [] - self.scalelevels = {} - self.xfader = Xfader(self.scalelevels) # doesn't draw any UI yet-- look for self.xfader.setupwidget() - self.oldlevels = [None] * 68 # never replace this; just clear it - self.subediting = Subediting(currentoutputlevels=self.oldlevels) - - self.buildinterface() - self.load() - self.backgroundloop() - - def buildinterface(self): - global DUMMY - for w in self.master.winfo_children(): - w.destroy() - - stage_tl = toplevelat(22,30) - s = stage.Stage(stage_tl) - stage.createlights(s) - s.setsubediting(self.subediting) - s.pack() - - sub_tl = toplevelat(0,0) - effect_tl = toplevelat(462,4) - - self.subpanels = Subpanels(sub_tl, effect_tl, self, self.scalelevels, - Subs, self.xfader, self.changelevel, - self.subediting, Subs.longestsubname()) - - leveldisplay_tl = toplevelat(873,400) - leveldisplay_tl.bind('<Escape>', sys.exit) - - self.leveldisplay = Leveldisplay(leveldisplay_tl, self.channel_levels) - for i in range(0,len(self.channel_levels)): - self.channel_levels[i].config(text=self.oldlevels[i]) - colorlabel(self.channel_levels[i]) - - Console(self) - - # root frame - controlpanel = Controlpanel(root, self.xfader, self.refresh, self.quit) - - xf=Frame(root) - xf.pack(side='right') - - root.bind('<q>', self.quit) - root.bind('<r>', self.refresh) - leveldisplay_tl.bind('<q>', self.quit) - leveldisplay_tl.bind('<r>', self.refresh) - - self.xfader.setupwidget(xf) - controlpanel.pack() - - cuefader_tl = toplevelat(78, 480) - cuefader = Fader(cuefader_tl, Subs.cues, self.scalelevels) - cuefader.pack() - - def refresh(self, *args): - 'rebuild interface, reload data' - get_data() - self.subediting.refresh() - self.buildinterface() - bindkeys(root,'<Escape>', self.quit) - - def stageassub(self): - """returns the current onstage lighting as a levels - dictionary, skipping the zeros, and using names where - possible""" - levs=self.oldlevels - - return dict([(Patch.get_channel_name(i),l) for i,l - in zip(range(1,len(levs)+1),levs) - if l>0]) - def save_sub(self, name, levels): - if not name: - print "Enter sub name in console." - return - - st = '' - linebuf = 'subs["%s"] = {' % name - for channame,lev in levels.items(): - if len(linebuf) > 60: - st += linebuf + '\n ' - linebuf = '' - - linebuf += ' "%s" : %d,' % (channame, lev) - st += linebuf + '}\n' - if DUMMY: - filename = 'ConfigDummy.py' - else: - filename = 'Config.py' - f = open(filename, 'a') - f.write(st) - f.close() - print 'Added sub:', st - self.refresh() - - # this is called on a loop, and ALSO by the Scales - def changelevel(self, *args): - 'Amp trims slider' - - levels = [0] * 68 - for name, s in Subs.subs.items(): - newlevels = s.get_levels(level=self.scalelevels[name].get()) - for (ch, fadelev) in newlevels.items(): - levels[ch-1] = max(levels[ch-1], fadelev) - - levels = [int(l) for l in levels] - - for lev,lab,oldlev,numlab in zip(levels, self.channel_levels, - self.oldlevels, - self.leveldisplay.number_labels): - if lev != oldlev: - lab.config(text="%d" % lev) - colorlabel(lab) - if lev < oldlev: - numlab['bg'] = 'blue' - else: - numlab['bg'] = 'red' - else: - numlab['bg'] = 'lightPink' - - self.oldlevels[:] = levels[:] # replace the elements in oldlevels - don't make a new list (Subediting is watching it) - - parportdmx.sendlevels(levels) - - def load(self): - try: - filename = '/tmp/light9.prefs' - if DUMMY: - filename += '.dummy' - print "Loading from", filename - file = open(filename, 'r') - p = cPickle.load(file) - for s, v in p.scalelevels.items(): - try: - self.scalelevels[s].set(v) - except: - print "Couldn't set %s -> %s" % (s, v) - for name, substate in p.substate.items(): - try: - Subs.subs[name].set_state(substate) - except: - print "Couldn't set sub %s state" % name - except IOError: - print "IOError: Couldn't load prefs (%s)" % filename - except EOFError: - print "EOFrror: Couldn't load prefs (%s)" % filename - except: - print "BigTrouble: Couldn't load prefs (%s)" % filename - - def backgroundloop(self, *args): - self.master.after(50, self.backgroundloop, ()) - self.changelevel() - def quit(self, *args): - self.save() - root.destroy() - sys.exit() - def save(self, *args): - filename = '/tmp/light9.prefs' - if DUMMY: - filename += '.dummy' - print "Saving to", filename - file = open(filename, 'w') - try: - cPickle.dump(Pickles(self.scalelevels, Subs.subs.items()), file) - except cPickle.UnpickleableError: - print "UnpickleableError! There's yer problem." - -class Pickles: - def __init__(self, scalelevels, subs=None): - self.scalelevels = dict([(name, lev.get()) - for name, lev in scalelevels.items()]) - self.substate = dict([(name, subobj.get_state()) - for name, subobj in subs]) - # print "substate", self.substate - -mr_lightboard = Lightboard(root) +mr_lightboard = Lightboard(root,parportdmx,DUMMY) signal(SIGINT, mr_lightboard.quit) bindkeys(root,'<Escape>', mr_lightboard.quit)