Browse Source

New ML support - menu tunning, startup
+config headers (bool - true/false replaced with 0/1)
+fixed include hierarchy
+removed comments

Robert Pelnar 5 years ago
parent
commit
fcfb4cdcae

+ 12 - 12
Firmware/Configuration.h

@@ -402,9 +402,9 @@ your extruder heater takes 2 minutes to hit the target on heating.
 
 // The pullups are needed if you directly connect a mechanical endswitch between the signal and ground pins.
 
-const bool X_MAX_ENDSTOP_INVERTING = false; // set to true to invert the logic of the endstop.
-const bool Y_MAX_ENDSTOP_INVERTING = false; // set to true to invert the logic of the endstop.
-const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop.
+#define X_MAX_ENDSTOP_INVERTING 0 // set to 1 to invert the logic of the endstop.
+#define Y_MAX_ENDSTOP_INVERTING 0 // set to 1 to invert the logic of the endstop.
+#define Z_MAX_ENDSTOP_INVERTING 1 // set to 1 to invert the logic of the endstop.
 //#define DISABLE_MAX_ENDSTOPS
 //#define DISABLE_MIN_ENDSTOPS
 
@@ -420,11 +420,11 @@ const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of
 #define E_ENABLE_ON 0 // For all extruders
 
 // Disables axis when it's not being used.
-#define DISABLE_X false
-#define DISABLE_Y false
-#define DISABLE_Z false
-#define DISABLE_E false // For all extruders
-#define DISABLE_INACTIVE_EXTRUDER true //disable only inactive extruders and keep active extruder enabled
+#define DISABLE_X 0
+#define DISABLE_Y 0
+#define DISABLE_Z 0
+#define DISABLE_E 0// For all extruders
+#define DISABLE_INACTIVE_EXTRUDER 1 //disable only inactive extruders and keep active extruder enabled
 
 
 // ENDSTOP SETTINGS:
@@ -434,11 +434,11 @@ const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of
 #define Z_HOME_DIR -1
 
 #ifdef DEBUG_DISABLE_SWLIMITS
-#define min_software_endstops false
-#define max_software_endstops false
+#define min_software_endstops 0
+#define max_software_endstops 0
 #else
-#define min_software_endstops true // If true, axis won't move to coordinates less than HOME_POS.
-#define max_software_endstops true  // If true, axis won't move to coordinates greater than the defined lengths below.
+#define min_software_endstops 1 // If true, axis won't move to coordinates less than HOME_POS.
+#define max_software_endstops 1  // If true, axis won't move to coordinates greater than the defined lengths below.
 #endif //DEBUG_DISABLE_SWLIMITS
 
 

+ 14 - 14
Firmware/Configuration_adv.h

@@ -143,7 +143,7 @@
 //#define Y_DUAL_STEPPER_DRIVERS
 
 // Define if the two Y drives need to rotate in opposite directions
-#define INVERT_Y2_VS_Y_DIR true
+#define INVERT_Y2_VS_Y_DIR 1
 
 #ifdef Y_DUAL_STEPPER_DRIVERS
   #undef EXTRUDERS
@@ -160,13 +160,13 @@
 #define Z_HOME_RETRACT_MM 2
 //#define QUICK_HOME  //if this is defined, if both x and y are to be homed, a diagonal move will be performed initially.
 
-#define AXIS_RELATIVE_MODES {false, false, false, false}
+#define AXIS_RELATIVE_MODES {0, 0, 0, 0}
 #define MAX_STEP_FREQUENCY 40000 // Max step frequency for Ultimaker (5000 pps / half step). Toshiba steppers are 4x slower, but Prusa3D does not use those.
 //By default pololu step drivers require an active high signal. However, some high power drivers require an active low signal as step.
-#define INVERT_X_STEP_PIN false
-#define INVERT_Y_STEP_PIN false
-#define INVERT_Z_STEP_PIN false
-#define INVERT_E_STEP_PIN false
+#define INVERT_X_STEP_PIN 0
+#define INVERT_Y_STEP_PIN 0
+#define INVERT_Z_STEP_PIN 0
+#define INVERT_E_STEP_PIN 0
 
 //default stepper release if idle
 #define DEFAULT_STEPPER_DEACTIVE_TIME 60
