//---------------------------------------------------------------------------

#include <vcl.h>
#include <vfw.h> // video for windows
#pragma hdrstop
#include <windows.h>

#include "funkce.h"
#include "knihovna.h"
#include <sys\timeb.h>

//#include "motors.h"
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"

#define KOEF 1
TForm1 *Form1;
using namespace std;
TMap Mapa;
bool je_kriz=false;
char cil[31];               //cilova stanice
char start[31];             //vychozi stanice
int runtime=0;              //casomira
int timer=0;                 //toto by melo pocitat dobu v krizovatce
int vychoziCas=0;           //pomocna promenna pro casomiru
int aktualniCas=0;          //pomocna promenna pro casomiru
bool projeto=false;         //mela by urcovat korektni projeti krizovatky
bool vykresli=true;         //pro zmenu vykreslovani obrazu
int chybneID=0;             //pocitadlo chybne precteneho ID
int pom=200;
int casBezLajny=0;          //pocitadlo ztracene cary
char report[100];       //chybova hlaska
int stav=1;
int stavPoOtocce=0;
char text[50];          //aktualni stav
int prvniNaslepo=0;     //tyto dve bude pouzivat, kdyz bude ztraceny
int druhaNaslepo=0;
int timer2=0;

//---------------------------------------------------------------------------

//--------cast zpracovani obrazu a rizeni
HANDLE port=INVALID_HANDLE_VALUE;
PICTURE picture;                                //obraz [radek][sloupec]
LINE primka1,primka2,primka3,primka4;           //globální roměnné přímek
bool Calib=false,Comunicate=false;
int maxw=0,minw=0;
int uhel_final;                                 //globální proměnná výsledného směru

int smer=0;

int CrossNumber=0;                              //prectene IDcko


//globalni promenne
int trasa[COUNT];                                 //pole uzlu na trase podle poradi
int trasaSmer[COUNT];                             //prelozena trasa na smery odboceni
int uzluNaCeste;
int delkaCesty;
int projetaKriz;                              //naposledy projeta krizovatka (poradi)


//motors-komunikační funkce pro motory ---------------------------------------
HANDLE hFile;

int sig(int i)         //to je asi fce signum, ale nikde neni pouzita :/
{
	if (i == 0)
		return 0;
	if ( i < 0)
		return -1;
	else
		return +1;
}

const float K = 1 / (32768.0f - 256.0f);

int motor_out(int smer,int rychlost)
{
        Form1->Label19->Caption=smer;
        Form1->Label20->Caption=rychlost;

	char buffer[200];

	float Hf = smer     / 2.0f;
	float Vf = rychlost / 2.0f;

	float L = Vf + Hf;
	float R = Vf - Hf;

	bool sL = (L < 0);
	bool sR = (R < 0);

	if (sL)	L = -L;
	if (sR) R = -R;

	if (L > 255) L = 255;
	if (R > 255) R = 255;


	sprintf(buffer,"#4%c%.2X\r    #5%c%.2X\r",
							sL ? '+' : '-',(unsigned char)(L ),
							sR ? '-' : '+',(unsigned char)(R ) );


	DWORD temp;
	WriteFile(hFile,buffer,16,&temp,NULL);
	return 0;
}

void motor_init()
{
	hFile = CreateFile(Form1->ComboBox3->Text.c_str(),GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);

	DCB dcb;

	ZeroMemory(&dcb,sizeof(DCB));
	GetCommState(hFile,&dcb);
	BuildCommDCB("57600,N,8,1",&dcb);
	SetCommState(hFile,&dcb);
}




void go(void)
{
Comunicate=true;
Calib=true;

}


void stop(void)
{
Comunicate=false;
motor_out(0,0);               //Ukončení komunikace s podvozkem
Calib=false;
uhel_final=255;

}


void otocka(int naslStav)            //mela by otocit robota o 180°
{
//ShowMessage("Otoc me :)");
Form1->Label3->Caption="Otaci se";
go();
for(int i=0;i<40*(255/Form1->ScrollBar4->Position);i++)          //pri plnem rejdu by mel tocit vterinu naslepo
        {
        motor_out(Form1->ScrollBar4->Position,0);
        Sleep(100);
        }
stav=14;
stavPoOtocce=naslStav;

}

void couvni(void)
{
for(int i=0;i<30;i++)                //dve vteriny pomalu couvne
        {
        motor_out(0,-60);
        Sleep(100);
        }
}



//----------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
FILE *f;
f=fopen("settings","rt");
if(f!=NULL)                                  //nacteni posledniho nastaveni
        {
        char start[31];
        char cil[31];
        char port[31];
        bool mod;
        int position;
        int rychlost1;
        int rychlost2;
        int otockaS;

        fscanf(f,"%s    %s      %s      %d      %d      %d      %d      %d",&start,&cil,&port,&position,&mod,&rychlost1,&rychlost2,&otockaS);
        ComboBox1->Text=start;
        ComboBox2->Text=cil;
        ComboBox3->Text=port;
        ScrollBar1->Position=position;
        CheckBox1->Checked=mod;
        ScrollBar2->Position=rychlost1;
        ScrollBar3->Position=rychlost2;
        ScrollBar4->Position=otockaS;
        }
Form1->Caption="Navigace";
motor_init();
}

