\chapter{Program pro PC}

Tato kapitola je stručným popisem programové aplikace pro \emph{Microsoft Windows}, která umožňuje přečtení SMS zprávy z~GSM modulu a její zobrazení v~přehledné formě. Program je napsán v~jazyce C++ a pro vývoj bylo použito prostředí \emph{Borland C++ Builder} verze 6.0. Pro sériovou komunikaci se používá volně dostupná knihovna \emph{ComPort}.

\section{Inicializace}

Po spuštění programu se otevře sériový port příkazem \verb|ComPort->Open();|. Do telefonu se pošle AT příkaz \verb|AT+CNMI=3,3,0,2,0| \cite{ATcommands}. Tím se zapne indikace příchozí zprávy po sériové lince. Pokud GSM modul přijme zprávu, vyšle oznámení ve tvaru \verb| "SM"=x|, kde \verb|x| je pořadové číslo v~paměti GSM modulu, respektive v~SIM.

\section{Vyhodnocení přijatých dat}

Pokud přijímač sériového portu zachytí řetězec, spustí se podprogram \verb|ComPortRxChar|. Jeho zjednodušený vývojový diagram je na obrázku \ref{com_port_rx}. Musí se vyhodnotit, co přišlo, a podle toho učinit další kroky. Může přijít odpověd na AT příkaz, upozornění o~příchozí zprávě nebo část PDU. Při přenosu přes sériový port PDU nepřijde najednou, nýbrž po nestejně velkých částech, které se musí posléze spojit.

\begin{figure}[!ht]
  \includegraphics[scale=0.9]{obrazky/com_port_rx.pdf}
  \caption{Vývojový diagram příjmu ze sériového portu.}
  \label{com_port_rx}
\end{figure}

\section{Dekódování PDU}

Dekódování zprávy z~formy PDU do čitelného textu provádí funkce \verb|PDUToText|. Postup je opačný oproti zakódování (kapitola \ref{vytvorenipdu}). Nejsnáze se vysvětlí přímo ukázkou komentovaného zdrojového kódu:

\begin{verbatim}
for (int i = 0; i < udl; i+=2)
  {
    j = (i/2) % 7;  // j nabývá hodnot 0-6
    a = HexToDec(Coded.SubString(i+1,2)); // Převod dvojice 
    hexadecimálních znaků na celé číslo
    a <<= j; // Bitový posun j-krát doleva
    a = a & 127; // Ponechá jen posledních 7 bitů
    if (j) // Pro všechny kromě prvního oktetu
    {
      b = HexToDec(Coded.SubString(i-1,2)); // Převod dvojice 
      hexadecimálních znaků na celé číslo 
      b >>= 8 - j; // Předchozí oktet se posune doprava (8-j)-krát
      a += b;  // Přičte se
    }
    Message = Message + (char)a; // Nový znak se přidá ke zprávě
    if (j==6) // Poslední septet se bere z toho samého oktetu
    {
      a = HexToDec(Coded.SubString(i+1,2)); // Převod dvojice 
      hexadecimálních znaků na celé číslo 
      a >>= 1; // Bitový posun doprava
      Message = Message + (char)a; // Nový znak se přidá ke zprávě
    }
  }
\end{verbatim}

Funkce \verb|HexToDec| převede řetězec typu \emph{AnsiString} obsahující hexadecimální číslo na celé číslo typu \emph{int}. Výsledek se ukládá do proměnné \verb|value|. Algoritmus je následující:

\begin{enumerate}
  \item{Vynulování \verb|value|.}
  \item{Vynásobení hodnoty \verb|value| šestnácti.}
  \item{Pokud je znak na první pozici řetězce v~rozsahu 0--F, převede se na číslo 0--15 a přičte k~\verb|value|}
  \item{Vymazání prvního znaku.}
  \item{Zbývá v~řetězci znak, pokračovat od bodu 2, jinak konec.}
\end{enumerate}

\section{Zobrazení}

Když máme k~dispozici text zprávy, můžeme jej přeformátovat do přehlednější formy a zobrazit na obrazovce. Jako vhodná forma uložení dat byla vytvořena struktura \verb|TEntry|. Obsahuje prvky \verb|DateTime|, \verb|ID|, \verb|Name| a \verb|Message|. Přijaté zprávy jsou ukládány do pole těchto struktur \verb|TEntry Entries[index]|. Každý záznam o~přijaté zprávě je potom jedním prvkem pole a je indexovaný proměnnou \verb|index|. 

Protože jednotlivé údaje jsou odděleny středníkem, je velmi snadné je rozdělit a uložit do struktury \verb|TEntry|. Použijí se metody \verb|AnsiString.Pos| ke zjištění pozice středníku a \verb|AnsiString.SubString| k~výběru příslušné části.

%Vzhled okna je vidět na obrázku \ref{oknoaplikace}

%\begin{figure}[!ht]
%  \includegraphics[scale=1]{obrazky/oknoaplikace.pdf}
%  \caption{Vzhled okna aplikace s tabulkou se záznamy o přijatých zprávách.}
%  \label{oknoaplikace}
%\end{figure}

Okno programu obsahuje tabulku (komponentu \emph{StrongGrid}) se sloupci odpovídajícími jednotlivým částem SMS zprávy:
\begin{itemize}
  \item{datum a čas přijetí zprávy,}
  \item{rodné číslo pacienta,}
  \item{příjmení a jméno,}
  \item{informace.}
\end{itemize}

V~pravé části je umístěno pole s~výpisem komunikace s~GSM modulem. Slouží především pro účely ladění programu. Pod výpisem je pole, do kterého lze zadat libovolný AT příkaz. Pod ním jsou tato tlačítka: 
\begin{description}
  \item[Připojit/Odpojit] -- {Otvírá a zavírá sériový port.}
  \item[Poslat] -- {Po stisknutí tohto tlačítka se na sériový port pošle zadaný AT příkaz a znaky $<$CR$>$$<$LF$>$.}
  \item[Smazat] -- {Smaže okno s výpisem komunikace.}
\end{description}











