Configtool: added logic to generate thermistor temp tables.

Also enable editing of temperature sensors.
This commit is contained in:
jbernardis 2015-02-25 19:07:36 -05:00 committed by Markus Hitter
parent 1189d809a6
commit 48433a6254
20 changed files with 505 additions and 33 deletions

View File

@ -145,6 +145,10 @@
// name type pin additional // name type pin additional
DEFINE_TEMP_SENSOR(extruder, TT_THERMISTOR, AIO13, THERMISTOR_EXTRUDER) DEFINE_TEMP_SENSOR(extruder, TT_THERMISTOR, AIO13, THERMISTOR_EXTRUDER)
DEFINE_TEMP_SENSOR(bed, TT_THERMISTOR, AIO14, THERMISTOR_BED) DEFINE_TEMP_SENSOR(bed, TT_THERMISTOR, AIO14, THERMISTOR_BED)
// r0 beta r2 vadc
//TEMP_TABLE EXTRUDER (100000, 4092, 4700, 5.0)
//TEMP_TABLE BED (100000, 4092, 4700, 5.0)
//DEFINE_TEMP_SENSORS_END //DEFINE_TEMP_SENSORS_END

View File

@ -143,6 +143,9 @@
//DEFINE_TEMP_SENSORS_START //DEFINE_TEMP_SENSORS_START
// name type pin additional // name type pin additional
DEFINE_TEMP_SENSOR(extruder, TT_THERMISTOR, AIO5, THERMISTOR_EXTRUDER) DEFINE_TEMP_SENSOR(extruder, TT_THERMISTOR, AIO5, THERMISTOR_EXTRUDER)
// r0 beta r2 vadc
//TEMP_TABLE EXTRUDER (100000, 4092, 4700, 5.0)
//DEFINE_TEMP_SENSORS_END //DEFINE_TEMP_SENSORS_END

View File

@ -149,6 +149,10 @@
// name type pin additional // name type pin additional
DEFINE_TEMP_SENSOR(extruder, TT_THERMISTOR, AIO1, THERMISTOR_EXTRUDER) DEFINE_TEMP_SENSOR(extruder, TT_THERMISTOR, AIO1, THERMISTOR_EXTRUDER)
DEFINE_TEMP_SENSOR(bed, TT_THERMISTOR, AIO2, THERMISTOR_BED) DEFINE_TEMP_SENSOR(bed, TT_THERMISTOR, AIO2, THERMISTOR_BED)
// r0 beta r2 vadc
//TEMP_TABLE EXTRUDER (100000, 4092, 4700, 5.0)
//TEMP_TABLE BED (100000, 4092, 4700, 5.0)
//DEFINE_TEMP_SENSORS_END //DEFINE_TEMP_SENSORS_END

View File

@ -150,6 +150,10 @@
// name type pin additional // name type pin additional
DEFINE_TEMP_SENSOR(extruder, TT_THERMISTOR, AIO1, THERMISTOR_EXTRUDER) DEFINE_TEMP_SENSOR(extruder, TT_THERMISTOR, AIO1, THERMISTOR_EXTRUDER)
DEFINE_TEMP_SENSOR(bed, TT_THERMISTOR, AIO0, THERMISTOR_BED) DEFINE_TEMP_SENSOR(bed, TT_THERMISTOR, AIO0, THERMISTOR_BED)
// r0 beta r2 vadc
//TEMP_TABLE EXTRUDER (100000, 4092, 4700, 5.0)
//TEMP_TABLE BED (100000, 4092, 4700, 5.0)
//DEFINE_TEMP_SENSORS_END //DEFINE_TEMP_SENSORS_END

View File

@ -146,6 +146,10 @@
// name type pin additional // name type pin additional
DEFINE_TEMP_SENSOR(extruder, TT_THERMISTOR, AIO2, THERMISTOR_EXTRUDER) DEFINE_TEMP_SENSOR(extruder, TT_THERMISTOR, AIO2, THERMISTOR_EXTRUDER)
DEFINE_TEMP_SENSOR(bed, TT_THERMISTOR, AIO1, THERMISTOR_BED) DEFINE_TEMP_SENSOR(bed, TT_THERMISTOR, AIO1, THERMISTOR_BED)
// r0 beta r2 vadc
//TEMP_TABLE EXTRUDER (100000, 4092, 4700, 5.0)
//TEMP_TABLE BED (100000, 4092, 4700, 5.0)
//DEFINE_TEMP_SENSORS_END //DEFINE_TEMP_SENSORS_END

View File

@ -147,6 +147,10 @@
// name type pin additional // name type pin additional
DEFINE_TEMP_SENSOR(extruder, TT_THERMISTOR, AIO13, THERMISTOR_EXTRUDER) DEFINE_TEMP_SENSOR(extruder, TT_THERMISTOR, AIO13, THERMISTOR_EXTRUDER)
DEFINE_TEMP_SENSOR(bed, TT_THERMISTOR, AIO14, THERMISTOR_BED) DEFINE_TEMP_SENSOR(bed, TT_THERMISTOR, AIO14, THERMISTOR_BED)
// r0 beta r2 vadc
//TEMP_TABLE EXTRUDER (100000, 4092, 4700, 5.0)
//TEMP_TABLE BED (100000, 4092, 4700, 5.0)
//DEFINE_TEMP_SENSORS_END //DEFINE_TEMP_SENSORS_END

