#include <vcl.h>
#include <string.h>
#include <string>
#include <windows.h>
#include <tchar.h>
#include <winsock2.h>
#include "LBIC_ovladaci_panel.h"
#include "LBIC_scan_solarniho_clanku.h"
#include "LBIC_nastaveni_agilent.h"
#include "stdio.h"
#include "math.h"
#include "io.h"
#include "fstream.h"
#include "iostream.h"
//---------------------------------------------------------------------------
#pragma hdrstop
#pragma package(smart_init)
#pragma resource "*.dfm"

TForm1 *Form1;

//---zacatek---
//inicializace globalnich promenych
#define SouborTemp "c:/Scan.txt"
const ZmenaOdstinu = 65793;                                       /*256 odstinu, 1118481 16 odstinu*/ //Hodnota klice, podle ktereho je stupnovana barva
Graphics::TBitmap *pObrazek = new Graphics::TBitmap();     //ulozeny nascanovany solarni clanek
Graphics::TBitmap *pObrazekPrazdny = new Graphics::TBitmap();
Graphics::TBitmap *pObrazekZOOM = new Graphics::TBitmap();
Graphics::TBitmap *pObrazekVyber = new Graphics::TBitmap();
float **PoleHodnot; // ulozene namerene hodnoty ze solarniho clanku
float **PoleHodnotZOOM;
boolean Smazane=true; //zjisteni zda je obrazek vykreslen Smazane=true -je neni vykreslen
TRect VelikostObrazku;
int StartX,StartY,KonecX,KonecY,SouradniceX,SouradniceY;
int Zvetseni,PocMerPresun=1;
int VelikostPoleHodnot=4000, VelikostPoleHodnotZOOM;
bool CanRun, Pripojeno=false;
short Vyber=0;

//inicializace pro měření
#define BUFSIZE 200
 float MinHodnota, MaxHodnota;

 WORD wVersionRequested = MAKEWORD(1,1);
 WSADATA data;                           // Struktura s info. o knihovni
 int mySocket;                           // Soket
 string text, ip;
 sockaddr_in serverSock;
 char ipAdresa;
 int port;                          // Císlo portu  mericiho pristroje pro SCPI
 char buf[BUFSIZE];                 // Prijímací buffer
 int size;
//inicializace pro měření

FILE *pSoubor;

//---konec---
//inicializace globalnich promenych


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

//---zacatek---
//inicializace pracovniho prostredi
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{

  //inicializece zvetseni
  ComboBox1->Enabled=false;
  ComboBox1->Items->Add(1);
  ComboBox1->Items->Add(2);
  ComboBox1->Items->Add(3);
  ComboBox1->Items->Add(4);
  ComboBox1->Items->Add(5);
  ComboBox1->Items->Add(6);
  ComboBox1->Items->Add(7);
  ComboBox1->SelText=1;
  //inicializace zvetseni

  //editace hint
  Edit1->Hint="Zadej počáteční souřadnici X pro scanování článku.";
  Edit1->ShowHint=true;
  Edit2->Hint="Zadej počáteční souřadnici Y pro scanování článku.";
  Edit2->ShowHint=true;
  Edit3->Hint="Zadej konečnou souřadnici X pro scanování článku.";
  Edit3->ShowHint=true;
  Edit4->Hint="Zadej konečnou souřadnici Y pro scanování článku.";
  Edit4->ShowHint=true;
  Edit5->Hint="Zadej počet bodů posunu scaneru ve směru osy X.";
  Edit5->ShowHint=true;
  Edit6->Hint="Zadej počet bodů posunu scaneru ve směru osy Y.";
  Edit6->ShowHint=true;
  //editace hint

  //inicializace souradnic posilanych do plotru
  Edit1->Text=8120;   //StartX
  Edit2->Text=5355;   //StartY
  Edit3->Text=12220; //KonecX
  Edit4->Text=9455; //KonecY
  Edit5->Text=10;   //KrokX
  Edit6->Text=10;   //KrokY
  Edit8->Text=1;   //Pocet mereni
  Form1->Edit9->Text=0; //Minimalani hodnota rozsahu
  Form1->Edit10->Text=3; //Maximalni hodnota rozsahu
  Form1->Edit11->Text=0; //Posun obrazku
  Form1->Edit12->Text=40; //Zpozdeni
  Form1->Edit13->Text=1; //Pocet mereni behem presunu
  //inicializace souradnic posilanych do plotru


 //promena pro ukladani namerenych hodnot
  PoleHodnot=(float **)malloc(VelikostPoleHodnot*sizeof(float*));
  for(int i=0;i<VelikostPoleHodnot;i++)
  PoleHodnot[i]=(float *)malloc(VelikostPoleHodnot*sizeof(float));
  //promena pro ukladani namerenych hodnot


}
//---konec---
//inicializace pracovniho prostredi

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