//Hlavní funkce zpracování obrazu
bool main_function(HWND vwin, LPVIDEOHDR in_data)
{

        timeb cas;
        short cas1,cas2,casc;
        ftime(&cas);
        cas1=cas.millitm;

        unsigned char *pixel;
        pixel =(unsigned  char*) in_data->lpData;       //ukazatel na hodnotu jasu v pameti,
                                                // obraz ma 1920*640(pro kazdy bod jsou tri jasy )
        char* pixel_init=pixel;                         //zachovani puvodni adresy

        int kanal=Form1->ScrollBar1->Position;
        ColorProc(picture,pixel,kanal,0.5); //naplneni promene picture daty obrazu, míchání kanálů
        noisefilter(picture);               //filtrace sumu
        thresholding2(picture,kanal,25);    //prahování s automatickým prahem
        int con1=0;                         //Hodnoty přímek z Houghovy transformace
        int con2=0;                         //podle maxima v akumulátoru
 if(Calib)
 {
        MarkPosLine(picture,maxw,minw);                 //Označení středů

        hough(picture,primka3,primka4,&con1,&con2);     //Houghova transformace

        Transform(primka3,primka4,&con1,&con2);         //Rozdeleni primek na P1 a P2

        CrossNumber=GetCrossNumber(picture,primka4,con2);     //zjisti cislo krizovatky
        Form1->Edit1->Text=CrossNumber;



        uhel_final=kam_h(primka3,primka4,con1,con2,smer,&je_kriz);              //Výpočet výsledného směru

 }
        Form1->Edit2->Text=uhel_final;

if(Comunicate)
  {
  int r,s;
  int crossi=CrossPos(primka3,primka4,&r,&s);             //Výpočet místa křížení
  int speed;

  motor_out(0,0);
        //tady je ta rozhodovaci cast------------------------------------------------------------------------------
   switch(stav)
        {
        case 1:
                                             //jede bez problemu po ceste
                strcpy(text,"1-Je cesta");
                speed=Speed(Form1->ScrollBar3->Position,Form1->ScrollBar2->Position,crossi,con1,con2,uhel_final);    //Zpomalení na křižovatce
                if(uhel_final!=255 && uhel_final!=254)
                        {
                        motor_out((-uhel_final*2.5),speed);                     //Zpomalení při velkém úhlu zatáčení
                        if(je_kriz)
                                {
                                timer++;
                                if(timer>5)         //to je tu aby pri kratkodobe chybe v detekci obrazu nezacal odbocovat tam kde neni krizovatka
                                        {
                                        stav=3;
                                        }
                                }
                        else
                                {
                                timer=0;
                                }

                        }
                else
                        {
                        stav=2;
                        }


                break;

        case 2:
                               //ztrati cestu
                strcpy(text,"2-Neni cesta");
                if((uhel_final==255 || uhel_final==254))
                        {
                        timer=0;
                        motor_out(0,0);
                        casBezLajny++;
                        if((casBezLajny==10*KOEF || casBezLajny==20*KOEF || casBezLajny==30*KOEF || casBezLajny==40*KOEF || casBezLajny==50*KOEF) && Form1->CheckBox2->Checked)
                                {
                                PlaySound("horn.wav","", SND_ASYNC);
                                }
                        if(casBezLajny==10*KOEF && Form1->CheckBox2->Checked)
                                {
                                casBezLajny=0;
                                strcat(report,"Mezi krizovatkama ");       //nahlasit neprujezdnou cestu
                                strcat(report,Mapa.node[trasa[projetaKriz]].name);
                                strcat(report," a ");
                                strcat(report,Mapa.node[trasa[projetaKriz+1]].name);
                                strcat(report," je neprujezdna cesta");
                                stop();
                                int dalsi=trasa[projetaKriz+1];
                                Mapa.edge[trasa[projetaKriz]][dalsi]=-1;
                                Mapa.edge[dalsi][trasa[projetaKriz]]=-1;
                                int fl=PathFind(&Mapa,GetOrder(&Mapa,Mapa.node[trasa[projetaKriz]].ID),GetOrder(&Mapa,cil),trasa,&uzluNaCeste,&delkaCesty);
                                if(!fl)                      //pokud najde alternativni cestu, pokracuje dal
                                        {
                                        for(int i=uzluNaCeste;i>0;i--)          //tady to musim posunut kvuli pridavani krizovatky na zacatek trasy
                                                {
                                                trasa[i]=trasa[i-1];
                                                }
                                        trasa[0]=dalsi;
                                        uzluNaCeste++;
                                        projetaKriz=0;
                                        Preklad(&Mapa,trasa,trasaSmer,uzluNaCeste);
                                        //ShowMessage("Ted sa otocim");
                                        otocka(1);
                                        }
                                else                                                  //pokud neexistuje alternativni cesta do cile jede do vychozi stanice
                                        {
                                        strcpy(start,Form1->ComboBox1->Text.c_str());
                                        int fl2=PathFind(&Mapa,GetOrder(&Mapa,Mapa.node[trasa[projetaKriz]].ID),GetOrder(&Mapa,start),trasa,&uzluNaCeste,&delkaCesty);
                                        if(!fl2)
                                                {
                                                for(int i=uzluNaCeste;i>0;i--)          //tady to musim posunut kvuli pridavani krizovatky na zacatek trasy
                                                        {
                                                        trasa[i]=trasa[i-1];
                                                        }
                                                trasa[0]=dalsi;
                                                uzluNaCeste++;
                                                projetaKriz=0;
                                                Preklad(&Mapa,trasa,trasaSmer,uzluNaCeste);
                                                otocka(1);
                                                }
                                        else
                                                {                                //neexistuje cesta zpatky (nepredpokladam)
                                                otocka(16);
                                                }
                                        }
                                }
                        }
                else
                        {
                        timer++;
                        if(timer>5)                //tim by mel zamezit zbytecnemu kmitani mezi stavama
                                {
                                stav=1;
                                casBezLajny=0;
                                }
                        }
                break;
        case 3:
                       //narazi na krizovatku, zkusi precist ID
                strcpy(text,"3-Je krizovatka");
                if(CrossNumber==Mapa.node[trasa[projetaKriz+1]].ID)            //dorazil na spravnu krizovatku
                        {
                        stav=4;
                        chybneID=0;
                        speed=Speed(Form1->ScrollBar3->Position,Form1->ScrollBar2->Position,crossi,con1,con2,uhel_final);    //Zpomalení na křižovatce
                        motor_out((-uhel_final*2.5),speed);
                        }
                else
                        {
                        if(CrossNumber!=-1)                     //dorazil jinam
                                {
                                chybneID++;
                                if(chybneID>1)
                                        {
                                        speed=Speed(Form1->ScrollBar3->Position,15,crossi,con1,con2,uhel_final);    //Zpomali rychlost na 0, aby zkusil precist kod lip
                                        motor_out((-uhel_final*2.5),20);
                                        }
                                if(chybneID>10)                 //pokud precte 10krat kod spatne, jede do vychozi stanice
                                        {
                                        chybneID=0;
                                        if(Form1->CheckBox1->Checked)
                                                {
                                                ShowMessage("Su na spatne krizovatce");
                                                }
                                        stop();
                                        strcpy(cil,Form1->ComboBox1->Text.c_str());
                                        strcat(report,"Krizovatka ");
                                        strcat(report,Mapa.node[trasa[projetaKriz+1]].name);
                                        strcat(report," je oznacena spatnym kodem");
                                        int fl=PathFind(&Mapa,GetOrder(&Mapa,Mapa.node[trasa[projetaKriz+1]].ID),GetOrder(&Mapa,cil),trasa,&uzluNaCeste,&delkaCesty);
                                        if(!fl)
                                                {
                                                Preklad(&Mapa,trasa,trasaSmer,uzluNaCeste);
                                                projetaKriz=0;
                                                otocka(1);
                                              //  smer=trasaSmer[1];       //nastaveni odboceni v prvni krizovatce (potom uz si to hlida sam)
                                                }
                                        else
                                                {
                                                otocka(16);
                                                }
                                        }
                                }
                        else
                                {
                                speed=Speed(Form1->ScrollBar3->Position,Form1->ScrollBar2->Position,crossi,con1,con2,uhel_final);
                                motor_out((-uhel_final*2.5),speed);
                                }
        //                Form1->Label13->Caption="Nejsu na spravne krizovatce";
                        };
                if(!je_kriz && timer>10)        //pokud vyjede z krizovatky bez precteni ID
                        {
                        stav=5;
                        couvni();
                        timer=0;
                        }
                else
                        {
                        timer++;
                        }

                break;
        case 4:
                             //precetl ID a je na spravne krizovatce
                strcpy(text,"4-Je na spravne krizovatce");
                timer++;
                if(je_kriz)
                        {
                                if(GetOrder(&Mapa,Mapa.node[trasa[projetaKriz+1]].ID)==GetOrder(&Mapa,Mapa.node[trasa[uzluNaCeste-1]].ID))
                                        {                       //je v cili
                                        otocka(15);
                                        }
                                else                            //pokracuje v ceste
                                        {
                                        //Form1->Label13->Caption="Su na spravne krizovatce";
                                        smer=trasaSmer[projetaKriz+1];  //nastavi kam odboci na aktualni krizovatce
                                        }
                        }
                else
                        {
                        timer2++;
                        if(timer2>5)
                                {
                                timer2=0;
                                if(timer>10)            //pokud uz vyjel z krizovatky
                                        {

                                        timer=0;
                                        projetaKriz++;
                                        smer=0;
                                        stav=1;
                                        }
                                }
                        }
                speed=Speed(Form1->ScrollBar3->Position,60,crossi,con1,con2,uhel_final);
                motor_out((-uhel_final*2.5),speed);

                break;
        case 5:
                         //neprecetl ID, zkusi znova
                strcpy(text,"5-Neuspesne projel krizovatku");
                smer=0; //asi neni potreba
                if(uhel_final!=255 && uhel_final!=254)
                        {
                        if(je_kriz)
                                {                                                       // tu prakticky kontroluje to same co ve stavu 3
                                timer++;
                                if(CrossNumber==Mapa.node[trasa[projetaKriz+1]].ID)            //dorazil na spravnu krizovatku
                                        {
                                        stav=4;
                                        chybneID=0;
                                        speed=Speed(Form1->ScrollBar3->Position,Form1->ScrollBar2->Position,crossi,con1,con2,uhel_final);    //Zpomalení na křižovatce
                                        motor_out((-uhel_final*2.5),speed);
                                        }
                                else
                                        {
                                        if(CrossNumber!=-1)                     //dorazil jinam
                                                {
                                                chybneID++;
                                                if(chybneID>1)
                                                        {
                                                        speed=Speed(Form1->ScrollBar3->Position,10,crossi,con1,con2,uhel_final);    //Zpomali rychlost na 0, aby zkusil precist kod lip
                                                        motor_out((-uhel_final*2.5),20);
                                                        }
                                                if(chybneID>10)                 //pokud precte 10krat kod spatne, jede do vychozi stanice
                                                        {
                                                        chybneID=0;
                                                        if(Form1->CheckBox1->Checked)
                                                                {
                                                                ShowMessage("Su na spatne krizovatce");
                                                                }
                                                        stop();
                                                        strcpy(cil,Form1->ComboBox1->Text.c_str());
                                                        strcat(report,"Krizovatka ");
                                                        strcat(report,Mapa.node[trasa[projetaKriz+1]].name);
                                                        strcat(report," je oznacena spatnym kodem");
                                                        int fl=PathFind(&Mapa,GetOrder(&Mapa,Mapa.node[trasa[projetaKriz+1]].ID),GetOrder(&Mapa,cil),trasa,&uzluNaCeste,&delkaCesty);
                                                        if(!fl)
                                                                {
                                                                Preklad(&Mapa,trasa,trasaSmer,uzluNaCeste);
                                                                projetaKriz=0;
                                                                otocka(1);
                                                              //  smer=trasaSmer[1];       //nastaveni odboceni v prvni krizovatce (potom uz si to hlida sam)
                                                                }
                                                        else               //nenasel cestu zpatky a je v pasti (nemelo by nastat)
                                                                {
                                                                otocka(16);
                                                                }
                                                        }
                                                }
                                        else
                                                {
                                                motor_out((-uhel_final*2.5),20);
                                                }

                                      //  Form1->Label13->Caption="Nejsu na spravne krizovatce";
                                        };
                                }
                        else
                                {
                                if(timer>20)        //pokud znova projede krizovatku bez precteni kodu
                                        {
                                        stav=18;
                                        couvni();
                                        couvni();
                                        timer=0;
                                        }
                                motor_out((-uhel_final*2.5),40);
                                }
                        }
                else                                          //asi zacouval moc daleko, naslepo popojede dopredu
                        {
                        motor_out(0,30);
                        Sleep(100);
                        }

                break;
        case 6:                                //zas neprecetl, zkusi stesti a pojede podle planu
 
                strcpy(text,"6-Neprecetl kod, zkusi pokracovat");
                if(uhel_final!=255 && uhel_final!=254)
                        {
                        if(je_kriz)
                                {                           //zkusi stesti a odboci
                                if(GetOrder(&Mapa,Mapa.node[trasa[projetaKriz+1]].ID)==GetOrder(&Mapa,Mapa.node[trasa[uzluNaCeste-1]].ID))
                                        otocka(15);
                                smer=trasaSmer[projetaKriz+1];  //nastavi kam odboci na aktualni krizovatce
                                speed=Speed(Form1->ScrollBar3->Position,Form1->ScrollBar2->Position,crossi,con1,con2,uhel_final);
                                motor_out((-uhel_final*2.5),speed);
                                timer++;
                                }
                        else
                                {
                                if(timer>20)        //az projede krizovatku
                                        {
                                        smer=0;
                                        projetaKriz++;
                                        stav=7;
                                        timer=0;
                                        chybneID=0;
                                        }

                                speed=Speed(Form1->ScrollBar3->Position,Form1->ScrollBar2->Position,crossi,con1,con2,uhel_final);
                                motor_out((-uhel_final*2.5),speed);
                                }
                        }
                else                                          //asi zacouval moc daleko, naslepo popojede dopredu
                        {
                        motor_out(0,20);
                        Sleep(100);
                        }

                break;
        case 7:                                  //jede po ceste, ale nevi esi spravne
 
                strcpy(text,"7-Jede poslepu");
                speed=Speed(Form1->ScrollBar3->Position,Form1->ScrollBar2->Position,crossi,con1,con2,uhel_final);
                if(uhel_final!=255 && uhel_final!=254)
                        {
                        motor_out((-uhel_final*2.5),speed);
                        if(je_kriz)
                                {
                                timer++;
                                if(timer>2)         //to je tu aby pri kratkodobe chybe v detekci obrazu nezacal odbocovat tam kde neni krizovatka
                                        {
                                        stav=9;
                                        }
                                }
                        else
                                {
                                timer=0;
                                }
                        }
                else
                        {
                        stav=8;
                        }

                break;
        case 8:
                strcpy(text,"8-Jede poslepu a neni cesta");       //tu nic nevymysli asi
                otocka(16);

                break;
        case 9:
                strcpy(text,"9-Jede poslepu a je krizovatka");
                if(CrossNumber==Mapa.node[trasa[projetaKriz+1]].ID)            //dorazil na spravnu krizovatku
                        {
                        stav=4;
                        chybneID=0;
                        speed=Speed(Form1->ScrollBar3->Position,Form1->ScrollBar2->Position,crossi,con1,con2,uhel_final);    //Zpomalení na křižovatce
                        motor_out((-uhel_final*2.5),speed);
                        }
                else
                        {
                        if(CrossNumber!=-1)                     //dorazil jinam
                                {
                                chybneID++;
                                if(chybneID>1)
                                        {
                                        speed=Speed(Form1->ScrollBar3->Position,11-chybneID,crossi,con1,con2,uhel_final);    //Zpomali rychlost na 0, aby zkusil precist kod lip
                                        motor_out((-uhel_final*2.5),20);
                                        }
                                if(chybneID>10)                 
                                        {
                                        chybneID=0;
                                        if(Form1->CheckBox1->Checked)
                                                {
                                      //          ShowMessage("Su na spatne krizovatce");
                                                }
                                      //  stop();
                                        stav=11;
                                        prvniNaslepo=CrossNumber;
                                        projetaKriz=0;
                                        }
                                }
                        else
                                {
                                motor_out((-uhel_final*2.5),20);
                                }
                        //Form1->Label13->Caption="Nejsu na spravne krizovatce";
                        motor_out((-uhel_final*2.5),20);
                        };
                if(!je_kriz && timer>10)        //pokud vyjede z krizovatky bez precteni ID
                        {
                        stav=12;
                        couvni();
                        timer=0;
                        }
                else
                        {
                        timer++;
                        }

                break;
 /*      case 10:                   //zrejme ten stav nebude potreba
 
                strcpy(text,"Jede poslepu a uspesne projel krizovatku");

                break;*/
       case 11:                          //nevi kde je, ale zna naposledy projetou krizovatku, zkusi jet dal a pripadne se zorientovat
                strcpy(text,"11-hleda druhou krizovatku");     //vi cislo soucasne krizovatky, odboci doprava a z te dalsi zkusi najit cestu dal
                smer=1;                                                                 //odbocka doprava je proto aby furt nejezdil tam a zpatky
                if(je_kriz)
                        {
                        timer++;
                        if(projetaKriz) //pokud uz dorazil do druhe krizovatky
                                {
                                if(CrossNumber!=-1)      //pokud precte aj druhe ID
                                        {
                                        stop();
                                        druhaNaslepo=CrossNumber;
                                        strcpy(cil,Form1->ComboBox2->Text.c_str());
                                        int fl=PathFind(&Mapa,GetOrder(&Mapa,druhaNaslepo),GetOrder(&Mapa,cil),trasa,&uzluNaCeste,&delkaCesty);
                                        if(!fl)                  //zkusi najit cestu k cili
                                                {
                                                for(int i=uzluNaCeste;i>0;i--)          //tady to musim posunut kvuli pridavani krizovatky na zacatek trasy
                                                        {
                                                        trasa[i]=trasa[i-1];
                                                        }
                                                trasa[0]=prvniNaslepo;
                                                uzluNaCeste++;
                                                projetaKriz=0;
                                                Preklad(&Mapa,trasa,trasaSmer,uzluNaCeste);
                                                go();
                                                stav=4;
                                                }
                                        else                            //kdyz nejde k cili, zkusi ke startu
                                                {
                                                strcpy(start,Form1->ComboBox1->Text.c_str());
                                                int fl=PathFind(&Mapa,GetOrder(&Mapa,druhaNaslepo),GetOrder(&Mapa,start),trasa,&uzluNaCeste,&delkaCesty);
                                                if(!fl)                  //zkusi najit cestu k cili
                                                        {
                                                        for(int i=uzluNaCeste;i>0;i--)          //tady to musim posunut kvuli pridavani krizovatky na zacatek trasy
                                                                {
                                                                trasa[i]=trasa[i-1];
                                                                }
                                                        trasa[0]=prvniNaslepo;
                                                        uzluNaCeste++;
                                                        projetaKriz=0;
                                                        Preklad(&Mapa,trasa,trasaSmer,uzluNaCeste);
                                                        go();
                                                        stav=4;
                                                        }
                                                else
                                                        {
                                                        stav=17;
                                                        }
                                                }
                                        }
                                }
                        }
                else
                        {
                        if(timer>10)
                                {
                                if(!projetaKriz)      //pri vyjezdu z prvni krizovatky
                                        {
                                        projetaKriz++;
                                        }
                                else                 //pri neuspesnem vyjezdu z druhe krizovatky
                                        {
                                        stav=16;
                                        }
                                smer=0;
                                timer=0;
                                }
                        }
                if(Comunicate)
                        {
                        speed=Speed(Form1->ScrollBar3->Position,Form1->ScrollBar2->Position,crossi,con1,con2,uhel_final);
                        motor_out((-uhel_final*2.5),speed);
                        }


                break;
        case 12:                                           //neprecetl ID, zkusi znova
                strcpy(text,"12-Jede poslepu a neuspesne projel krizovatku");
                smer=0; //asi neni potreba
                if(uhel_final!=255 && uhel_final!=254)
                        {
                        if(je_kriz)
                                {
                                timer++;                                                       // tu prakticky kontroluje to same co ve stavu 3
                                if(CrossNumber==Mapa.node[trasa[projetaKriz+1]].ID)            //dorazil na spravnu krizovatku
                                        {
                                        stav=4;
                                        chybneID=0;
                                        speed=Speed(Form1->ScrollBar3->Position,Form1->ScrollBar2->Position,crossi,con1,con2,uhel_final);    //Zpomalení na křižovatce
                                        motor_out((-uhel_final*2.5),speed);
                                        }
                                else
                                        {
                                        if(CrossNumber!=-1)                     //dorazil jinam
                                                {
                                                chybneID++;
                                                if(chybneID>1)
                                                        {
                                                        speed=Speed(Form1->ScrollBar3->Position,21-chybneID,crossi,con1,con2,uhel_final);    //Zpomali rychlost na 0, aby zkusil precist kod lip
                                                        motor_out((-uhel_final*2.5),20);
                                                        }
                                                if(chybneID>20)                 //pokud precte 20krat kod spatne, jede do vychozi stanice
                                                        {
                                                        chybneID=0;
                                                        if(Form1->CheckBox1->Checked)
                                                                {
                                                                ShowMessage("Su na spatne krizovatce");
                                                                }
                                                       // stop();
                                                        stav=11;
                                                        prvniNaslepo=CrossNumber;
                                                        projetaKriz=0;
                                                        }
                                                }
                                        //Form1->Label13->Caption="Nejsu na spravne krizovatce";
                                        motor_out((-uhel_final*2.5),20);
                                        };
                                }
                        else
                                {
                                motor_out((-uhel_final*2.5),20);
                                }
                        }
                else                                          //asi zacouval moc daleko, naslepo popojede dopredu
                        {
                        motor_out(0,10);
                        Sleep(100);
                        }
                if(timer>20 && !je_kriz)        //pokud znova projede krizovatku bez precteni kodu
                        {
                        stav=20;
                        timer=0;
                        }



                break;
/*        case 13:              //tento asi tez nebude potreba
 
                strcpy(text,"Jede poslepu a znova neuspesne projel krizovatku");

                break;  */
        case 14:
 
                strcpy(text,"14-Toci se");
                if(uhel_final==255)
                        {
                        motor_out(Form1->ScrollBar4->Position,0);
                        }
                else
                        {
                        if(Form1->CheckBox1->Checked)
                                {
                         //       ShowMessage("Ted bych mel byt otoceny");
                                }
                        stav=stavPoOtocce;
                        stavPoOtocce=0;
                        }

                break;
        case 15:
 
                strcpy(text,"15-Je v cili");
                if(Form1->CheckBox1->Checked)
                                        {
                                        ShowMessage("Cilova stanice");
                                        }
                if(report[0]!=0)
                        {
                        ShowMessage(report);
                        }
                stop();
                break;

        case 16:
              //nevi ani jednu krizovatku, zkusi najit prvni s citelnym ID
                strcpy(text,"16-Je ztraceny");
                speed=Speed(Form1->ScrollBar3->Position,Form1->ScrollBar2->Position,crossi,con1,con2,uhel_final);    //Zpomalení na křižovatce
                if(uhel_final!=255 && uhel_final!=254)
                        {

                        if(je_kriz)
                                {
                                if(GetOrder(&Mapa,Mapa.node[trasa[projetaKriz+1]].ID)==GetOrder(&Mapa,Mapa.node[trasa[uzluNaCeste-1]].ID))
                                        otocka(15);
                                motor_out((-uhel_final*2.5),Form1->ScrollBar2->Position);
                                smer=1;
                                if(CrossNumber!=-1)                 //narazil na prvni krizovaku s citelnym ID
                                        {
                                        prvniNaslepo=CrossNumber;
                                        stav=11;
                                        projetaKriz=0;
                                        }
                                }
                        else
                                {
                                motor_out((-uhel_final*2.5),speed);
                                smer=0;
                                }
                        }
                else
                        {
                        otocka(16);
                        }

                break;

        case 17:
 
                strcpy(text,"17-Vzdava to");           //mapa uz zrejme neni pouzitelna, naslepo bude hledat cilovou stanici
                strcpy(report,"Mapa vyzaduje opravu");
                speed=Speed(Form1->ScrollBar3->Position,Form1->ScrollBar2->Position,crossi,con1,con2,uhel_final);    //Zpomalení na křižovatce
                if(uhel_final!=255 && uhel_final!=254)
                        {
                        motor_out((-uhel_final*2.5),speed);
                        if(je_kriz)
                                {
                                timer++;
                                if(CrossNumber!=-1)
                                        {
                                        if(Mapa.node[GetOrder(&Mapa,CrossNumber)-1].terminal)  //pokud trefil cilovou stanici
                                                {
                                                otocka(15);
                                                }
                                        }
                                }
                        else
                                {
                                if(timer>10)
                                        {
                                        smer=0;
                                        timer=0;
                                        }
                                }
                        }
                else
                        {
                        otocka(17);
                        smer=1;
                        }

                break;

        case 18:                               //zkusi precist vpravo
                strcpy(text,"18-Hleda kod vpravo");
                smer=0; //asi neni potreba
                if(uhel_final!=255 && uhel_final!=254)
                        {
                        if(je_kriz)
                                {                                                       // tu prakticky kontroluje to same co ve stavu 3
                                timer++;
                                if(CrossNumber==Mapa.node[trasa[projetaKriz+1]].ID)            //dorazil na spravnu krizovatku
                                        {
                                        stav=4;
                                        chybneID=0;
                                        speed=Speed(Form1->ScrollBar3->Position,Form1->ScrollBar2->Position,crossi,con1,con2,uhel_final);    //Zpomalení na křižovatce
                                        motor_out((-uhel_final*2.5),speed);
                                        }
                                else
                                        {
                                        if(CrossNumber!=-1)                     //dorazil jinam
                                                {
                                                chybneID++;
                                                if(chybneID>1)
                                                        {
                                                        speed=Speed(Form1->ScrollBar3->Position,10,crossi,con1,con2,uhel_final);    //Zpomali rychlost na 0, aby zkusil precist kod lip
                                                        motor_out((-uhel_final*2.5)-40,20);
                                                        }
                                                if(chybneID>10)                 //pokud precte 10krat kod spatne, jede do vychozi stanice
                                                        {
                                                        chybneID=0;
                                                        if(Form1->CheckBox1->Checked)
                                                                {
                                                                ShowMessage("Su na spatne krizovatce");
                                                                }
                                                        stop();
                                                        strcpy(cil,Form1->ComboBox1->Text.c_str());
                                                        strcat(report,"Krizovatka ");
                                                        strcat(report,Mapa.node[trasa[projetaKriz+1]].name);
                                                        strcat(report," je oznacena spatnym kodem");
                                                        int fl=PathFind(&Mapa,GetOrder(&Mapa,Mapa.node[trasa[projetaKriz+1]].ID),GetOrder(&Mapa,cil),trasa,&uzluNaCeste,&delkaCesty);
                                                        if(!fl)
                                                                {
                                                                Preklad(&Mapa,trasa,trasaSmer,uzluNaCeste);
                                                                projetaKriz=0;
                                                                otocka(1);
                                                              //  smer=trasaSmer[1];       //nastaveni odboceni v prvni krizovatce (potom uz si to hlida sam)
                                                                }
                                                        else               //nenasel cestu zpatky a je v pasti (nemelo by nastat)
                                                                {
                                                                otocka(16);
                                                                }
                                                        }
                                                }
                                        else
                                                {
                                                motor_out((-uhel_final*2.5)-40,20);
                                                }
                                        //Form1->Label13->Caption="Nejsu na spravne krizovatce";
                                        motor_out((-uhel_final*2.5)-40,20);
                                        };
                                }
                        else
                                {
                                motor_out((-uhel_final*2.5)-40,30);
                                }
                        }
                else                                          //asi zacouval moc daleko, naslepo popojede dopredu
                        {
                        motor_out(0,20);
                        Sleep(100);
                        }
                if(timer>20 && !je_kriz)        //pokud znova projede krizovatku bez precteni kodu
                        {
                        stav=19;                   //a jede dal
                        couvni();
                        couvni();
                        timer=0;
                        }

                break;
        case 19:                               //zkusi precist zleva
                strcpy(text,"19-Hleda kod vlevo");
                smer=0; //asi neni potreba
                if(uhel_final!=255 && uhel_final!=254)
                        {
                        if(je_kriz)
                                {                                                       // tu prakticky kontroluje to same co ve stavu 3
                                timer++;
                                if(CrossNumber==Mapa.node[trasa[projetaKriz+1]].ID)            //dorazil na spravnu krizovatku
                                        {
                                        stav=4;
                                        chybneID=0;
                                        speed=Speed(Form1->ScrollBar3->Position,Form1->ScrollBar2->Position,crossi,con1,con2,uhel_final);    //Zpomalení na křižovatce
                                        motor_out((-uhel_final*2.5),speed);
                                        }
                                else
                                        {
                                        if(CrossNumber!=-1)                     //dorazil jinam
                                                {
                                                chybneID++;
                                                if(chybneID>1)
                                                        {
                                                        speed=Speed(Form1->ScrollBar3->Position,10,crossi,con1,con2,uhel_final);    //Zpomali rychlost na 0, aby zkusil precist kod lip
                                                        motor_out((-uhel_final*2.5)+40,20);
                                                        }
                                                if(chybneID>10)                 //pokud precte 10krat kod spatne, jede do vychozi stanice
                                                        {
                                                        chybneID=0;
                                                        if(Form1->CheckBox1->Checked)
                                                                {
                                                                ShowMessage("Su na spatne krizovatce");
                                                                }
                                                        stop();
                                                        strcpy(cil,Form1->ComboBox1->Text.c_str());
                                                        strcat(report,"Krizovatka ");
                                                        strcat(report,Mapa.node[trasa[projetaKriz+1]].name);
                                                        strcat(report," je oznacena spatnym kodem");
                                                        int fl=PathFind(&Mapa,GetOrder(&Mapa,Mapa.node[trasa[projetaKriz+1]].ID),GetOrder(&Mapa,cil),trasa,&uzluNaCeste,&delkaCesty);
                                                        if(!fl)
                                                                {
                                                                Preklad(&Mapa,trasa,trasaSmer,uzluNaCeste);
                                                                projetaKriz=0;
                                                                otocka(1);
                                                              //  smer=trasaSmer[1];       //nastaveni odboceni v prvni krizovatce (potom uz si to hlida sam)
                                                                }
                                                        else               //nenasel cestu zpatky a je v pasti (nemelo by nastat)
                                                                {
                                                                otocka(16);
                                                                }
                                                        }
                                                }
                                        else
                                                {
                                                motor_out((-uhel_final*2.5)+40,20);
                                                }

                                        //Form1->Label13->Caption="Nejsu na spravne krizovatce";
                                        motor_out((-uhel_final*2.5)+40,20);
                                        };
                                }
                        else
                                {
                                motor_out((-uhel_final*2.5)+40,30);
                                }
                        }
                else                                          //asi zacouval moc daleko, naslepo popojede dopredu
                        {
                        motor_out(0,10);
                        Sleep(100);
                        }
                if(timer>20 && !je_kriz)        //pokud znova projede krizovatku bez precteni kodu
                        {
                        strcat(report,"Kod na krizovatce ");           //nahlasi chybu
                        strcat(report,Mapa.node[trasa[projetaKriz+1]].name);
                        strcat(report," je necitelny");
                        stav=6;                   //a jede dal
                        couvni();
                        timer=0;
                        }

                break;

        case 20:                               //zkusi precist vpravo
                strcpy(text,"20-Hleda kod vpravo");
                smer=0; //asi neni potreba
                if(uhel_final!=255 && uhel_final!=254)
                        {
                        if(je_kriz)
                                {                                                       // tu prakticky kontroluje to same co ve stavu 3
                                timer++;
                                if(CrossNumber==Mapa.node[trasa[projetaKriz+1]].ID)            //dorazil na spravnu krizovatku
                                        {
                                        stav=4;
                                        chybneID=0;
                                        speed=Speed(Form1->ScrollBar3->Position,Form1->ScrollBar2->Position,crossi,con1,con2,uhel_final);    //Zpomalení na křižovatce
                                        motor_out((-uhel_final*2.5),speed);
                                        }
                                else
                                        {
                                        if(CrossNumber!=-1)                     //dorazil jinam
                                                {
                                                chybneID++;
                                                if(chybneID>1)
                                                        {
                                                        speed=Speed(Form1->ScrollBar3->Position,10,crossi,con1,con2,uhel_final);    //Zpomali rychlost na 0, aby zkusil precist kod lip
                                                        motor_out((-uhel_final*2.5)-40,20);
                                                        }
                                                if(chybneID>10)                 //pokud precte 10krat kod spatne, jede do vychozi stanice
                                                        {
                                                        chybneID=0;
                                                        if(Form1->CheckBox1->Checked)
                                                                {
                                                                ShowMessage("Su na spatne krizovatce");
                                                                }
                                                        stop();
                                                        strcpy(cil,Form1->ComboBox1->Text.c_str());
                                                        strcat(report,"Krizovatka ");
                                                        strcat(report,Mapa.node[trasa[projetaKriz+1]].name);
                                                        strcat(report," je oznacena spatnym kodem");
                                                        int fl=PathFind(&Mapa,GetOrder(&Mapa,Mapa.node[trasa[projetaKriz+1]].ID),GetOrder(&Mapa,cil),trasa,&uzluNaCeste,&delkaCesty);
                                                        if(!fl)
                                                                {
                                                                Preklad(&Mapa,trasa,trasaSmer,uzluNaCeste);
                                                                projetaKriz=0;
                                                                otocka(1);
                                                              //  smer=trasaSmer[1];       //nastaveni odboceni v prvni krizovatce (potom uz si to hlida sam)
                                                                }
                                                        else               //nenasel cestu zpatky a je v pasti (nemelo by nastat)
                                                                {
                                                                otocka(16);
                                                                }
                                                        }
                                                }
                                        else
                                                {
                                                motor_out((-uhel_final*2.5)-40,20);
                                                }
                                        //Form1->Label13->Caption="Nejsu na spravne krizovatce";
                                        motor_out((-uhel_final*2.5)-40,20);
                                        };
                                }
                        else
                                {
                                motor_out((-uhel_final*2.5)-40,30);
                                }
                        }
                else                                          //asi zacouval moc daleko, naslepo popojede dopredu
                        {
                        motor_out(0,20);
                        Sleep(100);
                        }
                if(timer>20 && !je_kriz)        //pokud znova projede krizovatku bez precteni kodu
                        {
                        stav=21;                   //a jede dal
                        couvni();
                        couvni();
                        timer=0;
                        }

                break;
        case 21:                               //zkusi precist vlevo
                strcpy(text,"21-Hleda kod vlevo");
                smer=0; //asi neni potreba
                if(uhel_final!=255 && uhel_final!=254)
                        {
                        if(je_kriz)
                                {                                                       // tu prakticky kontroluje to same co ve stavu 3
                                timer++;
                                if(CrossNumber==Mapa.node[trasa[projetaKriz+1]].ID)            //dorazil na spravnu krizovatku
                                        {
                                        stav=4;
                                        chybneID=0;
                                        speed=Speed(Form1->ScrollBar3->Position,Form1->ScrollBar2->Position,crossi,con1,con2,uhel_final);    //Zpomalení na křižovatce
                                        motor_out((-uhel_final*2.5),speed);
                                        }
                                else
                                        {
                                        if(CrossNumber!=-1)                     //dorazil jinam
                                                {
                                                chybneID++;
                                                if(chybneID>1)
                                                        {
                                                        speed=Speed(Form1->ScrollBar3->Position,10,crossi,con1,con2,uhel_final);    //Zpomali rychlost na 0, aby zkusil precist kod lip
                                                        motor_out((-uhel_final*2.5)+40,20);
                                                        }
                                                if(chybneID>10)                 //pokud precte 10krat kod spatne, jede do vychozi stanice
                                                        {
                                                        chybneID=0;
                                                        if(Form1->CheckBox1->Checked)
                                                                {
                                                                ShowMessage("Su na spatne krizovatce");
                                                                }
                                                        stop();
                                                        strcpy(cil,Form1->ComboBox1->Text.c_str());
                                                        strcat(report,"Krizovatka ");
                                                        strcat(report,Mapa.node[trasa[projetaKriz+1]].name);
                                                        strcat(report," je oznacena spatnym kodem");
                                                        int fl=PathFind(&Mapa,GetOrder(&Mapa,Mapa.node[trasa[projetaKriz+1]].ID),GetOrder(&Mapa,cil),trasa,&uzluNaCeste,&delkaCesty);
                                                        if(!fl)
                                                                {
                                                                Preklad(&Mapa,trasa,trasaSmer,uzluNaCeste);
                                                                projetaKriz=0;
                                                                otocka(1);
                                                              //  smer=trasaSmer[1];       //nastaveni odboceni v prvni krizovatce (potom uz si to hlida sam)
                                                                }
                                                        else               //nenasel cestu zpatky a je v pasti (nemelo by nastat)
                                                                {
                                                                otocka(16);
                                                                }
                                                        }
                                                }
                                        else
                                                {
                                                motor_out((-uhel_final*2.5)+40,20);
                                                }

                                        //Form1->Label13->Caption="Nejsu na spravne krizovatce";
                                        motor_out((-uhel_final*2.5)+40,20);
                                        };
                                }
                        else
                                {
                                motor_out((-uhel_final*2.5)+40,30);
                                }
                        }
                else                                          //asi zacouval moc daleko, naslepo popojede dopredu
                        {
                        motor_out(0,10);
                        Sleep(100);
                        }
                if(timer>20 && !je_kriz)        //pokud znova projede krizovatku bez precteni kodu
                        {
                        strcat(report,"Kod na krizovatce ");           //nahlasi chybu
                        strcat(report,Mapa.node[trasa[projetaKriz+1]].name);
                        strcat(report," je necitelny");
                        stav=16;                   //a jede dal
                        couvni();
                        timer=0;
                        }

                break;


        }

  }

        if(vykresli)
                {
                show(picture,pixel_init);                   //Vykreslení obrazu do okna
                }

        ftime(&cas);
        cas2=cas.millitm;
        casc=cas2-cas1;

        Form1->Label3->Caption=text;

        Form1->Label8->Caption=Mapa.node[trasa[projetaKriz+1]].ID;
        Form1->Label9->Caption=Mapa.node[trasa[projetaKriz]].ID;
        Form1->Label10->Caption=uzluNaCeste-projetaKriz-1;
        Form1->Label16->Caption=Mapa.node[trasa[projetaKriz+1]].name;
        switch(trasaSmer[projetaKriz+1])
                {
                case 0:
                Form1->Label11->Caption="rovne";
                break;
                case 1:
                Form1->Label11->Caption="vpravo";
                break;
                case 2:
                Form1->Label11->Caption="vlevo";
                break;
                case 3:
                Form1->Label11->Caption="cilova";
                break;
                default:
                Form1->Label11->Caption="tak akorat do... :/";
                break;
                };
        Form1->Label4->Caption=timer;
        return (true);
}