View File

@ -148,6 +148,10 @@
// name type pin additional // name type pin additional
DEFINE_TEMP_SENSOR(extruder, TT_THERMISTOR, AIO15, THERMISTOR_EXTRUDER) DEFINE_TEMP_SENSOR(extruder, TT_THERMISTOR, AIO15, THERMISTOR_EXTRUDER)
DEFINE_TEMP_SENSOR(bed, TT_THERMISTOR, AIO11, THERMISTOR_BED) DEFINE_TEMP_SENSOR(bed, TT_THERMISTOR, AIO11, THERMISTOR_BED)
// r0 beta r2 vadc
//TEMP_TABLE EXTRUDER (100000, 4092, 4700, 5.0)
//TEMP_TABLE BED (100000, 4092, 4700, 5.0)
//DEFINE_TEMP_SENSORS_END //DEFINE_TEMP_SENSORS_END

View File

@ -148,6 +148,10 @@
// name type pin additional // name type pin additional
DEFINE_TEMP_SENSOR(extruder, TT_THERMISTOR, AIO7, THERMISTOR_EXTRUDER) DEFINE_TEMP_SENSOR(extruder, TT_THERMISTOR, AIO7, THERMISTOR_EXTRUDER)
DEFINE_TEMP_SENSOR(bed, TT_THERMISTOR, AIO6, THERMISTOR_BED) DEFINE_TEMP_SENSOR(bed, TT_THERMISTOR, AIO6, THERMISTOR_BED)
// r0 beta r2 vadc
//TEMP_TABLE EXTRUDER (100000, 4092, 4700, 5.0)
//TEMP_TABLE BED (100000, 4092, 4700, 5.0)
//DEFINE_TEMP_SENSORS_END //DEFINE_TEMP_SENSORS_END

View File

@ -148,6 +148,10 @@
// name type pin additional // name type pin additional
DEFINE_TEMP_SENSOR(extruder, TT_THERMISTOR, AIO7, THERMISTOR_EXTRUDER) DEFINE_TEMP_SENSOR(extruder, TT_THERMISTOR, AIO7, THERMISTOR_EXTRUDER)
DEFINE_TEMP_SENSOR(bed, TT_THERMISTOR, AIO6, THERMISTOR_BED) DEFINE_TEMP_SENSOR(bed, TT_THERMISTOR, AIO6, THERMISTOR_BED)
// r0 beta r2 vadc
//TEMP_TABLE EXTRUDER (100000, 4092, 4700, 5.0)
//TEMP_TABLE BED (100000, 4092, 4700, 5.0)
//DEFINE_TEMP_SENSORS_END //DEFINE_TEMP_SENSORS_END

View File

@ -148,6 +148,10 @@
// name type pin additional // name type pin additional
DEFINE_TEMP_SENSOR(extruder, TT_THERMISTOR, AIO1, THERMISTOR_EXTRUDER) DEFINE_TEMP_SENSOR(extruder, TT_THERMISTOR, AIO1, THERMISTOR_EXTRUDER)
DEFINE_TEMP_SENSOR(bed, TT_THERMISTOR, AIO0, THERMISTOR_BED) DEFINE_TEMP_SENSOR(bed, TT_THERMISTOR, AIO0, THERMISTOR_BED)
// r0 beta r2 vadc
//TEMP_TABLE EXTRUDER (100000, 4092, 4700, 5.0)
//TEMP_TABLE BED (100000, 4092, 4700, 5.0)
//DEFINE_TEMP_SENSORS_END //DEFINE_TEMP_SENSORS_END

View File

@ -145,6 +145,10 @@
// name type pin additional // name type pin additional
DEFINE_TEMP_SENSOR(extruder, TT_THERMISTOR, AIO7, THERMISTOR_EXTRUDER) DEFINE_TEMP_SENSOR(extruder, TT_THERMISTOR, AIO7, THERMISTOR_EXTRUDER)
DEFINE_TEMP_SENSOR(bed, TT_THERMISTOR, AIO6, THERMISTOR_BED) DEFINE_TEMP_SENSOR(bed, TT_THERMISTOR, AIO6, THERMISTOR_BED)
// r0 beta r2 vadc
//TEMP_TABLE EXTRUDER (100000, 4092, 4700, 5.0)
//TEMP_TABLE BED (100000, 4092, 4700, 5.0)
//DEFINE_TEMP_SENSORS_END //DEFINE_TEMP_SENSORS_END

View File

@ -145,6 +145,10 @@
// name type pin additional // name type pin additional
DEFINE_TEMP_SENSOR(extruder, TT_THERMISTOR, AIO1, THERMISTOR_EXTRUDER) DEFINE_TEMP_SENSOR(extruder, TT_THERMISTOR, AIO1, THERMISTOR_EXTRUDER)
DEFINE_TEMP_SENSOR(bed, TT_THERMISTOR, AIO0, THERMISTOR_BED) DEFINE_TEMP_SENSOR(bed, TT_THERMISTOR, AIO0, THERMISTOR_BED)
// r0 beta r2 vadc
//TEMP_TABLE EXTRUDER (100000, 4092, 4700, 5.0)
//TEMP_TABLE BED (100000, 4092, 4700, 5.0)
//DEFINE_TEMP_SENSORS_END //DEFINE_TEMP_SENSORS_END

