Homing order in configtool.
Adjustments by Traumflug:
- Rebased to current 'experimental'.
- Some whitespace adjustments.
- Renamed labelWidth_homing to labelWidthHoming.
- Fixed an issue in printer.py which would write only the first
character of an option ('x' instead of 'x_positive', 'n'
instead of 'none', etc.)
Thank you very much for the code, Matt!
This commit is contained in:
parent
6d1fa83c0e
commit
732bd470cf
|
|
@ -111,6 +111,30 @@
|
|||
*/
|
||||
#define E_ABSOLUTE
|
||||
|
||||
/** \def HOMING_OPT
|
||||
|
||||
Options for homing movements. 'none' means no movement at all. For each
|
||||
option XXX, a function home_XXX() has to exist, typically in home.c/.h.
|
||||
*/
|
||||
//#define HOMING_OPT none
|
||||
//#define HOMING_OPT x_negative
|
||||
//#define HOMING_OPT x_positive
|
||||
//#define HOMING_OPT y_negative
|
||||
//#define HOMING_OPT y_positive
|
||||
//#define HOMING_OPT z_negative
|
||||
//#define HOMING_OPT z_positive
|
||||
|
||||
/** \def DEFINE_HOMING
|
||||
|
||||
Order (and number) of homing movements.
|
||||
*/
|
||||
#ifndef DEFINE_HOMING
|
||||
#define DEFINE_HOMING(...)
|
||||
#endif
|
||||
//DEFINE_HOMING_START
|
||||
DEFINE_HOMING(x_negative, y_negative, z_negative, none)
|
||||
//DEFINE_HOMING_END
|
||||
|
||||
/** \def ACCELERATION_REPRAP ACCELERATION_RAMPING ACCELERATION_TEMPORAL
|
||||
Choose optionally one of ACCELERATION_REPRAP, ACCELERATION_RAMPING or
|
||||
ACCELERATION_TEMPORAL. With none of them defined, movements are done
|
||||
|
|
|
|||
|
|
@ -111,6 +111,30 @@
|
|||
*/
|
||||
#define E_ABSOLUTE
|
||||
|
||||
/** \def HOMING_OPT
|
||||
|
||||
Options for homing movements. 'none' means no movement at all. For each
|
||||
option XXX, a function home_XXX() has to exist, typically in home.c/.h.
|
||||
*/
|
||||
//#define HOMING_OPT none
|
||||
//#define HOMING_OPT x_negative
|
||||
//#define HOMING_OPT x_positive
|
||||
//#define HOMING_OPT y_negative
|
||||
//#define HOMING_OPT y_positive
|
||||
//#define HOMING_OPT z_negative
|
||||
//#define HOMING_OPT z_positive
|
||||
|
||||
/** \def DEFINE_HOMING
|
||||
|
||||
Order (and number) of homing movements.
|
||||
*/
|
||||
#ifndef DEFINE_HOMING
|
||||
#define DEFINE_HOMING(...)
|
||||
#endif
|
||||
//DEFINE_HOMING_START
|
||||
DEFINE_HOMING(x_negative, y_negative, z_negative, none)
|
||||
//DEFINE_HOMING_END
|
||||
|
||||
/** \def ACCELERATION_REPRAP ACCELERATION_RAMPING ACCELERATION_TEMPORAL
|
||||
Choose optionally one of ACCELERATION_REPRAP, ACCELERATION_RAMPING or
|
||||
ACCELERATION_TEMPORAL. With none of them defined, movements are done
|
||||
|
|
|
|||
|
|
@ -99,7 +99,7 @@
|
|||
//#define Y_MAX 200.0
|
||||
|
||||
//#define Z_MIN 0.0
|
||||
//#define Z_MAX 140.0
|
||||
#define Z_MAX 1000
|
||||
|
||||
/** \def E_ABSOLUTE
|
||||
Some G-code creators produce relative length commands for the extruder,
|
||||
|
|
@ -111,6 +111,30 @@
|
|||
*/
|
||||
#define E_ABSOLUTE
|
||||
|
||||
/** \def HOMING_OPT
|
||||
|
||||
Options for homing movements. 'none' means no movement at all. For each
|
||||
option XXX, a function home_XXX() has to exist, typically in home.c/.h.
|
||||
*/
|
||||
//#define HOMING_OPT none
|
||||
//#define HOMING_OPT x_negative
|
||||
//#define HOMING_OPT x_positive
|
||||
//#define HOMING_OPT y_negative
|
||||
//#define HOMING_OPT y_positive
|
||||
//#define HOMING_OPT z_negative
|
||||
//#define HOMING_OPT z_positive
|
||||
|
||||
/** \def DEFINE_HOMING
|
||||
|
||||
Order (and number) of homing movements.
|
||||
*/
|
||||
#ifndef DEFINE_HOMING
|
||||
#define DEFINE_HOMING(...)
|
||||
#endif
|
||||
//DEFINE_HOMING_START
|
||||
DEFINE_HOMING(z_negative, x_negative, y_negative, none)
|
||||
//DEFINE_HOMING_END
|
||||
|
||||
/** \def ACCELERATION_REPRAP ACCELERATION_RAMPING ACCELERATION_TEMPORAL
|
||||
Choose optionally one of ACCELERATION_REPRAP, ACCELERATION_RAMPING or
|
||||
ACCELERATION_TEMPORAL. With none of them defined, movements are done
|
||||
|
|
|
|||
|
|
@ -111,6 +111,30 @@
|
|||
*/
|
||||
#define E_ABSOLUTE
|
||||
|
||||
/** \def HOMING_OPT
|
||||
|
||||
Options for homing movements. 'none' means no movement at all. For each
|
||||
option XXX, a function home_XXX() has to exist, typically in home.c/.h.
|
||||
*/
|
||||
//#define HOMING_OPT none
|
||||
//#define HOMING_OPT x_negative
|
||||
//#define HOMING_OPT x_positive
|
||||
//#define HOMING_OPT y_negative
|
||||
//#define HOMING_OPT y_positive
|
||||
//#define HOMING_OPT z_negative
|
||||
//#define HOMING_OPT z_positive
|
||||
|
||||
/** \def DEFINE_HOMING
|
||||
|
||||
Order (and number) of homing movements.
|
||||
*/
|
||||
#ifndef DEFINE_HOMING
|
||||
#define DEFINE_HOMING(...)
|
||||
#endif
|
||||
//DEFINE_HOMING_START
|
||||
DEFINE_HOMING(x_negative, y_negative, z_negative, none)
|
||||
//DEFINE_HOMING_END
|
||||
|
||||
/** \def ACCELERATION_REPRAP ACCELERATION_RAMPING ACCELERATION_TEMPORAL
|
||||
Choose optionally one of ACCELERATION_REPRAP, ACCELERATION_RAMPING or
|
||||
ACCELERATION_TEMPORAL. With none of them defined, movements are done
|
||||
|
|
|
|||
|
|
@ -111,6 +111,30 @@
|
|||
*/
|
||||
#define E_ABSOLUTE
|
||||
|
||||
/** \def HOMING_OPT
|
||||
|
||||
Options for homing movements. 'none' means no movement at all. For each
|
||||
option XXX, a function home_XXX() has to exist, typically in home.c/.h.
|
||||
*/
|
||||
//#define HOMING_OPT none
|
||||
//#define HOMING_OPT x_negative
|
||||
//#define HOMING_OPT x_positive
|
||||
//#define HOMING_OPT y_negative
|
||||
//#define HOMING_OPT y_positive
|
||||
//#define HOMING_OPT z_negative
|
||||
//#define HOMING_OPT z_positive
|
||||
|
||||
/** \def DEFINE_HOMING
|
||||
|
||||
Order (and number) of homing movements.
|
||||
*/
|
||||
#ifndef DEFINE_HOMING
|
||||
#define DEFINE_HOMING(...)
|
||||
#endif
|
||||
//DEFINE_HOMING_START
|
||||
DEFINE_HOMING(x_negative, y_negative, z_negative, none)
|
||||
//DEFINE_HOMING_END
|
||||
|
||||
/** \def ACCELERATION_REPRAP ACCELERATION_RAMPING ACCELERATION_TEMPORAL
|
||||
Choose optionally one of ACCELERATION_REPRAP, ACCELERATION_RAMPING or
|
||||
ACCELERATION_TEMPORAL. With none of them defined, movements are done
|
||||
|
|
|
|||
|
|
@ -75,3 +75,9 @@ defineValueFormat = "#define %-24s %s\n"
|
|||
defineBoolFormat = "#define %s\n"
|
||||
defineHeaterFormat = "#define HEATER_%s HEATER_%s\n"
|
||||
defineDCExtruderFormat = "#define %-24s HEATER_%s\n"
|
||||
|
||||
reHomingOpts = re.compile("^\s*//\s*#define\s+HOMING_OPT\s+(\w+)")
|
||||
reStartHoming = re.compile("^\s*//\s*DEFINE_HOMING_START")
|
||||
reEndHoming = re.compile("^\s*//\s*DEFINE_HOMING_END")
|
||||
reDefHoming = re.compile("\s*(DEFINE_HOMING\\([^)]*\\))")
|
||||
reHoming4 = re.compile(".*\\(\s*(\w+)\s*,\s*(\w+)\s*,\s*(\w+)\s*,\s*(\w+)\s*\\)")
|
||||
|
|
|
|||
|
|
@ -30,6 +30,9 @@ class MechanicalPage(wx.Panel, Page):
|
|||
|
||||
self.kinematicsKeys = ['KINEMATICS_STRAIGHT', 'KINEMATICS_COREXY']
|
||||
|
||||
self.homingKeys = [('HOMING_STEP1', 2), ('HOMING_STEP2', 2),
|
||||
('HOMING_STEP3', 2), ('HOMING_STEP4', 2)]
|
||||
|
||||
self.labels = {'STEPS_PER_M_X': "X:", 'STEPS_PER_M_Y': "Y:",
|
||||
'STEPS_PER_M_Z': "Z:", 'STEPS_PER_M_E' : "E:",
|
||||
'MAXIMUM_FEEDRATE_X': "X:", 'MAXIMUM_FEEDRATE_Y': "Y:",
|
||||
|
|
@ -42,9 +45,21 @@ class MechanicalPage(wx.Panel, Page):
|
|||
'Y_MAX': "Max Y:", 'Z_MIN': "Min Z:", 'Z_MAX': "Max Z:",
|
||||
'E_ABSOLUTE': "Absolute E Coordinates",
|
||||
'KINEMATICS_STRAIGHT': "Straight",
|
||||
'KINEMATICS_COREXY': "CoreXY"}
|
||||
'KINEMATICS_COREXY': "CoreXY",
|
||||
'HOMING_STEP1': "Step 1:",
|
||||
'HOMING_STEP2': "Step 2:",
|
||||
'HOMING_STEP3': "Step 3:",
|
||||
'HOMING_STEP4': "Step 4:",
|
||||
'none': "-",
|
||||
'x_negative': "X min",
|
||||
'x_positive': "X max",
|
||||
'y_negative': "Y min",
|
||||
'y_positive': "Y max",
|
||||
'z_negative': "Z min",
|
||||
'z_positive': "Z max"}
|
||||
|
||||
labelWidth = 40;
|
||||
labelWidthHoming = 60;
|
||||
|
||||
sz = wx.GridBagSizer()
|
||||
sz.AddSpacer((10, 10), pos = (0, 0))
|
||||
|
|
@ -119,11 +134,11 @@ class MechanicalPage(wx.Panel, Page):
|
|||
sbox.Add(rb, 1, wx.LEFT + wx.RIGHT, 16)
|
||||
sbox.AddSpacer((5, 5))
|
||||
|
||||
vsz.Add(sbox, 1, wx.LEFT, 40)
|
||||
vsz.Add(sbox, 1, wx.LEFT, 10)
|
||||
|
||||
cb = self.addCheckBox('E_ABSOLUTE', self.onCheckBox)
|
||||
|
||||
vsz.Add(cb, 1, wx.LEFT, 40)
|
||||
vsz.Add(cb, 1, wx.LEFT, 10)
|
||||
|
||||
sz.Add(vsz, pos = (3, 1))
|
||||
|
||||
|
|
@ -145,6 +160,18 @@ class MechanicalPage(wx.Panel, Page):
|
|||
self.bCalcScrew = b
|
||||
|
||||
sz.Add(bsz, pos = (1, 3))
|
||||
|
||||
b = wx.StaticBox(self, wx.ID_ANY, "Homing Order")
|
||||
b.SetFont(font)
|
||||
sbox = wx.StaticBoxSizer(b, wx.VERTICAL)
|
||||
sbox.AddSpacer((5, 5))
|
||||
for k, ctype in self.homingKeys:
|
||||
if ctype == 2:
|
||||
tc = self.addChoice(k, [], 0, labelWidthHoming, self.onChoice)
|
||||
sbox.Add(tc)
|
||||
sbox.AddSpacer((5, 5))
|
||||
sz.Add(sbox, pos = (3, 3))
|
||||
|
||||
self.enableAll(False)
|
||||
self.SetSizer(sz)
|
||||
|
||||
|
|
@ -181,17 +208,37 @@ class MechanicalPage(wx.Panel, Page):
|
|||
for k in self.kinematicsKeys:
|
||||
self.radioButtons[k].SetToolTipString(ht['KINEMATICS'])
|
||||
|
||||
def prepareHomingValues(self, name, i, cfgValues):
|
||||
self.choices[name].Clear()
|
||||
for p in cfgValues['HOMING_OPTS']:
|
||||
self.choices[name].Append(self.labels[p])
|
||||
i = cfgValues['HOMING_OPTS'].index(cfgValues[name])
|
||||
self.choices[name].SetSelection(i)
|
||||
|
||||
def insertValues(self, cfgValues):
|
||||
Page.insertValues(self, cfgValues)
|
||||
|
||||
self.prepareHomingValues('HOMING_STEP1', 0, cfgValues)
|
||||
self.prepareHomingValues('HOMING_STEP2', 1, cfgValues)
|
||||
self.prepareHomingValues('HOMING_STEP3', 2, cfgValues)
|
||||
self.prepareHomingValues('HOMING_STEP4', 3, cfgValues)
|
||||
|
||||
for tag in self.kinematicsKeys:
|
||||
if tag in cfgValues.keys() and cfgValues[tag]:
|
||||
self.radioButtons[tag].SetValue(True)
|
||||
|
||||
def getHomingValue(self, name, result):
|
||||
return (self.labels.keys()[self.labels.values().index(result[name][0])], True)
|
||||
|
||||
def getValues(self):
|
||||
result = Page.getValues(self)
|
||||
|
||||
for tag in self.kinematicsKeys:
|
||||
result[tag] = self.radioButtons[tag].GetValue()
|
||||
|
||||
result['HOMING_STEP1'] = self.getHomingValue('HOMING_STEP1', result)
|
||||
result['HOMING_STEP2'] = self.getHomingValue('HOMING_STEP2', result)
|
||||
result['HOMING_STEP3'] = self.getHomingValue('HOMING_STEP3', result)
|
||||
result['HOMING_STEP4'] = self.getHomingValue('HOMING_STEP4', result)
|
||||
|
||||
return result
|
||||
|
|
|
|||
|
|
@ -111,6 +111,30 @@
|
|||
*/
|
||||
#define E_ABSOLUTE
|
||||
|
||||
/** \def HOMING_OPT
|
||||
|
||||
Options for homing movements. 'none' means no movement at all. For each
|
||||
option XXX, a function home_XXX() has to exist, typically in home.c/.h.
|
||||
*/
|
||||
//#define HOMING_OPT none
|
||||
//#define HOMING_OPT x_negative
|
||||
//#define HOMING_OPT x_positive
|
||||
//#define HOMING_OPT y_negative
|
||||
//#define HOMING_OPT y_positive
|
||||
//#define HOMING_OPT z_negative
|
||||
//#define HOMING_OPT z_positive
|
||||
|
||||
/** \def DEFINE_HOMING
|
||||
|
||||
Order (and number) of homing movements.
|
||||
*/
|
||||
#ifndef DEFINE_HOMING
|
||||
#define DEFINE_HOMING(...)
|
||||
#endif
|
||||
//DEFINE_HOMING_START
|
||||
DEFINE_HOMING(x_negative, y_negative, z_negative, none)
|
||||
//DEFINE_HOMING_END
|
||||
|
||||
/** \def ACCELERATION_REPRAP ACCELERATION_RAMPING ACCELERATION_TEMPORAL
|
||||
Choose optionally one of ACCELERATION_REPRAP, ACCELERATION_RAMPING or
|
||||
ACCELERATION_TEMPORAL. With none of them defined, movements are done
|
||||
|
|
|
|||
|
|
@ -6,7 +6,9 @@ from sys import platform
|
|||
from configtool.data import (defineValueFormat, defineBoolFormat,
|
||||
reHelpTextStart, reHelpTextEnd,
|
||||
reDefine, reDefineBL, reDefQS, reDefQSm,
|
||||
reDefQSm2, reDefBool, reDefBoolBL)
|
||||
reDefQSm2, reDefBool, reDefBoolBL,
|
||||
reHomingOpts, reStartHoming, reEndHoming,
|
||||
reDefHoming, reHoming4)
|
||||
|
||||
class Printer:
|
||||
def __init__(self, settings):
|
||||
|
|
@ -86,6 +88,12 @@ class Printer:
|
|||
ln = prevLines + ln
|
||||
prevLines = ""
|
||||
|
||||
if self.parseCandidateValues(ln):
|
||||
continue
|
||||
|
||||
if self.parseHoming(ln):
|
||||
continue
|
||||
|
||||
self.parseDefineName(ln)
|
||||
self.parseDefineValue(ln)
|
||||
|
||||
|
|
@ -118,6 +126,12 @@ class Printer:
|
|||
ln = prevLines + ln
|
||||
prevLines = ""
|
||||
|
||||
if self.parseCandidateValues(ln):
|
||||
continue
|
||||
|
||||
if self.parseHoming(ln):
|
||||
continue
|
||||
|
||||
self.parseDefineValue(ln)
|
||||
|
||||
# Parsing done. All parsed stuff is now in these array and dicts.
|
||||
|
|
@ -139,6 +153,40 @@ class Printer:
|
|||
|
||||
return False
|
||||
|
||||
def parseCandidateValues(self, ln):
|
||||
m = reHomingOpts.match(ln)
|
||||
if m:
|
||||
t = m.groups()
|
||||
if len(t) == 1:
|
||||
if 'HOMING_OPTS' in self.cfgValues:
|
||||
if t[0] not in self.cfgValues['HOMING_OPTS']:
|
||||
self.cfgValues['HOMING_OPTS'].append(t[0])
|
||||
else:
|
||||
self.cfgValues['HOMING_OPTS'] = [t[0]]
|
||||
return True
|
||||
|
||||
def parseHoming(self, ln):
|
||||
m = reDefHoming.search(ln)
|
||||
if m:
|
||||
t = m.groups()
|
||||
if len(t) == 1:
|
||||
n = reHoming4.search(t[0])
|
||||
if n:
|
||||
u = n.groups()
|
||||
if len(u) == 4:
|
||||
t2 = []
|
||||
for x in u:
|
||||
t2.append(x)
|
||||
|
||||
self.cfgValues['HOMING_STEP1'] = t2[0]
|
||||
self.cfgValues['HOMING_STEP2'] = t2[1]
|
||||
self.cfgValues['HOMING_STEP3'] = t2[2]
|
||||
self.cfgValues['HOMING_STEP4'] = t2[3]
|
||||
|
||||
return True
|
||||
return None
|
||||
return True
|
||||
|
||||
def parseDefineValue(self, ln):
|
||||
m = reDefQS.search(ln)
|
||||
if m:
|
||||
|
|
@ -194,7 +242,27 @@ class Printer:
|
|||
fp = file(path, 'w')
|
||||
self.configFile = path
|
||||
|
||||
skipToHomingEnd = False
|
||||
|
||||
for ln in self.cfgBuffer:
|
||||
m = reStartHoming.match(ln)
|
||||
if m:
|
||||
fp.write(ln)
|
||||
sstr = "%s, %s, %s, %s" % ((values['HOMING_STEP1']),
|
||||
(values['HOMING_STEP2']),
|
||||
(values['HOMING_STEP3']),
|
||||
(values['HOMING_STEP4']))
|
||||
fp.write("DEFINE_HOMING(%s)\n" % sstr)
|
||||
skipToHomingEnd = True
|
||||
continue
|
||||
|
||||
if skipToHomingEnd:
|
||||
m = reEndHoming.match(ln)
|
||||
if m:
|
||||
fp.write(ln)
|
||||
skipToHomingEnd = False
|
||||
continue
|
||||
|
||||
m = reDefine.match(ln)
|
||||
if m:
|
||||
t = m.groups()
|
||||
|
|
|
|||
14
home.c
14
home.c
|
|
@ -73,26 +73,20 @@ void set_axis_home_position(enum axis_e n, int8_t dir);
|
|||
void home() {
|
||||
#ifdef DEFINE_HOMING
|
||||
#undef DEFINE_HOMING
|
||||
#define DEFINE_HOMING(first, second, third) \
|
||||
#define DEFINE_HOMING(first, second, third, fourth) \
|
||||
{ \
|
||||
home_##first(); \
|
||||
home_##second(); \
|
||||
home_##third(); \
|
||||
home_##fourth(); \
|
||||
};
|
||||
#include "config_wrapper.h"
|
||||
#undef DEFINE_HOMING
|
||||
#else
|
||||
home_x_negative();
|
||||
home_x_positive();
|
||||
|
||||
home_y_negative();
|
||||
home_y_positive();
|
||||
|
||||
home_z_negative();
|
||||
home_z_positive();
|
||||
#endif
|
||||
}
|
||||
|
||||
void home_none() {
|
||||
}
|
||||
|
||||
/// find X MIN endstop
|
||||
void home_x_negative() {
|
||||
|
|
|
|||
Loading…
Reference in New Issue