//---zacatek---
//zjisteni a nastaveni zvetseni
void InicializaceObrazku()
{
  if ((KonecY>=StartY) && (KonecX>=StartX))
  {
    pObrazek->Height=SouradniceY;
    pObrazek->Width=SouradniceX;
    pObrazekZOOM->Height=SouradniceY*Zvetseni;
    pObrazekZOOM->Width=SouradniceX*Zvetseni;
    pObrazekPrazdny->Height=SouradniceY;      //Vymazani obsahu pObrazek
    pObrazekPrazdny->Width=SouradniceX;
    pObrazek->Assign(pObrazekPrazdny);
  }
  else ShowMessage("Nesprávně zadané souřadnice!");
}
//---zacatek---
//zjisteni a nastaveni zvetseni

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

//---zacatek---
//zjisteni a nastaveni zvetseni
TRect NastavVelikostObrazku()
{
  AnsiString chrZvetseni;
  TRect fVelikostObrazku;

  //vyber zvetseni
  if (Zvetseni!=1)
  {
    chrZvetseni=Form1->ComboBox1->Text;
    Zvetseni=StrToInt(chrZvetseni);
  }
  //vyber zvetseni
                        
  //nastaveni velikosti Form2 a ListBox1
  Form2->Top=0;
  Form2->Left=0;
  Form2->ListBox1->Width=SouradniceX*Zvetseni;//*PocMerPresun;
  if (Form2->ListBox1->Width<200) Form2->ListBox1->Width=200;
  Form2->ListBox1->Height=SouradniceY*Zvetseni;
  if (Form2->ListBox1->Width < 850) Form2->Width=Form2->ListBox1->Width+5;
  else Form2->Width=860;
  if (Form2->ListBox1->Height < 850) Form2->Height=Form2->ListBox1->Height+25;
  else Form2->Height=860;
  Form2->Show();
  //nastaveni velikosti Form2 a ListBox1

  //promena pro ukladani namerenych hodnot pro zvetseni
  if (VelikostPoleHodnotZOOM<SouradniceX*Zvetseni/**PocMerPresun*/)
  {
    VelikostPoleHodnotZOOM=SouradniceX*Zvetseni;//*PocMerPresun;
    PoleHodnotZOOM=(float **)malloc(VelikostPoleHodnotZOOM*sizeof(float*));
    for(int i=0;i<VelikostPoleHodnotZOOM;i++)
      PoleHodnotZOOM[i]=(float *)malloc(VelikostPoleHodnotZOOM*sizeof(float));
  }
  //promena pro ukladani namerenych hodnot pro zvetseni

  return fVelikostObrazku = Rect(0,0,SouradniceX*Zvetseni/**PocMerPresun*/,SouradniceY*Zvetseni);
}
//---konec---
//zjisteni a nastaveni zvetseni

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


//---zacatek---
//zmena velikosti a vykresleni obrazku
void VykresliObrazek()
{
  Form2->ListBox1->Top=0;
  Form2->ListBox1->Left=0;
  VelikostObrazku=NastavVelikostObrazku(); //nastavi velikost obrazku
  Form2->ListBox1->Refresh(); //smaze ListBox

  if ((Zvetseni*SouradniceX<5000) && (Zvetseni*SouradniceY<5000))
  //kontrola zda je dostatecne velka promenna
  {
    //nacteni hodnot do PoleHodnotZOOM pro zvetseni
    for (int x=0; x<SouradniceX; x++)
      for (int y=0; y<SouradniceY; y++)
        for (int k=0; k<Zvetseni; k++)
          for (int l=0; l<Zvetseni; l++)
            PoleHodnotZOOM[Zvetseni*x+k][Zvetseni*y+l]=PoleHodnot[x][y];
     //nacteni hodnot do PoleHodnotZOOM pro zvetseni

    //kontrola jestli jsou spravne zadane souradnice
    if ((KonecY>=StartY) && (KonecX>=StartX))
    {
      pObrazekZOOM->Height=SouradniceY*Zvetseni;
      pObrazekZOOM->Width=SouradniceX*Zvetseni;//*PocMerPresun;
    }
    else ShowMessage("Nesprávně zadané souřadnice!");
    //kontrola jestli jsou spravne zadane souradnice

    //vykresleni obrazku
    Form2->ListBox1->Canvas->StretchDraw(VelikostObrazku,pObrazek);
    for (int i=0;i<pObrazekZOOM->Width;i++)   //prirazeni do promene namerene hodnoty
      for (int j=0;j<pObrazekZOOM->Height;j++)
      {
        pObrazekZOOM->Canvas->Pixels[i][j]=Form2->ListBox1->Canvas->Pixels[i][j];
      }
    Smazane = false;
    //vykresleni obrazku
  }
  else
  {
    //promenna neni dostatecne velka - vykresli ve Zvetseni=1
    ShowMessage("ERROR: Dané zvětšení je příliš velké!");
    Zvetseni=1;
    VelikostObrazku=NastavVelikostObrazku();
    Form2->ListBox1->Refresh();
    Form2->ListBox1->Canvas->Draw(0,0,pObrazek);
    Smazane = false;
    //promenna neni dostatecne velka - vzkresli ve Zvetseni=1
  }
}
//---konec---
//zmena velikosti a vykresleni obrazku

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