View File

@ -36,3 +36,10 @@ programmer = stk500v2
# The port through which the firmware will be uploaded - passed to avrdude. # The port through which the firmware will be uploaded - passed to avrdude.
port = /dev/ttyACM0 port = /dev/ttyACM0
# Parameters into the thermistor table generation process.
t0 = 25
r1 = 0
numtemps = 25
maxadc = 1023
minadc = 0

View File

@ -1,22 +1,32 @@
import wx import wx
from configtool.data import (pinNames, BSIZESMALL, sensorTypes, offsetTcLabel, from configtool.data import (pinNames, BSIZESMALL, sensorTypes, offsetTcLabel,
offsetChLabel) offsetChLabel, reInteger, reFloat)
class AddSensorDlg(wx.Dialog): class AddSensorDlg(wx.Dialog):
def __init__(self, parent, names, pins, font): def __init__(self, parent, names, pins, font, name = "", stype = "",
wx.Dialog.__init__(self, parent, wx.ID_ANY, "Add temperature sensor", pin = "", r0 = "", beta = "", r2 = "", vadc = "",
size = (400, 204)) modify = False):
if modify:
title = "Modify temperature sensor"
else:
title = "Add temperature sensor"
wx.Dialog.__init__(self, parent, wx.ID_ANY, title, size = (400, 204))
self.SetFont(font) self.SetFont(font)
self.Bind(wx.EVT_CLOSE, self.onCancel) self.Bind(wx.EVT_CLOSE, self.onCancel)
self.names = names self.names = names
self.choices = pins self.choices = pins
self.modify = modify
labelWidth = 160 labelWidth = 160
self.nameValid = False self.nameValid = False
self.R0Valid = False
self.betaValid = False
self.R2Valid = False
self.vadcValid = False
hsz = wx.BoxSizer(wx.HORIZONTAL) hsz = wx.BoxSizer(wx.HORIZONTAL)
hsz.AddSpacer((10, 10)) hsz.AddSpacer((10, 10))
@ -30,8 +40,9 @@ class AddSensorDlg(wx.Dialog):
st.SetFont(font) st.SetFont(font)
lsz.Add(st, 1, wx.TOP, offsetTcLabel) lsz.Add(st, 1, wx.TOP, offsetTcLabel)
self.tcName = wx.TextCtrl(self, wx.ID_ANY, "") self.tcName = wx.TextCtrl(self, wx.ID_ANY, name)
self.tcName.SetFont(font) self.tcName.SetFont(font)
if not modify:
self.tcName.SetBackgroundColour("pink") self.tcName.SetBackgroundColour("pink")
self.tcName.Bind(wx.EVT_TEXT, self.onNameEntry) self.tcName.Bind(wx.EVT_TEXT, self.onNameEntry)
lsz.Add(self.tcName) lsz.Add(self.tcName)
@ -51,7 +62,19 @@ class AddSensorDlg(wx.Dialog):
ch = wx.Choice(self, wx.ID_ANY, choices = sl) ch = wx.Choice(self, wx.ID_ANY, choices = sl)
ch.SetFont(font) ch.SetFont(font)
ch.Bind(wx.EVT_CHOICE, self.onSensorType) ch.Bind(wx.EVT_CHOICE, self.onSensorType)
found = False
for st in sensorTypes.keys():
if sensorTypes[st] == stype:
i = ch.FindString(st)
if i != wx.NOT_FOUND:
stStart = st
ch.SetSelection(i)
found = True
break
if not found:
ch.SetSelection(0) ch.SetSelection(0)
stStart = sl[0]
self.chType = ch self.chType = ch
lsz.Add(ch) lsz.Add(ch)
@ -68,7 +91,11 @@ class AddSensorDlg(wx.Dialog):
self.chPin = wx.Choice(self, wx.ID_ANY, choices = pins) self.chPin = wx.Choice(self, wx.ID_ANY, choices = pins)
self.chPin.SetFont(font) self.chPin.SetFont(font)
self.chPin.Bind(wx.EVT_CHOICE, self.onChoice) self.chPin.Bind(wx.EVT_CHOICE, self.onChoice)
i = self.chPin.FindString(pin)
if i == wx.NOT_FOUND:
self.chPin.SetSelection(0) self.chPin.SetSelection(0)
else:
self.chPin.SetSelection(i)
lsz.Add(self.chPin) lsz.Add(self.chPin)
self.chPin.SetToolTipString("Choose a pin name for this sensor.") self.chPin.SetToolTipString("Choose a pin name for this sensor.")
@ -76,20 +103,71 @@ class AddSensorDlg(wx.Dialog):
csz.AddSpacer((10, 10)) csz.AddSpacer((10, 10))
lsz = wx.BoxSizer(wx.HORIZONTAL) lsz = wx.BoxSizer(wx.HORIZONTAL)
st = wx.StaticText(self, wx.ID_ANY, "Additional:", size = (labelWidth, -1), st = wx.StaticText(self, wx.ID_ANY, "R0:", size = (labelWidth, -1),
style = wx.ALIGN_RIGHT) style = wx.ALIGN_RIGHT)
st.SetFont(font) st.SetFont(font)
lsz.Add(st, 1, wx.TOP, offsetTcLabel) lsz.Add(st, 1, wx.TOP, offsetTcLabel)
self.tcAddtl = wx.TextCtrl(self, wx.ID_ANY, "") self.tcR0 = wx.TextCtrl(self, wx.ID_ANY, r0)
self.tcAddtl.SetFont(font) self.tcR0.SetFont(font)
self.tcAddtl.Bind(wx.EVT_TEXT, self.onAddtlEntry) self.tcR0.Bind(wx.EVT_TEXT, self.onR0Entry)
lsz.Add(self.tcAddtl) lsz.Add(self.tcR0)
self.tcAddtl.SetToolTipString("Enter additional information required " self.tcR0.SetToolTipString("Nominal resistance of the thermistor. "
"by the sensor type.") "Typically 10000 ( = 10k) or 100000 ( = 100k).")
csz.Add(lsz) csz.Add(lsz)
csz.AddSpacer((10, 10))
lsz = wx.BoxSizer(wx.HORIZONTAL)
st = wx.StaticText(self, wx.ID_ANY, "Beta:", size = (labelWidth, -1),
style = wx.ALIGN_RIGHT)
st.SetFont(font)
lsz.Add(st, 1, wx.TOP, offsetTcLabel)
self.tcBeta = wx.TextCtrl(self, wx.ID_ANY, beta)
self.tcBeta.SetFont(font)
self.tcBeta.Bind(wx.EVT_TEXT, self.onBetaEntry)
lsz.Add(self.tcBeta)
self.tcBeta.SetToolTipString("Thermistor beta value. Can be found in the "
"datasheet or measured like described in http"
"://reprap.org/wiki/MeasuringThermistorBeta")
csz.Add(lsz)
csz.AddSpacer((10, 10))
lsz = wx.BoxSizer(wx.HORIZONTAL)
st = wx.StaticText(self, wx.ID_ANY, "R2:", size = (labelWidth, -1),
style = wx.ALIGN_RIGHT)
st.SetFont(font)
lsz.Add(st, 1, wx.TOP, offsetTcLabel)
self.tcR2 = wx.TextCtrl(self, wx.ID_ANY, r2)
self.tcR2.SetFont(font)
self.tcR2.Bind(wx.EVT_TEXT, self.onR2Entry)
lsz.Add(self.tcR2)
self.tcR2.SetToolTipString("Resistance value of the secondary resistor. "
"This is not a property of the thermistor, but "
"one of the board. Typical values are 4700 "
"( = 4k7 ohms) or 1000 ( = 1k ohms).")
csz.Add(lsz)
csz.AddSpacer((10, 10))
lsz = wx.BoxSizer(wx.HORIZONTAL)
st = wx.StaticText(self, wx.ID_ANY, "Vadc:", size = (labelWidth, -1),
style = wx.ALIGN_RIGHT)
st.SetFont(font)
lsz.Add(st, 1, wx.TOP, offsetTcLabel)
self.tcVadc = wx.TextCtrl(self, wx.ID_ANY, vadc)
self.tcVadc.SetFont(font)
self.tcVadc.Bind(wx.EVT_TEXT, self.onVadcEntry)
lsz.Add(self.tcVadc)
self.tcVadc.SetToolTipString("Comparison voltage used by the controller. "
"Usually the same as the controller's supply "
"voltage, 3.3 or 5.0 (volts).")
csz.Add(lsz)
csz.AddSpacer((10, 10)) csz.AddSpacer((10, 10))
bsz = wx.BoxSizer(wx.HORIZONTAL) bsz = wx.BoxSizer(wx.HORIZONTAL)
@ -116,13 +194,21 @@ class AddSensorDlg(wx.Dialog):
self.SetSizer(hsz) self.SetSizer(hsz)
self.Fit() self.Fit()
self.selectSensorType(stStart)
self.validateFields()
def onNameEntry(self, evt): def onNameEntry(self, evt):
tc = evt.GetEventObject() tc = evt.GetEventObject()
self.validateName(tc)
self.checkDlgValidity()
evt.Skip()
def validateName(self, tc):
w = tc.GetValue().strip() w = tc.GetValue().strip()
if w == "": if w == "":
self.nameValid = False self.nameValid = False
else: else:
if w in self.names: if w in self.names and not self.modify:
self.nameValid = False self.nameValid = False
else: else:
self.nameValid = True self.nameValid = True
@ -133,18 +219,111 @@ class AddSensorDlg(wx.Dialog):
tc.SetBackgroundColour("pink") tc.SetBackgroundColour("pink")
tc.Refresh() tc.Refresh()
self.checkDlgValidity()
evt.Skip()
def checkDlgValidity(self): def checkDlgValidity(self):
if self.nameValid: if (self.nameValid and self.R0Valid and self.betaValid and
self.R2Valid and self.vadcValid):
self.bSave.Enable(True) self.bSave.Enable(True)
else: else:
self.bSave.Enable(False) self.bSave.Enable(False)
def onAddtlEntry(self, evt): def onTextCtrlInteger(self, tc, rqd):
w = tc.GetValue().strip()
if w == "":
if rqd:
valid = False
else:
valid = True
else:
m = reInteger.match(w)
if m:
valid = True
else:
valid = False
if valid:
tc.SetBackgroundColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW))
else:
tc.SetBackgroundColour("pink")
tc.Refresh()
return valid
def onTextCtrlFloat(self, tc, rqd):
w = tc.GetValue().strip()
if w == "":
if rqd:
valid = False
else:
valid = True
else:
m = reFloat.match(w)
if m:
valid = True
else:
valid = False
if valid:
tc.SetBackgroundColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW))
else:
tc.SetBackgroundColour("pink")
tc.Refresh()
return valid
def onR0Entry(self, evt):
stype = self.chType.GetString(self.chType.GetSelection())
if stype in ['Thermistor']:
rqd = True
else:
rqd = False
self.R0Valid = self.onTextCtrlInteger(self.tcR0, rqd)
self.checkDlgValidity()
if evt is not None:
evt.Skip() evt.Skip()
def onBetaEntry(self, evt):
stype = self.chType.GetString(self.chType.GetSelection())
if stype in ['Thermistor']:
rqd = True
else:
rqd = False
self.betaValid = self.onTextCtrlInteger(self.tcBeta, rqd)
self.checkDlgValidity()
if evt is not None:
evt.Skip()
def onR2Entry(self, evt):
stype = self.chType.GetString(self.chType.GetSelection())
if stype in ['Thermistor']:
rqd = True
else:
rqd = False
self.R2Valid = self.onTextCtrlInteger(self.tcR2, rqd)
self.checkDlgValidity()
if evt is not None:
evt.Skip()
def onVadcEntry(self, evt):
stype = self.chType.GetString(self.chType.GetSelection())
if stype in ['Thermistor']:
rqd = True
else:
rqd = False
self.vadcValid = self.onTextCtrlFloat(self.tcVadc, rqd)
self.checkDlgValidity()
if evt is not None:
evt.Skip()
def selectSensorType(self, lbl):
if lbl == 'Thermistor':
flag = True
else:
flag = False
self.tcR0.Enable(flag);
self.tcBeta.Enable(flag);
self.tcR2.Enable(flag);
self.tcVadc.Enable(flag);
def onChoice(self, evt): def onChoice(self, evt):
pass pass
@ -153,15 +332,26 @@ class AddSensorDlg(wx.Dialog):
s = ch.GetSelection() s = ch.GetSelection()
label = ch.GetString(s) label = ch.GetString(s)
self.selectSensorType(label)
self.validateFields()
evt.Skip() evt.Skip()
def validateFields(self):
self.validateName(self.tcName)
self.onR0Entry(None)
self.onBetaEntry(None)
self.onR2Entry(None)
self.onVadcEntry(None)
def getValues(self): def getValues(self):
nm = self.tcName.GetValue() nm = self.tcName.GetValue()
pin = self.choices[self.chPin.GetSelection()] pin = self.choices[self.chPin.GetSelection()]
addtl = self.tcAddtl.GetValue()
stype = self.chType.GetString(self.chType.GetSelection()) stype = self.chType.GetString(self.chType.GetSelection())
if stype not in ['Thermistor']: if stype in ['Thermistor']:
addtl = [self.tcR0.GetValue().strip(), self.tcBeta.GetValue().strip(),
self.tcR2.GetValue().strip(), self.tcVadc.GetValue().strip()]
else:
addtl = "NONE" addtl = "NONE"
return (nm, sensorTypes[stype], pin, addtl) return (nm, sensorTypes[stype], pin, addtl)

