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:
Matt Gilbert 2016-11-19 15:57:59 -06:00 committed by Markus Hitter
parent 6d1fa83c0e
commit 732bd470cf
11 changed files with 276 additions and 16 deletions

View File

@ -111,6 +111,30 @@
*/ */
#define E_ABSOLUTE #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 /** \def ACCELERATION_REPRAP ACCELERATION_RAMPING ACCELERATION_TEMPORAL
Choose optionally one of ACCELERATION_REPRAP, ACCELERATION_RAMPING or Choose optionally one of ACCELERATION_REPRAP, ACCELERATION_RAMPING or
ACCELERATION_TEMPORAL. With none of them defined, movements are done ACCELERATION_TEMPORAL. With none of them defined, movements are done

View File

@ -111,6 +111,30 @@
*/ */
#define E_ABSOLUTE #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 /** \def ACCELERATION_REPRAP ACCELERATION_RAMPING ACCELERATION_TEMPORAL
Choose optionally one of ACCELERATION_REPRAP, ACCELERATION_RAMPING or Choose optionally one of ACCELERATION_REPRAP, ACCELERATION_RAMPING or
ACCELERATION_TEMPORAL. With none of them defined, movements are done ACCELERATION_TEMPORAL. With none of them defined, movements are done

View File

@ -99,7 +99,7 @@
//#define Y_MAX 200.0 //#define Y_MAX 200.0
//#define Z_MIN 0.0 //#define Z_MIN 0.0
//#define Z_MAX 140.0 #define Z_MAX 1000
/** \def E_ABSOLUTE /** \def E_ABSOLUTE
Some G-code creators produce relative length commands for the extruder, Some G-code creators produce relative length commands for the extruder,
@ -111,6 +111,30 @@
*/ */
#define E_ABSOLUTE #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 /** \def ACCELERATION_REPRAP ACCELERATION_RAMPING ACCELERATION_TEMPORAL
Choose optionally one of ACCELERATION_REPRAP, ACCELERATION_RAMPING or Choose optionally one of ACCELERATION_REPRAP, ACCELERATION_RAMPING or
ACCELERATION_TEMPORAL. With none of them defined, movements are done ACCELERATION_TEMPORAL. With none of them defined, movements are done

View File

@ -111,6 +111,30 @@
*/ */
#define E_ABSOLUTE #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 /** \def ACCELERATION_REPRAP ACCELERATION_RAMPING ACCELERATION_TEMPORAL
Choose optionally one of ACCELERATION_REPRAP, ACCELERATION_RAMPING or Choose optionally one of ACCELERATION_REPRAP, ACCELERATION_RAMPING or
ACCELERATION_TEMPORAL. With none of them defined, movements are done ACCELERATION_TEMPORAL. With none of them defined, movements are done

View File

@ -111,6 +111,30 @@
*/ */
#define E_ABSOLUTE #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 /** \def ACCELERATION_REPRAP ACCELERATION_RAMPING ACCELERATION_TEMPORAL
Choose optionally one of ACCELERATION_REPRAP, ACCELERATION_RAMPING or Choose optionally one of ACCELERATION_REPRAP, ACCELERATION_RAMPING or
ACCELERATION_TEMPORAL. With none of them defined, movements are done ACCELERATION_TEMPORAL. With none of them defined, movements are done

View File

@ -75,3 +75,9 @@ defineValueFormat = "#define %-24s %s\n"
defineBoolFormat = "#define %s\n" defineBoolFormat = "#define %s\n"
defineHeaterFormat = "#define HEATER_%s HEATER_%s\n" defineHeaterFormat = "#define HEATER_%s HEATER_%s\n"
defineDCExtruderFormat = "#define %-24s 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*\\)")

View File

@ -30,6 +30,9 @@ class MechanicalPage(wx.Panel, Page):
self.kinematicsKeys = ['KINEMATICS_STRAIGHT', 'KINEMATICS_COREXY'] 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:", self.labels = {'STEPS_PER_M_X': "X:", 'STEPS_PER_M_Y': "Y:",
'STEPS_PER_M_Z': "Z:", 'STEPS_PER_M_E' : "E:", 'STEPS_PER_M_Z': "Z:", 'STEPS_PER_M_E' : "E:",
'MAXIMUM_FEEDRATE_X': "X:", 'MAXIMUM_FEEDRATE_Y': "Y:", '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:", 'Y_MAX': "Max Y:", 'Z_MIN': "Min Z:", 'Z_MAX': "Max Z:",
'E_ABSOLUTE': "Absolute E Coordinates", 'E_ABSOLUTE': "Absolute E Coordinates",
'KINEMATICS_STRAIGHT': "Straight", '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; labelWidth = 40;
labelWidthHoming = 60;
sz = wx.GridBagSizer() sz = wx.GridBagSizer()
sz.AddSpacer((10, 10), pos = (0, 0)) 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.Add(rb, 1, wx.LEFT + wx.RIGHT, 16)
sbox.AddSpacer((5, 5)) 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) 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)) sz.Add(vsz, pos = (3, 1))
@ -145,6 +160,18 @@ class MechanicalPage(wx.Panel, Page):
self.bCalcScrew = b self.bCalcScrew = b
sz.Add(bsz, pos = (1, 3)) 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.enableAll(False)
self.SetSizer(sz) self.SetSizer(sz)
@ -181,17 +208,37 @@ class MechanicalPage(wx.Panel, Page):
for k in self.kinematicsKeys: for k in self.kinematicsKeys:
self.radioButtons[k].SetToolTipString(ht['KINEMATICS']) 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): def insertValues(self, cfgValues):
Page.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: for tag in self.kinematicsKeys:
if tag in cfgValues.keys() and cfgValues[tag]: if tag in cfgValues.keys() and cfgValues[tag]:
self.radioButtons[tag].SetValue(True) 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): def getValues(self):
result = Page.getValues(self) result = Page.getValues(self)
for tag in self.kinematicsKeys: for tag in self.kinematicsKeys:
result[tag] = self.radioButtons[tag].GetValue() 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 return result