// konec aplikace------------------------------------------------------------

void __fastcall TForm1::FormDestroy(TObject *Sender)
{
motor_out(0,0);    //zastavení při ukončení aplikace
FILE *f;
f=fopen("settings","wt");
if(f!=NULL)
        {
        fprintf(f,"%s    %s      %s      %d      %d     %d      %d     %d",ComboBox1->Text.c_str(),ComboBox2->Text.c_str(),ComboBox3->Text.c_str(),ScrollBar1->Position,CheckBox1->Checked,ScrollBar2->Position,ScrollBar3->Position,ScrollBar4->Position);
        }
}
//---------------------------------------------------------------------------





void __fastcall TForm1::Button1Click(TObject *Sender)
{
stav=1;         //vychozi stav, predpoklada ze bude na care
int a;
a=Cal(picture,&maxw,&minw);   //Kalibrace obrazu
strcpy(start,ComboBox1->Text.c_str());
strcpy(cil,ComboBox2->Text.c_str());
int flag=0;
int flag2=0;
projetaKriz=0;
for(int i=0;i<100;i++)  //vymazani hlaseni o chybe
        {
        report[i]=0;
        }


if(ComboBox1->Text!=ComboBox2->Text)
        {
        if(ComboBox1->Text!="Vychozi stanice" && ComboBox2->Text!="Cilova stanice")
                flag2=PathFind(&Mapa,GetOrder(&Mapa,start),GetOrder(&Mapa,cil),trasa,&uzluNaCeste,&delkaCesty);

        else {
             ShowMessage("Musite zadat vychozi i cilovou stanici");
             flag=2;
             }
        }
else
        {
        ShowMessage("Vychozi stanice je shodna s cilovou");
        flag=1;
        };

if(!flag)
{
if(!flag2)
       {
       int fl=Preklad(&Mapa,trasa,trasaSmer,uzluNaCeste);
       if(!fl)
                {
                go();
                }
       else ShowMessage("Chyba v prekladu trasy"+AnsiString(fl));
       //ShowMessage(smer);
       }
else
        {
        switch(flag2)
                {
                case (-1):
                        ShowMessage("Špatně zadaná mapa");
                        break;
                case (-10):
                        ShowMessage("Příliš mnoho uzlů v mapě");
                        break;
                case (-11):
                        ShowMessage("Nelze najít požadovanou cestu");
                        break;
                }

        }
//ShowMessage(flag2);
if(CheckBox1->Checked)
        {
        Button4->Visible=true;
        Button1->Visible=false;
        }
}
}
//---------------------------------------------------------------------------