View File

@ -11,13 +11,14 @@ from configtool.data import (defineValueFormat,
reCandProcessors, reCandCPUClocks, reFloatAttr, reCandProcessors, reCandCPUClocks, reFloatAttr,
reDefine, reDefineBL, reDefQS, reDefQSm, reDefine, reDefineBL, reDefQS, reDefQSm,
reDefQSm2, reDefBool, reDefBoolBL, reDefHT, reDefQSm2, reDefBool, reDefBoolBL, reDefHT,
reDefTS, reSensor, reHeater) reDefTS, reDefTT, reSensor, reHeater, reTempTable)
from configtool.pinoutspage import PinoutsPage from configtool.pinoutspage import PinoutsPage
from configtool.sensorpage import SensorsPage from configtool.sensorpage import SensorsPage
from configtool.heaterspage import HeatersPage from configtool.heaterspage import HeatersPage
from configtool.communicationspage import CommunicationsPage from configtool.communicationspage import CommunicationsPage
from configtool.cpupage import CpuPage from configtool.cpupage import CpuPage
from configtool.protectedfiles import protectedFiles from configtool.protectedfiles import protectedFiles
from configtool.thermistortablefile import generateTempTables
class BoardPanel(wx.Panel): class BoardPanel(wx.Panel):
@ -229,6 +230,7 @@ class BoardPanel(wx.Panel):
self.candThermPins = [] self.candThermPins = []
self.candProcessors = [] self.candProcessors = []
self.candClocks = [] self.candClocks = []
tempTables = {}
gatheringHelpText = False gatheringHelpText = False
helpTextString = "" helpTextString = ""
helpKey = None helpKey = None
@ -295,6 +297,15 @@ class BoardPanel(wx.Panel):
self.candClocks.append(t[0]) self.candClocks.append(t[0])
continue continue
m = reDefTT.match(ln)
if m:
t = m.groups()
if len(t) == 2:
s = self.parseTempTable(t[1])
if s:
tempTables[t[0]] = s
continue
continue continue
if ln.lstrip().startswith("#define"): if ln.lstrip().startswith("#define"):
@ -347,6 +358,11 @@ class BoardPanel(wx.Panel):
self.heaters.append(s) self.heaters.append(s)
continue continue
for k in range(len(self.sensors)):
tn = self.sensors[k][0].upper()
if tn in tempTables.keys():
self.sensors[k][3] = tempTables[tn]
if os.path.basename(fn) in protectedFiles: if os.path.basename(fn) in protectedFiles:
self.parent.enableSaveBoard(False, True) self.parent.enableSaveBoard(False, True)
self.protFileLoaded = True self.protFileLoaded = True
@ -373,7 +389,7 @@ class BoardPanel(wx.Panel):
if m: if m:
t = m.groups() t = m.groups()
if len(t) == 4: if len(t) == 4:
return t return list(t)
return None return None
def parseHeater(self, s): def parseHeater(self, s):
@ -381,12 +397,20 @@ class BoardPanel(wx.Panel):
if m: if m:
t = m.groups() t = m.groups()
if len(t) == 3: if len(t) == 3:
return t return list(t)
return None
def parseTempTable(self, s):
m = reTempTable.search(s)
if m:
t = m.groups()
if len(t) == 4:
return list(t)
return None return None
def onSaveConfig(self, evt): def onSaveConfig(self, evt):
path = self.configFile path = self.configFile
self.saveConfigFile(path) return self.saveConfigFile(path)
def onSaveConfigAs(self, evt): def onSaveConfigAs(self, evt):
wildcard = "Board configuration (board.*.h)|board.*.h" wildcard = "Board configuration (board.*.h)|board.*.h"
@ -404,10 +428,12 @@ class BoardPanel(wx.Panel):
path = dlg.GetPath() path = dlg.GetPath()
dlg.Destroy() dlg.Destroy()
if self.saveConfigFile(path): rc = self.saveConfigFile(path)
if rc:
self.parent.setBoardTabFile(os.path.basename(path)) self.parent.setBoardTabFile(os.path.basename(path))
self.protFileLoaded = False self.protFileLoaded = False
self.parent.enableSaveBoard(True, True) self.parent.enableSaveBoard(True, True)
return rc
def saveConfigFile(self, path): def saveConfigFile(self, path):
if os.path.basename(path) in protectedFiles: if os.path.basename(path) in protectedFiles:
@ -452,16 +478,26 @@ class BoardPanel(wx.Panel):
skipToSensorEnd = False skipToSensorEnd = False
skipToHeaterEnd = False skipToHeaterEnd = False
tempTables = {}
for ln in self.cfgBuffer: for ln in self.cfgBuffer:
m = reStartSensors.match(ln) m = reStartSensors.match(ln)
if m: if m:
fp.write(ln) fp.write(ln)
fp.write("// name type pin " fp.write("// name type pin "
"additional\n"); "additional\n");
ttString = "\n// r0 beta r2 vadc\n"
for s in self.sensors: for s in self.sensors:
sstr = "%-10s%-15s%-7s%s" % ((s[0] + ","), (s[1] + ","), sstr = "%-10s%-15s%-7s" % ((s[0] + ","), (s[1] + ","), (s[2] + ","))
(s[2] + ","), s[3]) if s[3] != "NONE":
tt = s[3]
sstr += "THERMISTOR_%s" % s[0].upper()
ttString += "//TEMP_TABLE %-8s (%-8s%-6s%-6s%s)\n" % \
(s[0].upper(), (tt[0] + ","), (tt[1] + ","),
(tt[2] + ","), tt[3])
else:
sstr += s[3]
fp.write("DEFINE_TEMP_SENSOR(%s)\n" % sstr) fp.write("DEFINE_TEMP_SENSOR(%s)\n" % sstr)
fp.write(ttString)
skipToSensorEnd = True skipToSensorEnd = True
continue continue
@ -575,6 +611,16 @@ class BoardPanel(wx.Panel):
dlg.ShowModal() dlg.ShowModal()
dlg.Destroy() dlg.Destroy()
if generateTempTables(self.sensors, self.settings):
dlg = wx.MessageDialog(self,
"File ThermistorTable.h successfully written.",
"Save successful", wx.OK + wx.ICON_INFORMATION)
else:
dlg = wx.MessageDialog(self, "Error writing to file ThermistorTable.h.",
"File error", wx.OK + wx.ICON_ERROR)
dlg.ShowModal()
dlg.Destroy()
return True return True
def addNewDefine(self, fp, key, val): def addNewDefine(self, fp, key, val):

