2017-06-29 16:35:43 +00:00
// Tonokip RepRap firmware rewrite based off of Hydra-mmm firmware.
// License: GPL
# ifndef MARLIN_H
# define MARLIN_H
2020-09-11 13:12:49 +00:00
# include "macros.h"
2017-06-29 16:35:43 +00:00
# include <math.h>
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
# include <inttypes.h>
# include <util/delay.h>
# include <avr/pgmspace.h>
# include <avr/eeprom.h>
# include <avr/interrupt.h>
2019-01-28 18:29:31 +00:00
# include "system_timer.h"
2017-06-29 16:35:43 +00:00
# include "fastio.h"
# include "Configuration.h"
# include "pins.h"
2018-11-06 19:54:53 +00:00
# include "Timer.h"
2019-03-28 11:02:46 +00:00
extern uint8_t mbl_z_probe_nr ;
2017-06-29 16:35:43 +00:00
# ifndef AT90USB
# define HardwareSerial_h // trick to disable the standard HWserial
# endif
# if (ARDUINO >= 100)
# include "Arduino.h"
# else
# include "WProgram.h"
# endif
// Arduino < 1.0.0 does not define this, so we need to do it ourselves
# ifndef analogInputToDigitalPin
# define analogInputToDigitalPin(p) ((p) + A0)
# endif
# ifdef AT90USB
# include "HardwareSerial.h"
# endif
# include "MarlinSerial.h"
# ifndef cbi
# define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
# endif
# ifndef sbi
# define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
# endif
2018-06-08 23:23:04 +00:00
//#include "WString.h"
2017-06-29 16:35:43 +00:00
# ifdef AT90USB
# ifdef BTENABLED
# define MYSERIAL bt
# else
# define MYSERIAL Serial
# endif // BTENABLED
# else
# define MYSERIAL MSerial
# endif
2018-07-16 00:13:52 +00:00
# include "lcd.h"
2017-11-20 19:09:54 +00:00
2018-10-25 19:06:37 +00:00
# ifdef __cplusplus
2018-10-18 14:20:14 +00:00
extern " C " {
2018-10-25 19:06:37 +00:00
# endif
2017-11-20 19:09:54 +00:00
extern FILE _uartout ;
2018-10-25 19:06:37 +00:00
# ifdef __cplusplus
2018-10-18 14:20:14 +00:00
}
2018-10-25 19:06:37 +00:00
# endif
2018-10-18 14:20:14 +00:00
2017-11-20 19:09:54 +00:00
# define uartout (&_uartout)
2017-06-29 16:35:43 +00:00
# define SERIAL_PROTOCOL(x) (MYSERIAL.print(x))
# define SERIAL_PROTOCOL_F(x,y) (MYSERIAL.print(x,y))
# define SERIAL_PROTOCOLPGM(x) (serialprintPGM(PSTR(x)))
# define SERIAL_PROTOCOLRPGM(x) (serialprintPGM((x)))
2022-02-27 19:55:40 +00:00
# define SERIAL_PROTOCOLLN(x) (MYSERIAL.println(x))
# define SERIAL_PROTOCOLLNPGM(x) (serialprintlnPGM(PSTR(x)))
# define SERIAL_PROTOCOLLNRPGM(x) (serialprintlnPGM((x)))
2017-06-29 16:35:43 +00:00
extern const char errormagic [ ] PROGMEM ;
extern const char echomagic [ ] PROGMEM ;
# define SERIAL_ERROR_START (serialprintPGM(errormagic))
# define SERIAL_ERROR(x) SERIAL_PROTOCOL(x)
# define SERIAL_ERRORPGM(x) SERIAL_PROTOCOLPGM(x)
# define SERIAL_ERRORRPGM(x) SERIAL_PROTOCOLRPGM(x)
# define SERIAL_ERRORLN(x) SERIAL_PROTOCOLLN(x)
# define SERIAL_ERRORLNPGM(x) SERIAL_PROTOCOLLNPGM(x)
# define SERIAL_ERRORLNRPGM(x) SERIAL_PROTOCOLLNRPGM(x)
# define SERIAL_ECHO_START (serialprintPGM(echomagic))
# define SERIAL_ECHO(x) SERIAL_PROTOCOL(x)
# define SERIAL_ECHOPGM(x) SERIAL_PROTOCOLPGM(x)
# define SERIAL_ECHORPGM(x) SERIAL_PROTOCOLRPGM(x)
# define SERIAL_ECHOLN(x) SERIAL_PROTOCOLLN(x)
# define SERIAL_ECHOLNPGM(x) SERIAL_PROTOCOLLNPGM(x)
# define SERIAL_ECHOLNRPGM(x) SERIAL_PROTOCOLLNRPGM(x)
# define SERIAL_ECHOPAIR(name,value) (serial_echopair_P(PSTR(name),(value)))
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 ) ;
//Things to write to serial from Program memory. Saves 400 to 2k of RAM.
2019-07-12 08:10:56 +00:00
// Making this FORCE_INLINE is not a good idea when running out of FLASH
// I'd rather skip a few CPU ticks than 5.5KB (!!) of FLASH
void serialprintPGM ( const char * str ) ;
2017-06-29 16:35:43 +00:00
2022-02-27 19:55:40 +00:00
//The "ln" variant of the function above.
void serialprintlnPGM ( const char * str ) ;
2017-06-29 16:35:43 +00:00
bool is_buffer_empty ( ) ;
void process_commands ( ) ;
void ramming ( ) ;
void manage_inactivity ( bool ignore_stepper_queue = false ) ;
# if defined(X_ENABLE_PIN) && X_ENABLE_PIN > -1
# define enable_x() WRITE(X_ENABLE_PIN, X_ENABLE_ON)
# define disable_x() { WRITE(X_ENABLE_PIN,!X_ENABLE_ON); axis_known_position[X_AXIS] = false; }
# else
# define enable_x() ;
# define disable_x() ;
# endif
# if defined(Y_ENABLE_PIN) && Y_ENABLE_PIN > -1
# ifdef Y_DUAL_STEPPER_DRIVERS
# define enable_y() { WRITE(Y_ENABLE_PIN, Y_ENABLE_ON); WRITE(Y2_ENABLE_PIN, Y_ENABLE_ON); }
# define disable_y() { WRITE(Y_ENABLE_PIN,!Y_ENABLE_ON); WRITE(Y2_ENABLE_PIN, !Y_ENABLE_ON); axis_known_position[Y_AXIS] = false; }
# else
# define enable_y() WRITE(Y_ENABLE_PIN, Y_ENABLE_ON)
# define disable_y() { WRITE(Y_ENABLE_PIN,!Y_ENABLE_ON); axis_known_position[Y_AXIS] = false; }
# endif
# else
# define enable_y() ;
# define disable_y() ;
# endif
# if defined(Z_ENABLE_PIN) && Z_ENABLE_PIN > -1
# if defined(Z_AXIS_ALWAYS_ON)
# ifdef Z_DUAL_STEPPER_DRIVERS
2020-01-27 17:50:17 +00:00
# define poweron_z() { WRITE(Z_ENABLE_PIN, Z_ENABLE_ON); WRITE(Z2_ENABLE_PIN, Z_ENABLE_ON); }
# define poweroff_z() { WRITE(Z_ENABLE_PIN,!Z_ENABLE_ON); WRITE(Z2_ENABLE_PIN,!Z_ENABLE_ON); axis_known_position[Z_AXIS] = false; }
2017-06-29 16:35:43 +00:00
# else
2020-01-27 17:50:17 +00:00
# define poweron_z() WRITE(Z_ENABLE_PIN, Z_ENABLE_ON)
# define poweroff_z() {}
2017-06-29 16:35:43 +00:00
# endif
# else
# ifdef Z_DUAL_STEPPER_DRIVERS
2020-01-27 17:50:17 +00:00
# define poweron_z() { WRITE(Z_ENABLE_PIN, Z_ENABLE_ON); WRITE(Z2_ENABLE_PIN, Z_ENABLE_ON); }
# define poweroff_z() { WRITE(Z_ENABLE_PIN,!Z_ENABLE_ON); WRITE(Z2_ENABLE_PIN,!Z_ENABLE_ON); axis_known_position[Z_AXIS] = false; }
2017-06-29 16:35:43 +00:00
# else
2020-01-27 17:50:17 +00:00
# define poweron_z() WRITE(Z_ENABLE_PIN, Z_ENABLE_ON)
# define poweroff_z() { WRITE(Z_ENABLE_PIN,!Z_ENABLE_ON); axis_known_position[Z_AXIS] = false; }
2017-06-29 16:35:43 +00:00
# endif
# endif
# else
2020-01-27 17:50:17 +00:00
# define poweron_z() {}
# define poweroff_z() {}
2017-06-29 16:35:43 +00:00
# endif
2020-01-27 17:50:17 +00:00
# ifndef PSU_Delta
# define enable_z() poweron_z()
# define disable_z() poweroff_z()
# else
2019-07-16 16:16:05 +00:00
void init_force_z ( ) ;
void check_force_z ( ) ;
void enable_force_z ( ) ;
2020-01-27 17:50:17 +00:00
void disable_force_z ( ) ;
# define enable_z() enable_force_z()
# define disable_z() disable_force_z()
2019-03-20 23:45:15 +00:00
# endif // PSU_Delta
2017-06-29 16:35:43 +00:00
//#if defined(Z_ENABLE_PIN) && Z_ENABLE_PIN > -1
//#ifdef Z_DUAL_STEPPER_DRIVERS
//#define enable_z() { WRITE(Z_ENABLE_PIN, Z_ENABLE_ON); WRITE(Z2_ENABLE_PIN, Z_ENABLE_ON); }
//#define disable_z() { WRITE(Z_ENABLE_PIN,!Z_ENABLE_ON); WRITE(Z2_ENABLE_PIN,!Z_ENABLE_ON); axis_known_position[Z_AXIS] = false; }
//#else
//#define enable_z() WRITE(Z_ENABLE_PIN, Z_ENABLE_ON)
//#define disable_z() { WRITE(Z_ENABLE_PIN,!Z_ENABLE_ON); axis_known_position[Z_AXIS] = false; }
//#endif
//#else
//#define enable_z() ;
//#define disable_z() ;
//#endif
# if defined(E0_ENABLE_PIN) && (E0_ENABLE_PIN > -1)
# define enable_e0() WRITE(E0_ENABLE_PIN, E_ENABLE_ON)
# define disable_e0() WRITE(E0_ENABLE_PIN,!E_ENABLE_ON)
# else
# define enable_e0() /* nothing */
# define disable_e0() /* nothing */
# endif
# if (EXTRUDERS > 1) && defined(E1_ENABLE_PIN) && (E1_ENABLE_PIN > -1)
# define enable_e1() WRITE(E1_ENABLE_PIN, E_ENABLE_ON)
# define disable_e1() WRITE(E1_ENABLE_PIN,!E_ENABLE_ON)
# else
# define enable_e1() /* nothing */
# define disable_e1() /* nothing */
# endif
# if (EXTRUDERS > 2) && defined(E2_ENABLE_PIN) && (E2_ENABLE_PIN > -1)
# define enable_e2() WRITE(E2_ENABLE_PIN, E_ENABLE_ON)
# define disable_e2() WRITE(E2_ENABLE_PIN,!E_ENABLE_ON)
# else
# define enable_e2() /* nothing */
# define disable_e2() /* nothing */
# endif
2019-03-19 18:48:40 +00:00
# define FARM_FILAMENT_COLOR_NONE 99;
2017-06-29 16:35:43 +00:00
enum AxisEnum { X_AXIS = 0 , Y_AXIS = 1 , Z_AXIS = 2 , E_AXIS = 3 , X_HEAD = 4 , Y_HEAD = 5 } ;
2017-07-07 02:45:09 +00:00
# define X_AXIS_MASK 1
# define Y_AXIS_MASK 2
# define Z_AXIS_MASK 4
# define E_AXIS_MASK 8
# define X_HEAD_MASK 16
# define Y_HEAD_MASK 32
2017-06-29 16:35:43 +00:00
void FlushSerialRequestResend ( ) ;
void ClearToSend ( ) ;
2018-03-06 14:11:50 +00:00
void update_currents ( ) ;
2017-06-29 16:35:43 +00:00
void get_coordinates ( ) ;
2017-09-20 14:04:02 +00:00
void prepare_move ( ) ;
2017-07-04 09:31:39 +00:00
void kill ( const char * full_screen_message = NULL , unsigned char id = 0 ) ;
2020-04-29 20:51:23 +00:00
void finishAndDisableSteppers ( ) ;
2017-06-29 16:35:43 +00:00
2022-06-28 15:07:12 +00:00
void UnconditionalStop ( ) ; // Stop heaters, motion and clear current print status
void ThermalStop ( bool pause = false ) ; // Emergency stop used by overtemp functions which allows
// recovery (with pause=true)
bool IsStopped ( ) ; // Returns true if the print has been stopped
2021-12-07 10:11:06 +00:00
2017-06-29 16:35:43 +00:00
//put an ASCII command at the end of the current buffer, read from flash
# define enquecommand_P(cmd) enquecommand(cmd, true)
2018-07-09 10:44:19 +00:00
//put an ASCII command at the begin of the current buffer, read from flash
2017-06-29 16:35:43 +00:00
# define enquecommand_front_P(cmd) enquecommand_front(cmd, true)
2018-07-09 10:44:19 +00:00
2021-06-24 17:20:55 +00:00
void prepare_arc_move ( bool isclockwise ) ;
2017-06-29 16:35:43 +00:00
void clamp_to_software_endstops ( float target [ 3 ] ) ;
void refresh_cmd_timeout ( void ) ;
# ifdef FAST_PWM_FAN
void setPwmFrequency ( uint8_t pin , int val ) ;
# endif
2021-08-28 18:23:44 +00:00
enum class HeatingStatus : uint8_t
{
NO_HEATING = 0 ,
EXTRUDER_HEATING = 1 ,
EXTRUDER_HEATING_COMPLETE = 2 ,
BED_HEATING = 3 ,
BED_HEATING_COMPLETE = 4 ,
} ;
extern HeatingStatus heating_status ;
2019-02-26 17:50:15 +00:00
extern bool fans_check_enabled ;
2017-06-29 16:35:43 +00:00
extern float homing_feedrate [ ] ;
2020-03-05 09:22:35 +00:00
extern uint8_t axis_relative_modes ;
2019-10-19 19:20:38 +00:00
extern float feedrate ;
2017-06-29 16:35:43 +00:00
extern int feedmultiply ;
extern int extrudemultiply ; // Sets extrude multiply factor (in percent) for all extruders
extern int extruder_multiply [ EXTRUDERS ] ; // sets extrude multiply factor (in percent) for each extruder individually
2020-07-19 15:41:38 +00:00
extern float extruder_multiplier [ EXTRUDERS ] ; // reciprocal of cross-sectional area of filament (in square millimeters), stored this way to reduce computational burden in planner
2017-06-29 16:35:43 +00:00
extern float current_position [ NUM_AXIS ] ;
extern float destination [ NUM_AXIS ] ;
extern float min_pos [ 3 ] ;
extern float max_pos [ 3 ] ;
extern bool axis_known_position [ 3 ] ;
extern int fanSpeed ;
2021-01-10 14:15:44 +00:00
extern uint8_t newFanSpeed ;
2018-10-08 13:58:49 +00:00
extern int8_t lcd_change_fil_state ;
2019-12-14 17:05:08 +00:00
extern float default_retraction ;
2019-07-23 09:31:20 +00:00
2019-03-05 15:41:41 +00:00
# ifdef TMC2130
2021-08-02 12:20:10 +00:00
void homeaxis ( uint8_t axis , uint8_t cnt = 1 , uint8_t * pstep = 0 ) ;
2019-03-05 15:41:41 +00:00
# else
2021-08-02 12:20:10 +00:00
void homeaxis ( uint8_t axis , uint8_t cnt = 1 ) ;
2019-03-05 15:41:41 +00:00
# endif //TMC2130
2017-06-29 16:35:43 +00:00
# ifdef FWRETRACT
extern bool retracted [ EXTRUDERS ] ;
2018-09-24 15:10:25 +00:00
extern float retract_length_swap ;
extern float retract_recover_length_swap ;
2017-06-29 16:35:43 +00:00
# endif
2017-11-15 14:09:29 +00:00
extern uint8_t host_keepalive_interval ;
2019-03-06 18:56:48 +00:00
2017-06-29 16:35:43 +00:00
extern unsigned long starttime ;
extern unsigned long stoptime ;
2022-02-13 21:52:49 +00:00
extern ShortTimer usb_timer ;
2017-06-29 16:35:43 +00:00
extern bool homing_flag ;
extern bool loading_flag ;
extern unsigned long total_filament_used ;
void save_statistics ( unsigned long _total_filament_used , unsigned long _total_print_time ) ;
2022-02-02 18:35:52 +00:00
extern uint8_t status_number ;
2021-08-28 17:02:26 +00:00
extern uint8_t heating_status_counter ;
2017-06-29 16:35:43 +00:00
extern unsigned long PingTime ;
2017-08-29 13:52:53 +00:00
extern bool no_response ;
extern uint8_t important_status ;
extern uint8_t saved_filament_type ;
2017-06-29 16:35:43 +00:00
2017-07-07 02:45:09 +00:00
extern bool fan_state [ 2 ] ;
extern int fan_edge_counter [ 2 ] ;
extern int fan_speed [ 2 ] ;
2017-06-29 16:35:43 +00:00
// Handling multiple extruders pins
extern uint8_t active_extruder ;
//Long pause
extern unsigned long pause_time ;
extern unsigned long start_pause_print ;
2017-10-26 15:42:27 +00:00
extern unsigned long t_fan_rising_edge ;
2017-06-29 16:35:43 +00:00
extern bool mesh_bed_leveling_flag ;
2018-05-22 11:31:21 +00:00
// save/restore printing
extern bool saved_printing ;
2019-09-20 18:07:20 +00:00
extern uint8_t saved_printing_type ;
# define PRINTING_TYPE_SD 0
# define PRINTING_TYPE_USB 1
# define PRINTING_TYPE_NONE 2
2018-05-22 11:31:21 +00:00
2018-07-31 17:03:53 +00:00
//save/restore printing in case that mmu is not responding
extern bool mmu_print_saved ;
2018-06-07 18:50:30 +00:00
//estimated time to end of the print
extern uint8_t print_percent_done_normal ;
extern uint8_t print_percent_done_silent ;
2021-03-19 09:18:28 +00:00
extern uint16_t print_time_remaining_normal ;
2018-09-07 00:02:35 +00:00
extern uint16_t print_time_remaining_silent ;
2021-02-10 07:13:40 +00:00
extern uint16_t print_time_to_change_normal ;
extern uint16_t print_time_to_change_silent ;
2018-10-08 13:58:49 +00:00
# define PRINT_TIME_REMAINING_INIT 0xffff
2018-08-27 02:21:43 +00:00
extern uint16_t mcode_in_progress ;
extern uint16_t gcode_in_progress ;
2018-11-06 19:54:53 +00:00
extern LongTimer safetyTimer ;
2021-03-19 09:18:28 +00:00
# define PRINT_PERCENT_DONE_INIT 0xff
2022-02-13 21:52:49 +00:00
# define PRINTER_ACTIVE (IS_SD_PRINTING || usb_timer.running() || isPrintPaused || (custom_message_type == CustomMsg::TempCal) || saved_printing || (lcd_commands_type == LcdCommands::Layer1Cal) || mmu_print_saved || homing_flag || mesh_bed_leveling_flag)
2019-07-17 08:30:49 +00:00
2022-06-27 10:25:38 +00:00
extern bool printer_active ( ) ;
2019-05-24 06:46:44 +00:00
//! Beware - mcode_in_progress is set as soon as the command gets really processed,
//! which is not the same as posting the M600 command into the command queue
//! There can be a considerable lag between posting M600 and its real processing which might result
//! in posting multiple M600's into the command queue
//! Instead, the fsensor uses another state variable :( , which is set to true, when the M600 command is enqued
//! and is reset to false when the fsensor returns into its filament runout finished handler
//! I'd normally change this macro, but who knows what would happen in the MMU :)
2022-02-13 21:52:49 +00:00
# define CHECK_FSENSOR ((IS_SD_PRINTING || usb_timer.running()) && (mcode_in_progress != 600) && !saved_printing && e_active())
2018-06-07 18:50:30 +00:00
2018-02-21 10:25:21 +00:00
extern void calculate_extruder_multipliers ( ) ;
2017-06-29 16:35:43 +00:00
// Similar to the default Arduino delay function,
// but it keeps the background tasks running.
extern void delay_keep_alive ( unsigned int ms ) ;
extern void check_babystep ( ) ;
extern void long_pause ( ) ;
2018-10-08 13:58:49 +00:00
extern void crashdet_stop_and_save_print ( ) ;
2017-06-29 16:35:43 +00:00
2019-03-06 18:56:48 +00:00
# ifdef HEATBED_ANALYSIS
2017-06-29 16:35:43 +00:00
void d_setup ( ) ;
float d_ReadData ( ) ;
void bed_analysis ( float x_dimension , float y_dimension , int x_points_num , int y_points_num , float shift_x , float shift_y ) ;
2019-03-06 18:56:48 +00:00
void bed_check ( float x_dimension , float y_dimension , int x_points_num , int y_points_num , float shift_x , float shift_y ) ;
# endif //HEATBED_ANALYSIS
2017-06-29 16:35:43 +00:00
float temp_comp_interpolation ( float temperature ) ;
2018-01-11 14:50:26 +00:00
void show_fw_version_warnings ( ) ;
2018-02-21 23:09:12 +00:00
uint8_t check_printer_version ( ) ;
2017-08-30 19:56:48 +00:00
# ifdef PINDA_THERMISTOR
2017-11-16 19:51:50 +00:00
float temp_compensation_pinda_thermistor_offset ( float temperature_pinda ) ;
2017-08-30 19:56:48 +00:00
# endif //PINDA_THERMISTOR
2017-07-01 16:51:02 +00:00
void serialecho_temperatures ( ) ;
2017-12-06 13:55:53 +00:00
bool check_commands ( ) ;
2017-07-01 16:51:02 +00:00
2017-07-01 22:11:21 +00:00
void uvlo_ ( ) ;
2018-07-23 18:04:47 +00:00
void uvlo_tiny ( ) ;
2017-09-26 02:30:10 +00:00
void recover_print ( uint8_t automatic ) ;
2017-07-01 22:11:21 +00:00
void setup_uvlo_interrupt ( ) ;
2018-02-07 10:10:04 +00:00
# if defined(TACH_1) && TACH_1 >-1
2017-10-26 15:42:27 +00:00
void setup_fan_interrupt ( ) ;
2018-02-07 10:10:04 +00:00
# endif
2017-07-02 19:01:23 +00:00
2020-01-26 16:35:50 +00:00
extern bool recover_machine_state_after_power_panic ( ) ;
extern void restore_print_from_eeprom ( bool mbl_was_active ) ;
2017-07-02 19:01:23 +00:00
extern void position_menu ( ) ;
2017-09-23 14:35:01 +00:00
extern void print_world_coordinates ( ) ;
extern void print_physical_coordinates ( ) ;
extern void print_mesh_bed_leveling_table ( ) ;
2018-10-08 13:58:49 +00:00
extern void stop_and_save_print_to_ram ( float z_move , float e_move ) ;
extern void restore_print_from_ram_and_continue ( float e_move ) ;
2019-12-16 14:52:37 +00:00
extern void cancel_saved_printing ( ) ;
2018-10-08 13:58:49 +00:00
2017-12-20 22:40:18 +00:00
2018-06-07 18:50:30 +00:00
//estimated time to end of the print
2018-08-19 22:27:45 +00:00
extern uint8_t calc_percent_done ( ) ;
2018-06-07 18:50:30 +00:00
2019-03-06 18:56:48 +00:00
2017-11-15 14:09:29 +00:00
// States for managing Marlin and host communication
// Marlin sends messages if blocked or busy
2017-11-16 21:03:36 +00:00
/*enum MarlinBusyState {
2017-11-15 14:09:29 +00:00
NOT_BUSY , // Not in a handler
IN_HANDLER , // Processing a GCode
IN_PROCESS , // Known to be blocking command input (as in G29)
PAUSED_FOR_USER , // Blocking pending any input
PAUSED_FOR_INPUT // Blocking pending text input (concept)
2017-11-16 21:03:36 +00:00
} ; */
# define NOT_BUSY 1
# define IN_HANDLER 2
# define IN_PROCESS 3
# define PAUSED_FOR_USER 4
# define PAUSED_FOR_INPUT 5
2017-11-15 14:09:29 +00:00
# define KEEPALIVE_STATE(n) do { busy_state = n;} while (0)
extern void host_keepalive ( ) ;
2022-06-26 22:17:46 +00:00
extern void host_autoreport ( ) ;
2017-11-16 21:03:36 +00:00
//extern MarlinBusyState busy_state;
2019-04-05 13:19:53 +00:00
extern int8_t busy_state ;
2017-11-15 14:09:29 +00:00
2017-12-12 19:21:09 +00:00
# ifdef TMC2130
# define FORCE_HIGH_POWER_START force_high_power_mode(true)
# define FORCE_HIGH_POWER_END force_high_power_mode(false)
void force_high_power_mode ( bool start_high_power_section ) ;
# endif //TMC2130
2017-11-07 15:49:04 +00:00
// G-codes
2018-07-15 18:00:29 +00:00
2018-02-22 09:38:46 +00:00
bool gcode_M45 ( bool onlyZ , int8_t verbosity_level ) ;
2018-03-06 14:11:50 +00:00
void gcode_M114 ( ) ;
2021-01-19 08:01:46 +00:00
# if (defined(FANCHECK) && (((defined(TACH_0) && (TACH_0 >-1)) || (defined(TACH_1) && (TACH_1 > -1)))))
2021-01-10 14:15:44 +00:00
void gcode_M123 ( ) ;
2021-01-19 08:01:46 +00:00
# endif //FANCHECK and TACH_0 and TACH_1
2017-11-07 15:49:04 +00:00
void gcode_M701 ( ) ;
2017-07-02 19:01:23 +00:00
2017-11-27 14:54:36 +00:00
# define UVLO !(PINE & (1<<4))
2018-07-18 14:17:45 +00:00
void proc_commands ( ) ;
2018-08-08 16:58:03 +00:00
2018-07-21 15:04:29 +00:00
void M600_load_filament ( ) ;
2018-07-31 10:24:22 +00:00
void M600_load_filament_movements ( ) ;
2018-10-08 13:58:49 +00:00
void M600_wait_for_user ( float HotendTempBckp ) ;
2019-03-04 21:00:24 +00:00
void M600_check_state ( float nozzle_temp ) ;
2018-11-01 15:29:09 +00:00
void load_filament_final_feed ( ) ;
2019-04-05 11:47:17 +00:00
void marlin_wait_for_click ( ) ;
2019-06-05 16:12:46 +00:00
void raise_z_above ( float target , bool plan = true ) ;
2019-08-31 14:09:53 +00:00
2020-08-12 14:25:49 +00:00
extern " C " void softReset ( ) ;
2021-06-12 13:21:16 +00:00
void stack_error ( ) ;
2020-08-12 09:46:35 +00:00
2021-02-02 11:21:16 +00:00
extern uint32_t IP_address ;
2019-08-31 14:09:53 +00:00
# endif