Kurz4 - Kapitola7

17. června 2007 v 15:40 | http://www.sweb.cz/kurz_evt/ |  Programování pro WinCE

6.7 Jak pracují členské funkce CIRcontrol

Minule jsme doplnili metody třídy CIRcontrol. Nyní se ke zdrojovému kódu vrátíme a trochu si jej popíšeme. Kód je sice doplněn komentáři, ale pár slov navíc neuškodí ... (...snad :-)

Tři pomocné funkce

Začněme pomocnými funkcemi, které nejsou součástí třídy CIRcontrol, ale konstruktor třídy využívá jejich služeb.
Funkce GetIRPort prohledává registry počítače a snaží se objevit číslo sériového portu, na němž je připojeno IR rozhraní. Kladné číslo znamená úspěšně nalezený IR port, záporné pak chybu při hledání. Bližší popis (podobně jako u dvou následujících funkcí) můžete v angličtině najít na stránkách, odkud jsem funkce přebral.
Funkce GetConnectionName přečte z registrů jméno spojení ActiveSync s osobním počítačem. Tuto funkci využije další funkce DisconnectActiveSync. Není-li spojení provedeno přes USB rozhraní, preventivně jej přeruší.

Konstruktor

Uvedené tři funkce byly kompletně převzaty z uvedeného zdroje. Konstruktor již vyžadoval jisté tvůrčí úsilí. Částečně je jeho zdrojový kód převzat z funkce pro otevření IR portu v Raw režimu, zbytek je doplněn. Výsledkem je několik za sebou jdoucích činností:
  1. Nejdříve se pokusíme objevit soubor s uloženými hodnotami povelů dálkového ovládání. Jestliže existuje, je načteno jediným příkazem celé pole Impuls. Pokud není k dispozici, potřebné položky pole si vynulujeme.
  2. Zjistíme a uložíme si frekvenci čítače s vysokým rozlišením. K čemu nám je to dobré, bude uvedeno dále.
  3. Pro jistotu se pokusíme zavřít spojení ActiveSync s PC.
  4. Zjistíme číslo IR portu a pokusíme se ho otevřít.
  5. Nastavíme velikost bufferu a správný režim činnosti portu.
  6. Přečteme stávající řídicí blok portu, upravíme jej podle našich potřeb a nastavíme parametry portu podle upravených hodnot. Povšimněte si zejména rychlosti, počtu bitů, parity a počtu stop bitů.
  7. Na závěr je ještě nutné vypnout používání parametrů Timeout pro tento port.
Každá chyba znamená ukončení konstruktoru s tím, že členská proměnná m_bOpened zůstane nastavena na FALSE.

Destruktor

- je velmi jednoduchý. Jeho úkolem je vrátit používaný sériový port do původního stavu a zavřít jej.
Tím jsme vyčerpali "převzaté" části a dostáváme se k vlastní tvorbě. Následující tři členské funkce třídy CIRcontrol tvoří základ činnosti celého programu.

Členská funkce Learn

