
% Kapitola "Konfigurační aplikace"


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\kapitola{Konfigurační aplikace}
\label{kap:aplikace}
Hardware interface je navržen tak, aby umožnil konfiguraci provozních parametrů, spouštění komunikačních funkcí a~zasílání stavových informací pomocí 3-žilového propojení standardní sériové sběrnice RS-232. Komunikace probíhá výhradně v~terminálovém režimu v~otevřeném textu. Volba tohoto způsobu vzájemné interakce mezi uživatelem a~interface dovolila realizovat uživatelsky přívětivé konfigurační a~provozní prostředí s~minimálními softwarovými a~hardwarovými nároky. Podrobný popis příkazů a~jejich syntax je uveden v~kapitole \ref{kap:iface:firmware}.
\par
Principem terminálové komunikace uživatele s~interface je odeslání příkazu na RXD vstup interface zakončený znakem konce řádku LF, CR nebo jejich kombinací a~následný příjem odpovědi v~podobě textového řetězce z~TXD výstupu, který je rovněž zakončen znaky LF a~CR. K~tomu, aby mohl uživatel s~interface takto komunikovat je nutné, aby na svém počítači spustil software, který tuto činnost zvládá. Zpravidla se jedná o~programy typu RS-232 terminál, softwarový sériový terminál, emulátor terminálu apod. Alternativních názvů existuje celá řada, ale funkcionalita všech těchto programů je v~té nejzákladnější podobě shodná.
\tabulka{Parametry nastavení sériového portu}{tab:aplikace:serialpar}
\def\arraystretch{1.1}
\begin{tabular}{|l|l|} \hline
\textbf{\small Parametr} & \textbf{\small Hodnota} \\ \hline
\small Přenosová rychlost   & \small 9600 baud \\ %\hline
\small Počet bitů v~rámci	  & \small 8 bit \\ %\hline
\small Počet stop bitů	    & \small 1 \\ %\hline
\small Parita	              & \small není \\ %\hline
\small Řízení provozu	      & \small žádné \\ \hline
\end{tabular}
\endtab


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\sekce{Terminály pro Microsoft Windows}
\medskip
\begin{itemize}
\item{\textit{Hyperterminal}: základní terminálový program, který je přítomen již 
v základní instalaci OS Windows. Spuštění se provede zadáním příkazu hypertrm v~příkazovém řádku nebo prostřednictvím nabídky Start.}
\item{\textit{Termite}: jednoduchý terminálový software, který je možné zdarma provozovat a~libovolně šířit. Jeho funkce jsou omezené, ale pro komunikaci s~interface zcela dostatečné. Jednoduchost a~přímočarost v~nastavení je výhodou. Program je umístěn v~příloze \ref{kap:supp:cd}.}
\item{\textit{The Terminal}: tento software byl využíván při vývoji firmware. Mezi jeho hlavní přednosti patří široké možnosti nastavení, automatické ukládání přijatých dat a~využití maker. Tento program je také umístěn v~příloze \ref{kap:supp:cd}.}
\end{itemize}
\medskip
\img{aplikace/img/hterm}%
    {110mm}%
    {Pracovní okno aplikace Hyperterminal s~výstupy příkazů A a~P}%
    {fig:aplikace:hterm}%


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\sekce{Konzolové terminály pro Linux}
Následující dva příklady konzolových sériových terminálů byly testovány v~prostředí distribuce Linux Debian 4.0 (Etch). Je nutné podotknout, že pro manuální komunikaci je značně nepraktické využívat přímý přístup k~sériovému portu pomocí zápisu a~čtení souboru \texttt{/dev/ttySn} (resp.~\texttt{/dev/cuaan} v~BSD systémech) a~to zejména pro nízkou interaktivitu. Lze ji výrazně zvýšit jednoduchým skriptem pro BASH nebo PERL, ale popis  řešení tohoto problému není cílem této kapitoly.