//---zacatek---
//zmereni zadaneho poctu hodnot v danem miste, vraci prumernou hodnotu
float fNamerenaHodnota()
{

  float Vysledek, Soucet=0, Prumer;
  int  PocetMereni;

  PocetMereni=StrToInt(Form1->Edit8->Text);

  for(int i=0;i<PocetMereni;i++)
  {
    //Odeslání dat
   text =("Read?\n");
    if ((size = send(mySocket, text.c_str(), text.size() + 1, 0)) == -1)
    {
         ShowMessage("Problém s odesláním dat");
         WSACleanup();
    }
    //Konec odeslani dat

    // Príjem dat
    text = "";
    int s;
    size = recv(mySocket, buf, BUFSIZE, 0);
    while (( size != 0) && (size != -1))
    {
             for(int i=0;i<size;i++)
                 {
                 text += buf[i];
                 }
       s=text.find('\n');
       size=-1;
    }
     //Konec prijmu dat

        if(s==-1)
        {
           ShowMessage(" Nelze příjmout data z měřícího přístroje Agilentu");
        }
          else
          {
          Vysledek=atof(text.c_str());
          }

    Soucet+=Vysledek;
    text.erase();

  }

  Prumer=Soucet/PocetMereni;
  Form1->ListBox1->Items->Add(AnsiString(Prumer));
  Form1->Edit7->Text=FloatToStr(Prumer);
  return Prumer;
}
//---zacatek---
//zmereni zadaneho poctu hodnot v danem miste, vraci prumernou hodnotu

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

//---zacatek---
//ulozeni obrazku do souboru
void __fastcall TForm1::UlozObrazekClick(TObject *Sender)
{
  SavePictureDialog1->Filter = "Bitmaps (*.bmp)|*.bmp";
  if(SavePictureDialog1->Execute())
    pObrazek->SaveToFile(SavePictureDialog1->FileName+".bmp");
}
//---konec---
//ulozeni obrazku do souboru

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

//---zacatek---
//nacteni obrazku ze souboru
void __fastcall TForm1::NactiObrazekClick(TObject *Sender)
{
  if(OpenPictureDialog1->Execute())
    pObrazekPrazdny->LoadFromFile(OpenPictureDialog1->FileName);
  if (!pObrazekPrazdny->Empty) //pokud pri nacitani storno,aby se obrazek nevykreslil
  {
    pObrazek->Assign(pObrazekPrazdny);
    pObrazekPrazdny->Dormant();
    pObrazekPrazdny->FreeImage();
    pObrazekPrazdny->ReleaseHandle();
    SouradniceX=pObrazek->Width;
    SouradniceY=pObrazek->Height;
    VykresliObrazek();
    Smazane = true;
  }
  else Form2->Hide();
  ComboBox1->Enabled=true;
}
//---konec---
//nacteni obrazku ze souboru

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

//---zacatek---
//ulozeni namerenych hodnot do binarniho souboru
void __fastcall TForm1::UlozDataClick(TObject *Sender)
{
  AnsiString NazevSouboru;
  int VelikostSouboru;
  SaveDialog1->Filter = "Lbic soubory (*.lbc)|*.lbc";
  if(SaveDialog1->Execute())
  {
    NazevSouboru=SaveDialog1->FileName+".lbc";
    pSoubor = fopen(NazevSouboru.c_str(),"w+b");
    if  (SouradniceY>SouradniceX) VelikostSouboru=(SouradniceY);
    else VelikostSouboru=SouradniceX;
    for (int i = 0; i < VelikostSouboru; i ++) {
      fwrite(PoleHodnot[i], sizeof(float), VelikostSouboru, pSoubor);
    }
  }
  fclose(pSoubor);
}
//---konec---
//ulozeni namerenych hodnot do binarniho souboru

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