@@ -206,7 +206,7 @@
 //#define CHDK 4        //Pin for triggering CHDK to take a picture see how to use it here http://captain-slow.dk/2014/03/09/3d-printing-timelapses/
 #define CHDK_DELAY 50 //How long in ms the pin should stay HIGH before going LOW again
 
-#define SD_FINISHED_STEPPERRELEASE true  //if sd support and the file is finished: disable steppers?
+#define SD_FINISHED_STEPPERRELEASE 1  //if sd support and the file is finished: disable steppers?
 #define SD_FINISHED_RELEASECOMMAND "M84 X Y Z E" // You might want to keep the z enabled so your bed stays in place.
 
 #define SDCARD_RATHERRECENTFIRST  //reverse file order of sd card menu display. Its sorted practically after the file system block order.
@@ -241,7 +241,7 @@
 	
 	// SD Card Sorting options
 	// In current firmware Prusa Firmware version,
-	// SDSORT_CACHE_NAMES and SDSORT_DYNAMIC_RAM is not supported and must be set to false.
+	// SDSORT_CACHE_NAMES and SDSORT_DYNAMIC_RAM is not supported and must be set to 0.
 	#ifdef SDCARD_SORT_ALPHA
 	  #define SD_SORT_TIME 0
 	  #define SD_SORT_ALPHA 1
@@ -249,11 +249,11 @@
 	
 	  #define SDSORT_LIMIT       100    // Maximum number of sorted items (10-256).
 	  #define FOLDER_SORTING     -1     // -1=above  0=none  1=below
-	  #define SDSORT_GCODE       false  // Allow turning sorting on/off with LCD and M34 g-code.
-	  #define SDSORT_USES_RAM    false  // Pre-allocate a static array for faster pre-sorting.
-	  #define SDSORT_USES_STACK  false  // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.)
-	  #define SDSORT_CACHE_NAMES false  // Keep sorted items in RAM longer for speedy performance. Most expensive option.
-	  #define SDSORT_DYNAMIC_RAM false  // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use!
+	  #define SDSORT_GCODE       0  // Allow turning sorting on/off with LCD and M34 g-code.
+	  #define SDSORT_USES_RAM    0  // Pre-allocate a static array for faster pre-sorting.
+	  #define SDSORT_USES_STACK  0  // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.)
+	  #define SDSORT_CACHE_NAMES 0  // Keep sorted items in RAM longer for speedy performance. Most expensive option.
+	  #define SDSORT_DYNAMIC_RAM 0  // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use!
 	#endif
 	
 	#if defined(SDCARD_SORT_ALPHA)
@@ -283,7 +283,7 @@
 #define BABYSTEPPING
 #ifdef BABYSTEPPING
   #define BABYSTEP_XY  //not only z, but also XY in the menu. more clutter, more functions
-  #define BABYSTEP_INVERT_Z false  //true for inverse movements in Z
+  #define BABYSTEP_INVERT_Z 0  //1 for inverse movements in Z
   #define BABYSTEP_Z_MULTIPLICATOR 2 //faster z movements
 
   #ifdef COREXY

+ 12 - 12
Firmware/Marlin_main.cpp

@@ -616,7 +616,6 @@ void servo_init()
   #endif
 }
 
-static void lcd_language_menu();
 
 void stop_and_save_print_to_ram(float z_move, float e_move);
 void restore_print_from_ram_and_continue(float e_move);
@@ -760,7 +759,7 @@ void factory_reset(char level, bool quiet)
             WRITE(BEEPER, HIGH);
             _delay_ms(100);
             WRITE(BEEPER, LOW);
-			eeprom_update_byte((unsigned char*)EEPROM_LANG, LANG_ID_FORCE_SELECTION);
+			lang_reset();
             break;
          
 		//Level 1: Reset statistics
@@ -791,12 +790,11 @@ void factory_reset(char level, bool quiet)
             //lcd_print_at_PGM(1,2,PSTR("Shipping prep"));
             
             // Force language selection at the next boot up.