View File

@ -39,6 +39,7 @@ reCommDefBL = re.compile("^\s*//\s*#define\s+(\w+)\s+(\S+)")
reDefQS = re.compile("\s*#define\s+(\w+)\s+(\"[^\"]*\")") reDefQS = re.compile("\s*#define\s+(\w+)\s+(\"[^\"]*\")")
reDefTS = re.compile("\s*(DEFINE_TEMP_SENSOR\\([^)]*\\))") reDefTS = re.compile("\s*(DEFINE_TEMP_SENSOR\\([^)]*\\))")
reDefHT = re.compile("\s*(DEFINE_HEATER\\([^)]*\\))") reDefHT = re.compile("\s*(DEFINE_HEATER\\([^)]*\\))")
reDefTT = re.compile("^\s*//\s*TEMP_TABLE\s+(\S+)\s+(\\(.*\\))")
reDefBool = re.compile("\s*#define\s+(\w+)\s+") reDefBool = re.compile("\s*#define\s+(\w+)\s+")
reDefBoolBL = re.compile("^\s*#define\s+(\w+)\s+") reDefBoolBL = re.compile("^\s*#define\s+(\w+)\s+")
reCommDefBoolBL = re.compile("^\s*//\s*#define\s+(\S+)\s+") reCommDefBoolBL = re.compile("^\s*//\s*#define\s+(\S+)\s+")
@ -56,6 +57,7 @@ reHelpTextEnd = re.compile("^\s*\*/")
reSensor = re.compile(".*\\(\s*(\w+)\s*,\s*(\w+)\s*,\s*(\w+)\s*,\s*(\w+)\s*\\)") reSensor = re.compile(".*\\(\s*(\w+)\s*,\s*(\w+)\s*,\s*(\w+)\s*,\s*(\w+)\s*\\)")
reHeater = re.compile(".*\\(\s*(\w+)\s*,\s*(\w+)\s*,\s*(\w+)\s*\\)") reHeater = re.compile(".*\\(\s*(\w+)\s*,\s*(\w+)\s*,\s*(\w+)\s*\\)")
reTempTable = re.compile(".*\\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d*.?\d*)\s*\\)")
reInteger = re.compile("^\d+U?L?$") reInteger = re.compile("^\d+U?L?$")
reFloat = re.compile("^\d+(\.\d*)?$") reFloat = re.compile("^\d+(\.\d*)?$")

