Пример #1
0
stat_t feedRateOverride_Macro(void)
{
	switch (state)
	{
		case 0: cm_request_feedhold();
				state++; break;
		case 1: cm_request_cycle_start();
				state++; break;
		default:state = 0; macro_func_ptr = _command_dispatch; return (STAT_OK);
	}
	_execute_gcode_block();
	return (STAT_OK);
}
Пример #2
0
stat_t M5_Macro(void)
{

	if(configFlags[MODOMAQUINA] == MODO_PLASMA)
	{
		/* A macro não pode acorrer até que o buffer seja esvaziado, para que ações durante o corte tenham efeito imediato*/
		if (cm_get_runtime_busy() == true ) { return (STAT_EAGAIN);}	// sync to planner move ends
		altura_perfuracao 	= 	configVarPl[PL_CONFIG_ALTURA_PERFURACAO];
		altura_deslocamento	= 	configVarMaq[CFG_MAQUINA_ALT_DESLOCAMENTO];
		altura_corte		= 	configVarPl[PL_CONFIG_ALTURA_CORTE];
		vel_corte			= 	configVarPl[PL_CONFIG_VELOC_CORTE];
		tempo_perfuracao	= 	configVarPl[PL_CONFIG_TEMPO_PERFURACAO];
		tempo_aquecimento	= 	0;
	}
	else
	{
		/* A macro não pode acorrer até que o buffer seja esvaziado, para que ações durante o corte tenham efeito imediato*/
		if (cm_get_runtime_busy() == true  || lstop == true) { return (STAT_EAGAIN);}	// sync to planner move ends
		altura_perfuracao 	= 	configVarOx[OX_CONFIG_ALTURA_PERFURACAO];
		altura_deslocamento	= 	configVarMaq[CFG_MAQUINA_ALT_DESLOCAMENTO];
		altura_corte		= 	configVarOx[OX_CONFIG_ALTURA_CORTE];
		vel_corte			= 	configVarOx[OX_CONFIG_VELOC_CORTE];
		tempo_perfuracao	= 	configVarOx[OX_CONFIG_TEMPO_PERFURACAO];
		tempo_aquecimento	= 	configVarOx[OX_CONFIG_TEMPO_AQUECIMENTO];
	}

	// set initial state for new move
	memset(&gp, 0, sizeof(gp));						// clear all parser values
	memset(&cm.gf, 0, sizeof(GCodeInput_t));		// clear all next-state flags
	memset(&cm.gn, 0, sizeof(GCodeInput_t));		// clear all next-state values
	cm.gn.motion_mode = cm_get_motion_mode(MODEL);	// get motion mode from previous block

	switch (state)
	{
		case 0: SET_NON_MODAL_MACRO (linenum,(uint32_t)linenumMacro);
			    SET_MODAL_MACRO (MODAL_GROUP_M7, spindle_mode, SPINDLE_OFF);
				state++; break;
		case 1: SET_NON_MODAL_MACRO (linenum,(uint32_t)linenumMacro);
				SET_MODAL_MACRO (MODAL_GROUP_G1, motion_mode, MOTION_MODE_STRAIGHT_TRAVERSE);
				SET_NON_MODAL_MACRO(target[AXIS_Z], altura_deslocamento);
				state++; break;
		default:state = 0; macro_func_ptr = _command_dispatch; return (STAT_OK);
	}
	_execute_gcode_block();
	return (STAT_OK);
}
Пример #3
0
stat_t jog_Macro(void)
{
	bool diagonalX = false;
	bool diagonalY = false;
	// set initial state for new move
	memset(&gp, 0, sizeof(gp));						// clear all parser values
	memset(&cm.gf, 0, sizeof(GCodeInput_t));		// clear all next-state flags
	memset(&cm.gn, 0, sizeof(GCodeInput_t));		// clear all next-state values
	cm.gn.motion_mode = cm_get_motion_mode(MODEL);	// get motion mode from previous block

	switch (state)
	{
		case 0: SET_MODAL_MACRO (MODAL_GROUP_G3, distance_mode, INCREMENTAL_MODE);
				state++; break;

		case 1: SET_MODAL_MACRO (MODAL_GROUP_G1, motion_mode, MOTION_MODE_STRAIGHT_FEED);
				if ((JogkeyPressed & KEY_RIGHT ) == KEY_RIGHT || (JogkeyPressed & KEY_LEFT ) == KEY_LEFT)
				{
						SET_NON_MODAL_MACRO(target[AXIS_X], jogMaxDistance[AXIS_X]);
						diagonalX = true;
				}
				if ((JogkeyPressed & KEY_UP ) == KEY_UP || (JogkeyPressed & KEY_DOWN ) == KEY_DOWN)
				{
						SET_NON_MODAL_MACRO(target[AXIS_Y], jogMaxDistance[AXIS_Y]);
						diagonalY = true;
				}
				if ((JogkeyPressed & KEY_Z_DOWN ) == KEY_Z_DOWN || (JogkeyPressed & KEY_Z_UP ) == KEY_Z_UP)
				{
						SET_NON_MODAL_MACRO(target[AXIS_Z], jogMaxDistance[AXIS_Z]);
				}
				if(diagonalX && diagonalY)
				{
					SET_NON_MODAL_MACRO (feed_rate, *velocidadeJog*1.41);
				}
				else
				{
					SET_NON_MODAL_MACRO (feed_rate, *velocidadeJog);
				}
				state++; break;
		default:state = 0; macro_func_ptr = command_idle; return (STAT_OK);
	}
	_execute_gcode_block();
	return (STAT_OK);
}
Пример #4
0
stat_t ZerarPeca_Macro(void)
{
	// set initial state for new move
	memset(&gp, 0, sizeof(gp));						// clear all parser values
	memset(&cm.gf, 0, sizeof(GCodeInput_t));		// clear all next-state flags
	memset(&cm.gn, 0, sizeof(GCodeInput_t));		// clear all next-state values
	cm.gn.motion_mode = cm_get_motion_mode(MODEL);	// get motion mode from previous block
	intepreterRunning = true;
	switch (state)
	{
		case 0: SET_NON_MODAL_MACRO(next_action, NEXT_ACTION_SET_ABSOLUTE_ORIGIN);
				SET_NON_MODAL_MACRO(target[AXIS_X], zeroPiece[AXIS_X]);
				SET_NON_MODAL_MACRO(target[AXIS_Y], zeroPiece[AXIS_Y]);
				SET_NON_MODAL_MACRO(target[AXIS_Z], zeroPiece[AXIS_Z]);
				state++; break;
		default:state = 0; 	intepreterRunning = false; macro_func_ptr = command_idle; return (STAT_OK);
	}
	_execute_gcode_block();
	return (STAT_OK);
}
Пример #5
0
stat_t G10_Macro(void)
{
	// set initial state for new move
	memset(&gp, 0, sizeof(gp));						// clear all parser values
	memset(&cm.gf, 0, sizeof(GCodeInput_t));		// clear all next-state flags
	memset(&cm.gn, 0, sizeof(GCodeInput_t));		// clear all next-state values
	cm.gn.motion_mode = cm_get_motion_mode(MODEL);	// get motion mode from previous block

	switch (state)
	{
		case 0: SET_MODAL_MACRO (MODAL_GROUP_G0, next_action, NEXT_ACTION_SET_COORD_DATA);
				SET_NON_MODAL_MACRO (parameter, 1);
				SET_NON_MODAL_MACRO (target[AXIS_X], mp_get_runtime_absolute_position(AXIS_X));
				SET_NON_MODAL_MACRO (target[AXIS_Y], mp_get_runtime_absolute_position(AXIS_Y));
				SET_NON_MODAL_MACRO (target[AXIS_Z], 0);
				state++; break;

		default:state = 0; macro_func_ptr = _command_dispatch; return (STAT_OK);
	}
	_execute_gcode_block();
	return (STAT_OK);
}
Пример #6
0
stat_t arcoOK_Macro(void)
{
	uint32_t lRet = pdFALSE;
	// set initial state for new move
//	memset(&gp, 0, sizeof(gp));						// clear all parser values
//	memset(&cm.gf, 0, sizeof(GCodeInput_t));		// clear all next-state flags
//	memset(&cm.gn, 0, sizeof(GCodeInput_t));		// clear all next-state values
//	cm.gn.motion_mode = cm_get_motion_mode(MODEL);	// get motion mode from previous block
	if (xMacroArcoOkSync == true)
	{
		switch (state)
		{
			case 0:	pl_arcook_start();
					lRet = xSemaphoreTake( xArcoOkSync, pdMS_TO_TICKS(3000) );
					if (lRet == pdFALSE)
					{
						uint32_t qSend = ARCO_OK_FAILED;
						xQueueSend( qKeyboard, &qSend, 0 );
						macro_func_ptr = command_idle;
						xMacroArcoOkSync = false;
			//			isCuttingSet(true);
						return (STAT_OK);
					}
					else
					{
						cm_request_cycle_start();
						stopDuringCut_Set(false);
						delay_thcStartStop(true);
						xMacroArcoOkSync = false; state = 0; macro_func_ptr = _command_dispatch; return (STAT_OK);
					}
					break;
			default:
					break;
		}
		_execute_gcode_block();
	}
	return (STAT_OK);
}
Пример #7
0
stat_t RunningInicial_Macro(void)
{
	// set initial state for new move
	memset(&gp, 0, sizeof(gp));						// clear all parser values
	memset(&cm.gf, 0, sizeof(GCodeInput_t));		// clear all next-state flags
	memset(&cm.gn, 0, sizeof(GCodeInput_t));		// clear all next-state values
	cm.gn.motion_mode = cm_get_motion_mode(MODEL);	// get motion mode from previous block

	switch (state)
	{
		case 0: SET_MODAL_MACRO (MODAL_GROUP_G6, units_mode, MILLIMETERS);
				state++; break;

		case 1: SET_NON_MODAL_MACRO (absolute_override, true);
				state++; break;

		case 2: SET_MODAL_MACRO (MODAL_GROUP_G3, distance_mode, ABSOLUTE_MODE);
				state++; break;

		default:state = 0; macro_func_ptr = _command_dispatch; return (STAT_OK);
	}
	_execute_gcode_block();
	return (STAT_OK);
}
Пример #8
0
/*
 * _parse_gcode_block() - parses one line of NULL terminated G-Code. 
 *
 *	All the parser does is load the state values in gn (next model state) and set flags
 *	in gf (model state flags). The execute routine applies them. The buffer is assumed to 
 *	contain only uppercase characters and signed floats (no whitespace).
 *
 *	A number of implicit things happen when the gn struct is zeroed:
 *	  - inverse feed rate mode is cancelled - set back to units_per_minute mode
 */
