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
DEFINE_TEMP_SENSOR(extruder, TT_THERMISTOR, AIO13, THERMISTOR_EXTRUDER)
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

View File

@ -143,6 +143,9 @@
//DEFINE_TEMP_SENSORS_START
// name type pin additional
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

View File

@ -149,6 +149,10 @@
// name type pin additional
DEFINE_TEMP_SENSOR(extruder, TT_THERMISTOR, AIO1, THERMISTOR_EXTRUDER)
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

View File

@ -150,6 +150,10 @@
// name type pin additional
DEFINE_TEMP_SENSOR(extruder, TT_THERMISTOR, AIO1, THERMISTOR_EXTRUDER)
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

View File

@ -146,6 +146,10 @@
// name type pin additional
DEFINE_TEMP_SENSOR(extruder, TT_THERMISTOR, AIO2, THERMISTOR_EXTRUDER)
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

View File

@ -147,6 +147,10 @@
// name type pin additional
DEFINE_TEMP_SENSOR(extruder, TT_THERMISTOR, AIO13, THERMISTOR_EXTRUDER)
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

View File

@ -148,6 +148,10 @@
// name type pin additional
DEFINE_TEMP_SENSOR(extruder, TT_THERMISTOR, AIO15, THERMISTOR_EXTRUDER)
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

View File

@ -148,6 +148,10 @@
// name type pin additional
DEFINE_TEMP_SENSOR(extruder, TT_THERMISTOR, AIO7, THERMISTOR_EXTRUDER)
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

View File

@ -148,6 +148,10 @@
// name type pin additional
DEFINE_TEMP_SENSOR(extruder, TT_THERMISTOR, AIO7, THERMISTOR_EXTRUDER)
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

View File

@ -148,6 +148,10 @@
// name type pin additional
DEFINE_TEMP_SENSOR(extruder, TT_THERMISTOR, AIO1, THERMISTOR_EXTRUDER)
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

View File

@ -145,6 +145,10 @@
// name type pin additional
DEFINE_TEMP_SENSOR(extruder, TT_THERMISTOR, AIO7, THERMISTOR_EXTRUDER)
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

View File

@ -145,6 +145,10 @@
// name type pin additional
DEFINE_TEMP_SENSOR(extruder, TT_THERMISTOR, AIO1, THERMISTOR_EXTRUDER)
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

View File

@ -36,3 +36,10 @@ programmer = stk500v2
# The port through which the firmware will be uploaded - passed to avrdude.
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
from configtool.data import (pinNames, BSIZESMALL, sensorTypes, offsetTcLabel,
offsetChLabel)
offsetChLabel, reInteger, reFloat)
class AddSensorDlg(wx.Dialog):
def __init__(self, parent, names, pins, font):
wx.Dialog.__init__(self, parent, wx.ID_ANY, "Add temperature sensor",
size = (400, 204))
def __init__(self, parent, names, pins, font, name = "", stype = "",
pin = "", r0 = "", beta = "", r2 = "", vadc = "",
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.Bind(wx.EVT_CLOSE, self.onCancel)
self.names = names
self.choices = pins
self.modify = modify
labelWidth = 160
self.nameValid = False
self.R0Valid = False
self.betaValid = False
self.R2Valid = False
self.vadcValid = False
hsz = wx.BoxSizer(wx.HORIZONTAL)
hsz.AddSpacer((10, 10))
@ -30,8 +40,9 @@ class AddSensorDlg(wx.Dialog):
st.SetFont(font)
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)
if not modify:
self.tcName.SetBackgroundColour("pink")
self.tcName.Bind(wx.EVT_TEXT, self.onNameEntry)
lsz.Add(self.tcName)
@ -51,7 +62,19 @@ class AddSensorDlg(wx.Dialog):
ch = wx.Choice(self, wx.ID_ANY, choices = sl)
ch.SetFont(font)
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)
stStart = sl[0]
self.chType = ch
lsz.Add(ch)
@ -68,7 +91,11 @@ class AddSensorDlg(wx.Dialog):
self.chPin = wx.Choice(self, wx.ID_ANY, choices = pins)
self.chPin.SetFont(font)
self.chPin.Bind(wx.EVT_CHOICE, self.onChoice)
i = self.chPin.FindString(pin)
if i == wx.NOT_FOUND:
self.chPin.SetSelection(0)
else:
self.chPin.SetSelection(i)
lsz.Add(self.chPin)
self.chPin.SetToolTipString("Choose a pin name for this sensor.")
@ -76,20 +103,71 @@ class AddSensorDlg(wx.Dialog):
csz.AddSpacer((10, 10))
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)
st.SetFont(font)
lsz.Add(st, 1, wx.TOP, offsetTcLabel)
self.tcAddtl = wx.TextCtrl(self, wx.ID_ANY, "")
self.tcAddtl.SetFont(font)
self.tcAddtl.Bind(wx.EVT_TEXT, self.onAddtlEntry)
lsz.Add(self.tcAddtl)
self.tcAddtl.SetToolTipString("Enter additional information required "
"by the sensor type.")
self.tcR0 = wx.TextCtrl(self, wx.ID_ANY, r0)
self.tcR0.SetFont(font)
self.tcR0.Bind(wx.EVT_TEXT, self.onR0Entry)
lsz.Add(self.tcR0)
self.tcR0.SetToolTipString("Nominal resistance of the thermistor. "
"Typically 10000 ( = 10k) or 100000 ( = 100k).")
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))
bsz = wx.BoxSizer(wx.HORIZONTAL)
@ -116,13 +194,21 @@ class AddSensorDlg(wx.Dialog):
self.SetSizer(hsz)
self.Fit()
self.selectSensorType(stStart)
self.validateFields()
def onNameEntry(self, evt):
tc = evt.GetEventObject()
self.validateName(tc)
self.checkDlgValidity()
evt.Skip()
def validateName(self, tc):
w = tc.GetValue().strip()
if w == "":
self.nameValid = False
else:
if w in self.names:
if w in self.names and not self.modify:
self.nameValid = False
else:
self.nameValid = True
@ -133,18 +219,111 @@ class AddSensorDlg(wx.Dialog):
tc.SetBackgroundColour("pink")
tc.Refresh()
self.checkDlgValidity()
evt.Skip()
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)
else:
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()
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):
pass
@ -153,15 +332,26 @@ class AddSensorDlg(wx.Dialog):
s = ch.GetSelection()
label = ch.GetString(s)
self.selectSensorType(label)
self.validateFields()
evt.Skip()
def validateFields(self):
self.validateName(self.tcName)
self.onR0Entry(None)
self.onBetaEntry(None)
self.onR2Entry(None)
self.onVadcEntry(None)
def getValues(self):
nm = self.tcName.GetValue()
pin = self.choices[self.chPin.GetSelection()]
addtl = self.tcAddtl.GetValue()
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"
return (nm, sensorTypes[stype], pin, addtl)