View File

@ -270,7 +270,7 @@ class PrinterPanel(wx.Panel):
def onSaveConfig(self, evt): def onSaveConfig(self, evt):
path = self.configFile path = self.configFile
self.saveConfigFile(path) return self.saveConfigFile(path)
def onSaveConfigAs(self, evt): def onSaveConfigAs(self, evt):
wildcard = "Printer configuration (printer.*.h)|printer.*.h" wildcard = "Printer configuration (printer.*.h)|printer.*.h"
@ -288,10 +288,12 @@ class PrinterPanel(wx.Panel):
path = dlg.GetPath() path = dlg.GetPath()
dlg.Destroy() dlg.Destroy()
if self.saveConfigFile(path): rc = self.saveConfigFile(path)
if rc:
self.parent.setPrinterTabFile(os.path.basename(path)) self.parent.setPrinterTabFile(os.path.basename(path))
self.protFileLoaded = False self.protFileLoaded = False
self.parent.enableSavePrinter(True, True) self.parent.enableSavePrinter(True, True)
return rc
def saveConfigFile(self, path): def saveConfigFile(self, path):
if os.path.basename(path) in protectedFiles: if os.path.basename(path) in protectedFiles:

View File

@ -42,6 +42,14 @@ class SensorsPage(wx.Panel, Page):
bsz.Add(self.bAdd) bsz.Add(self.bAdd)
bsz.AddSpacer((10, 10))
self.bModify = wx.Button(self, wx.ID_ANY, "Modify", size = BSIZESMALL)
self.bModify.SetFont(font)
self.bModify.Enable(False)
self.Bind(wx.EVT_BUTTON, self.doModify, self.bModify)
bsz.Add(self.bModify)
self.bModify.SetToolTipString("Modify the selected temperature sensor.")
bsz.AddSpacer((10, 10)) bsz.AddSpacer((10, 10))
self.bDelete = wx.Button(self, wx.ID_ANY, "Delete", size = BSIZESMALL) self.bDelete = wx.Button(self, wx.ID_ANY, "Delete", size = BSIZESMALL)
self.bDelete.SetFont(font) self.bDelete.SetFont(font)
@ -60,8 +68,10 @@ class SensorsPage(wx.Panel, Page):
self.selection = n self.selection = n
if n is None: if n is None:
self.bDelete.Enable(False) self.bDelete.Enable(False)
self.bModify.Enable(False)
else: else:
self.bDelete.Enable(True) self.bDelete.Enable(True)
self.bModify.Enable(True)
def doAdd(self, evt): def doAdd(self, evt):
nm = [] nm = []
@ -83,6 +93,34 @@ class SensorsPage(wx.Panel, Page):
self.validateTable() self.validateTable()
self.assertModified(True) self.assertModified(True)
def doModify(self, evt):
if self.selection is None:
return
nm = []
for s in self.sensors:
nm.append(s[0])
s = self.sensors[self.selection]
dlg = AddSensorDlg(self, nm, self.validPins, self.font,
name = s[0], stype = s[1], pin = s[2],
r0 = s[3][0], beta = s[3][1], r2 = s[3][2],
vadc = s[3][3], modify = True)
rc = dlg.ShowModal()
if rc == wx.ID_OK:
tt = dlg.getValues()
dlg.Destroy()
if rc != wx.ID_OK:
return
self.assertModified(True)
self.sensors[self.selection] = tt
self.lb.updateList(self.sensors)
self.validateTable()
self.assertModified(True)
def doDelete(self, evt): def doDelete(self, evt):
if self.selection is None: if self.selection is None:
return return

