Merge git://github.com/ErikZalm/Marlin into Marlin_v1
This commit is contained in:
		| @@ -30,6 +30,7 @@ | |||||||
| // Ultimaker = 7 | // Ultimaker = 7 | ||||||
| // Teensylu = 8 | // Teensylu = 8 | ||||||
| // Gen3+ =9 | // Gen3+ =9 | ||||||
|  | // Megatronics =70 | ||||||
|  |  | ||||||
| #ifndef MOTHERBOARD | #ifndef MOTHERBOARD | ||||||
| #define MOTHERBOARD 7 | #define MOTHERBOARD 7 | ||||||
| @@ -98,7 +99,7 @@ | |||||||
| #define PID_MAX 255 // limits current to nozzle; 255=full current | #define PID_MAX 255 // limits current to nozzle; 255=full current | ||||||
| #ifdef PIDTEMP | #ifdef PIDTEMP | ||||||
|   //#define PID_DEBUG // Sends debug data to the serial port.  |   //#define PID_DEBUG // Sends debug data to the serial port.  | ||||||
|   //#define PID_OPENLOOP 1 // Puts PID in open loop. M104 sets the output power in % |   //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX | ||||||
|   #define PID_INTEGRAL_DRIVE_MAX 255  //limit for the integral term |   #define PID_INTEGRAL_DRIVE_MAX 255  //limit for the integral term | ||||||
|   #define K1 0.95 //smoothing factor withing the PID |   #define K1 0.95 //smoothing factor withing the PID | ||||||
|   #define PID_dT ((16.0 * 8.0)/(F_CPU / 64.0 / 256.0)) //sampling period of the |   #define PID_dT ((16.0 * 8.0)/(F_CPU / 64.0 / 256.0)) //sampling period of the | ||||||
| @@ -120,6 +121,44 @@ | |||||||
| //    #define  DEFAULT_Kd 440 | //    #define  DEFAULT_Kd 440 | ||||||
| #endif // PIDTEMP | #endif // PIDTEMP | ||||||
|  |  | ||||||
|  | // Bed Temperature Control | ||||||
|  | // Select PID or bang-bang with PIDTEMPBED.  If bang-bang, BED_LIMIT_SWITCHING will enable hysteresis | ||||||
|  | // | ||||||
|  | // uncomment this to enable PID on the bed.   It uses the same ferquency PWM as the extruder.  | ||||||
|  | // If your PID_dT above is the default, and correct for your hardware/configuration, that means 7.689Hz, | ||||||
|  | // which is fine for driving a square wave into a resistive load and does not significantly impact you FET heating. | ||||||
|  | // This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W heater.  | ||||||
|  | // If your configuration is significantly different than this and you don't understand the issues involved, you proabaly  | ||||||
|  | // shouldn't use bed PID until someone else verifies your hardware works. | ||||||
|  | // If this is enabled, find your own PID constants below. | ||||||
|  | //#define PIDTEMPBED | ||||||
|  | // | ||||||
|  | //#define BED_LIMIT_SWITCHING | ||||||
|  |  | ||||||
|  | // This sets the max power delived to the bed, and replaces the HEATER_BED_DUTY_CYCLE_DIVIDER option. | ||||||
|  | // all forms of bed control obey this (PID, bang-bang, bang-bang with hysteresis) | ||||||
|  | // setting this to anything other than 255 enables a form of PWM to the bed just like HEATER_BED_DUTY_CYCLE_DIVIDER did, | ||||||
|  | // so you shouldn't use it unless you are OK with PWM on your bed.  (see the comment on enabling PIDTEMPBED) | ||||||
|  | #define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current | ||||||
|  |  | ||||||
|  | #ifdef PIDTEMPBED | ||||||
|  | //120v 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) | ||||||
|  | //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, argressive factor of .15 (vs .1, 1, 10) | ||||||
|  |     #define  DEFAULT_bedKp 10.00 | ||||||
|  |     #define  DEFAULT_bedKi .023 | ||||||
|  |     #define  DEFAULT_bedKd 305.4 | ||||||
|  |  | ||||||
|  | //120v 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) | ||||||
|  | //from pidautotune | ||||||
|  | //    #define  DEFAULT_bedKp 97.1 | ||||||
|  | //    #define  DEFAULT_bedKi 1.41 | ||||||
|  | //    #define  DEFAULT_bedKd 1675.16 | ||||||
|  |  | ||||||
|  | // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. | ||||||
|  | #endif // PIDTEMPBED | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| //this prevents dangerous Extruder moves, i.e. if the temperature is under the limit | //this prevents dangerous Extruder moves, i.e. if the temperature is under the limit | ||||||
| //can be software-disabled for whatever purposes by | //can be software-disabled for whatever purposes by | ||||||
| #define PREVENT_DANGEROUS_EXTRUDE | #define PREVENT_DANGEROUS_EXTRUDE | ||||||
| @@ -203,10 +242,14 @@ const bool Z_ENDSTOPS_INVERTING = true; // set to true to invert the logic of th | |||||||
| #define Y_MAX_LENGTH (Y_MAX_POS - Y_MIN_POS) | #define Y_MAX_LENGTH (Y_MAX_POS - Y_MIN_POS) | ||||||
| #define Z_MAX_LENGTH (Z_MAX_POS - Z_MIN_POS) | #define Z_MAX_LENGTH (Z_MAX_POS - Z_MIN_POS) | ||||||
|  |  | ||||||
| // The position of the homing switches. Use MAX_LENGTH * -0.5 if the center should be 0, 0, 0 | // The position of the homing switches | ||||||
| #define X_HOME_POS 0 | //#define MANUAL_HOME_POSITIONS  // If defined, manualy programed locations will be used | ||||||
| #define Y_HOME_POS 0 | //#define BED_CENTER_AT_0_0  // If defined the center of the bed is defined as (0,0) | ||||||
| #define Z_HOME_POS 0 |  | ||||||
|  | //Manual homing switch locations: | ||||||
|  | #define MANUAL_X_HOME_POS 0 | ||||||
|  | #define MANUAL_Y_HOME_POS 0 | ||||||
|  | #define MANUAL_Z_HOME_POS 0 | ||||||
|  |  | ||||||
| //// MOVEMENT SETTINGS | //// MOVEMENT SETTINGS | ||||||
| #define NUM_AXIS 4 // The axis order in all axis related arrays is X, Y, Z, E | #define NUM_AXIS 4 // The axis order in all axis related arrays is X, Y, Z, E | ||||||
| @@ -285,6 +328,9 @@ const bool Z_ENDSTOPS_INVERTING = true; // set to true to invert the logic of th | |||||||
| // Data from: http://www.doc-diy.net/photo/rc-1_hacked/ | // Data from: http://www.doc-diy.net/photo/rc-1_hacked/ | ||||||
| // #define PHOTOGRAPH_PIN     23 | // #define PHOTOGRAPH_PIN     23 | ||||||
|  |  | ||||||
|  | // SF send wrong arc g-codes when using Arc Point as fillet procedure | ||||||
|  | //#define SF_ARC_FIX | ||||||
|  |  | ||||||
| #include "Configuration_adv.h" | #include "Configuration_adv.h" | ||||||
| #include "thermistortables.h" | #include "thermistortables.h" | ||||||
|  |  | ||||||
|   | |||||||
| @@ -5,13 +5,10 @@ | |||||||
| //=============================Thermal Settings  ============================ | //=============================Thermal Settings  ============================ | ||||||
| //=========================================================================== | //=========================================================================== | ||||||
|  |  | ||||||
| // Select one of these only to define how the bed temp is read. |  | ||||||
| // |  | ||||||
| //#define BED_LIMIT_SWITCHING |  | ||||||
| #ifdef BED_LIMIT_SWITCHING | #ifdef BED_LIMIT_SWITCHING | ||||||
|   #define BED_HYSTERESIS 2 //only disable heating if T>target+BED_HYSTERESIS and enable heating if T>target-BED_HYSTERESIS |   #define BED_HYSTERESIS 2 //only disable heating if T>target+BED_HYSTERESIS and enable heating if T>target-BED_HYSTERESIS | ||||||
| #endif | #endif | ||||||
| #define BED_CHECK_INTERVAL 5000 //ms | #define BED_CHECK_INTERVAL 5000 //ms between checks in bang-bang control | ||||||
|  |  | ||||||
| //// Heating sanity check: | //// Heating sanity check: | ||||||
| // This waits for the watchperiod in milliseconds whenever an M104 or M109 increases the target temperature | // This waits for the watchperiod in milliseconds whenever an M104 or M109 increases the target temperature | ||||||
| @@ -76,6 +73,54 @@ | |||||||
|  |  | ||||||
| #define ENDSTOPS_ONLY_FOR_HOMING // If defined the endstops will only be used for homing | #define ENDSTOPS_ONLY_FOR_HOMING // If defined the endstops will only be used for homing | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //// AUTOSET LOCATIONS OF LIMIT SWITCHES | ||||||
|  | //// Added by ZetaPhoenix 09-15-2012 | ||||||
|  | #ifdef MANUAL_HOME_POSITION  //Use manual limit switch locations | ||||||
|  |   #define X_HOME_POS MANUAL_X_HOME_POS | ||||||
|  |   #define Y_HOME_POS MANUAL_Y_HOME_POS | ||||||
|  |   #define Z_HOME_POS MANUAL_Z_HOME_POS | ||||||
|  | #else //Set min/max homing switch positions based upon homing direction and min/max travel limits | ||||||
|  |   //X axis | ||||||
|  |   #if X_HOME_DIR == -1 | ||||||
|  |     #ifdef BED_CENTER_AT_0_0 | ||||||
|  |       #define X_HOME_POS X_MAX_LENGTH * -0.5 | ||||||
|  |     #else | ||||||
|  |       #define X_HOME_POS X_MIN_POS | ||||||
|  |     #endif //BED_CENTER_AT_0_0 | ||||||
|  |   #else     | ||||||
|  |     #ifdef BED_CENTER_AT_0_0 | ||||||
|  |       #define X_HOME_POS X_MAX_LENGTH * 0.5 | ||||||
|  |     #else | ||||||
|  |       #define X_HOME_POS X_MAX_POS | ||||||
|  |     #endif //BED_CENTER_AT_0_0 | ||||||
|  |   #endif //X_HOME_DIR == -1 | ||||||
|  |    | ||||||
|  |   //Y axis | ||||||
|  |   #if Y_HOME_DIR == -1 | ||||||
|  |     #ifdef BED_CENTER_AT_0_0 | ||||||
|  |       #define Y_HOME_POS Y_MAX_LENGTH * -0.5 | ||||||
|  |     #else | ||||||
|  |       #define Y_HOME_POS Y_MIN_POS | ||||||
|  |     #endif //BED_CENTER_AT_0_0 | ||||||
|  |   #else     | ||||||
|  |     #ifdef BED_CENTER_AT_0_0 | ||||||
|  |       #define Y_HOME_POS Y_MAX_LENGTH * 0.5 | ||||||
|  |     #else | ||||||
|  |       #define Y_HOME_POS Y_MAX_POS | ||||||
|  |     #endif //BED_CENTER_AT_0_0 | ||||||
|  |   #endif //Y_HOME_DIR == -1 | ||||||
|  |    | ||||||
|  |   // Z axis | ||||||
|  |   #if Z_HOME_DIR == -1 //BED_CENTER_AT_0_0 not used | ||||||
|  |     #define Z_HOME_POS Z_MIN_POS | ||||||
|  |   #else     | ||||||
|  |     #define Z_HOME_POS Z_MAX_POS | ||||||
|  |   #endif //Z_HOME_DIR == -1 | ||||||
|  | #endif //End auto min/max positions | ||||||
|  | //END AUTOSET LOCATIONS OF LIMIT SWITCHES -ZP | ||||||
|  |  | ||||||
|  |  | ||||||
| //#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. | //#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. | ||||||
|  |  | ||||||
| // A single Z stepper driver is usually used to drive 2 stepper motors. | // A single Z stepper driver is usually used to drive 2 stepper motors. | ||||||
|   | |||||||
| @@ -6,7 +6,13 @@ | |||||||
| #include "temperature.h" | #include "temperature.h" | ||||||
| //#include <EEPROM.h> | //#include <EEPROM.h> | ||||||
|  |  | ||||||
|  | int plaPreheatHotendTemp; | ||||||
|  | int plaPreheatHPBTemp; | ||||||
|  | int plaPreheatFanSpeed; | ||||||
|  |  | ||||||
|  | int absPreheatHotendTemp; | ||||||
|  | int absPreheatHPBTemp; | ||||||
|  | int absPreheatFanSpeed; | ||||||
|  |  | ||||||
| template <class T> int EEPROM_writeAnything(int &ee, const T& value) | template <class T> int EEPROM_writeAnything(int &ee, const T& value) | ||||||
| { | { | ||||||
| @@ -38,7 +44,7 @@ template <class T> int EEPROM_readAnything(int &ee, T& value) | |||||||
| // the default values are used whenever there is a change to the data, to prevent | // the default values are used whenever there is a change to the data, to prevent | ||||||
| // wrong data being written to the variables. | // wrong data being written to the variables. | ||||||
| // ALSO:  always make sure the variables in the Store and retrieve sections are in the same order. | // ALSO:  always make sure the variables in the Store and retrieve sections are in the same order. | ||||||
| #define EEPROM_VERSION "V06" | #define EEPROM_VERSION "V07" | ||||||
|  |  | ||||||
| inline void EEPROM_StoreSettings()  | inline void EEPROM_StoreSettings()  | ||||||
| { | { | ||||||
| @@ -58,6 +64,12 @@ inline void EEPROM_StoreSettings() | |||||||
|   EEPROM_writeAnything(i,max_z_jerk); |   EEPROM_writeAnything(i,max_z_jerk); | ||||||
|   EEPROM_writeAnything(i,max_e_jerk); |   EEPROM_writeAnything(i,max_e_jerk); | ||||||
|   EEPROM_writeAnything(i,add_homeing); |   EEPROM_writeAnything(i,add_homeing); | ||||||
|  |   EEPROM_writeAnything(i,plaPreheatHotendTemp); | ||||||
|  |   EEPROM_writeAnything(i,plaPreheatHPBTemp); | ||||||
|  |   EEPROM_writeAnything(i,plaPreheatFanSpeed); | ||||||
|  |   EEPROM_writeAnything(i,absPreheatHotendTemp); | ||||||
|  |   EEPROM_writeAnything(i,absPreheatHPBTemp); | ||||||
|  |   EEPROM_writeAnything(i,absPreheatFanSpeed); | ||||||
|   #ifdef PIDTEMP |   #ifdef PIDTEMP | ||||||
|     EEPROM_writeAnything(i,Kp); |     EEPROM_writeAnything(i,Kp); | ||||||
|     EEPROM_writeAnything(i,Ki); |     EEPROM_writeAnything(i,Ki); | ||||||
| @@ -162,6 +174,12 @@ inline void EEPROM_RetrieveSettings(bool def=false) | |||||||
|       EEPROM_readAnything(i,max_z_jerk); |       EEPROM_readAnything(i,max_z_jerk); | ||||||
|       EEPROM_readAnything(i,max_e_jerk); |       EEPROM_readAnything(i,max_e_jerk); | ||||||
|       EEPROM_readAnything(i,add_homeing); |       EEPROM_readAnything(i,add_homeing); | ||||||
|  | 	  EEPROM_readAnything(i,plaPreheatHotendTemp); | ||||||
|  | 	  EEPROM_readAnything(i,plaPreheatHPBTemp); | ||||||
|  | 	  EEPROM_readAnything(i,plaPreheatFanSpeed); | ||||||
|  | 	  EEPROM_readAnything(i,absPreheatHotendTemp); | ||||||
|  | 	  EEPROM_readAnything(i,absPreheatHPBTemp); | ||||||
|  | 	  EEPROM_readAnything(i,absPreheatFanSpeed); | ||||||
|       #ifndef PIDTEMP |       #ifndef PIDTEMP | ||||||
|         float Kp,Ki,Kd; |         float Kp,Ki,Kd; | ||||||
|       #endif |       #endif | ||||||
| @@ -195,6 +213,14 @@ inline void EEPROM_RetrieveSettings(bool def=false) | |||||||
|       add_homeing[0] = add_homeing[1] = add_homeing[2] = 0; |       add_homeing[0] = add_homeing[1] = add_homeing[2] = 0; | ||||||
|       SERIAL_ECHO_START; |       SERIAL_ECHO_START; | ||||||
|       SERIAL_ECHOLN("Using Default settings:"); |       SERIAL_ECHOLN("Using Default settings:"); | ||||||
|  | #ifdef ULTIPANEL | ||||||
|  | 	  plaPreheatHotendTemp = PLA_PREHEAT_HOTEND_TEMP; | ||||||
|  | 	  plaPreheatHPBTemp = PLA_PREHEAT_HPB_TEMP; | ||||||
|  | 	  plaPreheatFanSpeed = PLA_PREHEAT_FAN_SPEED; | ||||||
|  | 	  absPreheatHotendTemp = ABS_PREHEAT_HOTEND_TEMP; | ||||||
|  | 	  absPreheatHPBTemp = ABS_PREHEAT_HPB_TEMP; | ||||||
|  | 	  absPreheatFanSpeed = ABS_PREHEAT_FAN_SPEED; | ||||||
|  | #endif | ||||||
|     } |     } | ||||||
|   #ifdef EEPROM_CHITCHAT |   #ifdef EEPROM_CHITCHAT | ||||||
|     EEPROM_printSettings(); |     EEPROM_printSettings(); | ||||||
|   | |||||||
							
								
								
									
										
											BIN
										
									
								
								Marlin/LCD Menu Tree.pdf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								Marlin/LCD Menu Tree.pdf
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										390
									
								
								Marlin/LiquidCrystalRus.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										390
									
								
								Marlin/LiquidCrystalRus.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,390 @@ | |||||||
|  | #define __PROG_TYPES_COMPAT__ | ||||||
|  | #include "LiquidCrystalRus.h" | ||||||
|  |  | ||||||
|  | #include <stdio.h> | ||||||
|  | #include <string.h> | ||||||
|  | #include <inttypes.h> | ||||||
|  | #include <avr/pgmspace.h> | ||||||
|  |  | ||||||
|  | #if defined(ARDUINO) && ARDUINO >= 100 | ||||||
|  |   #include "Arduino.h" | ||||||
|  | #else | ||||||
|  |   #include "WProgram.h" | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | // it is a russian alphabet translation | ||||||
|  | // except 0401 --> 0xa2 = ╗, 0451 --> 0xb5 | ||||||
|  | const PROGMEM prog_uchar utf_recode[] =  | ||||||
|  |        { 0x41,0xa0,0x42,0xa1,0xe0,0x45,0xa3,0xa4,0xa5,0xa6,0x4b,0xa7,0x4d,0x48,0x4f, | ||||||
|  |          0xa8,0x50,0x43,0x54,0xa9,0xaa,0x58,0xe1,0xab,0xac,0xe2,0xad,0xae,0x62,0xaf,0xb0,0xb1, | ||||||
|  |          0x61,0xb2,0xb3,0xb4,0xe3,0x65,0xb6,0xb7,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0x6f, | ||||||
|  |          0xbe,0x70,0x63,0xbf,0x79,0xe4,0x78,0xe5,0xc0,0xc1,0xe6,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7 | ||||||
|  |         };      | ||||||
|  |  | ||||||
|  | // When the display powers up, it is configured as follows: | ||||||
|  | // | ||||||
|  | // 1. Display clear | ||||||
|  | // 2. Function set:  | ||||||
|  | //    DL = 1; 8-bit interface data  | ||||||
|  | //    N = 0; 1-line display  | ||||||
|  | //    F = 0; 5x8 dot character font  | ||||||
|  | // 3. Display on/off control:  | ||||||
|  | //    D = 0; Display off  | ||||||
|  | //    C = 0; Cursor off  | ||||||
|  | //    B = 0; Blinking off  | ||||||
|  | // 4. Entry mode set:  | ||||||
|  | //    I/D = 1; Increment by 1  | ||||||
|  | //    S = 0; No shift  | ||||||
|  | // | ||||||
|  | // Note, however, that resetting the Arduino doesn't reset the LCD, so we | ||||||
|  | // can't assume that its in that state when a sketch starts (and the | ||||||
|  | // LiquidCrystal constructor is called). | ||||||
|  | //  | ||||||
|  | // modified 27 Jul 2011 | ||||||
|  | // by Ilya V. Danilov http://mk90.ru/ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | LiquidCrystalRus::LiquidCrystalRus(uint8_t rs, uint8_t rw, uint8_t enable, | ||||||
|  | 			     uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3, | ||||||
|  | 			     uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7) | ||||||
|  | { | ||||||
|  |   init(0, rs, rw, enable, d0, d1, d2, d3, d4, d5, d6, d7); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | LiquidCrystalRus::LiquidCrystalRus(uint8_t rs, uint8_t enable, | ||||||
|  | 			     uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3, | ||||||
|  | 			     uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7) | ||||||
|  | { | ||||||
|  |   init(0, rs, 255, enable, d0, d1, d2, d3, d4, d5, d6, d7); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | LiquidCrystalRus::LiquidCrystalRus(uint8_t rs, uint8_t rw, uint8_t enable, | ||||||
|  | 			     uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3) | ||||||
|  | { | ||||||
|  |   init(1, rs, rw, enable, d0, d1, d2, d3, 0, 0, 0, 0); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | LiquidCrystalRus::LiquidCrystalRus(uint8_t rs,  uint8_t enable, | ||||||
|  | 			     uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3) | ||||||
|  | { | ||||||
|  |   init(1, rs, 255, enable, d0, d1, d2, d3, 0, 0, 0, 0); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void LiquidCrystalRus::init(uint8_t fourbitmode, uint8_t rs, uint8_t rw, uint8_t enable, | ||||||
|  | 			 uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3, | ||||||
|  | 			 uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7) | ||||||
|  | { | ||||||
|  |   _rs_pin = rs; | ||||||
|  |   _rw_pin = rw; | ||||||
|  |   _enable_pin = enable; | ||||||
|  |    | ||||||
|  |   _data_pins[0] = d0; | ||||||
|  |   _data_pins[1] = d1; | ||||||
|  |   _data_pins[2] = d2; | ||||||
|  |   _data_pins[3] = d3;  | ||||||
|  |   _data_pins[4] = d4; | ||||||
|  |   _data_pins[5] = d5; | ||||||
|  |   _data_pins[6] = d6; | ||||||
|  |   _data_pins[7] = d7;  | ||||||
|  |  | ||||||
|  |   pinMode(_rs_pin, OUTPUT); | ||||||
|  |   // we can save 1 pin by not using RW. Indicate by passing 255 instead of pin# | ||||||
|  |   if (_rw_pin != 255) {  | ||||||
|  |     pinMode(_rw_pin, OUTPUT); | ||||||
|  |   } | ||||||
|  |   pinMode(_enable_pin, OUTPUT); | ||||||
|  |    | ||||||
|  |   if (fourbitmode) | ||||||
|  |     _displayfunction = LCD_4BITMODE | LCD_1LINE | LCD_5x8DOTS; | ||||||
|  |   else  | ||||||
|  |     _displayfunction = LCD_8BITMODE | LCD_1LINE | LCD_5x8DOTS; | ||||||
|  |    | ||||||
|  |   begin(16, 1);   | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void LiquidCrystalRus::begin(uint8_t cols, uint8_t lines, uint8_t dotsize) { | ||||||
|  |   if (lines > 1) { | ||||||
|  |     _displayfunction |= LCD_2LINE; | ||||||
|  |   } | ||||||
|  |   _numlines = lines; | ||||||
|  |   _currline = 0; | ||||||
|  |  | ||||||
|  |   // for some 1 line displays you can select a 10 pixel high font | ||||||
|  |   if ((dotsize != 0) && (lines == 1)) { | ||||||
|  |     _displayfunction |= LCD_5x10DOTS; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   // SEE PAGE 45/46 FOR INITIALIZATION SPECIFICATION! | ||||||
|  |   // according to datasheet, we need at least 40ms after power rises above 2.7V | ||||||
|  |   // before sending commands. Arduino can turn on way befer 4.5V so we'll wait 50 | ||||||
|  |   delayMicroseconds(50000);  | ||||||
|  |   // Now we pull both RS and R/W low to begin commands | ||||||
|  |   digitalWrite(_rs_pin, LOW); | ||||||
|  |   digitalWrite(_enable_pin, LOW); | ||||||
|  |   if (_rw_pin != 255) {  | ||||||
|  |     digitalWrite(_rw_pin, LOW); | ||||||
|  |   } | ||||||
|  |    | ||||||
|  |   //put the LCD into 4 bit or 8 bit mode | ||||||
|  |   if (! (_displayfunction & LCD_8BITMODE)) { | ||||||
|  |     // this is according to the hitachi HD44780 datasheet | ||||||
|  |     // figure 24, pg 46 | ||||||
|  |  | ||||||
|  |     // we start in 8bit mode, try to set 4 bit mode | ||||||
|  |     writeNbits(0x03,4); | ||||||
|  |     delayMicroseconds(4500); // wait min 4.1ms | ||||||
|  |  | ||||||
|  |     // second try | ||||||
|  |     writeNbits(0x03,4); | ||||||
|  |     delayMicroseconds(4500); // wait min 4.1ms | ||||||
|  |      | ||||||
|  |     // third go! | ||||||
|  |     writeNbits(0x03,4);  | ||||||
|  |     delayMicroseconds(150); | ||||||
|  |  | ||||||
|  |     // finally, set to 8-bit interface | ||||||
|  |     writeNbits(0x02,4);  | ||||||
|  |   } else { | ||||||
|  |     // this is according to the hitachi HD44780 datasheet | ||||||
|  |     // page 45 figure 23 | ||||||
|  |  | ||||||
|  |     // Send function set command sequence | ||||||
|  |     command(LCD_FUNCTIONSET | _displayfunction); | ||||||
|  |     delayMicroseconds(4500);  // wait more than 4.1ms | ||||||
|  |  | ||||||
|  |     // second try | ||||||
|  |     command(LCD_FUNCTIONSET | _displayfunction); | ||||||
|  |     delayMicroseconds(150); | ||||||
|  |  | ||||||
|  |     // third go | ||||||
|  |     command(LCD_FUNCTIONSET | _displayfunction); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   // finally, set # lines, font size, etc. | ||||||
|  |   command(LCD_FUNCTIONSET | _displayfunction);   | ||||||
|  |  | ||||||
|  |   // turn the display on with no cursor or blinking default | ||||||
|  |   _displaycontrol = LCD_DISPLAYON | LCD_CURSOROFF | LCD_BLINKOFF;   | ||||||
|  |   display(); | ||||||
|  |  | ||||||
|  |   // clear it off | ||||||
|  |   clear(); | ||||||
|  |  | ||||||
|  |   // Initialize to default text direction (for romance languages) | ||||||
|  |   _displaymode = LCD_ENTRYLEFT | LCD_ENTRYSHIFTDECREMENT; | ||||||
|  |   // set the entry mode | ||||||
|  |   command(LCD_ENTRYMODESET | _displaymode); | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void LiquidCrystalRus::setDRAMModel(uint8_t model) { | ||||||
|  |   _dram_model = model; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /********** high level commands, for the user! */ | ||||||
|  | void LiquidCrystalRus::clear() | ||||||
|  | { | ||||||
|  |   command(LCD_CLEARDISPLAY);  // clear display, set cursor position to zero | ||||||
|  |   delayMicroseconds(2000);  // this command takes a long time! | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void LiquidCrystalRus::home() | ||||||
|  | { | ||||||
|  |   command(LCD_RETURNHOME);  // set cursor position to zero | ||||||
|  |   delayMicroseconds(2000);  // this command takes a long time! | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void LiquidCrystalRus::setCursor(uint8_t col, uint8_t row) | ||||||
|  | { | ||||||
|  |   int row_offsets[] = { 0x00, 0x40, 0x14, 0x54 }; | ||||||
|  |   if ( row >= _numlines ) { | ||||||
|  |     row = _numlines-1;    // we count rows starting w/0 | ||||||
|  |   } | ||||||
|  |    | ||||||
|  |   command(LCD_SETDDRAMADDR | (col + row_offsets[row])); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Turn the display on/off (quickly) | ||||||
|  | void LiquidCrystalRus::noDisplay() { | ||||||
|  |   _displaycontrol &= ~LCD_DISPLAYON; | ||||||
|  |   command(LCD_DISPLAYCONTROL | _displaycontrol); | ||||||
|  | } | ||||||
|  | void LiquidCrystalRus::display() { | ||||||
|  |   _displaycontrol |= LCD_DISPLAYON; | ||||||
|  |   command(LCD_DISPLAYCONTROL | _displaycontrol); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Turns the underline cursor on/off | ||||||
|  | void LiquidCrystalRus::noCursor() { | ||||||
|  |   _displaycontrol &= ~LCD_CURSORON; | ||||||
|  |   command(LCD_DISPLAYCONTROL | _displaycontrol); | ||||||
|  | } | ||||||
|  | void LiquidCrystalRus::cursor() { | ||||||
|  |   _displaycontrol |= LCD_CURSORON; | ||||||
|  |   command(LCD_DISPLAYCONTROL | _displaycontrol); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Turn on and off the blinking cursor | ||||||
|  | void LiquidCrystalRus::noBlink() { | ||||||
|  |   _displaycontrol &= ~LCD_BLINKON; | ||||||
|  |   command(LCD_DISPLAYCONTROL | _displaycontrol); | ||||||
|  | } | ||||||
|  | void LiquidCrystalRus::blink() { | ||||||
|  |   _displaycontrol |= LCD_BLINKON; | ||||||
|  |   command(LCD_DISPLAYCONTROL | _displaycontrol); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // These commands scroll the display without changing the RAM | ||||||
|  | void LiquidCrystalRus::scrollDisplayLeft(void) { | ||||||
|  |   command(LCD_CURSORSHIFT | LCD_DISPLAYMOVE | LCD_MOVELEFT); | ||||||
|  | } | ||||||
|  | void LiquidCrystalRus::scrollDisplayRight(void) { | ||||||
|  |   command(LCD_CURSORSHIFT | LCD_DISPLAYMOVE | LCD_MOVERIGHT); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // This is for text that flows Left to Right | ||||||
|  | void LiquidCrystalRus::leftToRight(void) { | ||||||
|  |   _displaymode |= LCD_ENTRYLEFT; | ||||||
|  |   command(LCD_ENTRYMODESET | _displaymode); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // This is for text that flows Right to Left | ||||||
|  | void LiquidCrystalRus::rightToLeft(void) { | ||||||
|  |   _displaymode &= ~LCD_ENTRYLEFT; | ||||||
|  |   command(LCD_ENTRYMODESET | _displaymode); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // This will 'right justify' text from the cursor | ||||||
|  | void LiquidCrystalRus::autoscroll(void) { | ||||||
|  |   _displaymode |= LCD_ENTRYSHIFTINCREMENT; | ||||||
|  |   command(LCD_ENTRYMODESET | _displaymode); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // This will 'left justify' text from the cursor | ||||||
|  | void LiquidCrystalRus::noAutoscroll(void) { | ||||||
|  |   _displaymode &= ~LCD_ENTRYSHIFTINCREMENT; | ||||||
|  |   command(LCD_ENTRYMODESET | _displaymode); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Allows us to fill the first 8 CGRAM locations | ||||||
|  | // with custom characters | ||||||
|  | void LiquidCrystalRus::createChar(uint8_t location, uint8_t charmap[]) { | ||||||
|  |   location &= 0x7; // we only have 8 locations 0-7 | ||||||
|  |   command(LCD_SETCGRAMADDR | (location << 3)); | ||||||
|  |   for (int i=0; i<8; i++) { | ||||||
|  |     write(charmap[i]); | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /*********** mid level commands, for sending data/cmds */ | ||||||
|  |  | ||||||
|  | inline void LiquidCrystalRus::command(uint8_t value) { | ||||||
|  |   send(value, LOW); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #if defined(ARDUINO) && ARDUINO >= 100 | ||||||
|  |   size_t LiquidCrystalRus::write(uint8_t value) | ||||||
|  | #else | ||||||
|  |   void   LiquidCrystalRus::write(uint8_t value) | ||||||
|  | #endif | ||||||
|  | { | ||||||
|  |   uint8_t out_char=value; | ||||||
|  |  | ||||||
|  |   if (_dram_model == LCD_DRAM_WH1601) {   | ||||||
|  |     uint8_t ac=recv(LOW) & 0x7f; | ||||||
|  |     if (ac>7 && ac<0x14) command(LCD_SETDDRAMADDR | (0x40+ac-8)); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   if (value>=0x80) { // UTF-8 handling | ||||||
|  |     if (value >= 0xc0) { | ||||||
|  |       utf_hi_char = value - 0xd0; | ||||||
|  |     } else { | ||||||
|  |       value &= 0x3f; | ||||||
|  |       if (!utf_hi_char && (value == 1))  | ||||||
|  |         send(0xa2,HIGH); // ╗ | ||||||
|  |       else if ((utf_hi_char == 1) && (value == 0x11))  | ||||||
|  |         send(0xb5,HIGH); // ╦ | ||||||
|  |       else  | ||||||
|  |         send(pgm_read_byte_near(utf_recode + value + (utf_hi_char<<6) - 0x10), HIGH); | ||||||
|  |     }     | ||||||
|  |   } else send(out_char, HIGH); | ||||||
|  | #if defined(ARDUINO) && ARDUINO >= 100 | ||||||
|  |   return 1; // assume sucess  | ||||||
|  | #endif | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /************ low level data pushing commands **********/ | ||||||
|  |  | ||||||
|  | // write either command or data, with automatic 4/8-bit selection | ||||||
|  | void LiquidCrystalRus::send(uint8_t value, uint8_t mode) { | ||||||
|  |   digitalWrite(_rs_pin, mode); | ||||||
|  |  | ||||||
|  |   // if there is a RW pin indicated, set it low to Write | ||||||
|  |   if (_rw_pin != 255) {  | ||||||
|  |     digitalWrite(_rw_pin, LOW); | ||||||
|  |   } | ||||||
|  |    | ||||||
|  |   if (_displayfunction & LCD_8BITMODE) { | ||||||
|  |     writeNbits(value,8);  | ||||||
|  |   } else { | ||||||
|  |     writeNbits(value>>4,4); | ||||||
|  |     writeNbits(value,4); | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // read  data, with automatic 4/8-bit selection | ||||||
|  | uint8_t LiquidCrystalRus::recv(uint8_t mode) { | ||||||
|  |   uint8_t retval; | ||||||
|  |   digitalWrite(_rs_pin, mode); | ||||||
|  |  | ||||||
|  |   // if there is a RW pin indicated, set it low to Write | ||||||
|  |   if (_rw_pin != 255) {  | ||||||
|  |     digitalWrite(_rw_pin, HIGH); | ||||||
|  |   } | ||||||
|  |    | ||||||
|  |   if (_displayfunction & LCD_8BITMODE) { | ||||||
|  |     retval = readNbits(8);  | ||||||
|  |   } else { | ||||||
|  |     retval = readNbits(4) << 4; | ||||||
|  |     retval |= readNbits(4); | ||||||
|  |   } | ||||||
|  |   return retval; | ||||||
|  | } | ||||||
|  | void LiquidCrystalRus::pulseEnable() { | ||||||
|  |   digitalWrite(_enable_pin, LOW); | ||||||
|  |   delayMicroseconds(1);     | ||||||
|  |   digitalWrite(_enable_pin, HIGH); | ||||||
|  |   delayMicroseconds(1);    // enable pulse must be >450ns | ||||||
|  |   digitalWrite(_enable_pin, LOW); | ||||||
|  |   delayMicroseconds(100);   // commands need > 37us to settle | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void LiquidCrystalRus::writeNbits(uint8_t value, uint8_t n) { | ||||||
|  |   for (int i = 0; i < n; i++) { | ||||||
|  |     pinMode(_data_pins[i], OUTPUT); | ||||||
|  |     digitalWrite(_data_pins[i], (value >> i) & 0x01); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   pulseEnable(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | uint8_t LiquidCrystalRus::readNbits(uint8_t n) { | ||||||
|  |   uint8_t retval=0; | ||||||
|  |   for (int i = 0; i < n; i++) { | ||||||
|  |     pinMode(_data_pins[i], INPUT); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   digitalWrite(_enable_pin, LOW); | ||||||
|  |   delayMicroseconds(1);     | ||||||
|  |   digitalWrite(_enable_pin, HIGH); | ||||||
|  |   delayMicroseconds(1);    // enable pulse must be >450ns | ||||||
|  |    | ||||||
|  |   for (int i = 0; i < n; i++) { | ||||||
|  |     retval |= (digitalRead(_data_pins[i]) == HIGH)?(1 << i):0; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   digitalWrite(_enable_pin, LOW); | ||||||
|  |  | ||||||
|  |   return retval; | ||||||
|  | } | ||||||
|  |  | ||||||
							
								
								
									
										129
									
								
								Marlin/LiquidCrystalRus.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										129
									
								
								Marlin/LiquidCrystalRus.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,129 @@ | |||||||
|  | // | ||||||
|  | // based on LiquidCrystal library from ArduinoIDE, see http://arduino.cc | ||||||
|  | //  modified 27 Jul 2011 | ||||||
|  | // by Ilya V. Danilov http://mk90.ru/ | ||||||
|  | //  | ||||||
|  |  | ||||||
|  | #ifndef LiquidCrystalRus_h | ||||||
|  | #define LiquidCrystalRus_h | ||||||
|  |  | ||||||
|  | #include <inttypes.h> | ||||||
|  | #include "Print.h" | ||||||
|  |  | ||||||
|  | // commands | ||||||
|  | #define LCD_CLEARDISPLAY 0x01 | ||||||
|  | #define LCD_RETURNHOME 0x02 | ||||||
|  | #define LCD_ENTRYMODESET 0x04 | ||||||
|  | #define LCD_DISPLAYCONTROL 0x08 | ||||||
|  | #define LCD_CURSORSHIFT 0x10 | ||||||
|  | #define LCD_FUNCTIONSET 0x20 | ||||||
|  | #define LCD_SETCGRAMADDR 0x40 | ||||||
|  | #define LCD_SETDDRAMADDR 0x80 | ||||||
|  |  | ||||||
|  | // flags for display entry mode | ||||||
|  | #define LCD_ENTRYRIGHT 0x00 | ||||||
|  | #define LCD_ENTRYLEFT 0x02 | ||||||
|  | #define LCD_ENTRYSHIFTINCREMENT 0x01 | ||||||
|  | #define LCD_ENTRYSHIFTDECREMENT 0x00 | ||||||
|  |  | ||||||
|  | // flags for display on/off control | ||||||
|  | #define LCD_DISPLAYON 0x04 | ||||||
|  | #define LCD_DISPLAYOFF 0x00 | ||||||
|  | #define LCD_CURSORON 0x02 | ||||||
|  | #define LCD_CURSOROFF 0x00 | ||||||
|  | #define LCD_BLINKON 0x01 | ||||||
|  | #define LCD_BLINKOFF 0x00 | ||||||
|  |  | ||||||
|  | // flags for display/cursor shift | ||||||
|  | #define LCD_DISPLAYMOVE 0x08 | ||||||
|  | #define LCD_CURSORMOVE 0x00 | ||||||
|  | #define LCD_MOVERIGHT 0x04 | ||||||
|  | #define LCD_MOVELEFT 0x00 | ||||||
|  |  | ||||||
|  | // flags for function set | ||||||
|  | #define LCD_8BITMODE 0x10 | ||||||
|  | #define LCD_4BITMODE 0x00 | ||||||
|  | #define LCD_2LINE 0x08 | ||||||
|  | #define LCD_1LINE 0x00 | ||||||
|  | #define LCD_5x10DOTS 0x04 | ||||||
|  | #define LCD_5x8DOTS 0x00 | ||||||
|  |  | ||||||
|  | // enum for  | ||||||
|  | #define LCD_DRAM_Normal 0x00 | ||||||
|  | #define LCD_DRAM_WH1601 0x01 | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class LiquidCrystalRus : public Print { | ||||||
|  | public: | ||||||
|  |   LiquidCrystalRus(uint8_t rs, uint8_t enable, | ||||||
|  | 		uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3, | ||||||
|  | 		uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7); | ||||||
|  |   LiquidCrystalRus(uint8_t rs, uint8_t rw, uint8_t enable, | ||||||
|  | 		uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3, | ||||||
|  | 		uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7); | ||||||
|  |   LiquidCrystalRus(uint8_t rs, uint8_t rw, uint8_t enable, | ||||||
|  | 		uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3); | ||||||
|  |   LiquidCrystalRus(uint8_t rs, uint8_t enable, | ||||||
|  | 		uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3); | ||||||
|  |  | ||||||
|  |   void init(uint8_t fourbitmode, uint8_t rs, uint8_t rw, uint8_t enable, | ||||||
|  | 	    uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3, | ||||||
|  | 	    uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7); | ||||||
|  |      | ||||||
|  |   void begin(uint8_t cols, uint8_t rows, uint8_t charsize = LCD_5x8DOTS); | ||||||
|  |  | ||||||
|  |   void clear(); | ||||||
|  |   void home(); | ||||||
|  |  | ||||||
|  |   void noDisplay(); | ||||||
|  |   void display(); | ||||||
|  |   void noBlink(); | ||||||
|  |   void blink(); | ||||||
|  |   void noCursor(); | ||||||
|  |   void cursor(); | ||||||
|  |   void scrollDisplayLeft(); | ||||||
|  |   void scrollDisplayRight(); | ||||||
|  |   void leftToRight(); | ||||||
|  |   void rightToLeft(); | ||||||
|  |   void autoscroll(); | ||||||
|  |   void noAutoscroll(); | ||||||
|  |  | ||||||
|  |   void createChar(uint8_t, uint8_t[]); | ||||||
|  |   void setCursor(uint8_t, uint8_t); | ||||||
|  |   | ||||||
|  | #if defined(ARDUINO) && ARDUINO >= 100 | ||||||
|  |   virtual size_t write(uint8_t); | ||||||
|  |   using Print::write; | ||||||
|  | #else | ||||||
|  |   virtual void write(uint8_t); | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |   void command(uint8_t); | ||||||
|  |  | ||||||
|  |   void setDRAMModel(uint8_t); | ||||||
|  |  | ||||||
|  | private: | ||||||
|  |   void send(uint8_t, uint8_t); | ||||||
|  |   void writeNbits(uint8_t, uint8_t); | ||||||
|  |   uint8_t recv(uint8_t); | ||||||
|  |   uint8_t readNbits(uint8_t);  | ||||||
|  |   void pulseEnable(); | ||||||
|  |  | ||||||
|  |   uint8_t _rs_pin; // LOW: command.  HIGH: character. | ||||||
|  |   uint8_t _rw_pin; // LOW: write to LCD.  HIGH: read from LCD. | ||||||
|  |   uint8_t _enable_pin; // activated by a HIGH pulse. | ||||||
|  |   uint8_t _data_pins[8]; | ||||||
|  |  | ||||||
|  |   uint8_t _displayfunction; | ||||||
|  |   uint8_t _displaycontrol; | ||||||
|  |   uint8_t _displaymode; | ||||||
|  |  | ||||||
|  |   uint8_t _initialized; | ||||||
|  |  | ||||||
|  |   uint8_t _numlines,_currline; | ||||||
|  |  | ||||||
|  |   uint8_t _dram_model; | ||||||
|  |   uint8_t utf_hi_char; // UTF-8 high part | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | #endif | ||||||
| @@ -277,6 +277,10 @@ applet/%.o: %.c Configuration.h Configuration_adv.h $(MAKEFILE) | |||||||
| 	$(Pecho) "  CC    $@" | 	$(Pecho) "  CC    $@" | ||||||
| 	$P $(CC) -MMD -c $(ALL_CFLAGS) $< -o $@ | 	$P $(CC) -MMD -c $(ALL_CFLAGS) $< -o $@ | ||||||
|  |  | ||||||
|  | applet/%.o: applet/%.cpp Configuration.h Configuration_adv.h $(MAKEFILE) | ||||||
|  | 	$(Pecho) "  CXX   $@" | ||||||
|  | 	$P $(CXX) -MMD -c $(ALL_CXXFLAGS) $< -o $@ | ||||||
|  |  | ||||||
| applet/%.o: %.cpp Configuration.h Configuration_adv.h $(MAKEFILE) | applet/%.o: %.cpp Configuration.h Configuration_adv.h $(MAKEFILE) | ||||||
| 	$(Pecho) "  CXX   $@" | 	$(Pecho) "  CXX   $@" | ||||||
| 	$P $(CXX) -MMD -c $(ALL_CXXFLAGS) $< -o $@ | 	$P $(CXX) -MMD -c $(ALL_CXXFLAGS) $< -o $@ | ||||||
|   | |||||||
| @@ -107,7 +107,7 @@ FORCE_INLINE void serialprintPGM(const char *str) | |||||||
| void get_command(); | void get_command(); | ||||||
| void process_commands(); | void process_commands(); | ||||||
|  |  | ||||||
| void manage_inactivity(byte debug); | void manage_inactivity(); | ||||||
|  |  | ||||||
| #if X_ENABLE_PIN > -1 | #if X_ENABLE_PIN > -1 | ||||||
|   #define  enable_x() WRITE(X_ENABLE_PIN, X_ENABLE_ON) |   #define  enable_x() WRITE(X_ENABLE_PIN, X_ENABLE_ON) | ||||||
|   | |||||||
| @@ -115,6 +115,7 @@ | |||||||
| // M301 - Set PID parameters P I and D | // M301 - Set PID parameters P I and D | ||||||
| // M302 - Allow cold extrudes | // M302 - Allow cold extrudes | ||||||
| // M303 - PID relay autotune S<temperature> sets the target temperature. (default target temperature = 150C) | // M303 - PID relay autotune S<temperature> sets the target temperature. (default target temperature = 150C) | ||||||
|  | // M304 - Set bed PID parameters P I and D | ||||||
| // M400 - Finish all moves | // M400 - Finish all moves | ||||||
| // M500 - stores paramters in EEPROM | // M500 - stores paramters in EEPROM | ||||||
| // M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily).   | // M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily).   | ||||||
| @@ -202,6 +203,7 @@ bool Stopped=false; | |||||||
| //=========================================================================== | //=========================================================================== | ||||||
|  |  | ||||||
| void get_arc_coordinates(); | void get_arc_coordinates(); | ||||||
|  | bool setTargetedHotend(int code); | ||||||
|  |  | ||||||
| void serial_echopair_P(const char *s_P, float v) | void serial_echopair_P(const char *s_P, float v) | ||||||
|     { serialprintPGM(s_P); SERIAL_ECHO(v); } |     { serialprintPGM(s_P); SERIAL_ECHO(v); } | ||||||
| @@ -245,6 +247,14 @@ void enquecommand(const char *cmd) | |||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | void setup_killpin() | ||||||
|  | { | ||||||
|  |   #if( KILL_PIN>-1 ) | ||||||
|  |     pinMode(KILL_PIN,INPUT); | ||||||
|  |     WRITE(KILL_PIN,HIGH); | ||||||
|  |   #endif | ||||||
|  | } | ||||||
|  |      | ||||||
| void setup_photpin() | void setup_photpin() | ||||||
| { | { | ||||||
|   #ifdef PHOTOGRAPH_PIN |   #ifdef PHOTOGRAPH_PIN | ||||||
| @@ -276,7 +286,8 @@ void suicide() | |||||||
| } | } | ||||||
|  |  | ||||||
| void setup() | void setup() | ||||||
| {  | { | ||||||
|  |   setup_killpin();  | ||||||
|   setup_powerhold(); |   setup_powerhold(); | ||||||
|   MYSERIAL.begin(BAUDRATE); |   MYSERIAL.begin(BAUDRATE); | ||||||
|   SERIAL_PROTOCOLLNPGM("start"); |   SERIAL_PROTOCOLLNPGM("start"); | ||||||
| @@ -365,7 +376,7 @@ void loop() | |||||||
|   } |   } | ||||||
|   //check heater every n milliseconds |   //check heater every n milliseconds | ||||||
|   manage_heater(); |   manage_heater(); | ||||||
|   manage_inactivity(1); |   manage_inactivity(); | ||||||
|   checkHitEndstops(); |   checkHitEndstops(); | ||||||
|   LCD_STATUS; |   LCD_STATUS; | ||||||
| } | } | ||||||
| @@ -653,8 +664,8 @@ void process_commands() | |||||||
|       previous_millis_cmd = millis(); |       previous_millis_cmd = millis(); | ||||||
|       while(millis()  < codenum ){ |       while(millis()  < codenum ){ | ||||||
|         manage_heater(); |         manage_heater(); | ||||||
|         manage_inactivity(1); |         manage_inactivity(); | ||||||
| 		LCD_STATUS; |         LCD_STATUS; | ||||||
|       } |       } | ||||||
|       break; |       break; | ||||||
|       #ifdef FWRETRACT   |       #ifdef FWRETRACT   | ||||||
| @@ -816,21 +827,20 @@ void process_commands() | |||||||
|        |        | ||||||
|       st_synchronize(); |       st_synchronize(); | ||||||
|       previous_millis_cmd = millis(); |       previous_millis_cmd = millis(); | ||||||
| 	  if (codenum > 0) |       if (codenum > 0){ | ||||||
| 	  { |  | ||||||
|         codenum += millis();  // keep track of when we started waiting |         codenum += millis();  // keep track of when we started waiting | ||||||
|         while(millis()  < codenum && !CLICKED){ |         while(millis()  < codenum && !CLICKED){ | ||||||
|           manage_heater(); |           manage_heater(); | ||||||
|           manage_inactivity(1); |           manage_inactivity(); | ||||||
| 		  LCD_STATUS; |           LCD_STATUS; | ||||||
| 		} |         } | ||||||
|       }else{ |       }else{ | ||||||
|         while(!CLICKED) { |         while(!CLICKED){ | ||||||
|           manage_heater(); |           manage_heater(); | ||||||
|           manage_inactivity(1); |           manage_inactivity(); | ||||||
| 		  LCD_STATUS; |           LCD_STATUS; | ||||||
| 		} |         } | ||||||
| 	  } |       } | ||||||
|     } |     } | ||||||
|     break; |     break; | ||||||
| #endif | #endif | ||||||
| @@ -949,15 +959,8 @@ void process_commands() | |||||||
|       } |       } | ||||||
|      break; |      break; | ||||||
|     case 104: // M104 |     case 104: // M104 | ||||||
|       tmp_extruder = active_extruder; |       if(setTargetedHotend(104)){ | ||||||
|       if(code_seen('T')) { |         break; | ||||||
|         tmp_extruder = code_value(); |  | ||||||
|         if(tmp_extruder >= EXTRUDERS) { |  | ||||||
|           SERIAL_ECHO_START; |  | ||||||
|           SERIAL_ECHO(MSG_M104_INVALID_EXTRUDER); |  | ||||||
|           SERIAL_ECHOLN(tmp_extruder); |  | ||||||
|           break; |  | ||||||
|         } |  | ||||||
|       } |       } | ||||||
|       if (code_seen('S')) setTargetHotend(code_value(), tmp_extruder); |       if (code_seen('S')) setTargetHotend(code_value(), tmp_extruder); | ||||||
|       setWatch(); |       setWatch(); | ||||||
| @@ -966,15 +969,8 @@ void process_commands() | |||||||
|       if (code_seen('S')) setTargetBed(code_value()); |       if (code_seen('S')) setTargetBed(code_value()); | ||||||
|       break; |       break; | ||||||
|     case 105 : // M105 |     case 105 : // M105 | ||||||
|       tmp_extruder = active_extruder; |       if(setTargetedHotend(105)){ | ||||||
|       if(code_seen('T')) { |         break; | ||||||
|         tmp_extruder = code_value(); |  | ||||||
|         if(tmp_extruder >= EXTRUDERS) { |  | ||||||
|           SERIAL_ECHO_START; |  | ||||||
|           SERIAL_ECHO(MSG_M105_INVALID_EXTRUDER); |  | ||||||
|           SERIAL_ECHOLN(tmp_extruder); |  | ||||||
|           break; |  | ||||||
|         } |  | ||||||
|       } |       } | ||||||
|       #if (TEMP_0_PIN > -1) |       #if (TEMP_0_PIN > -1) | ||||||
|         SERIAL_PROTOCOLPGM("ok T:"); |         SERIAL_PROTOCOLPGM("ok T:"); | ||||||
| @@ -991,24 +987,20 @@ void process_commands() | |||||||
|         SERIAL_ERROR_START; |         SERIAL_ERROR_START; | ||||||
|         SERIAL_ERRORLNPGM(MSG_ERR_NO_THERMISTORS); |         SERIAL_ERRORLNPGM(MSG_ERR_NO_THERMISTORS); | ||||||
|       #endif |       #endif | ||||||
|       #ifdef PIDTEMP |  | ||||||
|         SERIAL_PROTOCOLPGM(" @:"); |         SERIAL_PROTOCOLPGM(" @:"); | ||||||
|         SERIAL_PROTOCOL(getHeaterPower(tmp_extruder));   |         SERIAL_PROTOCOL(getHeaterPower(tmp_extruder));   | ||||||
|       #endif |  | ||||||
|  |         SERIAL_PROTOCOLPGM(" B@:"); | ||||||
|  |         SERIAL_PROTOCOL(getHeaterPower(-1));   | ||||||
|  |  | ||||||
|         SERIAL_PROTOCOLLN(""); |         SERIAL_PROTOCOLLN(""); | ||||||
|       return; |       return; | ||||||
|       break; |       break; | ||||||
|     case 109:  |     case 109:  | ||||||
|     {// M109 - Wait for extruder heater to reach target. |     {// M109 - Wait for extruder heater to reach target. | ||||||
|       tmp_extruder = active_extruder; |       if(setTargetedHotend(109)){ | ||||||
|       if(code_seen('T')) { |         break; | ||||||
|         tmp_extruder = code_value(); |  | ||||||
|         if(tmp_extruder >= EXTRUDERS) { |  | ||||||
|           SERIAL_ECHO_START; |  | ||||||
|           SERIAL_ECHO(MSG_M109_INVALID_EXTRUDER); |  | ||||||
|           SERIAL_ECHOLN(tmp_extruder); |  | ||||||
|           break; |  | ||||||
|         } |  | ||||||
|       } |       } | ||||||
|       LCD_MESSAGEPGM(MSG_HEATING);    |       LCD_MESSAGEPGM(MSG_HEATING);    | ||||||
|       #ifdef AUTOTEMP |       #ifdef AUTOTEMP | ||||||
| @@ -1064,7 +1056,7 @@ void process_commands() | |||||||
|             codenum = millis(); |             codenum = millis(); | ||||||
|           } |           } | ||||||
|           manage_heater(); |           manage_heater(); | ||||||
|           manage_inactivity(1); |           manage_inactivity(); | ||||||
|           LCD_STATUS; |           LCD_STATUS; | ||||||
|         #ifdef TEMP_RESIDENCY_TIME |         #ifdef TEMP_RESIDENCY_TIME | ||||||
|             /* start/restart the TEMP_RESIDENCY_TIME timer whenever we reach target temp for the first time |             /* start/restart the TEMP_RESIDENCY_TIME timer whenever we reach target temp for the first time | ||||||
| @@ -1102,7 +1094,7 @@ void process_commands() | |||||||
|             codenum = millis();  |             codenum = millis();  | ||||||
|           } |           } | ||||||
|           manage_heater(); |           manage_heater(); | ||||||
|           manage_inactivity(1); |           manage_inactivity(); | ||||||
|           LCD_STATUS; |           LCD_STATUS; | ||||||
|         } |         } | ||||||
|         LCD_MESSAGEPGM(MSG_BED_DONE); |         LCD_MESSAGEPGM(MSG_BED_DONE); | ||||||
| @@ -1137,7 +1129,8 @@ void process_commands() | |||||||
|         st_synchronize(); |         st_synchronize(); | ||||||
|         suicide(); |         suicide(); | ||||||
|       #elif (PS_ON_PIN > -1) |       #elif (PS_ON_PIN > -1) | ||||||
|         SET_INPUT(PS_ON_PIN); //Floating |         SET_OUTPUT(PS_ON_PIN);  | ||||||
|  |         WRITE(PS_ON_PIN, HIGH); | ||||||
|       #endif |       #endif | ||||||
| 		break; | 		break; | ||||||
|          |          | ||||||
| @@ -1236,31 +1229,31 @@ void process_commands() | |||||||
|       enable_endstops(true) ; |       enable_endstops(true) ; | ||||||
|       break; |       break; | ||||||
|     case 119: // M119 |     case 119: // M119 | ||||||
|  |     SERIAL_PROTOCOLLN(MSG_M119_REPORT); | ||||||
|       #if (X_MIN_PIN > -1) |       #if (X_MIN_PIN > -1) | ||||||
|         SERIAL_PROTOCOLPGM(MSG_X_MIN); |         SERIAL_PROTOCOLPGM(MSG_X_MIN); | ||||||
|         SERIAL_PROTOCOL(((READ(X_MIN_PIN)^X_ENDSTOPS_INVERTING)?"H ":"L ")); |         SERIAL_PROTOCOLLN(((READ(X_MIN_PIN)^X_ENDSTOPS_INVERTING)?MSG_ENDSTOP_HIT:MSG_ENDSTOP_OPEN)); | ||||||
|       #endif |       #endif | ||||||
|       #if (X_MAX_PIN > -1) |       #if (X_MAX_PIN > -1) | ||||||
|         SERIAL_PROTOCOLPGM(MSG_X_MAX); |         SERIAL_PROTOCOLPGM(MSG_X_MAX); | ||||||
|         SERIAL_PROTOCOL(((READ(X_MAX_PIN)^X_ENDSTOPS_INVERTING)?"H ":"L ")); |         SERIAL_PROTOCOLLN(((READ(X_MAX_PIN)^X_ENDSTOPS_INVERTING)?MSG_ENDSTOP_HIT:MSG_ENDSTOP_OPEN)); | ||||||
|       #endif |       #endif | ||||||
|       #if (Y_MIN_PIN > -1) |       #if (Y_MIN_PIN > -1) | ||||||
|         SERIAL_PROTOCOLPGM(MSG_Y_MIN); |         SERIAL_PROTOCOLPGM(MSG_Y_MIN); | ||||||
|         SERIAL_PROTOCOL(((READ(Y_MIN_PIN)^Y_ENDSTOPS_INVERTING)?"H ":"L ")); |         SERIAL_PROTOCOLLN(((READ(Y_MIN_PIN)^Y_ENDSTOPS_INVERTING)?MSG_ENDSTOP_HIT:MSG_ENDSTOP_OPEN)); | ||||||
|       #endif |       #endif | ||||||
|       #if (Y_MAX_PIN > -1) |       #if (Y_MAX_PIN > -1) | ||||||
|         SERIAL_PROTOCOLPGM(MSG_Y_MAX); |         SERIAL_PROTOCOLPGM(MSG_Y_MAX); | ||||||
|         SERIAL_PROTOCOL(((READ(Y_MAX_PIN)^Y_ENDSTOPS_INVERTING)?"H ":"L ")); |         SERIAL_PROTOCOLLN(((READ(Y_MAX_PIN)^Y_ENDSTOPS_INVERTING)?MSG_ENDSTOP_HIT:MSG_ENDSTOP_OPEN)); | ||||||
|       #endif |       #endif | ||||||
|       #if (Z_MIN_PIN > -1) |       #if (Z_MIN_PIN > -1) | ||||||
|         SERIAL_PROTOCOLPGM(MSG_Z_MIN); |         SERIAL_PROTOCOLPGM(MSG_Z_MIN); | ||||||
|         SERIAL_PROTOCOL(((READ(Z_MIN_PIN)^Z_ENDSTOPS_INVERTING)?"H ":"L ")); |         SERIAL_PROTOCOLLN(((READ(Z_MIN_PIN)^Z_ENDSTOPS_INVERTING)?MSG_ENDSTOP_HIT:MSG_ENDSTOP_OPEN)); | ||||||
|       #endif |       #endif | ||||||
|       #if (Z_MAX_PIN > -1) |       #if (Z_MAX_PIN > -1) | ||||||
|         SERIAL_PROTOCOLPGM(MSG_Z_MAX); |         SERIAL_PROTOCOLPGM(MSG_Z_MAX); | ||||||
|         SERIAL_PROTOCOL(((READ(Z_MAX_PIN)^Z_ENDSTOPS_INVERTING)?"H ":"L ")); |         SERIAL_PROTOCOLLN(((READ(Z_MAX_PIN)^Z_ENDSTOPS_INVERTING)?MSG_ENDSTOP_HIT:MSG_ENDSTOP_OPEN)); | ||||||
|       #endif |       #endif | ||||||
|       SERIAL_PROTOCOLLN(""); |  | ||||||
|       break; |       break; | ||||||
|       //TODO: update for all axis, use for loop |       //TODO: update for all axis, use for loop | ||||||
|     case 201: // M201 |     case 201: // M201 | ||||||
| @@ -1397,6 +1390,24 @@ void process_commands() | |||||||
|       } |       } | ||||||
|       break; |       break; | ||||||
|     #endif //PIDTEMP |     #endif //PIDTEMP | ||||||
|  |     #ifdef PIDTEMPBED | ||||||
|  |     case 304: // M304 | ||||||
|  |       { | ||||||
|  |         if(code_seen('P')) bedKp = code_value(); | ||||||
|  |         if(code_seen('I')) bedKi = code_value()*PID_dT; | ||||||
|  |         if(code_seen('D')) bedKd = code_value()/PID_dT; | ||||||
|  |         updatePID(); | ||||||
|  |         SERIAL_PROTOCOL(MSG_OK); | ||||||
|  | 		SERIAL_PROTOCOL(" p:"); | ||||||
|  |         SERIAL_PROTOCOL(bedKp); | ||||||
|  |         SERIAL_PROTOCOL(" i:"); | ||||||
|  |         SERIAL_PROTOCOL(bedKi/PID_dT); | ||||||
|  |         SERIAL_PROTOCOL(" d:"); | ||||||
|  |         SERIAL_PROTOCOL(bedKd*PID_dT); | ||||||
|  |         SERIAL_PROTOCOLLN(""); | ||||||
|  |       } | ||||||
|  |       break; | ||||||
|  |     #endif //PIDTEMP | ||||||
|     case 240: // M240  Triggers a camera by emulating a Canon RC-1 : http://www.doc-diy.net/photo/rc-1_hacked/ |     case 240: // M240  Triggers a camera by emulating a Canon RC-1 : http://www.doc-diy.net/photo/rc-1_hacked/ | ||||||
|      { |      { | ||||||
|       #ifdef PHOTOGRAPH_PIN |       #ifdef PHOTOGRAPH_PIN | ||||||
| @@ -1429,8 +1440,14 @@ void process_commands() | |||||||
|     case 303: // M303 PID autotune |     case 303: // M303 PID autotune | ||||||
|     { |     { | ||||||
|       float temp = 150.0; |       float temp = 150.0; | ||||||
|  |       int e=0; | ||||||
|  |       int c=5; | ||||||
|  |       if (code_seen('E')) e=code_value(); | ||||||
|  | 			if (e<0) | ||||||
|  | 				temp=70; | ||||||
|       if (code_seen('S')) temp=code_value(); |       if (code_seen('S')) temp=code_value(); | ||||||
|       PID_autotune(temp); |       if (code_seen('C')) c=code_value(); | ||||||
|  |       PID_autotune(temp, e, c); | ||||||
|     } |     } | ||||||
|     break; |     break; | ||||||
|     case 400: // M400 finish all moves |     case 400: // M400 finish all moves | ||||||
| @@ -1568,7 +1585,15 @@ void get_coordinates() | |||||||
|  |  | ||||||
| void get_arc_coordinates() | void get_arc_coordinates() | ||||||
| { | { | ||||||
|  | #ifdef SF_ARC_FIX | ||||||
|  |    bool relative_mode_backup = relative_mode; | ||||||
|  |    relative_mode = true; | ||||||
|  | #endif | ||||||
|    get_coordinates(); |    get_coordinates(); | ||||||
|  | #ifdef SF_ARC_FIX | ||||||
|  |    relative_mode=relative_mode_backup; | ||||||
|  | #endif | ||||||
|  |  | ||||||
|    if(code_seen('I')) { |    if(code_seen('I')) { | ||||||
|      offset[0] = code_value(); |      offset[0] = code_value(); | ||||||
|    }  |    }  | ||||||
| @@ -1664,7 +1689,7 @@ void controllerFan() | |||||||
| } | } | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| void manage_inactivity(byte debug)  | void manage_inactivity()  | ||||||
| {  | {  | ||||||
|   if( (millis() - previous_millis_cmd) >  max_inactive_time )  |   if( (millis() - previous_millis_cmd) >  max_inactive_time )  | ||||||
|     if(max_inactive_time)  |     if(max_inactive_time)  | ||||||
| @@ -1682,6 +1707,10 @@ void manage_inactivity(byte debug) | |||||||
|       } |       } | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |   #if( KILL_PIN>-1 ) | ||||||
|  |     if( 0 == READ(KILL_PIN) ) | ||||||
|  |       kill(); | ||||||
|  |   #endif | ||||||
|   #ifdef CONTROLLERFAN_PIN |   #ifdef CONTROLLERFAN_PIN | ||||||
|     controllerFan(); //Check if fan should be turned on to cool stepper drivers down |     controllerFan(); //Check if fan should be turned on to cool stepper drivers down | ||||||
|   #endif |   #endif | ||||||
| @@ -1722,7 +1751,7 @@ void kill() | |||||||
|   if(PS_ON_PIN > -1) pinMode(PS_ON_PIN,INPUT); |   if(PS_ON_PIN > -1) pinMode(PS_ON_PIN,INPUT); | ||||||
|   SERIAL_ERROR_START; |   SERIAL_ERROR_START; | ||||||
|   SERIAL_ERRORLNPGM(MSG_ERR_KILLED); |   SERIAL_ERRORLNPGM(MSG_ERR_KILLED); | ||||||
|   LCD_MESSAGEPGM(MSG_KILLED); |   LCD_ALERTMESSAGEPGM(MSG_KILLED); | ||||||
|   suicide(); |   suicide(); | ||||||
|   while(1); // Wait for reset |   while(1); // Wait for reset | ||||||
| } | } | ||||||
| @@ -1809,6 +1838,28 @@ void setPwmFrequency(uint8_t pin, int val) | |||||||
|  |  | ||||||
|   } |   } | ||||||
| } | } | ||||||
| #endif | #endif //FAST_PWM_FAN | ||||||
|  |  | ||||||
|  |  | ||||||
|  | bool setTargetedHotend(int code){ | ||||||
|  |   tmp_extruder = active_extruder; | ||||||
|  |   if(code_seen('T')) { | ||||||
|  |     tmp_extruder = code_value(); | ||||||
|  |     if(tmp_extruder >= EXTRUDERS) { | ||||||
|  |       SERIAL_ECHO_START; | ||||||
|  |       switch(code){ | ||||||
|  |         case 104: | ||||||
|  |           SERIAL_ECHO(MSG_M104_INVALID_EXTRUDER); | ||||||
|  |           break; | ||||||
|  |         case 105: | ||||||
|  |           SERIAL_ECHO(MSG_M105_INVALID_EXTRUDER); | ||||||
|  |           break; | ||||||
|  |         case 109: | ||||||
|  |           SERIAL_ECHO(MSG_M109_INVALID_EXTRUDER); | ||||||
|  |           break; | ||||||
|  |       } | ||||||
|  |       SERIAL_ECHOLN(tmp_extruder); | ||||||
|  |       return true; | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |   return false; | ||||||
|  | } | ||||||
|   | |||||||
							
								
								
									
										
											BIN
										
									
								
								Marlin/Menu Plans.xlsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								Marlin/Menu Plans.xlsx
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| @@ -369,7 +369,6 @@ bool Sd2Card::init(uint8_t sckRateID, uint8_t chipSelectPin) { | |||||||
|  * |  * | ||||||
|  * \param[in] blockNumber Logical block to be read. |  * \param[in] blockNumber Logical block to be read. | ||||||
|  * \param[out] dst Pointer to the location that will receive the data. |  * \param[out] dst Pointer to the location that will receive the data. | ||||||
|  |  | ||||||
|  * \return The value one, true, is returned for success and |  * \return The value one, true, is returned for success and | ||||||
|  * the value zero, false, is returned for failure. |  * the value zero, false, is returned for failure. | ||||||
|  */ |  */ | ||||||
| @@ -639,5 +638,4 @@ bool Sd2Card::writeStop() { | |||||||
|   return false; |   return false; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | #endif | ||||||
| #endif |  | ||||||
|   | |||||||
| @@ -867,7 +867,7 @@ bool SdBaseFile::openParent(SdBaseFile* dir) { | |||||||
|   } |   } | ||||||
|   // search for parent in '../..' |   // search for parent in '../..' | ||||||
|   do { |   do { | ||||||
|     if (file.readDir(&entry) != 32) goto fail; |     if (file.readDir(&entry, NULL) != 32) goto fail; | ||||||
|     c = entry.firstClusterLow; |     c = entry.firstClusterLow; | ||||||
|     c |= (uint32_t)entry.firstClusterHigh << 16; |     c |= (uint32_t)entry.firstClusterHigh << 16; | ||||||
|   } while (c != cluster); |   } while (c != cluster); | ||||||
| @@ -1108,10 +1108,16 @@ int16_t SdBaseFile::read(void* buf, uint16_t nbyte) { | |||||||
|  * readDir() called before a directory has been opened, this is not |  * readDir() called before a directory has been opened, this is not | ||||||
|  * a directory file or an I/O error occurred. |  * a directory file or an I/O error occurred. | ||||||
|  */ |  */ | ||||||
| int8_t SdBaseFile::readDir(dir_t* dir) { | int8_t SdBaseFile::readDir(dir_t* dir, char* longFilename) { | ||||||
|   int16_t n; |   int16_t n; | ||||||
|   // if not a directory file or miss-positioned return an error |   // if not a directory file or miss-positioned return an error | ||||||
|   if (!isDir() || (0X1F & curPosition_)) return -1; |   if (!isDir() || (0X1F & curPosition_)) return -1; | ||||||
|  |    | ||||||
|  |   //If we have a longFilename buffer, mark it as invalid. If we find a long filename it will be filled automaticly. | ||||||
|  |   if (longFilename != NULL) | ||||||
|  |   { | ||||||
|  |   	longFilename[0] = '\0'; | ||||||
|  |   } | ||||||
|  |  | ||||||
|   while (1) { |   while (1) { | ||||||
|     n = read(dir, sizeof(dir_t)); |     n = read(dir, sizeof(dir_t)); | ||||||
| @@ -1120,6 +1126,34 @@ int8_t SdBaseFile::readDir(dir_t* dir) { | |||||||
|     if (dir->name[0] == DIR_NAME_FREE) return 0; |     if (dir->name[0] == DIR_NAME_FREE) return 0; | ||||||
|     // skip empty entries and entry for .  and .. |     // skip empty entries and entry for .  and .. | ||||||
|     if (dir->name[0] == DIR_NAME_DELETED || dir->name[0] == '.') continue; |     if (dir->name[0] == DIR_NAME_DELETED || dir->name[0] == '.') continue; | ||||||
|  |     //Fill the long filename if we have a long filename entry, | ||||||
|  | 	// long filename entries are stored before the actual filename. | ||||||
|  | 	if (DIR_IS_LONG_NAME(dir) && longFilename != NULL) | ||||||
|  |     { | ||||||
|  |     	vfat_t *VFAT = (vfat_t*)dir; | ||||||
|  | 		//Sanity check the VFAT entry. The first cluster is always set to zero. And th esequence number should be higher then 0 | ||||||
|  |     	if (VFAT->firstClusterLow == 0 && (VFAT->sequenceNumber & 0x1F) > 0 && (VFAT->sequenceNumber & 0x1F) <= MAX_VFAT_ENTRIES) | ||||||
|  |     	{ | ||||||
|  | 			//TODO: Store the filename checksum to verify if a none-long filename aware system modified the file table. | ||||||
|  |     		n = ((VFAT->sequenceNumber & 0x1F) - 1) * 13; | ||||||
|  | 			longFilename[n+0] = VFAT->name1[0]; | ||||||
|  | 			longFilename[n+1] = VFAT->name1[1]; | ||||||
|  | 			longFilename[n+2] = VFAT->name1[2]; | ||||||
|  | 			longFilename[n+3] = VFAT->name1[3]; | ||||||
|  | 			longFilename[n+4] = VFAT->name1[4]; | ||||||
|  | 			longFilename[n+5] = VFAT->name2[0]; | ||||||
|  | 			longFilename[n+6] = VFAT->name2[1]; | ||||||
|  | 			longFilename[n+7] = VFAT->name2[2]; | ||||||
|  | 			longFilename[n+8] = VFAT->name2[3]; | ||||||
|  | 			longFilename[n+9] = VFAT->name2[4]; | ||||||
|  | 			longFilename[n+10] = VFAT->name2[5]; | ||||||
|  | 			longFilename[n+11] = VFAT->name3[0]; | ||||||
|  | 			longFilename[n+12] = VFAT->name3[1]; | ||||||
|  | 			//If this VFAT entry is the last one, add a NUL terminator at the end of the string | ||||||
|  | 			if (VFAT->sequenceNumber & 0x40) | ||||||
|  | 				longFilename[n+13] = '\0'; | ||||||
|  | 		} | ||||||
|  |     } | ||||||
|     // return if normal file or subdirectory |     // return if normal file or subdirectory | ||||||
|     if (DIR_IS_FILE_OR_SUBDIR(dir)) return n; |     if (DIR_IS_FILE_OR_SUBDIR(dir)) return n; | ||||||
|   } |   } | ||||||
| @@ -1788,4 +1822,4 @@ void (*SdBaseFile::oldDateTime_)(uint16_t& date, uint16_t& time) = 0;  // NOLINT | |||||||
| #endif  // ALLOW_DEPRECATED_FUNCTIONS | #endif  // ALLOW_DEPRECATED_FUNCTIONS | ||||||
|  |  | ||||||
|  |  | ||||||
| #endif | #endif | ||||||
|   | |||||||
| @@ -283,7 +283,7 @@ class SdBaseFile { | |||||||
|   bool printName(); |   bool printName(); | ||||||
|   int16_t read(); |   int16_t read(); | ||||||
|   int16_t read(void* buf, uint16_t nbyte); |   int16_t read(void* buf, uint16_t nbyte); | ||||||
|   int8_t readDir(dir_t* dir); |   int8_t readDir(dir_t* dir, char* longFilename); | ||||||
|   static bool remove(SdBaseFile* dirFile, const char* path); |   static bool remove(SdBaseFile* dirFile, const char* path); | ||||||
|   bool remove(); |   bool remove(); | ||||||
|   /** Set the file's current position to zero. */ |   /** Set the file's current position to zero. */ | ||||||
| @@ -455,7 +455,7 @@ class SdBaseFile { | |||||||
|    * \param[out] dir The dir_t struct that will receive the data. |    * \param[out] dir The dir_t struct that will receive the data. | ||||||
|    * \return bytes read for success zero for eof or -1 for failure. |    * \return bytes read for success zero for eof or -1 for failure. | ||||||
|    */ |    */ | ||||||
|   int8_t readDir(dir_t& dir) {return readDir(&dir);}  // NOLINT |   int8_t readDir(dir_t& dir, char* longFilename) {return readDir(&dir, longFilename);}  // NOLINT | ||||||
|   /** \deprecated Use: |   /** \deprecated Use: | ||||||
|    * static uint8_t remove(SdBaseFile* dirFile, const char* path); |    * static uint8_t remove(SdBaseFile* dirFile, const char* path); | ||||||
|    * \param[in] dirFile The directory that contains the file. |    * \param[in] dirFile The directory that contains the file. | ||||||
| @@ -480,4 +480,4 @@ class SdBaseFile { | |||||||
| }; | }; | ||||||
|  |  | ||||||
| #endif  // SdBaseFile_h | #endif  // SdBaseFile_h | ||||||
| #endif | #endif | ||||||
|   | |||||||
| @@ -108,7 +108,14 @@ uint8_t const SOFT_SPI_SCK_PIN = 13; | |||||||
|  * a pure virtual function is called. |  * a pure virtual function is called. | ||||||
|  */ |  */ | ||||||
| #define USE_CXA_PURE_VIRTUAL 1 | #define USE_CXA_PURE_VIRTUAL 1 | ||||||
|  | /** | ||||||
|  |  * Defines for long (vfat) filenames | ||||||
|  |  */ | ||||||
|  | /** Number of VFAT entries used. Every entry has 13 UTF-16 characters */ | ||||||
|  | #define MAX_VFAT_ENTRIES (2) | ||||||
|  | /** Total size of the buffer used to store the long filenames */ | ||||||
|  | #define LONG_FILENAME_LENGTH (13*MAX_VFAT_ENTRIES+1) | ||||||
| #endif  // SdFatConfig_h | #endif  // SdFatConfig_h | ||||||
|  |  | ||||||
|  |  | ||||||
| #endif | #endif | ||||||
|   | |||||||
| @@ -22,6 +22,8 @@ | |||||||
|  |  | ||||||
| #ifndef SdFatStructs_h | #ifndef SdFatStructs_h | ||||||
| #define SdFatStructs_h | #define SdFatStructs_h | ||||||
|  |  | ||||||
|  | #define PACKED __attribute__((__packed__)) | ||||||
| /** | /** | ||||||
|  * \file |  * \file | ||||||
|  * \brief FAT file structures |  * \brief FAT file structures | ||||||
| @@ -95,7 +97,7 @@ struct partitionTable { | |||||||
|   uint32_t firstSector; |   uint32_t firstSector; | ||||||
|            /** Length of the partition, in blocks. */ |            /** Length of the partition, in blocks. */ | ||||||
|   uint32_t totalSectors; |   uint32_t totalSectors; | ||||||
| }; | } PACKED; | ||||||
| /** Type name for partitionTable */ | /** Type name for partitionTable */ | ||||||
| typedef struct partitionTable part_t; | typedef struct partitionTable part_t; | ||||||
| //------------------------------------------------------------------------------ | //------------------------------------------------------------------------------ | ||||||
| @@ -119,7 +121,7 @@ struct masterBootRecord { | |||||||
|   uint8_t  mbrSig0; |   uint8_t  mbrSig0; | ||||||
|            /** Second MBR signature byte. Must be 0XAA */ |            /** Second MBR signature byte. Must be 0XAA */ | ||||||
|   uint8_t  mbrSig1; |   uint8_t  mbrSig1; | ||||||
| }; | } PACKED; | ||||||
| /** Type name for masterBootRecord */ | /** Type name for masterBootRecord */ | ||||||
| typedef struct masterBootRecord mbr_t; | typedef struct masterBootRecord mbr_t; | ||||||
| //------------------------------------------------------------------------------ | //------------------------------------------------------------------------------ | ||||||
| @@ -247,7 +249,7 @@ struct fat_boot { | |||||||
|   uint8_t  bootSectorSig0; |   uint8_t  bootSectorSig0; | ||||||
|            /** must be 0XAA */ |            /** must be 0XAA */ | ||||||
|   uint8_t  bootSectorSig1; |   uint8_t  bootSectorSig1; | ||||||
| }; | } PACKED; | ||||||
| /** Type name for FAT Boot Sector */ | /** Type name for FAT Boot Sector */ | ||||||
| typedef struct fat_boot fat_boot_t; | typedef struct fat_boot fat_boot_t; | ||||||
| //------------------------------------------------------------------------------ | //------------------------------------------------------------------------------ | ||||||
| @@ -401,7 +403,7 @@ struct fat32_boot { | |||||||
|   uint8_t  bootSectorSig0; |   uint8_t  bootSectorSig0; | ||||||
|            /** must be 0XAA */ |            /** must be 0XAA */ | ||||||
|   uint8_t  bootSectorSig1; |   uint8_t  bootSectorSig1; | ||||||
| }; | } PACKED; | ||||||
| /** Type name for FAT32 Boot Sector */ | /** Type name for FAT32 Boot Sector */ | ||||||
| typedef struct fat32_boot fat32_boot_t; | typedef struct fat32_boot fat32_boot_t; | ||||||
| //------------------------------------------------------------------------------ | //------------------------------------------------------------------------------ | ||||||
| @@ -441,7 +443,7 @@ struct fat32_fsinfo { | |||||||
|   uint8_t  reserved2[12]; |   uint8_t  reserved2[12]; | ||||||
|            /** must be 0X00, 0X00, 0X55, 0XAA */ |            /** must be 0X00, 0X00, 0X55, 0XAA */ | ||||||
|   uint8_t  tailSignature[4]; |   uint8_t  tailSignature[4]; | ||||||
| }; | } PACKED; | ||||||
| /** Type name for FAT32 FSINFO Sector */ | /** Type name for FAT32 FSINFO Sector */ | ||||||
| typedef struct fat32_fsinfo fat32_fsinfo_t; | typedef struct fat32_fsinfo fat32_fsinfo_t; | ||||||
| //------------------------------------------------------------------------------ | //------------------------------------------------------------------------------ | ||||||
| @@ -539,12 +541,46 @@ struct directoryEntry { | |||||||
|   uint16_t firstClusterLow; |   uint16_t firstClusterLow; | ||||||
|            /** 32-bit unsigned holding this file's size in bytes. */ |            /** 32-bit unsigned holding this file's size in bytes. */ | ||||||
|   uint32_t fileSize; |   uint32_t fileSize; | ||||||
| }; | } PACKED; | ||||||
|  | /** | ||||||
|  |  * \struct directoryVFATEntry | ||||||
|  |  * \brief VFAT long filename directory entry | ||||||
|  |  * | ||||||
|  |  * directoryVFATEntries are found in the same list as normal directoryEntry. | ||||||
|  |  * But have the attribute field set to DIR_ATT_LONG_NAME. | ||||||
|  |  *  | ||||||
|  |  * Long filenames are saved in multiple directoryVFATEntries. | ||||||
|  |  * Each entry containing 13 UTF-16 characters. | ||||||
|  |  */ | ||||||
|  | struct directoryVFATEntry { | ||||||
|  |   /** | ||||||
|  |    * Sequence number. Consists of 2 parts: | ||||||
|  |    *  bit 6:   indicates first long filename block for the next file | ||||||
|  |    *  bit 0-4: the position of this long filename block (first block is 1) | ||||||
|  |    */ | ||||||
|  |   uint8_t  sequenceNumber; | ||||||
|  |   /** First set of UTF-16 characters */ | ||||||
|  |   uint16_t name1[5];//UTF-16 | ||||||
|  |   /** attributes (at the same location as in directoryEntry), always 0x0F */ | ||||||
|  |   uint8_t  attributes; | ||||||
|  |   /** Reserved for use by Windows NT. Always 0. */ | ||||||
|  |   uint8_t  reservedNT; | ||||||
|  |   /** Checksum of the short 8.3 filename, can be used to checked if the file system as modified by a not-long-filename aware implementation. */ | ||||||
|  |   uint8_t  checksum; | ||||||
|  |   /** Second set of UTF-16 characters */ | ||||||
|  |   uint16_t name2[6];//UTF-16 | ||||||
|  |   /** firstClusterLow is always zero for longFilenames */ | ||||||
|  |   uint16_t firstClusterLow; | ||||||
|  |   /** Third set of UTF-16 characters */ | ||||||
|  |   uint16_t name3[2];//UTF-16 | ||||||
|  | } PACKED; | ||||||
| //------------------------------------------------------------------------------ | //------------------------------------------------------------------------------ | ||||||
| // Definitions for directory entries | // Definitions for directory entries | ||||||
| // | // | ||||||
| /** Type name for directoryEntry */ | /** Type name for directoryEntry */ | ||||||
| typedef struct directoryEntry dir_t; | typedef struct directoryEntry dir_t; | ||||||
|  | /** Type name for directoryVFATEntry */ | ||||||
|  | typedef struct directoryVFATEntry vfat_t; | ||||||
| /** escape for name[0] = 0XE5 */ | /** escape for name[0] = 0XE5 */ | ||||||
| uint8_t const DIR_NAME_0XE5 = 0X05; | uint8_t const DIR_NAME_0XE5 = 0X05; | ||||||
| /** name[0] value for entry that is free after being "deleted" */ | /** name[0] value for entry that is free after being "deleted" */ | ||||||
| @@ -607,4 +643,4 @@ static inline uint8_t DIR_IS_FILE_OR_SUBDIR(const dir_t* dir) { | |||||||
| #endif  // SdFatStructs_h | #endif  // SdFatStructs_h | ||||||
|  |  | ||||||
|  |  | ||||||
| #endif | #endif | ||||||
|   | |||||||
| @@ -51,7 +51,7 @@ void  CardReader::lsDive(const char *prepend,SdFile parent) | |||||||
|   dir_t p; |   dir_t p; | ||||||
|  uint8_t cnt=0; |  uint8_t cnt=0; | ||||||
|   |   | ||||||
|   while (parent.readDir(p) > 0) |   while (parent.readDir(p, longFilename) > 0) | ||||||
|   { |   { | ||||||
|     if( DIR_IS_SUBDIR(&p) && lsAction!=LS_Count && lsAction!=LS_GetFilename) // hence LS_SerialPrint |     if( DIR_IS_SUBDIR(&p) && lsAction!=LS_Count && lsAction!=LS_GetFilename) // hence LS_SerialPrint | ||||||
|     { |     { | ||||||
| @@ -429,16 +429,16 @@ void CardReader::checkautostart(bool force) | |||||||
|    |    | ||||||
|   char autoname[30]; |   char autoname[30]; | ||||||
|   sprintf(autoname,"auto%i.g",lastnr); |   sprintf(autoname,"auto%i.g",lastnr); | ||||||
|   for(int8_t i=0;i<(int)strlen(autoname);i++) |   for(int8_t i=0;i<(int8_t)strlen(autoname);i++) | ||||||
|     autoname[i]=tolower(autoname[i]); |     autoname[i]=tolower(autoname[i]); | ||||||
|   dir_t p; |   dir_t p; | ||||||
|  |  | ||||||
|   root.rewind(); |   root.rewind(); | ||||||
|    |    | ||||||
|   bool found=false; |   bool found=false; | ||||||
|   while (root.readDir(p) > 0)  |   while (root.readDir(p, NULL) > 0)  | ||||||
|   { |   { | ||||||
|     for(int8_t i=0;i<(int)strlen((char*)p.name);i++) |     for(int8_t i=0;i<(int8_t)strlen((char*)p.name);i++) | ||||||
|     p.name[i]=tolower(p.name[i]); |     p.name[i]=tolower(p.name[i]); | ||||||
|     //Serial.print((char*)p.name); |     //Serial.print((char*)p.name); | ||||||
|     //Serial.print(" "); |     //Serial.print(" "); | ||||||
|   | |||||||
| @@ -45,7 +45,8 @@ public: | |||||||
|   bool saving; |   bool saving; | ||||||
|   bool sdprinting ;   |   bool sdprinting ;   | ||||||
|   bool cardOK ; |   bool cardOK ; | ||||||
|   char filename[12]; |   char filename[13]; | ||||||
|  |   char longFilename[LONG_FILENAME_LENGTH]; | ||||||
|   bool filenameIsDir; |   bool filenameIsDir; | ||||||
|   int lastnr; //last number of the autostart; |   int lastnr; //last number of the autostart; | ||||||
| private: | private: | ||||||
| @@ -72,4 +73,4 @@ private: | |||||||
| #define IS_SD_PRINTING (false) | #define IS_SD_PRINTING (false) | ||||||
|  |  | ||||||
| #endif //SDSUPPORT | #endif //SDSUPPORT | ||||||
| #endif | #endif | ||||||
|   | |||||||
| @@ -1,13 +1,20 @@ | |||||||
| #ifndef LANGUAGE_H | #ifndef LANGUAGE_H | ||||||
| #define LANGUAGE_H | #define LANGUAGE_H | ||||||
|  |  | ||||||
|  | // NOTE: IF YOU CHANGE THIS FILE / MERGE THIS FILE WITH CHANGES | ||||||
|  | // | ||||||
|  | //   ==> ALWAYS TRY TO COMPILE MARLIN WITH/WITHOUT "ULTIPANEL" / "ULTRALCD" / "SDSUPPORT" #define IN "Configuration.h"  | ||||||
|  | //   ==> ALSO TRY ALL AVAILABLE "LANGUAGE_CHOICE" OPTIONS | ||||||
|  |  | ||||||
| // Languages | // Languages | ||||||
| // 1  Custom (For you to add your own messages) | // 1  English | ||||||
| // 2  English  | // 2  - | ||||||
| // 3  French	(Waiting translation) | // 3  French	(Waiting translation) | ||||||
| // 4  German	(Waiting translation) | // 4  German | ||||||
| // 5  Spanish | // 5  Spanish | ||||||
| // 6  Etc | // 6  Russian | ||||||
|  | // 7  Italian | ||||||
|  | // 8  Etc | ||||||
|  |  | ||||||
| #define LANGUAGE_CHOICE 1  // Pick your language from the list above | #define LANGUAGE_CHOICE 1  // Pick your language from the list above | ||||||
|  |  | ||||||
| @@ -35,8 +42,13 @@ | |||||||
| 	#define MSG_DISABLE_STEPPERS " Disable Steppers" | 	#define MSG_DISABLE_STEPPERS " Disable Steppers" | ||||||
| 	#define MSG_AUTO_HOME " Auto Home" | 	#define MSG_AUTO_HOME " Auto Home" | ||||||
| 	#define MSG_SET_ORIGIN " Set Origin" | 	#define MSG_SET_ORIGIN " Set Origin" | ||||||
|  | 	#define MSG_PREHEAT_PLA " Preheat PLA" | ||||||
|  | 	#define MSG_PREHEAT_PLA_SETTINGS " Preheat PLA Setting" | ||||||
|  | 	#define MSG_PREHEAT_ABS " Preheat ABS" | ||||||
|  | 	#define MSG_PREHEAT_ABS_SETTINGS " Preheat ABS Setting" | ||||||
| 	#define MSG_COOLDOWN " Cooldown" | 	#define MSG_COOLDOWN " Cooldown" | ||||||
| 	#define MSG_EXTRUDE " Extrude" | 	#define MSG_EXTRUDE " Extrude" | ||||||
|  | 	#define MSG_RETRACT " Retract" | ||||||
| 	#define MSG_PREHEAT_PLA " Preheat PLA" | 	#define MSG_PREHEAT_PLA " Preheat PLA" | ||||||
| 	#define MSG_PREHEAT_ABS " Preheat ABS" | 	#define MSG_PREHEAT_ABS " Preheat ABS" | ||||||
| 	#define MSG_MOVE_AXIS " Move Axis      \x7E" | 	#define MSG_MOVE_AXIS " Move Axis      \x7E" | ||||||
| @@ -76,6 +88,7 @@ | |||||||
| 	#define MSG_MAIN_WIDE " Main        \003" | 	#define MSG_MAIN_WIDE " Main        \003" | ||||||
| 	#define MSG_RECTRACT_WIDE " Rectract    \x7E" | 	#define MSG_RECTRACT_WIDE " Rectract    \x7E" | ||||||
| 	#define MSG_TEMPERATURE_WIDE " Temperature \x7E" | 	#define MSG_TEMPERATURE_WIDE " Temperature \x7E" | ||||||
|  | 	#define MSG_TEMPERATURE_RTN " Temperature  \003" | ||||||
| 	#define MSG_MOTION_WIDE " Motion      \x7E" | 	#define MSG_MOTION_WIDE " Motion      \x7E" | ||||||
| 	#define MSG_STORE_EPROM " Store memory" | 	#define MSG_STORE_EPROM " Store memory" | ||||||
| 	#define MSG_LOAD_EPROM " Load memory" | 	#define MSG_LOAD_EPROM " Load memory" | ||||||
| @@ -85,27 +98,27 @@ | |||||||
| 	#define MSG_PREPARE " Prepare \x7E" | 	#define MSG_PREPARE " Prepare \x7E" | ||||||
| 	#define MSG_PREPARE_ALT " Prepare \003" | 	#define MSG_PREPARE_ALT " Prepare \003" | ||||||
| 	#define MSG_CONTROL_ARROW " Control \x7E" | 	#define MSG_CONTROL_ARROW " Control \x7E" | ||||||
| 	#define MSG_RETRACT_ARROW " Control \x7E" | 	#define MSG_RETRACT_ARROW " Retract \x7E" | ||||||
| 	#define MSG_TUNE " Tune    \x7E" | 	#define MSG_TUNE " Tune    \x7E" | ||||||
|  | 	#define MSG_PAUSE_PRINT " Pause Print \x7E" | ||||||
|  | 	#define MSG_RESUME_PRINT " Resume Print \x7E" | ||||||
| 	#define MSG_STOP_PRINT " Stop Print   \x7E" | 	#define MSG_STOP_PRINT " Stop Print   \x7E" | ||||||
| 	#define MSG_CARD_MENU " Card Menu    \x7E" | 	#define MSG_CARD_MENU " Card Menu    \x7E" | ||||||
| 	#define MSG_NO_CARD " No Card" | 	#define MSG_NO_CARD " No Card" | ||||||
| 	#define MSG_SERIAL_ERROR_MENU_STRUCTURE "Something is wrong in the MenuStructure." |  | ||||||
| 	#define MSG_DWELL "Sleep..." | 	#define MSG_DWELL "Sleep..." | ||||||
| 	#define MSG_USERWAIT "Wait for user..." | 	#define MSG_USERWAIT "Wait for user..." | ||||||
| 	#define MSG_NO_MOVE "No move." | 	#define MSG_NO_MOVE "No move." | ||||||
| 	#define MSG_PART_RELEASE "Partial Release" | 	#define MSG_PART_RELEASE "Partial Release" | ||||||
| 	#define MSG_KILLED "KILLED. " | 	#define MSG_KILLED "KILLED. " | ||||||
| 	#define MSG_STOPPED "STOPPED. " | 	#define MSG_STOPPED "STOPPED. " | ||||||
| 	#define MSG_PREHEAT_PLA " Preheat PLA" |  | ||||||
| 	#define MSG_PREHEAT_ABS " Preheat ABS" |  | ||||||
| 	#define MSG_STEPPER_RELEASED "Released." | 	#define MSG_STEPPER_RELEASED "Released." | ||||||
|   #define MSG_CONTROL_RETRACT  " Retract mm:" | 	#define MSG_CONTROL_RETRACT  " Retract mm:" | ||||||
|   #define MSG_CONTROL_RETRACTF " Retract  F:" | 	#define MSG_CONTROL_RETRACTF " Retract  F:" | ||||||
|   #define MSG_CONTROL_RETRACT_ZLIFT " Hop mm:" | 	#define MSG_CONTROL_RETRACT_ZLIFT " Hop mm:" | ||||||
|   #define MSG_CONTROL_RETRACT_RECOVER " UnRet +mm:" | 	#define MSG_CONTROL_RETRACT_RECOVER " UnRet +mm:" | ||||||
|   #define MSG_CONTROL_RETRACT_RECOVERF " UnRet  F:" | 	#define MSG_CONTROL_RETRACT_RECOVERF " UnRet  F:" | ||||||
|   #define MSG_AUTORETRACT " AutoRetr.:" | 	#define MSG_AUTORETRACT " AutoRetr.:" | ||||||
|  |         #define MSG_SERIAL_ERROR_MENU_STRUCTURE "Something is wrong in the MenuStructure." | ||||||
|  |  | ||||||
| // Serial Console Messages | // Serial Console Messages | ||||||
|  |  | ||||||
| @@ -140,17 +153,20 @@ | |||||||
| 	#define MSG_M115_REPORT "FIRMWARE_NAME:Marlin V1; Sprinter/grbl mashup for gen6 FIRMWARE_URL:" FIRMWARE_URL " PROTOCOL_VERSION:" PROTOCOL_VERSION " MACHINE_TYPE:" MACHINE_NAME " EXTRUDER_COUNT:" STRINGIFY(EXTRUDERS) "\n" | 	#define MSG_M115_REPORT "FIRMWARE_NAME:Marlin V1; Sprinter/grbl mashup for gen6 FIRMWARE_URL:" FIRMWARE_URL " PROTOCOL_VERSION:" PROTOCOL_VERSION " MACHINE_TYPE:" MACHINE_NAME " EXTRUDER_COUNT:" STRINGIFY(EXTRUDERS) "\n" | ||||||
| 	#define MSG_COUNT_X " Count X:" | 	#define MSG_COUNT_X " Count X:" | ||||||
| 	#define MSG_ERR_KILLED "Printer halted. kill() called !!" | 	#define MSG_ERR_KILLED "Printer halted. kill() called !!" | ||||||
| 	#define MSG_ERR_STOPPED "Printer stopped deu to errors. Fix the error and use M999 to restart!. (Temperature is reset. Set it before restarting)" | 	#define MSG_ERR_STOPPED "Printer stopped due to errors. Fix the error and use M999 to restart!. (Temperature is reset. Set it before restarting)" | ||||||
| 	#define MSG_RESEND "Resend:" | 	#define MSG_RESEND "Resend:" | ||||||
| 	#define MSG_UNKNOWN_COMMAND "Unknown command:\"" | 	#define MSG_UNKNOWN_COMMAND "Unknown command:\"" | ||||||
| 	#define MSG_ACTIVE_EXTRUDER "Active Extruder: " | 	#define MSG_ACTIVE_EXTRUDER "Active Extruder: " | ||||||
| 	#define MSG_INVALID_EXTRUDER "Invalid extruder" | 	#define MSG_INVALID_EXTRUDER "Invalid extruder" | ||||||
| 	#define MSG_X_MIN "x_min:" | 	#define MSG_X_MIN "x_min: " | ||||||
| 	#define MSG_X_MAX "x_max:" | 	#define MSG_X_MAX "x_max: " | ||||||
| 	#define MSG_Y_MIN "y_min:" | 	#define MSG_Y_MIN "y_min: " | ||||||
| 	#define MSG_Y_MAX "y_max:" | 	#define MSG_Y_MAX "y_max: " | ||||||
| 	#define MSG_Z_MIN "z_min:" | 	#define MSG_Z_MIN "z_min: " | ||||||
| 	#define MSG_Z_MAX "z_max:" | 	#define MSG_Z_MAX "z_max: " | ||||||
|  | 	#define MSG_M119_REPORT "Reporting endstop status" | ||||||
|  | 	#define MSG_ENDSTOP_HIT "TRIGGERED" | ||||||
|  | 	#define MSG_ENDSTOP_OPEN "open" | ||||||
|  |  | ||||||
| 	#define MSG_SD_CANT_OPEN_SUBDIR "Cannot open subdir" | 	#define MSG_SD_CANT_OPEN_SUBDIR "Cannot open subdir" | ||||||
| 	#define MSG_SD_INIT_FAIL "SD init fail" | 	#define MSG_SD_INIT_FAIL "SD init fail" | ||||||
| @@ -178,84 +194,90 @@ | |||||||
|  |  | ||||||
| // LCD Menu Messages | // LCD Menu Messages | ||||||
|  |  | ||||||
| 	#define WELCOME_MSG MACHINE_NAME " Ready." | 	#define WELCOME_MSG MACHINE_NAME " Bereit." | ||||||
|  |  | ||||||
| 	#define MSG_SD_INSERTED "Card inserted" | 	#define MSG_SD_INSERTED      "SDKarte erkannt" | ||||||
| 	#define MSG_SD_REMOVED "Card removed" | 	#define MSG_SD_REMOVED       "SDKarte entfernt" | ||||||
| 	#define MSG_MAIN " Main \003" | 	#define MSG_MAIN             " Hauptmneü \003" | ||||||
| 	#define MSG_AUTOSTART " Autostart" | 	#define MSG_AUTOSTART        " Autostart" | ||||||
| 	#define MSG_DISABLE_STEPPERS " Stepper abschalten" | 	#define MSG_DISABLE_STEPPERS " Stepper abschalten" | ||||||
| 	#define MSG_AUTO_HOME " Auto Heim" | 	#define MSG_AUTO_HOME        " Auto Nullpunkt" | ||||||
| 	#define MSG_SET_ORIGIN " Position setzen" | 	#define MSG_SET_ORIGIN       " Setze Nullpunkt" | ||||||
| 	#define MSG_PREHEAT_PLA " Aufheizen PLA" | 	#define MSG_PREHEAT_PLA      " Vorwärmen PLA" | ||||||
| 	#define MSG_PREHEAT_ABS " Aufheizen ABS" | 	#define MSG_PREHEAT_PLA_SETTINGS " Vorwärmen PLA Einstellungen" | ||||||
| 	#define MSG_COOLDOWN " Abkuehlen" | 	#define MSG_PREHEAT_ABS      " Vorwärmen ABS" | ||||||
| 	#define MSG_EXTRUDE " Extrude" | 	#define MSG_PREHEAT_ABS_SETTINGS "  Vorwärmen ABS Einstellungen" | ||||||
| 	#define MSG_PREHEAT_PLA " Preheat PLA" | 	#define MSG_COOLDOWN         " Abkühlen" | ||||||
| 	#define MSG_PREHEAT_ABS " Preheat ABS" | 	#define MSG_EXTRUDE          " Extrude" | ||||||
| 	#define MSG_MOVE_AXIS " Move Axis      \x7E" | 	#define MSG_RETRACT          " Retract" | ||||||
| 	#define MSG_MOVE_AXIS " Achsen verfahren   \x7E" | 	#define MSG_MOVE_AXIS        " Achsen bewegen\x7E" | ||||||
| 	#define MSG_SPEED " Geschw:" | 	#define MSG_SPEED            " Geschw:" | ||||||
| 	#define MSG_NOZZLE " \002Duese:" | 	#define MSG_NOZZLE           " \002Düse:" | ||||||
| 	#define MSG_NOZZLE1 " \002Duese2:" | 	#define MSG_NOZZLE1          " \002Düse2:" | ||||||
| 	#define MSG_NOZZLE2 " \002Duese3:" | 	#define MSG_NOZZLE2          " \002Düse3:" | ||||||
| 	#define MSG_BED " \002Bett:" | 	#define MSG_BED              " \002Bett:" | ||||||
| 	#define MSG_FAN_SPEED " Luefter geschw.:" | 	#define MSG_FAN_SPEED        " Lüftergeschw.:" | ||||||
| 	#define MSG_FLOW " Fluss:" | 	#define MSG_FLOW             " Fluß:" | ||||||
| 	#define MSG_CONTROL " Kontrolle \003" | 	#define MSG_CONTROL          " Einstellungen \003" | ||||||
| 	#define MSG_MIN " \002 Min:" | 	#define MSG_MIN              " \002 Min:" | ||||||
| 	#define MSG_MAX " \002 Max:" | 	#define MSG_MAX              " \002 Max:" | ||||||
| 	#define MSG_FACTOR " \002 Faktor:" | 	#define MSG_FACTOR           " \002 Faktor:" | ||||||
| 	#define MSG_AUTOTEMP " AutoTemp:" | 	#define MSG_AUTOTEMP         " AutoTemp:" | ||||||
| 	#define MSG_ON "Ein " | 	#define MSG_ON               "Ein " | ||||||
| 	#define MSG_OFF "Aus " | 	#define MSG_OFF              "Aus " | ||||||
| 	#define MSG_PID_P " PID-P: " | 	#define MSG_PID_P            " PID-P: " | ||||||
| 	#define MSG_PID_I " PID-I: " | 	#define MSG_PID_I            " PID-I: " | ||||||
| 	#define MSG_PID_D " PID-D: " | 	#define MSG_PID_D            " PID-D: " | ||||||
| 	#define MSG_PID_C " PID-C: " | 	#define MSG_PID_C            " PID-C: " | ||||||
| 	#define MSG_ACC  " Acc:" | 	#define MSG_ACC              " Acc:" | ||||||
| 	#define MSG_VXY_JERK " Vxy-jerk: " | 	#define MSG_VXY_JERK         " Vxy-jerk: " | ||||||
| 	#define MSG_VMAX " Vmax " | 	#define MSG_VMAX             " Vmax " | ||||||
| 	#define MSG_X "x:" | 	#define MSG_X                "x:" | ||||||
| 	#define MSG_Y "y:" | 	#define MSG_Y                "y:" | ||||||
| 	#define MSG_Z "z:" | 	#define MSG_Z                "z:" | ||||||
| 	#define MSG_E "e:" | 	#define MSG_E                "e:" | ||||||
| 	#define MSG_VMIN " Vmin:" | 	#define MSG_VMIN             " Vmin:" | ||||||
| 	#define MSG_VTRAV_MIN " VTrav min:" | 	#define MSG_VTRAV_MIN        " VTrav min:" | ||||||
| 	#define MSG_AMAX " Amax " | 	#define MSG_AMAX             " Amax " | ||||||
| 	#define MSG_A_RETRACT " A-retract:" | 	#define MSG_A_RETRACT        " A-Retract:" | ||||||
| 	#define MSG_XSTEPS " Xsteps/mm:" | 	#define MSG_XSTEPS           " Xsteps/mm:" | ||||||
| 	#define MSG_YSTEPS " Ysteps/mm:" | 	#define MSG_YSTEPS           " Ysteps/mm:" | ||||||
| 	#define MSG_ZSTEPS " Zsteps/mm:" | 	#define MSG_ZSTEPS           " Zsteps/mm:" | ||||||
| 	#define MSG_ESTEPS " Esteps/mm:" | 	#define MSG_ESTEPS           " Esteps/mm:" | ||||||
| 	#define MSG_MAIN_WIDE " Main        \003" | 	#define MSG_MAIN_WIDE        " Hauptmenü     \003" | ||||||
| 	#define MSG_TEMPERATURE_WIDE " Temperatur \x7E" | 	#define MSG_RECTRACT_WIDE    " Rectract      \x7E" | ||||||
| 	#define MSG_MOTION_WIDE " Motion      \x7E" | 	#define MSG_WATCH            " Beobachten    \003" | ||||||
| 	#define MSG_STORE_EPROM " EPROM speichern" | 	#define MSG_TEMPERATURE_WIDE " Temperatur    \x7E" | ||||||
| 	#define MSG_LOAD_EPROM "  EPROM laden" |         #define MSG_TEMPERATURE_RTN  " Temperatur    \003" | ||||||
| 	#define MSG_RESTORE_FAILSAFE " Standard Konfig." | 	#define MSG_MOTION_WIDE      " Bewegung      \x7E" | ||||||
| 	#define MSG_REFRESH "\004Refresh" | 	#define MSG_STORE_EPROM      " EPROM speichern" | ||||||
| 	#define MSG_WATCH " Beobachten   \003" | 	#define MSG_LOAD_EPROM       " EPROM laden" | ||||||
| 	#define MSG_PREPARE " Prepare \x7E" | 	#define MSG_RESTORE_FAILSAFE " Standardkonfig." | ||||||
| 	#define MSG_PREPARE_ALT " Prepare \003" | 	#define MSG_REFRESH          "\004Aktualisieren" | ||||||
| 	#define MSG_CONTROL_ARROW " Control \x7E" | 	#define MSG_PREPARE          " Vorbereitung  \x7E" | ||||||
|  | 	#define MSG_PREPARE_ALT      " Vorbereitung  \003" | ||||||
|  | 	#define MSG_CONTROL_ARROW    " Einstellungen \x7E" | ||||||
|  | 	#define MSG_TUNE             " Justierung    \x7E" | ||||||
|  | 	#define MSG_PAUSE_PRINT      " Druck anhalten\x7E" | ||||||
|  | 	#define MSG_RESUME_PRINT     " Druck fortsetz\x7E" | ||||||
|  | 	#define MSG_STOP_PRINT       " Druck stoppen \x7E" | ||||||
|  | 	#define MSG_CARD_MENU        " SDKarten Menü \x7E" | ||||||
|  | 	#define MSG_NO_CARD          " Keine SDKarte" | ||||||
|  | 	#define MSG_DWELL            "Warten..."		 | ||||||
|  | 	#define MSG_USERWAIT         "Warte auf Nutzer..." | ||||||
|  | 	#define MSG_NO_MOVE          "Kein Zug." | ||||||
|  | 	#define MSG_PART_RELEASE     "Stepper tlw frei" | ||||||
|  | 	#define MSG_KILLED           "KILLED" | ||||||
|  | 	#define MSG_STOPPED          "GESTOPPT" | ||||||
|  | 	#define MSG_STEPPER_RELEASED "Stepper frei" | ||||||
|  |         #define MSG_CONTROL_RETRACT  " Retract mm:" | ||||||
|  |         #define MSG_CONTROL_RETRACTF " Retract  F:" | ||||||
|  |         #define MSG_CONTROL_RETRACT_ZLIFT " Hop mm:" | ||||||
|  |         #define MSG_CONTROL_RETRACT_RECOVER " UnRet +mm:" | ||||||
|  |         #define MSG_CONTROL_RETRACT_RECOVERF " UnRet  F:" | ||||||
|  |         #define MSG_AUTORETRACT      " AutoRetr.:" | ||||||
|  | 	#define MSG_SERIAL_ERROR_MENU_STRUCTURE "Fehler in Menüstruktur." | ||||||
| 	 | 	 | ||||||
| 	#define MSG_TUNE " Tune    \x7E" |  | ||||||
| 	#define MSG_STOP_PRINT " Druck stoppen   \x7E" |  | ||||||
| 	#define MSG_CARD_MENU " SDKarten Menue    \x7E" |  | ||||||
| 	#define MSG_NO_CARD " Keine SDKarte" |  | ||||||
| 	#define MSG_SERIAL_ERROR_MENU_STRUCTURE "Fehler in der  Menuestruktur." |  | ||||||
| 	#define MSG_DWELL "DWELL..."		 |  | ||||||
| 	#define MSG_NO_MOVE "No move." |  | ||||||
| 	#define MSG_PART_RELEASE "Partial Release" |  | ||||||
| 	#define MSG_KILLED "KILLED. " |  | ||||||
| 	#define MSG_STOPPED "STOPPED. " |  | ||||||
| 	#define MSG_PREHEAT_PLA " Preheat PLA" |  | ||||||
| 	#define MSG_PREHEAT_ABS " Preheat ABS" |  | ||||||
| 	#define MSG_STEPPER_RELEASED "Released." |  | ||||||
| 	 |  | ||||||
|  |  | ||||||
|  |  | ||||||
| // Serial Console Messages | // Serial Console Messages | ||||||
|  |  | ||||||
| 	#define MSG_Enqueing "enqueing \"" | 	#define MSG_Enqueing "enqueing \"" | ||||||
| @@ -294,12 +316,15 @@ | |||||||
| 	#define MSG_UNKNOWN_COMMAND "Unknown command:\"" | 	#define MSG_UNKNOWN_COMMAND "Unknown command:\"" | ||||||
| 	#define MSG_ACTIVE_EXTRUDER "Active Extruder: " | 	#define MSG_ACTIVE_EXTRUDER "Active Extruder: " | ||||||
| 	#define MSG_INVALID_EXTRUDER "Invalid extruder" | 	#define MSG_INVALID_EXTRUDER "Invalid extruder" | ||||||
| 	#define MSG_X_MIN "x_min:" | 	#define MSG_X_MIN "x_min: " | ||||||
| 	#define MSG_X_MAX "x_max:" | 	#define MSG_X_MAX "x_max: " | ||||||
| 	#define MSG_Y_MIN "y_min:" | 	#define MSG_Y_MIN "y_min: " | ||||||
| 	#define MSG_Y_MAX "y_max:" | 	#define MSG_Y_MAX "y_max: " | ||||||
| 	#define MSG_Z_MIN "z_min:" | 	#define MSG_Z_MIN "z_min: " | ||||||
| 	#define MSG_Z_MAX "z_max:" | 	#define MSG_Z_MAX "z_max: " | ||||||
|  | 	#define MSG_M119_REPORT "Reporting endstop status" | ||||||
|  | 	#define MSG_ENDSTOP_HIT "TRIGGERED" | ||||||
|  | 	#define MSG_ENDSTOP_OPEN "open" | ||||||
|  |  | ||||||
| 	#define MSG_SD_CANT_OPEN_SUBDIR "Cannot open subdir" | 	#define MSG_SD_CANT_OPEN_SUBDIR "Cannot open subdir" | ||||||
| 	#define MSG_SD_INIT_FAIL "SD init fail" | 	#define MSG_SD_INIT_FAIL "SD init fail" | ||||||
| @@ -337,14 +362,17 @@ | |||||||
| #define MSG_SET_ORIGIN " Establecer Cero" | #define MSG_SET_ORIGIN " Establecer Cero" | ||||||
| #define MSG_COOLDOWN " Enfriar" | #define MSG_COOLDOWN " Enfriar" | ||||||
| #define MSG_EXTRUDE " Extruir" | #define MSG_EXTRUDE " Extruir" | ||||||
|  | #define MSG_RETRACT " Retraer" | ||||||
| #define MSG_PREHEAT_PLA " Precalentar PLA" | #define MSG_PREHEAT_PLA " Precalentar PLA" | ||||||
|  | #define MSG_PREHEAT_PLA_SETTINGS " Ajustar temp. PLA" | ||||||
| #define MSG_PREHEAT_ABS " Precalentar ABS" | #define MSG_PREHEAT_ABS " Precalentar ABS" | ||||||
|  | #define MSG_PREHEAT_ABS_SETTINGS " Ajustar temp. ABS" | ||||||
| #define MSG_MOVE_AXIS " Mover Ejes      \x7E" | #define MSG_MOVE_AXIS " Mover Ejes      \x7E" | ||||||
| #define MSG_SPEED " Velocidad:" | #define MSG_SPEED " Velocidad:" | ||||||
| #define MSG_NOZZLE " \002Nozzle:" | #define MSG_NOZZLE " \002Nozzle:" | ||||||
| #define MSG_NOZZLE1 " \002Nozzle2:" | #define MSG_NOZZLE1 " \002Nozzle2:" | ||||||
| #define MSG_NOZZLE2 " \002Nozzle3:" | #define MSG_NOZZLE2 " \002Nozzle3:" | ||||||
| #define MSG_BED " \002Bed:" | #define MSG_BED " \002Base:" | ||||||
| #define MSG_FAN_SPEED " Ventilador:" | #define MSG_FAN_SPEED " Ventilador:" | ||||||
| #define MSG_FLOW " Flujo:" | #define MSG_FLOW " Flujo:" | ||||||
| #define MSG_CONTROL " Control \003" | #define MSG_CONTROL " Control \003" | ||||||
| @@ -376,6 +404,7 @@ | |||||||
| #define MSG_MAIN_WIDE " Menu Principal  \003" | #define MSG_MAIN_WIDE " Menu Principal  \003" | ||||||
| #define MSG_RECTRACT_WIDE " Retraer         \x7E" | #define MSG_RECTRACT_WIDE " Retraer         \x7E" | ||||||
| #define MSG_TEMPERATURE_WIDE " Temperatura     \x7E" | #define MSG_TEMPERATURE_WIDE " Temperatura     \x7E" | ||||||
|  | #define MSG_TEMPERATURE_RTN  " Temperatura     \003" | ||||||
| #define MSG_MOTION_WIDE " Movimiento      \x7E" | #define MSG_MOTION_WIDE " Movimiento      \x7E" | ||||||
| #define MSG_STORE_EPROM " Guardar Memoria" | #define MSG_STORE_EPROM " Guardar Memoria" | ||||||
| #define MSG_LOAD_EPROM " Cargar Memoria" | #define MSG_LOAD_EPROM " Cargar Memoria" | ||||||
| @@ -385,20 +414,19 @@ | |||||||
| #define MSG_PREPARE " Preparar \x7E" | #define MSG_PREPARE " Preparar \x7E" | ||||||
| #define MSG_PREPARE_ALT " Preparar \003" | #define MSG_PREPARE_ALT " Preparar \003" | ||||||
| #define MSG_CONTROL_ARROW " Control  \x7E" | #define MSG_CONTROL_ARROW " Control  \x7E" | ||||||
| #define MSG_RETRACT_ARROW " Control  \x7E" | #define MSG_RETRACT_ARROW " Retraer  \x7E" | ||||||
| #define MSG_TUNE " Ajustar \x7E" | #define MSG_TUNE " Ajustar \x7E" | ||||||
|  | #define MSG_PAUSE_PRINT " Pausar Impresion \x7E" | ||||||
|  | #define MSG_RESUME_PRINT " Reanudar Impresion \x7E" | ||||||
| #define MSG_STOP_PRINT " Detener Impresion \x7E" | #define MSG_STOP_PRINT " Detener Impresion \x7E" | ||||||
| #define MSG_CARD_MENU " Menu de SD    \x7E" | #define MSG_CARD_MENU " Menu de SD    \x7E" | ||||||
| #define MSG_NO_CARD " No hay Tarjeta SD" | #define MSG_NO_CARD " No hay Tarjeta SD" | ||||||
| #define MSG_SERIAL_ERROR_MENU_STRUCTURE "Hay un error en la estructura del menu" |  | ||||||
| #define MSG_DWELL "Reposo..." | #define MSG_DWELL "Reposo..." | ||||||
| #define MSG_USERWAIT "Esperando Ordenes..." | #define MSG_USERWAIT "Esperando Ordenes..." | ||||||
| #define MSG_NO_MOVE "Sin movimiento" | #define MSG_NO_MOVE "Sin movimiento" | ||||||
| #define MSG_PART_RELEASE "Desacople Parcial" | #define MSG_PART_RELEASE "Desacople Parcial" | ||||||
| #define MSG_KILLED "PARADA DE EMERGENCIA. " | #define MSG_KILLED "PARADA DE EMERGENCIA. " | ||||||
| #define MSG_STOPPED "PARADA. " | #define MSG_STOPPED "PARADA. " | ||||||
| #define MSG_PREHEAT_PLA " Precalentar PLA" |  | ||||||
| #define MSG_PREHEAT_ABS " Precalentar ABS" |  | ||||||
| #define MSG_STEPPER_RELEASED "Desacoplada." | #define MSG_STEPPER_RELEASED "Desacoplada." | ||||||
| #define MSG_CONTROL_RETRACT  " Retraer mm:" | #define MSG_CONTROL_RETRACT  " Retraer mm:" | ||||||
| #define MSG_CONTROL_RETRACTF " Retraer  F:" | #define MSG_CONTROL_RETRACTF " Retraer  F:" | ||||||
| @@ -406,6 +434,7 @@ | |||||||
| #define MSG_CONTROL_RETRACT_RECOVER " DesRet +mm:" | #define MSG_CONTROL_RETRACT_RECOVER " DesRet +mm:" | ||||||
| #define MSG_CONTROL_RETRACT_RECOVERF " DesRet F:" | #define MSG_CONTROL_RETRACT_RECOVERF " DesRet F:" | ||||||
| #define MSG_AUTORETRACT " AutoRetr.:" | #define MSG_AUTORETRACT " AutoRetr.:" | ||||||
|  | #define MSG_SERIAL_ERROR_MENU_STRUCTURE "Hay un error en la estructura del menu" | ||||||
|  |  | ||||||
| // Serial Console Messages | // Serial Console Messages | ||||||
|  |  | ||||||
| @@ -426,15 +455,15 @@ | |||||||
| #define MSG_ERR_CHECKSUM_MISMATCH "el checksum no coincide, Ultima Linea:" | #define MSG_ERR_CHECKSUM_MISMATCH "el checksum no coincide, Ultima Linea:" | ||||||
| #define MSG_ERR_NO_CHECKSUM "No se pudo hallar el Checksum con el numero de linea, Ultima Linea:" | #define MSG_ERR_NO_CHECKSUM "No se pudo hallar el Checksum con el numero de linea, Ultima Linea:" | ||||||
| #define MSG_ERR_NO_LINENUMBER_WITH_CHECKSUM "No se hallo el Numero de Linea con el Checksum, Ultima Linea:" | #define MSG_ERR_NO_LINENUMBER_WITH_CHECKSUM "No se hallo el Numero de Linea con el Checksum, Ultima Linea:" | ||||||
| #define MSG_FILE_PRINTED "Impresion terminado" | #define MSG_FILE_PRINTED "Impresion terminada" | ||||||
| #define MSG_BEGIN_FILE_LIST "Comienzo de la lista de archivos" | #define MSG_BEGIN_FILE_LIST "Comienzo de la lista de archivos" | ||||||
| #define MSG_END_FILE_LIST "Fin de la lista de archivos" | #define MSG_END_FILE_LIST "Fin de la lista de archivos" | ||||||
| #define MSG_M104_INVALID_EXTRUDER "M104 Extrusor Invalido " | #define MSG_M104_INVALID_EXTRUDER "M104 Extrusor Invalido " | ||||||
| #define MSG_M105_INVALID_EXTRUDER "M105 Extrusor Invalido " | #define MSG_M105_INVALID_EXTRUDER "M105 Extrusor Invalido " | ||||||
| #define MSG_ERR_NO_THERMISTORS "No hay termistores - no temp" | #define MSG_ERR_NO_THERMISTORS "No hay termistores - no temp" | ||||||
| #define MSG_M109_INVALID_EXTRUDER "M109 Extrusor Invalido " | #define MSG_M109_INVALID_EXTRUDER "M109 Extrusor Invalido " | ||||||
| #define MSG_HEATING "Calientando..." | #define MSG_HEATING "Calentando..." | ||||||
| #define MSG_HEATING_COMPLETE "Calentamiento terminado." | #define MSG_HEATING_COMPLETE "Calentamiento Hecho." | ||||||
| #define MSG_BED_HEATING "Calentando la base." | #define MSG_BED_HEATING "Calentando la base." | ||||||
| #define MSG_BED_DONE "Base Caliente." | #define MSG_BED_DONE "Base Caliente." | ||||||
| #define MSG_M115_REPORT "FIRMWARE_NAME:Marlin V1; Sprinter/grbl mashup for gen6 FIRMWARE_URL:" FIRMWARE_URL " PROTOCOL_VERSION:" PROTOCOL_VERSION " MACHINE_TYPE:" MACHINE_NAME " EXTRUDER_COUNT:" STRINGIFY(EXTRUDERS) "\n" | #define MSG_M115_REPORT "FIRMWARE_NAME:Marlin V1; Sprinter/grbl mashup for gen6 FIRMWARE_URL:" FIRMWARE_URL " PROTOCOL_VERSION:" PROTOCOL_VERSION " MACHINE_TYPE:" MACHINE_NAME " EXTRUDER_COUNT:" STRINGIFY(EXTRUDERS) "\n" | ||||||
| @@ -445,13 +474,15 @@ | |||||||
| #define MSG_UNKNOWN_COMMAND "Comando Desconocido:\"" | #define MSG_UNKNOWN_COMMAND "Comando Desconocido:\"" | ||||||
| #define MSG_ACTIVE_EXTRUDER "Extrusor Activo: " | #define MSG_ACTIVE_EXTRUDER "Extrusor Activo: " | ||||||
| #define MSG_INVALID_EXTRUDER "Extrusor Invalido" | #define MSG_INVALID_EXTRUDER "Extrusor Invalido" | ||||||
| #define MSG_X_MIN "x_min:" | #define MSG_X_MIN "x_min: " | ||||||
| #define MSG_X_MAX "x_max:" | #define MSG_X_MAX "x_max: " | ||||||
| #define MSG_Y_MIN "y_min:" | #define MSG_Y_MIN "y_min: " | ||||||
| #define MSG_Y_MAX "y_max:" | #define MSG_Y_MAX "y_max: " | ||||||
| #define MSG_Z_MIN "z_min:" | #define MSG_Z_MIN "z_min: " | ||||||
| #define MSG_Z_MAX "z_max:" | #define MSG_M119_REPORT "Comprobando fines de carrera." | ||||||
|  | #define MSG_ENDSTOP_HIT "PULSADO" | ||||||
|  | #define MSG_ENDSTOP_OPEN "abierto" | ||||||
|  |          | ||||||
| #define MSG_SD_CANT_OPEN_SUBDIR "No se pudo abrir la subcarpeta." | #define MSG_SD_CANT_OPEN_SUBDIR "No se pudo abrir la subcarpeta." | ||||||
| #define MSG_SD_INIT_FAIL "Fallo al iniciar la SD" | #define MSG_SD_INIT_FAIL "Fallo al iniciar la SD" | ||||||
| #define MSG_SD_VOL_INIT_FAIL "Fallo al montar el volumen" | #define MSG_SD_VOL_INIT_FAIL "Fallo al montar el volumen" | ||||||
| @@ -466,7 +497,7 @@ | |||||||
| #define MSG_SD_PRINTING_BYTE "SD imprimiendo el byte " | #define MSG_SD_PRINTING_BYTE "SD imprimiendo el byte " | ||||||
| #define MSG_SD_NOT_PRINTING "No se esta imprimiendo con SD" | #define MSG_SD_NOT_PRINTING "No se esta imprimiendo con SD" | ||||||
| #define MSG_SD_ERR_WRITE_TO_FILE "Error al escribir en el archivo" | #define MSG_SD_ERR_WRITE_TO_FILE "Error al escribir en el archivo" | ||||||
| #define MSG_SD_CANT_ENTER_SUBDIR "No se puede entrar en la carpeta:" | #define MSG_SD_CANT_ENTER_SUBDIR "No se puede abrir la carpeta:" | ||||||
|  |  | ||||||
| #define MSG_STEPPER_TO_HIGH "Steprate demasiado alto : " | #define MSG_STEPPER_TO_HIGH "Steprate demasiado alto : " | ||||||
| #define MSG_ENDSTOPS_HIT "Se ha tocado el fin de carril: " | #define MSG_ENDSTOPS_HIT "Se ha tocado el fin de carril: " | ||||||
| @@ -474,4 +505,321 @@ | |||||||
| #define MSG_ERR_LONG_EXTRUDE_STOP " extrusion demasiado larga evitada" | #define MSG_ERR_LONG_EXTRUDE_STOP " extrusion demasiado larga evitada" | ||||||
|  |  | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  | #if LANGUAGE_CHOICE == 6 | ||||||
|  |  | ||||||
|  | // LCD Menu Messages | ||||||
|  | #define WELCOME_MSG MACHINE_NAME			" Готов." | ||||||
|  | #define MSG_SD_INSERTED						"Карта вставлена" | ||||||
|  | #define MSG_SD_REMOVED						"Карта извлечена" | ||||||
|  | #define MSG_MAIN							" Меню              \003" | ||||||
|  | #define MSG_AUTOSTART						" Автостарт          " | ||||||
|  | #define MSG_DISABLE_STEPPERS				" Выключить двигатели" | ||||||
|  | #define MSG_AUTO_HOME						" Парковка           " | ||||||
|  | #define MSG_SET_ORIGIN						" Запомнить ноль     " | ||||||
|  | #define MSG_PREHEAT_PLA						" Преднагрев PLA     " | ||||||
|  | #define MSG_PREHEAT_PLA_SETTINGS			" Настр. преднагр.PLA" | ||||||
|  | #define MSG_PREHEAT_ABS						" Преднагрев ABS     " | ||||||
|  | #define MSG_PREHEAT_ABS_SETTINGS			" Настр. преднагр.ABS" | ||||||
|  | #define MSG_COOLDOWN						" Охлаждение         " | ||||||
|  | #define MSG_EXTRUDE							" Экструзия          " | ||||||
|  | #define MSG_RETRACT							" Откат" | ||||||
|  | #define MSG_MOVE_AXIS						" Движение по осям  \x7E" | ||||||
|  | #define MSG_SPEED							" Скорость:" | ||||||
|  | #define MSG_NOZZLE							" \002 Фильера:" | ||||||
|  | #define MSG_NOZZLE1							" \002 Фильера2:" | ||||||
|  | #define MSG_NOZZLE2							" \002 Фильера3:" | ||||||
|  | #define MSG_BED								" \002 Кровать:" | ||||||
|  | #define MSG_FAN_SPEED						" Куллер:" | ||||||
|  | #define MSG_FLOW							" Поток:" | ||||||
|  | #define MSG_CONTROL							" Настройки \003" | ||||||
|  | #define MSG_MIN								" \002 Минимум:" | ||||||
|  | #define MSG_MAX								" \002 Максимум:" | ||||||
|  | #define MSG_FACTOR							" \002 Фактор:" | ||||||
|  | #define MSG_AUTOTEMP						" Autotemp:" | ||||||
|  | #define MSG_ON								"Вкл. " | ||||||
|  | #define MSG_OFF								"Выкл. " | ||||||
|  | #define MSG_PID_P							" PID-P: " | ||||||
|  | #define MSG_PID_I							" PID-I: " | ||||||
|  | #define MSG_PID_D							" PID-D: " | ||||||
|  | #define MSG_PID_C							" PID-C: " | ||||||
|  | #define MSG_ACC								" Acc:" | ||||||
|  | #define MSG_VXY_JERK						" Vxy-jerk: " | ||||||
|  | #define MSG_VMAX							" Vmax " | ||||||
|  | #define MSG_X								"x:" | ||||||
|  | #define MSG_Y								"y:" | ||||||
|  | #define MSG_Z								"z:" | ||||||
|  | #define MSG_E								"e:" | ||||||
|  | #define MSG_VMIN							" Vmin:" | ||||||
|  | #define MSG_VTRAV_MIN						" VTrav min:" | ||||||
|  | #define MSG_AMAX							" Amax " | ||||||
|  | #define MSG_A_RETRACT						" A-retract:" | ||||||
|  | #define MSG_XSTEPS							" X шаг/mm:" | ||||||
|  | #define MSG_YSTEPS							" Y шаг/mm:" | ||||||
|  | #define MSG_ZSTEPS							" Z шаг/mm:" | ||||||
|  | #define MSG_ESTEPS							" E шаг/mm:" | ||||||
|  | #define MSG_MAIN_WIDE						" Меню              \003" | ||||||
|  | #define MSG_RECTRACT_WIDE					" Откат подачи      \x7E" | ||||||
|  | #define MSG_TEMPERATURE_WIDE				" Температура       \x7E" | ||||||
|  | #define MSG_TEMPERATURE_RTN					" Температура       \003" | ||||||
|  | #define MSG_MOTION_WIDE						" Скорости          \x7E" | ||||||
|  | #define MSG_STORE_EPROM						" Сохранить настройки" | ||||||
|  | #define MSG_LOAD_EPROM						" Загрузить настройки" | ||||||
|  | #define MSG_RESTORE_FAILSAFE				" Сброс настроек     " | ||||||
|  | #define MSG_REFRESH							"\004Обновить           " | ||||||
|  | #define MSG_WATCH							" Обзор             \003" | ||||||
|  | #define MSG_PREPARE							" Действия          \x7E" | ||||||
|  | #define MSG_PREPARE_ALT						" Действия          \003" | ||||||
|  | #define MSG_CONTROL_ARROW					" Настройки         \x7E" | ||||||
|  | #define MSG_RETRACT_ARROW					" Настройки отката  \x7E" | ||||||
|  | #define MSG_TUNE							" Tune              \x7E" | ||||||
|  | #define MSG_PAUSE_PRINT						" Пауза печати      \x7E" | ||||||
|  | #define MSG_RESUME_PRINT					" Продолжить печать \x7E" | ||||||
|  | #define MSG_STOP_PRINT						" Остановить печать \x7E" | ||||||
|  | #define MSG_CARD_MENU						" Меню карты        \x7E" | ||||||
|  | #define MSG_NO_CARD							" Нет карты" | ||||||
|  | #define MSG_DWELL							"Сон..." | ||||||
|  | #define MSG_USERWAIT						"Нажмите для продолж." | ||||||
|  | #define MSG_NO_MOVE							"Нет движения.       " | ||||||
|  | #define MSG_PART_RELEASE					" Извлечение принта  " | ||||||
|  | #define MSG_KILLED							"УБИТО. " | ||||||
|  | #define MSG_STOPPED							"ОСТАНОВЛЕНО. " | ||||||
|  | #define MSG_STEPPER_RELEASED				"Двигатели отключены." | ||||||
|  | #define MSG_CONTROL_RETRACT					" Откат mm:" | ||||||
|  | #define MSG_CONTROL_RETRACTF				" Откат  F:" | ||||||
|  | #define MSG_CONTROL_RETRACT_ZLIFT			" Прыжок mm:" | ||||||
|  | #define MSG_CONTROL_RETRACT_RECOVER			" Возврат +mm:" | ||||||
|  | #define MSG_CONTROL_RETRACT_RECOVERF		" Возврат  F:" | ||||||
|  | #define MSG_AUTORETRACT						" АвтоОткат:" | ||||||
|  | #define MSG_SERIAL_ERROR_MENU_STRUCTURE		"Ошибка в структуре меню." | ||||||
|  |  | ||||||
|  | // Serial Console Messages | ||||||
|  |  | ||||||
|  | #define MSG_Enqueing						"Запланировано \"" | ||||||
|  | #define MSG_POWERUP							"Включение питания" | ||||||
|  | #define MSG_EXTERNAL_RESET					" Внешний сброс" | ||||||
|  | #define MSG_BROWNOUT_RESET					" Brown out сброс" | ||||||
|  | #define MSG_WATCHDOG_RESET					" Watchdog сброс" | ||||||
|  | #define MSG_SOFTWARE_RESET					" программный сброс" | ||||||
|  | #define MSG_MARLIN							"Marlin " | ||||||
|  | #define MSG_AUTHOR							" | Автор: " | ||||||
|  | #define MSG_CONFIGURATION_VER				" Последнее обновление: " | ||||||
|  | #define MSG_FREE_MEMORY						" Памяти свободно: " | ||||||
|  | #define MSG_PLANNER_BUFFER_BYTES			"  Буффер очереди команд Bytes: " | ||||||
|  | #define MSG_OK								"ok" | ||||||
|  | #define MSG_FILE_SAVED						"Файл записан." | ||||||
|  | #define MSG_ERR_LINE_NO						"Номен строки это не последняя строка+1, последняя строка:" | ||||||
|  | #define MSG_ERR_CHECKSUM_MISMATCH			"контрольная сумма не совпадает, последняя строка:" | ||||||
|  | #define MSG_ERR_NO_CHECKSUM					"нет контрольной суммы для строки, последняя строка:" | ||||||
|  | #define MSG_ERR_NO_LINENUMBER_WITH_CHECKSUM	"нет строки для контрольной суммы, последняя строка:" | ||||||
|  | #define MSG_FILE_PRINTED					"Печать файла завершена" | ||||||
|  | #define MSG_BEGIN_FILE_LIST					"Список файлов" | ||||||
|  | #define MSG_END_FILE_LIST					"Конец списка файлов" | ||||||
|  | #define MSG_M104_INVALID_EXTRUDER			"M104 ошибка экструдера " | ||||||
|  | #define MSG_M105_INVALID_EXTRUDER			"M105 ошибка экструдера " | ||||||
|  | #define MSG_ERR_NO_THERMISTORS				"Нет термистра - нет температуры" | ||||||
|  | #define MSG_M109_INVALID_EXTRUDER			"M109 ошибка экструдера " | ||||||
|  | #define MSG_HEATING							"Нагрев...  " | ||||||
|  | #define MSG_HEATING_COMPLETE				"Наргето.    " | ||||||
|  | #define MSG_BED_HEATING						"Нагрев стола...     " | ||||||
|  | #define MSG_BED_DONE						"Стол нагрет.        " | ||||||
|  | #define MSG_M115_REPORT						"FIRMWARE_NAME:Marlin V1; Sprinter/grbl mashup for gen6 FIRMWARE_URL:" FIRMWARE_URL " PROTOCOL_VERSION:" PROTOCOL_VERSION " MACHINE_TYPE:" MACHINE_NAME " EXTRUDER_COUNT:" STRINGIFY(EXTRUDERS) "\n" | ||||||
|  | #define MSG_COUNT_X							" Count X:" | ||||||
|  | #define MSG_ERR_KILLED						"Принтер остановлен. вызов kill() !!" | ||||||
|  | #define MSG_ERR_STOPPED						"Ошибка принтера, останов. Устраните неисправность и используйте M999 для перезагрузки!. (Температура недоступна. Проверьте датчики)" | ||||||
|  | #define MSG_RESEND							"Переотправка:" | ||||||
|  | #define MSG_UNKNOWN_COMMAND					"Неизвестная команда:\"" | ||||||
|  | #define MSG_ACTIVE_EXTRUDER					"Активный экструдер: " | ||||||
|  | #define MSG_INVALID_EXTRUDER				"Ошибка экструдера" | ||||||
|  | #define MSG_X_MIN							"x_min:" | ||||||
|  | #define MSG_X_MAX							"x_max:" | ||||||
|  | #define MSG_Y_MIN							"y_min:" | ||||||
|  | #define MSG_Y_MAX							"y_max:" | ||||||
|  | #define MSG_Z_MIN							"z_min:" | ||||||
|  | #define MSG_Z_MAX							"z_max:" | ||||||
|  |  | ||||||
|  | #define MSG_SD_CANT_OPEN_SUBDIR				"Не открыть папку" | ||||||
|  | #define MSG_SD_INIT_FAIL					"Ошибка инициализации SD" | ||||||
|  | #define MSG_SD_VOL_INIT_FAIL				"Ошибка инициализации раздела" | ||||||
|  | #define MSG_SD_OPENROOT_FAIL				"Не прочесть содержимое корня" | ||||||
|  | #define MSG_SD_CARD_OK						"SD карта в порядке" | ||||||
|  | #define MSG_SD_WORKDIR_FAIL					"не открыть рабочую папку" | ||||||
|  | #define MSG_SD_OPEN_FILE_FAIL				"Ошибка чтения, файл: " | ||||||
|  | #define MSG_SD_FILE_OPENED					"Файл открыт:" | ||||||
|  | #define MSG_SD_SIZE							" Размер:" | ||||||
|  | #define MSG_SD_FILE_SELECTED				"Файл выбран" | ||||||
|  | #define MSG_SD_WRITE_TO_FILE				"Запись в файл: " | ||||||
|  | #define MSG_SD_PRINTING_BYTE				"SD печать byte " | ||||||
|  | #define MSG_SD_NOT_PRINTING					"нет SD печати" | ||||||
|  | #define MSG_SD_ERR_WRITE_TO_FILE			"ошибка записи в файл" | ||||||
|  | #define MSG_SD_CANT_ENTER_SUBDIR			"Не зайти в папку:" | ||||||
|  |  | ||||||
|  | #define MSG_STEPPER_TO_HIGH					"Частота шагов очень высока : " | ||||||
|  | #define MSG_ENDSTOPS_HIT					"концевик сработал: " | ||||||
|  | #define MSG_ERR_COLD_EXTRUDE_STOP			" защита холодной экструзии" | ||||||
|  | #define MSG_ERR_LONG_EXTRUDE_STOP			" защита превышения длинны экструзии" | ||||||
|  | #define MSG_M119_REPORT						"Статус концевиков" | ||||||
|  | #define MSG_ENDSTOP_HIT						"Срабатывание концевика" | ||||||
|  | #define MSG_ENDSTOP_OPEN					"Концевик освобожден" | ||||||
|  |  | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if LANGUAGE_CHOICE == 7 | ||||||
|  |  | ||||||
|  | 	// LCD Menu Messages | ||||||
|  | 	#define WELCOME_MSG MACHINE_NAME " Pronto." | ||||||
|  | 	#define MSG_SD_INSERTED          "SD Card inserita" | ||||||
|  | 	#define MSG_SD_REMOVED           "SD Card rimossa" | ||||||
|  | 	#define MSG_MAIN                 " Menu principale \003" | ||||||
|  | 	#define MSG_AUTOSTART            " Autostart" | ||||||
|  | 	#define MSG_DISABLE_STEPPERS     " Disabilita Motori Passo-Passo" | ||||||
|  | 	#define MSG_AUTO_HOME            " Auto Home" | ||||||
|  | 	#define MSG_SET_ORIGIN           " Imposta Origini Assi" | ||||||
|  | 	#define MSG_PREHEAT_PLA          " Preriscalda PLA" | ||||||
|  | 	#define MSG_PREHEAT_PLA_SETTINGS " Impostazioni Preriscaldamento PLA" | ||||||
|  | 	#define MSG_PREHEAT_ABS          " Preriscalda ABS" | ||||||
|  | 	#define MSG_PREHEAT_ABS_SETTINGS " Impostazioni Preriscaldamento ABS" | ||||||
|  | 	#define MSG_COOLDOWN             " Rafredda" | ||||||
|  | 	#define MSG_EXTRUDE              " Estrudi" | ||||||
|  | 	#define MSG_RETRACT              " Ritrai" | ||||||
|  | 	#define MSG_MOVE_AXIS            " Muovi Asse      \x7E" | ||||||
|  | 	#define MSG_SPEED                " Velcità:" | ||||||
|  | 	#define MSG_NOZZLE               " \002Ugello:" | ||||||
|  | 	#define MSG_NOZZLE1              " \002Ugello2:" | ||||||
|  | 	#define MSG_NOZZLE2              " \002Ugello3:" | ||||||
|  | 	#define MSG_BED                  " \002Piatto:" | ||||||
|  | 	#define MSG_FAN_SPEED            " Velocità Ventola:" | ||||||
|  | 	#define MSG_FLOW                 " Flusso:" | ||||||
|  | 	#define MSG_CONTROL              " Controllo \003" | ||||||
|  | 	#define MSG_MIN                  " \002 Min:" | ||||||
|  | 	#define MSG_MAX                  " \002 Max:" | ||||||
|  | 	#define MSG_FACTOR               " \002 Fact:" | ||||||
|  | 	#define MSG_AUTOTEMP             " Autotemp:" | ||||||
|  | 	#define MSG_ON                   "On " | ||||||
|  | 	#define MSG_OFF                  "Off" | ||||||
|  | 	#define MSG_PID_P                " PID-P: " | ||||||
|  | 	#define MSG_PID_I                " PID-I: " | ||||||
|  | 	#define MSG_PID_D                " PID-D: " | ||||||
|  | 	#define MSG_PID_C                " PID-C: " | ||||||
|  | 	#define MSG_ACC                  " Acc:" | ||||||
|  | 	#define MSG_VXY_JERK             " Vxy-jerk: " | ||||||
|  | 	#define MSG_VMAX                 " Vmax " | ||||||
|  | 	#define MSG_X                    "x:" | ||||||
|  | 	#define MSG_Y                    "y:" | ||||||
|  | 	#define MSG_Z                    "z:" | ||||||
|  | 	#define MSG_E                    "e:" | ||||||
|  | 	#define MSG_VMIN                 " Vmin:" | ||||||
|  | 	#define MSG_VTRAV_MIN            " VTrav min:" | ||||||
|  | 	#define MSG_AMAX                 " Amax " | ||||||
|  | 	#define MSG_A_RETRACT            " A-ritrai:" | ||||||
|  | 	#define MSG_XSTEPS               " Xpassi/mm:" | ||||||
|  | 	#define MSG_YSTEPS               " Ypassi/mm:" | ||||||
|  | 	#define MSG_ZSTEPS               " Zpassi/mm:" | ||||||
|  | 	#define MSG_ESTEPS               " Epassi/mm:" | ||||||
|  | 	#define MSG_MAIN_WIDE            " Menu Principale        \003" | ||||||
|  | 	#define MSG_RECTRACT_WIDE        " Ritrai    \x7E" | ||||||
|  | 	#define MSG_TEMPERATURE_WIDE     " Temperatura \x7E" | ||||||
|  | 	#define MSG_TEMPERATURE_RTN      " Temperatura  \003" | ||||||
|  | 	#define MSG_MOTION_WIDE          " Movimento      \x7E" | ||||||
|  | 	#define MSG_STORE_EPROM          " Salva in memoria" | ||||||
|  | 	#define MSG_LOAD_EPROM           " Carica dalla memoria" | ||||||
|  | 	#define MSG_RESTORE_FAILSAFE     " Configurazioni di default" | ||||||
|  | 	#define MSG_REFRESH              "\004Aggiorna" | ||||||
|  | 	#define MSG_WATCH                " Guarda   \003" | ||||||
|  | 	#define MSG_PREPARE              " Prepara \x7E" | ||||||
|  | 	#define MSG_PREPARE_ALT          " Prepara \003" | ||||||
|  | 	#define MSG_CONTROL_ARROW        " Controllo \x7E" | ||||||
|  | 	#define MSG_RETRACT_ARROW        " Ritrai \x7E" | ||||||
|  | 	#define MSG_TUNE                 " Tune    \x7E" | ||||||
|  | 	#define MSG_PAUSE_PRINT          " Metti in Pausa la Stampa \x7E" | ||||||
|  | 	#define MSG_RESUME_PRINT         " Riprendi Stampa \x7E" | ||||||
|  | 	#define MSG_STOP_PRINT           " Arresta Stampa   \x7E" | ||||||
|  | 	#define MSG_CARD_MENU            " Card Menu    \x7E" | ||||||
|  | 	#define MSG_NO_CARD              " No Card" | ||||||
|  | 	#define MSG_DWELL                " Sospensione..." | ||||||
|  | 	#define MSG_USERWAIT             "Attendi utente..." | ||||||
|  | 	#define MSG_NO_MOVE              "Nessun movimento." | ||||||
|  | 	#define MSG_PART_RELEASE         "Rilascio Parziale" | ||||||
|  | 	#define MSG_KILLED               "UCCISO. " | ||||||
|  | 	#define MSG_STOPPED              "ARRESTATO. " | ||||||
|  | 	#define MSG_STEPPER_RELEASED     "Rilasciato." | ||||||
|  | 	#define MSG_CONTROL_RETRACT      " Ritrai mm:" | ||||||
|  | 	#define MSG_CONTROL_RETRACTF     " Ritrai  F:" | ||||||
|  | 	#define MSG_CONTROL_RETRACT_ZLIFT " Salta mm:" | ||||||
|  | 	#define MSG_CONTROL_RETRACT_RECOVER " UnRet +mm:" | ||||||
|  | 	#define MSG_CONTROL_RETRACT_RECOVERF " UnRet  F:" | ||||||
|  | 	#define MSG_AUTORETRACT          " AutoRilascio.:" | ||||||
|  | 	#define MSG_SERIAL_ERROR_MENU_STRUCTURE "Qualcosa non va in MenuStructure." | ||||||
|  |  | ||||||
|  | 	// Serial Console Messages | ||||||
|  |  | ||||||
|  | 	#define MSG_Enqueing             "accodamento \"" | ||||||
|  | 	#define MSG_POWERUP              "Accensione" | ||||||
|  | 	#define MSG_EXTERNAL_RESET       " Reset Esterno" | ||||||
|  | 	#define MSG_BROWNOUT_RESET       " Brown out Reset" | ||||||
|  | 	#define MSG_WATCHDOG_RESET       " Watchdog Reset" | ||||||
|  | 	#define MSG_SOFTWARE_RESET       " Software Reset" | ||||||
|  | 	#define MSG_MARLIN               "Marlin " | ||||||
|  | 	#define MSG_AUTHOR               " | Autore: " | ||||||
|  | 	#define MSG_CONFIGURATION_VER    " Ultimo Aggiornamento: " | ||||||
|  | 	#define MSG_FREE_MEMORY          " Memoria Libera: " | ||||||
|  | 	#define MSG_PLANNER_BUFFER_BYTES "  PlannerBufferBytes: " | ||||||
|  | 	#define MSG_OK                   "ok" | ||||||
|  | 	#define MSG_FILE_SAVED           "File Salvato." | ||||||
|  | 	#define MSG_ERR_LINE_NO          "Il Numero della Linea non corrisponde al Numero dell'Ultima Linea+1, Ultima Linea:" | ||||||
|  | 	#define MSG_ERR_CHECKSUM_MISMATCH "checksum non corrispondente, Ultima Linea:" | ||||||
|  | 	#define MSG_ERR_NO_CHECKSUM      "Nessun Checksum con Numero di Linea, Ultima Linea:" | ||||||
|  | 	#define MSG_ERR_NO_LINENUMBER_WITH_CHECKSUM "Nessun Numero di Linea con Checksum, Ultima Linea:" | ||||||
|  | 	#define MSG_FILE_PRINTED         "File stampato" | ||||||
|  | 	#define MSG_BEGIN_FILE_LIST      "Inizio Lista File" | ||||||
|  | 	#define MSG_END_FILE_LIST        "Fine Lista File" | ||||||
|  | 	#define MSG_M104_INVALID_EXTRUDER "M104 Estrusore non valido " | ||||||
|  | 	#define MSG_M105_INVALID_EXTRUDER "M105 Estrusore non valido " | ||||||
|  | 	#define MSG_ERR_NO_THERMISTORS   "Nessun Termistore - nessuna temperatura" | ||||||
|  | 	#define MSG_M109_INVALID_EXTRUDER "M109 Estrusore non valido " | ||||||
|  | 	#define MSG_HEATING              "Riscaldamento..." | ||||||
|  | 	#define MSG_HEATING_COMPLETE     "Riscaldamento concluso." | ||||||
|  | 	#define MSG_BED_HEATING          "Riscaldamento Piatto." | ||||||
|  | 	#define MSG_BED_DONE             "Piatto Pronto." | ||||||
|  | 	#define MSG_M115_REPORT          "FIRMWARE_NAME:Marlin V1; Sprinter/grbl mashup for gen6 FIRMWARE_URL:" FIRMWARE_URL " PROTOCOL_VERSION:" PROTOCOL_VERSION " MACHINE_TYPE:" MACHINE_NAME " EXTRUDER_COUNT:" STRINGIFY(EXTRUDERS) "\n" | ||||||
|  | 	#define MSG_COUNT_X              " Calcola X:" | ||||||
|  | 	#define MSG_ERR_KILLED           "Stampante Calda. kill() chiamata !!" | ||||||
|  | 	#define MSG_ERR_STOPPED          "Stampante fermata a causa di errori. Risolvi l'errore e usa M999 per ripartire!. (Reset temperatura. Impostala prima di ripartire)" | ||||||
|  | 	#define MSG_RESEND               "Reinviato:" | ||||||
|  | 	#define MSG_UNKNOWN_COMMAND      "Comando sconosciuto:\"" | ||||||
|  | 	#define MSG_ACTIVE_EXTRUDER      "Attiva Estrusore: " | ||||||
|  | 	#define MSG_INVALID_EXTRUDER     "Estrusore non valido" | ||||||
|  | 	#define MSG_X_MIN                "x_min: " | ||||||
|  | 	#define MSG_X_MAX                "x_max: " | ||||||
|  | 	#define MSG_Y_MIN                "y_min: " | ||||||
|  | 	#define MSG_Y_MAX                "y_max: " | ||||||
|  | 	#define MSG_Z_MIN                "z_min: " | ||||||
|  | 	#define MSG_Z_MAX                "z_max: " | ||||||
|  | 	#define MSG_M119_REPORT          "Segnalazione stato degli endstop" | ||||||
|  | 	#define MSG_ENDSTOP_HIT          "INNESCATO" | ||||||
|  | 	#define MSG_ENDSTOP_OPEN         "aperto" | ||||||
|  |  | ||||||
|  | 	#define MSG_SD_CANT_OPEN_SUBDIR  "Impossibile aprire sottocartella" | ||||||
|  | 	#define MSG_SD_INIT_FAIL         "Fallita Inizializzazione SD" | ||||||
|  | 	#define MSG_SD_VOL_INIT_FAIL     "Fallito il montaggio del Volume" | ||||||
|  | 	#define MSG_SD_OPENROOT_FAIL     "Fallita l'apertura Cartella Principale" | ||||||
|  | 	#define MSG_SD_CARD_OK           "SD card ok" | ||||||
|  | 	#define MSG_SD_WORKDIR_FAIL      "Fallita l'apertura Cartella di Lavoro" | ||||||
|  | 	#define MSG_SD_OPEN_FILE_FAIL    "Fallita l'apertura del File: " | ||||||
|  | 	#define MSG_SD_FILE_OPENED       "File aperto:" | ||||||
|  | 	#define MSG_SD_SIZE              " Dimensione:" | ||||||
|  | 	#define MSG_SD_FILE_SELECTED     "File selezionato" | ||||||
|  | 	#define MSG_SD_WRITE_TO_FILE     "Scrittura su file: " | ||||||
|  | 	#define MSG_SD_PRINTING_BYTE     "Si sta scrivendo il byte su SD " | ||||||
|  | 	#define MSG_SD_NOT_PRINTING      "Non si sta scrivendo su SD" | ||||||
|  | 	#define MSG_SD_ERR_WRITE_TO_FILE "Errore nella scrittura su file" | ||||||
|  | 	#define MSG_SD_CANT_ENTER_SUBDIR "Impossibile entrare nella sottocartella:" | ||||||
|  |  | ||||||
|  | 	#define MSG_STEPPER_TO_HIGH      "Steprate troppo alto : " | ||||||
|  | 	#define MSG_ENDSTOPS_HIT         "Raggiunto il fondo carrello: " | ||||||
|  | 	#define MSG_ERR_COLD_EXTRUDE_STOP " prevenuta estrusione fredda" | ||||||
|  | 	#define MSG_ERR_LONG_EXTRUDE_STOP " prevenuta estrusione troppo lunga" | ||||||
|  |  | ||||||
|  | #endif | ||||||
|  |  | ||||||
| #endif // ifndef LANGUAGE_H | #endif // ifndef LANGUAGE_H | ||||||
|   | |||||||
							
								
								
									
										106
									
								
								Marlin/pins.h
									
									
									
									
									
								
							
							
						
						
									
										106
									
								
								Marlin/pins.h
									
									
									
									
									
								
							| @@ -103,6 +103,7 @@ | |||||||
| #define HEATER_2_PIN -1 | #define HEATER_2_PIN -1 | ||||||
| #define HEATER_BED_PIN 3 | #define HEATER_BED_PIN 3 | ||||||
|  |  | ||||||
|  | #define KILL_PIN -1 | ||||||
|  |  | ||||||
| #define SDPOWER -1 | #define SDPOWER -1 | ||||||
| #define SDSS -1 // SCL pin of I2C header | #define SDSS -1 // SCL pin of I2C header | ||||||
| @@ -274,6 +275,7 @@ | |||||||
| 	#define SDCARDDETECT -1 		 | 	#define SDCARDDETECT -1 		 | ||||||
|     #define SUICIDE_PIN -1						//has to be defined; otherwise Power_off doesn't work |     #define SUICIDE_PIN -1						//has to be defined; otherwise Power_off doesn't work | ||||||
| 	 | 	 | ||||||
|  |     #define KILL_PIN -1 | ||||||
| 	//Pins for 4bit LCD Support  | 	//Pins for 4bit LCD Support  | ||||||
|     #define LCD_PINS_RS 18  |     #define LCD_PINS_RS 18  | ||||||
|     #define LCD_PINS_ENABLE 17 |     #define LCD_PINS_ENABLE 17 | ||||||
| @@ -611,6 +613,7 @@ | |||||||
|     #define LED_PIN         -1    //changed @ rkoeppl 20110410 |     #define LED_PIN         -1    //changed @ rkoeppl 20110410 | ||||||
|     #define FAN_PIN         -1    //changed @ rkoeppl 20110410 |     #define FAN_PIN         -1    //changed @ rkoeppl 20110410 | ||||||
|     #define PS_ON_PIN       -1    //changed @ rkoeppl 20110410 |     #define PS_ON_PIN       -1    //changed @ rkoeppl 20110410 | ||||||
|  |     #define KILL_PIN        -1    //changed @ drakelive 20120830 | ||||||
|     //our pin for debugging. |     //our pin for debugging. | ||||||
|      |      | ||||||
|     #define DEBUG_PIN        0 |     #define DEBUG_PIN        0 | ||||||
| @@ -1197,6 +1200,109 @@ | |||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /**************************************************************************************** | ||||||
|  | * MegaTronics | ||||||
|  | * | ||||||
|  | ****************************************************************************************/ | ||||||
|  | #if MOTHERBOARD == 70 | ||||||
|  | #define KNOWN_BOARD 1 | ||||||
|  |  | ||||||
|  | //////////////////FIX THIS////////////// | ||||||
|  |  | ||||||
|  |  #ifndef __AVR_ATmega2560__ | ||||||
|  |  #error Oops!  Make sure you have 'Arduino Mega' selected from the 'Tools -> Boards' menu. | ||||||
|  |  #endif | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #define X_STEP_PIN         26 | ||||||
|  | #define X_DIR_PIN          28 | ||||||
|  | #define X_ENABLE_PIN       24 | ||||||
|  | #define X_MIN_PIN          41 | ||||||
|  | #define X_MAX_PIN          37   //2 //Max endstops default to disabled "-1", set to commented value to enable. | ||||||
|  |  | ||||||
|  | #define Y_STEP_PIN         60 // A6 | ||||||
|  | #define Y_DIR_PIN          61 // A7 | ||||||
|  | #define Y_ENABLE_PIN       22 | ||||||
|  | #define Y_MIN_PIN          14 | ||||||
|  | #define Y_MAX_PIN          15   //15 | ||||||
|  |  | ||||||
|  | #define Z_STEP_PIN         54 // A0 | ||||||
|  | #define Z_DIR_PIN          55 // A1 | ||||||
|  | #define Z_ENABLE_PIN       56 // A2 | ||||||
|  | #define Z_MIN_PIN          18 | ||||||
|  | #define Z_MAX_PIN          19 | ||||||
|  |  | ||||||
|  | #define E0_STEP_PIN        31 | ||||||
|  | #define E0_DIR_PIN         32 | ||||||
|  | #define E0_ENABLE_PIN      38 | ||||||
|  |  | ||||||
|  | #define E1_STEP_PIN        34 | ||||||
|  | #define E1_DIR_PIN         36 | ||||||
|  | #define E1_ENABLE_PIN      30 | ||||||
|  |  | ||||||
|  | #define SDPOWER            -1 | ||||||
|  | #define SDSS               53 | ||||||
|  | #define LED_PIN            13 | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #define FAN_PIN            7 // IO pin. Buffer needed | ||||||
|  | #define PS_ON_PIN          12 | ||||||
|  | #define KILL_PIN           -1 | ||||||
|  |  | ||||||
|  | #define HEATER_0_PIN       9    // EXTRUDER 1 | ||||||
|  | #define HEATER_1_PIN       8    // EXTRUDER 2 (FAN On Sprinter) | ||||||
|  | #define HEATER_2_PIN       -1   | ||||||
|  |  | ||||||
|  | #if TEMP_SENSOR_0 == -1  | ||||||
|  | #define TEMP_0_PIN         8   // ANALOG NUMBERING | ||||||
|  | #else | ||||||
|  | #define TEMP_0_PIN         13   // ANALOG NUMBERING | ||||||
|  |  | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #define TEMP_1_PIN         15   // ANALOG NUMBERING | ||||||
|  | #define TEMP_2_PIN         -1   // ANALOG NUMBERING | ||||||
|  | #define HEATER_BED_PIN     10   // BED | ||||||
|  | #define TEMP_BED_PIN       14   // ANALOG NUMBERING | ||||||
|  |  | ||||||
|  | #define BEEPER 33			// Beeper on AUX-4 | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #ifdef ULTRA_LCD | ||||||
|  |  | ||||||
|  |   #ifdef NEWPANEL | ||||||
|  |   //arduino pin which triggers an piezzo beeper | ||||||
|  |      | ||||||
|  |     #define LCD_PINS_RS 16  | ||||||
|  |     #define LCD_PINS_ENABLE 17 | ||||||
|  |     #define LCD_PINS_D4 23 | ||||||
|  |     #define LCD_PINS_D5 25  | ||||||
|  |     #define LCD_PINS_D6 27 | ||||||
|  |     #define LCD_PINS_D7 29 | ||||||
|  |      | ||||||
|  |     //buttons are directly attached using AUX-2 | ||||||
|  |     #define BTN_EN1 37 | ||||||
|  |     #define BTN_EN2 35 | ||||||
|  |     #define BTN_ENC 43  //the click | ||||||
|  |      | ||||||
|  |     #define BLEN_C 2 | ||||||
|  |     #define BLEN_B 1 | ||||||
|  |     #define BLEN_A 0 | ||||||
|  |      | ||||||
|  |     #define SDCARDDETECT -1		// Ramps does not use this port | ||||||
|  |      | ||||||
|  |       //encoder rotation values | ||||||
|  |     #define encrot0 0 | ||||||
|  |     #define encrot1 2 | ||||||
|  |     #define encrot2 3 | ||||||
|  |     #define encrot3 1 | ||||||
|  | #endif | ||||||
|  | #endif //ULTRA_LCD | ||||||
|  |  | ||||||
|  | #endif | ||||||
|  |  | ||||||
| #ifndef KNOWN_BOARD | #ifndef KNOWN_BOARD | ||||||
| #error Unknown MOTHERBOARD value in configuration.h | #error Unknown MOTHERBOARD value in configuration.h | ||||||
| #endif | #endif | ||||||
|   | |||||||
| @@ -501,7 +501,7 @@ void plan_buffer_line(const float &x, const float &y, const float &z, const floa | |||||||
|   // Rest here until there is room in the buffer. |   // Rest here until there is room in the buffer. | ||||||
|   while(block_buffer_tail == next_buffer_head) {  |   while(block_buffer_tail == next_buffer_head) {  | ||||||
|     manage_heater();  |     manage_heater();  | ||||||
|     manage_inactivity(1);  |     manage_inactivity();  | ||||||
|     LCD_STATUS; |     LCD_STATUS; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -899,7 +899,7 @@ void st_synchronize() | |||||||
| { | { | ||||||
|     while( blocks_queued()) { |     while( blocks_queued()) { | ||||||
|     manage_heater(); |     manage_heater(); | ||||||
|     manage_inactivity(1); |     manage_inactivity(); | ||||||
|     LCD_STATUS; |     LCD_STATUS; | ||||||
|   } |   } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -25,7 +25,7 @@ | |||||||
|  |  | ||||||
| #if EXTRUDERS > 2 | #if EXTRUDERS > 2 | ||||||
|   #define WRITE_E_STEP(v) { if(current_block->active_extruder == 2) { WRITE(E2_STEP_PIN, v); } else { if(current_block->active_extruder == 1) { WRITE(E1_STEP_PIN, v); } else { WRITE(E0_STEP_PIN, v); }}} |   #define WRITE_E_STEP(v) { if(current_block->active_extruder == 2) { WRITE(E2_STEP_PIN, v); } else { if(current_block->active_extruder == 1) { WRITE(E1_STEP_PIN, v); } else { WRITE(E0_STEP_PIN, v); }}} | ||||||
|   #define NORM_E_DIR() { if(current_block->active_extruder == 2) { WRITE(!E2_DIR_PIN, INVERT_E2_DIR); } else { if(current_block->active_extruder == 1) { WRITE(!E1_DIR_PIN, INVERT_E1_DIR); } else { WRITE(E0_DIR_PIN, !INVERT_E0_DIR); }}} |   #define NORM_E_DIR() { if(current_block->active_extruder == 2) { WRITE(E2_DIR_PIN, !INVERT_E2_DIR); } else { if(current_block->active_extruder == 1) { WRITE(E1_DIR_PIN, !INVERT_E1_DIR); } else { WRITE(E0_DIR_PIN, !INVERT_E0_DIR); }}} | ||||||
|   #define REV_E_DIR() { if(current_block->active_extruder == 2) { WRITE(E2_DIR_PIN, INVERT_E2_DIR); } else { if(current_block->active_extruder == 1) { WRITE(E1_DIR_PIN, INVERT_E1_DIR); } else { WRITE(E0_DIR_PIN, INVERT_E0_DIR); }}} |   #define REV_E_DIR() { if(current_block->active_extruder == 2) { WRITE(E2_DIR_PIN, INVERT_E2_DIR); } else { if(current_block->active_extruder == 1) { WRITE(E1_DIR_PIN, INVERT_E1_DIR); } else { WRITE(E0_DIR_PIN, INVERT_E0_DIR); }}} | ||||||
| #elif EXTRUDERS > 1 | #elif EXTRUDERS > 1 | ||||||
|   #define WRITE_E_STEP(v) { if(current_block->active_extruder == 1) { WRITE(E1_STEP_PIN, v); } else { WRITE(E0_STEP_PIN, v); }} |   #define WRITE_E_STEP(v) { if(current_block->active_extruder == 1) { WRITE(E1_STEP_PIN, v); } else { WRITE(E0_STEP_PIN, v); }} | ||||||
|   | |||||||
| @@ -57,6 +57,15 @@ int current_raw_bed = 0; | |||||||
|     float Kc=DEFAULT_Kc; |     float Kc=DEFAULT_Kc; | ||||||
|   #endif |   #endif | ||||||
| #endif //PIDTEMP | #endif //PIDTEMP | ||||||
|  |  | ||||||
|  | #ifdef PIDTEMPBED | ||||||
|  |   // used external | ||||||
|  |   float pid_setpoint_bed = { 0.0 }; | ||||||
|  |    | ||||||
|  |   float bedKp=DEFAULT_bedKp; | ||||||
|  |   float bedKi=(DEFAULT_bedKi*PID_dT); | ||||||
|  |   float bedKd=(DEFAULT_bedKd/PID_dT); | ||||||
|  | #endif //PIDTEMPBED | ||||||
|    |    | ||||||
|    |    | ||||||
| //=========================================================================== | //=========================================================================== | ||||||
| @@ -64,9 +73,6 @@ int current_raw_bed = 0; | |||||||
| //=========================================================================== | //=========================================================================== | ||||||
| static volatile bool temp_meas_ready = false; | static volatile bool temp_meas_ready = false; | ||||||
|  |  | ||||||
| static unsigned long  previous_millis_bed_heater; |  | ||||||
| //static unsigned long previous_millis_heater; |  | ||||||
|  |  | ||||||
| #ifdef PIDTEMP | #ifdef PIDTEMP | ||||||
|   //static cannot be external: |   //static cannot be external: | ||||||
|   static float temp_iState[EXTRUDERS] = { 0 }; |   static float temp_iState[EXTRUDERS] = { 0 }; | ||||||
| @@ -82,7 +88,22 @@ static unsigned long  previous_millis_bed_heater; | |||||||
|   // static float pid_output[EXTRUDERS]; |   // static float pid_output[EXTRUDERS]; | ||||||
|   static bool pid_reset[EXTRUDERS]; |   static bool pid_reset[EXTRUDERS]; | ||||||
| #endif //PIDTEMP | #endif //PIDTEMP | ||||||
|  | #ifdef PIDTEMPBED | ||||||
|  |   //static cannot be external: | ||||||
|  |   static float temp_iState_bed = { 0 }; | ||||||
|  |   static float temp_dState_bed = { 0 }; | ||||||
|  |   static float pTerm_bed; | ||||||
|  |   static float iTerm_bed; | ||||||
|  |   static float dTerm_bed; | ||||||
|  |   //int output; | ||||||
|  |   static float pid_error_bed; | ||||||
|  |   static float temp_iState_min_bed; | ||||||
|  |   static float temp_iState_max_bed; | ||||||
|  | #else //PIDTEMPBED | ||||||
|  | 	static unsigned long  previous_millis_bed_heater; | ||||||
|  | #endif //PIDTEMPBED | ||||||
|   static unsigned char soft_pwm[EXTRUDERS]; |   static unsigned char soft_pwm[EXTRUDERS]; | ||||||
|  |   static unsigned char soft_pwm_bed; | ||||||
|    |    | ||||||
| #ifdef WATCHPERIOD | #ifdef WATCHPERIOD | ||||||
|   int watch_raw[EXTRUDERS] = { -1000 }; // the first value used for all |   int watch_raw[EXTRUDERS] = { -1000 }; // the first value used for all | ||||||
| @@ -122,7 +143,7 @@ static unsigned long  previous_millis_bed_heater; | |||||||
| //=============================   functions      ============================ | //=============================   functions      ============================ | ||||||
| //=========================================================================== | //=========================================================================== | ||||||
|  |  | ||||||
| void PID_autotune(float temp) | void PID_autotune(float temp, int extruder, int ncycles) | ||||||
| { | { | ||||||
|   float input; |   float input; | ||||||
|   int cycles=0; |   int cycles=0; | ||||||
| @@ -134,32 +155,55 @@ void PID_autotune(float temp) | |||||||
|   long t_high; |   long t_high; | ||||||
|   long t_low; |   long t_low; | ||||||
|  |  | ||||||
|   long bias=PID_MAX/2; |   long bias, d; | ||||||
|   long d = PID_MAX/2; |  | ||||||
|   float Ku, Tu; |   float Ku, Tu; | ||||||
|   float Kp, Ki, Kd; |   float Kp, Ki, Kd; | ||||||
|   float max, min; |   float max, min; | ||||||
|    |  | ||||||
|  | 	if ((extruder > EXTRUDERS) | ||||||
|  |   #if (TEMP_BED_PIN <= -1) | ||||||
|  | 		||(extruder < 0) | ||||||
|  | 	#endif | ||||||
|  | 	){ | ||||||
|  |   	SERIAL_ECHOLN("PID Autotune failed. Bad extruder number."); | ||||||
|  |   	return; | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|   SERIAL_ECHOLN("PID Autotune start"); |   SERIAL_ECHOLN("PID Autotune start"); | ||||||
|    |    | ||||||
|   disable_heater(); // switch off all heaters. |   disable_heater(); // switch off all heaters. | ||||||
|    |  | ||||||
|   soft_pwm[0] = PID_MAX/2; | 	if (extruder<0) | ||||||
|      | 	{ | ||||||
|   for(;;) { | 	 	soft_pwm_bed = (MAX_BED_POWER)/2; | ||||||
|  | 		bias = d = (MAX_BED_POWER)/2; | ||||||
|  |   } | ||||||
|  | 	else | ||||||
|  | 	{ | ||||||
|  | 	  soft_pwm[extruder] = (PID_MAX)/2; | ||||||
|  | 		bias = d = (PID_MAX)/2; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  for(;;) { | ||||||
|  |  | ||||||
|     if(temp_meas_ready == true) { // temp sample ready |     if(temp_meas_ready == true) { // temp sample ready | ||||||
|       CRITICAL_SECTION_START; |       CRITICAL_SECTION_START; | ||||||
|       temp_meas_ready = false; |       temp_meas_ready = false; | ||||||
|       CRITICAL_SECTION_END; |       CRITICAL_SECTION_END; | ||||||
|       input = analog2temp(current_raw[0], 0); |       input = (extruder<0)?analog2tempBed(current_raw_bed):analog2temp(current_raw[extruder], extruder); | ||||||
|        |  | ||||||
|       max=max(max,input); |       max=max(max,input); | ||||||
|       min=min(min,input); |       min=min(min,input); | ||||||
|       if(heating == true && input > temp) { |       if(heating == true && input > temp) { | ||||||
|         if(millis() - t2 > 5000) {  |         if(millis() - t2 > 5000) {  | ||||||
|           heating=false; |           heating=false; | ||||||
|           soft_pwm[0] = (bias - d) >> 1; | 					if (extruder<0) | ||||||
|  | 						soft_pwm_bed = (bias - d) >> 1; | ||||||
|  | 					else | ||||||
|  | 						soft_pwm[extruder] = (bias - d) >> 1; | ||||||
|           t1=millis(); |           t1=millis(); | ||||||
|           t_high=t1 - t2; |           t_high=t1 - t2; | ||||||
|           max=temp; |           max=temp; | ||||||
| @@ -172,8 +216,8 @@ void PID_autotune(float temp) | |||||||
|           t_low=t2 - t1; |           t_low=t2 - t1; | ||||||
|           if(cycles > 0) { |           if(cycles > 0) { | ||||||
|             bias += (d*(t_high - t_low))/(t_low + t_high); |             bias += (d*(t_high - t_low))/(t_low + t_high); | ||||||
|             bias = constrain(bias, 20 ,PID_MAX-20); |             bias = constrain(bias, 20 ,(extruder<0?(MAX_BED_POWER):(PID_MAX))-20); | ||||||
|             if(bias > PID_MAX/2) d = PID_MAX - 1 - bias; |             if(bias > (extruder<0?(MAX_BED_POWER):(PID_MAX))/2) d = (extruder<0?(MAX_BED_POWER):(PID_MAX)) - 1 - bias; | ||||||
|             else d = bias; |             else d = bias; | ||||||
|  |  | ||||||
|             SERIAL_PROTOCOLPGM(" bias: "); SERIAL_PROTOCOL(bias); |             SERIAL_PROTOCOLPGM(" bias: "); SERIAL_PROTOCOL(bias); | ||||||
| @@ -210,7 +254,10 @@ void PID_autotune(float temp) | |||||||
|               */ |               */ | ||||||
|             } |             } | ||||||
|           } |           } | ||||||
|           soft_pwm[0] = (bias + d) >> 1; | 					if (extruder<0) | ||||||
|  | 						soft_pwm_bed = (bias + d) >> 1; | ||||||
|  | 					else | ||||||
|  | 						soft_pwm[extruder] = (bias + d) >> 1; | ||||||
|           cycles++; |           cycles++; | ||||||
|           min=temp; |           min=temp; | ||||||
|         } |         } | ||||||
| @@ -221,17 +268,26 @@ void PID_autotune(float temp) | |||||||
|       return; |       return; | ||||||
|     } |     } | ||||||
|     if(millis() - temp_millis > 2000) { |     if(millis() - temp_millis > 2000) { | ||||||
|       temp_millis = millis(); | 			int p; | ||||||
|       SERIAL_PROTOCOLPGM("ok T:"); | 			if (extruder<0){ | ||||||
|       SERIAL_PROTOCOL(degHotend(0));    | 	      p=soft_pwm_bed;        | ||||||
|  | 	      SERIAL_PROTOCOLPGM("ok B:"); | ||||||
|  | 			}else{ | ||||||
|  | 	      p=soft_pwm[extruder];        | ||||||
|  | 	      SERIAL_PROTOCOLPGM("ok T:"); | ||||||
|  | 			} | ||||||
|  | 			 | ||||||
|  |       SERIAL_PROTOCOL(input);    | ||||||
|       SERIAL_PROTOCOLPGM(" @:"); |       SERIAL_PROTOCOLPGM(" @:"); | ||||||
|       SERIAL_PROTOCOLLN(getHeaterPower(0));        |       SERIAL_PROTOCOLLN(p);        | ||||||
|  |  | ||||||
|  |       temp_millis = millis(); | ||||||
|     } |     } | ||||||
|     if(((millis() - t1) + (millis() - t2)) > (10L*60L*1000L*2L)) { |     if(((millis() - t1) + (millis() - t2)) > (10L*60L*1000L*2L)) { | ||||||
|       SERIAL_PROTOCOLLNPGM("PID Autotune failed! timeout"); |       SERIAL_PROTOCOLLNPGM("PID Autotune failed! timeout"); | ||||||
|       return; |       return; | ||||||
|     } |     } | ||||||
|     if(cycles > 5) { |     if(cycles > ncycles) { | ||||||
|       SERIAL_PROTOCOLLNPGM("PID Autotune finished ! Place the Kp, Ki and Kd constants in the configuration.h"); |       SERIAL_PROTOCOLLNPGM("PID Autotune finished ! Place the Kp, Ki and Kd constants in the configuration.h"); | ||||||
|       return; |       return; | ||||||
|     } |     } | ||||||
| @@ -246,18 +302,19 @@ void updatePID() | |||||||
|      temp_iState_max[e] = PID_INTEGRAL_DRIVE_MAX / Ki;   |      temp_iState_max[e] = PID_INTEGRAL_DRIVE_MAX / Ki;   | ||||||
|   } |   } | ||||||
| #endif | #endif | ||||||
|  | #ifdef PIDTEMPBED | ||||||
|  |   temp_iState_max_bed = PID_INTEGRAL_DRIVE_MAX / bedKi;   | ||||||
|  | #endif | ||||||
| } | } | ||||||
|    |    | ||||||
| int getHeaterPower(int heater) { | int getHeaterPower(int heater) { | ||||||
|  | 	if (heater<0) | ||||||
|  | 		return soft_pwm_bed; | ||||||
|   return soft_pwm[heater]; |   return soft_pwm[heater]; | ||||||
| } | } | ||||||
|  |  | ||||||
| void manage_heater() | void manage_heater() | ||||||
| { | { | ||||||
| #ifdef HEATER_BED_DUTY_CYCLE_DIVIDER |  | ||||||
|   static int bed_needs_heating=0; |  | ||||||
|   static int bed_is_on=0; |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
|   #ifdef USE_WATCHDOG |   #ifdef USE_WATCHDOG | ||||||
|     wd_reset(); |     wd_reset(); | ||||||
| @@ -298,12 +355,16 @@ void manage_heater() | |||||||
|           temp_iState[e] += pid_error[e]; |           temp_iState[e] += pid_error[e]; | ||||||
|           temp_iState[e] = constrain(temp_iState[e], temp_iState_min[e], temp_iState_max[e]); |           temp_iState[e] = constrain(temp_iState[e], temp_iState_min[e], temp_iState_max[e]); | ||||||
|           iTerm[e] = Ki * temp_iState[e]; |           iTerm[e] = Ki * temp_iState[e]; | ||||||
|  |  | ||||||
|           //K1 defined in Configuration.h in the PID settings |           //K1 defined in Configuration.h in the PID settings | ||||||
|           #define K2 (1.0-K1) |           #define K2 (1.0-K1) | ||||||
|           dTerm[e] = (Kd * (pid_input - temp_dState[e]))*K2 + (K1 * dTerm[e]); |           dTerm[e] = (Kd * (pid_input - temp_dState[e]))*K2 + (K1 * dTerm[e]); | ||||||
|           temp_dState[e] = pid_input; |           temp_dState[e] = pid_input; | ||||||
|  |  | ||||||
|           pid_output = constrain(pTerm[e] + iTerm[e] - dTerm[e], 0, PID_MAX); |           pid_output = constrain(pTerm[e] + iTerm[e] - dTerm[e], 0, PID_MAX); | ||||||
|         } |         } | ||||||
|  |     #else  | ||||||
|  |           pid_output = constrain(pid_setpoint[e], 0, PID_MAX); | ||||||
|     #endif //PID_OPENLOOP |     #endif //PID_OPENLOOP | ||||||
|     #ifdef PID_DEBUG |     #ifdef PID_DEBUG | ||||||
|     SERIAL_ECHOLN(" PIDDEBUG "<<e<<": Input "<<pid_input<<" Output "<<pid_output" pTerm "<<pTerm[e]<<" iTerm "<<iTerm[e]<<" dTerm "<<dTerm[e]);   |     SERIAL_ECHOLN(" PIDDEBUG "<<e<<": Input "<<pid_input<<" Output "<<pid_output" pTerm "<<pTerm[e]<<" iTerm "<<iTerm[e]<<" dTerm "<<dTerm[e]);   | ||||||
| @@ -338,42 +399,58 @@ void manage_heater() | |||||||
|     } |     } | ||||||
|   #endif |   #endif | ||||||
|    |    | ||||||
| #ifdef HEATER_BED_DUTY_CYCLE_DIVIDER |  | ||||||
|   if (bed_needs_heating){ |  | ||||||
|     if (bed_is_on==0) |  | ||||||
|         WRITE(HEATER_BED_PIN,HIGH); |  | ||||||
|     if (bed_is_on==1) |  | ||||||
|         WRITE(HEATER_BED_PIN,LOW); |  | ||||||
|     bed_is_on=(bed_is_on+1) % HEATER_BED_DUTY_CYCLE_DIVIDER; |  | ||||||
|   } |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
|  | 		#ifndef PIDTEMPBED | ||||||
|   if(millis() - previous_millis_bed_heater < BED_CHECK_INTERVAL) |   if(millis() - previous_millis_bed_heater < BED_CHECK_INTERVAL) | ||||||
|     return; |     return; | ||||||
|   previous_millis_bed_heater = millis(); |   previous_millis_bed_heater = millis(); | ||||||
|    |  | ||||||
|   #if TEMP_BED_PIN > -1 |  | ||||||
|    |  | ||||||
|     #ifdef HEATER_BED_DUTY_CYCLE_DIVIDER |  | ||||||
|     bed_needs_heating=0; |  | ||||||
|     #endif |     #endif | ||||||
|  |  | ||||||
|     #ifndef BED_LIMIT_SWITCHING |   #if TEMP_BED_PIN > -1 | ||||||
|  |    | ||||||
|  | 		#ifdef PIDTEMPBED | ||||||
|  |     pid_input = analog2tempBed(current_raw_bed); | ||||||
|  |  | ||||||
|  |     #ifndef PID_OPENLOOP | ||||||
|  | 		  pid_error_bed = pid_setpoint_bed - pid_input; | ||||||
|  | 		  pTerm_bed = bedKp * pid_error_bed; | ||||||
|  | 		  temp_iState_bed += pid_error_bed; | ||||||
|  | 		  temp_iState_bed = constrain(temp_iState_bed, temp_iState_min_bed, temp_iState_max_bed); | ||||||
|  | 		  iTerm_bed = bedKi * temp_iState_bed; | ||||||
|  |  | ||||||
|  | 		  //K1 defined in Configuration.h in the PID settings | ||||||
|  | 		  #define K2 (1.0-K1) | ||||||
|  | 		  dTerm_bed= (bedKd * (pid_input - temp_dState_bed))*K2 + (K1 * dTerm_bed); | ||||||
|  | 		  temp_dState_bed = pid_input; | ||||||
|  |  | ||||||
|  | 		  pid_output = constrain(pTerm_bed + iTerm_bed - dTerm_bed, 0, MAX_BED_POWER); | ||||||
|  |  | ||||||
|  |     #else  | ||||||
|  |       pid_output = constrain(pid_setpoint_bed, 0, MAX_BED_POWER); | ||||||
|  |     #endif //PID_OPENLOOP | ||||||
|  |  | ||||||
|  | 	  if((current_raw_bed > bed_minttemp) && (current_raw_bed < bed_maxttemp))  | ||||||
|  | 	  { | ||||||
|  | 	    soft_pwm_bed = (int)pid_output >> 1; | ||||||
|  | 	  } | ||||||
|  | 	  else { | ||||||
|  | 	    soft_pwm_bed = 0; | ||||||
|  | 	  } | ||||||
|  |  | ||||||
|  |     #elif not defined BED_LIMIT_SWITCHING | ||||||
|       // Check if temperature is within the correct range |       // Check if temperature is within the correct range | ||||||
|       if((current_raw_bed > bed_minttemp) && (current_raw_bed < bed_maxttemp)) { |       if((current_raw_bed > bed_minttemp) && (current_raw_bed < bed_maxttemp)) { | ||||||
|         if(current_raw_bed >= target_raw_bed) |         if(current_raw_bed >= target_raw_bed) | ||||||
|         { |         { | ||||||
|           WRITE(HEATER_BED_PIN,LOW); | 					soft_pwm_bed = 0; | ||||||
|         } |         } | ||||||
|         else  |         else  | ||||||
|         { |         { | ||||||
|           #ifdef HEATER_BED_DUTY_CYCLE_DIVIDER | 					soft_pwm_bed = MAX_BED_POWER>>1; | ||||||
|           bed_needs_heating=1; |  | ||||||
|           #endif |  | ||||||
|           WRITE(HEATER_BED_PIN,HIGH); |  | ||||||
|         } |         } | ||||||
|       } |       } | ||||||
|       else { |       else { | ||||||
|  | 					soft_pwm_bed = 0; | ||||||
|         WRITE(HEATER_BED_PIN,LOW); |         WRITE(HEATER_BED_PIN,LOW); | ||||||
|       } |       } | ||||||
|     #else //#ifdef BED_LIMIT_SWITCHING |     #else //#ifdef BED_LIMIT_SWITCHING | ||||||
| @@ -381,18 +458,16 @@ void manage_heater() | |||||||
|       if((current_raw_bed > bed_minttemp) && (current_raw_bed < bed_maxttemp)) { |       if((current_raw_bed > bed_minttemp) && (current_raw_bed < bed_maxttemp)) { | ||||||
|         if(current_raw_bed > target_bed_high_temp) |         if(current_raw_bed > target_bed_high_temp) | ||||||
|         { |         { | ||||||
|           WRITE(HEATER_BED_PIN,LOW); | 					soft_pwm_bed = 0; | ||||||
|         } |         } | ||||||
|         else  |         else  | ||||||
|           if(current_raw_bed <= target_bed_low_temp) |           if(current_raw_bed <= target_bed_low_temp) | ||||||
|         { |         { | ||||||
|           #ifdef HEATER_BED_DUTY_CYCLE_DIVIDER | 					soft_pwm_bed = MAX_BED_POWER>>1; | ||||||
|           bed_needs_heating=1; |  | ||||||
|           #endif |  | ||||||
|           WRITE(HEATER_BED_PIN,HIGH); |  | ||||||
|         } |         } | ||||||
|       } |       } | ||||||
|       else { |       else { | ||||||
|  | 					soft_pwm_bed = 0; | ||||||
|         WRITE(HEATER_BED_PIN,LOW); |         WRITE(HEATER_BED_PIN,LOW); | ||||||
|       } |       } | ||||||
|     #endif |     #endif | ||||||
| @@ -568,6 +643,10 @@ void tp_init() | |||||||
|     temp_iState_min[e] = 0.0; |     temp_iState_min[e] = 0.0; | ||||||
|     temp_iState_max[e] = PID_INTEGRAL_DRIVE_MAX / Ki; |     temp_iState_max[e] = PID_INTEGRAL_DRIVE_MAX / Ki; | ||||||
| #endif //PIDTEMP | #endif //PIDTEMP | ||||||
|  | #ifdef PIDTEMPBED | ||||||
|  |     temp_iState_min_bed = 0.0; | ||||||
|  |     temp_iState_max_bed = PID_INTEGRAL_DRIVE_MAX / bedKi; | ||||||
|  | #endif //PIDTEMPBED | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   #if (HEATER_0_PIN > -1)  |   #if (HEATER_0_PIN > -1)  | ||||||
| @@ -728,6 +807,7 @@ void disable_heater() | |||||||
|  |  | ||||||
|   #if TEMP_BED_PIN > -1 |   #if TEMP_BED_PIN > -1 | ||||||
|     target_raw_bed=0; |     target_raw_bed=0; | ||||||
|  |     soft_pwm_bed=0; | ||||||
|     #if HEATER_BED_PIN > -1   |     #if HEATER_BED_PIN > -1   | ||||||
|       WRITE(HEATER_BED_PIN,LOW); |       WRITE(HEATER_BED_PIN,LOW); | ||||||
|     #endif |     #endif | ||||||
| @@ -832,6 +912,7 @@ ISR(TIMER0_COMPB_vect) | |||||||
|   static unsigned char soft_pwm_0; |   static unsigned char soft_pwm_0; | ||||||
|   static unsigned char soft_pwm_1; |   static unsigned char soft_pwm_1; | ||||||
|   static unsigned char soft_pwm_2; |   static unsigned char soft_pwm_2; | ||||||
|  |   static unsigned char soft_pwm_b; | ||||||
|    |    | ||||||
|   if(pwm_count == 0){ |   if(pwm_count == 0){ | ||||||
|     soft_pwm_0 = soft_pwm[0]; |     soft_pwm_0 = soft_pwm[0]; | ||||||
| @@ -844,6 +925,10 @@ ISR(TIMER0_COMPB_vect) | |||||||
|     soft_pwm_2 = soft_pwm[2]; |     soft_pwm_2 = soft_pwm[2]; | ||||||
|     if(soft_pwm_2 > 0) WRITE(HEATER_2_PIN,1); |     if(soft_pwm_2 > 0) WRITE(HEATER_2_PIN,1); | ||||||
|     #endif |     #endif | ||||||
|  |     #if HEATER_BED_PIN > -1 | ||||||
|  |     soft_pwm_b = soft_pwm_bed; | ||||||
|  |     if(soft_pwm_b > 0) WRITE(HEATER_BED_PIN,1); | ||||||
|  |     #endif | ||||||
|   } |   } | ||||||
|   if(soft_pwm_0 <= pwm_count) WRITE(HEATER_0_PIN,0); |   if(soft_pwm_0 <= pwm_count) WRITE(HEATER_0_PIN,0); | ||||||
|   #if EXTRUDERS > 1 |   #if EXTRUDERS > 1 | ||||||
| @@ -852,6 +937,9 @@ ISR(TIMER0_COMPB_vect) | |||||||
|   #if EXTRUDERS > 2 |   #if EXTRUDERS > 2 | ||||||
|   if(soft_pwm_2 <= pwm_count) WRITE(HEATER_2_PIN,0); |   if(soft_pwm_2 <= pwm_count) WRITE(HEATER_2_PIN,0); | ||||||
|   #endif |   #endif | ||||||
|  |   #if HEATER_BED_PIN > -1 | ||||||
|  |   if(soft_pwm_b <= pwm_count) WRITE(HEATER_BED_PIN,0); | ||||||
|  |   #endif | ||||||
|    |    | ||||||
|   pwm_count++; |   pwm_count++; | ||||||
|   pwm_count &= 0x7f; |   pwm_count &= 0x7f; | ||||||
| @@ -885,6 +973,8 @@ ISR(TIMER0_COMPB_vect) | |||||||
|       #if (TEMP_BED_PIN > -1) |       #if (TEMP_BED_PIN > -1) | ||||||
|         #if TEMP_BED_PIN > 7 |         #if TEMP_BED_PIN > 7 | ||||||
|           ADCSRB = 1<<MUX5; |           ADCSRB = 1<<MUX5; | ||||||
|  |         #else | ||||||
|  |           ADCSRB = 0; | ||||||
|         #endif |         #endif | ||||||
|         ADMUX = ((1 << REFS0) | (TEMP_BED_PIN & 0x07)); |         ADMUX = ((1 << REFS0) | (TEMP_BED_PIN & 0x07)); | ||||||
|         ADCSRA |= 1<<ADSC; // Start conversion |         ADCSRA |= 1<<ADSC; // Start conversion | ||||||
|   | |||||||
| @@ -46,11 +46,15 @@ extern int current_raw_bed; | |||||||
|   extern int target_bed_low_temp ;   |   extern int target_bed_low_temp ;   | ||||||
|   extern int target_bed_high_temp ; |   extern int target_bed_high_temp ; | ||||||
| #endif | #endif | ||||||
| extern float Kp,Ki,Kd,Kc; |  | ||||||
|  |  | ||||||
| #ifdef PIDTEMP | #ifdef PIDTEMP | ||||||
|  |   extern float Kp,Ki,Kd,Kc; | ||||||
|   extern float pid_setpoint[EXTRUDERS]; |   extern float pid_setpoint[EXTRUDERS]; | ||||||
| #endif | #endif | ||||||
|  | #ifdef PIDTEMPBED | ||||||
|  |   extern float bedKp,bedKi,bedKd; | ||||||
|  |   extern float pid_setpoint_bed; | ||||||
|  | #endif | ||||||
|    |    | ||||||
| // #ifdef WATCHPERIOD | // #ifdef WATCHPERIOD | ||||||
|   extern int watch_raw[EXTRUDERS] ; |   extern int watch_raw[EXTRUDERS] ; | ||||||
| @@ -88,7 +92,9 @@ FORCE_INLINE void setTargetHotend(const float &celsius, uint8_t extruder) { | |||||||
| FORCE_INLINE void setTargetBed(const float &celsius) {   | FORCE_INLINE void setTargetBed(const float &celsius) {   | ||||||
|    |    | ||||||
|   target_raw_bed = temp2analogBed(celsius); |   target_raw_bed = temp2analogBed(celsius); | ||||||
|   #ifdef BED_LIMIT_SWITCHING | 	#ifdef PIDTEMPBED | ||||||
|  |   pid_setpoint_bed = celsius; | ||||||
|  |   #elif defined BED_LIMIT_SWITCHING | ||||||
|     if(celsius>BED_HYSTERESIS) |     if(celsius>BED_HYSTERESIS) | ||||||
|     { |     { | ||||||
|     target_bed_low_temp= temp2analogBed(celsius-BED_HYSTERESIS); |     target_bed_low_temp= temp2analogBed(celsius-BED_HYSTERESIS); | ||||||
| @@ -163,7 +169,7 @@ FORCE_INLINE void autotempShutdown(){ | |||||||
|  #endif |  #endif | ||||||
| } | } | ||||||
|  |  | ||||||
| void PID_autotune(float temp); | void PID_autotune(float temp, int extruder, int ncycles); | ||||||
|  |  | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|   | |||||||
| @@ -419,7 +419,7 @@ const short temptable_52[][2] PROGMEM = { | |||||||
| // Verified by linagee. Source: http://shop.arcol.hu/static/datasheets/thermistors.pdf | // Verified by linagee. Source: http://shop.arcol.hu/static/datasheets/thermistors.pdf | ||||||
| // Calculated using 1kohm pullup, voltage divider math, and manufacturer provided temp/resistance | // Calculated using 1kohm pullup, voltage divider math, and manufacturer provided temp/resistance | ||||||
| // Advantage: More resolution and better linearity from 150C to 200C | // Advantage: More resolution and better linearity from 150C to 200C | ||||||
| const short temptable_52[][2] PROGMEM = { | const short temptable_55[][2] PROGMEM = { | ||||||
|    {1*OVERSAMPLENR, 500}, |    {1*OVERSAMPLENR, 500}, | ||||||
|    {76*OVERSAMPLENR, 300}, |    {76*OVERSAMPLENR, 300}, | ||||||
|    {87*OVERSAMPLENR, 290}, |    {87*OVERSAMPLENR, 290}, | ||||||
|   | |||||||
| @@ -2,7 +2,12 @@ | |||||||
| #define ULTRALCD_H | #define ULTRALCD_H | ||||||
| #include "Marlin.h" | #include "Marlin.h" | ||||||
| #ifdef ULTRA_LCD | #ifdef ULTRA_LCD | ||||||
|   #include <LiquidCrystal.h> | #include "language.h" | ||||||
|  | #if LANGUAGE_CHOICE == 6 | ||||||
|  | #include "LiquidCrystalRus.h" | ||||||
|  | #else | ||||||
|  | #include <LiquidCrystal.h> | ||||||
|  | #endif | ||||||
|   void lcd_status(); |   void lcd_status(); | ||||||
|   void lcd_init(); |   void lcd_init(); | ||||||
|   void lcd_status(const char* message); |   void lcd_status(const char* message); | ||||||
| @@ -12,7 +17,11 @@ | |||||||
|  |  | ||||||
|   #define LCD_UPDATE_INTERVAL 100 |   #define LCD_UPDATE_INTERVAL 100 | ||||||
|   #define STATUSTIMEOUT 15000 |   #define STATUSTIMEOUT 15000 | ||||||
|  | #if LANGUAGE_CHOICE == 6 | ||||||
|  |   extern LiquidCrystalRus lcd; | ||||||
|  | #else | ||||||
|   extern LiquidCrystal lcd; |   extern LiquidCrystal lcd; | ||||||
|  | #endif | ||||||
|   extern volatile char buttons;  //the last checked buttons in a bit array. |   extern volatile char buttons;  //the last checked buttons in a bit array. | ||||||
|    |    | ||||||
|   #ifdef NEWPANEL |   #ifdef NEWPANEL | ||||||
| @@ -46,12 +55,14 @@ | |||||||
|     #define BLOCK {blocking[BL_MI]=millis()+blocktime;blocking[BL_ST]=millis()+blocktime;} |     #define BLOCK {blocking[BL_MI]=millis()+blocktime;blocking[BL_ST]=millis()+blocktime;} | ||||||
|      |      | ||||||
|   #endif |   #endif | ||||||
|  |  | ||||||
|  |  | ||||||
|      |      | ||||||
|   // blocking time for recognizing a new keypress of one key, ms |   // blocking time for recognizing a new keypress of one key, ms | ||||||
|   #define blocktime 500 |   #define blocktime 500 | ||||||
|   #define lcdslow 5 |   #define lcdslow 5 | ||||||
|      |      | ||||||
|   enum MainStatus{Main_Status, Main_Menu, Main_Prepare,Sub_PrepareMove, Main_Control, Main_SD,Sub_TempControl,Sub_MotionControl,Sub_RetractControl}; |   enum MainStatus{Main_Status, Main_Menu, Main_Prepare,Sub_PrepareMove, Main_Control, Main_SD,Sub_TempControl,Sub_MotionControl,Sub_RetractControl, Sub_PreheatPLASettings, Sub_PreheatABSSettings}; | ||||||
|  |  | ||||||
|   class MainMenu{ |   class MainMenu{ | ||||||
|   public: |   public: | ||||||
| @@ -71,6 +82,8 @@ | |||||||
|     void showControlRetract(); |     void showControlRetract(); | ||||||
|     void showAxisMove(); |     void showAxisMove(); | ||||||
|     void showSD(); |     void showSD(); | ||||||
|  | 	void showPLAsettings(); | ||||||
|  | 	void showABSsettings(); | ||||||
|     bool force_lcd_update; |     bool force_lcd_update; | ||||||
|     long lastencoderpos; |     long lastencoderpos; | ||||||
|     int8_t lineoffset; |     int8_t lineoffset; | ||||||
| @@ -140,12 +153,14 @@ | |||||||
|   #define LCD_INIT lcd_init(); |   #define LCD_INIT lcd_init(); | ||||||
|   #define LCD_MESSAGE(x) lcd_status(x); |   #define LCD_MESSAGE(x) lcd_status(x); | ||||||
|   #define LCD_MESSAGEPGM(x) lcd_statuspgm(MYPGM(x)); |   #define LCD_MESSAGEPGM(x) lcd_statuspgm(MYPGM(x)); | ||||||
|  |   #define LCD_ALERTMESSAGEPGM(x) lcd_alertstatuspgm(MYPGM(x)); | ||||||
|   #define LCD_STATUS lcd_status() |   #define LCD_STATUS lcd_status() | ||||||
| #else //no lcd | #else //no lcd | ||||||
|   #define LCD_INIT |   #define LCD_INIT | ||||||
|   #define LCD_STATUS |   #define LCD_STATUS | ||||||
|   #define LCD_MESSAGE(x) |   #define LCD_MESSAGE(x) | ||||||
|   #define LCD_MESSAGEPGM(x) |   #define LCD_MESSAGEPGM(x) | ||||||
|  |   #define LCD_ALERTMESSAGEPGM(x) | ||||||
|   FORCE_INLINE void lcd_status() {}; |   FORCE_INLINE void lcd_status() {}; | ||||||
|  |  | ||||||
|   #define CLICKED false |   #define CLICKED false | ||||||
| @@ -153,6 +168,7 @@ | |||||||
| #endif  | #endif  | ||||||
|    |    | ||||||
| void lcd_statuspgm(const char* message); | void lcd_statuspgm(const char* message); | ||||||
|  | void lcd_alertstatuspgm(const char* message); | ||||||
|    |    | ||||||
| char *ftostr3(const float &x); | char *ftostr3(const float &x); | ||||||
| char *itostr2(const uint8_t &x); | char *itostr2(const uint8_t &x); | ||||||
|   | |||||||
| @@ -6,7 +6,11 @@ | |||||||
| #include "language.h" | #include "language.h" | ||||||
| #include "temperature.h" | #include "temperature.h" | ||||||
| #include "EEPROMwrite.h" | #include "EEPROMwrite.h" | ||||||
|  | #if LANGUAGE_CHOICE == 6 | ||||||
|  | #include "LiquidCrystalRus.h" | ||||||
|  | #else | ||||||
| #include <LiquidCrystal.h> | #include <LiquidCrystal.h> | ||||||
|  | #endif | ||||||
| //=========================================================================== | //=========================================================================== | ||||||
| //=============================imported variables============================ | //=============================imported variables============================ | ||||||
| //=========================================================================== | //=========================================================================== | ||||||
| @@ -38,7 +42,11 @@ static char messagetext[LCD_WIDTH]=""; | |||||||
| //return for string conversion routines | //return for string conversion routines | ||||||
| static char conv[8]; | static char conv[8]; | ||||||
|  |  | ||||||
|  | #if LANGUAGE_CHOICE == 6 | ||||||
|  | LiquidCrystalRus lcd(LCD_PINS_RS, LCD_PINS_ENABLE, LCD_PINS_D4, LCD_PINS_D5,LCD_PINS_D6,LCD_PINS_D7);  //RS,Enable,D4,D5,D6,D7 | ||||||
|  | #else | ||||||
| LiquidCrystal lcd(LCD_PINS_RS, LCD_PINS_ENABLE, LCD_PINS_D4, LCD_PINS_D5,LCD_PINS_D6,LCD_PINS_D7);  //RS,Enable,D4,D5,D6,D7  | LiquidCrystal lcd(LCD_PINS_RS, LCD_PINS_ENABLE, LCD_PINS_D4, LCD_PINS_D5,LCD_PINS_D6,LCD_PINS_D7);  //RS,Enable,D4,D5,D6,D7  | ||||||
|  | #endif | ||||||
|  |  | ||||||
| static unsigned long previous_millis_lcd=0; | static unsigned long previous_millis_lcd=0; | ||||||
| //static long previous_millis_buttons=0; | //static long previous_millis_buttons=0; | ||||||
| @@ -92,6 +100,12 @@ void lcd_statuspgm(const char* message) | |||||||
|   *target=0; |   *target=0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | void lcd_alertstatuspgm(const char* message) | ||||||
|  | { | ||||||
|  |   lcd_statuspgm(message);  | ||||||
|  |   menu.showStatus();  | ||||||
|  | } | ||||||
|  |  | ||||||
| FORCE_INLINE void clear() | FORCE_INLINE void clear() | ||||||
| { | { | ||||||
|   lcd.clear(); |   lcd.clear(); | ||||||
| @@ -127,9 +141,36 @@ void lcd_init() | |||||||
|     B10001, |     B10001, | ||||||
|     B01110 |     B01110 | ||||||
|   }; |   }; | ||||||
|   byte uplevel[8]={0x04, 0x0e, 0x1f, 0x04, 0x1c, 0x00, 0x00, 0x00};//thanks joris |   byte uplevel[8]={ | ||||||
|   byte refresh[8]={0x00, 0x06, 0x19, 0x18, 0x03, 0x13, 0x0c, 0x00}; //thanks joris |     B00100, | ||||||
|   byte folder [8]={0x00, 0x1c, 0x1f, 0x11, 0x11, 0x1f, 0x00, 0x00}; //thanks joris |     B01110, | ||||||
|  |     B11111, | ||||||
|  |     B00100, | ||||||
|  |     B11100, | ||||||
|  |     B00000, | ||||||
|  |     B00000, | ||||||
|  |     B00000 | ||||||
|  |   }; //thanks joris | ||||||
|  |   byte refresh[8]={ | ||||||
|  |     B00000, | ||||||
|  |     B00110, | ||||||
|  |     B11001, | ||||||
|  |     B11000, | ||||||
|  |     B00011, | ||||||
|  |     B10011, | ||||||
|  |     B01100, | ||||||
|  |     B00000, | ||||||
|  |   }; //thanks joris | ||||||
|  |   byte folder [8]={ | ||||||
|  |     B00000, | ||||||
|  |     B11100, | ||||||
|  |     B11111, | ||||||
|  |     B10001, | ||||||
|  |     B10001, | ||||||
|  |     B11111, | ||||||
|  |     B00000, | ||||||
|  |     B00000 | ||||||
|  |   }; //thanks joris | ||||||
|   lcd.begin(LCD_WIDTH, LCD_HEIGHT); |   lcd.begin(LCD_WIDTH, LCD_HEIGHT); | ||||||
|   lcd.createChar(1,Degree); |   lcd.createChar(1,Degree); | ||||||
|   lcd.createChar(2,Thermometer); |   lcd.createChar(2,Thermometer); | ||||||
| @@ -325,11 +366,11 @@ void MainMenu::showStatus() | |||||||
|   { |   { | ||||||
|     encoderpos=feedmultiply; |     encoderpos=feedmultiply; | ||||||
|     clear(); |     clear(); | ||||||
|     lcd.setCursor(0,0);lcdprintPGM("\002---/---\001 "); |     lcd.setCursor(0,0);lcdprintPGM("\002000/000\001 "); | ||||||
|     #if defined BED_USES_THERMISTOR || defined BED_USES_AD595  |     #if defined BED_USES_THERMISTOR || defined BED_USES_AD595  | ||||||
|       lcd.setCursor(10,0);lcdprintPGM("B---/---\001 "); |       lcd.setCursor(10,0);lcdprintPGM("B000/000\001 "); | ||||||
|     #elif EXTRUDERS > 1 |     #elif EXTRUDERS > 1 | ||||||
|       lcd.setCursor(10,0);lcdprintPGM("\002---/---\001 "); |       lcd.setCursor(10,0);lcdprintPGM("\002000/000\001 "); | ||||||
|     #endif |     #endif | ||||||
|   } |   } | ||||||
|      |      | ||||||
| @@ -528,16 +569,18 @@ void MainMenu::showPrepare() | |||||||
|       MENUITEM(  lcdprintPGM(MSG_SET_ORIGIN)  ,  BLOCK;enquecommand("G92 X0 Y0 Z0");beepshort(); ) ; |       MENUITEM(  lcdprintPGM(MSG_SET_ORIGIN)  ,  BLOCK;enquecommand("G92 X0 Y0 Z0");beepshort(); ) ; | ||||||
|       break; |       break; | ||||||
|     case ItemP_preheat_pla: |     case ItemP_preheat_pla: | ||||||
|       MENUITEM(  lcdprintPGM(MSG_PREHEAT_PLA)  ,  BLOCK;setTargetHotend0(PLA_PREHEAT_HOTEND_TEMP);setTargetBed(PLA_PREHEAT_HPB_TEMP); | 		MENUITEM(  lcdprintPGM(MSG_PREHEAT_PLA)  ,  BLOCK;setTargetHotend0(plaPreheatHotendTemp);setTargetBed(plaPreheatHPBTemp); | ||||||
|       #if FAN_PIN > -1 |       #if FAN_PIN > -1 | ||||||
|         analogWrite(FAN_PIN, PLA_PREHEAT_FAN_SPEED); | 		FanSpeed = plaPreheatFanSpeed; | ||||||
|  |         analogWrite(FAN_PIN,  FanSpeed); | ||||||
|       #endif |       #endif | ||||||
|       beepshort(); ); |       beepshort(); ); | ||||||
|       break; |       break; | ||||||
|     case ItemP_preheat_abs: |     case ItemP_preheat_abs: | ||||||
|       MENUITEM(  lcdprintPGM(MSG_PREHEAT_ABS)  ,  BLOCK;setTargetHotend0(ABS_PREHEAT_HOTEND_TEMP);setTargetBed(ABS_PREHEAT_HPB_TEMP);  |       MENUITEM(  lcdprintPGM(MSG_PREHEAT_ABS)  ,  BLOCK;setTargetHotend0(absPreheatHotendTemp);setTargetBed(absPreheatHPBTemp);  | ||||||
|       #if FAN_PIN > -1 |       #if FAN_PIN > -1 | ||||||
|         analogWrite(FAN_PIN, ABS_PREHEAT_FAN_SPEED); | 	  	FanSpeed = absPreheatFanSpeed; | ||||||
|  |         analogWrite(FAN_PIN,  FanSpeed); | ||||||
|       #endif |       #endif | ||||||
|       beepshort(); ); |       beepshort(); ); | ||||||
|       break; |       break; | ||||||
| @@ -787,7 +830,7 @@ void MainMenu::showTune() | |||||||
|         { |         { | ||||||
|           lcd.setCursor(0,line);lcdprintPGM(MSG_NOZZLE); |           lcd.setCursor(0,line);lcdprintPGM(MSG_NOZZLE); | ||||||
|           lcd.setCursor(13,line);lcd.print(ftostr3(intround(degTargetHotend0()))); |           lcd.setCursor(13,line);lcd.print(ftostr3(intround(degTargetHotend0()))); | ||||||
|         } |         }  | ||||||
|          |          | ||||||
|         if((activeline!=line) ) |         if((activeline!=line) ) | ||||||
|           break; |           break; | ||||||
| @@ -965,7 +1008,9 @@ enum { | |||||||
| ItemCT_bed, | ItemCT_bed, | ||||||
| #endif   | #endif   | ||||||
|   ItemCT_fan, |   ItemCT_fan, | ||||||
|   ItemCT_PID_P,ItemCT_PID_I,ItemCT_PID_D,ItemCT_PID_C |   ItemCT_PID_P,ItemCT_PID_I,ItemCT_PID_D,ItemCT_PID_C, | ||||||
|  |   ItemCT_PLA_PreHeat_Setting,  | ||||||
|  |   ItemCT_ABS_PreHeat_Setting, | ||||||
| }; | }; | ||||||
|  |  | ||||||
| void MainMenu::showControlTemp() | void MainMenu::showControlTemp() | ||||||
| @@ -1432,16 +1477,19 @@ void MainMenu::showControlTemp() | |||||||
|       #endif |       #endif | ||||||
|     #endif |     #endif | ||||||
|       break; |       break; | ||||||
|  | 	  case ItemCT_PLA_PreHeat_Setting: | ||||||
|  |         MENUITEM(  lcdprintPGM(MSG_PREHEAT_PLA_SETTINGS)  ,  BLOCK;status=Sub_PreheatPLASettings;beepshort(); ) ; | ||||||
|  | 	  break; | ||||||
|  | 	  case ItemCT_ABS_PreHeat_Setting: | ||||||
|  |         MENUITEM(  lcdprintPGM(MSG_PREHEAT_ABS_SETTINGS)  ,  BLOCK;status=Sub_PreheatABSSettings;beepshort(); ) ; | ||||||
|  | 	  break; | ||||||
|     default:    |     default:    | ||||||
|       break; |       break; | ||||||
|   } |   } | ||||||
|   line++; |   line++; | ||||||
|  } |  } | ||||||
|  #ifdef PID_ADD_EXTRUSION_RATE |  | ||||||
|   updateActiveLines(ItemCT_PID_C,encoderpos); |   updateActiveLines(ItemCT_ABS_PreHeat_Setting,encoderpos); | ||||||
|  #else |  | ||||||
|   updateActiveLines(ItemCT_PID_D,encoderpos); |  | ||||||
|  #endif |  | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -1809,7 +1857,7 @@ void MainMenu::showControlMotion() | |||||||
|       if(force_lcd_update) |       if(force_lcd_update) | ||||||
|         { |         { | ||||||
|           lcd.setCursor(0,line);lcdprintPGM(MSG_ZSTEPS); |           lcd.setCursor(0,line);lcdprintPGM(MSG_ZSTEPS); | ||||||
|           lcd.setCursor(11,line);lcd.print(ftostr52(axis_steps_per_unit[Z_AXIS])); |           lcd.setCursor(11,line);lcd.print(ftostr51(axis_steps_per_unit[Z_AXIS])); | ||||||
|         } |         } | ||||||
|          |          | ||||||
|         if((activeline!=line) ) |         if((activeline!=line) ) | ||||||
| @@ -1848,7 +1896,7 @@ void MainMenu::showControlMotion() | |||||||
|       if(force_lcd_update) |       if(force_lcd_update) | ||||||
|         { |         { | ||||||
|           lcd.setCursor(0,line);lcdprintPGM(MSG_ESTEPS); |           lcd.setCursor(0,line);lcdprintPGM(MSG_ESTEPS); | ||||||
|           lcd.setCursor(11,line);lcd.print(ftostr52(axis_steps_per_unit[E_AXIS])); |           lcd.setCursor(11,line);lcd.print(ftostr51(axis_steps_per_unit[E_AXIS])); | ||||||
|         } |         } | ||||||
|          |          | ||||||
|         if((activeline!=line) ) |         if((activeline!=line) ) | ||||||
| @@ -2297,7 +2345,15 @@ void MainMenu::showSD() | |||||||
|           //Serial.print("Filenr:");Serial.println(i-2); |           //Serial.print("Filenr:");Serial.println(i-2); | ||||||
|           lcd.setCursor(0,line);lcdprintPGM(" "); |           lcd.setCursor(0,line);lcdprintPGM(" "); | ||||||
|           if(card.filenameIsDir) lcd.print("\005"); |           if(card.filenameIsDir) lcd.print("\005"); | ||||||
|           lcd.print(card.filename); |           if (card.longFilename[0]) | ||||||
|  |           { | ||||||
|  |             card.longFilename[LCD_WIDTH-1] = '\0'; | ||||||
|  |             lcd.print(card.longFilename); | ||||||
|  |           } | ||||||
|  |           else | ||||||
|  |           { | ||||||
|  |             lcd.print(card.filename); | ||||||
|  |           } | ||||||
|         } |         } | ||||||
|         if((activeline==line) && CLICKED) |         if((activeline==line) && CLICKED) | ||||||
|         { |         { | ||||||
| @@ -2322,7 +2378,15 @@ void MainMenu::showSD() | |||||||
|             enquecommand("M24"); |             enquecommand("M24"); | ||||||
|             beep();  |             beep();  | ||||||
|             status=Main_Status; |             status=Main_Status; | ||||||
|             lcd_status(card.filename); |             if (card.longFilename[0]) | ||||||
|  |             { | ||||||
|  |               card.longFilename[LCD_WIDTH-1] = '\0'; | ||||||
|  |               lcd_status(card.longFilename); | ||||||
|  |             } | ||||||
|  |             else | ||||||
|  |             { | ||||||
|  |               lcd_status(card.filename); | ||||||
|  |             } | ||||||
|           } |           } | ||||||
|         }  |         }  | ||||||
|       } |       } | ||||||
| @@ -2567,6 +2631,14 @@ void MainMenu::update() | |||||||
|       { |       { | ||||||
|         showSD(); |         showSD(); | ||||||
|       }break; |       }break; | ||||||
|  | 	  case Sub_PreheatPLASettings:  | ||||||
|  |       { | ||||||
|  |         showPLAsettings(); | ||||||
|  |       }break; | ||||||
|  | 	  case Sub_PreheatABSSettings:  | ||||||
|  |       { | ||||||
|  |         showABSsettings(); | ||||||
|  |       }break; | ||||||
|   } |   } | ||||||
|    |    | ||||||
|   if(timeoutToStatus<millis()) |   if(timeoutToStatus<millis()) | ||||||
| @@ -2575,11 +2647,299 @@ void MainMenu::update() | |||||||
|   lastencoderpos=encoderpos; |   lastencoderpos=encoderpos; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | enum { | ||||||
|  | 	ItemPLAPreHeat_Exit,  | ||||||
|  | 	ItemPLAPreHeat_set_PLA_FanSpeed,  | ||||||
|  | 	ItemPLAPreHeat_set_nozzle,  | ||||||
|  | 	ItemPLAPreHeat_set_HPB, | ||||||
|  | 	ItemPLAPreHeat_Store_Eprom | ||||||
|  | 	}; | ||||||
|  |    | ||||||
|  | void MainMenu::showPLAsettings() | ||||||
|  | { | ||||||
|  | #ifdef ULTIPANEL | ||||||
|  |  uint8_t line=0; | ||||||
|  |  clearIfNecessary(); | ||||||
|  |  for(int8_t i=lineoffset;i<lineoffset+LCD_HEIGHT;i++) | ||||||
|  |  { | ||||||
|  |   switch(i) | ||||||
|  |   { | ||||||
|  |  | ||||||
|  | 	case ItemPLAPreHeat_Exit: | ||||||
|  |       MENUITEM(  lcdprintPGM(MSG_TEMPERATURE_RTN)  ,  BLOCK;status=Sub_TempControl;beepshort(); ) ; | ||||||
|  |       break; | ||||||
|  |  | ||||||
|  |     case ItemPLAPreHeat_set_PLA_FanSpeed: | ||||||
|  |        { | ||||||
|  |         if(force_lcd_update) | ||||||
|  |         { | ||||||
|  |           lcd.setCursor(0,line);lcdprintPGM(MSG_FAN_SPEED); | ||||||
|  |           lcd.setCursor(13,line);lcd.print(ftostr3(plaPreheatFanSpeed)); | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         if((activeline!=line) ) | ||||||
|  |           break; | ||||||
|  |          | ||||||
|  |         if(CLICKED)  | ||||||
|  |         { | ||||||
|  |           linechanging=!linechanging; | ||||||
|  |           if(linechanging) | ||||||
|  |           { | ||||||
|  | 			  encoderpos=plaPreheatFanSpeed; | ||||||
|  |           } | ||||||
|  |           else | ||||||
|  |           { | ||||||
|  |             encoderpos=activeline*lcdslow; | ||||||
|  |             beepshort(); | ||||||
|  |           } | ||||||
|  |           BLOCK; | ||||||
|  |         } | ||||||
|  |         if(linechanging) | ||||||
|  |         { | ||||||
|  |           if(encoderpos<0) encoderpos=0; | ||||||
|  |           if(encoderpos>255) encoderpos=255; | ||||||
|  |           plaPreheatFanSpeed=encoderpos; | ||||||
|  |           lcd.setCursor(13,line);lcd.print(itostr3(encoderpos)); | ||||||
|  |         } | ||||||
|  |       }break; | ||||||
|  |  | ||||||
|  |     case ItemPLAPreHeat_set_nozzle: | ||||||
|  |       { | ||||||
|  |         if(force_lcd_update) | ||||||
|  |         { | ||||||
|  |           lcd.setCursor(0,line);lcdprintPGM(MSG_NOZZLE); | ||||||
|  |           lcd.setCursor(13,line);lcd.print(ftostr3(plaPreheatHotendTemp)); | ||||||
|  |         }  | ||||||
|  |          | ||||||
|  |         if((activeline!=line) ) | ||||||
|  |           break; | ||||||
|  |          | ||||||
|  |         if(CLICKED) | ||||||
|  |         { | ||||||
|  |           linechanging=!linechanging; | ||||||
|  |           if(linechanging) | ||||||
|  |           { | ||||||
|  |               encoderpos=plaPreheatHotendTemp; | ||||||
|  |           } | ||||||
|  |           else | ||||||
|  |           { | ||||||
|  |             encoderpos=activeline*lcdslow; | ||||||
|  |             beepshort(); | ||||||
|  |           } | ||||||
|  |           BLOCK; | ||||||
|  |         } | ||||||
|  |         if(linechanging) | ||||||
|  |         { | ||||||
|  |           if(encoderpos<0) encoderpos=0; | ||||||
|  |           if(encoderpos>260) encoderpos=260; | ||||||
|  | 		  plaPreheatHotendTemp = encoderpos; | ||||||
|  |           lcd.setCursor(13,line);lcd.print(itostr3(encoderpos)); | ||||||
|  |         } | ||||||
|  |       }break; | ||||||
|  |  | ||||||
|  |     case ItemPLAPreHeat_set_HPB: | ||||||
|  |       { | ||||||
|  |         if(force_lcd_update) | ||||||
|  |         { | ||||||
|  |           lcd.setCursor(0,line);lcdprintPGM(MSG_BED); | ||||||
|  |           lcd.setCursor(13,line);lcd.print(ftostr3(plaPreheatHPBTemp)); | ||||||
|  |         }  | ||||||
|  |          | ||||||
|  |         if((activeline!=line) ) | ||||||
|  |           break; | ||||||
|  |          | ||||||
|  |         if(CLICKED) | ||||||
|  |         { | ||||||
|  |           linechanging=!linechanging; | ||||||
|  |           if(linechanging) | ||||||
|  |           { | ||||||
|  |               encoderpos=plaPreheatHPBTemp; | ||||||
|  |           } | ||||||
|  |           else | ||||||
|  |           { | ||||||
|  |             encoderpos=activeline*lcdslow; | ||||||
|  |             beepshort(); | ||||||
|  |           } | ||||||
|  |           BLOCK; | ||||||
|  |         } | ||||||
|  |         if(linechanging) | ||||||
|  |         { | ||||||
|  |           if(encoderpos<0) encoderpos=0; | ||||||
|  |           if(encoderpos>250) encoderpos=150; | ||||||
|  | 		  plaPreheatHPBTemp = encoderpos; | ||||||
|  |           lcd.setCursor(13,line);lcd.print(itostr3(encoderpos)); | ||||||
|  |         } | ||||||
|  |       }break; | ||||||
|  | 	case ItemPLAPreHeat_Store_Eprom: | ||||||
|  |     { | ||||||
|  |       if(force_lcd_update) | ||||||
|  |       { | ||||||
|  |         lcd.setCursor(0,line);lcdprintPGM(MSG_STORE_EPROM); | ||||||
|  |       } | ||||||
|  |       if((activeline==line) && CLICKED) | ||||||
|  |       { | ||||||
|  |         //enquecommand("M84"); | ||||||
|  |         beepshort(); | ||||||
|  |         BLOCK; | ||||||
|  |         EEPROM_StoreSettings(); | ||||||
|  |       } | ||||||
|  |     }break; | ||||||
|  |       default:    | ||||||
|  |       break; | ||||||
|  |   } | ||||||
|  |   line++; | ||||||
|  |  } | ||||||
|  |  updateActiveLines(ItemPLAPreHeat_Store_Eprom,encoderpos); | ||||||
|  | #endif | ||||||
|  | } | ||||||
|  |  | ||||||
|  | enum { | ||||||
|  | 	ItemABSPreHeat_Exit,  | ||||||
|  | 	ItemABSPreHeat_set_FanSpeed,  | ||||||
|  | 	ItemABSPreHeat_set_nozzle,  | ||||||
|  | 	ItemABSPreHeat_set_HPB, | ||||||
|  | 	ItemABSPreHeat_Store_Eprom | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | void MainMenu::showABSsettings() | ||||||
|  | { | ||||||
|  | #ifdef ULTIPANEL | ||||||
|  |  uint8_t line=0; | ||||||
|  |  clearIfNecessary(); | ||||||
|  |  for(int8_t i=lineoffset;i<lineoffset+LCD_HEIGHT;i++) | ||||||
|  |  { | ||||||
|  |   switch(i) | ||||||
|  |   { | ||||||
|  |  | ||||||
|  | 	case ItemABSPreHeat_Exit: | ||||||
|  |       MENUITEM(  lcdprintPGM(MSG_TEMPERATURE_RTN)  ,  BLOCK;status=Sub_TempControl;beepshort(); ) ; | ||||||
|  |       break; | ||||||
|  |  | ||||||
|  |     case ItemABSPreHeat_set_FanSpeed: | ||||||
|  |        { | ||||||
|  |         if(force_lcd_update) | ||||||
|  |         { | ||||||
|  |           lcd.setCursor(0,line);lcdprintPGM(MSG_FAN_SPEED); | ||||||
|  |           lcd.setCursor(13,line);lcd.print(ftostr3(absPreheatFanSpeed)); | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         if((activeline!=line) ) | ||||||
|  |           break; | ||||||
|  |          | ||||||
|  |         if(CLICKED)  | ||||||
|  |         { | ||||||
|  |           linechanging=!linechanging; | ||||||
|  |           if(linechanging) | ||||||
|  |           { | ||||||
|  | 			  encoderpos=absPreheatFanSpeed; | ||||||
|  |           } | ||||||
|  |           else | ||||||
|  |           { | ||||||
|  |             encoderpos=activeline*lcdslow; | ||||||
|  |             beepshort(); | ||||||
|  |           } | ||||||
|  |           BLOCK; | ||||||
|  |         } | ||||||
|  |         if(linechanging) | ||||||
|  |         { | ||||||
|  |           if(encoderpos<0) encoderpos=0; | ||||||
|  |           if(encoderpos>255) encoderpos=255; | ||||||
|  |           absPreheatFanSpeed=encoderpos; | ||||||
|  |           lcd.setCursor(13,line);lcd.print(itostr3(encoderpos)); | ||||||
|  |         } | ||||||
|  |       }break; | ||||||
|  |  | ||||||
|  |     case ItemABSPreHeat_set_nozzle: | ||||||
|  |       { | ||||||
|  |         if(force_lcd_update) | ||||||
|  |         { | ||||||
|  |           lcd.setCursor(0,line);lcdprintPGM(MSG_NOZZLE); | ||||||
|  |           lcd.setCursor(13,line);lcd.print(ftostr3(absPreheatHotendTemp)); | ||||||
|  |         }  | ||||||
|  |          | ||||||
|  |         if((activeline!=line) ) | ||||||
|  |           break; | ||||||
|  |          | ||||||
|  |         if(CLICKED) | ||||||
|  |         { | ||||||
|  |           linechanging=!linechanging; | ||||||
|  |           if(linechanging) | ||||||
|  |           { | ||||||
|  |               encoderpos=absPreheatHotendTemp; | ||||||
|  |           } | ||||||
|  |           else | ||||||
|  |           { | ||||||
|  |             encoderpos=activeline*lcdslow; | ||||||
|  |             beepshort(); | ||||||
|  |           } | ||||||
|  |           BLOCK; | ||||||
|  |         } | ||||||
|  |         if(linechanging) | ||||||
|  |         { | ||||||
|  |           if(encoderpos<0) encoderpos=0; | ||||||
|  |           if(encoderpos>260) encoderpos=260; | ||||||
|  | 		  absPreheatHotendTemp = encoderpos; | ||||||
|  |           lcd.setCursor(13,line);lcd.print(itostr3(encoderpos)); | ||||||
|  |         } | ||||||
|  |       }break; | ||||||
|  |  | ||||||
|  |     case ItemABSPreHeat_set_HPB: | ||||||
|  |       { | ||||||
|  |         if(force_lcd_update) | ||||||
|  |         { | ||||||
|  |           lcd.setCursor(0,line);lcdprintPGM(MSG_BED); | ||||||
|  |           lcd.setCursor(13,line);lcd.print(ftostr3(absPreheatHPBTemp)); | ||||||
|  |         }  | ||||||
|  |          | ||||||
|  |         if((activeline!=line) ) | ||||||
|  |           break; | ||||||
|  |          | ||||||
|  |         if(CLICKED) | ||||||
|  |         { | ||||||
|  |           linechanging=!linechanging; | ||||||
|  |           if(linechanging) | ||||||
|  |           { | ||||||
|  |               encoderpos=absPreheatHPBTemp; | ||||||
|  |           } | ||||||
|  |           else | ||||||
|  |           { | ||||||
|  |             encoderpos=activeline*lcdslow; | ||||||
|  |             beepshort(); | ||||||
|  |           } | ||||||
|  |           BLOCK; | ||||||
|  |         } | ||||||
|  |         if(linechanging) | ||||||
|  |         { | ||||||
|  |           if(encoderpos<0) encoderpos=0; | ||||||
|  |           if(encoderpos>250) encoderpos=150; | ||||||
|  | 		  absPreheatHPBTemp = encoderpos; | ||||||
|  |           lcd.setCursor(13,line);lcd.print(itostr3(encoderpos)); | ||||||
|  |         } | ||||||
|  |       }break; | ||||||
|  | 	case ItemABSPreHeat_Store_Eprom: | ||||||
|  |     { | ||||||
|  |       if(force_lcd_update) | ||||||
|  |       { | ||||||
|  |         lcd.setCursor(0,line);lcdprintPGM(MSG_STORE_EPROM); | ||||||
|  |       } | ||||||
|  |       if((activeline==line) && CLICKED) | ||||||
|  |       { | ||||||
|  |         //enquecommand("M84"); | ||||||
|  |         beepshort(); | ||||||
|  |         BLOCK; | ||||||
|  |         EEPROM_StoreSettings(); | ||||||
|  |       } | ||||||
|  |     }break; | ||||||
|  |       default:    | ||||||
|  |       break; | ||||||
|  |   } | ||||||
|  |   line++; | ||||||
|  |  } | ||||||
|  |  updateActiveLines(ItemABSPreHeat_Store_Eprom,encoderpos); | ||||||
|  | #endif | ||||||
|  | } | ||||||
|  |  | ||||||
|  | //********************************************************************************************************** | ||||||
| //  convert float to string with +123.4 format | //  convert float to string with +123.4 format | ||||||
| char *ftostr3(const float &x) | char *ftostr3(const float &x) | ||||||
| { | { | ||||||
| @@ -2619,7 +2979,7 @@ char *ftostr31(const float &x) | |||||||
|  |  | ||||||
| char *ftostr32(const float &x) | char *ftostr32(const float &x) | ||||||
| { | { | ||||||
|   int xx=x*100; |   long xx=x*100; | ||||||
|   conv[0]=(xx>=0)?'+':'-'; |   conv[0]=(xx>=0)?'+':'-'; | ||||||
|   xx=abs(xx); |   xx=abs(xx); | ||||||
|   conv[1]=(xx/100)%10+'0'; |   conv[1]=(xx/100)%10+'0'; | ||||||
| @@ -2664,7 +3024,7 @@ char *itostr4(const int &xx) | |||||||
| //  convert float to string with +1234.5 format | //  convert float to string with +1234.5 format | ||||||
| char *ftostr51(const float &x) | char *ftostr51(const float &x) | ||||||
| { | { | ||||||
|   int xx=x*10; |   long xx=x*10; | ||||||
|   conv[0]=(xx>=0)?'+':'-'; |   conv[0]=(xx>=0)?'+':'-'; | ||||||
|   xx=abs(xx); |   xx=abs(xx); | ||||||
|   conv[1]=(xx/10000)%10+'0'; |   conv[1]=(xx/10000)%10+'0'; | ||||||
| @@ -2680,7 +3040,7 @@ char *ftostr51(const float &x) | |||||||
| //  convert float to string with +123.45 format | //  convert float to string with +123.45 format | ||||||
| char *ftostr52(const float &x) | char *ftostr52(const float &x) | ||||||
| { | { | ||||||
|   int xx=x*100; |   long xx=x*100; | ||||||
|   conv[0]=(xx>=0)?'+':'-'; |   conv[0]=(xx>=0)?'+':'-'; | ||||||
|   xx=abs(xx); |   xx=abs(xx); | ||||||
|   conv[1]=(xx/10000)%10+'0'; |   conv[1]=(xx/10000)%10+'0'; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user