//---zacatek---
//nacteni namerenych hodnot z binarniho souboru
void __fastcall TForm1::NactiDataClick(TObject *Sender)
{
  //int pr=FileCreate("sata.txt",fmOpenReadWrite);
  //AnsiString abc;
  int Odstin;
  float NamerenaHodnota;

  //otevreni souboru
  MinHodnota=StrToFloat(Form1->Edit9->Text);
  MaxHodnota=StrToFloat(Form1->Edit10->Text);

  Zvetseni=1;
  OpenDialog1->Filter = "Lbic soubory (*.lbc)|*.lbc";
  if(OpenDialog1->Execute())
  {
    pSoubor = fopen(OpenDialog1->FileName.c_str(),"rb");

    //zjisteni velikosti souboru - vypocteni velikosti pole
    int test=open(OpenDialog1->FileName.c_str(),fmOpenRead);
    SouradniceX = (sqrt(filelength(test)))/2;
    SouradniceY=SouradniceX;
    //zjisteni velikosti souboru - vypocteni velikosti pole

    VelikostObrazku=NastavVelikostObrazku();
    InicializaceObrazku();

    for (int i = 0; i < SouradniceX; i ++) {
    fread(PoleHodnot[i], sizeof(float), SouradniceX, pSoubor);
    }
  }
  //otevreni souboru

  //vykresleni obrazku z nactenych dat
  Form1->ProgressBar1->Max=SouradniceY;
  for (int q=0; q<SouradniceY; q++){
    for (int r=0; r<SouradniceX; r++)
    {
     if (PoleHodnot[r][q]<0.001) PoleHodnot[r][q]=0;
     NamerenaHodnota=PoleHodnot[r][q];
     for (int a=0; a<=256; a++)
        {
          if (NamerenaHodnota<(a*((MaxHodnota-MinHodnota)/256)+MinHodnota))
          {
            Odstin=a;
            break;
          }
        }
        Form1->ProgressBar1->Position=q;
        pObrazek->Canvas->Pixels[r][q] = clWhite-Odstin*ZmenaOdstinu;
    }
  //vykresleni obrazku z nactenych dat
  }
  VykresliObrazek();
  ComboBox1->Enabled=true;
  fclose(pSoubor);
}
//---konec---
//nacteni namerenych hodnot z binarniho souboru

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

//---zacatek---
//uložení hodnot do textového souboru
void __fastcall TForm1::Ulodatatxt1Click(TObject *Sender)
{
   AnsiString NazevSouboru;

  SaveDialog1->Filter = "Textový soubor (*.txt)|*.txt";
  if(SaveDialog1->Execute())
  {
    NazevSouboru=SaveDialog1->FileName+".txt";
    CopyFile(SouborTemp,NazevSouboru.c_str(),false);
    DeleteFile(SouborTemp);
  }
}
//---konec---
//uložení hodnot do textového souboru


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

//---zacatak---
//nacteni hodnot z textového souboru
void __fastcall TForm1::Otevidatatxt1Click(TObject *Sender)
{
  AnsiString strCislo;
  Char Znak;
  float Cislo, Rozliseni;
  FILE *fTxt;
  bool Vypis;
  int PocetSloupcu=0, PocetRad=0;
  int Odstin;
  float NamerenaHodnota;

  strCislo="";
  MinHodnota=StrToFloat(Form1->Edit9->Text);
  MaxHodnota=StrToFloat(Form1->Edit10->Text);
  Rozliseni=((MaxHodnota-MinHodnota)/256)+MinHodnota;
  Zvetseni=1;

  OpenDialog1->Filter = "Lbic soubory (*.txt)|*.txt";
  if(OpenDialog1->Execute())
  {
    fTxt = fopen(OpenDialog1->FileName.c_str(),"rt");

    Znak='x';
    Vypis=true;
    while (!feof(fTxt))
    {
      if ((int)Znak == 10)
      {
        PocetRad++;
        if (PocetSloupcu > 1)
        {
          Vypis=false;
          SouradniceX=PocetSloupcu;
        }
      }
      if ((((int)Znak == 44) || ((int)Znak == 46)) && Vypis) PocetSloupcu++;
      Znak=fgetc(fTxt);
    }
    SouradniceY=PocetRad-1;

    VelikostObrazku=NastavVelikostObrazku();
    InicializaceObrazku();

    int x=0, y=0, PoziceX=0;
    bool Lichy=true;
    Vypis=false;
    rewind(fTxt);
    Znak='x';
    while (!feof(fTxt))
    {
      Znak=fgetc(fTxt);
      while ((((int)Znak > 47) && ((int)Znak < 58)) || (((int)Znak == 44) || ((int)Znak == 46)))
      {
        if ((int)Znak == 46) Znak = ',';
        strCislo = strCislo + Znak;
        Vypis=true;
        Znak=fgetc(fTxt);
      }
      if (Vypis)
      {
        Vypis=false;
        Cislo=StrToFloat(strCislo);
        PoleHodnot[x][y]=Cislo;

        if (PoleHodnot[x][y]<0.001) PoleHodnot[x][y]=0;
        NamerenaHodnota=PoleHodnot[x][y];
        for (int a=0; a<=256; a++)
          {
            if (NamerenaHodnota < (a*Rozliseni))
            {
              Odstin=a;
              break;
            }
          }
        pObrazek->Canvas->Pixels[x][y] = clWhite-Odstin*ZmenaOdstinu;

        PoziceX++;
        if (Lichy) x++;
        else x--;
        if (PoziceX>=SouradniceX) {PoziceX=0; y++; Lichy=!Lichy;}
      }
      strCislo="";
    }

    VykresliObrazek();
    ComboBox1->Enabled=true;
    fclose(fTxt);
  }
}
//---konec---
//nacteni hodnot z textového souboru

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