\medskip
\begin{itemize}
\item{\textit{cu}: byl vyvíjen v~rámci projektu UUCP (Unix to Unix CoPy). V~uvedené distribuci je k~dispozici v~rámci binárního balíku uucp.
\medskip
\par\noindent
Spuštění terminálu na sériový port /dev/ttyS0 (COM1) a~provedení 2 příkazů A a~P:
\input{aplikace/codecu}
}
\item{\textit{Minicom}: interaktivní textový emulátor terminálu. Je dostupný v~binárním balíku minicom.
\\
\input{aplikace/codeminicom}
}
\end{itemize}
\medskip


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\sekce{Aplikace RadioReset device configurator}
Jedná se o~jednoúčelovou aplikaci s~grafickým uživatelským rozhraním, která byla vyvinuta výhradně na použití s~navrženým interface. Je primárně určena pro operační systém Microsoft Windows, ale lze ji spustit i~v~prostředí OS Linux s~využitím software z~projektu Mono. Hlavní motivací ke vniku této aplikace byla snaha o~zjednodušení a~zrychlení konfigurace interface. Zdrojový kód aplikace je umístěn v~příloze \ref{kap:supp:cd}.
\medskip
\par\noindent
Klíčové vlastnosti aplikace:
\medskip
\begin{itemize}
\item{Možnost exportu a~importu konfigurace interface.}
\item{Naplnění tabulky kódů pseudonáhodnými hodnotami.}
\item{Ovládání všech konfiguračních funkcí jedním kliknutím myši.}
\item{Jednoduchý terminál pro diagnostické účely.}
\item{Standardní uspořádání a~vzhled aplikace.}
\end{itemize}
\medskip
\par\noindent
Systémové požadavky:
\medskip
\begin{itemize}
\item{Microsoft Windows 98 a~novější}
\item{Microsoft .NET Framework 2.0}
\item{Fyzický sériový port nebo převodník USB/RS232}
\end{itemize}
\medskip
\img{aplikace/img/rrconf}%
    {150mm}%
    {Aplikace Radio Reset device configurator}%
    {fig:aplikace:rrconf}%
    

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\podsekce{Komunikační vazba aplikace s~interface}
Koncepce aplikace je navržena tak, aby grafické uživatelské rozhraní (GUI) tvořilo další (vyšší) vrstvu nad terminálovou komunikací. Uživatel díky tomu nemusí znát přesnou syntax příkazů interface, ale stačí mu pouze znalost významu jednotlivých konfiguračních parametrů. 
\par
Nastavení sériového portu dle tab. \link{tab:aplikace:serialpar} je v~aplikaci implementováno na úrovni zdrojového kódu. Uživatel má možnost výběru konkrétního portu, které má ve svém operačním systému k~dispozici.
\img{aplikace/img/vrstvy}%
    {100mm}%
    {Vzájemná vazba navržené aplikace s~interface}%
    {fig:aplikace:vrstvy}%


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\podsekce{Struktura tříd aplikace}
Aplikace je vytvořena v~současné době velmi populárním objektově orientovaném programovacím jazyce C\#. Microsoft uvolnil k~užívání vývojové prostředí Visual Studio 2005 C\# Express Edition, které poskytuje narozdíl od plné verze Visual Studia zcela zdarma. Tento programovací nástroj se tak jeví jako velmi perspektivní a~pro vývoj konfigurační aplikace vhodný.
\par
Nutnou podmínkou pro vývoj a~spuštění aplikace je přítomnost Microsoft .NET Framework 2.0 nebo jakékoliv vyšší verze v~operačním systému. Aktuálně je k~dispozici již verze 3.0. Důvodem pro instalaci frameworku minimální verze 2.0 je využívání třídy SerialPort z~jmenného prostoru System.IO.Ports pro komunikaci pomocí sériového portu počítače. Tato třída není v~nižších verzích frameworku implementována a~musela by být nahrazena externím řešením. 
\medskip
\par\noindent
Popis klíčových tříd implementovaných ve frameworku:
\medskip
\begin{itemize}
\item{\textit{Application Form}: třída základního formuláře.}
\item{\textit{SerialPort}: třída pro komunikaci prostřednictvím sériového portu počítače.}
\item{\textit{XmlSerializer}: export/import atributů libovolné třídy do XML struktury.}
\end{itemize}
\medskip
\par\noindent
Popis externích tříd:
\medskip
\begin{itemize}
\item{\textit{device}: třída obsahuje metody pro komunikaci s~interface pomocí dostupných příkazů a~realizuje reakci na přijatá stavová data.}
\item{\textit{devdata}: metody této třídy zajišťují detekci a~korekci typové a~syntaktické správnosti hodnot v~prvcích formuláře.}
\item{\textit{devstore}: jedná se serializovatelnou třídu, která obsahuje výhradně atributy datových položek popisující konfiguraci interface. Těchto atributů využívá třída XmlSerializer při operacích uložit (otevřít) konfiguraci do (ze) souboru.}
\item{\textit{logger}: elementární logovací mechanismus. Popsán v~kapitole \ref{kap:aplikace:logger}.}
\end{itemize}
\medskip
\img{aplikace/img/tridy}%
    {100mm}%
    {Bloková struktura klíčových tříd a~jejich vzájemných logických vazeb}%
    {fig:aplikace:tridy}%


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\newpage % nuceny zlom
\podsekce{Výpis stavových informací}
\label{kap:aplikace:logger}
Pro výpis stavových a~chybových hlášení byl zvolen způsob událostního logu ve formátu:
\medskip\par\noindent
\textit{datum čas [typ] zpráva}
\medskip\par\noindent
Typ zpráv může být:
\medskip
\begin{itemize}
\item{\textit{OK}: zpráva o~úspěšném provedení nějaké operace.}
\item{\textit{ERROR}: zpráva o~zjištěné chybě.}
\item{\textit{DEVICE}: řetězec přijatý z~interface.}
\item{\textit{INFO}: informativní zpráva.}
\end{itemize}
\medskip
\par\noindent%
Výstup těchto zpráv je prováděn do Process logu na formuláři a~zároveň do souboru log.txt umístěného ve stejném adresáři jako binární soubor aplikace. V~konstruktoru třídy logger je proveden test na úspěšné otevření souboru log.txt. Pokud selže, je ukládání událostí do souboru po dobu běhu aplikace potlačeno.


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\podsekce{Význam vstupně-výstupních polí formuláře}
\label{kap:alplikace:pole}
\medskip
\begin{itemize}
\item{\textit{Device name}: alfanumerický identifikátor konkrétních konfiguračních parametrů. Tento řetězec se do interface neukládá, slouží pouze pro snazší identifikaci při uložení nebo otevření konfigurace ze souboru. Zpravidla reprezentuje název interface nebo lokality. Např. \uv{AP~Světlov.} Lze použít i~diakritiku.}
\item{\textit{Device address}: numerická unikátní 3-ciferná adresa interface. Povoleny jsou všechny kombinace mezi 000 až 999.}
\item{\textit{TX delay}: čas mezi zahájením vysílání radiostanice a~přenosem DTMF paketu v~milisekundách. Akceptovatelný interval je 150--38200 ms v~kroku 150 ms. Pokud je zadána hodnota mimo tento krok, metoda GetDelays() třídy devdata ji na požadovaný krok upraví.}
\item{\textit{RX delay}: doba, po kterou přijímací interface čeká na doručení kompletního DTMF paketu od vysílací strany v~milisekundách. Pravidla pro zadání času jsou shodná s~předchozím prvkem.}
\item{\textit{RPTR delay}: doba, po kterou přijímací interface čeká na doručení kompletního DTMF paketu od vysílací strany v~případě čekání na potvrzení od opakovače. Hodnota je opět v~milisekundách a~pravidla pro zadání času jsou opět shodná s~předchozím prvkem.}
\item{\textit{Tone time}: délka trvání DTMF tónu v~milisekundách. Akceptovatelný interval je 10--2550~ms v~kroku 10 ms. Pokud je zadána hodnota mimo tento krok, metoda GetDelays() třídy devdata ji na požadovaný krok opět upraví.}
\item{\textit{Space time}: délka trvání mezery mezi jednotlivými DTMF tóny v~milisekundách. Pravidla pro zadání času jsou shodná s~předchozím prvkem.}
\item{\textit{Code table}: obsahuje 200 kódů určené pro autentizaci. Povoleny jsou 4-ciferné numerické hodnoty v~rozsahu 0000--9999. Pokud je zadána numerická hodnota v~jiném formátu, je zkrácena nebo doplněna nulami zleva.}
\end{itemize}
\medskip


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\sekce{Funkce aplikace pro konfiguraci interface}
\medskip
\begin{itemize}
\item{\ikona{aplikace/icons/open}\textit{Load config}: po výběru správného souboru s~konfigurací dojde k~načtení prvků z~XML struktury v~souboru do atributů instance třídy devstore a~k následnému naplnění prvků formuláře.\medskip}
\item{\ikona{aplikace/icons/save}\textit{Save config}: obsah všech konfiguračních prvků formuláře se přesune do atributů instance třídy devstore a~v podobě XML struktury uloží do zvoleného souboru.\medskip}
\item{\ikona{aplikace/icons/gen}\textit{Generate random codes}: tabulka kódů se naplní pseudonáhodnými hodnotami kódů s~využitím třídy Random.\medskip}
\item{\ikona{aplikace/icons/term}\textit{Terminal}: spustí instanci formuláře Form\_term, který umožňuje pracovat s~interface podobně jako ze softwarového RS-232 terminálu.\medskip}
\end{itemize}
\medskip
\par
Dále následují funkce pro zápis a~čtení. Tyto funkce využívají metod třídy device. Na počátku každé z~nich dojde k~ověření, zda-li je k~vybranému sériovému portu interface připojen a~zda-li je funkční. Využívá se zde příkazu P. 
\par
Při zvolení funkcí pro zápis dochází k~otestování povolených hodnot obsažených v~polích dle předchozí kapitoly \ref{kap:alplikace:pole} a~po úspěšném zápisu k~následné verifikaci. Pokud vše proběhne v~pořádku, je až nyní zápis prohlášen za úspěšný. Při volbě funkcí na čtení testuje příslušná metoda třídy device korektnost přijatých dat. Pokud je tento test úspěšný, je aktualizováno příslušné pole ve formuláři.
\medskip
\medskip
\begin{itemize}
\item{\ikona{aplikace/icons/wr_a}\textit{Write address}: zápis adresy prostřednictvím příkazu N.\medskip}
\item{\ikona{aplikace/icons/wr_c}\textit{Write code table}: zápis hodnot do tabulky kódů. 200x opakuje příkaz W se vzrůstajícím indexem a~kódem z~tabulky. Průběh zápisu je indikován prvkem Code table RW progress.\medskip}
\item{\ikona{aplikace/icons/wr_d}\textit{Write delay and times}: zápis časových konstant prostřednictvím příkazu K.\medskip}
\item{\ikona{aplikace/icons/wr_all}\textit{Write all}: zápis adresy, tabulky kódů a~časových konstant najednou.\medskip}
\item{\ikona{aplikace/icons/r_a}\textit{Read address}: načtení adresy příkazem A.\medskip}
\item{\ikona{aplikace/icons/r_c}\textit{Read code table}: načtení všech hodnot tabulky kódů pomocí opakování příkazu R se vzrůstajícím indexem. Průběh čtení je indikován prvkem Code table RW progress.\medskip}
\item{\ikona{aplikace/icons/r_d}\textit{Read delay and times}: načtení časových konstant příkazem I.	\medskip}
\item{\ikona{aplikace/icons/r_all}\textit{Read all}: načtení adresy, tabulky kódů a~časových konstant najednou.\medskip}
\end{itemize}
\medskip


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\podsekce{Funkce aplikace pro komunikační režim interface}
Komunikační funkce interface je možné ovládat prvky v~seskupení Command. Jsou k~dispozici 4 volby:
\medskip
\begin{itemize}
\item{\textit{Direct device}:	provede sepnutí relé na lokálně připojeném interface. Je nutné zvolit výstupní port a~čas sepnutí relé. Pokud na daném výstupu není relé připojeno, dojde k~nastavení log.~1 na daném výstupním pinu.}
\item{\textit{Remote device}: zahájí přenos povelu ke vzdálenému interface s~adresou Remote device. 
Význam portu a~času je shodný jako v~předchozím případě.}
\item{\textit{Repeater device}: zahájí přenos povelu ke vzdálenému interface s~adresou Remote device. K~realizaci spojení využije opakovače s~adresou Repeater device. Význam portu a~času je opět shodný jako v~předchozím případě.}
\item{\textit{Live test}: provede test dostupnosti na jednotku s~adresou Remote device.}
\end{itemize}
\medskip