Funkce vrací počet přijatých skupin pulsů z dálkového ovládání. Hodně zjednodušeně lze říci, že je to "počet přijatých bitů".
Abychom zajistili odpovídající časovou základnu pro přesné přijímání dat z dálkového ovládání, používáme čítač s vysokým rozlišením - Performance Counter. V konstruktoru jsme zjistili pomocí API funkce, kolik "tiků" čítače proběhne v průběhu 1 sekundy. Bohužel, tomuto číslu není možné slepě věřit. I starý počítač s Windows CE 2.11 vracel hodnotu asi 1 000 000. Avšak při testu se ukázalo, že reálně se čítač mění každých 5 milisekund. To by odpovídalo hodnotě 200. Čítač s tak hrubým rozlišením je již nepoužitelný. Proto námi vytvářený program nebude pracovat na starších strojích. Pokud byste ovšem ověřili, že u vašeho staršího stroje pracuje Performance Counter opravdu s vysokým rozlišením, mělo by jít program přeložit a používat i pro váš stroj.
Přístroje s OS Pocket PC již měly Performance Counter funkční. Je však možné, že se mohou objevit výjimky.
Celá funkce není příliš složitá:
  1. Nejprve testujeme vstupní podmínky a v případě chyby vracíme hodnotu 8888 (náhodně zvoleno).
  2. Připravíme si časové konstanty. llMaxTime je maximální doba pro příjem kódu. Nastavil jsem ji na 1 sekundu, což odpovídá hodnotě frekvence Performance Counter. Vy si ji však můžete upravit jinak. llMaxByte je počet "tiků" čítače, který určuje, že se už objevila mezera mezi bity. Nastavil jsem ji experimentálně na 250 mikrosekund, pokud nepůjde přečíst povel z ovládače, můžete s ní opatrně také experimentovat.
  3. Abychom nebyli rušeni ostatními aplikacemi, pokusíme se získat maximální prioritu pro náš program. Je zřejmé, že obsluhu HW zařízení tím asi neodstavíme, takže u některých zařízení může být náš program stále přerušován. V některých případech to může vést až k nefunkčnosti programu.
  4. Uložím si počáteční stav čítače a vynuluju počet přijatých bajtů pro jednotlivé "bity" z ovládače.
  5. Po dobu danou llMaxTime se pokusíme číst z IR portu. Jakýkoliv přijatý bajt znamená, že bylo zahájeno vysílání povelu a přeruší startovací sekvenci.
  6. Pokud se nic neobjevilo, přeruším činnost, nastavím zpět původní prioritu a ukončím funkci s návratovou hodnotou 0.
  7. V případě, že se nějaký znak na IR rozhraní objevil (něco tam zakmitlo), zapamatuji si tento pamětihodný okamžik jako start povelu pomocí hodnoty z Performance Counter a zahájím příjem povelu.
  8. Příjem povelu je složen z následujících kroků:
    • Pokud znaky přicházejí těsně za sebou, pouze je počítám.
    • Objeví-li se mezi přicházejícími znaky mezera v délce llMaxByte, skončil "bit". Uložím počet přijatých znaků a poslední přijatý znak.
    • Také se pokusím zahájit příjem dalšího "bitu" a čekám na něj max. 1 sekundu.
    • Jestliže se objeví, uložím jeho čas a zahájím příjem dalšího "bitu".
    • V opačném případě příjem povelu ukončím.
  9. Na závěr vrátím původní prioritu programu a zkontroluji, není-li některý počet přijatých znaků v "bitu" příliš vysoký. To by dělalo problém při vysílání.
  10. Výstupní hodnotou je počet přijatých "bitů".

Členská funkce Send

Pokud jste si prošli funkci Learn, bude vám funkce Send celkem jasná. Jsou v ní komentáře a používají se obdobné postupy jako u Learn. Podle získaných dat jsou vysílány série IR pulsů. Blok představující "bit" je v bufferu nejprve sestaven tak, jak bylo popsáno v kapitole 6.2 a pak je naráz ve správný okamžik vyslán.

Členská funkce Save

Ukládá obsah pole Impuls do souboru a asi nevyžaduje bližší popis.

Co bychom si měli z této lekce zapamatovat?

  • Pro jemné rozlišení času lze použít Performance Counter.
 

Buď první, kdo ohodnotí tento článek.

Komentáře

1 Rusty Rusty | Web | 17. června 2007 v 15:41 | Reagovat

hoj,máš pěknej blog!!Když si najdeš chvilku,hlasuj pro mě pls v soutěži o nej blog na http://bezzzvaholky.blog.cz/0706/1-kolo (Rusty). Vím že mám hroznej design,ale novej sem do začátku soutěže nestih dodělat...Předem díky a máš to u mě!!Měj se

Nový komentář

Přihlásit se
  Ještě nemáte vlastní web? Můžete si jej zdarma založit na Blog.cz.