View File

@ -22,6 +22,12 @@ class Settings:
self.programmer = "wiring" self.programmer = "wiring"
self.port = "/dev/ttyACM0" self.port = "/dev/ttyACM0"
self.t0 = 25;
self.r1 = 0;
self.numTemps = 25
self.maxAdc = 1023
self.minAdc = 1
self.cfg = ConfigParser.ConfigParser() self.cfg = ConfigParser.ConfigParser()
self.cfg.optionxform = str self.cfg.optionxform = str
if not self.cfg.read(self.inifile): if not self.cfg.read(self.inifile):
@ -45,6 +51,16 @@ class Settings:
self.port = value self.port = value
elif opt == "objcopyflags": elif opt == "objcopyflags":
self.objcopyflags = value self.objcopyflags = value
elif opt == "t0":
self.t0 = value
elif opt == "r1":
self.r1 = value
elif opt == "numtemps":
self.numTemps = value
elif opt == "maxadc":
self.maxAdc = value
elif opt == "minadc":
self.minAdc = value
else: else:
print "Unknown %s option: %s - ignoring." % (self.section, opt) print "Unknown %s option: %s - ignoring." % (self.section, opt)
else: else:
@ -63,6 +79,11 @@ class Settings:
self.cfg.set(self.section, "objcopyflags", str(self.objcopyflags)) self.cfg.set(self.section, "objcopyflags", str(self.objcopyflags))
self.cfg.set(self.section, "programmer", str(self.programmer)) self.cfg.set(self.section, "programmer", str(self.programmer))
self.cfg.set(self.section, "port", str(self.port)) self.cfg.set(self.section, "port", str(self.port))
self.cfg.set(self.section, "t0", str(self.t0))
self.cfg.set(self.section, "r1", str(self.r1))
self.cfg.set(self.section, "numtemps", str(self.numTemps))
self.cfg.set(self.section, "maxadc", str(self.maxAdc))
self.cfg.set(self.section, "minadc", str(self.minAdc))
try: try:
cfp = open(self.inifile, 'wb') cfp = open(self.inifile, 'wb')