//---zacatek---
//preruseni scanovani solarniho clanku
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 CanRun=false;
}
//---konec---
//preruseni scanovani solarniho clanku

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

//---zacatek---
//scanovani solarniho clanku
void __fastcall TForm1::Button3Click(TObject *Sender)
{
  if(Pripojeno== false)
  {
    ShowMessage("Měřící přístroj Agilent není připojen");
  }
  else
  {

  CanRun=true;

  //inicializace promenych
  AnsiString InitPlotr,PosunPlotrDoprava,PosunPlotrDoleva,NovyRadekPlotr;
  int KrokX,KrokY;
  int port;//=FileCreate("Soubor.txt",fmOpenReadWrite);//zapisuje pozice na plotru
  float port2=FileCreate(SouborTemp,fmOpenReadWrite);//prumerne namerene hodnoty
  int Odstin,Lichy;
  float NamerenaHodnota;
  AnsiString NH;
  //inicializace promenych

  PocMerPresun=Form1->Edit13->Text.ToInt(); //zjisteni poctu mereni behem presunu

  //ochrana proti spatnemu zadani kroku
  Zvetseni=1;
  if  (Edit5->Text==0){
  Edit5->Text=1;
  }
  if  (Edit6->Text==0){
  Edit6->Text=1;
  }
  //ochrana proti spatnemu zadani kroku

  MinHodnota=StrToFloat(Form1->Edit9->Text);
  MaxHodnota=StrToFloat(Form1->Edit10->Text);

  //nacitani souradnic
  StartX=Form1->Edit1->Text.ToInt();
  StartY=Form1->Edit2->Text.ToInt();
  KonecX=Form1->Edit3->Text.ToInt();
  KonecY=Form1->Edit4->Text.ToInt();
  //nacitani souradnic

  //nastaveni kroku
  KrokX=StrToInt(Form1->Edit5->Text);
  KrokY=StrToInt(Form1->Edit6->Text);
  SouradniceX=((KonecX-StartX)/KrokX)*PocMerPresun;
  SouradniceY=(KonecY-StartY)/KrokY;
  //nastaveni kroku


    // Odeslání dat
   text =("SYST:BEEP\nDISP:WIND2:TEXT:CLEar\nDISP:WIND1:TEXT:CLEar\n");  
    if ((size = send(mySocket, text.c_str(), text.size() + 1, 0)) == -1)
    {
         ShowMessage("Problém s odesláním dat");
         WSACleanup();
    }
   text.erase();
   //--------------konec odeslani dat


  //nastaveni pozice ListBoxu na Form2
  //musi byt zde, jinak se pozice vraci po kazdem posunuti
  Form2->ListBox1->Top=0;
  Form2->ListBox1->Left=0;
  //nastaveni pozice ListBoxu na Form2

  VelikostObrazku=NastavVelikostObrazku(); //fce NastavVelikostObrazku (82)

  Form2->ListBox1->Refresh();//Smaze ListBox
  Form1->Label21->Visible=true;
  Smazane = false;

  //vlozeni hodnot do promenych pro ovladani plotru
  InitPlotr = "PU;PA"+AnsiString(StartX)+","+AnsiString(StartY)+";PD;";
  PosunPlotrDoprava = "PR"+AnsiString(KrokX)+",0;";
  PosunPlotrDoleva = "PR-"+AnsiString(KrokX)+",0;";
  NovyRadekPlotr = "PR0,-"+AnsiString(KrokY)+";";
  //vlozeni hodnot do promenych pro ovladani plotru

  InicializaceObrazku();

  //pohyb plotru, mereni hodnot a vykreslovani
  Form1->ProgressBar1->Max=SouradniceY;
  port = FileOpen("lpt1", fmOpenReadWrite);// !!!aktivovat pro protr!!!
  FileWrite(port,InitPlotr.c_str(),StrLen(InitPlotr.c_str()));//inicializace plotru

    for(int j=0;CanRun&&j<SouradniceY;j++)
    {
    int y=j, Zpozdeni;
    Form1->ProgressBar1->Position=j;
    Form1->Label20->Caption=(AnsiString(j+1)+" z "+AnsiString(SouradniceY));
    Sleep(10);//cekani na konci radku kvuli synchronizaci
    Lichy = fmod(j,2);
    Zpozdeni = Form1->Edit12->Text.ToInt();
    if (Lichy==0)
    {
      for(int i=0;CanRun&&i<(SouradniceX/PocMerPresun);i++)
      { int x=i;
        FileWrite(port,PosunPlotrDoprava.c_str(),StrLen(PosunPlotrDoprava.c_str()));
        for (int k=0; k<=(PocMerPresun-1); k++) {
          Sleep(Zpozdeni);
          NamerenaHodnota=fNamerenaHodnota();
          for (int a=0; a<=256; a++)
          {
            if (NamerenaHodnota<(a*((MaxHodnota-MinHodnota)/256)+MinHodnota))
            {
              Odstin=a;
              break;
            }
          }
          Application->ProcessMessages();
          NH=FloatToStr(NamerenaHodnota)+"   ";
          FileWrite(port2,NH.c_str(),StrLen(NH.c_str()));
          PoleHodnot[PocMerPresun*x+k][y] = NamerenaHodnota;
          pObrazek->Canvas->Pixels[PocMerPresun*x+k][y] = clWhite-Odstin*ZmenaOdstinu;
          Form2->ListBox1->Canvas->Pixels[PocMerPresun*x+k][y] = clWhite-Odstin*ZmenaOdstinu;
        }
      }
    }
    else
    {
      for(int i=0;CanRun&&i<(SouradniceX/PocMerPresun);i++)
      { int x=(SouradniceX/PocMerPresun)-(i+1);
        FileWrite(port,PosunPlotrDoleva.c_str(),StrLen(PosunPlotrDoleva.c_str()));
        for (int k=PocMerPresun-1; k>=0; k--) {
          Sleep(Zpozdeni);
          NamerenaHodnota=fNamerenaHodnota();
          for (int a=0; a<=256; a++)
          {
            if (NamerenaHodnota<(a*((MaxHodnota-MinHodnota)/256)+MinHodnota))
            {
              Odstin=a;
              break;
            }
          }
          Application->ProcessMessages();
          NH=FloatToStr(NamerenaHodnota)+"   ";
          FileWrite(port2,NH.c_str(),StrLen(NH.c_str()));
          PoleHodnot[PocMerPresun*x+k][y] = NamerenaHodnota;
          pObrazek->Canvas->Pixels[PocMerPresun*x+k][y] = clWhite-Odstin*ZmenaOdstinu;
          Form2->ListBox1->Canvas->Pixels[PocMerPresun*x+k][y] = clWhite-Odstin*ZmenaOdstinu;
        }
      }
     }
      FileWrite(port,NovyRadekPlotr.c_str(),StrLen(NovyRadekPlotr.c_str()));
      FileWrite(port2, "\n", strlen("\n"));
     }
  //pohyb plotru, mereni hodnot a vykreslovani
  Form1->ProgressBar1->Position=Form1->ProgressBar1->Max;
  FileClose(port);
  FileClose(port2);
  Form2->Caption=(" X: -    Y: -   Hodnota: - ");
  ComboBox1->Enabled=true;
  Form2->Show();
  }
}
//---konec---
//scanovani solarniho clanku

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

