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
/** \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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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*\\)")

View File

@ -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

View File

@ -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

View File

@ -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
View File

@ -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() {

1
home.h
View File

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