Configtool: added logic to generate thermistor temp tables.
Also enable editing of temperature sensors.
This commit is contained in:
parent
1189d809a6
commit
48433a6254
|
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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,9 +40,10 @@ 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)
|
||||||
self.tcName.SetBackgroundColour("pink")
|
if not modify:
|
||||||
|
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)
|
||||||
self.tcName.SetToolTipString("Enter a unique name for this sensor.")
|
self.tcName.SetToolTipString("Enter a unique name for this sensor.")
|
||||||
|
|
@ -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)
|
||||||
ch.SetSelection(0)
|
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
|
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)
|
||||||
self.chPin.SetSelection(0)
|
i = self.chPin.FindString(pin)
|
||||||
|
if i == wx.NOT_FOUND:
|
||||||
|
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.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.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,17 +219,110 @@ 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):
|
||||||
evt.Skip()
|
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):
|
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)
|
||||||
|
|
|
||||||
|
|
@ -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):
|
||||||
|
|
|
||||||
|
|
@ -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*)?$")
|
||||||
|
|
|
||||||
|
|
@ -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:
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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')
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
Loading…
Reference in New Issue