My Marlin configs for Fabrikator Mini and CTC i3 Pro B
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

dwin_string.h 31KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050
  1. /**
  2. * Marlin 3D Printer Firmware
  3. * Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
  4. *
  5. * Based on Sprinter and grbl.
  6. * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
  7. *
  8. * This program is free software: you can redistribute it and/or modify
  9. * it under the terms of the GNU General Public License as published by
  10. * the Free Software Foundation, either version 3 of the License, or
  11. * (at your option) any later version.
  12. *
  13. * This program is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. * GNU General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU General Public License
  19. * along with this program. If not, see <https://www.gnu.org/licenses/>.
  20. *
  21. */
  22. #pragma once
  23. // TODO: Make AVR-compatible with separate ROM / RAM string methods
  24. #include "../../fontutils.h"
  25. #include "../../marlinui.h"
  26. #include <stdint.h>
  27. typedef struct _dwin_charmap_t {
  28. wchar_t uchar; // the unicode char
  29. uint8_t idx; // the glyph of the char in the ROM
  30. uint8_t idx2; // the char used to be combined with the idx to simulate a single char
  31. } dwin_charmap_t;
  32. #define MAX_STRING_LENGTH 64
  33. #define S(V) (char*)(V)
  34. class DWIN_String {
  35. private:
  36. //static glyph_t *glyphs[256];
  37. //static font_t *font_header;
  38. static char data[MAX_STRING_LENGTH + 1];
  39. static uint16_t span; // in pixels
  40. static void add_character(const char character);
  41. static void eol() { data[length] = 0x00; }
  42. public:
  43. static uint8_t length; // in characters
  44. //static void set_font(const uint8_t *font);
  45. //static void add_glyphs(const uint8_t *font);
  46. //static font_t *font() { return font_header; };
  47. //static uint16_t font_height() { return font_header->FontAscent - font_header->FontDescent; }
  48. //static glyph_t *glyph(uint8_t character) { return glyphs[character] ?: glyphs[0x3F]; } /* Use '?' for unknown glyphs */
  49. //static glyph_t *glyph(uint8_t *character) { return glyph(*character); }
  50. /**
  51. * @brief Set the string empty
  52. */
  53. static void set();
  54. //static void add(const char character) { add_character(character); eol(); }
  55. /**
  56. * @brief Append a UTF-8 character
  57. *
  58. * @param character The UTF-8 character
  59. */
  60. static void add(wchar_t character);
  61. static void set(wchar_t character) { set(); add(character); }
  62. /**
  63. * @brief Append / Set C-string
  64. *
  65. * @param cstr The string
  66. * @param max_len Character limit
  67. */
  68. static void add(const char *cstr, uint8_t max_len=MAX_STRING_LENGTH);
  69. static void set(const char *cstr) { set(); add(cstr); }
  70. /**
  71. * @brief Append / Set F-string
  72. *
  73. * @param fstr The string
  74. * @param max_len Character limit
  75. */
  76. static void add(FSTR_P const fstr, uint8_t max_len=MAX_STRING_LENGTH) { add(FTOP(fstr), max_len); }
  77. static void set(FSTR_P const fstr) { set(FTOP(fstr)); }
  78. /**
  79. * @brief Append / Set C-string with optional substitution
  80. *
  81. * @param tpl A string with optional substitution
  82. * @param index An index
  83. * @param cstr An SRAM C-string to use for $ substitution
  84. * @param fstr A ROM F-string to use for $ substitution
  85. */
  86. static void add(const char *tpl, const int8_t index, const char *cstr=nullptr, FSTR_P const fstr=nullptr);
  87. static void set(const char *tpl, const int8_t index, const char *cstr=nullptr, FSTR_P const fstr=nullptr) { set(); add(tpl, index, cstr, fstr); }
  88. /**
  89. * @brief Append / Set F-string with optional substitution
  90. *
  91. * @param ftpl A ROM F-string with optional substitution
  92. * @param index An index
  93. * @param cstr An SRAM C-string to use for $ substitution
  94. * @param fstr A ROM F-string to use for $ substitution
  95. */
  96. static void add(FSTR_P const ftpl, const int8_t index, const char *cstr=nullptr, FSTR_P const fstr=nullptr) { add(FTOP(ftpl), index, cstr, fstr); }
  97. static void set(FSTR_P const ftpl, const int8_t index, const char *cstr=nullptr, FSTR_P const fstr=nullptr) { set(); add(ftpl, index, cstr, fstr); }
  98. // Common string ops
  99. static void trim(const char character=' ');
  100. static void rtrim(const char character=' ');
  101. static void ltrim(const char character=' ');
  102. static void truncate(const uint8_t maxlen) { if (length > maxlen) { length = maxlen; eol(); } }
  103. // Accessors
  104. static char *string() { return data; }
  105. static uint16_t width() { return span; }
  106. static uint16_t center(const uint16_t width) { return span > width ? 0 : (width - span) / 2; }
  107. };
  108. int dwin_charmap_compare(dwin_charmap_t *v1, dwin_charmap_t *v2);
  109. int pf_bsearch_cb_comp_dwinmap_pgm(void *userdata, size_t idx, void *data_pin);
  110. extern DWIN_String dwin_string;
  111. #ifdef __AVR__
  112. #define IV(a) U##a
  113. #else
  114. #define IV(a) L##a
  115. #endif
  116. const dwin_charmap_t g_dwin_charmap_device[] PROGMEM = {
  117. // sorted by uchar:
  118. #if DISPLAY_CHARSET_HD44780 == JAPANESE
  119. {IV('¢'), 0xEC, 0}, // A2
  120. {IV('°'), 0xDF, 0}, // B0, Marlin special: '°' LCD_STR_DEGREE (0x09)
  121. {IV('ä'), 0xE1, 0}, // E4
  122. {IV('ö'), 0xEF, 0}, // F6
  123. {IV('÷'), 0xFD, 0}, // 00F7
  124. {IV('ü'), 0xF5, 0}, // 00FC
  125. {IV('ˣ'), 0xEB, 0}, // 02E3
  126. {IV('·'), 0xA5, 0}, // 0387
  127. {IV('Ώ'), 0xF4, 0}, // 038F
  128. {IV('Θ'), 0xF2, 0}, // 0398, Theta
  129. {IV('Ξ'), 0xE3, 0}, // 039E, Xi
  130. {IV('Σ'), 0xF6, 0}, // 03A3, Sigma
  131. {IV('Ω'), 0xF4, 0}, // 03A9, Omega
  132. {IV('ά'), 0xE0, 0}, // 03AC
  133. {IV('έ'), 0xE3, 0}, // 03AD
  134. {IV('α'), 0xE0, 0}, // 03B1, alpha
  135. {IV('β'), 0xE2, 0}, // 03B2, beta
  136. {IV('ε'), 0xE3, 0}, // 03B5, epsilon
  137. {IV('θ'), 0xF2, 0}, // 03B8, theta
  138. {IV('μ'), 0xE4, 0}, // 03BC, mu
  139. {IV('ξ'), 0xE3, 0}, // 03BE, xi
  140. {IV('π'), 0xF7, 0}, // 03C0, pi
  141. {IV('ρ'), 0xE6, 0}, // 03C1, rho
  142. {IV('σ'), 0xE5, 0}, // 03C3, sigma
  143. {IV('←'), 0x7F, 0}, // 2190
  144. {IV('→'), 0x7E, 0}, // 2192, Marlin special: '⮈⮉⮊⮋➤→' LCD_STR_ARROW_RIGHT (0x03)
  145. {IV('√'), 0xE8, 0}, // 221A
  146. {IV('∞'), 0xF3, 0}, // 221E
  147. {IV('█'), 0xFF, 0}, // 2588
  148. //{IV(''), 0xA0, 0},
  149. {IV('。'), 0xA1, 0},
  150. {IV('「'), 0xA2, 0},
  151. {IV('」'), 0xA3, 0},
  152. {IV('゛'), 0xDE, 0}, // ‶
  153. {IV('゜'), 0xDF, 0}, // '〫'
  154. {IV('゠'), '=', 0},
  155. {IV('ァ'), 0xA7, 0},
  156. {IV('ア'), 0xB1, 0},
  157. {IV('ィ'), 0xA8, 0},
  158. {IV('イ'), 0xB2, 0},
  159. {IV('ゥ'), 0xA9, 0},
  160. {IV('ウ'), 0xB3, 0},
  161. {IV('ェ'), 0xAA, 0},
  162. {IV('エ'), 0xB4, 0},
  163. {IV('ォ'), 0xAB, 0},
  164. {IV('オ'), 0xB5, 0},
  165. {IV('カ'), 0xB6, 0},
  166. {IV('ガ'), 0xB6, 0xDE},
  167. {IV('キ'), 0xB7, 0},
  168. {IV('ギ'), 0xB7, 0xDE},
  169. {IV('ク'), 0xB8, 0},
  170. {IV('グ'), 0xB8, 0xDE},
  171. {IV('ケ'), 0xB9, 0},
  172. {IV('ゲ'), 0xB9, 0xDE},
  173. {IV('コ'), 0xBA, 0},
  174. {IV('ゴ'), 0xBA, 0xDE},
  175. {IV('サ'), 0xBB, 0},
  176. {IV('ザ'), 0xBB, 0xDE},
  177. {IV('シ'), 0xBC, 0},
  178. {IV('ジ'), 0xBC, 0xDE},
  179. {IV('ス'), 0xBD, 0},
  180. {IV('ズ'), 0xBD, 0xDE},
  181. {IV('セ'), 0xBE, 0},
  182. {IV('ゼ'), 0xBE, 0xDE},
  183. {IV('ソ'), 0xBF, 0},
  184. {IV('ゾ'), 0xBF, 0xDE},
  185. {IV('タ'), 0xC0, 0},
  186. {IV('ダ'), 0xC0, 0xDE},
  187. {IV('チ'), 0xC1, 0},
  188. {IV('ヂ'), 0xC1, 0xDE},
  189. {IV('ッ'), 0xAF, 0},
  190. {IV('ツ'), 0xC2, 0},
  191. {IV('ヅ'), 0xC2, 0xDE},
  192. {IV('テ'), 0xC3, 0},
  193. {IV('デ'), 0xC3, 0xDE},
  194. {IV('ト'), 0xC4, 0},
  195. {IV('ド'), 0xC4, 0xDE},
  196. {IV('ナ'), 0xC5, 0},
  197. {IV('ニ'), 0xC6, 0},
  198. {IV('ヌ'), 0xC7, 0},
  199. {IV('ネ'), 0xC8, 0},
  200. {IV('ノ'), 0xC9, 0},
  201. {IV('ハ'), 0xCA, 0},
  202. {IV('バ'), 0xCA, 0xDE},
  203. {IV('パ'), 0xCA, 0xDF},
  204. {IV('ヒ'), 0xCB, 0},
  205. {IV('ビ'), 0xCB, 0xDE},
  206. {IV('ピ'), 0xCB, 0xDF},
  207. {IV('フ'), 0xCC, 0},
  208. {IV('ブ'), 0xCC, 0xDE},
  209. {IV('プ'), 0xCC, 0xDF},
  210. {IV('ヘ'), 0xCD, 0},
  211. {IV('ベ'), 0xCD, 0xDE},
  212. {IV('ペ'), 0xCD, 0xDF},
  213. {IV('ホ'), 0xCE, 0},
  214. {IV('ボ'), 0xCE, 0xDE},
  215. {IV('ポ'), 0xCE, 0xDF},
  216. {IV('マ'), 0xCF, 0},
  217. {IV('ミ'), 0xD0, 0},
  218. {IV('ム'), 0xD1, 0},
  219. {IV('メ'), 0xD2, 0},
  220. {IV('モ'), 0xD3, 0},
  221. {IV('ャ'), 0xAC, 0},
  222. {IV('ヤ'), 0xD4, 0},
  223. {IV('ュ'), 0xAD, 0},
  224. {IV('ユ'), 0xD5, 0},
  225. {IV('ョ'), 0xAE, 0},
  226. {IV('ヨ'), 0xD6, 0},
  227. {IV('ラ'), 0xD7, 0},
  228. {IV('リ'), 0xD8, 0},
  229. {IV('ル'), 0xD9, 0},
  230. {IV('レ'), 0xDA, 0},
  231. {IV('ロ'), 0xDB, 0},
  232. {IV('ワ'), 0xDC, 0},
  233. {IV('ヲ'), 0xA6, 0},
  234. {IV('ン'), 0xDD, 0},
  235. {IV('ヴ'), 0xB3, 0xDE},
  236. {IV('ヷ'), 0xDC, 0xDE},
  237. {IV('ヺ'), 0xA6, 0xDE},
  238. {IV('・'), 0xA5, 0},
  239. {IV('ー'), 0xB0, 0},
  240. {IV('ヽ'), 0xA4, 0},
  241. //{IV('g'), 0xE7, 0}, // error
  242. //{IV(''), 0xE9, 0},
  243. //{IV('j'), 0xEA, 0}, // error
  244. //{IV(''), 0xED, 0},
  245. //{IV(''), 0xEE, 0},
  246. //{IV('p'), 0xF0, 0}, // error
  247. //{IV('q'), 0xF1, 0}, // error
  248. //{IV(''), 0xF8, 0},
  249. //{IV('y'), 0xF9, 0}, // error
  250. {IV('万'), 0xFB, 0},
  251. {IV('円'), 0xFC, 0},
  252. {IV('千'), 0xFA, 0},
  253. //{IV(''), 0xFE, 0},
  254. //、・ヲァィゥェォャュョッー
  255. {IV('、'), 0xA4, 0}, //ヽ
  256. {IV('・'), 0xA5, 0}, //・
  257. {IV('ヲ'), 0xA6, 0}, //ヲ
  258. {IV('ァ'), 0xA7, 0}, //ァ
  259. {IV('ィ'), 0xA8, 0}, //ィ
  260. {IV('ゥ'), 0xA9, 0}, //ゥ
  261. {IV('ェ'), 0xAA, 0}, //ェ
  262. {IV('ォ'), 0xAB, 0}, //ォ
  263. {IV('ャ'), 0xAC, 0}, //ャ
  264. {IV('ュ'), 0xAD, 0}, //ュ
  265. {IV('ョ'), 0xAE, 0}, //ョ
  266. {IV('ッ'), 0xAF, 0}, //ッ
  267. {IV('ー'), 0xB0, 0}, //ー
  268. //アイウエオカキクケコサシスセ
  269. {IV('ア'), 0xB1, 0}, //ア
  270. {IV('イ'), 0xB2, 0}, //イ
  271. {IV('ウ'), 0xB3, 0}, //ウ
  272. {IV('エ'), 0xB4, 0}, //エ
  273. {IV('オ'), 0xB5, 0}, //オ
  274. {IV('カ'), 0xB6, 0}, //カ
  275. {IV('キ'), 0xB7, 0}, //キ
  276. {IV('ク'), 0xB8, 0}, //ク
  277. {IV('ケ'), 0xB9, 0}, //ケ
  278. {IV('コ'), 0xBA, 0}, //コ
  279. {IV('サ'), 0xBB, 0}, //サ
  280. {IV('シ'), 0xBC, 0}, //シ
  281. {IV('ス'), 0xBD, 0}, //ス
  282. {IV('セ'), 0xBE, 0}, //セ
  283. //ソタチツテトナニヌネノハヒフ
  284. {IV('ソ'), 0xBF, 0}, //ソ
  285. {IV('タ'), 0xC0, 0}, //タ
  286. {IV('チ'), 0xC1, 0}, //チ
  287. {IV('ツ'), 0xC2, 0}, //ツ
  288. {IV('テ'), 0xC3, 0}, //テ
  289. {IV('ト'), 0xC4, 0}, //ト
  290. {IV('ナ'), 0xC5, 0}, //ナ
  291. {IV('ニ'), 0xC6, 0}, //ニ
  292. {IV('ヌ'), 0xC7, 0}, //ヌ
  293. {IV('ネ'), 0xC8, 0}, //ネ
  294. {IV('ノ'), 0xC9, 0}, //ノ
  295. {IV('ハ'), 0xCA, 0}, //ハ
  296. {IV('ヒ'), 0xCB, 0}, //ヒ
  297. {IV('フ'), 0xCC, 0}, //フ
  298. //ヘホマミムメモヤユヨラリルレロワン゙゚
  299. {IV('ヘ'), 0xCD, 0}, //ヘ
  300. {IV('ホ'), 0xCE, 0}, //ホ
  301. {IV('マ'), 0xCF, 0}, //マ
  302. {IV('ミ'), 0xD0, 0}, //ミ
  303. {IV('ム'), 0xD1, 0}, //ム
  304. {IV('メ'), 0xD2, 0}, //メ
  305. {IV('モ'), 0xD3, 0}, //モ
  306. {IV('ヤ'), 0xD4, 0}, //ヤ
  307. {IV('ユ'), 0xD5, 0}, //ユ
  308. {IV('ヨ'), 0xD6, 0}, //ヨ
  309. {IV('ラ'), 0xD7, 0}, //ラ
  310. {IV('リ'), 0xD8, 0}, //リ
  311. {IV('ル'), 0xD9, 0}, //ル
  312. {IV('レ'), 0xDA, 0}, //レ
  313. {IV('ロ'), 0xDB, 0}, //ロ
  314. {IV('ワ'), 0xDC, 0}, //ワ
  315. {IV('ン'), 0xDD, 0}, //ン
  316. {IV('゙'), 0xDE, 0}, // ゛
  317. {IV('゚'), 0xDF, 0}, // ゜
  318. {IV('¥'), 0x5C, 0},
  319. #elif DISPLAY_CHARSET_HD44780 == WESTERN
  320. // 0x10 -- 0x1F (except 0x1C)
  321. // 0x80 -- 0xFF (except 0xA7,0xB0,0xB1,0xB3,0xB4,0xBF,0xD1,0xF8,0xFA,0xFC-0xFF)
  322. {IV('¡'), 0xA9, 0},
  323. {IV('¢'), 0xA4, 0},
  324. {IV('£'), 0xA5, 0},
  325. {IV('¥'), 0xA6, 0},
  326. {IV('§'), 0xD2, 0}, // section sign
  327. {IV('©'), 0xCF, 0},
  328. {IV('ª'), 0x9D, 0},
  329. {IV('«'), 0xBB, 0},
  330. {IV('®'), 0xCE, 0},
  331. {IV('°'), 0xB2, 0}, // Marlin special: '°' LCD_STR_DEGREE (0x09)
  332. //{IV(''), 0xD1, 0},
  333. {IV('±'), 0x10, 0}, //∓±
  334. //{'='), 0x1C, 0}, // error
  335. {IV('²'), 0x1E, 0},
  336. {IV('³'), 0x1F, 0},
  337. {IV('¶'), 0xD3, 0}, // pilcrow sign
  338. {IV('º'), 0x9E, 0},
  339. {IV('»'), 0xBC, 0}, // 00BB
  340. //{IV(''), 0xB3, 0}, // error
  341. //{IV(''), 0xB4, 0}, // error
  342. {IV('¼'), 0xB6, 0}, // 00BC
  343. {IV('½'), 0xB5, 0}, // 00BD
  344. //{IV('¾'), '3', 0}, // 00BE
  345. {IV('¿'), 0x9F, 0}, // 00BF
  346. {IV('Â'), 0x8F, 0},
  347. {IV('Ã'), 0xAA, 0},
  348. {IV('Ä'), 0x8E, 0},
  349. {IV('Æ'), 0x92, 0},
  350. {IV('Ç'), 0x80, 0},
  351. {IV('É'), 0x90, 0},
  352. {IV('Ñ'), 0x9C, 0},
  353. {IV('Õ'), 0xAC, 0},
  354. {IV('Ö'), 0x99, 0},
  355. {IV('×'), 0xB7, 0},
  356. {IV('Ø'), 0xAE, 0},
  357. {IV('Ü'), 0x9A, 0},
  358. {IV('à'), 0x85, 0},
  359. {IV('á'), 0xA0, 0},
  360. {IV('â'), 0x83, 0},
  361. {IV('ã'), 0xAB, 0},
  362. {IV('ä'), 0x84, 0},
  363. {IV('å'), 0x86, 0},
  364. {IV('æ'), 0x91, 0},
  365. {IV('ç'), 0x87, 0},
  366. {IV('è'), 0x8A, 0},
  367. {IV('é'), 0x82, 0},
  368. {IV('ê'), 0x88, 0},
  369. {IV('ë'), 0x89, 0},
  370. {IV('ì'), 0x8D, 0},
  371. {IV('í'), 0xA1, 0},
  372. {IV('î'), 0x8C, 0},
  373. {IV('ï'), 0x8B, 0},
  374. {IV('ñ'), 0x9B, 0},
  375. {IV('ò'), 0x95, 0},
  376. {IV('ó'), 0xA2, 0},
  377. {IV('ô'), 0x93, 0},
  378. {IV('õ'), 0xAD, 0},
  379. {IV('ö'), 0x94, 0},
  380. {IV('÷'), 0xB8, 0},
  381. {IV('ø'), 0xAF, 0},
  382. {IV('ù'), 0x97, 0},
  383. {IV('ú'), 0xA3, 0},
  384. {IV('û'), 0x96, 0},
  385. {IV('ü'), 0x81, 0},
  386. {IV('ÿ'), 0x98, 0},
  387. //{IV(''), 0xB0, 0}, // error
  388. //{IV(''), 0xB1, 0}, // error
  389. {IV('ƒ'), 0xA8, 0}, // 0192
  390. {IV('Ύ'), 0xDB, 0}, // 038E
  391. {IV('Ώ'), 0xDE, 0}, // 038F
  392. {IV('ΐ'), 0xE7, 0}, // 0390
  393. {IV('Γ'), 0xD4, 0}, // 0393, Gamma
  394. {IV('Δ'), 0xD5, 0}, // 0394, Delta, ◿
  395. {IV('Θ'), 0xD6, 0}, // 0398, Theta
  396. {IV('Λ'), 0xD7, 0}, // 039B, Lambda
  397. {IV('Ξ'), 0xD8, 0}, // 039E, Xi
  398. {IV('Π'), 0xD9, 0}, // Pi
  399. {IV('Σ'), 0xDA, 0}, // Sigma
  400. {IV('Υ'), 0xDB, 0}, // Upsilon
  401. {IV('Φ'), 0xDC, 0}, // Phi
  402. {IV('Ψ'), 0xDD, 0}, // Psi
  403. {IV('Ω'), 0xDE, 0}, // Omega
  404. {IV('ά'), 0xDF, 0}, // 03AC
  405. {IV('έ'), 0xE3, 0}, // 03AD
  406. {IV('ή'), 0xE5, 0}, // 03AE
  407. {IV('ί'), 0xE7, 0}, // 03AF
  408. {IV('ΰ'), 0xF1, 0}, // 03B0
  409. {IV('α'), 0xDF, 0}, // alpha
  410. {IV('β'), 0xE0, 0}, // beta
  411. {IV('γ'), 0xE1, 0}, // gamma
  412. {IV('δ'), 0xE2, 0}, // delta
  413. {IV('ε'), 0xE3, 0}, // epsilon
  414. {IV('ζ'), 0xE4, 0}, // zeta
  415. {IV('η'), 0xE5, 0}, // eta
  416. {IV('θ'), 0xE6, 0}, // theta
  417. {IV('ι'), 0xE7, 0}, // lota
  418. {IV('κ'), 0xE8, 0}, // kappa
  419. {IV('λ'), 0xE9, 0}, // lambda
  420. {IV('μ'), 0xEA, 0}, // mu
  421. {IV('ν'), 0xEB, 0}, // nu
  422. {IV('ξ'), 0xEC, 0}, // xi
  423. {IV('π'), 0xED, 0}, // pi
  424. {IV('ρ'), 0xEE, 0}, // rho
  425. {IV('σ'), 0xEF, 0}, // sigma
  426. {IV('τ'), 0xF0, 0}, // tau
  427. {IV('υ'), 0xF1, 0}, // upsilon
  428. {IV('χ'), 0xF2, 0}, // chi
  429. {IV('ψ'), 0xF3, 0}, // psi
  430. {IV('ω'), 0xF4, 0}, // 03C9, omega
  431. {IV('ϊ'), 0xE7, 0}, // 03CA
  432. {IV('ϋ'), 0xF1, 0}, // 03CB
  433. {IV('ύ'), 0xF1, 0}, // 03CD
  434. {IV('ώ'), 0xF4, 0}, // 03CE
  435. {IV('•'), 0xCD, 0}, // ·
  436. {IV('℞'), 0xA7, 0}, // ℞ Pt ASCII 158
  437. {IV('™'), 0xD0, 0},
  438. {IV('↤'), 0xF9, 0}, // ⟻
  439. {IV('↵'), 0xC4, 0},
  440. {IV('↻'), 0x04, 0}, // Marlin special: '↻↺⟳⟲' LCD_STR_REFRESH (0x01)
  441. {IV('⇥'), 0xFB, 0},
  442. {IV('√'), 0xBE, 0}, // √
  443. {IV('∞'), 0xC2, 0}, // infinity
  444. {IV('∫'), 0x1B, 0},
  445. {IV('∼'), 0x1D, 0},
  446. {IV('≈'), 0x1A, 0},
  447. {IV('≠'), 0xBD, 0},
  448. {IV('≡'), 0x11, 0},
  449. {IV('≤'), 0xB9, 0},// ≤≥ ⩽⩾
  450. {IV('≥'), 0xBA, 0},
  451. //{IV(''), 0xBF, 0}, // error
  452. {IV('⌠'), 0xC0, 0},
  453. {IV('⌡'), 0xC1, 0},
  454. {IV('⎧'), 0x14, 0},
  455. {IV('⎩'), 0x15, 0},
  456. {IV('⎫'), 0x16, 0},
  457. {IV('⎭'), 0x17, 0},
  458. {IV('⎰'), 0x18, 0},
  459. {IV('⎱'), 0x19, 0},
  460. {IV('⎲'), 0x12, 0},
  461. {IV('⎳'), 0x13, 0},
  462. {IV('⏱'), 0x07, 0}, // Marlin special: '🕐🕑🕒🕓🕔🕕🕖🕗🕘🕙🕚🕛🕜🕝🕞🕟🕠🕡🕢🕣🕤🕥🕦🕧 ⌚⌛⏰⏱⏳⧖⧗' LCD_STR_CLOCK (0x05)
  463. {IV('┌'), 0xC9, 0},
  464. {IV('┐'), 0xCA, 0},
  465. {IV('└'), 0xCB, 0},
  466. {IV('┘'), 0xCC, 0},
  467. {IV('◸'), 0xC3, 0}, // ◿
  468. {IV('⭠'), 0xC8, 0},
  469. {IV('⭡'), 0xC5, 0},
  470. {IV('⭢'), 0xC7, 0},
  471. {IV('⭣'), 0xC6, 0},
  472. {IV('⯆'), 0xF5, 0},
  473. {IV('⯇'), 0xF7, 0}, // ⯅
  474. {IV('⯈'), 0xF6, 0},
  475. //{IV(''), 0xF8, 0}, // error
  476. //{IV(''), 0xFA, 0}, // error
  477. //{IV(''), 0xFC, 0}, // error
  478. //{IV(''), 0xFD, 0}, // error
  479. //{IV(''), 0xFE, 0}, // error
  480. //{IV(''), 0xFF, 0}, // error
  481. #elif DISPLAY_CHARSET_HD44780 == CYRILLIC
  482. {IV('¢'), 0x5C, 0}, // 00A2
  483. {IV('£'), 0xCF, 0}, // 00A3
  484. {IV('°'), 0x01, 0}, // 00B0, Marlin special: '°' LCD_STR_DEGREE (0x09)
  485. //{IV(''), 0x80, 0},
  486. //{IV(''), 0x81, 0},
  487. //{IV(''), 0x82, 0},
  488. //{IV(''), 0x83, 0},
  489. //{IV(''), 0x84, 0},
  490. //{IV(''), 0x85, 0},
  491. //{IV(''), 0x86, 0},
  492. //{IV(''), 0x87, 0},
  493. //{IV(''), 0x88, 0},
  494. //{IV(''), 0x89, 0},
  495. //{IV(''), 0x8A, 0},
  496. //{IV(''), 0x8B, 0},
  497. //{IV(''), 0x8C, 0},
  498. //{IV(''), 0x8D, 0},
  499. //{IV(''), 0x8E, 0},
  500. //{IV(''), 0x8F, 0},
  501. //{IV(''), 0x90, 0},
  502. //{IV(''), 0x91, 0},
  503. //{IV(''), 0x92, 0},
  504. //{IV(''), 0x93, 0},
  505. //{IV(''), 0x94, 0},
  506. //{IV(''), 0x95, 0},
  507. //{IV(''), 0x96, 0},
  508. //{IV(''), 0x97, 0},
  509. //{IV(''), 0x98, 0},
  510. //{IV(''), 0x99, 0},
  511. //{IV(''), 0x9A, 0},
  512. //{IV(''), 0x9B, 0},
  513. //{IV(''), 0x9C, 0},
  514. //{IV(''), 0x9D, 0},
  515. //{IV(''), 0x9E, 0},
  516. //{IV(''), 0x9F, 0},
  517. {IV('¼'), 0xF0, 0}, // 00BC
  518. {IV('⅓'), 0xF1, 0},
  519. {IV('½'), 0xF2, 0}, // 00BD
  520. {IV('¾'), 0xF3, 0}, // 00BE
  521. {IV('¿'), 0xCD, 0}, // 00BF
  522. #if ENABLED(DISPLAY_CHARSET_ISO10646_5)
  523. // Map Cyrillic to HD44780 extended CYRILLIC where possible
  524. {IV('Ё'), 0xA2, 0}, // 0401
  525. {IV('А'), 'A', 0}, // 0410
  526. {IV('Б'), 0xA0, 0},
  527. {IV('В'), 'B', 0},
  528. {IV('Г'), 0xA1, 0},
  529. {IV('Д'), 0xE0, 0},
  530. {IV('Е'), 'E', 0},
  531. {IV('Ж'), 0xA3, 0},
  532. {IV('З'), 0xA4, 0},
  533. {IV('И'), 0xA5, 0},
  534. {IV('Й'), 0xA6, 0},
  535. {IV('К'), 'K', 0},
  536. {IV('Л'), 0xA7, 0},
  537. {IV('М'), 'M', 0},
  538. {IV('Н'), 'H', 0},
  539. {IV('О'), 'O', 0},
  540. {IV('П'), 0xA8, 0},
  541. {IV('Р'), 'P', 0},
  542. {IV('С'), 'C', 0},
  543. {IV('Т'), 'T', 0},
  544. {IV('У'), 0xA9, 0},
  545. {IV('Ф'), 0xAA, 0},
  546. {IV('Х'), 'X', 0},
  547. {IV('Ц'), 0xE1, 0},
  548. {IV('Ч'), 0xAB, 0},
  549. {IV('Ш'), 0xAC, 0},
  550. {IV('Щ'), 0xE2, 0},
  551. {IV('Ъ'), 0xAD, 0},
  552. {IV('Ы'), 0xAE, 0},
  553. {IV('Ь'), 'b', 0},
  554. {IV('Э'), 0xAF, 0},
  555. {IV('Ю'), 0xB0, 0},
  556. {IV('Я'), 0xB1, 0},
  557. {IV('а'), 'a', 0},
  558. {IV('б'), 0xB2, 0},
  559. {IV('в'), 0xB3, 0},
  560. {IV('г'), 0xB4, 0},
  561. {IV('д'), 0xE3, 0},
  562. {IV('е'), 'e', 0},
  563. {IV('ж'), 0xB6, 0},
  564. {IV('з'), 0xB7, 0},
  565. {IV('и'), 0xB8, 0},
  566. {IV('й'), 0xB9, 0},
  567. {IV('к'), 0xBA, 0}, //клмноп
  568. {IV('л'), 0xBB, 0},
  569. {IV('м'), 0xBC, 0},
  570. {IV('н'), 0xBD, 0},
  571. {IV('о'), 'o', 0},
  572. {IV('п'), 0xBE, 0},
  573. {IV('р'), 'p', 0},
  574. {IV('с'), 'c', 0},
  575. {IV('т'), 0xBF, 0},
  576. {IV('у'), 'y', 0},
  577. {IV('ф'), 0xE4, 0},
  578. {IV('х'), 'x', 0},
  579. {IV('ц'), 0xE5, 0},
  580. {IV('ч'), 0xC0, 0},
  581. {IV('ш'), 0xC1, 0},
  582. {IV('щ'), 0xE6, 0},
  583. {IV('ъ'), 0xC2, 0},
  584. {IV('ы'), 0xC3, 0},
  585. {IV('ь'), 0xC4, 0},
  586. {IV('э'), 0xC5, 0},
  587. {IV('ю'), 0xC6, 0},
  588. {IV('я'), 0xC7, 0}, // 044F
  589. {IV('ё'), 0xB5, 0}, // 0451
  590. //{IV(''), 0xC8, 0},
  591. //{IV(''), 0xC9, 0},
  592. //{IV(''), 0xCA, 0},
  593. //{IV(''), 0xCB, 0},
  594. //{IV(''), 0xCC, 0},
  595. //{IV(''), 0xCD, 0},
  596. //{IV(''), 0xCE, 0},
  597. //{IV(''), 0xD0, 0},
  598. //{IV(''), 0xD1, 0},
  599. //{IV(''), 0xD2, 0},
  600. //{IV(''), 0xD3, 0},
  601. //{IV(''), 0xD4, 0},
  602. //{IV(''), 0xD5, 0},
  603. //{IV(''), 0xD6, 0},
  604. //{IV(''), 0xD7, 0},
  605. //{IV(''), 0xD8, 0},
  606. //{IV(''), 0xDB, 0},
  607. //{IV(''), 0xDC, 0},
  608. //{IV(''), 0xDD, 0},
  609. //{IV(''), 0xDE, 0},
  610. //{IV(''), 0xDF, 0},
  611. //{IV(''), 0xE7, 0},
  612. //{IV(''), 0xE8, 0},
  613. //{IV(''), 0xE9, 0},
  614. //{IV(''), 0xEA, 0},
  615. //{IV(''), 0xEB, 0},
  616. //{IV(''), 0xEC, 0},
  617. //{IV(''), 0xED, 0},
  618. //{IV(''), 0xEE, 0},
  619. //{IV(''), 0xEF, 0},
  620. //{IV(''), 0xF4, 0},
  621. //{IV(''), 0xF5, 0},
  622. //{IV(''), 0xF6, 0},
  623. //{IV(''), 0xF7, 0},
  624. //{IV(''), 0xF8, 0},
  625. //{IV(''), 0xF9, 0},
  626. //{IV(''), 0xFA, 0},
  627. //{IV(''), 0xFB, 0},
  628. //{IV(''), 0xFC, 0},
  629. //{IV(''), 0xFD, 0},
  630. //{IV(''), 0xFE, 0},
  631. //{IV(''), 0xFF, 0},
  632. #endif
  633. {IV('↑'), 0xD9, 0}, // 2191 ←↑→↓
  634. {IV('↓'), 0xDA, 0}, // 2193
  635. #endif
  636. };
  637. // ASCII replacement for various characters
  638. const dwin_charmap_t g_dwin_charmap_common[] PROGMEM = {
  639. {IV('¡'), 'i', 0}, // A1
  640. {IV('¢'), 'c', 0}, // A2
  641. {IV('°'), 0x09, 0}, // B0 Marlin special: '°' LCD_STR_DEGREE (0x09)
  642. // Map WESTERN code to plain ASCII
  643. {IV('Á'), 'A', 0}, // C1
  644. {IV('Â'), 'A', 0}, // C2
  645. {IV('Ã'), 'A', 0}, // C3
  646. {IV('Ä'), 'A', 0}, // C4
  647. {IV('Å'), 'A', 0}, // C5
  648. {IV('Æ'), 'A', 'E'}, // C6
  649. {IV('Ç'), 'C', 0}, // C7
  650. {IV('È'), 'E', 0}, // C8
  651. {IV('É'), 'E', 0}, // C9
  652. {IV('Í'), 'I', 0}, // CD
  653. {IV('Ñ'), 'N', 0}, // D1
  654. {IV('Õ'), 'O', 0}, // D5
  655. {IV('Ö'), 'O', 0}, // D6
  656. {IV('×'), 'x', 0}, // D7
  657. {IV('Ü'), 'U', 0}, // DC
  658. {IV('Ý'), 'Y', 0}, // DD
  659. {IV('à'), 'a', 0}, // E0
  660. {IV('á'), 'a', 0},
  661. {IV('â'), 'a', 0},
  662. {IV('ã'), 'a', 0},
  663. {IV('ä'), 'a', 0},
  664. {IV('å'), 'a', 0},
  665. {IV('æ'), 'a', 'e'},
  666. {IV('ç'), 'c', 0},
  667. {IV('è'), 'e', 0}, // 00E8
  668. {IV('é'), 'e', 0},
  669. {IV('ê'), 'e', 0},
  670. {IV('ë'), 'e', 0},
  671. {IV('ì'), 'i', 0}, // 00EC
  672. {IV('í'), 'i', 0},
  673. {IV('î'), 'i', 0},
  674. {IV('ï'), 'i', 0}, // 00EF
  675. {IV('ñ'), 'n', 0}, // 00F1
  676. {IV('ò'), 'o', 0},
  677. {IV('ó'), 'o', 0},
  678. {IV('ô'), 'o', 0},
  679. {IV('õ'), 'o', 0},
  680. {IV('ö'), 'o', 0},
  681. //{IV('÷'), 0xB8, 0},
  682. {IV('ø'), 'o', 0},
  683. {IV('ù'), 'u', 0},
  684. {IV('ú'), 'u', 0},
  685. {IV('û'), 'u', 0},
  686. {IV('ü'), 'u', 0}, // FC
  687. {IV('ý'), 'y', 0}, // FD
  688. {IV('ÿ'), 'y', 0}, // FF
  689. {IV('Ą'), 'A', 0}, // 0104
  690. {IV('ą'), 'a', 0}, // 0105
  691. {IV('Ć'), 'C', 0}, // 0106
  692. {IV('ć'), 'c', 0}, // 0107
  693. {IV('Č'), 'C', 0}, // 010C
  694. {IV('č'), 'c', 0}, // 010D
  695. {IV('Ď'), 'D', 0}, // 010E
  696. {IV('ď'), 'd', 0}, // 010F
  697. {IV('đ'), 'd', 0}, // 0111
  698. {IV('ę'), 'e', 0}, // 0119
  699. {IV('Ě'), 'E', 0}, // 011A
  700. {IV('ě'), 'e', 0}, // 011B
  701. {IV('ğ'), 'g', 0}, // 011F
  702. {IV('İ'), 'I', 0}, // 0130
  703. {IV('ı'), 'i', 0}, // 0131
  704. {IV('Ł'), 'L', 0}, // 0141
  705. {IV('ł'), 'l', 0}, // 0142
  706. {IV('Ń'), 'N', 0}, // 0143
  707. {IV('ń'), 'n', 0}, // 0144
  708. {IV('ň'), 'n', 0}, // 0148
  709. {IV('Ř'), 'R', 0}, // 0158
  710. {IV('ř'), 'r', 0}, // 0159
  711. {IV('Ś'), 'S', 0}, // 015A
  712. {IV('ś'), 's', 0}, // 015B
  713. {IV('ş'), 's', 0}, // 015F
  714. {IV('Š'), 'S', 0}, // 0160
  715. {IV('š'), 's', 0}, // 0161
  716. {IV('ť'), 't', 0}, // 0165
  717. {IV('ů'), 'u', 0}, // 016F
  718. {IV('ż'), 'z', 0}, // 017C
  719. {IV('Ž'), 'Z', 0}, // 017D
  720. {IV('ž'), 'z', 0}, // 017E
  721. {IV('ƒ'), 'f', 0}, // 0192
  722. {IV('ˣ'), 'x', 0}, // 02E3
  723. #if ENABLED(DISPLAY_CHARSET_ISO10646_VI)
  724. // Map Vietnamese phonetics
  725. //{IV('à'), 'a', 0}, {IV('À'), 'A', 0},
  726. {IV('ạ'), 'a', 0}, {IV('Ạ'), 'A', 0},
  727. {IV('ả'), 'a', 0}, {IV('Ả'), 'A', 0},
  728. //{IV('ã'), 'a', 0}, {IV('Ã'), 'A', 0},
  729. //{IV('á'), 'á', 0}, {IV('Á'), 'A', 0},
  730. {IV('Ạ'), 'A', 0},
  731. {IV('ă'), 'a', 0}, {IV('Ă'), 'A', 0},
  732. {IV('ằ'), 'a', 0}, {IV('Ằ'), 'A', 0},
  733. {IV('ẳ'), 'a', 0}, {IV('Ẳ'), 'A', 0},
  734. {IV('ẵ'), 'a', 0}, {IV('Ẵ'), 'A', 0},
  735. {IV('ắ'), 'a', 0}, {IV('Ắ'), 'A', 0},
  736. {IV('ặ'), 'a', 0}, {IV('Ặ'), 'A', 0},
  737. {IV('â'), 'a', 0}, {IV('Â'), 'A', 0},
  738. {IV('ầ'), 'a', 0}, {IV('Ầ'), 'A', 0},
  739. {IV('ẩ'), 'a', 0}, {IV('Ẩ'), 'A', 0},
  740. {IV('ẫ'), 'a', 0}, {IV('Ẫ'), 'A', 0},
  741. {IV('ấ'), 'a', 0}, {IV('Ấ'), 'A', 0},
  742. {IV('ậ'), 'a', 0}, {IV('Ậ'), 'A', 0},
  743. //{IV('đ'), 'd', 0},
  744. {IV('Đ'), 'D', 0},
  745. {IV('e'), 'e', 0}, {IV('E'), 'E', 0},
  746. {IV('è'), 'e', 0}, {IV('È'), 'E', 0},
  747. {IV('ẻ'), 'e', 0}, {IV('Ẻ'), 'E', 0},
  748. {IV('ẽ'), 'e', 0}, {IV('Ẽ'), 'E', 0},
  749. {IV('é'), 'e', 0}, {IV('É'), 'E', 0},
  750. {IV('ẹ'), 'e', 0}, {IV('Ẹ'), 'E', 0},
  751. {IV('ê'), 'e', 0}, {IV('Ê'), 'E', 0},
  752. {IV('ề'), 'e', 0}, {IV('Ề'), 'E', 0},
  753. {IV('ể'), 'e', 0}, {IV('Ể'), 'E', 0},
  754. {IV('ễ'), 'e', 0}, {IV('Ễ'), 'E', 0},
  755. {IV('ế'), 'e', 0}, {IV('Ế'), 'E', 0},
  756. {IV('ệ'), 'e', 0}, {IV('Ệ'), 'E', 0},
  757. {IV('i'), 'i', 0}, {IV('I'), 'I', 0},
  758. //{IV('ì'), 'ì', 0}, {IV('Ì'), 'Ì', 0},
  759. {IV('ỉ'), 'ỉ', 0}, {IV('Ỉ'), 'Ỉ', 0},
  760. {IV('ĩ'), 'ĩ', 0}, {IV('Ĩ'), 'Ĩ', 0},
  761. {IV('í'), 'í', 0}, {IV('Í'), 'Í', 0},
  762. {IV('ị'), 'ị', 0}, {IV('Ị'), 'Ị', 0},
  763. {IV('o'), 'o', 0}, {IV('O'), 'O', 0},
  764. {IV('ò'), 'o', 0}, {IV('Ò'), 'O', 0},
  765. {IV('ỏ'), 'o', 0}, {IV('Ỏ'), 'O', 0},
  766. {IV('õ'), 'o', 0}, {IV('Õ'), 'O', 0},
  767. {IV('ó'), 'o', 0}, {IV('Ó'), 'O', 0},
  768. {IV('ọ'), 'o', 0}, {IV('Ọ'), 'O', 0},
  769. {IV('ô'), 'o', 0}, {IV('Ô'), 'O', 0},
  770. {IV('ồ'), 'o', 0}, {IV('Ồ'), 'O', 0},
  771. {IV('ổ'), 'o', 0}, {IV('Ổ'), 'O', 0},
  772. {IV('ỗ'), 'o', 0}, {IV('Ỗ'), 'O', 0},
  773. {IV('ố'), 'o', 0}, {IV('Ố'), 'O', 0},
  774. {IV('ộ'), 'o', 0}, {IV('Ộ'), 'O', 0},
  775. {IV('ơ'), 'o', 0}, {IV('Ơ'), 'O', 0},
  776. {IV('ờ'), 'o', 0}, {IV('Ờ'), 'O', 0},
  777. {IV('ở'), 'o', 0}, {IV('Ở'), 'O', 0},
  778. {IV('ỡ'), 'o', 0}, {IV('Ỡ'), 'O', 0},
  779. {IV('ớ'), 'o', 0}, {IV('Ớ'), 'O', 0},
  780. {IV('ợ'), 'o', 0}, {IV('Ợ'), 'O', 0},
  781. {IV('ù'), 'u', 0}, {IV('Ù'), 'U', 0},
  782. {IV('ủ'), 'u', 0}, {IV('Ủ'), 'U', 0},
  783. {IV('ũ'), 'u', 0}, {IV('Ũ'), 'U', 0},
  784. //{IV('ú'), 'u', 0}, {IV('Ú'), 'U', 0},
  785. {IV('ụ'), 'u', 0}, {IV('Ụ'), 'U', 0},
  786. {IV('ư'), 'u', 0}, {IV('Ư'), 'U', 0},
  787. {IV('ừ'), 'u', 0}, {IV('Ừ'), 'U', 0},
  788. {IV('ử'), 'u', 0}, {IV('Ử'), 'U', 0},
  789. {IV('ữ'), 'u', 0}, {IV('Ữ'), 'U', 0},
  790. {IV('ứ'), 'u', 0}, {IV('Ứ'), 'U', 0},
  791. {IV('ự'), 'u', 0}, {IV('Ự'), 'U', 0},
  792. {IV('y'), 'y', 0}, {IV('Y'), 'Y', 0},
  793. #endif
  794. #if ENABLED(DISPLAY_CHARSET_ISO10646_GREEK)
  795. {IV('΄'), '\'', 0}, // 0384
  796. {IV('΅'), '\'', 0}, // 0385
  797. {IV('Ά'), 'A', 0}, // 0386
  798. {IV('·'), '.', 0}, // 0387
  799. {IV('Έ'), 'E', 0}, // 0388
  800. {IV('Ή'), 'H', 0}, // 0389
  801. {IV('Ί'), 'I', 0}, // 038A
  802. {IV('Ό'), 'O', 0}, // 038C
  803. {IV('Ύ'), 'Y', 0}, // 038E
  804. {IV('Ώ'), 'O', 0}, // 038F
  805. {IV('ΐ'), 'i', 0}, // 0390
  806. {IV('Α'), 'A', 0}, // 0391
  807. {IV('Β'), 'B', 0}, // 0392
  808. {IV('Γ'), 'T', 0}, // 0393, Gamma
  809. {IV('Δ'), '4', 0}, // 0394, Delta, ◿
  810. {IV('Ε'), 'E', 0}, // 0395
  811. {IV('Ζ'), 'Z', 0}, // 0396
  812. {IV('Η'), 'H', 0}, // 0397
  813. {IV('Θ'), '0', 0}, // 0398, Theta
  814. {IV('Ι'), 'I', 0}, // 0399
  815. {IV('Κ'), 'K', 0}, // 039A
  816. {IV('Λ'), '^', 0}, // 039B, Lambda
  817. {IV('Μ'), 'M', 0}, // 039C
  818. {IV('Ν'), 'N', 0}, // 039D
  819. {IV('Ξ'), '3', 0}, // 039E, Xi
  820. {IV('Ο'), 'O', 0}, // 039F
  821. {IV('Π'), 'n', 0}, // 03A0, Pi
  822. {IV('Ρ'), 'P', 0}, // 03A1
  823. {IV('Σ'), 'E', 0}, // 03A3, Sigma
  824. {IV('Τ'), 'T', 0}, // 03A4
  825. {IV('Υ'), 'Y', 0}, // 03A5, Upsilon
  826. {IV('Φ'), 'p', 0}, // 03A6, Phi
  827. {IV('Χ'), 'X', 0}, // 03A7
  828. {IV('Ψ'), 'P', 0}, // 03A8, Psi
  829. {IV('Ω'), 'O', 0}, // 03A9, Omega
  830. {IV('Ϊ'), 'I', 0}, // 03AA
  831. {IV('Ϋ'), 'Y', 0}, // 03AB
  832. {IV('ά'), 'a', 0}, // 03AC
  833. {IV('έ'), 'e', 0}, // 03AD
  834. {IV('ή'), 'n', 0}, // 03AE
  835. {IV('ί'), 'i', 0}, // 03AF
  836. {IV('ΰ'), 'v', 0}, // 03B0
  837. {IV('α'), 'a', 0}, // 03B1, alpha
  838. {IV('β'), 'B', 0}, // 03B2, beta
  839. {IV('γ'), 'v', 0}, // 03B3, gamma
  840. {IV('δ'), 'd', 0}, // 03B4, delta
  841. {IV('ε'), 'e', 0}, // 03B5, epsilon
  842. {IV('ζ'), 'Z', 0}, // 03B6, zeta
  843. {IV('η'), 'n', 0}, // 03B7, eta
  844. {IV('θ'), '0', 0}, // 03B8, theta
  845. {IV('ι'), 'i', 0}, // 03B9, lota
  846. {IV('κ'), 'k', 0}, // 03BA, kappa
  847. {IV('λ'), 'L', 0}, // 03BB, lambda
  848. {IV('μ'), 'u', 0}, // 03BC, mu
  849. {IV('ν'), 'v', 0}, // 03BD, nu
  850. {IV('ξ'), 'e', 0}, // 03BE, xi
  851. {IV('ο'), 'o', 0}, // 03BF
  852. {IV('π'), 'n', 0}, // 03C0, pi
  853. {IV('ρ'), 'p', 0}, // 03C1, rho
  854. {IV('ς'), 'c', 0}, // 03C2
  855. {IV('σ'), 'o', 0}, // 03C3, sigma
  856. {IV('τ'), 't', 0}, // 03C4, tau
  857. {IV('υ'), 'v', 0}, // 03C5, upsilon
  858. {IV('φ'), 'p', 0}, // 03C6
  859. {IV('χ'), 'X', 0}, // 03C7, chi
  860. {IV('ψ'), 'W', 0}, // 03C8, psi
  861. {IV('ω'), 'w', 0}, // 03C9, omega
  862. {IV('ϊ'), 'i', 0}, // 03CA
  863. {IV('ϋ'), 'v', 0}, // 03CB
  864. {IV('ό'), 'o', 0}, // 03CC
  865. {IV('ύ'), 'v', 0}, // 03CD
  866. {IV('ώ'), 'w', 0}, // 03CE
  867. #endif
  868. #if ENABLED(DISPLAY_CHARSET_ISO10646_5)
  869. // Map CYRILLIC code to plain ASCII
  870. {IV('Ё'), 'E', 0}, // 0401
  871. {IV('А'), 'A', 0}, // 0410
  872. {IV('Б'), 'b', 0}, // 0411
  873. {IV('В'), 'B', 0}, // 0412
  874. {IV('Г'), 'T', 0}, // 0413
  875. {IV('Д'), 'Q', 0}, // 0414
  876. {IV('Е'), 'E', 0}, // 0415
  877. {IV('Ж'), '*', 0}, // 0416
  878. {IV('З'), 'E', 0}, // 0417
  879. {IV('И'), 'N', 0}, // 0418
  880. {IV('Й'), 'N', 0}, // 0419
  881. {IV('К'), 'K', 0}, // 041A
  882. {IV('Л'), 'T', 0}, // 041B
  883. {IV('М'), 'M', 0}, // 041C
  884. {IV('Н'), 'H', 0}, // 041D
  885. {IV('О'), 'O', 0}, // 041E
  886. {IV('П'), 'n', 0}, // 041F
  887. {IV('Р'), 'P', 0}, // 0420
  888. {IV('С'), 'C', 0}, // 0421
  889. {IV('Т'), 'T', 0}, // 0422
  890. {IV('У'), 'Y', 0},
  891. {IV('Ф'), 'o', 0},
  892. {IV('Х'), 'X', 0},
  893. {IV('Ц'), 'U', 0},
  894. {IV('Ч'), 'y', 0},
  895. {IV('Ш'), 'W', 0},
  896. {IV('Щ'), 'W', 0},
  897. {IV('Ъ'), 'b', 0},
  898. {IV('Ы'), 'b', '|'},
  899. {IV('Ь'), 'b'},
  900. {IV('Э'), 'e'},
  901. {IV('Ю'), '|', 'O'},
  902. {IV('Я'), '9', '|'}, // 042F
  903. {IV('а'), 'a', 0}, // 0430
  904. {IV('б'), '6', 0}, // 0431
  905. {IV('в'), 'B', 0}, // 0432,
  906. {IV('г'), 'r', 0}, // 0433
  907. {IV('д'), 'a', 0}, // 0434,
  908. {IV('е'), 'e', 0}, // 0435
  909. {IV('ж'), '*', 0}, // 0436
  910. {IV('з'), 'e', 0}, // 0437,
  911. {IV('и'), 'u', 0}, // 0438
  912. {IV('й'), 'u', 0}, // 0439,
  913. {IV('к'), 'k', 0}, // 043A
  914. {IV('л'), 'n', 0},
  915. {IV('м'), 'm', 0},
  916. {IV('н'), 'H', 0},
  917. {IV('о'), 'o', 0},
  918. {IV('п'), 'n', 0},
  919. {IV('р'), 'p', 0},
  920. {IV('с'), 'c', 0},
  921. {IV('т'), 't', 0},
  922. {IV('у'), 'y', 0},
  923. {IV('ф'), 'q', 'p'},
  924. {IV('х'), 'x', 0},
  925. {IV('ц'), 'u', 0},
  926. {IV('ч'), 'y', 0},
  927. {IV('ш'), 'w', 0},
  928. {IV('щ'), 'w', 0},
  929. {IV('ъ'), 'b', 0},
  930. {IV('ы'), 'b', '|'},
  931. {IV('ь'), 'b', 0},
  932. {IV('э'), 'e', 0},
  933. {IV('ю'), '|', 'o'},
  934. {IV('я'), 'g', 0}, // 044F
  935. {IV('ё'), 'e', 0}, // 0451
  936. #endif
  937. {IV('•'), '.', 0}, // 2022 ·
  938. {IV('℞'), 'P', 'x'}, // 211E ℞ Pt ASCII 158
  939. {IV('™'), 'T', 'M'}, // 2122
  940. {IV('←'), '<', '-'}, // 2190
  941. {IV('→'), '-', '>'}, // 2192, Marlin special: '⮈⮉⮊⮋➤→⏵➟➠➡' LCD_STR_ARROW_RIGHT (0x03)
  942. //{IV('↰'), '<', 0}, // 21B0, Marlin special: '⮥⮭⮉⇧↑↰⤴' LCD_STR_UPLEVEL (0x04)
  943. {IV('↰'), 0x03, 0}, // 21B0, Marlin special: '⮥⮭⮉⇧↑↰⤴' LCD_STR_UPLEVEL (0x04)
  944. {IV('↻'), 0x04, 0}, // 21BB Marlin special: '↻↺⟳⟲' LCD_STR_REFRESH (0x01)
  945. {IV('∼'), '~', 0}, // 223C
  946. {IV('≈'), '~', '='}, // 2248
  947. {IV('≠'), '!', '='}, // 2260
  948. {IV('≡'), '=', 0}, // 2261
  949. {IV('≤'), '<', '='},// 2264, ≤≥ ⩽⩾
  950. {IV('≥'), '>', '='}, // 2265
  951. {IV('⏱'), 0x07, 0}, // 23F1, Marlin special: '🕐🕑🕒🕓🕔🕕🕖🕗🕘🕙🕚🕛🕜🕝🕞🕟🕠🕡🕢🕣🕤🕥🕦🕧 ⌚⌛⏰⏱⏳⧖⧗' LCD_STR_CLOCK (0x05)
  952. {IV('゠'), '=', 0}, // 30A0
  953. // ⏰⏱⏲⏳◴◵◶◷
  954. // ⏻⏼♁♂
  955. //{IV(''), 0x00, 0}, // Marlin special: '' LCD_STR_BEDTEMP (0x07)
  956. {IV('🌡'), 0x02, 0}, // D83CDF21 Marlin special: '🌡' LCD_STR_THERMOMETER (0x08)
  957. {IV('📂'), 0x05, 0}, // D83DDCC2 Marlin special: '📁📂' LCD_STR_FOLDER (0x02)
  958. //{IV(''), 0x06, 0}, // Marlin special: '' LCD_STR_FEEDRATE (0x06)
  959. };