-			eeprom_update_byte((unsigned char*)EEPROM_LANG, LANG_ID_FORCE_SELECTION);
+			lang_reset();
             // Force the "Follow calibration flow" message at the next boot up.
             calibration_status_store(CALIBRATION_STATUS_Z_CALIBRATION);
 			eeprom_write_byte((uint8_t*)EEPROM_WIZARD_ACTIVE, 1); //run wizard
             farm_no = 0;
-//*** MaR::180501_01
 			farm_mode = false;
 			eeprom_update_byte((uint8_t*)EEPROM_FARM_MODE, farm_mode);
             EEPROM_save_B(EEPROM_FARM_NUMBER, &farm_no);
@@ -992,12 +990,12 @@ void erase_eeprom_section(uint16_t offset, uint16_t bytes)
 	for (int i = offset; i < (offset+bytes); i++) eeprom_write_byte((uint8_t*)i, 0xFF);
 }
 
-#include "bootapp.h"
-
 
 #ifdef W25X20CL
 
-// language upgrade from external flash
+#include "bootapp.h" //bootloader support
+
+// language update from external flash
 #define LANGBOOT_BLOCKSIZE 0x1000  
 #define LANGBOOT_RAMBUFFER 0x0800
 
@@ -1095,15 +1093,16 @@ void setup()
 
 	lcd_splash();
 
+#ifdef W25X20CL
 	if (w25x20cl_init())
 		update_sec_lang_from_external_flash();
 	else
 		kill(_i("External SPI flash W25X20CL not responding."));
+#endif //W25X20CL
 
 	setup_killpin();
 	setup_powerhold();
 
-//*** MaR::180501_02b
 	farm_mode = eeprom_read_byte((uint8_t*)EEPROM_FARM_MODE); 
 	EEPROM_read_B(EEPROM_FARM_NUMBER, &farm_no);
 	if ((farm_mode == 0xFF && farm_no == 0) || ((uint16_t)farm_no == 0xFFFF)) 
@@ -1389,7 +1388,6 @@ void setup()
 #if defined(Z_AXIS_ALWAYS_ON)
 	enable_z();
 #endif
-//*** MaR::180501_02
 	farm_mode = eeprom_read_byte((uint8_t*)EEPROM_FARM_MODE);
 	EEPROM_read_B(EEPROM_FARM_NUMBER, &farm_no);
 	if ((farm_mode == 0xFF && farm_no == 0) || (farm_no == 0xFFFF)) farm_mode = false; //if farm_mode has not been stored to eeprom yet and farm number is set to zero or EEPROM is fresh, deactivate farm mode 
@@ -1495,7 +1493,9 @@ void setup()
 	list_sec_lang_from_external_flash();
 #endif //DEBUG_W25X20CL
 
-	lang_select(eeprom_read_byte((uint8_t*)EEPROM_LANG));
+//	lang_reset();
+	if (!lang_select(eeprom_read_byte((uint8_t*)EEPROM_LANG)))
+		lcd_language();
 
 #ifdef DEBUG_SEC_LANG
 
