Merge branch 'refs/heads/dev-XXX-isolate-gcode-parser' into dev-227-marlin-compat

This commit is contained in:
Alden Hart
2017-01-12 10:55:04 -05:00
10 changed files with 361 additions and 272 deletions
+58 -30
View File
@@ -694,8 +694,6 @@ void canonical_machine_init()
// memset(&cm, 0, sizeof(cm)); // do not reset canonicalMachineSingleton once it's been initialized
memset(&cm, 0, sizeof(cmSingleton_t)); // do not reset canonicalMachineSingleton once it's been initialized
memset(&cm.gm, 0, sizeof(GCodeState_t)); // clear all values, pointers and status
memset(&cm.gn, 0, sizeof(GCodeInput_t));
memset(&cm.gf, 0, sizeof(GCodeFlags_t));
canonical_machine_init_assertions(); // establish assertions
ACTIVE_MODEL = MODEL; // setup initial Gcode model pointer
@@ -1038,10 +1036,11 @@ stat_t cm_set_arc_distance_mode(const uint8_t mode)
* cm_set_work_offsets() immediately afterwards.
*/
stat_t cm_set_g10_data(const uint8_t P_word, const uint8_t L_word,
stat_t cm_set_g10_data(const uint8_t P_word, const bool P_flag,
const uint8_t L_word, const bool L_flag,
const float offset[], const bool flag[])
{
if (!cm.gf.L_word) {
if (!L_flag) {
return (STAT_L_WORD_IS_MISSING);
}
@@ -1057,8 +1056,9 @@ stat_t cm_set_g10_data(const uint8_t P_word, const uint8_t L_word,
cm.offset[P_word][axis] = _to_millimeters(offset[axis]);
} else {
// Should L20 take into account G92 offsets?
cm.offset[P_word][axis] = cm.gmx.position[axis] -
_to_millimeters(offset[axis]) -
cm.offset[P_word][axis] =
cm.gmx.position[axis] -
_to_millimeters(offset[axis]) -
cm.tl_offset[axis];
}
// persist offsets once machining cycle is over
@@ -1078,8 +1078,8 @@ stat_t cm_set_g10_data(const uint8_t P_word, const uint8_t L_word,
} else {
// L10 should also take into account G92 offset
cm.tt_offset[P_word][axis] =
cm.gmx.position[axis] - _to_millimeters(offset[axis]) -
cm.offset[cm.gm.coord_system][axis] -
cm.gmx.position[axis] - _to_millimeters(offset[axis]) -
cm.offset[cm.gm.coord_system][axis] -
(cm.gmx.origin_offset[axis] * cm.gmx.origin_offset_enable);
}
// persist offsets once machining cycle is over
@@ -1102,27 +1102,27 @@ stat_t cm_set_g10_data(const uint8_t P_word, const uint8_t L_word,
* cm_set_coord_system() - G54-G59
* _exec_offset() - callback from planner
*/
stat_t cm_set_tl_offset(const uint8_t H_word, bool apply_additional)
stat_t cm_set_tl_offset(const uint8_t H_word, const bool H_flag, const bool apply_additional)
{
uint8_t tool;
if (cm.gf.H_word)
{
if (cm.gn.H_word > TOOLS) {
if (H_flag) {
if (H_word > TOOLS) {
return (STAT_H_WORD_IS_INVALID);
}
if (cm.gn.H_word == 0) { // interpret H0 as "current tool", just like no H at all.
if (H_word == 0) { // interpret H0 as "current tool", just like no H at all.
tool = cm.gm.tool;
} else {
tool = cm.gn.H_word;
tool = H_word;
}
} else {
} else {
tool = cm.gm.tool;
}
if (apply_additional) {
for (uint8_t axis = AXIS_X; axis < AXES; axis++) {
cm.tl_offset[axis] += cm.tt_offset[tool][axis];
}
} else {
} else {
for (uint8_t axis = AXIS_X; axis < AXES; axis++) {
cm.tl_offset[axis] = cm.tt_offset[tool][axis];
}
@@ -1596,7 +1596,7 @@ stat_t cm_m48_enable(uint8_t enable) // M48, M49
}
/*
* cm_feed_rate_override_enable() - M50
* cm_mfo_control() - M50 manual feed rate override comtrol
*
* M50 enables manual feedrate override and the optional P override parameter.
* P is expressed as M% to N% of programmed feedrate, typically a value from 0.05 to 2.000.
@@ -1635,38 +1635,64 @@ stat_t cm_m48_enable(uint8_t enable) // M48, M49
* ENABLE ENABLE M50 Pn ENABLE start ramp w/new P value; store P value
* (Note: new ramp will supercede any existing ramp)
*/
stat_t cm_mfo_enable(uint8_t enable) // M50
stat_t cm_mfo_control(const float P_word, const bool P_flag) // M50
{
bool new_enable = true;
bool new_override = false;
if (cm.gf.parameter) { // if parameter is present in Gcode block
if (fp_ZERO(cm.gn.parameter)) {
new_enable = false; // P0 disables override
if (P_flag) { // if parameter is present in Gcode block
if (fp_ZERO(P_word)) {
new_enable = false; // P0 disables override
} else {
if (cm.gn.parameter < FEED_OVERRIDE_MIN) {
if (P_word < FEED_OVERRIDE_MIN) {
return (STAT_INPUT_LESS_THAN_MIN_VALUE);
}
if (cm.gn.parameter > FEED_OVERRIDE_MAX) {
if (P_word > FEED_OVERRIDE_MAX) {
return (STAT_INPUT_EXCEEDS_MAX_VALUE);
}
cm.gmx.mfo_factor = cm.gn.parameter; // it validates - store it.
cm.gmx.mfo_factor = P_word; // P word is valid, store it.
new_override = true;
}
}
if (cm.gmx.m48_enable) { // if master enable is ON
if (cm.gmx.m48_enable) { // if master enable is ON
if (new_enable && (new_override || !cm.gmx.mfo_enable)) { // 3 cases to start a ramp
mp_start_feed_override(FEED_OVERRIDE_RAMP_TIME, cm.gmx.mfo_factor);
} else if (cm.gmx.mfo_enable && !new_enable) { // case to turn off the ramp
mp_end_feed_override(FEED_OVERRIDE_RAMP_TIME);
}
}
cm.gmx.mfo_enable = new_enable; // always update the enable state
cm.gmx.mfo_enable = new_enable; // always update the enable state
return (STAT_OK);
}
// if ((new_enable && new_override) || (new_enable && !cm.gmx.mfo_enable)) {
// if (!(cm.gmx.mfo_enable && new_override)) {
stat_t cm_mto_control(const float P_word, const bool P_flag) // M50.1
{
bool new_enable = true;
bool new_override = false;
if (P_flag) { // if parameter is present in Gcode block
if (fp_ZERO(P_word)) {
new_enable = false; // P0 disables override
} else {
if (P_word < TRAVERSE_OVERRIDE_MIN) {
return (STAT_INPUT_LESS_THAN_MIN_VALUE);
}
if (P_word > TRAVERSE_OVERRIDE_MAX) {
return (STAT_INPUT_EXCEEDS_MAX_VALUE);
}
cm.gmx.mto_factor = P_word; // P word is valid, store it.
new_override = true;
}
}
if (cm.gmx.m48_enable) { // if master enable is ON
if (new_enable && (new_override || !cm.gmx.mfo_enable)) { // 3 cases to start a ramp
mp_start_traverse_override(FEED_OVERRIDE_RAMP_TIME, cm.gmx.mto_factor);
} else if (cm.gmx.mto_enable && !new_enable) { // case to turn off the ramp
mp_end_traverse_override(FEED_OVERRIDE_RAMP_TIME);
}
}
cm.gmx.mto_enable = new_enable; // always update the enable state
return (STAT_OK);
}
/************************************************
* Feedhold and Related Functions (no NIST ref) *
@@ -2583,7 +2609,9 @@ stat_t cm_run_qf(nvObj_t *nv)
stat_t cm_run_home(nvObj_t *nv)
{
if (fp_TRUE(nv->value)) {
cm_homing_cycle_start();
float axes[] = { 1,1,1,1,1,1 };
bool flags[] = { 1,1,1,1,1,1 };
cm_homing_cycle_start(axes, flags);
}
return (STAT_OK);
}
+14 -101
View File
@@ -405,96 +405,6 @@ typedef struct GCodeStateExtended { // Gcode dynamic state extensions - used
} GCodeStateX_t;
typedef struct GCodeInput { // Gcode model inputs - meaning depends on context
uint8_t next_action; // handles G modal group 1 moves & non-modals
cmMotionMode motion_mode; // Group1: G0, G1, G2, G3, G38.2, G80, G81, G82
// G83, G84, G85, G86, G87, G88, G89
uint8_t program_flow; // used only by the gcode_parser
uint32_t linenum; // N word
float target[AXES]; // XYZABC where the move should go
uint8_t H_word; // H word - used by G43s
uint8_t L_word; // L word - used by G10s
float feed_rate; // F - normalized to millimeters/minute
uint8_t feed_rate_mode; // See cmFeedRateMode for settings
float parameter; // P - parameter used for dwell time in seconds, G10 coord select...
float arc_radius; // R - radius value in arc radius mode
float arc_offset[3]; // IJK - used by arc commands
bool m48_enable; // M48/M49 input (enables for feed and spindle)
bool mfo_enable; // M50 feedrate override enable
bool mto_enable; // Mxx traverse override enable
bool sso_enable; // M51 spindle speed override enable
uint8_t select_plane; // G17,G18,G19 - values to set plane to
uint8_t units_mode; // G20,G21 - 0=inches (G20), 1 = mm (G21)
uint8_t coord_system; // G54-G59 - select coordinate system 1-9
uint8_t path_control; // G61... EXACT_PATH, EXACT_STOP, CONTINUOUS
uint8_t distance_mode; // G91 0=use absolute coords(G90), 1=incremental movement
uint8_t arc_distance_mode; // G90.1=use absolute IJK offsets, G91.1=incremental IJK offsets
uint8_t origin_offset_mode; // G92...TRUE=in origin offset mode
uint8_t absolute_override; // G53 TRUE = move using machine coordinates - this block only (G53)
uint8_t tool; // Tool after T and M6 (tool_select and tool_change)
uint8_t tool_select; // T value - T sets this value
uint8_t tool_change; // M6 tool change flag - moves "tool_select" to "tool"
uint8_t mist_coolant; // TRUE = mist on (M7), FALSE = off (M9)
uint8_t flood_coolant; // TRUE = flood on (M8), FALSE = off (M9)
uint8_t spindle_control; // 0=OFF (M5), 1=CW (M3), 2=CCW (M4)
float spindle_speed; // in RPM
float spindle_override_factor; // 1.0000 x S spindle speed. Go up or down from there
uint8_t spindle_override_enable; // TRUE = override enabled
// unimplemented gcode parameters
// float cutter_radius; // D - cutter radius compensation (0 is off)
} GCodeInput_t;
typedef struct GCodeFlags { // Gcode model input flags
bool next_action;
bool motion_mode;
bool modals[MODAL_GROUP_COUNT];
bool program_flow;
bool linenum;
bool target[AXES];
bool H_word;
bool L_word;
bool feed_rate;
bool feed_rate_mode;
bool m48_enable;
bool mfo_enable;
bool mto_enable;
bool sso_enable;
bool select_plane;
bool units_mode;
bool coord_system;
bool path_control;
bool distance_mode;
bool arc_distance_mode;
bool origin_offset_mode;
bool absolute_override;
bool tool;
bool tool_select;
bool tool_change;
bool mist_coolant;
bool flood_coolant;
bool spindle_control;
bool spindle_speed;
bool spindle_override_factor;
bool spindle_override_enable;
bool parameter;
bool arc_radius;
bool arc_offset[3];
} GCodeFlags_t;
/*****************************************************************************
* CANONICAL MACHINE STRUCTURES
*/
@@ -589,8 +499,6 @@ typedef struct cmSingleton { // struct to manage cm globals and c
GCodeState_t *am; // active Gcode model is maintained by state management
GCodeState_t gm; // core gcode model state
GCodeStateX_t gmx; // extended gcode model state
GCodeInput_t gn; // gcode input values - transient
GCodeFlags_t gf; // gcode input flags - transient
magic_t magic_end;
} cmSingleton_t;
@@ -680,9 +588,11 @@ stat_t cm_select_plane(const uint8_t plane); // G
stat_t cm_set_units_mode(const uint8_t mode); // G20, G21
stat_t cm_set_distance_mode(const uint8_t mode); // G90, G91
stat_t cm_set_arc_distance_mode(const uint8_t mode); // G90.1, G91.1
stat_t cm_set_tl_offset(const uint8_t H_word, bool apply_additional); // G43, G43.2
stat_t cm_set_tl_offset(const uint8_t H_word, const bool H_flag, // G43, G43.2
const bool apply_additional);
stat_t cm_cancel_tl_offset(void); // G49
stat_t cm_set_g10_data(const uint8_t P_word, const uint8_t L_word, // G10
stat_t cm_set_g10_data(const uint8_t P_word, const bool P_flag, // G10
const uint8_t L_word, const bool L_flag,
const float offset[], const bool flag[]);
void cm_set_position(const uint8_t axis, const float position); // set absolute position - single axis
@@ -722,17 +632,20 @@ stat_t cm_arc_feed(const float target[], const bool target_f[], // G
// see spindle.h for spindle functions - which would go right here
// Tool Functions (4.3.8)
stat_t cm_select_tool(const uint8_t tool); // T parameter
stat_t cm_change_tool(const uint8_t tool); // M6
stat_t cm_select_tool(const uint8_t tool); // T parameter
stat_t cm_change_tool(const uint8_t tool); // M6
// Miscellaneous Functions (4.3.9)
// see coolant.h for coolant functions - which would go right here
void cm_message(const char *message); // msg to console (e.g. Gcode comments)
void cm_message(const char *message); // msg to console (e.g. Gcode comments)
void cm_reset_overrides(void);
stat_t cm_m48_enable(uint8_t enable); // M48, M49
stat_t cm_mfo_enable(uint8_t enable); // M50
stat_t cm_m48_enable(uint8_t enable); // M48, M49
stat_t cm_mfo_enable(uint8_t enable); // M50
stat_t cm_mfo_control(const float P_word, const bool P_flag); // M50
stat_t cm_mto_control(const float P_word, const bool P_flag); // M50.1
// See spindle.cpp for cm_sso_control() // M51
// Program Functions (4.3.10)
void cm_request_feedhold(void);
@@ -761,8 +674,8 @@ stat_t cm_json_wait(char *json_string); // M102
/*--- Cycles ---*/
// Homing cycles
stat_t cm_homing_cycle_start(void); // G28.2
stat_t cm_homing_cycle_start_no_set(void); // G28.4
stat_t cm_homing_cycle_start(const float axes[], const bool flags[]); // G28.2
stat_t cm_homing_cycle_start_no_set(const float axes[], const bool flags[]); // G28.4
stat_t cm_homing_cycle_callback(void); // G28.2/.4 main loop callback
// Probe cycles
+41 -37
View File
@@ -2,8 +2,8 @@
* cycle_homing.cpp - homing cycle extension to canonical_machine
* This file is part of the g2core project
*
* Copyright (c) 2010 - 2016 Alden S. Hart, Jr.
* Copyright (c) 2013 - 2016 Robert Giseburt
* Copyright (c) 2010 - 2017 Alden S. Hart, Jr.
* Copyright (c) 2013 - 2017 Robert Giseburt
*
* This file ("the software") is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License, version 2 as published by the
@@ -49,6 +49,8 @@ struct hmHomingSingleton { // persistent homing runtime variables
bool set_coordinates; // G28.4 flag. true = set coords to zero at the end of homing cycle
stat_t (*func)(int8_t axis); // binding for callback function state machine
bool axis_flags[AXES]; // local storage for axis flags
// per-axis parameters
float direction; // set to 1 for positive (max), -1 for negative (to min);
float search_travel; // signed distance to travel in search
@@ -152,7 +154,7 @@ static stat_t _set_homing_func(stat_t (*func)(int8_t axis)) {
* to cm_get_runtime_busy() is about.
*/
stat_t cm_homing_cycle_start(void) {
stat_t cm_homing_cycle_start(const float axes[], const bool flags[]) {
// save relevant non-axis parameters from Gcode model
hm.saved_units_mode = (cmUnitsMode)cm_get_units_mode(ACTIVE_MODEL);
hm.saved_coord_system = (cmCoordSystem)cm_get_coord_system(ACTIVE_MODEL);
@@ -160,6 +162,8 @@ stat_t cm_homing_cycle_start(void) {
hm.saved_feed_rate_mode = (cmFeedRateMode)cm_get_feed_rate_mode(ACTIVE_MODEL);
hm.saved_feed_rate = cm_get_feed_rate(ACTIVE_MODEL);
copy_vector(hm.axis_flags, flags);
// set working values
cm_set_units_mode(MILLIMETERS);
cm_set_distance_mode(INCREMENTAL_DISTANCE_MODE);
@@ -178,8 +182,8 @@ stat_t cm_homing_cycle_start(void) {
return (STAT_OK);
}
stat_t cm_homing_cycle_start_no_set(void) {
cm_homing_cycle_start();
stat_t cm_homing_cycle_start_no_set(const float axes[], const bool flags[]) {
cm_homing_cycle_start(axes, flags);
hm.set_coordinates = false; // set flag to not update position variables at the end of the cycle
return (STAT_OK);
}
@@ -407,38 +411,38 @@ static stat_t _homing_finalize_exit(int8_t axis) // third part of return to hom
static int8_t _get_next_axis(int8_t axis) {
#if (HOMING_AXES <= 4)
if (axis == -1) { // inelegant brute force solution
if (cm.gf.target[AXIS_Z]) {
if (hm.axis_flags[AXIS_Z]) {
return (AXIS_Z);
}
if (cm.gf.target[AXIS_X]) {
if (hm.axis_flags[AXIS_X]) {
return (AXIS_X);
}
if (cm.gf.target[AXIS_Y]) {
if (hm.axis_flags[AXIS_Y]) {
return (AXIS_Y);
}
if (cm.gf.target[AXIS_A]) {
if (hm.axis_flags[AXIS_A]) {
return (AXIS_A);
}
return (-2); // error
} else if (axis == AXIS_Z) {
if (cm.gf.target[AXIS_X]) {
if (hm.axis_flags[AXIS_X]) {
return (AXIS_X);
}
if (cm.gf.target[AXIS_Y]) {
if (hm.axis_flags[AXIS_Y]) {
return (AXIS_Y);
}
if (cm.gf.target[AXIS_A]) {
if (hm.axis_flags[AXIS_A]) {
return (AXIS_A);
}
} else if (axis == AXIS_X) {
if (cm.gf.target[AXIS_Y]) {
if (hm.axis_flags[AXIS_Y]) {
return (AXIS_Y);
}
if (cm.gf.target[AXIS_A]) {
if (hm.axis_flags[AXIS_A]) {
return (AXIS_A);
}
} else if (axis == AXIS_Y) {
if (cm.gf.target[AXIS_A]) {
if (hm.axis_flags[AXIS_A]) {
return (AXIS_A);
}
}
@@ -446,77 +450,77 @@ static int8_t _get_next_axis(int8_t axis) {
#else
if (axis == -1) {
if (cm.gf.target[AXIS_Z]) {
if (hm.axis_flags[AXIS_Z]) {
return (AXIS_Z);
}
if (cm.gf.target[AXIS_X]) {
if (hm.axis_flags[AXIS_X]) {
return (AXIS_X);
}
if (cm.gf.target[AXIS_Y]) {
if (hm.axis_flags[AXIS_Y]) {
return (AXIS_Y);
}
if (cm.gf.target[AXIS_A]) {
if (hm.axis_flags[AXIS_A]) {
return (AXIS_A);
}
if (cm.gf.target[AXIS_B]) {
if (hm.axis_flags[AXIS_B]) {
return (AXIS_B);
}
if (cm.gf.target[AXIS_C]) {
if (hm.axis_flags[AXIS_C]) {
return (AXIS_C);
}
return (-2); // error
} else if (axis == AXIS_Z) {
if (cm.gf.target[AXIS_X]) {
if (hm.axis_flags[AXIS_X]) {
return (AXIS_X);
}
if (cm.gf.target[AXIS_Y]) {
if (hm.axis_flags[AXIS_Y]) {
return (AXIS_Y);
}
if (cm.gf.target[AXIS_A]) {
if (hm.axis_flags[AXIS_A]) {
return (AXIS_A);
}
if (cm.gf.target[AXIS_B]) {
if (hm.axis_flags[AXIS_B]) {
return (AXIS_B);
}
if (cm.gf.target[AXIS_C]) {
if (hm.axis_flags[AXIS_C]) {
return (AXIS_C);
}
} else if (axis == AXIS_X) {
if (cm.gf.target[AXIS_Y]) {
if (hm.axis_flags[AXIS_Y]) {
return (AXIS_Y);
}
if (cm.gf.target[AXIS_A]) {
if (hm.axis_flags[AXIS_A]) {
return (AXIS_A);
}
if (cm.gf.target[AXIS_B]) {
if (hm.axis_flags[AXIS_B]) {
return (AXIS_B);
}
if (cm.gf.target[AXIS_C]) {
if (hm.axis_flags[AXIS_C]) {
return (AXIS_C);
}
} else if (axis == AXIS_Y) {
if (cm.gf.target[AXIS_A]) {
if (hm.axis_flags[AXIS_A]) {
return (AXIS_A);
}
if (cm.gf.target[AXIS_B]) {
if (hm.axis_flags[AXIS_B]) {
return (AXIS_B);
}
if (cm.gf.target[AXIS_C]) {
if (hm.axis_flags[AXIS_C]) {
return (AXIS_C);
}
} else if (axis == AXIS_A) {
if (cm.gf.target[AXIS_B]) {
if (hm.axis_flags[AXIS_B]) {
return (AXIS_B);
}
if (cm.gf.target[AXIS_C]) {
if (hm.axis_flags[AXIS_C]) {
return (AXIS_C);
}
} else if (axis == AXIS_B) {
if (cm.gf.target[AXIS_C]) {
if (hm.axis_flags[AXIS_C]) {
return (AXIS_C);
}
}
return (-1); // done
#endif // (HOMING_AXES <= 4)
}
}
+7 -9
View File
@@ -5,7 +5,7 @@
<ProjectVersion>7.0</ProjectVersion>
<ToolchainName>com.Atmel.ARMGCC.CPP</ToolchainName>
<ProjectGuid>{44ea8fec-55d7-4149-8a78-a574fc26bf51}</ProjectGuid>
<avrdevice>ATSAM3X8E</avrdevice>
<avrdevice>ATSAM3X8C</avrdevice>
<avrdeviceseries>none</avrdeviceseries>
<OutputType>Executable</OutputType>
<Language>CPP</Language>
@@ -21,10 +21,8 @@
<OverrideVtorValue>exception_table</OverrideVtorValue>
<eraseonlaunchrule>1</eraseonlaunchrule>
<AsfVersion>3.5.0</AsfVersion>
<avrtoolinterface>
</avrtoolinterface>
<avrtool>
</avrtool>
<avrtoolinterface>SWD</avrtoolinterface>
<avrtool>com.atmel.avrdbg.tool.atmelice</avrtool>
<com_atmel_avrdbg_tool_samice>
<ToolType>com.atmel.avrdbg.tool.samice</ToolType>
<ToolName>J-Link</ToolName>
@@ -70,12 +68,12 @@
<com_atmel_avrdbg_tool_atmelice>
<ToolOptions>
<InterfaceProperties>
<SwdClock>10000000</SwdClock>
<SwdClock>2000000</SwdClock>
</InterfaceProperties>
<InterfaceName>SWD</InterfaceName>
</ToolOptions>
<ToolType>com.atmel.avrdbg.tool.atmelice</ToolType>
<ToolNumber>J41800036434</ToolNumber>
<ToolNumber>J41800030015</ToolNumber>
<ToolName>Atmel-ICE</ToolName>
</com_atmel_avrdbg_tool_atmelice>
<UseGdb>True</UseGdb>
@@ -102,9 +100,9 @@
<HWProgramCounterSampling>True</HWProgramCounterSampling>
</PercepioTrace>
<preserveEEPROM>true</preserveEEPROM>
<avrtoolserialnumber>J41800036434</avrtoolserialnumber>
<avrtoolserialnumber>J41800030015</avrtoolserialnumber>
<avrdeviceexpectedsignature>0x284E0A60</avrdeviceexpectedsignature>
<avrtoolinterfaceclock>10000000</avrtoolinterfaceclock>
<avrtoolinterfaceclock>2000000</avrtoolinterfaceclock>
<custom>
<ToolOptions xmlns="">
<InterfaceProperties>
+182 -72
View File
@@ -2,8 +2,8 @@
* gcode_parser.cpp - rs274/ngc Gcode parser
* This file is part of the g2core project
*
* Copyright (c) 2010 - 2016 Alden S. Hart, Jr.
* Copyright (c) 2016 Rob Giseburt
* Copyright (c) 2010 - 2017 Alden S. Hart, Jr.
* Copyright (c) 2016 - 2017 Rob Giseburt
*
* This file ("the software") is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License, version 2 as published by the
@@ -27,6 +27,94 @@
#include "util.h"
#include "xio.h" // for char definitions
// Structures used by Gcode parser
typedef struct GCodeInputValue { // Gcode inputs - meaning depends on context
uint8_t next_action; // handles G modal group 1 moves & non-modals
cmMotionMode motion_mode; // Group1: G0, G1, G2, G3, G38.2, G80, G81, G82, G83, G84, G85, G86, G87, G88, G89
uint8_t program_flow; // used only by the gcode_parser
uint32_t linenum; // N word
float target[AXES]; // XYZABC where the move should go
float arc_offset[3]; // IJK - used by arc commands
float arc_radius; // R - radius value in arc radius mode
float F_word; // F - normalized to millimeters/minute
uint8_t H_word; // H word - used by G43s
uint8_t L_word; // L word - used by G10s
float P_word; // P - parameter used for dwell time in seconds, G10 coord select...
float S_word; // S word - in RPM
uint8_t feed_rate_mode; // See cmFeedRateMode for settings
uint8_t select_plane; // G17,G18,G19 - values to set plane to
uint8_t units_mode; // G20,G21 - 0=inches (G20), 1 = mm (G21)
uint8_t coord_system; // G54-G59 - select coordinate system 1-9
uint8_t path_control; // G61... EXACT_PATH, EXACT_STOP, CONTINUOUS
uint8_t distance_mode; // G91 0=use absolute coords(G90), 1=incremental movement
uint8_t arc_distance_mode; // G90.1=use absolute IJK offsets, G91.1=incremental IJK offsets
uint8_t origin_offset_mode; // G92...TRUE=in origin offset mode
uint8_t absolute_override; // G53 TRUE = move using machine coordinates - this block only (G53)
uint8_t tool; // Tool after T and M6 (tool_select and tool_change)
uint8_t tool_select; // T value - T sets this value
uint8_t tool_change; // M6 tool change flag - moves "tool_select" to "tool"
uint8_t mist_coolant; // TRUE = mist on (M7), FALSE = off (M9)
uint8_t flood_coolant; // TRUE = flood on (M8), FALSE = off (M9)
uint8_t spindle_control; // 0=OFF (M5), 1=CW (M3), 2=CCW (M4)
bool m48_enable; // M48/M49 input (enables for feed and spindle)
bool mfo_control; // M50 feedrate override control
bool mto_control; // M50.1 traverse override control
bool sso_control; // M51 spindle speed override control
} GCodeValue_t;
typedef struct GCodeFlags { // Gcode input flags
bool next_action;
bool motion_mode;
bool program_flow;
bool linenum;
bool target[AXES];
bool arc_offset[3];
bool arc_radius;
bool F_word;
bool H_word;
bool L_word;
bool P_word;
bool S_word;
bool feed_rate_mode;
bool select_plane;
bool units_mode;
bool coord_system;
bool path_control;
bool distance_mode;
bool arc_distance_mode;
bool origin_offset_mode;
bool absolute_override;
bool tool;
bool tool_select;
bool tool_change;
bool mist_coolant;
bool flood_coolant;
bool spindle_control;
bool m48_enable;
bool mfo_control;
bool mto_control;
bool sso_control;
} GCodeFlag_t;
typedef struct GCodeParser {
bool modals[MODAL_GROUP_COUNT];
} GCodeParser_t;
GCodeParser_t gp; // main parser struct
GCodeValue_t gv; // gcode input values
GCodeFlag_t gf; // gcode input flags
// local helper functions and macros
static void _normalize_gcode_block(char *str, char **active_comment, uint8_t *block_delete_flag);
static stat_t _get_next_gcode_word(char **pstr, char *letter, float *value);
@@ -35,9 +123,19 @@ static stat_t _validate_gcode_block(char *active_comment);
static stat_t _parse_gcode_block(char *line, char *active_comment); // Parse the block into the GN/GF structs
static stat_t _execute_gcode_block(char *active_comment); // Execute the gcode block
#define SET_MODAL(m,parm,val) ({cm.gn.parm=val; cm.gf.parm=true; cm.gf.modals[m]=true; break;})
#define SET_NON_MODAL(parm,val) ({cm.gn.parm=val; cm.gf.parm=true; break;})
#define EXEC_FUNC(f,v) if(cm.gf.v) { status=f(cm.gn.v);}
#define SET_MODAL(m,parm,val) ({gv.parm=val; gf.parm=true; gp.modals[m]=true; break;})
#define SET_NON_MODAL(parm,val) ({gv.parm=val; gf.parm=true; break;})
#define EXEC_FUNC(f,v) if(gf.v) { status=f(gv.v);}
/*
* gcode_parser_init()
*/
void gcode_parser_init()
{
memset(&gv, 0, sizeof(GCodeValue_t));
memset(&gf, 0, sizeof(GCodeFlag_t));
}
/*
* gcode_parser() - parse a block (line) of gcode
@@ -409,22 +507,22 @@ static stat_t _validate_gcode_block(char *active_comment)
static stat_t _parse_gcode_block(char *buf, char *active_comment)
{
char *pstr = (char *)buf; // persistent pointer into gcode block for parsing words
char letter; // parsed letter, eg.g. G or X or Y
float value = 0; // value parsed from letter (e.g. 2 for G2)
char *pstr = (char *)buf; // persistent pointer into gcode block for parsing words
char letter; // parsed letter, eg.g. G or X or Y
float value = 0; // value parsed from letter (e.g. 2 for G2)
stat_t status = STAT_OK;
// set initial state for new move
memset(&cm.gn, 0, sizeof(GCodeInput_t)); // clear all next-state values
memset(&cm.gf, 0, sizeof(GCodeFlags_t)); // clear all next-state flags
cm.gn.motion_mode = cm_get_motion_mode(MODEL); // get motion mode from previous block
memset(&gv, 0, sizeof(GCodeValue_t)); // clear all next-state values
memset(&gf, 0, sizeof(GCodeFlag_t)); // clear all next-state flags
gv.motion_mode = cm_get_motion_mode(MODEL); // get motion mode from previous block
// Causes a later exception if
// (1) INVERSE_TIME_MODE is active and a feed rate is not provided or
// (2) INVERSE_TIME_MODE is changed to UNITS_PER_MINUTE and a new feed rate is missing
if (cm.gm.feed_rate_mode == INVERSE_TIME_MODE) {// new feed rate req'd when in INV_TIME_MODE
cm.gn.feed_rate = 0;
cm.gf.feed_rate = true;
gv.F_word = 0;
gf.F_word = true;
}
// extract commands and parameters
@@ -547,8 +645,14 @@ static stat_t _parse_gcode_block(char *buf, char *active_comment)
case 9: SET_MODAL (MODAL_GROUP_M8, flood_coolant, false);
case 48: SET_MODAL (MODAL_GROUP_M9, m48_enable, true);
case 49: SET_MODAL (MODAL_GROUP_M9, m48_enable, false);
case 50: SET_MODAL (MODAL_GROUP_M9, mfo_enable, true);
case 51: SET_MODAL (MODAL_GROUP_M9, sso_enable, true);
case 50: SET_MODAL (MODAL_GROUP_M9, mfo_control, true);
switch (_point(value)) {
case 0: SET_MODAL (MODAL_GROUP_M9, mfo_control, true);
case 1: SET_MODAL (MODAL_GROUP_M9, mto_control, true);
default: status = STAT_GCODE_COMMAND_UNSUPPORTED;
}
break;
case 51: SET_MODAL (MODAL_GROUP_M9, sso_control, true);
case 100: SET_NON_MODAL (next_action, NEXT_ACTION_JSON_COMMAND_SYNC);
case 101: SET_NON_MODAL (next_action, NEXT_ACTION_JSON_WAIT);
default: status = STAT_MCODE_COMMAND_UNSUPPORTED;
@@ -556,9 +660,9 @@ static stat_t _parse_gcode_block(char *buf, char *active_comment)
break;
case 'T': SET_NON_MODAL (tool_select, (uint8_t)trunc(value));
case 'F': SET_NON_MODAL (feed_rate, value);
case 'P': SET_NON_MODAL (parameter, value); // used for dwell time, G10 coord select
case 'S': SET_NON_MODAL (spindle_speed, value);
case 'F': SET_NON_MODAL (F_word, value);
case 'P': SET_NON_MODAL (P_word, value); // used for dwell time, G10 coord select
case 'S': SET_NON_MODAL (S_word, value);
case 'X': SET_NON_MODAL (target[AXIS_X], value);
case 'Y': SET_NON_MODAL (target[AXIS_Y], value);
case 'Z': SET_NON_MODAL (target[AXIS_Z], value);
@@ -628,42 +732,43 @@ static stat_t _execute_gcode_block(char *active_comment)
{
stat_t status = STAT_OK;
cm_set_model_linenum(cm.gn.linenum);
cm_set_model_linenum(gv.linenum);
EXEC_FUNC(cm_set_feed_rate_mode, feed_rate_mode); // G93, G94
EXEC_FUNC(cm_set_feed_rate, feed_rate); // F
EXEC_FUNC(cm_set_spindle_speed, spindle_speed); // S
// EXEC_FUNC(cm_spindle_override_factor, spindle_override_factor);
EXEC_FUNC(cm_set_feed_rate, F_word); // F
EXEC_FUNC(cm_set_spindle_speed, S_word); // S
if (gf.sso_control) { // spindle speed override
ritorno(cm_sso_control(gv.P_word, gf.P_word));
}
EXEC_FUNC(cm_select_tool, tool_select); // tool_select is where it's written
EXEC_FUNC(cm_change_tool, tool_change); // M6
EXEC_FUNC(cm_spindle_control, spindle_control); // spindle CW, CCW, OFF
/*
EXEC_FUNC(cm_feed_rate_override_enable, feed_rate_override_enable);
EXEC_FUNC(cm_traverse_override_enable, traverse_override_enable);
EXEC_FUNC(cm_spindle_override_enable, spindle_override_enable);
EXEC_FUNC(cm_override_enables, override_enables);
*/
EXEC_FUNC(cm_mist_coolant_control, mist_coolant); // M7, M9
EXEC_FUNC(cm_flood_coolant_control, flood_coolant); // M8, M9 also disables mist coolant if OFF
EXEC_FUNC(cm_m48_enable, m48_enable);
EXEC_FUNC(cm_mfo_enable, mfo_enable);
// EXEC_FUNC(cm_mfo_enable, feed_rate_override_factor);
// EXEC_FUNC(cm_sso_enable, sso_enable);
if (cm.gn.next_action == NEXT_ACTION_DWELL) { // G4 - dwell
ritorno(cm_dwell(cm.gn.parameter)); // return if error, otherwise complete the block
if (gf.mfo_control) { // manual feedrate override
ritorno(cm_mfo_control(gv.P_word, gf.P_word));
}
if (gf.mto_control) { // manual traverse override
ritorno(cm_mto_control(gv.P_word, gf.P_word));
}
if (gv.next_action == NEXT_ACTION_DWELL) { // G4 - dwell
ritorno(cm_dwell(gv.P_word)); // return if error, otherwise complete the block
}
EXEC_FUNC(cm_select_plane, select_plane); // G17, G18, G19
EXEC_FUNC(cm_set_units_mode, units_mode); // G20, G21
//--> cutter radius compensation goes here
switch (cm.gn.next_action) { // Tool length offsets
switch (gv.next_action) { // Tool length offsets
case NEXT_ACTION_SET_TL_OFFSET: { // G43
ritorno(cm_set_tl_offset(cm.gn.H_word, false));
ritorno(cm_set_tl_offset(gv.H_word, gf.H_word, false));
break;
}
case NEXT_ACTION_SET_ADDITIONAL_TL_OFFSET: { // G43.2
ritorno(cm_set_tl_offset(cm.gn.H_word, true));
ritorno(cm_set_tl_offset(gv.H_word, gf.H_word, true));
break;
}
case NEXT_ACTION_CANCEL_TL_OFFSET: { // G49
@@ -673,51 +778,56 @@ static stat_t _execute_gcode_block(char *active_comment)
}
EXEC_FUNC(cm_set_coord_system, coord_system); // G54, G55, G56, G57, G58, G59
// EXEC_FUNC(cm_set_path_control, path_control); // G61, G61.1, G64
if(cm.gf.path_control) { status = cm_set_path_control(MODEL, cm.gn.path_control); }
if (gf.path_control) { // G61, G61.1, G64
status = cm_set_path_control(MODEL, gv.path_control);
}
EXEC_FUNC(cm_set_distance_mode, distance_mode); // G90, G91
EXEC_FUNC(cm_set_arc_distance_mode, arc_distance_mode); // G90.1, G91.1
//--> set retract mode goes here
switch (cm.gn.next_action) {
case NEXT_ACTION_SET_G28_POSITION: { status = cm_set_g28_position(); break;} // G28.1
case NEXT_ACTION_GOTO_G28_POSITION: { status = cm_goto_g28_position(cm.gn.target, cm.gf.target); break;} // G28
case NEXT_ACTION_SET_G30_POSITION: { status = cm_set_g30_position(); break;} // G30.1
case NEXT_ACTION_GOTO_G30_POSITION: { status = cm_goto_g30_position(cm.gn.target, cm.gf.target); break;} // G30
switch (gv.next_action) {
case NEXT_ACTION_SET_G28_POSITION: { status = cm_set_g28_position(); break;} // G28.1
case NEXT_ACTION_GOTO_G28_POSITION: { status = cm_goto_g28_position(gv.target, gf.target); break;} // G28
case NEXT_ACTION_SET_G30_POSITION: { status = cm_set_g30_position(); break;} // G30.1
case NEXT_ACTION_GOTO_G30_POSITION: { status = cm_goto_g30_position(gv.target, gf.target); break;} // G30
case NEXT_ACTION_SEARCH_HOME: { status = cm_homing_cycle_start(); break;} // G28.2
case NEXT_ACTION_SET_ABSOLUTE_ORIGIN: { status = cm_set_absolute_origin(cm.gn.target, cm.gf.target); break;}// G28.3
case NEXT_ACTION_HOMING_NO_SET: { status = cm_homing_cycle_start_no_set(); break;} // G28.4
case NEXT_ACTION_SEARCH_HOME: { status = cm_homing_cycle_start(gv.target, gf.target); break;} // G28.2
case NEXT_ACTION_SET_ABSOLUTE_ORIGIN: { status = cm_set_absolute_origin(gv.target, gf.target); break;} // G28.3
case NEXT_ACTION_HOMING_NO_SET: { status = cm_homing_cycle_start_no_set(gv.target, gf.target); break;} // G28.4
case NEXT_ACTION_STRAIGHT_PROBE_ERR: { status = cm_straight_probe(cm.gn.target, cm.gf.target, true, true); break;} // G38.2
case NEXT_ACTION_STRAIGHT_PROBE: { status = cm_straight_probe(cm.gn.target, cm.gf.target, false, true); break;} // G38.3
case NEXT_ACTION_STRAIGHT_PROBE_AWAY_ERR:{ status = cm_straight_probe(cm.gn.target, cm.gf.target, true, false); break;} // G38.4
case NEXT_ACTION_STRAIGHT_PROBE_AWAY: { status = cm_straight_probe(cm.gn.target, cm.gf.target, false, false); break;} // G38.5
case NEXT_ACTION_STRAIGHT_PROBE_ERR: { status = cm_straight_probe(gv.target, gf.target, true, true); break;} // G38.2
case NEXT_ACTION_STRAIGHT_PROBE: { status = cm_straight_probe(gv.target, gf.target, false, true); break;} // G38.3
case NEXT_ACTION_STRAIGHT_PROBE_AWAY_ERR:{ status = cm_straight_probe(gv.target, gf.target, true, false); break;} // G38.4
case NEXT_ACTION_STRAIGHT_PROBE_AWAY: { status = cm_straight_probe(gv.target, gf.target, false, false); break;}// G38.5
case NEXT_ACTION_SET_G10_DATA: { status = cm_set_g10_data(cm.gn.parameter, cm.gn.L_word, cm.gn.target, cm.gf.target); break;}
case NEXT_ACTION_SET_ORIGIN_OFFSETS: { status = cm_set_origin_offsets(cm.gn.target, cm.gf.target); break;}// G92
case NEXT_ACTION_RESET_ORIGIN_OFFSETS: { status = cm_reset_origin_offsets(); break;} // G92.1
case NEXT_ACTION_SUSPEND_ORIGIN_OFFSETS: { status = cm_suspend_origin_offsets(); break;} // G92.2
case NEXT_ACTION_RESUME_ORIGIN_OFFSETS: { status = cm_resume_origin_offsets(); break;} // G92.3
case NEXT_ACTION_SET_G10_DATA: { status = cm_set_g10_data(gv.P_word, gf.P_word,
gv.L_word, gf.L_word,
gv.target, gf.target); break;}
case NEXT_ACTION_SET_ORIGIN_OFFSETS: { status = cm_set_origin_offsets(gv.target, gf.target); break;}// G92
case NEXT_ACTION_RESET_ORIGIN_OFFSETS: { status = cm_reset_origin_offsets(); break;} // G92.1
case NEXT_ACTION_SUSPEND_ORIGIN_OFFSETS: { status = cm_suspend_origin_offsets(); break;} // G92.2
case NEXT_ACTION_RESUME_ORIGIN_OFFSETS: { status = cm_resume_origin_offsets(); break;} // G92.3
case NEXT_ACTION_JSON_COMMAND_SYNC: { status = cm_json_command(active_comment); break;} // M100
case NEXT_ACTION_JSON_WAIT: { status = cm_json_wait(active_comment); break;} // M101
// case NEXT_ACTION_JSON_COMMAND_IMMEDIATE: { status = mp_json_command_immediate(active_comment); break;} // M102
case NEXT_ACTION_JSON_COMMAND_SYNC: { status = cm_json_command(active_comment); break;} // M100
case NEXT_ACTION_JSON_WAIT: { status = cm_json_wait(active_comment); break;} // M101
// case NEXT_ACTION_JSON_COMMAND_IMMEDIATE: { status = mp_json_command_immediate(active_comment); break;} // M102
case NEXT_ACTION_DEFAULT: {
cm_set_absolute_override(MODEL, cm.gn.absolute_override); // apply absolute override
switch (cm.gn.motion_mode) {
case MOTION_MODE_CANCEL_MOTION_MODE: { cm.gm.motion_mode = cm.gn.motion_mode; break;} // G80
case MOTION_MODE_STRAIGHT_TRAVERSE: { status = cm_straight_traverse(cm.gn.target, cm.gf.target); break;} // G0
case MOTION_MODE_STRAIGHT_FEED: { status = cm_straight_feed(cm.gn.target, cm.gf.target); break;} // G1
case MOTION_MODE_CW_ARC: // G2
case MOTION_MODE_CCW_ARC: { status = cm_arc_feed(cm.gn.target, cm.gf.target, // G3
cm.gn.arc_offset, cm.gf.arc_offset,
cm.gn.arc_radius, cm.gf.arc_radius,
cm.gn.parameter, cm.gf.parameter,
cm.gf.modals[MODAL_GROUP_G1],
cm.gn.motion_mode);
cm_set_absolute_override(MODEL, gv.absolute_override); // apply absolute override
switch (gv.motion_mode) {
case MOTION_MODE_CANCEL_MOTION_MODE: { cm.gm.motion_mode = gv.motion_mode; break;} // G80
case MOTION_MODE_STRAIGHT_TRAVERSE: { status = cm_straight_traverse(gv.target, gf.target); break;} // G0
case MOTION_MODE_STRAIGHT_FEED: { status = cm_straight_feed(gv.target, gf.target); break;} // G1
case MOTION_MODE_CW_ARC: // G2
case MOTION_MODE_CCW_ARC: { status = cm_arc_feed(gv.target, gf.target, // G3
gv.arc_offset, gf.arc_offset,
gv.arc_radius, gf.arc_radius,
gv.P_word, gf.P_word,
gp.modals[MODAL_GROUP_G1],
gv.motion_mode);
break;
}
default: break;
@@ -727,8 +837,8 @@ static stat_t _execute_gcode_block(char *active_comment)
}
// do the program stops and ends : M0, M1, M2, M30, M60
if (cm.gf.program_flow == true) {
if (cm.gn.program_flow == PROGRAM_STOP) {
if (gf.program_flow == true) {
if (gv.program_flow == PROGRAM_STOP) {
cm_program_stop();
} else {
cm_program_end();
Executable → Regular
+4 -4
View File
@@ -2,7 +2,7 @@
* gcode_parser.h - rs274/ngc Gcode parser
* This file is part of the g2core project
*
* Copyright (c) 2010 - 2016 Alden S. Hart, Jr.
* Copyright (c) 2010 - 2017 Alden S. Hart, Jr.
*
* This file ("the software") is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License, version 2 as published by the
@@ -17,8 +17,8 @@
* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#ifndef GCODE_PARSER_H_ONCE
#define GCODE_PARSER_H_ONCE
#ifndef GCODE_H_ONCE
#define GCODE_H_ONCE
/*
* Global Scope Functions
@@ -27,4 +27,4 @@ stat_t gcode_parser(char* block);
stat_t gc_get_gc(nvObj_t* nv);
stat_t gc_run_gc(nvObj_t* nv);
#endif // End of include guard: GCODE_PARSER_H_ONCE
#endif // End of include guard: GCODE_H_ONCE
+10
View File
@@ -597,6 +597,16 @@ void mp_end_feed_override(const float ramp_time)
mp_start_feed_override (FEED_OVERRIDE_RAMP_TIME, 1.00);
}
void mp_start_traverse_override(const float ramp_time, const float override_factor)
{
return;
}
void mp_end_traverse_override(const float ramp_time)
{
return;
}
/*
* mp_planner_time_accounting() - gather time in planner
*/
+2
View File
@@ -553,6 +553,8 @@ stat_t mp_planner_callback();
void mp_replan_queue(mpBuf_t *bf);
void mp_start_feed_override(const float ramp_time, const float override);
void mp_end_feed_override(const float ramp_time);
void mp_start_traverse_override(const float ramp_time, const float override);
void mp_end_traverse_override(const float ramp_time);
void mp_planner_time_accounting(void);
// planner buffer primitives
+37 -15
View File
@@ -2,7 +2,7 @@
* spindle.cpp - canonical machine spindle driver
* This file is part of the g2core project
*
* Copyright (c) 2010 - 2016 Alden S. Hart, Jr.
* Copyright (c) 2010 - 2017 Alden S. Hart, Jr.
*
* This file ("the software") is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License, version 2 as published by the
@@ -222,28 +222,50 @@ static float _get_spindle_pwm (cmSpindleEnable enable, cmSpindleDir direction)
/*
* cm_spindle_override_enable()
* cm_spindle_override_factor()
* cm_spindle_override_control()
* cm_start_spindle_override()
* cm_end_spindle_override()
*/
/*
stat_t cm_spindle_override_enable(uint8_t flag) // M51.1
stat_t cm_sso_control(const float P_word, const bool P_flag) // M51
{
if (fp_TRUE(cm.gf.parameter) && fp_ZERO(cm.gn.parameter)) {
spindle.override_enable = false;
} else {
spindle.override_enable = true;
bool new_enable = true;
bool new_override = false;
if (P_flag) { // if parameter is present in Gcode block
if (fp_ZERO(P_word)) {
new_enable = false; // P0 disables override
} else {
if (P_word < SPINDLE_OVERRIDE_MIN) {
return (STAT_INPUT_LESS_THAN_MIN_VALUE);
}
if (P_word > SPINDLE_OVERRIDE_MAX) {
return (STAT_INPUT_EXCEEDS_MAX_VALUE);
}
spindle.sso_factor = P_word; // P word is valid, store it.
new_override = true;
}
}
if (cm.gmx.m48_enable) { // if master enable is ON
if (new_enable && (new_override || !spindle.sso_enable)) { // 3 cases to start a ramp
cm_start_spindle_override(SPINDLE_OVERRIDE_RAMP_TIME, spindle.sso_factor);
} else if (spindle.sso_enable && !new_enable) { // case to turn off the ramp
cm_end_spindle_override(SPINDLE_OVERRIDE_RAMP_TIME);
}
}
spindle.sso_enable = new_enable; // always update the enable state
return (STAT_OK);
}
stat_t cm_spindle_override_factor(uint8_t flag) // M50.1
void cm_start_spindle_override(const float ramp_time, const float override_factor)
{
spindle.override_enable = flag;
spindle.override_factor = cm.gn.parameter;
// change spindle speed
return (STAT_OK);
return;
}
*/
void cm_end_spindle_override(const float ramp_time)
{
return;
}
/****************************
* END OF SPINDLE FUNCTIONS *
****************************/
+6 -4
View File
@@ -60,8 +60,9 @@ typedef enum {
#define SPINDLE_OVERRIDE_ENABLE false
#define SPINDLE_OVERRIDE_FACTOR 1.00
#define SPINDLE_OVERRIDE_MIN 0.05 // 5%
#define SPINDLE_OVERRIDE_MAX 2.00 // 200%
#define SPINDLE_OVERRIDE_MIN 0.05 // 5%
#define SPINDLE_OVERRIDE_MAX 2.00 // 200%
#define SPINDLE_OVERRIDE_RAMP_TIME 1 // change speed in seconds
/*
* Spindle control structure
@@ -99,8 +100,9 @@ void cm_spindle_off_immediate(void);
void cm_spindle_optional_pause(bool option); // stop spindle based on system options selected
void cm_spindle_resume(float dwell_seconds); // restart spindle after pause based on previous state
// stat_t cm_spindle_override_enable(uint8_t flag); // M51
// stat_t cm_spindle_override_factor(uint8_t flag); // M51.1
stat_t cm_sso_control(const float P_word, const bool P_flag); // M51
void cm_start_spindle_override(const float ramp_time, const float override_factor);
void cm_end_spindle_override(const float ramp_time);
stat_t cm_set_dir(nvObj_t* nv);
stat_t cm_set_sso(nvObj_t* nv);