From 53d9d8bd8a72614cc6a49309c4ef7897bd9d84ec Mon Sep 17 00:00:00 2001 From: Robert Pelnar Date: Fri, 1 Jun 2018 10:47:47 +0200 Subject: [PATCH] New ML support - lang codes +script tunning --- Firmware/Marlin_main.cpp | 4 +++ Firmware/language.c | 53 ++++++++++++++++++++++++++++------------ Firmware/language.h | 13 ++++++++++ lang/make_lang.sh | 13 ++++++++-- lang/po/make_po.sh | 2 +- 5 files changed, 67 insertions(+), 18 deletions(-) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index ae01b7538..4c8b355b5 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -1309,6 +1309,10 @@ void setup() lcd_mylang(); } lang_select(lang_selected); + + 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 diff --git a/Firmware/language.c b/Firmware/language.c index bd7122bcb..3f9627581 100644 --- a/Firmware/language.c +++ b/Firmware/language.c @@ -13,18 +13,21 @@ uint8_t lang_selected = 0; const char _SEC_LANG[LANG_SIZE_RESERVED] PROGMEM_I2 = "_SEC_LANG"; #endif //(LANG_MODE == 0) -//lang_table_t structure - 16byte header +//lang_table_header_t structure - (size= 16byte) typedef struct { - struct - { - uint32_t magic; //+0 - uint16_t size; //+4 - uint16_t count; //+6 - uint16_t checksum; //+8 - uint16_t reserved0; //+10 - uint32_t reserved1; //+12 - } header; + uint32_t magic; //+0 + uint16_t size; //+4 + uint16_t count; //+6 + uint16_t checksum; //+8 + uint16_t code; //+10 + uint32_t reserved1; //+12 +} lang_table_header_t; + +//lang_table_t structure - (size= 16byte + 2*count) +typedef struct +{ + lang_table_header_t header; uint16_t table[]; } lang_table_t; @@ -88,14 +91,34 @@ uint8_t lang_get_count() ui += 0x00ff; //add 1 page ui &= 0xff00; //align to page lang_table_t* _lang_table = ui; //table pointer - if (pgm_read_dword(((uint32_t*)(_lang_table + 0))) == 0x4bb45aa5) return 2; + if (pgm_read_dword(((uint32_t*)(_lang_table + 0))) == LANG_MAGIC) return 2; return 1; } const char* lang_get_name(uint8_t lang) { - if (lang == 0) return MSG_LANGUAGE_NAME + 2; - return lang_get_sec_lang_str(MSG_LANGUAGE_NAME); + if (lang == LANG_ID_UNDEFINED) lang = lang_selected; + if (lang == LANG_ID_PRI) return 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; +} + +uint16_t lang_get_code(uint8_t lang) +{ + if (lang == LANG_ID_UNDEFINED) lang = lang_selected; + if (lang == LANG_ID_PRI) return LANG_CODE_EN; + 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 pgm_read_word(((uint16_t*)(ui + 10))); //read language code + } + return LANG_CODE_XX; } #ifdef DEBUG_SEC_LANG @@ -111,13 +134,13 @@ uint16_t lang_print_sec_lang(FILE* out) uint16_t _lt_chsum = pgm_read_word(((uint16_t*)(ptr_lang_table0 + 8))); uint16_t _lt_resv0 = pgm_read_word(((uint16_t*)(ptr_lang_table0 + 10))); uint32_t _lt_resv1 = pgm_read_dword(((uint32_t*)(ptr_lang_table0 + 12))); - printf_P(_n(" _lt_magic = 0x%08lx %S\n"), _lt_magic, (_lt_magic==0x4bb45aa5)?_n("OK"):_n("NA")); + printf_P(_n(" _lt_magic = 0x%08lx %S\n"), _lt_magic, (_lt_magic==LANG_MAGIC)?_n("OK"):_n("NA")); printf_P(_n(" _lt_size = 0x%04x (%d)\n"), _lt_size, _lt_size); printf_P(_n(" _lt_count = 0x%04x (%d)\n"), _lt_count, _lt_count); printf_P(_n(" _lt_chsum = 0x%04x\n"), _lt_chsum); printf_P(_n(" _lt_resv0 = 0x%04x\n"), _lt_resv0); printf_P(_n(" _lt_resv1 = 0x%08lx\n"), _lt_resv1); - if (_lt_magic != 0x4bb45aa5) return 0; + if (_lt_magic != LANG_MAGIC) return 0; puts_P(_n(" strings:\n")); uint16_t ui = ((((uint16_t)&_SEC_LANG) + 0x00ff) & 0xff00); //table pointer for (ui = 0; ui < _lt_count; ui++) diff --git a/Firmware/language.h b/Firmware/language.h index be58bfa36..e41f7cb82 100644 --- a/Firmware/language.h +++ b/Firmware/language.h @@ -51,6 +51,7 @@ // Language is not defined and it shall be selected from the menu. #define LANG_ID_FORCE_SELECTION 254 + // Language is not defined on a virgin RAMBo board. #define LANG_ID_UNDEFINED 255 @@ -60,6 +61,17 @@ // Number of languages available in the language table. #define LANG_NUM 2 +// Magic number at begin of lang table. +#define LANG_MAGIC 0x4bb45aa5 + +// Language codes (ISO639-1) +#define LANG_CODE_XX 0x3f3f //'??' +#define LANG_CODE_EN 0x656e //'en' +#define LANG_CODE_CZ 0x6373 //'cs' +#define LANG_CODE_DE 0x6465 //'de' +#define LANG_CODE_ES 0x6573 //'es' +#define LANG_CODE_IT 0x6974 //'it' +#define LANG_CODE_PL 0x706c //'pl' #if defined(__cplusplus) extern "C" { @@ -78,6 +90,7 @@ extern const char* lang_get_sec_lang_str_by_id(uint16_t id); extern const char* lang_select(uint8_t lang); extern uint8_t lang_get_count(); extern const char* lang_get_name(uint8_t lang); +extern uint16_t lang_get_code(uint8_t lang); #ifdef DEBUG_SEC_LANG extern uint16_t lang_print_sec_lang(FILE* out); diff --git a/lang/make_lang.sh b/lang/make_lang.sh index 74cffcd96..261857e4a 100644 --- a/lang/make_lang.sh +++ b/lang/make_lang.sh @@ -87,9 +87,18 @@ lt_data_size=$(wc -c lang_$LANG.dat | cut -f1 -d' ') lt_offs_size=$((2 * $lt_count)) lt_size=$((16 + $lt_offs_size + $lt_data_size)) lt_chsum=1 -lt_resv0='\xff\xff' +lt_code='\xff\xff' lt_resv1='\xff\xff\xff\xff' +case "$LANG" in + *en*) lt_code='\x6e\x65' ;; + *cz*) lt_code='\x73\x63' ;; + *de*) lt_code='\x65\x64' ;; + *es*) lt_code='\x73\x65' ;; + *it*) lt_code='\x74\x69' ;; + *pl*) lt_code='\x6c\x70' ;; +esac + #generate lang_xx.ofs (secondary language text data offset table) echo -n " generating lang_$LANG.ofs..." >&2 cat lang_$LANG.txt | sed "s/\\\\x[0-9a-f][0-9a-f]/\./g;s/\\\\[0-7][0-7][0-7]/\./g" |\ @@ -114,7 +123,7 @@ echo -n " writing header (16 bytes)..." >&2 dd of=lang_$LANG.bin bs=1 count=2 seek=6 conv=notrunc 2>/dev/null /bin/echo -n -e $(echo -n "$lt_chsum" | awk "$awk_ui16") |\ dd of=lang_$LANG.bin bs=1 count=2 seek=8 conv=notrunc 2>/dev/null -/bin/echo -n -e "$lt_resv0" |\ +/bin/echo -n -e "$lt_code" |\ dd of=lang_$LANG.bin bs=1 count=2 seek=10 conv=notrunc 2>/dev/null /bin/echo -n -e "$lt_resv1" |\ dd of=lang_$LANG.bin bs=1 count=4 seek=12 conv=notrunc 2>/dev/null diff --git a/lang/po/make_po.sh b/lang/po/make_po.sh index 740a4183e..20b83cfcf 100644 --- a/lang/po/make_po.sh +++ b/lang/po/make_po.sh @@ -29,8 +29,8 @@ lang_name=$(\ *en*) echo "English" ;; *cz*) echo "Czech" ;; *de*) echo "German" ;; - *it*) echo "Italian" ;; *es*) echo "Spanish" ;; + *it*) echo "Italian" ;; *pl*) echo "Polish" ;; esac)