From 732bd470cf3d40e0d44deb866d359e9e5e40aa1f Mon Sep 17 00:00:00 2001 From: Matt Gilbert Date: Sat, 19 Nov 2016 15:57:59 -0600 Subject: [PATCH] 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! --- config/printer.mendel.h | 24 +++++++++++++ config/printer.mendel90.h | 24 +++++++++++++ config/printer.pcbscriber.h | 26 +++++++++++++- config/printer.tronxy.h | 24 +++++++++++++ config/printer.wolfstrap.h | 24 +++++++++++++ configtool/data.py | 6 ++++ configtool/mechanicalpage.py | 53 +++++++++++++++++++++++++-- configtool/printer.generic.h | 24 +++++++++++++ configtool/printer.py | 70 +++++++++++++++++++++++++++++++++++- home.c | 16 +++------ home.h | 1 + 11 files changed, 276 insertions(+), 16 deletions(-) diff --git a/config/printer.mendel.h b/config/printer.mendel.h index e134238..706c9e7 100644 --- a/config/printer.mendel.h +++ b/config/printer.mendel.h @@ -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 diff --git a/config/printer.mendel90.h b/config/printer.mendel90.h index 3e3fdfe..239705a 100644 --- a/config/printer.mendel90.h +++ b/config/printer.mendel90.h @@ -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 diff --git a/config/printer.pcbscriber.h b/config/printer.pcbscriber.h index de0299a..7030669 100644 --- a/config/printer.pcbscriber.h +++ b/config/printer.pcbscriber.h @@ -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 diff --git a/config/printer.tronxy.h b/config/printer.tronxy.h index c638ed0..db70943 100644 --- a/config/printer.tronxy.h +++ b/config/printer.tronxy.h @@ -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 diff --git a/config/printer.wolfstrap.h b/config/printer.wolfstrap.h index 6d22323..a03cff3 100644 --- a/config/printer.wolfstrap.h +++ b/config/printer.wolfstrap.h @@ -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 diff --git a/configtool/data.py b/configtool/data.py index 4c459c9..7c20a40 100644 --- a/configtool/data.py +++ b/configtool/data.py @@ -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*\\)") diff --git a/configtool/mechanicalpage.py b/configtool/mechanicalpage.py index bd7d831..8f0dd3e 100644 --- a/configtool/mechanicalpage.py +++ b/configtool/mechanicalpage.py @@ -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 diff --git a/configtool/printer.generic.h b/configtool/printer.generic.h index e8625e6..48ad466 100644 --- a/configtool/printer.generic.h +++ b/configtool/printer.generic.h @@ -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 diff --git a/configtool/printer.py b/configtool/printer.py index 2fc9c7c..ba95981 100644 --- a/configtool/printer.py +++ b/configtool/printer.py @@ -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() diff --git a/home.c b/home.c index e3f1a8d..6a5348d 100644 --- a/home.c +++ b/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" + #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() { diff --git a/home.h b/home.h index a819ec1..3423e95 100644 --- a/home.h +++ b/home.h @@ -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);