@@ -3229,7 +3229,7 @@ void process_commands()
       SERIAL_PROTOCOLLN(FILAMENT_SIZE "-" ELECTRONICS "-" NOZZLE_TYPE );
 
     } else if(code_seen("Lang")) {
-	  eeprom_update_byte((unsigned char*)EEPROM_LANG, LANG_ID_FORCE_SELECTION);
+	  lang_reset();
 
 	} else if(code_seen("Lz")) {
       EEPROM_save_B(EEPROM_BABYSTEP_Z,0);
@@ -6017,7 +6017,7 @@ Sigma_Exit:
     break;
     case 509: //M509 Force language selection
     {
-		eeprom_update_byte((unsigned char*)EEPROM_LANG, LANG_ID_FORCE_SELECTION);
+		lang_reset();
         SERIAL_ECHO_START;
         SERIAL_PROTOCOLPGM(("LANG SEL FORCED"));
     }

+ 29 - 16
Firmware/language.c

@@ -1,8 +1,10 @@
 //language.c
 #include "language.h"
 #include <avr/pgmspace.h>
+#include <avr/eeprom.h>
 #include "bootapp.h"
 
+#include "Configuration.h"
 
 #ifdef W25X20CL
 #include "w25x20cl.h"
@@ -44,34 +46,32 @@ uint8_t lang_select(uint8_t lang)
 	if (lang == LANG_ID_PRI) //primary language
 	{
 		lang_table = 0;
-		lang_selected = 0;
-		return 1;
+		lang_selected = lang;
 	}
 #ifdef W25X20CL
+	if (lang_get_code(lang) == lang_get_code(LANG_ID_SEC)) lang = LANG_ID_SEC;
 	if (lang == LANG_ID_SEC) //current secondary language
 	{
-		uint16_t ui = _SEC_LANG_TABLE; //table pointer
-		if (pgm_read_dword(((uint32_t*)(ui + 0))) != LANG_MAGIC) return 0; //magic not valid
-		lang_table = ui; // set table pointer
-		lang_selected = 1; // set language id
-		return 1;
+		if (pgm_read_dword(((uint32_t*)_SEC_LANG_TABLE)) == LANG_MAGIC) //magic valid
+		{
+			lang_table = _SEC_LANG_TABLE; // set table pointer
+			lang_selected = lang; // set language id
+		}
 	}
 #else //W25X20CL
 #endif //W25X20CL
-/*
-	uint16_t ui = (uint16_t)&_SEC_LANG; //pointer to _SEC_LANG reserved space
-	ui += 0x00ff; //add 1 page
-	ui &= 0xff00; //align to page
-	lang_table = ui; //set table pointer
-	ui = pgm_read_word(((uint16_t*)(((char*)lang_table + 16)))); //read relative offset of first string (language name)
-	return (const char*)((char*)lang_table + ui); //return calculated pointer
-*/
+	if (lang_selected == lang)
+	{
+		eeprom_update_byte((unsigned char*)EEPROM_LANG, lang_selected);
+		return 1;
+	}
 	return 0;
 }
 
 uint8_t lang_get_count()
 {
 #ifdef W25X20CL
+	W25X20CL_SPI_ENTER();
 	uint8_t count = 2; //count = 1+n (primary + secondary + all in xflash)
 	uint32_t addr = 0x00000; //start of xflash
 	lang_table_header_t header; //table header structure
@@ -98,11 +98,11 @@ uint8_t lang_get_header(uint8_t lang, lang_table_header_t* header, uint32_t* off
 		if (offset) *offset = ui;
 		return (header == LANG_MAGIC)?1:0; //return 1 if magic valid
 	}
+	W25X20CL_SPI_ENTER();
 	uint32_t addr = 0x00000; //start of xflash
 	lang--;
 	while (1)
 	{
-		W25X20CL_SPI_ENTER();
 		w25x20cl_rd_data(addr, header, sizeof(lang_table_header_t)); //read table header from xflash
 		if (header->magic != LANG_MAGIC) break; //break if not valid
 		if (offset) *offset = addr;
@@ -124,6 +124,7 @@ uint16_t lang_get_code(uint8_t lang)
 		if (pgm_read_dword(((uint32_t*)(ui + 0))) != LANG_MAGIC) return LANG_CODE_XX; //magic not valid
 		return pgm_read_word(((uint32_t*)(ui + 10))); //return lang code from progmem
 	}
+	W25X20CL_SPI_ENTER();
 	uint32_t addr = 0x00000; //start of xflash
 	lang_table_header_t header; //table header structure
 	lang--;
@@ -160,6 +161,18 @@ const char* lang_get_name_by_code(uint16_t code)
 	return _n("??");
 }
 