//---zacatek---
//smazani obrazku z obrazovky
void __fastcall TForm1::Button4Click(TObject *Sender)
{
  pObrazek->Assign(pObrazekPrazdny);
  Form2->ListBox1->Refresh();//Smaze ListBox
  Form2->Caption=(" X: -    Y: -   Hodnota: - ");
  Form1->ListBox1->Clear();
  Form1->Edit7->Text="";
  Form1->ProgressBar1->Position=Form1->ProgressBar1->Min;
  Smazane = true;
}
//---konec---
//smazani obrazku z obrazovky

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

//---zacatek---
//zmena velikosti a vykresleni obrazku
void __fastcall TForm1::ComboBox1Select(TObject *Sender)
{
  Zvetseni=0;
  VykresliObrazek();
}
//---konec---
//zmena velikosti a vykresleni obrazku

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

//---zacatek---
//prekresleni obrazku
void __fastcall TForm1::Button2Click(TObject *Sender)
{
  int Odstin, Posun, Sudy;
  float NamerenaHodnota;

    MinHodnota=StrToFloat(Form1->Edit9->Text);
    MaxHodnota=StrToFloat(Form1->Edit10->Text);
    for (int q=0; q<SouradniceY; q++){
    for (int r=0; r<SouradniceX; r++)
    {
     if (PoleHodnot[r][q]<0.001) PoleHodnot[r][q]=0;

  //vykresleni obrazku z nactenych dat
     NamerenaHodnota=PoleHodnot[r][q];
     for (int a=0; a<=256; a++)
        {
          if (NamerenaHodnota<(a*((MaxHodnota-MinHodnota)/256)+MinHodnota))
          {
            Odstin=a;
            break;
          }
        }
        Sudy = fmod(q,2);
        if (Sudy==0) Posun=StrToInt(Form1->Edit11->Text);
        else Posun=0;
        pObrazek->Canvas->Pixels[r+Posun][q] = clWhite-Odstin*ZmenaOdstinu;
    }
  //vykresleni obrazku z nactenych dat
  }
  Zvetseni=0;
  VykresliObrazek();
}
//---konec---
//prekresleni obrazku

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

