Преглед на файлове

New ML support - lang codes
+script tunning

Robert Pelnar преди 6 години
родител
ревизия
53d9d8bd8a
променени са 5 файла, в които са добавени 67 реда и са изтрити 18 реда
  1. 4 0
      Firmware/Marlin_main.cpp
  2. 38 15
      Firmware/language.c
  3. 13 0
      Firmware/language.h
  4. 11 2
      lang/make_lang.sh
  5. 1 1
      lang/po/make_po.sh

+ 4 - 0
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

+ 38 - 15
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++)

+ 13 - 0
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);

+ 11 - 2
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

+ 1 - 1
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)