+void lang_reset(void)
+{
+	lang_selected = 0;
+	eeprom_update_byte((unsigned char*)EEPROM_LANG, LANG_ID_FORCE_SELECTION);
+}
+
+uint8_t lang_is_selected(void)
+{
+	uint8_t lang_eeprom = eeprom_read_byte((unsigned char*)EEPROM_LANG);
+	return (lang_eeprom != LANG_ID_FORCE_SELECTION) && (lang_eeprom == lang_selected);
+}
+
 #ifdef DEBUG_SEC_LANG
 const char* lang_get_sec_lang_str_by_id(uint16_t id)
 {

+ 10 - 4
Firmware/language.h

@@ -100,14 +100,20 @@ extern const char* lang_get_translation(const char* s);
 #define _SEC_LANG_TABLE ((((uint16_t)&_SEC_LANG) + 0x00ff) & 0xff00)
 #endif //(LANG_MODE != 0)
 
-//selects 
+//selects language, eeprom is updated in case of success
 extern uint8_t lang_select(uint8_t lang);
-
-//get total number of languages (primary + all in xflash)
-extern uint8_t lang_get_count();
+//returns total number of languages (primary + all in xflash)
+extern uint8_t lang_get_count(void);
+//reads lang table header and offset in xflash or progmem
 extern uint8_t lang_get_header(uint8_t lang, lang_table_header_t* header, uint32_t* offset);
+//reads lang code from xflash or progmem
 extern uint16_t lang_get_code(uint8_t lang);
+//returns localized language name (text for menu item)
 extern const char* lang_get_name_by_code(uint16_t code);
+//reset language to "LANG_ID_FORCE_SELECTION", epprom is updated
+extern void lang_reset(void);
+//returns 1 if language is selected
+extern uint8_t lang_is_selected(void);
 
 #ifdef DEBUG_SEC_LANG
 extern const char* lang_get_sec_lang_str_by_id(uint16_t id);

+ 0 - 1
Firmware/stepper.cpp

@@ -1457,7 +1457,6 @@ void digitalPotWrite(int address, int value) // From Arduino DigitalPotControl e
   #endif
 }
 