View File

@ -0,0 +1,119 @@
import os
from createTemperatureLookup import Thermistor
class ThermistorTableFile:
def __init__(self, folder):
self.error = False
fn = os.path.join(folder, "ThermistorTable.h")
try:
self.fp = open(fn, 'wb')
except:
self.error = True
def close(self):
self.fp.close()
def output(self, text):
self.fp.write(text + "\n")
def generateTempTables(sensors, settings):
ofp = ThermistorTableFile(settings.folder)
if ofp.error:
return False
mult = 4
minadc = int(settings.minAdc)
N = int(settings.numTemps)
# Make a list of single-item dicts to keep the order.
tl = []
for sensor in sensors:
if sensor[3] != "NONE":
tl.append({sensor[0].upper(): sensor[3]})
ofp.output("");
ofp.output("/**");
ofp.output(" This file was autogenerated when saving a board with");
ofp.output(" Teacup's Configtool. You can edit it, but the next board");
ofp.output(" save operation in Configtool will overwrite it without");
ofp.output(" asking.");
ofp.output("*/");
ofp.output("");
ofp.output("#define NUMTABLES %d" % len(tl))
ofp.output("#define NUMTEMPS %d" % N)
ofp.output("");
for i in range(len(tl)):
ofp.output("#define THERMISTOR_%s %d" % (tl[i].keys()[0], i))
ofp.output("");
if len(tl) == 0 or N == 0:
ofp.close();
return True
ofp.output("const uint16_t PROGMEM temptable[NUMTABLES][NUMTEMPS][2] = {")
tcount = 0
for tn in tl:
tcount += 1
t = tn.values()[0]
r0 = t[0]
beta = t[1]
r2 = t[2]
vadc = t[3]
ofp.output(" // %s temp table parameters:" % tn.keys()[0])
ofp.output((" // R0 = %s, T0 = %s, R1 = %s, R2 = %s, beta = %s, "
"maxadc = %s") % (r0, settings.t0, settings.r1, r2,
beta, settings.maxAdc))
ofp.output(" {")
thm = Thermistor(int(r0),
int(settings.t0),
int(beta),
int(settings.r1),
int(r2),
float(vadc),
float(vadc))
maxadc = int(settings.maxAdc)
zadc = int(thm.setting(0))
if zadc < maxadc:
maxadc = zadc
increment = float(maxadc - minadc) / float(N - 1);
ct = 1.0
adcs = []
for i in range(N):
adcs.append(int(ct))
ct += increment
counter = 0
for adc in adcs:
counter = counter + 1
degC = thm.temp(adc)
resistance = thm.resistance(thm.temp(adc))
vTherm = adc * thm.vadc / 1024
ptherm = vTherm * vTherm / resistance
if adc > 1:
resolution = thm.temp(adc - 1) - thm.temp(adc)
else:
resolution = thm.temp(adc) - thm.temp(adc + 1)
if counter == len(adcs):
sep = " "
else:
sep = ","
ostr = (" {%4s, %5s}%s // %6.2f C, %6.0f ohms, %0.3f V,"
" %0.2f C/count, %0.2f mW") % (adc, int(thm.temp(adc) * mult),
sep, degC, resistance, vTherm, resolution, ptherm * 1000)
ofp.output(ostr)
if tcount == len(tl):
ofp.output(" }")
else:
ofp.output(" },")
ofp.output("};")
ofp.close()
return True