From ee1193bc782c7f8caec4e4e78e2742bb98453326 Mon Sep 17 00:00:00 2001
From: Daniel Rogge <drogge@tormach.com>
Date: Mon, 11 Jun 2012 14:24:00 -0500
Subject: [PATCH 3/3] Add LATHE_TOOLCHANGE feature to RS274NGC Features mask.  This allows 
the FANUC Txxxx command to be used instead of M6 G43.  The first two digits of Txxxx are 
the tool number and geometry offset, the last two are the wear offset number.  As a 
temporary kludge, I'm pulling the wear offset from the U and W offset fields in the 
tool table.  To do this properly we would want separate fields for X and Z wear offsets 
in the tool table.

---
 src/emc/rs274ngc/interp_convert.cc  |   23 ++++++++++++++++++++++-
 src/emc/rs274ngc/interp_find.cc     |    5 +++++
 src/emc/rs274ngc/interp_internal.hh |    1 +
 3 files changed, 28 insertions(+), 1 deletions(-)

diff --git a/src/emc/rs274ngc/interp_convert.cc b/src/emc/rs274ngc/interp_convert.cc
index 63d1c77..d5bfe24 100644
--- a/src/emc/rs274ngc/interp_convert.cc
+++ b/src/emc/rs274ngc/interp_convert.cc
@@ -5096,6 +5096,7 @@ int Interp::convert_tool_length_offset(int g_code,       //!< g_code being execu
                                       setup_pointer settings)   //!< pointer to machine settings                 
 {
   int index;
+  int wear_offset_index;
   EmcPose tool_offset;
   ZERO_EMC_POSE(tool_offset);
 
@@ -5127,6 +5128,22 @@ int Interp::convert_tool_length_offset(int g_code,       //!< g_code being execu
     tool_offset.u = USER_TO_PROGRAM_LEN(settings->tool_table[index].offset.u);
     tool_offset.v = USER_TO_PROGRAM_LEN(settings->tool_table[index].offset.v);
     tool_offset.w = USER_TO_PROGRAM_LEN(settings->tool_table[index].offset.w);
+    if (FEATURE(LATHE_TOOLCHANGE)) {
+		if (block->t_number > 99) {
+			index = floor(block->t_number/100);		// geometery offset is first two digits
+			wear_offset_index = block->t_number % 100;	// wear offset is second two digits
+		} else {
+			index = block->t_number;
+		}	
+		tool_offset.tran.x = USER_TO_PROGRAM_LEN(settings->tool_table[index].offset.tran.x);
+		tool_offset.tran.z = USER_TO_PROGRAM_LEN(settings->tool_table[index].offset.tran.z);
+		if (block->t_number > 99) {
+			// temporary kludge uses u/w for x/z wear offsets
+			// need real fields in tool.tbl file for these
+			tool_offset.tran.x += USER_TO_PROGRAM_LEN(settings->tool_table[wear_offset_index].offset.u);
+			tool_offset.tran.z += USER_TO_PROGRAM_LEN(settings->tool_table[wear_offset_index].offset.w);
+		}
+	 }   
   } else if (g_code == G_43_1) {
     tool_offset = settings->tool_offset;
     index = -1;
@@ -5139,7 +5156,7 @@ int Interp::convert_tool_length_offset(int g_code,       //!< g_code being execu
     if(block->u_flag) tool_offset.u = block->u_number;
     if(block->v_flag) tool_offset.v = block->v_number;
     if(block->w_flag) tool_offset.w = block->w_number;
-  } else {
+	} else {
     ERS("BUG: Code not G43, G43.1, or G49");
   }
   USE_TOOL_LENGTH_OFFSET(tool_offset);
@@ -5201,6 +5218,10 @@ int Interp::convert_tool_select(block_pointer block,     //!< pointer to a block
   SELECT_POCKET(pocket, block->t_number);
   settings->selected_pocket = pocket;
   settings->selected_tool = block->t_number;
+  if (FEATURE(LATHE_TOOLCHANGE)) {
+	CHP(convert_tool_change(settings));
+	CHP(convert_tool_length_offset(G_43, block, settings));
+	} 
   return INTERP_OK;
 }
 
diff --git a/src/emc/rs274ngc/interp_find.cc b/src/emc/rs274ngc/interp_find.cc
index a28d099..3b78036 100644
--- a/src/emc/rs274ngc/interp_find.cc
+++ b/src/emc/rs274ngc/interp_find.cc
@@ -707,6 +707,11 @@ double Interp::find_turn(double x1,      //!< X-coordinate of start point
 
 int Interp::find_tool_pocket(setup_pointer settings, int toolno, int *pocket)
 {
+    if (FEATURE(LATHE_TOOLCHANGE)) {
+		if (toolno > 99) {
+			toolno = floor(toolno / 100);
+		}
+	}
     if(!settings->random_toolchanger && toolno == 0) {
         *pocket = 0;
         return INTERP_OK;
diff --git a/src/emc/rs274ngc/interp_internal.hh b/src/emc/rs274ngc/interp_internal.hh
index 66a8924..b0b0e19 100644
--- a/src/emc/rs274ngc/interp_internal.hh
+++ b/src/emc/rs274ngc/interp_internal.hh
@@ -723,6 +723,7 @@ typedef struct setup_struct
     // do not lowercase named params inside comments - for #<_hal[PinName]>
 #define FEATURE_NO_DOWNCASE_OWORD    0x00000010
 #define FEATURE_OWORD_WARNONLY       0x00000020
+#define FEATURE_LATHE_TOOLCHANGE     0x00000040
 
     boost::python::object pythis;  // boost::cref to 'this'
     const char *on_abort_command;
-- 
1.7.0.4

