示例#1
0
def cmdLoad(arg):
  xx, ext = os.path.splitext(arg)
  fn = os.path.basename(arg)

  if ext == ".ini":
    settings = getSettings(arg)
    if not settings.loaded:
      print("Failed to load settings file: %s." % arg)
      sys.exit(2)
    return

  if ext == ".h":
    if fn.startswith("board."):
      global board
      board = Board(getSettings())
      ok, fn = board.loadConfigFile(arg)
      if not ok:
        print("Failed trying to load board file: %s." % fn)
        sys.exit(2)
      return
    elif fn.startswith("printer."):
      global printer
      printer = Printer(getSettings())
      ok, fn = printer.loadConfigFile(arg)
      if not ok:
        print("Failed trying to load printer file: %s" % fn)
        sys.exit(2)
      return

  print("Unrecognized file: %s." % arg)
  print("Expected one of *.ini, board.*.h or printer.*.h.")
  sys.exit(2)
示例#2
0
  def __init__(self, parent, nb, settings):
    wx.Panel.__init__(self, nb, wx.ID_ANY)
    self.parent = parent

    self.deco = Decoration()
    self.protFileLoaded = False

    self.settings = settings

    self.board = Board(self.settings)

    self.dir = os.path.join(self.settings.folder, "config")

    self.SetBackgroundColour(self.deco.getBackgroundColour())
    self.Bind(wx.EVT_PAINT, self.deco.onPaintBackground)
    sz = wx.BoxSizer(wx.HORIZONTAL)

    self.nb = wx.Notebook(self, wx.ID_ANY, size = (21, 21),
                          style = wx.BK_DEFAULT)
    self.nb.SetBackgroundColour(self.deco.getBackgroundColour())
    self.nb.SetFont(self.settings.font)

    self.pages = []
    self.titles = []
    self.pageModified = []
    self.pageValid = []

    self.pgCpu = self.registerPage(CpuPage, "CPU")
    self.pgPins = self.registerPage(PinoutsPage, "Pinouts")
    self.pgDisplay = self.registerPage(DisplayPage, "Display")
    self.pgHeaters = self.registerPage(HeatersPage, "Heaters")
    self.pgSensors = self.registerPage(SensorsPage, "Temperature Sensors",
                                       heatersPage = self.pgHeaters)
    self.pgCommunications = self.registerPage(CommunicationsPage,
                                              "Communications")

    sz.Add(self.nb, 1, wx.EXPAND + wx.ALL, 5)

    self.SetSizer(sz)
    self.Fit()
示例#3
0
class BoardPanel(wx.Panel):
  def __init__(self, parent, nb, settings):
    wx.Panel.__init__(self, nb, wx.ID_ANY)
    self.parent = parent

    self.deco = Decoration()
    self.protFileLoaded = False

    self.settings = settings

    self.board = Board(self.settings)

    self.dir = os.path.join(self.settings.folder, "config")

    self.SetBackgroundColour(self.deco.getBackgroundColour())
    self.Bind(wx.EVT_PAINT, self.deco.onPaintBackground)
    sz = wx.BoxSizer(wx.HORIZONTAL)

    self.nb = wx.Notebook(self, wx.ID_ANY, size = (21, 21),
                          style = wx.BK_DEFAULT)
    self.nb.SetBackgroundColour(self.deco.getBackgroundColour())
    self.nb.SetFont(self.settings.font)

    self.pages = []
    self.titles = []
    self.pageModified = []
    self.pageValid = []

    self.pgCpu = self.registerPage(CpuPage, "CPU")
    self.pgPins = self.registerPage(PinoutsPage, "Pinouts")
    self.pgDisplay = self.registerPage(DisplayPage, "Display")
    self.pgHeaters = self.registerPage(HeatersPage, "Heaters")
    self.pgSensors = self.registerPage(SensorsPage, "Temperature Sensors",
                                       heatersPage = self.pgHeaters)
    self.pgCommunications = self.registerPage(CommunicationsPage,
                                              "Communications")

    sz.Add(self.nb, 1, wx.EXPAND + wx.ALL, 5)

    self.SetSizer(sz)
    self.Fit()

  def registerPage(self, klass, label, *args, **kwargs):
    page = klass(self, self.nb, len(self.pages), *args,
                 font = self.settings.font, **kwargs)
    self.nb.AddPage(page, label)
    self.pages.append(page)
    self.titles.append(label)
    self.pageModified.append(False)
    self.pageValid.append(True)
    return page

  def getCPUInfo(self):
    return self.board.getCPUInfo()

  def assertModified(self, pg, flag = True):
    self.pageModified[pg] = flag
    self.modifyTab(pg)

  def isModified(self):
    return (True in self.pageModified)

  def isValid(self):
    return not (False in self.pageValid)

  def hasData(self):
    return self.board.hasData()

  def getFileName(self):
    return self.board.getFileName()

  def assertValid(self, pg, flag = True):
    self.pageValid[pg] = flag
    self.modifyTab(pg)

    if False in self.pageValid:
      self.parent.enableSaveBoard(False, False)
    else:
      self.parent.enableSaveBoard(not self.protFileLoaded, True)

  def modifyTab(self, pg):
    if self.pageModified[pg] and not self.pageValid[pg]:
      pfx = "?* "
    elif self.pageModified[pg]:
      pfx = "* "
    elif not self.pageValid[pg]:
      pfx = "? "
    else:
      pfx = ""

    self.nb.SetPageText(pg, pfx + self.titles[pg])
    if True in self.pageModified and False in self.pageValid:
      pfx = "?* "
    elif True in self.pageModified:
      pfx = "* "
    elif False in self.pageValid:
      pfx = "? "
    else:
      pfx = ""
    self.parent.setBoardTabDecor(pfx)

  def setHeaters(self, ht):
    self.parent.setHeaters(ht)

  def onClose(self, evt):
    if not self.confirmLoseChanges("exit"):
      return

    self.Destroy()

  def confirmLoseChanges(self, msg):
    if True not in self.pageModified:
      return True

    dlg = wx.MessageDialog(self, "Are you sure you want to " + msg + "?\n"
                                 "There are changes to your board "
                                 "configuration that will be lost.",
                           "Changes pending",
                           wx.YES_NO | wx.NO_DEFAULT | wx.ICON_INFORMATION)
    rc = dlg.ShowModal()
    dlg.Destroy()

    if rc != wx.ID_YES:
      return False

    return True

  def onLoadConfig(self, evt):
    if not self.confirmLoseChanges("load a new board configuration"):
      return

    if platform.startswith("darwin"):
      # Mac OS X appears to be a bit limited on wildcards.
      wildcard = "Board configuration (board.*.h)|*.h"
    else:
      wildcard = "Board configuration (board.*.h)|board.*.h"

    dlg = wx.FileDialog(self, message = "Choose a board config file",
                        defaultDir = self.dir, defaultFile = "",
                        wildcard = wildcard, style = wx.OPEN | wx.CHANGE_DIR)

    path = None
    if dlg.ShowModal() == wx.ID_OK:
      path = dlg.GetPath()

    dlg.Destroy()
    if path is None:
      return

    self.dir = os.path.dirname(path)
    rc, efn = self.loadConfigFile(path)

    if not rc:
      dlg = wx.MessageDialog(self, "Unable to process file %s." % efn,
                             "File error", wx.OK + wx.ICON_ERROR)
      dlg.ShowModal()
      dlg.Destroy()
      return

  def loadConfigFile(self, fn):
    ok, file = self.board.loadConfigFile(fn)
    if not ok:
      return ok, file

    if os.path.basename(fn) in protectedFiles:
      self.parent.enableSaveBoard(False, True)
      self.protFileLoaded = True
    else:
      self.protFileLoaded = False
      self.parent.enableSaveBoard(True, True)

    self.parent.setBoardTabFile(os.path.basename(fn))
    self.pgHeaters.setCandidatePins(self.board.candHeatPins)
    self.pgSensors.setCandidatePins(self.board.candThermPins)
    self.pgCpu.setCandidateProcessors(self.board.candProcessors)
    self.pgCpu.setCandidateClocks(self.board.candClocks)

    for pg in self.pages:
      pg.insertValues(self.board.cfgValues)
      pg.setHelpText(self.board.helpText)

    self.pgSensors.setSensors(self.board.sensors)
    self.pgHeaters.setHeaters(self.board.heaters)

    return True, None

  def onSaveConfig(self, evt):
    path = self.getFileName()
    return self.saveConfigFile(path)

  def onSaveConfigAs(self, evt):
    if platform.startswith("darwin"):
      # Mac OS X appears to be a bit limited on wildcards.
      wildcard = "Board configuration (board.*.h)|*.h"
    else:
      wildcard = "Board configuration (board.*.h)|board.*.h"

    dlg = wx.FileDialog(self, message = "Save as ...", defaultDir = self.dir,
                        defaultFile = "", wildcard = wildcard,
                        style = wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT)

    val = dlg.ShowModal()

    if val != wx.ID_OK:
      dlg.Destroy()
      return

    path = dlg.GetPath()
    dlg.Destroy()

    rc = self.saveConfigFile(path)
    if rc:
      self.parent.setBoardTabFile(os.path.basename(path))
      self.protFileLoaded = False
      self.parent.enableSaveBoard(True, True)
    return rc

  def saveConfigFile(self, path):
    if os.path.basename(path) in protectedFiles:
      dlg = wx.MessageDialog(self, "It's not allowed to overwrite files "
                             "distributed by Teacup. Choose another name.",
                             "Protected file error", wx.OK + wx.ICON_ERROR)
      dlg.ShowModal()
      dlg.Destroy()
      return False

    if not os.path.basename(path).startswith("board."):
      dlg = wx.MessageDialog(self, "Illegal file name: %s.\n"
                             "File name must begin with \"board.\"" % path,
                             "Illegal file name", wx.OK + wx.ICON_ERROR)
      dlg.ShowModal()
      dlg.Destroy()
      return False

    values = {}
    for pg in self.pages:
      v1 = pg.getValues()
      for k in v1.keys():
        values[k] = v1[k]

    ext = os.path.splitext(os.path.basename(path))[1]
    self.dir = os.path.dirname(path)

    if ext == "":
      path += ".h"

    try:
      self.board.saveConfigFile(path, values)
    except:
      dlg = wx.MessageDialog(self, "Unable to write to file %s." % path,
                             "File error", wx.OK + wx.ICON_ERROR)
      dlg.ShowModal()
      dlg.Destroy()
      return False

    return self.generateTempTables()

  def generateTempTables(self):
    if not generateTempTables(self.board.sensors, self.settings):
      dlg = wx.MessageDialog(self, "Error writing to file thermistortable.h.",
                             "File error", wx.OK + wx.ICON_ERROR)
      dlg.ShowModal()
      dlg.Destroy()
      return False

    return True