Добавить свои изменения в чужую библиотеку на Гитхабе?
- Войдите на сайт для отправки комментариев
Хочу поучаствовать в редактировании вот этой библиотеки :
https://github.com/mozok/DMDSTM
Это адаптация библиотеки DMD (для светодиодных матриц p10) под СТМ32Дуино. Автор начал работу и больше года как забросил на пол-дороги, в коде какие-то обрывки. Я ее немного почистил у меня все отлично заработало. Но библиотеку надо "причесать" - добавить нормальный выбор пинов, сделать выбор между SPI-1 и SPI-2, переписать примеры под СТМ
Опыта в совместной работе на Гитхабе - ноль. Как вообще это делается? Как законтачить с автором? принято ли предлагать свои правки - или авторы проектов этого не любят?
Ну и вообще - нужно ли это? Удивляет, что для матриц P10 нет официальных библиотек под СТМ32. Вроде там абсолютно ничего сложного. Может есть какая-то причина и для работы с DMD стм32 никто не использует?
Делаешь pull request с изменениями, и если автор одобрит - то он сольёт эти изменения со своим гитом. А так, если не париться - сделай форк его репозитория, и уже в него закоммить свои изменения.
Кстати - в репозитории видно, что автор принимал реквесты, так что всё должно быть норм: https://github.com/mozok/DMDSTM/pull/1
Кстати сказать - с удовольствием бы поюзал хорошую библиотеку для P10 под STM32, особенно - если там есть кириллица в UTF-8 из коробки. И если ты говоришь, что допилил до нормального состояния - выкладывай на гитхаб, давай ссылку - сделаю форк, и буду при случае юзать твою ;)
Кстати сказать - с удовольствием бы поюзал хорошую библиотеку для P10 под STM32, особенно - если там есть кириллица в UTF-8 из коробки. И если ты говоришь, что допилил до нормального состояния - выкладывай
не, пока я только убедился, что библиотека в принципе рабочая. Запустил один стандартный пример из библиотеки DMD на STM32F103. Там еще есть что поправить - Код там недоделанный, конструктор кривоватый, пины прямо в коде библиотеки устанавливаюся.. Но, принципе, "причесать" то что есть до рабочего состояния не так и трудно, пару дней посидеть... Получится - выложу.
UTF-8 "из коробки" в оригинальной DMD нет, соответвенно и тут тоже. Можно допилить, но это серьезная тема.
UTF-8 "из коробки" в оригинальной DMD нет, соответвенно и тут тоже. Можно допилить, но это серьезная тема.
Да ничо там серьезного нету, проблема только со шрифтами. Я делал проект под DMD и P10, надыбал только один русский шрифт, а ручками отрисовывать в GLCD Font creator - то ещё удовольствие. А проблема только в том, что автор шрифта раскидал символы по шрифту - как захотел. Написал я маппинг из UTF-8 в кодовую страницу этого шрифта, но - это совсем непереносимо.
Вот если бы запилить какой-нибудь стандарт кириллического шрифта под эту библу - я бы подкинул функции перекодировки, там ничего космического нету.
Скажем по-другому: для меня существует проблема с наличием отсутствия РАЗНЫХ кириллических шрифтов под DMD, с одинаковой внутренней кодировкой (чтобы один и тот же символ имел один и тот же код в таблице шрифта). А UTF-8 туда припилить - припилим ;)
Так что считай - я в деле, если что - обращайся без зазрения, можем гит вместе вести, там контрибуторы добавляются легко ;)
самое простое, наерна, сделать маппинг Utf8->CP866
Должен заметить, что utf-8 для Аrduino - тяжеловато. Даже в варианте stm32.
utf-8 - это весь японский, китайский, арабский и т.п. Не исключая также грузинского и греческого. Уместить все это в 64к нереально.
А если заявлять о поддержке utf-8, а на деле поддерживать одну кириллицу, 98% населения планеты этого не поймут. (или гитхаб стал на 100% русскоязычным?)
Да никто не говорит о полноценной поддержке UTF-8, ессно. Тем более, что специфика в разрезе данного проекта - тупо упирается в размер шрифта и кол-во символов в нём. Тут скорее - удобство пользования в виде некоторого "стандарта": сделать простейшую систему плагинов: для шрифта с набором символов - своя функция маппинга из UTF-8 в кодовую страницу шрифта. Надо мне шрифт на японском - взял шрифт, где помимо латиницы ещё японские алфавиты, в комплекте со шрифтом - функция маппинга, далее тупо беру и пишу в прошивке текст на японском, и всё - он отображается на матрице.
Библиотека DMD убога как раз отсутствием вот этих вот фич, пмсм. И описанное - уж точно востребовано, т.к. если почитать оф. форум - там и арабы задают вопросы, мол "хочу шрифт на арабском" и индусы, и т.д. и т.п. При том, что Arduino IDE хранит файлы в UTF-8 - сам бог велел чуть расширить функционал библиотеки. Тут главное - оставить кодовую страницу латиницы в шрифте нетронутой, и разработать соглашение о расширении шрифта. А сами шрифты - GLCD Font creator и ещё какая-то прога, помню, скачивал, правда, и то и то - долговато.
При таком подходе - и пользователи подтянутся. Да даже если и не подтянутся - тут что, кто-то ставит перед собой цель понравится всему гитхабу? Как-то наивно.
Кстати. в комплекте библиотеки уже лежит пара фонтов кириллицы c кодировкой UTF8
Можно выводить надписи прямо из скетча, без всяких перкодировок:
https://youtu.be/e9aPEgUchlY
Качество фонтов, правда, довольно средненькое
Кстати. в комплекте библиотеки уже лежит пара фонтов кириллицы c кодировкой UTF8
Можно выводить надписи прямо из скетча, без всяких перкодировок:
https://youtu.be/e9aPEgUchlY
Качество фонтов, правда, довольно средненькое
Автор библиотеки допилил, что ли? Если так - то отлично ;)
Правка: чот не вижу я там UTF-8, от слова "совсем". Хочешь сказать, что если я вызову drawString вот так:
drawString("Привет")то отрисуется русский текст? В коде библиотеки не вижу никакой работы с UTF-8.
Вот, кстати, как я юзаю UTF-8 для шрифта SystemFont5x7rus.h для библиотеки DMD.
Сам шрифт:
#include <inttypes.h> #include <avr/pgmspace.h> #ifndef SYSTEM5x7_H #define SYSTEM5x7_H #define SYSTEM5x7_WIDTH 5 #define SYSTEM5x7_HEIGHT 7 /* * added to allow fontname to match header file name. * as well as keep the old name for backward compability */ #define SystemFont5x7 System5x7 const static uint8_t System5x7[] PROGMEM = { 0x0, 0x0, // size of zero indicates fixed width font, actual length is width * height 0x05, // width 0x07, // height 0x20, // first char 0xE0, // char count // Fixed width; char width table not used !!!! // font data 0x00, 0x00, 0x00, 0x00, 0x00,// (space) 0x20 0x00, 0x00, 0x5F, 0x00, 0x00,// ! 0x21 0x00, 0x07, 0x00, 0x07, 0x00,// " 0x22 0x14, 0x7F, 0x14, 0x7F, 0x14,// # 0x23 0x24, 0x2A, 0x7F, 0x2A, 0x12,// $ 0x24 0x23, 0x13, 0x08, 0x64, 0x62,// % 0x25 0x36, 0x49, 0x55, 0x22, 0x50,// & 0x26 0x00, 0x05, 0x03, 0x00, 0x00,// ' 0x27 0x00, 0x1C, 0x22, 0x41, 0x00,// ( 0x28 0x00, 0x41, 0x22, 0x1C, 0x00,// ) 0x29 0x08, 0x2A, 0x1C, 0x2A, 0x08,// * 0x2A 0x08, 0x08, 0x3E, 0x08, 0x08,// + 0x2B 0x00, 0x50, 0x30, 0x00, 0x00,// , 0x2C 0x08, 0x08, 0x08, 0x08, 0x08,// - 0x2D 0x00, 0x00, 0x40, 0x00, 0x00, // . 0x2E 0x20, 0x10, 0x08, 0x04, 0x02,// / 0x2F 0x3E, 0x51, 0x49, 0x45, 0x3E,// 0 0x30 0x00, 0x42, 0x7F, 0x40, 0x00,// 1 0x31 0x42, 0x61, 0x51, 0x49, 0x46,// 2 0x32 0x21, 0x41, 0x45, 0x4B, 0x31,// 3 0x33 0x18, 0x14, 0x12, 0x7F, 0x10,// 4 0x34 0x27, 0x45, 0x45, 0x45, 0x39,// 5 0x35 0x3C, 0x4A, 0x49, 0x49, 0x30,// 6 0x36 0x01, 0x71, 0x09, 0x05, 0x03,// 7 0x37 0x36, 0x49, 0x49, 0x49, 0x36,// 8 0x38 0x06, 0x49, 0x49, 0x29, 0x1E,// 9 0x39 0x00, 0x36, 0x36, 0x00, 0x00,// : 0x3A 0x00, 0x56, 0x36, 0x00, 0x00,// ; 0x3B 0x00, 0x08, 0x14, 0x22, 0x41,// < 0x3C 0x14, 0x14, 0x14, 0x14, 0x14,// = 0x3D 0x41, 0x22, 0x14, 0x08, 0x00,// > 0x3E 0x02, 0x01, 0x51, 0x09, 0x06,// ? 0x3F 0x32, 0x49, 0x79, 0x41, 0x3E,// @ 0x40 0x7E, 0x11, 0x11, 0x11, 0x7E,// A 0x41 0x7F, 0x49, 0x49, 0x49, 0x36,// B 0x42 0x3E, 0x41, 0x41, 0x41, 0x22,// C 0x43 0x7F, 0x41, 0x41, 0x22, 0x1C,// D 0x44 0x7F, 0x49, 0x49, 0x49, 0x41,// E 0x45 0x7F, 0x09, 0x09, 0x01, 0x01,// F 0x46 0x3E, 0x41, 0x41, 0x51, 0x32,// G 0x47 0x7F, 0x08, 0x08, 0x08, 0x7F,// H 0x48 0x00, 0x41, 0x7F, 0x41, 0x00,// I 0x49 0x20, 0x40, 0x41, 0x3F, 0x01,// J 0x4A 0x7F, 0x08, 0x14, 0x22, 0x41,// K 0x4B 0x7F, 0x40, 0x40, 0x40, 0x40,// L 0x4C 0x7F, 0x02, 0x04, 0x02, 0x7F,// M 0x4D 0x7F, 0x04, 0x08, 0x10, 0x7F,// N 0x4E 0x3E, 0x41, 0x41, 0x41, 0x3E,// O 0x4F 0x7F, 0x09, 0x09, 0x09, 0x06,// P 0x50 0x3E, 0x41, 0x51, 0x21, 0x5E,// Q 0x51 0x7F, 0x09, 0x19, 0x29, 0x46,// R 0x52 0x46, 0x49, 0x49, 0x49, 0x31,// S 0x53 0x01, 0x01, 0x7F, 0x01, 0x01,// T 0x54 0x3F, 0x40, 0x40, 0x40, 0x3F,// U 0x55 0x1F, 0x20, 0x40, 0x20, 0x1F,// V 0x56 0x7F, 0x20, 0x18, 0x20, 0x7F,// W 0x57 0x63, 0x14, 0x08, 0x14, 0x63,// X 0x58 0x03, 0x04, 0x78, 0x04, 0x03,// Y 0x59 0x61, 0x51, 0x49, 0x45, 0x43,// Z 0x5A 0x00, 0x00, 0x7F, 0x41, 0x41,// [ 0x5B 0x02, 0x04, 0x08, 0x10, 0x20,// "\" 0x5C 0x41, 0x41, 0x7F, 0x00, 0x00,// ] 0x5D 0x04, 0x02, 0x01, 0x02, 0x04,// ^ 0x5E 0x40, 0x40, 0x40, 0x40, 0x40,// _ 0x5F 0x00, 0x01, 0x02, 0x04, 0x00,// ` 0x60 0x20, 0x54, 0x54, 0x54, 0x78,// a 0x61 0x7F, 0x48, 0x44, 0x44, 0x38,// b 0x62 0x38, 0x44, 0x44, 0x44, 0x20,// c 0x63 0x38, 0x44, 0x44, 0x48, 0x7F,// d 0x64 0x38, 0x54, 0x54, 0x54, 0x18,// e 0x65 0x08, 0x7E, 0x09, 0x01, 0x02,// f 0x66 0x08, 0x14, 0x54, 0x54, 0x3C,// g 0x67 0x7F, 0x08, 0x04, 0x04, 0x78,// h 0x68 0x00, 0x44, 0x7D, 0x40, 0x00,// i 0x69 0x20, 0x40, 0x44, 0x3D, 0x00,// j 0x6A 0x00, 0x7F, 0x10, 0x28, 0x44,// k 0x6B 0x00, 0x41, 0x7F, 0x40, 0x00,// l 0x6C 0x7C, 0x04, 0x18, 0x04, 0x78,// m 0x6D 0x7C, 0x08, 0x04, 0x04, 0x78,// n 0x6E 0x38, 0x44, 0x44, 0x44, 0x38,// o 0x6F 0x7C, 0x14, 0x14, 0x14, 0x08,// p 0x70 0x08, 0x14, 0x14, 0x18, 0x7C,// q 0x71 0x7C, 0x08, 0x04, 0x04, 0x08,// r 0x72 0x48, 0x54, 0x54, 0x54, 0x20,// s 0x73 0x04, 0x3F, 0x44, 0x40, 0x20,// t 0x74 0x3C, 0x40, 0x40, 0x20, 0x7C,// u 0x75 0x1C, 0x20, 0x40, 0x20, 0x1C,// v 0x76 0x3C, 0x40, 0x30, 0x40, 0x3C,// w 0x77 0x44, 0x28, 0x10, 0x28, 0x44,// x 0x78 0x0C, 0x50, 0x50, 0x50, 0x3C,// y 0x79 0x44, 0x64, 0x54, 0x4C, 0x44,// z 0x7A 0x00, 0x08, 0x36, 0x41, 0x00,// { 0x7B 0x00, 0x00, 0x7F, 0x00, 0x00,// | 0x7C 0x00, 0x41, 0x36, 0x08, 0x00,// } 0x7D 0x08, 0x08, 0x2A, 0x1C, 0x08,// -> 0x7E 0x08, 0x1C, 0x2A, 0x08, 0x08, // <- 0x7F 0x7E, 0x11, 0x11, 0x11, 0x7E,// А 0x80 0x7f, 0x45, 0x45, 0x45, 0x39,// Б 0x81 0x7F, 0x49, 0x49, 0x49, 0x36,// B 0x82 0x7f, 0x01, 0x01, 0x01, 0x03,// Г 0x83 0x60, 0x3e, 0x31, 0x3f, 0x60,// Д 0x84 0x7F, 0x49, 0x49, 0x49, 0x41,// E 0x85 0x73, 0x0c, 0x7f, 0x0c, 0x73,// Ж 0x86 0x22, 0x49, 0x49, 0x49, 0x36,// З 0x87 0x7f, 0x10, 0x8, 0x4, 0x7f,// И 0x88 0x7f, 0x10, 0x9, 0x4, 0x7f,// Й 0x89 0x7F, 0x08, 0x14, 0x22, 0x41,// K 0x8A 0x40, 0x3e, 0x01, 0x01, 0x7f,// Л 0x8B 0x7F, 0x02, 0x04, 0x02, 0x7F,// M 0x8C 0x7F, 0x08, 0x08, 0x08, 0x7F,// H 0x8D 0x3E, 0x41, 0x41, 0x41, 0x3E,// O 0x8E 0x7f, 0x01, 0x01, 0x01, 0x7f,// П 0x8F 0x7F, 0x09, 0x09, 0x09, 0x06,// P 0x90 0x3E, 0x41, 0x41, 0x41, 0x22,// C 0x91 0x01, 0x01, 0x7F, 0x01, 0x01,// T 0x92 0x27, 0x48, 0x48, 0x48, 0x3f,// У 0x93 0xe, 0x11, 0x7f, 0x11, 0xe,// Ф 0x94 0x63, 0x14, 0x08, 0x14, 0x63,// X 0x95 0x3f, 0x20, 0x20, 0x20, 0x7f,// Ц 0x96 0x07, 0x08, 0x08, 0x08, 0x7f,// Ч 0x97 0x3f, 0x20, 0x3f, 0x20, 0x3f,// Ш 0x98 0x3f, 0x20, 0x3f, 0x20, 0x7f,// Щ 0x99 0x03, 0x01, 0x7f, 0x48, 0x30,// Ъ 0x9A 0x7f, 0x48, 0x48, 0x30, 0x7f, // Ы 0x9B 0x00, 0x00, 0x7f, 0x48, 0x30, // Ь 0x9C 0x22, 0x49, 0x49, 0x49, 0x3e,// Э 0x9D 0x7f, 0x08, 0x3e, 0x41, 0x3e, // Ю 0x9E 0x46, 0x29, 0x19, 0x09, 0x7f,// Я 0x9F 0x7c, 0x12, 0x12, 0x12, 0x7c,// a 0xA0 0x3e, 0x45, 0x45, 0x45, 0x38,// б 0xA1 0x7e, 0x4a, 0x4a, 0x34, 0x00, // в 0xA2 0x7e, 0x02, 0x02, 0x04, 0x00, // г 0xA3 0x60, 0x3c, 0x22, 0x3e, 0x60, // д 0xA4 0x3c, 0x52, 0x52, 0x52, 0x0c, // e 0xA5 0x76, 0x08, 0x7e, 0x08, 0x76,// ж 0xA6 0x24, 0x42, 0x4a, 0x4a, 0x34, // з 0xA7 0x7e, 0x60, 0x18, 0x6, 0x7e,// и 0xA8 0x7e, 0x60, 0x19, 0x6, 0x7e,// й 0xA9 0x7e, 0x08, 0x08, 0x08, 0x76,// k 0xAA 0x40, 0x3e, 0x02, 0x02, 0x7e, // л 0xAB 0x7e, 0x04, 0x08, 0x04, 0x7e, // м 0xAC 0x7e, 0x08, 0x08, 0x08, 0x7e,// н 0xAD 0x3c, 0x42, 0x42, 0x42, 0x3c,// o 0xAE 0x7e, 0x02, 0x02, 0x02, 0x7e,// п 0xAF 0x00, 0x00, 0x00, 0x00, 0x00,// 0xB0 0x00, 0x00, 0x00, 0x00, 0x00,// 0xB1 0x00, 0x00, 0x00, 0x00, 0x00,// 0xB2 0x00, 0x00, 0x00, 0x00, 0x00,// 0xB3 0x00, 0x00, 0x00, 0x00, 0x00,// 0xB4 0x00, 0x00, 0x00, 0x00, 0x00,// 0xB5 0x00, 0x00, 0x00, 0x00, 0x00,// 0xB6 0x00, 0x00, 0x00, 0x00, 0x00,// 0xB7 0x00, 0x00, 0x00, 0x00, 0x00,// 0xB8 0x00, 0x00, 0x00, 0x00, 0x00,// 0xB9 0x00, 0x00, 0x00, 0x00, 0x00,// 0xBA 0x00, 0x00, 0x00, 0x00, 0x00,// 0xBB 0x00, 0x00, 0x00, 0x00, 0x00,// 0xBC 0x00, 0x00, 0x00, 0x00, 0x00,// 0xBD 0x00, 0x00, 0x00, 0x00, 0x00,// 0xBE 0x00, 0x00, 0x00, 0x00, 0x00,// 0xBF 0x00, 0x00, 0x00, 0x00, 0x00,// 0xC0 0x00, 0x00, 0x00, 0x00, 0x00,// 0xC1 0x00, 0x00, 0x00, 0x00, 0x00,// 0xC2 0x00, 0x00, 0x00, 0x00, 0x00,// 0xC3 0x00, 0x00, 0x00, 0x00, 0x00,// 0xC4 0x00, 0x00, 0x00, 0x00, 0x00,// 0xC5 0x00, 0x00, 0x00, 0x00, 0x00,// 0xC6 0x00, 0x00, 0x00, 0x00, 0x00,// 0xC7 0x00, 0x00, 0x00, 0x00, 0x00,// 0xC8 0x00, 0x00, 0x00, 0x00, 0x00,// 0xC9 0x00, 0x00, 0x00, 0x00, 0x00,// 0xCA 0x00, 0x00, 0x00, 0x00, 0x00,// 0xCB 0x00, 0x00, 0x00, 0x00, 0x00,// 0xCC 0x00, 0x00, 0x00, 0x00, 0x00,// 0xCD 0x00, 0x00, 0x00, 0x00, 0x00,// 0xCE 0x00, 0x00, 0x00, 0x00, 0x00,// 0xCF 0x00, 0x00, 0x00, 0x00, 0x00,// 0xD0 0x00, 0x00, 0x00, 0x00, 0x00,// 0xD1 0x00, 0x00, 0x00, 0x00, 0x00,// 0xD2 0x00, 0x00, 0x00, 0x00, 0x00,// 0xD3 0x00, 0x00, 0x00, 0x00, 0x00,// 0xD4 0x00, 0x00, 0x00, 0x00, 0x00,// 0xD5 0x00, 0x00, 0x00, 0x00, 0x00,// 0xD6 0x00, 0x00, 0x00, 0x00, 0x00,// 0xD7 0x00, 0x00, 0x00, 0x00, 0x00,// 0xD8 0x00, 0x00, 0x00, 0x00, 0x00,// 0xD9 0x00, 0x00, 0x00, 0x00, 0x00,// 0xDA 0x00, 0x00, 0x00, 0x00, 0x00,// 0xDB 0x00, 0x00, 0x00, 0x00, 0x00,// 0xDC 0x00, 0x00, 0x00, 0x00, 0x00,// 0xDD 0x00, 0x00, 0x00, 0x00, 0x00,// 0xDE 0x00, 0x00, 0x00, 0x00, 0x00,// 0xDF 0x7e, 0x12, 0x12, 0x12, 0xc, // p 0xE0 0x3c, 0x42, 0x42, 0x42, 0x24,// c 0xE1 0x02, 0x02, 0x7e, 0x02, 0x02,// т 0xE2 0x0e, 0x50, 0x50, 0x50, 0x3e,// y 0xE3 0x0c, 0x12, 0x7e, 0x12, 0x0c,// ф 0xE4 0x76, 0x08, 0x08, 0x08, 0x76,// x 0xE5 0x3e, 0x20, 0x20, 0x20, 0x5e, //ц 0xE6 0x0e, 0x10, 0x10, 0x10, 0x7e, //ч 0xE7 0x3e, 0x20, 0x3e, 0x20, 0x3e,//ш 0xE8 0x3e, 0x20, 0x3e, 0x20, 0x7e,//щ 0xE9 0x06, 0x02, 0x7e, 0x48, 0x30, //ъ 0xEA 0x7e, 0x48, 0x30, 0x00, 0x7e,// ы 0xEB 0x00, 0x00, 0x7e, 0x48, 0x30,// ь 0xEC 0x24, 0x42, 0x4a, 0x4a, 0x3c,//э 0xED 0x7e, 0x08, 0x3c, 0x42, 0x3c,//ю 0xEE 0x00, 0x4c, 0x32, 0x12, 0x7e,//я 0xEF 0x7e, 0x4b, 0x4a, 0x43, 0x24, //Ё 0xF0 0x3c, 0x53, 0x52, 0x53, 0xc,// ё 0xF1 0x7F, 0x49, 0x49, 0x49, 0x41,// E 0xF2 0x3c, 0x52, 0x52, 0x52, 0xc, //е 0xF3 0x00, 0x45, 0x7c, 0x45, 0x00, //II 0xF4 0x0, 0x45, 0x7c, 0x41, 0x00, //ii 0xF5 0x00, 0x00, 0x00, 0x00, 0x00,// 0xF6 0x00, 0x00, 0x00, 0x00, 0x00,// 0xF7 0x06, 0x09, 0x09, 0x06, 0x00,// o 0xF8 0x00, 0x00, 0x00, 0x00, 0x00,// 0xF9 0x00, 0x00, 0x00, 0x00, 0x00,// 0xFA 0x00, 0x00, 0x00, 0x00, 0x00,// 0xFB 0x14, 0x7F, 0x14, 0x7F, 0x14,// # 0xFC 0x00, 0x00, 0x00, 0x00, 0x00,// 0xFD 0x00, 0x00, 0x00, 0x00, 0x00,// 0xFE 0x00, 0x00, 0x00, 0x00, 0x00// 0xFF }; #endifИ перекодировка с UTF-8 в кодовую таблицу шрифта:
int utf8_strlen(const String& str) // возвращает длину в символах строки в кодировке UTF-8 { int c,i,ix,q; for (q=0, i=0, ix=str.length(); i < ix; i++, q++) { c = (unsigned char) str[i]; if (c>=0 && c<=127) i+=0; else if ((c & 0xE0) == 0xC0) i+=1; else if ((c & 0xF0) == 0xE0) i+=2; else if ((c & 0xF8) == 0xF0) i+=3; //else if (($c & 0xFC) == 0xF8) i+=4; // 111110bb //byte 5, unnecessary in 4 byte UTF-8 //else if (($c & 0xFE) == 0xFC) i+=5; // 1111110b //byte 6, unnecessary in 4 byte UTF-8 else return 0; //invalid utf8 } return q; } //-------------------------------------------------------------------------------------------------------------------------------- unsigned int utf8GetCharSize(unsigned char bt) { if (bt < 128) return 1; else if ((bt & 0xE0) == 0xC0) return 2; else if ((bt & 0xF0) == 0xE0) return 3; else if ((bt & 0xF8) == 0xF0) return 4; else if ((bt & 0xFC) == 0xF8) return 5; else if ((bt & 0xFE) == 0xFC) return 6; return 1; } //-------------------------------------------------------------------------------------------------------------------------------- bool utf8ToUInt(const String& bytes, unsigned int& target) { unsigned int bsize = bytes.length(); target = 0; bool result = true; if (bsize == 1) { if ((bytes[0] >> 7) != 0) { result = false; } else target = bytes[0]; } else { unsigned char cur_byte = bytes[0]; target = ((cur_byte & (0xFF >> (bsize + 1))) << (6 * (bsize - 1))); unsigned int i = 1; while (result && (i < bsize)) { cur_byte = bytes[i]; if ((cur_byte >> 6) != 2) { result = false; } else target |= ((cur_byte & 0x3F) << (6 * (bsize - 1 - i))); i++; } } return result; } //-------------------------------------------------------------------------------------------------------------------------------- String convertFromUTF8ToDisplayFont(const String& src) { String result; const char* ptr = src.c_str(); while(*ptr) { byte curChar = (byte) *ptr; unsigned int charSz = utf8GetCharSize(curChar); static char curBytes[7] = {0}; for(byte i=0;i<charSz;i++) { curBytes[i] = *ptr++; } curBytes[charSz] = '\0'; // добавляем завершающий 0 unsigned int myChar; if(utf8ToUInt(curBytes,myChar)) { if(myChar <= 0x7F) result += (char) myChar; else if(myChar == 0x401) // Ё result += (char) 0xF0; else if(myChar == 0x451) // ё result += (char) 0xF1; else if(myChar >= 0x410 && myChar <= 0x43F) // А-Яa-п result += (char) (myChar - 0x390); else if(myChar >= 0x440 && myChar <= 0x44F) // р-я result += (char) (myChar - 0x360); } } // while return result; } //--------------------------------------------------------------------------------------------------------------------------------Как видно из шрифта - там "ё" и "Ё" - отдельно, между "п" и "р" - пробел, короче, дичь :) Делалось именно под эту дичь, но легко можно доработать под какой-нибудь стандартный подход к шрифту.
В шрифте библиотеки - тоже отсебятина, как бог на душу положит раскиданы символы. Нет в жизни счастья :)
Правка: чот не вижу я там UTF-8, от слова "совсем". Хочешь сказать, что если я вызову drawString вот так:
drawString("Привет")то отрисуется русский текст? В коде библиотеки не вижу никакой работы с UTF-8.
Ну, у меня - работает, видео выше выложил. Кусок кода, работа которого видна на видео - ниже. См строчку 5
void loop(void) { dmd.clearScreen( true ); dmd.selectFont(UkrRusArial_14); const char *MSG = "Туалет не работает"; dmd.drawMarquee(MSG,strlen(MSG),(32*DISPLAYS_ACROSS)-1,0); long timer=millis(); while(1){ if ((millis()- timer) > 50) { dmd.stepMarquee(-1,0); timer=millis(); } } }Так, продолжил изыскания.
На всякий случай проверил, в какой кодировке у меня сохранен скетч - Notepad++ пишет UTF-8. Так что похоже, что эта библиотека как-то обрабатывает UTF8 прямо из скетча, хотя я тоже не вижу в ее коде никаких перекодировок.
Но обрати внимание, что они переставили символы в фонте SystemFont5x7rus.h так, что теперь коды кириллицы у них соответвуют младшему байту кода UTF8. То есть для вывода символа никакая сложная перекодировка не нужна - просто отбрасывай старший байт и все!
правда я все равно не вижу в коде библиотеки, где они этот байт отбрасывают.
правда я все равно не вижу в коде библиотеки, где они этот байт отбрасывают.
все, нашел, как они перекодируют кириллицу в UTF8 - все до безобразия просто :) Они Уникод-символы тупо пихают в обычный unsigned char - вот у них и остается от Уникода только младщий байт!
Заголовк функции вывода символа:
Короче, похоже сделать вывод UTF8 с этой библиотекой никакой проблемы не составит, главное фонты с нужной метрикой подложить.
Вопрос - где бы надыбать разнообразных фонтов в кириллице высотой 10-15 пикселей? - кодировка не важна, это я поменяю
Так ты посмотри, откуда вызывается drawChar - из drawString, где ПОБАЙТОВО проходят массив char. Что-то не срастается у меня, и твой пример с "Туалет не работает" это только подтверждает. Выведи результат strlen(MSG) в Serial - и увидишь, что байтовая длина там будет сильно больше, чем символьная, если строка реально в UTF-8. Далее, идём в drawString и видим, что там побайтово идёт анализ.
Дело там не в отбрасывании байт, а имхо в том, что просто неизвестный байт, не соответствующий символу - не рисуется. Как по мне - костыль костыльный.
Дело там не в отбрасывании байт, а имхо в том, что просто неизвестный байт, не соответствующий символу - не рисуется. Как по мне - костыль костыльный.
вполне возможно. Ок, проверю и подумаю, что тут можно поправить
Главное чтоб библиотека нормально заработала. У меня сейчас время появилось, попробую допилить код до приличного вида (пока без учета косяков с UTF8) и выложить, чтоб другие могли проверить
Сделал библиотеку, вычистил все косяки в коде, перевел все дефайны в переменные... все работает. Собрался выкладывать и столкнулся с совершенно дурацкой ситуацией. Код работает только если контакт nOE матрицы подсоединен к пину PA11 на плате СТМ. Ни на каком другом пине не работает.Ввсе прочие пины можно менять, (даже для SPI есть выбор между SPI1 и SPI2) - а этот должен быть только PA11...
Пока завис на этом.
подпишусь... как раз тут информер вояю...
УФФ, похоже победил!
Работает на произвольных пинах (хотя как выяснилось - далеко не на любых, есть куча исключений).
Запихал все переменные и методы библиотеки в класс DMD, выкинул все глобалы и дефайны. В итоге появилась возможность независимо вызывать несколько экземпляров класса. Поскольку у STM32F103 два канала SPI - можно запустить две независимые цепочки матриц, управляемые одной платой. Пример на видео:
https://youtu.be/OCpLTLpwgRI
Теперь можно выкладывать. Займусь освоением Гитхаба
Выложил код на Гитхаб https://github.com/board707/DMD_STM32
Открыл ветку в "Проектах" http://arduino.ru/forum/proekty/dmdstm32-versiya-biblioteki-dmd-dlya-stm32duino
предлагаю переместить обсуждение туда. Очень жду ваших замечаний.