2016-03-25 01:19:46 -05:00
/**
2016-03-24 13:01:20 -05:00
* Marlin 3 D Printer Firmware
* Copyright ( C ) 2016 MarlinFirmware [ https : //github.com/MarlinFirmware/Marlin]
*
* Based on Sprinter and grbl .
* Copyright ( C ) 2011 Camiel Gubbels / Erik van der Zalm
*
* This program is free software : you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation , either version 3 of the License , or
* ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program . If not , see < http : //www.gnu.org/licenses/>.
*
*/
2012-06-02 13:44:17 -05:00
# ifndef MARLIN_H
# define MARLIN_H
2011-11-04 12:02:56 -05:00
2011-12-22 07:55:45 -06:00
# define FORCE_INLINE __attribute__((always_inline)) inline
2015-08-11 11:38:26 -05:00
/**
2016-03-05 22:41:15 -06:00
* Compiler warning on unused variable .
2015-08-11 11:38:26 -05:00
*/
# define UNUSED(x) (void) (x)
2011-12-22 07:55:45 -06:00
2011-11-30 02:07:56 -06:00
# include <math.h>
2011-12-22 07:55:45 -06:00
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
# include <inttypes.h>
2012-02-09 12:38:53 -06:00
# include <util/delay.h>
2011-12-22 05:38:50 -06:00
# include <avr/pgmspace.h>
2011-12-22 07:55:45 -06:00
# include <avr/eeprom.h>
2012-11-06 05:06:41 -06:00
# include <avr/interrupt.h>
2011-12-22 07:55:45 -06:00
# include "fastio.h"
# include "Configuration.h"
2015-05-21 11:44:40 -05:00
# include "pins.h"
2012-12-09 03:40:33 -06:00
2015-05-12 03:33:51 -05:00
# ifndef SANITYCHECK_H
2016-05-13 07:10:23 -05:00
# error "Your Configuration.h and Configuration_adv.h files are outdated!"
2015-05-12 03:33:51 -05:00
# endif
2015-06-07 04:40:52 -05:00
# include "Arduino.h"
2015-01-02 10:11:18 -06:00
2015-04-12 20:07:08 -05:00
typedef unsigned long millis_t ;
2015-03-14 06:28:22 -05:00
2015-05-24 11:32:34 -05:00
# ifdef USBCON
2015-03-07 00:14:34 -06:00
# include "HardwareSerial.h"
2013-10-30 05:45:32 -05:00
# endif
2011-11-27 14:12:55 -06:00
# include "MarlinSerial.h"
2011-11-09 13:27:15 -06:00
2011-12-22 07:55:45 -06:00
# include "WString.h"
2016-04-26 20:13:27 -05:00
# if ENABLED(PRINTCOUNTER)
# include "printcounter.h"
# else
# include "stopwatch.h"
# endif
2016-04-05 22:34:03 -05:00
2015-05-24 11:32:34 -05:00
# ifdef USBCON
2015-07-31 18:55:47 -05:00
# if ENABLED(BLUETOOTH)
2015-07-31 22:31:53 -05:00
# define MYSERIAL bluetoothSerial
2015-03-07 00:14:34 -06:00
# else
# define MYSERIAL Serial
2015-07-31 18:55:47 -05:00
# endif // BLUETOOTH
2013-11-10 09:36:37 -06:00
# else
2015-07-31 22:31:53 -05:00
# define MYSERIAL customizedSerial
2013-10-30 05:45:32 -05:00
# endif
2015-04-03 23:43:30 -05:00
# define SERIAL_CHAR(x) MYSERIAL.write(x)
# define SERIAL_EOL SERIAL_CHAR('\n')
# define SERIAL_PROTOCOLCHAR(x) SERIAL_CHAR(x)
# define SERIAL_PROTOCOL(x) MYSERIAL.print(x)
# define SERIAL_PROTOCOL_F(x,y) MYSERIAL.print(x,y)
# define SERIAL_PROTOCOLPGM(x) serialprintPGM(PSTR(x))
2015-07-07 00:06:07 -05:00
# define SERIAL_PROTOCOLLN(x) do{ MYSERIAL.print(x); SERIAL_EOL; }while(0)
2016-06-27 18:29:35 -05:00
# define SERIAL_PROTOCOLLNPGM(x) do{ serialprintPGM(PSTR(x "\n")); }while(0)
2011-12-04 05:40:18 -06:00
2016-06-27 18:29:35 -05:00
# define SERIAL_PROTOCOLPAIR(name, value) SERIAL_ECHOPAIR(name, value)
2011-11-09 13:27:15 -06:00
2014-12-28 00:09:42 -06:00
extern const char errormagic [ ] PROGMEM ;
extern const char echomagic [ ] PROGMEM ;
2015-04-03 23:43:30 -05:00
# define SERIAL_ERROR_START serialprintPGM(errormagic)
2011-11-09 13:27:15 -06:00
# define SERIAL_ERROR(x) SERIAL_PROTOCOL(x)
# define SERIAL_ERRORPGM(x) SERIAL_PROTOCOLPGM(x)
# define SERIAL_ERRORLN(x) SERIAL_PROTOCOLLN(x)
# define SERIAL_ERRORLNPGM(x) SERIAL_PROTOCOLLNPGM(x)
2015-04-03 23:43:30 -05:00
# define SERIAL_ECHO_START serialprintPGM(echomagic)
2011-11-09 13:27:15 -06:00
# define SERIAL_ECHO(x) SERIAL_PROTOCOL(x)
# define SERIAL_ECHOPGM(x) SERIAL_PROTOCOLPGM(x)
# define SERIAL_ECHOLN(x) SERIAL_PROTOCOLLN(x)
# define SERIAL_ECHOLNPGM(x) SERIAL_PROTOCOLLNPGM(x)
2016-04-07 00:40:45 -05:00
# define SERIAL_ECHOPAIR(name,value) (serial_echopair_P(PSTR(name),(value)))
2015-01-28 23:19:51 -06:00
2015-10-03 01:08:58 -05:00
void serial_echopair_P ( const char * s_P , int v ) ;
void serial_echopair_P ( const char * s_P , long v ) ;
void serial_echopair_P ( const char * s_P , float v ) ;
void serial_echopair_P ( const char * s_P , double v ) ;
void serial_echopair_P ( const char * s_P , unsigned long v ) ;
2016-04-07 00:40:45 -05:00
FORCE_INLINE void serial_echopair_P ( const char * s_P , bool v ) { serial_echopair_P ( s_P , ( int ) v ) ; }
FORCE_INLINE void serial_echopair_P ( const char * s_P , void * v ) { serial_echopair_P ( s_P , ( unsigned long ) v ) ; }
2011-11-09 15:09:16 -06:00
2015-04-03 22:45:24 -05:00
// Things to write to serial from Program memory. Saves 400 to 2k of RAM.
2015-10-03 01:08:58 -05:00
FORCE_INLINE void serialprintPGM ( const char * str ) {
2015-04-03 23:58:48 -05:00
char ch ;
while ( ( ch = pgm_read_byte ( str ) ) ) {
2012-02-11 09:02:47 -06:00
MYSERIAL . write ( ch ) ;
2015-04-03 23:58:48 -05:00
str + + ;
2011-11-09 13:27:15 -06:00
}
}
2016-03-19 00:22:40 -05:00
void idle (
2016-04-28 11:57:21 -05:00
# if ENABLED(FILAMENT_CHANGE_FEATURE)
bool no_stepper_sleep = false // pass true to keep steppers from disabling on timeout
2016-03-19 00:22:40 -05:00
# endif
) ;
2015-05-26 22:08:21 -05:00
2015-10-03 01:08:58 -05:00
void manage_inactivity ( bool ignore_stepper_queue = false ) ;
2011-08-12 15:28:35 -05:00
2016-05-18 17:51:17 -05:00
# if ENABLED(DUAL_X_CARRIAGE)
extern bool extruder_duplication_enabled ;
# endif
2015-07-31 00:24:43 -05:00
# if ENABLED(DUAL_X_CARRIAGE) && HAS_X_ENABLE && HAS_X2_ENABLE
2015-02-23 09:12:35 -06:00
# define enable_x() do { X_ENABLE_WRITE( X_ENABLE_ON); X2_ENABLE_WRITE( X_ENABLE_ON); } while (0)
# define disable_x() do { X_ENABLE_WRITE(!X_ENABLE_ON); X2_ENABLE_WRITE(!X_ENABLE_ON); axis_known_position[X_AXIS] = false; } while (0)
2015-04-03 17:31:35 -05:00
# elif HAS_X_ENABLE
2015-02-23 09:12:35 -06:00
# define enable_x() X_ENABLE_WRITE( X_ENABLE_ON)
# define disable_x() { X_ENABLE_WRITE(!X_ENABLE_ON); axis_known_position[X_AXIS] = false; }
2011-08-12 15:28:35 -05:00
# else
2011-11-06 12:23:08 -06:00
# define enable_x() ;
# define disable_x() ;
2011-08-12 15:28:35 -05:00
# endif
2011-11-06 12:23:08 -06:00
2015-04-03 17:31:35 -05:00
# if HAS_Y_ENABLE
2015-07-31 00:24:43 -05:00
# if ENABLED(Y_DUAL_STEPPER_DRIVERS)
2015-02-23 09:12:35 -06:00
# define enable_y() { Y_ENABLE_WRITE( Y_ENABLE_ON); Y2_ENABLE_WRITE(Y_ENABLE_ON); }
# define disable_y() { Y_ENABLE_WRITE(!Y_ENABLE_ON); Y2_ENABLE_WRITE(!Y_ENABLE_ON); axis_known_position[Y_AXIS] = false; }
2013-09-17 13:19:20 -05:00
# else
2015-02-23 09:12:35 -06:00
# define enable_y() Y_ENABLE_WRITE( Y_ENABLE_ON)
# define disable_y() { Y_ENABLE_WRITE(!Y_ENABLE_ON); axis_known_position[Y_AXIS] = false; }
2013-09-17 13:19:20 -05:00
# endif
2011-08-12 15:28:35 -05:00
# else
2011-11-06 12:23:08 -06:00
# define enable_y() ;
# define disable_y() ;
2011-08-12 15:28:35 -05:00
# endif
2011-11-06 12:23:08 -06:00
2015-04-03 17:31:35 -05:00
# if HAS_Z_ENABLE
2015-07-31 00:24:43 -05:00
# if ENABLED(Z_DUAL_STEPPER_DRIVERS)
2015-02-23 09:12:35 -06:00
# define enable_z() { Z_ENABLE_WRITE( Z_ENABLE_ON); Z2_ENABLE_WRITE(Z_ENABLE_ON); }
# define disable_z() { Z_ENABLE_WRITE(!Z_ENABLE_ON); Z2_ENABLE_WRITE(!Z_ENABLE_ON); axis_known_position[Z_AXIS] = false; }
2012-08-04 01:32:26 -05:00
# else
2015-02-23 09:12:35 -06:00
# define enable_z() Z_ENABLE_WRITE( Z_ENABLE_ON)
# define disable_z() { Z_ENABLE_WRITE(!Z_ENABLE_ON); axis_known_position[Z_AXIS] = false; }
2012-08-04 01:32:26 -05:00
# endif
2011-08-12 15:28:35 -05:00
# else
2011-11-06 12:23:08 -06:00
# define enable_z() ;
# define disable_z() ;
2011-08-12 15:28:35 -05:00
# endif
2011-11-04 12:02:56 -05:00
2015-04-03 17:31:35 -05:00
# if HAS_E0_ENABLE
2015-04-03 22:45:24 -05:00
# define enable_e0() E0_ENABLE_WRITE( E_ENABLE_ON)
2015-02-23 09:12:35 -06:00
# define disable_e0() E0_ENABLE_WRITE(!E_ENABLE_ON)
2011-08-12 15:28:35 -05:00
# else
2011-12-05 22:33:33 -06:00
# define enable_e0() /* nothing */
# define disable_e0() /* nothing */
2011-08-12 15:28:35 -05:00
# endif
2015-04-03 17:31:35 -05:00
# if (EXTRUDERS > 1) && HAS_E1_ENABLE
2015-04-03 22:45:24 -05:00
# define enable_e1() E1_ENABLE_WRITE( E_ENABLE_ON)
2015-02-23 09:12:35 -06:00
# define disable_e1() E1_ENABLE_WRITE(!E_ENABLE_ON)
2011-12-05 22:33:33 -06:00
# else
# define enable_e1() /* nothing */
# define disable_e1() /* nothing */
# endif
2015-04-03 17:31:35 -05:00
# if (EXTRUDERS > 2) && HAS_E2_ENABLE
2015-04-03 22:45:24 -05:00
# define enable_e2() E2_ENABLE_WRITE( E_ENABLE_ON)
2015-02-23 09:12:35 -06:00
# define disable_e2() E2_ENABLE_WRITE(!E_ENABLE_ON)
2011-12-05 22:33:33 -06:00
# else
# define enable_e2() /* nothing */
# define disable_e2() /* nothing */
# endif
2015-04-03 17:31:35 -05:00
# if (EXTRUDERS > 3) && HAS_E3_ENABLE
2015-04-03 22:45:24 -05:00
# define enable_e3() E3_ENABLE_WRITE( E_ENABLE_ON)
2015-02-23 09:12:35 -06:00
# define disable_e3() E3_ENABLE_WRITE(!E_ENABLE_ON)
2015-01-23 16:13:06 -06:00
# else
# define enable_e3() /* nothing */
# define disable_e3() /* nothing */
# endif
2011-12-05 22:33:33 -06:00
2015-04-03 22:45:24 -05:00
/**
* The axis order in all axis related arrays is X , Y , Z , E
*/
# define NUM_AXIS 4
/**
* Axis indices as enumerated constants
*
* A_AXIS and B_AXIS are used by COREXY printers
* X_HEAD and Y_HEAD is used for systems that don ' t have a 1 : 1 relationship between X_AXIS and X Head movement , like CoreXY bots .
*/
2016-03-07 22:11:56 -06:00
enum AxisEnum { NO_AXIS = - 1 , X_AXIS = 0 , A_AXIS = 0 , Y_AXIS = 1 , B_AXIS = 1 , Z_AXIS = 2 , C_AXIS = 2 , E_AXIS = 3 , X_HEAD = 4 , Y_HEAD = 5 , Z_HEAD = 5 } ;
2011-08-12 15:28:35 -05:00
2016-04-27 09:15:20 -05:00
# define _AXIS(AXIS) AXIS ##_AXIS
2015-05-10 14:37:39 -05:00
2016-05-31 10:26:08 -05:00
typedef enum { LINEARUNIT_MM = 0 , LINEARUNIT_INCH = 1 } LinearUnit ;
typedef enum { TEMPUNIT_C = 0 , TEMPUNIT_K = 1 , TEMPUNIT_F = 2 } TempUnit ;
2015-04-03 21:25:22 -05:00
void enable_all_steppers ( ) ;
void disable_all_steppers ( ) ;
2011-08-12 15:28:35 -05:00
void FlushSerialRequestResend ( ) ;
2015-05-12 04:08:20 -05:00
void ok_to_send ( ) ;
2011-08-12 15:28:35 -05:00
2015-03-07 12:36:21 -06:00
void reset_bed_level ( ) ;
2015-10-03 01:08:58 -05:00
void kill ( const char * ) ;
2012-03-25 07:36:51 -05:00
2016-07-06 14:00:28 -05:00
void quickstop_stepper ( ) ;
2016-06-02 19:11:54 -05:00
2015-07-31 00:24:43 -05:00
# if ENABLED(FILAMENT_RUNOUT_SENSOR)
2016-04-18 01:16:49 -05:00
void handle_filament_runout ( ) ;
2015-03-07 14:43:15 -06:00
# endif
2015-04-26 22:08:45 -05:00
/**
* Debug flags - not yet widely applied
*/
enum DebugFlags {
2016-03-29 21:18:45 -05:00
DEBUG_NONE = 0 ,
2016-04-20 14:19:37 -05:00
DEBUG_ECHO = _BV ( 0 ) , ///< Echo commands in order as they are processed
DEBUG_INFO = _BV ( 1 ) , ///< Print messages for code that has debug output
DEBUG_ERRORS = _BV ( 2 ) , ///< Not implemented
DEBUG_DRYRUN = _BV ( 3 ) , ///< Ignore temperature setting and E movement commands
DEBUG_COMMUNICATION = _BV ( 4 ) , ///< Not implemented
DEBUG_LEVELING = _BV ( 5 ) ///< Print detailed output for homing and leveling
2015-04-26 22:08:45 -05:00
} ;
extern uint8_t marlin_debug_flags ;
2016-03-29 21:50:01 -05:00
# define DEBUGGING(F) (marlin_debug_flags & (DEBUG_## F))
2015-04-26 22:08:45 -05:00
2015-04-08 02:56:19 -05:00
extern bool Running ;
inline bool IsRunning ( ) { return Running ; }
inline bool IsStopped ( ) { return ! Running ; }
2011-08-12 15:28:35 -05:00
2016-02-20 19:35:35 -06:00
bool enqueue_and_echo_command ( const char * cmd , bool say_ok = false ) ; //put a single ASCII command at the end of the current buffer or return false when it is full
2016-03-21 20:10:08 -05:00
void enqueue_and_echo_command_now ( const char * cmd ) ; // enqueue now, only return when the command has been enqueued
2016-02-20 19:35:35 -06:00
void enqueue_and_echo_commands_P ( const char * cmd ) ; //put one or many ASCII commands at the end of the current buffer, read from flash
2016-05-31 19:41:32 -05:00
void clear_command_queue ( ) ;
2015-02-07 16:24:20 -06:00
2012-08-09 12:15:32 -05:00
void clamp_to_software_endstops ( float target [ 3 ] ) ;
2011-11-04 12:02:56 -05:00
2015-04-12 20:07:08 -05:00
extern millis_t previous_cmd_ms ;
inline void refresh_cmd_timeout ( ) { previous_cmd_ms = millis ( ) ; }
2014-02-03 04:30:12 -06:00
2015-07-31 00:24:43 -05:00
# if ENABLED(FAST_PWM_FAN)
2015-03-20 04:50:28 -05:00
void setPwmFrequency ( uint8_t pin , int val ) ;
2012-05-02 12:26:14 -05:00
# endif
2011-11-04 12:02:56 -05:00
# ifndef CRITICAL_SECTION_START
2011-11-06 12:23:08 -06:00
# define CRITICAL_SECTION_START unsigned char _sreg = SREG; cli();
# define CRITICAL_SECTION_END SREG = _sreg;
2015-04-03 22:45:24 -05:00
# endif
2011-08-12 15:28:35 -05:00
2011-11-04 12:02:56 -05:00
extern bool axis_relative_modes [ ] ;
2015-04-13 19:17:36 -05:00
extern int feedrate_multiplier ;
2014-12-28 19:43:14 -06:00
extern bool volumetric_enabled ;
2015-06-01 15:33:22 -05:00
extern int extruder_multiplier [ EXTRUDERS ] ; // sets extrude multiply factor (in percent) for each extruder individually
2014-12-28 19:43:14 -06:00
extern float filament_size [ EXTRUDERS ] ; // cross-sectional area of filament (in millimeters), typically around 1.75 or 2.85, 0 disables the volumetric calculations for the extruder.
2014-01-31 10:43:11 -06:00
extern float volumetric_multiplier [ EXTRUDERS ] ; // reciprocal of cross-sectional area of filament (in square millimeters), stored this way to reduce computational burden in planner
2015-04-03 22:45:24 -05:00
extern float current_position [ NUM_AXIS ] ;
2015-07-14 21:49:43 -05:00
extern float home_offset [ 3 ] ; // axis[n].home_offset
2016-04-18 01:11:35 -05:00
extern float sw_endstop_min [ 3 ] ; // axis[n].sw_endstop_min
extern float sw_endstop_max [ 3 ] ; // axis[n].sw_endstop_max
2015-07-14 21:49:43 -05:00
extern bool axis_known_position [ 3 ] ; // axis[n].is_known
2015-10-08 14:04:17 -05:00
extern bool axis_homed [ 3 ] ; // axis[n].is_homed
Add an emergency-command parser to MarlinSerial (supporting M108)
Add an emergency-command parser to MarlinSerial's RX interrupt.
The parser tries to find and execute M108,M112,M410 before the commands disappear in the RX-buffer.
To avoid false positives for M117, comments and commands followed by filenames (M23, M28, M30, M32, M33) are filtered.
This enables Marlin to receive and react on the Emergency command at all times - regardless of whether the buffers are full or not. It remains to convince hosts to send the commands. To inform the hosts about the new feature a new entry in the M115-report was made. "`EMERGENCY_CODES:M112,M108,M410;`".
The parser is fast. It only ever needs two switch decisions and one assignment of the new state for every character.
One problem remains. If the host has sent an incomplete line before sending an emergency command the emergency command could be omitted when the parser is in `state_IGNORE`.
In that case the host should send "\ncommand\n"
Also introduces M108 to break the waiting for the heaters in M109, M190 and M303.
Rename `cancel_heatup` to `wait_for_heatup` to better see the purpose.
2016-07-04 16:23:22 -05:00
extern bool wait_for_heatup ;
2015-04-03 22:45:24 -05:00
2016-04-27 20:06:32 -05:00
// GCode support for external objects
2016-05-17 20:22:41 -05:00
bool code_seen ( char ) ;
2016-05-31 10:26:08 -05:00
int code_value_int ( ) ;
float code_value_temp_abs ( ) ;
float code_value_temp_diff ( ) ;
2016-04-27 20:06:32 -05:00
2015-09-03 00:38:47 -05:00
# if ENABLED(DELTA)
2016-03-19 07:43:50 -05:00
extern float delta [ 3 ] ;
extern float endstop_adj [ 3 ] ; // axis[n].endstop_adj
extern float delta_radius ;
extern float delta_diagonal_rod ;
2015-09-03 00:38:47 -05:00
extern float delta_segments_per_second ;
2016-03-19 07:43:50 -05:00
extern float delta_diagonal_rod_trim_tower_1 ;
extern float delta_diagonal_rod_trim_tower_2 ;
extern float delta_diagonal_rod_trim_tower_3 ;
2015-07-14 21:49:43 -05:00
void calculate_delta ( float cartesian [ 3 ] ) ;
2015-09-03 00:38:47 -05:00
void recalc_delta_settings ( float radius , float diagonal_rod ) ;
# if ENABLED(AUTO_BED_LEVELING_FEATURE)
extern int delta_grid_spacing [ 2 ] ;
void adjust_delta ( float cartesian [ 3 ] ) ;
2015-07-14 21:49:43 -05:00
# endif
2015-09-03 00:38:47 -05:00
# elif ENABLED(SCARA)
extern float axis_scaling [ 3 ] ; // Build size scaling
void calculate_delta ( float cartesian [ 3 ] ) ;
void calculate_SCARA_forward_Transform ( float f_scara [ 3 ] ) ;
2014-06-23 10:09:57 -05:00
# endif
2015-04-03 22:45:24 -05:00
2015-07-31 00:24:43 -05:00
# if ENABLED(Z_DUAL_ENDSTOPS)
2015-07-14 21:49:43 -05:00
extern float z_endstop_adj ;
# endif
2015-04-03 22:45:24 -05:00
2016-06-14 20:05:20 -05:00
# if HAS_BED_PROBE
2015-03-25 23:14:00 -05:00
extern float zprobe_zoffset ;
# endif
2015-04-03 22:45:24 -05:00
2016-04-06 19:31:18 -05:00
# if ENABLED(HOST_KEEPALIVE_FEATURE)
extern uint8_t host_keepalive_interval ;
# endif
2016-03-05 20:27:45 -06:00
# if FAN_COUNT > 0
extern int fanSpeeds [ FAN_COUNT ] ;
# endif
2015-04-03 22:45:24 -05:00
2015-07-31 00:24:43 -05:00
# if ENABLED(BARICUDA)
2016-04-18 01:12:15 -05:00
extern int baricuda_valve_pressure ;
extern int baricuda_e_to_p_pressure ;
2013-05-14 16:56:32 -05:00
# endif
2012-12-03 05:13:20 -06:00
2016-03-29 22:28:23 -05:00
# if ENABLED(FILAMENT_WIDTH_SENSOR)
2016-03-05 22:41:15 -06:00
extern float filament_width_nominal ; //holds the theoretical filament diameter i.e., 3.00 or 1.75
2015-01-02 10:11:18 -06:00
extern bool filament_sensor ; //indicates that filament sensor readings should control extrusion
extern float filament_width_meas ; //holds the filament diameter as accurately measured
2016-03-28 22:04:34 -05:00
extern int8_t measurement_delay [ ] ; //ring buffer to delay measurement
2016-04-06 21:29:08 -05:00
extern int filwidth_delay_index1 , filwidth_delay_index2 ; //ring buffer index. used by planner, temperature, and main code
2014-08-06 19:30:57 -05:00
extern int meas_delay_cm ; //delay distance
# endif
2016-04-28 11:57:21 -05:00
# if ENABLED(FILAMENT_CHANGE_FEATURE)
enum FilamentChangeMenuResponse {
FILAMENT_CHANGE_RESPONSE_WAIT_FOR ,
FILAMENT_CHANGE_RESPONSE_EXTRUDE_MORE ,
FILAMENT_CHANGE_RESPONSE_RESUME_PRINT
} ;
extern FilamentChangeMenuResponse filament_change_menu_response ;
# endif
2015-08-30 21:04:30 -05:00
# if ENABLED(PID_ADD_EXTRUSION_RATE)
extern int lpq_len ;
# endif
2015-07-31 00:24:43 -05:00
# if ENABLED(FWRETRACT)
2015-03-20 04:50:28 -05:00
extern bool autoretract_enabled ;
2015-07-14 21:49:43 -05:00
extern bool retracted [ EXTRUDERS ] ; // extruder[n].retracted
2016-06-22 05:27:31 -05:00
extern float retract_length , retract_length_swap , retract_feedrate_mm_s , retract_zlift ;
2015-03-20 04:50:28 -05:00
extern float retract_recover_length , retract_recover_length_swap , retract_recover_feedrate ;
2012-12-03 05:13:20 -06:00
# endif
2011-11-04 12:02:56 -05:00
2016-04-05 22:34:03 -05:00
// Print job timer
2016-04-26 20:13:27 -05:00
# if ENABLED(PRINTCOUNTER)
extern PrintCounter print_job_timer ;
# else
extern Stopwatch print_job_timer ;
# endif
2012-11-06 05:06:41 -06:00
2011-12-05 22:33:33 -06:00
// Handling multiple extruders pins
extern uint8_t active_extruder ;
2016-04-03 18:18:49 -05:00
# if HAS_TEMP_HOTEND || HAS_TEMP_BED
2015-11-09 17:02:11 -06:00
void print_heaterstates ( ) ;
# endif
2016-05-17 20:22:41 -05:00
void calculate_volumetric_multipliers ( ) ;
2015-01-02 10:11:18 -06:00
2016-06-04 14:29:01 -05:00
// Buzzer
# if HAS_BUZZER
# if ENABLED(SPEAKER)
# include "speaker.h"
extern Speaker buzzer ;
# else
# include "buzzer.h"
extern Buzzer buzzer ;
# endif
# endif
2015-03-20 04:50:28 -05:00
# endif //MARLIN_H