//---zacatek---
//negativ prekresleni obrazku
void __fastcall TForm1::Button5Click(TObject *Sender)
{
  int Odstin, Posun, Sudy;
  float NamerenaHodnota;

  MinHodnota=StrToFloat(Form1->Edit9->Text);
  MaxHodnota=StrToFloat(Form1->Edit10->Text);
  for (int q=0; q<SouradniceY; q++){
    for (int r=0; r<SouradniceX; r++)
    {
      if (PoleHodnot[r][q]<0.001) PoleHodnot[r][q]=0;

  //vykresleni obrazku z nactenych dat
       NamerenaHodnota=PoleHodnot[r][q];
       for (int a=0; a<=256; a++)
       {
         if (NamerenaHodnota<(a*((MaxHodnota-MinHodnota)/256)+MinHodnota))
         {
           Odstin=a;
           break;
         }
       }
       Sudy = fmod(q,2);
       if (Sudy==0) Posun=StrToInt(Form1->Edit11->Text);
       else Posun=0;
       pObrazek->Canvas->Pixels[r+Posun][q] = clBlack+Odstin*ZmenaOdstinu;
    }
  }
  //vykresleni obrazku z nactenych dat

  Zvetseni=0;
  VykresliObrazek();
}
//---konec---
//negativ prekresleni obrazku

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

//---zacatek---
//ukonceni programu
void __fastcall TForm1::UkonciprogramClick(TObject *Sender)
{
  DeleteFile(SouborTemp);

 // Odeslání dat
  if(Pripojeno==true)
  {
   text =("SYST:BEEP\nDISP:WIND2:TEXT:CLEar\nDISP:WIND1:TEXT:CLEar\n");
    if ((size = send(mySocket, text.c_str(), text.size() + 1, 0)) == -1)
    {
         ShowMessage("Problém s odesláním dat");
         WSACleanup();
    }
   text.erase();
   //--------------konec odeslani dat
  closesocket(mySocket);  //FK  Uzavreni spojení
  WSACleanup();
  }
  Close();
}
//---konec---
//ukonceni programu

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

//---zacatek---
//odstraneni obrazku z pameti
void main (void)
{
  delete pObrazek;
  delete pObrazekZOOM;
  delete pObrazekPrazdny;
  delete pObrazekVyber;
  free(PoleHodnot);
  free(PoleHodnotZOOM);
}
//---konec---
//odstraneni obrazku z pameti

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




