Teacup_Firmware/configtool/heaterspage.py

197 lines
5.3 KiB
Python

import wx
from configtool.page import Page
from configtool.data import pinNames, BSIZESMALL
from configtool.heaterlist import HeaterList
from configtool.addheaterdlg import AddHeaterDlg
class HeatersPage(wx.Panel, Page):
def __init__(self, parent, nb, idPg, font):
wx.Panel.__init__(self, nb, wx.ID_ANY)
Page.__init__(self, font)
self.parent = parent
self.font = font
self.id = idPg
self.labels = {"FORCE_SOFTWARE_PWM": "Force software PWM"}
sz = wx.GridBagSizer()
sz.Add((30, 30), pos=(0, 0))
self.heaters = []
self.validPins = pinNames
self.lb = HeaterList(self, font)
sz.Add(self.lb, pos=(1, 1))
sz.Add((20, 20), pos=(1, 2))
k = "FORCE_SOFTWARE_PWM"
cb = self.addCheckBox(k, self.onCheckBox)
sz.Add(cb, pos=(2, 1))
sz.Add((20, 20), pos=(2, 2))
bsz = wx.BoxSizer(wx.VERTICAL)
self.bAdd = wx.Button(self, wx.ID_ANY, "Add", size=BSIZESMALL)
self.bAdd.SetBackgroundColour(self.deco.getBackgroundColour())
self.bAdd.SetFont(font)
self.Bind(wx.EVT_BUTTON, self.doAdd, self.bAdd)
self.bAdd.SetToolTip("Add a heater to the configuration.")
bsz.Add(self.bAdd)
bsz.Add((10, 10))
self.bModify = wx.Button(self, wx.ID_ANY, "Modify", size=BSIZESMALL)
self.bModify.SetBackgroundColour(self.deco.getBackgroundColour())
self.bModify.SetFont(font)
self.bModify.Enable(False)
self.Bind(wx.EVT_BUTTON, self.doModify, self.bModify)
self.bModify.SetToolTip("Modify the selected heater.")
bsz.Add(self.bModify)
bsz.Add((10, 10))
self.bDelete = wx.Button(self, wx.ID_ANY, "Delete", size=BSIZESMALL)
self.bDelete.SetBackgroundColour(self.deco.getBackgroundColour())
self.bDelete.SetFont(font)
self.bDelete.Enable(False)
self.Bind(wx.EVT_BUTTON, self.doDelete, self.bDelete)
self.bDelete.SetToolTip("Remove the selected heater from the " "configuration.")
bsz.Add(self.bDelete)
sz.Add(bsz, pos=(1, 3))
self.SetSizer(sz)
self.enableAll(False)
def enableAll(self, flag=True):
self.bAdd.Enable(flag)
Page.enableAll(self, flag)
def setItemSelected(self, n):
self.selection = n
if n is None:
self.bDelete.Enable(False)
self.bModify.Enable(False)
else:
self.bDelete.Enable(True)
self.bModify.Enable(True)
def getFreePins(self):
freePins = [] + self.validPins
usedPins = []
for s in self.heaters:
usedPins.append(s[1])
for p in usedPins:
if p in freePins:
freePins.remove(p)
return freePins
def doAdd(self, evt):
nm = []
for s in self.heaters:
nm.append(s[0])
dlg = AddHeaterDlg(self, nm, self.getFreePins(), self.font)
rc = dlg.ShowModal()
if rc == wx.ID_OK:
ht = dlg.getValues()
dlg.Destroy()
if rc != wx.ID_OK:
return
self.heaters.append(ht)
self.lb.updateList(self.heaters)
self.validateTable()
self.parent.setHeaters(self.heaters)
self.assertModified(True)
def doModify(self, evt):
if self.selection is None:
return
nm = []
for s in self.heaters:
nm.append(s[0])
h = self.heaters[self.selection]
dlg = AddHeaterDlg(
self,
nm,
[h[1]] + self.getFreePins(),
self.font,
name=h[0],
pin=h[1],
invert=h[2],
pwm=h[3],
max_pwm=h[4],
)
rc = dlg.ShowModal()
if rc == wx.ID_OK:
ht = dlg.getValues()
dlg.Destroy()
if rc != wx.ID_OK:
return
self.heaters[self.selection] = ht
self.lb.updateList(self.heaters)
self.validateTable()
self.parent.setHeaters(self.heaters)
self.assertModified(True)
def doDelete(self, evt):
if self.selection is None:
return
self.assertModified(True)
del self.heaters[self.selection]
self.lb.updateList(self.heaters)
self.validateTable()
self.parent.setHeaters(self.heaters)
self.assertModified(True)
def setHeaters(self, heaters):
self.heaters = heaters
self.lb.updateList(self.heaters)
self.validateTable()
self.parent.setHeaters(self.heaters)
def setCandidatePins(self, plist):
if not plist or len(plist) == 0:
self.validPins = pinNames
else:
self.validPins = plist
self.validateTable()
def heaterNames(self):
heaterNames = []
for heater in self.heaters:
heaterNames.append(heater[0])
return heaterNames
def validateTable(self):
self.lb.setTableValidity(True)
self.setFieldValidity("HEATERLIST", True)
for i in range(len(self.heaters)):
if self.heaters[i][1] not in self.validPins:
self.lb.setRowValidity(i, False)
self.setFieldValidity("HEATERLIST", False)
def setHelpText(self, ht):
Page.setHelpText(self, ht)
k = "DEFINE_HEATER"
if k in ht.keys():
self.bAdd.SetToolTip(ht[k])