View File

@ -11,13 +11,14 @@ from configtool.data import (defineValueFormat,
reCandProcessors, reCandCPUClocks, reFloatAttr,
reDefine, reDefineBL, reDefQS, reDefQSm,
reDefQSm2, reDefBool, reDefBoolBL, reDefHT,
reDefTS, reSensor, reHeater)
reDefTS, reDefTT, reSensor, reHeater, reTempTable)
from configtool.pinoutspage import PinoutsPage
from configtool.sensorpage import SensorsPage
from configtool.heaterspage import HeatersPage
from configtool.communicationspage import CommunicationsPage
from configtool.cpupage import CpuPage
from configtool.protectedfiles import protectedFiles
from configtool.thermistortablefile import generateTempTables
class BoardPanel(wx.Panel):
@ -229,6 +230,7 @@ class BoardPanel(wx.Panel):
self.candThermPins = []
self.candProcessors = []
self.candClocks = []
tempTables = {}
gatheringHelpText = False
helpTextString = ""
helpKey = None
@ -295,6 +297,15 @@ class BoardPanel(wx.Panel):
self.candClocks.append(t[0])
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
if ln.lstrip().startswith("#define"):
@ -347,6 +358,11 @@ class BoardPanel(wx.Panel):
self.heaters.append(s)
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:
self.parent.enableSaveBoard(False, True)
self.protFileLoaded = True
@ -373,7 +389,7 @@ class BoardPanel(wx.Panel):
if m:
t = m.groups()
if len(t) == 4:
return t
return list(t)
return None
def parseHeater(self, s):
@ -381,12 +397,20 @@ class BoardPanel(wx.Panel):
if m:
t = m.groups()
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
def onSaveConfig(self, evt):
path = self.configFile
self.saveConfigFile(path)
return self.saveConfigFile(path)
def onSaveConfigAs(self, evt):
wildcard = "Board configuration (board.*.h)|board.*.h"
@ -404,10 +428,12 @@ class BoardPanel(wx.Panel):
path = dlg.GetPath()
dlg.Destroy()
if self.saveConfigFile(path):
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:
@ -452,16 +478,26 @@ class BoardPanel(wx.Panel):
skipToSensorEnd = False
skipToHeaterEnd = False
tempTables = {}
for ln in self.cfgBuffer:
m = reStartSensors.match(ln)
if m:
fp.write(ln)
fp.write("// name type pin "
"additional\n");
ttString = "\n// r0 beta r2 vadc\n"
for s in self.sensors:
sstr = "%-10s%-15s%-7s%s" % ((s[0] + ","), (s[1] + ","),
(s[2] + ","), s[3])
sstr = "%-10s%-15s%-7s" % ((s[0] + ","), (s[1] + ","), (s[2] + ","))
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(ttString)
skipToSensorEnd = True
continue
@ -575,6 +611,16 @@ class BoardPanel(wx.Panel):
dlg.ShowModal()
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
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+(\"[^\"]*\")")
reDefTS = re.compile("\s*(DEFINE_TEMP_SENSOR\\([^)]*\\))")
reDefHT = re.compile("\s*(DEFINE_HEATER\\([^)]*\\))")
reDefTT = re.compile("^\s*//\s*TEMP_TABLE\s+(\S+)\s+(\\(.*\\))")
reDefBool = re.compile("\s*#define\s+(\w+)\s+")
reDefBoolBL = re.compile("^\s*#define\s+(\w+)\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*\\)")
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?$")
reFloat = re.compile("^\d+(\.\d*)?$")

View File

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

View File

@ -42,6 +42,14 @@ class SensorsPage(wx.Panel, Page):
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))
self.bDelete = wx.Button(self, wx.ID_ANY, "Delete", size = BSIZESMALL)
self.bDelete.SetFont(font)
@ -60,8 +68,10 @@ class SensorsPage(wx.Panel, Page):
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 doAdd(self, evt):
nm = []
@ -83,6 +93,34 @@ class SensorsPage(wx.Panel, Page):
self.validateTable()
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):
if self.selection is None:
return

View File

@ -22,6 +22,12 @@ class Settings:
self.programmer = "wiring"
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.optionxform = str
if not self.cfg.read(self.inifile):
@ -45,6 +51,16 @@ class Settings:
self.port = value
elif opt == "objcopyflags":
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:
print "Unknown %s option: %s - ignoring." % (self.section, opt)
else:
@ -63,6 +79,11 @@ class Settings:
self.cfg.set(self.section, "objcopyflags", str(self.objcopyflags))
self.cfg.set(self.section, "programmer", str(self.programmer))
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:
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