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

#include "untMain.h"
#include "..\..\..\PcScale.h"

//---------------------------------------------------------------------------
#pragma link "Trayicon"
#pragma link "trayicon"
#pragma resource "*.dfm"
TfrmMain *frmMain;

//---------------------------------------------------------------------------
__fastcall TfrmMain::TfrmMain(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
bool __fastcall TfrmMain::GeraArquivo(void)
{

    HANDLE	hPar;
    DWORD	BytesRead;
    char    msg[100];
    bool	ret;

    hPar = CreateFile("lebal.txt", GENERIC_READ | GENERIC_WRITE,
                      FILE_SHARE_READ | FILE_SHARE_WRITE,
                      NULL, OPEN_ALWAYS, 0, NULL);

    ret = false;
    if (hPar != INVALID_HANDLE_VALUE)
      {
         sprintf(msg,"%d;%s;%s;%s;%s\r\n",status,gross,tare,net,unit);
         SetFilePointer(hPar,0,NULL,FILE_END);
         if (WriteFile(hPar, msg, strlen(msg), &BytesRead, NULL))
            ret = true;
         CloseHandle(hPar);
      }
    return ret;
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::TimerReadTimer(TObject *Sender)
{
    int Indicador,aux;
    char buffer_info[10];

    // a função ObtemInformacao é uma função da dll e ela retorna o valor
    // do campo desejado sendo:
    // 0 = Status
    // 1 = Peso bruto
    // 2 = tara
    // 3 = liquido
    // 4 = Contador
    // 5 = Codigo
    // 6 = Valor unitário
    // 7 = Valor Total
    // 8 = Número de casas decimais
    // 9 = Peso médio por peça em g
    // 10 = Data de Fabricação
    // 11 = Data de Validade



    // processa o status recebido
    switch ( (status=ObtemInformacao(0,0)) )
    {
        case dfnBalancaErro:
        lblStatus->Caption = "Erro de leitura da balança.";
        break;

        case dfnPesoEstavel:
        lblStatus->Caption = "Peso estável.";
        break;

        case dfnPesoOscilando:
        lblStatus->Caption = "Peso oscilando.";
        break;

        case dfnBalancaForaRange:
        lblStatus->Caption = "Balança fora de range (sobrecarga/alívio de plataforma)";
        break;

        case dfnLicencaNaoEncontrada:
        lblStatus->Caption = "Licença de software não encontrada.";
        TimerRead->Enabled=false;
        break;
    }


    // se foi bem sucedido, atualiza os campos
    if ( status == dfnPesoEstavel || status == dfnPesoOscilando )
    {
        // vamos construir uma mascara para seja necessário formatar o peso
        // com as casas decimais.
        // obs.: mascara é uma AnsiString Global
        if( mascara == "" )
        {
            mascara="0.";
            for( aux=0; aux < ObtemInformacao(0,8); aux++ )
                mascara+="0";
        }

        PanelGross->Caption = FormatFloat(mascara,ObtemInformacao(0,1));
        PanelTare->Caption  = FormatFloat(mascara,ObtemInformacao(0,2));
        PanelNet->Caption   = FormatFloat(mascara,ObtemInformacao(0,3));
        PanelCont->Caption  = FloatToStr(ObtemInformacao(0,4));
        PanelCod->Caption   = FloatToStr(ObtemInformacao(0,5));
        PanelVunit->Caption = FloatToStr(ObtemInformacao(0,6));
        PanelVtot->Caption  = FloatToStr(ObtemInformacao(0,7));
        Panelpmed->Caption  = FloatToStr(ObtemInformacao(0,9));
        AnsiString daux;
        daux=FormatFloat("000000",ObtemInformacao(0,10));
        Paneldfab->Caption  = daux.SubString(1,2) + "/" +
                              daux.SubString(3,2) + "/" +
                              daux.SubString(5,2);

        daux=FormatFloat("000000",ObtemInformacao(0,11));
        Paneldval->Caption  = daux.SubString(1,2) + "/" +
                              daux.SubString(3,2) + "/" +
                              daux.SubString(5,2);
    }
    else
        ClearPanel(0);

    // verifica a gravação do arquivo
    if (chkBuildTxtFile->Checked && !GeraArquivo())
    {
        TimerRead->Enabled = false;
        Application->MessageBox("Erro gerando arquivo LEBAL.TXT","Erro",MB_ICONERROR);
    }
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::ClearPanel(int tipo)
{
    if( tipo ) lblStatus->Caption = "";
    PanelGross->Caption = "";
    PanelNet->Caption = "";
    PanelTare->Caption = "";
    PanelCod->Caption = "";
    PanelCont->Caption = "";
    PanelVunit->Caption = "";
    PanelVtot->Caption = "";
    Paneldfab->Caption = "";
    Paneldval->Caption = "";
    Panelpmed->Caption = "";
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::FormClose(TObject *Sender, TCloseAction &Action)
{
     TimerRead->Enabled = false;
     FinalizaLeitura(0);
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::ShowParameters()
{
    int     Modelo,Porta,BaudRate;
    char    Nome[50];

    //* 1.02
    char IP[16];
    int Tipo,Port;
    //*

    //* 1.02
    //if( ObtemParametrosBalanca(0,Modelo,Porta,BaudRate) )
    if( ObtemParametrosBalancaEthernet(0,Modelo,Porta,BaudRate,Tipo,IP,Port) )
    //*
    {
        memset(Nome,'\0',sizeof(Nome));
        ObtemNomeBalanca(Modelo,Nome);
        lblModelo->Caption   = StrPas(Nome);
        //* 1.02
        if( Tipo == 0 ) //Serial
        {
            Label12->Caption="Porta serial :";
            Label13->Caption="BaudRate:";
            lblPorta->Caption    = "COM" + IntToStr(Porta);
            lblBaudRate->Caption = IntToStr(BaudRate);
        }
        else
        {
            Label12->Caption="IP:";
            Label13->Caption="Porta:";
            lblPorta->Caption    = StrPas(IP);
            lblBaudRate->Caption = IntToStr(Port);
        }
        //*
    }
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::FormShow(TObject *Sender)
{
    TStringList *lst = new TStringList();


    if( FileExists("LocalPars") )
    {
        lst->LoadFromFile("LocalPars");
        chkStartRunning->Checked=( lst->Strings[0] == "1" );
        chkBuildTxtFile->Checked=( lst->Strings[1] == "1" );
    }
    delete lst;
    btnSalvar->Enabled=false;
    ShowParameters();
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::chkStartRunningClick(TObject *Sender)
{
     btnSalvar->Enabled = true;
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::chkBuildTxtFileClick(TObject *Sender)
{
     btnSalvar->Enabled = true;
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::btnConfigurarClick(TObject *Sender)
{
    // a função ConfiguraBalanca é uma função da DLL PcScale que permite efetuar
    // as configurações de uma determinada balança (de 0 à 7)

    if( !ConfiguraBalanca(0,this->Handle) ) //configura balança zero (0)
        ExibeMsgErro(this->Handle);
    else
        ShowParameters();
}
//---------------------------------------------------------------------------
bool __fastcall TfrmMain::Inicializa()
{
    bool ret;
    // a função InicializaLeitura é uma função da DLL que dispara uma tarefa
    // de leitura constante da balanca X.
    if( InicializaLeitura(0) )  // dispara a leitura da balança 0
    {
        btnConfigurar->Enabled=false;
        btnSair->Enabled=false;
        btnTestar->Caption = "&Parar";
        TimerRead->Enabled = true;
        ret=true;
    }
    else
    {
        ExibeMsgErro(this->Handle);
        ret=false;
    }
    return ret;
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::btnTestarClick(TObject *Sender)
{
    if( btnTestar->Caption == "&Parar" )
    {
        btnConfigurar->Enabled=true;
        btnSair->Enabled=true;
        btnTestar->Caption = "&Testar";
        TimerRead->Enabled = false;
        ClearPanel(1);
        if( !FinalizaLeitura(0) ) ExibeMsgErro(this->Handle);
    }
    else
    {
        Inicializa();
    }

}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::FormActivate(TObject *Sender)
{
    if( chkStartRunning->Checked )
    {
        if( Inicializa() )
            Application->Minimize();
    }
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::ApplicationEvents1Minimize(TObject *Sender)
{
    TIcon->Minimize();
}
//---------------------------------------------------------------------------

void __fastcall TfrmMain::TIconMinimize(TObject *Sender)
{
    TIcon->Visible = true;
}
//---------------------------------------------------------------------------

void __fastcall TfrmMain::TIconRestore(TObject *Sender)
{
    TIcon->Visible = false;
}
//---------------------------------------------------------------------------

void __fastcall TfrmMain::Restaurar1Click(TObject *Sender)
{
    TIcon->Restore();
}
//---------------------------------------------------------------------------

void __fastcall TfrmMain::Fechar1Click(TObject *Sender)
{
    Close();
}
//---------------------------------------------------------------------------

void __fastcall TfrmMain::btnSalvarClick(TObject *Sender)
{
    TStringList *lst = new TStringList();

    lst->Clear();
    if( chkStartRunning->Checked )
        lst->Add("1");
    else
        lst->Add("0");

    if( chkBuildTxtFile->Checked )
        lst->Add("1");
    else
        lst->Add("0");

    lst->SaveToFile("LocalPars");
    delete lst;

    btnSalvar->Enabled=false;

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

void __fastcall TfrmMain::btnSairClick(TObject *Sender)
{
    Close();    
}
//---------------------------------------------------------------------------

void __fastcall TfrmMain::btnEnviaCSClick(TObject *Sender)
{
    AnsiString  Preco;
    int         ret;
    Preco="";
    while(true)
    {
        if(InputQuery("Preço/kg", "Digite o preço/kg a ser enviado: (xxxx,xx)", Preco))
        {
            if(Trim(Preco) != "")
            {
                try
                {
                    StrToFloat(Preco);
                    break;
                }
                catch ( ... )
                {
                    ShowMessage("Digite um valor númerico.");
                }
            }
        }
        else return;
    }
    if( EnviaPrecoCS(0,StrToFloat(Preco)) )
        ShowMessage("Preço/kg enviado com sucesso.");
    else
        ExibeMsgErro(this->Handle);

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

void __fastcall TfrmMain::Sobre1Click(TObject *Sender)
{
    Application->MessageBox(
    "Programa para leitura das balanças\n\n"
    "    Versão: 1.02 - 01/03/2005",
    "Sobre",
    MB_ICONINFORMATION
    );    
}
//---------------------------------------------------------------------------

