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
# define FORCE_INLINE __attribute__((always_inline)) inline
# 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>
# include "fastio.h"
# include "Configuration.h"
# include "pins.h"
# 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)))
# define SERIAL_PROTOCOLLN(x) (MYSERIAL.print(x),MYSERIAL.write('\n'))
# define SERIAL_PROTOCOLLNPGM(x) (serialprintPGM(PSTR(x)),MYSERIAL.write('\n'))
# define SERIAL_PROTOCOLLNRPGM(x) (serialprintPGM((x)),MYSERIAL.write('\n'))
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.
FORCE_INLINE void serialprintPGM ( const char * str )
{
char ch = pgm_read_byte ( str ) ;
while ( ch )
{
MYSERIAL . write ( ch ) ;
ch = pgm_read_byte ( + + str ) ;
}
}
bool is_buffer_empty ( ) ;
void get_command ( ) ;
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
# 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)
2018-10-08 13:58:49 +00:00
# define disable_z() {}
2017-06-29 16:35:43 +00:00
# endif
# else
# 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
# endif
# else
2018-10-08 13:58:49 +00:00
# define enable_z() {}
# define disable_z() {}
2017-06-29 16:35:43 +00:00
# endif
//#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
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 ) ;
2017-06-29 16:35:43 +00:00
void Stop ( ) ;
bool IsStopped ( ) ;
//put an ASCII command at the end of the current buffer.
void enquecommand ( const char * cmd , bool from_progmem = false ) ;
2018-07-09 10:44:19 +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
2017-06-29 16:35:43 +00:00
void enquecommand_front ( const char * cmd , bool from_progmem = false ) ;
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
2017-06-29 16:35:43 +00:00
void repeatcommand_front ( ) ;
2018-07-09 10:44:19 +00:00
2017-06-29 16:35:43 +00:00
// Remove all lines from the command queue.
void cmdqueue_reset ( ) ;
void prepare_arc_move ( char isclockwise ) ;
void clamp_to_software_endstops ( float target [ 3 ] ) ;
void refresh_cmd_timeout ( void ) ;
2018-01-12 20:16:29 +00:00
// Timer counter, incremented by the 1ms Arduino timer.
// The standard Arduino timer() function returns this value atomically
// by disabling / enabling interrupts. This is costly, if the interrupts are known
// to be disabled.
extern volatile unsigned long timer0_millis ;
// An unsynchronized equivalent to a standard Arduino millis() function.
// To be used inside an interrupt routine.
2018-01-12 21:01:53 +00:00
FORCE_INLINE unsigned long millis_nc ( ) { return timer0_millis ; }
2018-01-12 20:16:29 +00:00
2017-06-29 16:35:43 +00:00
# ifdef FAST_PWM_FAN
void setPwmFrequency ( uint8_t pin , int val ) ;
# endif
# ifndef CRITICAL_SECTION_START
# define CRITICAL_SECTION_START unsigned char _sreg = SREG; cli();
# define CRITICAL_SECTION_END SREG = _sreg;
# endif //CRITICAL_SECTION_START
extern float homing_feedrate [ ] ;
extern bool axis_relative_modes [ ] ;
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
extern float volumetric_multiplier [ EXTRUDERS ] ; // reciprocal of cross-sectional area of filament (in square millimeters), stored this way to reduce computational burden in planner
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 ;
2018-02-15 03:17:58 +00:00
extern void homeaxis ( int axis , uint8_t cnt = 1 , uint8_t * pstep = 0 ) ;
2018-10-08 13:58:49 +00:00
extern int8_t lcd_change_fil_state ;
2017-06-29 16:35:43 +00:00
# ifdef FAN_SOFT_PWM
extern unsigned char fanSpeedSoftPwm ;
# endif
# 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
# ifdef HOST_KEEPALIVE_FEATURE
extern uint8_t host_keepalive_interval ;
# endif
2017-06-29 16:35:43 +00:00
extern unsigned long starttime ;
extern unsigned long stoptime ;
extern int bowden_length [ 4 ] ;
extern bool is_usb_printing ;
extern bool homing_flag ;
extern bool temp_cal_active ;
extern bool loading_flag ;
extern unsigned int usb_printing_counter ;
extern unsigned long kicktime ;
extern unsigned long total_filament_used ;
void save_statistics ( unsigned long _total_filament_used , unsigned long _total_print_time ) ;
extern unsigned int heating_status ;
extern unsigned int status_number ;
extern unsigned int heating_status_counter ;
extern char snmm_filaments_used ;
extern unsigned long PingTime ;
2017-08-29 13:52:53 +00:00
extern unsigned long NcTime ;
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 ;
# endif
//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 ;
extern bool mesh_bed_run_from_menu ;
2017-12-06 16:48:16 +00:00
extern bool sortAlpha ;
2017-06-29 16:35:43 +00:00
2017-11-27 05:20:51 +00:00
extern char dir_names [ 3 ] [ 9 ] ;
2018-08-30 14:02:13 +00:00
extern int8_t lcd_change_fil_state ;
2018-05-22 11:31:21 +00:00
// save/restore printing
extern bool saved_printing ;
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 ;
2018-09-07 00:02:35 +00:00
extern uint16_t print_time_remaining_normal ;
2018-06-07 18:50:30 +00:00
extern uint8_t print_percent_done_silent ;
2018-09-07 00:02:35 +00:00
extern uint16_t print_time_remaining_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-09-10 16:02:54 +00:00
extern bool wizard_active ; //autoload temporarily disabled during wizard
2018-08-08 17:51:50 +00:00
# define PRINT_PERCENT_DONE_INIT 0xff
2018-08-19 16:34:57 +00:00
# define PRINTER_ACTIVE (IS_SD_PRINTING || is_usb_printing || isPrintPaused || (custom_message_type == CUSTOM_MSG_TYPE_TEMCAL) || saved_printing || (lcd_commands_type == LCD_COMMAND_V2_CAL) || card.paused || mmu_print_saved)
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
# ifdef DIS
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 ) ;
# endif
float temp_comp_interpolation ( float temperature ) ;
void temp_compensation_apply ( ) ;
void temp_compensation_start ( ) ;
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
2018-07-23 18:04:47 +00:00
//extern void recover_machine_state_after_power_panic();
extern void recover_machine_state_after_power_panic ( bool bTiny ) ;
2017-07-07 02:45:09 +00:00
extern void restore_print_from_eeprom ( ) ;
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 ) ;
2017-12-20 22:40:18 +00:00
2018-06-07 18:50:30 +00:00
//estimated time to end of the print
extern uint16_t print_time_remaining ( ) ;
2018-08-19 22:27:45 +00:00
extern uint8_t calc_percent_done ( ) ;
2018-06-07 18:50:30 +00:00
2017-11-15 14:09:29 +00:00
# ifdef HOST_KEEPALIVE_FEATURE
// 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 ( ) ;
2017-11-16 21:03:36 +00:00
//extern MarlinBusyState busy_state;
extern int busy_state ;
2017-11-15 14:09:29 +00:00
# endif //HOST_KEEPALIVE_FEATURE
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
void gcode_G28 ( bool home_x_axis , long home_x_value , bool home_y_axis , long home_y_value , bool home_z_axis , long home_z_value , bool calib , bool without_mbl ) ;
void gcode_G28 ( bool home_x_axis , bool home_y_axis , bool home_z_axis ) ;
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 ( ) ;
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 ) ;
2018-08-28 18:26:33 +00:00
void M600_check_state ( ) ;