void __fastcall TForm1::FormCreate(TObject *Sender)
{

HWND videowindow;                        //Handle okna
 videowindow = capCreateCaptureWindow(" zachyceny obraz ", WS_CHILD|WS_VISIBLE,Form1->Panel1->Left,Form1->Panel1->Top,Form1->Panel1->Width,Form1->Panel1->Height,this->Handle, 0);
 //Form1->DoubleBuffered=true;
 capDriverConnect(videowindow,false);        //vytvoření vykreslovacího okna

 CAPDRIVERCAPS CapDriverCaps;            //Ovladač zařízení
 capDriverGetCaps(videowindow, &CapDriverCaps, sizeof (CAPDRIVERCAPS));
/*
 //Výběr zdroje obrazu
if (CapDriverCaps.fHasDlgVideoSource)
   capDlgVideoSource(videowindow);
 //Formát obrazu

if (CapDriverCaps.fHasDlgVideoFormat)
{
    capDlgVideoFormat(videowindow);
}
*/
 capPreview(videowindow,true);    // print do obrazovky
 capPreviewRate(videowindow,1); // cas vzorkovani (i kdyz neni do obrazovky)
 capPreviewScale(videowindow,true);

 CAPTUREPARMS parms;
 capCaptureGetSetup(videowindow,&parms,sizeof(CAPTUREPARMS));
 if(!capCaptureSetSetup(videowindow,&parms,sizeof(CAPTUREPARMS)))
 MessageBox(Form1->Handle,"Cannot set video setup","Warning",(MB_OK,MB_ICONWARNING));

 capSetCallbackOnFrame(videowindow,main_function);  //Volání hlavní funkce po každém snímku



 //moja cast---------------------
 int flag=1;
 char cesta[]="mapa.txt";
 flag=Read(cesta,&Mapa);
 if(flag!=0)ShowMessage("Nepodarilo se nacist mapu");
 for(int i=0;i<Mapa.count;i++)
        {
        if(Mapa.node[i].terminal || CheckBox1->Checked)
                {
                ComboBox1->Items->Add(Mapa.node[i].name);
                ComboBox2->Items->Add(Mapa.node[i].name);
                }
        }
 ComboBox1->Sorted=true;                        //seradit podle abecedy
 ComboBox2->Sorted=true;

}





