summaryrefslogtreecommitdiff
path: root/df10ch_setup_pkg/map_dlg.py
diff options
context:
space:
mode:
Diffstat (limited to 'df10ch_setup_pkg/map_dlg.py')
-rw-r--r--df10ch_setup_pkg/map_dlg.py256
1 files changed, 256 insertions, 0 deletions
diff --git a/df10ch_setup_pkg/map_dlg.py b/df10ch_setup_pkg/map_dlg.py
new file mode 100644
index 0000000..b8cd575
--- /dev/null
+++ b/df10ch_setup_pkg/map_dlg.py
@@ -0,0 +1,256 @@
+#
+# Copyright (C) 2010 Andreas Auras
+#
+# This file is part of the DF10CH Atmolight controller project.
+#
+# DF10CH Atmolight controller is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# DF10CH Atmolight controller is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+#
+# This file is part of the DF10CH setup program
+#
+
+from Tkinter import *
+import tkFont
+import tkMessageBox
+import device_drv
+import string
+
+class ChannelMapDialog:
+ def __init__(self, areasDlg, master=None, **args):
+ self.areasDlg = areasDlg
+ areasDlg.selectCallbacks.append(self)
+
+ self.actualIdx = None
+ self.actualCtrlId = None
+ self.actualPortName = None
+ self.actualArea = None
+ self.actualColor = None
+ self.channelList = None
+
+ root = Frame(master, **args)
+ self.root = root
+ root.bind("<Map>", self.cbSheetSelected)
+
+ Label(root, text="Channel Mapping", font=tkFont.Font(weight="bold")).grid(row=0, column=0, columnspan=4, padx=5, pady=5)
+
+ self.yScroll = Scrollbar (root, orient=VERTICAL)
+ self.yScroll.grid(row=1, column=1, rowspan=4, sticky=N+S)
+ self.lbChannels = Listbox(root, selectmode=SINGLE, activestyle=NONE, width=35, height=30, yscrollcommand=self.yScroll.set)
+ self.lbChannels.grid(row=1, column=0, rowspan=4, padx=5, pady=5, sticky=N+S+W+E)
+ self.lbChannels.bind("<ButtonRelease-1>", self.cbSelectChannel)
+ self.yScroll["command"] = self.lbChannels.yview
+
+ frSingleColor = Frame(root, borderwidth=5, relief=RIDGE, padx=0, pady=0)
+ frSingleColor.grid(row=2, column = 2, columnspan = 2, padx=5, pady=5, sticky=W+E)
+
+ Label(frSingleColor, text="Set color for channel:").grid(row=0, column=0, columnspan=3, padx=5, pady=5, sticky="W")
+
+ self.btRed = Button(frSingleColor, text="Red", bg="red", command=lambda: self.cbSetColor("red"))
+ self.btRed.grid(row=1, column=0, padx=5, pady=5, ipadx=5, sticky=W+E)
+
+ self.btGreen = Button(frSingleColor, text="Green", bg="green", command=lambda: self.cbSetColor("green"))
+ self.btGreen.grid(row=1, column=1, padx=5, pady=5, ipadx = 5, sticky=W+E)
+
+ self.btBlue = Button(frSingleColor, text="Blue", bg="blue", command=lambda: self.cbSetColor("blue"))
+ self.btBlue.grid(row=1, column=2, padx=5, pady=5, ipadx = 5, sticky=W+E)
+
+ frGroupColor = Frame(root, borderwidth=5, relief=RIDGE, padx=0, pady=0)
+ frGroupColor.grid(row = 3, column = 2, columnspan = 2, padx=5, pady=5, sticky=W+E)
+
+ Label(frGroupColor, text="Set color for channel group:").grid(row=0, column=0, columnspan=3, padx=5, pady=5, sticky="W")
+
+ self.btRGB = Button(frGroupColor, text="RGB", command=lambda: self.cbSetGroupColor("red", "green", "blue"))
+ self.btRGB.grid(row=1, column=0, padx=5, pady=5, ipadx = 5, sticky=W+E)
+
+ self.btRBG = Button(frGroupColor, text="RBG", command=lambda: self.cbSetGroupColor("red", "blue", "green"))
+ self.btRBG.grid(row=1, column=1, padx=5, pady=5, ipadx = 5, sticky=W+E)
+
+ self.btBRG = Button(frGroupColor, text="GRB", command=lambda: self.cbSetGroupColor("green", "red", "blue"))
+ self.btBRG.grid(row=1, column=2, padx=5, pady=5, ipadx = 5, sticky=W+E)
+
+ self.btGRB = Button(frGroupColor, text="BRG", command=lambda: self.cbSetGroupColor("blue", "red", "green"))
+ self.btGRB.grid(row=2, column=0, padx=5, pady=5, ipadx = 5, sticky=W+E)
+
+ self.btBGR = Button(frGroupColor, text="GBR", command=lambda: self.cbSetGroupColor("green", "blue", "red"))
+ self.btBGR.grid(row=2, column=1, padx=5, pady=5, ipadx = 5, sticky=W+E)
+
+ self.btGBR = Button(frGroupColor, text="BGR", command=lambda: self.cbSetGroupColor("blue", "green", "red"))
+ self.btGBR.grid(row=2, column=2, padx=5, pady=5, ipadx = 5, sticky=W)
+
+ #frNavi = Frame(root, padx=0, pady=0)
+ #frNavi.grid(row = 1, column = 2, columnspan = 2, padx=5, pady=5, sticky=N+S+W+E)
+
+ self.btNext = Button(root, text="Next Ch", command=self.cbNext)
+ self.btNext.grid(row=1, column=2, padx=5, pady=5, ipadx=5, sticky=W+E)
+
+ self.btPrev = Button(root, text="Prev Ch", command=self.cbPrev)
+ self.btPrev.grid(row=1, column=3, padx=5, pady=5, ipadx=5, sticky=W+E)
+
+ self.btDelete = Button(root, text="Delete mapping", command=self.cbDelete)
+ self.btDelete.grid(row=4, column=2, columnspan=2, padx=5, pady=5, ipadx = 5, sticky=W+E)
+
+
+ def cbSelectChannel(self, event):
+ s = self.lbChannels.curselection()
+ if len(s) == 1:
+ self.selectChannel(int(s[0]))
+
+ def cbAreaSelected(self):
+ if self.root.winfo_ismapped() and self.actualIdx != None:
+ self.selectArea(self.areasDlg.selectedArea, self.actualColor)
+ self.storeActual()
+
+ def cbSetGroupColor(self, *colors):
+ actIdx = self.actualIdx
+ if actIdx != None:
+ port, p = string.split(self.actualPortName, ".")
+ for pinNum in range(3):
+ portName = "{0}.{1}".format(port, pinNum + 1)
+ for i, mapRec in enumerate(self.channelList):
+ if mapRec['ctrlId'] == self.actualCtrlId and mapRec['portName'] == portName:
+ self.actualPortName = portName
+ self.actualColor = colors[pinNum]
+ self.actualIdx = i
+ self.storeActual()
+ break
+ self.selectChannel(actIdx)
+
+ def cbSetColor(self, color):
+ if self.actualIdx != None:
+ self.selectArea(self.actualArea, color)
+ self.storeActual()
+
+ def cbDelete(self):
+ if self.actualIdx != None:
+ self.storeActual(True)
+
+ def cbNext(self):
+ if self.actualIdx != None:
+ i = self.actualIdx + 1
+ if i == len(self.channelList):
+ i = 0
+ self.selectChannel(i)
+
+ def cbPrev(self):
+ if self.actualIdx != None:
+ i = self.actualIdx - 1
+ if i < 0:
+ i = len(self.channelList) - 1
+ self.selectChannel(i)
+
+ def cbSheetSelected(self, event):
+ self.loadValues()
+
+ def storeActual(self, delete=False):
+ config = device_drv.ConfigMap[self.actualCtrlId]
+ if delete:
+ config.channelMap[self.actualPortName] = None
+ self.channelList[self.actualIdx] = dict(ctrlId=self.actualCtrlId, portName=self.actualPortName, area=None, color=None)
+ else:
+ self.channelList[self.actualIdx] = dict(ctrlId=self.actualCtrlId, portName=self.actualPortName, area=self.actualArea, color=self.actualColor)
+
+ if not delete and self.actualArea and self.actualColor:
+ configMapRec = config.channelMap[self.actualPortName]
+ if configMapRec:
+ configMapRec['area'] = self.actualArea
+ configMapRec['color'] = device_drv.ColorIndex(self.actualColor)
+ else:
+ configMapRec = dict(area=self.actualArea, color=device_drv.ColorIndex(self.actualColor), gamma=device_drv.DEFAULT_GAMMA_VAL, whiteCal=config.pwmRes)
+ config.channelMap[self.actualPortName] = configMapRec
+ text = "{0}: {1} -> {2}: {3}".format(self.actualCtrlId, self.actualPortName, self.actualArea, self.actualColor)
+ else:
+ text = "{0}: {1}".format(self.actualCtrlId, self.actualPortName)
+
+ self.lbChannels.delete(self.actualIdx, self.actualIdx)
+ self.lbChannels.insert(self.actualIdx, text)
+ self.lbChannels.selection_set(self.actualIdx)
+
+ def loadValues(self):
+ self.actualIdx = None
+ self.channelList = list()
+ self.lbChannels.delete(0, END)
+ for ctrlId in sorted(device_drv.ConfigMap.keys()):
+ config = device_drv.ConfigMap[ctrlId]
+ for portName in sorted(config.channelMap.keys()):
+ configMapRec = config.channelMap[portName]
+ if configMapRec:
+ area = configMapRec['area']
+ color = device_drv.ColorName(configMapRec['color'])
+ text = "{0}: {1} -> {2}: {3}".format(ctrlId, portName, area, color)
+ else:
+ area = None
+ color = None
+ text = "{0}: {1}".format(ctrlId, portName)
+ self.channelList.append(dict(ctrlId=ctrlId, portName=portName, area=area, color=color))
+ self.lbChannels.insert(END, text)
+
+ pwmChannelMap = list()
+ while len(pwmChannelMap) < device_drv.NCHANNELS:
+ pwmChannelMap.append(dict(channel=0, port=0, pins=0))
+
+ try:
+ config.ctrl.set_channel_map(0, pwmChannelMap)
+ config.ctrl.set_brightness(0, [ config.pwmRes ] + [ 0 ] * (device_drv.NCHANNELS - 1))
+ except device_drv.AtmoControllerError as err:
+ tkMessageBox.showerror(self.root.winfo_toplevel().title(), err.__str__())
+ return
+
+ self.areasDlg.initAreas("black")
+ self.actualCtrlId = None
+ self.actualPortName = None
+ if len(self.channelList):
+ self.selectChannel(0)
+
+ def selectChannel(self, i):
+ self.actualIdx = i
+
+ self.lbChannels.selection_clear(0, END)
+ self.lbChannels.selection_set(i)
+ self.lbChannels.see(i)
+
+ mapRec = self.channelList[i]
+ self.selectLight(mapRec['ctrlId'], mapRec['portName'])
+ self.selectArea(mapRec['area'], mapRec['color'])
+
+ def selectLight(self, ctrlId, portName):
+ if ctrlId != self.actualCtrlId or portName != self.actualPortName:
+ if self.actualCtrlId and ctrlId != self.actualCtrlId:
+ config = device_drv.ConfigMap[self.actualCtrlId]
+ try:
+ config.ctrl.set_channel_map(0, [ dict(channel=0, port=0, pins=0) ])
+ except device_drv.AtmoControllerError as err:
+ tkMessageBox.showerror(self.root.winfo_toplevel().title(), err.__str__())
+ return
+
+ port, pin = device_drv.PORT_NAME_MAP[portName]
+ config = device_drv.ConfigMap[ctrlId]
+ try:
+ config.ctrl.set_channel_map(0, [ dict(channel=0, port=port, pins=pin) ])
+ except device_drv.AtmoControllerError as err:
+ tkMessageBox.showerror(self.root.winfo_toplevel().title(), err.__str__())
+ return
+
+ self.actualCtrlId = ctrlId
+ self.actualPortName = portName
+
+ def selectArea(self, area, color):
+ if self.actualArea:
+ self.areasDlg.setAreaColor(self.actualArea, "black")
+ self.actualColor = color
+ if area:
+ self.actualArea = area
+ if not color:
+ color = "black"
+ self.areasDlg.setAreaColor(area, color)
+ self.areasDlg.selectArea(area)