Popularny post ethanak Napisano Lipiec 4, 2023 Popularny post Udostępnij Napisano Lipiec 4, 2023 (edytowany) I znowu rozwiązanie programowe, w dodatku z tym i18n to trochę na wyrost... Ale o co chodzi? Biblioteka Arduino_GFX jest popularna, ma dość duże możliwości, niestety ma co najmniej jedną wadę: wbudowany font 5x8 zawiera oprócz ASCII tylko kilka liter z zakresu ISO-8859-1 i mnóstwo fajnych nader rzadko używanych znaczków typu "serduszko", "kwadracik", "kółeczko" i tak dalej. A w wielu przypadkach potrzeba wyświetlić po prostu tekst na wyświetlaczu, i to przy użyciu jak najmniejszej ilości pamięci. Co prawda biblioteka pozwala na zaimportowanie jakiejś czcionki, ale i tak jest ograniczona do ośmiobitowego wyświetlania... Już wcześniej pokazywałem jak można w tej bibliotece (trochę trickowo) zaimplementować przynajmniej polskie literki. Tym razem postanowiłem pójść dalej, czyli spróbować wyświetlić oprócz podstawowego ASCII wszystkie znaczki z zakresu 0xa0..0x17f (czyli cały zakres ISO-1, ISO-2 i kilka innych literek pochodzących z różnych języków). Oczywiście wydaje się to niemożliwe - nawet jeśli użyć całej dostępnej przestrzeni 8-bitowego kodowania można uzyskać dodatkowo zakres 0x01 do 0x1f (z wyłączeniem 0x0a i 0x0d) i 0x7f do 0xa0, czyli dokładnie 63 możliwe glify. Użyłem więc zmów pewnego tricku. Ponieważ przy tak małej czcionce nie da się stworzyć różnych glifów do wszystkich liter, niektórym literom odpowiadają te same glify. I tak przykładowo litery Š i š wyglądają na wyświetlaczu identycznie, a więc glif jest wspólny. W wielu przypadkach nie da się inaczej narysować tyldy, makrona czy brewisa: zastępuje je pojedyncza kreska nad literą. Poza tym niektóre nader rzadko używane litery (jak Ħ czy ſ) wyświetlane są po prostu jako H i s. Jak mi to wyszło - oceńcie sami; niestety nie mam szans na zrobienie ostrego zdjęcia z małego wyświetlacza ale możecie uwierzyć że coś tam jest wyświetlane 🙂 A więc jak tego używać? Na początek ściągnąć potrzebne pliki: gfxi18n.zip Teraz w bibliotece Adafruit_GFX należy podmienić plik glcdfont.c na ten wyciągnięty z zipa. Można skopiować bibliotekę (wraz z używanym driverem wyświetlacza) do folderu szkicu, ale prościej będzie zrobić to po prostu w folderze biblioteki (gdzieś w Arduino/libraries). Teraz można już ich używać. W przypadku małych AVR-ów ograniczymy się raczej do wyświetlania stałych tekstów (chociaż nic nie stoi na przeszkodzie aby użyć programowej konwersji z UTF-8 na lokalny kod wyświetlania - oprócz oczywiście ilości pamięci). Aby nie przeliczać sobie ręcznie można użyć programu convloc.py. Tekst w kodowaniu UTF-8 (czyli pewnie takim w którym pracujesz) można podać albo jako parametry w linii poleceń, albo na wejście programu. W wyniku program wypisuje tekst, którego można już użyć do wyświetlania: Można również użyć konwertera, np. jakoś tak: void displayText(const char *utf8_text) { char buffer[128]; utf2local(utf8_text, buffer, 128); display.print(buffer); } Załączony przykład dotyczy małego wyświetlacza OLED, ale można go przerobić na dowolny inny. Ważne, aby wywołać przy inicjalizacji funkcję cp437 informującą bibliotekę, że ma działać zgodnie ze standardem (nie uwzględniając błędu, który kiedyś tam w bibliotece istniał). A jeśli komuś się nie podobają moje wersje glifów - załączam prosty programik którego można użyć do edycji. Wystarczy w przeglądarce otworzyć załączony plik edytor.html. Na dziś tyle 🙂 Edytowano Lipiec 5, 2023 przez ethanak 5 Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
Bądź aktywny - zaloguj się lub utwórz konto!
Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony
Utwórz konto w ~20 sekund!
Zarejestruj nowe konto, to proste!
Zarejestruj się »Zaloguj się
Posiadasz własne konto? Użyj go!
Zaloguj się »