void __fastcall TForm1::CheckBox1Click(TObject *Sender)
{
if(CheckBox1->Checked)
        {
        Form1->Height=740;
        Form1->Width=832;
        ScrollBar1->Visible=true;
        Edit1->Visible=true;
        Edit2->Visible=true;
        Panel1->Visible=true;

        Label1->Visible=true;
        Label3->Visible=true;
        Label4->Visible=true;
        Label5->Visible=true;
        Label6->Visible=true;
        Label7->Visible=true;
        Label8->Visible=true;
        Label9->Visible=true;
        Label10->Visible=true;
        Label11->Visible=true;
        Label12->Visible=true;
//        Label13->Visible=true;
        Label14->Visible=true;
        Label15->Visible=true;
        Label16->Visible=true;
        Label17->Visible=true;
        Label18->Visible=true;
        Label19->Visible=true;
        Label20->Visible=true;
        Label21->Visible=true;
        Button3->Visible=true;
        ScrollBar2->Visible=true;
        ScrollBar3->Visible=true;
        ScrollBar4->Visible=true;
        Button2->Visible=true;
        CheckBox2->Visible=true;
        CheckBox2->Checked=false;
        ComboBox3->Visible=true;
        Label2->Visible=true;
        }
else
        {
        Form1->Height=520;
        Form1->Width=832;
        ScrollBar1->Visible=false;
        Edit1->Visible=false;
        Edit2->Visible=false;
        Panel1->Visible=false;

        Label1->Visible=false;
        Label3->Visible=false;
        Label4->Visible=false;
        Label5->Visible=false;
        Label6->Visible=false;
        Label7->Visible=false;
        Label8->Visible=false;
        Label9->Visible=false;
        Label10->Visible=false;
        Label11->Visible=false;
        Label12->Visible=false;
//        Label13->Visible=false;
        Label14->Visible=false;
        Label15->Visible=false;
        Label16->Visible=false;
        Label17->Visible=false;
        Label18->Visible=false;
        Label19->Visible=false;
        Label20->Visible=false;
        Label21->Visible=false;
        Button3->Visible=false;
        ScrollBar2->Visible=false;
        ScrollBar3->Visible=false;
        ScrollBar4->Visible=false;
        Button2->Visible=false;
        CheckBox2->Visible=false;
        CheckBox2->Checked=true;
        ComboBox3->Visible=false;
        Label2->Visible=false;
        Button1->Visible=true;
        Button4->Visible=false;
        }

}
//---------------------------------------------------------------------------

void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
// Label3->Visible=je_kriz;
 Label4->Caption=IntToStr(runtime);
 runtime++;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ScrollBar2Change(TObject *Sender)
{
smer=ScrollBar2->Position;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button3Click(TObject *Sender)
{
if(projetaKriz<uzluNaCeste-2)
        {
        projetaKriz++;
        smer=trasaSmer[projetaKriz+1];
        }
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)
{
if(vykresli)
        {
        vykresli=false;

        }
else
        {
        vykresli=true;

        }

}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button4Click(TObject *Sender)
{
if(CheckBox1->Checked)
        {
        stop();
        Button4->Visible=false;
        Button1->Visible=true;
        strcpy(text,"Zastavil");
        }
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ScrollBar4Change(TObject *Sender)
{
Label18->Caption=ScrollBar4->Position;
}
//---------------------------------------------------------------------------