-//*** MaR::180416_03
 void EEPROM_read_st(int pos, uint8_t* value, uint8_t size)
 {
     do

+ 2 - 1
Firmware/thermistortables.h

@@ -1,7 +1,8 @@
 #ifndef THERMISTORTABLES_H_
 #define THERMISTORTABLES_H_
 
-#include "Marlin.h"
+#include "Configuration_adv.h"
+#include <avr/pgmspace.h>
 
 #define OVERSAMPLENR 16
 

+ 30 - 35
Firmware/ultralcd.cpp

@@ -214,7 +214,6 @@ static void lcd_prepare_menu();
 //static void lcd_move_menu();
 static void lcd_settings_menu();
 static void lcd_calibration_menu();
-static void lcd_language_menu();
 static void lcd_control_temperature_menu();
 static void lcd_control_temperature_preheat_pla_settings_menu();
 static void lcd_control_temperature_preheat_abs_settings_menu();
@@ -3680,22 +3679,6 @@ static void lcd_crash_mode_set()
 #endif //TMC2130
  
 
-static void lcd_set_lang(unsigned char lang)
-{
-	if (lang > LANG_ID_SEC)
-	{
-		if (!lcd_show_fullscreen_message_yes_no_and_wait_P(_i("Copy selected language from XFLASH?"), false, true))
-		{
-			lcd_return_to_status();
-			lcd_update_enable(true);
-			return;
-		}
-		lang_boot_update_start(lang);
-	}
-	if (lang_select(lang))
-		eeprom_update_byte((unsigned char*)EEPROM_LANG, lang);
-}
-
 #ifdef PAT9125
 static void lcd_fsensor_state_set()
 {
@@ -3727,13 +3710,10 @@ void lcd_set_progress() {
 static void lcd_language_menu()
 {
 	START_MENU();
-//	if (langsel == LANGSEL_OFF)
-//		MENU_ITEM(back, _T(MSG_SETTINGS), 0);
-//	else if (langsel == LANGSEL_ACTIVE)
-		MENU_ITEM(back, _T(MSG_WATCH), 0);
+	if (lang_is_selected()) MENU_ITEM(back, _T(MSG_SETTINGS), 0);
 	MENU_ITEM(setlang, lang_get_name_by_code(lang_get_code(0)), 0);
 //	MENU_ITEM(setlang, lang_get_name_by_code(lang_get_code(1)), 1);
-	for (int i = 2; i < lang_get_count(); i++) //skip seconday language - solved in menu_action_setlang
+	for (int i = 2; i < lang_get_count(); i++) //skip seconday language - solved in lang_select
 		MENU_ITEM(setlang, lang_get_name_by_code(lang_get_code(i)), i);
 	END_MENU();
 }
@@ -3929,6 +3909,26 @@ void lcd_wizard() {
 	}
 }
 
+void lcd_language()
+{
+	lcd_update_enable(true);
+	lcd_implementation_clear();
+	lcd_goto_menu(lcd_language_menu);
+	lcd_timeoutToStatus = -1; //infinite timeout
+	lcdDrawUpdate = 2;
+	while ((currentMenu != lcd_status_screen) && (!lang_is_selected()))
+	{
+		delay(50);
+		lcd_update();
+		manage_heater();
+		manage_inactivity(true);
+	}
+	if (lang_is_selected())
+		lcd_return_to_status();
+	else
+		lang_select(LANG_ID_PRI);
+}
+
 void lcd_wizard(int state) {
 
 	bool end = false;
@@ -4167,7 +4167,6 @@ static void lcd_settings_menu()
 #ifdef TMC2130
   if(!farm_mode)
   {
-//*** MaR::180416_01a
     if (SilentModeMenu == SILENT_MODE_NORMAL) MENU_ITEM(function, _T(MSG_STEALTH_MODE_OFF), lcd_silent_mode_set);
     else MENU_ITEM(function, _T(MSG_STEALTH_MODE_ON), lcd_silent_mode_set);
     if (SilentModeMenu == SILENT_MODE_NORMAL)
@@ -5725,7 +5724,6 @@ static void lcd_tune_menu()
 #ifdef TMC2130
      if(!farm_mode)
      {
-//*** MaR::180416_01b
           if (SilentModeMenu == SILENT_MODE_NORMAL) MENU_ITEM(function, _T(MSG_STEALTH_MODE_OFF), lcd_silent_mode_set);
           else MENU_ITEM(function, _T(MSG_STEALTH_MODE_ON), lcd_silent_mode_set);
 
@@ -6551,7 +6549,6 @@ static bool lcd_selfcheck_pulleys(int axis)
 		st_current_set(0, 850); //set motor current higher
 		plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[3], 200, active_extruder);
 		st_synchronize();
-//*** MaR::180416_02
           if (SilentModeMenu != SILENT_MODE_OFF) st_current_set(0, tmp_motor[0]); //set back to normal operation currents
 		else st_current_set(0, tmp_motor_loud[0]); //set motor current back			
 		current_position[axis] = current_position[axis] - move;
@@ -7118,18 +7115,16 @@ static void menu_action_gcode(const char* pgcode) {
 
 static void menu_action_setlang(unsigned char lang)
 {
-	if (lang <= LANG_ID_SEC)
+	if (!lang_select(lang))
 	{
-		lcd_set_lang(lang);
-		return;
-	}
-	uint16_t code = lang_get_code(lang);
-	if (code == lang_get_code(1))
-	{
-		lcd_set_lang(1);
-		return;
+		if (lcd_show_fullscreen_message_yes_no_and_wait_P(_i("Copy selected language from XFLASH?"), false, true))
+			lang_boot_update_start(lang);
+		lcd_update_enable(true);
+		lcd_implementation_clear();
+		lcd_goto_menu(lcd_language_menu);
+		lcd_timeoutToStatus = -1; //infinite timeout
+		lcdDrawUpdate = 2;
 	}
-	lcd_set_lang(lang);
 }
 
 static void menu_action_function(menuFunc_t data) {

+ 4 - 0
Firmware/ultralcd.h

@@ -6,6 +6,8 @@
 
 #ifdef ULTRA_LCD
 
+	static void lcd_language_menu();
+
   void lcd_update(uint8_t lcdDrawUpdateOverride = 0);
   // Call with a false parameter to suppress the LCD update from various places like the planner or the temp control.
   void lcd_update_enable(bool enable);
@@ -299,6 +301,8 @@ void display_loading();
  void lcd_set_progress();
 #endif
 
+void lcd_language();
+
 void lcd_wizard();
 void lcd_wizard(int state);