language.h 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. /** @file */
  2. //language.h
  3. #ifndef LANGUAGE_H
  4. #define LANGUAGE_H
  5. #include "config.h"
  6. #include "macros.h"
  7. #include <inttypes.h>
  8. #ifdef DEBUG_SEC_LANG
  9. #include <stdio.h>
  10. #endif //DEBUG_SEC_LANG
  11. #define PROTOCOL_VERSION "1.0"
  12. #ifndef CUSTOM_MENDEL_NAME
  13. #define MACHINE_NAME "Mendel"
  14. #endif
  15. #ifndef MACHINE_UUID
  16. #define MACHINE_UUID "00000000-0000-0000-0000-000000000000"
  17. #endif
  18. #if (LANG_MODE == 0) //primary language only
  19. #define PROGMEM_I2 __attribute__((section(".progmem0")))
  20. #define PROGMEM_I1 __attribute__((section(".progmem1")))
  21. #define PROGMEM_N1 __attribute__((section(".progmem2")))
  22. #define _I(s) (__extension__({static const char __c[] PROGMEM_I1 = s; &__c[0];}))
  23. #define ISTR(s) s
  24. #define _i(s) _I(s)
  25. #define _T(s) s
  26. #else //(LANG_MODE == 0)
  27. // section .loc_sec (originaly .progmem0) will be used for localized translated strings
  28. #define PROGMEM_I2 __attribute__((section(".loc_sec")))
  29. // section .loc_pri (originaly .progmem1) will be used for localized strings in english
  30. #define PROGMEM_I1 __attribute__((section(".loc_pri")))
  31. // section .noloc (originaly progmem2) will be used for not localized strings in english
  32. #define PROGMEM_N1 __attribute__((section(".noloc")))
  33. #define _I(s) (__extension__({static const char __c[] PROGMEM_I1 = "\xff\xff" s; &__c[0];}))
  34. #define ISTR(s) "\xff\xff" s
  35. #define _i(s) lang_get_translation(_I(s))
  36. #define _T(s) lang_get_translation(s)
  37. #endif //(LANG_MODE == 0)
  38. #define _N(s) (__extension__({static const char __c[] PROGMEM_N1 = s; &__c[0];}))
  39. #define _n(s) _N(s)
  40. /** @brief lang_table_header_t structure - (size= 16byte) */
  41. typedef struct
  42. {
  43. uint32_t magic; //+0
  44. uint16_t size; //+4
  45. uint16_t count; //+6
  46. uint16_t checksum; //+8
  47. uint16_t code; //+10
  48. uint32_t signature; //+12
  49. } lang_table_header_t;
  50. /** @brief lang_table_t structure - (size= 16byte + 2*count) */
  51. typedef struct
  52. {
  53. lang_table_header_t header;
  54. uint16_t table[];
  55. } lang_table_t;
  56. /** @name Language indices into their particular symbol tables.*/
  57. ///@{
  58. #define LANG_ID_PRI 0
  59. #define LANG_ID_SEC 1
  60. ///@}
  61. /** @def LANG_ID_FORCE_SELECTION
  62. * @brief Language is not defined and it shall be selected from the menu.*/
  63. #define LANG_ID_FORCE_SELECTION 254
  64. /** @def LANG_ID_UNDEFINED
  65. * @brief Language is not defined on a virgin RAMBo board. */
  66. #define LANG_ID_UNDEFINED 255
  67. /** @def LANG_ID_DEFAULT
  68. * @brief Default language ID, if no language is selected. */
  69. #define LANG_ID_DEFAULT LANG_ID_PRI
  70. /** @def LANG_MAGIC
  71. * @brief Magic number at begin of lang table. */
  72. #define LANG_MAGIC 0x4bb45aa5
  73. /** @name Language codes (ISO639-1)*/
  74. ///@{
  75. #define LANG_CODE_XX 0x3f3f //!<'??'
  76. #define LANG_CODE_EN 0x656e //!<'en'
  77. #define LANG_CODE_CZ 0x6373 //!<'cs'
  78. #define LANG_CODE_DE 0x6465 //!<'de'
  79. #define LANG_CODE_ES 0x6573 //!<'es'
  80. #define LANG_CODE_FR 0x6672 //!<'fr'
  81. #define LANG_CODE_IT 0x6974 //!<'it'
  82. #define LANG_CODE_PL 0x706c //!<'pl'
  83. #ifdef COMMUNITY_LANGUAGE_SUPPORT //Community language support
  84. #ifdef COMMUNITY_LANG_GROUP1_NL
  85. #define LANG_CODE_NL 0x6e6c //!<'nl'
  86. #endif // COMMUNITY_LANG_GROUP1_NL
  87. #ifdef COMMUNITY_LANG_GROUP1_SV
  88. #define LANG_CODE_SV 0x7376 //!<'sv'
  89. #endif // COMMUNITY_LANG_GROUP1_SV
  90. #ifdef COMMUNITY_LANG_GROUP1_DA
  91. #define LANG_CODE_DA 0x6461 //!<'da'
  92. #endif // COMMUNITY_LANG_GROUP1_DA
  93. #ifdef COMMUNITY_LANG_GROUP1_SL
  94. #define LANG_CODE_SL 0x736C //!<'sl'
  95. #endif // COMMUNITY_LANG_GROUP1_SL
  96. #ifdef COMMUNITY_LANG_GROUP1_HU
  97. #define LANG_CODE_HU 0x6875 //!<'hu'
  98. #endif // COMMUNITY_LANG_GROUP1_HU
  99. #ifdef COMMUNITY_LANG_GROUP1_LB
  100. #define LANG_CODE_LB 0x6C62 //!<'lb'
  101. #endif // COMMUNITY_LANG_GROUP1_LB
  102. #ifdef COMMUNITY_LANG_GROUP1_HR
  103. #define LANG_CODE_HR 0x6872 //!<'hr'
  104. #endif // COMMUNITY_LANG_GROUP1_HR
  105. //Use the 3 lines below as a template and replace 'QR', '0X7172' and 'qr'
  106. //#ifdef COMMUNITY_LANG_GROUP1_QR
  107. //#define LANG_CODE_QR 0x7172 //!<'qr'
  108. //#endif // COMMUNITY_LANG_GROUP1_QR
  109. #endif // COMMUNITY_LANGUAGE_SUPPORT
  110. ///@}
  111. #if defined(__cplusplus)
  112. extern "C" {
  113. #endif //defined(__cplusplus)
  114. /** @brief Currectly active language selection.*/
  115. extern uint8_t lang_selected;
  116. #if (LANG_MODE != 0)
  117. extern const char _SEC_LANG[LANG_SIZE_RESERVED];
  118. extern const char* lang_get_translation(const char* s);
  119. /** @def _SEC_LANG_TABLE
  120. * @brief Align table to start of 256 byte page */
  121. #define _SEC_LANG_TABLE ((((uint16_t)&_SEC_LANG) + 0x00ff) & 0xff00)
  122. #endif //(LANG_MODE != 0)
  123. /** @brief selects language, eeprom is updated in case of success */
  124. extern uint8_t lang_select(uint8_t lang);
  125. /** @brief performs checksum test of secondary language data */
  126. extern uint8_t lang_check(uint16_t addr);
  127. /** @return total number of languages (primary + all in xflash) */
  128. extern uint8_t lang_get_count(void);
  129. /** @brief reads lang table header and offset in xflash or progmem */
  130. extern uint8_t lang_get_header(uint8_t lang, lang_table_header_t* header, uint32_t* offset);
  131. /** @brief reads lang code from xflash or progmem */
  132. extern uint16_t lang_get_code(uint8_t lang);
  133. /** @return localized language name (text for menu item) */
  134. extern const char* lang_get_name_by_code(uint16_t code);
  135. /** @brief reset language to "LANG_ID_FORCE_SELECTION", epprom is updated */
  136. extern void lang_reset(void);
  137. /** @retval 1 language is selected */
  138. extern uint8_t lang_is_selected(void);
  139. #ifdef DEBUG_SEC_LANG
  140. extern const char* lang_get_sec_lang_str_by_id(uint16_t id);
  141. extern uint16_t lang_print_sec_lang(FILE* out);
  142. #endif //DEBUG_SEC_LANG
  143. extern void lang_boot_update_start(uint8_t lang);
  144. #if defined(__cplusplus)
  145. }
  146. #endif //defined(__cplusplus)
  147. #define CAT2(_s1, _s2) _s1
  148. #define CAT4(_s1, _s2, _s3, _s4) _s1
  149. #include "messages.h"
  150. #endif //LANGUAGE_H