LED panel Proces, jímž se z teček na papíře či z barevných světélek LED vytvářejí písmena a obrazce mne fascinuje už dvacet let. Strašně rád si s podobnými věcmi hraju, takže když jsem v Makru spatřil LED displej Sigma ASC 105, bylo rozhodnuto. Jedná se o jednořádkový trojbarevný svítivý panel, kterému se říká “běžící text” nebo “světelné noviny”. Taková ta věc, kterou najdete třeba v novějších dopravních prostředcích, kterak ukazuje názvy zastávek.

Za cenu okolo 2500 Kč se může pochlubit schopnostmi, kterými jinak disponují zařízení s několikanásobnou cenou. Vkládání textů se děje prostřednictvím dost příšerného dálkového ovládání, nebo ještě příšernějšího programu, který komunikuje přes sériový port. Možnost automatizace veškerá žádná, protokol není nijak popsaný, API neexistuje.

Jak se hackuje sériová komunikace

Prvním krokem tedy bylo rozlousknout komunikační protokol. Z logiky věci vyplývá, že s největší pravděpodobností půjde o jednoduchý textový protokol, doplněný nějakými řídícími znaky. V zásadě by tedy mělo stačit poslat do panelu z dodaného programu dostatečné množství známých instrukcí a sledovat, co nám teče po lince.

Možností odposlechu sériové komunikace je několik. Nejrobustnější je hardwarové řešení, ale to jsem neměl k dispozici. Softwarové řešení nabízí třeba HHD Software, dokonce dostupné zdarma. Free Serial Port Monitor dokáže odchytávat komunikaci na lince a zobrazovat ji mnoha různými způsoby. Mimochodem: stejná firma nabízí velmi mocné nástroje na sledování téměř čehokoliv, včetně USB a síťové komunikace.

Problém v mém případě spočíval v tom, že používám 64-bitový systém, na kterém popsaný program neběží. To jsem vyřešil pomocí Virtual PC: to umí emulovaný sériový port virtuálního počítače napojit na skuteční COM port hostitele, takže stačilo do virtuálu nainstalovat 32-bitová XPčka a všechno běželo perfektně. Výsledkem usilovného snažení byla stoha papírů, potištěných šestnáctkovými číslicemi.

Pár dnů nato se cestujícím v Pendolinu SC 135 z Prahy do Brna naskytl zajímavý pohled na zarostlého chlapa, an s československým vlčákem u nohou rozkládá po vlakovém stolečku papíry s podivnými hieroglyfy a za polohlasného mumlání po nich čmárá šipky a kolečka.

Jak se programuje

Vlastní implementace pak je vcelku triviální, protože sériovou komunikaci zvládá .NET Framework od verze 2.0 velmi dobře. V zásadě se jedná o čtení a zápis do streamu, stejně jako v případě souboru, síťové komunikace a kdečeho dalšího.

Napsal jsem univerzální knihovnu, která umožňuje programovat panel z libovolné .NET aplikace. Její použití je vcelku triviální: Vytvoří se instance třídy Message, do které se pomocí metody Write zapisuje text a speciální znaky, pomocí metody WriteLine se vkládá “nový řádek” s některým z podporovaných přechodových efektů a pomocí odpovídajících metod se nastavuje použitý font a jeho barva. Pomocí třídy ControlClient se potom tato zpráva odešle do panelu.

Zadání složitější zprávy může vypadat nějak takto:

using (Message msg = new Message(new LineTransitionOptions { Animation = AnimationType.ScrollUp, Color = Color.LayerMix, Font = Font.Fixed11x07 })) {

    msg.Write("DEMO OF");

 

    // Using several colors in one line (you can change the font using SetFont method as well)

    msg.WriteLine(new LineTransitionOptions { Font = Font.Fixed06x07, Color = Color.Red });

    msg.Write("SIGMA ");

    msg.SetColor(Color.Orange);

    msg.Write("ASC 105");

 

    msg.WriteLine(new LineTransitionOptions { Color = Color.Yellow });

    msg.Write("Control Lib");

 

    msg.WriteLine(new LineTransitionOptions { Color = Color.Orange, Animation = AnimationType.OpenFromSides });

    msg.Write(Glyph.ArrowRight);

    msg.SetColor(Color.Green);

    msg.Write("made by");

    msg.SetColor(Color.Orange);

    msg.Write(Glyph.ArrowLeft);

 

    msg.WriteLine(new LineTransitionOptions { Color = Color.Yellow, Font = Font.Fixed06x05 });

    msg.Write("Altairis LLC");

 

    msg.WriteLine(new LineTransitionOptions { Color = Color.Green, Font = Font.Fixed06x07 });

    msg.Write("http://www.codeplex.com/SigmaASC105lib/");

 

    msg.WriteLine(new LineTransitionOptions { Color = Color.Red, Animation = AnimationType.CoverFromCenter });

    msg.Write(SpecialFunction.CurrentDate);

 

    msg.WriteLine();

    msg.Write(SpecialFunction.CurrentTime);

 

    using (ControlClient client = new ControlClient(PortName)) {

        Console.Write("Sending {0} bytes to {1}...", msg.Length, PortName);

        client.SendMessage(msg);

        Console.WriteLine("OK");

    }

}

Celou knihovnu včetně zdrojového kódu jsem dal k dispozici pod Microsoft Public License (Ms-PL) na CodePlex, kdežtě si ji můžete stáhnout.

Tak, a teď ještě pro celou tu věc vymyslet nějaké praktické využití, než na to přijde moje přítelkyně a začne mi lát, za co jsem to zase vyhodil prachy :-) Pokud vás něco napadá, dejte mi vědět v komentářích.