diff --git a/g2core/cycle_feedhold.cpp b/g2core/cycle_feedhold.cpp index 3add8523..64af4af3 100644 --- a/g2core/cycle_feedhold.cpp +++ b/g2core/cycle_feedhold.cpp @@ -91,8 +91,8 @@ static stat_t _finalize_p2_hold_exit(void); * (unlikely, but handled as 1b). * (2) - The block has decelerated to some velocity > zero, so needs continuation into next block * (3) - The block has decelerated to zero velocity - * (3a) - The end of deceleration is detected (inline in mp_exec_aline()) - * (3b) - The end of deceleration is signeled and transitioned + * (3a) - The end of deceleration is detected inline in mp_exec_aline() + * (3b) - The end of deceleration is signaled and state is transitioned * (4) - We have finished all the runtime work now we have to wait for the motors to stop * (4a) - It's a homing or probing feedhold - ditch the remaining buffer & go directly to OFF * (4b) - It's a p2 feedhold - ditch the remaining buffer & signal we want a p2 queue flush diff --git a/g2core/cycle_probing.cpp b/g2core/cycle_probing.cpp index 8c0ca4e2..262049bd 100644 --- a/g2core/cycle_probing.cpp +++ b/g2core/cycle_probing.cpp @@ -39,7 +39,8 @@ #include "util.h" #include "xio.h" -/**** Probe singleton structure ****/ + +/**** Local stuff ****/ #define MINIMUM_PROBE_TRAVEL 0.254 // mm of travel below which the probe will err out @@ -71,14 +72,9 @@ static stat_t _probing_backoff(); static stat_t _probing_finish(); static stat_t _probing_exception_exit(stat_t status); static stat_t _probe_move(const float target[], const bool flags[]); +static void _motion_end_callback(float* vect, bool* flag); static void _send_probe_report(void); -// helper -static void _motion_end_callback(float* vect, bool* flag) -{ - pb.wait_for_motion_end = false; -} - /*********************************************************************************** **** G38.x Probing Cycle ********************************************************** ***********************************************************************************/ @@ -147,7 +143,7 @@ uint8_t cm_straight_probe(float target[], bool flags[], bool trip_sense, bool al // initialize the probe input; error if no probe input specified if ((pb.probe_input = gpio_get_probing_input()) == -1) { - return(cm_alarm(STAT_NO_PROBE_INPUT_CONFIGURED, "No probe input")); + return(cm_alarm(STAT_NO_PROBE_INPUT_CONFIGURED, "Probe input not configured")); } // setup @@ -273,18 +269,27 @@ static stat_t _probing_backoff() } /*********************************************************************************** - * _probe_move() - function to execute probing moves + * _probe_move() - function to execute probing moves + * _motion_end_callback() - callback completes when motion has stopped * * target[] must be provided in machine canonical coordinates (absolute, mm) * cm_set_absolute_override() also zeros work offsets, which are restored on exit. */ +static void _motion_end_callback(float* vect, bool* flag) +{ + while (!mp_runtime_is_idle()) { + __NOP(); // block until current segment is done + }; + pb.wait_for_motion_end = false; +} + static stat_t _probe_move(const float target[], const bool flags[]) { cm_set_absolute_override(MODEL, ABSOLUTE_OVERRIDE_ON); pb.wait_for_motion_end = true; // set this BEFORE the motion starts - cm_straight_feed(target, flags); - mp_queue_command(_motion_end_callback, nullptr, nullptr); // the last two arguments are ignored anyway + cm_straight_feed(target, flags); // NB: feed rate was set earlier, so it's OK + mp_queue_command(_motion_end_callback, nullptr, nullptr); // the last two arguments are ignored anyway return (STAT_EAGAIN); } diff --git a/g2core/g2core.cppproj b/g2core/g2core.cppproj index bb1cf7a0..0014b2ec 100644 --- a/g2core/g2core.cppproj +++ b/g2core/g2core.cppproj @@ -73,7 +73,7 @@ SWD com.atmel.avrdbg.tool.atmelice - J41800030015 + J41800036434 Atmel-ICE True @@ -100,7 +100,7 @@ True true - J41800030015 + J41800036434 0x284E0A60 10000000 diff --git a/g2core/kinematics.cpp b/g2core/kinematics.cpp index 9e200f61..cc66d95d 100644 --- a/g2core/kinematics.cpp +++ b/g2core/kinematics.cpp @@ -2,7 +2,8 @@ * kinematics.cpp - inverse kinematics routines * This file is part of the g2core project * - * Copyright (c) 2010 - 2016 Alden S. Hart, Jr. + * 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 @@ -127,7 +128,6 @@ static void _inverse_kinematics(const float travel[], float joint[]) { * * This function is NOT to be used where high-speed is important. If that becomes the case, * there are many opportunities for caching and optimization for performance here. - * */ void kn_forward_kinematics(const float steps[], float travel[]) { @@ -139,7 +139,7 @@ void kn_forward_kinematics(const float steps[], float travel[]) { best_steps_per_unit[axis] = -1.0; } - // Scan through each axis, and then through each motor + // Scan through each axis then through each motor for (uint8_t axis = 0; axis < AXES; axis++) { if (cm->a[axis].axis_mode == AXIS_INHIBITED) { travel[axis] = 0.0; @@ -147,13 +147,12 @@ void kn_forward_kinematics(const float steps[], float travel[]) { } for (uint8_t motor = 0; motor < MOTORS; motor++) { if (st_cfg.mot[motor].motor_map == axis) { - // If this motor has a better (or the only) resolution, then we use this motor's value + // If this motor has a better (or the only) resolution, then use this motor's value if (best_steps_per_unit[axis] < st_cfg.mot[motor].steps_per_unit) { best_steps_per_unit[axis] = st_cfg.mot[motor].steps_per_unit; travel[axis] = steps[motor] * st_cfg.mot[motor].units_per_step; - - // If a econd motor has the same reolution for the same axis, we'll average their values - } else if (fp_EQ(best_steps_per_unit[axis], st_cfg.mot[motor].steps_per_unit)) { + } // If a second motor has the same resolution for the same axis average their values + else if (fp_EQ(best_steps_per_unit[axis], st_cfg.mot[motor].steps_per_unit)) { travel[axis] = (travel[axis] + (steps[motor] * st_cfg.mot[motor].units_per_step)) / 2.0; } }