void __fastcall TForm1::NapovedaClick(TObject *Sender)
{
  ShowMessage("Žadná nápověda\n      verze: 1.2");
}
//---------------------------------------------------------------------------
// navázání komunikace s měřícím přístrojem
void __fastcall TForm1::Button6Click(TObject *Sender)
{
     ip=Form3->Edit1->Text.c_str();
     port=Form3->Edit2->Text.ToInt();
     text =("SYSTem:PRESet\nVOLT:IMP:AUTO 1\nVOLTage:DC:RANGe 10\nSYST:BEEP\nDISP:TEXT \"Connect LBIC...\"\nDISP:WIND2:TEXT \"WAITING FOR DATA...\"\nDISP:WIND2:TEXT?\n");

    // Pripravíme sokety na práci
    if (WSAStartup(wVersionRequested, &data) != 0)
    {
        ShowMessage("Nepodarilo se inicializovat sokety");
        // Podle všeho, zde se WSACleanup volat nemusí.
    }

    // Vytvoríme soket
    if ((mySocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1)
    {
        ShowMessage("Nelze vytvorit soket");
        WSACleanup();
        goto konec;
    }
    // Zaplníme strukturu sockaddr_in
    // 1) Rodina protokolu
    serverSock.sin_family = AF_INET;
    // 2) Císlo portu, ke kterému se poipojíme
    serverSock.sin_port = htons(port);
    // 3) Nastavení IP adresy, ke které se pripojíme
   serverSock.sin_addr.s_addr=inet_addr(ip.c_str());
 //----------------------------------------------------------------------------
    // Pripojení soketu
    if (connect(mySocket, (sockaddr *)&serverSock, sizeof(serverSock)) == -1)
    {
        ShowMessage("Nelze navázat spojení \n   špatná IP adresa");
        WSACleanup();
        goto konec;
    }
//------------------------------------------------------------------------------
    // Odeslání dat
    if ((size = send(mySocket, text.c_str(), text.size() + 1, 0)) == -1)
    {
         ShowMessage("Problém s odesláním dat");
         WSACleanup();
    }

//------------------------------------------------------------------------------
    // Príjem dat
    text = "";
    int s;
    size = recv(mySocket, buf, BUFSIZE, 0);
    while (( size != 0) && (size != -1))
    {
             for(int i=0;i<size;i++)
                 {
                 text += buf[i];
                 }

       s=text.find('\n');
       size=-1;
      // WSACleanup();
     }
        if(s==-1){
              ShowMessage(" Nelze příjmout data z měřícího přístroje Agilentu");
                 }

          else{


             if("\"WAITING FOR DATA...\"\n"==text)

             ShowMessage("Spojení je navázáno");
               }


    text.erase();
    Pripojeno=true;
    konec:

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

void __fastcall TForm1::RadioGroup1Click(TObject *Sender)
{
  Vyber=Form1->RadioGroup1->ItemIndex;
  switch (Vyber)
  {
    case 0:{
           Edit1->Text=8120;   //StartX
           Edit2->Text=5355;   //StartY
           Edit3->Text=12220; //KonecX
           Edit4->Text=9455; //KonecY
           }
    break;
    case 1:{
           Edit1->Text=7220;   //StartX
           Edit2->Text=6255;   //StartY
           Edit3->Text=12220; //KonecX
           Edit4->Text=11255; //KonecY
           }
    break;
    case 2:{
           Edit1->Text=6220;   //StartX
           Edit2->Text=7255;   //StartY
           Edit3->Text=12220; //KonecX
           Edit4->Text=13255; //KonecY
           }
    break;
  } ;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Agilent34411A1Click(TObject *Sender)
{
   Form3->Top=280;
   Form3->Left=578;
   Form3->Width=429;
   Form3->Height=250;
   Form3->Image1->Visible=false;
   Form3->Button1->Visible=true;
   Form3->Button2->Visible=true;
   Form3->StaticText1->Visible=true;
   Form3->StaticText2->Visible=true;
   Form3->Edit1->Visible=true;
   Form3->Edit2->Visible=true;
   Form3->Caption="Nastavení měřícího přístroje";
   Form3->Show();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Zapojenpstroje1Click(TObject *Sender)
{
  Form3->Image1->Picture->LoadFromFile("zapojeni3.bmp");
  Form3->Image1->Visible=true;
  Form3->Button1->Visible=false;
  Form3->Button2->Visible=false;
  Form3->StaticText1->Visible=false;
  Form3->StaticText2->Visible=false;
  Form3->Edit1->Visible=false;
  Form3->Edit2->Visible=false;
  Form3->Width=480;
  Form3->Height=330;
  Form3->Image1->Width=450;
  Form3->Image1->Height=270;
  Form3->Caption="Zapojení měřícího přístroje";
  Form3->Show();
}
//---------------------------------------------------------------------------

