Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- [quote]
- [color=#7E7E7E]/* -*- c++ -*- */[/color]
- [color=#7E7E7E]/*[/color]
- [color=#7E7E7E] Reprap firmware based on Sprinter and grbl.[/color]
- [color=#7E7E7E] Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm[/color]
- [color=#7E7E7E] This program is free software: you can redistribute it and/or modify[/color]
- [color=#7E7E7E] it under the terms of the GNU General Public License as published by[/color]
- [color=#7E7E7E] the Free Software Foundation, either version 3 of the License, or[/color]
- [color=#7E7E7E] (at your option) any later version.[/color]
- [color=#7E7E7E] This program is distributed in the hope that it will be useful,[/color]
- [color=#7E7E7E] but WITHOUT ANY WARRANTY; without even the implied warranty of[/color]
- [color=#7E7E7E] MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the[/color]
- [color=#7E7E7E] GNU General Public License for more details.[/color]
- [color=#7E7E7E] You should have received a copy of the GNU General Public License[/color]
- [color=#7E7E7E] along with this program. If not, see <http://www.gnu.org/licenses/>.[/color]
- [color=#7E7E7E] */[/color]
- [color=#7E7E7E]/*[/color]
- [color=#7E7E7E] This firmware is a mashup between Sprinter and grbl.[/color]
- [color=#7E7E7E] (https://github.com/kliment/Sprinter)[/color]
- [color=#7E7E7E] (https://github.com/simen/grbl/tree)[/color]
- [color=#7E7E7E] It has preliminary support for Matthew Roberts advance algorithm[/color]
- [color=#7E7E7E] http://reprap.org/pipermail/reprap-dev/2011-May/003323.html[/color]
- [color=#7E7E7E] */[/color]
- #include [color=#006699]"Marlin.h"[/color]
- #ifdef ENABLE_AUTO_BED_LEVELING
- #include [color=#006699]"vector_3.h"[/color]
- #ifdef ACCURATE_BED_LEVELING
- #include [color=#006699]"qr_solve.h"[/color]
- #endif
- #endif [color=#7E7E7E]// ENABLE_AUTO_BED_LEVELING[/color]
- #include [color=#006699]"ultralcd.h"[/color]
- #include [color=#006699]"planner.h"[/color]
- #include [color=#006699]"stepper.h"[/color]
- #include [color=#006699]"temperature.h"[/color]
- #include [color=#006699]"motion_control.h"[/color]
- #include [color=#006699]"cardreader.h"[/color]
- #include [color=#006699]"watchdog.h"[/color]
- #include [color=#006699]"ConfigurationStore.h"[/color]
- #include [color=#006699]"language.h"[/color]
- #include [color=#006699]"pins_arduino.h"[/color]
- #include [color=#006699]"math.h"[/color]
- #ifdef BLINKM
- #include [color=#006699]"BlinkM.h"[/color]
- #include [color=#006699]"Wire.h"[/color]
- #endif
- #if NUM_SERVOS > 0
- #include [color=#006699]"Servo.h"[/color]
- #endif
- #if defined(DIGIPOTSS_PIN) && DIGIPOTSS_PIN > -1
- #include <[color=#CC6600]SPI[/color].h>
- #endif
- #define VERSION_STRING [color=#006699]"1.0.0"[/color]
- [color=#7E7E7E]// look here for descriptions of gcodes: http://linuxcnc.org/handbook/gcode/g-code.html[/color]
- [color=#7E7E7E]// http://objects.reprap.org/wiki/Mendel_User_Manual:_RepRapGCodes[/color]
- [color=#7E7E7E]//Implemented Codes[/color]
- [color=#7E7E7E]//-------------------[/color]
- [color=#7E7E7E]// G0 -> G1[/color]
- [color=#7E7E7E]// G1 - Coordinated Movement X Y Z E[/color]
- [color=#7E7E7E]// G2 - CW ARC[/color]
- [color=#7E7E7E]// G3 - CCW ARC[/color]
- [color=#7E7E7E]// G4 - Dwell S<seconds> or P<milliseconds>[/color]
- [color=#7E7E7E]// G10 - retract filament according to settings of M207[/color]
- [color=#7E7E7E]// G11 - retract recover filament according to settings of M208[/color]
- [color=#7E7E7E]// G28 - Home all Axis[/color]
- [color=#7E7E7E]// G29 - Detailed Z-Probe, probes the bed at 3 points. You must de at the home position for this to work correctly.[/color]
- [color=#7E7E7E]// G30 - Single Z Probe, probes bed at current XY location.[/color]
- [color=#7E7E7E]// G90 - Use Absolute Coordinates[/color]
- [color=#7E7E7E]// G91 - Use Relative Coordinates[/color]
- [color=#7E7E7E]// G92 - Set current position to cordinates given[/color]
- [color=#7E7E7E]// M Codes[/color]
- [color=#7E7E7E]// M0 - Unconditional stop - Wait for user to press a button on the LCD (Only if ULTRA_LCD is enabled)[/color]
- [color=#7E7E7E]// M1 - Same as M0[/color]
- [color=#7E7E7E]// M17 - Enable/Power all stepper motors[/color]
- [color=#7E7E7E]// M18 - Disable all stepper motors; same as M84[/color]
- [color=#7E7E7E]// M20 - List SD card[/color]
- [color=#7E7E7E]// M21 - Init SD card[/color]
- [color=#7E7E7E]// M22 - Release SD card[/color]
- [color=#7E7E7E]// M23 - Select SD file (M23 filename.g)[/color]
- [color=#7E7E7E]// M24 - Start/resume SD print[/color]
- [color=#7E7E7E]// M25 - Pause SD print[/color]
- [color=#7E7E7E]// M26 - Set SD position in bytes (M26 S12345)[/color]
- [color=#7E7E7E]// M27 - Report SD print status[/color]
- [color=#7E7E7E]// M28 - Start SD write (M28 filename.g)[/color]
- [color=#7E7E7E]// M29 - Stop SD write[/color]
- [color=#7E7E7E]// M30 - Delete file from SD (M30 filename.g)[/color]
- [color=#7E7E7E]// M31 - Output time since last M109 or SD card start to serial[/color]
- [color=#7E7E7E]// M32 - Select file and start SD print (Can be used _while_ printing from SD card files):[/color]
- [color=#7E7E7E]// syntax "M32 /path/filename#", or "M32 S<startpos bytes> !filename#"[/color]
- [color=#7E7E7E]// Call gcode file : "M32 P !filename#" and return to caller file after finishing (simiarl to #include).[/color]
- [color=#7E7E7E]// The '#' is necessary when calling from within sd files, as it stops buffer prereading[/color]
- [color=#7E7E7E]// M42 - Change pin status via gcode Use M42 Px Sy to set pin x to value y, when omitting Px the onboard led will be used.[/color]
- [color=#7E7E7E]// M80 - Turn on Power Supply[/color]
- [color=#7E7E7E]// M81 - Turn off Power Supply[/color]
- [color=#7E7E7E]// M82 - Set E codes absolute (default)[/color]
- [color=#7E7E7E]// M83 - Set E codes relative while in Absolute Coordinates (G90) mode[/color]
- [color=#7E7E7E]// M84 - Disable steppers until next move,[/color]
- [color=#7E7E7E]// or use S<seconds> to specify an inactivity timeout, after which the steppers will be disabled. S0 to disable the timeout.[/color]
- [color=#7E7E7E]// M85 - Set inactivity shutdown timer with parameter S<seconds>. To disable set zero (default)[/color]
- [color=#7E7E7E]// M92 - Set axis_steps_per_unit - same syntax as G92[/color]
- [color=#7E7E7E]// M104 - Set extruder target temp[/color]
- [color=#7E7E7E]// M105 - Read current temp[/color]
- [color=#7E7E7E]// M106 - Fan on[/color]
- [color=#7E7E7E]// M107 - Fan off[/color]
- [color=#7E7E7E]// M109 - Sxxx Wait for extruder current temp to reach target temp. Waits only when heating[/color]
- [color=#7E7E7E]// Rxxx Wait for extruder current temp to reach target temp. Waits when heating and cooling[/color]
- [color=#7E7E7E]// M114 - Output current position to serial port[/color]
- [color=#7E7E7E]// M115 - Capabilities string[/color]
- [color=#7E7E7E]// M117 - display message[/color]
- [color=#7E7E7E]// M119 - Output Endstop status to serial port[/color]
- [color=#7E7E7E]// M126 - Solenoid Air Valve Open (BariCUDA support by jmil)[/color]
- [color=#7E7E7E]// M127 - Solenoid Air Valve Closed (BariCUDA vent to atmospheric pressure by jmil)[/color]
- [color=#7E7E7E]// M128 - EtoP Open (BariCUDA EtoP = electricity to air pressure transducer by jmil)[/color]
- [color=#7E7E7E]// M129 - EtoP Closed (BariCUDA EtoP = electricity to air pressure transducer by jmil)[/color]
- [color=#7E7E7E]// M140 - Set bed target temp[/color]
- [color=#7E7E7E]// M150 - Set BlinkM Colour Output R: Red<0-255> U(!): Green<0-255> B: Blue<0-255> over i2c, G for green does not work.[/color]
- [color=#7E7E7E]// M190 - Sxxx Wait for bed current temp to reach target temp. Waits only when heating[/color]
- [color=#7E7E7E]// Rxxx Wait for bed current temp to reach target temp. Waits when heating and cooling[/color]
- [color=#7E7E7E]// M200 D<millimeters>- set filament diameter and set E axis units to cubic millimeters (use S0 to set back to millimeters).[/color]
- [color=#7E7E7E]// M201 - Set max acceleration in units/s^2 for print moves (M201 X1000 Y1000)[/color]
- [color=#7E7E7E]// M202 - Set max acceleration in units/s^2 for travel moves (M202 X1000 Y1000) Unused in Marlin!![/color]
- [color=#7E7E7E]// M203 - Set maximum feedrate that your machine can sustain (M203 X200 Y200 Z300 E10000) in mm/sec[/color]
- [color=#7E7E7E]// M204 - Set default acceleration: S normal moves T filament only moves (M204 S3000 T7000) im mm/sec^2 also sets minimum segment time in ms (B20000) to prevent buffer underruns and M20 minimum feedrate[/color]
- [color=#7E7E7E]// M205 - advanced settings: minimum travel speed S=while printing T=travel only, B=minimum segment time X= maximum xy jerk, Z=maximum Z jerk, E=maximum E jerk[/color]
- [color=#7E7E7E]// M206 - set additional homeing offset[/color]
- [color=#7E7E7E]// M207 - set retract length S[positive mm] F[feedrate mm/min] Z[additional zlift/hop], stays in mm regardless of M200 setting[/color]
- [color=#7E7E7E]// M208 - set recover=unretract length S[positive mm surplus to the M207 S*] F[feedrate mm/min][/color]
- [color=#7E7E7E]// M209 - S<1=true/0=false> enable automatic retract detect if the slicer did not support G10/11: every normal extrude-only move will be classified as retract depending on the direction.[/color]
- [color=#7E7E7E]// M218 - set hotend offset (in mm): T<extruder_number> X<offset_on_X> Y<offset_on_Y>[/color]
- [color=#7E7E7E]// M220 S<factor in percent>- set speed factor override percentage[/color]
- [color=#7E7E7E]// M221 S<factor in percent>- set extrude factor override percentage[/color]
- [color=#7E7E7E]// M226 P<pin number> S<pin state>- Wait until the specified pin reaches the state required[/color]
- [color=#7E7E7E]// M240 - Trigger a camera to take a photograph[/color]
- [color=#7E7E7E]// M250 - Set LCD contrast C<contrast value> (value 0..63)[/color]
- [color=#7E7E7E]// M280 - set servo position absolute. P: servo index, S: angle or microseconds[/color]
- [color=#7E7E7E]// M300 - Play beepsound S<frequency Hz> P<duration ms>[/color]
- [color=#7E7E7E]// M301 - Set PID parameters P I and D[/color]
- [color=#7E7E7E]// M302 - Allow cold extrudes, or set the minimum extrude S<temperature>.[/color]
- [color=#7E7E7E]// M303 - PID relay autotune S<temperature> sets the target temperature. (default target temperature = 150C)[/color]
- [color=#7E7E7E]// M304 - Set bed PID parameters P I and D[/color]
- [color=#7E7E7E]// M400 - Finish all moves[/color]
- [color=#7E7E7E]// M401 - Lower z-probe if present[/color]
- [color=#7E7E7E]// M402 - Raise z-probe if present[/color]
- [color=#7E7E7E]// M500 - stores paramters in EEPROM[/color]
- [color=#7E7E7E]// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily).[/color]
- [color=#7E7E7E]// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to.[/color]
- [color=#7E7E7E]// M503 - print the current settings (from memory not from eeprom)[/color]
- [color=#7E7E7E]// M540 - Use S[0|1] to enable or disable the stop SD card print on endstop hit (requires ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED)[/color]
- [color=#7E7E7E]// M600 - Pause for filament change X[pos] Y[pos] Z[relative lift] E[initial retract] L[later retract distance for removal][/color]
- [color=#7E7E7E]// M666 - set delta endstop adjustemnt[/color]
- [color=#7E7E7E]// M605 - Set dual x-carriage movement mode: S<mode> [ X<duplication x-offset> R<duplication temp offset> ][/color]
- [color=#7E7E7E]// M907 - Set digital trimpot motor current using axis codes.[/color]
- [color=#7E7E7E]// M908 - Control digital trimpot directly.[/color]
- [color=#7E7E7E]// M350 - Set microstepping mode.[/color]
- [color=#7E7E7E]// M351 - Toggle MS1 MS2 pins directly.[/color]
- [color=#7E7E7E]// M928 - Start SD logging (M928 filename.g) - ended by M29[/color]
- [color=#7E7E7E]// M999 - Restart after being stopped by error[/color]
- [color=#7E7E7E]//Stepper Movement Variables[/color]
- [color=#7E7E7E]//===========================================================================[/color]
- [color=#7E7E7E]//=============================imported variables============================[/color]
- [color=#7E7E7E]//===========================================================================[/color]
- [color=#7E7E7E]//===========================================================================[/color]
- [color=#7E7E7E]//=============================public variables=============================[/color]
- [color=#7E7E7E]//===========================================================================[/color]
- #ifdef SDSUPPORT
- CardReader card;
- #endif
- [color=#CC6600]float[/color] homing_feedrate[] = HOMING_FEEDRATE;
- bool axis_relative_modes[] = AXIS_RELATIVE_MODES;
- [color=#CC6600]int[/color] feedmultiply=100; [color=#7E7E7E]//100->1 200->2[/color]
- [color=#CC6600]int[/color] saved_feedmultiply;
- [color=#CC6600]int[/color] extrudemultiply=100; [color=#7E7E7E]//100->1 200->2[/color]
- [color=#CC6600]float[/color] volumetric_multiplier[EXTRUDERS] = {1.0
- #if EXTRUDERS > 1
- , 1.0
- #if EXTRUDERS > 2
- , 1.0
- #endif
- #endif
- };
- [color=#CC6600]float[/color] current_position[NUM_AXIS] = { 0.0, 0.0, 0.0, 0.0 };
- [color=#CC6600]float[/color] add_homeing[3]={0,0,0};
- #ifdef DELTA
- [color=#CC6600]float[/color] endstop_adj[3]={0,0,0};
- #endif
- [color=#CC6600]float[/color] min_pos[3] = { X_MIN_POS, Y_MIN_POS, Z_MIN_POS };
- [color=#CC6600]float[/color] max_pos[3] = { X_MAX_POS, Y_MAX_POS, Z_MAX_POS };
- bool axis_known_position[3] = {[color=#CC6600]false[/color], [color=#CC6600]false[/color], [color=#CC6600]false[/color]};
- [color=#CC6600]float[/color] zprobe_zoffset;
- [color=#7E7E7E]// Extruder offset[/color]
- #if EXTRUDERS > 1
- #ifndef DUAL_X_CARRIAGE
- #define NUM_EXTRUDER_OFFSETS 2 [color=#7E7E7E]// only in XY plane[/color]
- #else
- #define NUM_EXTRUDER_OFFSETS 3 [color=#7E7E7E]// supports offsets in XYZ plane[/color]
- #endif
- [color=#CC6600]float[/color] extruder_offset[NUM_EXTRUDER_OFFSETS][EXTRUDERS] = {
- #if defined(EXTRUDER_OFFSET_X) && defined(EXTRUDER_OFFSET_Y)
- EXTRUDER_OFFSET_X, EXTRUDER_OFFSET_Y
- #endif
- };
- #endif
- uint8_t active_extruder = 0;
- [color=#CC6600]int[/color] fanSpeed=0;
- #ifdef SERVO_ENDSTOPS
- [color=#CC6600]int[/color] servo_endstops[] = SERVO_ENDSTOPS;
- [color=#CC6600]int[/color] servo_endstop_angles[] = SERVO_ENDSTOP_ANGLES;
- #endif
- #ifdef BARICUDA
- [color=#CC6600]int[/color] ValvePressure=0;
- [color=#CC6600]int[/color] EtoPPressure=0;
- #endif
- #ifdef FWRETRACT
- bool autoretract_enabled=[color=#CC6600]true[/color];
- bool retracted=[color=#CC6600]false[/color];
- [color=#CC6600]float[/color] retract_length=3, retract_feedrate=17*60, retract_zlift=0.8;
- [color=#CC6600]float[/color] retract_recover_length=0, retract_recover_feedrate=8*60;
- #endif
- #ifdef ULTIPANEL
- #ifdef PS_DEFAULT_OFF
- bool powersupply = [color=#CC6600]false[/color];
- #else
- bool powersupply = [color=#CC6600]true[/color];
- #endif
- #endif
- #ifdef DELTA
- [color=#CC6600]float[/color] delta[3] = {0.0, 0.0, 0.0};
- #endif
- [color=#7E7E7E]//===========================================================================[/color]
- [color=#7E7E7E]//=============================private variables=============================[/color]
- [color=#7E7E7E]//===========================================================================[/color]
- [color=#CC6600]const[/color] [color=#CC6600]char[/color] axis_codes[NUM_AXIS] = {[color=#006699]'X'[/color], [color=#006699]'Y'[/color], [color=#006699]'Z'[/color], [color=#006699]'E'[/color]};
- [color=#CC6600]static[/color] [color=#CC6600]float[/color] destination[NUM_AXIS] = { 0.0, 0.0, 0.0, 0.0};
- [color=#CC6600]static[/color] [color=#CC6600]float[/color] offset[3] = {0.0, 0.0, 0.0};
- [color=#CC6600]static[/color] bool home_all_axis = [color=#CC6600]true[/color];
- [color=#CC6600]static[/color] [color=#CC6600]float[/color] feedrate = 1500.0, next_feedrate, saved_feedrate;
- [color=#CC6600]static[/color] [color=#CC6600]long[/color] gcode_N, gcode_LastN, Stopped_gcode_LastN = 0;
- [color=#CC6600]static[/color] bool relative_mode = [color=#CC6600]false[/color]; [color=#7E7E7E]//Determines Absolute or Relative Coordinates[/color]
- [color=#CC6600]static[/color] [color=#CC6600]char[/color] cmdbuffer[BUFSIZE][MAX_CMD_SIZE];
- [color=#CC6600]static[/color] bool fromsd[BUFSIZE];
- [color=#CC6600]static[/color] [color=#CC6600]int[/color] bufindr = 0;
- [color=#CC6600]static[/color] [color=#CC6600]int[/color] bufindw = 0;
- [color=#CC6600]static[/color] [color=#CC6600]int[/color] buflen = 0;
- [color=#7E7E7E]//static int i = 0;[/color]
- [color=#CC6600]static[/color] [color=#CC6600]char[/color] serial_char;
- [color=#CC6600]static[/color] [color=#CC6600]int[/color] serial_count = 0;
- [color=#CC6600]static[/color] [color=#CC6600]boolean[/color] comment_mode = [color=#CC6600]false[/color];
- [color=#CC6600]static[/color] [color=#CC6600]char[/color] *strchr_pointer; [color=#7E7E7E]// just a pointer to find chars in the cmd string like X, Y, Z, E, etc[/color]
- [color=#CC6600]const[/color] [color=#CC6600]int[/color] sensitive_pins[] = SENSITIVE_PINS; [color=#7E7E7E]// Sensitive pin list for M42[/color]
- [color=#7E7E7E]//static float tt = 0;[/color]
- [color=#7E7E7E]//static float bt = 0;[/color]
- [color=#7E7E7E]//Inactivity shutdown variables[/color]
- [color=#CC6600]static[/color] [color=#CC6600]unsigned[/color] [color=#CC6600]long[/color] previous_millis_cmd = 0;
- [color=#CC6600]static[/color] [color=#CC6600]unsigned[/color] [color=#CC6600]long[/color] max_inactive_time = 0;
- [color=#CC6600]static[/color] [color=#CC6600]unsigned[/color] [color=#CC6600]long[/color] stepper_inactive_time = DEFAULT_STEPPER_DEACTIVE_TIME*1000l;
- [color=#CC6600]unsigned[/color] [color=#CC6600]long[/color] starttime=0;
- [color=#CC6600]unsigned[/color] [color=#CC6600]long[/color] stoptime=0;
- [color=#CC6600]static[/color] uint8_t tmp_extruder;
- bool Stopped=[color=#CC6600]false[/color];
- #if NUM_SERVOS > 0
- [color=#CC6600]Servo[/color] servos[NUM_SERVOS];
- #endif
- bool CooldownNoWait = [color=#CC6600]true[/color];
- bool target_direction;
- [color=#7E7E7E]//===========================================================================[/color]
- [color=#7E7E7E]//=============================ROUTINES=============================[/color]
- [color=#7E7E7E]//===========================================================================[/color]
- [color=#CC6600]void[/color] get_arc_coordinates();
- bool setTargetedHotend([color=#CC6600]int[/color] code);
- [color=#CC6600]void[/color] serial_echopair_P([color=#CC6600]const[/color] [color=#CC6600]char[/color] *s_P, [color=#CC6600]float[/color] v)
- { serialprintPGM(s_P); SERIAL_ECHO(v); }
- [color=#CC6600]void[/color] serial_echopair_P([color=#CC6600]const[/color] [color=#CC6600]char[/color] *s_P, [color=#CC6600]double[/color] v)
- { serialprintPGM(s_P); SERIAL_ECHO(v); }
- [color=#CC6600]void[/color] serial_echopair_P([color=#CC6600]const[/color] [color=#CC6600]char[/color] *s_P, [color=#CC6600]unsigned[/color] [color=#CC6600]long[/color] v)
- { serialprintPGM(s_P); SERIAL_ECHO(v); }
- extern [color=#006699]"C"[/color]{
- extern [color=#CC6600]unsigned[/color] [color=#CC6600]int[/color] __bss_end;
- extern [color=#CC6600]unsigned[/color] [color=#CC6600]int[/color] __heap_start;
- extern [color=#CC6600]void[/color] *__brkval;
- [color=#CC6600]int[/color] freeMemory() {
- [color=#CC6600]int[/color] free_memory;
- [color=#CC6600]if[/color](([color=#CC6600]int[/color])__brkval == 0)
- free_memory = (([color=#CC6600]int[/color])&free_memory) - (([color=#CC6600]int[/color])&__bss_end);
- [color=#CC6600]else[/color]
- free_memory = (([color=#CC6600]int[/color])&free_memory) - (([color=#CC6600]int[/color])__brkval);
- [color=#CC6600]return[/color] free_memory;
- }
- }
- [color=#7E7E7E]//adds an command to the main command buffer[/color]
- [color=#7E7E7E]//thats really done in a non-safe way.[/color]
- [color=#7E7E7E]//needs overworking someday[/color]
- [color=#CC6600]void[/color] enquecommand([color=#CC6600]const[/color] [color=#CC6600]char[/color] *cmd)
- {
- [color=#CC6600]if[/color](buflen < BUFSIZE)
- {
- [color=#7E7E7E]//this is dangerous if a mixing of serial and this happsens[/color]
- strcpy(&(cmdbuffer[bufindw][0]),cmd);
- SERIAL_ECHO_START;
- SERIAL_ECHOPGM([color=#006699]"enqueing \""[/color]);
- SERIAL_ECHO(cmdbuffer[bufindw]);
- SERIAL_ECHOLNPGM([color=#006699]"\""[/color]);
- bufindw= (bufindw + 1)%BUFSIZE;
- buflen += 1;
- }
- }
- [color=#CC6600]void[/color] enquecommand_P([color=#CC6600]const[/color] [color=#CC6600]char[/color] *cmd)
- {
- [color=#CC6600]if[/color](buflen < BUFSIZE)
- {
- [color=#7E7E7E]//this is dangerous if a mixing of serial and this happsens[/color]
- strcpy_P(&(cmdbuffer[bufindw][0]),cmd);
- SERIAL_ECHO_START;
- SERIAL_ECHOPGM([color=#006699]"enqueing \""[/color]);
- SERIAL_ECHO(cmdbuffer[bufindw]);
- SERIAL_ECHOLNPGM([color=#006699]"\""[/color]);
- bufindw= (bufindw + 1)%BUFSIZE;
- buflen += 1;
- }
- }
- [color=#CC6600]void[/color] setup_killpin()
- {
- #if defined(KILL_PIN) && KILL_PIN > -1
- [color=#CC6600]pinMode[/color](KILL_PIN,[color=#006699]INPUT[/color]);
- WRITE(KILL_PIN,[color=#006699]HIGH[/color]);
- #endif
- }
- [color=#CC6600]void[/color] setup_photpin()
- {
- #if defined(PHOTOGRAPH_PIN) && PHOTOGRAPH_PIN > -1
- SET_OUTPUT(PHOTOGRAPH_PIN);
- WRITE(PHOTOGRAPH_PIN, [color=#006699]LOW[/color]);
- #endif
- }
- [color=#CC6600]void[/color] setup_powerhold()
- {
- #if defined(SUICIDE_PIN) && SUICIDE_PIN > -1
- SET_OUTPUT(SUICIDE_PIN);
- WRITE(SUICIDE_PIN, [color=#006699]HIGH[/color]);
- #endif
- #if defined(PS_ON_PIN) && PS_ON_PIN > -1
- SET_OUTPUT(PS_ON_PIN);
- #if defined(PS_DEFAULT_OFF)
- WRITE(PS_ON_PIN, PS_ON_ASLEEP);
- #else
- WRITE(PS_ON_PIN, PS_ON_AWAKE);
- #endif
- #endif
- }
- [color=#CC6600]void[/color] suicide()
- {
- #if defined(SUICIDE_PIN) && SUICIDE_PIN > -1
- SET_OUTPUT(SUICIDE_PIN);
- WRITE(SUICIDE_PIN, [color=#006699]LOW[/color]);
- #endif
- }
- [color=#CC6600]void[/color] servo_init()
- {
- #if (NUM_SERVOS >= 1) && defined(SERVO0_PIN) && (SERVO0_PIN > -1)
- servos[0].[color=#CC6600]attach[/color](SERVO0_PIN);
- #endif
- #if (NUM_SERVOS >= 2) && defined(SERVO1_PIN) && (SERVO1_PIN > -1)
- servos[1].[color=#CC6600]attach[/color](SERVO1_PIN);
- #endif
- #if (NUM_SERVOS >= 3) && defined(SERVO2_PIN) && (SERVO2_PIN > -1)
- servos[2].[color=#CC6600]attach[/color](SERVO2_PIN);
- #endif
- #if (NUM_SERVOS >= 4) && defined(SERVO3_PIN) && (SERVO3_PIN > -1)
- servos[3].[color=#CC6600]attach[/color](SERVO3_PIN);
- #endif
- #if (NUM_SERVOS >= 5)
- #error [color=#006699]"TODO: enter initalisation code for more servos"[/color]
- #endif
- [color=#7E7E7E]// Set position of Servo Endstops that are defined[/color]
- #ifdef SERVO_ENDSTOPS
- [color=#CC6600]for[/color](int8_t i = 0; i < 3; i++)
- {
- [color=#CC6600]if[/color](servo_endstops[i] > -1) {
- servos[servo_endstops[i]].[color=#CC6600]write[/color](servo_endstop_angles[i * 2 + 1]);
- }
- }
- #endif
- #if defined (ENABLE_AUTO_BED_LEVELING) && (PROBE_SERVO_DEACTIVATION_DELAY > 0)
- [color=#CC6600]delay[/color](PROBE_SERVO_DEACTIVATION_DELAY);
- servos[servo_endstops[[color=#006699]Z_AXIS[/color]]].[color=#CC6600]detach[/color]();
- #endif
- }
- [color=#CC6600]void[/color] [color=#CC6600][b]setup[/b][/color]()
- {
- setup_killpin();
- setup_powerhold();
- MYSERIAL.[color=#CC6600]begin[/color](BAUDRATE);
- SERIAL_PROTOCOLLNPGM([color=#006699]"start"[/color]);
- SERIAL_ECHO_START;
- [color=#7E7E7E]// Check startup - does nothing if bootloader sets MCUSR to 0[/color]
- [color=#CC6600]byte[/color] mcu = MCUSR;
- [color=#CC6600]if[/color](mcu & 1) SERIAL_ECHOLNPGM(MSG_POWERUP);
- [color=#CC6600]if[/color](mcu & 2) SERIAL_ECHOLNPGM(MSG_EXTERNAL_RESET);
- [color=#CC6600]if[/color](mcu & 4) SERIAL_ECHOLNPGM(MSG_BROWNOUT_RESET);
- [color=#CC6600]if[/color](mcu & 8) SERIAL_ECHOLNPGM(MSG_WATCHDOG_RESET);
- [color=#CC6600]if[/color](mcu & 32) SERIAL_ECHOLNPGM(MSG_SOFTWARE_RESET);
- MCUSR=0;
- SERIAL_ECHOPGM(MSG_MARLIN);
- SERIAL_ECHOLNPGM(VERSION_STRING);
- #ifdef STRING_VERSION_CONFIG_H
- #ifdef STRING_CONFIG_H_AUTHOR
- SERIAL_ECHO_START;
- SERIAL_ECHOPGM(MSG_CONFIGURATION_VER);
- SERIAL_ECHOPGM(STRING_VERSION_CONFIG_H);
- SERIAL_ECHOPGM(MSG_AUTHOR);
- SERIAL_ECHOLNPGM(STRING_CONFIG_H_AUTHOR);
- SERIAL_ECHOPGM([color=#006699]"Compiled: "[/color]);
- SERIAL_ECHOLNPGM(__DATE__);
- #endif
- #endif
- SERIAL_ECHO_START;
- SERIAL_ECHOPGM(MSG_FREE_MEMORY);
- SERIAL_ECHO(freeMemory());
- SERIAL_ECHOPGM(MSG_PLANNER_BUFFER_BYTES);
- SERIAL_ECHOLN(([color=#CC6600]int[/color])sizeof(block_t)*BLOCK_BUFFER_SIZE);
- [color=#CC6600]for[/color](int8_t i = 0; i < BUFSIZE; i++)
- {
- fromsd[i] = [color=#CC6600]false[/color];
- }
- [color=#7E7E7E]// loads data from EEPROM if available else uses defaults (and resets step acceleration rate)[/color]
- Config_RetrieveSettings();
- tp_init(); [color=#7E7E7E]// Initialize temperature loop[/color]
- plan_init(); [color=#7E7E7E]// Initialize planner;[/color]
- watchdog_init();
- st_init(); [color=#7E7E7E]// Initialize stepper, this enables interrupts![/color]
- setup_photpin();
- servo_init();
- lcd_init();
- _delay_ms(1000); [color=#7E7E7E]// wait 1sec to display the splash screen[/color]
- #if defined(CONTROLLERFAN_PIN) && CONTROLLERFAN_PIN > -1
- SET_OUTPUT(CONTROLLERFAN_PIN); [color=#7E7E7E]//Set pin used for driver cooling fan[/color]
- #endif
- #ifdef DIGIPOT_I2C
- digipot_i2c_init();
- #endif
- }
- [color=#CC6600]void[/color] [color=#CC6600][b]loop[/b][/color]()
- {
- [color=#CC6600]if[/color](buflen < (BUFSIZE-1))
- get_command();
- #ifdef SDSUPPORT
- card.checkautostart([color=#CC6600]false[/color]);
- #endif
- [color=#CC6600]if[/color](buflen)
- {
- #ifdef SDSUPPORT
- [color=#CC6600]if[/color](card.saving)
- {
- [color=#CC6600]if[/color](strstr_P(cmdbuffer[bufindr], PSTR([color=#006699]"M29"[/color])) == NULL)
- {
- card.write_command(cmdbuffer[bufindr]);
- [color=#CC6600]if[/color](card.logging)
- {
- process_commands();
- }
- [color=#CC6600]else[/color]
- {
- SERIAL_PROTOCOLLNPGM(MSG_OK);
- }
- }
- [color=#CC6600]else[/color]
- {
- card.closefile();
- SERIAL_PROTOCOLLNPGM(MSG_FILE_SAVED);
- }
- }
- [color=#CC6600]else[/color]
- {
- process_commands();
- }
- #else
- process_commands();
- #endif [color=#7E7E7E]//SDSUPPORT[/color]
- buflen = (buflen-1);
- bufindr = (bufindr + 1)%BUFSIZE;
- }
- [color=#7E7E7E]//check heater every n milliseconds[/color]
- manage_heater();
- manage_inactivity();
- checkHitEndstops();
- lcd_update();
- }
- [color=#CC6600]void[/color] get_command()
- {
- [color=#CC6600]while[/color]( MYSERIAL.[color=#CC6600]available[/color]() > 0 && buflen < BUFSIZE) {
- serial_char = MYSERIAL.[color=#CC6600]read[/color]();
- [color=#CC6600]if[/color](serial_char == [color=#006699]'\n'[/color] ||
- serial_char == [color=#006699]'\r'[/color] ||
- (serial_char == [color=#006699]':'[/color] && comment_mode == [color=#CC6600]false[/color]) ||
- serial_count >= (MAX_CMD_SIZE - 1) )
- {
- [color=#CC6600]if[/color](!serial_count) { [color=#7E7E7E]//if empty line[/color]
- comment_mode = [color=#CC6600]false[/color]; [color=#7E7E7E]//for new command[/color]
- [color=#CC6600]return[/color];
- }
- cmdbuffer[bufindw][serial_count] = 0; [color=#7E7E7E]//terminate string[/color]
- [color=#CC6600]if[/color](!comment_mode){
- comment_mode = [color=#CC6600]false[/color]; [color=#7E7E7E]//for new command[/color]
- fromsd[bufindw] = [color=#CC6600]false[/color];
- [color=#CC6600]if[/color](strchr(cmdbuffer[bufindw], [color=#006699]'N'[/color]) != NULL)
- {
- strchr_pointer = strchr(cmdbuffer[bufindw], [color=#006699]'N'[/color]);
- gcode_N = (strtol(&cmdbuffer[bufindw][strchr_pointer - cmdbuffer[bufindw] + 1], NULL, 10));
- [color=#CC6600]if[/color](gcode_N != gcode_LastN+1 && (strstr_P(cmdbuffer[bufindw], PSTR([color=#006699]"M110"[/color])) == NULL) ) {
- SERIAL_ERROR_START;
- SERIAL_ERRORPGM(MSG_ERR_LINE_NO);
- SERIAL_ERRORLN(gcode_LastN);
- [color=#7E7E7E]//Serial.println(gcode_N);[/color]
- FlushSerialRequestResend();
- serial_count = 0;
- [color=#CC6600]return[/color];
- }
- [color=#CC6600]if[/color](strchr(cmdbuffer[bufindw], [color=#006699]'*'[/color]) != NULL)
- {
- [color=#CC6600]byte[/color] checksum = 0;
- [color=#CC6600]byte[/color] count = 0;
- [color=#CC6600]while[/color](cmdbuffer[bufindw][count] != [color=#006699]'*'[/color]) checksum = checksum^cmdbuffer[bufindw][count++];
- strchr_pointer = strchr(cmdbuffer[bufindw], [color=#006699]'*'[/color]);
- [color=#CC6600]if[/color]( ([color=#CC6600]int[/color])(strtod(&cmdbuffer[bufindw][strchr_pointer - cmdbuffer[bufindw] + 1], NULL)) != checksum) {
- SERIAL_ERROR_START;
- SERIAL_ERRORPGM(MSG_ERR_CHECKSUM_MISMATCH);
- SERIAL_ERRORLN(gcode_LastN);
- FlushSerialRequestResend();
- serial_count = 0;
- [color=#CC6600]return[/color];
- }
- [color=#7E7E7E]//if no errors, continue parsing[/color]
- }
- [color=#CC6600]else[/color]
- {
- SERIAL_ERROR_START;
- SERIAL_ERRORPGM(MSG_ERR_NO_CHECKSUM);
- SERIAL_ERRORLN(gcode_LastN);
- FlushSerialRequestResend();
- serial_count = 0;
- [color=#CC6600]return[/color];
- }
- gcode_LastN = gcode_N;
- [color=#7E7E7E]//if no errors, continue parsing[/color]
- }
- [color=#CC6600]else[/color] [color=#7E7E7E]// if we don't receive 'N' but still see '*'[/color]
- {
- [color=#CC6600]if[/color]((strchr(cmdbuffer[bufindw], [color=#006699]'*'[/color]) != NULL))
- {
- SERIAL_ERROR_START;
- SERIAL_ERRORPGM(MSG_ERR_NO_LINENUMBER_WITH_CHECKSUM);
- SERIAL_ERRORLN(gcode_LastN);
- serial_count = 0;
- [color=#CC6600]return[/color];
- }
- }
- [color=#CC6600]if[/color]((strchr(cmdbuffer[bufindw], [color=#006699]'G'[/color]) != NULL)){
- strchr_pointer = strchr(cmdbuffer[bufindw], [color=#006699]'G'[/color]);
- [color=#CC6600]switch[/color](([color=#CC6600]int[/color])((strtod(&cmdbuffer[bufindw][strchr_pointer - cmdbuffer[bufindw] + 1], NULL)))){
- [color=#CC6600]case[/color] 0:
- [color=#CC6600]case[/color] 1:
- [color=#CC6600]case[/color] 2:
- [color=#CC6600]case[/color] 3:
- [color=#CC6600]if[/color](Stopped == [color=#CC6600]false[/color]) { [color=#7E7E7E]// If printer is stopped by an error the G[0-3] codes are ignored.[/color]
- #ifdef SDSUPPORT
- [color=#CC6600]if[/color](card.saving)
- [color=#CC6600]break[/color];
- #endif [color=#7E7E7E]//SDSUPPORT[/color]
- SERIAL_PROTOCOLLNPGM(MSG_OK);
- }
- [color=#CC6600]else[/color] {
- SERIAL_ERRORLNPGM(MSG_ERR_STOPPED);
- LCD_MESSAGEPGM(MSG_STOPPED);
- }
- [color=#CC6600]break[/color];
- [color=#CC6600]default[/color]:
- [color=#CC6600]break[/color];
- }
- }
- bufindw = (bufindw + 1)%BUFSIZE;
- buflen += 1;
- }
- serial_count = 0; [color=#7E7E7E]//clear buffer[/color]
- }
- [color=#CC6600]else[/color]
- {
- [color=#CC6600]if[/color](serial_char == [color=#006699]';'[/color]) comment_mode = [color=#CC6600]true[/color];
- [color=#CC6600]if[/color](!comment_mode) cmdbuffer[bufindw][serial_count++] = serial_char;
- }
- }
- #ifdef SDSUPPORT
- [color=#CC6600]if[/color](!card.sdprinting || serial_count!=0){
- [color=#CC6600]return[/color];
- }
- [color=#7E7E7E]//'#' stops reading from sd to the buffer prematurely, so procedural macro calls are possible[/color]
- [color=#7E7E7E]// if it occures, stop_buffering is triggered and the buffer is ran dry.[/color]
- [color=#7E7E7E]// this character _can_ occure in serial com, due to checksums. however, no checksums are used in sd printing[/color]
- [color=#CC6600]static[/color] bool stop_buffering=[color=#CC6600]false[/color];
- [color=#CC6600]if[/color](buflen==0) stop_buffering=[color=#CC6600]false[/color];
- [color=#CC6600]while[/color]( !card.eof() && buflen < BUFSIZE && !stop_buffering) {
- int16_t n=card.get();
- serial_char = ([color=#CC6600]char[/color])n;
- [color=#CC6600]if[/color](serial_char == [color=#006699]'\n'[/color] ||
- serial_char == [color=#006699]'\r'[/color] ||
- (serial_char == [color=#006699]'#'[/color] && comment_mode == [color=#CC6600]false[/color]) ||
- (serial_char == [color=#006699]':'[/color] && comment_mode == [color=#CC6600]false[/color]) ||
- serial_count >= (MAX_CMD_SIZE - 1)||n==-1)
- {
- [color=#CC6600]if[/color](card.eof()){
- SERIAL_PROTOCOLLNPGM(MSG_FILE_PRINTED);
- stoptime=[color=#CC6600]millis[/color]();
- [color=#CC6600]char[/color] time[30];
- [color=#CC6600]unsigned[/color] [color=#CC6600]long[/color] t=(stoptime-starttime)/1000;
- [color=#CC6600]int[/color] hours, minutes;
- minutes=(t/60)%60;
- hours=t/60/60;
- sprintf_P(time, PSTR([color=#006699]"%i hours %i minutes"[/color]),hours, minutes);
- SERIAL_ECHO_START;
- SERIAL_ECHOLN(time);
- lcd_setstatus(time);
- card.printingHasFinished();
- card.checkautostart([color=#CC6600]true[/color]);
- }
- [color=#CC6600]if[/color](serial_char==[color=#006699]'#'[/color])
- stop_buffering=[color=#CC6600]true[/color];
- [color=#CC6600]if[/color](!serial_count)
- {
- comment_mode = [color=#CC6600]false[/color]; [color=#7E7E7E]//for new command[/color]
- [color=#CC6600]return[/color]; [color=#7E7E7E]//if empty line[/color]
- }
- cmdbuffer[bufindw][serial_count] = 0; [color=#7E7E7E]//terminate string[/color]
- [color=#7E7E7E]// if(!comment_mode){[/color]
- fromsd[bufindw] = [color=#CC6600]true[/color];
- buflen += 1;
- bufindw = (bufindw + 1)%BUFSIZE;
- [color=#7E7E7E]// }[/color]
- comment_mode = [color=#CC6600]false[/color]; [color=#7E7E7E]//for new command[/color]
- serial_count = 0; [color=#7E7E7E]//clear buffer[/color]
- }
- [color=#CC6600]else[/color]
- {
- [color=#CC6600]if[/color](serial_char == [color=#006699]';'[/color]) comment_mode = [color=#CC6600]true[/color];
- [color=#CC6600]if[/color](!comment_mode) cmdbuffer[bufindw][serial_count++] = serial_char;
- }
- }
- #endif [color=#7E7E7E]//SDSUPPORT[/color]
- }
- [color=#CC6600]float[/color] code_value()
- {
- [color=#CC6600]return[/color] (strtod(&cmdbuffer[bufindr][strchr_pointer - cmdbuffer[bufindr] + 1], NULL));
- }
- [color=#CC6600]long[/color] code_value_long()
- {
- [color=#CC6600]return[/color] (strtol(&cmdbuffer[bufindr][strchr_pointer - cmdbuffer[bufindr] + 1], NULL, 10));
- }
- bool code_seen([color=#CC6600]char[/color] code)
- {
- strchr_pointer = strchr(cmdbuffer[bufindr], code);
- [color=#CC6600]return[/color] (strchr_pointer != NULL); [color=#7E7E7E]//Return True if a character was found[/color]
- }
- #define DEFINE_PGM_READ_ANY(type, reader) \
- [color=#CC6600]static[/color] inline type pgm_read_any([color=#CC6600]const[/color] type *p) \
- { [color=#CC6600]return[/color] pgm_read_##reader##_near(p); }
- DEFINE_PGM_READ_ANY([color=#CC6600]float[/color], [color=#CC6600]float[/color]);
- DEFINE_PGM_READ_ANY([color=#CC6600]signed[/color] [color=#CC6600]char[/color], [color=#CC6600]byte[/color]);
- #define XYZ_CONSTS_FROM_CONFIG(type, array, CONFIG) \
- [color=#CC6600]static[/color] [color=#CC6600]const[/color] PROGMEM type array##_P[3] = \
- { X_##CONFIG, Y_##CONFIG, Z_##CONFIG }; \
- [color=#CC6600]static[/color] inline type array([color=#CC6600]int[/color] axis) \
- { [color=#CC6600]return[/color] pgm_read_any(&array##_P[axis]); }
- XYZ_CONSTS_FROM_CONFIG([color=#CC6600]float[/color], base_min_pos, MIN_POS);
- XYZ_CONSTS_FROM_CONFIG([color=#CC6600]float[/color], base_max_pos, MAX_POS);
- XYZ_CONSTS_FROM_CONFIG([color=#CC6600]float[/color], base_home_pos, HOME_POS);
- XYZ_CONSTS_FROM_CONFIG([color=#CC6600]float[/color], max_length, MAX_LENGTH);
- XYZ_CONSTS_FROM_CONFIG([color=#CC6600]float[/color], home_retract_mm, HOME_RETRACT_MM);
- XYZ_CONSTS_FROM_CONFIG([color=#CC6600]signed[/color] [color=#CC6600]char[/color], home_dir, HOME_DIR);
- #ifdef DUAL_X_CARRIAGE
- #if EXTRUDERS == 1 || defined(COREXY) \
- || !defined(X2_ENABLE_PIN) || !defined(X2_STEP_PIN) || !defined(X2_DIR_PIN) \
- || !defined(X2_HOME_POS) || !defined(X2_MIN_POS) || !defined(X2_MAX_POS) \
- || !defined(X_MAX_PIN) || X_MAX_PIN < 0
- #error [color=#006699]"Missing or invalid definitions for DUAL_X_CARRIAGE mode."[/color]
- #endif
- #if X_HOME_DIR != -1 || X2_HOME_DIR != 1
- #error [color=#006699]"Please use canonical x-carriage assignment"[/color] [color=#7E7E7E]// the x-carriages are defined by their homing directions[/color]
- #endif
- #define DXC_FULL_CONTROL_MODE 0
- #define DXC_AUTO_PARK_MODE 1
- #define DXC_DUPLICATION_MODE 2
- [color=#CC6600]static[/color] [color=#CC6600]int[/color] dual_x_carriage_mode = DEFAULT_DUAL_X_CARRIAGE_MODE;
- [color=#CC6600]static[/color] [color=#CC6600]float[/color] x_home_pos([color=#CC6600]int[/color] extruder) {
- [color=#CC6600]if[/color] (extruder == 0)
- [color=#CC6600]return[/color] base_home_pos([color=#006699]X_AXIS[/color]) + add_homeing[[color=#006699]X_AXIS[/color]];
- [color=#CC6600]else[/color]
- [color=#7E7E7E]// In dual carriage mode the extruder offset provides an override of the[/color]
- [color=#7E7E7E]// second X-carriage offset when homed - otherwise X2_HOME_POS is used.[/color]
- [color=#7E7E7E]// This allow soft recalibration of the second extruder offset position without firmware reflash[/color]
- [color=#7E7E7E]// (through the M218 command).[/color]
- [color=#CC6600]return[/color] (extruder_offset[[color=#006699]X_AXIS[/color]][1] > 0) ? extruder_offset[[color=#006699]X_AXIS[/color]][1] : X2_HOME_POS;
- }
- [color=#CC6600]static[/color] [color=#CC6600]int[/color] x_home_dir([color=#CC6600]int[/color] extruder) {
- [color=#CC6600]return[/color] (extruder == 0) ? X_HOME_DIR : X2_HOME_DIR;
- }
- [color=#CC6600]static[/color] [color=#CC6600]float[/color] inactive_extruder_x_pos = X2_MAX_POS; [color=#7E7E7E]// used in mode 0 & 1[/color]
- [color=#CC6600]static[/color] bool active_extruder_parked = [color=#CC6600]false[/color]; [color=#7E7E7E]// used in mode 1 & 2[/color]
- [color=#CC6600]static[/color] [color=#CC6600]float[/color] raised_parked_position[NUM_AXIS]; [color=#7E7E7E]// used in mode 1[/color]
- [color=#CC6600]static[/color] [color=#CC6600]unsigned[/color] [color=#CC6600]long[/color] delayed_move_time = 0; [color=#7E7E7E]// used in mode 1[/color]
- [color=#CC6600]static[/color] [color=#CC6600]float[/color] duplicate_extruder_x_offset = DEFAULT_DUPLICATION_X_OFFSET; [color=#7E7E7E]// used in mode 2[/color]
- [color=#CC6600]static[/color] [color=#CC6600]float[/color] duplicate_extruder_temp_offset = 0; [color=#7E7E7E]// used in mode 2[/color]
- bool extruder_duplication_enabled = [color=#CC6600]false[/color]; [color=#7E7E7E]// used in mode 2[/color]
- #endif [color=#7E7E7E]//DUAL_X_CARRIAGE[/color]
- [color=#CC6600]static[/color] [color=#CC6600]void[/color] axis_is_at_home([color=#CC6600]int[/color] axis) {
- #ifdef DUAL_X_CARRIAGE
- [color=#CC6600]if[/color] (axis == [color=#006699]X_AXIS[/color]) {
- [color=#CC6600]if[/color] (active_extruder != 0) {
- current_position[[color=#006699]X_AXIS[/color]] = x_home_pos(active_extruder);
- min_pos[[color=#006699]X_AXIS[/color]] = X2_MIN_POS;
- max_pos[[color=#006699]X_AXIS[/color]] = [color=#CC6600]max[/color](extruder_offset[[color=#006699]X_AXIS[/color]][1], X2_MAX_POS);
- [color=#CC6600]return[/color];
- }
- [color=#CC6600]else[/color] [color=#CC6600]if[/color] (dual_x_carriage_mode == DXC_DUPLICATION_MODE && active_extruder == 0) {
- current_position[[color=#006699]X_AXIS[/color]] = base_home_pos([color=#006699]X_AXIS[/color]) + add_homeing[[color=#006699]X_AXIS[/color]];
- min_pos[[color=#006699]X_AXIS[/color]] = base_min_pos([color=#006699]X_AXIS[/color]) + add_homeing[[color=#006699]X_AXIS[/color]];
- max_pos[[color=#006699]X_AXIS[/color]] = [color=#CC6600]min[/color](base_max_pos([color=#006699]X_AXIS[/color]) + add_homeing[[color=#006699]X_AXIS[/color]],
- [color=#CC6600]max[/color](extruder_offset[[color=#006699]X_AXIS[/color]][1], X2_MAX_POS) - duplicate_extruder_x_offset);
- [color=#CC6600]return[/color];
- }
- }
- #endif
- current_position[axis] = base_home_pos(axis) + add_homeing[axis];
- min_pos[axis] = base_min_pos(axis) + add_homeing[axis];
- max_pos[axis] = base_max_pos(axis) + add_homeing[axis];
- }
- #ifdef ENABLE_AUTO_BED_LEVELING
- #ifdef ACCURATE_BED_LEVELING
- [color=#CC6600]static[/color] [color=#CC6600]void[/color] set_bed_level_equation_lsq([color=#CC6600]double[/color] *plane_equation_coefficients)
- {
- vector_3 planeNormal = vector_3(-plane_equation_coefficients[0], -plane_equation_coefficients[1], 1);
- planeNormal.debug([color=#006699]"planeNormal"[/color]);
- plan_bed_level_matrix = matrix_3x3::create_look_at(planeNormal);
- [color=#7E7E7E]//bedLevel.debug("bedLevel");[/color]
- [color=#7E7E7E]//plan_bed_level_matrix.debug("bed level before");[/color]
- [color=#7E7E7E]//vector_3 uncorrected_position = plan_get_position_mm();[/color]
- [color=#7E7E7E]//uncorrected_position.debug("position before");[/color]
- vector_3 corrected_position = plan_get_position();
- [color=#7E7E7E]// corrected_position.debug("position after");[/color]
- current_position[[color=#006699]X_AXIS[/color]] = corrected_position.x;
- current_position[[color=#006699]Y_AXIS[/color]] = corrected_position.y;
- current_position[[color=#006699]Z_AXIS[/color]] = corrected_position.z;
- [color=#7E7E7E]// but the bed at 0 so we don't go below it.[/color]
- current_position[[color=#006699]Z_AXIS[/color]] = zprobe_zoffset; [color=#7E7E7E]// in the lsq we reach here after raising the extruder due to the loop structure[/color]
- plan_set_position(current_position[[color=#006699]X_AXIS[/color]], current_position[[color=#006699]Y_AXIS[/color]], current_position[[color=#006699]Z_AXIS[/color]], current_position[E_AXIS]);
- }
- #else
- [color=#CC6600]static[/color] [color=#CC6600]void[/color] set_bed_level_equation([color=#CC6600]float[/color] z_at_xLeft_yFront, [color=#CC6600]float[/color] z_at_xRight_yFront, [color=#CC6600]float[/color] z_at_xLeft_yBack) {
- plan_bed_level_matrix.set_to_identity();
- vector_3 xLeftyFront = vector_3(LEFT_PROBE_BED_POSITION, FRONT_PROBE_BED_POSITION, z_at_xLeft_yFront);
- vector_3 xLeftyBack = vector_3(LEFT_PROBE_BED_POSITION, BACK_PROBE_BED_POSITION, z_at_xLeft_yBack);
- vector_3 xRightyFront = vector_3(RIGHT_PROBE_BED_POSITION, FRONT_PROBE_BED_POSITION, z_at_xRight_yFront);
- vector_3 xPositive = (xRightyFront - xLeftyFront).get_normal();
- vector_3 yPositive = (xLeftyBack - xLeftyFront).get_normal();
- vector_3 planeNormal = vector_3::cross(xPositive, yPositive).get_normal();
- [color=#7E7E7E]//planeNormal.debug("planeNormal");[/color]
- [color=#7E7E7E]//yPositive.debug("yPositive");[/color]
- plan_bed_level_matrix = matrix_3x3::create_look_at(planeNormal);
- [color=#7E7E7E]//bedLevel.debug("bedLevel");[/color]
- [color=#7E7E7E]//plan_bed_level_matrix.debug("bed level before");[/color]
- [color=#7E7E7E]//vector_3 uncorrected_position = plan_get_position_mm();[/color]
- [color=#7E7E7E]//uncorrected_position.debug("position before");[/color]
- [color=#7E7E7E]// and set our bed level equation to do the right thing[/color]
- [color=#7E7E7E]//plan_bed_level_matrix.debug("bed level after");[/color]
- vector_3 corrected_position = plan_get_position();
- [color=#7E7E7E]//corrected_position.debug("position after");[/color]
- current_position[[color=#006699]X_AXIS[/color]] = corrected_position.x;
- current_position[[color=#006699]Y_AXIS[/color]] = corrected_position.y;
- current_position[[color=#006699]Z_AXIS[/color]] = corrected_position.z;
- [color=#7E7E7E]// but the bed at 0 so we don't go below it.[/color]
- current_position[[color=#006699]Z_AXIS[/color]] = zprobe_zoffset;
- plan_set_position(current_position[[color=#006699]X_AXIS[/color]], current_position[[color=#006699]Y_AXIS[/color]], current_position[[color=#006699]Z_AXIS[/color]], current_position[E_AXIS]);
- }
- #endif [color=#7E7E7E]// ACCURATE_BED_LEVELING[/color]
- [color=#CC6600]static[/color] [color=#CC6600]void[/color] run_z_probe() {
- plan_bed_level_matrix.set_to_identity();
- feedrate = homing_feedrate[[color=#006699]Z_AXIS[/color]];
- [color=#7E7E7E]// move down until you find the bed[/color]
- [color=#CC6600]float[/color] zPosition = -10;
- plan_buffer_line(current_position[[color=#006699]X_AXIS[/color]], current_position[[color=#006699]Y_AXIS[/color]], zPosition, current_position[E_AXIS], feedrate/60, active_extruder);
- st_synchronize();
- [color=#7E7E7E]// we have to let the planner know where we are right now as it is not where we said to go.[/color]
- zPosition = st_get_position_mm([color=#006699]Z_AXIS[/color]);
- plan_set_position(current_position[[color=#006699]X_AXIS[/color]], current_position[[color=#006699]Y_AXIS[/color]], zPosition, current_position[E_AXIS]);
- [color=#7E7E7E]// move up the retract distance[/color]
- zPosition += home_retract_mm([color=#006699]Z_AXIS[/color]);
- plan_buffer_line(current_position[[color=#006699]X_AXIS[/color]], current_position[[color=#006699]Y_AXIS[/color]], zPosition, current_position[E_AXIS], feedrate/60, active_extruder);
- st_synchronize();
- [color=#7E7E7E]// move back down slowly to find bed[/color]
- feedrate = homing_feedrate[[color=#006699]Z_AXIS[/color]]/4;
- zPosition -= home_retract_mm([color=#006699]Z_AXIS[/color]) * 2;
- plan_buffer_line(current_position[[color=#006699]X_AXIS[/color]], current_position[[color=#006699]Y_AXIS[/color]], zPosition, current_position[E_AXIS], feedrate/60, active_extruder);
- st_synchronize();
- current_position[[color=#006699]Z_AXIS[/color]] = st_get_position_mm([color=#006699]Z_AXIS[/color]);
- [color=#7E7E7E]// make sure the planner knows where we are as it may be a bit different than we last said to move to[/color]
- plan_set_position(current_position[[color=#006699]X_AXIS[/color]], current_position[[color=#006699]Y_AXIS[/color]], current_position[[color=#006699]Z_AXIS[/color]], current_position[E_AXIS]);
- }
- [color=#CC6600]static[/color] [color=#CC6600]void[/color] do_blocking_move_to([color=#CC6600]float[/color] x, [color=#CC6600]float[/color] y, [color=#CC6600]float[/color] z) {
- [color=#CC6600]float[/color] oldFeedRate = feedrate;
- feedrate = XY_TRAVEL_SPEED;
- current_position[[color=#006699]X_AXIS[/color]] = x;
- current_position[[color=#006699]Y_AXIS[/color]] = y;
- current_position[[color=#006699]Z_AXIS[/color]] = z;
- plan_buffer_line(current_position[[color=#006699]X_AXIS[/color]], current_position[[color=#006699]Y_AXIS[/color]], current_position[[color=#006699]Z_AXIS[/color]], current_position[E_AXIS], feedrate/60, active_extruder);
- st_synchronize();
- feedrate = oldFeedRate;
- }
- [color=#CC6600]static[/color] [color=#CC6600]void[/color] do_blocking_move_relative([color=#CC6600]float[/color] offset_x, [color=#CC6600]float[/color] offset_y, [color=#CC6600]float[/color] offset_z) {
- do_blocking_move_to(current_position[[color=#006699]X_AXIS[/color]] + offset_x, current_position[[color=#006699]Y_AXIS[/color]] + offset_y, current_position[[color=#006699]Z_AXIS[/color]] + offset_z);
- }
- [color=#CC6600]static[/color] [color=#CC6600]void[/color] setup_for_endstop_move() {
- saved_feedrate = feedrate;
- saved_feedmultiply = feedmultiply;
- feedmultiply = 100;
- previous_millis_cmd = [color=#CC6600]millis[/color]();
- enable_endstops([color=#CC6600]true[/color]);
- }
- [color=#CC6600]static[/color] [color=#CC6600]void[/color] clean_up_after_endstop_move() {
- #ifdef ENDSTOPS_ONLY_FOR_HOMING
- enable_endstops([color=#CC6600]false[/color]);
- #endif
- feedrate = saved_feedrate;
- feedmultiply = saved_feedmultiply;
- previous_millis_cmd = [color=#CC6600]millis[/color]();
- }
- [color=#CC6600]static[/color] [color=#CC6600]void[/color] engage_z_probe() {
- [color=#7E7E7E]// Engage Z Servo endstop if enabled[/color]
- #ifdef SERVO_ENDSTOPS
- [color=#CC6600]if[/color] (servo_endstops[[color=#006699]Z_AXIS[/color]] > -1) {
- #if defined (ENABLE_AUTO_BED_LEVELING) && (PROBE_SERVO_DEACTIVATION_DELAY > 0)
- servos[servo_endstops[[color=#006699]Z_AXIS[/color]]].[color=#CC6600]attach[/color](0);
- #endif
- servos[servo_endstops[[color=#006699]Z_AXIS[/color]]].[color=#CC6600]write[/color](servo_endstop_angles[[color=#006699]Z_AXIS[/color] * 2]);
- #if defined (ENABLE_AUTO_BED_LEVELING) && (PROBE_SERVO_DEACTIVATION_DELAY > 0)
- [color=#CC6600]delay[/color](PROBE_SERVO_DEACTIVATION_DELAY);
- servos[servo_endstops[[color=#006699]Z_AXIS[/color]]].[color=#CC6600]detach[/color]();
- #endif
- }
- #endif
- }
- [color=#CC6600]static[/color] [color=#CC6600]void[/color] retract_z_probe() {
- [color=#7E7E7E]// Retract Z Servo endstop if enabled[/color]
- #ifdef SERVO_ENDSTOPS
- [color=#CC6600]if[/color] (servo_endstops[[color=#006699]Z_AXIS[/color]] > -1) {
- #if defined (ENABLE_AUTO_BED_LEVELING) && (PROBE_SERVO_DEACTIVATION_DELAY > 0)
- servos[servo_endstops[[color=#006699]Z_AXIS[/color]]].[color=#CC6600]attach[/color](0);
- #endif
- servos[servo_endstops[[color=#006699]Z_AXIS[/color]]].[color=#CC6600]write[/color](servo_endstop_angles[[color=#006699]Z_AXIS[/color] * 2 + 1]);
- #if defined (ENABLE_AUTO_BED_LEVELING) && (PROBE_SERVO_DEACTIVATION_DELAY > 0)
- [color=#CC6600]delay[/color](PROBE_SERVO_DEACTIVATION_DELAY);
- servos[servo_endstops[[color=#006699]Z_AXIS[/color]]].[color=#CC6600]detach[/color]();
- #endif
- }
- #endif
- }
- #endif [color=#7E7E7E]// #ifdef ENABLE_AUTO_BED_LEVELING[/color]
- [color=#CC6600]static[/color] [color=#CC6600]void[/color] homeaxis([color=#CC6600]int[/color] axis) {
- #define HOMEAXIS_DO(LETTER) \
- ((LETTER##_MIN_PIN > -1 && LETTER##_HOME_DIR==-1) || (LETTER##_MAX_PIN > -1 && LETTER##_HOME_DIR==1))
- [color=#CC6600]if[/color] (axis==[color=#006699]X_AXIS[/color] ? HOMEAXIS_DO(X) :
- axis==[color=#006699]Y_AXIS[/color] ? HOMEAXIS_DO(Y) :
- axis==[color=#006699]Z_AXIS[/color] ? HOMEAXIS_DO(Z) :
- 0) {
- [color=#CC6600]int[/color] axis_home_dir = home_dir(axis);
- #ifdef DUAL_X_CARRIAGE
- [color=#CC6600]if[/color] (axis == [color=#006699]X_AXIS[/color])
- axis_home_dir = x_home_dir(active_extruder);
- #endif
- current_position[axis] = 0;
- plan_set_position(current_position[[color=#006699]X_AXIS[/color]], current_position[[color=#006699]Y_AXIS[/color]], current_position[[color=#006699]Z_AXIS[/color]], current_position[E_AXIS]);
- [color=#7E7E7E]// Engage Servo endstop if enabled[/color]
- #ifdef SERVO_ENDSTOPS
- #if defined (ENABLE_AUTO_BED_LEVELING) && (PROBE_SERVO_DEACTIVATION_DELAY > 0)
- [color=#CC6600]if[/color] (axis==[color=#006699]Z_AXIS[/color]) {
- engage_z_probe();
- }
- [color=#CC6600]else[/color]
- #endif
- [color=#CC6600]if[/color] (servo_endstops[axis] > -1) {
- servos[servo_endstops[axis]].[color=#CC6600]write[/color](servo_endstop_angles[axis * 2]);
- }
- #endif
- destination[axis] = 1.5 * max_length(axis) * axis_home_dir;
- feedrate = homing_feedrate[axis];
- plan_buffer_line(destination[[color=#006699]X_AXIS[/color]], destination[[color=#006699]Y_AXIS[/color]], destination[[color=#006699]Z_AXIS[/color]], destination[E_AXIS], feedrate/60, active_extruder);
- st_synchronize();
- current_position[axis] = 0;
- plan_set_position(current_position[[color=#006699]X_AXIS[/color]], current_position[[color=#006699]Y_AXIS[/color]], current_position[[color=#006699]Z_AXIS[/color]], current_position[E_AXIS]);
- destination[axis] = -home_retract_mm(axis) * axis_home_dir;
- plan_buffer_line(destination[[color=#006699]X_AXIS[/color]], destination[[color=#006699]Y_AXIS[/color]], destination[[color=#006699]Z_AXIS[/color]], destination[E_AXIS], feedrate/60, active_extruder);
- st_synchronize();
- destination[axis] = 2*home_retract_mm(axis) * axis_home_dir;
- #ifdef DELTA
- feedrate = homing_feedrate[axis]/10;
- #else
- feedrate = homing_feedrate[axis]/2 ;
- #endif
- plan_buffer_line(destination[[color=#006699]X_AXIS[/color]], destination[[color=#006699]Y_AXIS[/color]], destination[[color=#006699]Z_AXIS[/color]], destination[E_AXIS], feedrate/60, active_extruder);
- st_synchronize();
- #ifdef DELTA
- [color=#7E7E7E]// retrace by the amount specified in endstop_adj[/color]
- [color=#CC6600]if[/color] (endstop_adj[axis] * axis_home_dir < 0) {
- plan_set_position(current_position[[color=#006699]X_AXIS[/color]], current_position[[color=#006699]Y_AXIS[/color]], current_position[[color=#006699]Z_AXIS[/color]], current_position[E_AXIS]);
- destination[axis] = endstop_adj[axis];
- plan_buffer_line(destination[[color=#006699]X_AXIS[/color]], destination[[color=#006699]Y_AXIS[/color]], destination[[color=#006699]Z_AXIS[/color]], destination[E_AXIS], feedrate/60, active_extruder);
- st_synchronize();
- }
- #endif
- axis_is_at_home(axis);
- destination[axis] = current_position[axis];
- feedrate = 0.0;
- endstops_hit_on_purpose();
- axis_known_position[axis] = [color=#CC6600]true[/color];
- [color=#7E7E7E]// Retract Servo endstop if enabled[/color]
- #ifdef SERVO_ENDSTOPS
- [color=#CC6600]if[/color] (servo_endstops[axis] > -1) {
- servos[servo_endstops[axis]].[color=#CC6600]write[/color](servo_endstop_angles[axis * 2 + 1]);
- }
- #endif
- #if defined (ENABLE_AUTO_BED_LEVELING) && (PROBE_SERVO_DEACTIVATION_DELAY > 0)
- [color=#CC6600]if[/color] (axis==[color=#006699]Z_AXIS[/color]) {
- }
- #endif
- }
- }
- #define HOMEAXIS(LETTER) homeaxis(LETTER##_AXIS)
- [color=#CC6600]void[/color] process_commands()
- {
- [color=#CC6600]unsigned[/color] [color=#CC6600]long[/color] codenum; [color=#7E7E7E]//throw away variable[/color]
- [color=#CC6600]char[/color] *starpos = NULL;
- #ifdef ENABLE_AUTO_BED_LEVELING
- [color=#CC6600]float[/color] x_tmp, y_tmp, z_tmp, real_z;
- #endif
- [color=#CC6600]if[/color](code_seen([color=#006699]'G'[/color]))
- {
- [color=#CC6600]switch[/color](([color=#CC6600]int[/color])code_value())
- {
- [color=#CC6600]case[/color] 0: [color=#7E7E7E]// G0 -> G1[/color]
- [color=#CC6600]case[/color] 1: [color=#7E7E7E]// G1[/color]
- [color=#CC6600]if[/color](Stopped == [color=#CC6600]false[/color]) {
- get_coordinates(); [color=#7E7E7E]// For X Y Z E F[/color]
- prepare_move();
- [color=#7E7E7E]//ClearToSend();[/color]
- [color=#CC6600]return[/color];
- }
- [color=#7E7E7E]//break;[/color]
- [color=#CC6600]case[/color] 2: [color=#7E7E7E]// G2 - CW ARC[/color]
- [color=#CC6600]if[/color](Stopped == [color=#CC6600]false[/color]) {
- get_arc_coordinates();
- prepare_arc_move([color=#CC6600]true[/color]);
- [color=#CC6600]return[/color];
- }
- [color=#CC6600]case[/color] 3: [color=#7E7E7E]// G3 - CCW ARC[/color]
- [color=#CC6600]if[/color](Stopped == [color=#CC6600]false[/color]) {
- get_arc_coordinates();
- prepare_arc_move([color=#CC6600]false[/color]);
- [color=#CC6600]return[/color];
- }
- [color=#CC6600]case[/color] 4: [color=#7E7E7E]// G4 dwell[/color]
- LCD_MESSAGEPGM(MSG_DWELL);
- codenum = 0;
- [color=#CC6600]if[/color](code_seen([color=#006699]'P'[/color])) codenum = code_value(); [color=#7E7E7E]// milliseconds to wait[/color]
- [color=#CC6600]if[/color](code_seen([color=#006699]'S'[/color])) codenum = code_value() * 1000; [color=#7E7E7E]// seconds to wait[/color]
- st_synchronize();
- codenum += [color=#CC6600]millis[/color](); [color=#7E7E7E]// keep track of when we started waiting[/color]
- previous_millis_cmd = [color=#CC6600]millis[/color]();
- [color=#CC6600]while[/color]([color=#CC6600]millis[/color]() < codenum ){
- manage_heater();
- manage_inactivity();
- lcd_update();
- }
- [color=#CC6600]break[/color];
- #ifdef FWRETRACT
- [color=#CC6600]case[/color] 10: [color=#7E7E7E]// G10 retract[/color]
- [color=#CC6600]if[/color](!retracted)
- {
- destination[[color=#006699]X_AXIS[/color]]=current_position[[color=#006699]X_AXIS[/color]];
- destination[[color=#006699]Y_AXIS[/color]]=current_position[[color=#006699]Y_AXIS[/color]];
- destination[[color=#006699]Z_AXIS[/color]]=current_position[[color=#006699]Z_AXIS[/color]];
- current_position[[color=#006699]Z_AXIS[/color]]-=retract_zlift;
- destination[E_AXIS]=current_position[E_AXIS];
- current_position[E_AXIS]+=retract_length/volumetric_multiplier[active_extruder];
- plan_set_e_position(current_position[E_AXIS]);
- [color=#CC6600]float[/color] oldFeedrate = feedrate;
- feedrate=retract_feedrate;
- retracted=[color=#CC6600]true[/color];
- prepare_move();
- feedrate = oldFeedrate;
- }
- [color=#CC6600]break[/color];
- [color=#CC6600]case[/color] 11: [color=#7E7E7E]// G11 retract_recover[/color]
- [color=#CC6600]if[/color](retracted)
- {
- destination[[color=#006699]X_AXIS[/color]]=current_position[[color=#006699]X_AXIS[/color]];
- destination[[color=#006699]Y_AXIS[/color]]=current_position[[color=#006699]Y_AXIS[/color]];
- destination[[color=#006699]Z_AXIS[/color]]=current_position[[color=#006699]Z_AXIS[/color]];
- current_position[[color=#006699]Z_AXIS[/color]]+=retract_zlift;
- destination[E_AXIS]=current_position[E_AXIS];
- current_position[E_AXIS]-=(retract_length+retract_recover_length)/volumetric_multiplier[active_extruder];
- plan_set_e_position(current_position[E_AXIS]);
- [color=#CC6600]float[/color] oldFeedrate = feedrate;
- feedrate=retract_recover_feedrate;
- retracted=[color=#CC6600]false[/color];
- prepare_move();
- feedrate = oldFeedrate;
- }
- [color=#CC6600]break[/color];
- #endif [color=#7E7E7E]//FWRETRACT[/color]
- [color=#CC6600]case[/color] 28: [color=#7E7E7E]//G28 Home all Axis one at a time[/color]
- #ifdef ENABLE_AUTO_BED_LEVELING
- plan_bed_level_matrix.set_to_identity(); [color=#7E7E7E]//Reset the plane ("erase" all leveling data)[/color]
- #endif [color=#7E7E7E]//ENABLE_AUTO_BED_LEVELING[/color]
- saved_feedrate = feedrate;
- saved_feedmultiply = feedmultiply;
- feedmultiply = 100;
- previous_millis_cmd = [color=#CC6600]millis[/color]();
- enable_endstops([color=#CC6600]true[/color]);
- [color=#CC6600]for[/color](int8_t i=0; i < NUM_AXIS; i++) {
- destination[i] = current_position[i];
- }
- feedrate = 0.0;
- #ifdef DELTA
- [color=#7E7E7E]// A delta can only safely home all axis at the same time[/color]
- [color=#7E7E7E]// all axis have to home at the same time[/color]
- [color=#7E7E7E]// Move all carriages up together until the first endstop is hit.[/color]
- current_position[[color=#006699]X_AXIS[/color]] = 0;
- current_position[[color=#006699]Y_AXIS[/color]] = 0;
- current_position[[color=#006699]Z_AXIS[/color]] = 0;
- plan_set_position(current_position[[color=#006699]X_AXIS[/color]], current_position[[color=#006699]Y_AXIS[/color]], current_position[[color=#006699]Z_AXIS[/color]], current_position[E_AXIS]);
- destination[[color=#006699]X_AXIS[/color]] = 3 * Z_MAX_LENGTH;
- destination[[color=#006699]Y_AXIS[/color]] = 3 * Z_MAX_LENGTH;
- destination[[color=#006699]Z_AXIS[/color]] = 3 * Z_MAX_LENGTH;
- feedrate = 1.732 * homing_feedrate[[color=#006699]X_AXIS[/color]];
- plan_buffer_line(destination[[color=#006699]X_AXIS[/color]], destination[[color=#006699]Y_AXIS[/color]], destination[[color=#006699]Z_AXIS[/color]], destination[E_AXIS], feedrate/60, active_extruder);
- st_synchronize();
- endstops_hit_on_purpose();
- current_position[[color=#006699]X_AXIS[/color]] = destination[[color=#006699]X_AXIS[/color]];
- current_position[[color=#006699]Y_AXIS[/color]] = destination[[color=#006699]Y_AXIS[/color]];
- current_position[[color=#006699]Z_AXIS[/color]] = destination[[color=#006699]Z_AXIS[/color]];
- [color=#7E7E7E]// take care of back off and rehome now we are all at the top[/color]
- HOMEAXIS(X);
- HOMEAXIS(Y);
- HOMEAXIS(Z);
- calculate_delta(current_position);
- plan_set_position(delta[[color=#006699]X_AXIS[/color]], delta[[color=#006699]Y_AXIS[/color]], delta[[color=#006699]Z_AXIS[/color]], current_position[E_AXIS]);
- #else [color=#7E7E7E]// NOT DELTA[/color]
- home_all_axis = !((code_seen(axis_codes[0])) || (code_seen(axis_codes[1])) || (code_seen(axis_codes[2])));
- #if Z_HOME_DIR > 0 [color=#7E7E7E]// If homing away from BED do Z first[/color]
- [color=#CC6600]if[/color]((home_all_axis) || (code_seen(axis_codes[[color=#006699]Z_AXIS[/color]]))) {
- HOMEAXIS(Z);
- }
- #endif
- #ifdef QUICK_HOME
- [color=#CC6600]if[/color]((home_all_axis)||( code_seen(axis_codes[[color=#006699]X_AXIS[/color]]) && code_seen(axis_codes[[color=#006699]Y_AXIS[/color]])) ) [color=#7E7E7E]//first diagonal move[/color]
- {
- current_position[[color=#006699]X_AXIS[/color]] = 0;current_position[[color=#006699]Y_AXIS[/color]] = 0;
- #ifndef DUAL_X_CARRIAGE
- [color=#CC6600]int[/color] x_axis_home_dir = home_dir([color=#006699]X_AXIS[/color]);
- #else
- [color=#CC6600]int[/color] x_axis_home_dir = x_home_dir(active_extruder);
- extruder_duplication_enabled = [color=#CC6600]false[/color];
- #endif
- plan_set_position(current_position[[color=#006699]X_AXIS[/color]], current_position[[color=#006699]Y_AXIS[/color]], current_position[[color=#006699]Z_AXIS[/color]], current_position[E_AXIS]);
- destination[[color=#006699]X_AXIS[/color]] = 1.5 * max_length([color=#006699]X_AXIS[/color]) * x_axis_home_dir;destination[[color=#006699]Y_AXIS[/color]] = 1.5 * max_length([color=#006699]Y_AXIS[/color]) * home_dir([color=#006699]Y_AXIS[/color]);
- feedrate = homing_feedrate[[color=#006699]X_AXIS[/color]];
- [color=#CC6600]if[/color](homing_feedrate[[color=#006699]Y_AXIS[/color]]<feedrate)
- feedrate =homing_feedrate[[color=#006699]Y_AXIS[/color]];
- plan_buffer_line(destination[[color=#006699]X_AXIS[/color]], destination[[color=#006699]Y_AXIS[/color]], destination[[color=#006699]Z_AXIS[/color]], destination[E_AXIS], feedrate/60, active_extruder);
- st_synchronize();
- axis_is_at_home([color=#006699]X_AXIS[/color]);
- axis_is_at_home([color=#006699]Y_AXIS[/color]);
- plan_set_position(current_position[[color=#006699]X_AXIS[/color]], current_position[[color=#006699]Y_AXIS[/color]], current_position[[color=#006699]Z_AXIS[/color]], current_position[E_AXIS]);
- destination[[color=#006699]X_AXIS[/color]] = current_position[[color=#006699]X_AXIS[/color]];
- destination[[color=#006699]Y_AXIS[/color]] = current_position[[color=#006699]Y_AXIS[/color]];
- plan_buffer_line(destination[[color=#006699]X_AXIS[/color]], destination[[color=#006699]Y_AXIS[/color]], destination[[color=#006699]Z_AXIS[/color]], destination[E_AXIS], feedrate/60, active_extruder);
- feedrate = 0.0;
- st_synchronize();
- endstops_hit_on_purpose();
- current_position[[color=#006699]X_AXIS[/color]] = destination[[color=#006699]X_AXIS[/color]];
- current_position[[color=#006699]Y_AXIS[/color]] = destination[[color=#006699]Y_AXIS[/color]];
- current_position[[color=#006699]Z_AXIS[/color]] = destination[[color=#006699]Z_AXIS[/color]];
- }
- #endif
- [color=#CC6600]if[/color]((home_all_axis) || (code_seen(axis_codes[[color=#006699]X_AXIS[/color]])))
- {
- #ifdef DUAL_X_CARRIAGE
- [color=#CC6600]int[/color] tmp_extruder = active_extruder;
- extruder_duplication_enabled = [color=#CC6600]false[/color];
- active_extruder = !active_extruder;
- HOMEAXIS(X);
- inactive_extruder_x_pos = current_position[[color=#006699]X_AXIS[/color]];
- active_extruder = tmp_extruder;
- HOMEAXIS(X);
- [color=#7E7E7E]// reset state used by the different modes[/color]
- memcpy(raised_parked_position, current_position, sizeof(raised_parked_position));
- delayed_move_time = 0;
- active_extruder_parked = [color=#CC6600]true[/color];
- #else
- HOMEAXIS(X);
- #endif
- }
- [color=#CC6600]if[/color]((home_all_axis) || (code_seen(axis_codes[[color=#006699]Y_AXIS[/color]]))) {
- HOMEAXIS(Y);
- }
- [color=#CC6600]if[/color](code_seen(axis_codes[[color=#006699]X_AXIS[/color]]))
- {
- [color=#CC6600]if[/color](code_value_long() != 0) {
- current_position[[color=#006699]X_AXIS[/color]]=code_value()+add_homeing[0];
- }
- }
- [color=#CC6600]if[/color](code_seen(axis_codes[[color=#006699]Y_AXIS[/color]])) {
- [color=#CC6600]if[/color](code_value_long() != 0) {
- current_position[[color=#006699]Y_AXIS[/color]]=code_value()+add_homeing[1];
- }
- }
- #if Z_HOME_DIR < 0 [color=#7E7E7E]// If homing towards BED do Z last[/color]
- #ifndef Z_SAFE_HOMING
- [color=#CC6600]if[/color]((home_all_axis) || (code_seen(axis_codes[[color=#006699]Z_AXIS[/color]]))) {
- #if defined (Z_RAISE_BEFORE_HOMING) && (Z_RAISE_BEFORE_HOMING > 0)
- destination[[color=#006699]Z_AXIS[/color]] = Z_RAISE_BEFORE_HOMING * home_dir([color=#006699]Z_AXIS[/color]) * (-1); [color=#7E7E7E]// Set destination away from bed[/color]
- feedrate = max_feedrate[[color=#006699]Z_AXIS[/color]];
- plan_buffer_line(destination[[color=#006699]X_AXIS[/color]], destination[[color=#006699]Y_AXIS[/color]], destination[[color=#006699]Z_AXIS[/color]], destination[E_AXIS], feedrate, active_extruder);
- st_synchronize();
- #endif
- HOMEAXIS(Z);
- }
- #else [color=#7E7E7E]// Z Safe mode activated.[/color]
- [color=#CC6600]if[/color](home_all_axis) {
- destination[[color=#006699]X_AXIS[/color]] = [color=#CC6600]round[/color](Z_SAFE_HOMING_X_POINT - X_PROBE_OFFSET_FROM_EXTRUDER);
- destination[[color=#006699]Y_AXIS[/color]] = [color=#CC6600]round[/color](Z_SAFE_HOMING_Y_POINT - Y_PROBE_OFFSET_FROM_EXTRUDER);
- destination[[color=#006699]Z_AXIS[/color]] = Z_RAISE_BEFORE_HOMING * home_dir([color=#006699]Z_AXIS[/color]) * (-1); [color=#7E7E7E]// Set destination away from bed[/color]
- feedrate = XY_TRAVEL_SPEED;
- current_position[[color=#006699]Z_AXIS[/color]] = 0;
- plan_set_position(current_position[[color=#006699]X_AXIS[/color]], current_position[[color=#006699]Y_AXIS[/color]], current_position[[color=#006699]Z_AXIS[/color]], current_position[E_AXIS]);
- plan_buffer_line(destination[[color=#006699]X_AXIS[/color]], destination[[color=#006699]Y_AXIS[/color]], destination[[color=#006699]Z_AXIS[/color]], destination[E_AXIS], feedrate, active_extruder);
- st_synchronize();
- current_position[[color=#006699]X_AXIS[/color]] = destination[[color=#006699]X_AXIS[/color]];
- current_position[[color=#006699]Y_AXIS[/color]] = destination[[color=#006699]Y_AXIS[/color]];
- HOMEAXIS(Z);
- }
- [color=#7E7E7E]// Let's see if X and Y are homed and probe is inside bed area.[/color]
- [color=#CC6600]if[/color](code_seen(axis_codes[[color=#006699]Z_AXIS[/color]])) {
- [color=#CC6600]if[/color] ( (axis_known_position[[color=#006699]X_AXIS[/color]]) && (axis_known_position[[color=#006699]Y_AXIS[/color]]) \
- && (current_position[[color=#006699]X_AXIS[/color]]+X_PROBE_OFFSET_FROM_EXTRUDER >= X_MIN_POS) \
- && (current_position[[color=#006699]X_AXIS[/color]]+X_PROBE_OFFSET_FROM_EXTRUDER <= X_MAX_POS) \
- && (current_position[[color=#006699]Y_AXIS[/color]]+Y_PROBE_OFFSET_FROM_EXTRUDER >= Y_MIN_POS) \
- && (current_position[[color=#006699]Y_AXIS[/color]]+Y_PROBE_OFFSET_FROM_EXTRUDER <= Y_MAX_POS)) {
- current_position[[color=#006699]Z_AXIS[/color]] = 0;
- plan_set_position(current_position[[color=#006699]X_AXIS[/color]], current_position[[color=#006699]Y_AXIS[/color]], current_position[[color=#006699]Z_AXIS[/color]], current_position[E_AXIS]);
- destination[[color=#006699]Z_AXIS[/color]] = Z_RAISE_BEFORE_HOMING * home_dir([color=#006699]Z_AXIS[/color]) * (-1); [color=#7E7E7E]// Set destination away from bed[/color]
- feedrate = max_feedrate[[color=#006699]Z_AXIS[/color]];
- plan_buffer_line(destination[[color=#006699]X_AXIS[/color]], destination[[color=#006699]Y_AXIS[/color]], destination[[color=#006699]Z_AXIS[/color]], destination[E_AXIS], feedrate, active_extruder);
- st_synchronize();
- HOMEAXIS(Z);
- } [color=#CC6600]else[/color] [color=#CC6600]if[/color] (!((axis_known_position[[color=#006699]X_AXIS[/color]]) && (axis_known_position[[color=#006699]Y_AXIS[/color]]))) {
- LCD_MESSAGEPGM(MSG_POSITION_UNKNOWN);
- SERIAL_ECHO_START;
- SERIAL_ECHOLNPGM(MSG_POSITION_UNKNOWN);
- } [color=#CC6600]else[/color] {
- LCD_MESSAGEPGM(MSG_ZPROBE_OUT);
- SERIAL_ECHO_START;
- SERIAL_ECHOLNPGM(MSG_ZPROBE_OUT);
- }
- }
- #endif
- #endif
- [color=#CC6600]if[/color](code_seen(axis_codes[[color=#006699]Z_AXIS[/color]])) {
- [color=#CC6600]if[/color](code_value_long() != 0) {
- current_position[[color=#006699]Z_AXIS[/color]]=code_value()+add_homeing[2];
- }
- }
- #ifdef ENABLE_AUTO_BED_LEVELING
- [color=#CC6600]if[/color]((home_all_axis) || (code_seen(axis_codes[[color=#006699]Z_AXIS[/color]]))) {
- current_position[[color=#006699]Z_AXIS[/color]] += zprobe_zoffset; [color=#7E7E7E]//Add Z_Probe offset (the distance is negative)[/color]
- }
- #endif
- plan_set_position(current_position[[color=#006699]X_AXIS[/color]], current_position[[color=#006699]Y_AXIS[/color]], current_position[[color=#006699]Z_AXIS[/color]], current_position[E_AXIS]);
- #endif [color=#7E7E7E]// else DELTA[/color]
- #ifdef ENDSTOPS_ONLY_FOR_HOMING
- enable_endstops([color=#CC6600]false[/color]);
- #endif
- feedrate = saved_feedrate;
- feedmultiply = saved_feedmultiply;
- previous_millis_cmd = [color=#CC6600]millis[/color]();
- endstops_hit_on_purpose();
- [color=#CC6600]break[/color];
- #ifdef ENABLE_AUTO_BED_LEVELING
- [color=#CC6600]case[/color] 29: [color=#7E7E7E]// G29 Detailed Z-Probe, probes the bed at 3 points.[/color]
- {
- #if Z_MIN_PIN == -1
- #error [color=#006699]"You must have a Z_MIN endstop in order to enable Auto Bed Leveling feature!!! Z_MIN_PIN must point to a valid hardware pin."[/color]
- #endif
- st_synchronize();
- [color=#7E7E7E]// make sure the bed_level_rotation_matrix is identity or the planner will get it incorectly[/color]
- [color=#7E7E7E]//vector_3 corrected_position = plan_get_position_mm();[/color]
- [color=#7E7E7E]//corrected_position.debug("position before G29");[/color]
- plan_bed_level_matrix.set_to_identity();
- vector_3 uncorrected_position = plan_get_position();
- [color=#7E7E7E]//uncorrected_position.debug("position durring G29");[/color]
- current_position[[color=#006699]X_AXIS[/color]] = uncorrected_position.x;
- current_position[[color=#006699]Y_AXIS[/color]] = uncorrected_position.y;
- current_position[[color=#006699]Z_AXIS[/color]] = uncorrected_position.z;
- plan_set_position(current_position[[color=#006699]X_AXIS[/color]], current_position[[color=#006699]Y_AXIS[/color]], current_position[[color=#006699]Z_AXIS[/color]], current_position[E_AXIS]);
- setup_for_endstop_move();
- feedrate = homing_feedrate[[color=#006699]Z_AXIS[/color]];
- #ifdef ACCURATE_BED_LEVELING
- [color=#CC6600]int[/color] xGridSpacing = (RIGHT_PROBE_BED_POSITION - LEFT_PROBE_BED_POSITION) / (ACCURATE_BED_LEVELING_POINTS-1);
- [color=#CC6600]int[/color] yGridSpacing = (BACK_PROBE_BED_POSITION - FRONT_PROBE_BED_POSITION) / (ACCURATE_BED_LEVELING_POINTS-1);
- [color=#7E7E7E]// solve the plane equation ax + by + d = z[/color]
- [color=#7E7E7E]// A is the matrix with rows [x y 1] for all the probed points[/color]
- [color=#7E7E7E]// B is the vector of the Z positions[/color]
- [color=#7E7E7E]// the normal vector to the plane is formed by the coefficients of the plane equation in the standard form, which is Vx*x+Vy*y+Vz*z+d = 0[/color]
- [color=#7E7E7E]// so Vx = -a Vy = -b Vz = 1 (we want the vector facing towards positive Z[/color]
- [color=#7E7E7E]// "A" matrix of the linear system of equations[/color]
- [color=#CC6600]double[/color] eqnAMatrix[ACCURATE_BED_LEVELING_POINTS*ACCURATE_BED_LEVELING_POINTS*3];
- [color=#7E7E7E]// "B" vector of Z points[/color]
- [color=#CC6600]double[/color] eqnBVector[ACCURATE_BED_LEVELING_POINTS*ACCURATE_BED_LEVELING_POINTS];
- [color=#CC6600]int[/color] probePointCounter = 0;
- bool zig = [color=#CC6600]true[/color];
- [color=#CC6600]for[/color] ([color=#CC6600]int[/color] yProbe=FRONT_PROBE_BED_POSITION; yProbe <= BACK_PROBE_BED_POSITION; yProbe += yGridSpacing)
- {
- [color=#CC6600]int[/color] xProbe, xInc;
- [color=#CC6600]if[/color] (zig)
- {
- xProbe = LEFT_PROBE_BED_POSITION;
- [color=#7E7E7E]//xEnd = RIGHT_PROBE_BED_POSITION;[/color]
- xInc = xGridSpacing;
- zig = [color=#CC6600]false[/color];
- } [color=#CC6600]else[/color] [color=#7E7E7E]// zag[/color]
- {
- xProbe = RIGHT_PROBE_BED_POSITION;
- [color=#7E7E7E]//xEnd = LEFT_PROBE_BED_POSITION;[/color]
- xInc = -xGridSpacing;
- zig = [color=#CC6600]true[/color];
- }
- [color=#CC6600]for[/color] ([color=#CC6600]int[/color] xCount=0; xCount < ACCURATE_BED_LEVELING_POINTS; xCount++)
- {
- [color=#CC6600]if[/color] (probePointCounter == 0)
- {
- [color=#7E7E7E]// raise before probing[/color]
- do_blocking_move_to(current_position[[color=#006699]X_AXIS[/color]], current_position[[color=#006699]Y_AXIS[/color]], current_position[[color=#006699]Z_AXIS[/color]] + Z_RAISE_BEFORE_PROBING);
- } [color=#CC6600]else[/color]
- {
- [color=#7E7E7E]// raise extruder[/color]
- do_blocking_move_to(current_position[[color=#006699]X_AXIS[/color]], current_position[[color=#006699]Y_AXIS[/color]], current_position[[color=#006699]Z_AXIS[/color]] + Z_RAISE_BETWEEN_PROBINGS);
- }
- do_blocking_move_to(xProbe - X_PROBE_OFFSET_FROM_EXTRUDER, yProbe - Y_PROBE_OFFSET_FROM_EXTRUDER, current_position[[color=#006699]Z_AXIS[/color]]);
- engage_z_probe(); [color=#7E7E7E]// Engage Z Servo endstop if available[/color]
- run_z_probe();
- eqnBVector[probePointCounter] = current_position[[color=#006699]Z_AXIS[/color]];
- do_blocking_move_to(current_position[[color=#006699]X_AXIS[/color]], current_position[[color=#006699]Y_AXIS[/color]], current_position[[color=#006699]Z_AXIS[/color]] + 1);
- retract_z_probe();
- SERIAL_PROTOCOLPGM([color=#006699]"Bed x: "[/color]);
- SERIAL_PROTOCOL(xProbe);
- SERIAL_PROTOCOLPGM([color=#006699]" y: "[/color]);
- SERIAL_PROTOCOL(yProbe);
- SERIAL_PROTOCOLPGM([color=#006699]" z: "[/color]);
- SERIAL_PROTOCOL(current_position[[color=#006699]Z_AXIS[/color]]);
- SERIAL_PROTOCOLPGM([color=#006699]"\n"[/color]);
- eqnAMatrix[probePointCounter + 0*ACCURATE_BED_LEVELING_POINTS*ACCURATE_BED_LEVELING_POINTS] = xProbe;
- eqnAMatrix[probePointCounter + 1*ACCURATE_BED_LEVELING_POINTS*ACCURATE_BED_LEVELING_POINTS] = yProbe;
- eqnAMatrix[probePointCounter + 2*ACCURATE_BED_LEVELING_POINTS*ACCURATE_BED_LEVELING_POINTS] = 1;
- probePointCounter++;
- xProbe += xInc;
- }
- }
- clean_up_after_endstop_move();
- [color=#7E7E7E]// solve lsq problem[/color]
- [color=#CC6600]double[/color] *plane_equation_coefficients = qr_solve(ACCURATE_BED_LEVELING_POINTS*ACCURATE_BED_LEVELING_POINTS, 3, eqnAMatrix, eqnBVector);
- SERIAL_PROTOCOLPGM([color=#006699]"Eqn coefficients: a: "[/color]);
- SERIAL_PROTOCOL(plane_equation_coefficients[0]);
- SERIAL_PROTOCOLPGM([color=#006699]" b: "[/color]);
- SERIAL_PROTOCOL(plane_equation_coefficients[1]);
- SERIAL_PROTOCOLPGM([color=#006699]" d: "[/color]);
- SERIAL_PROTOCOLLN(plane_equation_coefficients[2]);
- set_bed_level_equation_lsq(plane_equation_coefficients);
- free(plane_equation_coefficients);
- #else [color=#7E7E7E]// ACCURATE_BED_LEVELING not defined[/color]
- [color=#7E7E7E]// prob 1[/color]
- do_blocking_move_to(current_position[[color=#006699]X_AXIS[/color]], current_position[[color=#006699]Y_AXIS[/color]], Z_RAISE_BEFORE_PROBING);
- do_blocking_move_to(LEFT_PROBE_BED_POSITION - X_PROBE_OFFSET_FROM_EXTRUDER, BACK_PROBE_BED_POSITION - Y_PROBE_OFFSET_FROM_EXTRUDER, current_position[[color=#006699]Z_AXIS[/color]]);
- engage_z_probe(); [color=#7E7E7E]// Engage Z Servo endstop if available[/color]
- run_z_probe();
- [color=#CC6600]float[/color] z_at_xLeft_yBack = current_position[[color=#006699]Z_AXIS[/color]];
- do_blocking_move_to(current_position[[color=#006699]X_AXIS[/color]], current_position[[color=#006699]Y_AXIS[/color]], current_position[[color=#006699]Z_AXIS[/color]] + 1);
- retract_z_probe();
- SERIAL_PROTOCOLPGM([color=#006699]"Bed x: "[/color]);
- SERIAL_PROTOCOL(LEFT_PROBE_BED_POSITION);
- SERIAL_PROTOCOLPGM([color=#006699]" y: "[/color]);
- SERIAL_PROTOCOL(BACK_PROBE_BED_POSITION);
- SERIAL_PROTOCOLPGM([color=#006699]" z: "[/color]);
- SERIAL_PROTOCOL(current_position[[color=#006699]Z_AXIS[/color]]);
- SERIAL_PROTOCOLPGM([color=#006699]"\n"[/color]);
- [color=#7E7E7E]// prob 2[/color]
- do_blocking_move_to(current_position[[color=#006699]X_AXIS[/color]], current_position[[color=#006699]Y_AXIS[/color]], current_position[[color=#006699]Z_AXIS[/color]] + Z_RAISE_BETWEEN_PROBINGS);
- do_blocking_move_to(LEFT_PROBE_BED_POSITION - X_PROBE_OFFSET_FROM_EXTRUDER, FRONT_PROBE_BED_POSITION - Y_PROBE_OFFSET_FROM_EXTRUDER, current_position[[color=#006699]Z_AXIS[/color]]);
- engage_z_probe(); [color=#7E7E7E]// Engage Z Servo endstop if available[/color]
- run_z_probe();
- [color=#CC6600]float[/color] z_at_xLeft_yFront = current_position[[color=#006699]Z_AXIS[/color]];
- do_blocking_move_to(current_position[[color=#006699]X_AXIS[/color]], current_position[[color=#006699]Y_AXIS[/color]], current_position[[color=#006699]Z_AXIS[/color]] + 1);
- retract_z_probe();
- SERIAL_PROTOCOLPGM([color=#006699]"Bed x: "[/color]);
- SERIAL_PROTOCOL(LEFT_PROBE_BED_POSITION);
- SERIAL_PROTOCOLPGM([color=#006699]" y: "[/color]);
- SERIAL_PROTOCOL(FRONT_PROBE_BED_POSITION);
- SERIAL_PROTOCOLPGM([color=#006699]" z: "[/color]);
- SERIAL_PROTOCOL(current_position[[color=#006699]Z_AXIS[/color]]);
- SERIAL_PROTOCOLPGM([color=#006699]"\n"[/color]);
- [color=#7E7E7E]// prob 3[/color]
- do_blocking_move_to(current_position[[color=#006699]X_AXIS[/color]], current_position[[color=#006699]Y_AXIS[/color]], current_position[[color=#006699]Z_AXIS[/color]] + Z_RAISE_BETWEEN_PROBINGS);
- [color=#7E7E7E]// the current position will be updated by the blocking move so the head will not lower on this next call.[/color]
- do_blocking_move_to(RIGHT_PROBE_BED_POSITION - X_PROBE_OFFSET_FROM_EXTRUDER, FRONT_PROBE_BED_POSITION - Y_PROBE_OFFSET_FROM_EXTRUDER, current_position[[color=#006699]Z_AXIS[/color]]);
- engage_z_probe(); [color=#7E7E7E]// Engage Z Servo endstop if available[/color]
- run_z_probe();
- [color=#CC6600]float[/color] z_at_xRight_yFront = current_position[[color=#006699]Z_AXIS[/color]];
- do_blocking_move_to(current_position[[color=#006699]X_AXIS[/color]], current_position[[color=#006699]Y_AXIS[/color]], current_position[[color=#006699]Z_AXIS[/color]] + 1);
- retract_z_probe(); [color=#7E7E7E]// Retract Z Servo endstop if available[/color]
- SERIAL_PROTOCOLPGM([color=#006699]"Bed x: "[/color]);
- SERIAL_PROTOCOL(RIGHT_PROBE_BED_POSITION);
- SERIAL_PROTOCOLPGM([color=#006699]" y: "[/color]);
- SERIAL_PROTOCOL(FRONT_PROBE_BED_POSITION);
- SERIAL_PROTOCOLPGM([color=#006699]" z: "[/color]);
- SERIAL_PROTOCOL(current_position[[color=#006699]Z_AXIS[/color]]);
- SERIAL_PROTOCOLPGM([color=#006699]"\n"[/color]);
- clean_up_after_endstop_move();
- set_bed_level_equation(z_at_xLeft_yFront, z_at_xRight_yFront, z_at_xLeft_yBack);
- #endif [color=#7E7E7E]// ACCURATE_BED_LEVELING[/color]
- st_synchronize();
- [color=#7E7E7E]// The following code correct the Z height difference from z-probe position and hotend tip position.[/color]
- [color=#7E7E7E]// The Z height on homing is measured by Z-Probe, but the probe is quite far from the hotend.[/color]
- [color=#7E7E7E]// When the bed is uneven, this height must be corrected.[/color]
- real_z = [color=#CC6600]float[/color](st_get_position([color=#006699]Z_AXIS[/color]))/axis_steps_per_unit[[color=#006699]Z_AXIS[/color]]; [color=#7E7E7E]//get the real Z (since the auto bed leveling is already correcting the plane)[/color]
- x_tmp = current_position[[color=#006699]X_AXIS[/color]] + X_PROBE_OFFSET_FROM_EXTRUDER;
- y_tmp = current_position[[color=#006699]Y_AXIS[/color]] + Y_PROBE_OFFSET_FROM_EXTRUDER;
- z_tmp = current_position[[color=#006699]Z_AXIS[/color]];
- apply_rotation_xyz(plan_bed_level_matrix, x_tmp, y_tmp, z_tmp); [color=#7E7E7E]//Apply the correction sending the probe offset[/color]
- current_position[[color=#006699]Z_AXIS[/color]] = z_tmp - real_z + current_position[[color=#006699]Z_AXIS[/color]]; [color=#7E7E7E]//The difference is added to current position and sent to planner.[/color]
- plan_set_position(current_position[[color=#006699]X_AXIS[/color]], current_position[[color=#006699]Y_AXIS[/color]], current_position[[color=#006699]Z_AXIS[/color]], current_position[E_AXIS]);
- }
- [color=#CC6600]break[/color];
- [color=#CC6600]case[/color] 30: [color=#7E7E7E]// G30 Single Z Probe[/color]
- {
- engage_z_probe(); [color=#7E7E7E]// Engage Z Servo endstop if available[/color]
- st_synchronize();
- [color=#7E7E7E]// TODO: make sure the bed_level_rotation_matrix is identity or the planner will get set incorectly[/color]
- setup_for_endstop_move();
- feedrate = homing_feedrate[[color=#006699]Z_AXIS[/color]];
- run_z_probe();
- SERIAL_PROTOCOLPGM([color=#006699]"Bed Position X: "[/color]);
- SERIAL_PROTOCOL(current_position[[color=#006699]X_AXIS[/color]]);
- SERIAL_PROTOCOLPGM([color=#006699]" Y: "[/color]);
- SERIAL_PROTOCOL(current_position[[color=#006699]Y_AXIS[/color]]);
- SERIAL_PROTOCOLPGM([color=#006699]" Z: "[/color]);
- SERIAL_PROTOCOL(current_position[[color=#006699]Z_AXIS[/color]]);
- SERIAL_PROTOCOLPGM([color=#006699]"\n"[/color]);
- clean_up_after_endstop_move();
- do_blocking_move_to(current_position[[color=#006699]X_AXIS[/color]], current_position[[color=#006699]Y_AXIS[/color]], current_position[[color=#006699]Z_AXIS[/color]] + 1);
- retract_z_probe(); [color=#7E7E7E]// Retract Z Servo endstop if available[/color]
- }
- [color=#CC6600]break[/color];
- #endif [color=#7E7E7E]// ENABLE_AUTO_BED_LEVELING[/color]
- [color=#CC6600]case[/color] 90: [color=#7E7E7E]// G90[/color]
- relative_mode = [color=#CC6600]false[/color];
- [color=#CC6600]break[/color];
- [color=#CC6600]case[/color] 91: [color=#7E7E7E]// G91[/color]
- relative_mode = [color=#CC6600]true[/color];
- [color=#CC6600]break[/color];
- [color=#CC6600]case[/color] 92: [color=#7E7E7E]// G92[/color]
- [color=#CC6600]if[/color](!code_seen(axis_codes[E_AXIS]))
- st_synchronize();
- [color=#CC6600]for[/color](int8_t i=0; i < NUM_AXIS; i++) {
- [color=#CC6600]if[/color](code_seen(axis_codes[i])) {
- [color=#CC6600]if[/color](i == E_AXIS) {
- current_position[i] = code_value();
- plan_set_e_position(current_position[E_AXIS]);
- }
- [color=#CC6600]else[/color] {
- current_position[i] = code_value()+add_homeing[i];
- plan_set_position(current_position[[color=#006699]X_AXIS[/color]], current_position[[color=#006699]Y_AXIS[/color]], current_position[[color=#006699]Z_AXIS[/color]], current_position[E_AXIS]);
- }
- }
- }
- [color=#CC6600]break[/color];
- }
- }
- [color=#CC6600]else[/color] [color=#CC6600]if[/color](code_seen([color=#006699]'M'[/color]))
- {
- [color=#CC6600]switch[/color]( ([color=#CC6600]int[/color])code_value() )
- {
- #ifdef ULTIPANEL
- [color=#CC6600]case[/color] 0: [color=#7E7E7E]// M0 - Unconditional stop - Wait for user button press on LCD[/color]
- [color=#CC6600]case[/color] 1: [color=#7E7E7E]// M1 - Conditional stop - Wait for user button press on LCD[/color]
- {
- LCD_MESSAGEPGM(MSG_USERWAIT);
- codenum = 0;
- [color=#CC6600]if[/color](code_seen([color=#006699]'P'[/color])) codenum = code_value(); [color=#7E7E7E]// milliseconds to wait[/color]
- [color=#CC6600]if[/color](code_seen([color=#006699]'S'[/color])) codenum = code_value() * 1000; [color=#7E7E7E]// seconds to wait[/color]
- st_synchronize();
- previous_millis_cmd = [color=#CC6600]millis[/color]();
- [color=#CC6600]if[/color] (codenum > 0){
- codenum += [color=#CC6600]millis[/color](); [color=#7E7E7E]// keep track of when we started waiting[/color]
- [color=#CC6600]while[/color]([color=#CC6600]millis[/color]() < codenum && !lcd_clicked()){
- manage_heater();
- manage_inactivity();
- lcd_update();
- }
- }[color=#CC6600]else[/color]{
- [color=#CC6600]while[/color](!lcd_clicked()){
- manage_heater();
- manage_inactivity();
- lcd_update();
- }
- }
- LCD_MESSAGEPGM(MSG_RESUMING);
- }
- [color=#CC6600]break[/color];
- #endif
- [color=#CC6600]case[/color] 17:
- LCD_MESSAGEPGM(MSG_NO_MOVE);
- enable_x();
- enable_y();
- enable_z();
- enable_e0();
- enable_e1();
- enable_e2();
- [color=#CC6600]break[/color];
- #ifdef SDSUPPORT
- [color=#CC6600]case[/color] 20: [color=#7E7E7E]// M20 - list SD card[/color]
- SERIAL_PROTOCOLLNPGM(MSG_BEGIN_FILE_LIST);
- card.ls();
- SERIAL_PROTOCOLLNPGM(MSG_END_FILE_LIST);
- [color=#CC6600]break[/color];
- [color=#CC6600]case[/color] 21: [color=#7E7E7E]// M21 - init SD card[/color]
- card.initsd();
- [color=#CC6600]break[/color];
- [color=#CC6600]case[/color] 22: [color=#7E7E7E]//M22 - release SD card[/color]
- card.[color=#CC6600]release[/color]();
- [color=#CC6600]break[/color];
- [color=#CC6600]case[/color] 23: [color=#7E7E7E]//M23 - Select file[/color]
- starpos = (strchr(strchr_pointer + 4,[color=#006699]'*'[/color]));
- [color=#CC6600]if[/color](starpos!=NULL)
- *(starpos-1)=[color=#006699]'\0'[/color];
- card.openFile(strchr_pointer + 4,[color=#CC6600]true[/color]);
- [color=#CC6600]break[/color];
- [color=#CC6600]case[/color] 24: [color=#7E7E7E]//M24 - Start SD print[/color]
- card.startFileprint();
- starttime=[color=#CC6600]millis[/color]();
- [color=#CC6600]break[/color];
- [color=#CC6600]case[/color] 25: [color=#7E7E7E]//M25 - Pause SD print[/color]
- card.pauseSDPrint();
- [color=#CC6600]break[/color];
- [color=#CC6600]case[/color] 26: [color=#7E7E7E]//M26 - Set SD index[/color]
- [color=#CC6600]if[/color](card.cardOK && code_seen([color=#006699]'S'[/color])) {
- card.setIndex(code_value_long());
- }
- [color=#CC6600]break[/color];
- [color=#CC6600]case[/color] 27: [color=#7E7E7E]//M27 - Get SD status[/color]
- card.getStatus();
- [color=#CC6600]break[/color];
- [color=#CC6600]case[/color] 28: [color=#7E7E7E]//M28 - Start SD write[/color]
- starpos = (strchr(strchr_pointer + 4,[color=#006699]'*'[/color]));
- [color=#CC6600]if[/color](starpos != NULL){
- [color=#CC6600]char[/color]* npos = strchr(cmdbuffer[bufindr], [color=#006699]'N'[/color]);
- strchr_pointer = strchr(npos,[color=#006699]' '[/color]) + 1;
- *(starpos-1) = [color=#006699]'\0'[/color];
- }
- card.openFile(strchr_pointer+4,[color=#CC6600]false[/color]);
- [color=#CC6600]break[/color];
- [color=#CC6600]case[/color] 29: [color=#7E7E7E]//M29 - Stop SD write[/color]
- [color=#7E7E7E]//processed in write to file routine above[/color]
- [color=#7E7E7E]//card,saving = false;[/color]
- [color=#CC6600]break[/color];
- [color=#CC6600]case[/color] 30: [color=#7E7E7E]//M30 <filename> Delete File[/color]
- [color=#CC6600]if[/color] (card.cardOK){
- card.closefile();
- starpos = (strchr(strchr_pointer + 4,[color=#006699]'*'[/color]));
- [color=#CC6600]if[/color](starpos != NULL){
- [color=#CC6600]char[/color]* npos = strchr(cmdbuffer[bufindr], [color=#006699]'N'[/color]);
- strchr_pointer = strchr(npos,[color=#006699]' '[/color]) + 1;
- *(starpos-1) = [color=#006699]'\0'[/color];
- }
- card.removeFile(strchr_pointer + 4);
- }
- [color=#CC6600]break[/color];
- [color=#CC6600]case[/color] 32: [color=#7E7E7E]//M32 - Select file and start SD print[/color]
- {
- [color=#CC6600]if[/color](card.sdprinting) {
- st_synchronize();
- }
- starpos = (strchr(strchr_pointer + 4,[color=#006699]'*'[/color]));
- [color=#CC6600]char[/color]* namestartpos = (strchr(strchr_pointer + 4,[color=#006699]'!'[/color])); [color=#7E7E7E]//find ! to indicate filename string start.[/color]
- [color=#CC6600]if[/color](namestartpos==NULL)
- {
- namestartpos=strchr_pointer + 4; [color=#7E7E7E]//default name position, 4 letters after the M[/color]
- }
- [color=#CC6600]else[/color]
- namestartpos++; [color=#7E7E7E]//to skip the '!'[/color]
- [color=#CC6600]if[/color](starpos!=NULL)
- *(starpos-1)=[color=#006699]'\0'[/color];
- bool call_procedure=(code_seen([color=#006699]'P'[/color]));
- [color=#CC6600]if[/color](strchr_pointer>namestartpos)
- call_procedure=[color=#CC6600]false[/color]; [color=#7E7E7E]//false alert, 'P' found within filename[/color]
- [color=#CC6600]if[/color]( card.cardOK )
- {
- card.openFile(namestartpos,[color=#CC6600]true[/color],!call_procedure);
- [color=#CC6600]if[/color](code_seen([color=#006699]'S'[/color]))
- [color=#CC6600]if[/color](strchr_pointer<namestartpos) [color=#7E7E7E]//only if "S" is occuring _before_ the filename[/color]
- card.setIndex(code_value_long());
- card.startFileprint();
- [color=#CC6600]if[/color](!call_procedure)
- starttime=[color=#CC6600]millis[/color](); [color=#7E7E7E]//procedure calls count as normal print time.[/color]
- }
- } [color=#CC6600]break[/color];
- [color=#CC6600]case[/color] 928: [color=#7E7E7E]//M928 - Start SD write[/color]
- starpos = (strchr(strchr_pointer + 5,[color=#006699]'*'[/color]));
- [color=#CC6600]if[/color](starpos != NULL){
- [color=#CC6600]char[/color]* npos = strchr(cmdbuffer[bufindr], [color=#006699]'N'[/color]);
- strchr_pointer = strchr(npos,[color=#006699]' '[/color]) + 1;
- *(starpos-1) = [color=#006699]'\0'[/color];
- }
- card.openLogFile(strchr_pointer+5);
- [color=#CC6600]break[/color];
- #endif [color=#7E7E7E]//SDSUPPORT[/color]
- [color=#CC6600]case[/color] 31: [color=#7E7E7E]//M31 take time since the start of the SD print or an M109 command[/color]
- {
- stoptime=[color=#CC6600]millis[/color]();
- [color=#CC6600]char[/color] time[30];
- [color=#CC6600]unsigned[/color] [color=#CC6600]long[/color] t=(stoptime-starttime)/1000;
- [color=#CC6600]int[/color] sec,[color=#CC6600]min[/color];
- [color=#CC6600]min[/color]=t/60;
- sec=t%60;
- sprintf_P(time, PSTR([color=#006699]"%i min, %i sec"[/color]), [color=#CC6600]min[/color], sec);
- SERIAL_ECHO_START;
- SERIAL_ECHOLN(time);
- lcd_setstatus(time);
- autotempShutdown();
- }
- [color=#CC6600]break[/color];
- [color=#CC6600]case[/color] 42: [color=#7E7E7E]//M42 -Change pin status via gcode[/color]
- [color=#CC6600]if[/color] (code_seen([color=#006699]'S'[/color]))
- {
- [color=#CC6600]int[/color] pin_status = code_value();
- [color=#CC6600]int[/color] pin_number = LED_PIN;
- [color=#CC6600]if[/color] (code_seen([color=#006699]'P'[/color]) && pin_status >= 0 && pin_status <= 255)
- pin_number = code_value();
- [color=#CC6600]for[/color](int8_t i = 0; i < (int8_t)sizeof(sensitive_pins); i++)
- {
- [color=#CC6600]if[/color] (sensitive_pins[i] == pin_number)
- {
- pin_number = -1;
- [color=#CC6600]break[/color];
- }
- }
- #if defined(FAN_PIN) && FAN_PIN > -1
- [color=#CC6600]if[/color] (pin_number == FAN_PIN)
- fanSpeed = pin_status;
- #endif
- [color=#CC6600]if[/color] (pin_number > -1)
- {
- [color=#CC6600]pinMode[/color](pin_number, [color=#006699]OUTPUT[/color]);
- [color=#CC6600]digitalWrite[/color](pin_number, pin_status);
- [color=#CC6600]analogWrite[/color](pin_number, pin_status);
- }
- }
- [color=#CC6600]break[/color];
- [color=#CC6600]case[/color] 104: [color=#7E7E7E]// M104[/color]
- [color=#CC6600]if[/color](setTargetedHotend(104)){
- [color=#CC6600]break[/color];
- }
- [color=#CC6600]if[/color] (code_seen([color=#006699]'S'[/color])) setTargetHotend(code_value(), tmp_extruder);
- #ifdef DUAL_X_CARRIAGE
- [color=#CC6600]if[/color] (dual_x_carriage_mode == DXC_DUPLICATION_MODE && tmp_extruder == 0)
- setTargetHotend1(code_value() == 0.0 ? 0.0 : code_value() + duplicate_extruder_temp_offset);
- #endif
- setWatch();
- [color=#CC6600]break[/color];
- [color=#CC6600]case[/color] 140: [color=#7E7E7E]// M140 set bed temp[/color]
- [color=#CC6600]if[/color] (code_seen([color=#006699]'S'[/color])) setTargetBed(code_value());
- [color=#CC6600]break[/color];
- [color=#CC6600]case[/color] 105 : [color=#7E7E7E]// M105[/color]
- [color=#CC6600]if[/color](setTargetedHotend(105)){
- [color=#CC6600]break[/color];
- }
- #if defined(TEMP_0_PIN) && TEMP_0_PIN > -1
- SERIAL_PROTOCOLPGM([color=#006699]"ok T:"[/color]);
- SERIAL_PROTOCOL_F(degHotend(tmp_extruder),1);
- SERIAL_PROTOCOLPGM([color=#006699]" /"[/color]);
- SERIAL_PROTOCOL_F(degTargetHotend(tmp_extruder),1);
- #if defined(TEMP_BED_PIN) && TEMP_BED_PIN > -1
- SERIAL_PROTOCOLPGM([color=#006699]" B:"[/color]);
- SERIAL_PROTOCOL_F(degBed(),1);
- SERIAL_PROTOCOLPGM([color=#006699]" /"[/color]);
- SERIAL_PROTOCOL_F(degTargetBed(),1);
- #endif [color=#7E7E7E]//TEMP_BED_PIN[/color]
- [color=#CC6600]for[/color] (int8_t cur_extruder = 0; cur_extruder < EXTRUDERS; ++cur_extruder) {
- SERIAL_PROTOCOLPGM([color=#006699]" T"[/color]);
- SERIAL_PROTOCOL(cur_extruder);
- SERIAL_PROTOCOLPGM([color=#006699]":"[/color]);
- SERIAL_PROTOCOL_F(degHotend(cur_extruder),1);
- SERIAL_PROTOCOLPGM([color=#006699]" /"[/color]);
- SERIAL_PROTOCOL_F(degTargetHotend(cur_extruder),1);
- }
- #else
- SERIAL_ERROR_START;
- SERIAL_ERRORLNPGM(MSG_ERR_NO_THERMISTORS);
- #endif
- SERIAL_PROTOCOLPGM([color=#006699]" @:"[/color]);
- #ifdef EXTRUDER_WATTS
- SERIAL_PROTOCOL((EXTRUDER_WATTS * getHeaterPower(tmp_extruder))/127);
- SERIAL_PROTOCOLPGM([color=#006699]"W"[/color]);
- #else
- SERIAL_PROTOCOL(getHeaterPower(tmp_extruder));
- #endif
- SERIAL_PROTOCOLPGM([color=#006699]" B@:"[/color]);
- #ifdef BED_WATTS
- SERIAL_PROTOCOL((BED_WATTS * getHeaterPower(-1))/127);
- SERIAL_PROTOCOLPGM([color=#006699]"W"[/color]);
- #else
- SERIAL_PROTOCOL(getHeaterPower(-1));
- #endif
- #ifdef SHOW_TEMP_ADC_VALUES
- #if defined(TEMP_BED_PIN) && TEMP_BED_PIN > -1
- SERIAL_PROTOCOLPGM([color=#006699]" ADC B:"[/color]);
- SERIAL_PROTOCOL_F(degBed(),1);
- SERIAL_PROTOCOLPGM([color=#006699]"C->"[/color]);
- SERIAL_PROTOCOL_F(rawBedTemp()/OVERSAMPLENR,0);
- #endif
- [color=#CC6600]for[/color] (int8_t cur_extruder = 0; cur_extruder < EXTRUDERS; ++cur_extruder) {
- SERIAL_PROTOCOLPGM([color=#006699]" T"[/color]);
- SERIAL_PROTOCOL(cur_extruder);
- SERIAL_PROTOCOLPGM([color=#006699]":"[/color]);
- SERIAL_PROTOCOL_F(degHotend(cur_extruder),1);
- SERIAL_PROTOCOLPGM([color=#006699]"C->"[/color]);
- SERIAL_PROTOCOL_F(rawHotendTemp(cur_extruder)/OVERSAMPLENR,0);
- }
- #endif
- SERIAL_PROTOCOLLN([color=#006699]""[/color]);
- [color=#CC6600]return[/color];
- [color=#CC6600]break[/color];
- [color=#CC6600]case[/color] 109:
- {[color=#7E7E7E]// M109 - Wait for extruder heater to reach target.[/color]
- [color=#CC6600]if[/color](setTargetedHotend(109)){
- [color=#CC6600]break[/color];
- }
- LCD_MESSAGEPGM(MSG_HEATING);
- #ifdef AUTOTEMP
- autotemp_enabled=[color=#CC6600]false[/color];
- #endif
- [color=#CC6600]if[/color] (code_seen([color=#006699]'S'[/color])) {
- setTargetHotend(code_value(), tmp_extruder);
- #ifdef DUAL_X_CARRIAGE
- [color=#CC6600]if[/color] (dual_x_carriage_mode == DXC_DUPLICATION_MODE && tmp_extruder == 0)
- setTargetHotend1(code_value() == 0.0 ? 0.0 : code_value() + duplicate_extruder_temp_offset);
- #endif
- CooldownNoWait = [color=#CC6600]true[/color];
- } [color=#CC6600]else[/color] [color=#CC6600]if[/color] (code_seen([color=#006699]'R'[/color])) {
- setTargetHotend(code_value(), tmp_extruder);
- #ifdef DUAL_X_CARRIAGE
- [color=#CC6600]if[/color] (dual_x_carriage_mode == DXC_DUPLICATION_MODE && tmp_extruder == 0)
- setTargetHotend1(code_value() == 0.0 ? 0.0 : code_value() + duplicate_extruder_temp_offset);
- #endif
- CooldownNoWait = [color=#CC6600]false[/color];
- }
- #ifdef AUTOTEMP
- [color=#CC6600]if[/color] (code_seen([color=#006699]'S'[/color])) autotemp_min=code_value();
- [color=#CC6600]if[/color] (code_seen([color=#006699]'B'[/color])) autotemp_max=code_value();
- [color=#CC6600]if[/color] (code_seen([color=#006699]'F'[/color]))
- {
- autotemp_factor=code_value();
- autotemp_enabled=[color=#CC6600]true[/color];
- }
- #endif
- setWatch();
- codenum = [color=#CC6600]millis[/color]();
- [color=#7E7E7E]/* See if we are heating up or cooling down */[/color]
- target_direction = isHeatingHotend(tmp_extruder); [color=#7E7E7E]// true if heating, false if cooling[/color]
- #ifdef TEMP_RESIDENCY_TIME
- [color=#CC6600]long[/color] residencyStart;
- residencyStart = -1;
- [color=#7E7E7E]/* continue to loop until we have reached the target temp[/color]
- [color=#7E7E7E] _and_ until TEMP_RESIDENCY_TIME hasn't passed since we reached it */[/color]
- [color=#CC6600]while[/color]((residencyStart == -1) ||
- (residencyStart >= 0 && ((([color=#CC6600]unsigned[/color] [color=#CC6600]int[/color]) ([color=#CC6600]millis[/color]() - residencyStart)) < (TEMP_RESIDENCY_TIME * 1000UL))) ) {
- #else
- [color=#CC6600]while[/color] ( target_direction ? (isHeatingHotend(tmp_extruder)) : (isCoolingHotend(tmp_extruder)&&(CooldownNoWait==[color=#CC6600]false[/color])) ) {
- #endif [color=#7E7E7E]//TEMP_RESIDENCY_TIME[/color]
- [color=#CC6600]if[/color]( ([color=#CC6600]millis[/color]() - codenum) > 1000UL )
- { [color=#7E7E7E]//Print Temp Reading and remaining time every 1 second while heating up/cooling down[/color]
- SERIAL_PROTOCOLPGM([color=#006699]"T:"[/color]);
- SERIAL_PROTOCOL_F(degHotend(tmp_extruder),1);
- SERIAL_PROTOCOLPGM([color=#006699]" E:"[/color]);
- SERIAL_PROTOCOL(([color=#CC6600]int[/color])tmp_extruder);
- #ifdef TEMP_RESIDENCY_TIME
- SERIAL_PROTOCOLPGM([color=#006699]" W:"[/color]);
- [color=#CC6600]if[/color](residencyStart > -1)
- {
- codenum = ((TEMP_RESIDENCY_TIME * 1000UL) - ([color=#CC6600]millis[/color]() - residencyStart)) / 1000UL;
- SERIAL_PROTOCOLLN( codenum );
- }
- [color=#CC6600]else[/color]
- {
- SERIAL_PROTOCOLLN( [color=#006699]"?"[/color] );
- }
- #else
- SERIAL_PROTOCOLLN([color=#006699]""[/color]);
- #endif
- codenum = [color=#CC6600]millis[/color]();
- }
- manage_heater();
- manage_inactivity();
- lcd_update();
- #ifdef TEMP_RESIDENCY_TIME
- [color=#7E7E7E]/* start/restart the TEMP_RESIDENCY_TIME timer whenever we reach target temp for the first time[/color]
- [color=#7E7E7E] or when current temp falls outside the hysteresis after target temp was reached */[/color]
- [color=#CC6600]if[/color] ((residencyStart == -1 && target_direction && (degHotend(tmp_extruder) >= (degTargetHotend(tmp_extruder)-TEMP_WINDOW))) ||
- (residencyStart == -1 && !target_direction && (degHotend(tmp_extruder) <= (degTargetHotend(tmp_extruder)+TEMP_WINDOW))) ||
- (residencyStart > -1 && labs(degHotend(tmp_extruder) - degTargetHotend(tmp_extruder)) > TEMP_HYSTERESIS) )
- {
- residencyStart = [color=#CC6600]millis[/color]();
- }
- #endif [color=#7E7E7E]//TEMP_RESIDENCY_TIME[/color]
- }
- LCD_MESSAGEPGM(MSG_HEATING_COMPLETE);
- starttime=[color=#CC6600]millis[/color]();
- previous_millis_cmd = [color=#CC6600]millis[/color]();
- }
- [color=#CC6600]break[/color];
- [color=#CC6600]case[/color] 190: [color=#7E7E7E]// M190 - Wait for bed heater to reach target.[/color]
- #if defined(TEMP_BED_PIN) && TEMP_BED_PIN > -1
- LCD_MESSAGEPGM(MSG_BED_HEATING);
- [color=#CC6600]if[/color] (code_seen([color=#006699]'S'[/color])) {
- setTargetBed(code_value());
- CooldownNoWait = [color=#CC6600]true[/color];
- } [color=#CC6600]else[/color] [color=#CC6600]if[/color] (code_seen([color=#006699]'R'[/color])) {
- setTargetBed(code_value());
- CooldownNoWait = [color=#CC6600]false[/color];
- }
- codenum = [color=#CC6600]millis[/color]();
- target_direction = isHeatingBed(); [color=#7E7E7E]// true if heating, false if cooling[/color]
- [color=#CC6600]while[/color] ( target_direction ? (isHeatingBed()) : (isCoolingBed()&&(CooldownNoWait==[color=#CC6600]false[/color])) )
- {
- [color=#CC6600]if[/color](( [color=#CC6600]millis[/color]() - codenum) > 1000 ) [color=#7E7E7E]//Print Temp Reading every 1 second while heating up.[/color]
- {
- [color=#CC6600]float[/color] tt=degHotend(active_extruder);
- SERIAL_PROTOCOLPGM([color=#006699]"T:"[/color]);
- SERIAL_PROTOCOL(tt);
- SERIAL_PROTOCOLPGM([color=#006699]" E:"[/color]);
- SERIAL_PROTOCOL(([color=#CC6600]int[/color])active_extruder);
- SERIAL_PROTOCOLPGM([color=#006699]" B:"[/color]);
- SERIAL_PROTOCOL_F(degBed(),1);
- SERIAL_PROTOCOLLN([color=#006699]""[/color]);
- codenum = [color=#CC6600]millis[/color]();
- }
- manage_heater();
- manage_inactivity();
- lcd_update();
- }
- LCD_MESSAGEPGM(MSG_BED_DONE);
- previous_millis_cmd = [color=#CC6600]millis[/color]();
- #endif
- [color=#CC6600]break[/color];
- #if defined(FAN_PIN) && FAN_PIN > -1
- [color=#CC6600]case[/color] 106: [color=#7E7E7E]//M106 Fan On[/color]
- [color=#CC6600]if[/color] (code_seen([color=#006699]'S'[/color])){
- fanSpeed=[color=#CC6600]constrain[/color](code_value(),0,255);
- }
- [color=#CC6600]else[/color] {
- fanSpeed=255;
- }
- [color=#CC6600]break[/color];
- [color=#CC6600]case[/color] 107: [color=#7E7E7E]//M107 Fan Off[/color]
- fanSpeed = 0;
- [color=#CC6600]break[/color];
- #endif [color=#7E7E7E]//FAN_PIN[/color]
- #ifdef BARICUDA
- [color=#7E7E7E]// PWM for HEATER_1_PIN[/color]
- #if defined(HEATER_1_PIN) && HEATER_1_PIN > -1
- [color=#CC6600]case[/color] 126: [color=#7E7E7E]//M126 valve open[/color]
- [color=#CC6600]if[/color] (code_seen([color=#006699]'S'[/color])){
- ValvePressure=[color=#CC6600]constrain[/color](code_value(),0,255);
- }
- [color=#CC6600]else[/color] {
- ValvePressure=255;
- }
- [color=#CC6600]break[/color];
- [color=#CC6600]case[/color] 127: [color=#7E7E7E]//M127 valve closed[/color]
- ValvePressure = 0;
- [color=#CC6600]break[/color];
- #endif [color=#7E7E7E]//HEATER_1_PIN[/color]
- [color=#7E7E7E]// PWM for HEATER_2_PIN[/color]
- #if defined(HEATER_2_PIN) && HEATER_2_PIN > -1
- [color=#CC6600]case[/color] 128: [color=#7E7E7E]//M128 valve open[/color]
- [color=#CC6600]if[/color] (code_seen([color=#006699]'S'[/color])){
- EtoPPressure=[color=#CC6600]constrain[/color](code_value(),0,255);
- }
- [color=#CC6600]else[/color] {
- EtoPPressure=255;
- }
- [color=#CC6600]break[/color];
- [color=#CC6600]case[/color] 129: [color=#7E7E7E]//M129 valve closed[/color]
- EtoPPressure = 0;
- [color=#CC6600]break[/color];
- #endif [color=#7E7E7E]//HEATER_2_PIN[/color]
- #endif
- #if defined(PS_ON_PIN) && PS_ON_PIN > -1
- [color=#CC6600]case[/color] 80: [color=#7E7E7E]// M80 - Turn on Power Supply[/color]
- SET_OUTPUT(PS_ON_PIN); [color=#7E7E7E]//GND[/color]
- WRITE(PS_ON_PIN, PS_ON_AWAKE);
- [color=#7E7E7E]// If you have a switch on suicide pin, this is useful[/color]
- [color=#7E7E7E]// if you want to start another print with suicide feature after[/color]
- [color=#7E7E7E]// a print without suicide...[/color]
- #if defined SUICIDE_PIN && SUICIDE_PIN > -1
- SET_OUTPUT(SUICIDE_PIN);
- WRITE(SUICIDE_PIN, [color=#006699]HIGH[/color]);
- #endif
- #ifdef ULTIPANEL
- powersupply = [color=#CC6600]true[/color];
- LCD_MESSAGEPGM(WELCOME_MSG);
- lcd_update();
- #endif
- [color=#CC6600]break[/color];
- #endif
- [color=#CC6600]case[/color] 81: [color=#7E7E7E]// M81 - Turn off Power Supply[/color]
- disable_heater();
- st_synchronize();
- disable_e0();
- disable_e1();
- disable_e2();
- finishAndDisableSteppers();
- fanSpeed = 0;
- [color=#CC6600]delay[/color](1000); [color=#7E7E7E]// Wait a little before to switch off[/color]
- #if defined(SUICIDE_PIN) && SUICIDE_PIN > -1
- st_synchronize();
- suicide();
- #elif defined(PS_ON_PIN) && PS_ON_PIN > -1
- SET_OUTPUT(PS_ON_PIN);
- WRITE(PS_ON_PIN, PS_ON_ASLEEP);
- #endif
- #ifdef ULTIPANEL
- powersupply = [color=#CC6600]false[/color];
- LCD_MESSAGEPGM(MACHINE_NAME[color=#006699]" "[/color]MSG_OFF[color=#006699]"."[/color]);
- lcd_update();
- #endif
- [color=#CC6600]break[/color];
- [color=#CC6600]case[/color] 82:
- axis_relative_modes[3] = [color=#CC6600]false[/color];
- [color=#CC6600]break[/color];
- [color=#CC6600]case[/color] 83:
- axis_relative_modes[3] = [color=#CC6600]true[/color];
- [color=#CC6600]break[/color];
- [color=#CC6600]case[/color] 18: [color=#7E7E7E]//compatibility[/color]
- [color=#CC6600]case[/color] 84: [color=#7E7E7E]// M84[/color]
- [color=#CC6600]if[/color](code_seen([color=#006699]'S'[/color])){
- stepper_inactive_time = code_value() * 1000;
- }
- [color=#CC6600]else[/color]
- {
- bool all_axis = !((code_seen(axis_codes[0])) || (code_seen(axis_codes[1])) || (code_seen(axis_codes[2]))|| (code_seen(axis_codes[3])));
- [color=#CC6600]if[/color](all_axis)
- {
- st_synchronize();
- disable_e0();
- disable_e1();
- disable_e2();
- finishAndDisableSteppers();
- }
- [color=#CC6600]else[/color]
- {
- st_synchronize();
- [color=#CC6600]if[/color](code_seen([color=#006699]'X'[/color])) disable_x();
- [color=#CC6600]if[/color](code_seen([color=#006699]'Y'[/color])) disable_y();
- [color=#CC6600]if[/color](code_seen([color=#006699]'Z'[/color])) disable_z();
- #if ((E0_ENABLE_PIN != X_ENABLE_PIN) && (E1_ENABLE_PIN != Y_ENABLE_PIN)) [color=#7E7E7E]// Only enable on boards that have seperate ENABLE_PINS[/color]
- [color=#CC6600]if[/color](code_seen([color=#006699]'E'[/color])) {
- disable_e0();
- disable_e1();
- disable_e2();
- }
- #endif
- }
- }
- [color=#CC6600]break[/color];
- [color=#CC6600]case[/color] 85: [color=#7E7E7E]// M85[/color]
- code_seen([color=#006699]'S'[/color]);
- max_inactive_time = code_value() * 1000;
- [color=#CC6600]break[/color];
- [color=#CC6600]case[/color] 92: [color=#7E7E7E]// M92[/color]
- [color=#CC6600]for[/color](int8_t i=0; i < NUM_AXIS; i++)
- {
- [color=#CC6600]if[/color](code_seen(axis_codes[i]))
- {
- [color=#CC6600]if[/color](i == 3) { [color=#7E7E7E]// E[/color]
- [color=#CC6600]float[/color] value = code_value();
- [color=#CC6600]if[/color](value < 20.0) {
- [color=#CC6600]float[/color] factor = axis_steps_per_unit[i] / value; [color=#7E7E7E]// increase e constants if M92 E14 is given for netfab.[/color]
- max_e_jerk *= factor;
- max_feedrate[i] *= factor;
- axis_steps_per_sqr_second[i] *= factor;
- }
- axis_steps_per_unit[i] = value;
- }
- [color=#CC6600]else[/color] {
- axis_steps_per_unit[i] = code_value();
- }
- }
- }
- [color=#CC6600]break[/color];
- [color=#CC6600]case[/color] 115: [color=#7E7E7E]// M115[/color]
- SERIAL_PROTOCOLPGM(MSG_M115_REPORT);
- [color=#CC6600]break[/color];
- [color=#CC6600]case[/color] 117: [color=#7E7E7E]// M117 display message[/color]
- starpos = (strchr(strchr_pointer + 5,[color=#006699]'*'[/color]));
- [color=#CC6600]if[/color](starpos!=NULL)
- *(starpos-1)=[color=#006699]'\0'[/color];
- lcd_setstatus(strchr_pointer + 5);
- [color=#CC6600]break[/color];
- [color=#CC6600]case[/color] 114: [color=#7E7E7E]// M114[/color]
- SERIAL_PROTOCOLPGM([color=#006699]"X:"[/color]);
- SERIAL_PROTOCOL(current_position[[color=#006699]X_AXIS[/color]]);
- SERIAL_PROTOCOLPGM([color=#006699]"Y:"[/color]);
- SERIAL_PROTOCOL(current_position[[color=#006699]Y_AXIS[/color]]);
- SERIAL_PROTOCOLPGM([color=#006699]"Z:"[/color]);
- SERIAL_PROTOCOL(current_position[[color=#006699]Z_AXIS[/color]]);
- SERIAL_PROTOCOLPGM([color=#006699]"E:"[/color]);
- SERIAL_PROTOCOL(current_position[E_AXIS]);
- SERIAL_PROTOCOLPGM(MSG_COUNT_X);
- SERIAL_PROTOCOL([color=#CC6600]float[/color](st_get_position([color=#006699]X_AXIS[/color]))/axis_steps_per_unit[[color=#006699]X_AXIS[/color]]);
- SERIAL_PROTOCOLPGM([color=#006699]"Y:"[/color]);
- SERIAL_PROTOCOL([color=#CC6600]float[/color](st_get_position([color=#006699]Y_AXIS[/color]))/axis_steps_per_unit[[color=#006699]Y_AXIS[/color]]);
- SERIAL_PROTOCOLPGM([color=#006699]"Z:"[/color]);
- SERIAL_PROTOCOL([color=#CC6600]float[/color](st_get_position([color=#006699]Z_AXIS[/color]))/axis_steps_per_unit[[color=#006699]Z_AXIS[/color]]);
- SERIAL_PROTOCOLLN([color=#006699]""[/color]);
- [color=#CC6600]break[/color];
- [color=#CC6600]case[/color] 120: [color=#7E7E7E]// M120[/color]
- enable_endstops([color=#CC6600]false[/color]) ;
- [color=#CC6600]break[/color];
- [color=#CC6600]case[/color] 121: [color=#7E7E7E]// M121[/color]
- enable_endstops([color=#CC6600]true[/color]) ;
- [color=#CC6600]break[/color];
- [color=#CC6600]case[/color] 119: [color=#7E7E7E]// M119[/color]
- SERIAL_PROTOCOLLN(MSG_M119_REPORT);
- #if defined(X_MIN_PIN) && X_MIN_PIN > -1
- SERIAL_PROTOCOLPGM(MSG_X_MIN);
- SERIAL_PROTOCOLLN(((READ(X_MIN_PIN)^X_MIN_ENDSTOP_INVERTING)?MSG_ENDSTOP_HIT:MSG_ENDSTOP_OPEN));
- #endif
- #if defined(X_MAX_PIN) && X_MAX_PIN > -1
- SERIAL_PROTOCOLPGM(MSG_X_MAX);
- SERIAL_PROTOCOLLN(((READ(X_MAX_PIN)^X_MAX_ENDSTOP_INVERTING)?MSG_ENDSTOP_HIT:MSG_ENDSTOP_OPEN));
- #endif
- #if defined(Y_MIN_PIN) && Y_MIN_PIN > -1
- SERIAL_PROTOCOLPGM(MSG_Y_MIN);
- SERIAL_PROTOCOLLN(((READ(Y_MIN_PIN)^Y_MIN_ENDSTOP_INVERTING)?MSG_ENDSTOP_HIT:MSG_ENDSTOP_OPEN));
- #endif
- #if defined(Y_MAX_PIN) && Y_MAX_PIN > -1
- SERIAL_PROTOCOLPGM(MSG_Y_MAX);
- SERIAL_PROTOCOLLN(((READ(Y_MAX_PIN)^Y_MAX_ENDSTOP_INVERTING)?MSG_ENDSTOP_HIT:MSG_ENDSTOP_OPEN));
- #endif
- #if defined(Z_MIN_PIN) && Z_MIN_PIN > -1
- SERIAL_PROTOCOLPGM(MSG_Z_MIN);
- SERIAL_PROTOCOLLN(((READ(Z_MIN_PIN)^Z_MIN_ENDSTOP_INVERTING)?MSG_ENDSTOP_HIT:MSG_ENDSTOP_OPEN));
- #endif
- #if defined(Z_MAX_PIN) && Z_MAX_PIN > -1
- SERIAL_PROTOCOLPGM(MSG_Z_MAX);
- SERIAL_PROTOCOLLN(((READ(Z_MAX_PIN)^Z_MAX_ENDSTOP_INVERTING)?MSG_ENDSTOP_HIT:MSG_ENDSTOP_OPEN));
- #endif
- [color=#CC6600]break[/color];
- [color=#7E7E7E]//TODO: update for all axis, use for loop[/color]
- #ifdef BLINKM
- [color=#CC6600]case[/color] 150: [color=#7E7E7E]// M150[/color]
- {
- [color=#CC6600]byte[/color] red;
- [color=#CC6600]byte[/color] grn;
- [color=#CC6600]byte[/color] blu;
- [color=#CC6600]if[/color](code_seen([color=#006699]'R'[/color])) red = code_value();
- [color=#CC6600]if[/color](code_seen([color=#006699]'U'[/color])) grn = code_value();
- [color=#CC6600]if[/color](code_seen([color=#006699]'B'[/color])) blu = code_value();
- SendColors(red,grn,blu);
- }
- [color=#CC6600]break[/color];
- #endif [color=#7E7E7E]//BLINKM[/color]
- [color=#CC6600]case[/color] 200: [color=#7E7E7E]// M200 D<millimeters> set filament diameter and set E axis units to cubic millimeters (use S0 to set back to millimeters).[/color]
- {
- [color=#CC6600]float[/color] area = .0;
- [color=#CC6600]float[/color] radius = .0;
- [color=#CC6600]if[/color](code_seen([color=#006699]'D'[/color])) {
- radius = ([color=#CC6600]float[/color])code_value() * .5;
- [color=#CC6600]if[/color](radius == 0) {
- area = 1;
- } [color=#CC6600]else[/color] {
- area = M_PI * pow(radius, 2);
- }
- } [color=#CC6600]else[/color] {
- [color=#7E7E7E]//reserved for setting filament diameter via UFID or filament measuring device[/color]
- [color=#CC6600]break[/color];
- }
- tmp_extruder = active_extruder;
- [color=#CC6600]if[/color](code_seen([color=#006699]'T'[/color])) {
- tmp_extruder = code_value();
- [color=#CC6600]if[/color](tmp_extruder >= EXTRUDERS) {
- SERIAL_ECHO_START;
- SERIAL_ECHO(MSG_M200_INVALID_EXTRUDER);
- }
- SERIAL_ECHOLN(tmp_extruder);
- [color=#CC6600]break[/color];
- }
- volumetric_multiplier[tmp_extruder] = 1 / area;
- }
- [color=#CC6600]break[/color];
- [color=#CC6600]case[/color] 201: [color=#7E7E7E]// M201[/color]
- [color=#CC6600]for[/color](int8_t i=0; i < NUM_AXIS; i++)
- {
- [color=#CC6600]if[/color](code_seen(axis_codes[i]))
- {
- max_acceleration_units_per_sq_second[i] = code_value();
- }
- }
- [color=#7E7E7E]// steps per sq second need to be updated to agree with the units per sq second (as they are what is used in the planner)[/color]
- reset_acceleration_rates();
- [color=#CC6600]break[/color];
- #if 0 [color=#7E7E7E]// Not used for Sprinter/grbl gen6[/color]
- [color=#CC6600]case[/color] 202: [color=#7E7E7E]// M202[/color]
- [color=#CC6600]for[/color](int8_t i=0; i < NUM_AXIS; i++) {
- [color=#CC6600]if[/color](code_seen(axis_codes[i])) axis_travel_steps_per_sqr_second[i] = code_value() * axis_steps_per_unit[i];
- }
- [color=#CC6600]break[/color];
- #endif
- [color=#CC6600]case[/color] 203: [color=#7E7E7E]// M203 max feedrate mm/sec[/color]
- [color=#CC6600]for[/color](int8_t i=0; i < NUM_AXIS; i++) {
- [color=#CC6600]if[/color](code_seen(axis_codes[i])) max_feedrate[i] = code_value();
- }
- [color=#CC6600]break[/color];
- [color=#CC6600]case[/color] 204: [color=#7E7E7E]// M204 acclereration S normal moves T filmanent only moves[/color]
- {
- [color=#CC6600]if[/color](code_seen([color=#006699]'S'[/color])) acceleration = code_value() ;
- [color=#CC6600]if[/color](code_seen([color=#006699]'T'[/color])) retract_acceleration = code_value() ;
- }
- [color=#CC6600]break[/color];
- [color=#CC6600]case[/color] 205: [color=#7E7E7E]//M205 advanced settings: minimum travel speed S=while printing T=travel only, B=minimum segment time X= maximum xy jerk, Z=maximum Z jerk[/color]
- {
- [color=#CC6600]if[/color](code_seen([color=#006699]'S'[/color])) minimumfeedrate = code_value();
- [color=#CC6600]if[/color](code_seen([color=#006699]'T'[/color])) mintravelfeedrate = code_value();
- [color=#CC6600]if[/color](code_seen([color=#006699]'B'[/color])) minsegmenttime = code_value() ;
- [color=#CC6600]if[/color](code_seen([color=#006699]'X'[/color])) max_xy_jerk = code_value() ;
- [color=#CC6600]if[/color](code_seen([color=#006699]'Z'[/color])) max_z_jerk = code_value() ;
- [color=#CC6600]if[/color](code_seen([color=#006699]'E'[/color])) max_e_jerk = code_value() ;
- }
- [color=#CC6600]break[/color];
- [color=#CC6600]case[/color] 206: [color=#7E7E7E]// M206 additional homeing offset[/color]
- [color=#CC6600]for[/color](int8_t i=0; i < 3; i++)
- {
- [color=#CC6600]if[/color](code_seen(axis_codes[i])) add_homeing[i] = code_value();
- }
- [color=#CC6600]break[/color];
- #ifdef DELTA
- [color=#CC6600]case[/color] 666: [color=#7E7E7E]// M666 set delta endstop adjustemnt[/color]
- [color=#CC6600]for[/color](int8_t i=0; i < 3; i++)
- {
- [color=#CC6600]if[/color](code_seen(axis_codes[i])) endstop_adj[i] = code_value();
- }
- [color=#CC6600]break[/color];
- #endif
- #ifdef FWRETRACT
- [color=#CC6600]case[/color] 207: [color=#7E7E7E]//M207 - set retract length S[positive mm] F[feedrate mm/sec] Z[additional zlift/hop][/color]
- {
- [color=#CC6600]if[/color](code_seen([color=#006699]'S'[/color]))
- {
- retract_length = code_value() ;
- }
- [color=#CC6600]if[/color](code_seen([color=#006699]'F'[/color]))
- {
- retract_feedrate = code_value() ;
- }
- [color=#CC6600]if[/color](code_seen([color=#006699]'Z'[/color]))
- {
- retract_zlift = code_value() ;
- }
- }[color=#CC6600]break[/color];
- [color=#CC6600]case[/color] 208: [color=#7E7E7E]// M208 - set retract recover length S[positive mm surplus to the M207 S*] F[feedrate mm/sec][/color]
- {
- [color=#CC6600]if[/color](code_seen([color=#006699]'S'[/color]))
- {
- retract_recover_length = code_value() ;
- }
- [color=#CC6600]if[/color](code_seen([color=#006699]'F'[/color]))
- {
- retract_recover_feedrate = code_value() ;
- }
- }[color=#CC6600]break[/color];
- [color=#CC6600]case[/color] 209: [color=#7E7E7E]// M209 - S<1=true/0=false> enable automatic retract detect if the slicer did not support G10/11: every normal extrude-only move will be classified as retract depending on the direction.[/color]
- {
- [color=#CC6600]if[/color](code_seen([color=#006699]'S'[/color]))
- {
- [color=#CC6600]int[/color] t= code_value() ;
- [color=#CC6600]switch[/color](t)
- {
- [color=#CC6600]case[/color] 0: autoretract_enabled=[color=#CC6600]false[/color];retracted=[color=#CC6600]false[/color];[color=#CC6600]break[/color];
- [color=#CC6600]case[/color] 1: autoretract_enabled=[color=#CC6600]true[/color];retracted=[color=#CC6600]false[/color];[color=#CC6600]break[/color];
- [color=#CC6600]default[/color]:
- SERIAL_ECHO_START;
- SERIAL_ECHOPGM(MSG_UNKNOWN_COMMAND);
- SERIAL_ECHO(cmdbuffer[bufindr]);
- SERIAL_ECHOLNPGM([color=#006699]"\""[/color]);
- }
- }
- }[color=#CC6600]break[/color];
- #endif [color=#7E7E7E]// FWRETRACT[/color]
- #if EXTRUDERS > 1
- [color=#CC6600]case[/color] 218: [color=#7E7E7E]// M218 - set hotend offset (in mm), T<extruder_number> X<offset_on_X> Y<offset_on_Y>[/color]
- {
- [color=#CC6600]if[/color](setTargetedHotend(218)){
- [color=#CC6600]break[/color];
- }
- [color=#CC6600]if[/color](code_seen([color=#006699]'X'[/color]))
- {
- extruder_offset[[color=#006699]X_AXIS[/color]][tmp_extruder] = code_value();
- }
- [color=#CC6600]if[/color](code_seen([color=#006699]'Y'[/color]))
- {
- extruder_offset[[color=#006699]Y_AXIS[/color]][tmp_extruder] = code_value();
- }
- #ifdef DUAL_X_CARRIAGE
- [color=#CC6600]if[/color](code_seen([color=#006699]'Z'[/color]))
- {
- extruder_offset[[color=#006699]Z_AXIS[/color]][tmp_extruder] = code_value();
- }
- #endif
- SERIAL_ECHO_START;
- SERIAL_ECHOPGM(MSG_HOTEND_OFFSET);
- [color=#CC6600]for[/color](tmp_extruder = 0; tmp_extruder < EXTRUDERS; tmp_extruder++)
- {
- SERIAL_ECHO([color=#006699]" "[/color]);
- SERIAL_ECHO(extruder_offset[[color=#006699]X_AXIS[/color]][tmp_extruder]);
- SERIAL_ECHO([color=#006699]","[/color]);
- SERIAL_ECHO(extruder_offset[[color=#006699]Y_AXIS[/color]][tmp_extruder]);
- #ifdef DUAL_X_CARRIAGE
- SERIAL_ECHO([color=#006699]","[/color]);
- SERIAL_ECHO(extruder_offset[[color=#006699]Z_AXIS[/color]][tmp_extruder]);
- #endif
- }
- SERIAL_ECHOLN([color=#006699]""[/color]);
- }[color=#CC6600]break[/color];
- #endif
- [color=#CC6600]case[/color] 220: [color=#7E7E7E]// M220 S<factor in percent>- set speed factor override percentage[/color]
- {
- [color=#CC6600]if[/color](code_seen([color=#006699]'S'[/color]))
- {
- feedmultiply = code_value() ;
- }
- }
- [color=#CC6600]break[/color];
- [color=#CC6600]case[/color] 221: [color=#7E7E7E]// M221 S<factor in percent>- set extrude factor override percentage[/color]
- {
- [color=#CC6600]if[/color](code_seen([color=#006699]'S'[/color]))
- {
- extrudemultiply = code_value() ;
- }
- }
- [color=#CC6600]break[/color];
- [color=#CC6600]case[/color] 226: [color=#7E7E7E]// M226 P<pin number> S<pin state>- Wait until the specified pin reaches the state required[/color]
- {
- [color=#CC6600]if[/color](code_seen([color=#006699]'P'[/color])){
- [color=#CC6600]int[/color] pin_number = code_value(); [color=#7E7E7E]// pin number[/color]
- [color=#CC6600]int[/color] pin_state = -1; [color=#7E7E7E]// required pin state - default is inverted[/color]
- [color=#CC6600]if[/color](code_seen([color=#006699]'S'[/color])) pin_state = code_value(); [color=#7E7E7E]// required pin state[/color]
- [color=#CC6600]if[/color](pin_state >= -1 && pin_state <= 1){
- [color=#CC6600]for[/color](int8_t i = 0; i < (int8_t)sizeof(sensitive_pins); i++)
- {
- [color=#CC6600]if[/color] (sensitive_pins[i] == pin_number)
- {
- pin_number = -1;
- [color=#CC6600]break[/color];
- }
- }
- [color=#CC6600]if[/color] (pin_number > -1)
- {
- st_synchronize();
- [color=#CC6600]pinMode[/color](pin_number, [color=#006699]INPUT[/color]);
- [color=#CC6600]int[/color] target;
- [color=#CC6600]switch[/color](pin_state){
- [color=#CC6600]case[/color] 1:
- target = [color=#006699]HIGH[/color];
- [color=#CC6600]break[/color];
- [color=#CC6600]case[/color] 0:
- target = [color=#006699]LOW[/color];
- [color=#CC6600]break[/color];
- [color=#CC6600]case[/color] -1:
- target = ![color=#CC6600]digitalRead[/color](pin_number);
- [color=#CC6600]break[/color];
- }
- [color=#CC6600]while[/color]([color=#CC6600]digitalRead[/color](pin_number) != target){
- manage_heater();
- manage_inactivity();
- lcd_update();
- }
- }
- }
- }
- }
- [color=#CC6600]break[/color];
- #if NUM_SERVOS > 0
- [color=#CC6600]case[/color] 280: [color=#7E7E7E]// M280 - set servo position absolute. P: servo index, S: angle or microseconds[/color]
- {
- [color=#CC6600]int[/color] servo_index = -1;
- [color=#CC6600]int[/color] servo_position = 0;
- [color=#CC6600]if[/color] (code_seen([color=#006699]'P'[/color]))
- servo_index = code_value();
- [color=#CC6600]if[/color] (code_seen([color=#006699]'S'[/color])) {
- servo_position = code_value();
- [color=#CC6600]if[/color] ((servo_index >= 0) && (servo_index < NUM_SERVOS)) {
- #if defined (ENABLE_AUTO_BED_LEVELING) && (PROBE_SERVO_DEACTIVATION_DELAY > 0)
- servos[servo_index].[color=#CC6600]attach[/color](0);
- #endif
- servos[servo_index].[color=#CC6600]write[/color](servo_position);
- #if defined (ENABLE_AUTO_BED_LEVELING) && (PROBE_SERVO_DEACTIVATION_DELAY > 0)
- [color=#CC6600]delay[/color](PROBE_SERVO_DEACTIVATION_DELAY);
- servos[servo_index].[color=#CC6600]detach[/color]();
- #endif
- }
- [color=#CC6600]else[/color] {
- SERIAL_ECHO_START;
- SERIAL_ECHO([color=#006699]"Servo "[/color]);
- SERIAL_ECHO(servo_index);
- SERIAL_ECHOLN([color=#006699]" out of range"[/color]);
- }
- }
- [color=#CC6600]else[/color] [color=#CC6600]if[/color] (servo_index >= 0) {
- SERIAL_PROTOCOL(MSG_OK);
- SERIAL_PROTOCOL([color=#006699]" Servo "[/color]);
- SERIAL_PROTOCOL(servo_index);
- SERIAL_PROTOCOL([color=#006699]": "[/color]);
- SERIAL_PROTOCOL(servos[servo_index].[color=#CC6600]read[/color]());
- SERIAL_PROTOCOLLN([color=#006699]""[/color]);
- }
- }
- [color=#CC6600]break[/color];
- #endif [color=#7E7E7E]// NUM_SERVOS > 0[/color]
- #if (LARGE_FLASH == [color=#CC6600]true[/color] && ( BEEPER > 0 || defined(ULTRALCD) || defined(LCD_USE_I2C_BUZZER)))
- [color=#CC6600]case[/color] 300: [color=#7E7E7E]// M300[/color]
- {
- [color=#CC6600]int[/color] beepS = code_seen([color=#006699]'S'[/color]) ? code_value() : 110;
- [color=#CC6600]int[/color] beepP = code_seen([color=#006699]'P'[/color]) ? code_value() : 1000;
- [color=#CC6600]if[/color] (beepS > 0)
- {
- #if BEEPER > 0
- [color=#CC6600]tone[/color](BEEPER, beepS);
- [color=#CC6600]delay[/color](beepP);
- [color=#CC6600]noTone[/color](BEEPER);
- #elif defined(ULTRALCD)
- lcd_buzz(beepS, beepP);
- #elif defined(LCD_USE_I2C_BUZZER)
- lcd_buzz(beepP, beepS);
- #endif
- }
- [color=#CC6600]else[/color]
- {
- [color=#CC6600]delay[/color](beepP);
- }
- }
- [color=#CC6600]break[/color];
- #endif [color=#7E7E7E]// M300[/color]
- #ifdef PIDTEMP
- [color=#CC6600]case[/color] 301: [color=#7E7E7E]// M301[/color]
- {
- [color=#CC6600]if[/color](code_seen([color=#006699]'P'[/color])) Kp = code_value();
- [color=#CC6600]if[/color](code_seen([color=#006699]'I'[/color])) Ki = scalePID_i(code_value());
- [color=#CC6600]if[/color](code_seen([color=#006699]'D'[/color])) Kd = scalePID_d(code_value());
- #ifdef PID_ADD_EXTRUSION_RATE
- [color=#CC6600]if[/color](code_seen([color=#006699]'C'[/color])) Kc = code_value();
- #endif
- updatePID();
- SERIAL_PROTOCOL(MSG_OK);
- SERIAL_PROTOCOL([color=#006699]" p:"[/color]);
- SERIAL_PROTOCOL(Kp);
- SERIAL_PROTOCOL([color=#006699]" i:"[/color]);
- SERIAL_PROTOCOL(unscalePID_i(Ki));
- SERIAL_PROTOCOL([color=#006699]" d:"[/color]);
- SERIAL_PROTOCOL(unscalePID_d(Kd));
- #ifdef PID_ADD_EXTRUSION_RATE
- SERIAL_PROTOCOL([color=#006699]" c:"[/color]);
- [color=#7E7E7E]//Kc does not have scaling applied above, or in resetting defaults[/color]
- SERIAL_PROTOCOL(Kc);
- #endif
- SERIAL_PROTOCOLLN([color=#006699]""[/color]);
- }
- [color=#CC6600]break[/color];
- #endif [color=#7E7E7E]//PIDTEMP[/color]
- #ifdef PIDTEMPBED
- [color=#CC6600]case[/color] 304: [color=#7E7E7E]// M304[/color]
- {
- [color=#CC6600]if[/color](code_seen([color=#006699]'P'[/color])) bedKp = code_value();
- [color=#CC6600]if[/color](code_seen([color=#006699]'I'[/color])) bedKi = scalePID_i(code_value());
- [color=#CC6600]if[/color](code_seen([color=#006699]'D'[/color])) bedKd = scalePID_d(code_value());
- updatePID();
- SERIAL_PROTOCOL(MSG_OK);
- SERIAL_PROTOCOL([color=#006699]" p:"[/color]);
- SERIAL_PROTOCOL(bedKp);
- SERIAL_PROTOCOL([color=#006699]" i:"[/color]);
- SERIAL_PROTOCOL(unscalePID_i(bedKi));
- SERIAL_PROTOCOL([color=#006699]" d:"[/color]);
- SERIAL_PROTOCOL(unscalePID_d(bedKd));
- SERIAL_PROTOCOLLN([color=#006699]""[/color]);
- }
- [color=#CC6600]break[/color];
- #endif [color=#7E7E7E]//PIDTEMP[/color]
- [color=#CC6600]case[/color] 240: [color=#7E7E7E]// M240 Triggers a camera by emulating a Canon RC-1 : http://www.doc-diy.net/photo/rc-1_hacked/[/color]
- {
- #if defined(PHOTOGRAPH_PIN) && PHOTOGRAPH_PIN > -1
- [color=#CC6600]const[/color] uint8_t NUM_PULSES=16;
- [color=#CC6600]const[/color] [color=#CC6600]float[/color] PULSE_LENGTH=0.01524;
- [color=#CC6600]for[/color]([color=#CC6600]int[/color] i=0; i < NUM_PULSES; i++) {
- WRITE(PHOTOGRAPH_PIN, [color=#006699]HIGH[/color]);
- _delay_ms(PULSE_LENGTH);
- WRITE(PHOTOGRAPH_PIN, [color=#006699]LOW[/color]);
- _delay_ms(PULSE_LENGTH);
- }
- [color=#CC6600]delay[/color](7.33);
- [color=#CC6600]for[/color]([color=#CC6600]int[/color] i=0; i < NUM_PULSES; i++) {
- WRITE(PHOTOGRAPH_PIN, [color=#006699]HIGH[/color]);
- _delay_ms(PULSE_LENGTH);
- WRITE(PHOTOGRAPH_PIN, [color=#006699]LOW[/color]);
- _delay_ms(PULSE_LENGTH);
- }
- #endif
- }
- [color=#CC6600]break[/color];
- #ifdef DOGLCD
- [color=#CC6600]case[/color] 250: [color=#7E7E7E]// M250 Set LCD contrast value: C<value> (value 0..63)[/color]
- {
- [color=#CC6600]if[/color] (code_seen([color=#006699]'C'[/color])) {
- lcd_setcontrast( (([color=#CC6600]int[/color])code_value())&63 );
- }
- SERIAL_PROTOCOLPGM([color=#006699]"lcd contrast value: "[/color]);
- SERIAL_PROTOCOL(lcd_contrast);
- SERIAL_PROTOCOLLN([color=#006699]""[/color]);
- }
- [color=#CC6600]break[/color];
- #endif
- #ifdef PREVENT_DANGEROUS_EXTRUDE
- [color=#CC6600]case[/color] 302: [color=#7E7E7E]// allow cold extrudes, or set the minimum extrude temperature[/color]
- {
- [color=#CC6600]float[/color] temp = .0;
- [color=#CC6600]if[/color] (code_seen([color=#006699]'S'[/color])) temp=code_value();
- set_extrude_min_temp(temp);
- }
- [color=#CC6600]break[/color];
- #endif
- [color=#CC6600]case[/color] 303: [color=#7E7E7E]// M303 PID autotune[/color]
- {
- [color=#CC6600]float[/color] temp = 150.0;
- [color=#CC6600]int[/color] e=0;
- [color=#CC6600]int[/color] c=5;
- [color=#CC6600]if[/color] (code_seen([color=#006699]'E'[/color])) e=code_value();
- [color=#CC6600]if[/color] (e<0)
- temp=70;
- [color=#CC6600]if[/color] (code_seen([color=#006699]'S'[/color])) temp=code_value();
- [color=#CC6600]if[/color] (code_seen([color=#006699]'C'[/color])) c=code_value();
- PID_autotune(temp, e, c);
- }
- [color=#CC6600]break[/color];
- [color=#CC6600]case[/color] 400: [color=#7E7E7E]// M400 finish all moves[/color]
- {
- st_synchronize();
- }
- [color=#CC6600]break[/color];
- #if defined(ENABLE_AUTO_BED_LEVELING) && defined(SERVO_ENDSTOPS)
- [color=#CC6600]case[/color] 401:
- {
- engage_z_probe(); [color=#7E7E7E]// Engage Z Servo endstop if available[/color]
- }
- [color=#CC6600]break[/color];
- [color=#CC6600]case[/color] 402:
- {
- retract_z_probe(); [color=#7E7E7E]// Retract Z Servo endstop if enabled[/color]
- }
- [color=#CC6600]break[/color];
- #endif
- [color=#CC6600]case[/color] 500: [color=#7E7E7E]// M500 Store settings in EEPROM[/color]
- {
- Config_StoreSettings();
- }
- [color=#CC6600]break[/color];
- [color=#CC6600]case[/color] 501: [color=#7E7E7E]// M501 Read settings from EEPROM[/color]
- {
- Config_RetrieveSettings();
- }
- [color=#CC6600]break[/color];
- [color=#CC6600]case[/color] 502: [color=#7E7E7E]// M502 Revert to default settings[/color]
- {
- Config_ResetDefault();
- }
- [color=#CC6600]break[/color];
- [color=#CC6600]case[/color] 503: [color=#7E7E7E]// M503 print settings currently in memory[/color]
- {
- Config_PrintSettings();
- }
- [color=#CC6600]break[/color];
- #ifdef ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED
- [color=#CC6600]case[/color] 540:
- {
- [color=#CC6600]if[/color](code_seen([color=#006699]'S'[/color])) abort_on_endstop_hit = code_value() > 0;
- }
- [color=#CC6600]break[/color];
- #endif
- #ifdef FILAMENTCHANGEENABLE
- [color=#CC6600]case[/color] 600: [color=#7E7E7E]//Pause for filament change X[pos] Y[pos] Z[relative lift] E[initial retract] L[later retract distance for removal][/color]
- {
- [color=#CC6600]float[/color] target[4];
- [color=#CC6600]float[/color] lastpos[4];
- target[[color=#006699]X_AXIS[/color]]=current_position[[color=#006699]X_AXIS[/color]];
- target[[color=#006699]Y_AXIS[/color]]=current_position[[color=#006699]Y_AXIS[/color]];
- target[[color=#006699]Z_AXIS[/color]]=current_position[[color=#006699]Z_AXIS[/color]];
- target[E_AXIS]=current_position[E_AXIS];
- lastpos[[color=#006699]X_AXIS[/color]]=current_position[[color=#006699]X_AXIS[/color]];
- lastpos[[color=#006699]Y_AXIS[/color]]=current_position[[color=#006699]Y_AXIS[/color]];
- lastpos[[color=#006699]Z_AXIS[/color]]=current_position[[color=#006699]Z_AXIS[/color]];
- lastpos[E_AXIS]=current_position[E_AXIS];
- [color=#7E7E7E]//retract by E[/color]
- [color=#CC6600]if[/color](code_seen([color=#006699]'E'[/color]))
- {
- target[E_AXIS]+= code_value();
- }
- [color=#CC6600]else[/color]
- {
- #ifdef FILAMENTCHANGE_FIRSTRETRACT
- target[E_AXIS]+= FILAMENTCHANGE_FIRSTRETRACT ;
- #endif
- }
- plan_buffer_line(target[[color=#006699]X_AXIS[/color]], target[[color=#006699]Y_AXIS[/color]], target[[color=#006699]Z_AXIS[/color]], target[E_AXIS], feedrate/60, active_extruder);
- [color=#7E7E7E]//lift Z[/color]
- [color=#CC6600]if[/color](code_seen([color=#006699]'Z'[/color]))
- {
- target[[color=#006699]Z_AXIS[/color]]+= code_value();
- }
- [color=#CC6600]else[/color]
- {
- #ifdef FILAMENTCHANGE_ZADD
- target[[color=#006699]Z_AXIS[/color]]+= FILAMENTCHANGE_ZADD ;
- #endif
- }
- plan_buffer_line(target[[color=#006699]X_AXIS[/color]], target[[color=#006699]Y_AXIS[/color]], target[[color=#006699]Z_AXIS[/color]], target[E_AXIS], feedrate/60, active_extruder);
- [color=#7E7E7E]//move xy[/color]
- [color=#CC6600]if[/color](code_seen([color=#006699]'X'[/color]))
- {
- target[[color=#006699]X_AXIS[/color]]+= code_value();
- }
- [color=#CC6600]else[/color]
- {
- #ifdef FILAMENTCHANGE_XPOS
- target[[color=#006699]X_AXIS[/color]]= FILAMENTCHANGE_XPOS ;
- #endif
- }
- [color=#CC6600]if[/color](code_seen([color=#006699]'Y'[/color]))
- {
- target[[color=#006699]Y_AXIS[/color]]= code_value();
- }
- [color=#CC6600]else[/color]
- {
- #ifdef FILAMENTCHANGE_YPOS
- target[[color=#006699]Y_AXIS[/color]]= FILAMENTCHANGE_YPOS ;
- #endif
- }
- plan_buffer_line(target[[color=#006699]X_AXIS[/color]], target[[color=#006699]Y_AXIS[/color]], target[[color=#006699]Z_AXIS[/color]], target[E_AXIS], feedrate/60, active_extruder);
- [color=#CC6600]if[/color](code_seen([color=#006699]'L'[/color]))
- {
- target[E_AXIS]+= code_value();
- }
- [color=#CC6600]else[/color]
- {
- #ifdef FILAMENTCHANGE_FINALRETRACT
- target[E_AXIS]+= FILAMENTCHANGE_FINALRETRACT ;
- #endif
- }
- plan_buffer_line(target[[color=#006699]X_AXIS[/color]], target[[color=#006699]Y_AXIS[/color]], target[[color=#006699]Z_AXIS[/color]], target[E_AXIS], feedrate/60, active_extruder);
- [color=#7E7E7E]//finish moves[/color]
- st_synchronize();
- [color=#7E7E7E]//disable extruder steppers so filament can be removed[/color]
- disable_e0();
- disable_e1();
- disable_e2();
- [color=#CC6600]delay[/color](100);
- LCD_ALERTMESSAGEPGM(MSG_FILAMENTCHANGE);
- uint8_t cnt=0;
- [color=#CC6600]while[/color](!lcd_clicked()){
- cnt++;
- manage_heater();
- manage_inactivity();
- lcd_update();
- [color=#CC6600]if[/color](cnt==0)
- {
- #if BEEPER > 0
- SET_OUTPUT(BEEPER);
- WRITE(BEEPER,[color=#006699]HIGH[/color]);
- [color=#CC6600]delay[/color](3);
- WRITE(BEEPER,[color=#006699]LOW[/color]);
- [color=#CC6600]delay[/color](3);
- #else
- #if !defined(LCD_FEEDBACK_FREQUENCY_HZ) || !defined(LCD_FEEDBACK_FREQUENCY_DURATION_MS)
- lcd_buzz(1000/6,100);
- #else
- lcd_buzz(LCD_FEEDBACK_FREQUENCY_DURATION_MS,LCD_FEEDBACK_FREQUENCY_HZ);
- #endif
- #endif
- }
- }
- [color=#7E7E7E]//return to normal[/color]
- [color=#CC6600]if[/color](code_seen([color=#006699]'L'[/color]))
- {
- target[E_AXIS]+= -code_value();
- }
- [color=#CC6600]else[/color]
- {
- #ifdef FILAMENTCHANGE_FINALRETRACT
- target[E_AXIS]+=(-1)*FILAMENTCHANGE_FINALRETRACT ;
- #endif
- }
- current_position[E_AXIS]=target[E_AXIS]; [color=#7E7E7E]//the long retract of L is compensated by manual filament feeding[/color]
- plan_set_e_position(current_position[E_AXIS]);
- plan_buffer_line(target[[color=#006699]X_AXIS[/color]], target[[color=#006699]Y_AXIS[/color]], target[[color=#006699]Z_AXIS[/color]], target[E_AXIS], feedrate/60, active_extruder); [color=#7E7E7E]//should do nothing[/color]
- plan_buffer_line(lastpos[[color=#006699]X_AXIS[/color]], lastpos[[color=#006699]Y_AXIS[/color]], target[[color=#006699]Z_AXIS[/color]], target[E_AXIS], feedrate/60, active_extruder); [color=#7E7E7E]//move xy back[/color]
- plan_buffer_line(lastpos[[color=#006699]X_AXIS[/color]], lastpos[[color=#006699]Y_AXIS[/color]], lastpos[[color=#006699]Z_AXIS[/color]], target[E_AXIS], feedrate/60, active_extruder); [color=#7E7E7E]//move z back[/color]
- plan_buffer_line(lastpos[[color=#006699]X_AXIS[/color]], lastpos[[color=#006699]Y_AXIS[/color]], lastpos[[color=#006699]Z_AXIS[/color]], lastpos[E_AXIS], feedrate/60, active_extruder); [color=#7E7E7E]//final untretract[/color]
- }
- [color=#CC6600]break[/color];
- #endif [color=#7E7E7E]//FILAMENTCHANGEENABLE[/color]
- #ifdef DUAL_X_CARRIAGE
- [color=#CC6600]case[/color] 605: [color=#7E7E7E]// Set dual x-carriage movement mode:[/color]
- [color=#7E7E7E]// M605 S0: Full control mode. The slicer has full control over x-carriage movement[/color]
- [color=#7E7E7E]// M605 S1: Auto-park mode. The inactive head will auto park/unpark without slicer involvement[/color]
- [color=#7E7E7E]// M605 S2 [Xnnn] [Rmmm]: Duplication mode. The second extruder will duplicate the first with nnn[/color]
- [color=#7E7E7E]// millimeters x-offset and an optional differential hotend temperature of[/color]
- [color=#7E7E7E]// mmm degrees. E.g., with "M605 S2 X100 R2" the second extruder will duplicate[/color]
- [color=#7E7E7E]// the first with a spacing of 100mm in the x direction and 2 degrees hotter.[/color]
- [color=#7E7E7E]//[/color]
- [color=#7E7E7E]// Note: the X axis should be homed after changing dual x-carriage mode.[/color]
- {
- st_synchronize();
- [color=#CC6600]if[/color] (code_seen([color=#006699]'S'[/color]))
- dual_x_carriage_mode = code_value();
- [color=#CC6600]if[/color] (dual_x_carriage_mode == DXC_DUPLICATION_MODE)
- {
- [color=#CC6600]if[/color] (code_seen([color=#006699]'X'[/color]))
- duplicate_extruder_x_offset = [color=#CC6600]max[/color](code_value(),X2_MIN_POS - x_home_pos(0));
- [color=#CC6600]if[/color] (code_seen([color=#006699]'R'[/color]))
- duplicate_extruder_temp_offset = code_value();
- SERIAL_ECHO_START;
- SERIAL_ECHOPGM(MSG_HOTEND_OFFSET);
- SERIAL_ECHO([color=#006699]" "[/color]);
- SERIAL_ECHO(extruder_offset[[color=#006699]X_AXIS[/color]][0]);
- SERIAL_ECHO([color=#006699]","[/color]);
- SERIAL_ECHO(extruder_offset[[color=#006699]Y_AXIS[/color]][0]);
- SERIAL_ECHO([color=#006699]" "[/color]);
- SERIAL_ECHO(duplicate_extruder_x_offset);
- SERIAL_ECHO([color=#006699]","[/color]);
- SERIAL_ECHOLN(extruder_offset[[color=#006699]Y_AXIS[/color]][1]);
- }
- [color=#CC6600]else[/color] [color=#CC6600]if[/color] (dual_x_carriage_mode != DXC_FULL_CONTROL_MODE && dual_x_carriage_mode != DXC_AUTO_PARK_MODE)
- {
- dual_x_carriage_mode = DEFAULT_DUAL_X_CARRIAGE_MODE;
- }
- active_extruder_parked = [color=#CC6600]false[/color];
- extruder_duplication_enabled = [color=#CC6600]false[/color];
- delayed_move_time = 0;
- }
- [color=#CC6600]break[/color];
- #endif [color=#7E7E7E]//DUAL_X_CARRIAGE[/color]
- [color=#CC6600]case[/color] 907: [color=#7E7E7E]// M907 Set digital trimpot motor current using axis codes.[/color]
- {
- #if defined(DIGIPOTSS_PIN) && DIGIPOTSS_PIN > -1
- [color=#CC6600]for[/color]([color=#CC6600]int[/color] i=0;i<NUM_AXIS;i++) [color=#CC6600]if[/color](code_seen(axis_codes[i])) digipot_current(i,code_value());
- [color=#CC6600]if[/color](code_seen([color=#006699]'B'[/color])) digipot_current(4,code_value());
- [color=#CC6600]if[/color](code_seen([color=#006699]'S'[/color])) [color=#CC6600]for[/color]([color=#CC6600]int[/color] i=0;i<=4;i++) digipot_current(i,code_value());
- #endif
- #ifdef MOTOR_CURRENT_PWM_XY_PIN
- [color=#CC6600]if[/color](code_seen([color=#006699]'X'[/color])) digipot_current(0, code_value());
- #endif
- #ifdef MOTOR_CURRENT_PWM_Z_PIN
- [color=#CC6600]if[/color](code_seen([color=#006699]'Z'[/color])) digipot_current(1, code_value());
- #endif
- #ifdef MOTOR_CURRENT_PWM_E_PIN
- [color=#CC6600]if[/color](code_seen([color=#006699]'E'[/color])) digipot_current(2, code_value());
- #endif
- #ifdef DIGIPOT_I2C
- [color=#7E7E7E]// this one uses actual amps in floating point[/color]
- [color=#CC6600]for[/color]([color=#CC6600]int[/color] i=0;i<NUM_AXIS;i++) [color=#CC6600]if[/color](code_seen(axis_codes[i])) digipot_i2c_set_current(i, code_value());
- [color=#7E7E7E]// for each additional extruder (named B,C,D,E..., channels 4,5,6,7...)[/color]
- [color=#CC6600]for[/color]([color=#CC6600]int[/color] i=NUM_AXIS;i<DIGIPOT_I2C_NUM_CHANNELS;i++) [color=#CC6600]if[/color](code_seen([color=#006699]'B'[/color]+i-NUM_AXIS)) digipot_i2c_set_current(i, code_value());
- #endif
- }
- [color=#CC6600]break[/color];
- [color=#CC6600]case[/color] 908: [color=#7E7E7E]// M908 Control digital trimpot directly.[/color]
- {
- #if defined(DIGIPOTSS_PIN) && DIGIPOTSS_PIN > -1
- uint8_t channel,current;
- [color=#CC6600]if[/color](code_seen([color=#006699]'P'[/color])) channel=code_value();
- [color=#CC6600]if[/color](code_seen([color=#006699]'S'[/color])) current=code_value();
- digitalPotWrite(channel, current);
- #endif
- }
- [color=#CC6600]break[/color];
- [color=#CC6600]case[/color] 350: [color=#7E7E7E]// M350 Set microstepping mode. Warning: Steps per unit remains unchanged. S code sets stepping mode for all drivers.[/color]
- {
- #if defined(X_MS1_PIN) && X_MS1_PIN > -1
- [color=#CC6600]if[/color](code_seen([color=#006699]'S'[/color])) [color=#CC6600]for[/color]([color=#CC6600]int[/color] i=0;i<=4;i++) microstep_mode(i,code_value());
- [color=#CC6600]for[/color]([color=#CC6600]int[/color] i=0;i<NUM_AXIS;i++) [color=#CC6600]if[/color](code_seen(axis_codes[i])) microstep_mode(i,(uint8_t)code_value());
- [color=#CC6600]if[/color](code_seen([color=#006699]'B'[/color])) microstep_mode(4,code_value());
- microstep_readings();
- #endif
- }
- [color=#CC6600]break[/color];
- [color=#CC6600]case[/color] 351: [color=#7E7E7E]// M351 Toggle MS1 MS2 pins directly, S# determines MS1 or MS2, X# sets the pin high/low.[/color]
- {
- #if defined(X_MS1_PIN) && X_MS1_PIN > -1
- [color=#CC6600]if[/color](code_seen([color=#006699]'S'[/color])) [color=#CC6600]switch[/color](([color=#CC6600]int[/color])code_value())
- {
- [color=#CC6600]case[/color] 1:
- [color=#CC6600]for[/color]([color=#CC6600]int[/color] i=0;i<NUM_AXIS;i++) [color=#CC6600]if[/color](code_seen(axis_codes[i])) microstep_ms(i,code_value(),-1);
- [color=#CC6600]if[/color](code_seen([color=#006699]'B'[/color])) microstep_ms(4,code_value(),-1);
- [color=#CC6600]break[/color];
- [color=#CC6600]case[/color] 2:
- [color=#CC6600]for[/color]([color=#CC6600]int[/color] i=0;i<NUM_AXIS;i++) [color=#CC6600]if[/color](code_seen(axis_codes[i])) microstep_ms(i,-1,code_value());
- [color=#CC6600]if[/color](code_seen([color=#006699]'B'[/color])) microstep_ms(4,-1,code_value());
- [color=#CC6600]break[/color];
- }
- microstep_readings();
- #endif
- }
- [color=#CC6600]break[/color];
- [color=#CC6600]case[/color] 999: [color=#7E7E7E]// M999: Restart after being stopped[/color]
- Stopped = [color=#CC6600]false[/color];
- lcd_reset_alert_level();
- gcode_LastN = Stopped_gcode_LastN;
- FlushSerialRequestResend();
- [color=#CC6600]break[/color];
- }
- }
- [color=#CC6600]else[/color] [color=#CC6600]if[/color](code_seen([color=#006699]'T'[/color]))
- {
- tmp_extruder = code_value();
- [color=#CC6600]if[/color](tmp_extruder >= EXTRUDERS) {
- SERIAL_ECHO_START;
- SERIAL_ECHO([color=#006699]"T"[/color]);
- SERIAL_ECHO(tmp_extruder);
- SERIAL_ECHOLN(MSG_INVALID_EXTRUDER);
- }
- [color=#CC6600]else[/color] {
- [color=#CC6600]boolean[/color] make_move = [color=#CC6600]false[/color];
- [color=#CC6600]if[/color](code_seen([color=#006699]'F'[/color])) {
- make_move = [color=#CC6600]true[/color];
- next_feedrate = code_value();
- [color=#CC6600]if[/color](next_feedrate > 0.0) {
- feedrate = next_feedrate;
- }
- }
- #if EXTRUDERS > 1
- [color=#CC6600]if[/color](tmp_extruder != active_extruder) {
- [color=#7E7E7E]// Save current position to return to after applying extruder offset[/color]
- memcpy(destination, current_position, sizeof(destination));
- #ifdef DUAL_X_CARRIAGE
- [color=#CC6600]if[/color] (dual_x_carriage_mode == DXC_AUTO_PARK_MODE && Stopped == [color=#CC6600]false[/color] &&
- (delayed_move_time != 0 || current_position[[color=#006699]X_AXIS[/color]] != x_home_pos(active_extruder)))
- {
- [color=#7E7E7E]// Park old head: 1) raise 2) move to park position 3) lower[/color]
- plan_buffer_line(current_position[[color=#006699]X_AXIS[/color]], current_position[[color=#006699]Y_AXIS[/color]], current_position[[color=#006699]Z_AXIS[/color]] + TOOLCHANGE_PARK_ZLIFT,
- current_position[E_AXIS], max_feedrate[[color=#006699]Z_AXIS[/color]], active_extruder);
- plan_buffer_line(x_home_pos(active_extruder), current_position[[color=#006699]Y_AXIS[/color]], current_position[[color=#006699]Z_AXIS[/color]] + TOOLCHANGE_PARK_ZLIFT,
- current_position[E_AXIS], max_feedrate[[color=#006699]X_AXIS[/color]], active_extruder);
- plan_buffer_line(x_home_pos(active_extruder), current_position[[color=#006699]Y_AXIS[/color]], current_position[[color=#006699]Z_AXIS[/color]],
- current_position[E_AXIS], max_feedrate[[color=#006699]Z_AXIS[/color]], active_extruder);
- st_synchronize();
- }
- [color=#7E7E7E]// apply Y & Z extruder offset (x offset is already used in determining home pos)[/color]
- current_position[[color=#006699]Y_AXIS[/color]] = current_position[[color=#006699]Y_AXIS[/color]] -
- extruder_offset[[color=#006699]Y_AXIS[/color]][active_extruder] +
- extruder_offset[[color=#006699]Y_AXIS[/color]][tmp_extruder];
- current_position[[color=#006699]Z_AXIS[/color]] = current_position[[color=#006699]Z_AXIS[/color]] -
- extruder_offset[[color=#006699]Z_AXIS[/color]][active_extruder] +
- extruder_offset[[color=#006699]Z_AXIS[/color]][tmp_extruder];
- active_extruder = tmp_extruder;
- [color=#7E7E7E]// This function resets the max/min values - the current position may be overwritten below.[/color]
- axis_is_at_home([color=#006699]X_AXIS[/color]);
- [color=#CC6600]if[/color] (dual_x_carriage_mode == DXC_FULL_CONTROL_MODE)
- {
- current_position[[color=#006699]X_AXIS[/color]] = inactive_extruder_x_pos;
- inactive_extruder_x_pos = destination[[color=#006699]X_AXIS[/color]];
- }
- [color=#CC6600]else[/color] [color=#CC6600]if[/color] (dual_x_carriage_mode == DXC_DUPLICATION_MODE)
- {
- active_extruder_parked = (active_extruder == 0); [color=#7E7E7E]// this triggers the second extruder to move into the duplication position[/color]
- [color=#CC6600]if[/color] (active_extruder == 0 || active_extruder_parked)
- current_position[[color=#006699]X_AXIS[/color]] = inactive_extruder_x_pos;
- [color=#CC6600]else[/color]
- current_position[[color=#006699]X_AXIS[/color]] = destination[[color=#006699]X_AXIS[/color]] + duplicate_extruder_x_offset;
- inactive_extruder_x_pos = destination[[color=#006699]X_AXIS[/color]];
- extruder_duplication_enabled = [color=#CC6600]false[/color];
- }
- [color=#CC6600]else[/color]
- {
- [color=#7E7E7E]// record raised toolhead position for use by unpark[/color]
- memcpy(raised_parked_position, current_position, sizeof(raised_parked_position));
- raised_parked_position[[color=#006699]Z_AXIS[/color]] += TOOLCHANGE_UNPARK_ZLIFT;
- active_extruder_parked = [color=#CC6600]true[/color];
- delayed_move_time = 0;
- }
- #else
- [color=#7E7E7E]// Offset extruder (only by XY)[/color]
- [color=#CC6600]int[/color] i;
- [color=#CC6600]for[/color](i = 0; i < 2; i++) {
- current_position[i] = current_position[i] -
- extruder_offset[i][active_extruder] +
- extruder_offset[i][tmp_extruder];
- }
- [color=#7E7E7E]// Set the new active extruder and position[/color]
- active_extruder = tmp_extruder;
- #endif [color=#7E7E7E]//else DUAL_X_CARRIAGE[/color]
- plan_set_position(current_position[[color=#006699]X_AXIS[/color]], current_position[[color=#006699]Y_AXIS[/color]], current_position[[color=#006699]Z_AXIS[/color]], current_position[E_AXIS]);
- [color=#7E7E7E]// Move to the old position if 'F' was in the parameters[/color]
- [color=#CC6600]if[/color](make_move && Stopped == [color=#CC6600]false[/color]) {
- prepare_move();
- }
- }
- #endif
- SERIAL_ECHO_START;
- SERIAL_ECHO(MSG_ACTIVE_EXTRUDER);
- SERIAL_PROTOCOLLN(([color=#CC6600]int[/color])active_extruder);
- }
- }
- [color=#CC6600]else[/color]
- {
- SERIAL_ECHO_START;
- SERIAL_ECHOPGM(MSG_UNKNOWN_COMMAND);
- SERIAL_ECHO(cmdbuffer[bufindr]);
- SERIAL_ECHOLNPGM([color=#006699]"\""[/color]);
- }
- ClearToSend();
- }
- [color=#CC6600]void[/color] FlushSerialRequestResend()
- {
- [color=#7E7E7E]//char cmdbuffer[bufindr][100]="Resend:";[/color]
- MYSERIAL.[color=#CC6600]flush[/color]();
- SERIAL_PROTOCOLPGM(MSG_RESEND);
- SERIAL_PROTOCOLLN(gcode_LastN + 1);
- ClearToSend();
- }
- [color=#CC6600]void[/color] ClearToSend()
- {
- previous_millis_cmd = [color=#CC6600]millis[/color]();
- #ifdef SDSUPPORT
- [color=#CC6600]if[/color](fromsd[bufindr])
- [color=#CC6600]return[/color];
- #endif [color=#7E7E7E]//SDSUPPORT[/color]
- SERIAL_PROTOCOLLNPGM(MSG_OK);
- }
- [color=#CC6600]void[/color] get_coordinates()
- {
- bool seen[4]={[color=#CC6600]false[/color],[color=#CC6600]false[/color],[color=#CC6600]false[/color],[color=#CC6600]false[/color]};
- [color=#CC6600]for[/color](int8_t i=0; i < NUM_AXIS; i++) {
- [color=#CC6600]if[/color](code_seen(axis_codes[i]))
- {
- destination[i] = ([color=#CC6600]float[/color])code_value() + (axis_relative_modes[i] || relative_mode)*current_position[i];
- seen[i]=[color=#CC6600]true[/color];
- }
- [color=#CC6600]else[/color] destination[i] = current_position[i]; [color=#7E7E7E]//Are these else lines really needed?[/color]
- }
- [color=#CC6600]if[/color](code_seen([color=#006699]'F'[/color])) {
- next_feedrate = code_value();
- [color=#CC6600]if[/color](next_feedrate > 0.0) feedrate = next_feedrate;
- }
- #ifdef FWRETRACT
- [color=#CC6600]if[/color](autoretract_enabled)
- [color=#CC6600]if[/color]( !(seen[[color=#006699]X_AXIS[/color]] || seen[[color=#006699]Y_AXIS[/color]] || seen[[color=#006699]Z_AXIS[/color]]) && seen[E_AXIS])
- {
- [color=#CC6600]float[/color] echange=destination[E_AXIS]-current_position[E_AXIS];
- [color=#CC6600]if[/color](echange<-MIN_RETRACT) [color=#7E7E7E]//retract[/color]
- {
- [color=#CC6600]if[/color](!retracted)
- {
- destination[[color=#006699]Z_AXIS[/color]]+=retract_zlift; [color=#7E7E7E]//not sure why chaninging current_position negatively does not work.[/color]
- [color=#7E7E7E]//if slicer retracted by echange=-1mm and you want to retract 3mm, corrrectede=-2mm additionally[/color]
- [color=#CC6600]float[/color] correctede=-echange-retract_length;
- [color=#7E7E7E]//to generate the additional steps, not the destination is changed, but inversely the current position[/color]
- current_position[E_AXIS]+=-correctede;
- feedrate=retract_feedrate;
- retracted=[color=#CC6600]true[/color];
- }
- }
- [color=#CC6600]else[/color]
- [color=#CC6600]if[/color](echange>MIN_RETRACT) [color=#7E7E7E]//retract_recover[/color]
- {
- [color=#CC6600]if[/color](retracted)
- {
- [color=#7E7E7E]//current_position[Z_AXIS]+=-retract_zlift;[/color]
- [color=#7E7E7E]//if slicer retracted_recovered by echange=+1mm and you want to retract_recover 3mm, corrrectede=2mm additionally[/color]
- [color=#CC6600]float[/color] correctede=-echange+1*retract_length+retract_recover_length; [color=#7E7E7E]//total unretract=retract_length+retract_recover_length[surplus][/color]
- current_position[E_AXIS]+=correctede; [color=#7E7E7E]//to generate the additional steps, not the destination is changed, but inversely the current position[/color]
- feedrate=retract_recover_feedrate;
- retracted=[color=#CC6600]false[/color];
- }
- }
- }
- #endif [color=#7E7E7E]//FWRETRACT[/color]
- }
- [color=#CC6600]void[/color] get_arc_coordinates()
- {
- #ifdef SF_ARC_FIX
- bool relative_mode_backup = relative_mode;
- relative_mode = [color=#CC6600]true[/color];
- #endif
- get_coordinates();
- #ifdef SF_ARC_FIX
- relative_mode=relative_mode_backup;
- #endif
- [color=#CC6600]if[/color](code_seen([color=#006699]'I'[/color])) {
- offset[0] = code_value();
- }
- [color=#CC6600]else[/color] {
- offset[0] = 0.0;
- }
- [color=#CC6600]if[/color](code_seen([color=#006699]'J'[/color])) {
- offset[1] = code_value();
- }
- [color=#CC6600]else[/color] {
- offset[1] = 0.0;
- }
- }
- [color=#CC6600]void[/color] clamp_to_software_endstops([color=#CC6600]float[/color] target[3])
- {
- [color=#CC6600]if[/color] (min_software_endstops) {
- [color=#CC6600]if[/color] (target[[color=#006699]X_AXIS[/color]] < min_pos[[color=#006699]X_AXIS[/color]]) target[[color=#006699]X_AXIS[/color]] = min_pos[[color=#006699]X_AXIS[/color]];
- [color=#CC6600]if[/color] (target[[color=#006699]Y_AXIS[/color]] < min_pos[[color=#006699]Y_AXIS[/color]]) target[[color=#006699]Y_AXIS[/color]] = min_pos[[color=#006699]Y_AXIS[/color]];
- [color=#CC6600]if[/color] (target[[color=#006699]Z_AXIS[/color]] < min_pos[[color=#006699]Z_AXIS[/color]]) target[[color=#006699]Z_AXIS[/color]] = min_pos[[color=#006699]Z_AXIS[/color]];
- }
- [color=#CC6600]if[/color] (max_software_endstops) {
- [color=#CC6600]if[/color] (target[[color=#006699]X_AXIS[/color]] > max_pos[[color=#006699]X_AXIS[/color]]) target[[color=#006699]X_AXIS[/color]] = max_pos[[color=#006699]X_AXIS[/color]];
- [color=#CC6600]if[/color] (target[[color=#006699]Y_AXIS[/color]] > max_pos[[color=#006699]Y_AXIS[/color]]) target[[color=#006699]Y_AXIS[/color]] = max_pos[[color=#006699]Y_AXIS[/color]];
- [color=#CC6600]if[/color] (target[[color=#006699]Z_AXIS[/color]] > max_pos[[color=#006699]Z_AXIS[/color]]) target[[color=#006699]Z_AXIS[/color]] = max_pos[[color=#006699]Z_AXIS[/color]];
- }
- }
- #ifdef DELTA
- [color=#CC6600]void[/color] calculate_delta([color=#CC6600]float[/color] cartesian[3])
- {
- delta[[color=#006699]X_AXIS[/color]] = [color=#CC6600]sqrt[/color](DELTA_DIAGONAL_ROD_2
- - [color=#CC6600]sq[/color](DELTA_TOWER1_X-cartesian[[color=#006699]X_AXIS[/color]])
- - [color=#CC6600]sq[/color](DELTA_TOWER1_Y-cartesian[[color=#006699]Y_AXIS[/color]])
- ) + cartesian[[color=#006699]Z_AXIS[/color]];
- delta[[color=#006699]Y_AXIS[/color]] = [color=#CC6600]sqrt[/color](DELTA_DIAGONAL_ROD_2
- - [color=#CC6600]sq[/color](DELTA_TOWER2_X-cartesian[[color=#006699]X_AXIS[/color]])
- - [color=#CC6600]sq[/color](DELTA_TOWER2_Y-cartesian[[color=#006699]Y_AXIS[/color]])
- ) + cartesian[[color=#006699]Z_AXIS[/color]];
- delta[[color=#006699]Z_AXIS[/color]] = [color=#CC6600]sqrt[/color](DELTA_DIAGONAL_ROD_2
- - [color=#CC6600]sq[/color](DELTA_TOWER3_X-cartesian[[color=#006699]X_AXIS[/color]])
- - [color=#CC6600]sq[/color](DELTA_TOWER3_Y-cartesian[[color=#006699]Y_AXIS[/color]])
- ) + cartesian[[color=#006699]Z_AXIS[/color]];
- [color=#7E7E7E]/*[/color]
- [color=#7E7E7E] SERIAL_ECHOPGM("cartesian x="); SERIAL_ECHO(cartesian[X_AXIS]);[/color]
- [color=#7E7E7E] SERIAL_ECHOPGM(" y="); SERIAL_ECHO(cartesian[Y_AXIS]);[/color]
- [color=#7E7E7E] SERIAL_ECHOPGM(" z="); SERIAL_ECHOLN(cartesian[Z_AXIS]);[/color]
- [color=#7E7E7E] SERIAL_ECHOPGM("delta x="); SERIAL_ECHO(delta[X_AXIS]);[/color]
- [color=#7E7E7E] SERIAL_ECHOPGM(" y="); SERIAL_ECHO(delta[Y_AXIS]);[/color]
- [color=#7E7E7E] SERIAL_ECHOPGM(" z="); SERIAL_ECHOLN(delta[Z_AXIS]);[/color]
- [color=#7E7E7E] */[/color]
- }
- #endif
- [color=#CC6600]void[/color] prepare_move()
- {
- clamp_to_software_endstops(destination);
- previous_millis_cmd = [color=#CC6600]millis[/color]();
- #ifdef DELTA
- [color=#CC6600]float[/color] difference[NUM_AXIS];
- [color=#CC6600]for[/color] (int8_t i=0; i < NUM_AXIS; i++) {
- difference[i] = destination[i] - current_position[i];
- }
- [color=#CC6600]float[/color] cartesian_mm = [color=#CC6600]sqrt[/color]([color=#CC6600]sq[/color](difference[[color=#006699]X_AXIS[/color]]) +
- [color=#CC6600]sq[/color](difference[[color=#006699]Y_AXIS[/color]]) +
- [color=#CC6600]sq[/color](difference[[color=#006699]Z_AXIS[/color]]));
- [color=#CC6600]if[/color] (cartesian_mm < 0.000001) { cartesian_mm = [color=#CC6600]abs[/color](difference[E_AXIS]); }
- [color=#CC6600]if[/color] (cartesian_mm < 0.000001) { [color=#CC6600]return[/color]; }
- [color=#CC6600]float[/color] seconds = 6000 * cartesian_mm / feedrate / feedmultiply;
- [color=#CC6600]int[/color] steps = [color=#CC6600]max[/color](1, [color=#CC6600]int[/color](DELTA_SEGMENTS_PER_SECOND * seconds));
- [color=#7E7E7E]// SERIAL_ECHOPGM("mm="); SERIAL_ECHO(cartesian_mm);[/color]
- [color=#7E7E7E]// SERIAL_ECHOPGM(" seconds="); SERIAL_ECHO(seconds);[/color]
- [color=#7E7E7E]// SERIAL_ECHOPGM(" steps="); SERIAL_ECHOLN(steps);[/color]
- [color=#CC6600]for[/color] ([color=#CC6600]int[/color] s = 1; s <= steps; s++) {
- [color=#CC6600]float[/color] fraction = [color=#CC6600]float[/color](s) / [color=#CC6600]float[/color](steps);
- [color=#CC6600]for[/color](int8_t i=0; i < NUM_AXIS; i++) {
- destination[i] = current_position[i] + difference[i] * fraction;
- }
- calculate_delta(destination);
- plan_buffer_line(delta[[color=#006699]X_AXIS[/color]], delta[[color=#006699]Y_AXIS[/color]], delta[[color=#006699]Z_AXIS[/color]],
- destination[E_AXIS], feedrate*feedmultiply/60/100.0,
- active_extruder);
- }
- #else
- #ifdef DUAL_X_CARRIAGE
- [color=#CC6600]if[/color] (active_extruder_parked)
- {
- [color=#CC6600]if[/color] (dual_x_carriage_mode == DXC_DUPLICATION_MODE && active_extruder == 0)
- {
- [color=#7E7E7E]// move duplicate extruder into correct duplication position.[/color]
- plan_set_position(inactive_extruder_x_pos, current_position[[color=#006699]Y_AXIS[/color]], current_position[[color=#006699]Z_AXIS[/color]], current_position[E_AXIS]);
- plan_buffer_line(current_position[[color=#006699]X_AXIS[/color]] + duplicate_extruder_x_offset, current_position[[color=#006699]Y_AXIS[/color]], current_position[[color=#006699]Z_AXIS[/color]],
- current_position[E_AXIS], max_feedrate[[color=#006699]X_AXIS[/color]], 1);
- plan_set_position(current_position[[color=#006699]X_AXIS[/color]], current_position[[color=#006699]Y_AXIS[/color]], current_position[[color=#006699]Z_AXIS[/color]], current_position[E_AXIS]);
- st_synchronize();
- extruder_duplication_enabled = [color=#CC6600]true[/color];
- active_extruder_parked = [color=#CC6600]false[/color];
- }
- [color=#CC6600]else[/color] [color=#CC6600]if[/color] (dual_x_carriage_mode == DXC_AUTO_PARK_MODE) [color=#7E7E7E]// handle unparking of head[/color]
- {
- [color=#CC6600]if[/color] (current_position[E_AXIS] == destination[E_AXIS])
- {
- [color=#7E7E7E]// this is a travel move - skit it but keep track of current position (so that it can later[/color]
- [color=#7E7E7E]// be used as start of first non-travel move)[/color]
- [color=#CC6600]if[/color] (delayed_move_time != 0xFFFFFFFFUL)
- {
- memcpy(current_position, destination, sizeof(current_position));
- [color=#CC6600]if[/color] (destination[[color=#006699]Z_AXIS[/color]] > raised_parked_position[[color=#006699]Z_AXIS[/color]])
- raised_parked_position[[color=#006699]Z_AXIS[/color]] = destination[[color=#006699]Z_AXIS[/color]];
- delayed_move_time = [color=#CC6600]millis[/color]();
- [color=#CC6600]return[/color];
- }
- }
- delayed_move_time = 0;
- [color=#7E7E7E]// unpark extruder: 1) raise, 2) move into starting XY position, 3) lower[/color]
- plan_buffer_line(raised_parked_position[[color=#006699]X_AXIS[/color]], raised_parked_position[[color=#006699]Y_AXIS[/color]], raised_parked_position[[color=#006699]Z_AXIS[/color]], current_position[E_AXIS], max_feedrate[[color=#006699]Z_AXIS[/color]], active_extruder);
- plan_buffer_line(current_position[[color=#006699]X_AXIS[/color]], current_position[[color=#006699]Y_AXIS[/color]], raised_parked_position[[color=#006699]Z_AXIS[/color]],
- current_position[E_AXIS], [color=#CC6600]min[/color](max_feedrate[[color=#006699]X_AXIS[/color]],max_feedrate[[color=#006699]Y_AXIS[/color]]), active_extruder);
- plan_buffer_line(current_position[[color=#006699]X_AXIS[/color]], current_position[[color=#006699]Y_AXIS[/color]], current_position[[color=#006699]Z_AXIS[/color]],
- current_position[E_AXIS], max_feedrate[[color=#006699]Z_AXIS[/color]], active_extruder);
- active_extruder_parked = [color=#CC6600]false[/color];
- }
- }
- #endif [color=#7E7E7E]//DUAL_X_CARRIAGE[/color]
- [color=#7E7E7E]// Do not use feedmultiply for E or Z only moves[/color]
- [color=#CC6600]if[/color]( (current_position[[color=#006699]X_AXIS[/color]] == destination [[color=#006699]X_AXIS[/color]]) && (current_position[[color=#006699]Y_AXIS[/color]] == destination [[color=#006699]Y_AXIS[/color]])) {
- plan_buffer_line(destination[[color=#006699]X_AXIS[/color]], destination[[color=#006699]Y_AXIS[/color]], destination[[color=#006699]Z_AXIS[/color]], destination[E_AXIS], feedrate/60, active_extruder);
- }
- [color=#CC6600]else[/color] {
- plan_buffer_line(destination[[color=#006699]X_AXIS[/color]], destination[[color=#006699]Y_AXIS[/color]], destination[[color=#006699]Z_AXIS[/color]], destination[E_AXIS], feedrate*feedmultiply/60/100.0, active_extruder);
- }
- #endif [color=#7E7E7E]//else DELTA[/color]
- [color=#CC6600]for[/color](int8_t i=0; i < NUM_AXIS; i++) {
- current_position[i] = destination[i];
- }
- }
- [color=#CC6600]void[/color] prepare_arc_move([color=#CC6600]char[/color] isclockwise) {
- [color=#CC6600]float[/color] r = hypot(offset[[color=#006699]X_AXIS[/color]], offset[[color=#006699]Y_AXIS[/color]]); [color=#7E7E7E]// Compute arc radius for mc_arc[/color]
- [color=#7E7E7E]// Trace the arc[/color]
- mc_arc(current_position, destination, offset, [color=#006699]X_AXIS[/color], [color=#006699]Y_AXIS[/color], [color=#006699]Z_AXIS[/color], feedrate*feedmultiply/60/100.0, r, isclockwise, active_extruder);
- [color=#7E7E7E]// As far as the parser is concerned, the position is now == target. In reality the[/color]
- [color=#7E7E7E]// motion control system might still be processing the action and the real tool position[/color]
- [color=#7E7E7E]// in any intermediate location.[/color]
- [color=#CC6600]for[/color](int8_t i=0; i < NUM_AXIS; i++) {
- current_position[i] = destination[i];
- }
- previous_millis_cmd = [color=#CC6600]millis[/color]();
- }
- #if defined(CONTROLLERFAN_PIN) && CONTROLLERFAN_PIN > -1
- #if defined(FAN_PIN)
- #if CONTROLLERFAN_PIN == FAN_PIN
- #error [color=#006699]"You cannot set CONTROLLERFAN_PIN equal to FAN_PIN"[/color]
- #endif
- #endif
- [color=#CC6600]unsigned[/color] [color=#CC6600]long[/color] lastMotor = 0; [color=#7E7E7E]//Save the time for when a motor was turned on last[/color]
- [color=#CC6600]unsigned[/color] [color=#CC6600]long[/color] lastMotorCheck = 0;
- [color=#CC6600]void[/color] controllerFan()
- {
- [color=#CC6600]if[/color] (([color=#CC6600]millis[/color]() - lastMotorCheck) >= 2500) [color=#7E7E7E]//Not a time critical function, so we only check every 2500ms[/color]
- {
- lastMotorCheck = [color=#CC6600]millis[/color]();
- [color=#CC6600]if[/color](!READ(X_ENABLE_PIN) || !READ(Y_ENABLE_PIN) || !READ(Z_ENABLE_PIN) || (soft_pwm_bed > 0)
- #if EXTRUDERS > 2
- || !READ(E2_ENABLE_PIN)
- #endif
- #if EXTRUDER > 1
- #if defined(X2_ENABLE_PIN) && X2_ENABLE_PIN > -1
- || !READ(X2_ENABLE_PIN)
- #endif
- || !READ(E1_ENABLE_PIN)
- #endif
- || !READ(E0_ENABLE_PIN)) [color=#7E7E7E]//If any of the drivers are enabled...[/color]
- {
- lastMotor = [color=#CC6600]millis[/color](); [color=#7E7E7E]//... set time to NOW so the fan will turn on[/color]
- }
- [color=#CC6600]if[/color] (([color=#CC6600]millis[/color]() - lastMotor) >= (CONTROLLERFAN_SECS*1000UL) || lastMotor == 0) [color=#7E7E7E]//If the last time any driver was enabled, is longer since than CONTROLLERSEC...[/color]
- {
- [color=#CC6600]digitalWrite[/color](CONTROLLERFAN_PIN, 0);
- [color=#CC6600]analogWrite[/color](CONTROLLERFAN_PIN, 0);
- }
- [color=#CC6600]else[/color]
- {
- [color=#7E7E7E]// allows digital or PWM fan output to be used (see M42 handling)[/color]
- [color=#CC6600]digitalWrite[/color](CONTROLLERFAN_PIN, CONTROLLERFAN_SPEED);
- [color=#CC6600]analogWrite[/color](CONTROLLERFAN_PIN, CONTROLLERFAN_SPEED);
- }
- }
- }
- #endif
- #ifdef TEMP_STAT_LEDS
- [color=#CC6600]static[/color] bool blue_led = [color=#CC6600]false[/color];
- [color=#CC6600]static[/color] bool red_led = [color=#CC6600]false[/color];
- [color=#CC6600]static[/color] uint32_t stat_update = 0;
- [color=#CC6600]void[/color] handle_status_leds([color=#CC6600]void[/color]) {
- [color=#CC6600]float[/color] max_temp = 0.0;
- [color=#CC6600]if[/color]([color=#CC6600]millis[/color]() > stat_update) {
- stat_update += 500; [color=#7E7E7E]// Update every 0.5s[/color]
- [color=#CC6600]for[/color] (int8_t cur_extruder = 0; cur_extruder < EXTRUDERS; ++cur_extruder) {
- max_temp = [color=#CC6600]max[/color](max_temp, degHotend(cur_extruder));
- max_temp = [color=#CC6600]max[/color](max_temp, degTargetHotend(cur_extruder));
- }
- #if defined(TEMP_BED_PIN) && TEMP_BED_PIN > -1
- max_temp = [color=#CC6600]max[/color](max_temp, degTargetBed());
- max_temp = [color=#CC6600]max[/color](max_temp, degBed());
- #endif
- [color=#CC6600]if[/color]((max_temp > 55.0) && (red_led == [color=#CC6600]false[/color])) {
- [color=#CC6600]digitalWrite[/color](STAT_LED_RED, 1);
- [color=#CC6600]digitalWrite[/color](STAT_LED_BLUE, 0);
- red_led = [color=#CC6600]true[/color];
- blue_led = [color=#CC6600]false[/color];
- }
- [color=#CC6600]if[/color]((max_temp < 54.0) && (blue_led == [color=#CC6600]false[/color])) {
- [color=#CC6600]digitalWrite[/color](STAT_LED_RED, 0);
- [color=#CC6600]digitalWrite[/color](STAT_LED_BLUE, 1);
- red_led = [color=#CC6600]false[/color];
- blue_led = [color=#CC6600]true[/color];
- }
- }
- }
- #endif
- [color=#CC6600]void[/color] manage_inactivity()
- {
- [color=#CC6600]if[/color]( ([color=#CC6600]millis[/color]() - previous_millis_cmd) > max_inactive_time )
- [color=#CC6600]if[/color](max_inactive_time)
- kill();
- [color=#CC6600]if[/color](stepper_inactive_time) {
- [color=#CC6600]if[/color]( ([color=#CC6600]millis[/color]() - previous_millis_cmd) > stepper_inactive_time )
- {
- [color=#CC6600]if[/color](blocks_queued() == [color=#CC6600]false[/color]) {
- disable_x();
- disable_y();
- disable_z();
- disable_e0();
- disable_e1();
- disable_e2();
- }
- }
- }
- #if defined(KILL_PIN) && KILL_PIN > -1
- [color=#CC6600]if[/color]( 0 == READ(KILL_PIN) )
- kill();
- #endif
- #if defined(CONTROLLERFAN_PIN) && CONTROLLERFAN_PIN > -1
- controllerFan(); [color=#7E7E7E]//Check if fan should be turned on to cool stepper drivers down[/color]
- #endif
- #ifdef EXTRUDER_RUNOUT_PREVENT
- [color=#CC6600]if[/color]( ([color=#CC6600]millis[/color]() - previous_millis_cmd) > EXTRUDER_RUNOUT_SECONDS*1000 )
- [color=#CC6600]if[/color](degHotend(active_extruder)>EXTRUDER_RUNOUT_MINTEMP)
- {
- bool oldstatus=READ(E0_ENABLE_PIN);
- enable_e0();
- [color=#CC6600]float[/color] oldepos=current_position[E_AXIS];
- [color=#CC6600]float[/color] oldedes=destination[E_AXIS];
- plan_buffer_line(destination[[color=#006699]X_AXIS[/color]], destination[[color=#006699]Y_AXIS[/color]], destination[[color=#006699]Z_AXIS[/color]],
- destination[E_AXIS]+EXTRUDER_RUNOUT_EXTRUDE*EXTRUDER_RUNOUT_ESTEPS/axis_steps_per_unit[E_AXIS],
- EXTRUDER_RUNOUT_SPEED/60.*EXTRUDER_RUNOUT_ESTEPS/axis_steps_per_unit[E_AXIS], active_extruder);
- current_position[E_AXIS]=oldepos;
- destination[E_AXIS]=oldedes;
- plan_set_e_position(oldepos);
- previous_millis_cmd=[color=#CC6600]millis[/color]();
- st_synchronize();
- WRITE(E0_ENABLE_PIN,oldstatus);
- }
- #endif
- #if defined(DUAL_X_CARRIAGE)
- [color=#7E7E7E]// handle delayed move timeout[/color]
- [color=#CC6600]if[/color] (delayed_move_time != 0 && ([color=#CC6600]millis[/color]() - delayed_move_time) > 1000 && Stopped == [color=#CC6600]false[/color])
- {
- [color=#7E7E7E]// travel moves have been received so enact them[/color]
- delayed_move_time = 0xFFFFFFFFUL; [color=#7E7E7E]// force moves to be done[/color]
- memcpy(destination,current_position,sizeof(destination));
- prepare_move();
- }
- #endif
- #ifdef TEMP_STAT_LEDS
- handle_status_leds();
- #endif
- check_axes_activity();
- }
- [color=#CC6600]void[/color] kill()
- {
- cli(); [color=#7E7E7E]// Stop interrupts[/color]
- disable_heater();
- disable_x();
- disable_y();
- disable_z();
- disable_e0();
- disable_e1();
- disable_e2();
- #if defined(PS_ON_PIN) && PS_ON_PIN > -1
- [color=#CC6600]pinMode[/color](PS_ON_PIN,[color=#006699]INPUT[/color]);
- #endif
- SERIAL_ERROR_START;
- SERIAL_ERRORLNPGM(MSG_ERR_KILLED);
- LCD_ALERTMESSAGEPGM(MSG_KILLED);
- suicide();
- [color=#CC6600]while[/color](1) { [color=#7E7E7E]/* Intentionally left empty */[/color] } [color=#7E7E7E]// Wait for reset[/color]
- }
- [color=#CC6600]void[/color] Stop()
- {
- disable_heater();
- [color=#CC6600]if[/color](Stopped == [color=#CC6600]false[/color]) {
- Stopped = [color=#CC6600]true[/color];
- Stopped_gcode_LastN = gcode_LastN; [color=#7E7E7E]// Save last g_code for restart[/color]
- SERIAL_ERROR_START;
- SERIAL_ERRORLNPGM(MSG_ERR_STOPPED);
- LCD_MESSAGEPGM(MSG_STOPPED);
- }
- }
- bool IsStopped() { [color=#CC6600]return[/color] Stopped; };
- #ifdef FAST_PWM_FAN
- [color=#CC6600]void[/color] setPwmFrequency(uint8_t pin, [color=#CC6600]int[/color] val)
- {
- val &= 0x07;
- [color=#CC6600]switch[/color](digitalPinToTimer(pin))
- {
- #if defined(TCCR0A)
- [color=#CC6600]case[/color] TIMER0A:
- [color=#CC6600]case[/color] TIMER0B:
- [color=#7E7E7E]// TCCR0B &= ~(_BV(CS00) | _BV(CS01) | _BV(CS02));[/color]
- [color=#7E7E7E]// TCCR0B |= val;[/color]
- [color=#CC6600]break[/color];
- #endif
- #if defined(TCCR1A)
- [color=#CC6600]case[/color] TIMER1A:
- [color=#CC6600]case[/color] TIMER1B:
- [color=#7E7E7E]// TCCR1B &= ~(_BV(CS10) | _BV(CS11) | _BV(CS12));[/color]
- [color=#7E7E7E]// TCCR1B |= val;[/color]
- [color=#CC6600]break[/color];
- #endif
- #if defined(TCCR2)
- [color=#CC6600]case[/color] TIMER2:
- [color=#CC6600]case[/color] TIMER2:
- TCCR2 &= ~(_BV(CS10) | _BV(CS11) | _BV(CS12));
- TCCR2 |= val;
- [color=#CC6600]break[/color];
- #endif
- #if defined(TCCR2A)
- [color=#CC6600]case[/color] TIMER2A:
- [color=#CC6600]case[/color] TIMER2B:
- TCCR2B &= ~(_BV(CS20) | _BV(CS21) | _BV(CS22));
- TCCR2B |= val;
- [color=#CC6600]break[/color];
- #endif
- #if defined(TCCR3A)
- [color=#CC6600]case[/color] TIMER3A:
- [color=#CC6600]case[/color] TIMER3B:
- [color=#CC6600]case[/color] TIMER3C:
- TCCR3B &= ~(_BV(CS30) | _BV(CS31) | _BV(CS32));
- TCCR3B |= val;
- [color=#CC6600]break[/color];
- #endif
- #if defined(TCCR4A)
- [color=#CC6600]case[/color] TIMER4A:
- [color=#CC6600]case[/color] TIMER4B:
- [color=#CC6600]case[/color] TIMER4C:
- TCCR4B &= ~(_BV(CS40) | _BV(CS41) | _BV(CS42));
- TCCR4B |= val;
- [color=#CC6600]break[/color];
- #endif
- #if defined(TCCR5A)
- [color=#CC6600]case[/color] TIMER5A:
- [color=#CC6600]case[/color] TIMER5B:
- [color=#CC6600]case[/color] TIMER5C:
- TCCR5B &= ~(_BV(CS50) | _BV(CS51) | _BV(CS52));
- TCCR5B |= val;
- [color=#CC6600]break[/color];
- #endif
- }
- }
- #endif [color=#7E7E7E]//FAST_PWM_FAN[/color]
- bool setTargetedHotend([color=#CC6600]int[/color] code){
- tmp_extruder = active_extruder;
- [color=#CC6600]if[/color](code_seen([color=#006699]'T'[/color])) {
- tmp_extruder = code_value();
- [color=#CC6600]if[/color](tmp_extruder >= EXTRUDERS) {
- SERIAL_ECHO_START;
- [color=#CC6600]switch[/color](code){
- [color=#CC6600]case[/color] 104:
- SERIAL_ECHO(MSG_M104_INVALID_EXTRUDER);
- [color=#CC6600]break[/color];
- [color=#CC6600]case[/color] 105:
- SERIAL_ECHO(MSG_M105_INVALID_EXTRUDER);
- [color=#CC6600]break[/color];
- [color=#CC6600]case[/color] 109:
- SERIAL_ECHO(MSG_M109_INVALID_EXTRUDER);
- [color=#CC6600]break[/color];
- [color=#CC6600]case[/color] 218:
- SERIAL_ECHO(MSG_M218_INVALID_EXTRUDER);
- [color=#CC6600]break[/color];
- }
- SERIAL_ECHOLN(tmp_extruder);
- [color=#CC6600]return[/color] [color=#CC6600]true[/color];
- }
- }
- [color=#CC6600]return[/color] [color=#CC6600]false[/color];
- }
- [/quote]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement