New ML support - lang codes

+script tunning
This commit is contained in:
Robert Pelnar 2018-06-01 10:47:47 +02:00
parent 7ab53af604
commit 53d9d8bd8a
5 changed files with 67 additions and 18 deletions

View file

@ -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

View file

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

View file

@ -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);

View file

@ -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

View file

@ -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)