View File

@ -111,6 +111,30 @@
*/ */
#define E_ABSOLUTE #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 /** \def ACCELERATION_REPRAP ACCELERATION_RAMPING ACCELERATION_TEMPORAL
Choose optionally one of ACCELERATION_REPRAP, ACCELERATION_RAMPING or Choose optionally one of ACCELERATION_REPRAP, ACCELERATION_RAMPING or
ACCELERATION_TEMPORAL. With none of them defined, movements are done ACCELERATION_TEMPORAL. With none of them defined, movements are done

View File

@ -6,7 +6,9 @@ from sys import platform
from configtool.data import (defineValueFormat, defineBoolFormat, from configtool.data import (defineValueFormat, defineBoolFormat,
reHelpTextStart, reHelpTextEnd, reHelpTextStart, reHelpTextEnd,
reDefine, reDefineBL, reDefQS, reDefQSm, reDefine, reDefineBL, reDefQS, reDefQSm,
reDefQSm2, reDefBool, reDefBoolBL) reDefQSm2, reDefBool, reDefBoolBL,
reHomingOpts, reStartHoming, reEndHoming,
reDefHoming, reHoming4)
class Printer: class Printer:
def __init__(self, settings): def __init__(self, settings):
@ -86,6 +88,12 @@ class Printer:
ln = prevLines + ln ln = prevLines + ln
prevLines = "" prevLines = ""
if self.parseCandidateValues(ln):
continue
if self.parseHoming(ln):
continue
self.parseDefineName(ln) self.parseDefineName(ln)
self.parseDefineValue(ln) self.parseDefineValue(ln)
@ -118,6 +126,12 @@ class Printer:
ln = prevLines + ln ln = prevLines + ln
prevLines = "" prevLines = ""
if self.parseCandidateValues(ln):
continue
if self.parseHoming(ln):
continue
self.parseDefineValue(ln) self.parseDefineValue(ln)
# Parsing done. All parsed stuff is now in these array and dicts. # Parsing done. All parsed stuff is now in these array and dicts.
@ -139,6 +153,40 @@ class Printer:
return False 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): def parseDefineValue(self, ln):
m = reDefQS.search(ln) m = reDefQS.search(ln)
if m: if m:
@ -194,7 +242,27 @@ class Printer:
fp = file(path, 'w') fp = file(path, 'w')
self.configFile = path self.configFile = path
skipToHomingEnd = False
for ln in self.cfgBuffer: 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) m = reDefine.match(ln)
if m: if m:
t = m.groups() t = m.groups()

14
home.c
View File

@ -73,26 +73,20 @@ void set_axis_home_position(enum axis_e n, int8_t dir);
void home() { void home() {
#ifdef DEFINE_HOMING #ifdef DEFINE_HOMING
#undef DEFINE_HOMING #undef DEFINE_HOMING
#define DEFINE_HOMING(first, second, third) \ #define DEFINE_HOMING(first, second, third, fourth) \
{ \ { \
home_##first(); \ home_##first(); \
home_##second(); \ home_##second(); \
home_##third(); \ home_##third(); \
home_##fourth(); \
}; };
#include "config_wrapper.h" #include "config_wrapper.h"
#undef DEFINE_HOMING #undef DEFINE_HOMING
#else
home_x_negative();
home_x_positive();
home_y_negative();
home_y_positive();
home_z_negative();
home_z_positive();
#endif #endif
} }
void home_none() {
}
/// find X MIN endstop /// find X MIN endstop
void home_x_negative() { void home_x_negative() {

1
home.h
View File

@ -12,6 +12,7 @@ enum axis_endstop_e {
Z_MAX_ENDSTOP = 0x20, Z_MAX_ENDSTOP = 0x20,
}; };
void home_none(void);
void home_x_negative(void); void home_x_negative(void);
void home_x_positive(void); void home_x_positive(void);
void home_y_negative(void); void home_y_negative(void);