277 lines
8.2 KiB
Python
Executable File
277 lines
8.2 KiB
Python
Executable File
#!/usr/bin/env python
|
|
|
|
import wx
|
|
import os.path
|
|
import inspect
|
|
|
|
cmd_folder = os.path.realpath(os.path.abspath(os.path.split(inspect.getfile(
|
|
inspect.currentframe()))[0]))
|
|
|
|
from configtool.printerpanel import PrinterPanel
|
|
from configtool.boardpanel import BoardPanel
|
|
from configtool.data import VERSION, reInclude
|
|
|
|
ID_LOAD_PRINTER = 1000
|
|
ID_SAVE_PRINTER = 1001
|
|
ID_SAVE_PRINTER_AS = 1002
|
|
ID_LOAD_BOARD = 1010
|
|
ID_SAVE_BOARD = 1011
|
|
ID_SAVE_BOARD_AS = 1012
|
|
ID_LOAD_CONFIG = 1020
|
|
ID_LOAD_DEFAULT = 1021
|
|
ID_SAVE_CONFIG = 1022
|
|
|
|
|
|
class ConfigFrame(wx.Frame):
|
|
def __init__(self):
|
|
wx.Frame.__init__(self, None, -1,
|
|
"Teacup Firmware Configurator - " + VERSION,
|
|
size = (880, 550))
|
|
self.Bind(wx.EVT_CLOSE, self.onClose)
|
|
|
|
self.font = wx.Font(8, wx.FONTFAMILY_SWISS, wx.FONTSTYLE_NORMAL,
|
|
wx.FONTWEIGHT_BOLD)
|
|
|
|
panel = wx.Panel(self, -1)
|
|
|
|
self.heaters = []
|
|
self.savePrtEna = False
|
|
self.saveBrdEna = False
|
|
|
|
sz = wx.BoxSizer(wx.HORIZONTAL)
|
|
|
|
self.nb = wx.Notebook(panel, wx.ID_ANY, size = (880, 550),
|
|
style = wx.BK_DEFAULT)
|
|
self.nb.SetFont(self.font)
|
|
|
|
self.pgPrinter = PrinterPanel(self, self.nb, self.font, cmd_folder)
|
|
self.nb.AddPage(self.pgPrinter, "Printer")
|
|
|
|
self.pgBoard = BoardPanel(self, self.nb, self.font, cmd_folder)
|
|
self.nb.AddPage(self.pgBoard, "Board")
|
|
|
|
panel.Fit()
|
|
|
|
sz.Add(self.nb, 1, wx.EXPAND + wx.ALL, 5)
|
|
self.SetSizer(sz)
|
|
self.makeMenu()
|
|
|
|
def onClose(self, evt):
|
|
if not self.pgPrinter.confirmLoseChanges("exit"):
|
|
return
|
|
|
|
if not self.pgBoard.confirmLoseChanges("exit"):
|
|
return
|
|
|
|
self.Destroy()
|
|
|
|
def setPrinterTabText(self, txt):
|
|
self.nb.SetPageText(0, txt)
|
|
|
|
def setBoardTabText(self, txt):
|
|
self.nb.SetPageText(1, txt)
|
|
|
|
def setHeaters(self, ht):
|
|
self.heaters = ht
|
|
self.pgPrinter.setHeaters(ht)
|
|
|
|
def makeMenu(self):
|
|
file_menu = wx.Menu()
|
|
|
|
file_menu.Append(ID_LOAD_CONFIG, "Load config.h",
|
|
"Load config.h and its named printer and board files.")
|
|
self.Bind(wx.EVT_MENU, self.onLoadConfig, id = ID_LOAD_CONFIG)
|
|
|
|
file_menu.Append(ID_LOAD_DEFAULT, "Load default",
|
|
"Load default config.h and its named printer and board files.")
|
|
self.Bind(wx.EVT_MENU, self.onLoadDefault, id = ID_LOAD_DEFAULT)
|
|
|
|
file_menu.Append(ID_SAVE_CONFIG, "Save config.h", "Save config.h file.")
|
|
self.Bind(wx.EVT_MENU, self.onSaveConfig, id = ID_SAVE_CONFIG)
|
|
file_menu.Enable(ID_SAVE_CONFIG, False)
|
|
|
|
file_menu.AppendSeparator()
|
|
|
|
file_menu.Append(ID_LOAD_PRINTER, "Load printer",
|
|
"Load a printer configuration file.")
|
|
self.Bind(wx.EVT_MENU, self.pgPrinter.onLoadConfig, id = ID_LOAD_PRINTER)
|
|
|
|
file_menu.Append(ID_SAVE_PRINTER, "Save printer",
|
|
"Save printer configuration.")
|
|
self.Bind(wx.EVT_MENU, self.pgPrinter.onSaveConfig, id = ID_SAVE_PRINTER)
|
|
file_menu.Enable(ID_SAVE_PRINTER, False)
|
|
|
|
file_menu.Append(ID_SAVE_PRINTER_AS, "Save printer as...",
|
|
"Save printer configuration to a new file.")
|
|
self.Bind(wx.EVT_MENU, self.pgPrinter.onSaveConfigAs,
|
|
id = ID_SAVE_PRINTER_AS)
|
|
file_menu.Enable(ID_SAVE_PRINTER_AS, False)
|
|
|
|
file_menu.AppendSeparator()
|
|
|
|
file_menu.Append(ID_LOAD_BOARD, "Load board",
|
|
"Load a board configuration file.")
|
|
self.Bind(wx.EVT_MENU, self.pgBoard.onLoadConfig, id = ID_LOAD_BOARD)
|
|
|
|
file_menu.Append(ID_SAVE_BOARD, "Save board", "Save board configuration.")
|
|
self.Bind(wx.EVT_MENU, self.pgBoard.onSaveConfig, id = ID_SAVE_BOARD)
|
|
file_menu.Enable(ID_SAVE_BOARD, False)
|
|
|
|
file_menu.Append(ID_SAVE_BOARD_AS, "Save board as...",
|
|
"Save board configuration to a new file.")
|
|
self.Bind(wx.EVT_MENU, self.pgBoard.onSaveConfigAs, id = ID_SAVE_BOARD_AS)
|
|
file_menu.Enable(ID_SAVE_BOARD_AS, False)
|
|
|
|
file_menu.AppendSeparator()
|
|
|
|
file_menu.Append(wx.ID_EXIT, "E&xit", "Exit the application.")
|
|
self.Bind(wx.EVT_MENU, self.onClose, id = wx.ID_EXIT)
|
|
|
|
self.fileMenu = file_menu
|
|
|
|
menu_bar = wx.MenuBar()
|
|
|
|
menu_bar.Append(file_menu, "&File")
|
|
|
|
self.SetMenuBar(menu_bar)
|
|
|
|
def enableSavePrinter(self, flag):
|
|
self.fileMenu.Enable(ID_SAVE_PRINTER, flag)
|
|
self.fileMenu.Enable(ID_SAVE_PRINTER_AS, flag)
|
|
self.savePrtEna = flag
|
|
if self.savePrtEna and self.saveBrdEna:
|
|
self.enableSaveConfig(True)
|
|
else:
|
|
self.enableSaveConfig(False)
|
|
|
|
def enableSaveBoard(self, flag):
|
|
self.fileMenu.Enable(ID_SAVE_BOARD, flag)
|
|
self.fileMenu.Enable(ID_SAVE_BOARD_AS, flag)
|
|
self.saveBrdEna = flag
|
|
if self.savePrtEna and self.saveBrdEna:
|
|
self.enableSaveConfig(True)
|
|
else:
|
|
self.enableSaveConfig(False)
|
|
|
|
def enableSaveConfig(self, flag):
|
|
self.fileMenu.Enable(ID_SAVE_CONFIG, flag)
|
|
|
|
def onLoadConfig(self, evt):
|
|
self.loadConfigFile("config.h")
|
|
|
|
def onLoadDefault(self, evt):
|
|
self.loadConfigFile("config.default.h")
|
|
|
|
def loadConfigFile(self, fn):
|
|
if not self.pgPrinter.confirmLoseChanges("load config"):
|
|
return
|
|
if not self.pgBoard.confirmLoseChanges("load config"):
|
|
return
|
|
|
|
pfile = None
|
|
bfile = None
|
|
path = os.path.join(cmd_folder, fn)
|
|
try:
|
|
cfgBuffer = list(open(path))
|
|
except:
|
|
self.message("Unable to process config file %s." % fn, "File error")
|
|
return
|
|
|
|
for ln in cfgBuffer:
|
|
if not ln.lstrip().startswith("#include"):
|
|
continue
|
|
|
|
m = reInclude.search(ln)
|
|
if m:
|
|
t = m.groups()
|
|
if len(t) == 1:
|
|
if "printer." in t[0]:
|
|
if pfile:
|
|
self.message("Multiple printer file include statements.\n"
|
|
"Ignoring %s." % ln, "Config error",
|
|
wx.OK + wx.ICON_WARNING)
|
|
else:
|
|
pfile = os.path.join(cmd_folder, t[0])
|
|
elif "board." in t[0]:
|
|
if bfile:
|
|
self.message("Multiple board file include statements.\n"
|
|
"Ignoring %s." % ln, "Config error",
|
|
wx.OK + wx.ICON_WARNING)
|
|
else:
|
|
bfile = os.path.join(cmd_folder, t[0])
|
|
else:
|
|
self.message("Unable to parse include statement:\n%s" % ln,
|
|
"Config error")
|
|
|
|
if not pfile:
|
|
self.message("Config file did not contain a printer file include "
|
|
"statement.", "Config error")
|
|
return
|
|
|
|
if not bfile:
|
|
self.message("Config file did not contain a board file include "
|
|
"statement.", "Config error")
|
|
return
|
|
|
|
self.pgPrinter.loadConfigFile(pfile)
|
|
|
|
self.pgBoard.loadConfigFile(bfile)
|
|
|
|
def onSaveConfig(self, evt):
|
|
fn = os.path.join(cmd_folder, "config.h")
|
|
try:
|
|
fp = open(fn, 'w')
|
|
except:
|
|
self.message("Unable to open config.h for output.", "File error")
|
|
return
|
|
|
|
bfn = self.pgBoard.getFileName()
|
|
if not self.pgBoard.saveConfigFile(bfn):
|
|
self.message("Unable to save board configuration %s." %
|
|
os.path.basename(bfn), "File error")
|
|
return
|
|
|
|
pfn = self.pgPrinter.getFileName()
|
|
if not self.pgPrinter.saveConfigFile(pfn):
|
|
self.message("Unable to save printer configuration %s." %
|
|
os.path.basename(pfn), "File error")
|
|
return
|
|
|
|
prefix = cmd_folder + os.path.sep
|
|
lpfx = len(prefix)
|
|
|
|
if bfn.startswith(prefix):
|
|
rbfn = bfn[lpfx:]
|
|
else:
|
|
rbfn = bfn
|
|
|
|
if pfn.startswith(prefix):
|
|
rpfn = pfn[lpfx:]
|
|
else:
|
|
rpfn = pfn
|
|
|
|
fp.write("\n")
|
|
fp.write("// Configuration for controller board.\n")
|
|
fp.write("#include \"%s\"\n" % rbfn)
|
|
fp.write("\n")
|
|
fp.write("// Configuration for printer board.\n")
|
|
fp.write("#include \"%s\"\n" % rpfn)
|
|
|
|
fp.close()
|
|
|
|
m = ("%s successfully saved.\n"
|
|
"%s successfully saved.\nconfig.h successfully saved.") % (rbfn, rpfn)
|
|
self.message(m, "Save configuration success", wx.OK + wx.ICON_INFORMATION)
|
|
|
|
def message(self, text, title, style = wx.OK + wx.ICON_ERROR):
|
|
dlg = wx.MessageDialog(self, text, title, style)
|
|
dlg.ShowModal()
|
|
dlg.Destroy()
|
|
|
|
|
|
if __name__ == '__main__':
|
|
app = wx.PySimpleApp()
|
|
frame = ConfigFrame()
|
|
frame.Show(True)
|
|
app.MainLoop()
|