#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <ctype.h>
#include <sys/types.h>
#include <sys/stat.h>
#include "rs274ngc.hh"
#include "rs274ngc_return.hh"
#include "interp_internal.hh"
#include "rs274ngc_interp.hh"
static const char* plane_name(CANON_PLANE p);
int Interp::convert_cycle_g81(block_pointer block,
CANON_PLANE plane, double x, double y, double clear_z, double bottom_z) {
cycle_feed(block, plane, x, y, bottom_z);
cycle_traverse(block, plane, x, y, clear_z);
return INTERP_OK;
}
int Interp::convert_cycle_g82(block_pointer block,
CANON_PLANE plane, double x, double y, double clear_z, double bottom_z, double dwell) {
cycle_feed(block, plane, x, y, bottom_z);
DWELL(dwell);
cycle_traverse(block, plane, x, y, clear_z);
return INTERP_OK;
}
int Interp::convert_cycle_g83(block_pointer block,
CANON_PLANE plane, double x, double y, double r, double clear_z, double bottom_z, double delta) {
double current_depth;
double rapid_delta;
CHKS((delta <= 0.0), NCE_NEGATIVE_OR_ZERO_Q_VALUE_USED);
rapid_delta = G83_RAPID_DELTA;
if (_setup.length_units == CANON_UNITS_MM)
rapid_delta = (rapid_delta * 25.4);
for (current_depth = (r - delta);
current_depth > bottom_z; current_depth = (current_depth - delta)) {
cycle_feed(block, plane, x, y, current_depth);
cycle_traverse(block, plane, x, y, r);
cycle_traverse(block, plane, x, y, current_depth + rapid_delta);
}
cycle_feed(block, plane, x, y, bottom_z);
cycle_traverse(block, plane, x, y, clear_z);
return INTERP_OK;
}
int Interp::convert_cycle_g73(block_pointer block,
CANON_PLANE plane, double x, double y, double r, double clear_z, double bottom_z, double delta) {
double current_depth;
double rapid_delta;
CHKS((delta <= 0.0), NCE_NEGATIVE_OR_ZERO_Q_VALUE_USED);
rapid_delta = G83_RAPID_DELTA;
if (_setup.length_units == CANON_UNITS_MM)
rapid_delta = (rapid_delta * 25.4);
for (current_depth = (r - delta);
current_depth > bottom_z; current_depth = (current_depth - delta)) {
cycle_feed(block, plane, x, y, current_depth);
cycle_traverse(block, plane, x, y, current_depth + rapid_delta);
}
cycle_feed(block, plane, x, y, bottom_z);
cycle_traverse(block, plane, x, y, clear_z);
return INTERP_OK;
}
InterpReturn Interp::check_g74_g84_spindle(GCodes motion, CANON_DIRECTION dir)
{
switch (dir) {
case CANON_STOPPED:
ERS(_("Spindle not turning in %s"), toString((GCodes)motion).c_str());
case CANON_CLOCKWISE:
CHKS((motion == G_74), _("Spindle turning clockwise in G74"));
return INTERP_OK;
case CANON_COUNTERCLOCKWISE:
CHKS((motion == G_84), _("Spindle turning counterclockwise in G84"));
return INTERP_OK;
}
ERS(_("Spindle state unknown for %s"), toString(motion).c_str());
}
int Interp::convert_cycle_g74_g84(block_pointer block,
CANON_PLANE plane, double x, double y, double clear_z, double bottom_z, CANON_DIRECTION direction, CANON_SPEED_FEED_MODE mode, int motion, double dwell, int spindle)
{
CHP(check_g74_g84_spindle((GCodes)motion, direction));
int save_feed_override_enable;
int save_spindle_override_enable;
save_feed_override_enable = GET_EXTERNAL_FEED_OVERRIDE_ENABLE();
save_spindle_override_enable = GET_EXTERNAL_SPINDLE_OVERRIDE_ENABLE(spindle);
switch (plane) {
case CANON_PLANE_XY:
DISABLE_FEED_OVERRIDE();
DISABLE_SPEED_OVERRIDE(spindle);
cycle_feed(block, plane, x, y, bottom_z);
STOP_SPINDLE_TURNING(spindle);
if (motion == G_84)
START_SPINDLE_COUNTERCLOCKWISE(spindle);
else
START_SPINDLE_CLOCKWISE(spindle);
DWELL(dwell);
cycle_feed(block, plane, x, y, clear_z);
STOP_SPINDLE_TURNING(spindle);
if (motion == G_84)
START_SPINDLE_CLOCKWISE(spindle);
else
START_SPINDLE_COUNTERCLOCKWISE(spindle);
break;
case CANON_PLANE_YZ:
DISABLE_FEED_OVERRIDE();
DISABLE_SPEED_OVERRIDE(spindle);
cycle_feed(block, plane, bottom_z, x, y);
STOP_SPINDLE_TURNING(spindle);
if (motion == G_84)
START_SPINDLE_COUNTERCLOCKWISE(spindle);
else
START_SPINDLE_CLOCKWISE(spindle);
DWELL(dwell);
cycle_feed(block, plane, clear_z, x, y);
STOP_SPINDLE_TURNING(spindle);
if (motion == G_84)
START_SPINDLE_CLOCKWISE(spindle);
else
START_SPINDLE_COUNTERCLOCKWISE(spindle);
break;
case CANON_PLANE_XZ:
DISABLE_FEED_OVERRIDE();
DISABLE_SPEED_OVERRIDE(spindle);
cycle_feed(block, plane, y, bottom_z, x);
STOP_SPINDLE_TURNING(spindle);
if (motion == G_84)
START_SPINDLE_COUNTERCLOCKWISE(spindle);
else
START_SPINDLE_CLOCKWISE(spindle);
DWELL(dwell);
cycle_feed(block, plane, y, clear_z, x);
STOP_SPINDLE_TURNING(spindle);
if (motion == G_84)
START_SPINDLE_CLOCKWISE(spindle);
else
START_SPINDLE_COUNTERCLOCKWISE(spindle);
break;
default:
ERS("%s for plane %s not implemented",
toString((GCodes)motion).c_str(), plane_name(plane));
}
if(save_feed_override_enable)
ENABLE_FEED_OVERRIDE();
if(save_spindle_override_enable)
ENABLE_SPEED_OVERRIDE(spindle);
return INTERP_OK;
#if 0#endif
}
int Interp::convert_cycle_g85(block_pointer block,
CANON_PLANE plane, double x, double y, double r, double clear_z, double bottom_z) {
cycle_feed(block, plane, x, y, bottom_z);
cycle_feed(block, plane, x, y, r);
cycle_traverse(block, plane, x, y, clear_z);
return INTERP_OK;
}
int Interp::convert_cycle_g86(block_pointer block,
CANON_PLANE plane, double x, double y, double clear_z, double bottom_z, double dwell, CANON_DIRECTION direction, int spindle) {
CHKS(((direction != CANON_CLOCKWISE) &&
(direction != CANON_COUNTERCLOCKWISE)),
NCE_SPINDLE_NOT_TURNING_IN_G86);
cycle_feed(block, plane, x, y, bottom_z);
DWELL(dwell);
STOP_SPINDLE_TURNING(spindle);
cycle_traverse(block, plane, x, y, clear_z);
if (direction == CANON_CLOCKWISE)
START_SPINDLE_CLOCKWISE(spindle);
else
START_SPINDLE_COUNTERCLOCKWISE(spindle);
return INTERP_OK;
}
int Interp::convert_cycle_g87(block_pointer block,
CANON_PLANE plane, double x, double offset_x, double y, double offset_y, double r, double clear_z, double middle_z, double bottom_z, CANON_DIRECTION direction, int spindle) {
CHKS(((direction != CANON_CLOCKWISE) &&
(direction != CANON_COUNTERCLOCKWISE)),
NCE_SPINDLE_NOT_TURNING_IN_G87);
cycle_traverse(block, plane, offset_x, offset_y, r);
STOP_SPINDLE_TURNING(spindle);
ORIENT_SPINDLE(spindle, 0.0, direction);
cycle_traverse(block, plane, offset_x, offset_y, bottom_z);
cycle_traverse(block, plane, x, y, bottom_z);
if (direction == CANON_CLOCKWISE)
START_SPINDLE_CLOCKWISE(spindle);
else
START_SPINDLE_COUNTERCLOCKWISE(spindle);
cycle_feed(block, plane, x, y, middle_z);
cycle_feed(block, plane, x, y, bottom_z);
STOP_SPINDLE_TURNING(spindle);
ORIENT_SPINDLE(spindle,0.0, direction);
cycle_traverse(block, plane, offset_x, offset_y, bottom_z);
cycle_traverse(block, plane, offset_x, offset_y, clear_z);
cycle_traverse(block, plane, x, y, clear_z);
if (direction == CANON_CLOCKWISE)
START_SPINDLE_CLOCKWISE(spindle);
else
START_SPINDLE_COUNTERCLOCKWISE(spindle);
return INTERP_OK;
}
int Interp::convert_cycle_g88(block_pointer block,
CANON_PLANE plane, double x, double y, double bottom_z, double dwell, CANON_DIRECTION direction, int spindle) {
CHKS(((direction != CANON_CLOCKWISE) &&
(direction != CANON_COUNTERCLOCKWISE)),
NCE_SPINDLE_NOT_TURNING_IN_G88);
cycle_feed(block, plane, x, y, bottom_z);
DWELL(dwell);
STOP_SPINDLE_TURNING(spindle);
PROGRAM_STOP();
if (direction == CANON_CLOCKWISE)
START_SPINDLE_CLOCKWISE(spindle);
else
START_SPINDLE_COUNTERCLOCKWISE(spindle);
return INTERP_OK;
}
int Interp::convert_cycle_g89(block_pointer block,
CANON_PLANE plane, double x, double y, double clear_z, double bottom_z, double dwell) {
cycle_feed(block, plane, x, y, bottom_z);
DWELL(dwell);
cycle_feed(block, plane, x, y, clear_z);
return INTERP_OK;
}
static const char* plane_name(CANON_PLANE p) {
switch(p) {
case CANON_PLANE_XY: return "XY";
case CANON_PLANE_YZ: return "YZ";
case CANON_PLANE_XZ: return "XZ";
case CANON_PLANE_UV: return "UV";
case CANON_PLANE_VW: return "VW";
case CANON_PLANE_UW: return "UW";
default: return "invalid";
}
}
int Interp::convert_cycle(int motion, block_pointer block, setup_pointer settings) {
CANON_PLANE plane;
CHKS((settings->feed_rate == 0.0), _("Cannot feed with zero feed rate"));
CHKS((settings->feed_mode == INVERSE_TIME), _("Cannot use inverse time feed with canned cycles"));
CHKS((settings->cutter_comp_side), _("Cannot use canned cycles with cutter compensation on"));
plane = settings->plane;
if (!block->r_flag) {
if (settings->motion_mode == motion)
block->r_number = settings->cycle_r;
else
ERS(NCE_R_CLEARANCE_PLANE_UNSPECIFIED_IN_CYCLE);
}
CHKS((block->l_number == 0), NCE_CANNOT_DO_ZERO_REPEATS_OF_CYCLE);
if (block->l_number == -1)
block->l_number = 1;
switch(plane) {
case CANON_PLANE_XY:
case CANON_PLANE_XZ:
case CANON_PLANE_YZ:
CHKS(block->u_flag, "Cannot put a U in a canned cycle in the %s plane",
plane_name(settings->plane));
CHKS(block->v_flag, "Cannot put a V in a canned cycle in the %s plane",
plane_name(settings->plane));
CHKS(block->w_flag, "Cannot put a W in a canned cycle in the %s plane",
plane_name(settings->plane));
break;
case CANON_PLANE_UV:
case CANON_PLANE_VW:
case CANON_PLANE_UW:
CHKS(block->x_flag, "Cannot put an X in a canned cycle in the %s plane",
plane_name(settings->plane));
CHKS(block->y_flag, "Cannot put a Y in a canned cycle in the %s plane",
plane_name(settings->plane));
CHKS(block->z_flag, "Cannot put a Z in a canned cycle in the %s plane",
plane_name(settings->plane));
}
if (plane == CANON_PLANE_XY) {
CHP(convert_cycle_xy(motion, block, settings));
} else if (plane == CANON_PLANE_YZ) {
CHP(convert_cycle_yz(motion, block, settings));
} else if (plane == CANON_PLANE_XZ) {
CHP(convert_cycle_zx(motion, block, settings));
} else if (plane == CANON_PLANE_UV) {
CHP(convert_cycle_uv(motion, block, settings));
} else if (plane == CANON_PLANE_VW) {
CHP(convert_cycle_vw(motion, block, settings));
} else if (plane == CANON_PLANE_UW) {
CHP(convert_cycle_wu(motion, block, settings));
} else
ERS(NCE_BUG_PLANE_NOT_XY_YZ_OR_XZ);
settings->cycle_l = block->l_number;
settings->cycle_r = block->r_number;
settings->motion_mode = motion;
return INTERP_OK;
}
int Interp::convert_cycle_xy(int motion, block_pointer block, setup_pointer settings) {
double aa;
double aa_increment=0.;
double bb;
double bb_increment=0.;
double cc;
double clear_cc;
double i;
double j;
double k;
double old_cc;
double radius_increment = 0.;
double theta_increment = 0.;
CANON_PLANE plane;
double r;
int repeat;
CANON_MOTION_MODE save_mode;
double save_tolerance;
double current_cc = settings->current_z;
plane = CANON_PLANE_XY;
if (settings->motion_mode != motion) {
CHKS((!block->z_flag),
_readers[(int)'z']? NCE_Z_VALUE_UNSPECIFIED_IN_XY_PLANE_CANNED_CYCLE: _("G17 canned cycle is not possible on a machine without Z axis"));
}
block->z_number =
block->z_flag ? block->z_number : settings->cycle_cc;
if(settings->cycle_il_flag) {
old_cc = settings->cycle_il;
} else {
old_cc = settings->cycle_il = current_cc;
settings->cycle_il_flag = true;
}
if (settings->distance_mode == MODE_ABSOLUTE) {
double radius, theta;
aa_increment = 0.0;
bb_increment = 0.0;
r = block->r_number;
cc = block->z_number;
if(block->radius_flag)
radius = block->radius;
else
radius = hypot(settings->current_y, settings->current_x);
if(block->theta_flag)
theta = D2R(block->theta);
else
theta = atan2(settings->current_y, settings->current_x);
if(block->radius_flag || block->theta_flag) {
aa = radius * cos(theta);
bb = radius * sin(theta);
} else {
aa = block->x_flag ? block->x_number : settings->current_x;
bb = block->y_flag ? block->y_number : settings->current_y;
}
} else if (settings->distance_mode == MODE_INCREMENTAL) {
if (block->x_flag) aa_increment = block->x_number;
if (block->y_flag) bb_increment = block->y_number;
if (block->radius_flag) radius_increment = block->radius;
if (block->theta_flag) theta_increment = D2R(block->theta);
r = (block->r_number + old_cc);
cc = (r + block->z_number);
aa = settings->current_x;
bb = settings->current_y;
} else
ERS(NCE_BUG_DISTANCE_MODE_NOT_G90_OR_G91);
CHKS((r < cc), NCE_R_LESS_THAN_Z_IN_CYCLE_IN_XY_PLANE);
if (old_cc < r) {
STRAIGHT_TRAVERSE(block->line_number, settings->current_x, settings->current_y, r,
settings->AA_current, settings->BB_current, settings->CC_current,
settings->u_current, settings->v_current, settings->w_current);
old_cc = r;
current_cc = old_cc;
}
clear_cc = (settings->retract_mode == R_PLANE) ? r : old_cc;
save_mode = GET_EXTERNAL_MOTION_CONTROL_MODE();
save_tolerance = GET_EXTERNAL_MOTION_CONTROL_TOLERANCE();
if (save_mode != CANON_EXACT_PATH)
SET_MOTION_CONTROL_MODE(CANON_EXACT_PATH, 0);
switch (motion) {
case G_81:
CYCLE_MACRO(convert_cycle_g81(block, CANON_PLANE_XY, aa, bb, clear_cc, cc))
break;
case G_82:
CHKS(((settings->motion_mode != G_82) && (block->p_number == -1.0)),
NCE_DWELL_TIME_P_WORD_MISSING_WITH_G82);
block->p_number =
block->p_number == -1.0 ? settings->cycle_p : block->p_number;
CYCLE_MACRO(convert_cycle_g82(block, CANON_PLANE_XY, aa, bb, clear_cc, cc,
block->p_number))
settings->cycle_p = block->p_number;
break;
case G_73:
CHKS(((settings->motion_mode != G_73) && (block->q_number == -1.0)),
NCE_Q_WORD_MISSING_WITH_G73);
block->q_number =
block->q_number == -1.0 ? settings->cycle_q : block->q_number;
CYCLE_MACRO(convert_cycle_g73(block, CANON_PLANE_XY, aa, bb, r, clear_cc, cc,
block->q_number))
settings->cycle_q = block->q_number;
break;
case G_83:
CHKS(((settings->motion_mode != G_83) && (block->q_number == -1.0)),
NCE_Q_WORD_MISSING_WITH_G83);
block->q_number =
block->q_number == -1.0 ? settings->cycle_q : block->q_number;
CYCLE_MACRO(convert_cycle_g83(block, CANON_PLANE_XY, aa, bb, r, clear_cc, cc,
block->q_number))
settings->cycle_q = block->q_number;
break;
case G_74:
case G_84:
block->p_number =
block->p_number == -1.0 ? settings->cycle_p : block->p_number;
if (block->dollar_flag){
CHKS((block->dollar_number < 0 || block->dollar_number >= settings->num_spindles),
(_("Invalid spindle ($) number in G74/G84 cycle")));
settings->active_spindle = (int)block->dollar_number;
}
CYCLE_MACRO(convert_cycle_g74_g84(block, CANON_PLANE_XY, aa, bb, clear_cc, cc,
settings->spindle_turning[settings->active_spindle],
settings->speed_feed_mode,
motion, block->p_number, settings->active_spindle))
settings->cycle_p = block->p_number;
break;
case G_85:
CYCLE_MACRO(convert_cycle_g85(block, CANON_PLANE_XY, aa, bb, r, clear_cc, cc))
break;
case G_86:
CHKS(((settings->motion_mode != G_86) && (block->p_number == -1.0)),
NCE_DWELL_TIME_P_WORD_MISSING_WITH_G86);
block->p_number =
block->p_number == -1.0 ? settings->cycle_p : block->p_number;
CYCLE_MACRO(convert_cycle_g86(block, CANON_PLANE_XY, aa, bb, clear_cc, cc,
block->p_number,
settings->spindle_turning[settings->active_spindle],
settings->active_spindle))
settings->cycle_p = block->p_number;
break;
case G_87:
if (settings->motion_mode != G_87) {
CHKS((!block->i_flag), NCE_I_WORD_MISSING_WITH_G87);
CHKS((!block->j_flag), NCE_J_WORD_MISSING_WITH_G87);
CHKS((!block->k_flag), NCE_K_WORD_MISSING_WITH_G87);
}
i = block->i_flag ? block->i_number : settings->cycle_i;
j = block->j_flag ? block->j_number : settings->cycle_j;
k = block->k_flag ? block->k_number : settings->cycle_k;
settings->cycle_i = i;
settings->cycle_j = j;
settings->cycle_k = k;
if (settings->distance_mode == MODE_INCREMENTAL) {
k = (cc + k);
}
CYCLE_MACRO(convert_cycle_g87(block, CANON_PLANE_XY, aa, (aa + i), bb,
(bb + j), r, clear_cc, k, cc,
settings->spindle_turning[settings->active_spindle],
settings->active_spindle));
break;
case G_88:
CHKS(((settings->motion_mode != G_88) && (block->p_number == -1.0)),
NCE_DWELL_TIME_P_WORD_MISSING_WITH_G88);
block->p_number =
block->p_number == -1.0 ? settings->cycle_p : block->p_number;
CYCLE_MACRO(convert_cycle_g88(block, CANON_PLANE_XY, aa, bb, cc,
block->p_number,
settings->spindle_turning[settings->active_spindle],
settings->active_spindle))
settings->cycle_p = block->p_number;
break;
case G_89:
CHKS(((settings->motion_mode != G_89) && (block->p_number == -1.0)),
NCE_DWELL_TIME_P_WORD_MISSING_WITH_G89);
block->p_number =
block->p_number == -1.0 ? settings->cycle_p : block->p_number;
CYCLE_MACRO(convert_cycle_g89(block, CANON_PLANE_XY, aa, bb, clear_cc, cc,
block->p_number))
settings->cycle_p = block->p_number;
break;
default:
ERS(NCE_BUG_FUNCTION_SHOULD_NOT_HAVE_BEEN_CALLED);
}
settings->current_x = aa;
settings->current_y = bb;
settings->current_z = clear_cc;
settings->cycle_cc = block->z_number;
if (save_mode != CANON_EXACT_PATH)
SET_MOTION_CONTROL_MODE(save_mode, save_tolerance);
return INTERP_OK;
}
int Interp::convert_cycle_uv(int motion, block_pointer block, setup_pointer settings) {
int spindle = settings->active_spindle;
double aa;
double aa_increment=0.;
double bb;
double bb_increment=0.;
double cc;
double clear_cc;
double i;
double j;
double k;
double old_cc;
double radius_increment = 0.;
double theta_increment = 0.;
CANON_PLANE plane;
double r;
int repeat;
CANON_MOTION_MODE save_mode;
double save_tolerance;
double current_cc = settings->w_current;
plane = CANON_PLANE_UV;
if (settings->motion_mode != motion) {
CHKS((!block->w_flag),
_readers[(int)'w']? NCE_W_VALUE_UNSPECIFIED_IN_UV_PLANE_CANNED_CYCLE: _("G17.1 canned cycle is not possible on a machine without W axis"));
}
block->w_number =
block->w_flag ? block->w_number : settings->cycle_cc;
if(settings->cycle_il_flag) {
old_cc = settings->cycle_il;
} else {
old_cc = settings->cycle_il = current_cc;
settings->cycle_il_flag = true;
}
if (settings->distance_mode == MODE_ABSOLUTE) {
aa_increment = 0.0;
bb_increment = 0.0;
r = block->r_number;
cc = block->w_number;
aa = block->u_flag ? block->u_number : settings->u_current;
bb = block->v_flag ? block->v_number : settings->v_current;
} else if (settings->distance_mode == MODE_INCREMENTAL) {
if (block->u_flag) aa_increment = block->u_number;
if (block->v_flag) bb_increment = block->v_number;
r = (block->r_number + old_cc);
cc = (r + block->w_number);
aa = settings->u_current;
bb = settings->v_current;
} else
ERS(NCE_BUG_DISTANCE_MODE_NOT_G90_OR_G91);
CHKS((r < cc), NCE_R_LESS_THAN_W_IN_CYCLE_IN_UV_PLANE);
if (old_cc < r) {
STRAIGHT_TRAVERSE(block->line_number, settings->current_x, settings->current_y, settings->current_z,
settings->AA_current, settings->BB_current, settings->CC_current,
settings->u_current, settings->v_current, r);
old_cc = r;
current_cc = old_cc;
}
clear_cc = (settings->retract_mode == R_PLANE) ? r : old_cc;
save_mode = GET_EXTERNAL_MOTION_CONTROL_MODE();
save_tolerance = GET_EXTERNAL_MOTION_CONTROL_TOLERANCE();
if (save_mode != CANON_EXACT_PATH)
SET_MOTION_CONTROL_MODE(CANON_EXACT_PATH, 0);
switch (motion) {
case G_81:
CYCLE_MACRO(convert_cycle_g81(block, CANON_PLANE_UV, aa, bb, clear_cc, cc))
break;
case G_82:
CHKS(((settings->motion_mode != G_82) && (block->p_number == -1.0)),
NCE_DWELL_TIME_P_WORD_MISSING_WITH_G82);
block->p_number =
block->p_number == -1.0 ? settings->cycle_p : block->p_number;
CYCLE_MACRO(convert_cycle_g82(block, CANON_PLANE_UV, aa, bb, clear_cc, cc,
block->p_number))
settings->cycle_p = block->p_number;
break;
case G_83:
CHKS(((settings->motion_mode != G_83) && (block->q_number == -1.0)),
NCE_Q_WORD_MISSING_WITH_G83);
block->q_number =
block->q_number == -1.0 ? settings->cycle_q : block->q_number;
CYCLE_MACRO(convert_cycle_g83(block, CANON_PLANE_UV, aa, bb, r, clear_cc, cc,
block->q_number))
settings->cycle_q = block->q_number;
break;
case G_73:
CHKS(((settings->motion_mode != G_73) && (block->q_number == -1.0)),
NCE_Q_WORD_MISSING_WITH_G73);
block->q_number =
block->q_number == -1.0 ? settings->cycle_q : block->q_number;
CYCLE_MACRO(convert_cycle_g73(block, CANON_PLANE_UV, aa, bb, r, clear_cc, cc,
block->q_number))
settings->cycle_q = block->q_number;
break;
case G_74:
case G_84:
block->p_number =
block->p_number == -1.0 ? settings->cycle_p : block->p_number;
if (block->dollar_flag){
CHKS((block->dollar_number < 0 || block->dollar_number >= settings->num_spindles),
(_("Invalid spindle ($) numberin G74/G84 cycle")));
settings->active_spindle = (int)block->dollar_number;
}
CYCLE_MACRO(convert_cycle_g74_g84(block, CANON_PLANE_UV, aa, bb, clear_cc, cc,
settings->spindle_turning[spindle],
settings->speed_feed_mode,
motion, block->p_number, settings->active_spindle))
settings->cycle_p = block->p_number;
break;
case G_85:
CYCLE_MACRO(convert_cycle_g85(block, CANON_PLANE_UV, aa, bb, r, clear_cc, cc))
break;
case G_86:
CHKS(((settings->motion_mode != G_86) && (block->p_number == -1.0)),
NCE_DWELL_TIME_P_WORD_MISSING_WITH_G86);
block->p_number =
block->p_number == -1.0 ? settings->cycle_p : block->p_number;
CYCLE_MACRO(convert_cycle_g86(block, CANON_PLANE_UV, aa, bb, clear_cc, cc,
block->p_number,
settings->spindle_turning[settings->active_spindle],
settings->active_spindle))
settings->cycle_p = block->p_number;
break;
case G_87:
if (settings->motion_mode != G_87) {
CHKS((!block->i_flag), NCE_I_WORD_MISSING_WITH_G87);
CHKS((!block->j_flag), NCE_J_WORD_MISSING_WITH_G87);
CHKS((!block->k_flag), NCE_K_WORD_MISSING_WITH_G87);
}
i = block->i_flag ? block->i_number : settings->cycle_i;
j = block->j_flag ? block->j_number : settings->cycle_j;
k = block->k_flag ? block->k_number : settings->cycle_k;
settings->cycle_i = i;
settings->cycle_j = j;
settings->cycle_k = k;
if (settings->distance_mode == MODE_INCREMENTAL) {
k = (cc + k);
}
CYCLE_MACRO(convert_cycle_g87(block, CANON_PLANE_UV, aa, (aa + i), bb,
(bb + j), r, clear_cc, k, cc,
settings->spindle_turning[settings->active_spindle],
settings->active_spindle))
break;
case G_88:
CHKS(((settings->motion_mode != G_88) && (block->p_number == -1.0)),
NCE_DWELL_TIME_P_WORD_MISSING_WITH_G88);
block->p_number =
block->p_number == -1.0 ? settings->cycle_p : block->p_number;
CYCLE_MACRO(convert_cycle_g88(block, CANON_PLANE_UV, aa, bb, cc,
block->p_number,
settings->spindle_turning[settings->active_spindle],
settings->active_spindle))
settings->cycle_p = block->p_number;
break;
case G_89:
CHKS(((settings->motion_mode != G_89) && (block->p_number == -1.0)),
NCE_DWELL_TIME_P_WORD_MISSING_WITH_G89);
block->p_number =
block->p_number == -1.0 ? settings->cycle_p : block->p_number;
CYCLE_MACRO(convert_cycle_g89(block, CANON_PLANE_UV, aa, bb, clear_cc, cc,
block->p_number))
settings->cycle_p = block->p_number;
break;
default:
ERS(NCE_BUG_FUNCTION_SHOULD_NOT_HAVE_BEEN_CALLED);
}
settings->u_current = aa;
settings->v_current = bb;
settings->w_current = clear_cc;
settings->cycle_cc = block->w_number;
if (save_mode != CANON_EXACT_PATH)
SET_MOTION_CONTROL_MODE(save_mode, save_tolerance);
return INTERP_OK;
}
int Interp::convert_cycle_yz(int motion, block_pointer block, setup_pointer settings) {
int spindle = settings->active_spindle;
double aa;
double aa_increment=0.;
double bb;
double bb_increment=0.;
double cc;
double clear_cc;
double i;
double j;
double k;
double old_cc;
double radius_increment = 0.;
double theta_increment = 0.;
CANON_PLANE plane;
double r;
int repeat;
CANON_MOTION_MODE save_mode;
double save_tolerance; double current_cc = settings->current_x;
plane = CANON_PLANE_YZ;
if (settings->motion_mode != motion) {
CHKS((!block->x_flag),
_readers[(int)'x']? NCE_X_VALUE_UNSPECIFIED_IN_YZ_PLANE_CANNED_CYCLE: _("G19 canned cycle is not possible on a machine without X axis"));
}
block->x_number =
block->x_flag ? block->x_number : settings->cycle_cc;
if(settings->cycle_il_flag) {
old_cc = settings->cycle_il;
} else {
old_cc = settings->cycle_il = current_cc;
settings->cycle_il_flag = true;
}
if (settings->distance_mode == MODE_ABSOLUTE) {
aa_increment = 0.0;
bb_increment = 0.0;
r = block->r_number;
cc = block->x_number;
aa = block->y_flag ? block->y_number : settings->current_y;
bb = block->z_flag ? block->z_number : settings->current_z;
} else if (settings->distance_mode == MODE_INCREMENTAL) {
if (block->y_flag) aa_increment = block->y_number;
if (block->z_flag) bb_increment = block->z_number;
r = (block->r_number + old_cc);
cc = (r + block->x_number);
aa = settings->current_y;
bb = settings->current_z;
} else
ERS(NCE_BUG_DISTANCE_MODE_NOT_G90_OR_G91);
CHKS((r < cc), NCE_R_LESS_THAN_X_IN_CYCLE_IN_YZ_PLANE);
if (old_cc < r) {
STRAIGHT_TRAVERSE(block->line_number, r, settings->current_y, settings->current_z,
settings->AA_current, settings->BB_current, settings->CC_current,
settings->u_current, settings->v_current, settings->w_current);
old_cc = r;
current_cc = old_cc;
}
clear_cc = (settings->retract_mode == R_PLANE) ? r : old_cc;
save_mode = GET_EXTERNAL_MOTION_CONTROL_MODE();
save_tolerance = GET_EXTERNAL_MOTION_CONTROL_TOLERANCE();
if (save_mode != CANON_EXACT_PATH)
SET_MOTION_CONTROL_MODE(CANON_EXACT_PATH, 0);
switch (motion) {
case G_81:
CYCLE_MACRO(convert_cycle_g81(block, CANON_PLANE_YZ, aa, bb, clear_cc, cc))
break;
case G_82:
CHKS(((settings->motion_mode != G_82) && (block->p_number == -1.0)),
NCE_DWELL_TIME_P_WORD_MISSING_WITH_G82);
block->p_number =
block->p_number == -1.0 ? settings->cycle_p : block->p_number;
CYCLE_MACRO(convert_cycle_g82(block, CANON_PLANE_YZ, aa, bb, clear_cc, cc,
block->p_number))
settings->cycle_p = block->p_number;
break;
case G_73:
CHKS(((settings->motion_mode != G_73) && (block->q_number == -1.0)),
NCE_Q_WORD_MISSING_WITH_G73);
block->q_number =
block->q_number == -1.0 ? settings->cycle_q : block->q_number;
CYCLE_MACRO(convert_cycle_g73(block, CANON_PLANE_YZ, aa, bb, r, clear_cc, cc,
block->q_number))
settings->cycle_q = block->q_number;
break;
case G_83:
CHKS(((settings->motion_mode != G_83) && (block->q_number == -1.0)),
NCE_Q_WORD_MISSING_WITH_G83);
block->q_number =
block->q_number == -1.0 ? settings->cycle_q : block->q_number;
CYCLE_MACRO(convert_cycle_g83(block, CANON_PLANE_YZ, aa, bb, r, clear_cc, cc,
block->q_number))
settings->cycle_q = block->q_number;
break;
case G_74:
case G_84:
block->p_number =
block->p_number == -1.0 ? settings->cycle_p : block->p_number;
if (block->dollar_flag){
CHKS((block->dollar_number < 0 || block->dollar_number >= settings->num_spindles),
(_("Invalid spindle ($) number in G74/G84 cycle")));
settings->active_spindle = (int)block->dollar_number;
}
CYCLE_MACRO(convert_cycle_g74_g84(block, CANON_PLANE_YZ, aa, bb, clear_cc, cc,
settings->spindle_turning[spindle],
settings->speed_feed_mode,
motion, block->p_number, settings->active_spindle))
settings->cycle_p = block->p_number;
break;
case G_85:
CYCLE_MACRO(convert_cycle_g85(block, CANON_PLANE_YZ, aa, bb, r, clear_cc, cc))
break;
case G_86:
CHKS(((settings->motion_mode != G_86) && (block->p_number == -1.0)),
NCE_DWELL_TIME_P_WORD_MISSING_WITH_G86);
block->p_number =
block->p_number == -1.0 ? settings->cycle_p : block->p_number;
CYCLE_MACRO(convert_cycle_g86(block, CANON_PLANE_YZ, aa, bb, clear_cc, cc,
block->p_number,
settings->spindle_turning[settings->active_spindle],
settings->active_spindle));
settings->cycle_p = block->p_number;
break;
case G_87:
if (settings->motion_mode != G_87) {
CHKS((!block->i_flag), NCE_I_WORD_MISSING_WITH_G87);
CHKS((!block->j_flag), NCE_J_WORD_MISSING_WITH_G87);
CHKS((!block->k_flag), NCE_K_WORD_MISSING_WITH_G87);
}
i = block->i_flag ? block->i_number : settings->cycle_i;
j = block->j_flag ? block->j_number : settings->cycle_j;
k = block->k_flag ? block->k_number : settings->cycle_k;
settings->cycle_i = i;
settings->cycle_j = j;
settings->cycle_k = k;
if (settings->distance_mode == MODE_INCREMENTAL) {
i = (cc + i);
}
CYCLE_MACRO(convert_cycle_g87(block, CANON_PLANE_YZ, aa, (aa + j), bb,
(bb + k), r, clear_cc, i, cc,
settings->spindle_turning[settings->active_spindle],
settings->active_spindle));
break;
case G_88:
CHKS(((settings->motion_mode != G_88) && (block->p_number == -1.0)),
NCE_DWELL_TIME_P_WORD_MISSING_WITH_G88);
block->p_number =
block->p_number == -1.0 ? settings->cycle_p : block->p_number;
CYCLE_MACRO(convert_cycle_g88(block, CANON_PLANE_YZ, aa, bb, cc,
block->p_number,
settings->spindle_turning[settings->active_spindle],
settings->active_spindle));
settings->cycle_p = block->p_number;
break;
case G_89:
CHKS(((settings->motion_mode != G_89) && (block->p_number == -1.0)),
NCE_DWELL_TIME_P_WORD_MISSING_WITH_G89);
block->p_number =
block->p_number == -1.0 ? settings->cycle_p : block->p_number;
CYCLE_MACRO(convert_cycle_g89(block, CANON_PLANE_YZ, aa, bb, clear_cc, cc,
block->p_number))
settings->cycle_p = block->p_number;
break;
default:
ERS(NCE_BUG_FUNCTION_SHOULD_NOT_HAVE_BEEN_CALLED);
}
settings->current_y = aa;
settings->current_z = bb;
settings->current_x = clear_cc;
settings->cycle_cc = block->x_number;
if (save_mode != CANON_EXACT_PATH)
SET_MOTION_CONTROL_MODE(save_mode, save_tolerance);
return INTERP_OK;
}
int Interp::convert_cycle_vw(int motion, block_pointer block, setup_pointer settings) {
double aa;
double aa_increment=0.;
double bb;
double bb_increment=0.;
double cc;
double clear_cc;
double i;
double j;
double k;
double old_cc;
double radius_increment = 0.;
double theta_increment = 0.;
CANON_PLANE plane;
double r;
int repeat;
CANON_MOTION_MODE save_mode;
double save_tolerance; double current_cc = settings->u_current;
plane = CANON_PLANE_VW;
if (settings->motion_mode != motion) {
CHKS((!block->u_flag),
_readers[(int)'u']? NCE_U_VALUE_UNSPECIFIED_IN_VW_PLANE_CANNED_CYCLE: _("G19.1 canned cycle is not possible on a machine without U axis"));
}
block->u_number =
block->u_flag ? block->u_number : settings->cycle_cc;
if(settings->cycle_il_flag) {
old_cc = settings->cycle_il;
} else {
old_cc = settings->cycle_il = current_cc;
settings->cycle_il_flag = true;
}
if (settings->distance_mode == MODE_ABSOLUTE) {
aa_increment = 0.0;
bb_increment = 0.0;
r = block->r_number;
cc = block->u_number;
aa = block->v_flag ? block->v_number : settings->v_current;
bb = block->w_flag ? block->w_number : settings->w_current;
} else if (settings->distance_mode == MODE_INCREMENTAL) {
if (block->v_flag) aa_increment = block->v_number;
if (block->w_flag) bb_increment = block->w_number;
r = (block->r_number + old_cc);
cc = (r + block->u_number);
aa = settings->v_current;
bb = settings->w_current;
} else
ERS(NCE_BUG_DISTANCE_MODE_NOT_G90_OR_G91);
CHKS((r < cc), NCE_R_LESS_THAN_U_IN_CYCLE_IN_VW_PLANE);
if (old_cc < r) {
STRAIGHT_TRAVERSE(block->line_number, settings->current_x, settings->current_y, settings->current_z,
settings->AA_current, settings->BB_current, settings->CC_current,
r, settings->v_current, settings->w_current);
old_cc = r;
current_cc = old_cc;
}
clear_cc = (settings->retract_mode == R_PLANE) ? r : old_cc;
save_mode = GET_EXTERNAL_MOTION_CONTROL_MODE();
save_tolerance = GET_EXTERNAL_MOTION_CONTROL_TOLERANCE();
if (save_mode != CANON_EXACT_PATH)
SET_MOTION_CONTROL_MODE(CANON_EXACT_PATH, 0);
switch (motion) {
case G_81:
CYCLE_MACRO(convert_cycle_g81(block, CANON_PLANE_VW, aa, bb, clear_cc, cc))
break;
case G_82:
CHKS(((settings->motion_mode != G_82) && (block->p_number == -1.0)),
NCE_DWELL_TIME_P_WORD_MISSING_WITH_G82);
block->p_number =
block->p_number == -1.0 ? settings->cycle_p : block->p_number;
CYCLE_MACRO(convert_cycle_g82(block, CANON_PLANE_VW, aa, bb, clear_cc, cc,
block->p_number))
settings->cycle_p = block->p_number;
break;
case G_83:
CHKS(((settings->motion_mode != G_83) && (block->q_number == -1.0)),
NCE_Q_WORD_MISSING_WITH_G83);
block->q_number =
block->q_number == -1.0 ? settings->cycle_q : block->q_number;
CYCLE_MACRO(convert_cycle_g83(block, CANON_PLANE_VW, aa, bb, r, clear_cc, cc,
block->q_number))
settings->cycle_q = block->q_number;
break;
case G_73:
CHKS(((settings->motion_mode != G_73) && (block->q_number == -1.0)),
NCE_Q_WORD_MISSING_WITH_G73);
block->q_number =
block->q_number == -1.0 ? settings->cycle_q : block->q_number;
CYCLE_MACRO(convert_cycle_g73(block, CANON_PLANE_VW, aa, bb, r, clear_cc, cc,
block->q_number))
settings->cycle_q = block->q_number;
break;
case G_74:
case G_84:
block->p_number =
block->p_number == -1.0 ? settings->cycle_p : block->p_number;
if (block->dollar_flag){
CHKS((block->dollar_number < 0 || block->dollar_number >= settings->num_spindles),
(_("Invalid spindle ($) number in G74/G84 cycle")));
settings->active_spindle = (int)block->dollar_number;
}
CYCLE_MACRO(convert_cycle_g74_g84(block, CANON_PLANE_VW, aa, bb, clear_cc, cc,
settings->spindle_turning[settings->active_spindle],
settings->speed_feed_mode,
motion, block->p_number, settings->active_spindle))
settings->cycle_p = block->p_number;
break;
case G_85:
CYCLE_MACRO(convert_cycle_g85(block, CANON_PLANE_VW, aa, bb, r, clear_cc, cc))
break;
case G_86:
CHKS(((settings->motion_mode != G_86) && (block->p_number == -1.0)),
NCE_DWELL_TIME_P_WORD_MISSING_WITH_G86);
block->p_number =
block->p_number == -1.0 ? settings->cycle_p : block->p_number;
CYCLE_MACRO(convert_cycle_g86(block, CANON_PLANE_VW, aa, bb, clear_cc, cc,
block->p_number,
settings->spindle_turning[settings->active_spindle],
settings->active_spindle));
settings->cycle_p = block->p_number;
break;
case G_87:
if (settings->motion_mode != G_87) {
CHKS((!block->i_flag), NCE_I_WORD_MISSING_WITH_G87);
CHKS((!block->j_flag), NCE_J_WORD_MISSING_WITH_G87);
CHKS((!block->k_flag), NCE_K_WORD_MISSING_WITH_G87);
}
i = block->i_flag ? block->i_number : settings->cycle_i;
j = block->j_flag ? block->j_number : settings->cycle_j;
k = block->k_flag ? block->k_number : settings->cycle_k;
settings->cycle_i = i;
settings->cycle_j = j;
settings->cycle_k = k;
if (settings->distance_mode == MODE_INCREMENTAL) {
i = (cc + i);
}
CYCLE_MACRO(convert_cycle_g87(block, CANON_PLANE_VW, aa, (aa + j), bb,
(bb + k), r, clear_cc, i, cc,
settings->spindle_turning[settings->active_spindle],
settings->active_spindle));
break;
case G_88:
CHKS(((settings->motion_mode != G_88) && (block->p_number == -1.0)),
NCE_DWELL_TIME_P_WORD_MISSING_WITH_G88);
block->p_number =
block->p_number == -1.0 ? settings->cycle_p : block->p_number;
CYCLE_MACRO(convert_cycle_g88(block, CANON_PLANE_VW, aa, bb, cc,
block->p_number,
settings->spindle_turning[settings->active_spindle],
settings->active_spindle));
settings->cycle_p = block->p_number;
break;
case G_89:
CHKS(((settings->motion_mode != G_89) && (block->p_number == -1.0)),
NCE_DWELL_TIME_P_WORD_MISSING_WITH_G89);
block->p_number =
block->p_number == -1.0 ? settings->cycle_p : block->p_number;
CYCLE_MACRO(convert_cycle_g89(block, CANON_PLANE_VW, aa, bb, clear_cc, cc,
block->p_number))
settings->cycle_p = block->p_number;
break;
default:
ERS(NCE_BUG_FUNCTION_SHOULD_NOT_HAVE_BEEN_CALLED);
}
settings->v_current = aa;
settings->w_current = bb;
settings->u_current = clear_cc;
settings->cycle_cc = block->u_number;
if (save_mode != CANON_EXACT_PATH)
SET_MOTION_CONTROL_MODE(save_mode, save_tolerance);
return INTERP_OK;
}
int Interp::convert_cycle_zx(int motion, block_pointer block, setup_pointer settings) {
double aa;
double aa_increment=0.;
double bb;
double bb_increment=0.;
double cc;
double clear_cc;
double i;
double j;
double k;
double old_cc;
double radius_increment = 0.;
double theta_increment = 0.;
CANON_PLANE plane;
double r;
int repeat;
CANON_MOTION_MODE save_mode;
double save_tolerance; double current_cc = settings->current_y;
plane = CANON_PLANE_XZ;
if (settings->motion_mode != motion) {
CHKS((!block->y_flag),
_readers[(int)'y']? NCE_Y_VALUE_UNSPECIFIED_IN_XZ_PLANE_CANNED_CYCLE: _("G18 canned cycle is not possible on a machine without Y axis"));
}
block->y_number =
block->y_flag ? block->y_number : settings->cycle_cc;
if(settings->cycle_il_flag) {
old_cc = settings->cycle_il;
} else {
old_cc = settings->cycle_il = current_cc;
settings->cycle_il_flag = true;
}
if (settings->distance_mode == MODE_ABSOLUTE) {
aa_increment = 0.0;
bb_increment = 0.0;
r = block->r_number;
cc = block->y_number;
aa = block->z_flag ? block->z_number : settings->current_z;
bb = block->x_flag ? block->x_number : settings->current_x;
} else if (settings->distance_mode == MODE_INCREMENTAL) {
if (block->z_flag) aa_increment = block->z_number;
if (block->x_flag) bb_increment = block->x_number;
r = (block->r_number + old_cc);
cc = (r + block->y_number);
aa = settings->current_z;
bb = settings->current_x;
} else
ERS(NCE_BUG_DISTANCE_MODE_NOT_G90_OR_G91);
CHKS((r < cc), NCE_R_LESS_THAN_Y_IN_CYCLE_IN_XZ_PLANE);
if (old_cc < r) {
STRAIGHT_TRAVERSE(block->line_number, settings->current_x, r, settings->current_z,
settings->AA_current, settings->BB_current, settings->CC_current,
settings->u_current, settings->v_current, settings->w_current);
old_cc = r;
current_cc = old_cc;
}
clear_cc = (settings->retract_mode == R_PLANE) ? r : old_cc;
save_mode = GET_EXTERNAL_MOTION_CONTROL_MODE();
save_tolerance = GET_EXTERNAL_MOTION_CONTROL_TOLERANCE();
if (save_mode != CANON_EXACT_PATH)
SET_MOTION_CONTROL_MODE(CANON_EXACT_PATH, 0);
switch (motion) {
case G_81:
CYCLE_MACRO(convert_cycle_g81(block, CANON_PLANE_XZ, aa, bb, clear_cc, cc))
break;
case G_82:
CHKS(((settings->motion_mode != G_82) && (block->p_number == -1.0)),
NCE_DWELL_TIME_P_WORD_MISSING_WITH_G82);
block->p_number =
block->p_number == -1.0 ? settings->cycle_p : block->p_number;
CYCLE_MACRO(convert_cycle_g82(block, CANON_PLANE_XZ, aa, bb, clear_cc, cc,
block->p_number))
settings->cycle_p = block->p_number;
break;
case G_73:
CHKS(((settings->motion_mode != G_73) && (block->q_number == -1.0)),
NCE_Q_WORD_MISSING_WITH_G73);
block->q_number =
block->q_number == -1.0 ? settings->cycle_q : block->q_number;
CYCLE_MACRO(convert_cycle_g73(block, CANON_PLANE_XZ, aa, bb, r, clear_cc, cc,
block->q_number))
settings->cycle_q = block->q_number;
break;
case G_83:
CHKS(((settings->motion_mode != G_83) && (block->q_number == -1.0)),
NCE_Q_WORD_MISSING_WITH_G83);
block->q_number =
block->q_number == -1.0 ? settings->cycle_q : block->q_number;
CYCLE_MACRO(convert_cycle_g83(block, CANON_PLANE_XZ, aa, bb, r, clear_cc, cc,
block->q_number))
settings->cycle_q = block->q_number;
break;
case G_74:
case G_84:
block->p_number =
block->p_number == -1.0 ? settings->cycle_p : block->p_number;
if (block->dollar_flag){
CHKS((block->dollar_number < 0 || block->dollar_number >= settings->num_spindles),
(_("Invalid E-number in G74/G84 cycle")));
settings->active_spindle = (int)block->dollar_number;
}
CYCLE_MACRO(convert_cycle_g74_g84(block, CANON_PLANE_XZ, aa, bb, clear_cc, cc,
settings->spindle_turning[settings->active_spindle],
settings->speed_feed_mode,
motion, block->p_number, settings->active_spindle))
settings->cycle_p = block->p_number;
break;
case G_85:
CYCLE_MACRO(convert_cycle_g85(block, CANON_PLANE_XZ, aa, bb, r, clear_cc, cc));
break;
case G_86:
CHKS(((settings->motion_mode != G_86) && (block->p_number == -1.0)),
NCE_DWELL_TIME_P_WORD_MISSING_WITH_G86);
block->p_number =
block->p_number == -1.0 ? settings->cycle_p : block->p_number;
CYCLE_MACRO(convert_cycle_g86(block, CANON_PLANE_XZ, aa, bb, clear_cc, cc,
block->p_number,
settings->spindle_turning[settings->active_spindle],
settings->active_spindle));
settings->cycle_p = block->p_number;
break;
case G_87:
if (settings->motion_mode != G_87) {
CHKS((!block->i_flag), NCE_I_WORD_MISSING_WITH_G87);
CHKS((!block->j_flag), NCE_J_WORD_MISSING_WITH_G87);
CHKS((!block->k_flag), NCE_K_WORD_MISSING_WITH_G87);
}
i = block->i_flag ? block->i_number : settings->cycle_i;
j = block->j_flag ? block->j_number : settings->cycle_j;
k = block->k_flag ? block->k_number : settings->cycle_k;
settings->cycle_i = i;
settings->cycle_j = j;
settings->cycle_k = k;
if (settings->distance_mode == MODE_INCREMENTAL) {
j = (cc + j);
}
CYCLE_MACRO(convert_cycle_g87(block, CANON_PLANE_XZ, aa, (aa + k), bb,
(bb + i), r, clear_cc, j, cc,
settings->spindle_turning[settings->active_spindle],
settings->active_spindle));
break;
case G_88:
CHKS(((settings->motion_mode != G_88) && (block->p_number == -1.0)),
NCE_DWELL_TIME_P_WORD_MISSING_WITH_G88);
block->p_number =
block->p_number == -1.0 ? settings->cycle_p : block->p_number;
CYCLE_MACRO(convert_cycle_g88(block, CANON_PLANE_XZ, aa, bb, cc,
block->p_number,
settings->spindle_turning[settings->active_spindle],
settings->active_spindle));
settings->cycle_p = block->p_number;
break;
case G_89:
CHKS(((settings->motion_mode != G_89) && (block->p_number == -1.0)),
NCE_DWELL_TIME_P_WORD_MISSING_WITH_G89);
block->p_number =
block->p_number == -1.0 ? settings->cycle_p : block->p_number;
CYCLE_MACRO(convert_cycle_g89(block, CANON_PLANE_XZ, aa, bb, clear_cc, cc,
block->p_number))
settings->cycle_p = block->p_number;
break;
default:
ERS(NCE_BUG_FUNCTION_SHOULD_NOT_HAVE_BEEN_CALLED);
}
settings->current_z = aa;
settings->current_x = bb;
settings->current_y = clear_cc;
settings->cycle_cc = block->y_number;
if (save_mode != CANON_EXACT_PATH)
SET_MOTION_CONTROL_MODE(save_mode, save_tolerance);
return INTERP_OK;
}
int Interp::convert_cycle_wu(int motion, block_pointer block, setup_pointer settings) {
double aa;
double aa_increment=0.;
double bb;
double bb_increment=0.;
double cc;
double clear_cc;
double i;
double j;
double k;
double old_cc;
double radius_increment = 0.;
double theta_increment = 0.;
CANON_PLANE plane;
double r;
int repeat;
CANON_MOTION_MODE save_mode;
double save_tolerance; double current_cc = settings->v_current;
plane = CANON_PLANE_UW;
if (settings->motion_mode != motion) {
CHKS((!block->v_flag),
_readers[(int)'v']? NCE_V_VALUE_UNSPECIFIED_IN_UW_PLANE_CANNED_CYCLE: _("G18.1 canned cycle is not possible on a machine without V axis"));
}
block->v_number =
block->v_flag ? block->v_number : settings->cycle_cc;
if(settings->cycle_il_flag) {
old_cc = settings->cycle_il;
} else {
old_cc = settings->cycle_il = current_cc;
settings->cycle_il_flag = true;
}
if (settings->distance_mode == MODE_ABSOLUTE) {
aa_increment = 0.0;
bb_increment = 0.0;
r = block->r_number;
cc = block->v_number;
aa = block->w_flag ? block->w_number : settings->w_current;
bb = block->u_flag ? block->u_number : settings->u_current;
} else if (settings->distance_mode == MODE_INCREMENTAL) {
if (block->w_flag) aa_increment = block->w_number;
if (block->u_flag) bb_increment = block->u_number;
r = (block->r_number + old_cc);
cc = (r + block->v_number);
aa = settings->w_current;
bb = settings->u_current;
} else
ERS(NCE_BUG_DISTANCE_MODE_NOT_G90_OR_G91);
CHKS((r < cc), NCE_R_LESS_THAN_V_IN_CYCLE_IN_UW_PLANE);
if (old_cc < r) {
STRAIGHT_TRAVERSE(block->line_number, settings->current_x, settings->current_y, settings->current_z,
settings->AA_current, settings->BB_current, settings->CC_current,
settings->u_current, r, settings->w_current);
old_cc = r;
current_cc = old_cc;
}
clear_cc = (settings->retract_mode == R_PLANE) ? r : old_cc;
save_mode = GET_EXTERNAL_MOTION_CONTROL_MODE();
save_tolerance = GET_EXTERNAL_MOTION_CONTROL_TOLERANCE();
if (save_mode != CANON_EXACT_PATH)
SET_MOTION_CONTROL_MODE(CANON_EXACT_PATH, 0);
switch (motion) {
case G_81:
CYCLE_MACRO(convert_cycle_g81(block, CANON_PLANE_UW, aa, bb, clear_cc, cc))
break;
case G_82:
CHKS(((settings->motion_mode != G_82) && (block->p_number == -1.0)),
NCE_DWELL_TIME_P_WORD_MISSING_WITH_G82);
block->p_number =
block->p_number == -1.0 ? settings->cycle_p : block->p_number;
CYCLE_MACRO(convert_cycle_g82(block, CANON_PLANE_UW, aa, bb, clear_cc, cc,
block->p_number))
settings->cycle_p = block->p_number;
break;
case G_73:
CHKS(((settings->motion_mode != G_73) && (block->q_number == -1.0)),
NCE_Q_WORD_MISSING_WITH_G73);
block->q_number =
block->q_number == -1.0 ? settings->cycle_q : block->q_number;
CYCLE_MACRO(convert_cycle_g73(block, CANON_PLANE_UW, aa, bb, r, clear_cc, cc,
block->q_number))
settings->cycle_q = block->q_number;
break;
case G_83:
CHKS(((settings->motion_mode != G_83) && (block->q_number == -1.0)),
NCE_Q_WORD_MISSING_WITH_G83);
block->q_number =
block->q_number == -1.0 ? settings->cycle_q : block->q_number;
CYCLE_MACRO(convert_cycle_g83(block, CANON_PLANE_UW, aa, bb, r, clear_cc, cc,
block->q_number))
settings->cycle_q = block->q_number;
break;
case G_74:
case G_84:
block->p_number =
block->p_number == -1.0 ? settings->cycle_p : block->p_number;
if (block->dollar_flag){
CHKS((block->dollar_number < 0 || block->dollar_number >= settings->num_spindles),
(_("Invalid spindle ($) number in G74/G84 cycle")));
settings->active_spindle = (int)block->dollar_number;
}
CYCLE_MACRO(convert_cycle_g74_g84(block, CANON_PLANE_UW, aa, bb, clear_cc, cc,
settings->spindle_turning[settings->active_spindle],
settings->speed_feed_mode,
motion, block->p_number, settings->active_spindle))
settings->cycle_p = block->p_number;
break;
case G_85:
CYCLE_MACRO(convert_cycle_g85(block, CANON_PLANE_UW, aa, bb, r, clear_cc, cc))
break;
case G_86:
CHKS(((settings->motion_mode != G_86) && (block->p_number == -1.0)),
NCE_DWELL_TIME_P_WORD_MISSING_WITH_G86);
block->p_number =
block->p_number == -1.0 ? settings->cycle_p : block->p_number;
if (block->dollar_flag){
CHKS((block->dollar_number < 0 || block->dollar_number >= settings->num_spindles),
(_("Invalid spindle ($) number in G74/G84 cycle")));
settings->active_spindle = (int)block->dollar_number;
}
CYCLE_MACRO(convert_cycle_g86(block, CANON_PLANE_UW, aa, bb, clear_cc, cc,
block->p_number,
settings->spindle_turning[settings->active_spindle],
settings->active_spindle));
settings->cycle_p = block->p_number;
break;
case G_87:
if (settings->motion_mode != G_87) {
CHKS((!block->i_flag), NCE_I_WORD_MISSING_WITH_G87);
CHKS((!block->j_flag), NCE_J_WORD_MISSING_WITH_G87);
CHKS((!block->k_flag), NCE_K_WORD_MISSING_WITH_G87);
}
if (block->dollar_flag){
CHKS((block->dollar_number < 0 || block->dollar_number >= settings->num_spindles),
(_("Invalid spindle ($) number in G74/G84 cycle")));
settings->active_spindle = (int)block->dollar_number;
}
i = block->i_flag ? block->i_number : settings->cycle_i;
j = block->j_flag ? block->j_number : settings->cycle_j;
k = block->k_flag ? block->k_number : settings->cycle_k;
settings->cycle_i = i;
settings->cycle_j = j;
settings->cycle_k = k;
if (settings->distance_mode == MODE_INCREMENTAL) {
j = (cc + j);
}
CYCLE_MACRO(convert_cycle_g87(block, CANON_PLANE_UW, aa, (aa + k), bb,
(bb + i), r, clear_cc, j, cc,
settings->spindle_turning[settings->active_spindle],
settings->active_spindle));
break;
case G_88:
CHKS(((settings->motion_mode != G_88) && (block->p_number == -1.0)),
NCE_DWELL_TIME_P_WORD_MISSING_WITH_G88);
block->p_number =
block->p_number == -1.0 ? settings->cycle_p : block->p_number;
if (block->dollar_flag){
CHKS((block->dollar_number < 0 || block->dollar_number >= settings->num_spindles),
(_("Invalid spindle ($) number in G74/G84 cycle")));
settings->active_spindle = (int)block->dollar_number;
}
CYCLE_MACRO(convert_cycle_g88(block, CANON_PLANE_UW, aa, bb, cc,
block->p_number,
settings->spindle_turning[settings->active_spindle],
settings->active_spindle));
settings->cycle_p = block->p_number;
break;
case G_89:
CHKS(((settings->motion_mode != G_89) && (block->p_number == -1.0)),
NCE_DWELL_TIME_P_WORD_MISSING_WITH_G89);
block->p_number =
block->p_number == -1.0 ? settings->cycle_p : block->p_number;
CYCLE_MACRO(convert_cycle_g89(block, CANON_PLANE_UW, aa, bb, clear_cc, cc,
block->p_number))
settings->cycle_p = block->p_number;
break;
default:
ERS(NCE_BUG_FUNCTION_SHOULD_NOT_HAVE_BEEN_CALLED);
}
settings->w_current = aa;
settings->u_current = bb;
settings->v_current = clear_cc;
settings->cycle_cc = block->v_number;
if (save_mode != CANON_EXACT_PATH)
SET_MOTION_CONTROL_MODE(save_mode, save_tolerance);
return INTERP_OK;
}
int Interp::cycle_feed(block_pointer block,
CANON_PLANE plane, double end1, double end2, double end3) {
if (plane == CANON_PLANE_XY)
STRAIGHT_FEED(block->line_number, end1, end2, end3,
_setup.AA_current, _setup.BB_current, _setup.CC_current,
_setup.u_current, _setup.v_current, _setup.w_current);
else if (plane == CANON_PLANE_YZ)
STRAIGHT_FEED(block->line_number, end3, end1, end2,
_setup.AA_current, _setup.BB_current, _setup.CC_current,
_setup.u_current, _setup.v_current, _setup.w_current);
else if (plane == CANON_PLANE_XZ)
STRAIGHT_FEED(block->line_number, end2, end3, end1,
_setup.AA_current, _setup.BB_current, _setup.CC_current,
_setup.u_current, _setup.v_current, _setup.w_current);
else if (plane == CANON_PLANE_UV)
STRAIGHT_FEED(block->line_number, _setup.current_x, _setup.current_y, _setup.current_z,
_setup.AA_current, _setup.BB_current, _setup.CC_current,
end1, end2, end3);
else if (plane == CANON_PLANE_VW)
STRAIGHT_FEED(block->line_number, _setup.current_x, _setup.current_y, _setup.current_z,
_setup.AA_current, _setup.BB_current, _setup.CC_current,
end3, end1, end2);
else STRAIGHT_FEED(block->line_number, _setup.current_x, _setup.current_y, _setup.current_z,
_setup.AA_current, _setup.BB_current, _setup.CC_current,
end2, end3, end1);
return INTERP_OK;
}
int Interp::cycle_traverse(block_pointer block,
CANON_PLANE plane, double end1, double end2, double end3) {
if (plane == CANON_PLANE_XY)
STRAIGHT_TRAVERSE(block->line_number, end1, end2, end3,
_setup.AA_current, _setup.BB_current, _setup.CC_current,
_setup.u_current, _setup.v_current, _setup.w_current);
else if (plane == CANON_PLANE_YZ)
STRAIGHT_TRAVERSE(block->line_number, end3, end1, end2,
_setup.AA_current, _setup.BB_current, _setup.CC_current,
_setup.u_current, _setup.v_current, _setup.w_current);
else if (plane == CANON_PLANE_XZ)
STRAIGHT_TRAVERSE(block->line_number, end2, end3, end1,
_setup.AA_current, _setup.BB_current, _setup.CC_current,
_setup.u_current, _setup.v_current, _setup.w_current);
else if (plane == CANON_PLANE_UV)
STRAIGHT_TRAVERSE(block->line_number, _setup.current_x, _setup.current_y, _setup.current_z,
_setup.AA_current, _setup.BB_current, _setup.CC_current,
end1, end2, end3);
else if (plane == CANON_PLANE_VW)
STRAIGHT_TRAVERSE(block->line_number, _setup.current_x, _setup.current_y, _setup.current_z,
_setup.AA_current, _setup.BB_current, _setup.CC_current,
end3, end1, end2);
else STRAIGHT_TRAVERSE(block->line_number, _setup.current_x, _setup.current_y, _setup.current_z,
_setup.AA_current, _setup.BB_current, _setup.CC_current,
end2, end3, end1);
return INTERP_OK;
}