Добавить свои изменения в чужую библиотеку на Гитхабе?

b707
Offline
Зарегистрирован: 26.05.2017

Хочу поучаствовать в редактировании вот этой библиотеки :

https://github.com/mozok/DMDSTM

Это адаптация библиотеки DMD (для светодиодных матриц p10) под СТМ32Дуино. Автор начал работу и больше года как забросил на пол-дороги, в коде какие-то обрывки. Я ее немного почистил у меня все отлично заработало. Но библиотеку надо "причесать" - добавить нормальный выбор пинов, сделать выбор между SPI-1 и SPI-2, переписать примеры под СТМ

Опыта в совместной работе на Гитхабе - ноль. Как вообще это делается? Как законтачить с автором? принято ли предлагать свои правки - или авторы проектов этого не любят?

Ну и вообще - нужно ли это? Удивляет, что для матриц P10 нет официальных библиотек под СТМ32. Вроде там абсолютно ничего сложного. Может есть какая-то причина и для работы с DMD стм32 никто не использует?

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Делаешь pull request с изменениями, и если автор одобрит - то он сольёт эти изменения со своим гитом. А так, если не париться - сделай форк его репозитория, и уже в него закоммить свои изменения.

Кстати - в репозитории видно, что автор принимал реквесты, так что всё должно быть норм: https://github.com/mozok/DMDSTM/pull/1

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Кстати сказать - с удовольствием бы поюзал хорошую библиотеку для P10 под STM32, особенно - если там есть кириллица в UTF-8 из коробки. И если ты говоришь, что допилил до нормального состояния - выкладывай на гитхаб, давай ссылку - сделаю форк, и буду при случае юзать твою ;)

b707
Offline
Зарегистрирован: 26.05.2017

DIYMan пишет:

Кстати сказать - с удовольствием бы поюзал хорошую библиотеку для P10 под STM32, особенно - если там есть кириллица в UTF-8 из коробки. И если ты говоришь, что допилил до нормального состояния - выкладывай

не, пока я только убедился, что библиотека в принципе рабочая. Запустил один стандартный пример  из библиотеки DMD на STM32F103. Там еще есть что поправить - Код там недоделанный, конструктор кривоватый, пины прямо в коде библиотеки устанавливаюся.. Но, принципе, "причесать" то что есть до рабочего состояния не так и трудно, пару дней посидеть... Получится - выложу.

UTF-8 "из коробки" в оригинальной DMD нет, соответвенно и тут тоже. Можно допилить, но это серьезная тема.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

b707 пишет:

UTF-8 "из коробки" в оригинальной DMD нет, соответвенно и тут тоже. Можно допилить, но это серьезная тема.

Да ничо там серьезного нету, проблема только со шрифтами. Я делал проект под DMD и P10, надыбал только один русский шрифт, а ручками отрисовывать в GLCD Font creator - то ещё удовольствие. А проблема только в том, что автор шрифта раскидал символы по шрифту - как захотел. Написал я маппинг из UTF-8 в кодовую страницу этого шрифта, но - это совсем непереносимо.

Вот если бы запилить какой-нибудь стандарт кириллического шрифта под эту библу - я бы подкинул функции перекодировки, там ничего космического нету.

Скажем по-другому: для меня существует проблема с наличием отсутствия РАЗНЫХ кириллических шрифтов под DMD, с одинаковой внутренней кодировкой (чтобы один и тот же символ имел один и тот же код в таблице шрифта). А UTF-8 туда припилить - припилим ;)

Так что считай - я в деле, если что - обращайся без зазрения, можем гит вместе вести, там контрибуторы добавляются легко ;)

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

самое простое, наерна, сделать маппинг Utf8->CP866

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Должен заметить, что utf-8 для Аrduino - тяжеловато. Даже в варианте stm32.

utf-8 - это весь японский, китайский, арабский и т.п. Не исключая также грузинского и греческого. Уместить все это в 64к нереально.

А если заявлять о поддержке utf-8, а на деле поддерживать одну кириллицу, 98% населения планеты этого не поймут. (или гитхаб стал на 100% русскоязычным?)

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Да никто не говорит о полноценной поддержке UTF-8, ессно. Тем более, что специфика в разрезе данного проекта - тупо упирается в размер шрифта и кол-во символов в нём. Тут скорее - удобство пользования в виде некоторого "стандарта": сделать простейшую систему плагинов: для шрифта с набором символов - своя функция маппинга из UTF-8 в кодовую страницу шрифта. Надо мне шрифт на японском - взял шрифт, где помимо латиницы ещё японские алфавиты, в комплекте со шрифтом - функция маппинга, далее тупо беру и пишу в прошивке текст на японском, и всё - он отображается на матрице.

Библиотека DMD убога как раз отсутствием вот этих вот фич, пмсм. И описанное - уж точно востребовано, т.к. если почитать оф. форум - там и арабы задают вопросы, мол "хочу шрифт на арабском" и индусы, и т.д. и т.п. При том, что Arduino IDE хранит файлы в UTF-8 - сам бог велел чуть расширить функционал библиотеки. Тут главное - оставить кодовую страницу латиницы в шрифте нетронутой, и разработать соглашение о расширении шрифта. А сами шрифты - GLCD Font creator и ещё какая-то прога, помню, скачивал, правда, и то и то - долговато.

При таком подходе - и пользователи подтянутся. Да даже если и не подтянутся - тут что, кто-то ставит перед собой цель понравится всему гитхабу? Как-то наивно.

b707
Offline
Зарегистрирован: 26.05.2017

Кстати. в комплекте библиотеки уже лежит пара фонтов кириллицы c кодировкой UTF8