static stat_t _parse_gcode_block(char_t *buf) 
{
	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(&gp, 0, sizeof(gp));		// clear all parser values
	memset(&gf, 0, sizeof(gf));		// clear all next-state flags
	memset(&gn, 0, sizeof(gn));		// clear all next-state values
	gn.motion_mode = cm_get_model_motion_mode();// get motion mode from previous block

  	// extract commands and parameters
	while((status = _get_next_gcode_word(&pstr, &letter, &value)) == STAT_OK) {
		switch(letter) {
			case 'G':
				switch((uint8_t)value) {
					case 0:  SET_MODAL (MODAL_GROUP_G1, motion_mode, MOTION_MODE_STRAIGHT_TRAVERSE);
					case 1:  SET_MODAL (MODAL_GROUP_G1, motion_mode, MOTION_MODE_STRAIGHT_FEED);
					case 2:  SET_MODAL (MODAL_GROUP_G1, motion_mode, MOTION_MODE_CW_ARC);
					case 3:  SET_MODAL (MODAL_GROUP_G1, motion_mode, MOTION_MODE_CCW_ARC);
					case 4:  SET_NON_MODAL (next_action, NEXT_ACTION_DWELL);
					case 10: SET_MODAL (MODAL_GROUP_G0, next_action, NEXT_ACTION_SET_COORD_DATA);
					case 17: SET_MODAL (MODAL_GROUP_G2, select_plane, CANON_PLANE_XY);
					case 18: SET_MODAL (MODAL_GROUP_G2, select_plane, CANON_PLANE_XZ);
					case 19: SET_MODAL (MODAL_GROUP_G2, select_plane, CANON_PLANE_YZ);
					case 20: SET_MODAL (MODAL_GROUP_G6, units_mode, INCHES);
					case 21: SET_MODAL (MODAL_GROUP_G6, units_mode, MILLIMETERS);
					case 28: {
						switch (_point(value)) {
							case 0: SET_MODAL (MODAL_GROUP_G0, next_action, NEXT_ACTION_GOTO_G28_POSITION);
							case 1: SET_MODAL (MODAL_GROUP_G0, next_action, NEXT_ACTION_SET_G28_POSITION); 
							case 2: SET_NON_MODAL (next_action, NEXT_ACTION_SEARCH_HOME); 
							case 3: SET_NON_MODAL (next_action, NEXT_ACTION_SET_ABSOLUTE_ORIGIN);
							default: status = STAT_UNRECOGNIZED_COMMAND;
						}
						break;
					}
					case 30: {
						switch (_point(value)) {
							case 0: SET_MODAL (MODAL_GROUP_G0, next_action, NEXT_ACTION_GOTO_G30_POSITION);
							case 1: SET_MODAL (MODAL_GROUP_G0, next_action, NEXT_ACTION_SET_G30_POSITION); 
							default: status = STAT_UNRECOGNIZED_COMMAND;
						}
						break;
					}
/*					case 38: 
						switch (_point(value)) {
							case 2: SET_NON_MODAL (next_action, NEXT_ACTION_STRAIGHT_PROBE); 
							default: status = STAT_UNRECOGNIZED_COMMAND;
						}
						break;
					}
*/					case 40: break;	// ignore cancel cutter radius compensation
					case 49: break;	// ignore cancel tool length offset comp.
					case 53: SET_NON_MODAL (absolute_override, true);
					case 54: SET_MODAL (MODAL_GROUP_G12, coord_system, G54);
					case 55: SET_MODAL (MODAL_GROUP_G12, coord_system, G55);
					case 56: SET_MODAL (MODAL_GROUP_G12, coord_system, G56);
					case 57: SET_MODAL (MODAL_GROUP_G12, coord_system, G57);
					case 58: SET_MODAL (MODAL_GROUP_G12, coord_system, G58);
					case 59: SET_MODAL (MODAL_GROUP_G12, coord_system, G59);
					case 61: {
						switch (_point(value)) {
							case 0: SET_MODAL (MODAL_GROUP_G13, path_control, PATH_EXACT_PATH);
							case 1: SET_MODAL (MODAL_GROUP_G13, path_control, PATH_EXACT_STOP); 
							default: status = STAT_UNRECOGNIZED_COMMAND;
						}
						break;
					}
					case 64: SET_MODAL (MODAL_GROUP_G13,path_control, PATH_CONTINUOUS);
					case 80: SET_MODAL (MODAL_GROUP_G1, motion_mode,  MOTION_MODE_CANCEL_MOTION_MODE);
					case 90: SET_MODAL (MODAL_GROUP_G3, distance_mode, ABSOLUTE_MODE);
					case 91: SET_MODAL (MODAL_GROUP_G3, distance_mode, INCREMENTAL_MODE);
					case 92: {
						switch (_point(value)) {
							case 0: SET_MODAL (MODAL_GROUP_G0, next_action, NEXT_ACTION_SET_ORIGIN_OFFSETS);
							case 1: SET_NON_MODAL (next_action, NEXT_ACTION_RESET_ORIGIN_OFFSETS);
							case 2: SET_NON_MODAL (next_action, NEXT_ACTION_SUSPEND_ORIGIN_OFFSETS);
							case 3: SET_NON_MODAL (next_action, NEXT_ACTION_RESUME_ORIGIN_OFFSETS); 
							default: status = STAT_UNRECOGNIZED_COMMAND;
						}
						break;
					}
					case 93: SET_MODAL (MODAL_GROUP_G5, inverse_feed_rate_mode, true);
					case 94: SET_MODAL (MODAL_GROUP_G5, inverse_feed_rate_mode, false);
					default: status = STAT_UNRECOGNIZED_COMMAND;
				}
				break;

			case 'M':
				switch((uint8_t)value) {
					case 0: case 1: case 60:
							SET_MODAL (MODAL_GROUP_M4, program_flow, PROGRAM_STOP);
					case 2: case 30:
							SET_MODAL (MODAL_GROUP_M4, program_flow, PROGRAM_END);
					case 3: SET_MODAL (MODAL_GROUP_M7, spindle_mode, SPINDLE_CW);
					case 4: SET_MODAL (MODAL_GROUP_M7, spindle_mode, SPINDLE_CCW);
					case 5: SET_MODAL (MODAL_GROUP_M7, spindle_mode, SPINDLE_OFF);
					case 6: SET_NON_MODAL (change_tool, true);
					case 7: SET_MODAL (MODAL_GROUP_M8, mist_coolant, true);
					case 8: SET_MODAL (MODAL_GROUP_M8, flood_coolant, true);
					case 9: SET_MODAL (MODAL_GROUP_M8, flood_coolant, false);
					case 48: SET_MODAL (MODAL_GROUP_M9, override_enables, true);
					case 49: SET_MODAL (MODAL_GROUP_M9, override_enables, false);
					case 50: SET_MODAL (MODAL_GROUP_M9, feed_rate_override_enable, true); // conditionally true
					case 51: SET_MODAL (MODAL_GROUP_M9, spindle_override_enable, true);	  // conditionally true
					default: status = STAT_UNRECOGNIZED_COMMAND;
				}
				break;

			case 'T': SET_NON_MODAL (tool, (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 '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);
			case 'A': SET_NON_MODAL (target[AXIS_A], value);
			case 'B': SET_NON_MODAL (target[AXIS_B], value);
			case 'C': SET_NON_MODAL (target[AXIS_C], value);
		//	case 'U': SET_NON_MODAL (target[AXIS_U], value);		// reserved
		//	case 'V': SET_NON_MODAL (target[AXIS_V], value);		// reserved
		//	case 'W': SET_NON_MODAL (target[AXIS_W], value);		// reserved
			case 'I': SET_NON_MODAL (arc_offset[0], value);
			case 'J': SET_NON_MODAL (arc_offset[1], value);
			case 'K': SET_NON_MODAL (arc_offset[2], value);
			case 'R': SET_NON_MODAL (arc_radius, value);
			case 'N': SET_NON_MODAL (linenum,(uint32_t)value);		// line number
			case 'L': break;										// not used for anything
			default: status = STAT_UNRECOGNIZED_COMMAND;
		}
		if(status != STAT_OK) break;
	}
	if ((status != STAT_OK) && (status != STAT_COMPLETE)) return (status);
	ritorno(_validate_gcode_block());
	return (_execute_gcode_block());		// if successful execute the block
}
Пример #9
0
stat_t limit_test(void)
{
	if(configFlags[MODOMAQUINA] == MODO_PLASMA)
	{
		altura_perfuracao 	= 	configVarPl[PL_CONFIG_ALTURA_PERFURACAO];
		altura_deslocamento	= 	configVarMaq[CFG_MAQUINA_ALT_DESLOCAMENTO];
		altura_corte		= 	configVarPl[PL_CONFIG_ALTURA_CORTE];
		vel_corte			= 	configVarPl[PL_CONFIG_VELOC_CORTE];
		tempo_perfuracao	= 	configVarPl[PL_CONFIG_TEMPO_PERFURACAO];
		tempo_aquecimento	= 	0;
	}
	else
	{
		altura_perfuracao 	= 	configVarOx[OX_CONFIG_ALTURA_PERFURACAO];
		altura_deslocamento	= 	configVarMaq[CFG_MAQUINA_ALT_DESLOCAMENTO];
		altura_corte		= 	configVarOx[OX_CONFIG_ALTURA_CORTE];
		vel_corte			= 	configVarOx[OX_CONFIG_VELOC_CORTE];
		tempo_perfuracao	= 	configVarOx[OX_CONFIG_TEMPO_PERFURACAO];
		tempo_aquecimento	= 	configVarOx[OX_CONFIG_TEMPO_AQUECIMENTO];
	}

	// set initial state for new move
	memset(&gp, 0, sizeof(gp));						// clear all parser values
	memset(&cm.gf, 0, sizeof(GCodeInput_t));		// clear all next-state flags
	memset(&cm.gn, 0, sizeof(GCodeInput_t));		// clear all next-state values
	cm.gn.motion_mode = cm_get_motion_mode(MODEL);	// get motion mode from previous block

	switch (state)
	{
		case 0: SET_MODAL_MACRO (MODAL_GROUP_G6, units_mode, MILLIMETERS);
				state++; break;

		case 1: SET_MODAL_MACRO (MODAL_GROUP_G3, distance_mode, ABSOLUTE_MODE);
				state++; break;

		case 2: SET_NON_MODAL_MACRO (absolute_override, true);
				state++; break;

//		case 3: SET_MODAL_MACRO (MODAL_GROUP_G1, motion_mode, MOTION_MODE_STRAIGHT_TRAVERSE);
//				SET_NON_MODAL_MACRO(target[AXIS_Z], altura_deslocamento);
//				state++; break;

		case 3: SET_MODAL_MACRO (MODAL_GROUP_G1, motion_mode, MOTION_MODE_STRAIGHT_FEED);
				SET_NON_MODAL_MACRO(target[AXIS_Y], 0);
				SET_NON_MODAL_MACRO (feed_rate, 6000);
				state++; break;

		case 4: SET_MODAL_MACRO (MODAL_GROUP_G1, motion_mode, MOTION_MODE_STRAIGHT_FEED);
				SET_NON_MODAL_MACRO(target[AXIS_X], 0);
				state++; break;

//		case 4: SET_NON_MODAL_MACRO (next_action, NEXT_ACTION_DWELL);
//				SET_NON_MODAL_MACRO (parameter, 1000);
//				state++; break;

		case 5: SET_MODAL_MACRO (MODAL_GROUP_G1, motion_mode, MOTION_MODE_STRAIGHT_FEED);
				SET_NON_MODAL_MACRO(target[AXIS_Y], Ycord);
				state++; break;

//		case 6: SET_NON_MODAL_MACRO (next_action, NEXT_ACTION_DWELL);
//				SET_NON_MODAL_MACRO (parameter, 1000);
//				state++; break;

		case 6: SET_MODAL_MACRO (MODAL_GROUP_G1, motion_mode, MOTION_MODE_STRAIGHT_FEED);
				SET_NON_MODAL_MACRO(target[AXIS_X], Xcord);
				state++; break;

//		case 8: SET_NON_MODAL_MACRO (next_action, NEXT_ACTION_DWELL);
//				SET_NON_MODAL_MACRO (parameter, 1000);
//				state++; break;

		case 7: SET_MODAL_MACRO (MODAL_GROUP_G1, motion_mode, MOTION_MODE_STRAIGHT_FEED);
				SET_NON_MODAL_MACRO(target[AXIS_Y], 0);
				state++; break;

//		case 10: SET_NON_MODAL_MACRO (next_action, NEXT_ACTION_DWELL);
//				SET_NON_MODAL_MACRO (parameter, 1000);
//				state++; break;

		case 8: SET_MODAL_MACRO (MODAL_GROUP_G1, motion_mode, MOTION_MODE_STRAIGHT_FEED);
				SET_NON_MODAL_MACRO(target[AXIS_X], 0);
				state++; break;

//		case 12: SET_NON_MODAL_MACRO (next_action, NEXT_ACTION_DWELL);
//				SET_NON_MODAL_MACRO (parameter, 1000);
//				state++; break;

		case 9: SET_MODAL_MACRO (MODAL_GROUP_M4, program_flow, PROGRAM_END);
				state++; break;

		default:state = 0;  macro_func_ptr = _command_dispatch; return (STAT_OK);
	}
	_execute_gcode_block();
	return (STAT_OK);
}
Пример #10
0
stat_t M3_Macro(void)
{
	float tempo;
	/* A macro não pode acorrer até que o buffer seja esvaziado, para que ações durante o corte tenham efeito imediato*/
	if (cm_get_runtime_busy() == true) { return (STAT_EAGAIN);}	// sync to planner move ends

	macro_buffer = M3_Macro;
	// set initial state for new move
	memset(&gp, 0, sizeof(gp));						// clear all parser values
	memset(&cm.gf, 0, sizeof(GCodeInput_t));		// clear all next-state flags
	memset(&cm.gn, 0, sizeof(GCodeInput_t));		// clear all next-state values
	cm.gn.motion_mode = cm_get_motion_mode(MODEL);	// get motion mode from previous block
	/* A macro não pode acorrer até que o buffer seja esvaziado, para que ações durante o corte tenham efeito imediato*/
	if (cm_get_runtime_busy() == true) { return (STAT_EAGAIN);}	// sync to planner move ends
	if(configFlags[MODOMAQUINA] == MODO_PLASMA)
	{
		altura_perfuracao 	= 	configVarPl[PL_CONFIG_ALTURA_PERFURACAO];
		altura_deslocamento	= 	configVarMaq[CFG_MAQUINA_ALT_DESLOCAMENTO];
		altura_corte		= 	configVarPl[PL_CONFIG_ALTURA_CORTE];
		vel_corte			= 	configVarPl[PL_CONFIG_VELOC_CORTE];
		tempo_perfuracao	= 	configVarPl[PL_CONFIG_TEMPO_PERFURACAO];
		tempo_aquecimento	= 	0;
		switch (state)
		{
				/*   1- Procura chapa. G38.2 -50 COM FEEDRATE DE 800MM/MIN  */
			case 0: SET_NON_MODAL_MACRO (linenum,(uint32_t)linenumMacro);
					SET_NON_MODAL_MACRO (next_action, NEXT_ACTION_STRAIGHT_PROBE);
					SET_NON_MODAL_MACRO(target[AXIS_Z], -50);
					SET_NON_MODAL_MACRO (feed_rate, 800);
					state++; break;

				/*  2- Zera o eixo Z com G28.3 Z0*/
			case 1: SET_NON_MODAL_MACRO (linenum,(uint32_t)linenumMacro);
					SET_NON_MODAL_MACRO(next_action, NEXT_ACTION_SET_ABSOLUTE_ORIGIN);
					SET_NON_MODAL_MACRO(target[AXIS_Z], 0);
					state++; break;

					/* 3- Posiciona o eixo Z para "ALTURA DE PERFURAÇÃO" */
			case 2: SET_NON_MODAL_MACRO (linenum,(uint32_t)linenumMacro);
					SET_MODAL_MACRO (MODAL_GROUP_G1, motion_mode, MOTION_MODE_STRAIGHT_TRAVERSE);
					SET_NON_MODAL_MACRO(target[AXIS_Z], altura_perfuracao);
					state++; break;

					/* 4- CHECA SE O ESTÁ EM MODO SIMULAÇÃO, SE SIM, PULAR PARA PASSO 8. SE ESTIVER EM MODO OXICORTE, CONTINUA.
					   4 -Dispara a tocha */
			case 3:	SET_NON_MODAL_MACRO (linenum,(uint32_t)linenumMacro);
					SET_MODAL_MACRO (MODAL_GROUP_M7, spindle_mode, SPINDLE_CW);
					state++;
					break;

					/*  5 -Espera o arco OK */
			case 4: if(!sim)
					{
						uint32_t lRet = pdFALSE;
						pl_arcook_start();
						lRet = xSemaphoreTake( xArcoOkSync, pdMS_TO_TICKS(3000) );
						if (lRet == pdFALSE)
						{
							uint32_t qSend = ARCO_OK_FAILED;
							xQueueSend( qKeyboard, &qSend, 0 );
							macro_func_ptr = command_idle;
							return (STAT_OK);
						}
						else
						{
				//			isCuttingSet(true);
						}
					}
					state++; break;

					/*6- Dwell do "TEMPO DE PERFURAÇÃO" */
			case 5:	if (tempo_perfuracao > 0){
						SET_NON_MODAL_MACRO (linenum,(uint32_t)linenumMacro);
						SET_NON_MODAL_MACRO (next_action, NEXT_ACTION_DWELL);
						SET_NON_MODAL_MACRO (parameter, tempo_perfuracao*1000);
					}
					else
					{
						delay_thcStartStop(true);
					}
					state++; break;


					/*7- Desce para a "ALTURA DE CORTE" com feedrate de 800*/
			case 6: SET_NON_MODAL_MACRO (linenum,(uint32_t)linenumMacro);
					SET_MODAL_MACRO (MODAL_GROUP_G1, motion_mode, MOTION_MODE_STRAIGHT_FEED);
					SET_NON_MODAL_MACRO(target[AXIS_Z], altura_corte);
					SET_NON_MODAL_MACRO (feed_rate, 800);
					state++; break;

					/*8- Seta o sistema com o feedrate de corte "VELOC. DE CORTE" */
			case 7: SET_NON_MODAL_MACRO (linenum,(uint32_t)linenumMacro);
					SET_NON_MODAL_MACRO (feed_rate, vel_corte);
					state++; break;

			default: state = 0; macro_func_ptr = _command_dispatch; return (STAT_OK);
		}
	}
	else
	{
		altura_perfuracao 	= 	configVarOx[OX_CONFIG_ALTURA_PERFURACAO];
		altura_deslocamento	= 	configVarMaq[CFG_MAQUINA_ALT_DESLOCAMENTO];
		altura_corte		= 	configVarOx[OX_CONFIG_ALTURA_CORTE];
		vel_corte			= 	configVarOx[OX_CONFIG_VELOC_CORTE];
		tempo_perfuracao	= 	configVarOx[OX_CONFIG_TEMPO_PERFURACAO];
		tempo_aquecimento	= 	configVarOx[OX_CONFIG_TEMPO_AQUECIMENTO];
		switch (state)
		{
					/* 1- Posiciona o eixo Z para "ALTURA DE AQUECIMENTO = ALTURA DE CORTE" */
			case 0: SET_NON_MODAL_MACRO (linenum,(uint32_t)linenumMacro);
					SET_MODAL_MACRO (MODAL_GROUP_G1, motion_mode, MOTION_MODE_STRAIGHT_TRAVERSE);
					SET_NON_MODAL_MACRO(target[AXIS_Z], altura_corte);
					state++; break;

					/*2- Dwell do "TEMPO DE AQUECIMENTO". Pula se estiver em simulação */
			case 1: if(!sim)
					{
						tempo = tempo_aquecimento;
					}
					else
					{
						tempo = 0;
					}

				    if (tempo > 0){
						SET_NON_MODAL_MACRO (linenum,(uint32_t)linenumMacro);
						SET_NON_MODAL_MACRO (next_action, NEXT_ACTION_DWELL);
						SET_NON_MODAL_MACRO (parameter, tempo*1000);
					}
					else
					{
						delay_thcStartStop(true);
					}
					state++; break;

					/*3- Sobe para "ALTURA DE PERFURAÇÃO" */
			case 2:	SET_NON_MODAL_MACRO (linenum,(uint32_t)linenumMacro);
					SET_MODAL_MACRO (MODAL_GROUP_G1, motion_mode, MOTION_MODE_STRAIGHT_TRAVERSE);
					SET_NON_MODAL_MACRO(target[AXIS_Z], altura_perfuracao);
					state++; break;

					/*4- Liga a tocha */
			case 3: if(configFlags[MODOMAQUINA] == MODO_OXICORTE){
						SET_NON_MODAL_MACRO (linenum,(uint32_t)linenumMacro);
						SET_MODAL_MACRO (MODAL_GROUP_M7, spindle_mode, SPINDLE_CW);
					}
					state++;
					break;

					/*5- Dwell do "TEMPO DE PERFURAÇÃO" */
			case 4: if(configFlags[MODOMAQUINA] == MODO_OXICORTE){
						if(tempo_perfuracao > 0){
							SET_NON_MODAL_MACRO (linenum,(uint32_t)linenumMacro);
							SET_NON_MODAL_MACRO (next_action, NEXT_ACTION_DWELL);
							SET_NON_MODAL_MACRO (parameter, tempo_perfuracao*1000);
						}
						else
						{
							delay_thcStartStop(true);
						}
					}
					state++; break;

					/*6- Desce para a "ALTURA DE CORTE" com feedrate de 800*/
			case 5: SET_NON_MODAL_MACRO (linenum,(uint32_t)linenumMacro);
					SET_MODAL_MACRO (MODAL_GROUP_G1, motion_mode, MOTION_MODE_STRAIGHT_FEED);
					SET_NON_MODAL_MACRO(target[AXIS_Z], altura_corte);
					SET_NON_MODAL_MACRO (feed_rate, 800);
					state++; break;

					/*7- Seta o sistema com o feedrate de corte "VELOC. DE CORTE" */
			case 6: SET_NON_MODAL_MACRO (linenum,(uint32_t)linenumMacro);
					SET_NON_MODAL_MACRO (feed_rate, vel_corte);
					state++; break;

			default: state = 0; macro_func_ptr = _command_dispatch; return (STAT_OK);
		}
	}
	_execute_gcode_block();
	return (STAT_OK);
}