From: Dewey G. <gi...@gi...> - 2009-11-29 02:01:04
|
readonly_toolparameters http://git.linuxcnc.org/?p=emc2.git;a=commitdiff;h=41b93a6 --- src/emc/rs274ngc/interp_array.cc | 18 ++++++ src/emc/rs274ngc/interp_convert.cc | 45 ++++++++++++++- src/emc/rs274ngc/interp_internal.hh | 2 +- src/emc/rs274ngc/interp_read.cc | 12 ++++ src/emc/rs274ngc/rs274ngc_interp.hh | 7 ++ src/emc/rs274ngc/rs274ngc_pre.cc | 108 ++++++++++++++++++++++++++++++++++- src/emc/rs274ngc/rs274ngc_return.hh | 2 + 7 files changed, 187 insertions(+), 7 deletions(-) diff --git a/src/emc/rs274ngc/interp_array.cc b/src/emc/rs274ngc/interp_array.cc index 0f9a6c1..316547b 100644 --- a/src/emc/rs274ngc/interp_array.cc +++ b/src/emc/rs274ngc/interp_array.cc @@ -227,6 +227,24 @@ const int Interp::_required_parameters[] = { RS274NGC_MAX_PARAMETERS }; +const int Interp::_readonly_parameters[] = { + 5400, // tool toolno + 5401, // tool x offset + 5402, // tool y offset + 5403, // tool z offset + 5404, // tool a offset + 5405, // tool b offset + 5406, // tool c offset + 5407, // tool u offset + 5408, // tool v offset + 5409, // tool w offset + 5410, // tool diameter + 5411, // tool frontangle + 5412, // tool backangle + 5413, // tool orientation +}; +const int Interp::_n_readonly_parameters = sizeof(_readonly_parameters)/sizeof(int); + /* _readers is an array of pointers to functions that read. It is used by read_one_item. diff --git a/src/emc/rs274ngc/interp_convert.cc b/src/emc/rs274ngc/interp_convert.cc index 10918d8..34cbc5b 100644 --- a/src/emc/rs274ngc/interp_convert.cc +++ b/src/emc/rs274ngc/interp_convert.cc @@ -3113,7 +3113,7 @@ int Interp::convert_setup_tool(block_pointer block, setup_pointer settings) { settings->tool_table[pocket].diameter, settings->tool_table[pocket].frontangle, settings->tool_table[pocket].backangle, - settings->tool_table[pocket].orientation); + (int)settings->tool_table[pocket].orientation); else SET_TOOL_TABLE_ENTRY(pocket, settings->tool_table[pocket].toolno, @@ -3121,7 +3121,45 @@ int Interp::convert_setup_tool(block_pointer block, setup_pointer settings) { settings->tool_table[pocket].diameter); if(settings->current_pocket == pocket) { - settings->tool_table[0] = settings->tool_table[pocket]; + settings->tool_table[0] = settings->tool_table[pocket]; + } + + if (settings->tool_table[0].toolno < 0) { + settings->parameters[5400] = 0; // -1 ==> notool + } else { + settings->parameters[5400] = settings->tool_table[0].toolno; + } + settings->parameters[5401] = settings->tool_table[0].xoffset; + if(!GET_EXTERNAL_TLO_IS_ALONG_W()) { + settings->parameters[5403] = settings->tool_table[0].zoffset; + settings->parameters[5409] = 0; + } else { + settings->parameters[5403] = 0; + settings->parameters[5409] = settings->tool_table[0].zoffset; + } + settings->parameters[5410] = settings->tool_table[0].diameter; + settings->parameters[5411] = settings->tool_table[0].frontangle; + settings->parameters[5412] = settings->tool_table[0].backangle; + settings->parameters[5413] = settings->tool_table[0].orientation; + + //persuade axis-gui to update parameters widget for current tool: + if ( !_setup.random_toolchanger + && toolno == settings->current_pocket) { + if(settings->tool_table[pocket].orientation) { + SET_TOOL_TABLE_ENTRY(0, + settings->tool_table[pocket].toolno, + settings->tool_table[pocket].zoffset, + settings->tool_table[pocket].xoffset, + settings->tool_table[pocket].diameter, + settings->tool_table[pocket].frontangle, + settings->tool_table[pocket].backangle, + (int)settings->tool_table[pocket].orientation); + } else { + SET_TOOL_TABLE_ENTRY(0, + settings->tool_table[pocket].toolno, + settings->tool_table[pocket].zoffset, + settings->tool_table[pocket].diameter); + } } return INTERP_OK; @@ -4430,10 +4468,11 @@ int Interp::convert_tool_change(setup_pointer settings) //!< pointer to machine } CHANGE_TOOL(settings->selected_pocket); - + settings->current_pocket = settings->selected_pocket; // tool change can move the controlled point. reread it: settings->toolchange_flag = ON; + set_tool_parameters(); return INTERP_OK; } diff --git a/src/emc/rs274ngc/interp_internal.hh b/src/emc/rs274ngc/interp_internal.hh index b495bf6..ec84234 100644 --- a/src/emc/rs274ngc/interp_internal.hh +++ b/src/emc/rs274ngc/interp_internal.hh @@ -210,7 +210,7 @@ enum SPINDLE_MODE { CONSTANT_RPM, CONSTANT_SURFACE }; #define RS274NGC_PARAMETER_FILE_BACKUP_SUFFIX ".bak" // number of parameters in parameter table -#define RS274NGC_MAX_PARAMETERS 5400 +#define RS274NGC_MAX_PARAMETERS 5414 // Subroutine parameters #define INTERP_SUB_PARAMS 30 diff --git a/src/emc/rs274ngc/interp_read.cc b/src/emc/rs274ngc/interp_read.cc index c75f518..eac2616 100644 --- a/src/emc/rs274ngc/interp_read.cc +++ b/src/emc/rs274ngc/interp_read.cc @@ -2090,11 +2090,13 @@ int Interp::read_parameter( CHP(read_integer_value(line, counter, &index, parameters)); CHKS(((index < 1) || (index >= RS274NGC_MAX_PARAMETERS)), NCE_PARAMETER_NUMBER_OUT_OF_RANGE); + CHKS(isreadonly(index),NCE_PARAMETER_NUMBER_READONLY); *double_ptr = parameters[index]; } return INTERP_OK; } + int Interp::free_named_parameters( // ARGUMENTS int level, // level to free setup_pointer settings) // pointer to machine settings @@ -2227,6 +2229,7 @@ int Interp::read_parameter_setting( CHP(read_integer_value(line, counter, &index, parameters)); CHKS(((index < 1) || (index >= RS274NGC_MAX_PARAMETERS)), NCE_PARAMETER_NUMBER_OUT_OF_RANGE); + CHKS((isreadonly(index)), NCE_PARAMETER_NUMBER_READONLY); CHKS((line[*counter] != '='), NCE_EQUAL_SIGN_MISSING_IN_PARAMETER_SETTING); *counter = (*counter + 1); @@ -3457,3 +3460,12 @@ int Interp::read_z(char *line, //!< string: line of RS274 code being processed block->z_number = value; return INTERP_OK; } + +bool Interp::isreadonly(int index) +{ + int i; + for (i=0; i< _n_readonly_parameters; i++) { + if (_readonly_parameters[i] == index) return 1; + } + return 0; +} diff --git a/src/emc/rs274ngc/rs274ngc_interp.hh b/src/emc/rs274ngc/rs274ngc_interp.hh index 3d9a98d..581d8b8 100644 --- a/src/emc/rs274ngc/rs274ngc_interp.hh +++ b/src/emc/rs274ngc/rs274ngc_interp.hh @@ -103,6 +103,10 @@ public: char *file(char *buf, int len) { file_name(buf, len); return buf; } + int init_tool_parameters(); + int default_tool_parameters(); + int set_tool_parameters(); + private: /* Function prototypes for all functions */ @@ -403,6 +407,7 @@ private: int write_m_codes(block_pointer block, setup_pointer settings); int write_settings(setup_pointer settings); int unwrap_rotary(double *, double, double, double, char); + bool isreadonly(int index); // O_word stuff @@ -437,6 +442,8 @@ private: static const int _gees[]; static const int _ems[]; static const int _required_parameters[]; + static const int _readonly_parameters[]; + static const int _n_readonly_parameters; read_function_pointer _readers[256]; static const read_function_pointer default_readers[256]; diff --git a/src/emc/rs274ngc/rs274ngc_pre.cc b/src/emc/rs274ngc/rs274ngc_pre.cc index 1edab10..24cfbde 100644 --- a/src/emc/rs274ngc/rs274ngc_pre.cc +++ b/src/emc/rs274ngc/rs274ngc_pre.cc @@ -261,7 +261,7 @@ int Interp::execute(const char *command) for (n = 0; n < _setup.parameter_occurrence; n++) { // copy parameter settings from parameter buffer into parameter table _setup.parameters[_setup.parameter_numbers[n]] - = _setup.parameter_values[n]; + = _setup.parameter_values[n]; } logDebug("_setup.named_parameter_occurrence = %d", @@ -592,7 +592,7 @@ int Interp::init() write_m_codes((block_pointer) NULL, &_setup); write_settings(&_setup); - + init_tool_parameters(); // Synch rest of settings to external world return INTERP_OK; } @@ -638,7 +638,6 @@ int Interp::load_tool_table() _setup.tool_table[n].frontangle = 0; _setup.tool_table[n].backangle = 0; } - return INTERP_OK; } @@ -1472,3 +1471,106 @@ int Interp::ini_load(const char *filename) return 0; } + +int Interp::init_tool_parameters() +{ + if (_setup.random_toolchanger) { + // random_toolchanger: tool at startup expected + _setup.parameters[5400] = _setup.tool_table[0].toolno; + _setup.parameters[5401] = _setup.tool_table[0].xoffset; + _setup.parameters[5402] = 0; // y offset RESERVED + if(!GET_EXTERNAL_TLO_IS_ALONG_W()) { + _setup.parameters[5403] = _setup.tool_table[0].zoffset; + } else { + _setup.parameters[5403] = 0.0; + } + _setup.parameters[5404] = 0; // a offset RESERVED + _setup.parameters[5405] = 0; // b offset RESERVED + _setup.parameters[5406] = 0; // c offset RESERVED + _setup.parameters[5407] = 0; // u offset RESERVED + _setup.parameters[5408] = 0; // v offset RESERVED + if(!GET_EXTERNAL_TLO_IS_ALONG_W()) { + _setup.parameters[5409] = 0; // w offset + } else { + _setup.parameters[5409] = _setup.tool_table[0].zoffset; + } + _setup.parameters[5410] = _setup.tool_table[0].diameter; + _setup.parameters[5411] = _setup.tool_table[0].frontangle; + _setup.parameters[5412] = _setup.tool_table[0].backangle; + _setup.parameters[5413] = _setup.tool_table[0].orientation; + } else { + // non random_toolchanger: no tool at startup + default_tool_parameters(); + } + return 0; +} + +int Interp::default_tool_parameters() +{ + _setup.parameters[5400] = 0; // toolno + _setup.parameters[5401] = 0; // x offset + _setup.parameters[5402] = 0; // y offset RESERVED + _setup.parameters[5403] = 0; // z offset + _setup.parameters[5404] = 0; // a offset RESERVED + _setup.parameters[5405] = 0; // b offset RESERVED + _setup.parameters[5406] = 0; // c offset RESERVED + _setup.parameters[5407] = 0; // u offset RESERVED + _setup.parameters[5408] = 0; // v offset RESERVED + _setup.parameters[5409] = 0; // w offset RESERVED + _setup.parameters[5410] = 0; // diameter + _setup.parameters[5411] = 0; // frontangle + _setup.parameters[5412] = 0; // backangle + _setup.parameters[5413] = 0; // orientation + return 0; +} + +int Interp::set_tool_parameters() +{ + // invoke for CHANGE_TOOL_NUMBER() to set tool parameters for current tool + // when a tool is removed, set default (zero offset) tool parameters + int toolno = _setup.tool_table[_setup.current_pocket].toolno; + int pocket; + + if ( toolno <= 0 + || (! _setup.random_toolchanger && _setup.current_pocket ==0) ) { + default_tool_parameters(); + return 0; + } + + find_tool_pocket(&_setup,toolno,&pocket); + if (pocket < 0) { + fprintf(stderr,"set_tool_parameters: no such tool:%d\n",toolno); + return 0; + } + if (toolno != _setup.tool_table[pocket].toolno) { + fprintf(stderr,"set_tool_parameters: toolno=%d disagrees %d\n" + ,toolno, _setup.tool_table[pocket].toolno); //not seen + } + + // RESERVED items are for possible future implementation + _setup.parameters[5400] = _setup.tool_table[pocket].toolno; + _setup.parameters[5401] = _setup.tool_table[pocket].xoffset; + _setup.parameters[5402] = 0; // y offset RESERVED + if(!GET_EXTERNAL_TLO_IS_ALONG_W()) { + _setup.parameters[5403] = _setup.tool_table[pocket].zoffset; + } else { + _setup.parameters[5403] = 0.0; + } + _setup.parameters[5404] = 0; // a offset RESERVED + _setup.parameters[5405] = 0; // b offset RESERVED + _setup.parameters[5406] = 0; // c offset RESERVED + _setup.parameters[5407] = 0; // u offset RESERVED + _setup.parameters[5408] = 0; // v offset RESERVED + if(!GET_EXTERNAL_TLO_IS_ALONG_W()) { + _setup.parameters[5409] = 0.0; // w offset + } else { + _setup.parameters[5409] = _setup.tool_table[pocket].zoffset; + } + _setup.parameters[5410] = _setup.tool_table[pocket].diameter; + _setup.parameters[5411] = _setup.tool_table[pocket].frontangle; + _setup.parameters[5412] = _setup.tool_table[pocket].backangle; + _setup.parameters[5413] = _setup.tool_table[pocket].orientation; + + + return 0; +} diff --git a/src/emc/rs274ngc/rs274ngc_return.hh b/src/emc/rs274ngc/rs274ngc_return.hh index fbf017f..678a074 100644 --- a/src/emc/rs274ngc/rs274ngc_return.hh +++ b/src/emc/rs274ngc/rs274ngc_return.hh @@ -137,6 +137,8 @@ #define NCE_P_VALUE_OUT_OF_RANGE_WITH_G10_L2 _("P value out of range with g10 l2") #define NCE_PARAMETER_FILE_OUT_OF_ORDER _("Parameter file out of order") #define NCE_PARAMETER_NUMBER_OUT_OF_RANGE _("Parameter number out of range") +#define NCE_PARAMETER_NUMBER_READONLY _("Parameter number is readonly") +#define NCE_TOOL_PARAMETER_NOTOOL _("Writing tool parameter not allowed if no tool") #define NCE_Q_WORD_MISSING_WITH_G83 _("Q word missing with g83") #define NCE_Q_WORD_WITH_NO_G83_OR_M66 _("Q word with no g83 or m66") #define NCE_QUEUE_IS_NOT_EMPTY_AFTER_PROBING _("Queue is not empty after probing") |