Najtrudniejsze już zrobione – wiadomo jak zmusić tablicę do wyświetlenia czegokolwiek. Teraz czas na spięcie wszystkiego razem – podczas tego etapu prac okazało się, jak po samym protokole komunikacyjnym można odkryć jak rozwijały się produkty firmy NewWing, jakie obejścia przy ich produkcji stosowano i jaki dług techniczny zaciągnięto.

Ostatni odcinek skończył się na udanym wysyłaniu do tablicy zapisanych wcześniej danych. Prace nad pełnym rozgryzieniem protokołu zaczynamy od modyfikacji bajtów w zrzutach i obserwowaniu wyniku – po kilku próbach bez większych problemów rozpracowałem ogólny schemat.

Blok zaznaczony na szaro zawsze pozostawał taki sam – nazwałem go preambułą. Podejrzewam że zawiera podstawowe parametry, takie jak szerokość i wysokość. Niestety brakuje mi możliwości aby to w pełni zweryfikować.
Blok oznaczony na niebiesko to ustawienia efektów – zmieniając bity w nim sprawiałem że tekst przesuwał się na tablicy w różnych kierunkach lub był animowany w jeden ze sposobów znanych z naszych ulic. Małym smaczkiem było odkrycie parametru mówiącego o długości tekstu – ustawiając go na dużą wartość można przejrzeć historię danych na tablicy.
Blok zielony, żółty i czerwony to dane pojedynczych pikseli. Po ich zmianie zapalają się i gasną pojedyncze diody. Każdy bajt koduje 4 piksele, tylko nieparzyste bity są używane (pozostałe są ignorowane przez tablicę). Możliwe że protokół działa z tablicami dwukolorowymi (parzyste bity sterują pewnie tym drugim kolorem).

Dlaczego więc trzy kolory bloków? To ilustracja bardzo nieeleganckiego rozwiązania problemu z jakim starli się Chińscy inżynierowie, ale żeby go wyjaśnić, przeanalizujmy jak wygląda cała komunikacja z urządzeniem – warto jeszcze przed tym zaznaczyć, jak fizycznie zbudowana jest moja tablica. Ma ona trzy fizyczne segmenty diod o wymiarach 32 ✕ 32 = 1024 diod na segment.

Liczby przed blokami danych (te niepokolorowane) oznaczają ile bajtów w bloku tablica ma przetworzyć. Większość bloków zaczyna się siódemką (nazwijmy je pełnymi), kodują one 28 pikseli. Po nich wysyłany jest jeden blok z czwórką na początku (nazwijmy go uzupełniającym) i tylko cztery bajty z niego tablica przetwarza, pozostałe są ignorowane bez względu na wartość. Daje to razem 16 pikseli. Po wysłaniu takiego bloku uzupełniającego należy odczytać komunikat z tablicy – tak jakby oznaczało to „zatwierdzenie” całego, dużego bloku transmisyjnego.
Mając te dane można policzyć, ile pikseli zawiera jeden blok transmisyjny – drugi i trzeci zawierają po 1024 piksele, czyli tyle co jeden fizyczny segment. Ale przez to że na samym początku został upchnięty jeden bloczek z ustawieniami efektów, bloki transmisyjne nie tylko nie pasują do segmentów tablicy, ale też konieczne staje się wysłanie dodatkowego, małego bloku specjalnego na końcu, z danymi dla tych kilkunastu pozostałych diod.
Być może w pierwszych tablicach, bez żadnych animacji, układ bloków był logiczny, ale kiedy pojawiła się konieczność dodania efektów, dolepiono je na szybko tak, jak było najłatwiej nie przejmując się logiką transmisji.

Będąc uzbrojonym w te wszystkie informacje można stworzyć skrypt wyświetlający dowolny tekst – ja użyłem do tego Pythona i biblioteki Pillow. Stworzenie w niej monochromatycznego obrazka z tekstem to już kilkulinijkowa bułka z masłem – dużo bardziej złożone było wygenerowanie bloków danych tak, aby wyświetliły się na tablicy zgodnie z założeniem.

Więcej o Pillow i graficznej części tego zadania w następnej części. Ale to jeszcze nie będzie wszystko – trzeba rozwiązać jeszcze kilka niecodziennych problemów, takich jak znalezienie odpowiednich czcionek. Magiczny dym uciekający z tablicy również się pojawi…