Можно выводить надписи прямо из скетча, без всяких перкодировок:

https://youtu.be/e9aPEgUchlY

Качество фонтов, правда, довольно средненькое

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

b707 пишет:

Кстати. в комплекте библиотеки уже лежит пара фонтов кириллицы c кодировкой UTF8

Можно выводить надписи прямо из скетча, без всяких перкодировок:

https://youtu.be/e9aPEgUchlY

Качество фонтов, правда, довольно средненькое

Автор библиотеки допилил, что ли? Если так - то отлично ;)

Правка: чот не вижу я там UTF-8, от слова "совсем". Хочешь сказать, что если я вызову drawString вот так:

drawString("Привет")

то отрисуется русский текст? В коде библиотеки не вижу никакой работы с UTF-8.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Вот, кстати, как я юзаю 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;
}
//--------------------------------------------------------------------------------------------------------------------------------

Как видно из шрифта - там "ё" и "Ё" - отдельно, между "п" и "р" - пробел, короче, дичь :) Делалось именно под эту дичь, но легко можно доработать под какой-нибудь стандартный подход к шрифту.

В шрифте библиотеки - тоже отсебятина, как бог на душу положит раскиданы символы. Нет в жизни счастья :)

b707
Offline
Зарегистрирован: 26.05.2017

DIYMan пишет:

Правка: чот не вижу я там 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();
       
     }
   }
}

 

b707
Offline
Зарегистрирован: 26.05.2017

Так, продолжил изыскания.

На всякий случай проверил, в какой кодировке у меня сохранен скетч - Notepad++ пишет UTF-8. Так что похоже, что эта библиотека как-то обрабатывает UTF8 прямо из скетча, хотя я тоже не вижу в ее коде никаких перекодировок.

Но обрати внимание, что они переставили символы в фонте SystemFont5x7rus.h так, что теперь коды кириллицы у них соответвуют младшему байту кода UTF8. То есть для вывода символа никакая сложная перекодировка не нужна - просто отбрасывай старший байт и все!

правда я все равно не вижу в коде библиотеки, где они этот байт отбрасывают.

b707
Offline
Зарегистрирован: 26.05.2017

b707 пишет:

правда я все равно не вижу в коде библиотеки, где они этот байт отбрасывают.

все, нашел, как они перекодируют кириллицу в UTF8 - все до безобразия просто :) Они Уникод-символы тупо пихают в обычный unsigned char - вот у них и остается от Уникода только младщий байт!

Заголовк функции вывода символа:

int DMD::drawChar(const int bX, const int bY, const unsigned char letter, byte bGraphicsMode)

Короче, похоже сделать вывод UTF8 с этой библиотекой никакой проблемы не составит, главное фонты с нужной метрикой подложить.

Вопрос - где бы надыбать разнообразных фонтов в кириллице высотой 10-15 пикселей? - кодировка не важна, это я поменяю

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Так ты посмотри, откуда вызывается drawChar - из drawString, где ПОБАЙТОВО проходят массив char. Что-то не срастается у меня, и твой пример с "Туалет не работает" это только подтверждает. Выведи результат strlen(MSG) в Serial - и увидишь, что байтовая длина там будет сильно больше, чем символьная, если строка реально в UTF-8. Далее, идём в drawString и видим, что там побайтово идёт анализ.

Дело там не в отбрасывании байт, а имхо в том, что просто неизвестный байт, не соответствующий символу - не рисуется. Как по мне - костыль костыльный.

b707
Offline
Зарегистрирован: 26.05.2017

DIYMan пишет:

Дело там не в отбрасывании байт, а имхо в том, что просто неизвестный байт, не соответствующий символу - не рисуется. Как по мне - костыль костыльный.

вполне возможно.  Ок, проверю и подумаю, что тут можно поправить

Главное чтоб библиотека нормально заработала. У меня сейчас время появилось, попробую допилить код до приличного вида (пока без учета косяков с UTF8) и выложить, чтоб другие могли проверить

 

b707
Offline
Зарегистрирован: 26.05.2017

Сделал библиотеку, вычистил все косяки в коде, перевел все дефайны в переменные... все работает. Собрался выкладывать и столкнулся с совершенно дурацкой ситуацией. Код работает только если контакт nOE матрицы подсоединен к пину PA11 на плате СТМ. Ни на каком другом пине не работает.Ввсе прочие пины можно менять, (даже для SPI есть выбор между SPI1 и SPI2) - а этот должен быть только PA11...

Пока завис на этом.

 

lean_74
Offline
Зарегистрирован: 22.12.2015

подпишусь... как раз тут информер вояю...

b707
Offline
Зарегистрирован: 26.05.2017

УФФ, похоже победил!

Работает на произвольных пинах (хотя как выяснилось - далеко не на любых, есть куча исключений).

Запихал все переменные и методы библиотеки в класс DMD, выкинул все глобалы и дефайны. В итоге появилась возможность независимо вызывать несколько экземпляров класса. Поскольку у STM32F103 два канала SPI - можно запустить две независимые цепочки матриц, управляемые одной платой. Пример на видео:

https://youtu.be/OCpLTLpwgRI

Теперь можно выкладывать. Займусь освоением Гитхаба

b707
Offline
Зарегистрирован: 26.05.2017

Выложил код на Гитхаб https://github.com/board707/DMD_STM32

Открыл ветку в "Проектах" http://arduino.ru/forum/proekty/dmdstm32-versiya-biblioteki-dmd-dlya-stm32duino

предлагаю переместить обсуждение туда. Очень жду ваших замечаний.