diff --git a/gcode_process.c b/gcode_process.c index ee03659..91078ae 100644 --- a/gcode_process.c +++ b/gcode_process.c @@ -105,7 +105,7 @@ void process_gcode_command() { // The GCode documentation was taken from http://reprap.org/wiki/Gcode . if (next_target.seen_T) { - //? ==== T: Select Tool ==== + //? --- T: Select Tool --- //? //? Example: T1 //? @@ -127,28 +127,26 @@ void process_gcode_command() { if (next_target.seen_G) { uint8_t axisSelected = 0; switch (next_target.G) { - // G0 - rapid, unsynchronised motion - // since it would be a major hassle to force the dda to not synchronise, just provide a fast feedrate and hope it's close enough to what host expects case 0: - //? ==== G0: Rapid move ==== + //? G0: Rapid Linear Motion //? //? Example: G0 X12 //? //? In this case move rapidly to X = 12 mm. In fact, the RepRap firmware uses exactly the same code for rapid as it uses for controlled moves (see G1 below), as - for the RepRap machine - this is just as efficient as not doing so. (The distinction comes from some old machine tools that used to move faster if the axes were not driven in a straight line. For them G0 allowed any movement in space to get to the destination as fast as possible.) - + //? backup_f = next_target.target.F; next_target.target.F = MAXIMUM_FEEDRATE_X * 2L; enqueue(&next_target.target); next_target.target.F = backup_f; break; - // G1 - synchronised motion case 1: - //? ==== G1: Controlled move ==== + //? --- G1: Linear Motion at Feed Rate --- //? //? Example: G1 X90.6 Y13.8 E22.4 //? //? Go in a straight line from the current (X, Y) point to the point (90.6, 13.8), extruding material as the move happens from the current extruded length to a length of 22.4 mm. + //? enqueue(&next_target.target); break; @@ -158,16 +156,13 @@ void process_gcode_command() { // G3 - Arc Counter-clockwise // unimplemented - // G4 - Dwell case 4: - //? ==== G4: Dwell ==== + //? --- G4: Dwell --- //? //? Example: G4 P200 //? //? In this case sit still doing nothing for 200 milliseconds. During delays the state of the machine (for example the temperatures of its extruders) will still be preserved and controlled. //? - - // wait for all moves to complete queue_wait(); // delay for (;next_target.P > 0;next_target.P--) { @@ -178,9 +173,8 @@ void process_gcode_command() { } break; - // G20 - inches as units case 20: - //? ==== G20: Set Units to Inches ==== + //? --- G20: Set Units to Inches --- //? //? Example: G20 //? @@ -189,9 +183,8 @@ void process_gcode_command() { next_target.option_inches = 1; break; - // G21 - mm as units case 21: - //? ==== G21: Set Units to Millimeters ==== + //? --- G21: Set Units to Millimeters --- //? //? Example: G21 //? @@ -200,17 +193,15 @@ void process_gcode_command() { next_target.option_inches = 0; break; - // G30 - go home via point case 30: - //? ==== G30: Go home via point ==== + //? --- G30: Go home via point --- //? //? Undocumented. enqueue(&next_target.target); // no break here, G30 is move and then go home - // G28 - go home case 28: - //? ==== G28: Home ==== + //? --- G28: Home --- //? //? Example: G28 //? @@ -256,35 +247,34 @@ void process_gcode_command() { } break; - // G90 - absolute positioning case 90: - //? ==== G90: Set to Absolute Positioning ==== + //? --- G90: Set to Absolute Positioning --- //? //? Example: G90 //? //? All coordinates from now on are absolute relative to the origin of the machine. (This is the RepRap default.) + //? next_target.option_relative = 0; break; - // G91 - relative positioning case 91: - //? ==== G91: Set to Relative Positioning ==== + //? --- G91: Set to Relative Positioning --- //? //? Example: G91 //? //? All coordinates from now on are relative to the last position. + //? next_target.option_relative = 1; break; - // G92 - set home case 92: - //? ==== G92: Set Position ==== + //? --- G92: Set Position --- //? //? Example: G92 X10 E90 //? //? Allows programming of absolute zero point, by reseting the current position to the values specified. This would set the machine's X coordinate to 10, and the extrude coordinate to 90. No physical motion will occur. + //? - // wait for queue to empty queue_wait(); if (next_target.seen_X) { @@ -313,11 +303,11 @@ void process_gcode_command() { } break; - // G161 - Home negative case 161: - //? ==== G161: Home negative ==== + //? --- G161: Home negative --- //? //? Find the minimum limit of the specified axes by searching for the limit switch. + //? if (next_target.seen_X) home_x_negative(); if (next_target.seen_Y) @@ -326,11 +316,11 @@ void process_gcode_command() { home_z_negative(); break; - // G162 - Home positive case 162: - //? ==== G162: Home positive ==== + //? --- G162: Home positive --- //? //? Find the maximum limit of the specified axes by searching for the limit switch. + //? if (next_target.seen_X) home_x_positive(); if (next_target.seen_Y) @@ -352,31 +342,32 @@ void process_gcode_command() { } else if (next_target.seen_M) { switch (next_target.M) { - // M0- machine stop case 0: - //? ==== M0: machine stop ==== + //? --- M0: machine stop --- //? //? Example: M112 //? //? http://linuxcnc.org/handbook/RS274NGC_3/RS274NGC_33a.html#1002379 //? Unimplemented, especially the restart after the stop. Fall trough to M2. + //? - // M2- program end case 2: - //? ==== M2: program end ==== + //? --- M2: program end --- //? //? http://linuxcnc.org/handbook/RS274NGC_3/RS274NGC_33a.html#1002379 + //? queue_wait(); power_off(); break; - // M112- immediate stop + case 112: - //? ==== M112: Emergency Stop ==== + //? --- M112: Emergency Stop --- //? //? Example: M112 //? //? Any moves in progress are immediately terminated, then RepRap shuts down. All motors and heaters are turned off. //? It can be started again by pressing the reset button on the master microcontroller. See also M0. + //? timer_stop(); queue_flush(); @@ -390,9 +381,8 @@ void process_gcode_command() { wd_reset(); break; - // M6- tool change case 6: - //? ==== M6: tool change ==== + //? --- M6: tool change --- //? //? Undocumented. tool = next_tool; @@ -407,7 +397,7 @@ void process_gcode_command() { // M3/M101- extruder on case 3: case 101: - //? ==== M101: extruder on ==== + //? --- M101: extruder on --- //? //? Undocumented. if (temp_achieved() == 0) { @@ -431,7 +421,7 @@ void process_gcode_command() { // M5/M103- extruder off case 5: case 103: - //? ==== M103: extruder off ==== + //? --- M103: extruder off --- //? //? Undocumented. #ifdef DC_EXTRUDER @@ -447,22 +437,21 @@ void process_gcode_command() { #endif break; - // M104- set temperature case 104: - //? ==== M104: Set Extruder Temperature (Fast) ==== + //? --- M104: Set Extruder Temperature (Fast) --- //? //? Example: M104 S190 //? //? Set the temperature of the current extruder to 190oC and return control to the host immediately (''i.e.'' before that temperature has been reached by the extruder). See also M109. //? Teacup supports an optional P parameter as a sensor index to address (eg M104 P1 S100 will set the bed temperature rather than the extruder temperature). + //? temp_set(next_target.P, next_target.S); if (next_target.S) power_on(); break; - // M105- get temperature case 105: - //? ==== M105: Get Extruder Temperature ==== + //? --- M105: Get Extruder Temperature --- //? //? Example: M105 //? @@ -471,21 +460,21 @@ void process_gcode_command() { //? ok T:201 B:117 //? //? Teacup supports an optional P parameter as a sensor index to address. + //? #ifdef ENFORCE_ORDER - // wait for all moves to complete queue_wait(); #endif temp_print(next_target.P); break; - // M7/M106- fan on case 7: case 106: - //? ==== M106: Fan On ==== + //? --- M106: Fan On --- //? //? Example: M106 //? //? Turn on the cooling fan (if any). + //? #ifdef ENFORCE_ORDER // wait for all moves to complete @@ -495,14 +484,15 @@ void process_gcode_command() { heater_set(HEATER_FAN, 255); #endif break; - // M107- fan off + case 9: case 107: - //? ==== M107: Fan Off ==== + //? --- M107: Fan Off --- //? //? Example: M107 //? //? Turn off the cooling fan (if any). + //? #ifdef ENFORCE_ORDER // wait for all moves to complete @@ -513,15 +503,15 @@ void process_gcode_command() { #endif break; - // M109- set temp and wait case 109: - //? ==== M109: Set Extruder Temperature ==== + //? --- M109: Set Extruder Temperature --- //? //? Example: M109 S190 //? //? Set the temperature of the current extruder to 190oC and wait for it to reach that value before sending an acknowledgment to the host. In fact the RepRap firmware waits a while after the temperature has been reached for the extruder to stabilise - typically about 40 seconds. This can be changed by a parameter in the firmware configuration file when the firmware is compiled. See also M104 and M116. //? //? Teacup supports an optional P parameter as a sensor index to address. + //? if (next_target.seen_S) temp_set(next_target.P, next_target.S); if (next_target.S) { @@ -534,19 +524,19 @@ void process_gcode_command() { enqueue(NULL); break; - // M110- set line number case 110: - //? ==== M110: Set Current Line Number ==== + //? --- M110: Set Current Line Number --- //? //? Example: N123 M110 //? //? Set the current line number to 123. Thus the expected next line after this command will be 124. //? This is a no-op in Teacup. + //? break; - // M111- set debug level + #ifdef DEBUG case 111: - //? ==== M111: Set Debug Level ==== + //? --- M111: Set Debug Level --- //? //? Example: M111 S6 //? @@ -563,10 +553,11 @@ void process_gcode_command() { debug_flags = next_target.S; break; #endif + // M113- extruder PWM - // M114- report XYZEF to host + case 114: - //? ==== M114: Get Current Position ==== + //? --- M114: Get Current Position --- //? //? Example: M114 //? @@ -575,6 +566,7 @@ void process_gcode_command() { //? For example, the machine returns a string such as: //? //? ok C: X:0.00 Y:0.00 Z:0.00 E:0.00 + //? #ifdef ENFORCE_ORDER // wait for all moves to complete queue_wait(); @@ -582,9 +574,9 @@ void process_gcode_command() { sersendf_P(PSTR("X:%lq,Y:%lq,Z:%lq,E:%lq,F:%ld"), current_position.X * ((int32_t) UM_PER_STEP_X), current_position.Y * ((int32_t) UM_PER_STEP_Y), current_position.Z * ((int32_t) UM_PER_STEP_Z), current_position.E * ((int32_t) UM_PER_STEP_E), current_position.F); // newline is sent from gcode_parse after we return break; - // M115- capabilities string + case 115: - //? ==== M115: Get Firmware Version and Capabilities ==== + //? --- M115: Get Firmware Version and Capabilities --- //? //? Example: M115 //? @@ -593,13 +585,14 @@ void process_gcode_command() { //? //? sample data from firmware: //? FIRMWARE_NAME:Teacup FIRMWARE_URL:http%%3A//github.com/triffid/Teacup_Firmware/ PROTOCOL_VERSION:1.0 MACHINE_TYPE:Mendel EXTRUDER_COUNT:1 TEMP_SENSOR_COUNT:1 HEATER_COUNT:1 + //? sersendf_P(PSTR("FIRMWARE_NAME:Teacup FIRMWARE_URL:http%%3A//github.com/triffid/Teacup_Firmware/ PROTOCOL_VERSION:1.0 MACHINE_TYPE:Mendel EXTRUDER_COUNT:%d TEMP_SENSOR_COUNT:%d HEATER_COUNT:%d"), 1, NUM_TEMP_SENSORS, NUM_HEATERS); // newline is sent from gcode_parse after we return break; - // M116 - Wait for all temperatures and other slowly-changing variables to arrive at their set values. + case 116: - //? ==== M116: Wait ==== + //? --- M116: Wait --- //? //? Example: M116 //? @@ -607,61 +600,61 @@ void process_gcode_command() { enqueue(NULL); break; - // M130- heater P factor + case 130: - //? ==== M130: heater P factor ==== + //? --- M130: heater P factor --- //? Undocumented. if (next_target.seen_S) pid_set_p(next_target.P, next_target.S); break; - // M131- heater I factor + case 131: - //? ==== M131: heater I factor ==== + //? --- M131: heater I factor --- //? Undocumented. if (next_target.seen_S) pid_set_i(next_target.P, next_target.S); break; - // M132- heater D factor + case 132: - //? ==== M132: heater D factor ==== + //? --- M132: heater D factor --- //? Undocumented. if (next_target.seen_S) pid_set_d(next_target.P, next_target.S); break; - // M133- heater I limit + case 133: - //? ==== M133: heater I limit ==== + //? --- M133: heater I limit --- //? Undocumented. if (next_target.seen_S) pid_set_i_limit(next_target.P, next_target.S); break; - // M134- save PID settings to eeprom + case 134: - //? ==== M134: save PID settings to eeprom ==== + //? --- M134: save PID settings to eeprom --- //? Undocumented. heater_save_settings(); break; - // M135- set heater output + case 135: - //? ==== M135: set heater output ==== + //? --- M135: set heater output --- //? Undocumented. if (next_target.seen_S) { heater_set(next_target.P, next_target.S); power_on(); } break; + #ifdef DEBUG - // M136- PRINT PID settings to host case 136: - //? ==== M136: PRINT PID settings to host ==== + //? --- M136: PRINT PID settings to host --- //? Undocumented. //? This comand is only available in DEBUG builds. heater_print(next_target.P); break; #endif - case 140: //Set heated bed temperature - //? ==== M140: Set heated bed temperature ==== + case 140: + //? --- M140: Set heated bed temperature --- //? Undocumented. #ifdef HEATER_BED temp_set(HEATER_BED, next_target.S); @@ -670,10 +663,11 @@ void process_gcode_command() { #endif break; - // M190- power on case 190: - //? ==== M190: Power On ==== + //? --- M190: Power On --- //? Undocumented. + //? This one is pointless in Teacup. Implemented to calm the RepRap gurus. + //? power_on(); x_enable(); y_enable(); @@ -681,10 +675,11 @@ void process_gcode_command() { e_enable(); steptimeout = 0; break; - // M191- power off + case 191: - //? ==== M191: Power Off ==== + //? --- M191: Power Off --- //? Undocumented. + //? Same as M2. RepRap obviously prefers to invent new numbers instead of looking into standards. #ifdef ENFORCE_ORDER // wait for all moves to complete queue_wait(); @@ -696,46 +691,44 @@ void process_gcode_command() { power_off(); break; - // M200 - report endstop status case 200: - //? ==== M200: report endstop status ==== + //? --- M200: report endstop status --- //? Report the current status of the endstops configured in the firmware to the host. - #if defined(X_MIN_PIN) - sersendf_P(PSTR("x_min:%d "), x_min()); - #endif - #if defined(X_MAX_PIN) - sersendf_P(PSTR("x_max:%d "), x_max()); - #endif - #if defined(Y_MIN_PIN) - sersendf_P(PSTR("y_min:%d "), y_min()); - #endif - #if defined(Y_MAX_PIN) - sersendf_P(PSTR("y_max:%d "), y_max()); - #endif - #if defined(Z_MIN_PIN) - sersendf_P(PSTR("z_min:%d "), z_min()); - #endif - #if defined(Z_MAX_PIN) - sersendf_P(PSTR("z_max:%d "), z_max()); - #endif - #if !(defined(X_MIN_PIN) || defined(X_MAX_PIN) || defined(Y_MIN_PIN) || defined(Y_MAX_PIN) || defined(Z_MIN_PIN) || defined(Z_MAX_PIN)) - sersendf_P(PSTR("no endstops defined")); - #endif + #if defined(X_MIN_PIN) + sersendf_P(PSTR("x_min:%d "), x_min()); + #endif + #if defined(X_MAX_PIN) + sersendf_P(PSTR("x_max:%d "), x_max()); + #endif + #if defined(Y_MIN_PIN) + sersendf_P(PSTR("y_min:%d "), y_min()); + #endif + #if defined(Y_MAX_PIN) + sersendf_P(PSTR("y_max:%d "), y_max()); + #endif + #if defined(Z_MIN_PIN) + sersendf_P(PSTR("z_min:%d "), z_min()); + #endif + #if defined(Z_MAX_PIN) + sersendf_P(PSTR("z_max:%d "), z_max()); + #endif + #if !(defined(X_MIN_PIN) || defined(X_MAX_PIN) || defined(Y_MIN_PIN) || defined(Y_MAX_PIN) || defined(Z_MIN_PIN) || defined(Z_MAX_PIN)) + sersendf_P(PSTR("no endstops defined")); + #endif break; #ifdef DEBUG - // M240- echo off case 240: - //? ==== M240: echo off ==== + //? --- M240: echo off --- //? Disable echo. //? This command is only available in DEBUG builds. debug_flags &= ~DEBUG_ECHO; serial_writestr_P(PSTR("Echo off")); // newline is sent from gcode_parse after we return break; - // M241- echo on + case 241: - //? ==== M241: echo on ==== + //? --- M241: echo on --- //? Enable echo. //? This command is only available in DEBUG builds. debug_flags |= DEBUG_ECHO; @@ -743,9 +736,8 @@ void process_gcode_command() { // newline is sent from gcode_parse after we return break; - // DEBUG: return current position, end position, queue case 250: - //? ==== M250: return current position, end position, queue ==== + //? --- M250: return current position, end position, queue --- //? Undocumented //? This command is only available in DEBUG builds. sersendf_P(PSTR("{X:%ld,Y:%ld,Z:%ld,E:%ld,F:%lu,c:%lu}\t{X:%ld,Y:%ld,Z:%ld,E:%ld,F:%lu,c:%lu}\t"), current_position.X, current_position.Y, current_position.Z, current_position.E, current_position.F, movebuffer[mb_tail].c, movebuffer[mb_tail].endpoint.X, movebuffer[mb_tail].endpoint.Y, movebuffer[mb_tail].endpoint.Z, movebuffer[mb_tail].endpoint.E, movebuffer[mb_tail].endpoint.F, @@ -759,9 +751,8 @@ void process_gcode_command() { print_queue(); break; - // DEBUG: read arbitrary memory location case 253: - //? ==== M253: read arbitrary memory location ==== + //? --- M253: read arbitrary memory location --- //? Undocumented //? This command is only available in DEBUG builds. if (next_target.seen_P == 0) @@ -773,9 +764,8 @@ void process_gcode_command() { // newline is sent from gcode_parse after we return break; - // DEBUG: write arbitrary memory location case 254: - //? ==== M254: write arbitrary memory location ==== + //? --- M254: write arbitrary memory location --- //? Undocumented //? This command is only available in DEBUG builds. sersendf_P(PSTR("%x:%x->%x"), next_target.S, *(volatile uint8_t *)(next_target.S), next_target.P); @@ -783,6 +773,7 @@ void process_gcode_command() { // newline is sent from gcode_parse after we return break; #endif /* DEBUG */ + // unknown mcode: spit an error default: sersendf_P(PSTR("E: Bad M-code %d"), next_target.M);