From c0946d8f04b247c235bd60eb3f804a03906b6979 Mon Sep 17 00:00:00 2001 From: Robert Pelnar Date: Sat, 9 Jun 2018 01:23:04 +0200 Subject: [PATCH 01/10] New ML support - w25x20cl spi external flash support +fixed some messages +sec lang update test --- Firmware/Marlin.h | 2 +- Firmware/Marlin_main.cpp | 133 +++++++++++++----- Firmware/bootapp.c | 4 +- Firmware/bootapp.h | 2 + Firmware/config.h | 5 + Firmware/language.c | 28 +++- Firmware/language.h | 1 + Firmware/messages.c | 1 + Firmware/messages.h | 1 + Firmware/temperature.cpp | 2 +- Firmware/tmc2130.cpp | 6 +- Firmware/ultralcd.cpp | 8 +- .../variants/1_75mm_MK3-EINSy10a-E3Dv6full.h | 1 + Firmware/w25x20cl.c | 7 +- Firmware/w25x20cl.h | 15 +- 15 files changed, 160 insertions(+), 56 deletions(-) diff --git a/Firmware/Marlin.h b/Firmware/Marlin.h index 08cfae29..3694df28 100644 --- a/Firmware/Marlin.h +++ b/Firmware/Marlin.h @@ -50,7 +50,7 @@ #define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) #endif -#include "WString.h" +//#include "WString.h" #ifdef AT90USB #ifdef BTENABLED diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 4d3cb9e8..7cab97eb 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -996,35 +996,95 @@ void erase_eeprom_section(uint16_t offset, uint16_t bytes) #include "bootapp.h" -void __test() +void __test(uint8_t lang) { + uint8_t cnt = lang_get_count(); + printf_P(PSTR("cnt=%d lang=%d\n"), cnt, lang); + if ((lang < 2) || (lang > cnt)) return; + cli(); - boot_app_magic = 0x55aa55aa; + boot_app_magic = BOOT_APP_MAGIC; boot_app_flags = BOOT_APP_FLG_USER0; - boot_reserved = 0x00; + boot_reserved = lang << 4; wdt_enable(WDTO_15MS); while(1); } #ifdef W25X20CL +#define W25X20CL_BLOCK 1024 + void upgrade_sec_lang_from_external_flash() { - if ((boot_app_magic == 0x55aa55aa) && (boot_app_flags & BOOT_APP_FLG_USER0)) + if ((boot_app_magic == BOOT_APP_MAGIC) && (boot_app_flags & BOOT_APP_FLG_USER0)) { - fprintf_P(lcdout, PSTR(ESC_2J ESC_H(1,1) "TEST %d"), boot_reserved); - boot_reserved++; - if (boot_reserved < 4) + uint8_t lang = boot_reserved >> 4; + uint8_t state = boot_reserved & 0xf; + + fprintf_P(lcdout, PSTR(ESC_H(1,3) "lang=%1hhd state=%1hhx"), lang, state); + delay(1000); + state++; + boot_reserved = state | (lang << 4); + if (state < 15) { - _delay_ms(1000); cli(); wdt_enable(WDTO_15MS); while(1); } +/* fprintf_P(lcdout, PSTR(ESC_2J "UPGRADE START")); + delay(1000); + fprintf_P(lcdout, PSTR(ESC_H(1,1) "lang=%hhd state=%hhd"), lang, state); + delay(1000);*/ +/* + lang_table_header_t header; + uint32_t src_addr = 0x00000; + if (lang_get_header(lang, &header, &src_addr)) + { + uint16_t dst_addr = ((((uint16_t)&_SEC_LANG) + 0x00ff) & 0xff00); //table pointer + uint16_t size = W25X20CL_BLOCK * state; + src_addr += size; + dst_addr += size; + state++; + boot_reserved = state | (lang << 4); + if (size < header.size) + { + fprintf_P(lcdout, PSTR(ESC_2J ESC_H(1,0) "Copying lang #%hhd" ESC_H(1,1) "size 0x%04x"), lang, size); + size = header.size - size; + if (size > W25X20CL_BLOCK) size = W25X20CL_BLOCK; + +// delay(1000); +// cli(); +// wdt_enable(WDTO_15MS); +// while(1); + cli(); + w25x20cl_rd_data(src_addr, (uint8_t*)0x0800, 256); + bootapp_ram2flash(0x0800, dst_addr, 256); + } +*/ +/* + + + +// header.size - (4096*state); + + fprintf_P(lcdout, PSTR(ESC_2J ESC_H(1,0) "Copying lang #%hhd" ESC_H(1,1) "state %hhd" ESC_H(1,2) "offs: %08lx" ESC_H(1,3) "remain %04x"), lang, state, offset, remain); + state++; + boot_reserved = state | (lang << 4); + if (state < 4) + { + _delay_ms(1000); + cli(); + wdt_enable(WDTO_15MS); + while(1); + }*/ +// } } boot_app_flags &= ~BOOT_APP_FLG_USER0; } + +#ifdef DEBUG_W25X20CL + uint8_t lang_xflash_enum_codes(uint16_t* codes) { lang_table_header_t header; @@ -1044,7 +1104,7 @@ uint8_t lang_xflash_enum_codes(uint16_t* codes) printf_P(_n(" _lt_size = 0x%04x (%d)\n"), header.size, header.size); printf_P(_n(" _lt_count = 0x%04x (%d)\n"), header.count, header.count); printf_P(_n(" _lt_chsum = 0x%04x\n"), header.checksum); - printf_P(_n(" _lt_code = 0x%04x\n"), header.code); + printf_P(_n(" _lt_code = 0x%04x (%c%c)\n"), header.code, header.code >> 8, header.code & 0xff); printf_P(_n(" _lt_resv1 = 0x%08lx\n"), header.reserved1); addr += header.size; @@ -1061,6 +1121,8 @@ void list_sec_lang_from_external_flash() printf_P(_n("XFlash lang count = %hhd\n"), count); } +#endif //DEBUG_W25X20CL + #endif //W25X20CL @@ -1069,16 +1131,20 @@ void list_sec_lang_from_external_flash() // are initialized by the main() routine provided by the Arduino framework. void setup() { + lcd_init(); + fdev_setup_stream(lcdout, lcd_putchar, NULL, _FDEV_SETUP_WRITE); //setup lcdout stream + #ifdef NEW_SPI spi_init(); #endif //NEW_SPI - lcd_init(); - fdev_setup_stream(lcdout, lcd_putchar, NULL, _FDEV_SETUP_WRITE); //setup lcdout stream - - upgrade_sec_lang_from_external_flash(); - lcd_splash(); + + if (w25x20cl_init()) + upgrade_sec_lang_from_external_flash(); + else + kill(_i("External SPI flash W25X20CL not responding.")); + setup_killpin(); setup_powerhold(); @@ -1369,21 +1435,17 @@ void setup() // If they differ, an update procedure may need to be performed. At the end of this block, the current firmware version // is being written into the EEPROM, so the update procedure will be triggered only once. - spi_setup(TMC2130_SPCR, TMC2130_SPSR); - puts_P(_n("w25x20cl init: ")); - if (w25x20cl_ini()) - { - uint8_t uid[8]; // 64bit unique id - w25x20cl_rd_uid(uid); - puts_P(_n("OK, UID=")); - for (uint8_t i = 0; i < 8; i ++) - printf_P(PSTR("%02hhx"), uid[i]); - putchar('\n'); - list_sec_lang_from_external_flash(); - } - else - puts_P(_n("NG!\n")); +#ifdef DEBUG_W25X20CL + W25X20CL_SPI_ENTER(); + uint8_t uid[8]; // 64bit unique id + w25x20cl_rd_uid(uid); + puts_P(_n("W25X20CL UID=")); + for (uint8_t i = 0; i < 8; i ++) + printf_P(PSTR("%02hhx"), uid[i]); + putchar('\n'); + list_sec_lang_from_external_flash(); +#endif //DEBUG_W25X20CL lang_selected = eeprom_read_byte((uint8_t*)EEPROM_LANG); if (lang_selected >= LANG_NUM) @@ -1393,12 +1455,13 @@ void setup() } lang_select(lang_selected); +//#ifdef DEBUG_SEC_LANG + uint16_t sec_lang_code = lang_get_code(1); printf_P(_n("SEC_LANG_CODE=0x%04x (%c%c)\n"), sec_lang_code, sec_lang_code >> 8, sec_lang_code & 0xff); -#ifdef DEBUG_SEC_LANG - lang_print_sec_lang(uartout); -#endif //DEBUG_SEC_LANG +// lang_print_sec_lang(uartout); +//#endif //DEBUG_SEC_LANG if (eeprom_read_byte((uint8_t*)EEPROM_TEMP_CAL_ACTIVE) == 255) { eeprom_write_byte((uint8_t*)EEPROM_TEMP_CAL_ACTIVE, 0); @@ -2224,7 +2287,7 @@ void homeaxis(int axis, uint8_t cnt, uint8_t* pstep) #ifdef TMC2130 if (READ(Z_TMC2130_DIAG) != 0) { //Z crash FORCE_HIGH_POWER_END; - kill(MSG_BED_LEVELING_FAILED_POINT_LOW); + kill(_T(MSG_BED_LEVELING_FAILED_POINT_LOW)); return; } #endif //TMC2130 @@ -2240,7 +2303,7 @@ void homeaxis(int axis, uint8_t cnt, uint8_t* pstep) #ifdef TMC2130 if (READ(Z_TMC2130_DIAG) != 0) { //Z crash FORCE_HIGH_POWER_END; - kill(MSG_BED_LEVELING_FAILED_POINT_LOW); + kill(_T(MSG_BED_LEVELING_FAILED_POINT_LOW)); return; } #endif //TMC2130 @@ -5004,7 +5067,7 @@ Sigma_Exit: setWatch(); break; case 112: // M112 -Emergency Stop - kill("", 3); + kill(_n(""), 3); break; case 140: // M140 set bed temp if (code_seen('S')) setTargetBed(code_value()); @@ -7387,7 +7450,7 @@ void manage_inactivity(bool ignore_stepper_queue/*=false*/) //default argument s if( (millis() - previous_millis_cmd) > max_inactive_time ) if(max_inactive_time) - kill("", 4); + kill(_n(""), 4); if(stepper_inactive_time) { if( (millis() - previous_millis_cmd) > stepper_inactive_time ) { diff --git a/Firmware/bootapp.c b/Firmware/bootapp.c index 00d31248..8eb5b52d 100644 --- a/Firmware/bootapp.c +++ b/Firmware/bootapp.c @@ -20,12 +20,12 @@ void bootapp_print_vars() void bootapp_ram2flash(uint16_t rptr, uint16_t fptr, uint16_t size) { cli(); - boot_app_magic = 0x55aa55aa; + boot_app_magic = BOOT_APP_MAGIC; boot_app_flags |= BOOT_APP_FLG_COPY; uint16_t ui; for (ui = 0; ui < size; ui++) { uint8_t uc = ram_array[ui+rptr]; - if (pgm_readbyte(ui+fptr) & uc != uc) + if (pgm_read_byte(ui+fptr) & uc != uc) { boot_app_flags |= BOOT_APP_FLG_ERASE; break; diff --git a/Firmware/bootapp.h b/Firmware/bootapp.h index dc0006e4..3d6d521f 100644 --- a/Firmware/bootapp.h +++ b/Firmware/bootapp.h @@ -20,6 +20,8 @@ #define BOOT_APP_FLG_USER0 0x80 +#define BOOT_APP_MAGIC 0x55aa55aa + #if defined(__cplusplus) extern "C" { diff --git a/Firmware/config.h b/Firmware/config.h index 9902349f..a9172429 100644 --- a/Firmware/config.h +++ b/Firmware/config.h @@ -19,7 +19,12 @@ #define TMC2130_SPSR SPI_SPSR(TMC2130_SPI_RATE) //W25X20CL configuration +//pinout: #define W25X20CL_PIN_CS 32 +//spi: +#define W25X20CL_SPI_RATE 0 // fosc/4 = 4MHz +#define W25X20CL_SPCR SPI_SPCR(W25X20CL_SPI_RATE, 1, 1, 1, 0) +#define W25X20CL_SPSR SPI_SPSR(W25X20CL_SPI_RATE) //LANG - Multi-language support //#define LANG_MODE 0 // primary language only diff --git a/Firmware/language.c b/Firmware/language.c index 3c068b14..e83f7edf 100644 --- a/Firmware/language.c +++ b/Firmware/language.c @@ -97,10 +97,36 @@ uint8_t lang_get_count() #endif //W25X20CL } +uint8_t lang_get_header(uint8_t lang, lang_table_header_t* header, uint32_t* offset) +{ + if (lang == LANG_ID_PRI) return 0; //primary lang not supported for this function +#ifdef W25X20CL + if (lang == LANG_ID_SEC) + { + uint16_t ui = ((((uint16_t)&_SEC_LANG) + 0x00ff) & 0xff00); //table pointer + memcpy_P(header, ui, sizeof(lang_table_header_t)); //read table header from progmem + if (offset) *offset = ui; + return (header == LANG_MAGIC)?1:0; //return 1 if magic valid + } + uint32_t addr = 0x00000; //start of xflash + lang--; + while (1) + { + 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; + if (--lang == 0) return 1; + addr += header->size; //calc address of next table + } + return 0; +#else //W25X20CL +#endif //W25X20CL +} + uint16_t lang_get_code(uint8_t lang) { -#ifdef W25X20CL if (lang == LANG_ID_PRI) return LANG_CODE_EN; //primary lang = EN +#ifdef W25X20CL if (lang == LANG_ID_SEC) { uint16_t ui = ((((uint16_t)&_SEC_LANG) + 0x00ff) & 0xff00); //table pointer diff --git a/Firmware/language.h b/Firmware/language.h index 24cc510d..d7bf53e0 100644 --- a/Firmware/language.h +++ b/Firmware/language.h @@ -108,6 +108,7 @@ extern uint8_t lang_select(uint8_t lang); //get total number of languages (primary + all in xflash) extern uint8_t lang_get_count(); +extern uint8_t lang_get_header(uint8_t lang, lang_table_header_t* header, uint32_t* offset); extern uint16_t lang_get_code(uint8_t lang); extern const char* lang_get_name_by_code(uint16_t code); diff --git a/Firmware/messages.c b/Firmware/messages.c index b931e643..e6ab5221 100644 --- a/Firmware/messages.c +++ b/Firmware/messages.c @@ -119,3 +119,4 @@ const char MSG_Z_MAX[] PROGMEM_N1 = "z_max: "; ////c=0 r=0 const char MSG_Z_MIN[] PROGMEM_N1 = "z_min: "; ////c=0 r=0 const char MSG_ZPROBE_OUT[] PROGMEM_N1 = "Z probe out. bed"; ////c=0 r=0 const char MSG_ZPROBE_ZOFFSET[] PROGMEM_N1 = "Z Offset"; ////c=0 r=0 +const char MSG_TMC_OVERTEMP[] PROGMEM_N1 = "TMC DRIVER OVERTEMP"; ////c=0 r=0 diff --git a/Firmware/messages.h b/Firmware/messages.h index f5910e9e..0b5b9b09 100644 --- a/Firmware/messages.h +++ b/Firmware/messages.h @@ -116,3 +116,4 @@ extern const char MSG_Z_MAX[]; extern const char MSG_Z_MIN[]; extern const char MSG_ZPROBE_OUT[]; extern const char MSG_ZPROBE_ZOFFSET[]; +extern const char MSG_TMC_OVERTEMP[]; diff --git a/Firmware/temperature.cpp b/Firmware/temperature.cpp index e0cacb99..83ead13b 100644 --- a/Firmware/temperature.cpp +++ b/Firmware/temperature.cpp @@ -832,7 +832,7 @@ static float analog2temp(int raw, uint8_t e) { SERIAL_ERROR_START; SERIAL_ERROR((int)e); SERIAL_ERRORLNPGM(" - Invalid extruder number !"); - kill("", 6); + kill(PSTR(""), 6); return 0.0; } #ifdef HEATER_0_USES_MAX6675 diff --git a/Firmware/tmc2130.cpp b/Firmware/tmc2130.cpp index 01ee8fa2..b55beb9b 100644 --- a/Firmware/tmc2130.cpp +++ b/Firmware/tmc2130.cpp @@ -5,6 +5,7 @@ #include "tmc2130.h" #include "LiquidCrystal_Prusa.h" #include "ultralcd.h" +#include "language.h" #ifndef NEW_SPI #include #else //NEW_SPI @@ -386,7 +387,6 @@ bool tmc2130_wait_standstill_xy(int timeout) void tmc2130_check_overtemp() { - const static char TMC_OVERTEMP_MSG[] PROGMEM = "TMC DRIVER OVERTEMP "; static uint32_t checktime = 0; if (millis() - checktime > 1000 ) { @@ -397,11 +397,11 @@ void tmc2130_check_overtemp() tmc2130_rd(i, TMC2130_REG_DRV_STATUS, &drv_status); if (drv_status & ((uint32_t)1 << 26)) { // BIT 26 - over temp prewarning ~120C (+-20C) - SERIAL_ERRORRPGM(TMC_OVERTEMP_MSG); + SERIAL_ERRORRPGM(MSG_TMC_OVERTEMP); SERIAL_ECHOLN(i); for (int j = 0; j < 4; j++) tmc2130_wr(j, TMC2130_REG_CHOPCONF, 0x00010000); - kill(TMC_OVERTEMP_MSG); + kill(MSG_TMC_OVERTEMP); } } diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 0b803b55..eeb01fe1 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -5657,11 +5657,13 @@ void lcd_confirm_print() } -extern void __test(); +extern void __test(uint8_t lang); static void lcd_test_menu() { - __test(); + __test(3); + lcd_update_enable(true); + lcd_return_to_status(); } static void lcd_main_menu() @@ -5833,7 +5835,7 @@ static void lcd_main_menu() #endif MENU_ITEM(submenu, _i("Support"), lcd_support_menu);////MSG_SUPPORT c=0 r=0 -// MENU_ITEM(submenu, _i("Test"), lcd_test_menu);////MSG_SUPPORT c=0 r=0 + MENU_ITEM(submenu, _i("Test"), lcd_test_menu);////MSG_SUPPORT c=0 r=0 END_MENU(); diff --git a/Firmware/variants/1_75mm_MK3-EINSy10a-E3Dv6full.h b/Firmware/variants/1_75mm_MK3-EINSy10a-E3Dv6full.h index 856b5ab0..8d3a975d 100644 --- a/Firmware/variants/1_75mm_MK3-EINSy10a-E3Dv6full.h +++ b/Firmware/variants/1_75mm_MK3-EINSy10a-E3Dv6full.h @@ -149,6 +149,7 @@ //#define DEBUG_BUILD //#define DEBUG_SEC_LANG //secondary language debug output at startup +//#define DEBUG_W25X20CL //debug external spi flash #ifdef DEBUG_BUILD //#define _NO_ASM #define DEBUG_DCODES //D codes diff --git a/Firmware/w25x20cl.c b/Firmware/w25x20cl.c index 04f0d402..611897fe 100644 --- a/Firmware/w25x20cl.c +++ b/Firmware/w25x20cl.c @@ -36,17 +36,18 @@ //#define _SPI_TX swspi_tx //#define _SPI_RX swspi_rx -#define _SPI_TX(b) spi_txrx(b) -#define _SPI_RX() spi_txrx(0xff) +#define _SPI_TX(b) spi_txrx(b) +#define _SPI_RX() spi_txrx(0xff) int w25x20cl_mfrid_devid(void); -int8_t w25x20cl_ini(void) +int8_t w25x20cl_init(void) { PIN_OUT(W25X20CL_PIN_CS); _CS_HIGH(); + W25X20CL_SPI_ENTER(); if (!w25x20cl_mfrid_devid()) return 0; return 1; } diff --git a/Firmware/w25x20cl.h b/Firmware/w25x20cl.h index 72a0ddde..21294a21 100644 --- a/Firmware/w25x20cl.h +++ b/Firmware/w25x20cl.h @@ -6,20 +6,21 @@ #include "config.h" -#define W25_STATUS_BUSY 0x01 -#define W25_STATUS_WEL 0x02 -#define W25_STATUS_BP0 0x04 -#define W25_STATUS_BP1 0x08 -#define W25_STATUS_TB 0x20 -#define W25_STATUS_SRP 0x80 +#define W25X20CL_STATUS_BUSY 0x01 +#define W25X20CL_STATUS_WEL 0x02 +#define W25X20CL_STATUS_BP0 0x04 +#define W25X20CL_STATUS_BP1 0x08 +#define W25X20CL_STATUS_TB 0x20 +#define W25X20CL_STATUS_SRP 0x80 +#define W25X20CL_SPI_ENTER() spi_setup(W25X20CL_SPCR, W25X20CL_SPSR) #if defined(__cplusplus) extern "C" { #endif //defined(__cplusplus) -extern int8_t w25x20cl_ini(void); +extern int8_t w25x20cl_init(void); extern void w25x20cl_enable_wr(void); extern void w25x20cl_disable_wr(void); extern uint8_t w25x20cl_rd_status_reg(void); From ebd837531349b79704caa583242407d384849639 Mon Sep 17 00:00:00 2001 From: Robert Pelnar Date: Sat, 9 Jun 2018 17:49:41 +0200 Subject: [PATCH 02/10] New ML support - external flash W25X20CL - upgrade is working!!! (hardcoded to german) +print test (LT_PRINT_TEST) --- Firmware/MarlinSerial.h | 2 +- Firmware/Marlin_main.cpp | 167 ++++++++++++++++++++++++++------------- Firmware/bootapp.c | 5 +- Firmware/language.c | 1 + Firmware/w25x20cl.h | 2 + 5 files changed, 117 insertions(+), 60 deletions(-) diff --git a/Firmware/MarlinSerial.h b/Firmware/MarlinSerial.h index 81743475..d596708e 100644 --- a/Firmware/MarlinSerial.h +++ b/Firmware/MarlinSerial.h @@ -216,7 +216,7 @@ class MarlinSerial //: public Stream static void print(unsigned long, int = DEC); static void print(double, int = 2); - static void println(const String &s); +// static void println(const String &s); static void println(const char[]); static void println(char, int = BYTE); static void println(unsigned char, int = BYTE); diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 7cab97eb..9f486f39 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -967,7 +967,7 @@ void show_fw_version_warnings() { lcd_print_at_PGM(0, 3, PSTR(FW_REPOSITORY)); lcd_wait_for_click(); break; - default: lcd_show_fullscreen_message_and_wait_P(_i("WARNING: This is an unofficial, unsupported build. Use at your own risk!")); break;////MSG_FW_VERSION_UNKNOWN c=20 r=8 +// default: lcd_show_fullscreen_message_and_wait_P(_i("WARNING: This is an unofficial, unsupported build. Use at your own risk!")); break;////MSG_FW_VERSION_UNKNOWN c=20 r=8 } lcd_update_enable(true); } @@ -1012,7 +1012,9 @@ void __test(uint8_t lang) #ifdef W25X20CL -#define W25X20CL_BLOCK 1024 +// language upgrade from external flash +#define LANGBOOT_BLOCKSIZE 0x0400 +#define LANGBOOT_RAMBUFFER 0x0800 void upgrade_sec_lang_from_external_flash() { @@ -1020,64 +1022,24 @@ void upgrade_sec_lang_from_external_flash() { uint8_t lang = boot_reserved >> 4; uint8_t state = boot_reserved & 0xf; - - fprintf_P(lcdout, PSTR(ESC_H(1,3) "lang=%1hhd state=%1hhx"), lang, state); - delay(1000); - state++; - boot_reserved = state | (lang << 4); - if (state < 15) +// lang_table_header_t header; +// uint32_t src_addr = 0x00000; +// if (lang_get_header(lang, &header, &src_addr)) { - cli(); - wdt_enable(WDTO_15MS); - while(1); - } -/* fprintf_P(lcdout, PSTR(ESC_2J "UPGRADE START")); - delay(1000); - fprintf_P(lcdout, PSTR(ESC_H(1,1) "lang=%hhd state=%hhd"), lang, state); - delay(1000);*/ -/* - lang_table_header_t header; - uint32_t src_addr = 0x00000; - if (lang_get_header(lang, &header, &src_addr)) - { - uint16_t dst_addr = ((((uint16_t)&_SEC_LANG) + 0x00ff) & 0xff00); //table pointer - uint16_t size = W25X20CL_BLOCK * state; - src_addr += size; - dst_addr += size; - state++; - boot_reserved = state | (lang << 4); - if (size < header.size) + fprintf_P(lcdout, PSTR(ESC_H(1,3) "lng=%1hhd sta=%1hhx %04x"), lang, state, SP); + delay(1000); + boot_reserved = (state+1) | (lang << 4); + if ((state * 0x1000) < 0x211c) { - fprintf_P(lcdout, PSTR(ESC_2J ESC_H(1,0) "Copying lang #%hhd" ESC_H(1,1) "size 0x%04x"), lang, size); - size = header.size - size; - if (size > W25X20CL_BLOCK) size = W25X20CL_BLOCK; - -// delay(1000); -// cli(); -// wdt_enable(WDTO_15MS); -// while(1); cli(); - w25x20cl_rd_data(src_addr, (uint8_t*)0x0800, 256); - bootapp_ram2flash(0x0800, dst_addr, 256); + for (uint16_t i = 0; i < 0x1000; i++) + ram_array[0x800 + i] = 0xee; + uint16_t size = 0x211c - state * 0x1000; + if (size > 0x1000) size = 0x1000; + w25x20cl_rd_data(0x25ba + state * 0x1000, (uint8_t*)0x0800, size); + bootapp_ram2flash(0x0800, 0x0500 + state * 0x1000, size); } -*/ -/* - - - -// header.size - (4096*state); - - fprintf_P(lcdout, PSTR(ESC_2J ESC_H(1,0) "Copying lang #%hhd" ESC_H(1,1) "state %hhd" ESC_H(1,2) "offs: %08lx" ESC_H(1,3) "remain %04x"), lang, state, offset, remain); - state++; - boot_reserved = state | (lang << 4); - if (state < 4) - { - _delay_ms(1000); - cli(); - wdt_enable(WDTO_15MS); - while(1); - }*/ -// } + } } boot_app_flags &= ~BOOT_APP_FLG_USER0; } @@ -1171,6 +1133,96 @@ void setup() SERIAL_ECHO_START; printf_P(PSTR(" " FW_VERSION_FULL "\n")); + lang_table_header_t header; + uint32_t src_addr = 0x00000; + if (lang_get_header(3, &header, &src_addr)) + { +//this is comparsion of some printing-methods regarding to flash space usage and code size/readability +#define LT_PRINT_TEST 2 +// flash usage +// total p.test +//0 252718 t+c text code +//1 253142 424 170 254 +//2 253040 322 164 158 +//3 253248 530 135 395 +#if (LT_PRINT_TEST==1) //not optimized printf + printf_P(_n(" _src_addr = 0x%08lx\n"), src_addr); + printf_P(_n(" _lt_magic = 0x%08lx %S\n"), header.magic, (header.magic==LANG_MAGIC)?_n("OK"):_n("NA")); + printf_P(_n(" _lt_size = 0x%04x (%d)\n"), header.size, header.size); + printf_P(_n(" _lt_count = 0x%04x (%d)\n"), header.count, header.count); + printf_P(_n(" _lt_chsum = 0x%04x\n"), header.checksum); + printf_P(_n(" _lt_code = 0x%04x (%c%c)\n"), header.code, header.code >> 8, header.code & 0xff); + printf_P(_n(" _lt_resv1 = 0x%08lx\n"), header.reserved1); +#elif (LT_PRINT_TEST==2) //optimized printf + printf_P( + _n( + " _src_addr = 0x%08lx\n" + " _lt_magic = 0x%08lx %S\n" + " _lt_size = 0x%04x (%d)\n" + " _lt_count = 0x%04x (%d)\n" + " _lt_chsum = 0x%04x\n" + " _lt_code = 0x%04x (%c%c)\n" + " _lt_resv1 = 0x%08lx\n" + ), + src_addr, + header.magic, (header.magic==LANG_MAGIC)?_n("OK"):_n("NA"), + header.size, header.size, + header.count, header.count, + header.checksum, + header.code, header.code >> 8, header.code & 0xff, + header.reserved1 + ); +#elif (LT_PRINT_TEST==3) //arduino print/println (leading zeros not solved) + MYSERIAL.print(" _src_addr = 0x"); + MYSERIAL.println(src_addr, 16); + MYSERIAL.print(" _lt_magic = 0x"); + MYSERIAL.print(header.magic, 16); + MYSERIAL.println((header.magic==LANG_MAGIC)?" OK":" NA"); + MYSERIAL.print(" _lt_size = 0x"); + MYSERIAL.print(header.size, 16); + MYSERIAL.print(" ("); + MYSERIAL.print(header.size, 10); + MYSERIAL.println(")"); + MYSERIAL.print(" _lt_count = 0x"); + MYSERIAL.print(header.count, 16); + MYSERIAL.print(" ("); + MYSERIAL.print(header.count, 10); + MYSERIAL.println(")"); + MYSERIAL.print(" _lt_chsum = 0x"); + MYSERIAL.println(header.checksum, 16); + MYSERIAL.print(" _lt_code = 0x"); + MYSERIAL.print(header.code, 16); + MYSERIAL.print(" ("); + MYSERIAL.print((char)(header.code >> 8), 0); + MYSERIAL.print((char)(header.code & 0xff), 0); + MYSERIAL.println(")"); + MYSERIAL.print(" _lt_resv1 = 0x"); + MYSERIAL.println(header.reserved1, 16); +#endif //(LT_PRINT_TEST==) +#undef LT_PRINT_TEST + +#if 0 + w25x20cl_rd_data(0x25ba, (uint8_t*)&block_buffer, 1024); + for (uint16_t i = 0; i < 1024; i++) + { + if ((i % 16) == 0) printf_P(_n("%04x:"), 0x25ba+i); + printf_P(_n(" %02x"), ((uint8_t*)&block_buffer)[i]); + if ((i % 16) == 15) putchar('\n'); + } +#endif +#if 1 + for (uint16_t i = 0; i < 1024*10; i++) + { + if ((i % 16) == 0) printf_P(_n("%04x:"), 0x500+i); + printf_P(_n(" %02x"), pgm_read_byte((uint8_t*)(0x500+i))); + if ((i % 16) == 15) putchar('\n'); + } +#endif + } + else + printf_P(_n("lang_get_header failed!\n")); + + #if 0 SERIAL_ECHOLN("Reading eeprom from 0 to 100: start"); for (int i = 0; i < 4096; ++i) { @@ -1458,7 +1510,8 @@ void setup() //#ifdef DEBUG_SEC_LANG uint16_t sec_lang_code = lang_get_code(1); - printf_P(_n("SEC_LANG_CODE=0x%04x (%c%c)\n"), sec_lang_code, sec_lang_code >> 8, sec_lang_code & 0xff); + uint16_t ui = ((((uint16_t)&_SEC_LANG) + 0x00ff) & 0xff00); //table pointer + printf_P(_n("lang_selected=%d\nlang_table=0x%04x\nSEC_LANG_CODE=0x%04x (%c%c)\n"), lang_selected, ui, sec_lang_code, sec_lang_code >> 8, sec_lang_code & 0xff); // lang_print_sec_lang(uartout); //#endif //DEBUG_SEC_LANG diff --git a/Firmware/bootapp.c b/Firmware/bootapp.c index 8eb5b52d..4b68ad07 100644 --- a/Firmware/bootapp.c +++ b/Firmware/bootapp.c @@ -22,7 +22,8 @@ void bootapp_ram2flash(uint16_t rptr, uint16_t fptr, uint16_t size) cli(); boot_app_magic = BOOT_APP_MAGIC; boot_app_flags |= BOOT_APP_FLG_COPY; - uint16_t ui; for (ui = 0; ui < size; ui++) + boot_app_flags |= BOOT_APP_FLG_ERASE; +/* uint16_t ui; for (ui = 0; ui < size; ui++) { uint8_t uc = ram_array[ui+rptr]; if (pgm_read_byte(ui+fptr) & uc != uc) @@ -30,7 +31,7 @@ void bootapp_ram2flash(uint16_t rptr, uint16_t fptr, uint16_t size) boot_app_flags |= BOOT_APP_FLG_ERASE; break; } - } + }*/ boot_copy_size = (uint16_t)size; boot_src_addr = (uint32_t)rptr; boot_dst_addr = (uint32_t)fptr; diff --git a/Firmware/language.c b/Firmware/language.c index e83f7edf..6003fe7a 100644 --- a/Firmware/language.c +++ b/Firmware/language.c @@ -112,6 +112,7 @@ uint8_t lang_get_header(uint8_t lang, lang_table_header_t* header, uint32_t* off 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; diff --git a/Firmware/w25x20cl.h b/Firmware/w25x20cl.h index 21294a21..8a0ed0ac 100644 --- a/Firmware/w25x20cl.h +++ b/Firmware/w25x20cl.h @@ -4,6 +4,8 @@ #include #include "config.h" +#include "spi.h" + #define W25X20CL_STATUS_BUSY 0x01 From a9446cc6b3cd1bd5f76903592904032207c97fb3 Mon Sep 17 00:00:00 2001 From: Robert Pelnar Date: Sat, 9 Jun 2018 18:26:53 +0200 Subject: [PATCH 03/10] New ML support - W25x20CL --- Firmware/Marlin_main.cpp | 28 ++++++++++++++-------------- Firmware/language.h | 1 + 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 9f486f39..9e41362d 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -1013,7 +1013,7 @@ void __test(uint8_t lang) #ifdef W25X20CL // language upgrade from external flash -#define LANGBOOT_BLOCKSIZE 0x0400 +#define LANGBOOT_BLOCKSIZE 0x1000 #define LANGBOOT_RAMBUFFER 0x0800 void upgrade_sec_lang_from_external_flash() @@ -1022,22 +1022,22 @@ void upgrade_sec_lang_from_external_flash() { uint8_t lang = boot_reserved >> 4; uint8_t state = boot_reserved & 0xf; -// lang_table_header_t header; -// uint32_t src_addr = 0x00000; -// if (lang_get_header(lang, &header, &src_addr)) + lang_table_header_t header; + uint32_t src_addr; + if (lang_get_header(lang, &header, &src_addr)) { - fprintf_P(lcdout, PSTR(ESC_H(1,3) "lng=%1hhd sta=%1hhx %04x"), lang, state, SP); + fprintf_P(lcdout, PSTR(ESC_H(1,3) "lng=%1hhd sta=%1hhx %04x"), lang, state, header.size); delay(1000); boot_reserved = (state+1) | (lang << 4); - if ((state * 0x1000) < 0x211c) + if ((state * LANGBOOT_BLOCKSIZE) < 0x211c) { cli(); - for (uint16_t i = 0; i < 0x1000; i++) - ram_array[0x800 + i] = 0xee; - uint16_t size = 0x211c - state * 0x1000; - if (size > 0x1000) size = 0x1000; - w25x20cl_rd_data(0x25ba + state * 0x1000, (uint8_t*)0x0800, size); - bootapp_ram2flash(0x0800, 0x0500 + state * 0x1000, size); +// for (uint16_t i = 0; i < LANGBOOT_BLOCKSIZE; i++) +// ram_array[0x800 + i] = 0xee; + uint16_t size = 0x211c - state * LANGBOOT_BLOCKSIZE; + if (size > LANGBOOT_BLOCKSIZE) size = LANGBOOT_BLOCKSIZE; + w25x20cl_rd_data(0x25ba + state * LANGBOOT_BLOCKSIZE, (uint8_t*)LANGBOOT_RAMBUFFER, size); + bootapp_ram2flash(LANGBOOT_RAMBUFFER, _SEC_LANG_TABLE + state * LANGBOOT_BLOCKSIZE, size); } } } @@ -1213,8 +1213,8 @@ void setup() #if 1 for (uint16_t i = 0; i < 1024*10; i++) { - if ((i % 16) == 0) printf_P(_n("%04x:"), 0x500+i); - printf_P(_n(" %02x"), pgm_read_byte((uint8_t*)(0x500+i))); + if ((i % 16) == 0) printf_P(_n("%04x:"), _SEC_LANG_TABLE+i); + printf_P(_n(" %02x"), pgm_read_byte((uint8_t*)(_SEC_LANG_TABLE+i))); if ((i % 16) == 15) putchar('\n'); } #endif diff --git a/Firmware/language.h b/Firmware/language.h index d7bf53e0..a2604e75 100644 --- a/Firmware/language.h +++ b/Firmware/language.h @@ -101,6 +101,7 @@ extern uint8_t lang_selected; extern const char _SEC_LANG[LANG_SIZE_RESERVED]; extern const char* lang_get_translation(const char* s); extern const char* lang_get_sec_lang_str(const char* s); +#define _SEC_LANG_TABLE ((((uint16_t)&_SEC_LANG) + 0x00ff) & 0xff00) #endif //(LANG_MODE != 0) //selects From dcd58d002c5e329ae8694362d21d918da79807c6 Mon Sep 17 00:00:00 2001 From: Robert Pelnar Date: Sat, 9 Jun 2018 19:16:36 +0200 Subject: [PATCH 04/10] New ML support - W25X20CL language selection from menu is working --- Firmware/Marlin_main.cpp | 27 ++++++--------------------- Firmware/bootapp.c | 10 ++++++++++ Firmware/bootapp.h | 1 + Firmware/language.c | 39 ++++++++++++--------------------------- Firmware/language.h | 6 ++---- Firmware/ultralcd.cpp | 7 ++++--- 6 files changed, 35 insertions(+), 55 deletions(-) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 9e41362d..1a6773a7 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -996,19 +996,6 @@ void erase_eeprom_section(uint16_t offset, uint16_t bytes) #include "bootapp.h" -void __test(uint8_t lang) -{ - uint8_t cnt = lang_get_count(); - printf_P(PSTR("cnt=%d lang=%d\n"), cnt, lang); - if ((lang < 2) || (lang > cnt)) return; - - cli(); - boot_app_magic = BOOT_APP_MAGIC; - boot_app_flags = BOOT_APP_FLG_USER0; - boot_reserved = lang << 4; - wdt_enable(WDTO_15MS); - while(1); -} #ifdef W25X20CL @@ -1026,17 +1013,15 @@ void upgrade_sec_lang_from_external_flash() uint32_t src_addr; if (lang_get_header(lang, &header, &src_addr)) { - fprintf_P(lcdout, PSTR(ESC_H(1,3) "lng=%1hhd sta=%1hhx %04x"), lang, state, header.size); + fprintf_P(lcdout, PSTR(ESC_H(1,3) "l=%1hhd s=%1hhx %04x %04x"), lang, state, src_addr, header.size); delay(1000); - boot_reserved = (state+1) | (lang << 4); - if ((state * LANGBOOT_BLOCKSIZE) < 0x211c) + boot_reserved = (state + 1) | (lang << 4); + if ((state * LANGBOOT_BLOCKSIZE) < header.size) { cli(); -// for (uint16_t i = 0; i < LANGBOOT_BLOCKSIZE; i++) -// ram_array[0x800 + i] = 0xee; - uint16_t size = 0x211c - state * LANGBOOT_BLOCKSIZE; + uint16_t size = header.size - state * LANGBOOT_BLOCKSIZE; if (size > LANGBOOT_BLOCKSIZE) size = LANGBOOT_BLOCKSIZE; - w25x20cl_rd_data(0x25ba + state * LANGBOOT_BLOCKSIZE, (uint8_t*)LANGBOOT_RAMBUFFER, size); + w25x20cl_rd_data(src_addr + state * LANGBOOT_BLOCKSIZE, (uint8_t*)LANGBOOT_RAMBUFFER, size); bootapp_ram2flash(LANGBOOT_RAMBUFFER, _SEC_LANG_TABLE + state * LANGBOOT_BLOCKSIZE, size); } } @@ -1510,7 +1495,7 @@ void setup() //#ifdef DEBUG_SEC_LANG uint16_t sec_lang_code = lang_get_code(1); - uint16_t ui = ((((uint16_t)&_SEC_LANG) + 0x00ff) & 0xff00); //table pointer + uint16_t ui = _SEC_LANG_TABLE; //table pointer printf_P(_n("lang_selected=%d\nlang_table=0x%04x\nSEC_LANG_CODE=0x%04x (%c%c)\n"), lang_selected, ui, sec_lang_code, sec_lang_code >> 8, sec_lang_code & 0xff); // lang_print_sec_lang(uartout); diff --git a/Firmware/bootapp.c b/Firmware/bootapp.c index 4b68ad07..5b5f8dbf 100644 --- a/Firmware/bootapp.c +++ b/Firmware/bootapp.c @@ -38,3 +38,13 @@ void bootapp_ram2flash(uint16_t rptr, uint16_t fptr, uint16_t size) wdt_enable(WDTO_15MS); while(1); } + +void bootapp_reboot_user0(uint8_t reserved) +{ + cli(); + boot_app_magic = BOOT_APP_MAGIC; + boot_app_flags = BOOT_APP_FLG_USER0; + boot_reserved = reserved; + wdt_enable(WDTO_15MS); + while(1); +} diff --git a/Firmware/bootapp.h b/Firmware/bootapp.h index 3d6d521f..db5bcc77 100644 --- a/Firmware/bootapp.h +++ b/Firmware/bootapp.h @@ -30,6 +30,7 @@ extern "C" { extern void bootapp_ram2flash(uint16_t rptr, uint16_t fptr, uint16_t size); +extern void bootapp_reboot_user0(uint8_t reserved); #if defined(__cplusplus) } diff --git a/Firmware/language.c b/Firmware/language.c index 6003fe7a..fdf42d41 100644 --- a/Firmware/language.c +++ b/Firmware/language.c @@ -39,16 +39,6 @@ const char* lang_get_translation(const char* s) return (const char*)((char*)lang_table + ui); //return calculated pointer } -const char* lang_get_sec_lang_str(const char* s) -{ - uint16_t ui = ((((uint16_t)&_SEC_LANG) + 0x00ff) & 0xff00); //table pointer - lang_table_t* _lang_table = ui; //table pointer - ui = pgm_read_word(((uint16_t*)s)); //read string id - if (ui == 0xffff) return s + 2; //translation not found - ui = pgm_read_word(((uint16_t*)(((char*)_lang_table + 16 + ui*2)))); //read relative offset - return (const char*)((char*)_lang_table + ui); //return calculated pointer -} - uint8_t lang_select(uint8_t lang) { if (lang == LANG_ID_PRI) //primary language @@ -60,7 +50,7 @@ uint8_t lang_select(uint8_t lang) #ifdef W25X20CL if (lang == LANG_ID_SEC) //current secondary language { - uint16_t ui = ((((uint16_t)&_SEC_LANG) + 0x00ff) & 0xff00); //table pointer + 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 @@ -103,7 +93,7 @@ uint8_t lang_get_header(uint8_t lang, lang_table_header_t* header, uint32_t* off #ifdef W25X20CL if (lang == LANG_ID_SEC) { - uint16_t ui = ((((uint16_t)&_SEC_LANG) + 0x00ff) & 0xff00); //table pointer + uint16_t ui = _SEC_LANG_TABLE; //table pointer memcpy_P(header, ui, sizeof(lang_table_header_t)); //read table header from progmem if (offset) *offset = ui; return (header == LANG_MAGIC)?1:0; //return 1 if magic valid @@ -130,7 +120,7 @@ uint16_t lang_get_code(uint8_t lang) #ifdef W25X20CL if (lang == LANG_ID_SEC) { - uint16_t ui = ((((uint16_t)&_SEC_LANG) + 0x00ff) & 0xff00); //table pointer + uint16_t ui = _SEC_LANG_TABLE; //table pointer 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 } @@ -149,7 +139,7 @@ uint16_t lang_get_code(uint8_t lang) // if (lang == LANG_ID_SEC) // { -// uint16_t ui = ((((uint16_t)&_SEC_LANG) + 0x00ff) & 0xff00); //table pointer +// uint16_t ui = _SEC_LANG_TABLE; //table pointer // if (pgm_read_dword(((uint32_t*)(ui + 0))) == LANG_MAGIC) //magic num is OK // return pgm_read_word(((uint16_t*)(ui + 10))); //read language code // } @@ -168,22 +158,12 @@ const char* lang_get_name_by_code(uint16_t code) case LANG_CODE_PL: return _n("Polski"); } return _n("??"); - -// if (lang == LANG_ID_UNDEFINED) lang = lang_selected; -// if (lang == LANG_ID_PRI) return _T(MSG_LANGUAGE_NAME + 2); -// if (lang == LANG_ID_SEC) -// { -// uint16_t ui = ((((uint16_t)&_SEC_LANG) + 0x00ff) & 0xff00); //table pointer -// if (pgm_read_dword(((uint32_t*)(ui + 0))) == LANG_MAGIC) //magic num is OK -// return lang_get_sec_lang_str(MSG_LANGUAGE_NAME); -// } -// return 0; } #ifdef DEBUG_SEC_LANG const char* lang_get_sec_lang_str_by_id(uint16_t id) { - uint16_t ui = ((((uint16_t)&_SEC_LANG) + 0x00ff) & 0xff00); //table pointer + uint16_t ui = _SEC_LANG_TABLE; //table pointer return ui + pgm_read_word(((uint16_t*)(ui + 16 + id * 2))); //read relative offset and return calculated pointer } @@ -207,7 +187,7 @@ uint16_t lang_print_sec_lang(FILE* out) printf_P(_n(" _lt_resv1 = 0x%08lx\n"), _lt_resv1); if (_lt_magic != LANG_MAGIC) return 0; puts_P(_n(" strings:\n")); - uint16_t ui = ((((uint16_t)&_SEC_LANG) + 0x00ff) & 0xff00); //table pointer + uint16_t ui = _SEC_LANG_TABLE; //table pointer for (ui = 0; ui < _lt_count; ui++) fprintf_P(out, _n(" %3d %S\n"), ui, lang_get_sec_lang_str_by_id(ui)); return _lt_count; @@ -216,5 +196,10 @@ uint16_t lang_print_sec_lang(FILE* out) #endif //(LANG_MODE == 0) -//const char MSG_LANGUAGE_NAME[] PROGMEM_I1 = ISTR("English"); ////c=0 r=0 +void lang_boot_upgrade_start(uint8_t lang) +{ + uint8_t cnt = lang_get_count(); + if ((lang < 2) || (lang > cnt)) return; //only languages from xflash can be selected + bootapp_reboot_user0(lang << 4); +} diff --git a/Firmware/language.h b/Firmware/language.h index a2604e75..cfaad57b 100644 --- a/Firmware/language.h +++ b/Firmware/language.h @@ -100,7 +100,6 @@ extern uint8_t lang_selected; #if (LANG_MODE != 0) extern const char _SEC_LANG[LANG_SIZE_RESERVED]; extern const char* lang_get_translation(const char* s); -extern const char* lang_get_sec_lang_str(const char* s); #define _SEC_LANG_TABLE ((((uint16_t)&_SEC_LANG) + 0x00ff) & 0xff00) #endif //(LANG_MODE != 0) @@ -118,6 +117,8 @@ extern const char* lang_get_sec_lang_str_by_id(uint16_t id); extern uint16_t lang_print_sec_lang(FILE* out); #endif //DEBUG_SEC_LANG +extern void lang_boot_upgrade_start(uint8_t lang); + #if defined(__cplusplus) } #endif //defined(__cplusplus) @@ -125,9 +126,6 @@ extern uint16_t lang_print_sec_lang(FILE* out); #define CAT2(_s1, _s2) _s1 #define CAT4(_s1, _s2, _s3, _s4) _s1 -//Localized language name -//extern const char MSG_LANGUAGE_NAME[]; - #include "messages.h" diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index eeb01fe1..78231f78 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -3717,12 +3717,15 @@ static void lcd_crash_mode_set() 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_upgrade_start(lang); + } lang_select(lang); /* lang_selected = lang; @@ -5657,11 +5660,9 @@ void lcd_confirm_print() } -extern void __test(uint8_t lang); - static void lcd_test_menu() { - __test(3); + lang_boot_upgrade_start(3); lcd_update_enable(true); lcd_return_to_status(); } From 5de0a6437dc49cc4e0d67353c2f2af3c4f38e6b1 Mon Sep 17 00:00:00 2001 From: Robert Pelnar Date: Sat, 9 Jun 2018 23:49:26 +0200 Subject: [PATCH 05/10] New ML support - W25X20CL - lang switching +removed unused code --- Firmware/Marlin_main.cpp | 47 +++----- Firmware/language.h | 3 - Firmware/messages.c | 1 - Firmware/messages.h | 1 - Firmware/ultralcd.cpp | 240 +-------------------------------------- Firmware/ultralcd.h | 1 - 6 files changed, 19 insertions(+), 274 deletions(-) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 1a6773a7..a90c699f 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -331,7 +331,6 @@ static LongTimer safetyTimer; bool mesh_bed_leveling_flag = false; bool mesh_bed_run_from_menu = false; -//unsigned char lang_selected = 0; int8_t FarmMode = 0; bool prusa_sd_card_upload = false; @@ -761,8 +760,7 @@ void factory_reset(char level, bool quiet) WRITE(BEEPER, HIGH); _delay_ms(100); WRITE(BEEPER, LOW); - - lcd_force_language_selection(); + eeprom_update_byte((unsigned char*)EEPROM_LANG, LANG_ID_FORCE_SELECTION); break; //Level 1: Reset statistics @@ -793,7 +791,7 @@ void factory_reset(char level, bool quiet) //lcd_print_at_PGM(1,2,PSTR("Shipping prep")); // Force language selection at the next boot up. - lcd_force_language_selection(); + eeprom_update_byte((unsigned char*)EEPROM_LANG, LANG_ID_FORCE_SELECTION); // 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 @@ -1024,6 +1022,8 @@ void upgrade_sec_lang_from_external_flash() w25x20cl_rd_data(src_addr + state * LANGBOOT_BLOCKSIZE, (uint8_t*)LANGBOOT_RAMBUFFER, size); bootapp_ram2flash(LANGBOOT_RAMBUFFER, _SEC_LANG_TABLE + state * LANGBOOT_BLOCKSIZE, size); } + else + eeprom_update_byte((unsigned char *)EEPROM_LANG, LANG_ID_SEC); } } boot_app_flags &= ~BOOT_APP_FLG_USER0; @@ -1484,13 +1484,7 @@ void setup() list_sec_lang_from_external_flash(); #endif //DEBUG_W25X20CL - lang_selected = eeprom_read_byte((uint8_t*)EEPROM_LANG); - if (lang_selected >= LANG_NUM) - { -// lcd_mylang(); - lang_selected = 0; - } - lang_select(lang_selected); + lang_select(eeprom_read_byte((uint8_t*)EEPROM_LANG)); //#ifdef DEBUG_SEC_LANG @@ -3211,8 +3205,10 @@ void process_commands() trace(); prusa_sd_card_upload = true; card.openFile(strchr_pointer+4,false); + } else if (code_seen("SN")) { gcode_PRUSA_SN(); + } else if(code_seen("Fir")){ SERIAL_PROTOCOLLN(FW_VERSION); @@ -3222,19 +3218,12 @@ void process_commands() SERIAL_PROTOCOLLN(FILAMENT_SIZE "-" ELECTRONICS "-" NOZZLE_TYPE ); } else if(code_seen("Lang")) { - lcd_force_language_selection(); - } else if(code_seen("Lz")) { + eeprom_update_byte((unsigned char*)EEPROM_LANG, LANG_ID_FORCE_SELECTION); + + } else if(code_seen("Lz")) { EEPROM_save_B(EEPROM_BABYSTEP_Z,0); - - } else if (code_seen("SERIAL LOW")) { - MYSERIAL.println("SERIAL LOW"); - MYSERIAL.begin(BAUDRATE); - return; - } else if (code_seen("SERIAL HIGH")) { - MYSERIAL.println("SERIAL HIGH"); - MYSERIAL.begin(1152000); - return; - } else if(code_seen("Beat")) { + + } else if(code_seen("Beat")) { // Kick farm link timer kicktime = millis(); @@ -5354,15 +5343,7 @@ Sigma_Exit: #endif #ifdef ULTIPANEL powersupply = false; - LCD_MESSAGERPGM(CAT4(CUSTOM_MENDEL_NAME,PSTR(" "),MSG_OFF,PSTR("."))); //!! - - /* - MACHNAME = "Prusa i3" - MSGOFF = "Vypnuto" - "Prusai3"" ""vypnuto""." - - "Prusa i3"" "_T(MSG_ALL)[lang_selected][50]"." - */ + LCD_MESSAGERPGM(CAT4(CUSTOM_MENDEL_NAME,PSTR(" "),MSG_OFF,PSTR("."))); lcd_update(); #endif break; @@ -6025,7 +6006,7 @@ Sigma_Exit: break; case 509: //M509 Force language selection { - lcd_force_language_selection(); + eeprom_update_byte((unsigned char*)EEPROM_LANG, LANG_ID_FORCE_SELECTION); SERIAL_ECHO_START; SERIAL_PROTOCOLPGM(("LANG SEL FORCED")); } diff --git a/Firmware/language.h b/Firmware/language.h index cfaad57b..b671388f 100644 --- a/Firmware/language.h +++ b/Firmware/language.h @@ -75,9 +75,6 @@ typedef struct // Default language ID, if no language is selected. #define LANG_ID_DEFAULT LANG_ID_PRI -// Number of languages available in the language table. -#define LANG_NUM 2 - // Magic number at begin of lang table. #define LANG_MAGIC 0x4bb45aa5 diff --git a/Firmware/messages.c b/Firmware/messages.c index e6ab5221..857c05c5 100644 --- a/Firmware/messages.c +++ b/Firmware/messages.c @@ -8,7 +8,6 @@ #include "Configuration_prusa.h" //internationalized messages -const char MSG_ALL[] PROGMEM_I1 = ISTR("All"); ////c=19 r=1 const char MSG_AUTO_HOME[] PROGMEM_I1 = ISTR("Auto home"); ////c=0 r=0 const char MSG_AUTO_MODE_ON[] PROGMEM_I1 = ISTR("Mode [auto power]"); ////c=0 r=0 const char MSG_BABYSTEP_Z[] PROGMEM_I1 = ISTR("Live adjust Z"); ////c=0 r=0 diff --git a/Firmware/messages.h b/Firmware/messages.h index 0b5b9b09..95a1610f 100644 --- a/Firmware/messages.h +++ b/Firmware/messages.h @@ -5,7 +5,6 @@ // LCD Menu Messages //internationalized messages -extern const char MSG_ALL[]; extern const char MSG_AUTO_HOME[]; extern const char MSG_AUTO_MODE_ON[]; extern const char MSG_BABYSTEP_Z[]; diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 78231f78..f3af4b95 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -412,38 +412,12 @@ static void lcd_goto_menu(menuFunc_t menu, const uint32_t encoder = 0, const boo /* Main status screen. It's up to the implementation specific part to show what is needed. As this is very display dependent */ -// Language selection dialog not active. -#define LANGSEL_OFF 0 -// Language selection dialog modal, entered from the info screen. This is the case on firmware boot up, -// if the language index stored in the EEPROM is not valid. -#define LANGSEL_MODAL 1 -// Language selection dialog entered from the Setup menu. -#define LANGSEL_ACTIVE 2 -// Language selection dialog status -unsigned char langsel = LANGSEL_OFF; - -void set_language_from_EEPROM() { - unsigned char eep = eeprom_read_byte((unsigned char*)EEPROM_LANG); - if (eep < LANG_NUM) - { - lang_selected = eep; - // Language is valid, no need to enter the language selection screen. - langsel = LANGSEL_OFF; - } - else - { - lang_selected = LANG_ID_DEFAULT; - // Invalid language, enter the language selection screen in a modal mode. - langsel = LANGSEL_MODAL; - } -} static void lcd_status_screen() { if (firstrun == 1) { firstrun = 0; - set_language_from_EEPROM(); if(lcd_status_message_level == 0){ strncpy_P(lcd_status_message, _T(WELCOME_MSG), LCD_WIDTH); @@ -455,11 +429,6 @@ static void lcd_status_screen() eeprom_update_dword((uint32_t *)EEPROM_FILAMENTUSED, 0); } - if (langsel) { - //strncpy_P(lcd_status_message, PSTR(">>>>>>>>> PRESS v"), LCD_WIDTH); - // Entering the language selection screen in a modal mode. - - } } @@ -552,9 +521,6 @@ static void lcd_status_screen() } } - - //if (--langsel ==0) {langsel=1;current_click=true;} - if (current_click && (lcd_commands_type != LCD_COMMAND_STOP_PRINT)) //click is aborted unless stop print finishes { menuStack.reset(); //redundant, as already done in lcd_return_to_status(), just to be sure @@ -3726,16 +3692,8 @@ static void lcd_set_lang(unsigned char lang) } lang_boot_upgrade_start(lang); } - lang_select(lang); -/* - lang_selected = lang; - firstrun = 1; - eeprom_update_byte((unsigned char *)EEPROM_LANG, lang); - // langsel=0; - if (langsel == LANGSEL_MODAL) - // From modal mode to an active mode? This forces the menu to return to the setup menu. - langsel = LANGSEL_ACTIVE; -*/ + if (lang_select(lang)) + eeprom_update_byte((unsigned char*)EEPROM_LANG, lang); } #ifdef PAT9125 @@ -3765,17 +3723,13 @@ void lcd_set_progress() { } #endif -void lcd_force_language_selection() { - eeprom_update_byte((unsigned char *)EEPROM_LANG, LANG_ID_FORCE_SELECTION); -} - #if (LANG_MODE != 0) static void lcd_language_menu() { START_MENU(); - if (langsel == LANGSEL_OFF) - MENU_ITEM(back, _T(MSG_SETTINGS), 0); - else if (langsel == LANGSEL_ACTIVE) +// if (langsel == LANGSEL_OFF) +// MENU_ITEM(back, _T(MSG_SETTINGS), 0); +// else if (langsel == LANGSEL_ACTIVE) MENU_ITEM(back, _T(MSG_WATCH), 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); @@ -4569,190 +4523,7 @@ static void lcd_calibration_menu() END_MENU(); } -/* -void lcd_mylang_top(int hlaska) { - lcd.setCursor(0,0); - lcd.print(" "); - lcd.setCursor(0,0); - lcd_printPGM(_T(MSG_ALL)[hlaska-1][LANGUAGE_SELECT]); -} -void lcd_mylang_drawmenu(int cursor) { - int first = 0; - if (cursor>2) first = cursor-2; - if (cursor==LANG_NUM) first = LANG_NUM-3; - lcd.setCursor(0, 1); - lcd.print(" "); - lcd.setCursor(1, 1); - lcd_printPGM(_T(MSG_ALL)[first][LANGUAGE_NAME]); - - lcd.setCursor(0, 2); - lcd.print(" "); - lcd.setCursor(1, 2); - lcd_printPGM(_T(MSG_ALL)[first+1][LANGUAGE_NAME]); - - lcd.setCursor(0, 3); - lcd.print(" "); - lcd.setCursor(1, 3); - lcd_printPGM(_T(MSG_ALL)[first+2][LANGUAGE_NAME]); - - if (cursor==1) lcd.setCursor(0, 1); - if (cursor>1 && cursor"); - - if (cursor2) { - lcd.setCursor(19,1); - lcd.print("^"); - } -} -*/ -/* -void lcd_mylang_drawmenu(int cursor) -{ - unsigned char lang_cnt = lang_get_count(); - int first = 0; - if (cursor>3) first = cursor-3; - if (cursor==lang_cnt && lang_cnt>4) first = lang_cnt-4; - if (cursor==lang_cnt && lang_cnt==4) first = lang_cnt-4; - - - lcd.setCursor(0, 0); - lcd.print(" "); - lcd.setCursor(1, 0); - lcd_printPGM(lang_get_name(first+0)); - - lcd.setCursor(0, 1); - lcd.print(" "); - lcd.setCursor(1, 1); - lcd_printPGM(lang_get_name(first+1)); - - lcd.setCursor(0, 2); - lcd.print(" "); - - if (lang_cnt > 2){ - lcd.setCursor(1, 2); - lcd_printPGM(lang_get_name(first+2)); - } - - lcd.setCursor(0, 3); - lcd.print(" "); - if (lang_cnt>3) { - lcd.setCursor(1, 3); - lcd_printPGM(lang_get_name(first+3)); - } - - if (cursor==1) lcd.setCursor(0, 0); - if (cursor==2) lcd.setCursor(0, 1); - if (cursor>2) lcd.setCursor(0, 2); - if (cursor==lang_cnt && lang_cnt>3) lcd.setCursor(0, 3); - - lcd.print(">"); - - if (cursor4) { - lcd.setCursor(19,3); - lcd.print("\x01"); - } - if (cursor>3 && lang_cnt>4) { - lcd.setCursor(19,0); - lcd.print("^"); - } -} -*/ -/* -void lcd_mylang_drawcursor(int cursor) { - - unsigned char lang_cnt = lang_get_count(); - if (cursor==1) lcd.setCursor(0, 1); - if (cursor>1 && cursor"); - -} -*/ -/* -void lcd_mylang() -{ - int enc_dif = 0; - int cursor_pos = 1; - lang_selected=255; - int hlaska=1; - int counter=0; - unsigned char lang_cnt = lang_get_count(); - lcd_set_custom_characters_arrows(); - - lcd_implementation_clear(); - - //lcd_mylang_top(hlaska); - - lcd_mylang_drawmenu(cursor_pos); - - enc_dif = encoderDiff; - - while ( (lang_selected == 255) ) { - - manage_heater(); - manage_inactivity(true); - - if ( abs((enc_dif - encoderDiff)) > 4 ) { - - //if ( (abs(enc_dif - encoderDiff)) > 1 ) { - if (enc_dif > encoderDiff ) { - cursor_pos --; - } - - if (enc_dif < encoderDiff ) { - cursor_pos ++; - } - - if (cursor_pos > lang_cnt) { - cursor_pos = lang_cnt; - } - - if (cursor_pos < 1) { - cursor_pos = 1; - } - - lcd_mylang_drawmenu(cursor_pos); - enc_dif = encoderDiff; - delay(100); - //} - - } else delay(20); - - - if (lcd_clicked()) { - - lcd_set_lang(cursor_pos-1); - delay(500); - - } -// if (++counter == 80) { -// hlaska++; -// if(hlaska>LANG_NUM) hlaska=1; -// lcd_mylang_top(hlaska); -// lcd_mylang_drawcursor(cursor_pos); -// counter=0; -// } - }; - - if(MYSERIAL.available() > 1){ - lang_selected = 0; - firstrun = 0; - } - - lcd_set_custom_characters_degree(); - lcd_implementation_clear(); - lcd_return_to_status(); - -} -*/ void bowden_menu() { int enc_dif = encoderDiff; int cursor_pos = 0; @@ -4875,7 +4646,6 @@ static char snmm_stop_print_menu() { //menu for choosing which filaments will be lcd_implementation_clear(); lcd_print_at_PGM(0,0,_T(MSG_UNLOAD_FILAMENT)); lcd.print(":"); lcd.setCursor(0, 1); lcd.print(">"); - lcd_print_at_PGM(1,1,_T(MSG_ALL)); lcd_print_at_PGM(1,2,_i("Used during print"));////MSG_USED c=19 r=1 lcd_print_at_PGM(1,3,_i("Current"));////MSG_CURRENT c=19 r=1 char cursor_pos = 1; diff --git a/Firmware/ultralcd.h b/Firmware/ultralcd.h index f7d637df..d7d9476c 100644 --- a/Firmware/ultralcd.h +++ b/Firmware/ultralcd.h @@ -25,7 +25,6 @@ void lcd_loading_filament(); void lcd_change_success(); void lcd_loading_color(); - void lcd_force_language_selection(); void lcd_sdcard_stop(); void lcd_sdcard_pause(); void lcd_print_stop(); From f098707021c05f437a80cd2a01d709ed01fb1b5c Mon Sep 17 00:00:00 2001 From: Robert Pelnar Date: Sun, 10 Jun 2018 00:22:28 +0200 Subject: [PATCH 06/10] New ML support - W25X20CL - update process UI tunning --- Firmware/Marlin_main.cpp | 23 +++++++++++++++++------ Firmware/language.c | 2 +- Firmware/language.h | 2 +- Firmware/ultralcd.cpp | 4 ++-- 4 files changed, 21 insertions(+), 10 deletions(-) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index a90c699f..742c4e65 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -1001,7 +1001,7 @@ void erase_eeprom_section(uint16_t offset, uint16_t bytes) #define LANGBOOT_BLOCKSIZE 0x1000 #define LANGBOOT_RAMBUFFER 0x0800 -void upgrade_sec_lang_from_external_flash() +void update_sec_lang_from_external_flash() { if ((boot_app_magic == BOOT_APP_MAGIC) && (boot_app_flags & BOOT_APP_FLG_USER0)) { @@ -1011,8 +1011,9 @@ void upgrade_sec_lang_from_external_flash() uint32_t src_addr; if (lang_get_header(lang, &header, &src_addr)) { - fprintf_P(lcdout, PSTR(ESC_H(1,3) "l=%1hhd s=%1hhx %04x %04x"), lang, state, src_addr, header.size); - delay(1000); + fputs_P(PSTR(ESC_H(1,3) "Language update."), lcdout); + for (uint8_t i = 0; i < state; i++) fputc('.', lcdout); + delay(100); boot_reserved = (state + 1) | (lang << 4); if ((state * LANGBOOT_BLOCKSIZE) < header.size) { @@ -1020,10 +1021,17 @@ void upgrade_sec_lang_from_external_flash() uint16_t size = header.size - state * LANGBOOT_BLOCKSIZE; if (size > LANGBOOT_BLOCKSIZE) size = LANGBOOT_BLOCKSIZE; w25x20cl_rd_data(src_addr + state * LANGBOOT_BLOCKSIZE, (uint8_t*)LANGBOOT_RAMBUFFER, size); + if (state == 0) + { + //TODO - check header integrity + } bootapp_ram2flash(LANGBOOT_RAMBUFFER, _SEC_LANG_TABLE + state * LANGBOOT_BLOCKSIZE, size); } else + { + //TODO - check sec lang data integrity eeprom_update_byte((unsigned char *)EEPROM_LANG, LANG_ID_SEC); + } } } boot_app_flags &= ~BOOT_APP_FLG_USER0; @@ -1088,7 +1096,7 @@ void setup() lcd_splash(); if (w25x20cl_init()) - upgrade_sec_lang_from_external_flash(); + update_sec_lang_from_external_flash(); else kill(_i("External SPI flash W25X20CL not responding.")); @@ -1118,6 +1126,7 @@ void setup() SERIAL_ECHO_START; printf_P(PSTR(" " FW_VERSION_FULL "\n")); +#ifdef DEBUG_SEC_LANG lang_table_header_t header; uint32_t src_addr = 0x00000; if (lang_get_header(3, &header, &src_addr)) @@ -1222,6 +1231,8 @@ void setup() SERIAL_ECHOLN("Reading eeprom from 0 to 100: done"); #endif +#endif //DEBUG_SEC_LANG + // Check startup - does nothing if bootloader sets MCUSR to 0 byte mcu = MCUSR; /* if (mcu & 1) SERIAL_ECHOLNRPGM(_T(MSG_POWERUP)); @@ -1486,14 +1497,14 @@ void setup() lang_select(eeprom_read_byte((uint8_t*)EEPROM_LANG)); -//#ifdef DEBUG_SEC_LANG +#ifdef DEBUG_SEC_LANG uint16_t sec_lang_code = lang_get_code(1); uint16_t ui = _SEC_LANG_TABLE; //table pointer printf_P(_n("lang_selected=%d\nlang_table=0x%04x\nSEC_LANG_CODE=0x%04x (%c%c)\n"), lang_selected, ui, sec_lang_code, sec_lang_code >> 8, sec_lang_code & 0xff); // lang_print_sec_lang(uartout); -//#endif //DEBUG_SEC_LANG +#endif //DEBUG_SEC_LANG if (eeprom_read_byte((uint8_t*)EEPROM_TEMP_CAL_ACTIVE) == 255) { eeprom_write_byte((uint8_t*)EEPROM_TEMP_CAL_ACTIVE, 0); diff --git a/Firmware/language.c b/Firmware/language.c index fdf42d41..bca123d8 100644 --- a/Firmware/language.c +++ b/Firmware/language.c @@ -197,7 +197,7 @@ uint16_t lang_print_sec_lang(FILE* out) #endif //(LANG_MODE == 0) -void lang_boot_upgrade_start(uint8_t lang) +void lang_boot_update_start(uint8_t lang) { uint8_t cnt = lang_get_count(); if ((lang < 2) || (lang > cnt)) return; //only languages from xflash can be selected diff --git a/Firmware/language.h b/Firmware/language.h index b671388f..5204327d 100644 --- a/Firmware/language.h +++ b/Firmware/language.h @@ -114,7 +114,7 @@ extern const char* lang_get_sec_lang_str_by_id(uint16_t id); extern uint16_t lang_print_sec_lang(FILE* out); #endif //DEBUG_SEC_LANG -extern void lang_boot_upgrade_start(uint8_t lang); +extern void lang_boot_update_start(uint8_t lang); #if defined(__cplusplus) } diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index f3af4b95..a51c56c7 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -3690,7 +3690,7 @@ static void lcd_set_lang(unsigned char lang) lcd_update_enable(true); return; } - lang_boot_upgrade_start(lang); + lang_boot_update_start(lang); } if (lang_select(lang)) eeprom_update_byte((unsigned char*)EEPROM_LANG, lang); @@ -5432,7 +5432,7 @@ void lcd_confirm_print() static void lcd_test_menu() { - lang_boot_upgrade_start(3); + lang_boot_update_start(3); lcd_update_enable(true); lcd_return_to_status(); } From fcfb4cdcae0d05f5429b707a6a86e1ab181d866b Mon Sep 17 00:00:00 2001 From: Robert Pelnar Date: Sun, 10 Jun 2018 16:04:32 +0200 Subject: [PATCH 07/10] New ML support - menu tunning, startup +config headers (bool - true/false replaced with 0/1) +fixed include hierarchy +removed comments --- Firmware/Configuration.h | 24 ++++++------- Firmware/Configuration_adv.h | 28 ++++++++-------- Firmware/Marlin_main.cpp | 24 ++++++------- Firmware/language.c | 45 ++++++++++++++++--------- Firmware/language.h | 14 +++++--- Firmware/stepper.cpp | 1 - Firmware/thermistortables.h | 3 +- Firmware/ultralcd.cpp | 65 +++++++++++++++++------------------- Firmware/ultralcd.h | 4 +++ 9 files changed, 113 insertions(+), 95 deletions(-) diff --git a/Firmware/Configuration.h b/Firmware/Configuration.h index 2cdbe12b..edca80d5 100644 --- a/Firmware/Configuration.h +++ b/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 diff --git a/Firmware/Configuration_adv.h b/Firmware/Configuration_adv.h index bb18a427..84f212ec 100644 --- a/Firmware/Configuration_adv.h +++ b/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 diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 742c4e65..e48e181a 100644 --- a/Firmware/Marlin_main.cpp +++ b/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")); } diff --git a/Firmware/language.c b/Firmware/language.c index bca123d8..7ee7902e 100644 --- a/Firmware/language.c +++ b/Firmware/language.c @@ -1,8 +1,10 @@ //language.c #include "language.h" #include +#include #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) { diff --git a/Firmware/language.h b/Firmware/language.h index 5204327d..359bc083 100644 --- a/Firmware/language.h +++ b/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); diff --git a/Firmware/stepper.cpp b/Firmware/stepper.cpp index 6297fe79..902ec7bc 100644 --- a/Firmware/stepper.cpp +++ b/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 diff --git a/Firmware/thermistortables.h b/Firmware/thermistortables.h index 801d6489..dc934ccf 100644 --- a/Firmware/thermistortables.h +++ b/Firmware/thermistortables.h @@ -1,7 +1,8 @@ #ifndef THERMISTORTABLES_H_ #define THERMISTORTABLES_H_ -#include "Marlin.h" +#include "Configuration_adv.h" +#include #define OVERSAMPLENR 16 diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index a51c56c7..f45b6bb8 100644 --- a/Firmware/ultralcd.cpp +++ b/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; + 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; } - uint16_t code = lang_get_code(lang); - if (code == lang_get_code(1)) - { - lcd_set_lang(1); - return; - } - lcd_set_lang(lang); } static void menu_action_function(menuFunc_t data) { diff --git a/Firmware/ultralcd.h b/Firmware/ultralcd.h index d7d9476c..c9d2864e 100644 --- a/Firmware/ultralcd.h +++ b/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); From 4567d2fecac9a6785b0a0ac2f3adc750827b3eb8 Mon Sep 17 00:00:00 2001 From: Robert Pelnar Date: Sun, 10 Jun 2018 16:11:39 +0200 Subject: [PATCH 08/10] removed unused cond. trans. for NEW_SPI --- Firmware/Marlin_main.cpp | 4 -- Firmware/tmc2130.cpp | 62 ------------------- .../variants/1_75mm_MK3-EINSy10a-E3Dv6full.h | 3 - 3 files changed, 69 deletions(-) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index e48e181a..419c5597 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -82,9 +82,7 @@ #include "swspi.h" #endif //SWSPI -#ifdef NEW_SPI #include "spi.h" -#endif //NEW_SPI #ifdef SWI2C #include "swi2c.h" @@ -1087,9 +1085,7 @@ void setup() lcd_init(); fdev_setup_stream(lcdout, lcd_putchar, NULL, _FDEV_SETUP_WRITE); //setup lcdout stream -#ifdef NEW_SPI spi_init(); -#endif //NEW_SPI lcd_splash(); diff --git a/Firmware/tmc2130.cpp b/Firmware/tmc2130.cpp index b55beb9b..dc1af62c 100644 --- a/Firmware/tmc2130.cpp +++ b/Firmware/tmc2130.cpp @@ -6,11 +6,7 @@ #include "LiquidCrystal_Prusa.h" #include "ultralcd.h" #include "language.h" -#ifndef NEW_SPI -#include -#else //NEW_SPI #include "spi.h" -#endif //NEW_SPI extern LiquidCrystal_Prusa lcd; @@ -162,9 +158,6 @@ void tmc2130_init() SET_INPUT(Y_TMC2130_DIAG); SET_INPUT(Z_TMC2130_DIAG); SET_INPUT(E0_TMC2130_DIAG); -#ifndef NEW_SPI - SPI.begin(); -#endif //NEW_SPI for (int axis = 0; axis < 2; axis++) // X Y axes { tmc2130_setup_chopper(axis, tmc2130_mres[axis], tmc2130_current_h[axis], tmc2130_current_r[axis]); @@ -628,59 +621,6 @@ inline void tmc2130_cs_high(uint8_t axis) } } -#ifndef NEW_SPI - -uint8_t tmc2130_tx(uint8_t axis, uint8_t addr, uint32_t wval) -{ - //datagram1 - request - printf_P(PSTR("tmc2130_tx %d 0x%02hhx, 0x%08lx\n"), axis, addr, wval); - SPI.beginTransaction(SPISettings(4000000, MSBFIRST, SPI_MODE3)); - printf_P(PSTR(" SPCR = 0x%02hhx\n"), SPCR); - printf_P(PSTR(" SPSR = 0x%02hhx\n"), SPSR); - tmc2130_cs_low(axis); - SPI.transfer(addr); // address - SPI.transfer((wval >> 24) & 0xff); // MSB - SPI.transfer((wval >> 16) & 0xff); - SPI.transfer((wval >> 8) & 0xff); - SPI.transfer(wval & 0xff); // LSB - tmc2130_cs_high(axis); - SPI.endTransaction(); -} - -uint8_t tmc2130_rx(uint8_t axis, uint8_t addr, uint32_t* rval) -{ - //datagram1 - request - SPI.beginTransaction(SPISettings(4000000, MSBFIRST, SPI_MODE3)); - tmc2130_cs_low(axis); - SPI.transfer(addr); // address - SPI.transfer(0); // MSB - SPI.transfer(0); - SPI.transfer(0); - SPI.transfer(0); // LSB - tmc2130_cs_high(axis); - SPI.endTransaction(); - //datagram2 - response - SPI.beginTransaction(SPISettings(4000000, MSBFIRST, SPI_MODE3)); - tmc2130_cs_low(axis); - uint8_t stat = SPI.transfer(0); // status - uint32_t val32 = 0; - val32 = SPI.transfer(0); // MSB - val32 = (val32 << 8) | SPI.transfer(0); - val32 = (val32 << 8) | SPI.transfer(0); - val32 = (val32 << 8) | SPI.transfer(0); // LSB - tmc2130_cs_high(axis); - SPI.endTransaction(); - if (rval != 0) *rval = val32; - return stat; -} - -#else //NEW_SPI - -//Arduino SPI -//#define TMC2130_SPI_ENTER() SPI.beginTransaction(SPISettings(4000000, MSBFIRST, SPI_MODE3)) -//#define TMC2130_SPI_TXRX SPI.transfer -//#define TMC2130_SPI_LEAVE SPI.endTransaction - //spi #define TMC2130_SPI_ENTER() spi_setup(TMC2130_SPCR, TMC2130_SPSR) #define TMC2130_SPI_TXRX spi_txrx @@ -727,8 +667,6 @@ uint8_t tmc2130_rx(uint8_t axis, uint8_t addr, uint32_t* rval) return stat; } -#endif //NEW_SPI - void tmc2130_eeprom_load_config() { diff --git a/Firmware/variants/1_75mm_MK3-EINSy10a-E3Dv6full.h b/Firmware/variants/1_75mm_MK3-EINSy10a-E3Dv6full.h index 8d3a975d..66ccd4e2 100644 --- a/Firmware/variants/1_75mm_MK3-EINSy10a-E3Dv6full.h +++ b/Firmware/variants/1_75mm_MK3-EINSy10a-E3Dv6full.h @@ -118,9 +118,6 @@ // New XYZ calibration #define NEW_XYZCAL -// Do not use Arduino SPI -#define NEW_SPI - // Watchdog support #define WATCHDOG From 1e35067c3fd5628c1822e20ac1526db1b83ee768 Mon Sep 17 00:00:00 2001 From: Robert Pelnar Date: Sun, 10 Jun 2018 16:13:29 +0200 Subject: [PATCH 09/10] fixed variant files, removed bool constants --- .../variants/1_75mm_MK2-RAMBo10a-E3Dv6full.h | 20 +++++++++---------- .../variants/1_75mm_MK2-RAMBo13a-E3Dv6full.h | 20 +++++++++---------- .../variants/1_75mm_MK25-RAMBo10a-E3Dv6full.h | 20 +++++++++---------- .../variants/1_75mm_MK25-RAMBo13a-E3Dv6full.h | 20 +++++++++---------- .../variants/1_75mm_MK3-EINSy10a-E3Dv6full.h | 20 +++++++++---------- 5 files changed, 50 insertions(+), 50 deletions(-) diff --git a/Firmware/variants/1_75mm_MK2-RAMBo10a-E3Dv6full.h b/Firmware/variants/1_75mm_MK2-RAMBo10a-E3Dv6full.h index 2473fde9..d366d429 100644 --- a/Firmware/variants/1_75mm_MK2-RAMBo10a-E3Dv6full.h +++ b/Firmware/variants/1_75mm_MK2-RAMBo10a-E3Dv6full.h @@ -42,17 +42,17 @@ AXIS SETTINGS // Endstop inverting -#define X_MIN_ENDSTOP_INVERTING 0 // set to true to invert the logic of the endstop. -#define Y_MIN_ENDSTOP_INVERTING 0 // set to true to invert the logic of the endstop. -#define Z_MIN_ENDSTOP_INVERTING 0 // set to true to invert the logic of the endstop. +#define X_MIN_ENDSTOP_INVERTING 0 // set to 1 to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING 0 // set to 1 to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING 0 // set to 1 to invert the logic of the endstop. // Direction inverting -#define INVERT_X_DIR false // for Mendel set to false, for Orca set to true -#define INVERT_Y_DIR false // for Mendel set to true, for Orca set to false -#define INVERT_Z_DIR false // for Mendel set to false, for Orca set to true -#define INVERT_E0_DIR true // for direct drive extruder v9 set to true, for geared extruder set to false -#define INVERT_E1_DIR true // for direct drive extruder v9 set to true, for geared extruder set to false -#define INVERT_E2_DIR true // for direct drive extruder v9 set to true, for geared extruder set to false +#define INVERT_X_DIR 0 // for Mendel set to 0, for Orca set to 1 +#define INVERT_Y_DIR 0 // for Mendel set to 1, for Orca set to 0 +#define INVERT_Z_DIR 0 // for Mendel set to 0, for Orca set to 1 +#define INVERT_E0_DIR 1 // for direct drive extruder v9 set to 1, for geared extruder set to 0 +#define INVERT_E1_DIR 1 // for direct drive extruder v9 set to 1, for geared extruder set to 0 +#define INVERT_E2_DIR 1 // for direct drive extruder v9 set to 1, for geared extruder set to 0 // Home position @@ -403,7 +403,7 @@ THERMISTORS SETTINGS #define PINDA_MAX_T 100 #define PING_TIME 60 //time in s -#define PING_TIME_LONG 600 //10 min; used when length of commands buffer > 0 to avoid false triggering when dealing with long gcodes +#define PING_TIME_LONG 600 //10 min; used when length of commands buffer > 0 to avoid 0 triggering when dealing with long gcodes #define PING_ALLERT_PERIOD 60 //time in s #define NC_TIME 10 //time in s for periodic important status messages sending which needs reponse from monitoring diff --git a/Firmware/variants/1_75mm_MK2-RAMBo13a-E3Dv6full.h b/Firmware/variants/1_75mm_MK2-RAMBo13a-E3Dv6full.h index fd9d156e..df676383 100644 --- a/Firmware/variants/1_75mm_MK2-RAMBo13a-E3Dv6full.h +++ b/Firmware/variants/1_75mm_MK2-RAMBo13a-E3Dv6full.h @@ -42,17 +42,17 @@ AXIS SETTINGS // Endstop inverting -#define X_MIN_ENDSTOP_INVERTING 0 // set to true to invert the logic of the endstop. -#define Y_MIN_ENDSTOP_INVERTING 0 // set to true to invert the logic of the endstop. -#define Z_MIN_ENDSTOP_INVERTING 0 // set to true to invert the logic of the endstop. +#define X_MIN_ENDSTOP_INVERTING 0 // set to 1 to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING 0 // set to 1 to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING 0 // set to 1 to invert the logic of the endstop. // Direction inverting -#define INVERT_X_DIR false // for Mendel set to false, for Orca set to true -#define INVERT_Y_DIR false // for Mendel set to true, for Orca set to false -#define INVERT_Z_DIR false // for Mendel set to false, for Orca set to true -#define INVERT_E0_DIR true // for direct drive extruder v9 set to true, for geared extruder set to false -#define INVERT_E1_DIR true // for direct drive extruder v9 set to true, for geared extruder set to false -#define INVERT_E2_DIR true // for direct drive extruder v9 set to true, for geared extruder set to false +#define INVERT_X_DIR 0 // for Mendel set to 0, for Orca set to 1 +#define INVERT_Y_DIR 0 // for Mendel set to 1, for Orca set to 0 +#define INVERT_Z_DIR 0 // for Mendel set to 0, for Orca set to 1 +#define INVERT_E0_DIR 1 // for direct drive extruder v9 set to 1, for geared extruder set to 0 +#define INVERT_E1_DIR 1 // for direct drive extruder v9 set to 1, for geared extruder set to 0 +#define INVERT_E2_DIR 1 // for direct drive extruder v9 set to 1, for geared extruder set to 0 // Home position @@ -403,7 +403,7 @@ THERMISTORS SETTINGS #define PINDA_MAX_T 100 #define PING_TIME 60 //time in s -#define PING_TIME_LONG 600 //10 min; used when length of commands buffer > 0 to avoid false triggering when dealing with long gcodes +#define PING_TIME_LONG 600 //10 min; used when length of commands buffer > 0 to avoid 0 triggering when dealing with long gcodes #define PING_ALLERT_PERIOD 60 //time in s #define NC_TIME 10 //time in s for periodic important status messages sending which needs reponse from monitoring diff --git a/Firmware/variants/1_75mm_MK25-RAMBo10a-E3Dv6full.h b/Firmware/variants/1_75mm_MK25-RAMBo10a-E3Dv6full.h index aa1ee44f..06ead9f4 100644 --- a/Firmware/variants/1_75mm_MK25-RAMBo10a-E3Dv6full.h +++ b/Firmware/variants/1_75mm_MK25-RAMBo10a-E3Dv6full.h @@ -38,17 +38,17 @@ #define DEFAULT_AXIS_STEPS_PER_UNIT {100,100,3200/8,133} // Endstop inverting -#define X_MIN_ENDSTOP_INVERTING 0 // set to true to invert the logic of the endstop. -#define Y_MIN_ENDSTOP_INVERTING 0 // set to true to invert the logic of the endstop. -#define Z_MIN_ENDSTOP_INVERTING 0 // set to true to invert the logic of the endstop. +#define X_MIN_ENDSTOP_INVERTING 0 // set to 1 to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING 0 // set to 1 to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING 0 // set to 1 to invert the logic of the endstop. // Direction inverting -#define INVERT_X_DIR false // for Mendel set to false, for Orca set to true -#define INVERT_Y_DIR false // for Mendel set to true, for Orca set to false -#define INVERT_Z_DIR false // for Mendel set to false, for Orca set to true -#define INVERT_E0_DIR true // for direct drive extruder v9 set to true, for geared extruder set to false -#define INVERT_E1_DIR true // for direct drive extruder v9 set to true, for geared extruder set to false -#define INVERT_E2_DIR true // for direct drive extruder v9 set to true, for geared extruder set to false +#define INVERT_X_DIR 0 // for Mendel set to 0, for Orca set to 1 +#define INVERT_Y_DIR 0 // for Mendel set to 1, for Orca set to 0 +#define INVERT_Z_DIR 0 // for Mendel set to 0, for Orca set to 1 +#define INVERT_E0_DIR 1 // for direct drive extruder v9 set to 1, for geared extruder set to 0 +#define INVERT_E1_DIR 1 // for direct drive extruder v9 set to 1, for geared extruder set to 0 +#define INVERT_E2_DIR 1 // for direct drive extruder v9 set to 1, for geared extruder set to 0 // Home position #define MANUAL_X_HOME_POS 0 @@ -468,7 +468,7 @@ #define PINDA_MAX_T 100 #define PING_TIME 60 //time in s -#define PING_TIME_LONG 600 //10 min; used when length of commands buffer > 0 to avoid false triggering when dealing with long gcodes +#define PING_TIME_LONG 600 //10 min; used when length of commands buffer > 0 to avoid 0 triggering when dealing with long gcodes #define PING_ALLERT_PERIOD 60 //time in s #define NC_TIME 10 //time in s for periodic important status messages sending which needs reponse from monitoring diff --git a/Firmware/variants/1_75mm_MK25-RAMBo13a-E3Dv6full.h b/Firmware/variants/1_75mm_MK25-RAMBo13a-E3Dv6full.h index fac638ba..c5c094ae 100644 --- a/Firmware/variants/1_75mm_MK25-RAMBo13a-E3Dv6full.h +++ b/Firmware/variants/1_75mm_MK25-RAMBo13a-E3Dv6full.h @@ -38,17 +38,17 @@ #define DEFAULT_AXIS_STEPS_PER_UNIT {100,100,3200/8,133} // Endstop inverting -#define X_MIN_ENDSTOP_INVERTING 0 // set to true to invert the logic of the endstop. -#define Y_MIN_ENDSTOP_INVERTING 0 // set to true to invert the logic of the endstop. -#define Z_MIN_ENDSTOP_INVERTING 0 // set to true to invert the logic of the endstop. +#define X_MIN_ENDSTOP_INVERTING 0 // set to 1 to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING 0 // set to 1 to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING 0 // set to 1 to invert the logic of the endstop. // Direction inverting -#define INVERT_X_DIR false // for Mendel set to false, for Orca set to true -#define INVERT_Y_DIR false // for Mendel set to true, for Orca set to false -#define INVERT_Z_DIR false // for Mendel set to false, for Orca set to true -#define INVERT_E0_DIR true // for direct drive extruder v9 set to true, for geared extruder set to false -#define INVERT_E1_DIR true // for direct drive extruder v9 set to true, for geared extruder set to false -#define INVERT_E2_DIR true // for direct drive extruder v9 set to true, for geared extruder set to false +#define INVERT_X_DIR 0 // for Mendel set to 0, for Orca set to 1 +#define INVERT_Y_DIR 0 // for Mendel set to 1, for Orca set to 0 +#define INVERT_Z_DIR 0 // for Mendel set to 0, for Orca set to 1 +#define INVERT_E0_DIR 1 // for direct drive extruder v9 set to 1, for geared extruder set to 0 +#define INVERT_E1_DIR 1 // for direct drive extruder v9 set to 1, for geared extruder set to 0 +#define INVERT_E2_DIR 1 // for direct drive extruder v9 set to 1, for geared extruder set to 0 // Home position #define MANUAL_X_HOME_POS 0 @@ -468,7 +468,7 @@ #define PINDA_MAX_T 100 #define PING_TIME 60 //time in s -#define PING_TIME_LONG 600 //10 min; used when length of commands buffer > 0 to avoid false triggering when dealing with long gcodes +#define PING_TIME_LONG 600 //10 min; used when length of commands buffer > 0 to avoid 0 triggering when dealing with long gcodes #define PING_ALLERT_PERIOD 60 //time in s #define NC_TIME 10 //time in s for periodic important status messages sending which needs reponse from monitoring diff --git a/Firmware/variants/1_75mm_MK3-EINSy10a-E3Dv6full.h b/Firmware/variants/1_75mm_MK3-EINSy10a-E3Dv6full.h index 66ccd4e2..5128a6ef 100644 --- a/Firmware/variants/1_75mm_MK3-EINSy10a-E3Dv6full.h +++ b/Firmware/variants/1_75mm_MK3-EINSy10a-E3Dv6full.h @@ -39,17 +39,17 @@ //#define DEFAULT_AXIS_STEPS_PER_UNIT {100,100,3200/8,560} // Endstop inverting -#define X_MIN_ENDSTOP_INVERTING 0 // set to true to invert the logic of the endstop. -#define Y_MIN_ENDSTOP_INVERTING 0 // set to true to invert the logic of the endstop. -#define Z_MIN_ENDSTOP_INVERTING 0 // set to true to invert the logic of the endstop. +#define X_MIN_ENDSTOP_INVERTING 0 // set to 1 to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING 0 // set to 1 to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING 0 // set to 1 to invert the logic of the endstop. // Direction inverting -#define INVERT_X_DIR true // for Mendel set to false, for Orca set to true -#define INVERT_Y_DIR false // for Mendel set to true, for Orca set to false -#define INVERT_Z_DIR true // for Mendel set to false, for Orca set to true -#define INVERT_E0_DIR false // for direct drive extruder v9 set to true, for geared extruder set to false -#define INVERT_E1_DIR false // for direct drive extruder v9 set to true, for geared extruder set to false -#define INVERT_E2_DIR false // for direct drive extruder v9 set to true, for geared extruder set to false +#define INVERT_X_DIR 1 // for Mendel set to 0, for Orca set to 1 +#define INVERT_Y_DIR 0 // for Mendel set to 1, for Orca set to 0 +#define INVERT_Z_DIR 1 // for Mendel set to 0, for Orca set to 1 +#define INVERT_E0_DIR 0 // for direct drive extruder v9 set to 1, for geared extruder set to 0 +#define INVERT_E1_DIR 0 // for direct drive extruder v9 set to 1, for geared extruder set to 0 +#define INVERT_E2_DIR 0 // for direct drive extruder v9 set to 1, for geared extruder set to 0 // Home position #define MANUAL_X_HOME_POS 0 @@ -582,7 +582,7 @@ #define PINDA_MAX_T 100 #define PING_TIME 60 //time in s -#define PING_TIME_LONG 600 //10 min; used when length of commands buffer > 0 to avoid false triggering when dealing with long gcodes +#define PING_TIME_LONG 600 //10 min; used when length of commands buffer > 0 to avoid 0 triggering when dealing with long gcodes #define PING_ALLERT_PERIOD 60 //time in s #define NC_TIME 10 //time in s for periodic important status messages sending which needs reponse from monitoring From 076258ff9945c08aa9b7165793ea15a9a3981565 Mon Sep 17 00:00:00 2001 From: Robert Pelnar Date: Sun, 10 Jun 2018 16:28:15 +0200 Subject: [PATCH 10/10] New ML support - cond.trans. for LANG_MODE 0 --- Firmware/Marlin_main.cpp | 12 +++++++++++- Firmware/config.h | 2 +- Firmware/language.c | 2 ++ 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 419c5597..f2d8b8ab 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -989,6 +989,8 @@ void erase_eeprom_section(uint16_t offset, uint16_t bytes) } +#if (LANG_MODE != 0) //secondary language support + #ifdef W25X20CL #include "bootapp.h" //bootloader support @@ -1076,6 +1078,8 @@ void list_sec_lang_from_external_flash() #endif //W25X20CL +#endif //(LANG_MODE != 0) + // "Setup" function is called by the Arduino framework on startup. // Before startup, the Timers-functions (PWM)/Analog RW and HardwareSerial provided by the Arduino-code @@ -1089,12 +1093,14 @@ void setup() lcd_splash(); +#if (LANG_MODE != 0) //secondary language support #ifdef W25X20CL if (w25x20cl_init()) update_sec_lang_from_external_flash(); else kill(_i("External SPI flash W25X20CL not responding.")); #endif //W25X20CL +#endif //(LANG_MODE != 0) setup_killpin(); setup_powerhold(); @@ -1478,6 +1484,8 @@ void setup() // is being written into the EEPROM, so the update procedure will be triggered only once. +#if (LANG_MODE != 0) //secondary language support + #ifdef DEBUG_W25X20CL W25X20CL_SPI_ENTER(); uint8_t uid[8]; // 64bit unique id @@ -1501,7 +1509,9 @@ void setup() // lang_print_sec_lang(uartout); #endif //DEBUG_SEC_LANG - + +#endif //(LANG_MODE != 0) + if (eeprom_read_byte((uint8_t*)EEPROM_TEMP_CAL_ACTIVE) == 255) { eeprom_write_byte((uint8_t*)EEPROM_TEMP_CAL_ACTIVE, 0); temp_cal_active = false; diff --git a/Firmware/config.h b/Firmware/config.h index a9172429..43691453 100644 --- a/Firmware/config.h +++ b/Firmware/config.h @@ -28,7 +28,7 @@ //LANG - Multi-language support //#define LANG_MODE 0 // primary language only -#define LANG_MODE 1 // sec. language support +#define LANG_MODE 0 // sec. language support #define LANG_SIZE_RESERVED 0x2700 // reserved space for secondary language (~10kb) //#define LANG_SIZE_RESERVED 0x1ef8 // reserved space for secondary language (~10kb) diff --git a/Firmware/language.c b/Firmware/language.c index 7ee7902e..acac7d1b 100644 --- a/Firmware/language.c +++ b/Firmware/language.c @@ -20,6 +20,8 @@ uint8_t lang_select(uint8_t lang) { return 0; } uint8_t lang_get_count() { return 1; } uint16_t lang_get_code(uint8_t lang) { return LANG_CODE_EN; } const char* lang_get_name_by_code(uint16_t code) { return _n("English"); } +void lang_reset(void) { } +uint8_t lang_is_selected(void) { return 1; } #else //(LANG_MODE == 0) //secondary languages in progmem or xflash