//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop

#include "Main.h"

#include <utilcls.h>
#include <systdate.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

//---------------------------------------------------------------------------
#pragma resource "*.dfm"
TMainForm *MainForm;

FT_HANDLE ftHandle;
FT_STATUS ftStatus;
DWORD EventDWord;
DWORD TxBytes;
DWORD RxBytes;
DWORD BytesReceived;
char RxBuffer[256];
DWORD BytesWritten;
int i=0, n=0;

char pom[404];        // prijimaci retezec
int napeti[100];      // prijate data - napeti
char perioda;         // prijate data - perioda prevodu
char teplota[5];      // prijate data - teplota

int procenta;         // procenta prenosu

float cutDecimal( float myNumber, int decimal){     // funkce pro oseknuti floatu na nekolik des. mist
 
    myNumber = myNumber*( pow(10,decimal) );
    myNumber = (int)myNumber;
    myNumber = myNumber/( pow(10,decimal) ) ;
 
    return myNumber;
}

//---------------------------------------------------------------------------
// hlavni okno - nastaveni hodnot
__fastcall TMainForm::TMainForm(TComponent *Owner)
	: TForm(Owner)
{
MainForm->Label6->Caption="Pokračuj stiskem tlačítka \"Připoj přístroj\".";
MainForm->Label7->Caption="Program se spojí s měřičem a bude čekat na odeslané data.";
MainForm->Label9->Caption="Stiskem tlačítka \"Konec\" zavřeš program.";
MainForm->Label1->Caption="Počet přijatých bajtů:";
MainForm->Label2->Caption="nepřipojeno !";
MainForm->Label2->Font->Color= clRed;
MainForm->Button2->Enabled=false;
MainForm->Button3->Enabled=false;
MainForm->Timer1->Enabled = false;
MainForm->Label3->Caption=0;
MainForm->Label4->Caption=0;
MainForm->ProgressBar2->Position=0;

n=0;
}
//---------------------------------------------------------------------------
// stisk tlacitka 1 - pripojeni pristroje
void __fastcall TMainForm::Button1Click(TObject *Sender)
{
n=0;

ftStatus = FT_OpenEx("A4WJTR55",FT_OPEN_BY_SERIAL_NUMBER,&ftHandle);     // pripoj FT232 podle serivoeho cisla

if(ftStatus != FT_OK) { MainForm->Label2->Caption="nelze připojit !";
                        if (i==1) MainForm->Label2->Caption="přístroj je již připojen !";
                        return; }
else    {  MainForm->Label2->Caption="připojeno";
        }
ftStatus = FT_SetBaudRate(ftHandle, 9600);                   // nastaveni baud rate
if (ftStatus != FT_OK)  {  MainForm->Label2->Caption="nelze nastavit BaudRate !";
                        }
else    { MainForm->Label2->Caption="připojeno";
        }
ftStatus = FT_SetDataCharacteristics(ftHandle, FT_BITS_8, FT_STOP_BITS_1, FT_PARITY_NONE);   // nastaveni parametru prenosu
if (ftStatus != FT_OK)  { MainForm->Label2->Caption="nelze nastavit parametry přenosu !";
                        }
else    { MainForm->Label2->Caption="připojeno";             // pripojeno - zmenit text, ...
           MainForm->Button1->Enabled=false;
           MainForm->Button3->Enabled=false;
           MainForm->Button2->Enabled=true;
           MainForm->Timer1->Enabled = true;
           MainForm->Label2->Font->Color= clBlack;
           MainForm->Label6->Caption="Program čeká na data, pokračuj odesláním dat z měřiče.";
           MainForm->Label7->Caption="Stiskem tlačítka \"Odpoj přístroj\" ukončíš spojení s měřičem.";
           MainForm->Label9->Caption="Stiskem tlačítka \"Konec\" zavřeš program.";
        }
i=1;
MainForm->Timer1->Enabled = true;
}
//---------------------------------------------------------------------------
// casovac - finkce se vola co 1ms pokud je casovac zapnuty
void __fastcall TMainForm::Timer1Timer(TObject *Sender)
{
{
FT_GetStatus(ftHandle,&RxBytes,&TxBytes,&EventDWord);
if (RxBytes > 0) {
                ftStatus = FT_Read(ftHandle,RxBuffer,RxBytes,&BytesReceived);
                if (ftStatus == FT_OK) { {pom[n]=*(RxBuffer);       // ulozeni znaku na pozici n
                                          n++;}
                                          MainForm->Label2->Font->Color=clBlack;
                                          MainForm->Label2->Caption="připojeno";
                                        }
                                        else {  MainForm->Label2->Font->Color=clRed;
                                                MainForm->Label2->Caption="nelze číst !";
                                              }
                  }

}

procenta=(n/4.03);              // pocitani procent na progressbar a text

MainForm->Label4->Caption=(procenta);
MainForm->Label3->Caption=n;
MainForm->ProgressBar2->Position=procenta;

if(n>0){MainForm->Label2->Font->Color=clBlack;      // nezacal prenos
        MainForm->Label2->Caption="přenos dat";
        MainForm->Label6->Font->Color=clRed;
        MainForm->Label6->Caption="Probíhá přenos dat - neminimalizujte okno programu !";
        MainForm->Label7->Font->Color=clRed;
        MainForm->Label7->Caption="S počítačem nic nedělejte - mohlo by dojít ke ztrátě dat !";
        MainForm->Label9->Caption="Stiskem tlačítka \"Konec\" zavřeš program.";
        }

if(n>=404){MainForm->Label2->Font->Color=clBlack;         // skonceny prenos
           MainForm->Label2->Caption="data přenesena úspěšně";
           MainForm->Label6->Font->Color=clBlack;
           MainForm->Label6->Caption="Pokračuj stiskem tlačítka \"Export - EXCEL\" pro odeslání dat do EXCELU.";
           MainForm->Label7->Font->Color=clBlack;
           MainForm->Label7->Caption="Stiskem \"Připoj přístroj\" můžeš přijmout nová data.";
           MainForm->Label9->Caption="Stiskem tlačítka \"Konec\" zavřeš program.";
           MainForm->Timer1->Enabled = false;
           MainForm->Button3->Enabled=true;
           MainForm->Button1->Enabled=true;
           MainForm->Button2->Enabled=false;
           FT_Close(ftHandle);

        }
}
//---------------------------------------------------------------------------
// odpojeni pristroje
void __fastcall TMainForm::Button2Click(TObject *Sender)
{
if(i==1)FT_Close(ftHandle);
else    {
        MainForm->Label2->Font->Color= clBlack;
        MainForm->Label2->Caption="přístroj není připojen !";
        return;
        }
if(ftStatus != FT_OK) { MainForm->Label2->Caption="nelze odpojit !";
                        MainForm->Label2->Font->Color= clBlack;
                        return; }
else {  MainForm->Label2->Caption="odpojeno";
        MainForm->Button1->Enabled=true;
        MainForm->Button2->Enabled=false;
        MainForm->Timer1->Enabled = false;
        MainForm->Label6->Caption="Pokračuj stiskem tlačítka \"Připoj přístroj\".";
        MainForm->Label7->Caption="Program se spojí s měřičem a bude čekat na odeslané data.";
        MainForm->Label9->Caption="Stiskem tlačítka \"Konec\" zavřeš program.";
        i=0;
        MainForm->Label2->Font->Color= clBlack;
}
}
//---------------------------------------------------------------------------
// konec programu
void __fastcall TMainForm::Button4Click(TObject *Sender)
{
Close();        
}
//---------------------------------------------------------------------------
// odeslani dat do excelu
void __fastcall TMainForm::Button3Click(TObject *Sender)
{
 int m,n;
 float u;
 int l;
 char t,x;
 float napetii;
 float logaritmus;

//           http://www.jcmiras.net/jcm/item/45/
//            http://softwaredevolepers.blogspot.cz/2010/05/excel-class.html

// upozorneni
//Application->MessageBox("Data budou odeslána do EXCELU, nezpomeňte data v EXCELU uložit !","Upozornění",MB_OK);
Application->MessageBox("Při přenosu dat na nic neklikej, dokud nebude přenos kompletní (asi 3 vteřiny) !\nMěj otevřené maximálně jedno okno excelu !\nPřenos lze opakovat opětovným stisknutím tlačítka \"Export - EXCEL\".\nNezapomeň na uložení dat v excelu !","Pozor !",MB_OK);

perioda=(pom[0]-48);        // necteni periody

teplota[0]=pom[1];          // nacteni teploty
teplota[1]=pom[2];
teplota[2]=',';
teplota[3]=pom[3];
teplota[4]='\0';

for(x=0;x<100;x++)         // nacteni napeti
{
napeti[x]=(((pom[(x+1)*4])-48)*1000)+(((pom[(x+1)*4+1])-48)*100)+(((pom[(x+1)*4+2])-48)*10)+((pom[(x+1)*4+3])-48);
}

// excel
Variant XL,v0,v1,v2,v3;

XL=Variant::CreateObject("excel.application");
XL.OlePropertySet("Visible",true);
v0=XL.OlePropertyGet("Workbooks");
v0.OleProcedure("Add");
v1=v0.OlePropertyGet("Item",1);
v2=v1.OlePropertyGet("WorkSheets");
v2.OleFunction("Add");
v3=v2.OlePropertyGet("Item",1);
v3.OlePropertySet("Name","data-ultrazvuk");

t=4;
switch(perioda)        // perioda prenosu
{
case 1: {
        u=10;
        break;
        }
case 2: {
        u=12.9;
        break;
        }
case 3: {
        u=20.3;
        break;
        }
case 4: {
        u=33.6;
        break;
        }
case 5: {
        u=60;
        break;
        }
case 6: {
        u=112;
        break;
        }
case 7: {
        u=224;
        break;
        }
}

// nacteni dat do excelu
v3.OlePropertyGet("Cells").OlePropertyGet("Item",2,2).OlePropertySet("Value","Ultrazvukové měření vzdálenosti");
// datum
v3.OlePropertyGet("Cells").OlePropertyGet("Item",4,2).OlePropertySet("Value","datum :");
v3.OlePropertyGet("Cells").OlePropertyGet("Item",4,4).OlePropertySet("columnwidth",15);
v3.OlePropertyGet("Cells").OlePropertyGet("Item",4,4).OlePropertySet("Value",Date());
v3.OlePropertyGet("Cells").OlePropertyGet("Item",4,4).OlePropertySet("HorizontalAlignment",-4108);
// cas
v3.OlePropertyGet("Cells").OlePropertyGet("Item",5,2).OlePropertySet("Value","čas :");
v3.OlePropertyGet("Cells").OlePropertyGet("Item",5,4).OlePropertySet("HorizontalAlignment",-4108);
v3.OlePropertyGet("Cells").OlePropertyGet("Item",5,4).OlePropertySet("Value",Time());
// teplota
v3.OlePropertyGet("Cells").OlePropertyGet("Item",6,2).OlePropertySet("Value","teplota [°C]:");
v3.OlePropertyGet("Cells").OlePropertyGet("Item",6,4).OlePropertySet("Value",teplota);
v3.OlePropertyGet("Cells").OlePropertyGet("Item",6,4).OlePropertySet("HorizontalAlignment",-4108);
// rychlost zvuku
v3.OlePropertyGet("Cells").OlePropertyGet("Item",7,2).OlePropertySet("Value","rychlost zvuku [m/s]:");
v3.OlePropertyGet("Cells").OlePropertyGet("Item",7,4).OlePropertySet("Value","=331,6+D6*0,61");
v3.OlePropertyGet("Cells").OlePropertyGet("Item",7,4).OlePropertySet("HorizontalAlignment",-4108);
// data - napeti - hlavicka
v3.OlePropertyGet("Cells").OlePropertyGet("Item",2,6).OlePropertySet("Value","vzorek [-]");
v3.OlePropertyGet("Cells").OlePropertyGet("Item",2,6).OlePropertySet("HorizontalAlignment",-4108);
v3.OlePropertyGet("Cells").OlePropertyGet("Item",2,7).OlePropertySet("Value","čas [us]");
v3.OlePropertyGet("Cells").OlePropertyGet("Item",2,7).OlePropertySet("HorizontalAlignment",-4108);
v3.OlePropertyGet("Cells").OlePropertyGet("Item",2,8).OlePropertySet("Value","napětí [mV]");
v3.OlePropertyGet("Cells").OlePropertyGet("Item",2,8).OlePropertySet("columnwidth",12);
v3.OlePropertyGet("Cells").OlePropertyGet("Item",2,8).OlePropertySet("HorizontalAlignment",-4108);
v3.OlePropertyGet("Cells").OlePropertyGet("Item",2,9).OlePropertySet("Value","citlivost [dB]");
v3.OlePropertyGet("Cells").OlePropertyGet("Item",2,9).OlePropertySet("columnwidth",12);
v3.OlePropertyGet("Cells").OlePropertyGet("Item",2,9).OlePropertySet("HorizontalAlignment",-4108);

for(l=1;l<101;l++)
{
// data - poradi
v3.OlePropertyGet("Cells").OlePropertyGet("Item",2+l,6).OlePropertySet("Value",l);
v3.OlePropertyGet("Cells").OlePropertyGet("Item",2+l,6).OlePropertySet("HorizontalAlignment",-4108);
// data - cas
v3.OlePropertyGet("Cells").OlePropertyGet("Item",2+l,7).OlePropertySet("Value",(l-1)*u);
v3.OlePropertyGet("Cells").OlePropertyGet("Item",2+l,7).OlePropertySet("HorizontalAlignment",-4108);
// data - napeti
v3.OlePropertyGet("Cells").OlePropertyGet("Item",2+l,8).OlePropertySet("Value",napeti[l-1]);
v3.OlePropertyGet("Cells").OlePropertyGet("Item",2+l,8).OlePropertySet("HorizontalAlignment",-4108);
// vypocet logaritmu
if(napeti[l-1]==0) logaritmus=-145;
else {
        napetii=(napeti[l-1]*0.00003)/561; //        napeti=(nap*0.00003)/561;
        logaritmus=20*log10(napetii);
     }
logaritmus=cutDecimal(20*log10(napetii),1);
// data - logaritmus
v3.OlePropertyGet("Cells").OlePropertyGet("Item",2+l,9).OlePropertySet("Value",logaritmus);
v3.OlePropertyGet("Cells").OlePropertyGet("Item",2+l,9).OlePropertySet("HorizontalAlignment",-4108);
}
}
//---------------------------------------------------------------------------



